@reticlehq/server 3.5.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SKILL.md +123 -116
- package/dist/chromium-launch-options.d.ts +3 -1
- package/dist/chromium-launch-options.js +2 -1
- package/dist/command/cli/adhoc-suite.d.ts +14 -0
- package/dist/command/cli/adhoc-suite.js +42 -7
- package/dist/command/cli/adhoc-verdict.d.ts +19 -2
- package/dist/command/cli/adhoc-verdict.js +76 -9
- package/dist/command/cli/answers/gate-exit.d.ts +23 -0
- package/dist/command/cli/answers/gate-exit.js +45 -0
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +3 -1
- package/dist/command/cli/answers/open-note.d.ts +2 -0
- package/dist/command/cli/answers/open-note.js +22 -0
- package/dist/command/cli/auth/device-flow.d.ts +13 -2
- package/dist/command/cli/auth/device-flow.js +17 -0
- package/dist/command/cli/cli-doctor.js +14 -0
- package/dist/command/cli/cli-flow-commands.d.ts +0 -11
- package/dist/command/cli/cli-flow-commands.js +31 -112
- package/dist/command/cli/cli-kill.js +3 -2
- package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
- package/dist/command/cli/cli-parse-grammar.js +75 -0
- package/dist/command/cli/cli-parse-verify.d.ts +2 -0
- package/dist/command/cli/cli-parse-verify.js +18 -0
- package/dist/command/cli/cli-parse.d.ts +19 -28
- package/dist/command/cli/cli-parse.js +82 -182
- package/dist/command/cli/cli-update-commands.d.ts +1 -1
- package/dist/command/cli/cli-update-commands.js +61 -9
- package/dist/command/cli/cli-usage.d.ts +33 -0
- package/dist/command/cli/cli-usage.js +287 -0
- package/dist/command/cli/cli-verify.d.ts +35 -5
- package/dist/command/cli/cli-verify.js +114 -35
- package/dist/command/cli/cloud-cli.d.ts +13 -0
- package/dist/command/cli/cloud-cli.js +192 -341
- package/dist/command/cli/cloud-kit.d.ts +12 -0
- package/dist/command/cli/cloud-kit.js +41 -2
- package/dist/command/cli/cloud-link.d.ts +57 -0
- package/dist/command/cli/cloud-link.js +308 -0
- package/dist/command/cli/cloud-login.d.ts +22 -0
- package/dist/command/cli/cloud-login.js +96 -8
- package/dist/command/cli/context-command.d.ts +1 -0
- package/dist/command/cli/context-command.js +33 -0
- package/dist/command/cli/daemon-start-options.d.ts +3 -0
- package/dist/command/cli/daemon-start-options.js +24 -3
- package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
- package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
- package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
- package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
- package/dist/command/cli/doctor/doctor-project-line.js +5 -4
- package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
- package/dist/command/cli/doctor/doctor-rows.js +6 -0
- package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
- package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
- package/dist/command/cli/drive/drive-attach.d.ts +27 -2
- package/dist/command/cli/drive/drive-attach.js +71 -4
- package/dist/command/cli/drive/drive-command.d.ts +2 -1
- package/dist/command/cli/drive/drive-command.js +13 -7
- package/dist/command/cli/known-regression.d.ts +13 -0
- package/dist/command/cli/known-regression.js +34 -0
- package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
- package/dist/command/cli/launch/sdk-version-match.js +25 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
- package/dist/command/cli/mcp-command.d.ts +6 -0
- package/dist/command/cli/mcp-command.js +13 -5
- package/dist/command/cli/ports/port-holder.d.ts +10 -0
- package/dist/command/cli/ports/port-holder.js +25 -1
- package/dist/command/cli/project-name.d.ts +29 -1
- package/dist/command/cli/project-name.js +107 -2
- package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
- package/dist/command/cli/setup-mcp-cli.js +35 -12
- package/dist/command/cli/status/status-lines.d.ts +1 -0
- package/dist/command/cli/status/status-lines.js +47 -2
- package/dist/command/cli/status/workspace-links.d.ts +10 -0
- package/dist/command/cli/status/workspace-links.js +29 -0
- package/dist/command/cli/try-command.d.ts +96 -0
- package/dist/command/cli/try-command.js +362 -0
- package/dist/command/cli/tutorial.d.ts +0 -100
- package/dist/command/cli/tutorial.js +0 -181
- package/dist/command/cli/verify-results.d.ts +19 -0
- package/dist/command/cli/verify-results.js +29 -0
- package/dist/command/cli-onboarding.d.ts +0 -11
- package/dist/command/cli-onboarding.js +0 -15
- package/dist/command/cli.d.ts +20 -0
- package/dist/command/cli.js +130 -104
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
- package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
- package/dist/command/daemon/daemon-resilience.js +4 -4
- package/dist/command/daemon/daemon-resolve.d.ts +23 -1
- package/dist/command/daemon/daemon-resolve.js +79 -9
- package/dist/command/setup/agent-writer.d.ts +1 -1
- package/dist/command/setup/agent-writer.js +3 -2
- package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
- package/dist/command/setup/bringup/bridge-port.js +13 -3
- package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
- package/dist/command/setup/bringup/connect-lease.js +1 -0
- package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
- package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
- package/dist/command/setup/bringup/dev-server-wait.js +19 -0
- package/dist/command/setup/bringup/ensure-daemon.js +9 -2
- package/dist/command/setup/init/agent-restart.d.ts +23 -0
- package/dist/command/setup/init/agent-restart.js +28 -0
- package/dist/command/setup/init/init-port.d.ts +14 -1
- package/dist/command/setup/init/init-port.js +32 -2
- package/dist/command/setup/init/init-runtime.d.ts +22 -2
- package/dist/command/setup/init/init-runtime.js +114 -38
- package/dist/command/setup/node-effects.d.ts +2 -0
- package/dist/command/setup/node-effects.js +38 -9
- package/dist/command/setup/probe/existing-app.d.ts +12 -0
- package/dist/command/setup/probe/existing-app.js +14 -0
- package/dist/command/setup/remaining-steps.js +2 -1
- package/dist/command/setup/run-setup.d.ts +34 -9
- package/dist/command/setup/run-setup.js +65 -51
- package/dist/command/setup/setup-command.d.ts +25 -1
- package/dist/command/setup/setup-command.js +59 -4
- package/dist/command/setup/setup-mcp.js +25 -2
- package/dist/command/setup/tauri-signing.d.ts +19 -0
- package/dist/command/setup/tauri-signing.js +79 -0
- package/dist/command/setup/terminal/listeners.d.ts +10 -1
- package/dist/command/setup/terminal/listeners.js +37 -6
- package/dist/command/update/update-nudge.d.ts +9 -0
- package/dist/command/update/update-nudge.js +1 -1
- package/dist/command/update/updater.js +11 -15
- package/dist/command/version/version-nudge.js +3 -0
- package/dist/command/version/version-skew.d.ts +20 -1
- package/dist/command/version/version-skew.js +49 -4
- package/dist/features/crawl/crawl-tools.js +4 -0
- package/dist/features/crawl/crawl.d.ts +6 -0
- package/dist/features/crawl/crawl.js +23 -2
- package/dist/features/exhaust/ledger.d.ts +21 -14
- package/dist/features/exhaust/ledger.js +35 -9
- package/dist/features/harness/app-findings.d.ts +2 -0
- package/dist/features/harness/app-findings.js +52 -0
- package/dist/features/harness/drive-report.d.ts +61 -1
- package/dist/features/harness/drive-report.js +394 -26
- package/dist/features/harness/drive-runs.d.ts +120 -0
- package/dist/features/harness/drive-runs.js +289 -0
- package/dist/features/harness/drivers.d.ts +10 -14
- package/dist/features/harness/drivers.js +10 -14
- package/dist/features/harness/explore/console-pages.d.ts +15 -0
- package/dist/features/harness/explore/console-pages.js +146 -0
- package/dist/features/harness/explore/disparity.d.ts +19 -0
- package/dist/features/harness/explore/disparity.js +71 -0
- package/dist/features/harness/explore/fake-app.d.ts +16 -0
- package/dist/features/harness/explore/fake-app.js +49 -0
- package/dist/features/harness/explore/goal-search.d.ts +26 -0
- package/dist/features/harness/explore/goal-search.js +144 -0
- package/dist/features/harness/explore/page-tree.d.ts +49 -0
- package/dist/features/harness/explore/page-tree.js +148 -0
- package/dist/features/harness/explore/site-map.d.ts +34 -0
- package/dist/features/harness/explore/site-map.js +150 -0
- package/dist/features/harness/fill-values.d.ts +3 -73
- package/dist/features/harness/fill-values.js +3 -169
- package/dist/features/harness/goals.d.ts +82 -0
- package/dist/features/harness/goals.js +330 -0
- package/dist/features/harness/harness.d.ts +51 -1
- package/dist/features/harness/harness.js +207 -6
- package/dist/features/harness/platform/drive-target.d.ts +30 -0
- package/dist/features/harness/platform/drive-target.js +81 -0
- package/dist/features/harness/platform/local-apps.d.ts +127 -0
- package/dist/features/harness/platform/local-apps.js +280 -0
- package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
- package/dist/features/harness/platform/persona-credentials.js +69 -0
- package/dist/features/harness/platform/platform-drives.d.ts +61 -0
- package/dist/features/harness/platform/platform-drives.js +114 -0
- package/dist/features/harness/platform/refusal.d.ts +52 -0
- package/dist/features/harness/platform/refusal.js +71 -0
- package/dist/features/harness/platform/remote-drive.d.ts +186 -0
- package/dist/features/harness/platform/remote-drive.js +378 -0
- package/dist/features/harness/platform/script.d.ts +94 -0
- package/dist/features/harness/platform/script.js +260 -0
- package/dist/features/harness/platform/server-driver.d.ts +54 -0
- package/dist/features/harness/platform/server-driver.js +182 -0
- package/dist/features/harness/platform-config.d.ts +41 -1
- package/dist/features/harness/platform-config.js +106 -9
- package/dist/features/harness/route-guess.d.ts +13 -0
- package/dist/features/harness/route-guess.js +49 -0
- package/dist/features/harness/script/app-controls.d.ts +5 -0
- package/dist/features/harness/script/app-controls.js +40 -0
- package/dist/features/harness/script/lane-ids.d.ts +14 -0
- package/dist/features/harness/script/lane-ids.js +16 -0
- package/dist/features/harness/script/script-run.d.ts +70 -0
- package/dist/features/harness/script/script-run.js +606 -0
- package/dist/features/license/license.d.ts +2 -2
- package/dist/features/visual/step-shots.d.ts +31 -0
- package/dist/features/visual/step-shots.js +231 -0
- package/dist/features/visual/visual-tools.d.ts +10 -1
- package/dist/features/visual/visual-tools.js +62 -17
- package/dist/hooks/client-directory.d.ts +18 -0
- package/dist/hooks/client-directory.js +57 -0
- package/dist/hooks/coding-agents.d.ts +34 -0
- package/dist/hooks/coding-agents.js +117 -0
- package/dist/hooks/driven-by.d.ts +23 -0
- package/dist/hooks/driven-by.js +56 -0
- package/dist/hooks/hook-bus.d.ts +4 -0
- package/dist/hooks/hook-bus.js +18 -0
- package/dist/hooks/hook-commands.js +15 -4
- package/dist/hooks/tool-log.d.ts +9 -0
- package/dist/hooks/tool-log.js +29 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +80 -243
- package/dist/judgement/capsule/capsule-store.d.ts +2 -2
- package/dist/judgement/capsule/causal-summary.d.ts +15 -1
- package/dist/judgement/capsule/causal-summary.js +33 -0
- package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
- package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
- package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
- package/dist/judgement/runs/artifact/gap-summary.js +12 -3
- package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
- package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
- package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
- package/dist/judgement/runs/artifact/run-store.js +195 -3
- package/dist/judgement/runs/context-tools.js +59 -1
- package/dist/judgement/runs/default-run-id.d.ts +3 -0
- package/dist/judgement/runs/default-run-id.js +16 -0
- package/dist/judgement/runs/drive-run.d.ts +71 -1
- package/dist/judgement/runs/drive-run.js +317 -5
- package/dist/judgement/runs/repair-prompt.js +1 -1
- package/dist/judgement/runs/resume.d.ts +44 -0
- package/dist/judgement/runs/resume.js +137 -0
- package/dist/judgement/runs/reticle-runner.js +13 -3
- package/dist/judgement/runs/runner-port.d.ts +5 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +5 -2
- package/dist/judgement/runs/verification-sync.js +40 -18
- package/dist/language/flows/change/gate.d.ts +10 -0
- package/dist/language/flows/change/gate.js +22 -0
- package/dist/language/flows/decision.js +36 -1
- package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
- package/dist/language/flows/fields/flow-secret-field.js +25 -2
- package/dist/language/flows/flow-anchor.d.ts +61 -10
- package/dist/language/flows/flow-anchor.js +98 -6
- package/dist/language/flows/flow-cross-step.d.ts +15 -0
- package/dist/language/flows/flow-cross-step.js +21 -0
- package/dist/language/flows/flow-intent.d.ts +1 -0
- package/dist/language/flows/flow-journey.d.ts +6 -0
- package/dist/language/flows/flow-journey.js +20 -0
- package/dist/language/flows/flow-learning.d.ts +4 -0
- package/dist/language/flows/flow-learning.js +45 -14
- package/dist/language/flows/flow-mutate-tools.js +5 -3
- package/dist/language/flows/flow-replay-run.d.ts +23 -9
- package/dist/language/flows/flow-replay-run.js +115 -110
- package/dist/language/flows/flow-replay-types.d.ts +1 -1
- package/dist/language/flows/flow-replay.d.ts +40 -1
- package/dist/language/flows/flow-replay.js +110 -22
- package/dist/language/flows/flow-result.d.ts +22 -1
- package/dist/language/flows/flow-result.js +47 -2
- package/dist/language/flows/flow-scope.js +5 -1
- package/dist/language/flows/flow-step-runners.d.ts +22 -2
- package/dist/language/flows/flow-step-runners.js +247 -47
- package/dist/language/flows/flow-store-for-session.d.ts +2 -2
- package/dist/language/flows/flow-store-for-session.js +7 -3
- package/dist/language/flows/flow-tools.d.ts +10 -0
- package/dist/language/flows/flow-tools.js +112 -89
- package/dist/language/flows/flows.d.ts +16 -1
- package/dist/language/flows/flows.js +74 -12
- package/dist/language/flows/heal-run.js +6 -4
- package/dist/language/flows/narrow-write.d.ts +7 -0
- package/dist/language/flows/narrow-write.js +36 -1
- package/dist/language/flows/recording/flake.d.ts +2 -2
- package/dist/language/flows/recording/recording-backtrack.js +14 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
- package/dist/language/flows/recording/tape/recordings.js +95 -13
- package/dist/language/flows/replay-from-hud.d.ts +20 -0
- package/dist/language/flows/replay-from-hud.js +51 -0
- package/dist/language/flows/replay.d.ts +9 -5
- package/dist/language/flows/replay.js +56 -15
- package/dist/language/flows/single-replay.d.ts +7 -0
- package/dist/language/flows/single-replay.js +26 -0
- package/dist/language/flows/suite/suite-flakes.js +2 -0
- package/dist/language/flows/suite-selection.d.ts +2 -15
- package/dist/language/flows/suite-selection.js +4 -3
- package/dist/language/flows/verify-change-tools.d.ts +1 -0
- package/dist/language/flows/verify-change-tools.js +202 -191
- package/dist/launch-chromium.d.ts +27 -5
- package/dist/launch-chromium.js +38 -8
- package/dist/memory/cloud/cloud-config.d.ts +22 -1
- package/dist/memory/cloud/cloud-config.js +34 -5
- package/dist/memory/cloud/cloud-sync.d.ts +17 -14
- package/dist/memory/cloud/cloud-sync.js +15 -4
- package/dist/memory/cloud/harness-config.d.ts +75 -1
- package/dist/memory/cloud/harness-config.js +115 -24
- package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
- package/dist/memory/cloud/hud-notices-source.js +128 -0
- package/dist/memory/cloud/memory-scope.d.ts +161 -0
- package/dist/memory/cloud/memory-scope.js +227 -0
- package/dist/memory/cloud/sync-cycle.d.ts +44 -7
- package/dist/memory/cloud/sync-cycle.js +129 -15
- package/dist/memory/cloud/sync-daemon.d.ts +11 -0
- package/dist/memory/cloud/sync-daemon.js +121 -9
- package/dist/memory/cloud/sync-disk.d.ts +1 -1
- package/dist/memory/cloud/sync-disk.js +31 -10
- package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
- package/dist/memory/cloud/sync-screenshots.js +105 -0
- package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
- package/dist/memory/cloud/unsynced-roots.js +166 -0
- package/dist/memory/impact/account-watch.d.ts +34 -0
- package/dist/memory/impact/account-watch.js +59 -0
- package/dist/memory/impact/impact-recorder.d.ts +8 -0
- package/dist/memory/impact/impact-recorder.js +12 -2
- package/dist/memory/impact/impact-store.d.ts +17 -4
- package/dist/memory/impact/impact-store.js +169 -63
- package/dist/memory/intent/inline-intent.d.ts +1 -0
- package/dist/memory/intent/intent-shard-store.js +16 -4
- package/dist/memory/intent/intent-shard.d.ts +14 -2
- package/dist/memory/intent/intent-store.d.ts +1 -0
- package/dist/memory/intent/intent-tools.js +122 -4
- package/dist/memory/intent/open-intents.d.ts +6 -0
- package/dist/memory/intent/open-intents.js +10 -1
- package/dist/memory/intent/settled-words.d.ts +24 -0
- package/dist/memory/intent/settled-words.js +130 -0
- package/dist/memory/journal/drive-flow.d.ts +16 -0
- package/dist/memory/journal/drive-flow.js +34 -2
- package/dist/memory/journal/drive-run-flush.d.ts +2 -0
- package/dist/memory/journal/drive-run-flush.js +20 -5
- package/dist/memory/journal/envelope.d.ts +8 -8
- package/dist/memory/journal/journal-recorder.js +52 -3
- package/dist/memory/journal/on-disk/retention.d.ts +8 -0
- package/dist/memory/journal/on-disk/retention.js +32 -2
- package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
- package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
- package/dist/memory/journal/session-end.d.ts +15 -1
- package/dist/memory/journal/session-end.js +42 -9
- package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
- package/dist/memory/project/artifact-root-resolver.js +125 -16
- package/dist/memory/project/artifact-root.d.ts +46 -8
- package/dist/memory/project/artifact-root.js +89 -10
- package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
- package/dist/memory/project/dir/reticle-dir.js +26 -3
- package/dist/memory/project/link-directory.d.ts +15 -0
- package/dist/memory/project/link-directory.js +44 -0
- package/dist/memory/project/project-tools.js +22 -3
- package/dist/memory/project/root-claims.d.ts +6 -0
- package/dist/memory/project/root-claims.js +39 -0
- package/dist/memory/project/session-root.d.ts +26 -1
- package/dist/memory/project/session-root.js +49 -5
- package/dist/memory/project/sync-status.d.ts +85 -0
- package/dist/memory/project/sync-status.js +224 -0
- package/dist/memory/recall/memory-tools.js +47 -2
- package/dist/memory/recall/platform-memory.d.ts +34 -0
- package/dist/memory/recall/platform-memory.js +139 -0
- package/dist/memory/recall/project-memory.d.ts +19 -0
- package/dist/memory/recall/project-memory.js +80 -13
- package/dist/portal/bridge/bridge.d.ts +9 -3
- package/dist/portal/bridge/bridge.js +82 -22
- package/dist/portal/bridge/harness-request.d.ts +23 -0
- package/dist/portal/bridge/harness-request.js +27 -0
- package/dist/portal/bridge/pairing-token.d.ts +9 -0
- package/dist/portal/bridge/pairing-token.js +17 -0
- package/dist/portal/bridge/wrong-path.d.ts +17 -0
- package/dist/portal/bridge/wrong-path.js +35 -0
- package/dist/portal/input/network-mock-tools.js +11 -2
- package/dist/portal/input/real-input.d.ts +83 -10
- package/dist/portal/input/real-input.js +218 -30
- package/dist/portal/input/viewport-tools.js +3 -3
- package/dist/portal/pool/browser-pool.d.ts +70 -9
- package/dist/portal/pool/browser-pool.js +190 -37
- package/dist/portal/pool/context-permissions.d.ts +33 -0
- package/dist/portal/pool/context-permissions.js +33 -0
- package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
- package/dist/portal/pool/lease-marker-stamp.js +49 -0
- package/dist/portal/pool/playwright-launcher.d.ts +35 -0
- package/dist/portal/pool/playwright-launcher.js +64 -3
- package/dist/portal/pool/pool-contract.d.ts +28 -5
- package/dist/portal/session/agent-link.d.ts +8 -0
- package/dist/portal/session/agent-link.js +17 -0
- package/dist/portal/session/command-payload.d.ts +8 -0
- package/dist/portal/session/command-payload.js +24 -0
- package/dist/portal/session/daemon-answers.d.ts +3 -3
- package/dist/portal/session/daemon-answers.js +4 -2
- package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
- package/dist/portal/session/dev-server/dev-command.js +87 -12
- package/dist/portal/session/facts/departure-note.d.ts +22 -0
- package/dist/portal/session/facts/departure-note.js +47 -0
- package/dist/portal/session/facts/observed-state.d.ts +16 -18
- package/dist/portal/session/facts/observed-state.js +46 -3
- package/dist/portal/session/facts/session-replaced.d.ts +5 -0
- package/dist/portal/session/facts/session-replaced.js +5 -0
- package/dist/portal/session/first-run-wiring.d.ts +42 -0
- package/dist/portal/session/first-run-wiring.js +132 -0
- package/dist/portal/session/human/live-control.d.ts +9 -2
- package/dist/portal/session/human/live-control.js +12 -3
- package/dist/portal/session/human/notes-ledger.d.ts +20 -0
- package/dist/portal/session/human/notes-ledger.js +55 -0
- package/dist/portal/session/human/review-store.d.ts +12 -0
- package/dist/portal/session/human/review-store.js +18 -10
- package/dist/portal/session/live-control-tools.d.ts +0 -13
- package/dist/portal/session/live-control-tools.js +107 -13
- package/dist/portal/session/narration-args.d.ts +5 -0
- package/dist/portal/session/narration-args.js +17 -0
- package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
- package/dist/portal/session/no-session-diagnosis.js +46 -9
- package/dist/portal/session/no-session-next-action.d.ts +31 -0
- package/dist/portal/session/no-session-next-action.js +159 -60
- package/dist/portal/session/no-session-watch.d.ts +14 -1
- package/dist/portal/session/no-session-watch.js +227 -17
- package/dist/portal/session/presence/session-lease.js +1 -1
- package/dist/portal/session/presence/session-mirror.js +3 -0
- package/dist/portal/session/recorded-gaps.d.ts +97 -0
- package/dist/portal/session/recorded-gaps.js +251 -0
- package/dist/portal/session/serving-directory.d.ts +27 -0
- package/dist/portal/session/serving-directory.js +45 -0
- package/dist/portal/session/session-health.d.ts +18 -0
- package/dist/portal/session/session-health.js +9 -1
- package/dist/portal/session/session-info.d.ts +8 -1
- package/dist/portal/session/session-info.js +8 -1
- package/dist/portal/session/session-manager.d.ts +39 -0
- package/dist/portal/session/session-manager.js +98 -11
- package/dist/portal/session/session-reaper.js +4 -1
- package/dist/portal/session/session-successor.d.ts +13 -0
- package/dist/portal/session/session-successor.js +1 -1
- package/dist/portal/session/session-tools.js +26 -3
- package/dist/portal/session/session.d.ts +22 -30
- package/dist/portal/session/session.js +81 -79
- package/dist/portal/session/timing/command-timeout.js +25 -1
- package/dist/portal/session/timing/wall-clock.d.ts +1 -1
- package/dist/portal/session/timing/wall-clock.js +1 -1
- package/dist/portal/session/zero-install-first-call.d.ts +31 -0
- package/dist/portal/session/zero-install-first-call.js +88 -0
- package/dist/start-options.d.ts +12 -0
- package/dist/start-wiring.d.ts +63 -0
- package/dist/start-wiring.js +169 -0
- package/dist/status-payload.d.ts +23 -1
- package/dist/status-payload.js +36 -1
- package/dist/surface/http-server.js +18 -2
- package/dist/surface/mcp/attach-memory.d.ts +1 -0
- package/dist/surface/mcp/attach-memory.js +12 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
- package/dist/surface/mcp/mcp-proxy.js +65 -13
- package/dist/surface/mcp/mcp.d.ts +34 -6
- package/dist/surface/mcp/mcp.js +61 -17
- package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
- package/dist/surface/mcp/proxy/drive-calls.js +27 -0
- package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
- package/dist/surface/mcp/server-instructions.d.ts +4 -2
- package/dist/surface/mcp/server-instructions.js +32 -14
- package/dist/surface/mcp/shared-params.js +2 -2
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +1 -0
- package/dist/surface/tools/account-tool.d.ts +22 -0
- package/dist/surface/tools/account-tool.js +157 -0
- package/dist/surface/tools/act/act-danger.d.ts +11 -0
- package/dist/surface/tools/act/act-danger.js +38 -1
- package/dist/surface/tools/act/act-observation.d.ts +33 -0
- package/dist/surface/tools/act/act-observation.js +57 -0
- package/dist/surface/tools/act/act-preflight.js +25 -2
- package/dist/surface/tools/act/act-target.js +8 -3
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
- package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
- package/dist/surface/tools/act/resolve-target.d.ts +1 -1
- package/dist/surface/tools/act/resolve-target.js +18 -3
- package/dist/surface/tools/act/screen-request.d.ts +34 -0
- package/dist/surface/tools/act/screen-request.js +113 -0
- package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
- package/dist/surface/tools/act/sequence-grade.js +13 -2
- package/dist/surface/tools/act/settle-in-flight.js +25 -3
- package/dist/surface/tools/act-sequence-tool.js +138 -29
- package/dist/surface/tools/act-tools.d.ts +0 -9
- package/dist/surface/tools/act-tools.js +71 -41
- package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
- package/dist/surface/tools/agent/app-notes-learning.js +80 -0
- package/dist/surface/tools/agent/app-notes.d.ts +4 -0
- package/dist/surface/tools/agent/app-notes.js +48 -0
- package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
- package/dist/surface/tools/agent/build-staleness.js +62 -0
- package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
- package/dist/surface/tools/agent/compact-envelope.js +374 -0
- package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
- package/dist/surface/tools/agent/for-the-agent.js +44 -0
- package/dist/surface/tools/agent/notices.d.ts +50 -0
- package/dist/surface/tools/agent/notices.js +152 -0
- package/dist/surface/tools/agent/reteach.d.ts +11 -0
- package/dist/surface/tools/agent/reteach.js +50 -0
- package/dist/surface/tools/args/alias-args.d.ts +5 -0
- package/dist/surface/tools/args/alias-args.js +10 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
- package/dist/surface/tools/assert/assert-source.d.ts +15 -0
- package/dist/surface/tools/assert/assert-source.js +40 -0
- package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
- package/dist/surface/tools/assert/assert-verdict.js +42 -17
- package/dist/surface/tools/browser-tools.js +51 -2
- package/dist/surface/tools/chat-drives.d.ts +101 -0
- package/dist/surface/tools/chat-drives.js +409 -0
- package/dist/surface/tools/coverage-tools.d.ts +2 -10
- package/dist/surface/tools/coverage-tools.js +2 -53
- package/dist/surface/tools/dynamic-tools.js +29 -1
- package/dist/surface/tools/empty-session-list.d.ts +51 -0
- package/dist/surface/tools/empty-session-list.js +120 -0
- package/dist/surface/tools/error-recovery.d.ts +14 -0
- package/dist/surface/tools/error-recovery.js +105 -8
- package/dist/surface/tools/explore-tools.d.ts +31 -1
- package/dist/surface/tools/explore-tools.js +438 -66
- package/dist/surface/tools/feedback-tools.d.ts +2 -3
- package/dist/surface/tools/feedback-tools.js +18 -3
- package/dist/surface/tools/gap-novelty.d.ts +3 -1
- package/dist/surface/tools/gap-novelty.js +8 -1
- package/dist/surface/tools/harness-explore.d.ts +118 -57
- package/dist/surface/tools/harness-explore.js +344 -292
- package/dist/surface/tools/harness-gate.d.ts +88 -0
- package/dist/surface/tools/harness-gate.js +235 -0
- package/dist/surface/tools/harness-hunt.d.ts +43 -0
- package/dist/surface/tools/harness-hunt.js +215 -0
- package/dist/surface/tools/harness-plan.d.ts +17 -0
- package/dist/surface/tools/harness-plan.js +38 -0
- package/dist/surface/tools/harness-script.d.ts +30 -0
- package/dist/surface/tools/harness-script.js +560 -0
- package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
- package/dist/surface/tools/harness-tab-guard.js +27 -0
- package/dist/surface/tools/harness-toolset.d.ts +22 -1
- package/dist/surface/tools/harness-toolset.js +101 -7
- package/dist/surface/tools/human-notes.d.ts +16 -0
- package/dist/surface/tools/human-notes.js +27 -0
- package/dist/surface/tools/invoke-tool.d.ts +5 -2
- package/dist/surface/tools/invoke-tool.js +263 -85
- package/dist/surface/tools/lease-hint.js +26 -5
- package/dist/surface/tools/lease-permissions.d.ts +33 -0
- package/dist/surface/tools/lease-permissions.js +73 -0
- package/dist/surface/tools/lease-readiness.d.ts +38 -0
- package/dist/surface/tools/lease-readiness.js +57 -0
- package/dist/surface/tools/lease-seed.d.ts +49 -0
- package/dist/surface/tools/lease-seed.js +167 -0
- package/dist/surface/tools/lease-tools.d.ts +13 -24
- package/dist/surface/tools/lease-tools.js +146 -197
- package/dist/surface/tools/live-call-text.js +4 -4
- package/dist/surface/tools/merge-tools.js +42 -2
- package/dist/surface/tools/merged-name-redirect.js +4 -0
- package/dist/surface/tools/next-step.d.ts +29 -0
- package/dist/surface/tools/next-step.js +214 -0
- package/dist/surface/tools/observe-tools.js +45 -9
- package/dist/surface/tools/platform-moment.d.ts +72 -0
- package/dist/surface/tools/platform-moment.js +296 -0
- package/dist/surface/tools/query-hint-schema.d.ts +7 -0
- package/dist/surface/tools/query-hint-schema.js +10 -0
- package/dist/surface/tools/read-tools.js +71 -14
- package/dist/surface/tools/real-input-attempt.js +96 -13
- package/dist/surface/tools/reticle-result.d.ts +120 -0
- package/dist/surface/tools/reticle-result.js +364 -0
- package/dist/surface/tools/tool-kit.d.ts +83 -3
- package/dist/surface/tools/tool-kit.js +77 -7
- package/dist/surface/tools/tools.js +43 -59
- package/dist/telemetry/account-envelope.d.ts +7 -0
- package/dist/telemetry/account-envelope.js +61 -0
- package/dist/telemetry/agent-client.d.ts +15 -0
- package/dist/telemetry/agent-client.js +57 -0
- package/dist/telemetry/app-instrumented.js +9 -2
- package/dist/telemetry/argument-shape.d.ts +7 -0
- package/dist/telemetry/argument-shape.js +86 -1
- package/dist/telemetry/automation-hint.d.ts +2 -3
- package/dist/telemetry/automation-hint.js +33 -8
- package/dist/telemetry/cli-telemetry.js +7 -2
- package/dist/telemetry/daemon-telemetry.js +3 -0
- package/dist/telemetry/error-fingerprint.d.ts +10 -1
- package/dist/telemetry/error-fingerprint.js +61 -5
- package/dist/telemetry/feedback-cli.d.ts +0 -13
- package/dist/telemetry/feedback-cli.js +0 -77
- package/dist/telemetry/feedback.d.ts +13 -0
- package/dist/telemetry/feedback.js +183 -17
- package/dist/telemetry/harness-run.d.ts +18 -0
- package/dist/telemetry/harness-run.js +80 -0
- package/dist/telemetry/hud-events.d.ts +16 -0
- package/dist/telemetry/hud-events.js +27 -0
- package/dist/telemetry/hud-metrics.d.ts +29 -6
- package/dist/telemetry/hud-metrics.js +116 -25
- package/dist/telemetry/init-telemetry.js +2 -2
- package/dist/telemetry/install-source.d.ts +13 -25
- package/dist/telemetry/install-source.js +44 -3
- package/dist/telemetry/mcp-connection.d.ts +0 -14
- package/dist/telemetry/mcp-connection.js +5 -1
- package/dist/telemetry/onboarding-firsts.d.ts +32 -0
- package/dist/telemetry/onboarding-firsts.js +81 -6
- package/dist/telemetry/platform-linked.d.ts +5 -0
- package/dist/telemetry/platform-linked.js +32 -0
- package/dist/telemetry/project-profile.js +5 -3
- package/dist/telemetry/proxy-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.d.ts +15 -4
- package/dist/telemetry/session-metrics.js +88 -52
- package/dist/telemetry/telemetry.d.ts +38 -2
- package/dist/telemetry/telemetry.js +144 -34
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +13 -4
- package/dist/wire-journal.d.ts +2 -2
- package/dist/wire-journal.js +20 -6
- package/docs/README.md +3 -3
- package/docs/actions.mdx +6 -3
- package/docs/adapters.md +1 -1
- package/docs/agent-cheatsheet.md +25 -28
- package/docs/architecture.md +5 -5
- package/docs/autodrive.md +33 -28
- package/docs/benchmarks.md +5 -5
- package/docs/best-practices.mdx +27 -9
- package/docs/capabilities.mdx +14 -16
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +54 -75
- package/docs/cli/doctor.mdx +14 -3
- package/docs/cli/drive.mdx +20 -14
- package/docs/cli/feedback.mdx +3 -3
- package/docs/cli/gate.mdx +7 -2
- package/docs/cli/help.mdx +50 -55
- package/docs/cli/init.mdx +43 -28
- package/docs/cli/license.mdx +12 -8
- package/docs/cli/mcp.mdx +4 -4
- package/docs/cli/open.mdx +3 -3
- package/docs/cli/report.mdx +4 -2
- package/docs/cli/restart.mdx +2 -2
- package/docs/cli/rollback.mdx +14 -8
- package/docs/cli/serve.mdx +4 -4
- package/docs/cli/setup.mdx +23 -0
- package/docs/cli/status.mdx +18 -5
- package/docs/cli/stop.mdx +67 -8
- package/docs/cli/try.mdx +62 -0
- package/docs/cli/update.mdx +4 -3
- package/docs/cli/verify.mdx +17 -6
- package/docs/cli/version.mdx +5 -4
- package/docs/cli.mdx +111 -42
- package/docs/debugging.md +3 -3
- package/docs/deploy-checks.md +1 -1
- package/docs/desktop.mdx +9 -3
- package/docs/enterprise.md +11 -10
- package/docs/environment.mdx +7 -8
- package/docs/faq.mdx +3 -3
- package/docs/first-drive.md +5 -4
- package/docs/flows.md +35 -27
- package/docs/for-agents.md +4 -5
- package/docs/frameworks.mdx +32 -21
- package/docs/getting-started.md +65 -61
- package/docs/human-control.md +16 -16
- package/docs/index.mdx +15 -42
- package/docs/install-agentic.mdx +22 -37
- package/docs/install-manual.mdx +23 -13
- package/docs/instrumentation.mdx +5 -3
- package/docs/integration-patterns.md +7 -7
- package/docs/license-activation.mdx +1 -1
- package/docs/multi-agent-testing.md +24 -6
- package/docs/packages/babel-plugin.mdx +4 -2
- package/docs/packages/browser.mdx +16 -10
- package/docs/packages/core.mdx +12 -5
- package/docs/packages/electron.mdx +3 -2
- package/docs/packages/engine.mdx +1 -1
- package/docs/packages/eslint-plugin.mdx +18 -12
- package/docs/packages/next.mdx +8 -7
- package/docs/packages/open-verification.mdx +1 -1
- package/docs/packages/server.mdx +5 -5
- package/docs/packages/tauri.mdx +9 -9
- package/docs/packages/test.mdx +4 -10
- package/docs/packages/vite-plugin.mdx +32 -4
- package/docs/packages.mdx +11 -15
- package/docs/platform-integration.md +6 -5
- package/docs/predicates.mdx +40 -24
- package/docs/quickstart.mdx +69 -30
- package/docs/required-checks.md +8 -7
- package/docs/reticle-manual.md +15 -5
- package/docs/skill-file.mdx +17 -79
- package/docs/skill-setup.md +9 -9
- package/docs/skill.md +200 -0
- package/docs/system-map.md +7 -7
- package/docs/telemetry.md +23 -25
- package/docs/testing.md +4 -4
- package/docs/token-efficiency.md +12 -12
- package/docs/tools/act-and-wait.mdx +9 -2
- package/docs/tools/act-sequence.mdx +6 -7
- package/docs/tools/act.mdx +2 -2
- package/docs/tools/assert.mdx +18 -17
- package/docs/tools/console.mdx +9 -9
- package/docs/tools/inspect.mdx +16 -7
- package/docs/tools/look.mdx +24 -0
- package/docs/tools/navigate.mdx +5 -3
- package/docs/tools/network.mdx +2 -2
- package/docs/tools/observe.mdx +6 -6
- package/docs/tools/overview.mdx +34 -33
- package/docs/tools/query.mdx +5 -5
- package/docs/tools/session-and-feedback.mdx +22 -13
- package/docs/tools/sessions.mdx +8 -8
- package/docs/tools/snapshot.mdx +6 -5
- package/docs/tools/state.mdx +9 -9
- package/docs/tools/tools-and-run.mdx +26 -24
- package/docs/tools/verify.mdx +28 -0
- package/docs/tools/wait-for.mdx +8 -4
- package/docs/troubleshooting.mdx +21 -6
- package/docs/usage.md +55 -46
- package/docs/use-cases.mdx +3 -3
- package/docs/vs-chrome-devtools-mcp.mdx +9 -6
- package/docs/vs-playwright-mcp.mdx +3 -1
- package/docs/what-is-recorded.md +17 -5
- package/docs/what-is-reticle.mdx +5 -3
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/cli/demo/demo-page.d.ts +0 -78
- package/dist/command/cli/demo/demo-page.js +0 -241
- package/dist/command/cli/demo/demo-run.d.ts +0 -38
- package/dist/command/cli/demo/demo-run.js +0 -138
- package/dist/features/harness/driver.d.ts +0 -50
- package/dist/features/harness/driver.js +0 -236
- package/dist/features/harness/jev-driver.d.ts +0 -188
- package/dist/features/harness/jev-driver.js +0 -678
- package/dist/features/harness/openai-driver.d.ts +0 -58
- package/dist/features/harness/openai-driver.js +0 -206
- package/dist/judgement/hunt/hunt-report.d.ts +0 -49
- package/dist/judgement/hunt/hunt-report.js +0 -84
- package/dist/language/flows/buddy-status.d.ts +0 -25
- package/dist/language/flows/buddy-status.js +0 -32
- package/dist/language/flows/change/watch-batcher.d.ts +0 -18
- package/dist/language/flows/change/watch-batcher.js +0 -19
- package/dist/memory/cloud/harness-offer.d.ts +0 -44
- package/dist/memory/cloud/harness-offer.js +0 -145
- package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
- package/dist/memory/project/dir/fill-value-store.js +0 -88
- package/dist/surface/tools/feature-capture.d.ts +0 -151
- package/dist/surface/tools/feature-capture.js +0 -235
- package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
- package/dist/surface/tools/tool-hit-rate.js +0 -90
- package/dist/telemetry/harness-drive.d.ts +0 -4
- package/dist/telemetry/harness-drive.js +0 -35
- package/dist/telemetry/identify.d.ts +0 -22
- package/dist/telemetry/identify.js +0 -73
- package/docs/cli/capsules.mdx +0 -70
- package/docs/cli/hunt.mdx +0 -73
- package/docs/cli/identify.mdx +0 -76
- package/docs/cli/kill.mdx +0 -91
- package/docs/cli/watch.mdx +0 -62
- package/docs/local-registry.md +0 -143
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { asProjectId } from '@reticlehq/core';
|
|
2
|
+
import { narrationArgs } from './narration-args.js';
|
|
2
3
|
import { refusedResult } from './page-commands/undeclared-command.js';
|
|
3
|
-
import { recordImpact } from '../../memory/impact/impact-recorder.js';
|
|
4
|
+
import { impactSnapshot, recordImpact } from '../../memory/impact/impact-recorder.js';
|
|
5
|
+
import { callingAgent } from '../../hooks/coding-agents.js';
|
|
6
|
+
import { recordNotes } from './human/notes-ledger.js';
|
|
7
|
+
import { commandPayload } from './command-payload.js';
|
|
4
8
|
import { LastAct } from './last-act.js';
|
|
5
9
|
import { GapLedger } from '@reticlehq/engine/evidence/gap-ledger.js';
|
|
6
|
-
import { CaptureLedger } from '../../surface/tools/feature-capture.js';
|
|
7
10
|
import { commandTimeoutMessage } from './timing/command-timeout.js';
|
|
8
11
|
import { readHealthEvent, healthNotices } from './session-health.js';
|
|
9
12
|
import { MIRRORED_COMMANDS, mirroredNarration } from './presence/session-mirror.js';
|
|
@@ -12,18 +15,21 @@ const IMPACT_PUSH_DEBOUNCE_MS = 700;
|
|
|
12
15
|
import { PendingCommands, CommandTimeoutError } from './page-commands/pending-commands.js';
|
|
13
16
|
import { span } from '../../trace.js';
|
|
14
17
|
import { keepCallerContextInDaemon, noteToDaemonLog } from './daemon-answers.js';
|
|
15
|
-
import { isKnownRealm, EventType, HumanControlDataSchema, HumanControlKind, HumanMarkDataSchema, HudUseDataSchema, ReticleCommand,
|
|
18
|
+
import { isKnownRealm, EventType, HumanControlDataSchema, HumanControlKind, HumanMarkDataSchema, HudUseDataSchema, ReticleCommand, parseEventPayload, PresenterTone, SESSION_HEALTH, SESSION_LEASE, SESSION_LIFECYCLE, SessionState, } from '@reticlehq/core';
|
|
16
19
|
import { RingBuffer } from '@reticlehq/engine/window/ring-buffer.js';
|
|
17
20
|
import { readJournalWriteLoss, readQueryEvents, windowLost, } from '../../memory/journal/journal-query.js';
|
|
18
21
|
import {} from '@reticlehq/engine/window/ambient.js';
|
|
19
22
|
import { ObservedState, controlLabelsOf } from './facts/observed-state.js';
|
|
20
|
-
import {
|
|
23
|
+
import { DepartureNote } from './facts/departure-note.js';
|
|
24
|
+
import { recordBrowserLatency, recordSdkFailure } from '../../telemetry/session-metrics.js';
|
|
25
|
+
import { noteHudTabClosed, noteHudTabHidden, reportHudUse } from '../../telemetry/hud-events.js';
|
|
21
26
|
import { LiveControl } from './human/live-control.js';
|
|
22
27
|
import { ReviewStore } from './human/review-store.js';
|
|
23
28
|
import { buildSessionRecommendation } from './presence/session-recommendation.js';
|
|
24
29
|
import { buildPresenterArgs } from './human/presenter-args.js';
|
|
25
30
|
import { buildSessionLease } from './presence/session-lease.js';
|
|
26
31
|
import { buildSessionInfo } from './session-info.js';
|
|
32
|
+
import { notedAct, probeMarkers, withInstrumentation } from './recorded-gaps.js';
|
|
27
33
|
import { MAX_SUCCESSOR_HOPS, REBINDABLE_COMMANDS } from './rebind.js';
|
|
28
34
|
const DEFAULT_COMMAND_TIMEOUT_MS = 8000;
|
|
29
35
|
/** Prefix on correlated command ids (c1, c2, …) — distinguishes them from mark ids. */
|
|
@@ -54,13 +60,8 @@ export class Session {
|
|
|
54
60
|
projectId;
|
|
55
61
|
/**
|
|
56
62
|
* The `.reticle` directory this session's evidence belongs in — impact counters AND capsules.
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* resolved per call: the answer cannot change while the tab is connected, and resolving it once
|
|
60
|
-
* means every counter that fires for this session agrees about where it goes.
|
|
61
|
-
*
|
|
62
|
-
* Undefined when nothing could name a project — the caller then falls back to the daemon's own
|
|
63
|
-
* root, which is what every counter did unconditionally before this existed.
|
|
63
|
+
* Stamped once, from the project it declared in HELLO, so every counter agrees where it goes.
|
|
64
|
+
* Undefined when nothing could name a project: callers fall back to the daemon's own root.
|
|
64
65
|
*/
|
|
65
66
|
artifactRoot;
|
|
66
67
|
/**
|
|
@@ -99,6 +100,8 @@ export class Session {
|
|
|
99
100
|
/** Which browser the page said it is (chrome/edge/arc/…). Undefined on an SDK too old to report one. */
|
|
100
101
|
#brand;
|
|
101
102
|
#focused = true;
|
|
103
|
+
/** The desktop window this is and its document's HTTP status, merged from every PAGE_HEALTH. */
|
|
104
|
+
page = {};
|
|
102
105
|
/** Liveness: wall-clock of the last AGENT command (distinct from browser chatter / lastSeen). */
|
|
103
106
|
#lastAgentActivityAt;
|
|
104
107
|
/** Server-side mirror of the agent-tuned idle window, so the reaper honors reticle_session. */
|
|
@@ -107,9 +110,10 @@ export class Session {
|
|
|
107
110
|
#autoEnded = false;
|
|
108
111
|
#live = new LiveControl();
|
|
109
112
|
/** Human review marks: mistakes the human pinned to elements, for the agent to drain and fix. */
|
|
110
|
-
#review = new ReviewStore();
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
#review = new ReviewStore((marks) => recordNotes(this.artifactRoot, marks));
|
|
114
|
+
#firstCommandDone = false; // whether the session_lease has been returned (fire-once)
|
|
115
|
+
/** The newest journal action: a verdict's screenshot names it, so the run pairs it with its check. */
|
|
116
|
+
lastActionId;
|
|
113
117
|
/** Durable causal-journal recorder; undefined when journaling is off (opt-out or not yet attached). */
|
|
114
118
|
#journal;
|
|
115
119
|
#activeActionId; // action window, held independently of the journal
|
|
@@ -129,6 +133,7 @@ export class Session {
|
|
|
129
133
|
* A hot update advances it inside the same document. An unstamped event never clears it.
|
|
130
134
|
*/
|
|
131
135
|
#editEpoch;
|
|
136
|
+
#departureNote = new DepartureNote();
|
|
132
137
|
constructor(hello, socket, clock) {
|
|
133
138
|
this.id = hello.sessionId;
|
|
134
139
|
this.projectId = hello.projectId === undefined ? undefined : asProjectId(hello.projectId);
|
|
@@ -148,6 +153,9 @@ export class Session {
|
|
|
148
153
|
elapsed() {
|
|
149
154
|
return this.#clock() - this.#startedAt;
|
|
150
155
|
}
|
|
156
|
+
departedTo() {
|
|
157
|
+
return this.#departureNote.read(this.elapsed());
|
|
158
|
+
}
|
|
151
159
|
/** Mark that the SDK was just heard from. Called on every inbound message. */
|
|
152
160
|
touch() {
|
|
153
161
|
this.#lastSeenAt = this.#clock();
|
|
@@ -226,6 +234,7 @@ export class Session {
|
|
|
226
234
|
runtime: this.#runtime,
|
|
227
235
|
versionSkew: this.versionSkew,
|
|
228
236
|
hidden: this.#hidden,
|
|
237
|
+
page: this.page,
|
|
229
238
|
health: () => this.health(),
|
|
230
239
|
staleMs: () => this.staleMs(),
|
|
231
240
|
pendingMarkCount: () => this.#review.pendingCount(),
|
|
@@ -274,7 +283,7 @@ export class Session {
|
|
|
274
283
|
if (event.type === EventType.HUD_USED) {
|
|
275
284
|
const use = HudUseDataSchema.safeParse(event.data);
|
|
276
285
|
if (use.success)
|
|
277
|
-
|
|
286
|
+
reportHudUse(use.data, this.id);
|
|
278
287
|
return;
|
|
279
288
|
}
|
|
280
289
|
if (event.documentId !== undefined)
|
|
@@ -283,6 +292,10 @@ export class Session {
|
|
|
283
292
|
this.#editEpoch = event.editEpoch;
|
|
284
293
|
if (event.type === EventType.PAGE_HEALTH) {
|
|
285
294
|
const r = readHealthEvent(event.data);
|
|
295
|
+
Object.assign(this.page, r.page);
|
|
296
|
+
// A hidden tab's HUD is not being looked at: its time stops until the tab is in front again.
|
|
297
|
+
if (r.hidden !== undefined)
|
|
298
|
+
noteHudTabHidden(this.id, r.hidden);
|
|
286
299
|
this.applyHealth(r.hidden ?? this.#hidden, r.focused ?? this.#focused, r.runtime, r.engine, r.brand);
|
|
287
300
|
}
|
|
288
301
|
// The in-page half of Reticle reporting its own failure — recorded like a tool error
|
|
@@ -303,8 +316,7 @@ export class Session {
|
|
|
303
316
|
const parsed = HumanMarkDataSchema.safeParse(event.data);
|
|
304
317
|
if (parsed.success) {
|
|
305
318
|
this.#review.add(parsed.data, this.elapsed());
|
|
306
|
-
//
|
|
307
|
-
// have shown a permanent zero next to a page covered in pins.
|
|
319
|
+
// Without this the report shows a permanent zero next to a page covered in pins.
|
|
308
320
|
recordImpact({ marks: 1 }, {}, this.artifactRoot);
|
|
309
321
|
}
|
|
310
322
|
}
|
|
@@ -316,6 +328,7 @@ export class Session {
|
|
|
316
328
|
if ('string' === typeof to && to.length > 0)
|
|
317
329
|
this.url = to;
|
|
318
330
|
}
|
|
331
|
+
this.#departureNote.observe(event, this.elapsed());
|
|
319
332
|
const t = this.elapsed();
|
|
320
333
|
const stamped = { ...event, t, sessionId: this.id };
|
|
321
334
|
// The recorder attributes the event to the in-flight action (if any) and journals it durably; the
|
|
@@ -371,10 +384,10 @@ export class Session {
|
|
|
371
384
|
return this.#observed.actedRefs();
|
|
372
385
|
}
|
|
373
386
|
noteRateLimited(dropped) {
|
|
374
|
-
this.#observed.noteRateLimited(dropped);
|
|
387
|
+
this.#observed.noteRateLimited(dropped, this.elapsed());
|
|
375
388
|
}
|
|
376
|
-
blindSpots() {
|
|
377
|
-
return this.#observed.blindSpots();
|
|
389
|
+
blindSpots(since) {
|
|
390
|
+
return this.#observed.blindSpots(since);
|
|
378
391
|
}
|
|
379
392
|
/** Learned ambient-churn counts (PredicateSession hook the settle oracle reads). */
|
|
380
393
|
ambientCounts() {
|
|
@@ -408,10 +421,7 @@ export class Session {
|
|
|
408
421
|
async journalWriteLoss() {
|
|
409
422
|
return readJournalWriteLoss(this.#journalReader, this.#buffer);
|
|
410
423
|
}
|
|
411
|
-
/**
|
|
412
|
-
* Open an action-attribution window: events observed until finishAction attribute to the returned
|
|
413
|
-
* action id. Ids are minted independently of command correlation ids so the journal is self-contained.
|
|
414
|
-
*/
|
|
424
|
+
/** Open an attribution window: events until finishAction carry the returned (journal-own) id. */
|
|
415
425
|
beginAction(tool, args) {
|
|
416
426
|
const actionId = this.#mintActionId();
|
|
417
427
|
// Held here, not only in the journal: with the journal off every event was unattributed, and
|
|
@@ -431,7 +441,8 @@ export class Session {
|
|
|
431
441
|
}
|
|
432
442
|
#mintActionId() {
|
|
433
443
|
this.#actionSeq += 1;
|
|
434
|
-
|
|
444
|
+
this.lastActionId = `${ACTION_ID_PREFIX}${String(this.#actionSeq)}`;
|
|
445
|
+
return this.lastActionId;
|
|
435
446
|
}
|
|
436
447
|
/**
|
|
437
448
|
* How many actions this session has dispatched.
|
|
@@ -479,11 +490,6 @@ export class Session {
|
|
|
479
490
|
* end of it.
|
|
480
491
|
*/
|
|
481
492
|
gaps = new GapLedger();
|
|
482
|
-
/**
|
|
483
|
-
* The read-only calls the journal does not keep, so "was `reticle_context` ever called" has
|
|
484
|
-
* something to fold. See surface/tools/feature-capture.ts — it is the only state that instrument adds.
|
|
485
|
-
*/
|
|
486
|
-
capture = new CaptureLedger();
|
|
487
493
|
// ── Server-authoritative liveness (immune to browser-tab throttling) ──────────────
|
|
488
494
|
/**
|
|
489
495
|
* Stamp the wall-clock of the latest AGENT command (called whenever a tool resolves this session).
|
|
@@ -570,13 +576,7 @@ export class Session {
|
|
|
570
576
|
if (successor !== undefined)
|
|
571
577
|
return successor.command(name, args, timeoutMs);
|
|
572
578
|
const id = this.#pending.nextId(COMMAND_ID_PREFIX);
|
|
573
|
-
const payload =
|
|
574
|
-
kind: MessageKind.COMMAND,
|
|
575
|
-
id,
|
|
576
|
-
sessionId: this.id,
|
|
577
|
-
name,
|
|
578
|
-
args,
|
|
579
|
-
});
|
|
579
|
+
const payload = commandPayload(id, this.id, name, args);
|
|
580
580
|
// The timeout message is built LAZILY: health can change while a command is in flight, and the
|
|
581
581
|
// diagnosis should describe the page as it was when the command actually gave up.
|
|
582
582
|
const awaited = this.#pending.track(id, timeoutMs, () => commandTimeoutMessage(name, timeoutMs, {
|
|
@@ -596,7 +596,7 @@ export class Session {
|
|
|
596
596
|
// The label is only knowable from the REPLY — the request carries a ref, and a ref dies with
|
|
597
597
|
// the next re-render. Recorded here so coverage survives frameworks that replace nodes.
|
|
598
598
|
if (name === ReticleCommand.ACT)
|
|
599
|
-
this.recordActedLabelFrom(result);
|
|
599
|
+
this.recordActedLabelFrom(notedAct(this, result));
|
|
600
600
|
return result;
|
|
601
601
|
})
|
|
602
602
|
.finally(() => recordBrowserLatency(Date.now() - sentAt))
|
|
@@ -632,6 +632,7 @@ export class Session {
|
|
|
632
632
|
/** Reject everything still in flight — used on disconnect. */
|
|
633
633
|
rejectAll(reason, replaced = false) {
|
|
634
634
|
this.#pending.rejectAll(reason, replaced);
|
|
635
|
+
noteHudTabClosed(this.id);
|
|
635
636
|
for (const listener of this.#disconnectListeners)
|
|
636
637
|
listener();
|
|
637
638
|
this.#disconnectListeners.clear();
|
|
@@ -653,13 +654,9 @@ export class Session {
|
|
|
653
654
|
this.#successor = next;
|
|
654
655
|
}
|
|
655
656
|
/**
|
|
656
|
-
* The replacement, but only while it can actually answer.
|
|
657
|
-
*
|
|
658
|
-
*
|
|
659
|
-
* hour ago keeps handing commands to a socket that has since closed — and the caller pays the full
|
|
660
|
-
* timeout to learn it, turning an instant "session replaced" into a wait. The point of delegating
|
|
661
|
-
* was to save the caller a round trip; delegating to a dead socket costs them more than the error
|
|
662
|
-
* did.
|
|
657
|
+
* The replacement, but only while it can actually answer. A successor is never cleared, so without
|
|
658
|
+
* this a session replaced an hour ago hands commands to a closed socket and the caller pays the
|
|
659
|
+
* full timeout to learn it — more than the "session replaced" error it was meant to save.
|
|
663
660
|
*/
|
|
664
661
|
#liveSuccessor() {
|
|
665
662
|
// Walked, not just read one hop. Two replacements in quick succession — a page that reloads
|
|
@@ -709,13 +706,20 @@ export class Session {
|
|
|
709
706
|
this.#live.setState(next);
|
|
710
707
|
this.pushPresenter(next, text, tone);
|
|
711
708
|
}
|
|
712
|
-
/** Push a human note onto the inbox (see LiveControl). */
|
|
709
|
+
/** Push a human note onto the inbox (see LiveControl); the HUD shows it as sent. */
|
|
713
710
|
pushMessage(text) {
|
|
714
711
|
this.#live.push(text, this.elapsed());
|
|
712
|
+
this.#repaintNotes();
|
|
715
713
|
}
|
|
716
|
-
/** Queued human notes, cleared as they are read (delivered-once). */
|
|
714
|
+
/** Queued human notes, cleared as they are read (delivered-once); the HUD shows them as seen. */
|
|
717
715
|
drainInbox() {
|
|
718
|
-
|
|
716
|
+
const taken = this.#live.drain(callingAgent());
|
|
717
|
+
if (0 < taken.length)
|
|
718
|
+
this.#repaintNotes();
|
|
719
|
+
return taken;
|
|
720
|
+
}
|
|
721
|
+
#repaintNotes() {
|
|
722
|
+
this.pushImpact(() => impactSnapshot(this.artifactRoot), true);
|
|
719
723
|
}
|
|
720
724
|
/** Diagnostic read of the inbox depth (does not clear). */
|
|
721
725
|
inboxSize() {
|
|
@@ -755,28 +759,26 @@ export class Session {
|
|
|
755
759
|
}
|
|
756
760
|
}
|
|
757
761
|
/**
|
|
758
|
-
* Push the impact record to this tab's HUD.
|
|
759
|
-
*
|
|
760
|
-
* Debounced: the record changes on every tool call, and the panel does not need 200 frames to
|
|
761
|
-
* show a counter going up. The LAST state always lands, because the timer re-reads the store
|
|
762
|
-
* when it fires rather than capturing a snapshot when it was scheduled.
|
|
762
|
+
* Push the impact record to this tab's HUD. Debounced (a counter needs no 200 frames); the LAST
|
|
763
|
+
* state always lands, because the timer re-reads the store when it fires.
|
|
763
764
|
*/
|
|
764
765
|
pushImpact(read, immediate = false) {
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
}
|
|
766
|
+
const send = () => {
|
|
767
|
+
const snapshot = read();
|
|
768
|
+
if (snapshot === undefined)
|
|
769
|
+
return; // each push carries this tab's own coverage
|
|
770
|
+
const post = () => this.#post(ReticleCommand.IMPACT, { snapshot: withInstrumentation(this, snapshot) });
|
|
771
|
+
post();
|
|
772
|
+
void probeMarkers([this]).then((learned) => learned && post()); // what the page carries
|
|
773
|
+
};
|
|
774
|
+
// A new tab's first record goes out at once: debounced, it reads "nothing recorded" over history.
|
|
775
|
+
if (immediate)
|
|
776
|
+
return send();
|
|
773
777
|
if (this.#impactTimer !== undefined)
|
|
774
778
|
return;
|
|
775
779
|
this.#impactTimer = setTimeout(() => {
|
|
776
780
|
this.#impactTimer = undefined;
|
|
777
|
-
|
|
778
|
-
if (snapshot !== undefined)
|
|
779
|
-
this.#post(ReticleCommand.IMPACT, { snapshot });
|
|
781
|
+
send();
|
|
780
782
|
}, IMPACT_PUSH_DEBOUNCE_MS);
|
|
781
783
|
this.#impactTimer.unref?.();
|
|
782
784
|
}
|
|
@@ -785,8 +787,17 @@ export class Session {
|
|
|
785
787
|
}
|
|
786
788
|
/** Fire-and-forget a narration row to the live panel (so a resolved mark shows "✓ fixed"). */
|
|
787
789
|
#impactTimer;
|
|
788
|
-
|
|
789
|
-
|
|
790
|
+
/** `mirror: false` for a notice about THIS page (its SDK is behind), which every tab says itself. */
|
|
791
|
+
pushNarration(text, mirror = true, by) {
|
|
792
|
+
const args = narrationArgs(text, by);
|
|
793
|
+
if (mirror)
|
|
794
|
+
this.#post(ReticleCommand.NARRATE, args);
|
|
795
|
+
else
|
|
796
|
+
this.#send(ReticleCommand.NARRATE, args);
|
|
797
|
+
}
|
|
798
|
+
/** A HUD replay's progress, or the Harness's drive plan: pictures the HUD redraws as they change. */
|
|
799
|
+
pushView(name, args) {
|
|
800
|
+
this.#post(name, { ...args });
|
|
790
801
|
}
|
|
791
802
|
/** The one-time lease block on the first agent command, then undefined forever after. */
|
|
792
803
|
takeSessionLease() {
|
|
@@ -822,12 +833,9 @@ export class Session {
|
|
|
822
833
|
this.#viewers = read;
|
|
823
834
|
}
|
|
824
835
|
/**
|
|
825
|
-
* Fire-and-forget command send
|
|
826
|
-
*
|
|
827
|
-
*
|
|
828
|
-
* (narration, impact). PRESENTER is deliberately not among them: it is the glow and the lifecycle
|
|
829
|
-
* that say "the agent is driving THIS tab", and a viewer that showed it would be claiming
|
|
830
|
-
* something untrue about itself.
|
|
836
|
+
* Fire-and-forget command send, NOT registered in #pending. Mirrored to this project's other tabs
|
|
837
|
+
* for the commands that REPORT what happened. PRESENTER is not among them: it says "the agent is
|
|
838
|
+
* driving THIS tab", and a viewer that showed it would be claiming something untrue about itself.
|
|
831
839
|
*/
|
|
832
840
|
#post(name, args) {
|
|
833
841
|
this.#send(name, args);
|
|
@@ -862,13 +870,7 @@ export class Session {
|
|
|
862
870
|
this.recordActedRef(ref);
|
|
863
871
|
}
|
|
864
872
|
const id = this.#pending.nextId(COMMAND_ID_PREFIX);
|
|
865
|
-
const payload =
|
|
866
|
-
kind: MessageKind.COMMAND,
|
|
867
|
-
id,
|
|
868
|
-
sessionId: this.id,
|
|
869
|
-
name,
|
|
870
|
-
args,
|
|
871
|
-
});
|
|
873
|
+
const payload = commandPayload(id, this.id, name, args);
|
|
872
874
|
try {
|
|
873
875
|
this.#socket.send(payload);
|
|
874
876
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { realmOf, AppRuntime, isOpaqueOrigin } from '@reticlehq/core';
|
|
1
|
+
import { realmOf, AppRuntime, isOpaqueOrigin, ReticleTool } from '@reticlehq/core';
|
|
2
2
|
/**
|
|
3
3
|
* Inbound silence beyond this means the page may genuinely be wedged; inside it, the SDK has spoken
|
|
4
4
|
* recently enough that "the page is hung" is provably the wrong story. A page that is streaming
|
|
@@ -17,6 +17,24 @@ const HIDDEN_ADVICE = 'The page last reported itself hidden, and this is a WKWeb
|
|
|
17
17
|
'observed on a hidden macOS WKWebView after a pause, even though capture still works; park it ' +
|
|
18
18
|
'off-screen rather than calling hide. If neither fits, the page is reachable but not executing, ' +
|
|
19
19
|
'which is worth reporting.';
|
|
20
|
+
/**
|
|
21
|
+
* A hidden page in an ordinary browser. Its frames and timers are throttled, so a command can time
|
|
22
|
+
* out while the SDK keeps reporting in, which is exactly the state ONE_WAY_ADVICE reads as a
|
|
23
|
+
* transport fault. Sending the agent to debug its own network there costs attempts and finds
|
|
24
|
+
* nothing (#1416): the way out is a tab nobody else is looking at, which a lease is.
|
|
25
|
+
*/
|
|
26
|
+
const HIDDEN_TAB_ADVICE = 'The page last reported itself hidden: it is a background tab, and the browser throttles a hidden ' +
|
|
27
|
+
"tab's frames and timers, so commands can time out while the page still reports in. This is not a " +
|
|
28
|
+
`network fault. Bring the tab to the front, or drive a tab Reticle owns: ${ReticleTool.LEASE} ` +
|
|
29
|
+
'{ action: "acquire", url: "%URL%" }.';
|
|
30
|
+
/**
|
|
31
|
+
* True only when the SDK REPORTED an ordinary browser tab. Not guessed from the URL: a Tauri or
|
|
32
|
+
* Electron dev server is http://localhost too, and an older SDK that omits the runtime would turn a
|
|
33
|
+
* hidden desktop window into "bring the tab forward", which addresses nothing there.
|
|
34
|
+
*/
|
|
35
|
+
function isWebTab(context) {
|
|
36
|
+
return AppRuntime.WEB === context.runtime;
|
|
37
|
+
}
|
|
20
38
|
/** True when this session is a WebKit desktop shell — the only runtime that suffers this. */
|
|
21
39
|
function isWebKitDesktop(context) {
|
|
22
40
|
if (realmOf(context.runtime).usesWebKit)
|
|
@@ -28,6 +46,12 @@ function isWebKitDesktop(context) {
|
|
|
28
46
|
}
|
|
29
47
|
export function commandTimeoutMessage(name, timeoutMs, context) {
|
|
30
48
|
const base = `command '${name}' timed out after ${String(timeoutMs)}ms`;
|
|
49
|
+
// A hidden WEB tab first, before the recently-heard branch: a background tab keeps reporting in
|
|
50
|
+
// while its throttled frames miss the command, so "heard recently" is expected there and says
|
|
51
|
+
// nothing about the transport. Desktop shells keep the order below unchanged.
|
|
52
|
+
if (context.hidden && isWebTab(context)) {
|
|
53
|
+
return `${base}. ${HIDDEN_TAB_ADVICE.replace('%URL%', context.url)}`;
|
|
54
|
+
}
|
|
31
55
|
// Checked FIRST, and it overrides the visibility story: a page that was heard from moments ago is
|
|
32
56
|
// executing JavaScript, so "hidden, hung or never presented" cannot be the explanation whatever
|
|
33
57
|
// `hidden` says. Deduced from the invariant, not from a measured incident — the Tauri case that
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* The real clock, named once.
|
|
3
3
|
*
|
|
4
4
|
* The logic that needs a clock takes one as an argument so a test can drive it without waiting
|
|
5
|
-
* (
|
|
5
|
+
* (AGENTS.md rule 7). That leaves the production callers each constructing the same pair of
|
|
6
6
|
* closures, which is how two of them end up with different sleep implementations. One export, one
|
|
7
7
|
* place to look.
|
|
8
8
|
*/
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* The real clock, named once.
|
|
3
3
|
*
|
|
4
4
|
* The logic that needs a clock takes one as an argument so a test can drive it without waiting
|
|
5
|
-
* (
|
|
5
|
+
* (AGENTS.md rule 7). That leaves the production callers each constructing the same pair of
|
|
6
6
|
* closures, which is how two of them end up with different sleep implementations. One export, one
|
|
7
7
|
* place to look.
|
|
8
8
|
*/
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type FirstRunWiring } from './first-run-wiring.js';
|
|
2
|
+
export interface FirstCallIo {
|
|
3
|
+
/** The unwired web app this call is about; undefined when wired, not a web app, or no project. */
|
|
4
|
+
project: () => string | undefined;
|
|
5
|
+
/** Which of these ports serve HTTP right now. */
|
|
6
|
+
serving: (ports: readonly number[]) => Promise<readonly number[]>;
|
|
7
|
+
/** The directory the process serving `url` runs in, when it can be observed. */
|
|
8
|
+
servingDirectory: (url: string) => string | undefined;
|
|
9
|
+
/** Open `url` in a lease — the path that supplies the SDK when the page never dials in. */
|
|
10
|
+
lease: (url: string) => Promise<unknown>;
|
|
11
|
+
/** Whether a session is connected now. */
|
|
12
|
+
connected: () => boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface FirstCallOpened {
|
|
15
|
+
url: string;
|
|
16
|
+
/** One line for the agent: what was opened, what it cannot see, and how to wire it for good. */
|
|
17
|
+
notice: string;
|
|
18
|
+
}
|
|
19
|
+
/** One lease per project for the daemon's life: a failure is reported once, never retried. */
|
|
20
|
+
export declare function firstCallOpener(io: FirstCallIo): () => Promise<FirstCallOpened | undefined>;
|
|
21
|
+
/**
|
|
22
|
+
* The daemon's two answers to an app nobody wired, built together because both ask the same
|
|
23
|
+
* question first — which unwired web app is this caller in. `firstRun` wires it when the agent
|
|
24
|
+
* lists sessions; `openUnwiredApp` opens it zero-install on a page-needing call.
|
|
25
|
+
*/
|
|
26
|
+
export declare function agentWiring(port: number, sessions: {
|
|
27
|
+
list(): readonly unknown[];
|
|
28
|
+
}, lease: (url: string) => Promise<unknown>): {
|
|
29
|
+
firstRun: FirstRunWiring;
|
|
30
|
+
openUnwiredApp: () => Promise<FirstCallOpened | undefined>;
|
|
31
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The first call that needs a page, on an app nobody wired: open that app ourselves, zero-install.
|
|
3
|
+
*
|
|
4
|
+
* An install through the MCP server alone (a plugin, a hand-written `npx … mcp` config) never runs
|
|
5
|
+
* `init`, so the app carries no SDK and nothing ever connects. The agent's first page-needing call
|
|
6
|
+
* then answered with a diagnosis, and the agent stopped there. A lease supplies the SDK to a page
|
|
7
|
+
* that never dials in, so the daemon can answer that call with the app itself instead.
|
|
8
|
+
*
|
|
9
|
+
* Only for a call that already asked to drive or read a page, and only on evidence: exactly one dev
|
|
10
|
+
* server whose process runs inside this project's folder. The port scan is machine-wide, and a
|
|
11
|
+
* browser opened on another repo's app produces a confident verdict about code nobody touched. It
|
|
12
|
+
* changes nothing in the repo — wiring it for good stays the agent's call, named in the notice.
|
|
13
|
+
*
|
|
14
|
+
* Where the serving process cannot be observed (no `lsof`, so Windows) nothing is opened and the
|
|
15
|
+
* no-session answer names the lease and the init command instead.
|
|
16
|
+
*/
|
|
17
|
+
import { realpathSync } from 'node:fs';
|
|
18
|
+
import { resolve, sep } from 'node:path';
|
|
19
|
+
import { DEV_SERVER_PORTS } from '../../command/cli/ports/resolve/cli-port.js';
|
|
20
|
+
import { callingClientDirectory } from '../../hooks/client-directory.js';
|
|
21
|
+
import { detectDevCommandInProject, initCommandIn } from './dev-server/dev-command.js';
|
|
22
|
+
import { probeDevServerStates } from './dev-server/dev-server-probe.js';
|
|
23
|
+
import { firstRunWiring } from './first-run-wiring.js';
|
|
24
|
+
import { servingDirectoryOf } from './serving-directory.js';
|
|
25
|
+
const LOCALHOST = 'http://localhost';
|
|
26
|
+
/** The path with symlinks resolved when it exists (lsof reports `/private/tmp`, callers `/tmp`). */
|
|
27
|
+
function real(path) {
|
|
28
|
+
try {
|
|
29
|
+
return realpathSync(path);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return resolve(path);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const inside = (c, p) => c === p || c.startsWith(`${p}${sep}`);
|
|
36
|
+
/** Compared both as written and with links resolved: either spelling may be the one lsof used. */
|
|
37
|
+
function within(child, parent) {
|
|
38
|
+
if (child === undefined)
|
|
39
|
+
return false;
|
|
40
|
+
return inside(resolve(child), resolve(parent)) || inside(real(child), real(parent));
|
|
41
|
+
}
|
|
42
|
+
function openedNotice(url, init) {
|
|
43
|
+
return (`This app is not wired for Reticle, so Reticle opened ${url} in its own browser and supplied ` +
|
|
44
|
+
'the SDK (zero-install: DOM, network, console and routes; no component state and no source ' +
|
|
45
|
+
`file:line). To wire it for good, run \`${init}\`, then ` +
|
|
46
|
+
'restart the dev server and reload the page.');
|
|
47
|
+
}
|
|
48
|
+
/** One lease per project for the daemon's life: a failure is reported once, never retried. */
|
|
49
|
+
export function firstCallOpener(io) {
|
|
50
|
+
const tried = new Set();
|
|
51
|
+
return async () => {
|
|
52
|
+
const dir = io.project();
|
|
53
|
+
if (dir === undefined || tried.has(dir))
|
|
54
|
+
return undefined;
|
|
55
|
+
const pinned = detectDevCommandInProject(dir)?.port;
|
|
56
|
+
const candidates = new Set(DEV_SERVER_PORTS);
|
|
57
|
+
if (pinned !== undefined)
|
|
58
|
+
candidates.add(pinned);
|
|
59
|
+
const own = (await io.serving([...candidates]))
|
|
60
|
+
.map((port) => `${LOCALHOST}:${String(port)}`)
|
|
61
|
+
.filter((url) => within(io.servingDirectory(url), dir));
|
|
62
|
+
const [url] = own;
|
|
63
|
+
// ponytail: nothing serving yet is not an attempt, so a later call looks again.
|
|
64
|
+
if (url === undefined || 1 !== own.length)
|
|
65
|
+
return undefined;
|
|
66
|
+
tried.add(dir);
|
|
67
|
+
await io.lease(url).catch(() => undefined);
|
|
68
|
+
if (!io.connected())
|
|
69
|
+
return undefined;
|
|
70
|
+
return { url, notice: openedNotice(url, initCommandIn(dir)) };
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The daemon's two answers to an app nobody wired, built together because both ask the same
|
|
75
|
+
* question first — which unwired web app is this caller in. `firstRun` wires it when the agent
|
|
76
|
+
* lists sessions; `openUnwiredApp` opens it zero-install on a page-needing call.
|
|
77
|
+
*/
|
|
78
|
+
export function agentWiring(port, sessions, lease) {
|
|
79
|
+
const firstRun = firstRunWiring({ port, cliPath: process.argv[1] ?? '' });
|
|
80
|
+
const openUnwiredApp = firstCallOpener({
|
|
81
|
+
project: () => firstRun.projectDirectory(callingClientDirectory() ?? process.cwd()),
|
|
82
|
+
serving: async (ports) => (await probeDevServerStates(ports)).serving,
|
|
83
|
+
servingDirectory: (url) => servingDirectoryOf(url),
|
|
84
|
+
lease,
|
|
85
|
+
connected: () => 0 < sessions.list().length,
|
|
86
|
+
});
|
|
87
|
+
return { firstRun, openUnwiredApp };
|
|
88
|
+
}
|
package/dist/start-options.d.ts
CHANGED
|
@@ -7,6 +7,18 @@
|
|
|
7
7
|
import type { OwnedRealInputProvider } from './portal/input/real-input.js';
|
|
8
8
|
import type { InjectConnectOptions } from './portal/input/real-input.js';
|
|
9
9
|
export interface StartOptions {
|
|
10
|
+
/**
|
|
11
|
+
* The panel's Sign in, supplied by the CLI door, which owns install-time code: given a repaint, it
|
|
12
|
+
* answers the handler the bridge runs on each press. An embedder of the library leaves it out, and
|
|
13
|
+
* its panel falls back to copying `reticle login`.
|
|
14
|
+
*/
|
|
15
|
+
hudSignIn?: (repaint: () => void,
|
|
16
|
+
/** Links the asking tab's project once the sign-in lands (`hudLink`). */
|
|
17
|
+
link?: (root: string) => Promise<number>) => (from?: {
|
|
18
|
+
artifactRoot?: string | undefined;
|
|
19
|
+
}) => void;
|
|
20
|
+
/** The Harness page's Link this project: link the project in this folder, as `reticle connect` does. */
|
|
21
|
+
hudLink?: (root: string) => Promise<number>;
|
|
10
22
|
port?: number;
|
|
11
23
|
/** Bind address. Non-loopback hosts require a token. Defaults to RETICLE_HOST or localhost. */
|
|
12
24
|
host?: string;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { NetworkDetail } from './portal/input/network-detail.js';
|
|
2
|
+
import type { StartOptions } from './start-options.js';
|
|
3
|
+
import type { Bridge } from './portal/bridge/bridge.js';
|
|
4
|
+
import type { RealInputProvider } from './portal/input/real-input.js';
|
|
5
|
+
import { BrowserPool } from './portal/pool/browser-pool.js';
|
|
6
|
+
import { type InjectedConnect } from './portal/pool/zero-install.js';
|
|
7
|
+
/**
|
|
8
|
+
* Build the shared browser pool (one headless Chromium, N capped isolated leased contexts). Lazy —
|
|
9
|
+
* no Chromium launches until the first lease — so creating it is free even when never used.
|
|
10
|
+
*/
|
|
11
|
+
/** Where the zero-install reader connects: this daemon's own bridge, with its pairing token. */
|
|
12
|
+
export declare function readerConnect(port: number, token: string | undefined): InjectedConnect;
|
|
13
|
+
export declare function createBrowserPool(headless: boolean, reader: InjectedConnect): BrowserPool;
|
|
14
|
+
/**
|
|
15
|
+
* Route CDP-authoritative network detail onto the driven session's journal.
|
|
16
|
+
*
|
|
17
|
+
* The page and the SDK session share an origin, so a NET_DETAIL is pushed to the matching connected
|
|
18
|
+
* session. Shared by both entry points: `startDaemon` previously omitted it entirely, so on the path
|
|
19
|
+
* users actually take, CDP network detail was collected and then dropped on the floor.
|
|
20
|
+
*/
|
|
21
|
+
export declare function makeNetworkDetailRouter(bridge: Bridge, driveUrl: string | undefined): (detail: NetworkDetail) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the drive/real-input provider from options — shared by start and startDaemon so the
|
|
24
|
+
* precedence (driveUrl launch+own → CDP attach → none) and the storageState/injectConnect plumbing
|
|
25
|
+
* live in ONE place. `onNavigateError` is the entrypoint's own cleanup (close the bridge/shared server)
|
|
26
|
+
* so a failed launch never leaks a WS port. A past divergence between the two paths let daemon mode
|
|
27
|
+
* run with a different setup — this removes that risk.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveRealInput(options: StartOptions, onNavigateError: () => Promise<void>, onNetworkDetail?: (detail: NetworkDetail) => void): Promise<{
|
|
30
|
+
realInput?: RealInputProvider;
|
|
31
|
+
owned?: {
|
|
32
|
+
dispose: () => Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* The SDK-upgrade sentence for the package.json of the project the page announced, evaluated at
|
|
37
|
+
* each HELLO so a just-edited manifest is what we name. The daemon's cwd only when that project's
|
|
38
|
+
* directory is unknown, and the framework-neutral sensor when that is not an app either (#1135).
|
|
39
|
+
*/
|
|
40
|
+
export declare function sdkFixForProject(projectId?: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Resolve a session's artifact root, from everything this machine knows about where projects live.
|
|
43
|
+
*
|
|
44
|
+
* Built once per daemon and closed over by every tool call. The two sources are read lazily and
|
|
45
|
+
* cheaply on each call rather than snapshotted at startup: `init` can run in another terminal while
|
|
46
|
+
* this daemon is up, and a resolution that used a startup snapshot would keep answering with a map
|
|
47
|
+
* from before the project the agent is now driving existed.
|
|
48
|
+
*/
|
|
49
|
+
/**
|
|
50
|
+
* Every `.reticle` root on this machine that sync should consider, from the same two sources the
|
|
51
|
+
* artifact resolver uses.
|
|
52
|
+
*
|
|
53
|
+
* Read on every call rather than snapshotted, for the same reason: `reticle link` can run in
|
|
54
|
+
* another terminal while this daemon is up, and a startup snapshot would keep that repo silent
|
|
55
|
+
* until somebody restarted a process they have no reason to suspect.
|
|
56
|
+
*
|
|
57
|
+
* Returns directories that MIGHT be linked; the caller resolves each and skips the ones that are
|
|
58
|
+
* not. Deciding that here would mean reading every cloud.json on every tick.
|
|
59
|
+
*/
|
|
60
|
+
export declare function knownProjectRoots(): string[];
|
|
61
|
+
/** This project's platform credential (stored, else the env key), as the env the platform readers take. */
|
|
62
|
+
export declare const platformEnvFor: (root: string | undefined) => () => Promise<NodeJS.ProcessEnv>;
|
|
63
|
+
export declare const loadHarnessConfig: (root: string) => Promise<import("./features/harness/platform-config.js").PlatformModelConfig | undefined>;
|