@reticlehq/server 3.6.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/SKILL.md +122 -123
- 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 +18 -2
- package/dist/command/cli/adhoc-verdict.js +70 -6
- 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/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 +28 -105
- 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 +34 -4
- package/dist/command/cli/cli-verify.js +81 -12
- package/dist/command/cli/cloud-cli.d.ts +13 -0
- package/dist/command/cli/cloud-cli.js +145 -333
- 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 +15 -1
- package/dist/command/cli/cloud-login.js +67 -13
- 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/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/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 +11 -2
- 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.js +1 -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 +29 -8
- 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 -178
- 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 +14 -0
- package/dist/command/cli.js +103 -83
- package/dist/command/daemon/daemon-resilience.js +4 -4
- package/dist/command/daemon/daemon-resolve.d.ts +9 -1
- package/dist/command/daemon/daemon-resolve.js +49 -10
- 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/dev-server-log-cap.js +2 -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 +10 -1
- package/dist/command/setup/init/init-port.js +22 -2
- package/dist/command/setup/init/init-runtime.d.ts +12 -2
- package/dist/command/setup/init/init-runtime.js +96 -37
- package/dist/command/setup/node-effects.d.ts +2 -0
- package/dist/command/setup/node-effects.js +36 -8
- 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 +1 -1
- package/dist/command/setup/run-setup.d.ts +29 -9
- package/dist/command/setup/run-setup.js +34 -28
- package/dist/command/setup/setup-command.d.ts +23 -0
- package/dist/command/setup/setup-command.js +57 -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 +38 -2
- package/dist/features/crawl/crawl.js +14 -1
- package/dist/features/exhaust/ledger.d.ts +14 -14
- package/dist/features/harness/drive-report.d.ts +39 -5
- package/dist/features/harness/drive-report.js +271 -54
- 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 +1 -1
- package/dist/features/harness/drivers.js +1 -1
- 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/goals.d.ts +68 -7
- package/dist/features/harness/goals.js +289 -36
- package/dist/features/harness/harness.d.ts +30 -1
- package/dist/features/harness/harness.js +141 -7
- package/dist/features/harness/platform/local-apps.d.ts +36 -3
- package/dist/features/harness/platform/local-apps.js +81 -5
- 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 +8 -2
- package/dist/features/harness/platform/remote-drive.js +22 -9
- package/dist/features/harness/platform/script.d.ts +57 -11
- package/dist/features/harness/platform/script.js +144 -12
- package/dist/features/harness/platform/server-driver.d.ts +17 -4
- package/dist/features/harness/platform/server-driver.js +29 -26
- package/dist/features/harness/platform-config.d.ts +38 -5
- package/dist/features/harness/platform-config.js +93 -8
- package/dist/features/harness/route-guess.d.ts +13 -0
- package/dist/features/harness/route-guess.js +49 -0
- package/dist/features/harness/script/script-run.d.ts +30 -1
- package/dist/features/harness/script/script-run.js +355 -48
- 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.js +22 -14
- 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 +21 -2
- package/dist/hooks/driven-by.js +42 -2
- package/dist/hooks/hook-bus.d.ts +4 -0
- package/dist/hooks/hook-bus.js +18 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +26 -183
- 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 +20 -4
- 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.js +25 -9
- package/dist/judgement/runs/artifact/run-store.d.ts +13 -1
- package/dist/judgement/runs/artifact/run-store.js +175 -8
- 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 +53 -5
- package/dist/judgement/runs/drive-run.js +234 -20
- package/dist/judgement/runs/resume.d.ts +44 -0
- package/dist/judgement/runs/resume.js +137 -0
- package/dist/judgement/runs/reticle-runner.js +5 -2
- 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 +2 -0
- package/dist/judgement/runs/verification-sync.js +36 -15
- package/dist/language/flows/decision.js +2 -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 +7 -2
- package/dist/language/flows/flow-anchor.js +10 -3
- 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 +37 -3
- package/dist/language/flows/flow-replay-run.js +16 -18
- package/dist/language/flows/flow-replay-types.d.ts +1 -1
- package/dist/language/flows/flow-replay.d.ts +18 -1
- package/dist/language/flows/flow-replay.js +22 -7
- package/dist/language/flows/flow-result.d.ts +22 -1
- package/dist/language/flows/flow-result.js +47 -2
- package/dist/language/flows/flow-step-runners.d.ts +2 -0
- package/dist/language/flows/flow-step-runners.js +12 -6
- package/dist/language/flows/flow-store-for-session.js +5 -1
- package/dist/language/flows/flow-tools.d.ts +10 -0
- package/dist/language/flows/flow-tools.js +61 -62
- package/dist/language/flows/flows.d.ts +16 -1
- package/dist/language/flows/flows.js +69 -10
- package/dist/language/flows/narrow-write.d.ts +7 -0
- package/dist/language/flows/narrow-write.js +36 -1
- package/dist/language/flows/recording/recording-backtrack.js +14 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +29 -1
- package/dist/language/flows/recording/tape/recordings.js +60 -10
- package/dist/language/flows/replay.js +29 -6
- package/dist/language/flows/single-replay.d.ts +7 -0
- package/dist/language/flows/single-replay.js +26 -0
- package/dist/language/flows/verify-change-tools.d.ts +1 -0
- package/dist/language/flows/verify-change-tools.js +200 -193
- package/dist/memory/cloud/cloud-config.d.ts +10 -1
- package/dist/memory/cloud/cloud-config.js +19 -5
- package/dist/memory/cloud/cloud-sync.js +3 -3
- package/dist/memory/cloud/harness-config.d.ts +49 -0
- package/dist/memory/cloud/harness-config.js +16 -20
- package/dist/memory/cloud/memory-scope.d.ts +17 -0
- package/dist/memory/cloud/memory-scope.js +22 -0
- package/dist/memory/cloud/sync-cycle.d.ts +32 -4
- package/dist/memory/cloud/sync-cycle.js +113 -12
- package/dist/memory/cloud/sync-daemon.d.ts +11 -0
- package/dist/memory/cloud/sync-daemon.js +114 -4
- package/dist/memory/cloud/sync-disk.js +26 -2
- 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 +16 -1
- package/dist/memory/impact/account-watch.js +26 -1
- package/dist/memory/impact/impact-store.d.ts +1 -4
- package/dist/memory/impact/impact-store.js +32 -42
- 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 +12 -0
- package/dist/memory/intent/intent-store.d.ts +1 -0
- package/dist/memory/intent/intent-tools.js +42 -2
- 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/journal-recorder.js +46 -3
- package/dist/memory/journal/on-disk/retention.d.ts +5 -0
- package/dist/memory/journal/on-disk/retention.js +27 -2
- package/dist/memory/journal/on-disk/workspace-tiers.js +2 -0
- package/dist/memory/journal/session-end.d.ts +15 -1
- package/dist/memory/journal/session-end.js +38 -7
- package/dist/memory/project/artifact-root-resolver.js +33 -5
- package/dist/memory/project/artifact-root.d.ts +4 -3
- package/dist/memory/project/artifact-root.js +2 -2
- package/dist/memory/project/dir/reticle-dir.d.ts +14 -0
- package/dist/memory/project/dir/reticle-dir.js +23 -2
- package/dist/memory/project/link-directory.d.ts +15 -0
- package/dist/memory/project/link-directory.js +44 -0
- 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 +2 -0
- package/dist/memory/project/session-root.js +9 -1
- package/dist/memory/project/sync-status.d.ts +46 -0
- package/dist/memory/project/sync-status.js +135 -1
- package/dist/memory/recall/memory-tools.js +46 -3
- 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.js +36 -8
- package/dist/portal/bridge/bridge.d.ts +9 -5
- package/dist/portal/bridge/bridge.js +66 -23
- package/dist/portal/bridge/harness-request.d.ts +23 -0
- package/dist/portal/bridge/harness-request.js +27 -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 +2 -0
- package/dist/portal/input/real-input.js +13 -10
- package/dist/portal/pool/browser-pool.d.ts +48 -0
- package/dist/portal/pool/browser-pool.js +120 -2
- 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 +27 -5
- package/dist/portal/pool/playwright-launcher.js +59 -14
- package/dist/portal/pool/pool-contract.d.ts +21 -1
- 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.js +6 -1
- 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 +9 -0
- package/dist/portal/session/dev-server/dev-command.js +27 -1
- 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/human/live-control.d.ts +9 -2
- package/dist/portal/session/human/live-control.js +12 -3
- package/dist/portal/session/live-control-tools.js +82 -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 +1 -1
- package/dist/portal/session/no-session-diagnosis.js +31 -9
- package/dist/portal/session/no-session-next-action.d.ts +20 -0
- package/dist/portal/session/no-session-next-action.js +134 -61
- package/dist/portal/session/no-session-watch.js +179 -22
- package/dist/portal/session/presence/session-lease.js +1 -1
- package/dist/portal/session/recorded-gaps.d.ts +97 -0
- package/dist/portal/session/recorded-gaps.js +251 -0
- package/dist/portal/session/session-health.d.ts +11 -0
- package/dist/portal/session/session-health.js +3 -1
- package/dist/portal/session/session-info.js +2 -1
- package/dist/portal/session/session-manager.d.ts +18 -0
- package/dist/portal/session/session-manager.js +54 -3
- package/dist/portal/session/session-successor.d.ts +8 -0
- package/dist/portal/session/session-successor.js +1 -1
- package/dist/portal/session/session.d.ts +15 -28
- package/dist/portal/session/session.js +60 -61
- 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 +7 -1
- package/dist/start-wiring.d.ts +63 -0
- package/dist/start-wiring.js +169 -0
- package/dist/status-payload.d.ts +13 -1
- package/dist/status-payload.js +13 -1
- package/dist/surface/http-server.js +7 -1
- 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 +4 -0
- package/dist/surface/mcp/mcp-proxy.js +29 -8
- package/dist/surface/mcp/mcp.d.ts +23 -0
- package/dist/surface/mcp/mcp.js +34 -4
- 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.js +22 -14
- package/dist/surface/mcp/shared-params.js +1 -1
- 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/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-sequence-tool.js +136 -27
- package/dist/surface/tools/act-tools.d.ts +0 -9
- package/dist/surface/tools/act-tools.js +48 -34
- 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.js +25 -15
- package/dist/surface/tools/browser-tools.js +43 -1
- package/dist/surface/tools/chat-drives.d.ts +75 -0
- package/dist/surface/tools/chat-drives.js +265 -21
- 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 +10 -0
- package/dist/surface/tools/empty-session-list.js +45 -5
- package/dist/surface/tools/error-recovery.d.ts +8 -0
- package/dist/surface/tools/error-recovery.js +69 -5
- package/dist/surface/tools/explore-tools.d.ts +23 -2
- package/dist/surface/tools/explore-tools.js +377 -74
- package/dist/surface/tools/feedback-tools.d.ts +2 -3
- package/dist/surface/tools/feedback-tools.js +4 -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 +52 -73
- package/dist/surface/tools/harness-explore.js +177 -146
- 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 +5 -0
- package/dist/surface/tools/harness-plan.js +7 -0
- package/dist/surface/tools/harness-script.d.ts +22 -0
- package/dist/surface/tools/harness-script.js +256 -38
- 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 +8 -0
- package/dist/surface/tools/harness-toolset.js +27 -4
- 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 +220 -93
- 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 +20 -0
- package/dist/surface/tools/lease-seed.js +45 -1
- package/dist/surface/tools/lease-tools.d.ts +10 -1
- package/dist/surface/tools/lease-tools.js +119 -69
- package/dist/surface/tools/live-call-text.js +2 -2
- 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 +11 -1
- package/dist/surface/tools/next-step.js +73 -18
- package/dist/surface/tools/observe-tools.js +43 -5
- package/dist/surface/tools/platform-moment.d.ts +60 -0
- package/dist/surface/tools/platform-moment.js +132 -4
- package/dist/surface/tools/read-tools.js +65 -14
- 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 +68 -2
- package/dist/surface/tools/tool-kit.js +73 -1
- package/dist/surface/tools/tools.js +25 -13
- 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 +27 -6
- package/dist/telemetry/hud-metrics.js +99 -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 +26 -2
- package/dist/telemetry/telemetry.js +102 -21
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +12 -4
- package/dist/wire-journal.d.ts +2 -2
- package/dist/wire-journal.js +16 -5
- package/docs/README.md +2 -2
- package/docs/actions.mdx +6 -3
- package/docs/adapters.md +1 -1
- package/docs/agent-cheatsheet.md +24 -27
- package/docs/architecture.md +5 -5
- package/docs/autodrive.md +13 -12
- 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 +8 -3
- package/docs/cli/drive.mdx +12 -12
- 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 +32 -15
- 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 +13 -4
- 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 +3 -2
- package/docs/cli.mdx +110 -41
- package/docs/debugging.md +3 -3
- package/docs/deploy-checks.md +1 -1
- package/docs/desktop.mdx +5 -3
- package/docs/enterprise.md +11 -10
- package/docs/environment.mdx +5 -2
- 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 +66 -64
- package/docs/human-control.md +15 -14
- package/docs/index.mdx +15 -43
- package/docs/install-agentic.mdx +22 -37
- package/docs/install-manual.mdx +22 -12
- 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 +8 -8
- package/docs/packages/test.mdx +4 -10
- package/docs/packages/vite-plugin.mdx +11 -4
- package/docs/packages.mdx +11 -15
- package/docs/platform-integration.md +6 -5
- package/docs/predicates.mdx +40 -24
- package/docs/quickstart.mdx +58 -29
- 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 +22 -24
- 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 +13 -4
- 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 +51 -45
- 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 +7 -5
- package/docs/what-is-reticle.mdx +2 -2
- package/docs/why-reticle.mdx +1 -1
- package/package.json +6 -5
- package/dist/command/cli/demo/demo-page.d.ts +0 -78
- package/dist/command/cli/demo/demo-page.js +0 -249
- package/dist/command/cli/demo/demo-run.d.ts +0 -38
- package/dist/command/cli/demo/demo-run.js +0 -138
- 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/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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TESTID_FOUND_UNDER_SCHEMA } from './query-hint-schema.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { EMPTY_SESSION_LIST_OUTPUT, emptySessionList } from './empty-session-list.js';
|
|
3
|
+
import { EMPTY_SESSION_LIST_OUTPUT, emptySessionList, wireCallerBesideLiveSessions, } from './empty-session-list.js';
|
|
4
4
|
import { AttrNamesSchema, EventType, QueryBy, ReticleCommand, SnapshotMode } from '@reticlehq/core';
|
|
5
5
|
import { ReticleTool } from '@reticlehq/core';
|
|
6
6
|
import { withSizeCost } from '../../portal/session/output-budget.js';
|
|
@@ -43,23 +43,25 @@ import { VIEWPORT_TOOLS } from '../../portal/input/viewport-tools.js';
|
|
|
43
43
|
import { SESSION_TOOLS } from '../../portal/session/session-tools.js';
|
|
44
44
|
import { ANNOTATE_TOOLS } from '../../language/flows/annotate-tools.js';
|
|
45
45
|
import { LIVE_CONTROL_TOOLS } from '../../portal/session/live-control-tools.js';
|
|
46
|
-
import { sessionIdShape, commandOrThrow } from './tool-kit.js';
|
|
46
|
+
import { SCREENSHOT_DOC, sessionIdShape, commandOrThrow, withScreenshotDoc, } from './tool-kit.js';
|
|
47
47
|
import { TOOL_SURFACE } from './tool-surface.js';
|
|
48
48
|
import { mergeActWithSequence } from './act-merged.js';
|
|
49
49
|
import { INSPECT_TOOL } from './inspect-tool.js';
|
|
50
50
|
import { applyMerges } from './merge-tools.js';
|
|
51
51
|
import { ACT_TOOLS } from './act-tools.js';
|
|
52
52
|
import { ACT_SEQUENCE_TOOL } from './act-sequence-tool.js';
|
|
53
|
+
import { withCompactEnvelope } from './agent/compact-envelope.js';
|
|
53
54
|
import { OBSERVE_TOOLS } from './observe-tools.js';
|
|
54
55
|
import { LINEAGE_TOOLS } from './lineage-tools.js';
|
|
55
56
|
import { RECONCILE_TOOLS } from './reconcile-tools.js';
|
|
56
57
|
import { READ_TOOLS } from './read-tools.js';
|
|
57
58
|
import { LEASE_TOOLS } from './lease-tools.js';
|
|
58
59
|
import { FEEDBACK_TOOLS } from './feedback-tools.js';
|
|
60
|
+
import { ACCOUNT_TOOLS } from './account-tool.js';
|
|
59
61
|
/** FALLBACK for `diff: true`; the real one is per MCP client on `deps.snapshots`, which says why. */
|
|
60
62
|
const SNAPSHOT_CACHE = new SnapshotCache();
|
|
61
63
|
/** Every handler, including tools retired from the advertised MCP surface. */
|
|
62
|
-
export const RAW_TOOLS = [
|
|
64
|
+
export const RAW_TOOLS = withCompactEnvelope([
|
|
63
65
|
{
|
|
64
66
|
name: ReticleTool.SESSIONS,
|
|
65
67
|
description: 'List connected browser sessions (tab url/title, sessionId, last-seen, health: hidden/focused/throttled, and `realInputAvailable` — true when native CDP/launched real input is driving this tab), plus a `recommendation` naming the in-protocol escape hatch (`reticle_run { tool: "reticle_lease" }`, with `reticle drive` as the human-side equivalent) when a tab is hidden/throttled and may be un-scriptable from here.',
|
|
@@ -124,15 +126,20 @@ export const RAW_TOOLS = [
|
|
|
124
126
|
handler: async (deps) => {
|
|
125
127
|
const provider = deps.realInput;
|
|
126
128
|
const leasedIds = new Set(deps.pool?.leasedSessionIds() ?? []);
|
|
127
|
-
const
|
|
129
|
+
const list = () => Promise.all(deps.sessions.list().map(async (s) => ({
|
|
128
130
|
...s,
|
|
129
131
|
realInputAvailable: provider !== undefined ? await provider.isAvailableFor(s.url) : false,
|
|
130
132
|
leased: leasedIds.has(s.sessionId),
|
|
131
133
|
})));
|
|
134
|
+
const sessions = await list();
|
|
132
135
|
// An empty list is a dead end on its own; see empty-session-list.ts for what it carries.
|
|
133
136
|
if (0 === sessions.length)
|
|
134
137
|
return emptySessionList(deps, sessions);
|
|
135
|
-
|
|
138
|
+
// Another project's tab is up. This caller's project may still never have been wired.
|
|
139
|
+
const wired = await wireCallerBesideLiveSessions(deps, sessions);
|
|
140
|
+
if (wired === undefined)
|
|
141
|
+
return { sessions };
|
|
142
|
+
return { sessions: await list(), wired };
|
|
136
143
|
},
|
|
137
144
|
},
|
|
138
145
|
{
|
|
@@ -360,6 +367,10 @@ export const RAW_TOOLS = [
|
|
|
360
367
|
.passthrough()
|
|
361
368
|
.optional()
|
|
362
369
|
.describe("Present when a TEXT search missed but the string IS on the page, split across this container's children. Retry as { scope: <ref>, self: true } — no text query can match a string no single element owns."),
|
|
370
|
+
caseMiss: z
|
|
371
|
+
.string()
|
|
372
|
+
.optional()
|
|
373
|
+
.describe('Present when a case-exact TEXT check missed and the page shows the text in another case: what it shows. Retry with ignoreCase: true if the case does not matter.'),
|
|
363
374
|
// Declared here for the same reason presentRegions had to be: the browser emits it, and an
|
|
364
375
|
// undeclared field is stripped from structuredContent without a word.
|
|
365
376
|
nameNearMiss: z
|
|
@@ -432,16 +443,14 @@ export const RAW_TOOLS = [
|
|
|
432
443
|
// reachable through reticle_run. See affected-tools.ts.
|
|
433
444
|
...AFFECTED_TOOLS,
|
|
434
445
|
// reticle_coverage — which controls were driven vs never touched. Unadvertised; via reticle_run.
|
|
435
|
-
|
|
436
|
-
// importing it back — see buildCoverageTools. Called from the handler, long after TOOLS exists.
|
|
437
|
-
...buildCoverageTools(() => TOOLS.map((t) => t.name)),
|
|
446
|
+
...buildCoverageTools(),
|
|
438
447
|
// reticle_verify_change — "did my change break anything" in one call. See verify-change-tools.ts.
|
|
439
448
|
...VERIFY_CHANGE_TOOLS,
|
|
440
449
|
// Live-control: reticle_end_session / reticle_resume / reticle_messages. See live-control-tools.ts.
|
|
441
450
|
...LIVE_CONTROL_TOOLS,
|
|
442
451
|
// reticle_navigate / reticle_refresh — browser navigation tools. See browser-tools.ts.
|
|
443
|
-
...BROWSER_TOOLS,
|
|
444
|
-
...ACT_TOOLS,
|
|
452
|
+
...BROWSER_TOOLS.map(withScreenshotDoc),
|
|
453
|
+
...ACT_TOOLS.map(withScreenshotDoc),
|
|
445
454
|
ACT_SEQUENCE_TOOL,
|
|
446
455
|
...OBSERVE_TOOLS,
|
|
447
456
|
...LINEAGE_TOOLS,
|
|
@@ -449,7 +458,8 @@ export const RAW_TOOLS = [
|
|
|
449
458
|
...LEASE_TOOLS,
|
|
450
459
|
// reticle_feedback — the agent reports that RETICLE failed (not that the app did). See feedback-tools.ts.
|
|
451
460
|
...FEEDBACK_TOOLS,
|
|
452
|
-
|
|
461
|
+
...ACCOUNT_TOOLS,
|
|
462
|
+
]);
|
|
453
463
|
/**
|
|
454
464
|
* surface consolidation. Tool defs are re-sent EVERY turn, so the advertised count is a per-turn
|
|
455
465
|
* tax multiplied by loop length. Sibling families collapse into one action-dispatched tool; the member
|
|
@@ -491,7 +501,7 @@ export const MERGE_PLANS = [
|
|
|
491
501
|
// existed. The rule is: if a tool has an obligation, the obligation goes first.
|
|
492
502
|
// The first sentence is all a lean surface shows (160 characters), so it carries the
|
|
493
503
|
// obligation and the HUD control; the rest is the detail for a full one.
|
|
494
|
-
'By action: "yield" is MANDATORY before you stop driving; "tune" hides or moves the HUD, or sets the idle window. ' +
|
|
504
|
+
'By action: "yield" is MANDATORY before you stop driving; "tune" hides or moves the HUD, or sets the idle window; "account" says the plan, credits and Harness state. ' +
|
|
495
505
|
'In full: "yield" hands control back to the human (mode: waiting|ask, between turns); "tune" takes `hud` (hidden, shown, removed until reload, or a corner) for when the HUD covers a control you must test, and `idleEndMs`; "end" terminates the session for good; "resume" clears a human pause; "messages" drains the human→agent inbox; "review" lists/resolves the mistakes a human pinned to elements; "narrate" states your intent on the presenter HUD.',
|
|
496
506
|
members: {
|
|
497
507
|
tune: ReticleTool.SESSION_TUNE,
|
|
@@ -501,6 +511,7 @@ export const MERGE_PLANS = [
|
|
|
501
511
|
messages: ReticleTool.MESSAGES,
|
|
502
512
|
review: ReticleTool.REVIEW,
|
|
503
513
|
narrate: ReticleTool.NARRATE,
|
|
514
|
+
account: ReticleTool.ACCOUNT,
|
|
504
515
|
},
|
|
505
516
|
// The handback the lease block orders on every session — the one call an agent MUST make, so it
|
|
506
517
|
// is the one that must not need a schema lookup first.
|
|
@@ -738,7 +749,8 @@ export const SURFACE_MERGE_PLANS = [
|
|
|
738
749
|
},
|
|
739
750
|
{
|
|
740
751
|
name: ReticleTool.ASSERT,
|
|
741
|
-
description: 'Prove a consequence, by action: "now" evaluates a predicate against the window that already exists, "wait" waits for one to become true within a budget. Both return a verdict; only `verified:"yes"` is a pass.'
|
|
752
|
+
description: 'Prove a consequence, by action: "now" evaluates a predicate against the window that already exists, "wait" waits for one to become true within a budget. Both return a verdict; only `verified:"yes"` is a pass.' +
|
|
753
|
+
SCREENSHOT_DOC,
|
|
742
754
|
members: { now: ReticleTool.ASSERT, wait: ReticleTool.WAIT_FOR },
|
|
743
755
|
example: { action: 'now' },
|
|
744
756
|
// Evaluate against the window that already exists. `wait` spends a budget, so it is asked for.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TelemetryAccountState } from '@reticlehq/core/telemetry';
|
|
2
|
+
export interface AccountEnvelope {
|
|
3
|
+
accountState: TelemetryAccountState;
|
|
4
|
+
linked: boolean;
|
|
5
|
+
workspaceId?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function accountEnvelope(cwd: string, env: NodeJS.ProcessEnv, home: string): AccountEnvelope;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where this machine stands with the platform, for every telemetry event: signed out, signed in, or
|
|
3
|
+
* this project linked to a workspace, and that workspace's id.
|
|
4
|
+
*
|
|
5
|
+
* Read from what the CLI already wrote, never asked of the network: the session file (through
|
|
6
|
+
* `readAccountState`, which cannot carry the token) and the project's `.reticle/cloud.json`. Read per
|
|
7
|
+
* event, because a sign-in from the HUD changes the answer mid-session.
|
|
8
|
+
*
|
|
9
|
+
* The workspace id is the platform's `orgId`: pseudonymous here, and the key the platform joins its
|
|
10
|
+
* own records on. The workspace NAME and the signed-in email are never read into this.
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { ReticleDir } from '@reticlehq/core';
|
|
15
|
+
import { TelemetryAccountState } from '@reticlehq/core/telemetry';
|
|
16
|
+
import { readAccountState } from '../memory/cloud/account-state.js';
|
|
17
|
+
import { linkDirectoryFrom } from '../memory/project/link-directory.js';
|
|
18
|
+
const MAX_WORKSPACE_ID = 128;
|
|
19
|
+
/** The link this project carries, if it is a real one (a project id and a host). */
|
|
20
|
+
function readLink(dir) {
|
|
21
|
+
try {
|
|
22
|
+
const raw = JSON.parse(readFileSync(join(dir, ReticleDir.ROOT, ReticleDir.CLOUD_LINK_FILE), 'utf8'));
|
|
23
|
+
if ('object' !== typeof raw || null === raw)
|
|
24
|
+
return undefined;
|
|
25
|
+
const o = raw;
|
|
26
|
+
const projectId = o['projectId'];
|
|
27
|
+
const url = o['url'];
|
|
28
|
+
if ('string' !== typeof projectId || 0 === projectId.length)
|
|
29
|
+
return undefined;
|
|
30
|
+
if ('string' !== typeof url || 0 === url.length)
|
|
31
|
+
return undefined;
|
|
32
|
+
const orgId = o['orgId'];
|
|
33
|
+
return 'string' === typeof orgId && 0 < orgId.length && orgId.length <= MAX_WORKSPACE_ID
|
|
34
|
+
? { orgId }
|
|
35
|
+
: {};
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function accountEnvelope(cwd, env, home) {
|
|
42
|
+
let link;
|
|
43
|
+
try {
|
|
44
|
+
link = readLink(linkDirectoryFrom(cwd)) ?? readLink(cwd);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
link = undefined;
|
|
48
|
+
}
|
|
49
|
+
if (link !== undefined) {
|
|
50
|
+
return {
|
|
51
|
+
accountState: TelemetryAccountState.LINKED,
|
|
52
|
+
linked: true,
|
|
53
|
+
...(link.orgId === undefined ? {} : { workspaceId: link.orgId }),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const signedIn = readAccountState(home, env).signedIn;
|
|
57
|
+
return {
|
|
58
|
+
accountState: signedIn ? TelemetryAccountState.SIGNED_IN : TelemetryAccountState.SIGNED_OUT,
|
|
59
|
+
linked: false,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which coding agent an event came from, as a closed value — and how the running `reticle` was
|
|
3
|
+
* launched. Both are envelope fields, read per event (the client) or once per process (the launch).
|
|
4
|
+
*
|
|
5
|
+
* The client is the MCP handshake's `clientInfo.name` for the call in flight (or the only agent
|
|
6
|
+
* attached), normalised by `agentClientOf`. When no handshake has said anything — a one-shot CLI
|
|
7
|
+
* command, a proxy, a client that skipped `initialize` — the agent's own marker in the environment
|
|
8
|
+
* of what it spawned is the fallback. Only markers an agent sets on purpose are read.
|
|
9
|
+
*/
|
|
10
|
+
import { AgentClient, LaunchMethod } from '@reticlehq/core/telemetry';
|
|
11
|
+
export declare function envAgentClient(env: NodeJS.ProcessEnv): AgentClient | undefined;
|
|
12
|
+
/** The client for an event being built now. */
|
|
13
|
+
export declare function currentAgentClient(env: NodeJS.ProcessEnv): AgentClient | undefined;
|
|
14
|
+
/** How the process was launched, from the path of its entry script. Only the bucket leaves. */
|
|
15
|
+
export declare function launchMethodOf(entry: string | undefined): LaunchMethod;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which coding agent an event came from, as a closed value — and how the running `reticle` was
|
|
3
|
+
* launched. Both are envelope fields, read per event (the client) or once per process (the launch).
|
|
4
|
+
*
|
|
5
|
+
* The client is the MCP handshake's `clientInfo.name` for the call in flight (or the only agent
|
|
6
|
+
* attached), normalised by `agentClientOf`. When no handshake has said anything — a one-shot CLI
|
|
7
|
+
* command, a proxy, a client that skipped `initialize` — the agent's own marker in the environment
|
|
8
|
+
* of what it spawned is the fallback. Only markers an agent sets on purpose are read.
|
|
9
|
+
*/
|
|
10
|
+
import { AgentClient, LaunchMethod } from '@reticlehq/core/telemetry';
|
|
11
|
+
import { agentClientOf, callingClientName } from '../hooks/coding-agents.js';
|
|
12
|
+
/**
|
|
13
|
+
* Environment markers a coding agent sets on the processes it spawns. A shared daemon inherits the
|
|
14
|
+
* environment of whichever agent started it, so this is a fallback after the handshake, never ahead
|
|
15
|
+
* of it.
|
|
16
|
+
*/
|
|
17
|
+
const ENV_MARKERS = [
|
|
18
|
+
['CLAUDECODE', AgentClient.CLAUDE_CODE],
|
|
19
|
+
['CODEX_SANDBOX', AgentClient.CODEX],
|
|
20
|
+
['CODEX_MANAGED_BY_NPM', AgentClient.CODEX],
|
|
21
|
+
['CURSOR_TRACE_ID', AgentClient.CURSOR],
|
|
22
|
+
['GEMINI_CLI', AgentClient.GEMINI_CLI],
|
|
23
|
+
];
|
|
24
|
+
export function envAgentClient(env) {
|
|
25
|
+
return ENV_MARKERS.find(([key]) => (env[key] ?? '') !== '')?.[1];
|
|
26
|
+
}
|
|
27
|
+
/** The client for an event being built now. */
|
|
28
|
+
export function currentAgentClient(env) {
|
|
29
|
+
return agentClientOf(callingClientName()) ?? envAgentClient(env);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Where a global install puts packages, by package manager. A path that matches none of these but
|
|
33
|
+
* still sits in a `node_modules` is a project's own dependency.
|
|
34
|
+
*/
|
|
35
|
+
const GLOBAL_DIRS = [
|
|
36
|
+
'/lib/node_modules/',
|
|
37
|
+
'/npm/node_modules/',
|
|
38
|
+
'/pnpm/global/',
|
|
39
|
+
'/.volta/',
|
|
40
|
+
'/.bun/install/global/',
|
|
41
|
+
'/yarn/global/',
|
|
42
|
+
'/.nvm/',
|
|
43
|
+
'/.npm-global/',
|
|
44
|
+
];
|
|
45
|
+
/** How the process was launched, from the path of its entry script. Only the bucket leaves. */
|
|
46
|
+
export function launchMethodOf(entry) {
|
|
47
|
+
if (entry === undefined)
|
|
48
|
+
return LaunchMethod.OTHER;
|
|
49
|
+
const path = entry.replace(/\\/g, '/').toLowerCase();
|
|
50
|
+
if (path.includes('/_npx/') || path.includes('/dlx-'))
|
|
51
|
+
return LaunchMethod.NPX;
|
|
52
|
+
if (GLOBAL_DIRS.some((dir) => path.includes(dir)))
|
|
53
|
+
return LaunchMethod.GLOBAL;
|
|
54
|
+
if (path.includes('/node_modules/'))
|
|
55
|
+
return LaunchMethod.PROJECT;
|
|
56
|
+
return LaunchMethod.OTHER;
|
|
57
|
+
}
|
|
@@ -15,8 +15,10 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { OnboardingPhase, OnboardingStepStatus, TelemetryEventKind, } from '@reticlehq/core/telemetry';
|
|
17
17
|
import { getTelemetry } from './telemetry.js';
|
|
18
|
-
import {
|
|
18
|
+
import { FirstEver, claimFirstEver, reportFirstStep } from './onboarding-firsts.js';
|
|
19
19
|
let reported = false;
|
|
20
|
+
/** The on-disk claim for the EVENT, kept apart from the `app_connected` step's own claim. */
|
|
21
|
+
const APP_INSTRUMENTED_CLAIM = 'app_instrumented';
|
|
20
22
|
/** Set at daemon start so the first connect can report how long the install sat un-instrumented. */
|
|
21
23
|
let daemonStartedAt;
|
|
22
24
|
export function markInstrumentationClock(now) {
|
|
@@ -32,8 +34,13 @@ export function reportAppInstrumented(facts, now = () => Date.now()) {
|
|
|
32
34
|
return;
|
|
33
35
|
reported = true;
|
|
34
36
|
try {
|
|
37
|
+
// Still once per RUN: `daemon_started` minus `app_instrumented`, joined on sessionId, is the
|
|
38
|
+
// documented failure side and needs a row per run. Only the true first on this machine +
|
|
39
|
+
// project says `firstEver`, so a per-machine count no longer counts daemon restarts.
|
|
40
|
+
const firstEver = FirstEver.FIRST === claimFirstEver(APP_INSTRUMENTED_CLAIM);
|
|
35
41
|
void getTelemetry().emit(TelemetryEventKind.APP_INSTRUMENTED, {
|
|
36
42
|
instrumentation: {
|
|
43
|
+
...(firstEver ? { firstEver: true } : {}),
|
|
37
44
|
initialized: facts.initialized,
|
|
38
45
|
agentAttached: facts.agentAttached,
|
|
39
46
|
// How long the daemon ran before an app showed up. Large values are the interesting ones:
|
|
@@ -47,7 +54,7 @@ export function reportAppInstrumented(facts, now = () => Date.now()) {
|
|
|
47
54
|
//
|
|
48
55
|
// `instrumented` means files were written; THIS means a page actually dialled the bridge. Every
|
|
49
56
|
// silent install bug so far has lived in the gap between those two.
|
|
50
|
-
|
|
57
|
+
reportFirstStep({
|
|
51
58
|
phase: OnboardingPhase.FIRST_RUN,
|
|
52
59
|
step: 'app_connected',
|
|
53
60
|
status: OnboardingStepStatus.COMPLETED,
|
|
@@ -19,6 +19,13 @@
|
|
|
19
19
|
* never quietly start forwarding free text.
|
|
20
20
|
*/
|
|
21
21
|
export declare const OTHER_VALUE = "other";
|
|
22
|
+
/**
|
|
23
|
+
* Add values WE define to a parameter's allow-list. The merged tools call this for their `action`
|
|
24
|
+
* values (`reticle_look`'s `page` / `find` / ...): those are keys of a plan in this repository, not
|
|
25
|
+
* input, and without them every grouped call reported `action:other`. Only for a parameter already
|
|
26
|
+
* listed above, so this can widen an enum and never start forwarding a free-text parameter.
|
|
27
|
+
*/
|
|
28
|
+
export declare function allowParamValues(name: string, values: Iterable<string>): void;
|
|
22
29
|
/**
|
|
23
30
|
* The reportable form of one parameter: `name` on its own, or `name:value` when the parameter is a
|
|
24
31
|
* known enum. Never the raw value of anything else.
|
|
@@ -41,6 +41,19 @@ const SAFE_ENUM_PARAMS = new Map([
|
|
|
41
41
|
['level', new Set(['error', 'warn', 'info', 'log', 'debug'])],
|
|
42
42
|
]);
|
|
43
43
|
export const OTHER_VALUE = 'other';
|
|
44
|
+
/**
|
|
45
|
+
* Add values WE define to a parameter's allow-list. The merged tools call this for their `action`
|
|
46
|
+
* values (`reticle_look`'s `page` / `find` / ...): those are keys of a plan in this repository, not
|
|
47
|
+
* input, and without them every grouped call reported `action:other`. Only for a parameter already
|
|
48
|
+
* listed above, so this can widen an enum and never start forwarding a free-text parameter.
|
|
49
|
+
*/
|
|
50
|
+
export function allowParamValues(name, values) {
|
|
51
|
+
const allowed = SAFE_ENUM_PARAMS.get(name);
|
|
52
|
+
if (allowed === undefined)
|
|
53
|
+
return;
|
|
54
|
+
for (const value of values)
|
|
55
|
+
allowed.add(value);
|
|
56
|
+
}
|
|
44
57
|
/**
|
|
45
58
|
* The reportable form of one parameter: `name` on its own, or `name:value` when the parameter is a
|
|
46
59
|
* known enum. Never the raw value of anything else.
|
|
@@ -82,11 +95,83 @@ export function describeToolParams(args) {
|
|
|
82
95
|
export function describeCliFlags(argv) {
|
|
83
96
|
const flags = new Set();
|
|
84
97
|
for (const arg of argv) {
|
|
98
|
+
// A bare `--` ends the options: everything after it is passed through to something else.
|
|
99
|
+
if (END_OF_OPTIONS === arg)
|
|
100
|
+
break;
|
|
85
101
|
if (!arg.startsWith('--'))
|
|
86
102
|
continue;
|
|
87
103
|
// `--port=9000` — split so the NAME is reported and the value is discarded with everything else.
|
|
88
104
|
const name = arg.split('=')[0] ?? arg;
|
|
89
|
-
flags.add(name);
|
|
105
|
+
flags.add(KNOWN_CLI_FLAGS.has(name) ? name : OTHER_VALUE);
|
|
90
106
|
}
|
|
91
107
|
return [...flags].sort();
|
|
92
108
|
}
|
|
109
|
+
const END_OF_OPTIONS = '--';
|
|
110
|
+
/**
|
|
111
|
+
* The flags the CLI defines. Anything else is reported as `other`: a flag NAME the user typed can
|
|
112
|
+
* carry their own word as easily as a value can. Hand-listed because the CLI parses its flags in
|
|
113
|
+
* many places with no shared table; a flag missing here reports `other`, which loses a count and
|
|
114
|
+
* leaks nothing.
|
|
115
|
+
*/
|
|
116
|
+
const KNOWN_CLI_FLAGS = new Set([
|
|
117
|
+
'--accept-coverage',
|
|
118
|
+
'--agent',
|
|
119
|
+
'--app',
|
|
120
|
+
'--bug',
|
|
121
|
+
'--capture-bodies',
|
|
122
|
+
'--confirm-dangerous',
|
|
123
|
+
'--dir',
|
|
124
|
+
'--drive',
|
|
125
|
+
'--drive-model',
|
|
126
|
+
'--dry-run',
|
|
127
|
+
'--email',
|
|
128
|
+
'--env',
|
|
129
|
+
'--expect',
|
|
130
|
+
'--expect-file',
|
|
131
|
+
'--explore',
|
|
132
|
+
'--files-only',
|
|
133
|
+
'--fix',
|
|
134
|
+
'--flow',
|
|
135
|
+
'--force',
|
|
136
|
+
'--headed',
|
|
137
|
+
'--headless',
|
|
138
|
+
'--help',
|
|
139
|
+
'--hook',
|
|
140
|
+
'--hooks',
|
|
141
|
+
'--http',
|
|
142
|
+
'--http-port',
|
|
143
|
+
'--http-token',
|
|
144
|
+
'--install-secs',
|
|
145
|
+
'--json',
|
|
146
|
+
'--kind',
|
|
147
|
+
'--license',
|
|
148
|
+
'--move-history',
|
|
149
|
+
'--no-agents',
|
|
150
|
+
'--no-drive',
|
|
151
|
+
'--no-first-run',
|
|
152
|
+
'--no-install',
|
|
153
|
+
'--no-mcp',
|
|
154
|
+
'--no-open',
|
|
155
|
+
'--persona',
|
|
156
|
+
'--porcelain',
|
|
157
|
+
'--port',
|
|
158
|
+
'--project',
|
|
159
|
+
'--quiet',
|
|
160
|
+
'--rating',
|
|
161
|
+
'--relaunch',
|
|
162
|
+
'--results-json',
|
|
163
|
+
'--runtime-secs',
|
|
164
|
+
'--select',
|
|
165
|
+
'--session',
|
|
166
|
+
'--session-id',
|
|
167
|
+
'--since',
|
|
168
|
+
'--start',
|
|
169
|
+
'--storage-state',
|
|
170
|
+
'--subject',
|
|
171
|
+
'--timeout',
|
|
172
|
+
'--url',
|
|
173
|
+
'--version',
|
|
174
|
+
'--watch',
|
|
175
|
+
'--workspace',
|
|
176
|
+
'--yes',
|
|
177
|
+
]);
|
|
@@ -2,13 +2,12 @@ import { AutomationHint } from '@reticlehq/core/telemetry';
|
|
|
2
2
|
interface AutomationInput {
|
|
3
3
|
env: NodeJS.ProcessEnv;
|
|
4
4
|
fileExists: (path: string) => boolean;
|
|
5
|
-
hasTty: boolean;
|
|
6
5
|
}
|
|
7
6
|
/**
|
|
8
7
|
* The most specific signal that fires, or undefined.
|
|
9
8
|
*
|
|
10
|
-
* Ordered most specific first:
|
|
11
|
-
*
|
|
9
|
+
* Ordered most specific first: an agent sandbox runs in a container, and a container inside a
|
|
10
|
+
* Codespace is one fact about the run; sending the weaker signal would waste the field. Omitted rather than sent as a
|
|
12
11
|
* "none" value, so its presence is itself the signal — the convention every other advisory field
|
|
13
12
|
* here follows.
|
|
14
13
|
*/
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
* - `npm_config_user_agent`. Says which package manager ran us, which every route shares.
|
|
24
24
|
* - An absent `$DISPLAY`. Every Linux server, every ssh session, and a large share of genuine
|
|
25
25
|
* developer machines trip it; it separates nothing.
|
|
26
|
+
* - No terminal on stdin/stdout. It was the third signal here, and every MCP stdio server has no
|
|
27
|
+
* terminal, so it fired on nearly every daemon a person's agent started and separated nothing.
|
|
26
28
|
*/
|
|
27
29
|
import { existsSync } from 'node:fs';
|
|
28
30
|
import { AutomationHint } from '@reticlehq/core/telemetry';
|
|
@@ -35,21 +37,47 @@ const HOSTED_WORKSPACE_ENV = [
|
|
|
35
37
|
'CLOUD_SHELL',
|
|
36
38
|
'REMOTE_CONTAINERS',
|
|
37
39
|
];
|
|
40
|
+
/**
|
|
41
|
+
* CI vendors' own variables, for the runners and self-hosted agents that do not set `CI`. Each is
|
|
42
|
+
* set by the runner itself; a person's shell does not carry them.
|
|
43
|
+
*/
|
|
44
|
+
const CI_VENDOR_ENV = [
|
|
45
|
+
'GITHUB_ACTIONS',
|
|
46
|
+
'GITLAB_CI',
|
|
47
|
+
'BUILDKITE',
|
|
48
|
+
'CIRCLECI',
|
|
49
|
+
'JENKINS_URL',
|
|
50
|
+
'TF_BUILD',
|
|
51
|
+
'TEAMCITY_VERSION',
|
|
52
|
+
'BITBUCKET_BUILD_NUMBER',
|
|
53
|
+
'CODEBUILD_BUILD_ID',
|
|
54
|
+
'DRONE',
|
|
55
|
+
'TRAVIS',
|
|
56
|
+
];
|
|
57
|
+
/**
|
|
58
|
+
* Hosted coding-agent sandboxes that declare themselves to what they spawn. Only markers the agent
|
|
59
|
+
* sets on purpose for a REMOTE session: a local agent's own marker (`CLAUDECODE`) is a person at a
|
|
60
|
+
* laptop and belongs to `client`, not here.
|
|
61
|
+
*/
|
|
62
|
+
const AGENT_SANDBOX_ENV = ['CLAUDE_CODE_REMOTE'];
|
|
63
|
+
const declared = (env, keys) => keys.some((k) => (env[k] ?? '') !== '' && 'false' !== env[k]);
|
|
38
64
|
/**
|
|
39
65
|
* The most specific signal that fires, or undefined.
|
|
40
66
|
*
|
|
41
|
-
* Ordered most specific first:
|
|
42
|
-
*
|
|
67
|
+
* Ordered most specific first: an agent sandbox runs in a container, and a container inside a
|
|
68
|
+
* Codespace is one fact about the run; sending the weaker signal would waste the field. Omitted rather than sent as a
|
|
43
69
|
* "none" value, so its presence is itself the signal — the convention every other advisory field
|
|
44
70
|
* here follows.
|
|
45
71
|
*/
|
|
46
72
|
export function resolveAutomationHint(input) {
|
|
73
|
+
if (declared(input.env, AGENT_SANDBOX_ENV))
|
|
74
|
+
return AutomationHint.AGENT_SANDBOX;
|
|
75
|
+
if (declared(input.env, CI_VENDOR_ENV))
|
|
76
|
+
return AutomationHint.CI_RUNNER;
|
|
47
77
|
if (CONTAINER_MARKERS.some((m) => input.fileExists(m)))
|
|
48
78
|
return AutomationHint.CONTAINER;
|
|
49
|
-
if (
|
|
79
|
+
if (declared(input.env, HOSTED_WORKSPACE_ENV))
|
|
50
80
|
return AutomationHint.HOSTED_WORKSPACE;
|
|
51
|
-
if (!input.hasTty)
|
|
52
|
-
return AutomationHint.NO_TTY;
|
|
53
81
|
return undefined;
|
|
54
82
|
}
|
|
55
83
|
/** The real reading, taken once per process. */
|
|
@@ -64,8 +92,5 @@ export function currentAutomationHint(env) {
|
|
|
64
92
|
return false; // an unreadable root is not evidence of anything
|
|
65
93
|
}
|
|
66
94
|
},
|
|
67
|
-
// Both ends, because a piped stdout alone is how `reticle status | jq` looks, and that is a
|
|
68
|
-
// person typing.
|
|
69
|
-
hasTty: true === process.stdout.isTTY || true === process.stdin.isTTY,
|
|
70
95
|
});
|
|
71
96
|
}
|
|
@@ -13,7 +13,8 @@ import { join } from 'node:path';
|
|
|
13
13
|
/** Where the installer left its breadcrumbs. Same directory the telemetry id and opt-out live in. */
|
|
14
14
|
const RETICLE_STATE_DIR = process.env['RETICLE_STATE_DIR'] ?? join(homedir(), '.reticle');
|
|
15
15
|
import { describeCliFlags } from './argument-shape.js';
|
|
16
|
-
import { resolveInstallSource } from './install-source.js';
|
|
16
|
+
import { rememberInstallSource, resolveInstallSource } from './install-source.js';
|
|
17
|
+
import { installPlatformLinkTelemetry } from './platform-linked.js';
|
|
17
18
|
/**
|
|
18
19
|
* Report that a person ran a `reticle` subcommand.
|
|
19
20
|
*
|
|
@@ -53,7 +54,11 @@ export function reportCliRun(argv) {
|
|
|
53
54
|
* second invocation finds nothing. A flag would have to live somewhere, and somewhere is another
|
|
54
55
|
* file that can disagree with this one.
|
|
55
56
|
*/
|
|
57
|
+
// Every process that may link a project, the daemon included, reports it.
|
|
58
|
+
installPlatformLinkTelemetry();
|
|
56
59
|
drainInstallTrace(RETICLE_STATE_DIR);
|
|
60
|
+
// Before anything reads it: a channel declared on THIS command outlives it.
|
|
61
|
+
rememberInstallSource(process.env, RETICLE_STATE_DIR);
|
|
57
62
|
if (firstArg === DAEMON_INNER_COMMAND)
|
|
58
63
|
return;
|
|
59
64
|
const command = knownCommand(firstArg);
|
|
@@ -67,7 +72,7 @@ export function reportCliRun(argv) {
|
|
|
67
72
|
detach: true,
|
|
68
73
|
// WHICH published route brought this machine in. Self-declared by the channel, never inferred
|
|
69
74
|
// — see install-source.ts for which of the four routes can actually carry the marker.
|
|
70
|
-
installSource: resolveInstallSource(),
|
|
75
|
+
installSource: resolveInstallSource(process.env, RETICLE_STATE_DIR),
|
|
71
76
|
});
|
|
72
77
|
if (!isHumanCliCommand(command))
|
|
73
78
|
return;
|
|
@@ -15,6 +15,7 @@ import { reticleStateHome } from '../command/daemon/daemon.js';
|
|
|
15
15
|
import { startUpdateCheck, updateNudgeState } from '../command/update/update-nudge.js';
|
|
16
16
|
import { markDaemonStart } from './mcp-connection.js';
|
|
17
17
|
import { markInstrumentationClock } from './app-instrumented.js';
|
|
18
|
+
import { drainFeedbackOutbox } from './feedback.js';
|
|
18
19
|
import { markStallClock, STALL_AFTER_MS, stallUptime } from '../portal/session/stall-clock.js';
|
|
19
20
|
/**
|
|
20
21
|
* Whether an app for this project has ever reached Reticle, read from the same durable memory the
|
|
@@ -91,6 +92,8 @@ export function installDaemonTelemetry(cwd, now = () => Date.now(),
|
|
|
91
92
|
port) {
|
|
92
93
|
const metrics = getSessionMetrics(now);
|
|
93
94
|
void getTelemetry().emit(TelemetryEventKind.DAEMON_STARTED);
|
|
95
|
+
// Reports a past send could not deliver. Off the boot path, and never able to throw into it.
|
|
96
|
+
void drainFeedbackOutbox().catch(() => undefined);
|
|
94
97
|
// Ask npm whether a newer Reticle exists, so the agent can tell the human. Nothing checked before
|
|
95
98
|
// this, so a published fix was invisible until someone manually ran `reticle update`.
|
|
96
99
|
startUpdateCheck(now);
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* What an error message may say on the wire, and it is ALLOW-listed: a sentence Reticle authors
|
|
3
|
+
* (sent as our own fixed label), else the bare Node error code or built-in class plus the
|
|
4
|
+
* fingerprint, else the fingerprint alone.
|
|
5
|
+
*
|
|
6
|
+
* It used to be the message with known-variable parts blanked, which is a deny-list, and a
|
|
7
|
+
* deny-list loses: a hostname after `getaddrinfo ENOTFOUND`, a Windows home directory with a space
|
|
8
|
+
* in it, a `~` path and a person's name in free text all reached the wire. Nothing written by
|
|
9
|
+
* anybody else survives this function, because it never echoes its input.
|
|
10
|
+
*/
|
|
2
11
|
export declare function errorSkeleton(message: string): string;
|
|
3
12
|
/** A stable, opaque group key for an error message. Same defect ⇒ same key, on every machine. */
|
|
4
13
|
export declare function fingerprintError(message: string): string;
|