@reticlehq/server 3.8.2 → 3.10.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/LICENSE +201 -104
- package/NOTICE +5 -0
- package/README.md +1 -1
- package/SKILL.md +13 -12
- package/bin/launch.js +13 -0
- package/bin/package.json +3 -0
- package/bin/reticle.js +66 -8
- package/dist/chromium-launch-options.d.ts +25 -0
- package/dist/chromium-launch-options.js +21 -1
- package/dist/command/cli/adhoc-suite.js +2 -0
- package/dist/command/cli/adhoc-verdict.d.ts +2 -43
- package/dist/command/cli/adhoc-verdict.js +50 -160
- package/dist/command/cli/answers/gate-exit.d.ts +6 -2
- package/dist/command/cli/answers/gate-exit.js +12 -2
- package/dist/command/cli/answers/mcp-connection-hint.d.ts +2 -0
- package/dist/command/cli/answers/mcp-connection-hint.js +6 -0
- package/dist/command/cli/ci-hint.d.ts +44 -0
- package/dist/command/cli/ci-hint.js +72 -0
- package/dist/command/cli/cli-doctor.d.ts +6 -1
- package/dist/command/cli/cli-doctor.js +46 -5
- package/dist/command/cli/cli-flow-commands.d.ts +7 -1
- package/dist/command/cli/cli-flow-commands.js +39 -24
- package/dist/command/cli/cli-kill.d.ts +21 -0
- package/dist/command/cli/cli-kill.js +47 -4
- package/dist/command/cli/cli-parse-compare.d.ts +22 -0
- package/dist/command/cli/cli-parse-compare.js +75 -0
- package/dist/command/cli/cli-parse-grade.d.ts +36 -0
- package/dist/command/cli/cli-parse-grade.js +75 -0
- package/dist/command/cli/cli-parse-grammar.d.ts +2 -0
- package/dist/command/cli/cli-parse-grammar.js +18 -20
- package/dist/command/cli/cli-parse-verify.d.ts +10 -0
- package/dist/command/cli/cli-parse-verify.js +63 -14
- package/dist/command/cli/cli-parse.d.ts +22 -17
- package/dist/command/cli/cli-parse.js +54 -32
- package/dist/command/cli/cli-update-commands.d.ts +1 -1
- package/dist/command/cli/cli-update-commands.js +29 -20
- package/dist/command/cli/cli-usage.js +61 -31
- package/dist/command/cli/cli-verify.d.ts +17 -3
- package/dist/command/cli/cli-verify.js +59 -21
- package/dist/command/cli/cloud-cli.js +2 -119
- package/dist/command/cli/daemon-link/daemon-client.d.ts +45 -0
- package/dist/command/cli/daemon-link/daemon-client.js +205 -0
- package/dist/command/cli/doctor/browser/chromium-hint.d.ts +6 -1
- package/dist/command/cli/doctor/browser/chromium-hint.js +11 -5
- package/dist/command/cli/doctor/doctor-daemon-line.js +6 -3
- package/dist/command/cli/doctor/doctor-fix.d.ts +44 -0
- package/dist/command/cli/doctor/doctor-fix.js +89 -0
- package/dist/command/cli/doctor/doctor-launcher-line.d.ts +23 -0
- package/dist/command/cli/doctor/doctor-launcher-line.js +60 -0
- package/dist/command/cli/doctor/doctor-rows.d.ts +4 -0
- package/dist/command/cli/doctor/doctor-rows.js +4 -0
- package/dist/command/cli/doctor-repairs.d.ts +64 -0
- package/dist/command/cli/doctor-repairs.js +214 -0
- package/dist/command/cli/drive/drive-command.js +3 -7
- package/dist/command/cli/ensure-daemon.d.ts +26 -0
- package/dist/command/cli/ensure-daemon.js +57 -0
- package/dist/command/cli/finished-run/grade-command.d.ts +23 -0
- package/dist/command/cli/finished-run/grade-command.js +180 -0
- package/dist/command/cli/first-use-checks.d.ts +41 -0
- package/dist/command/cli/first-use-checks.js +127 -0
- package/dist/command/cli/first-verdict-node.d.ts +3 -0
- package/dist/command/cli/first-verdict-node.js +189 -0
- package/dist/command/cli/first-verdict.d.ts +126 -0
- package/dist/command/cli/first-verdict.js +267 -0
- package/dist/command/cli/launch/sdk-version-match.d.ts +3 -2
- package/dist/command/cli/launch/sdk-version-match.js +3 -2
- package/dist/command/cli/lifecycle/daemon-lifecycle.d.ts +1 -1
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +7 -6
- package/dist/command/cli/mcp-command.js +13 -4
- package/dist/command/cli/ports/port-holder.d.ts +11 -0
- package/dist/command/cli/ports/port-holder.js +36 -4
- package/dist/command/cli/setup-mcp-cli.d.ts +27 -1
- package/dist/command/cli/setup-mcp-cli.js +98 -23
- package/dist/command/cli/status/status-lines.d.ts +2 -0
- package/dist/command/cli/status/status-lines.js +72 -17
- package/dist/command/cli/status-fields.d.ts +5 -1
- package/dist/command/cli/status-fields.js +24 -6
- package/dist/command/cli/try-command.d.ts +7 -0
- package/dist/command/cli/try-command.js +11 -3
- package/dist/command/cli/two-builds/compare-command.d.ts +48 -0
- package/dist/command/cli/two-builds/compare-command.js +314 -0
- package/dist/command/cli/verify-against.d.ts +61 -0
- package/dist/command/cli/verify-against.js +187 -0
- package/dist/command/cli/verify-no-session.d.ts +2 -0
- package/dist/command/cli/verify-no-session.js +13 -0
- package/dist/command/cli/verify-results.d.ts +35 -2
- package/dist/command/cli/verify-results.js +76 -10
- package/dist/command/cli.js +112 -70
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +3 -1
- package/dist/command/daemon/binding/daemon-status-probe.js +4 -2
- package/dist/command/daemon/daemon-argv.d.ts +9 -0
- package/dist/command/daemon/daemon-argv.js +11 -0
- package/dist/command/daemon/daemon-resolve.d.ts +8 -1
- package/dist/command/daemon/daemon-resolve.js +27 -1
- package/dist/command/daemon/daemon.d.ts +22 -4
- package/dist/command/daemon/daemon.js +52 -10
- package/dist/command/daemon/lifetime/daemon-exit.d.ts +24 -0
- package/dist/command/daemon/lifetime/daemon-exit.js +39 -0
- package/dist/command/daemon/lifetime/death-cause.d.ts +15 -0
- package/dist/command/daemon/lifetime/death-cause.js +149 -0
- package/dist/command/daemon/lifetime/heartbeat.d.ts +7 -15
- package/dist/command/daemon/lifetime/heartbeat.js +11 -15
- package/dist/command/daemon/lifetime/startup-failure.d.ts +29 -0
- package/dist/command/daemon/lifetime/startup-failure.js +62 -0
- package/dist/command/daemon/port-state.d.ts +14 -0
- package/dist/command/daemon/port-state.js +31 -0
- package/dist/command/setup/agent-configs.d.ts +2 -0
- package/dist/command/setup/agent-configs.js +42 -15
- package/dist/command/setup/agent-next-steps.d.ts +77 -0
- package/dist/command/setup/agent-next-steps.js +284 -0
- package/dist/command/setup/agent-writer.js +11 -6
- package/dist/command/setup/bringup/dev-server-files.d.ts +9 -0
- package/dist/command/setup/bringup/dev-server-files.js +17 -0
- package/dist/command/setup/bringup/static-page-server.d.ts +14 -2
- package/dist/command/setup/bringup/static-page-server.js +43 -9
- package/dist/command/setup/init/init-host.js +2 -0
- package/dist/command/setup/init/init-runtime.d.ts +6 -1
- package/dist/command/setup/init/init-runtime.js +63 -21
- package/dist/command/setup/mcp-launcher.d.ts +3 -0
- package/dist/command/setup/mcp-launcher.js +11 -0
- package/dist/command/setup/node-effects.d.ts +3 -2
- package/dist/command/setup/node-effects.js +9 -3
- package/dist/command/setup/remaining-steps.d.ts +8 -0
- package/dist/command/setup/remaining-steps.js +10 -0
- package/dist/command/setup/run-setup.d.ts +2 -0
- package/dist/command/setup/run-setup.js +9 -1
- package/dist/command/setup/setup-command.js +36 -15
- package/dist/command/setup/setup-mcp.d.ts +8 -0
- package/dist/command/setup/setup-mcp.js +47 -20
- package/dist/command/setup/start-dev-server.d.ts +8 -0
- package/dist/command/setup/start-dev-server.js +43 -0
- package/dist/command/update/updater.js +6 -0
- package/dist/command/version/identity/server-version.d.ts +2 -0
- package/dist/command/version/identity/server-version.js +2 -0
- package/dist/command/version/version-skew.d.ts +7 -0
- package/dist/command/version/version-skew.js +14 -3
- package/dist/features/compare/action-plan.d.ts +260 -0
- package/dist/features/compare/action-plan.js +543 -0
- package/dist/features/compare/behaviour-compare.d.ts +24 -0
- package/dist/features/compare/behaviour-compare.js +85 -0
- package/dist/features/compare/behaviour-diff.d.ts +97 -0
- package/dist/features/compare/behaviour-diff.js +202 -0
- package/dist/features/compare/behaviour-report.d.ts +40 -0
- package/dist/features/compare/behaviour-report.js +128 -0
- package/dist/features/compare/build-readings.d.ts +106 -0
- package/dist/features/compare/build-readings.js +250 -0
- package/dist/features/compare/compare-diff.d.ts +62 -0
- package/dist/features/compare/compare-diff.js +177 -0
- package/dist/features/compare/compare-report-html.d.ts +6 -0
- package/dist/features/compare/compare-report-html.js +102 -0
- package/dist/features/compare/compare-report.d.ts +15 -0
- package/dist/features/compare/compare-report.js +73 -0
- package/dist/features/compare/compare-run.d.ts +60 -0
- package/dist/features/compare/compare-run.js +123 -0
- package/dist/features/compare/outside/effect-lines.d.ts +26 -0
- package/dist/features/compare/outside/effect-lines.js +103 -0
- package/dist/features/compare/outside/state-sources.d.ts +76 -0
- package/dist/features/compare/outside/state-sources.js +164 -0
- package/dist/features/compare/outside/value-dictionary.d.ts +51 -0
- package/dist/features/compare/outside/value-dictionary.js +227 -0
- package/dist/features/compare/visible-content.d.ts +20 -0
- package/dist/features/compare/visible-content.js +125 -0
- package/dist/features/crawl/crawl-empty.js +2 -1
- package/dist/features/crawl/crawl-exhaustive.d.ts +55 -0
- package/dist/features/crawl/crawl-exhaustive.js +138 -0
- package/dist/features/crawl/crawl-tools.d.ts +9 -2
- package/dist/features/crawl/crawl-tools.js +28 -12
- package/dist/features/crawl/crawl.d.ts +8 -9
- package/dist/features/crawl/crawl.js +61 -65
- package/dist/features/exhaust/app-coverage.d.ts +5 -1
- package/dist/features/exhaust/app-coverage.js +3 -1
- package/dist/features/exhaust/code-coverage.js +8 -4
- package/dist/features/exhaust/edge-cases.d.ts +133 -0
- package/dist/features/exhaust/edge-cases.js +310 -0
- package/dist/features/exhaust/edges/edge-drive.d.ts +42 -0
- package/dist/features/exhaust/edges/edge-drive.js +364 -0
- package/dist/features/exhaust/edges/edge-run.d.ts +59 -0
- package/dist/features/exhaust/edges/edge-run.js +169 -0
- package/dist/features/exhaust/explorer.d.ts +87 -14
- package/dist/features/exhaust/explorer.js +159 -25
- package/dist/features/exhaust/failure-branches.d.ts +5 -0
- package/dist/features/exhaust/failure-branches.js +29 -11
- package/dist/features/exhaust/invariants.d.ts +112 -0
- package/dist/features/exhaust/invariants.js +188 -0
- package/dist/features/exhaust/ledger.d.ts +68 -0
- package/dist/features/exhaust/ledger.js +121 -13
- package/dist/features/exhaust/session-fold.d.ts +10 -0
- package/dist/features/exhaust/session-fold.js +46 -3
- package/dist/features/exhaust/session-port.d.ts +3 -1
- package/dist/features/exhaust/session-port.js +97 -28
- package/dist/features/grade/grade-answer.d.ts +99 -0
- package/dist/features/grade/grade-answer.js +112 -0
- package/dist/features/grade/grade-noise.d.ts +27 -0
- package/dist/features/grade/grade-noise.js +55 -0
- package/dist/features/grade/grade-renumber.d.ts +12 -0
- package/dist/features/grade/grade-renumber.js +86 -0
- package/dist/features/grade/grade-state.d.ts +50 -0
- package/dist/features/grade/grade-state.js +93 -0
- package/dist/features/grade/grade-suggest.d.ts +33 -0
- package/dist/features/grade/grade-suggest.js +98 -0
- package/dist/features/license/license.d.ts +11 -71
- package/dist/features/license/license.js +43 -136
- package/dist/features/visual/desktop-capture.d.ts +33 -0
- package/dist/features/visual/desktop-capture.js +94 -0
- package/dist/features/visual/step-shots.js +139 -35
- package/dist/features/visual/visual-tools.d.ts +0 -18
- package/dist/features/visual/visual-tools.js +67 -99
- package/dist/import-graph.js +5 -6
- package/dist/index.d.ts +3 -1
- package/dist/index.js +19 -7
- package/dist/judgement/capsule/causal-summary.js +9 -2
- package/dist/judgement/runs/artifact/replay-mapping.d.ts +13 -1
- package/dist/judgement/runs/artifact/replay-mapping.js +1 -1
- package/dist/judgement/runs/reticle-runner.js +16 -2
- package/dist/judgement/runs/run-ledger.d.ts +7 -5
- package/dist/judgement/runs/run-ledger.js +98 -69
- package/dist/judgement/runs/runner-port.d.ts +2 -0
- package/dist/judgement/runs/runner-port.js +23 -5
- package/dist/judgement/runs/verification-sync.d.ts +6 -3
- package/dist/judgement/runs/verification-sync.js +21 -10
- package/dist/language/flows/affected-tools.d.ts +1 -1
- package/dist/language/flows/affected-tools.js +49 -30
- package/dist/language/flows/change/git-changed.d.ts +2 -1
- package/dist/language/flows/change/git-changed.js +19 -2
- package/dist/language/flows/fields/flow-secret-field.d.ts +1 -13
- package/dist/language/flows/fields/flow-secret-field.js +77 -21
- package/dist/language/flows/flow-anchor.d.ts +60 -2
- package/dist/language/flows/flow-anchor.js +125 -20
- package/dist/language/flows/flow-classify.d.ts +20 -0
- package/dist/language/flows/flow-classify.js +90 -12
- package/dist/language/flows/flow-cross-step.d.ts +7 -1
- package/dist/language/flows/flow-cross-step.js +25 -1
- package/dist/language/flows/flow-journey.d.ts +38 -4
- package/dist/language/flows/flow-journey.js +138 -8
- package/dist/language/flows/flow-replay-run.d.ts +0 -16
- package/dist/language/flows/flow-replay-run.js +76 -14
- package/dist/language/flows/flow-replay-types.d.ts +4 -2
- package/dist/language/flows/flow-replay.d.ts +19 -1
- package/dist/language/flows/flow-replay.js +169 -52
- package/dist/language/flows/flow-replayable.js +7 -1
- package/dist/language/flows/flow-start-path.d.ts +34 -5
- package/dist/language/flows/flow-start-path.js +202 -15
- package/dist/language/flows/flow-step-runners.d.ts +14 -13
- package/dist/language/flows/flow-step-runners.js +184 -109
- package/dist/language/flows/flow-store-for-session.d.ts +26 -25
- package/dist/language/flows/flow-store-for-session.js +51 -5
- package/dist/language/flows/flow-tools.js +46 -33
- package/dist/language/flows/flows.js +176 -76
- package/dist/language/flows/recording/tape/recordings.d.ts +21 -16
- package/dist/language/flows/recording/tape/recordings.js +112 -49
- package/dist/language/flows/replay.d.ts +36 -12
- package/dist/language/flows/replay.js +193 -50
- package/dist/language/flows/steps/page-steps.d.ts +68 -0
- package/dist/language/flows/steps/page-steps.js +198 -0
- package/dist/language/flows/suite/sequential-run.d.ts +68 -0
- package/dist/language/flows/suite/sequential-run.js +96 -0
- package/dist/language/flows/verify-change-tools.js +26 -15
- package/dist/launch-chromium.d.ts +1 -0
- package/dist/launch-chromium.js +49 -12
- package/dist/memory/cloud/background-sync.d.ts +13 -0
- package/dist/memory/cloud/background-sync.js +24 -3
- package/dist/memory/cloud/sync-daemon.js +26 -27
- package/dist/memory/cloud/sync-screenshots.js +6 -1
- package/dist/memory/journal/attach-journal.js +2 -1
- package/dist/memory/journal/drive-flow.d.ts +7 -0
- package/dist/memory/journal/drive-flow.js +44 -13
- package/dist/memory/journal/journal-recorder.d.ts +4 -2
- package/dist/memory/journal/session-journal.d.ts +7 -0
- package/dist/memory/journal/session-journal.js +58 -10
- package/dist/memory/project/root-claims.d.ts +9 -0
- package/dist/memory/project/root-claims.js +9 -4
- package/dist/portal/bridge/bridge.d.ts +13 -4
- package/dist/portal/bridge/bridge.js +10 -9
- package/dist/portal/input/download-capture.d.ts +7 -0
- package/dist/portal/input/download-capture.js +92 -0
- package/dist/portal/input/network-detail.d.ts +6 -0
- package/dist/portal/input/network-detail.js +12 -1
- package/dist/portal/input/network-mock-tools.js +49 -13
- package/dist/portal/input/network-mock.d.ts +8 -0
- package/dist/portal/input/network-mock.js +30 -10
- package/dist/portal/input/page-capture.d.ts +24 -0
- package/dist/portal/input/page-capture.js +33 -0
- package/dist/portal/input/real-input.d.ts +35 -18
- package/dist/portal/input/real-input.js +99 -33
- package/dist/portal/input/viewport-tools.d.ts +8 -0
- package/dist/portal/input/viewport-tools.js +81 -21
- package/dist/portal/pool/browser-pool.d.ts +16 -30
- package/dist/portal/pool/browser-pool.js +64 -52
- package/dist/portal/pool/context-permissions.d.ts +34 -17
- package/dist/portal/pool/context-permissions.js +94 -1
- package/dist/portal/pool/csp-widen.d.ts +62 -0
- package/dist/portal/pool/csp-widen.js +132 -0
- package/dist/portal/pool/determinism.d.ts +52 -0
- package/dist/portal/pool/determinism.js +259 -0
- package/dist/portal/pool/lease-emulation.d.ts +34 -1
- package/dist/portal/pool/lease-emulation.js +18 -0
- package/dist/portal/pool/lease-marker-stamp.d.ts +6 -0
- package/dist/portal/pool/lease-marker-stamp.js +15 -1
- package/dist/portal/pool/lease-page-error.d.ts +56 -0
- package/dist/portal/pool/lease-page-error.js +160 -0
- package/dist/portal/pool/page-error-journal.d.ts +63 -0
- package/dist/portal/pool/page-error-journal.js +208 -0
- package/dist/portal/pool/playwright-launcher.js +71 -15
- package/dist/portal/pool/pool-contract.d.ts +49 -1
- package/dist/portal/pool/pool-lease.d.ts +70 -2
- package/dist/portal/pool/pool-lease.js +23 -0
- package/dist/portal/pool/zero-install.d.ts +8 -0
- package/dist/portal/pool/zero-install.js +91 -1
- package/dist/portal/session/dev-server/dev-command.d.ts +11 -2
- package/dist/portal/session/dev-server/dev-command.js +110 -16
- package/dist/portal/session/dev-server/dev-server-probe.d.ts +7 -0
- package/dist/portal/session/dev-server/dev-server-probe.js +9 -0
- package/dist/portal/session/dev-server/project-ports.d.ts +21 -0
- package/dist/portal/session/dev-server/project-ports.js +62 -0
- package/dist/portal/session/facts/departed-network.d.ts +66 -0
- package/dist/portal/session/facts/departed-network.js +142 -0
- package/dist/portal/session/no-session-diagnosis.d.ts +9 -0
- package/dist/portal/session/no-session-diagnosis.js +76 -27
- package/dist/portal/session/no-session-next-action.d.ts +14 -0
- package/dist/portal/session/no-session-next-action.js +56 -7
- package/dist/portal/session/no-session-watch.d.ts +6 -0
- package/dist/portal/session/no-session-watch.js +41 -4
- package/dist/portal/session/page-commands/undeclared-command.d.ts +9 -3
- package/dist/portal/session/page-commands/undeclared-command.js +16 -7
- package/dist/portal/session/recorded-gaps.d.ts +1 -1
- package/dist/portal/session/recorded-gaps.js +5 -2
- package/dist/portal/session/serving-directory.d.ts +10 -0
- package/dist/portal/session/serving-directory.js +39 -8
- package/dist/portal/session/session-manager.d.ts +10 -0
- package/dist/portal/session/session-manager.js +211 -81
- package/dist/portal/session/session.js +4 -3
- package/dist/portal/session/zero-install-first-call.d.ts +20 -1
- package/dist/portal/session/zero-install-first-call.js +34 -2
- package/dist/start-wiring.d.ts +30 -2
- package/dist/start-wiring.js +74 -9
- package/dist/surface/mcp/mcp-proxy.js +10 -2
- package/dist/surface/mcp/mcp.js +8 -5
- package/dist/surface/mcp/peer/agents-connected.d.ts +6 -0
- package/dist/surface/mcp/peer/agents-connected.js +58 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.js +17 -5
- package/dist/surface/mcp/shared-params.d.ts +2 -0
- package/dist/surface/mcp/shared-params.js +31 -0
- package/dist/surface/tools/act/act-observation.d.ts +40 -2
- package/dist/surface/tools/act/act-observation.js +118 -12
- package/dist/surface/tools/act/act-preflight.js +38 -18
- package/dist/surface/tools/act/act-sequence-retry.d.ts +23 -2
- package/dist/surface/tools/act/act-sequence-retry.js +61 -5
- package/dist/surface/tools/act/act-target.js +3 -1
- package/dist/surface/tools/act/after-match.d.ts +10 -0
- package/dist/surface/tools/act/after-match.js +40 -0
- package/dist/surface/tools/act/already-true.js +1 -1
- package/dist/surface/tools/act/navigation/reload-result.d.ts +12 -1
- package/dist/surface/tools/act/navigation/reload-result.js +25 -2
- package/dist/surface/tools/act/resolve-target.d.ts +17 -1
- package/dist/surface/tools/act/resolve-target.js +59 -9
- package/dist/surface/tools/act/sequence-grade.d.ts +15 -1
- package/dist/surface/tools/act/sequence-grade.js +45 -27
- package/dist/surface/tools/act/settle-in-flight.js +27 -15
- package/dist/surface/tools/act-command.d.ts +23 -0
- package/dist/surface/tools/act-command.js +50 -0
- package/dist/surface/tools/act-sequence-tool.js +81 -50
- package/dist/surface/tools/act-tools.d.ts +1 -13
- package/dist/surface/tools/act-tools.js +83 -95
- package/dist/surface/tools/agent/build-staleness.d.ts +1 -1
- package/dist/surface/tools/agent/build-staleness.js +1 -1
- package/dist/surface/tools/assert/assert-verdict.js +18 -12
- package/dist/surface/tools/browser-tools.js +87 -13
- package/dist/surface/tools/compare-tools.d.ts +11 -0
- package/dist/surface/tools/compare-tools.js +94 -0
- package/dist/surface/tools/coverage-tools.js +1 -1
- package/dist/surface/tools/dynamic-tools.js +11 -3
- package/dist/surface/tools/empty-session-list.d.ts +2 -0
- package/dist/surface/tools/empty-session-list.js +4 -2
- package/dist/surface/tools/error-recovery.d.ts +12 -1
- package/dist/surface/tools/error-recovery.js +131 -40
- package/dist/surface/tools/explore-tools.js +1 -1
- package/dist/surface/tools/invoke-tool.js +29 -21
- package/dist/surface/tools/lease-coverage-tools.d.ts +49 -0
- package/dist/surface/tools/lease-coverage-tools.js +128 -0
- package/dist/surface/tools/lease-hint.d.ts +42 -1
- package/dist/surface/tools/lease-hint.js +52 -3
- package/dist/surface/tools/lease-readiness.d.ts +47 -0
- package/dist/surface/tools/lease-readiness.js +126 -0
- package/dist/surface/tools/lease-seed.d.ts +16 -1
- package/dist/surface/tools/lease-seed.js +37 -4
- package/dist/surface/tools/lease-tools.d.ts +3 -41
- package/dist/surface/tools/lease-tools.js +104 -124
- package/dist/surface/tools/lease-url-identity.d.ts +46 -0
- package/dist/surface/tools/lease-url-identity.js +97 -0
- package/dist/surface/tools/merge-tools.js +99 -2
- package/dist/surface/tools/merged-name-redirect.js +5 -1
- package/dist/surface/tools/observe-tools.js +15 -9
- package/dist/surface/tools/read/console-pre-attach.d.ts +19 -0
- package/dist/surface/tools/read/console-pre-attach.js +23 -0
- package/dist/surface/tools/read-tools.js +33 -30
- package/dist/surface/tools/real-input-attempt.d.ts +0 -8
- package/dist/surface/tools/real-input-attempt.js +143 -28
- package/dist/surface/tools/repeat-hint.d.ts +40 -0
- package/dist/surface/tools/repeat-hint.js +171 -0
- package/dist/surface/tools/run-report.d.ts +2 -2
- package/dist/surface/tools/run-report.js +27 -15
- package/dist/surface/tools/session-ports.d.ts +14 -0
- package/dist/surface/tools/session-ports.js +53 -0
- package/dist/surface/tools/tool-kit.d.ts +18 -0
- package/dist/surface/tools/tool-kit.js +9 -3
- package/dist/surface/tools/tool-surface.js +0 -1
- package/dist/surface/tools/tools.js +54 -18
- package/dist/surface/tools/type-spelling.d.ts +13 -0
- package/dist/surface/tools/type-spelling.js +36 -0
- package/dist/telemetry/agent-client.d.ts +6 -0
- package/dist/telemetry/agent-client.js +10 -0
- package/dist/telemetry/argument-shape.js +17 -7
- package/dist/telemetry/cli-telemetry.d.ts +10 -1
- package/dist/telemetry/cli-telemetry.js +15 -0
- package/dist/telemetry/init-telemetry.d.ts +2 -1
- package/dist/telemetry/init-telemetry.js +47 -2
- package/dist/telemetry/install-trace.js +23 -4
- package/dist/telemetry/onboarding-funnel.d.ts +19 -2
- package/dist/telemetry/onboarding-funnel.js +25 -3
- package/dist/telemetry/proxy-telemetry.d.ts +2 -1
- package/dist/telemetry/proxy-telemetry.js +2 -2
- package/dist/telemetry/session-metrics.d.ts +1 -1
- package/dist/telemetry/session-metrics.js +67 -27
- package/dist/telemetry/telemetry.d.ts +3 -1
- package/dist/telemetry/telemetry.js +60 -28
- package/dist/telemetry/tool-refused.d.ts +6 -3
- package/dist/telemetry/tool-refused.js +15 -3
- package/docs/actions.mdx +3 -3
- package/docs/agent-cheatsheet.md +1 -1
- package/docs/architecture.md +3 -6
- package/docs/capabilities.mdx +61 -1
- package/docs/cli/affected.mdx +9 -7
- package/docs/cli/cloud.mdx +3 -3
- package/docs/cli/compare.mdx +94 -0
- package/docs/cli/doctor.mdx +41 -2
- package/docs/cli/grade.mdx +97 -0
- package/docs/cli/help.mdx +4 -2
- package/docs/cli/license.mdx +13 -12
- package/docs/cli/restart.mdx +7 -5
- package/docs/cli/rollback.mdx +5 -5
- package/docs/cli/setup.mdx +13 -2
- package/docs/cli/status.mdx +4 -0
- package/docs/cli/stop.mdx +3 -3
- package/docs/cli/update.mdx +2 -2
- package/docs/cli/verify.mdx +23 -1
- package/docs/cli.mdx +34 -24
- package/docs/deploy-checks.md +25 -0
- package/docs/desktop.mdx +1 -1
- package/docs/enterprise.md +17 -22
- package/docs/environment.mdx +1 -0
- package/docs/first-drive.md +1 -1
- package/docs/flows.md +11 -1
- package/docs/frameworks.mdx +9 -9
- package/docs/getting-started.md +1 -1
- package/docs/install-manual.mdx +16 -1
- package/docs/license-activation.mdx +3 -3
- package/docs/packages/engine.mdx +1 -1
- package/docs/packages/server.mdx +1 -1
- package/docs/packages/tauri.mdx +1 -1
- package/docs/packages/test.mdx +1 -1
- package/docs/packages.mdx +1 -1
- package/docs/platform-integration.md +1 -1
- package/docs/predicates.mdx +1 -1
- package/docs/quickstart.mdx +68 -49
- package/docs/skill-setup.md +1 -1
- package/docs/skill.md +14 -13
- package/docs/telemetry.md +6 -4
- package/docs/tools/navigate.mdx +1 -1
- package/docs/tools/verify.mdx +4 -1
- package/docs/troubleshooting.mdx +1 -1
- package/docs/usage.md +17 -14
- package/package.json +18 -14
- package/LICENSE-ENTERPRISE +0 -37
- package/dist/features/ee/audit-log.d.ts +0 -14
- package/dist/features/ee/audit-log.js +0 -11
- package/dist/features/exhaust/exhaust-run.d.ts +0 -33
- package/dist/features/exhaust/exhaust-run.js +0 -82
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { chmodSync, existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
9
|
import { homedir } from 'node:os';
|
|
10
10
|
import { join } from 'node:path';
|
|
11
|
+
import { mcpLauncher } from './mcp-launcher.js';
|
|
11
12
|
import { planAgentConfigs, platformKey } from './agent-configs.js';
|
|
12
13
|
import { AppShape, describeShape, readShape } from './desktop-shape.js';
|
|
13
14
|
import { devConfigText, expectedDevPort, loneLoopbackOnDevPort, pinnedDevPort, } from './probe/dev-port.js';
|
|
@@ -25,7 +26,7 @@ import { spawnSync } from 'node:child_process';
|
|
|
25
26
|
import { isAlive, reticleStateHome } from '../daemon/daemon.js';
|
|
26
27
|
import { readDevServers } from '../daemon/dev-servers.js';
|
|
27
28
|
import { connectedAppUrl, urlOfExistingApp } from './probe/existing-app.js';
|
|
28
|
-
import { handedOverUrl, stopHandedOver } from './bringup/dev-server-files.js';
|
|
29
|
+
import { handedOverToOtherPort, handedOverUrl, stopHandedOver, } from './bringup/dev-server-files.js';
|
|
29
30
|
import { listSessions, OwnedDevServer, probePage } from './node-effects.js';
|
|
30
31
|
import { fetchStatus } from '../daemon/binding/daemon-status-probe.js';
|
|
31
32
|
import { daemonSkew, summarizeStatus } from '../cli/launch/cli-launch.js';
|
|
@@ -73,8 +74,9 @@ export function installCrashGuard() {
|
|
|
73
74
|
function hasElectronDependency(dir) {
|
|
74
75
|
try {
|
|
75
76
|
const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'));
|
|
76
|
-
if ('object' !== typeof pkg || null === pkg)
|
|
77
|
+
if ('object' !== typeof pkg || null === pkg) {
|
|
77
78
|
return false;
|
|
79
|
+
}
|
|
78
80
|
const p = pkg;
|
|
79
81
|
return undefined !== { ...p.dependencies, ...p.devDependencies }['electron'];
|
|
80
82
|
}
|
|
@@ -95,7 +97,13 @@ const agentWord = (n) => (1 === n ? 'agent' : 'agents');
|
|
|
95
97
|
export function registerOtherAgents(print) {
|
|
96
98
|
const platform = platformKey(process.platform);
|
|
97
99
|
const home = homedir();
|
|
98
|
-
const results = applyAgentPlan(planAgentConfigs({
|
|
100
|
+
const results = applyAgentPlan(planAgentConfigs({
|
|
101
|
+
home,
|
|
102
|
+
platform,
|
|
103
|
+
exists: agentIo.exists,
|
|
104
|
+
readFile: agentIo.readFile,
|
|
105
|
+
launcher: mcpLauncher(),
|
|
106
|
+
}), agentIo);
|
|
99
107
|
const wrote = results.filter((r) => 'created' === r.action || 'merged' === r.action);
|
|
100
108
|
if (0 < wrote.length) {
|
|
101
109
|
print(` ✓ ${String(wrote.length)} more ${agentWord(wrote.length)}: ${wrote.map((r) => r.name).join(', ')}`);
|
|
@@ -115,8 +123,9 @@ export function registerOtherAgents(print) {
|
|
|
115
123
|
}
|
|
116
124
|
rememberSaid(stateHome, fresh.map((n) => noticeKey(n)));
|
|
117
125
|
const skills = applyAgentSkills(agentIo, { home, platform });
|
|
118
|
-
if (0 < skills.length)
|
|
126
|
+
if (0 < skills.length) {
|
|
119
127
|
print(` ✓ the /reticle skill, for ${String(skills.length)} ${agentWord(skills.length)}`);
|
|
128
|
+
}
|
|
120
129
|
// Registration alone still leaves an Accept dialog in front of every call, and a verification run
|
|
121
130
|
// makes dozens of them: the loop is only autonomous once the tools are pre-approved.
|
|
122
131
|
const approvals = grantAutoApproval(agentIo, { home, platform });
|
|
@@ -173,8 +182,9 @@ async function restartHandedOverServer(appDir) {
|
|
|
173
182
|
*/
|
|
174
183
|
async function afterConnect(input, url, sessionId, outcome, print) {
|
|
175
184
|
const notes = [...outcome.notes];
|
|
176
|
-
if (input.firstFlow === undefined)
|
|
185
|
+
if (input.firstFlow === undefined) {
|
|
177
186
|
return { flowSaved: false, notes };
|
|
187
|
+
}
|
|
178
188
|
const { flowSaved } = await input.firstFlow({
|
|
179
189
|
appDir: input.appDir,
|
|
180
190
|
bridgePort: input.bridgePort,
|
|
@@ -192,8 +202,9 @@ async function afterConnect(input, url, sessionId, outcome, print) {
|
|
|
192
202
|
return { flowSaved, notes };
|
|
193
203
|
}
|
|
194
204
|
export async function runSetupCommand(input, print) {
|
|
195
|
-
if (input.registerAgents)
|
|
205
|
+
if (input.registerAgents) {
|
|
196
206
|
registerOtherAgents(print);
|
|
207
|
+
}
|
|
197
208
|
// A moved port first: this project's daemon on the OLD port would otherwise be the one the page
|
|
198
209
|
// finds and dials, while everything below waits on the new one.
|
|
199
210
|
const retired = await retireMovedDaemons(readProjectId(input.appDir), input.bridgePort, nodeRetireDeps());
|
|
@@ -203,14 +214,18 @@ export async function runSetupCommand(input, print) {
|
|
|
203
214
|
}
|
|
204
215
|
// And the dev server a previous init left running, which may have read the old port once at
|
|
205
216
|
// startup (Next does) — so the attach below would keep a page dialling the daemon just stopped.
|
|
206
|
-
|
|
217
|
+
// Its record names the port it was started for, so this works when the old daemon is gone too.
|
|
218
|
+
const movedUnderServer = 0 < retired.length ||
|
|
219
|
+
handedOverToOtherPort(reticleStateHome(), input.appDir, input.bridgePort, { alive: isAlive });
|
|
220
|
+
if (movedUnderServer && (await restartHandedOverServer(input.appDir))) {
|
|
207
221
|
print(`stopped the dev server a previous init started, so it restarts on port ${String(input.bridgePort)}.`);
|
|
208
222
|
}
|
|
209
223
|
// Before the app is booted, because the app's whole job from here is to dial this port. Without
|
|
210
224
|
// it the phases wait out their budget and then report the SDK as the thing that failed.
|
|
211
225
|
const daemon = await ensureDaemon(input.bridgePort, nodeEnsureDaemonDeps((status) => undefined !== daemonSkew(status)));
|
|
212
|
-
if (undefined !== daemon.message)
|
|
226
|
+
if (undefined !== daemon.message) {
|
|
213
227
|
print(daemon.message);
|
|
228
|
+
}
|
|
214
229
|
if (EnsureDaemon.SKEWED_IN_USE === daemon.state) {
|
|
215
230
|
// Stop here: every hello from the page would be refused, and waiting out the connect budget
|
|
216
231
|
// only to blame the page is the run this exists to prevent.
|
|
@@ -235,8 +250,9 @@ export async function runSetupCommand(input, print) {
|
|
|
235
250
|
hasTauriConf: existsSync(join(input.appDir, 'src-tauri', 'tauri.conf.json')),
|
|
236
251
|
hasElectronDep: hasElectronDependency(input.appDir),
|
|
237
252
|
});
|
|
238
|
-
if (AppShape.WEB !== shape)
|
|
253
|
+
if (AppShape.WEB !== shape) {
|
|
239
254
|
print(`detected ${describeShape(shape)}`);
|
|
255
|
+
}
|
|
240
256
|
const server = new OwnedDevServer();
|
|
241
257
|
const effects = {
|
|
242
258
|
startDevServer: (command, cwd) => {
|
|
@@ -261,8 +277,9 @@ export async function runSetupCommand(input, print) {
|
|
|
261
277
|
},
|
|
262
278
|
})
|
|
263
279
|
: {};
|
|
264
|
-
if (SigningEnv.IDENTITY in signing)
|
|
280
|
+
if (SigningEnv.IDENTITY in signing) {
|
|
265
281
|
print(`signing the dev build as ${String(signing[SigningEnv.IDENTITY])}, so macOS does not ask for the keychain password`);
|
|
282
|
+
}
|
|
266
283
|
server.start(command, cwd, { ...input.env, ...signing });
|
|
267
284
|
return Promise.resolve();
|
|
268
285
|
},
|
|
@@ -288,8 +305,9 @@ export async function runSetupCommand(input, print) {
|
|
|
288
305
|
probePage,
|
|
289
306
|
openBrowser: async (url) => {
|
|
290
307
|
const failure = await openInBrowser(url);
|
|
291
|
-
if (null === failure)
|
|
308
|
+
if (null === failure) {
|
|
292
309
|
return undefined;
|
|
310
|
+
}
|
|
293
311
|
// It used to end "nothing else here will open one", which stopped being true once a
|
|
294
312
|
// Reticle-owned browser could always launch: run-setup opens a lease on this failure, so the
|
|
295
313
|
// reader is told what happens next rather than sent to find a browser by hand.
|
|
@@ -310,8 +328,9 @@ export async function runSetupCommand(input, print) {
|
|
|
310
328
|
// A daemon too old to report the short one falls back to the long one, because saying the
|
|
311
329
|
// right thing at length beats saying nothing.
|
|
312
330
|
const lead = status.whyLead ?? full;
|
|
313
|
-
if (undefined === lead)
|
|
331
|
+
if (undefined === lead) {
|
|
314
332
|
return undefined;
|
|
333
|
+
}
|
|
315
334
|
return undefined === full ? { lead } : { lead, full };
|
|
316
335
|
},
|
|
317
336
|
now: () => Date.now(),
|
|
@@ -348,15 +367,17 @@ export async function runSetupCommand(input, print) {
|
|
|
348
367
|
}, effects);
|
|
349
368
|
// The app stays up only when there is something worth watching.
|
|
350
369
|
if (outcome.ok) {
|
|
351
|
-
server.handOver(outcome.url);
|
|
370
|
+
server.handOver(outcome.url, input.bridgePort);
|
|
352
371
|
// Its output is on a file now, not this terminal, so say where: a compile error that used to
|
|
353
372
|
// scroll past here is the first thing somebody will look for.
|
|
354
373
|
const log = server.logPath();
|
|
355
|
-
if (undefined !== log)
|
|
374
|
+
if (undefined !== log) {
|
|
356
375
|
print(`The dev server keeps running; its output goes to ${log}`);
|
|
376
|
+
}
|
|
357
377
|
}
|
|
358
|
-
if (!outcome.ok || undefined === outcome.url || undefined === outcome.sessionId)
|
|
378
|
+
if (!outcome.ok || undefined === outcome.url || undefined === outcome.sessionId) {
|
|
359
379
|
return outcome;
|
|
380
|
+
}
|
|
360
381
|
return {
|
|
361
382
|
...outcome,
|
|
362
383
|
...(await afterConnect(input, outcome.url, outcome.sessionId, outcome, print)),
|
|
@@ -17,6 +17,8 @@ export interface SetupMcpIo {
|
|
|
17
17
|
writeFile(path: string, contents: string): void;
|
|
18
18
|
homeDir(): string;
|
|
19
19
|
print(line: string): void;
|
|
20
|
+
/** The installed bin to register (`InitHost.mcpLauncher`). Absent: the pinned npx command. */
|
|
21
|
+
readonly launcher?: string | undefined;
|
|
20
22
|
/** Register with a client that owns its own registration (Claude Code). Returns whether it took. */
|
|
21
23
|
runCli(command: string, args: readonly string[]): boolean;
|
|
22
24
|
/**
|
|
@@ -46,6 +48,12 @@ export interface SetupMcpResult {
|
|
|
46
48
|
* and a pre-seeded `~/.codex/config.toml`; the file came back byte-identical both times.
|
|
47
49
|
*/
|
|
48
50
|
readonly manual: readonly ManualClient[];
|
|
51
|
+
/** Clients whose Reticle plugin brings the server, so nothing was registered for them. */
|
|
52
|
+
readonly pluginActive: readonly string[];
|
|
53
|
+
/** Clients with the plugin AND a user-scope `reticle` entry: two servers. Named, never removed. */
|
|
54
|
+
readonly duplicates: readonly string[];
|
|
55
|
+
/** Clients whose `reticle` entry is the floating npx form. Named with the fix, never replaced. */
|
|
56
|
+
readonly stale: readonly string[];
|
|
49
57
|
}
|
|
50
58
|
/** A client the caller has to tell somebody about, with the two facts they need to act. */
|
|
51
59
|
export interface ManualClient {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { McpClient, MCP_CLIENTS, claudeAddCommand, claudeAvailableProbe, claudeHasReticle, codexAddCommand, codexAvailableProbe, codexNamesOurServer, detectMcpClients, mergeClientConfig, clientSpec, ClientMergeStatus, } from '@reticlehq/init';
|
|
2
|
-
import { OnboardingPhase, OnboardingStepStatus, } from '@reticlehq/core/telemetry';
|
|
1
|
+
import { McpClient, MCP_CLIENTS, claudeAddCommand, claudeAvailableProbe, claudeHasReticle, claudePluginInstalled, claudeUserEntryIsFloating, codexAddCommand, codexAvailableProbe, codexNamesOurServer, detectMcpClients, mergeClientConfig, clientSpec, ClientMergeStatus, } from '@reticlehq/init';
|
|
2
|
+
import { OnboardingPhase, OnboardingStepStatus, OnboardingStop, } from '@reticlehq/core/telemetry';
|
|
3
3
|
/**
|
|
4
4
|
* Codex registers through `codex mcp add`, which does the TOML editing we refuse to do (#1238).
|
|
5
5
|
* `undefined` when that does not apply, and the caller reports a hand edit exactly as before: not
|
|
@@ -12,9 +12,10 @@ function registerWithCodexCli(io, client, serversKey) {
|
|
|
12
12
|
return undefined;
|
|
13
13
|
}
|
|
14
14
|
const probe = codexAvailableProbe();
|
|
15
|
-
if (!io.runCli(probe.command, probe.args))
|
|
15
|
+
if (!io.runCli(probe.command, probe.args)) {
|
|
16
16
|
return undefined;
|
|
17
|
-
|
|
17
|
+
}
|
|
18
|
+
const cmd = codexAddCommand(io.launcher);
|
|
18
19
|
return io.runCli(cmd.command, cmd.args);
|
|
19
20
|
}
|
|
20
21
|
export function setupMcp(io) {
|
|
@@ -23,6 +24,9 @@ export function setupMcp(io) {
|
|
|
23
24
|
const alreadyThere = [];
|
|
24
25
|
const failed = [];
|
|
25
26
|
const manual = [];
|
|
27
|
+
const pluginActive = [];
|
|
28
|
+
const duplicates = [];
|
|
29
|
+
const stale = [];
|
|
26
30
|
/*
|
|
27
31
|
* Claude Code first, because nothing else can find it.
|
|
28
32
|
*
|
|
@@ -41,21 +45,34 @@ export function setupMcp(io) {
|
|
|
41
45
|
if (io.runCli(available.command, available.args)) {
|
|
42
46
|
detected.push(McpClient.CLAUDE_CODE);
|
|
43
47
|
// Read from Claude's config: `claude mcp get` health-checks by launching the server.
|
|
44
|
-
|
|
48
|
+
const hasEntry = claudeHasReticle(io, undefined);
|
|
49
|
+
if (claudePluginInstalled(io)) {
|
|
50
|
+
// The plugin brings its own server. A user-scope entry next to it is a second one.
|
|
51
|
+
pluginActive.push(McpClient.CLAUDE_CODE);
|
|
52
|
+
if (hasEntry) {
|
|
53
|
+
duplicates.push(McpClient.CLAUDE_CODE);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else if (hasEntry) {
|
|
45
57
|
alreadyThere.push(McpClient.CLAUDE_CODE);
|
|
58
|
+
if (claudeUserEntryIsFloating(io)) {
|
|
59
|
+
stale.push(McpClient.CLAUDE_CODE);
|
|
60
|
+
}
|
|
46
61
|
}
|
|
47
62
|
else {
|
|
48
|
-
const cmd = claudeAddCommand();
|
|
49
|
-
if (io.runCli(cmd.command, cmd.args))
|
|
63
|
+
const cmd = claudeAddCommand(io.launcher);
|
|
64
|
+
if (io.runCli(cmd.command, cmd.args)) {
|
|
50
65
|
registered.push(McpClient.CLAUDE_CODE);
|
|
51
|
-
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
52
68
|
failed.push(McpClient.CLAUDE_CODE);
|
|
69
|
+
}
|
|
53
70
|
}
|
|
54
71
|
}
|
|
55
72
|
for (const client of detectMcpClients(io)) {
|
|
56
73
|
detected.push(client.id);
|
|
57
74
|
const spec = clientSpec(client.id);
|
|
58
|
-
const merged = mergeClientConfig(spec, client.existing);
|
|
75
|
+
const merged = mergeClientConfig(spec, client.existing, io.launcher);
|
|
59
76
|
if (ClientMergeStatus.ALREADY === merged.status) {
|
|
60
77
|
alreadyThere.push(client.id);
|
|
61
78
|
continue;
|
|
@@ -65,12 +82,15 @@ export function setupMcp(io) {
|
|
|
65
82
|
// sends somebody to an agent that has no Reticle tools in it.
|
|
66
83
|
if (ClientMergeStatus.MANUAL === merged.status) {
|
|
67
84
|
const viaCli = registerWithCodexCli(io, client, spec.serversKey);
|
|
68
|
-
if (true === viaCli)
|
|
85
|
+
if (true === viaCli) {
|
|
69
86
|
registered.push(client.id);
|
|
70
|
-
|
|
87
|
+
}
|
|
88
|
+
else if (false === viaCli) {
|
|
71
89
|
failed.push(client.id);
|
|
72
|
-
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
73
92
|
manual.push({ id: client.id, configPath: client.configPath, docs: spec.docs });
|
|
93
|
+
}
|
|
74
94
|
continue;
|
|
75
95
|
}
|
|
76
96
|
try {
|
|
@@ -93,6 +113,7 @@ export function setupMcp(io) {
|
|
|
93
113
|
step: 'agents_detected',
|
|
94
114
|
status: OnboardingStepStatus.COMPLETED,
|
|
95
115
|
});
|
|
116
|
+
const mcpStatus = mcpRegisteredStatus(detected.length, registered.length, alreadyThere.length + pluginActive.length);
|
|
96
117
|
io.reportStep({
|
|
97
118
|
phase: OnboardingPhase.INSTALL,
|
|
98
119
|
step: 'mcp_registered',
|
|
@@ -107,15 +128,21 @@ export function setupMcp(io) {
|
|
|
107
128
|
* for. Registering some and not others is still COMPLETED: the agent they are using may well be
|
|
108
129
|
* one that worked, and a partial win is not a failed step.
|
|
109
130
|
*/
|
|
110
|
-
status:
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
: 0 === registered.length && 0 === alreadyThere.length
|
|
115
|
-
? OnboardingStepStatus.FAILED
|
|
116
|
-
: OnboardingStepStatus.COMPLETED,
|
|
131
|
+
status: mcpStatus,
|
|
132
|
+
...(OnboardingStepStatus.FAILED === mcpStatus
|
|
133
|
+
? { stop: OnboardingStop.MCP_NOT_REGISTERED }
|
|
134
|
+
: {}),
|
|
117
135
|
});
|
|
118
|
-
return { detected, registered, alreadyThere, failed, manual };
|
|
136
|
+
return { detected, registered, alreadyThere, failed, manual, pluginActive, duplicates, stale };
|
|
137
|
+
}
|
|
138
|
+
function mcpRegisteredStatus(detected, registered, alreadyThere) {
|
|
139
|
+
if (0 === detected || (0 === registered && 0 < alreadyThere)) {
|
|
140
|
+
return OnboardingStepStatus.SKIPPED;
|
|
141
|
+
}
|
|
142
|
+
if (0 === registered) {
|
|
143
|
+
return OnboardingStepStatus.FAILED;
|
|
144
|
+
}
|
|
145
|
+
return OnboardingStepStatus.COMPLETED;
|
|
119
146
|
}
|
|
120
147
|
/** Everything this machine could be asked about, for the report when nothing was found. */
|
|
121
148
|
export function knownClientLabels() {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The url it serves and how to stop it, or why it did not serve. */
|
|
2
|
+
export type StartedDevServer = {
|
|
3
|
+
url: string;
|
|
4
|
+
stop: () => void;
|
|
5
|
+
} | {
|
|
6
|
+
failed: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function startDevServerAndWait(command: string, dir: string, budgetMs: number): Promise<StartedDevServer>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Start a project's dev script and wait until it serves a page, for a command that is not `init`.
|
|
3
|
+
*
|
|
4
|
+
* The same pieces `init` uses: the supervised `OwnedDevServer`, the URL it announces or the port its
|
|
5
|
+
* process tree binds, and `judgeWait` for ready, dead or hung. `init` keeps its own loop because it
|
|
6
|
+
* also reports progress and hands the server over; this one stops the server when the caller is done.
|
|
7
|
+
*/
|
|
8
|
+
import { OwnedDevServer, probePage } from './node-effects.js';
|
|
9
|
+
import { WaitVerdict, devServerDiedMessage, judgeWait, portBusyMessage, urlToWatch, } from './bringup/dev-server-wait.js';
|
|
10
|
+
const POLL_MS = 500;
|
|
11
|
+
const MS_PER_S = 1000;
|
|
12
|
+
export async function startDevServerAndWait(command, dir, budgetMs) {
|
|
13
|
+
const server = new OwnedDevServer();
|
|
14
|
+
server.start(command, dir, {});
|
|
15
|
+
const startedAt = Date.now();
|
|
16
|
+
for (;;) {
|
|
17
|
+
const watching = urlToWatch(server.output(), server.listeningPorts());
|
|
18
|
+
const probe = watching === undefined ? undefined : await probePage(watching);
|
|
19
|
+
const verdict = judgeWait({
|
|
20
|
+
output: server.output(),
|
|
21
|
+
launcherExited: server.exited(),
|
|
22
|
+
serving: true === probe?.served,
|
|
23
|
+
quietForMs: server.quietForMs(),
|
|
24
|
+
elapsedMs: Date.now() - startedAt,
|
|
25
|
+
budgetMs,
|
|
26
|
+
});
|
|
27
|
+
if (WaitVerdict.READY === verdict && watching !== undefined) {
|
|
28
|
+
return { url: probe?.reachedUrl ?? watching, stop: () => server.stop() };
|
|
29
|
+
}
|
|
30
|
+
if (WaitVerdict.DEAD === verdict) {
|
|
31
|
+
const failed = portBusyMessage(server.output()) ?? devServerDiedMessage(server.output());
|
|
32
|
+
server.stop();
|
|
33
|
+
return { failed };
|
|
34
|
+
}
|
|
35
|
+
if (WaitVerdict.HUNG === verdict) {
|
|
36
|
+
server.stop();
|
|
37
|
+
return {
|
|
38
|
+
failed: `The dev server did not serve a page in ${String(budgetMs / MS_PER_S)}s.`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_MS));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { execFile } from 'node:child_process';
|
|
2
2
|
import { NodePlatform } from '../../machine/platform.js';
|
|
3
|
+
import { PLUGIN_SERVER_DIR } from '../../telemetry/agent-client.js';
|
|
3
4
|
import { existsSync } from 'node:fs';
|
|
4
5
|
import { platform } from 'node:os';
|
|
5
6
|
import { dirname, join } from 'node:path';
|
|
@@ -63,6 +64,11 @@ function detectExecutionKind() {
|
|
|
63
64
|
export function classifyExecutionKind(script) {
|
|
64
65
|
if (script.includes('/_npx/') || script.includes('\\_npx\\'))
|
|
65
66
|
return ExecutionKind.NPX;
|
|
67
|
+
// The Claude Code plugin's copy sits in a `node_modules`, but it is not the project's. It is pinned
|
|
68
|
+
// to the plugin version, so treat it as npx: a restart picks the version, and nothing is installed.
|
|
69
|
+
if (script.includes(`/${PLUGIN_SERVER_DIR}/`) || script.includes(`\\${PLUGIN_SERVER_DIR}\\`)) {
|
|
70
|
+
return ExecutionKind.NPX;
|
|
71
|
+
}
|
|
66
72
|
const globalSignals = [
|
|
67
73
|
'/lib/node_modules/',
|
|
68
74
|
'\\npm\\node_modules\\',
|
|
@@ -5,3 +5,5 @@ export declare const SERVER_VERSION: string;
|
|
|
5
5
|
* drift. Self-update installs THIS (never `@reticlehq/core`, which is schema-only and has no bin).
|
|
6
6
|
*/
|
|
7
7
|
export declare const RETICLE_NPM_PACKAGE: string;
|
|
8
|
+
/** The Node.js range this package declares in `engines`, such as `>=20.11`. */
|
|
9
|
+
export declare const SERVER_NODE_RANGE: string | undefined;
|
|
@@ -48,3 +48,5 @@ export const SERVER_VERSION = _pkg.version;
|
|
|
48
48
|
* drift. Self-update installs THIS (never `@reticlehq/core`, which is schema-only and has no bin).
|
|
49
49
|
*/
|
|
50
50
|
export const RETICLE_NPM_PACKAGE = _pkg.name;
|
|
51
|
+
/** The Node.js range this package declares in `engines`, such as `>=20.11`. */
|
|
52
|
+
export const SERVER_NODE_RANGE = _pkg.engines?.node;
|
|
@@ -106,6 +106,13 @@ export declare function compareVersions(a: string | undefined, b: string): numbe
|
|
|
106
106
|
export declare function sdkIsBehind(sdk: string | undefined, daemon: string): boolean;
|
|
107
107
|
/** The same fact for the person looking at the page, on its overlay. */
|
|
108
108
|
export declare const SDK_BEHIND_NARRATION: (sdk: string, daemon: string) => string;
|
|
109
|
+
/**
|
|
110
|
+
* The sentence for a screenshot the page cannot draw because its SDK is behind this daemon.
|
|
111
|
+
*
|
|
112
|
+
* `render` is one of the things a behind page does not have. The refusal from the page names the
|
|
113
|
+
* missing command and nothing else; this is the same update the overlay already shows.
|
|
114
|
+
*/
|
|
115
|
+
export declare function sdkBehindNote(sdk: string | undefined): string | undefined;
|
|
109
116
|
/**
|
|
110
117
|
* A page whose SDK is a minor release or more behind this daemon.
|
|
111
118
|
*
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
* a human acts on.
|
|
24
24
|
*/
|
|
25
25
|
import { RETIRED_WIRE_NAMES } from '@reticlehq/core';
|
|
26
|
+
import { SERVER_VERSION } from './identity/server-version.js';
|
|
26
27
|
import { resolveSdkFix } from './sdk-fix.js';
|
|
27
28
|
/** Which pair disagreed. Named so the nudge can report each independently. */
|
|
28
29
|
export const SkewPair = {
|
|
@@ -60,7 +61,7 @@ function namesWeDoNotKnow(peer, self) {
|
|
|
60
61
|
export const SKEW_CONVERGE = "To put every piece on one version, update the CLI and the app SDK (`reticle update` in the app's " +
|
|
61
62
|
'folder does both), then restart the MCP host.';
|
|
62
63
|
/** The fix for two builds of one version. */
|
|
63
|
-
const SAME_VERSION_FIX = 'Both say the same version, so one of them is an older build of it: run `reticle restart`, then ' +
|
|
64
|
+
const SAME_VERSION_FIX = 'Both say the same version, so one of them is an older build of it: run `reticle serve --restart`, then ' +
|
|
64
65
|
'reload the page so it loads the SDK the dev server serves now.';
|
|
65
66
|
function versionPhrase(peer, self) {
|
|
66
67
|
return peer.version === undefined
|
|
@@ -177,9 +178,19 @@ export function sdkIsBehind(sdk, daemon) {
|
|
|
177
178
|
const order = compareVersions(minorOf(sdk), minorOf(daemon));
|
|
178
179
|
return order !== undefined && order < 0;
|
|
179
180
|
}
|
|
181
|
+
/** What to run so the page picks up the daemon's SDK. */
|
|
182
|
+
const UPDATE_THE_SDK = "Run `reticle update` in the app's folder, then restart its dev server.";
|
|
180
183
|
/** The same fact for the person looking at the page, on its overlay. */
|
|
181
|
-
export const SDK_BEHIND_NARRATION = (sdk, daemon) => `This app runs Reticle SDK ${sdk}, older than Reticle ${daemon}.
|
|
182
|
-
|
|
184
|
+
export const SDK_BEHIND_NARRATION = (sdk, daemon) => `This app runs Reticle SDK ${sdk}, older than Reticle ${daemon}. ${UPDATE_THE_SDK}`;
|
|
185
|
+
/**
|
|
186
|
+
* The sentence for a screenshot the page cannot draw because its SDK is behind this daemon.
|
|
187
|
+
*
|
|
188
|
+
* `render` is one of the things a behind page does not have. The refusal from the page names the
|
|
189
|
+
* missing command and nothing else; this is the same update the overlay already shows.
|
|
190
|
+
*/
|
|
191
|
+
export function sdkBehindNote(sdk) {
|
|
192
|
+
return describeSdkBehind(sdk, SERVER_VERSION, () => UPDATE_THE_SDK);
|
|
193
|
+
}
|
|
183
194
|
/**
|
|
184
195
|
* A page whose SDK is a minor release or more behind this daemon.
|
|
185
196
|
*
|