@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
|
@@ -22,18 +22,77 @@
|
|
|
22
22
|
* disables it too, since it rides the same emitter.
|
|
23
23
|
*/
|
|
24
24
|
import { FeedbackSchema, FEEDBACK_TEXT_MAX, FEEDBACK_TRACE_MAX, FEEDBACK_FIELD_MAX, TelemetryEventKind, } from '@reticlehq/core/telemetry';
|
|
25
|
-
import { platform } from 'node:os';
|
|
25
|
+
import { homedir, platform } from 'node:os';
|
|
26
26
|
import { getTelemetry } from './telemetry.js';
|
|
27
27
|
import { noteFeedbackUndelivered } from './feedback-delivery.js';
|
|
28
28
|
import { isReticleSourceCheckout } from './dev-repo.js';
|
|
29
29
|
import { saveFeedbackLocally } from './feedback-local.js';
|
|
30
30
|
import { SERVER_VERSION } from '../command/version/identity/server-version.js';
|
|
31
31
|
import { feedbackContext } from './feedback-context.js';
|
|
32
|
-
import { markDelivered, outboxPath, queueFeedback } from './feedback-outbox.js';
|
|
32
|
+
import { markDelivered, outboxPath, queueFeedback, readOutbox } from './feedback-outbox.js';
|
|
33
33
|
/** Kills the feedback channel ONLY — adoption counters keep flowing. */
|
|
34
34
|
export const FEEDBACK_ENV = 'RETICLE_FEEDBACK';
|
|
35
35
|
/** What replaces a redacted match. Visible on purpose: a reader must see that something was removed. */
|
|
36
36
|
export const REDACTED = '[redacted]';
|
|
37
|
+
/** This machine, as a host: the app under test, never anybody's infrastructure. Port allowed. */
|
|
38
|
+
const LOCAL_HOST = /^(?:localhost|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|0\.0\.0\.0|\[::1\])(?::\d+)?$/i;
|
|
39
|
+
/** A dotted name ending in one of these is a source file, not a host. */
|
|
40
|
+
const FILE_EXTENSIONS = new Set([
|
|
41
|
+
'ts',
|
|
42
|
+
'tsx',
|
|
43
|
+
'mts',
|
|
44
|
+
'cts',
|
|
45
|
+
'js',
|
|
46
|
+
'jsx',
|
|
47
|
+
'mjs',
|
|
48
|
+
'cjs',
|
|
49
|
+
'json',
|
|
50
|
+
'md',
|
|
51
|
+
'mdx',
|
|
52
|
+
'css',
|
|
53
|
+
'scss',
|
|
54
|
+
'html',
|
|
55
|
+
'vue',
|
|
56
|
+
'svelte',
|
|
57
|
+
'astro',
|
|
58
|
+
'py',
|
|
59
|
+
'rs',
|
|
60
|
+
'go',
|
|
61
|
+
'yml',
|
|
62
|
+
'yaml',
|
|
63
|
+
'toml',
|
|
64
|
+
'lock',
|
|
65
|
+
'log',
|
|
66
|
+
'txt',
|
|
67
|
+
'map',
|
|
68
|
+
'sh',
|
|
69
|
+
'env',
|
|
70
|
+
'd',
|
|
71
|
+
]);
|
|
72
|
+
/** Top-level domains common enough that a one-dot name ending in one is a host. */
|
|
73
|
+
const COMMON_TLDS = new Set([
|
|
74
|
+
'com',
|
|
75
|
+
'net',
|
|
76
|
+
'org',
|
|
77
|
+
'io',
|
|
78
|
+
'dev',
|
|
79
|
+
'app',
|
|
80
|
+
'co',
|
|
81
|
+
'ai',
|
|
82
|
+
'cloud',
|
|
83
|
+
'internal',
|
|
84
|
+
'local',
|
|
85
|
+
'corp',
|
|
86
|
+
'lan',
|
|
87
|
+
'site',
|
|
88
|
+
'tech',
|
|
89
|
+
'xyz',
|
|
90
|
+
'us',
|
|
91
|
+
'uk',
|
|
92
|
+
'de',
|
|
93
|
+
'in',
|
|
94
|
+
'eu',
|
|
95
|
+
]);
|
|
37
96
|
/**
|
|
38
97
|
* The shapes that leak. Ordered most-specific first — a URL carrying inline credentials must be
|
|
39
98
|
* caught as a URL before the bare-token rule chews the middle out of it.
|
|
@@ -45,6 +104,15 @@ export const REDACTED = '[redacted]';
|
|
|
45
104
|
const REDACTIONS = [
|
|
46
105
|
// scheme://user:pass@host — the credential is in the authority section.
|
|
47
106
|
{ pattern: /\b([a-z][a-z0-9+.-]*:\/\/)[^\s/@]+:[^\s/@]+@/gi, label: 'url-credentials' },
|
|
107
|
+
// A URL keeps its scheme, and its host and path ONLY when the host is this machine (the app under
|
|
108
|
+
// test, which is what a report is about). Any other host is a staging site, a customer's domain
|
|
109
|
+
// or an internal service, so it goes with its path. The query and fragment always go: that is
|
|
110
|
+
// where ids, emails and tokens ride.
|
|
111
|
+
{
|
|
112
|
+
pattern: /\b([a-z][a-z0-9+.-]*:\/\/)([^\s/?#"'<>`]+)([^\s?#"'<>`]*)(?:[?#][^\s"'<>`]*)?/gi,
|
|
113
|
+
label: 'url',
|
|
114
|
+
replace: (_m, scheme = '', host = '', path = '') => LOCAL_HOST.test(host) ? `${scheme}${host}${path}` : `${scheme}${REDACTED}`,
|
|
115
|
+
},
|
|
48
116
|
{ pattern: /\b[\w.%+-]+@[\w.-]+\.[a-z]{2,}\b/gi, label: 'email' },
|
|
49
117
|
// Credential assignments: the KEY stays (it is the useful part), the VALUE goes. The auth SCHEME
|
|
50
118
|
// (`Bearer`, `Basic`, `Token`) is consumed as part of the value, not left as the value — matching
|
|
@@ -59,24 +127,72 @@ const REDACTIONS = [
|
|
|
59
127
|
{ pattern: /\bAKIA[0-9A-Z]{16}\b/g, label: 'aws-key' },
|
|
60
128
|
{ pattern: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g, label: 'slack-token' },
|
|
61
129
|
{ pattern: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g, label: 'jwt' },
|
|
62
|
-
// Home directories carry the account name, and a trace is full of them.
|
|
63
|
-
|
|
130
|
+
// Home directories carry the account name, and a trace is full of them. The name runs to the next
|
|
131
|
+
// separator, quote or line end, NOT the next space: `C:\Users\Jane Doe\…` stopped at the space and
|
|
132
|
+
// sent the surname. Then the rest of the path goes with it. Over-redacting a sentence that follows
|
|
133
|
+
// a bare home directory is the price, and it is the right way round.
|
|
134
|
+
{
|
|
135
|
+
pattern: /(?:\\\\\?\\)?(?:\/Users\/|\/home\/|[A-Za-z]:[\\/]Users[\\/])[^\\/\r\n"'`]+(?:[\\/][^\s\\/"'`]*)*/g,
|
|
136
|
+
label: 'home-path',
|
|
137
|
+
},
|
|
138
|
+
// Any other absolute path: a Windows one (segments may hold spaces when a separator follows)...
|
|
139
|
+
{
|
|
140
|
+
pattern: /(?:\\\\\?\\)?\b[A-Za-z]:[\\/](?:[^\\/\r\n"'`<>|*?]+[\\/])*[^\s\\/"'`<>|*?]*/g,
|
|
141
|
+
label: 'path',
|
|
142
|
+
},
|
|
143
|
+
// ...a home-relative one, and a POSIX one of two or more segments. A path is a directory layout,
|
|
144
|
+
// and a directory layout names clients, projects and people.
|
|
145
|
+
{ pattern: /~[\\/][^\s"'`]*/g, label: 'path' },
|
|
146
|
+
{ pattern: /(?<![\w.~])\/[\w.@+-]+(?:\/[\w.@+-]+)+\/?/g, label: 'path' },
|
|
147
|
+
{
|
|
148
|
+
pattern: /\b\d{1,3}(?:\.\d{1,3}){3}\b/g,
|
|
149
|
+
label: 'ip',
|
|
150
|
+
replace: (ip) => (LOCAL_HOST.test(ip) ? ip : REDACTED),
|
|
151
|
+
},
|
|
152
|
+
// Hostnames: a staging site, an internal service, a customer's domain. A dotted name is a host when
|
|
153
|
+
// it has two or more dots or ends in a common top-level domain, and never when it ends in a source
|
|
154
|
+
// file's extension — `vite.config.ts` is what a report is about, `db.internal.acme.com` is not.
|
|
155
|
+
{
|
|
156
|
+
pattern: /\b(?:[a-z0-9-]+\.)+[a-z][a-z0-9-]*\b/gi,
|
|
157
|
+
label: 'hostname',
|
|
158
|
+
replace: (name) => {
|
|
159
|
+
const labels = name.toLowerCase().split('.');
|
|
160
|
+
const last = labels[labels.length - 1] ?? '';
|
|
161
|
+
if (FILE_EXTENSIONS.has(last))
|
|
162
|
+
return name;
|
|
163
|
+
return labels.length > 2 || COMMON_TLDS.has(last) ? REDACTED : name;
|
|
164
|
+
},
|
|
165
|
+
},
|
|
64
166
|
];
|
|
65
167
|
/** Strip credential/PII shapes and cap the length. Pure — the tests read like a spec of what leaks. */
|
|
66
168
|
export function redactFeedbackText(input, max) {
|
|
67
169
|
const removed = new Set();
|
|
68
170
|
let text = input;
|
|
69
|
-
for (const { pattern, label } of REDACTIONS) {
|
|
70
|
-
text = text.replace(pattern, (
|
|
71
|
-
|
|
171
|
+
for (const { pattern, label, replace } of REDACTIONS) {
|
|
172
|
+
text = text.replace(pattern, (match, ...groups) => {
|
|
173
|
+
const captures = groups.map((g) => ('string' === typeof g ? g : ''));
|
|
72
174
|
// A rule with a leading capture keeps it (the scheme, the `api_key=` key) so the reader still
|
|
73
175
|
// sees WHAT was removed, not just that something was.
|
|
74
|
-
const
|
|
75
|
-
|
|
176
|
+
const out = replace === undefined ? `${captures[0] ?? ''}${REDACTED}` : replace(match, ...captures);
|
|
177
|
+
if (out !== match)
|
|
178
|
+
removed.add(label);
|
|
179
|
+
return out;
|
|
76
180
|
});
|
|
77
181
|
}
|
|
78
182
|
return { text: text.slice(0, max), removed: [...removed] };
|
|
79
183
|
}
|
|
184
|
+
/** Our words in a trace: tool names and the verdict vocabulary. Nothing else is kept. */
|
|
185
|
+
const TRACE_WORDS = /\breticle_[a-z_]+\b|\b(?:verified|yes|no|unknown|no-fault|ok|passed|failed|refused|error|timeout)\b/gi;
|
|
186
|
+
/**
|
|
187
|
+
* A trace reduced to Reticle's own words, in order: which tools were called and what verdict each
|
|
188
|
+
* gave. The raw trace is the call/response trail, and the responses carry the page's text and what
|
|
189
|
+
* was typed into it, which no redaction rule can tell from prose. So nothing else is kept.
|
|
190
|
+
*/
|
|
191
|
+
export function summarizeTrace(trace) {
|
|
192
|
+
return (trace.match(TRACE_WORDS) ?? []).join(' ').slice(0, FEEDBACK_TRACE_MAX);
|
|
193
|
+
}
|
|
194
|
+
/** The removal label when a trace lost anything to `summarizeTrace`. */
|
|
195
|
+
const TRACE_VALUES_LABEL = 'trace-values';
|
|
80
196
|
/** True when the feedback channel is switched off on its own (the emitter's switches apply as well). */
|
|
81
197
|
export function feedbackDisabled(env = process.env) {
|
|
82
198
|
const value = (env[FEEDBACK_ENV] ?? '').toLowerCase();
|
|
@@ -98,6 +214,7 @@ const AUTHOR_WRITTEN_FIELDS = new Set([
|
|
|
98
214
|
'currentApproach',
|
|
99
215
|
'model',
|
|
100
216
|
]);
|
|
217
|
+
const TRACE_FIELD = 'trace';
|
|
101
218
|
/** Per-field caps; anything unlisted uses the standard field cap. */
|
|
102
219
|
const FIELD_CAPS = {
|
|
103
220
|
text: FEEDBACK_TEXT_MAX,
|
|
@@ -120,14 +237,7 @@ export async function submitFeedback(input, opts = {}) {
|
|
|
120
237
|
// sk-…" would have shipped the token. Enumerating the fields to protect is the same class of
|
|
121
238
|
// mistake as hand-copying an enum: correct on the day it is written, quietly wrong at the next
|
|
122
239
|
// addition. Deriving the set means a sixth field is covered the moment it exists.
|
|
123
|
-
const redactions =
|
|
124
|
-
for (const [key, value] of Object.entries(input)) {
|
|
125
|
-
if (typeof value !== 'string' || '' === value)
|
|
126
|
-
continue;
|
|
127
|
-
if (!AUTHOR_WRITTEN_FIELDS.has(key))
|
|
128
|
-
continue;
|
|
129
|
-
redactions.set(key, redactFeedbackText(value, FIELD_CAPS[key] ?? FEEDBACK_FIELD_MAX));
|
|
130
|
-
}
|
|
240
|
+
const redactions = redactAuthorFields(input);
|
|
131
241
|
const body = redactions.get('text') ?? { text: '', removed: [] };
|
|
132
242
|
const redacted = [...new Set([...redactions.values()].flatMap((r) => r.removed))];
|
|
133
243
|
if (feedbackDisabled(env)) {
|
|
@@ -231,6 +341,62 @@ export async function submitFeedback(input, opts = {}) {
|
|
|
231
341
|
context,
|
|
232
342
|
};
|
|
233
343
|
}
|
|
344
|
+
/**
|
|
345
|
+
* Every author-written field of a report, redacted under the CURRENT rules. One function for the
|
|
346
|
+
* send and for the outbox drain, so a report queued under older, weaker rules is re-redacted before
|
|
347
|
+
* it finally goes.
|
|
348
|
+
*/
|
|
349
|
+
function redactAuthorFields(input) {
|
|
350
|
+
const redactions = new Map();
|
|
351
|
+
for (const [key, value] of Object.entries(input)) {
|
|
352
|
+
if (typeof value !== 'string' || '' === value)
|
|
353
|
+
continue;
|
|
354
|
+
if (!AUTHOR_WRITTEN_FIELDS.has(key))
|
|
355
|
+
continue;
|
|
356
|
+
if (TRACE_FIELD === key) {
|
|
357
|
+
const summary = summarizeTrace(value);
|
|
358
|
+
redactions.set(key, {
|
|
359
|
+
text: summary,
|
|
360
|
+
removed: summary === value ? [] : [TRACE_VALUES_LABEL],
|
|
361
|
+
});
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
redactions.set(key, redactFeedbackText(value, FIELD_CAPS[key] ?? FEEDBACK_FIELD_MAX));
|
|
365
|
+
}
|
|
366
|
+
return redactions;
|
|
367
|
+
}
|
|
368
|
+
/** Reports one daemon start retries. A backlog drains over several starts, never in one burst. */
|
|
369
|
+
const OUTBOX_DRAIN_MAX = 5;
|
|
370
|
+
/**
|
|
371
|
+
* Retry what the outbox holds: the receipt for an undelivered report promises "It will be retried",
|
|
372
|
+
* and until this ran on daemon start nothing ever read the outbox back. Bounded, sequential, and
|
|
373
|
+
* best-effort; a report the endpoint does not accept stays queued. Returns how many were delivered.
|
|
374
|
+
*/
|
|
375
|
+
export async function drainFeedbackOutbox(telemetry = getTelemetry(), home = homedir()) {
|
|
376
|
+
if (!telemetry.enabled || feedbackDisabled())
|
|
377
|
+
return 0;
|
|
378
|
+
let delivered = 0;
|
|
379
|
+
for (const entry of readOutbox(home).slice(0, OUTBOX_DRAIN_MAX)) {
|
|
380
|
+
const queued = FeedbackSchema.safeParse(entry.payload);
|
|
381
|
+
// A payload that cannot pass the schema can never be sent; it stays where a person can read it.
|
|
382
|
+
if (!queued.success)
|
|
383
|
+
continue;
|
|
384
|
+
const fields = Object.fromEntries([...redactAuthorFields(queued.data)].map(([key, r]) => [key, r.text]));
|
|
385
|
+
const parsed = FeedbackSchema.safeParse({ ...queued.data, ...fields });
|
|
386
|
+
if (!parsed.success)
|
|
387
|
+
continue;
|
|
388
|
+
try {
|
|
389
|
+
if (await telemetry.emit(TelemetryEventKind.FEEDBACK_SUBMITTED, { feedback: parsed.data })) {
|
|
390
|
+
markDelivered(entry.id, home);
|
|
391
|
+
delivered += 1;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
/* stays queued for the next start */
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return delivered;
|
|
399
|
+
}
|
|
234
400
|
/**
|
|
235
401
|
* The receipt's context PLUS the fields the emitter stamps on every event regardless of kind — the
|
|
236
402
|
* reticle version, the OS, and whether this is CI. They are the single most-asked question of any bug
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { HarnessRunSource, type HarnessRun } from '@reticlehq/core/telemetry';
|
|
2
|
+
import { DriveOrigin, DriveStatus } from '../features/harness/drive-runs.js';
|
|
3
|
+
import { type Telemetry } from './telemetry.js';
|
|
4
|
+
export interface HarnessRunStart {
|
|
5
|
+
source: HarnessRunSource;
|
|
6
|
+
hosted: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** Who started it. A saved plan is a plan whoever pressed Run. */
|
|
9
|
+
export declare function harnessRunSource(origin: DriveOrigin, planId: string | undefined): HarnessRunSource;
|
|
10
|
+
/** How a finished run ended, from what the registry recorded. */
|
|
11
|
+
export declare function harnessRunEnd(status: DriveStatus, result: Record<string, unknown> | undefined): Pick<HarnessRun, 'outcome' | 'journeys' | 'replayed'>;
|
|
12
|
+
/** Report the run's start, run it, report its end, and hand back exactly what it did. */
|
|
13
|
+
export declare function reportHarnessRun<T extends {
|
|
14
|
+
status: DriveStatus;
|
|
15
|
+
result: Record<string, unknown>;
|
|
16
|
+
}>(start: HarnessRunStart, run: () => Promise<T>, refused: (error: unknown) => boolean, telemetry?: Pick<Telemetry, 'emit'>): Promise<T>;
|
|
17
|
+
/** A run the gate refused before it could start: still somebody who asked for one. */
|
|
18
|
+
export declare function reportHarnessBlocked(start: HarnessRunStart, telemetry?: Pick<Telemetry, 'emit'>): void;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `harness_run`: the Harness funnel. One `started` and one `completed` per run, whoever started it.
|
|
3
|
+
*
|
|
4
|
+
* Emitted around the drive itself (`startDrive`'s run), not read off the tool answer: a drive started
|
|
5
|
+
* from the HUD is never polled by an agent, and a drive whose daemon is asked again later answers
|
|
6
|
+
* from disk, so only the run's own start and end see every run exactly once.
|
|
7
|
+
*
|
|
8
|
+
* A drive the gate refuses before it starts is still a run somebody asked for, and reports as a
|
|
9
|
+
* `started` + `completed: blocked` pair, so the funnel's denominator is everyone who pressed Run.
|
|
10
|
+
*/
|
|
11
|
+
import { asRecord } from '@reticlehq/core';
|
|
12
|
+
import { JourneyBy } from '@reticlehq/core/artifacts';
|
|
13
|
+
import { HarnessRunOutcome, HarnessRunPhase, HarnessRunSource, TelemetryEventKind, countBucket, } from '@reticlehq/core/telemetry';
|
|
14
|
+
import { DriveOrigin, DriveStatus } from '../features/harness/drive-runs.js';
|
|
15
|
+
import { getTelemetry } from './telemetry.js';
|
|
16
|
+
const SOURCE_OF = {
|
|
17
|
+
[DriveOrigin.AGENT]: HarnessRunSource.AGENT,
|
|
18
|
+
[DriveOrigin.HUD]: HarnessRunSource.HUD,
|
|
19
|
+
[DriveOrigin.CHAT]: HarnessRunSource.DASHBOARD,
|
|
20
|
+
[DriveOrigin.TRY]: HarnessRunSource.CLI_TRY,
|
|
21
|
+
};
|
|
22
|
+
/** Who started it. A saved plan is a plan whoever pressed Run. */
|
|
23
|
+
export function harnessRunSource(origin, planId) {
|
|
24
|
+
return planId === undefined ? SOURCE_OF[origin] : HarnessRunSource.PLAN;
|
|
25
|
+
}
|
|
26
|
+
/** How a finished run ended, from what the registry recorded. */
|
|
27
|
+
export function harnessRunEnd(status, result) {
|
|
28
|
+
const journeys = Array.isArray(result?.['journeys']) ? result['journeys'] : undefined;
|
|
29
|
+
const replayed = (journeys ?? []).filter((j) => JourneyBy.REPLAY === asRecord(j)['by']).length;
|
|
30
|
+
const outcome = DriveStatus.REFUSED === status
|
|
31
|
+
? HarnessRunOutcome.BLOCKED
|
|
32
|
+
: DriveStatus.BROKEN === status
|
|
33
|
+
? HarnessRunOutcome.FAILED
|
|
34
|
+
: DriveStatus.STOPPED === status
|
|
35
|
+
? HarnessRunOutcome.STOPPED
|
|
36
|
+
: true === result?.['proved']
|
|
37
|
+
? HarnessRunOutcome.PROVED
|
|
38
|
+
: HarnessRunOutcome.NOT_PROVED;
|
|
39
|
+
// An unplanned drive is one journey; a refused one drove none.
|
|
40
|
+
const count = journeys?.length ?? (HarnessRunOutcome.BLOCKED === outcome ? 0 : 1);
|
|
41
|
+
return { outcome, journeys: countBucket(count), replayed: countBucket(replayed) };
|
|
42
|
+
}
|
|
43
|
+
function emit(telemetry, harness) {
|
|
44
|
+
try {
|
|
45
|
+
void telemetry.emit(TelemetryEventKind.HARNESS_RUN, { harness });
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
/* a metric may never change a drive */
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Report the run's start, run it, report its end, and hand back exactly what it did. */
|
|
52
|
+
export async function reportHarnessRun(start, run, refused, telemetry = getTelemetry()) {
|
|
53
|
+
emit(telemetry, { phase: HarnessRunPhase.STARTED, ...start });
|
|
54
|
+
try {
|
|
55
|
+
const done = await run();
|
|
56
|
+
emit(telemetry, {
|
|
57
|
+
phase: HarnessRunPhase.COMPLETED,
|
|
58
|
+
...start,
|
|
59
|
+
...harnessRunEnd(done.status, done.result),
|
|
60
|
+
});
|
|
61
|
+
return done;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
emit(telemetry, {
|
|
65
|
+
phase: HarnessRunPhase.COMPLETED,
|
|
66
|
+
...start,
|
|
67
|
+
...harnessRunEnd(refused(error) ? DriveStatus.REFUSED : DriveStatus.BROKEN, undefined),
|
|
68
|
+
});
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** A run the gate refused before it could start: still somebody who asked for one. */
|
|
73
|
+
export function reportHarnessBlocked(start, telemetry = getTelemetry()) {
|
|
74
|
+
emit(telemetry, { phase: HarnessRunPhase.STARTED, ...start });
|
|
75
|
+
emit(telemetry, {
|
|
76
|
+
phase: HarnessRunPhase.COMPLETED,
|
|
77
|
+
...start,
|
|
78
|
+
...harnessRunEnd(DriveStatus.REFUSED, undefined),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The HUD's own events: `hud_viewed` when a page is opened, `hud_signin_prompted` when a sign-in or
|
|
3
|
+
* link ask is shown. The windowed summary (`hudPanelMs`, `hudJourney`) says how long and in what
|
|
4
|
+
* order; these say how often and by whom, which a window summed across a session cannot.
|
|
5
|
+
*
|
|
6
|
+
* Sent by the daemon, like every HUD measure, so every opt-out applies, and only from the names the
|
|
7
|
+
* wire schema already narrowed. The dedupe (per tab, per page or surface) lives in `HudMetrics`.
|
|
8
|
+
*/
|
|
9
|
+
import type { HudUseData } from '@reticlehq/core';
|
|
10
|
+
import { type Telemetry } from './telemetry.js';
|
|
11
|
+
/** Count one HUD use from one tab, and send the events it amounts to. */
|
|
12
|
+
export declare function reportHudUse(use: HudUseData, tab: string, telemetry?: Pick<Telemetry, 'emit'>): void;
|
|
13
|
+
/** The tab went into the background or came back: its HUD time pauses while it is hidden. */
|
|
14
|
+
export declare function noteHudTabHidden(tab: string, hidden: boolean): void;
|
|
15
|
+
/** The tab went away. */
|
|
16
|
+
export declare function noteHudTabClosed(tab: string): void;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { TelemetryEventKind, countBucket } from '@reticlehq/core/telemetry';
|
|
2
|
+
import { getSessionMetrics } from './session-metrics.js';
|
|
3
|
+
import { getTelemetry } from './telemetry.js';
|
|
4
|
+
/** Count one HUD use from one tab, and send the events it amounts to. */
|
|
5
|
+
export function reportHudUse(use, tab, telemetry = getTelemetry()) {
|
|
6
|
+
const signals = getSessionMetrics().recordHudUse(use, tab);
|
|
7
|
+
const tabs = countBucket(signals.tabs);
|
|
8
|
+
try {
|
|
9
|
+
if (signals.viewed !== undefined)
|
|
10
|
+
void telemetry.emit(TelemetryEventKind.HUD_VIEWED, { hud: { view: signals.viewed, tabs } });
|
|
11
|
+
if (signals.prompted !== undefined)
|
|
12
|
+
void telemetry.emit(TelemetryEventKind.HUD_SIGNIN_PROMPTED, {
|
|
13
|
+
hud: { surface: signals.prompted, tabs },
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
/* a metric may never change behaviour */
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** The tab went into the background or came back: its HUD time pauses while it is hidden. */
|
|
21
|
+
export function noteHudTabHidden(tab, hidden) {
|
|
22
|
+
getSessionMetrics().setHudTabHidden(tab, hidden);
|
|
23
|
+
}
|
|
24
|
+
/** The tab went away. */
|
|
25
|
+
export function noteHudTabClosed(tab) {
|
|
26
|
+
getSessionMetrics().closeHudTab(tab);
|
|
27
|
+
}
|
|
@@ -1,32 +1,55 @@
|
|
|
1
|
-
import { HudPanel, HudView, type HudUseData } from '@reticlehq/core';
|
|
1
|
+
import { HudPanel, HudView, type HudPromptSurface, type HudUseData } from '@reticlehq/core';
|
|
2
2
|
/**
|
|
3
3
|
* How people use the in-page HUD, rolled into the session summary.
|
|
4
4
|
*
|
|
5
5
|
* Windowed like the tool histograms beside it: a periodic flush reports what happened since the
|
|
6
6
|
* last one, so a dashboard sums across a session's events. Names only — every key is a control id
|
|
7
7
|
* the wire schema already checked against core's closed list.
|
|
8
|
+
*
|
|
9
|
+
* Time is kept PER TAB and only while the tab is visible. Two tabs used to share one open view, so
|
|
10
|
+
* one tab's change closed the other's clock, and a hidden or closed tab kept accruing for as long as
|
|
11
|
+
* the daemon lived.
|
|
8
12
|
*/
|
|
9
13
|
/** How many steps of the journey one window keeps. A journey longer than this is cut, and says so. */
|
|
10
14
|
export declare const HUD_JOURNEY_MAX = 60;
|
|
11
15
|
export interface HudSummary {
|
|
12
16
|
/** Presses per control; a toggle counts under `id:on` / `id:off` so a switch reads both ways. */
|
|
13
17
|
hudControls?: Record<string, number>;
|
|
14
|
-
/** Milliseconds the HUD spent in each view during the window. */
|
|
18
|
+
/** Milliseconds the HUD spent in each view during the window, summed over visible tabs. */
|
|
15
19
|
hudViewMs?: Partial<Record<HudView, number>>;
|
|
16
|
-
/** Milliseconds each panel was showing during the window. */
|
|
20
|
+
/** Milliseconds each panel was showing during the window, summed over visible tabs. */
|
|
17
21
|
hudPanelMs?: Partial<Record<HudPanel, number>>;
|
|
18
22
|
/** The window's presses and view changes, in order, cut at HUD_JOURNEY_MAX. */
|
|
19
23
|
hudJourney?: string[];
|
|
20
24
|
/** Present, and true, only when the journey was cut. */
|
|
21
25
|
hudJourneyCut?: true;
|
|
26
|
+
/** Times each rail slide became the visible one. Slide ids are Reticle's own, never page text. */
|
|
27
|
+
hudSlides?: Record<string, number>;
|
|
28
|
+
}
|
|
29
|
+
/** The same page opened again on the same tab within this long is one view, not two. */
|
|
30
|
+
export declare const HUD_VIEW_DEDUPE_MS = 30000;
|
|
31
|
+
/** What one HUD use means for the per-event signals, beside what it adds to the summary. */
|
|
32
|
+
export interface HudSignals {
|
|
33
|
+
/** A page this tab had not opened within the dedupe window. */
|
|
34
|
+
viewed?: HudPanel;
|
|
35
|
+
/** A sign-in prompt this tab had not shown before. */
|
|
36
|
+
prompted?: HudPromptSurface;
|
|
37
|
+
/** Tabs with a HUD right now. */
|
|
38
|
+
tabs: number;
|
|
22
39
|
}
|
|
23
40
|
export declare class HudMetrics {
|
|
24
41
|
#private;
|
|
25
42
|
constructor(now: () => number);
|
|
26
|
-
record(use: HudUseData):
|
|
43
|
+
record(use: HudUseData, tabId?: string): HudSignals;
|
|
44
|
+
/** The tab went into the background: its HUD stops accruing time until it is shown again. */
|
|
45
|
+
hide(tabId: string): void;
|
|
46
|
+
/** The tab is in front again: its HUD's view and panel accrue from now. */
|
|
47
|
+
show(tabId: string): void;
|
|
48
|
+
/** The tab went away: whatever it had open is counted up to now and stops. */
|
|
49
|
+
close(tabId: string): void;
|
|
27
50
|
get empty(): boolean;
|
|
28
|
-
/** The window so far. Open
|
|
51
|
+
/** The window so far. Open views and panels are counted up to now, and keep running after. */
|
|
29
52
|
summarize(): HudSummary;
|
|
30
|
-
/** Start the next window.
|
|
53
|
+
/** Start the next window. Each visible tab's view and panel carry over, timed from now. */
|
|
31
54
|
reset(): void;
|
|
32
55
|
}
|