@reticlehq/server 3.5.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SKILL.md +123 -116
- package/dist/chromium-launch-options.d.ts +3 -1
- package/dist/chromium-launch-options.js +2 -1
- package/dist/command/cli/adhoc-suite.d.ts +14 -0
- package/dist/command/cli/adhoc-suite.js +42 -7
- package/dist/command/cli/adhoc-verdict.d.ts +19 -2
- package/dist/command/cli/adhoc-verdict.js +76 -9
- package/dist/command/cli/answers/gate-exit.d.ts +23 -0
- package/dist/command/cli/answers/gate-exit.js +45 -0
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +3 -1
- package/dist/command/cli/answers/open-note.d.ts +2 -0
- package/dist/command/cli/answers/open-note.js +22 -0
- package/dist/command/cli/auth/device-flow.d.ts +13 -2
- package/dist/command/cli/auth/device-flow.js +17 -0
- package/dist/command/cli/cli-doctor.js +14 -0
- package/dist/command/cli/cli-flow-commands.d.ts +0 -11
- package/dist/command/cli/cli-flow-commands.js +31 -112
- package/dist/command/cli/cli-kill.js +3 -2
- package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
- package/dist/command/cli/cli-parse-grammar.js +75 -0
- package/dist/command/cli/cli-parse-verify.d.ts +2 -0
- package/dist/command/cli/cli-parse-verify.js +18 -0
- package/dist/command/cli/cli-parse.d.ts +19 -28
- package/dist/command/cli/cli-parse.js +82 -182
- package/dist/command/cli/cli-update-commands.d.ts +1 -1
- package/dist/command/cli/cli-update-commands.js +61 -9
- package/dist/command/cli/cli-usage.d.ts +33 -0
- package/dist/command/cli/cli-usage.js +287 -0
- package/dist/command/cli/cli-verify.d.ts +35 -5
- package/dist/command/cli/cli-verify.js +114 -35
- package/dist/command/cli/cloud-cli.d.ts +13 -0
- package/dist/command/cli/cloud-cli.js +192 -341
- package/dist/command/cli/cloud-kit.d.ts +12 -0
- package/dist/command/cli/cloud-kit.js +41 -2
- package/dist/command/cli/cloud-link.d.ts +57 -0
- package/dist/command/cli/cloud-link.js +308 -0
- package/dist/command/cli/cloud-login.d.ts +22 -0
- package/dist/command/cli/cloud-login.js +96 -8
- package/dist/command/cli/context-command.d.ts +1 -0
- package/dist/command/cli/context-command.js +33 -0
- package/dist/command/cli/daemon-start-options.d.ts +3 -0
- package/dist/command/cli/daemon-start-options.js +24 -3
- package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
- package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
- package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
- package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
- package/dist/command/cli/doctor/doctor-project-line.js +5 -4
- package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
- package/dist/command/cli/doctor/doctor-rows.js +6 -0
- package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
- package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
- package/dist/command/cli/drive/drive-attach.d.ts +27 -2
- package/dist/command/cli/drive/drive-attach.js +71 -4
- package/dist/command/cli/drive/drive-command.d.ts +2 -1
- package/dist/command/cli/drive/drive-command.js +13 -7
- package/dist/command/cli/known-regression.d.ts +13 -0
- package/dist/command/cli/known-regression.js +34 -0
- package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
- package/dist/command/cli/launch/sdk-version-match.js +25 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
- package/dist/command/cli/mcp-command.d.ts +6 -0
- package/dist/command/cli/mcp-command.js +13 -5
- package/dist/command/cli/ports/port-holder.d.ts +10 -0
- package/dist/command/cli/ports/port-holder.js +25 -1
- package/dist/command/cli/project-name.d.ts +29 -1
- package/dist/command/cli/project-name.js +107 -2
- package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
- package/dist/command/cli/setup-mcp-cli.js +35 -12
- package/dist/command/cli/status/status-lines.d.ts +1 -0
- package/dist/command/cli/status/status-lines.js +47 -2
- package/dist/command/cli/status/workspace-links.d.ts +10 -0
- package/dist/command/cli/status/workspace-links.js +29 -0
- package/dist/command/cli/try-command.d.ts +96 -0
- package/dist/command/cli/try-command.js +362 -0
- package/dist/command/cli/tutorial.d.ts +0 -100
- package/dist/command/cli/tutorial.js +0 -181
- package/dist/command/cli/verify-results.d.ts +19 -0
- package/dist/command/cli/verify-results.js +29 -0
- package/dist/command/cli-onboarding.d.ts +0 -11
- package/dist/command/cli-onboarding.js +0 -15
- package/dist/command/cli.d.ts +20 -0
- package/dist/command/cli.js +130 -104
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
- package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
- package/dist/command/daemon/daemon-resilience.js +4 -4
- package/dist/command/daemon/daemon-resolve.d.ts +23 -1
- package/dist/command/daemon/daemon-resolve.js +79 -9
- package/dist/command/setup/agent-writer.d.ts +1 -1
- package/dist/command/setup/agent-writer.js +3 -2
- package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
- package/dist/command/setup/bringup/bridge-port.js +13 -3
- package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
- package/dist/command/setup/bringup/connect-lease.js +1 -0
- package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
- package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
- package/dist/command/setup/bringup/dev-server-wait.js +19 -0
- package/dist/command/setup/bringup/ensure-daemon.js +9 -2
- package/dist/command/setup/init/agent-restart.d.ts +23 -0
- package/dist/command/setup/init/agent-restart.js +28 -0
- package/dist/command/setup/init/init-port.d.ts +14 -1
- package/dist/command/setup/init/init-port.js +32 -2
- package/dist/command/setup/init/init-runtime.d.ts +22 -2
- package/dist/command/setup/init/init-runtime.js +114 -38
- package/dist/command/setup/node-effects.d.ts +2 -0
- package/dist/command/setup/node-effects.js +38 -9
- package/dist/command/setup/probe/existing-app.d.ts +12 -0
- package/dist/command/setup/probe/existing-app.js +14 -0
- package/dist/command/setup/remaining-steps.js +2 -1
- package/dist/command/setup/run-setup.d.ts +34 -9
- package/dist/command/setup/run-setup.js +65 -51
- package/dist/command/setup/setup-command.d.ts +25 -1
- package/dist/command/setup/setup-command.js +59 -4
- package/dist/command/setup/setup-mcp.js +25 -2
- package/dist/command/setup/tauri-signing.d.ts +19 -0
- package/dist/command/setup/tauri-signing.js +79 -0
- package/dist/command/setup/terminal/listeners.d.ts +10 -1
- package/dist/command/setup/terminal/listeners.js +37 -6
- package/dist/command/update/update-nudge.d.ts +9 -0
- package/dist/command/update/update-nudge.js +1 -1
- package/dist/command/update/updater.js +11 -15
- package/dist/command/version/version-nudge.js +3 -0
- package/dist/command/version/version-skew.d.ts +20 -1
- package/dist/command/version/version-skew.js +49 -4
- package/dist/features/crawl/crawl-tools.js +4 -0
- package/dist/features/crawl/crawl.d.ts +6 -0
- package/dist/features/crawl/crawl.js +23 -2
- package/dist/features/exhaust/ledger.d.ts +21 -14
- package/dist/features/exhaust/ledger.js +35 -9
- package/dist/features/harness/app-findings.d.ts +2 -0
- package/dist/features/harness/app-findings.js +52 -0
- package/dist/features/harness/drive-report.d.ts +61 -1
- package/dist/features/harness/drive-report.js +394 -26
- package/dist/features/harness/drive-runs.d.ts +120 -0
- package/dist/features/harness/drive-runs.js +289 -0
- package/dist/features/harness/drivers.d.ts +10 -14
- package/dist/features/harness/drivers.js +10 -14
- package/dist/features/harness/explore/console-pages.d.ts +15 -0
- package/dist/features/harness/explore/console-pages.js +146 -0
- package/dist/features/harness/explore/disparity.d.ts +19 -0
- package/dist/features/harness/explore/disparity.js +71 -0
- package/dist/features/harness/explore/fake-app.d.ts +16 -0
- package/dist/features/harness/explore/fake-app.js +49 -0
- package/dist/features/harness/explore/goal-search.d.ts +26 -0
- package/dist/features/harness/explore/goal-search.js +144 -0
- package/dist/features/harness/explore/page-tree.d.ts +49 -0
- package/dist/features/harness/explore/page-tree.js +148 -0
- package/dist/features/harness/explore/site-map.d.ts +34 -0
- package/dist/features/harness/explore/site-map.js +150 -0
- package/dist/features/harness/fill-values.d.ts +3 -73
- package/dist/features/harness/fill-values.js +3 -169
- package/dist/features/harness/goals.d.ts +82 -0
- package/dist/features/harness/goals.js +330 -0
- package/dist/features/harness/harness.d.ts +51 -1
- package/dist/features/harness/harness.js +207 -6
- package/dist/features/harness/platform/drive-target.d.ts +30 -0
- package/dist/features/harness/platform/drive-target.js +81 -0
- package/dist/features/harness/platform/local-apps.d.ts +127 -0
- package/dist/features/harness/platform/local-apps.js +280 -0
- package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
- package/dist/features/harness/platform/persona-credentials.js +69 -0
- package/dist/features/harness/platform/platform-drives.d.ts +61 -0
- package/dist/features/harness/platform/platform-drives.js +114 -0
- package/dist/features/harness/platform/refusal.d.ts +52 -0
- package/dist/features/harness/platform/refusal.js +71 -0
- package/dist/features/harness/platform/remote-drive.d.ts +186 -0
- package/dist/features/harness/platform/remote-drive.js +378 -0
- package/dist/features/harness/platform/script.d.ts +94 -0
- package/dist/features/harness/platform/script.js +260 -0
- package/dist/features/harness/platform/server-driver.d.ts +54 -0
- package/dist/features/harness/platform/server-driver.js +182 -0
- package/dist/features/harness/platform-config.d.ts +41 -1
- package/dist/features/harness/platform-config.js +106 -9
- package/dist/features/harness/route-guess.d.ts +13 -0
- package/dist/features/harness/route-guess.js +49 -0
- package/dist/features/harness/script/app-controls.d.ts +5 -0
- package/dist/features/harness/script/app-controls.js +40 -0
- package/dist/features/harness/script/lane-ids.d.ts +14 -0
- package/dist/features/harness/script/lane-ids.js +16 -0
- package/dist/features/harness/script/script-run.d.ts +70 -0
- package/dist/features/harness/script/script-run.js +606 -0
- package/dist/features/license/license.d.ts +2 -2
- package/dist/features/visual/step-shots.d.ts +31 -0
- package/dist/features/visual/step-shots.js +231 -0
- package/dist/features/visual/visual-tools.d.ts +10 -1
- package/dist/features/visual/visual-tools.js +62 -17
- package/dist/hooks/client-directory.d.ts +18 -0
- package/dist/hooks/client-directory.js +57 -0
- package/dist/hooks/coding-agents.d.ts +34 -0
- package/dist/hooks/coding-agents.js +117 -0
- package/dist/hooks/driven-by.d.ts +23 -0
- package/dist/hooks/driven-by.js +56 -0
- package/dist/hooks/hook-bus.d.ts +4 -0
- package/dist/hooks/hook-bus.js +18 -0
- package/dist/hooks/hook-commands.js +15 -4
- package/dist/hooks/tool-log.d.ts +9 -0
- package/dist/hooks/tool-log.js +29 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +80 -243
- package/dist/judgement/capsule/capsule-store.d.ts +2 -2
- package/dist/judgement/capsule/causal-summary.d.ts +15 -1
- package/dist/judgement/capsule/causal-summary.js +33 -0
- package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
- package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
- package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
- package/dist/judgement/runs/artifact/gap-summary.js +12 -3
- package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
- package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
- package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
- package/dist/judgement/runs/artifact/run-store.js +195 -3
- package/dist/judgement/runs/context-tools.js +59 -1
- package/dist/judgement/runs/default-run-id.d.ts +3 -0
- package/dist/judgement/runs/default-run-id.js +16 -0
- package/dist/judgement/runs/drive-run.d.ts +71 -1
- package/dist/judgement/runs/drive-run.js +317 -5
- package/dist/judgement/runs/repair-prompt.js +1 -1
- package/dist/judgement/runs/resume.d.ts +44 -0
- package/dist/judgement/runs/resume.js +137 -0
- package/dist/judgement/runs/reticle-runner.js +13 -3
- package/dist/judgement/runs/runner-port.d.ts +5 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +5 -2
- package/dist/judgement/runs/verification-sync.js +40 -18
- package/dist/language/flows/change/gate.d.ts +10 -0
- package/dist/language/flows/change/gate.js +22 -0
- package/dist/language/flows/decision.js +36 -1
- package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
- package/dist/language/flows/fields/flow-secret-field.js +25 -2
- package/dist/language/flows/flow-anchor.d.ts +61 -10
- package/dist/language/flows/flow-anchor.js +98 -6
- package/dist/language/flows/flow-cross-step.d.ts +15 -0
- package/dist/language/flows/flow-cross-step.js +21 -0
- package/dist/language/flows/flow-intent.d.ts +1 -0
- package/dist/language/flows/flow-journey.d.ts +6 -0
- package/dist/language/flows/flow-journey.js +20 -0
- package/dist/language/flows/flow-learning.d.ts +4 -0
- package/dist/language/flows/flow-learning.js +45 -14
- package/dist/language/flows/flow-mutate-tools.js +5 -3
- package/dist/language/flows/flow-replay-run.d.ts +23 -9
- package/dist/language/flows/flow-replay-run.js +115 -110
- package/dist/language/flows/flow-replay-types.d.ts +1 -1
- package/dist/language/flows/flow-replay.d.ts +40 -1
- package/dist/language/flows/flow-replay.js +110 -22
- package/dist/language/flows/flow-result.d.ts +22 -1
- package/dist/language/flows/flow-result.js +47 -2
- package/dist/language/flows/flow-scope.js +5 -1
- package/dist/language/flows/flow-step-runners.d.ts +22 -2
- package/dist/language/flows/flow-step-runners.js +247 -47
- package/dist/language/flows/flow-store-for-session.d.ts +2 -2
- package/dist/language/flows/flow-store-for-session.js +7 -3
- package/dist/language/flows/flow-tools.d.ts +10 -0
- package/dist/language/flows/flow-tools.js +112 -89
- package/dist/language/flows/flows.d.ts +16 -1
- package/dist/language/flows/flows.js +74 -12
- package/dist/language/flows/heal-run.js +6 -4
- package/dist/language/flows/narrow-write.d.ts +7 -0
- package/dist/language/flows/narrow-write.js +36 -1
- package/dist/language/flows/recording/flake.d.ts +2 -2
- package/dist/language/flows/recording/recording-backtrack.js +14 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
- package/dist/language/flows/recording/tape/recordings.js +95 -13
- package/dist/language/flows/replay-from-hud.d.ts +20 -0
- package/dist/language/flows/replay-from-hud.js +51 -0
- package/dist/language/flows/replay.d.ts +9 -5
- package/dist/language/flows/replay.js +56 -15
- package/dist/language/flows/single-replay.d.ts +7 -0
- package/dist/language/flows/single-replay.js +26 -0
- package/dist/language/flows/suite/suite-flakes.js +2 -0
- package/dist/language/flows/suite-selection.d.ts +2 -15
- package/dist/language/flows/suite-selection.js +4 -3
- package/dist/language/flows/verify-change-tools.d.ts +1 -0
- package/dist/language/flows/verify-change-tools.js +202 -191
- package/dist/launch-chromium.d.ts +27 -5
- package/dist/launch-chromium.js +38 -8
- package/dist/memory/cloud/cloud-config.d.ts +22 -1
- package/dist/memory/cloud/cloud-config.js +34 -5
- package/dist/memory/cloud/cloud-sync.d.ts +17 -14
- package/dist/memory/cloud/cloud-sync.js +15 -4
- package/dist/memory/cloud/harness-config.d.ts +75 -1
- package/dist/memory/cloud/harness-config.js +115 -24
- package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
- package/dist/memory/cloud/hud-notices-source.js +128 -0
- package/dist/memory/cloud/memory-scope.d.ts +161 -0
- package/dist/memory/cloud/memory-scope.js +227 -0
- package/dist/memory/cloud/sync-cycle.d.ts +44 -7
- package/dist/memory/cloud/sync-cycle.js +129 -15
- package/dist/memory/cloud/sync-daemon.d.ts +11 -0
- package/dist/memory/cloud/sync-daemon.js +121 -9
- package/dist/memory/cloud/sync-disk.d.ts +1 -1
- package/dist/memory/cloud/sync-disk.js +31 -10
- package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
- package/dist/memory/cloud/sync-screenshots.js +105 -0
- package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
- package/dist/memory/cloud/unsynced-roots.js +166 -0
- package/dist/memory/impact/account-watch.d.ts +34 -0
- package/dist/memory/impact/account-watch.js +59 -0
- package/dist/memory/impact/impact-recorder.d.ts +8 -0
- package/dist/memory/impact/impact-recorder.js +12 -2
- package/dist/memory/impact/impact-store.d.ts +17 -4
- package/dist/memory/impact/impact-store.js +169 -63
- package/dist/memory/intent/inline-intent.d.ts +1 -0
- package/dist/memory/intent/intent-shard-store.js +16 -4
- package/dist/memory/intent/intent-shard.d.ts +14 -2
- package/dist/memory/intent/intent-store.d.ts +1 -0
- package/dist/memory/intent/intent-tools.js +122 -4
- package/dist/memory/intent/open-intents.d.ts +6 -0
- package/dist/memory/intent/open-intents.js +10 -1
- package/dist/memory/intent/settled-words.d.ts +24 -0
- package/dist/memory/intent/settled-words.js +130 -0
- package/dist/memory/journal/drive-flow.d.ts +16 -0
- package/dist/memory/journal/drive-flow.js +34 -2
- package/dist/memory/journal/drive-run-flush.d.ts +2 -0
- package/dist/memory/journal/drive-run-flush.js +20 -5
- package/dist/memory/journal/envelope.d.ts +8 -8
- package/dist/memory/journal/journal-recorder.js +52 -3
- package/dist/memory/journal/on-disk/retention.d.ts +8 -0
- package/dist/memory/journal/on-disk/retention.js +32 -2
- package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
- package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
- package/dist/memory/journal/session-end.d.ts +15 -1
- package/dist/memory/journal/session-end.js +42 -9
- package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
- package/dist/memory/project/artifact-root-resolver.js +125 -16
- package/dist/memory/project/artifact-root.d.ts +46 -8
- package/dist/memory/project/artifact-root.js +89 -10
- package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
- package/dist/memory/project/dir/reticle-dir.js +26 -3
- package/dist/memory/project/link-directory.d.ts +15 -0
- package/dist/memory/project/link-directory.js +44 -0
- package/dist/memory/project/project-tools.js +22 -3
- package/dist/memory/project/root-claims.d.ts +6 -0
- package/dist/memory/project/root-claims.js +39 -0
- package/dist/memory/project/session-root.d.ts +26 -1
- package/dist/memory/project/session-root.js +49 -5
- package/dist/memory/project/sync-status.d.ts +85 -0
- package/dist/memory/project/sync-status.js +224 -0
- package/dist/memory/recall/memory-tools.js +47 -2
- package/dist/memory/recall/platform-memory.d.ts +34 -0
- package/dist/memory/recall/platform-memory.js +139 -0
- package/dist/memory/recall/project-memory.d.ts +19 -0
- package/dist/memory/recall/project-memory.js +80 -13
- package/dist/portal/bridge/bridge.d.ts +9 -3
- package/dist/portal/bridge/bridge.js +82 -22
- package/dist/portal/bridge/harness-request.d.ts +23 -0
- package/dist/portal/bridge/harness-request.js +27 -0
- package/dist/portal/bridge/pairing-token.d.ts +9 -0
- package/dist/portal/bridge/pairing-token.js +17 -0
- package/dist/portal/bridge/wrong-path.d.ts +17 -0
- package/dist/portal/bridge/wrong-path.js +35 -0
- package/dist/portal/input/network-mock-tools.js +11 -2
- package/dist/portal/input/real-input.d.ts +83 -10
- package/dist/portal/input/real-input.js +218 -30
- package/dist/portal/input/viewport-tools.js +3 -3
- package/dist/portal/pool/browser-pool.d.ts +70 -9
- package/dist/portal/pool/browser-pool.js +190 -37
- package/dist/portal/pool/context-permissions.d.ts +33 -0
- package/dist/portal/pool/context-permissions.js +33 -0
- package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
- package/dist/portal/pool/lease-marker-stamp.js +49 -0
- package/dist/portal/pool/playwright-launcher.d.ts +35 -0
- package/dist/portal/pool/playwright-launcher.js +64 -3
- package/dist/portal/pool/pool-contract.d.ts +28 -5
- package/dist/portal/session/agent-link.d.ts +8 -0
- package/dist/portal/session/agent-link.js +17 -0
- package/dist/portal/session/command-payload.d.ts +8 -0
- package/dist/portal/session/command-payload.js +24 -0
- package/dist/portal/session/daemon-answers.d.ts +3 -3
- package/dist/portal/session/daemon-answers.js +4 -2
- package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
- package/dist/portal/session/dev-server/dev-command.js +87 -12
- package/dist/portal/session/facts/departure-note.d.ts +22 -0
- package/dist/portal/session/facts/departure-note.js +47 -0
- package/dist/portal/session/facts/observed-state.d.ts +16 -18
- package/dist/portal/session/facts/observed-state.js +46 -3
- package/dist/portal/session/facts/session-replaced.d.ts +5 -0
- package/dist/portal/session/facts/session-replaced.js +5 -0
- package/dist/portal/session/first-run-wiring.d.ts +42 -0
- package/dist/portal/session/first-run-wiring.js +132 -0
- package/dist/portal/session/human/live-control.d.ts +9 -2
- package/dist/portal/session/human/live-control.js +12 -3
- package/dist/portal/session/human/notes-ledger.d.ts +20 -0
- package/dist/portal/session/human/notes-ledger.js +55 -0
- package/dist/portal/session/human/review-store.d.ts +12 -0
- package/dist/portal/session/human/review-store.js +18 -10
- package/dist/portal/session/live-control-tools.d.ts +0 -13
- package/dist/portal/session/live-control-tools.js +107 -13
- package/dist/portal/session/narration-args.d.ts +5 -0
- package/dist/portal/session/narration-args.js +17 -0
- package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
- package/dist/portal/session/no-session-diagnosis.js +46 -9
- package/dist/portal/session/no-session-next-action.d.ts +31 -0
- package/dist/portal/session/no-session-next-action.js +159 -60
- package/dist/portal/session/no-session-watch.d.ts +14 -1
- package/dist/portal/session/no-session-watch.js +227 -17
- package/dist/portal/session/presence/session-lease.js +1 -1
- package/dist/portal/session/presence/session-mirror.js +3 -0
- package/dist/portal/session/recorded-gaps.d.ts +97 -0
- package/dist/portal/session/recorded-gaps.js +251 -0
- package/dist/portal/session/serving-directory.d.ts +27 -0
- package/dist/portal/session/serving-directory.js +45 -0
- package/dist/portal/session/session-health.d.ts +18 -0
- package/dist/portal/session/session-health.js +9 -1
- package/dist/portal/session/session-info.d.ts +8 -1
- package/dist/portal/session/session-info.js +8 -1
- package/dist/portal/session/session-manager.d.ts +39 -0
- package/dist/portal/session/session-manager.js +98 -11
- package/dist/portal/session/session-reaper.js +4 -1
- package/dist/portal/session/session-successor.d.ts +13 -0
- package/dist/portal/session/session-successor.js +1 -1
- package/dist/portal/session/session-tools.js +26 -3
- package/dist/portal/session/session.d.ts +22 -30
- package/dist/portal/session/session.js +81 -79
- package/dist/portal/session/timing/command-timeout.js +25 -1
- package/dist/portal/session/timing/wall-clock.d.ts +1 -1
- package/dist/portal/session/timing/wall-clock.js +1 -1
- package/dist/portal/session/zero-install-first-call.d.ts +31 -0
- package/dist/portal/session/zero-install-first-call.js +88 -0
- package/dist/start-options.d.ts +12 -0
- package/dist/start-wiring.d.ts +63 -0
- package/dist/start-wiring.js +169 -0
- package/dist/status-payload.d.ts +23 -1
- package/dist/status-payload.js +36 -1
- package/dist/surface/http-server.js +18 -2
- package/dist/surface/mcp/attach-memory.d.ts +1 -0
- package/dist/surface/mcp/attach-memory.js +12 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
- package/dist/surface/mcp/mcp-proxy.js +65 -13
- package/dist/surface/mcp/mcp.d.ts +34 -6
- package/dist/surface/mcp/mcp.js +61 -17
- package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
- package/dist/surface/mcp/proxy/drive-calls.js +27 -0
- package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
- package/dist/surface/mcp/server-instructions.d.ts +4 -2
- package/dist/surface/mcp/server-instructions.js +32 -14
- package/dist/surface/mcp/shared-params.js +2 -2
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +1 -0
- package/dist/surface/tools/account-tool.d.ts +22 -0
- package/dist/surface/tools/account-tool.js +157 -0
- package/dist/surface/tools/act/act-danger.d.ts +11 -0
- package/dist/surface/tools/act/act-danger.js +38 -1
- package/dist/surface/tools/act/act-observation.d.ts +33 -0
- package/dist/surface/tools/act/act-observation.js +57 -0
- package/dist/surface/tools/act/act-preflight.js +25 -2
- package/dist/surface/tools/act/act-target.js +8 -3
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
- package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
- package/dist/surface/tools/act/resolve-target.d.ts +1 -1
- package/dist/surface/tools/act/resolve-target.js +18 -3
- package/dist/surface/tools/act/screen-request.d.ts +34 -0
- package/dist/surface/tools/act/screen-request.js +113 -0
- package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
- package/dist/surface/tools/act/sequence-grade.js +13 -2
- package/dist/surface/tools/act/settle-in-flight.js +25 -3
- package/dist/surface/tools/act-sequence-tool.js +138 -29
- package/dist/surface/tools/act-tools.d.ts +0 -9
- package/dist/surface/tools/act-tools.js +71 -41
- package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
- package/dist/surface/tools/agent/app-notes-learning.js +80 -0
- package/dist/surface/tools/agent/app-notes.d.ts +4 -0
- package/dist/surface/tools/agent/app-notes.js +48 -0
- package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
- package/dist/surface/tools/agent/build-staleness.js +62 -0
- package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
- package/dist/surface/tools/agent/compact-envelope.js +374 -0
- package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
- package/dist/surface/tools/agent/for-the-agent.js +44 -0
- package/dist/surface/tools/agent/notices.d.ts +50 -0
- package/dist/surface/tools/agent/notices.js +152 -0
- package/dist/surface/tools/agent/reteach.d.ts +11 -0
- package/dist/surface/tools/agent/reteach.js +50 -0
- package/dist/surface/tools/args/alias-args.d.ts +5 -0
- package/dist/surface/tools/args/alias-args.js +10 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
- package/dist/surface/tools/assert/assert-source.d.ts +15 -0
- package/dist/surface/tools/assert/assert-source.js +40 -0
- package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
- package/dist/surface/tools/assert/assert-verdict.js +42 -17
- package/dist/surface/tools/browser-tools.js +51 -2
- package/dist/surface/tools/chat-drives.d.ts +101 -0
- package/dist/surface/tools/chat-drives.js +409 -0
- package/dist/surface/tools/coverage-tools.d.ts +2 -10
- package/dist/surface/tools/coverage-tools.js +2 -53
- package/dist/surface/tools/dynamic-tools.js +29 -1
- package/dist/surface/tools/empty-session-list.d.ts +51 -0
- package/dist/surface/tools/empty-session-list.js +120 -0
- package/dist/surface/tools/error-recovery.d.ts +14 -0
- package/dist/surface/tools/error-recovery.js +105 -8
- package/dist/surface/tools/explore-tools.d.ts +31 -1
- package/dist/surface/tools/explore-tools.js +438 -66
- package/dist/surface/tools/feedback-tools.d.ts +2 -3
- package/dist/surface/tools/feedback-tools.js +18 -3
- package/dist/surface/tools/gap-novelty.d.ts +3 -1
- package/dist/surface/tools/gap-novelty.js +8 -1
- package/dist/surface/tools/harness-explore.d.ts +118 -57
- package/dist/surface/tools/harness-explore.js +344 -292
- package/dist/surface/tools/harness-gate.d.ts +88 -0
- package/dist/surface/tools/harness-gate.js +235 -0
- package/dist/surface/tools/harness-hunt.d.ts +43 -0
- package/dist/surface/tools/harness-hunt.js +215 -0
- package/dist/surface/tools/harness-plan.d.ts +17 -0
- package/dist/surface/tools/harness-plan.js +38 -0
- package/dist/surface/tools/harness-script.d.ts +30 -0
- package/dist/surface/tools/harness-script.js +560 -0
- package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
- package/dist/surface/tools/harness-tab-guard.js +27 -0
- package/dist/surface/tools/harness-toolset.d.ts +22 -1
- package/dist/surface/tools/harness-toolset.js +101 -7
- package/dist/surface/tools/human-notes.d.ts +16 -0
- package/dist/surface/tools/human-notes.js +27 -0
- package/dist/surface/tools/invoke-tool.d.ts +5 -2
- package/dist/surface/tools/invoke-tool.js +263 -85
- package/dist/surface/tools/lease-hint.js +26 -5
- package/dist/surface/tools/lease-permissions.d.ts +33 -0
- package/dist/surface/tools/lease-permissions.js +73 -0
- package/dist/surface/tools/lease-readiness.d.ts +38 -0
- package/dist/surface/tools/lease-readiness.js +57 -0
- package/dist/surface/tools/lease-seed.d.ts +49 -0
- package/dist/surface/tools/lease-seed.js +167 -0
- package/dist/surface/tools/lease-tools.d.ts +13 -24
- package/dist/surface/tools/lease-tools.js +146 -197
- package/dist/surface/tools/live-call-text.js +4 -4
- package/dist/surface/tools/merge-tools.js +42 -2
- package/dist/surface/tools/merged-name-redirect.js +4 -0
- package/dist/surface/tools/next-step.d.ts +29 -0
- package/dist/surface/tools/next-step.js +214 -0
- package/dist/surface/tools/observe-tools.js +45 -9
- package/dist/surface/tools/platform-moment.d.ts +72 -0
- package/dist/surface/tools/platform-moment.js +296 -0
- package/dist/surface/tools/query-hint-schema.d.ts +7 -0
- package/dist/surface/tools/query-hint-schema.js +10 -0
- package/dist/surface/tools/read-tools.js +71 -14
- package/dist/surface/tools/real-input-attempt.js +96 -13
- package/dist/surface/tools/reticle-result.d.ts +120 -0
- package/dist/surface/tools/reticle-result.js +364 -0
- package/dist/surface/tools/tool-kit.d.ts +83 -3
- package/dist/surface/tools/tool-kit.js +77 -7
- package/dist/surface/tools/tools.js +43 -59
- package/dist/telemetry/account-envelope.d.ts +7 -0
- package/dist/telemetry/account-envelope.js +61 -0
- package/dist/telemetry/agent-client.d.ts +15 -0
- package/dist/telemetry/agent-client.js +57 -0
- package/dist/telemetry/app-instrumented.js +9 -2
- package/dist/telemetry/argument-shape.d.ts +7 -0
- package/dist/telemetry/argument-shape.js +86 -1
- package/dist/telemetry/automation-hint.d.ts +2 -3
- package/dist/telemetry/automation-hint.js +33 -8
- package/dist/telemetry/cli-telemetry.js +7 -2
- package/dist/telemetry/daemon-telemetry.js +3 -0
- package/dist/telemetry/error-fingerprint.d.ts +10 -1
- package/dist/telemetry/error-fingerprint.js +61 -5
- package/dist/telemetry/feedback-cli.d.ts +0 -13
- package/dist/telemetry/feedback-cli.js +0 -77
- package/dist/telemetry/feedback.d.ts +13 -0
- package/dist/telemetry/feedback.js +183 -17
- package/dist/telemetry/harness-run.d.ts +18 -0
- package/dist/telemetry/harness-run.js +80 -0
- package/dist/telemetry/hud-events.d.ts +16 -0
- package/dist/telemetry/hud-events.js +27 -0
- package/dist/telemetry/hud-metrics.d.ts +29 -6
- package/dist/telemetry/hud-metrics.js +116 -25
- package/dist/telemetry/init-telemetry.js +2 -2
- package/dist/telemetry/install-source.d.ts +13 -25
- package/dist/telemetry/install-source.js +44 -3
- package/dist/telemetry/mcp-connection.d.ts +0 -14
- package/dist/telemetry/mcp-connection.js +5 -1
- package/dist/telemetry/onboarding-firsts.d.ts +32 -0
- package/dist/telemetry/onboarding-firsts.js +81 -6
- package/dist/telemetry/platform-linked.d.ts +5 -0
- package/dist/telemetry/platform-linked.js +32 -0
- package/dist/telemetry/project-profile.js +5 -3
- package/dist/telemetry/proxy-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.d.ts +15 -4
- package/dist/telemetry/session-metrics.js +88 -52
- package/dist/telemetry/telemetry.d.ts +38 -2
- package/dist/telemetry/telemetry.js +144 -34
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +13 -4
- package/dist/wire-journal.d.ts +2 -2
- package/dist/wire-journal.js +20 -6
- package/docs/README.md +3 -3
- package/docs/actions.mdx +6 -3
- package/docs/adapters.md +1 -1
- package/docs/agent-cheatsheet.md +25 -28
- package/docs/architecture.md +5 -5
- package/docs/autodrive.md +33 -28
- package/docs/benchmarks.md +5 -5
- package/docs/best-practices.mdx +27 -9
- package/docs/capabilities.mdx +14 -16
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +54 -75
- package/docs/cli/doctor.mdx +14 -3
- package/docs/cli/drive.mdx +20 -14
- package/docs/cli/feedback.mdx +3 -3
- package/docs/cli/gate.mdx +7 -2
- package/docs/cli/help.mdx +50 -55
- package/docs/cli/init.mdx +43 -28
- package/docs/cli/license.mdx +12 -8
- package/docs/cli/mcp.mdx +4 -4
- package/docs/cli/open.mdx +3 -3
- package/docs/cli/report.mdx +4 -2
- package/docs/cli/restart.mdx +2 -2
- package/docs/cli/rollback.mdx +14 -8
- package/docs/cli/serve.mdx +4 -4
- package/docs/cli/setup.mdx +23 -0
- package/docs/cli/status.mdx +18 -5
- package/docs/cli/stop.mdx +67 -8
- package/docs/cli/try.mdx +62 -0
- package/docs/cli/update.mdx +4 -3
- package/docs/cli/verify.mdx +17 -6
- package/docs/cli/version.mdx +5 -4
- package/docs/cli.mdx +111 -42
- package/docs/debugging.md +3 -3
- package/docs/deploy-checks.md +1 -1
- package/docs/desktop.mdx +9 -3
- package/docs/enterprise.md +11 -10
- package/docs/environment.mdx +7 -8
- package/docs/faq.mdx +3 -3
- package/docs/first-drive.md +5 -4
- package/docs/flows.md +35 -27
- package/docs/for-agents.md +4 -5
- package/docs/frameworks.mdx +32 -21
- package/docs/getting-started.md +65 -61
- package/docs/human-control.md +16 -16
- package/docs/index.mdx +15 -42
- package/docs/install-agentic.mdx +22 -37
- package/docs/install-manual.mdx +23 -13
- package/docs/instrumentation.mdx +5 -3
- package/docs/integration-patterns.md +7 -7
- package/docs/license-activation.mdx +1 -1
- package/docs/multi-agent-testing.md +24 -6
- package/docs/packages/babel-plugin.mdx +4 -2
- package/docs/packages/browser.mdx +16 -10
- package/docs/packages/core.mdx +12 -5
- package/docs/packages/electron.mdx +3 -2
- package/docs/packages/engine.mdx +1 -1
- package/docs/packages/eslint-plugin.mdx +18 -12
- package/docs/packages/next.mdx +8 -7
- package/docs/packages/open-verification.mdx +1 -1
- package/docs/packages/server.mdx +5 -5
- package/docs/packages/tauri.mdx +9 -9
- package/docs/packages/test.mdx +4 -10
- package/docs/packages/vite-plugin.mdx +32 -4
- package/docs/packages.mdx +11 -15
- package/docs/platform-integration.md +6 -5
- package/docs/predicates.mdx +40 -24
- package/docs/quickstart.mdx +69 -30
- package/docs/required-checks.md +8 -7
- package/docs/reticle-manual.md +15 -5
- package/docs/skill-file.mdx +17 -79
- package/docs/skill-setup.md +9 -9
- package/docs/skill.md +200 -0
- package/docs/system-map.md +7 -7
- package/docs/telemetry.md +23 -25
- package/docs/testing.md +4 -4
- package/docs/token-efficiency.md +12 -12
- package/docs/tools/act-and-wait.mdx +9 -2
- package/docs/tools/act-sequence.mdx +6 -7
- package/docs/tools/act.mdx +2 -2
- package/docs/tools/assert.mdx +18 -17
- package/docs/tools/console.mdx +9 -9
- package/docs/tools/inspect.mdx +16 -7
- package/docs/tools/look.mdx +24 -0
- package/docs/tools/navigate.mdx +5 -3
- package/docs/tools/network.mdx +2 -2
- package/docs/tools/observe.mdx +6 -6
- package/docs/tools/overview.mdx +34 -33
- package/docs/tools/query.mdx +5 -5
- package/docs/tools/session-and-feedback.mdx +22 -13
- package/docs/tools/sessions.mdx +8 -8
- package/docs/tools/snapshot.mdx +6 -5
- package/docs/tools/state.mdx +9 -9
- package/docs/tools/tools-and-run.mdx +26 -24
- package/docs/tools/verify.mdx +28 -0
- package/docs/tools/wait-for.mdx +8 -4
- package/docs/troubleshooting.mdx +21 -6
- package/docs/usage.md +55 -46
- package/docs/use-cases.mdx +3 -3
- package/docs/vs-chrome-devtools-mcp.mdx +9 -6
- package/docs/vs-playwright-mcp.mdx +3 -1
- package/docs/what-is-recorded.md +17 -5
- package/docs/what-is-reticle.mdx +5 -3
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/cli/demo/demo-page.d.ts +0 -78
- package/dist/command/cli/demo/demo-page.js +0 -241
- package/dist/command/cli/demo/demo-run.d.ts +0 -38
- package/dist/command/cli/demo/demo-run.js +0 -138
- package/dist/features/harness/driver.d.ts +0 -50
- package/dist/features/harness/driver.js +0 -236
- package/dist/features/harness/jev-driver.d.ts +0 -188
- package/dist/features/harness/jev-driver.js +0 -678
- package/dist/features/harness/openai-driver.d.ts +0 -58
- package/dist/features/harness/openai-driver.js +0 -206
- package/dist/judgement/hunt/hunt-report.d.ts +0 -49
- package/dist/judgement/hunt/hunt-report.js +0 -84
- package/dist/language/flows/buddy-status.d.ts +0 -25
- package/dist/language/flows/buddy-status.js +0 -32
- package/dist/language/flows/change/watch-batcher.d.ts +0 -18
- package/dist/language/flows/change/watch-batcher.js +0 -19
- package/dist/memory/cloud/harness-offer.d.ts +0 -44
- package/dist/memory/cloud/harness-offer.js +0 -145
- package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
- package/dist/memory/project/dir/fill-value-store.js +0 -88
- package/dist/surface/tools/feature-capture.d.ts +0 -151
- package/dist/surface/tools/feature-capture.js +0 -235
- package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
- package/dist/surface/tools/tool-hit-rate.js +0 -90
- package/dist/telemetry/harness-drive.d.ts +0 -4
- package/dist/telemetry/harness-drive.js +0 -35
- package/dist/telemetry/identify.d.ts +0 -22
- package/dist/telemetry/identify.js +0 -73
- package/docs/cli/capsules.mdx +0 -70
- package/docs/cli/hunt.mdx +0 -73
- package/docs/cli/identify.mdx +0 -76
- package/docs/cli/kill.mdx +0 -91
- package/docs/cli/watch.mdx +0 -62
- package/docs/local-registry.md +0 -143
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The instrumentation gaps each session's verdicts actually recorded, kept for the surfaces that
|
|
3
|
+
* describe an app rather than one verdict: the platform's app report, the HUD's coverage line and
|
|
4
|
+
* `doctor`. Fed from the one function every verdict's gaps already pass through (`withGapNovelty`),
|
|
5
|
+
* so nothing here surveys a page: a gap is listed only because a verdict paid for it.
|
|
6
|
+
*
|
|
7
|
+
* Deduped by kind + missing, newest first, bounded per session.
|
|
8
|
+
*/
|
|
9
|
+
import { withRunningDrive } from '../../features/harness/drive-runs.js';
|
|
10
|
+
import { agentLinkOf } from './agent-link.js';
|
|
11
|
+
import { CoverageMarker, InstrumentationGapKind, LINK_APP_GAPS_MAX, ReticleCommand, agentPromptFor, coverageOf, harnessGateOf, harnessUnlockPrompt, CoverageCapability, } from '@reticlehq/core';
|
|
12
|
+
const bySession = new Map();
|
|
13
|
+
const text = (value) => 'string' === typeof value && 0 < value.length ? value : undefined;
|
|
14
|
+
/** Remember gaps a verdict on this session just reported. Malformed entries are skipped. */
|
|
15
|
+
export function recordGaps(sessionId, gaps, now) {
|
|
16
|
+
let list = bySession.get(sessionId) ?? [];
|
|
17
|
+
for (const raw of gaps) {
|
|
18
|
+
const gap = raw;
|
|
19
|
+
const kind = text(gap['kind']);
|
|
20
|
+
const missing = text(gap['missing']);
|
|
21
|
+
const fix = text(gap['fix']);
|
|
22
|
+
if (kind === undefined || missing === undefined || fix === undefined)
|
|
23
|
+
continue;
|
|
24
|
+
const cost = text(gap['cost']);
|
|
25
|
+
const ref = text(gap['ref']);
|
|
26
|
+
const source = text(gap['source']);
|
|
27
|
+
list = [
|
|
28
|
+
{
|
|
29
|
+
kind,
|
|
30
|
+
missing,
|
|
31
|
+
fix,
|
|
32
|
+
seenAt: now,
|
|
33
|
+
...(cost === undefined ? {} : { cost }),
|
|
34
|
+
...(ref === undefined ? {} : { ref }),
|
|
35
|
+
...(source === undefined ? {} : { source }),
|
|
36
|
+
},
|
|
37
|
+
...list.filter((g) => g.kind !== kind || g.missing !== missing),
|
|
38
|
+
].slice(0, LINK_APP_GAPS_MAX);
|
|
39
|
+
}
|
|
40
|
+
if (0 < list.length)
|
|
41
|
+
bySession.set(sessionId, list);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The app a tab shows, as a key: its project, else its origin. What one tab of an app has shown
|
|
45
|
+
* (a file:line, a test id) is a fact about the app, and a fresh tab of it has not acted yet: keyed
|
|
46
|
+
* by session alone, every new lease reported the app at 75% and the platform locked a Harness run
|
|
47
|
+
* mid-drive that it had let start at 87.5%.
|
|
48
|
+
*/
|
|
49
|
+
function appKeyOf(tab) {
|
|
50
|
+
if (tab.projectId !== undefined && 0 < tab.projectId.length)
|
|
51
|
+
return `project:${tab.projectId}`;
|
|
52
|
+
if (tab.url === undefined)
|
|
53
|
+
return undefined;
|
|
54
|
+
try {
|
|
55
|
+
return `origin:${new URL(tab.url).origin}`;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Sessions, and apps, where at least one verdict mapped a control to its file:line. */
|
|
62
|
+
const sourceSeen = new Set();
|
|
63
|
+
/** Mark a tab, and the app it shows, in a seen-set. */
|
|
64
|
+
function markSeen(seen, tab) {
|
|
65
|
+
seen.add(tab.id);
|
|
66
|
+
const app = appKeyOf(tab);
|
|
67
|
+
if (app !== undefined)
|
|
68
|
+
seen.add(app);
|
|
69
|
+
}
|
|
70
|
+
/** Whether this tab, or any tab of its app, was marked. */
|
|
71
|
+
function wasSeen(seen, tab) {
|
|
72
|
+
const app = appKeyOf(tab);
|
|
73
|
+
return seen.has(tab.id) || (app !== undefined && seen.has(app));
|
|
74
|
+
}
|
|
75
|
+
/** A verdict on this tab named a file:line: source mapping is seen, whatever else lacks one. */
|
|
76
|
+
export function noteSourceSeen(tab, source) {
|
|
77
|
+
if (source !== undefined)
|
|
78
|
+
markSeen(sourceSeen, tab);
|
|
79
|
+
}
|
|
80
|
+
/** Sessions, and apps, where an acted element carried a `data-testid`. */
|
|
81
|
+
const testidSeen = new Set();
|
|
82
|
+
/** An acted element carried a test id: the app uses them, whatever one control lacks. */
|
|
83
|
+
export function noteTestidSeen(tab, testid) {
|
|
84
|
+
if (testid !== undefined && 0 < testid.length)
|
|
85
|
+
markSeen(testidSeen, tab);
|
|
86
|
+
}
|
|
87
|
+
/** What an act result says about the element it reached: its test id and its source stamp. */
|
|
88
|
+
export function noteActedElement(tab, result) {
|
|
89
|
+
if ('object' !== typeof result || null === result)
|
|
90
|
+
return;
|
|
91
|
+
const acted = result;
|
|
92
|
+
noteTestidSeen(tab, text(acted['testid']));
|
|
93
|
+
const source = acted['source'];
|
|
94
|
+
if ('object' === typeof source && null !== source) {
|
|
95
|
+
const file = text(source['file']);
|
|
96
|
+
if (file !== undefined)
|
|
97
|
+
markSeen(sourceSeen, tab);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* An act's result, passed through after noting what it says about the element it reached. Every act
|
|
102
|
+
* dispatches through one function, so coverage sees test ids and source stamps from the first
|
|
103
|
+
* control acted on rather than only from a verdict.
|
|
104
|
+
*/
|
|
105
|
+
export function notedAct(tab, done) {
|
|
106
|
+
if (done.ok)
|
|
107
|
+
noteActedElement(tab, done.result);
|
|
108
|
+
return done;
|
|
109
|
+
}
|
|
110
|
+
/** The markers a page said it carries (`ReticleCommand.MARKERS`), marked for its tab and its app. */
|
|
111
|
+
function noteMarkers(tab, result) {
|
|
112
|
+
if ('object' !== typeof result || null === result)
|
|
113
|
+
return;
|
|
114
|
+
const markers = result['markers'];
|
|
115
|
+
if (!Array.isArray(markers))
|
|
116
|
+
return;
|
|
117
|
+
if (markers.includes(CoverageMarker.SOURCE))
|
|
118
|
+
markSeen(sourceSeen, tab);
|
|
119
|
+
if (markers.includes(CoverageMarker.TESTID))
|
|
120
|
+
markSeen(testidSeen, tab);
|
|
121
|
+
const notApplicable = result['notApplicable'];
|
|
122
|
+
if (Array.isArray(notApplicable) && notApplicable.includes(CoverageCapability.SOURCE_MAPPING))
|
|
123
|
+
markSeen(sourceNotApplicable, tab);
|
|
124
|
+
}
|
|
125
|
+
/** Apps whose page said file:line cannot apply (plain HTML: no plugin, no framework, no stamp). */
|
|
126
|
+
const sourceNotApplicable = new Set();
|
|
127
|
+
/** How long a page gets to say what it carries. Silent and cheap, so a page that cannot is skipped. */
|
|
128
|
+
const MARKERS_PROBE_MS = 2_000;
|
|
129
|
+
/**
|
|
130
|
+
* Ask each page whose app has not shown both markers yet what it carries. What an act happens to
|
|
131
|
+
* reach decides nothing then: an app with test ids is seen to have them before anything acted, and a
|
|
132
|
+
* hidden tab of it says the same. A page that cannot answer (an older SDK, a closed tab) is skipped.
|
|
133
|
+
* True when a page showed something not known before.
|
|
134
|
+
*/
|
|
135
|
+
export async function probeMarkers(tabs) {
|
|
136
|
+
const before = sourceSeen.size + testidSeen.size;
|
|
137
|
+
await Promise.all(tabs
|
|
138
|
+
.filter((tab) => !(wasSeen(sourceSeen, tab) || wasSeen(sourceNotApplicable, tab)) ||
|
|
139
|
+
!wasSeen(testidSeen, tab))
|
|
140
|
+
.map(async (tab) => {
|
|
141
|
+
const done = await tab
|
|
142
|
+
.command?.(ReticleCommand.MARKERS, {}, MARKERS_PROBE_MS)
|
|
143
|
+
.catch(() => undefined);
|
|
144
|
+
if (true === done?.ok)
|
|
145
|
+
noteMarkers(tab, done.result);
|
|
146
|
+
}));
|
|
147
|
+
return before < sourceSeen.size + testidSeen.size;
|
|
148
|
+
}
|
|
149
|
+
/** What this session's verdicts recorded, newest first. */
|
|
150
|
+
export function recordedGaps(sessionId) {
|
|
151
|
+
return bySession.get(sessionId) ?? [];
|
|
152
|
+
}
|
|
153
|
+
/** Forget a session that ended. What its app has shown is kept: it is still that app's. */
|
|
154
|
+
export function forgetRecordedGaps(sessionId) {
|
|
155
|
+
bySession.delete(sessionId);
|
|
156
|
+
sourceSeen.delete(sessionId);
|
|
157
|
+
testidSeen.delete(sessionId);
|
|
158
|
+
}
|
|
159
|
+
/** Forget everything, apps included. For tests. */
|
|
160
|
+
export function forgetAllRecordedGaps() {
|
|
161
|
+
bySession.clear();
|
|
162
|
+
sourceSeen.clear();
|
|
163
|
+
testidSeen.clear();
|
|
164
|
+
sourceNotApplicable.clear();
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* The tab's HELLO channels, plus the `source` marker when an act or verdict mapped a control to
|
|
168
|
+
* its file:line (seen anywhere is seen) or its page said it carries source mapping, and the
|
|
169
|
+
* `testid` marker once an acted element carried one — the list the platform report sends and
|
|
170
|
+
* coverage reads. A build that turned the stamp off has no source marker, whatever was seen.
|
|
171
|
+
*/
|
|
172
|
+
export function announcedChannels(tab) {
|
|
173
|
+
const channels = [...(tab.channels ?? [])];
|
|
174
|
+
const gaps = recordedGaps(tab.id);
|
|
175
|
+
// Only the build turning the stamp off overrules the page: one unmapped control does not mean
|
|
176
|
+
// the app has no source mapping (core's per-control rule).
|
|
177
|
+
const off = gaps.some((gap) => InstrumentationGapKind.SOURCE_MAPPING_OFF === gap.kind);
|
|
178
|
+
if (!off && (wasSeen(sourceSeen, tab) || true === tab.sourceMapping))
|
|
179
|
+
channels.push(CoverageMarker.SOURCE);
|
|
180
|
+
// Nothing announces test ids, so they are seen on an acted element — and a control the agent
|
|
181
|
+
// could only reach without one keeps the capability missing.
|
|
182
|
+
const noTestid = gaps.some((gap) => InstrumentationGapKind.MISSING_TESTID === gap.kind);
|
|
183
|
+
if (!noTestid && wasSeen(testidSeen, tab))
|
|
184
|
+
channels.push(CoverageMarker.TESTID);
|
|
185
|
+
return channels;
|
|
186
|
+
}
|
|
187
|
+
/** The app a tab shows, named for a prompt: its host, else its url. */
|
|
188
|
+
const appNameOf = (url) => {
|
|
189
|
+
try {
|
|
190
|
+
return new URL(url).host;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return url;
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* The coverage capabilities that do not apply to this tab's app, excluded from both sides of the
|
|
198
|
+
* score: file:line on a page that said it cannot apply there (plain HTML), until a stamp shows up.
|
|
199
|
+
* The platform reads the same list from the local-apps report, so both sides move together.
|
|
200
|
+
*/
|
|
201
|
+
export function notApplicableOf(tab) {
|
|
202
|
+
return wasSeen(sourceNotApplicable, tab) && !wasSeen(sourceSeen, tab)
|
|
203
|
+
? [CoverageCapability.SOURCE_MAPPING]
|
|
204
|
+
: [];
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* This tab's coverage and its Harness gate, with the coding-agent prompt when its verdicts recorded
|
|
208
|
+
* any gap or the gate is shut: below the gate the prompt names every unseen capability, so there is
|
|
209
|
+
* always something to hand the agent.
|
|
210
|
+
*/
|
|
211
|
+
export function instrumentationOf(tab,
|
|
212
|
+
/** The app's other tabs: what any of them has seen or recorded counts, as on the platform. */
|
|
213
|
+
siblings = []) {
|
|
214
|
+
const tabs = [tab, ...siblings];
|
|
215
|
+
const gaps = [
|
|
216
|
+
...new Map(tabs.flatMap((each) => recordedGaps(each.id)).map((g) => [`${g.kind}\u0000${g.missing}`, g])).values(),
|
|
217
|
+
];
|
|
218
|
+
const channels = [...new Set(tabs.flatMap((each) => announcedChannels(each)))];
|
|
219
|
+
const coverage = coverageOf({ channels, gaps });
|
|
220
|
+
const url = tab.url ?? '';
|
|
221
|
+
const appName = appNameOf(url);
|
|
222
|
+
const notApplicable = notApplicableOf(tab);
|
|
223
|
+
const gate = harnessGateOf(coverage, notApplicable);
|
|
224
|
+
const harnessGate = {
|
|
225
|
+
percent: gate.percent,
|
|
226
|
+
unlocked: gate.unlocked,
|
|
227
|
+
...(gate.reason === undefined ? {} : { reason: gate.reason }),
|
|
228
|
+
};
|
|
229
|
+
if (!gate.unlocked)
|
|
230
|
+
return {
|
|
231
|
+
...coverage,
|
|
232
|
+
harnessGate,
|
|
233
|
+
prompt: harnessUnlockPrompt({ coverage, gaps, appName, url, notApplicable }),
|
|
234
|
+
};
|
|
235
|
+
return 0 === gaps.length
|
|
236
|
+
? { ...coverage, harnessGate }
|
|
237
|
+
: { ...coverage, harnessGate, prompt: agentPromptFor({ gaps, appName, url }) };
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* The impact snapshot a tab is pushed, carrying that tab's own coverage, running drive and agent
|
|
241
|
+
* link (who is attached, and this tab's notes to them). Every
|
|
242
|
+
* push needs the drive: one without it reads as "no drive", and the drive's own tool calls push.
|
|
243
|
+
*/
|
|
244
|
+
export function withInstrumentation(tab, snapshot) {
|
|
245
|
+
const pushed = {
|
|
246
|
+
...snapshot,
|
|
247
|
+
instrumentation: { ...instrumentationOf(tab) },
|
|
248
|
+
agent: agentLinkOf(tab.inboxHistory?.() ?? []),
|
|
249
|
+
};
|
|
250
|
+
return withRunningDrive(pushed, tab.id) ?? pushed;
|
|
251
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which directory the dev server that served a page runs in.
|
|
3
|
+
*
|
|
4
|
+
* The tie-breaker for a project several checkouts declare: every git worktree carries the same
|
|
5
|
+
* committed `.reticle.json`, so the projectId cannot tell them apart, but the process serving the
|
|
6
|
+
* page runs inside exactly one of them. Lives with the session rather than the artifact resolver
|
|
7
|
+
* because both observations are about this machine's processes -- daemon state files and `lsof` --
|
|
8
|
+
* which `memory/project` has no business knowing. The resolver takes the answer as an injected
|
|
9
|
+
* function; the composition roots pass this one.
|
|
10
|
+
*/
|
|
11
|
+
import { type DevServerEntry } from '@reticlehq/core';
|
|
12
|
+
/** Where `servingDirectoryOf` gets its two observations. Injected so a test needs no processes. */
|
|
13
|
+
export interface ServingDirectoryIo {
|
|
14
|
+
/** Live dev servers that announced themselves (the Vite plugin writes `devserver-<port>.json`). */
|
|
15
|
+
devServers: () => readonly DevServerEntry[];
|
|
16
|
+
/** The working directory of whatever listens on `port`, or null when it cannot be read. */
|
|
17
|
+
listenerCwd: (port: number) => string | null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The directory of the dev server that served `origin`, or undefined when it cannot be observed.
|
|
21
|
+
*
|
|
22
|
+
* Two observations, exact one first. A dev server whose plugin announced this port names its own
|
|
23
|
+
* root and works on every platform. Otherwise the process listening on the port is asked for its
|
|
24
|
+
* working directory, which covers frameworks with no announcing plugin (Next.js) wherever `lsof`
|
|
25
|
+
* runs. Loopback only: a remote page's port says nothing about any process on this machine.
|
|
26
|
+
*/
|
|
27
|
+
export declare function servingDirectoryOf(origin: string, io?: ServingDirectoryIo): string | undefined;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which directory the dev server that served a page runs in.
|
|
3
|
+
*
|
|
4
|
+
* The tie-breaker for a project several checkouts declare: every git worktree carries the same
|
|
5
|
+
* committed `.reticle.json`, so the projectId cannot tell them apart, but the process serving the
|
|
6
|
+
* page runs inside exactly one of them. Lives with the session rather than the artifact resolver
|
|
7
|
+
* because both observations are about this machine's processes -- daemon state files and `lsof` --
|
|
8
|
+
* which `memory/project` has no business knowing. The resolver takes the answer as an injected
|
|
9
|
+
* function; the composition roots pass this one.
|
|
10
|
+
*/
|
|
11
|
+
import { isLoopbackHostname } from '@reticlehq/core';
|
|
12
|
+
import { captureLookup, findListenerCwd } from '../../command/cli/ports/port-holder.js';
|
|
13
|
+
import { reticleStateHome } from '../../command/daemon/daemon.js';
|
|
14
|
+
import { readDevServers } from '../../command/daemon/dev-servers.js';
|
|
15
|
+
const DEFAULT_PORT = { 'http:': 80, 'https:': 443 };
|
|
16
|
+
const liveIo = {
|
|
17
|
+
devServers: () => readDevServers(reticleStateHome()),
|
|
18
|
+
listenerCwd: (port) => findListenerCwd(port, captureLookup),
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* The directory of the dev server that served `origin`, or undefined when it cannot be observed.
|
|
22
|
+
*
|
|
23
|
+
* Two observations, exact one first. A dev server whose plugin announced this port names its own
|
|
24
|
+
* root and works on every platform. Otherwise the process listening on the port is asked for its
|
|
25
|
+
* working directory, which covers frameworks with no announcing plugin (Next.js) wherever `lsof`
|
|
26
|
+
* runs. Loopback only: a remote page's port says nothing about any process on this machine.
|
|
27
|
+
*/
|
|
28
|
+
export function servingDirectoryOf(origin, io = liveIo) {
|
|
29
|
+
let url;
|
|
30
|
+
try {
|
|
31
|
+
url = new URL(origin);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
if (!isLoopbackHostname(url.hostname))
|
|
37
|
+
return undefined;
|
|
38
|
+
const port = '' === url.port ? DEFAULT_PORT[url.protocol] : Number(url.port);
|
|
39
|
+
if (port === undefined)
|
|
40
|
+
return undefined;
|
|
41
|
+
const announced = io.devServers().find((entry) => entry.port === port);
|
|
42
|
+
if (announced !== undefined)
|
|
43
|
+
return announced.root;
|
|
44
|
+
return io.listenerCwd(port) ?? undefined;
|
|
45
|
+
}
|
|
@@ -75,6 +75,17 @@ export interface SessionHealth {
|
|
|
75
75
|
* That is the trade: an over-firing field gets ignored, and a field nobody reads catches nothing.
|
|
76
76
|
*/
|
|
77
77
|
export declare const PENDING_NAVIGATION_NOTICE_MS = 10000;
|
|
78
|
+
/**
|
|
79
|
+
* Said beside `dispatched` / `settled` on a skewed session, because those fields read as success.
|
|
80
|
+
*
|
|
81
|
+
* The reporter's own account of the cost: "the false-positive dispatch confirmation is what cost the
|
|
82
|
+
* most time — I trusted `dispatched: true, domMutatedWithin: Nms` as real signal for a long time
|
|
83
|
+
* before suspecting the skew banner." Stating the contradiction is the whole job here; the existing
|
|
84
|
+
* banner was accurate and simply never appeared where it was needed.
|
|
85
|
+
*/
|
|
86
|
+
/** The skew warning after an agent has read the paragraph once this session. */
|
|
87
|
+
export declare const SKEW_SHORT_WARNING = "version skew: `dispatched`/`settled` here do not prove the app acted \u2014 see session.versionSkew.";
|
|
88
|
+
export declare const SKEW_VERDICT_WARNING: string;
|
|
78
89
|
/**
|
|
79
90
|
* The age of the oldest request that STARTED and never completed, or undefined when there is none
|
|
80
91
|
* worth reporting.
|
|
@@ -163,6 +174,13 @@ interface HealthReport {
|
|
|
163
174
|
* closed list is that an unbounded string can never reach telemetry through it.
|
|
164
175
|
*/
|
|
165
176
|
brand: BrowserBrand | undefined;
|
|
177
|
+
/** Only the keys the page reported, so merging it never erases one an earlier report set. */
|
|
178
|
+
page: PageIdentity;
|
|
179
|
+
}
|
|
180
|
+
/** Which desktop window a session is, and what its document was served with. */
|
|
181
|
+
export interface PageIdentity {
|
|
182
|
+
windowLabel?: string;
|
|
183
|
+
documentStatus?: number;
|
|
166
184
|
}
|
|
167
185
|
/**
|
|
168
186
|
* Narrow a PAGE_HEALTH payload. Every field is optional on the wire — an older SDK does not report
|
|
@@ -27,7 +27,9 @@ export const PENDING_NAVIGATION_NOTICE_MS = 10_000;
|
|
|
27
27
|
* before suspecting the skew banner." Stating the contradiction is the whole job here; the existing
|
|
28
28
|
* banner was accurate and simply never appeared where it was needed.
|
|
29
29
|
*/
|
|
30
|
-
|
|
30
|
+
/** The skew warning after an agent has read the paragraph once this session. */
|
|
31
|
+
export const SKEW_SHORT_WARNING = 'version skew: `dispatched`/`settled` here do not prove the app acted — see session.versionSkew.';
|
|
32
|
+
export const SKEW_VERDICT_WARNING = 'version skew: `dispatched` and `settled` on this session mean the event was sent, NOT that the ' +
|
|
31
33
|
'app acted on it — a skewed pair drops actions silently. Re-read the control (aria-checked, ' +
|
|
32
34
|
'data-state, its text) before trusting any verdict from this session, and converge the versions ' +
|
|
33
35
|
'(see session.versionSkew).';
|
|
@@ -161,6 +163,12 @@ export function readHealthEvent(data) {
|
|
|
161
163
|
runtime: 'string' === typeof data['runtime'] ? data['runtime'] : undefined,
|
|
162
164
|
engine: 'string' === typeof data['engine'] ? data['engine'] : undefined,
|
|
163
165
|
brand: Object.values(BrowserBrand).find((known) => known === data['brand']),
|
|
166
|
+
page: {
|
|
167
|
+
...('string' === typeof data['windowLabel'] ? { windowLabel: data['windowLabel'] } : {}),
|
|
168
|
+
...(Number.isInteger(data['documentStatus'])
|
|
169
|
+
? { documentStatus: data['documentStatus'] }
|
|
170
|
+
: {}),
|
|
171
|
+
},
|
|
164
172
|
};
|
|
165
173
|
}
|
|
166
174
|
/**
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type { SessionHealth } from './session-health.js';
|
|
1
|
+
import type { PageIdentity, SessionHealth } from './session-health.js';
|
|
2
|
+
/** A document served as 4xx/5xx — a dev server's 404 page that still mounted the SDK, say. */
|
|
3
|
+
export declare function isErrorDocument(page: PageIdentity | undefined): boolean;
|
|
2
4
|
export interface SessionInfo {
|
|
3
5
|
sessionId: string;
|
|
4
6
|
url: string;
|
|
@@ -17,6 +19,10 @@ export interface SessionInfo {
|
|
|
17
19
|
* not render like it.
|
|
18
20
|
*/
|
|
19
21
|
runtime?: string;
|
|
22
|
+
/** The desktop window's own name (Tauri's label: `main`, `setup`) — absent on a web page. */
|
|
23
|
+
window?: string;
|
|
24
|
+
/** Present only when the document was served as an error (4xx/5xx): a 404 page is not the app. */
|
|
25
|
+
documentStatus?: number;
|
|
20
26
|
/** Present only when the page's SDK version differs from the daemon's — see version-skew.ts. */
|
|
21
27
|
versionSkew?: string;
|
|
22
28
|
/** ms since the SDK last reported anything (silence ⇒ likely throttled). */
|
|
@@ -72,6 +78,7 @@ interface SessionView {
|
|
|
72
78
|
runtime: string | undefined;
|
|
73
79
|
versionSkew: string | undefined;
|
|
74
80
|
hidden: boolean;
|
|
81
|
+
page?: PageIdentity;
|
|
75
82
|
health: () => SessionHealth;
|
|
76
83
|
staleMs: () => number;
|
|
77
84
|
pendingMarkCount: () => number;
|
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
* it, and separating them keeps the wire-facing shape reviewable on its own.
|
|
7
7
|
*/
|
|
8
8
|
import { SESSION_LEASE } from '@reticlehq/core';
|
|
9
|
+
/** A document served as 4xx/5xx — a dev server's 404 page that still mounted the SDK, say. */
|
|
10
|
+
export function isErrorDocument(page) {
|
|
11
|
+
return (page?.documentStatus ?? 0) >= 400;
|
|
12
|
+
}
|
|
9
13
|
/**
|
|
10
14
|
* Project a live Session into the shape the tools return.
|
|
11
15
|
*
|
|
@@ -27,6 +31,8 @@ export function buildSessionInfo(session) {
|
|
|
27
31
|
hasCapabilities: session.hasCapabilities,
|
|
28
32
|
// Omitted when the page never said, so absence stays readable as "unknown" rather than "web".
|
|
29
33
|
...(session.runtime === undefined ? {} : { runtime: session.runtime }),
|
|
34
|
+
...(session.page?.windowLabel === undefined ? {} : { window: session.page.windowLabel }),
|
|
35
|
+
...(isErrorDocument(session.page) ? { documentStatus: session.page?.documentStatus ?? 0 } : {}),
|
|
30
36
|
// On every listing, not buried in a log — skew explains failures that read as app bugs.
|
|
31
37
|
...(session.versionSkew === undefined ? {} : { versionSkew: session.versionSkew }),
|
|
32
38
|
hidden: session.hidden,
|
|
@@ -43,7 +49,8 @@ export function buildSessionInfo(session) {
|
|
|
43
49
|
base.unresponsive = true;
|
|
44
50
|
base.unresponsive_suggestion =
|
|
45
51
|
'This tab is connected but has stopped answering commands, so every call against it will time ' +
|
|
46
|
-
'out. Ending the session does not revive the page. Reload the tab, or run
|
|
52
|
+
'out. Ending the session does not revive the page. Reload the tab, or run ' +
|
|
53
|
+
'`npx @reticlehq/server open <url>` ' +
|
|
47
54
|
'to get a fresh one — it will no longer hand this tab back.';
|
|
48
55
|
}
|
|
49
56
|
// Surface human bug reports in reticle_sessions (only when > 0, so a clean session adds nothing).
|
|
@@ -14,6 +14,17 @@ interface ResolveScope {
|
|
|
14
14
|
}
|
|
15
15
|
/** The scheme://host:port of a URL, or undefined if it can't be parsed. Used to compare origins. */
|
|
16
16
|
export declare function originOf(url: string | undefined): string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Honest, scoped error when sessions exist but none match the agent's project.
|
|
19
|
+
*
|
|
20
|
+
* The daemon takes its default scope from the `.reticle.json` of whichever directory started it, so
|
|
21
|
+
* attaching from a second project — or another worktree of the SAME project — makes every tool
|
|
22
|
+
* refuse while `reticle_sessions` shows the tab sitting right there. The old message asked "is that
|
|
23
|
+
* app running with @reticlehq/core enabled?", which is the one thing that is definitely true, so the
|
|
24
|
+
* reader goes looking at their app instead of at the scope. Name what IS connected and how to
|
|
25
|
+
* target it: both facts are already in hand here.
|
|
26
|
+
*/
|
|
27
|
+
export declare function scopeMissError(connected: Session[], scope?: ResolveScope): string;
|
|
17
28
|
/** What a refused hello said about itself: the page it was on and the project it claimed. */
|
|
18
29
|
export interface RefusedPage {
|
|
19
30
|
readonly url?: string;
|
|
@@ -31,6 +42,16 @@ export declare class SessionManager {
|
|
|
31
42
|
setDefaultScope(scope: ResolveScope | undefined): void;
|
|
32
43
|
setConnectionRecorder(record: ((projectId: string | undefined) => void) | undefined): void;
|
|
33
44
|
add(session: Session): Session | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Close a window's connection and refuse its id until the daemon restarts.
|
|
47
|
+
*
|
|
48
|
+
* Reported from a Tauri app whose hidden windows kept reconnecting: ending the session only ended
|
|
49
|
+
* the presenter, so the window came straight back. A reload keeps its id (sessionStorage), so the
|
|
50
|
+
* id is what stays parked; the 1008 close tells the SDK not to retry. Its tombstone goes too, so a
|
|
51
|
+
* call naming it is refused rather than handed a sibling window.
|
|
52
|
+
*/
|
|
53
|
+
park(session: Session): void;
|
|
54
|
+
isParked(sessionId: string): boolean;
|
|
34
55
|
remove(session: Session): boolean;
|
|
35
56
|
get(sessionId: string): Session | undefined;
|
|
36
57
|
/**
|
|
@@ -47,6 +68,13 @@ export declare class SessionManager {
|
|
|
47
68
|
attachmentOf(sessionId: string): ReturnType<AttachmentHistory['of']>;
|
|
48
69
|
/** Every connected session — used by the liveness reaper to sweep for idle/disconnected ones. */
|
|
49
70
|
all(): Session[];
|
|
71
|
+
/**
|
|
72
|
+
* The connected sessions an id-less call may consider: the active project's, when one is set.
|
|
73
|
+
*
|
|
74
|
+
* The same set `resolve()` chooses from, so a caller that falls back from a refused resolution
|
|
75
|
+
* (an id-less yield) never reaches a tab the project scope would never have handed it.
|
|
76
|
+
*/
|
|
77
|
+
inScope(): Session[];
|
|
50
78
|
count(): number;
|
|
51
79
|
/** Wire the diagnosis provider (daemon boot). Absent ⇒ the plain, static message. */
|
|
52
80
|
setNoSessionHint(hint: (() => string | undefined) | undefined): void;
|
|
@@ -68,6 +96,8 @@ export declare class SessionManager {
|
|
|
68
96
|
setNoSessionNextAction(next: (() => NoSessionNextAction | undefined) | undefined): void;
|
|
69
97
|
noSessionNextAction(): NoSessionNextAction | undefined;
|
|
70
98
|
everConnected(): boolean;
|
|
99
|
+
/** Whether a session for this project has registered since boot. An unknown id has not. */
|
|
100
|
+
everConnectedTo(projectId: string): boolean;
|
|
71
101
|
/**
|
|
72
102
|
* Record a bridge-initiated close so `resolve` can explain a session that vanished.
|
|
73
103
|
*
|
|
@@ -99,6 +129,15 @@ export declare class SessionManager {
|
|
|
99
129
|
* a connected tab is in `list()`, not here.
|
|
100
130
|
*/
|
|
101
131
|
lastKnown(): SessionIdentity | undefined;
|
|
132
|
+
/**
|
|
133
|
+
* The most recent departed session for one project.
|
|
134
|
+
*
|
|
135
|
+
* `lastKnown` is the newest tombstone of any project. A shared daemon that quoted it to every
|
|
136
|
+
* caller told the second project to reopen the first project's tab.
|
|
137
|
+
*/
|
|
138
|
+
lastKnownFor(projectId: string): SessionIdentity | undefined;
|
|
139
|
+
/** Every departed session's URL, oldest first. The port scan has to see all of them, not only the newest. */
|
|
140
|
+
tombstoneUrls(): readonly string[];
|
|
102
141
|
resolve(sessionId?: string, scope?: ResolveScope): Session;
|
|
103
142
|
}
|
|
104
143
|
export {};
|