@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
|
@@ -30,4 +30,7 @@ export declare function daemonStartOptions(parsed: DaemonFlags): StartOptions;
|
|
|
30
30
|
* idea: that headless belongs to the drive URL. It belongs to the pool, which exists either way.
|
|
31
31
|
*/
|
|
32
32
|
export declare function daemonSpawnArgs(parsed: DaemonFlags): string[];
|
|
33
|
+
/** Set (to anything but '', '0' or 'false') to hide every browser Reticle opens. Batteries set it. */
|
|
34
|
+
export declare const HEADLESS_ENV = "RETICLE_HEADLESS";
|
|
35
|
+
export declare function headlessByDefault(env: Readonly<Record<string, string | undefined>>, platform: string): boolean;
|
|
33
36
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DAEMON_INNER_COMMAND, DRIVE_FLAG, HEADED_FLAG, HTTP_FLAG, HTTP_PORT_FLAG, HTTP_TOKEN_FLAG, PORT_FLAG, } from './cli-parse.js';
|
|
1
|
+
import { DAEMON_INNER_COMMAND, DRIVE_FLAG, HEADED_FLAG, HEADLESS_FLAG, HTTP_FLAG, HTTP_PORT_FLAG, HTTP_TOKEN_FLAG, PORT_FLAG, } from './cli-parse.js';
|
|
2
2
|
export function daemonStartOptions(parsed) {
|
|
3
3
|
return {
|
|
4
4
|
port: parsed.port,
|
|
@@ -25,8 +25,9 @@ export function daemonSpawnArgs(parsed) {
|
|
|
25
25
|
const args = [DAEMON_INNER_COMMAND, PORT_FLAG, String(parsed.port)];
|
|
26
26
|
if (parsed.driveUrl !== undefined)
|
|
27
27
|
args.push(DRIVE_FLAG, parsed.driveUrl);
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
// Said either way: the child decides its own default from its environment, so a parent that
|
|
29
|
+
// resolved hidden must say so rather than leave it to a default that may differ.
|
|
30
|
+
args.push(parsed.headless ? HEADLESS_FLAG : HEADED_FLAG);
|
|
30
31
|
if (parsed.http) {
|
|
31
32
|
args.push(HTTP_FLAG);
|
|
32
33
|
if (parsed.httpPort !== undefined)
|
|
@@ -36,3 +37,23 @@ export function daemonSpawnArgs(parsed) {
|
|
|
36
37
|
}
|
|
37
38
|
return args;
|
|
38
39
|
}
|
|
40
|
+
/*
|
|
41
|
+
* Whether a browser a daemon opens is shown or hidden when no flag says. Here because both callers that
|
|
42
|
+
* decide it -- `cli.ts` and init's bring-up -- already start daemons through this module.
|
|
43
|
+
*/
|
|
44
|
+
/** Set (to anything but '', '0' or 'false') to hide every browser Reticle opens. Batteries set it. */
|
|
45
|
+
export const HEADLESS_ENV = 'RETICLE_HEADLESS';
|
|
46
|
+
/**
|
|
47
|
+
* Whether a browser Reticle opens is hidden when no flag says. Shown by default, for every command:
|
|
48
|
+
* the pool behind `serve`/`mcp` used to be hidden on the theory that nobody watches batch work, and
|
|
49
|
+
* from the field that was a person watching an agent drive their app and seeing nothing happen.
|
|
50
|
+
* Hidden where showing is impossible or unwanted: CI, the test batteries, and a Linux machine with
|
|
51
|
+
* no display server, where a headed launch fails instead of showing anything.
|
|
52
|
+
*/
|
|
53
|
+
const OFF = new Set(['', '0', 'false']);
|
|
54
|
+
export function headlessByDefault(env, platform) {
|
|
55
|
+
const forced = env[HEADLESS_ENV];
|
|
56
|
+
if (env['CI'] !== undefined || (forced !== undefined && !OFF.has(forced)))
|
|
57
|
+
return true;
|
|
58
|
+
return ('linux' === platform && env['DISPLAY'] === undefined && env['WAYLAND_DISPLAY'] === undefined);
|
|
59
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `doctor`'s coverage rows: what Reticle sees in each connected app, read from the daemon's
|
|
3
|
+
* `/status` (`coverage`), and — once a verdict recorded a gap — the prompt to hand a coding agent.
|
|
4
|
+
* A terminal cannot copy, so the prompt is printed whole, ready to paste.
|
|
5
|
+
*/
|
|
6
|
+
import { DoctorRow, doctorRow } from './doctor-rows.js';
|
|
7
|
+
const capabilitiesIn = (value) => Array.isArray(value)
|
|
8
|
+
? value.flatMap((item) => {
|
|
9
|
+
const name = 'object' === typeof item && null !== item
|
|
10
|
+
? item['capability']
|
|
11
|
+
: item;
|
|
12
|
+
return 'string' === typeof name ? [name] : [];
|
|
13
|
+
})
|
|
14
|
+
: [];
|
|
15
|
+
/** The rows for every tab the status names; nothing when it names none. Never throws. */
|
|
16
|
+
export function coverageLines(status) {
|
|
17
|
+
const list = 'object' === typeof status && null !== status
|
|
18
|
+
? status['coverage']
|
|
19
|
+
: undefined;
|
|
20
|
+
if (!Array.isArray(list))
|
|
21
|
+
return [];
|
|
22
|
+
return list.flatMap((raw) => {
|
|
23
|
+
const tab = ('object' === typeof raw && null !== raw ? raw : {});
|
|
24
|
+
if ('number' !== typeof tab.covered || 'number' !== typeof tab.total)
|
|
25
|
+
return [];
|
|
26
|
+
const missing = capabilitiesIn(tab.missing);
|
|
27
|
+
const notSeen = capabilitiesIn(tab.notSeenYet);
|
|
28
|
+
const parts = [
|
|
29
|
+
`${String(tab.covered)}/${String(tab.total)}${'string' === typeof tab.url ? ` at ${tab.url}` : ''}`,
|
|
30
|
+
...(0 === missing.length ? [] : [`missing: ${missing.join(', ')}`]),
|
|
31
|
+
...(0 === notSeen.length ? [] : [`not seen yet: ${notSeen.join(', ')}`]),
|
|
32
|
+
];
|
|
33
|
+
const prompt = 'string' === typeof tab.prompt
|
|
34
|
+
? [
|
|
35
|
+
' prompt for your coding agent (copy it):',
|
|
36
|
+
...tab.prompt.split('\n').map((line) => ` ${line}`),
|
|
37
|
+
]
|
|
38
|
+
: [];
|
|
39
|
+
const gate = tab.harnessGate;
|
|
40
|
+
const reason = 'object' === typeof gate && null !== gate
|
|
41
|
+
? gate['reason']
|
|
42
|
+
: undefined;
|
|
43
|
+
// The Harness gate, in the sentence a refused drive says.
|
|
44
|
+
const locked = 'string' === typeof reason ? [` ${reason}`] : [];
|
|
45
|
+
return [doctorRow(DoctorRow.COVERAGE, parts.join(' — ')), ...locked, ...prompt];
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Whether `init` has wired THIS directory — the check `doctor` was missing.
|
|
3
|
-
*
|
|
4
|
-
* `doctor` already read `.reticle.json` for the port, so it knew whether the file existed and never
|
|
5
|
-
* said so. In a project where `init` has not run the checklist came out clean: node fine, chromium
|
|
6
|
-
* fine, a daemon that starts on demand, a bridge port. Every line true, and the app carrying no SDK
|
|
7
|
-
* went unremarked — which is exactly the state that produces "the tools are here and nothing ever
|
|
8
|
-
* verifies", and the state `doctor` is run to explain.
|
|
9
|
-
*
|
|
10
|
-
* Registering the MCP server and instrumenting the app are two different halves of the install, and
|
|
11
|
-
* more than one route does the first without the second.
|
|
12
|
-
*/
|
|
13
1
|
interface ProjectWiringFacts {
|
|
14
2
|
/** The id from `.reticle.json`, or undefined when there is no config here. */
|
|
15
3
|
projectId: string | undefined;
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* Registering the MCP server and instrumenting the app are two different halves of the install, and
|
|
11
11
|
* more than one route does the first without the second.
|
|
12
12
|
*/
|
|
13
|
+
import { DoctorRow, doctorRow } from './doctor-rows.js';
|
|
13
14
|
/**
|
|
14
15
|
* One line, in the same shape as the checks beside it.
|
|
15
16
|
*
|
|
@@ -20,16 +21,16 @@
|
|
|
20
21
|
*/
|
|
21
22
|
export function projectWiringLine(facts) {
|
|
22
23
|
if (facts.projectId !== undefined) {
|
|
23
|
-
return
|
|
24
|
+
return doctorRow(DoctorRow.PROJECT, `✓ wired here (${facts.projectId})`);
|
|
24
25
|
}
|
|
25
26
|
if (facts.previouslyConnected) {
|
|
26
|
-
return '
|
|
27
|
+
return doctorRow(DoctorRow.PROJECT, '✓ an app has connected here before, so it is wired (no .reticle.json — a build plugin can wire an app without one)');
|
|
27
28
|
}
|
|
28
29
|
if (true === facts.configPresent) {
|
|
29
|
-
return ('
|
|
30
|
+
return doctorRow(DoctorRow.PROJECT, '✗ .reticle.json is here but carries no readable projectId — a corrupt or ' +
|
|
30
31
|
'hand-edited config reads the same as no config, and points this project at the default ' +
|
|
31
32
|
'daemon. Run `npx @reticlehq/server init` in the app directory to rewrite it');
|
|
32
33
|
}
|
|
33
|
-
return ('
|
|
34
|
+
return doctorRow(DoctorRow.PROJECT, '✗ no .reticle.json here and nothing has ever connected — the tools may be ' +
|
|
34
35
|
'registered, but this app is not instrumented. Run `npx @reticlehq/server init` in the app directory');
|
|
35
36
|
}
|
|
@@ -40,6 +40,8 @@ export declare const DoctorRow: {
|
|
|
40
40
|
* verification." Every row in this list checks a COMPONENT; none checked a LINK.
|
|
41
41
|
*/
|
|
42
42
|
readonly AGENT_LINK: "agent link";
|
|
43
|
+
/** Is the APP in this folder wired, not just the tools. Printed by `doctor-project-line.ts`. */
|
|
44
|
+
readonly PROJECT: "project";
|
|
43
45
|
/**
|
|
44
46
|
* Which of `localhost`'s two answers reaches the bridge, printed only when they disagree.
|
|
45
47
|
*
|
|
@@ -58,6 +60,10 @@ export declare const DoctorRow: {
|
|
|
58
60
|
readonly DAEMON_LOG: "daemon log";
|
|
59
61
|
readonly TRACING: "tracing";
|
|
60
62
|
readonly DESKTOP: "desktop";
|
|
63
|
+
/** What Reticle sees in each connected app, out of eight capabilities. Only with a live tab. */
|
|
64
|
+
readonly COVERAGE: "coverage";
|
|
65
|
+
/** A project folder holding runs the platform never got. Only when there is one. */
|
|
66
|
+
readonly UNSYNCED: "unsynced";
|
|
61
67
|
};
|
|
62
68
|
type DoctorRowLabel = (typeof DoctorRow)[keyof typeof DoctorRow];
|
|
63
69
|
export declare const DOCTOR_ROW_LABELS: readonly DoctorRowLabel[];
|
|
@@ -40,6 +40,8 @@ export const DoctorRow = {
|
|
|
40
40
|
* verification." Every row in this list checks a COMPONENT; none checked a LINK.
|
|
41
41
|
*/
|
|
42
42
|
AGENT_LINK: 'agent link',
|
|
43
|
+
/** Is the APP in this folder wired, not just the tools. Printed by `doctor-project-line.ts`. */
|
|
44
|
+
PROJECT: 'project',
|
|
43
45
|
/**
|
|
44
46
|
* Which of `localhost`'s two answers reaches the bridge, printed only when they disagree.
|
|
45
47
|
*
|
|
@@ -58,6 +60,10 @@ export const DoctorRow = {
|
|
|
58
60
|
DAEMON_LOG: 'daemon log',
|
|
59
61
|
TRACING: 'tracing',
|
|
60
62
|
DESKTOP: 'desktop',
|
|
63
|
+
/** What Reticle sees in each connected app, out of eight capabilities. Only with a live tab. */
|
|
64
|
+
COVERAGE: 'coverage',
|
|
65
|
+
/** A project folder holding runs the platform never got. Only when there is one. */
|
|
66
|
+
UNSYNCED: 'unsynced',
|
|
61
67
|
};
|
|
62
68
|
export const DOCTOR_ROW_LABELS = Object.values(DoctorRow);
|
|
63
69
|
/** Indent every row carries, before the label. */
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** What `codesign -dv` says about one binary. */
|
|
2
|
+
export interface Signature {
|
|
3
|
+
/** Ad-hoc signed, or not signed at all: no identity the keychain can recognise. */
|
|
4
|
+
adhoc: boolean;
|
|
5
|
+
identifier?: string;
|
|
6
|
+
teamId?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const KEYCHAIN_NOTE: string;
|
|
9
|
+
/** `codesign -dv` output (it writes to stderr), or undefined when it said nothing usable. */
|
|
10
|
+
export declare function parseCodesign(output: string): Signature | undefined;
|
|
11
|
+
/** The note, when the build is unsigned, ad-hoc, or signed by another team than the installed app. */
|
|
12
|
+
export declare function signingNote(build: Signature | undefined, installed: Signature | undefined): string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* The dev binary `tauri dev` runs, the release builds `tauri build` leaves (the bundle first), and
|
|
15
|
+
* where an installed copy of the same app would be.
|
|
16
|
+
*/
|
|
17
|
+
export declare function tauriDevBinary(read: (path: string) => string | undefined): {
|
|
18
|
+
build: string;
|
|
19
|
+
release: string[];
|
|
20
|
+
installed?: string;
|
|
21
|
+
} | undefined;
|
|
22
|
+
/** How to look at a project, injected so the decision is a unit test. */
|
|
23
|
+
export interface SigningProbe {
|
|
24
|
+
read: (relative: string) => string | undefined;
|
|
25
|
+
codesign?: (path: string) => Signature | undefined;
|
|
26
|
+
platform?: NodeJS.Platform;
|
|
27
|
+
/** The project folder the dev build's relative path is under. */
|
|
28
|
+
dir?: string;
|
|
29
|
+
}
|
|
30
|
+
/** On macOS, the keychain note for the Tauri build Reticle drives, when it applies. */
|
|
31
|
+
export declare function keychainNoteFor(probe: SigningProbe): string | undefined;
|
|
32
|
+
/** A project folder's files, read relative to it. */
|
|
33
|
+
export declare const projectReader: (dir: string) => (relative: string) => string | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* The note for an agent session's first answer, then never again for that session: the person
|
|
36
|
+
* flooded with password dialogs is talking to the agent, and may never run doctor.
|
|
37
|
+
*/
|
|
38
|
+
export declare function keychainNoticeOnce(attach: string, probe: SigningProbe): string | undefined;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether macOS will ask for the keychain password every time the app Reticle drives reads it.
|
|
3
|
+
*
|
|
4
|
+
* Reported from the field: a signed macOS Tauri app driven by Reticle flooded its user with password
|
|
5
|
+
* dialogs. Reticle never touches the keychain; macOS binds each keychain item to the signature of
|
|
6
|
+
* the app that saved it, and the build Reticle runs (`tauri dev`, ad-hoc signed) is another app to
|
|
7
|
+
* the keychain. Read from `codesign -dv`, through an injected runner, so the parsing is a unit test.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
10
|
+
import { spawnSync } from 'node:child_process';
|
|
11
|
+
import { isAbsolute, join, posix } from 'node:path';
|
|
12
|
+
export const KEYCHAIN_NOTE = "macOS ties keychain items to the app's signature; this build is signed differently, so the " +
|
|
13
|
+
"app's keychain reads will ask for your password. Set your release identity " +
|
|
14
|
+
'(APPLE_SIGNING_IDENTITY, or signingIdentity in tauri.conf.json) and `reticle setup` signs the ' +
|
|
15
|
+
'dev build it starts with it; or use a separate keychain service in dev.';
|
|
16
|
+
const NOT_SIGNED = 'code object is not signed at all';
|
|
17
|
+
const NO_TEAM = 'not set';
|
|
18
|
+
/** `codesign -dv` output (it writes to stderr), or undefined when it said nothing usable. */
|
|
19
|
+
export function parseCodesign(output) {
|
|
20
|
+
if (output.includes(NOT_SIGNED))
|
|
21
|
+
return { adhoc: true };
|
|
22
|
+
const field = (key) => new RegExp(`^${key}=(.+)$`, 'm').exec(output)?.[1]?.trim();
|
|
23
|
+
const identifier = field('Identifier');
|
|
24
|
+
if (identifier === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
const team = field('TeamIdentifier');
|
|
27
|
+
return {
|
|
28
|
+
adhoc: 'adhoc' === field('Signature'),
|
|
29
|
+
identifier,
|
|
30
|
+
...(team === undefined || NO_TEAM === team ? {} : { teamId: team }),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** The note, when the build is unsigned, ad-hoc, or signed by another team than the installed app. */
|
|
34
|
+
export function signingNote(build, installed) {
|
|
35
|
+
if (build === undefined)
|
|
36
|
+
return undefined;
|
|
37
|
+
if (build.adhoc)
|
|
38
|
+
return KEYCHAIN_NOTE;
|
|
39
|
+
if (installed !== undefined && installed.teamId !== build.teamId)
|
|
40
|
+
return KEYCHAIN_NOTE;
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The dev binary `tauri dev` runs, the release builds `tauri build` leaves (the bundle first), and
|
|
45
|
+
* where an installed copy of the same app would be.
|
|
46
|
+
*/
|
|
47
|
+
export function tauriDevBinary(read) {
|
|
48
|
+
const cargo = read('src-tauri/Cargo.toml');
|
|
49
|
+
const name = cargo === undefined ? undefined : /^name\s*=\s*"([^"]+)"/m.exec(cargo)?.[1];
|
|
50
|
+
if (name === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
let product;
|
|
53
|
+
try {
|
|
54
|
+
product = JSON.parse(read('src-tauri/tauri.conf.json') ?? '{}')['productName'];
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
product = undefined;
|
|
58
|
+
}
|
|
59
|
+
const named = 'string' === typeof product && 0 < product.length ? product : undefined;
|
|
60
|
+
return {
|
|
61
|
+
build: `src-tauri/target/debug/${name}`,
|
|
62
|
+
release: [
|
|
63
|
+
...(named === undefined ? [] : [`src-tauri/target/release/bundle/macos/${named}.app`]),
|
|
64
|
+
`src-tauri/target/release/${name}`,
|
|
65
|
+
],
|
|
66
|
+
...(named === undefined ? {} : { installed: `/Applications/${named}.app` }),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** `codesign -dv` of one path, as it prints it (to stderr). Undefined when nothing ran. */
|
|
70
|
+
function codesignOf(path) {
|
|
71
|
+
if (!existsSync(path))
|
|
72
|
+
return undefined;
|
|
73
|
+
const run = spawnSync('codesign', ['-dv', '--verbose=2', path], { encoding: 'utf8' });
|
|
74
|
+
return parseCodesign(`${run.stdout}${run.stderr}`);
|
|
75
|
+
}
|
|
76
|
+
/** On macOS, the keychain note for the Tauri build Reticle drives, when it applies. */
|
|
77
|
+
export function keychainNoteFor(probe) {
|
|
78
|
+
if ('darwin' !== (probe.platform ?? process.platform))
|
|
79
|
+
return undefined;
|
|
80
|
+
const app = tauriDevBinary(probe.read);
|
|
81
|
+
if (app === undefined)
|
|
82
|
+
return undefined;
|
|
83
|
+
const codesign = probe.codesign ?? codesignOf;
|
|
84
|
+
const installed = app.installed === undefined ? undefined : codesign(app.installed);
|
|
85
|
+
// Every build on disk, debug and release: a person with only a release build heard nothing.
|
|
86
|
+
for (const build of [app.build, ...app.release]) {
|
|
87
|
+
// macOS only, so a POSIX path on every host the unit test runs on.
|
|
88
|
+
const note = signingNote(codesign(posix.join(probe.dir ?? process.cwd(), build)), installed);
|
|
89
|
+
if (note !== undefined)
|
|
90
|
+
return note;
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
/** A project folder's files, read relative to it. */
|
|
95
|
+
export const projectReader = (dir) => (relative) => {
|
|
96
|
+
try {
|
|
97
|
+
return readFileSync(isAbsolute(relative) ? relative : join(dir, relative), 'utf8');
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
// ponytail: grows by one id per agent connection the daemon ever served; bound it if that matters.
|
|
104
|
+
const noticed = new Set();
|
|
105
|
+
/**
|
|
106
|
+
* The note for an agent session's first answer, then never again for that session: the person
|
|
107
|
+
* flooded with password dialogs is talking to the agent, and may never run doctor.
|
|
108
|
+
*/
|
|
109
|
+
export function keychainNoticeOnce(attach, probe) {
|
|
110
|
+
if (noticed.has(attach))
|
|
111
|
+
return undefined;
|
|
112
|
+
noticed.add(attach);
|
|
113
|
+
return keychainNoteFor(probe);
|
|
114
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The `broken` list of a regression report, or undefined when the report has none. */
|
|
2
|
+
export declare function brokenOf(report: unknown): unknown[] | undefined;
|
|
3
|
+
/** What the platform said about regressions: the broken list, or that it refused the credential. */
|
|
4
|
+
export interface KnownRegression {
|
|
5
|
+
broken?: unknown[];
|
|
6
|
+
/** The platform refused this project's key: said, and the gate fails closed on it. */
|
|
7
|
+
refused?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Nothing when `reticleRoot` is not linked or the platform did not answer (offline is not a failure);
|
|
11
|
+
* `refused` when it answered and refused the key — a revoked key left CI green and silent.
|
|
12
|
+
*/
|
|
13
|
+
export declare function knownRegression(reticleRoot: string): Promise<KnownRegression>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The flows the linked project's platform says passed before and are broken now — what
|
|
3
|
+
* `reticle runs regression` prints, read here so `reticle gate` can fail on it too.
|
|
4
|
+
*
|
|
5
|
+
* Its own module, not a call into `cloud-cli.ts`: the gate is on the library's import path, and the
|
|
6
|
+
* cloud CLI reaches the install-time surface the library must never load.
|
|
7
|
+
*/
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { resolveProjectCloud } from '../../memory/cloud/cloud-config.js';
|
|
11
|
+
import { createNodeFileSystem } from '../../memory/project/fs/fs-port.js';
|
|
12
|
+
import { CredentialRefusedError, api } from './cloud-kit.js';
|
|
13
|
+
const REGRESSION_PATH = '/v1/project/regression';
|
|
14
|
+
/** The `broken` list of a regression report, or undefined when the report has none. */
|
|
15
|
+
export function brokenOf(report) {
|
|
16
|
+
const parsed = z.object({ broken: z.array(z.unknown()) }).safeParse(report);
|
|
17
|
+
return parsed.success ? parsed.data.broken : undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Nothing when `reticleRoot` is not linked or the platform did not answer (offline is not a failure);
|
|
21
|
+
* `refused` when it answered and refused the key — a revoked key left CI green and silent.
|
|
22
|
+
*/
|
|
23
|
+
export async function knownRegression(reticleRoot) {
|
|
24
|
+
try {
|
|
25
|
+
const cloud = await resolveProjectCloud(createNodeFileSystem(), reticleRoot, homedir(), process.env);
|
|
26
|
+
if (null === cloud.config)
|
|
27
|
+
return {};
|
|
28
|
+
const broken = brokenOf(await api('GET', `${cloud.config.url}${REGRESSION_PATH}`, cloud.config.apiKey));
|
|
29
|
+
return broken === undefined ? {} : { broken };
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return error instanceof CredentialRefusedError ? { refused: error.message } : {};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -36,6 +36,12 @@ export declare function installedSdkVersion(projectDir: string, readFile: (path:
|
|
|
36
36
|
export declare function readTextFile(path: string): string | undefined;
|
|
37
37
|
/** The one line a person sees on stderr when the CLI hands over — stdout belongs to the protocol. */
|
|
38
38
|
export declare function versionMatchNote(sdkVersion: string, cliVersion: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* The line `--help` opens with when the command it describes would run at another version (#1378).
|
|
41
|
+
* Help stays on this binary, so without it the flags listed are this release's, and the re-run
|
|
42
|
+
* rejected the ones its older release never had, as an unknown parameter.
|
|
43
|
+
*/
|
|
44
|
+
export declare function helpVersionNote(sdkVersion: string, cliVersion: string): string;
|
|
39
45
|
export interface VersionMatchInput {
|
|
40
46
|
argv: readonly string[];
|
|
41
47
|
cliVersion: string;
|
|
@@ -48,6 +54,12 @@ export interface VersionMatchInput {
|
|
|
48
54
|
* environment are handed in.
|
|
49
55
|
*/
|
|
50
56
|
export declare function versionToMatch(input: VersionMatchInput): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* The version the command asked about with `--help`, or `help <command>`, would actually run at.
|
|
59
|
+
* Undefined when help was not asked for, or when that command runs on this binary. Pure, like
|
|
60
|
+
* `versionToMatch`: it asks that same question about the command with the help request removed.
|
|
61
|
+
*/
|
|
62
|
+
export declare function helpRunsAt(input: VersionMatchInput): string | undefined;
|
|
51
63
|
/** How to launch `npx --yes @reticlehq/server@<version> <args>` on this platform. */
|
|
52
64
|
export declare function npxInvocation(version: string, args: readonly string[], on: string): {
|
|
53
65
|
file: string;
|
|
@@ -58,6 +58,8 @@ const KEEP_COMMANDS = new Set([
|
|
|
58
58
|
'_daemon',
|
|
59
59
|
]);
|
|
60
60
|
const KEEP_FLAGS = new Set(['--version', '-v', '--help', '-h']);
|
|
61
|
+
const HELP_COMMAND = 'help';
|
|
62
|
+
const HELP_FLAGS = new Set(['--help', '-h']);
|
|
61
63
|
const SETUP_COMMAND = 'setup';
|
|
62
64
|
const SETUP_INSTALL = 'install';
|
|
63
65
|
/** A published release — not `workspace:*`, a link, or a tag npx could not pin. */
|
|
@@ -105,6 +107,17 @@ export function versionMatchNote(sdkVersion, cliVersion) {
|
|
|
105
107
|
return (`This project's Reticle SDK is ${sdkVersion}; running ${SERVER_PACKAGE}@${sdkVersion} to match ` +
|
|
106
108
|
`(this CLI is ${cliVersion}, a different major). Set ${VersionMatchEnv.OPT_OUT}=1 to keep this one.`);
|
|
107
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* The line `--help` opens with when the command it describes would run at another version (#1378).
|
|
112
|
+
* Help stays on this binary, so without it the flags listed are this release's, and the re-run
|
|
113
|
+
* rejected the ones its older release never had, as an unknown parameter.
|
|
114
|
+
*/
|
|
115
|
+
export function helpVersionNote(sdkVersion, cliVersion) {
|
|
116
|
+
return (`This help describes ${SERVER_PACKAGE} ${cliVersion}, but in this project the command runs at ` +
|
|
117
|
+
`${SERVER_PACKAGE}@${sdkVersion} to match its SDK, which may not take every flag listed here. ` +
|
|
118
|
+
`Run npx ${SERVER_PACKAGE}@${sdkVersion} <command> --help for that version's help, or set ` +
|
|
119
|
+
`${VersionMatchEnv.OPT_OUT}=1 to run this one.`);
|
|
120
|
+
}
|
|
108
121
|
/** Did the person name a version on the npx line (`npx @reticlehq/server@<version> …`)? */
|
|
109
122
|
function pinnedOnNpxLine(spec) {
|
|
110
123
|
if (spec === undefined || !spec.startsWith(`${SERVER_PACKAGE}@`))
|
|
@@ -141,6 +154,18 @@ export function versionToMatch(input) {
|
|
|
141
154
|
return undefined;
|
|
142
155
|
return sdkMajor === majorOf(input.cliVersion) ? undefined : sdk;
|
|
143
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* The version the command asked about with `--help`, or `help <command>`, would actually run at.
|
|
159
|
+
* Undefined when help was not asked for, or when that command runs on this binary. Pure, like
|
|
160
|
+
* `versionToMatch`: it asks that same question about the command with the help request removed.
|
|
161
|
+
*/
|
|
162
|
+
export function helpRunsAt(input) {
|
|
163
|
+
const viaCommand = HELP_COMMAND === input.argv[0];
|
|
164
|
+
if (!viaCommand && !input.argv.some((arg) => HELP_FLAGS.has(arg)))
|
|
165
|
+
return undefined;
|
|
166
|
+
const asked = (viaCommand ? input.argv.slice(1) : input.argv).filter((arg) => !HELP_FLAGS.has(arg));
|
|
167
|
+
return versionToMatch({ ...input, argv: asked });
|
|
168
|
+
}
|
|
144
169
|
/** How to launch `npx --yes @reticlehq/server@<version> <args>` on this platform. */
|
|
145
170
|
export function npxInvocation(version, args, on) {
|
|
146
171
|
const argv = [NPX_YES, `${SERVER_PACKAGE}@${version}`, ...args];
|
|
@@ -121,8 +121,17 @@ export function handleStop(port, quiet) {
|
|
|
121
121
|
const pid = readPid(port);
|
|
122
122
|
if (null === pid || !isAlive(pid)) {
|
|
123
123
|
removePid(port);
|
|
124
|
-
|
|
125
|
-
|
|
124
|
+
// No pid on record is not "not running": a daemon whose pid file vanished still answers its
|
|
125
|
+
// port, and `kill` finds the listener and confirms it is Reticle's before signalling it.
|
|
126
|
+
void fetchStatus(port).then(async (status) => {
|
|
127
|
+
if (status !== undefined) {
|
|
128
|
+
if (!(await runKill(port, false)))
|
|
129
|
+
process.exit(1);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (!quiet)
|
|
133
|
+
log('reticle_daemon_not_running', { port });
|
|
134
|
+
});
|
|
126
135
|
return;
|
|
127
136
|
}
|
|
128
137
|
process.kill(pid, 'SIGTERM');
|
|
@@ -7,6 +7,12 @@
|
|
|
7
7
|
* talks to for the rest of its life — and the port resolution at the top is the fix for agents on
|
|
8
8
|
* different projects silently sharing one daemon, one identity and one blast radius.
|
|
9
9
|
*/
|
|
10
|
+
/**
|
|
11
|
+
* Whether the daemon this proxy starts hides its browser. A daemon on a port nobody chose — the
|
|
12
|
+
* requested one served another project, so this one was moved — was opening a visible browser the
|
|
13
|
+
* person never asked for, on a port nothing records. Only the requested port gets the default.
|
|
14
|
+
*/
|
|
15
|
+
export declare function spawnsHeadless(headless: boolean, requested: number, resolved: number): boolean;
|
|
10
16
|
/**
|
|
11
17
|
* MCP proxy mode: ensures the daemon is running, then bridges Claude Code's
|
|
12
18
|
* stdin/stdout to the daemon's SSE endpoint. This is the recommended way to
|
|
@@ -12,8 +12,8 @@ import { isAlive, spawnDaemon, reticleStateHome } from '../daemon/daemon.js';
|
|
|
12
12
|
import { PortPresence, probePresence, presenceIsUsable, describePresence, } from '../daemon/binding/port-presence.js';
|
|
13
13
|
import { waitForDaemon, startMcpProxy, probeDaemon, proxyLog, setProxyLogPort, } from '../../surface/mcp/mcp-proxy.js';
|
|
14
14
|
import { installProxyResilience } from '../daemon/daemon-resilience.js';
|
|
15
|
-
import { readProjectId } from './ports/resolve/cli-port.js';
|
|
16
|
-
import { resolveMcpPort, daemonProjectAt } from '../daemon/daemon-resolve.js';
|
|
15
|
+
import { readProjectId, readProjectPort } from './ports/resolve/cli-port.js';
|
|
16
|
+
import { resolveMcpPort, daemonProjectAt, relocationReason, } from '../daemon/daemon-resolve.js';
|
|
17
17
|
import { daemonSpawnArgs } from './daemon-start-options.js';
|
|
18
18
|
import { WakeAction, decideWake } from '../daemon/wake-decision.js';
|
|
19
19
|
import { pickDaemonPortToBind } from '../daemon/binding/free-port.js';
|
|
@@ -23,6 +23,14 @@ import { ReticleEnv } from '@reticlehq/core';
|
|
|
23
23
|
import { agentIo } from '../setup/agent-io.js';
|
|
24
24
|
import { SERVER_VERSION } from '../version/identity/server-version.js';
|
|
25
25
|
import { homedir } from 'node:os';
|
|
26
|
+
/**
|
|
27
|
+
* Whether the daemon this proxy starts hides its browser. A daemon on a port nobody chose — the
|
|
28
|
+
* requested one served another project, so this one was moved — was opening a visible browser the
|
|
29
|
+
* person never asked for, on a port nothing records. Only the requested port gets the default.
|
|
30
|
+
*/
|
|
31
|
+
export function spawnsHeadless(headless, requested, resolved) {
|
|
32
|
+
return headless || requested !== resolved;
|
|
33
|
+
}
|
|
26
34
|
/**
|
|
27
35
|
* MCP proxy mode: ensures the daemon is running, then bridges Claude Code's
|
|
28
36
|
* stdin/stdout to the daemon's SSE endpoint. This is the recommended way to
|
|
@@ -64,12 +72,12 @@ export async function handleMcp(opts) {
|
|
|
64
72
|
alive: isAlive,
|
|
65
73
|
daemonPresent: async (p) => presenceIsUsable(await probePresence(p, { tcpOpen: probeDaemon, status: fetchStatus })),
|
|
66
74
|
pickPort: (p) => pickDaemonPortToBind(p),
|
|
67
|
-
});
|
|
75
|
+
}, readProjectPort(process.cwd()));
|
|
68
76
|
if (port !== opts.port) {
|
|
69
77
|
log('reticle_mcp_port_relocated', {
|
|
70
78
|
requested: opts.port,
|
|
71
79
|
port,
|
|
72
|
-
reason:
|
|
80
|
+
reason: relocationReason(opts.port, port, projectId, reticleStateHome(), isAlive),
|
|
73
81
|
});
|
|
74
82
|
}
|
|
75
83
|
// The proxy IS the MCP server the editor launched. Nothing respawns it, so an uncaught throw here
|
|
@@ -119,7 +127,7 @@ export async function handleMcp(opts) {
|
|
|
119
127
|
}
|
|
120
128
|
const daemonArgs = daemonSpawnArgs({
|
|
121
129
|
port,
|
|
122
|
-
headless,
|
|
130
|
+
headless: spawnsHeadless(headless, opts.port, port),
|
|
123
131
|
http,
|
|
124
132
|
...(driveUrl !== undefined ? { driveUrl } : {}),
|
|
125
133
|
...(httpPort !== undefined ? { httpPort } : {}),
|
|
@@ -83,7 +83,7 @@ ourPid) {
|
|
|
83
83
|
// Naming the command matters more than naming the process. "Stop that process" describes an
|
|
84
84
|
// outcome and leaves the reader to invent a route to it, and the route they invent is the `-ti`
|
|
85
85
|
// pipeline that takes their agent's proxy down with the holder.
|
|
86
|
-
const tail = 'a daemon cannot bind it. Free it with `reticle
|
|
86
|
+
const tail = 'a daemon cannot bind it. Free it with `reticle restart --force` (it signals the listener only, ' +
|
|
87
87
|
"never the agent's mcp proxy), or run Reticle on a different port (`--port`), then retry.";
|
|
88
88
|
if (null === holder) {
|
|
89
89
|
/**
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* A repo already knows its name: the directory it lives in. That is not a guess, it is the name its
|
|
12
12
|
* owner chose and the one they will look for in a project list.
|
|
13
13
|
*/
|
|
14
|
+
import { z } from 'zod';
|
|
14
15
|
/** The id used when a directory name yields nothing usable — the historical behaviour, unchanged. */
|
|
15
16
|
export declare const DEFAULT_PROJECT_ID = "default";
|
|
16
17
|
/**
|
|
@@ -27,4 +28,31 @@ export declare const slugifyProjectName: (raw: string) => string;
|
|
|
27
28
|
* do to rotate a key or repoint an environment — must land in that same project or the history
|
|
28
29
|
* silently splits in two, which is worse than the shared-bucket problem this fixes.
|
|
29
30
|
*/
|
|
30
|
-
export declare const defaultProjectFor: (cwdBasename: string, existingProjectId: string | undefined
|
|
31
|
+
export declare const defaultProjectFor: (cwdBasename: string, existingProjectId: string | undefined,
|
|
32
|
+
/** The `projectId` `init` wrote into `.reticle.json`, when there is one. */
|
|
33
|
+
localProjectId?: string) => string;
|
|
34
|
+
export declare const CreatedProjectSchema: z.ZodObject<{
|
|
35
|
+
projectId: z.ZodString;
|
|
36
|
+
name: z.ZodString;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
name: string;
|
|
39
|
+
projectId: string;
|
|
40
|
+
}, {
|
|
41
|
+
name: string;
|
|
42
|
+
projectId: string;
|
|
43
|
+
}>;
|
|
44
|
+
/** ` in workspace "<name>"`, or nothing when no name is known. */
|
|
45
|
+
export declare const inWorkspace: (name: string | undefined) => string;
|
|
46
|
+
/**
|
|
47
|
+
* Which repository, and which folder in it, a project folder is: a hash of the `origin` remote and
|
|
48
|
+
* the folder's path inside the checkout, so every clone of one app agrees and two different apps
|
|
49
|
+
* both named `web` do not. Undefined outside git or with no remote. Neither leaves the machine.
|
|
50
|
+
*/
|
|
51
|
+
export declare function repoIdentity(dir: string): string | undefined;
|
|
52
|
+
export declare function resolveProjectId(url: string, token: string, wanted: string, workspace?: string, repo?: string,
|
|
53
|
+
/**
|
|
54
|
+
* The id `init` wrote into `.reticle.json`, for a project created by default: the platform is
|
|
55
|
+
* asked to keep it, so the folder and the dashboard name one project by one id. A platform that
|
|
56
|
+
* does not know the field ignores it and answers with its own, which is what gets linked.
|
|
57
|
+
*/
|
|
58
|
+
localId?: string): Promise<string>;
|