@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
|
@@ -20,14 +20,12 @@ export interface PooledPage {
|
|
|
20
20
|
*/
|
|
21
21
|
onConsole?(handler: (text: string) => void): void;
|
|
22
22
|
/**
|
|
23
|
-
* Capture the page as a PNG. OPTIONAL, like `onConsole`: a fake that does not implement it makes
|
|
23
|
+
* Capture the page as a PNG, or a JPEG at `jpegQuality` (a live picture, where size matters more). OPTIONAL, like `onConsole`: a fake that does not implement it makes
|
|
24
24
|
* the pool report "no provider", which is the correct degradation — an absent screenshotter must
|
|
25
25
|
* read as "this context cannot be captured", never as a blank image that a visual diff would then
|
|
26
26
|
* compare against and pass.
|
|
27
27
|
*/
|
|
28
|
-
screenshot?(opts?:
|
|
29
|
-
fullPage?: boolean;
|
|
30
|
-
}): Promise<Uint8Array>;
|
|
28
|
+
screenshot?(opts?: ScreenshotOptions): Promise<Uint8Array>;
|
|
31
29
|
/**
|
|
32
30
|
* Move the real pointer to (x, y) so CSS `:hover` applies. OPTIONAL, like `screenshot`: a fake
|
|
33
31
|
* that does not implement it makes hover refuse rather than dispatch a synthetic mouseover that
|
|
@@ -66,6 +64,11 @@ export interface PooledPage {
|
|
|
66
64
|
* existed short of restarting the daemon), because nothing in the stack ever answered it.
|
|
67
65
|
*/
|
|
68
66
|
onDialog?(handler: (dialog: PooledDialog) => void): void;
|
|
67
|
+
/**
|
|
68
|
+
* Make this the visible tab. OPTIONAL, like `onDialog`: a page opened beside others can start
|
|
69
|
+
* hidden, and a hidden tab throttles timers and rAF so nothing on it verifies (#1351).
|
|
70
|
+
*/
|
|
71
|
+
bringToFront?(): Promise<void>;
|
|
69
72
|
}
|
|
70
73
|
/** A native dialog the page opened, handed to the pool so it can be dismissed instead of left blocking. */
|
|
71
74
|
export interface PooledDialog {
|
|
@@ -105,14 +108,34 @@ export interface PooledContext {
|
|
|
105
108
|
newPage(): Promise<PooledPage>;
|
|
106
109
|
close(): Promise<void>;
|
|
107
110
|
addCookies?(cookies: PooledCookie[]): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Grant browser permissions on this context. OPTIONAL, like `addCookies`: a context that cannot
|
|
113
|
+
* grant makes a lease that asked for permissions refuse, rather than open with none granted while
|
|
114
|
+
* the caller believes otherwise.
|
|
115
|
+
*/
|
|
116
|
+
grantPermissions?(permissions: string[], opts?: {
|
|
117
|
+
origin?: string;
|
|
118
|
+
}): Promise<void>;
|
|
119
|
+
/** Drop every permission granted on this context. OPTIONAL, for the same reason. */
|
|
120
|
+
clearPermissions?(): Promise<void>;
|
|
108
121
|
}
|
|
109
122
|
/** The launched browser. Real Playwright `Browser` satisfies this. */
|
|
110
123
|
export interface PooledBrowser {
|
|
111
124
|
isConnected(): boolean;
|
|
112
|
-
|
|
125
|
+
/** `ignoreHTTPSErrors` accepts a self-signed or local-CA certificate for this context only. */
|
|
126
|
+
newContext(opts?: {
|
|
127
|
+
ignoreHTTPSErrors?: boolean;
|
|
128
|
+
}): Promise<PooledContext>;
|
|
113
129
|
close(): Promise<void>;
|
|
114
130
|
/** Fires when the browser process dies/crashes so the pool can relaunch on the next acquire. */
|
|
115
131
|
onDisconnected(handler: () => void): void;
|
|
116
132
|
}
|
|
117
133
|
/** Produces a freshly launched browser. Injected so tests can supply a fake. */
|
|
118
134
|
export type Launcher = () => Promise<PooledBrowser>;
|
|
135
|
+
/** How a page is captured: the whole page or the viewport, and JPEG at a quality instead of PNG. */
|
|
136
|
+
export interface ScreenshotOptions {
|
|
137
|
+
fullPage?: boolean;
|
|
138
|
+
jpegQuality?: number;
|
|
139
|
+
/** One image pixel per CSS pixel, so a high-density display does not double a step screenshot. */
|
|
140
|
+
cssScale?: boolean;
|
|
141
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the HUD shows about the coding agent: who is attached, and this tab's latest notes to it with
|
|
3
|
+
* whether an agent's tool call has taken each one. Read from the session's own inbox history, so
|
|
4
|
+
* "Seen" is shown only for a note that was actually handed to an agent.
|
|
5
|
+
*/
|
|
6
|
+
import { type AgentLink } from '@reticlehq/core';
|
|
7
|
+
import type { InboxMessage } from './human/live-control.js';
|
|
8
|
+
export declare function agentLinkOf(history: readonly InboxMessage[]): AgentLink;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the HUD shows about the coding agent: who is attached, and this tab's latest notes to it with
|
|
3
|
+
* whether an agent's tool call has taken each one. Read from the session's own inbox history, so
|
|
4
|
+
* "Seen" is shown only for a note that was actually handed to an agent.
|
|
5
|
+
*/
|
|
6
|
+
import { AGENT_NOTE_MAX, AGENT_NOTES_SHOWN } from '@reticlehq/core';
|
|
7
|
+
import { connectedAgents } from '../../hooks/coding-agents.js';
|
|
8
|
+
export function agentLinkOf(history) {
|
|
9
|
+
return {
|
|
10
|
+
agents: connectedAgents(),
|
|
11
|
+
notes: history.slice(-AGENT_NOTES_SHOWN).map((message) => ({
|
|
12
|
+
text: message.text.slice(0, AGENT_NOTE_MAX),
|
|
13
|
+
seen: true === message.seen,
|
|
14
|
+
...(message.by === undefined ? {} : { by: message.by }),
|
|
15
|
+
})),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The command a session sends its page, as wire JSON.
|
|
3
|
+
*
|
|
4
|
+
* Marked `by: harness` when the Harness is the one calling, so the HUD can show the person watching
|
|
5
|
+
* which of the two is driving their app. Absent means the connected agent, which is also what an
|
|
6
|
+
* older page that does not know the field assumes.
|
|
7
|
+
*/
|
|
8
|
+
export declare function commandPayload(id: string, sessionId: string, name: string, args: Record<string, unknown>): string;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CommandActor, MessageKind } from '@reticlehq/core';
|
|
2
|
+
import { currentDrivenBy, harnessOutwardAllowed } from '../../hooks/driven-by.js';
|
|
3
|
+
/**
|
|
4
|
+
* The command a session sends its page, as wire JSON.
|
|
5
|
+
*
|
|
6
|
+
* Marked `by: harness` when the Harness is the one calling, so the HUD can show the person watching
|
|
7
|
+
* which of the two is driving their app. Absent means the connected agent, which is also what an
|
|
8
|
+
* older page that does not know the field assumes.
|
|
9
|
+
*/
|
|
10
|
+
export function commandPayload(id, sessionId, name, args) {
|
|
11
|
+
return JSON.stringify({
|
|
12
|
+
kind: MessageKind.COMMAND,
|
|
13
|
+
id,
|
|
14
|
+
sessionId,
|
|
15
|
+
name,
|
|
16
|
+
args,
|
|
17
|
+
...(currentDrivenBy() === undefined ? {} : { by: CommandActor.HARNESS }),
|
|
18
|
+
// The page presses no outward control (invite, send, delete, pay…) the journey did not ask for.
|
|
19
|
+
...outwardField(harnessOutwardAllowed()),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function outwardField(allowed) {
|
|
23
|
+
return allowed === undefined ? {} : { outward: { allowed } };
|
|
24
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { log } from '../../log.js';
|
|
2
|
-
import { bindSpanContext } from '../../trace.js';
|
|
3
2
|
/**
|
|
4
3
|
* What the daemon answers when the rules that decide a verdict ask it for something.
|
|
5
4
|
*
|
|
@@ -15,6 +14,7 @@ import { bindSpanContext } from '../../trace.js';
|
|
|
15
14
|
export declare const noteToDaemonLog: typeof log;
|
|
16
15
|
/**
|
|
17
16
|
* Keep a callback belonging to the call that created it, so a re-check scheduled for later still
|
|
18
|
-
* traces back to the wait that asked for it instead of looking like work starting from nowhere
|
|
17
|
+
* traces back to the wait that asked for it instead of looking like work starting from nowhere, and
|
|
18
|
+
* is still the Harness's when the Harness made the call: the HUD files it by who drove it.
|
|
19
19
|
*/
|
|
20
|
-
export declare const keepCallerContextInDaemon:
|
|
20
|
+
export declare const keepCallerContextInDaemon: <A extends unknown[]>(fn: (...args: A) => void) => ((...args: A) => void);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { log } from '../../log.js';
|
|
2
2
|
import { bindSpanContext } from '../../trace.js';
|
|
3
|
+
import { bindDrivenBy } from '../../hooks/driven-by.js';
|
|
3
4
|
/**
|
|
4
5
|
* What the daemon answers when the rules that decide a verdict ask it for something.
|
|
5
6
|
*
|
|
@@ -15,6 +16,7 @@ import { bindSpanContext } from '../../trace.js';
|
|
|
15
16
|
export const noteToDaemonLog = log;
|
|
16
17
|
/**
|
|
17
18
|
* Keep a callback belonging to the call that created it, so a re-check scheduled for later still
|
|
18
|
-
* traces back to the wait that asked for it instead of looking like work starting from nowhere
|
|
19
|
+
* traces back to the wait that asked for it instead of looking like work starting from nowhere, and
|
|
20
|
+
* is still the Harness's when the Harness made the call: the HUD files it by who drove it.
|
|
19
21
|
*/
|
|
20
|
-
export const keepCallerContextInDaemon = bindSpanContext;
|
|
22
|
+
export const keepCallerContextInDaemon = (fn) => bindDrivenBy(bindSpanContext(fn));
|
|
@@ -16,6 +16,8 @@ export interface DevCommand {
|
|
|
16
16
|
script?: string;
|
|
17
17
|
/** The port the script PINS, when it pins one. Absent means the tool picks — never a guess. */
|
|
18
18
|
port?: number;
|
|
19
|
+
/** The app's directory, when it is not the project root. The caller must run the command there. */
|
|
20
|
+
directory?: string;
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
21
23
|
* The dev command for the project in `directory`, or undefined when there is not one to be sure of.
|
|
@@ -24,3 +26,22 @@ export interface DevCommand {
|
|
|
24
26
|
* default disk reader.
|
|
25
27
|
*/
|
|
26
28
|
export declare function detectDevCommand(directory: string, read?: (path: string) => string | undefined): DevCommand | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* The dev command for the project, looking one level down when the root has none.
|
|
31
|
+
*
|
|
32
|
+
* `reticle init` is run at the repo root, and in a monorepo the app is a directory down — so the
|
|
33
|
+
* daemon's "this project declares no dev script" was false for a root whose `frontend/package.json`
|
|
34
|
+
* held `"dev": "vite"`, and the agent asked a human for a command that was on disk (reticle#1368).
|
|
35
|
+
* init's own workspace listing answers which directories to consider; the root's lockfile picks the
|
|
36
|
+
* package manager, because a workspace package usually has no lockfile of its own.
|
|
37
|
+
*/
|
|
38
|
+
export declare function detectDevCommandInProject(directory: string, read?: (path: string) => string | undefined, listDirs?: (path: string) => readonly string[]): DevCommand | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* The command that wires THIS project for good: `init`, in the app's own folder, through the
|
|
41
|
+
* one-off runner the project's package manager ships.
|
|
42
|
+
*
|
|
43
|
+
* Handed to an agent whose install never ran `init` (an MCP-only route), so it has to be right first
|
|
44
|
+
* time: `init` run in a folder that is not the app stops on a missing package.json, and a runner the
|
|
45
|
+
* machine does not have is "command not found". npx whenever there is doubt — it ships with Node.
|
|
46
|
+
*/
|
|
47
|
+
export declare function initCommandIn(directory: string, read?: (path: string) => string | undefined, listDirs?: (path: string) => readonly string[]): string;
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Pure apart from one injected reader, so every case is a unit test rather than a temp directory.
|
|
10
10
|
*/
|
|
11
|
-
import { readFileSync } from 'node:fs';
|
|
11
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
12
12
|
import { join } from 'node:path';
|
|
13
|
-
import { desktopLaunch } from '@reticlehq/init';
|
|
13
|
+
import { RETICLE_NPM_PACKAGE, desktopLaunch, workspacePackageDirs } from '@reticlehq/init';
|
|
14
14
|
/**
|
|
15
15
|
* Script names checked, in order.
|
|
16
16
|
*
|
|
@@ -23,11 +23,27 @@ const DEV_SCRIPTS = ['dev', 'develop', 'start'];
|
|
|
23
23
|
const LOCKFILES = [
|
|
24
24
|
{ file: 'pnpm-lock.yaml', manager: 'pnpm' },
|
|
25
25
|
{ file: 'yarn.lock', manager: 'yarn' },
|
|
26
|
+
{ file: 'bun.lockb', manager: 'bun' },
|
|
27
|
+
{ file: 'bun.lock', manager: 'bun' },
|
|
26
28
|
];
|
|
29
|
+
/** The one-off runner each manager ships, for running Reticle's CLI without installing it. */
|
|
30
|
+
const RUNNER = { pnpm: 'pnpm dlx', bun: 'bunx' };
|
|
31
|
+
const NPX = 'npx';
|
|
32
|
+
const YARN = 'yarn';
|
|
33
|
+
/** `yarn dlx` exists only on Yarn 2+, which is the yarn that writes this file; classic yarn has none. */
|
|
34
|
+
const YARN_BERRY_MARKER = '.yarnrc.yml';
|
|
35
|
+
const YARN_DLX = 'yarn dlx';
|
|
36
|
+
const INIT_VERB = 'init';
|
|
27
37
|
const DEFAULT_PACKAGE_MANAGER = 'npm';
|
|
28
38
|
const PACKAGE_JSON = 'package.json';
|
|
29
39
|
/** `--port 4311` / `--port=4311`, the flag every dev server in this list accepts. */
|
|
30
40
|
const PORT_FLAG = /--port[= ]\s*(\d+)/;
|
|
41
|
+
/**
|
|
42
|
+
* `-p 3005`, the short form Next, Nuxt and Astro accept (reticle#1367).
|
|
43
|
+
*
|
|
44
|
+
* Anchored to a start or a whitespace so the `-p` inside a longer flag (`--pretty`) is not a port.
|
|
45
|
+
*/
|
|
46
|
+
const PORT_SHORT_FLAG = /(?:^|\s)-p\s*(\d+)/;
|
|
31
47
|
/** `PORT=8080 remix dev` — the other half of how a project pins its port. */
|
|
32
48
|
const PORT_ENV = /(?:^|\s)PORT=(\d+)/;
|
|
33
49
|
/** Reads a file, or undefined if it is not there / not readable. */
|
|
@@ -41,7 +57,7 @@ function readTextFile(path) {
|
|
|
41
57
|
}
|
|
42
58
|
/** The port the script pins, when it pins one at all. */
|
|
43
59
|
function pinnedPort(script) {
|
|
44
|
-
const match = PORT_FLAG.exec(script) ?? PORT_ENV.exec(script);
|
|
60
|
+
const match = PORT_FLAG.exec(script) ?? PORT_SHORT_FLAG.exec(script) ?? PORT_ENV.exec(script);
|
|
45
61
|
const digits = match?.[1];
|
|
46
62
|
if (digits === undefined)
|
|
47
63
|
return undefined;
|
|
@@ -68,17 +84,15 @@ function scriptsOf(manifest) {
|
|
|
68
84
|
return {};
|
|
69
85
|
return scripts;
|
|
70
86
|
}
|
|
71
|
-
/**
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
*/
|
|
77
|
-
|
|
87
|
+
/** The package manager the lockfiles under `directory` identify. Anything else is npm. */
|
|
88
|
+
function packageManager(directory, read) {
|
|
89
|
+
return (LOCKFILES.find(({ file }) => read(join(directory, file)) !== undefined)?.manager ??
|
|
90
|
+
DEFAULT_PACKAGE_MANAGER);
|
|
91
|
+
}
|
|
92
|
+
/** The dev command for the package in `directory`, with the manager chosen by the caller. */
|
|
93
|
+
function devCommandFor(directory, manager, read) {
|
|
78
94
|
const manifest = readManifest(read(join(directory, PACKAGE_JSON)));
|
|
79
95
|
const scripts = scriptsOf(manifest);
|
|
80
|
-
const manager = LOCKFILES.find(({ file }) => read(join(directory, file)) !== undefined)?.manager ??
|
|
81
|
-
DEFAULT_PACKAGE_MANAGER;
|
|
82
96
|
// A desktop shell's `dev` is its renderer's dev server, which no window ever opens onto. init's
|
|
83
97
|
// rule decides which launcher it is, so the command the daemon hands an agent and the one init
|
|
84
98
|
// spawns are the same.
|
|
@@ -105,3 +119,64 @@ export function detectDevCommand(directory, read = readTextFile) {
|
|
|
105
119
|
}
|
|
106
120
|
return undefined;
|
|
107
121
|
}
|
|
122
|
+
/** Directory names under `path`, or none when it cannot be read. */
|
|
123
|
+
function readDirNames(path) {
|
|
124
|
+
try {
|
|
125
|
+
return readdirSync(path, { withFileTypes: true })
|
|
126
|
+
.filter((entry) => entry.isDirectory())
|
|
127
|
+
.map((entry) => entry.name);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The dev command for the project in `directory`, or undefined when there is not one to be sure of.
|
|
135
|
+
*
|
|
136
|
+
* `read` is injected so the whole decision is testable without a filesystem; the daemon uses the
|
|
137
|
+
* default disk reader.
|
|
138
|
+
*/
|
|
139
|
+
export function detectDevCommand(directory, read = readTextFile) {
|
|
140
|
+
return devCommandFor(directory, packageManager(directory, read), read);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The dev command for the project, looking one level down when the root has none.
|
|
144
|
+
*
|
|
145
|
+
* `reticle init` is run at the repo root, and in a monorepo the app is a directory down — so the
|
|
146
|
+
* daemon's "this project declares no dev script" was false for a root whose `frontend/package.json`
|
|
147
|
+
* held `"dev": "vite"`, and the agent asked a human for a command that was on disk (reticle#1368).
|
|
148
|
+
* init's own workspace listing answers which directories to consider; the root's lockfile picks the
|
|
149
|
+
* package manager, because a workspace package usually has no lockfile of its own.
|
|
150
|
+
*/
|
|
151
|
+
export function detectDevCommandInProject(directory, read = readTextFile, listDirs = readDirNames) {
|
|
152
|
+
const manager = packageManager(directory, read);
|
|
153
|
+
const here = devCommandFor(directory, manager, read);
|
|
154
|
+
if (here !== undefined)
|
|
155
|
+
return here;
|
|
156
|
+
const packages = workspacePackageDirs({
|
|
157
|
+
readFile: (path) => read(join(directory, path)) ?? null,
|
|
158
|
+
listDirs: (path) => listDirs(join(directory, path)),
|
|
159
|
+
});
|
|
160
|
+
for (const sub of packages) {
|
|
161
|
+
const found = devCommandFor(join(directory, sub), manager, read);
|
|
162
|
+
if (found !== undefined)
|
|
163
|
+
return { ...found, directory: sub };
|
|
164
|
+
}
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The command that wires THIS project for good: `init`, in the app's own folder, through the
|
|
169
|
+
* one-off runner the project's package manager ships.
|
|
170
|
+
*
|
|
171
|
+
* Handed to an agent whose install never ran `init` (an MCP-only route), so it has to be right first
|
|
172
|
+
* time: `init` run in a folder that is not the app stops on a missing package.json, and a runner the
|
|
173
|
+
* machine does not have is "command not found". npx whenever there is doubt — it ships with Node.
|
|
174
|
+
*/
|
|
175
|
+
export function initCommandIn(directory, read = readTextFile, listDirs = readDirNames) {
|
|
176
|
+
const manager = packageManager(directory, read);
|
|
177
|
+
const berry = read(join(directory, YARN_BERRY_MARKER)) !== undefined;
|
|
178
|
+
const runner = YARN === manager ? (berry ? YARN_DLX : NPX) : (RUNNER[manager] ?? NPX);
|
|
179
|
+
const command = `${runner} ${RETICLE_NPM_PACKAGE} ${INIT_VERB}`;
|
|
180
|
+
const app = detectDevCommandInProject(directory, read, listDirs)?.directory;
|
|
181
|
+
return app === undefined ? command : `cd ${app} && ${command}`;
|
|
182
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ReticleEvent } from '@reticlehq/core';
|
|
2
|
+
/**
|
|
3
|
+
* Where the SDK last saw the page heading.
|
|
4
|
+
*
|
|
5
|
+
* The SDK emits a navigation-initiated NET_PENDING while the old document is still alive — the
|
|
6
|
+
* one fact that can outrun the socket close (#1256). This keeps it off `Session.url` deliberately:
|
|
7
|
+
* successor matching and the 5xx probe need the page the tab was ON; this is where it was GOING.
|
|
8
|
+
* Timestamps are session-relative milliseconds, read from the session's injected clock.
|
|
9
|
+
*/
|
|
10
|
+
export declare class DepartureNote {
|
|
11
|
+
#private;
|
|
12
|
+
/** Fold one inbound event into the note. */
|
|
13
|
+
observe(event: ReticleEvent, elapsedMs: number): void;
|
|
14
|
+
/**
|
|
15
|
+
* The navigation target, if it is fresh enough to be this departure's story.
|
|
16
|
+
*
|
|
17
|
+
* A navigation intent from long ago is not this departure: the document survived it — it kept
|
|
18
|
+
* talking — so attributing a later disconnect to it would invent a story. Read at tombstone
|
|
19
|
+
* time, when `elapsedMs` is the disconnect time.
|
|
20
|
+
*/
|
|
21
|
+
read(elapsedMs: number): string | undefined;
|
|
22
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { EventType, NetInitiator } from '@reticlehq/core';
|
|
2
|
+
/**
|
|
3
|
+
* How long a navigation-departure note stays attributable to the disconnect that follows it.
|
|
4
|
+
*
|
|
5
|
+
* The socket close follows a real departure within seconds; a note older than this belongs to a
|
|
6
|
+
* navigation the document survived, and blaming a later disconnect on it would invent a story.
|
|
7
|
+
*/
|
|
8
|
+
const DEPARTED_TO_FRESHNESS_MS = 30_000;
|
|
9
|
+
/**
|
|
10
|
+
* Where the SDK last saw the page heading.
|
|
11
|
+
*
|
|
12
|
+
* The SDK emits a navigation-initiated NET_PENDING while the old document is still alive — the
|
|
13
|
+
* one fact that can outrun the socket close (#1256). This keeps it off `Session.url` deliberately:
|
|
14
|
+
* successor matching and the 5xx probe need the page the tab was ON; this is where it was GOING.
|
|
15
|
+
* Timestamps are session-relative milliseconds, read from the session's injected clock.
|
|
16
|
+
*/
|
|
17
|
+
export class DepartureNote {
|
|
18
|
+
#note;
|
|
19
|
+
/** Fold one inbound event into the note. */
|
|
20
|
+
observe(event, elapsedMs) {
|
|
21
|
+
if (event.type !== EventType.NET_PENDING)
|
|
22
|
+
return;
|
|
23
|
+
// Only navigation-initiated pendings count: a fetch that never settled is in-flight work,
|
|
24
|
+
// not a departure.
|
|
25
|
+
if (event.data['initiator'] !== NetInitiator.NAVIGATION)
|
|
26
|
+
return;
|
|
27
|
+
// A download never takes the document away, so it must not explain a later disconnect.
|
|
28
|
+
if (true === event.data['download'])
|
|
29
|
+
return;
|
|
30
|
+
const url = event.data['url'];
|
|
31
|
+
if ('string' !== typeof url || 0 === url.length)
|
|
32
|
+
return;
|
|
33
|
+
this.#note = { url, at: elapsedMs };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The navigation target, if it is fresh enough to be this departure's story.
|
|
37
|
+
*
|
|
38
|
+
* A navigation intent from long ago is not this departure: the document survived it — it kept
|
|
39
|
+
* talking — so attributing a later disconnect to it would invent a story. Read at tombstone
|
|
40
|
+
* time, when `elapsedMs` is the disconnect time.
|
|
41
|
+
*/
|
|
42
|
+
read(elapsedMs) {
|
|
43
|
+
if (this.#note === undefined)
|
|
44
|
+
return undefined;
|
|
45
|
+
return elapsedMs - this.#note.at <= DEPARTED_TO_FRESHNESS_MS ? this.#note.url : undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -1,21 +1,5 @@
|
|
|
1
1
|
import { type ReticleEvent } from '@reticlehq/core';
|
|
2
2
|
import { type AmbientCounts } from '@reticlehq/engine/window/ambient.js';
|
|
3
|
-
/**
|
|
4
|
-
* The two things a session learns by watching its own event stream, as opposed to storing.
|
|
5
|
-
*
|
|
6
|
-
* Both are LEVELS derived from a stream, and both have to outlive the ring buffer — which is what
|
|
7
|
-
* separates them from the buffer's job and earns them their own unit:
|
|
8
|
-
*
|
|
9
|
-
* ambient — which regions of the page move on their own (chat, tickers, live counters). Used by
|
|
10
|
-
* the settle oracle to ignore background motion, so an action isn't held open forever
|
|
11
|
-
* by churn it did not cause.
|
|
12
|
-
* blindSpots — how much of the page the SDK cannot observe (cross-origin frames, closed shadow
|
|
13
|
-
* roots). The SDK reports these only when the count CHANGES, so a page that mounts
|
|
14
|
-
* two frames at load announces them once and is silent forever after. Anything that
|
|
15
|
-
* infers coverage from a window of events therefore sees nothing and concludes the
|
|
16
|
-
* page was fully observed — a positive claim to have seen what we cannot see. Holding
|
|
17
|
-
* the level here makes coverage something to ask rather than infer.
|
|
18
|
-
*/
|
|
19
3
|
export declare class ObservedState {
|
|
20
4
|
#private;
|
|
21
5
|
/** Fold one already-attributed event into the learned state. */
|
|
@@ -57,8 +41,22 @@ export declare class ObservedState {
|
|
|
57
41
|
* dropped before they reached the observer. Recording it here keeps the honesty contract intact —
|
|
58
42
|
* a verdict over a sampled window says `coverage: partial` rather than implying it saw everything.
|
|
59
43
|
*/
|
|
60
|
-
noteRateLimited(dropped: number): void;
|
|
61
|
-
|
|
44
|
+
noteRateLimited(dropped: number, at?: number): void;
|
|
45
|
+
/**
|
|
46
|
+
* How many events the bridge sampled away at or after `since` (session-elapsed ms).
|
|
47
|
+
*
|
|
48
|
+
* A bucket is counted when any part of its second reaches the window, so a drop in the same
|
|
49
|
+
* second as the window's start still impeaches it: erring toward unclean is the safe direction.
|
|
50
|
+
*/
|
|
51
|
+
rateDroppedSince(since: number): number;
|
|
52
|
+
/**
|
|
53
|
+
* The blind spots, session-wide; or, given `since`, with bridge sampling counted only from then on.
|
|
54
|
+
*
|
|
55
|
+
* Coverage reads the session-wide view: that sampling happened at all is a fact about the session.
|
|
56
|
+
* A verdict deciding whether ITS capture is clean reads the windowed one. Read session-wide there,
|
|
57
|
+
* one early burst made every later verdict on the tab `unclean_capture` (#1414).
|
|
58
|
+
*/
|
|
59
|
+
blindSpots(since?: number): Readonly<Record<string, number>>;
|
|
62
60
|
}
|
|
63
61
|
/**
|
|
64
62
|
* The snapshot-shaped labels an act reply names its control by: the testid, and `role "name"`.
|
|
@@ -16,12 +16,18 @@ import { ambientKeyOf } from '@reticlehq/engine/window/ambient.js';
|
|
|
16
16
|
* page was fully observed — a positive claim to have seen what we cannot see. Holding
|
|
17
17
|
* the level here makes coverage something to ask rather than infer.
|
|
18
18
|
*/
|
|
19
|
+
/** The resolution rate-limit drops are kept at: per second of session time. */
|
|
20
|
+
const RATE_DROP_BUCKET_MS = 1000;
|
|
21
|
+
/** An hour of seconds; older buckets are past any window a verdict reads. */
|
|
22
|
+
const MAX_RATE_DROP_BUCKETS = 3600;
|
|
19
23
|
export class ObservedState {
|
|
20
24
|
/** What THIS session observed. Never contains seeded history — see seedAmbient. */
|
|
21
25
|
#ownAmbient = {};
|
|
22
26
|
/** What previous sessions learned, kept separate so it is never re-persisted as if newly seen. */
|
|
23
27
|
#seededAmbient = {};
|
|
24
28
|
#blindSpots = {};
|
|
29
|
+
/** Bridge-side sampling, by second of session time. See noteRateLimited. */
|
|
30
|
+
#rateDrops = [];
|
|
25
31
|
/** Fold one already-attributed event into the learned state. */
|
|
26
32
|
observe(event) {
|
|
27
33
|
// Only UNATTRIBUTED events count as ambient: an event caused by an action is the action's work,
|
|
@@ -124,11 +130,48 @@ export class ObservedState {
|
|
|
124
130
|
* dropped before they reached the observer. Recording it here keeps the honesty contract intact —
|
|
125
131
|
* a verdict over a sampled window says `coverage: partial` rather than implying it saw everything.
|
|
126
132
|
*/
|
|
127
|
-
noteRateLimited(dropped) {
|
|
133
|
+
noteRateLimited(dropped, at) {
|
|
134
|
+
const before = this.#blindSpots[BlindSpotKind.RATE_LIMITED] ?? 0;
|
|
128
135
|
this.#blindSpots[BlindSpotKind.RATE_LIMITED] = dropped;
|
|
136
|
+
// WHEN, beside how many: the running total above is a fact about the session, and read as one
|
|
137
|
+
// it made every verdict after a single burst `unclean_capture`, however quiet its own window
|
|
138
|
+
// was (#1414). Bucketed per second so a sustained flood stays a bounded list.
|
|
139
|
+
if (at === undefined || dropped <= before)
|
|
140
|
+
return;
|
|
141
|
+
const second = Math.floor(at / RATE_DROP_BUCKET_MS) * RATE_DROP_BUCKET_MS;
|
|
142
|
+
const last = this.#rateDrops[this.#rateDrops.length - 1];
|
|
143
|
+
if (last !== undefined && last.at === second)
|
|
144
|
+
last.count += dropped - before;
|
|
145
|
+
else
|
|
146
|
+
this.#rateDrops.push({ at: second, count: dropped - before });
|
|
147
|
+
if (this.#rateDrops.length > MAX_RATE_DROP_BUCKETS)
|
|
148
|
+
this.#rateDrops.shift();
|
|
129
149
|
}
|
|
130
|
-
|
|
131
|
-
|
|
150
|
+
/**
|
|
151
|
+
* How many events the bridge sampled away at or after `since` (session-elapsed ms).
|
|
152
|
+
*
|
|
153
|
+
* A bucket is counted when any part of its second reaches the window, so a drop in the same
|
|
154
|
+
* second as the window's start still impeaches it: erring toward unclean is the safe direction.
|
|
155
|
+
*/
|
|
156
|
+
rateDroppedSince(since) {
|
|
157
|
+
let total = 0;
|
|
158
|
+
for (const bucket of this.#rateDrops) {
|
|
159
|
+
if (bucket.at + RATE_DROP_BUCKET_MS > since)
|
|
160
|
+
total += bucket.count;
|
|
161
|
+
}
|
|
162
|
+
return total;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* The blind spots, session-wide; or, given `since`, with bridge sampling counted only from then on.
|
|
166
|
+
*
|
|
167
|
+
* Coverage reads the session-wide view: that sampling happened at all is a fact about the session.
|
|
168
|
+
* A verdict deciding whether ITS capture is clean reads the windowed one. Read session-wide there,
|
|
169
|
+
* one early burst made every later verdict on the tab `unclean_capture` (#1414).
|
|
170
|
+
*/
|
|
171
|
+
blindSpots(since) {
|
|
172
|
+
if (since === undefined)
|
|
173
|
+
return this.#blindSpots;
|
|
174
|
+
return { ...this.#blindSpots, [BlindSpotKind.RATE_LIMITED]: this.rateDroppedSince(since) };
|
|
132
175
|
}
|
|
133
176
|
}
|
|
134
177
|
/**
|
|
@@ -33,6 +33,11 @@ export declare function isSessionReplacedError(error: unknown): boolean;
|
|
|
33
33
|
* `PendingCommands.rejectAll` documents, and a caller that CAN wait decides what it means.
|
|
34
34
|
*/
|
|
35
35
|
export declare const SESSION_DISCONNECTED_REASON = "session disconnected";
|
|
36
|
+
/**
|
|
37
|
+
* The close an agent's `reticle_session { action: "end", disconnect: true }` sends. The page's SDK
|
|
38
|
+
* prints it and stops retrying, so it says how to undo it. A close reason is capped at 123 bytes.
|
|
39
|
+
*/
|
|
40
|
+
export declare const SESSION_PARKED_REASON = "detached by the agent (session end, disconnect) \u2014 restart the daemon to attach this window again";
|
|
36
41
|
/**
|
|
37
42
|
* Is this failure the page's transport going away, rather than an answer from the page?
|
|
38
43
|
*
|
|
@@ -38,6 +38,11 @@ export function isSessionReplacedError(error) {
|
|
|
38
38
|
* `PendingCommands.rejectAll` documents, and a caller that CAN wait decides what it means.
|
|
39
39
|
*/
|
|
40
40
|
export const SESSION_DISCONNECTED_REASON = 'session disconnected';
|
|
41
|
+
/**
|
|
42
|
+
* The close an agent's `reticle_session { action: "end", disconnect: true }` sends. The page's SDK
|
|
43
|
+
* prints it and stops retrying, so it says how to undo it. A close reason is capped at 123 bytes.
|
|
44
|
+
*/
|
|
45
|
+
export const SESSION_PARKED_REASON = 'detached by the agent (session end, disconnect) — restart the daemon to attach this window again';
|
|
41
46
|
/**
|
|
42
47
|
* Is this failure the page's transport going away, rather than an answer from the page?
|
|
43
48
|
*
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface WiredStep {
|
|
2
|
+
mark: string;
|
|
3
|
+
title: string;
|
|
4
|
+
target: string;
|
|
5
|
+
}
|
|
6
|
+
export interface WireOutcome {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
/** Where init ran. */
|
|
9
|
+
directory: string;
|
|
10
|
+
/** Every step of init's plan, applied or not, as it printed them. */
|
|
11
|
+
steps: WiredStep[];
|
|
12
|
+
/** The app's url, when init got as far as the dev server. */
|
|
13
|
+
url?: string;
|
|
14
|
+
/** Why it stopped, in init's words or ours. */
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface RunResult {
|
|
18
|
+
code: number;
|
|
19
|
+
stdout: string;
|
|
20
|
+
stderr: string;
|
|
21
|
+
}
|
|
22
|
+
export type RunCli = (args: readonly string[], cwd: string) => Promise<RunResult>;
|
|
23
|
+
export interface FirstRunWiring {
|
|
24
|
+
/**
|
|
25
|
+
* The directory init would run in, or undefined when it cannot be told without guessing: a
|
|
26
|
+
* daemon started in the home directory or at a filesystem root has no project of its own.
|
|
27
|
+
*/
|
|
28
|
+
projectDirectory(cwd: string): string | undefined;
|
|
29
|
+
wire(directory: string): Promise<WireOutcome>;
|
|
30
|
+
}
|
|
31
|
+
export declare function projectDirectoryOf(cwd: string, home?: string, wired?: (dir: string) => boolean): string | undefined;
|
|
32
|
+
/** init's plan lines, and the one JSON object it prints last under `--json`. */
|
|
33
|
+
export declare function readInitOutput(stdout: string): {
|
|
34
|
+
steps: WiredStep[];
|
|
35
|
+
result: unknown;
|
|
36
|
+
};
|
|
37
|
+
export declare function firstRunWiring(options: {
|
|
38
|
+
/** This daemon's port, so init wires the app to it rather than choosing another. */
|
|
39
|
+
port: number;
|
|
40
|
+
cliPath: string;
|
|
41
|
+
run?: RunCli;
|
|
42
|
+
}): FirstRunWiring;
|