@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
|
@@ -24,7 +24,7 @@ import { readDaemonRegistry } from '../../daemon/daemon-resolve.js';
|
|
|
24
24
|
import { LOOPBACK_HOST, STATUS_HOLD_MS } from '@reticlehq/core';
|
|
25
25
|
import { probePresence, presenceIsUsable } from '../../daemon/binding/port-presence.js';
|
|
26
26
|
import { probeDaemon, waitForDaemonBind } from '../../../surface/mcp/mcp-proxy.js';
|
|
27
|
-
import { daemonSpawnArgs } from '../../cli/daemon-start-options.js';
|
|
27
|
+
import { daemonSpawnArgs, headlessByDefault } from '../../cli/daemon-start-options.js';
|
|
28
28
|
import { fetchStatus, summarizeStatus } from '../../daemon/binding/daemon-status-probe.js';
|
|
29
29
|
import { runKill } from '../../cli/cli-kill.js';
|
|
30
30
|
export const EnsureDaemon = {
|
|
@@ -154,7 +154,14 @@ export function nodeEnsureDaemonDeps(skewed) {
|
|
|
154
154
|
const scriptPath = process.argv[1];
|
|
155
155
|
if (undefined === scriptPath)
|
|
156
156
|
return false;
|
|
157
|
-
const started = spawnDaemon(process.execPath, scriptPath,
|
|
157
|
+
const started = spawnDaemon(process.execPath, scriptPath,
|
|
158
|
+
// The daemon init starts is the one the agent attaches to and drives through, so it follows
|
|
159
|
+
// the same rule as every other: shown on a desktop, hidden in CI or with no display.
|
|
160
|
+
daemonSpawnArgs({
|
|
161
|
+
port,
|
|
162
|
+
headless: headlessByDefault(process.env, process.platform),
|
|
163
|
+
http: false,
|
|
164
|
+
}), port);
|
|
158
165
|
// For a log or a pipe. On a terminal it was a JSON line in the middle of `init`'s output, read
|
|
159
166
|
// by a person, about a step the next lines already report in words.
|
|
160
167
|
if (true !== process.stderr.isTTY)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the agent that ran `init` has to restart before it can use what `init` set up.
|
|
3
|
+
*
|
|
4
|
+
* An agent client reads its MCP server list when it STARTS and never re-reads it. So the session
|
|
5
|
+
* that ran `init` has the `reticle_*` tools only if Reticle was registered before it started, and
|
|
6
|
+
* nothing a running session does can add them: there is no server entry in it to reconnect. The
|
|
7
|
+
* honest answer is a restart, said plainly, once `init` can tell it is needed.
|
|
8
|
+
*
|
|
9
|
+
* Two ways to tell. This run registered the server (it cannot be in any open session), or `init`
|
|
10
|
+
* runs inside an agent and the daemon has no agent attached, which is what an agent with the tools
|
|
11
|
+
* always has. Pure: the facts come in, the sentence comes out.
|
|
12
|
+
*/
|
|
13
|
+
export interface RestartFacts {
|
|
14
|
+
/** `init` was spawned by a coding agent (Claude Code, Codex), not typed by a person. */
|
|
15
|
+
readonly insideAgent: boolean;
|
|
16
|
+
/** This run registered the MCP server, so no open session has it. */
|
|
17
|
+
readonly newlyRegistered: boolean;
|
|
18
|
+
/** MCP clients attached to the daemon on this port; undefined when the daemon could not be asked. */
|
|
19
|
+
readonly attached: number | undefined;
|
|
20
|
+
}
|
|
21
|
+
export declare function restartNotice(facts: RestartFacts): string | undefined;
|
|
22
|
+
/** How many agents' MCP clients the daemon's `/status` lists, or undefined for no answer. */
|
|
23
|
+
export declare function attachedAgents(status: unknown): number | undefined;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the agent that ran `init` has to restart before it can use what `init` set up.
|
|
3
|
+
*
|
|
4
|
+
* An agent client reads its MCP server list when it STARTS and never re-reads it. So the session
|
|
5
|
+
* that ran `init` has the `reticle_*` tools only if Reticle was registered before it started, and
|
|
6
|
+
* nothing a running session does can add them: there is no server entry in it to reconnect. The
|
|
7
|
+
* honest answer is a restart, said plainly, once `init` can tell it is needed.
|
|
8
|
+
*
|
|
9
|
+
* Two ways to tell. This run registered the server (it cannot be in any open session), or `init`
|
|
10
|
+
* runs inside an agent and the daemon has no agent attached, which is what an agent with the tools
|
|
11
|
+
* always has. Pure: the facts come in, the sentence comes out.
|
|
12
|
+
*/
|
|
13
|
+
const RESTART_NOW = 'Restart your coding agent now: this session started before Reticle was registered with it, so ' +
|
|
14
|
+
'the `reticle_*` tools are not in it, and an agent loads its tools only when it starts. ' +
|
|
15
|
+
'`npx @reticlehq/server init --relaunch` prints the exact resume command for Claude Code and ' +
|
|
16
|
+
'Codex. Once per machine.';
|
|
17
|
+
export function restartNotice(facts) {
|
|
18
|
+
if (facts.newlyRegistered)
|
|
19
|
+
return RESTART_NOW;
|
|
20
|
+
return facts.insideAgent && 0 === facts.attached ? RESTART_NOW : undefined;
|
|
21
|
+
}
|
|
22
|
+
/** How many agents' MCP clients the daemon's `/status` lists, or undefined for no answer. */
|
|
23
|
+
export function attachedAgents(status) {
|
|
24
|
+
if ('object' !== typeof status || null === status)
|
|
25
|
+
return undefined;
|
|
26
|
+
const peers = status.mcpPeers;
|
|
27
|
+
return Array.isArray(peers) ? peers.length : 0;
|
|
28
|
+
}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The port a project asks for when the default is somebody else's: its own, from its id (or its
|
|
3
|
+
* directory, before it has one), the same on every run. Every project used to ask for the default
|
|
4
|
+
* plus one, so with the first one's daemon not yet running every later project was written the same
|
|
5
|
+
* port and shared it. Taken ports are still skipped by the caller's `pickPort`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function projectPortFor(seed: string): number;
|
|
1
8
|
/**
|
|
2
9
|
* `RETICLE_PORT`, when it names a port. The one reader of it for the CLI, `init` included.
|
|
3
10
|
*
|
|
@@ -14,6 +21,8 @@ export declare function portForInit(explicit: number | undefined, configured: nu
|
|
|
14
21
|
pickPort: (preferred: number) => Promise<number>;
|
|
15
22
|
/** The daemon on `port` was started from this project's directory or one above it. */
|
|
16
23
|
daemonStartedHere?: (port: number) => boolean;
|
|
17
|
-
}
|
|
24
|
+
},
|
|
25
|
+
/** The project's directory: the port's seed when the project has no id yet. */
|
|
26
|
+
dir?: string): Promise<number | undefined>;
|
|
18
27
|
/** Is `dir` the same directory as `cwd`, or an ancestor of it? */
|
|
19
28
|
export declare function isSameOrAbove(dir: string, cwd: string): boolean;
|
|
@@ -11,6 +11,23 @@
|
|
|
11
11
|
import { relative, isAbsolute } from 'node:path';
|
|
12
12
|
import { RETICLE_DEFAULT_PORT, ReticleEnv } from '@reticlehq/core';
|
|
13
13
|
const MAX_PORT = 65_535;
|
|
14
|
+
/** Ports a project moved off the default may get: above it, and below the 5000s dev servers use. */
|
|
15
|
+
const PROJECT_PORT_FIRST = RETICLE_DEFAULT_PORT + 1;
|
|
16
|
+
const PROJECT_PORT_SPAN = 599;
|
|
17
|
+
const FNV_OFFSET = 0x811c9dc5;
|
|
18
|
+
const FNV_PRIME = 0x01000193;
|
|
19
|
+
/**
|
|
20
|
+
* The port a project asks for when the default is somebody else's: its own, from its id (or its
|
|
21
|
+
* directory, before it has one), the same on every run. Every project used to ask for the default
|
|
22
|
+
* plus one, so with the first one's daemon not yet running every later project was written the same
|
|
23
|
+
* port and shared it. Taken ports are still skipped by the caller's `pickPort`.
|
|
24
|
+
*/
|
|
25
|
+
export function projectPortFor(seed) {
|
|
26
|
+
let hash = FNV_OFFSET;
|
|
27
|
+
for (let i = 0; i < seed.length; i++)
|
|
28
|
+
hash = Math.imul(hash ^ seed.charCodeAt(i), FNV_PRIME);
|
|
29
|
+
return PROJECT_PORT_FIRST + ((hash >>> 0) % PROJECT_PORT_SPAN);
|
|
30
|
+
}
|
|
14
31
|
/**
|
|
15
32
|
* `RETICLE_PORT`, when it names a port. The one reader of it for the CLI, `init` included.
|
|
16
33
|
*
|
|
@@ -26,7 +43,9 @@ export function portFromEnv(env) {
|
|
|
26
43
|
const port = Number(raw);
|
|
27
44
|
return 0 < port && port <= MAX_PORT ? port : undefined;
|
|
28
45
|
}
|
|
29
|
-
export async function portForInit(explicit, configured, projectId, deps
|
|
46
|
+
export async function portForInit(explicit, configured, projectId, deps,
|
|
47
|
+
/** The project's directory: the port's seed when the project has no id yet. */
|
|
48
|
+
dir) {
|
|
30
49
|
if (explicit !== undefined)
|
|
31
50
|
return explicit;
|
|
32
51
|
if (configured !== undefined)
|
|
@@ -45,7 +64,8 @@ export async function portForInit(explicit, configured, projectId, deps) {
|
|
|
45
64
|
const holders = await deps.daemonProjects(RETICLE_DEFAULT_PORT);
|
|
46
65
|
if (1 !== holders.length || holders[0] === projectId)
|
|
47
66
|
return undefined;
|
|
48
|
-
|
|
67
|
+
const seed = projectId ?? dir;
|
|
68
|
+
return deps.pickPort(seed === undefined ? PROJECT_PORT_FIRST : projectPortFor(seed));
|
|
49
69
|
}
|
|
50
70
|
/** Is `dir` the same directory as `cwd`, or an ancestor of it? */
|
|
51
71
|
export function isSameOrAbove(dir, cwd) {
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* every command harder to read.
|
|
7
7
|
*/
|
|
8
8
|
import { type InitResult } from '@reticlehq/init';
|
|
9
|
+
import { type FirstFlowPort } from '../setup-command.js';
|
|
9
10
|
/**
|
|
10
11
|
* Does the served document name the SDK, so its absence means a stale dev server?
|
|
11
12
|
*
|
|
@@ -22,7 +23,8 @@ interface InitRuntimeArgs {
|
|
|
22
23
|
readonly dryRun: boolean;
|
|
23
24
|
readonly filesOnly?: boolean | undefined;
|
|
24
25
|
readonly json?: boolean | undefined;
|
|
25
|
-
|
|
26
|
+
/** `--no-first-run` sets it false: connect, and stop without the coverage summary. */
|
|
27
|
+
readonly firstRun?: boolean | undefined;
|
|
26
28
|
readonly open?: boolean | undefined;
|
|
27
29
|
readonly agents?: boolean | undefined;
|
|
28
30
|
/**
|
|
@@ -41,9 +43,17 @@ interface InitRuntimeArgs {
|
|
|
41
43
|
/** Restart the calling client so IT gets the tools — see relaunch.ts. */
|
|
42
44
|
readonly relaunch?: boolean | undefined;
|
|
43
45
|
readonly licenseKey?: string | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Init is the first half of a longer command (`reticle connect`): a setup that did not finish
|
|
48
|
+
* sets a failing exit code and returns, so the command can still sign in and link. Exiting here
|
|
49
|
+
* ended connect before it signed in, and nothing said to run it again.
|
|
50
|
+
*/
|
|
51
|
+
readonly keepGoing?: boolean | undefined;
|
|
44
52
|
}
|
|
45
53
|
interface RuntimePrintIo {
|
|
46
54
|
readonly print: (line: string) => void;
|
|
47
55
|
}
|
|
48
|
-
export declare function continueAfterInit(parsed: InitRuntimeArgs, result: InitResult, io: RuntimePrintIo, cwd: string
|
|
56
|
+
export declare function continueAfterInit(parsed: InitRuntimeArgs, result: InitResult, io: RuntimePrintIo, cwd: string,
|
|
57
|
+
/** init's ending once the connection is proved: coverage and the agent prompt. See `FirstFlowPort`. */
|
|
58
|
+
firstFlow?: FirstFlowPort): Promise<void>;
|
|
49
59
|
export {};
|
|
@@ -11,18 +11,22 @@ import { InitConfirmation, RETICLE_DEFAULT_PORT } from '@reticlehq/core';
|
|
|
11
11
|
import { FEEDBACK_HINT, Framework, InitFailure } from '@reticlehq/init';
|
|
12
12
|
import { confirmInstall, nodeConfirmDeps } from '../terminal/confirm.js';
|
|
13
13
|
import { writeLicenseKey } from '../license-key.js';
|
|
14
|
-
import { registerOtherAgents, runSetupCommand } from '../setup-command.js';
|
|
15
|
-
import { bridgeOccupied } from '../bringup/bridge-port.js';
|
|
14
|
+
import { registerOtherAgents, runSetupCommand, } from '../setup-command.js';
|
|
15
|
+
import { bridgeOccupied, freePortAfter } from '../bringup/bridge-port.js';
|
|
16
16
|
import { defaultPairingTokenDir, readOrCreatePairingTokenSync, } from '../../../portal/bridge/pairing-token.js';
|
|
17
17
|
import { relaunchDecision } from '../bringup/relaunch.js';
|
|
18
|
+
import { attachedAgents, restartNotice } from './agent-restart.js';
|
|
18
19
|
import { claudeTranscriptExists, codexSessionFor } from '../terminal/transcripts.js';
|
|
19
|
-
import { probePresence } from '../../daemon/binding/port-presence.js';
|
|
20
|
+
import { PortPresence, probePresence } from '../../daemon/binding/port-presence.js';
|
|
20
21
|
import { probeDaemon } from '../../../surface/mcp/proxy/proxy-daemon-probe.js';
|
|
21
22
|
import { fetchStatus } from '../../daemon/binding/daemon-status-probe.js';
|
|
22
23
|
import { collectEnv, DEFAULT_PHASE_TIMEOUT_MS } from '../setup-options.js';
|
|
23
24
|
import { staticPageDevCommand } from '../bringup/static-page-server.js';
|
|
24
25
|
import { SetupPhase } from '../run-setup.js';
|
|
25
26
|
import { reportInitOutcome } from '../../../telemetry/init-telemetry.js';
|
|
27
|
+
/** Claude Code marks every process it spawns with this variable set to this value. */
|
|
28
|
+
const CLAUDE_CODE_ENV = 'CLAUDECODE';
|
|
29
|
+
const CLAUDE_CODE_MARKER = '1';
|
|
26
30
|
/** How often the runtime phases look again: fast enough not to be the wait, slow enough to be free. */
|
|
27
31
|
const POLL_MS = 250;
|
|
28
32
|
/**
|
|
@@ -76,8 +80,16 @@ function printRelaunch(parsed, io, cwd) {
|
|
|
76
80
|
}).message);
|
|
77
81
|
io.print('');
|
|
78
82
|
}
|
|
79
|
-
export async function continueAfterInit(parsed, result, io, cwd
|
|
83
|
+
export async function continueAfterInit(parsed, result, io, cwd,
|
|
84
|
+
/** init's ending once the connection is proved: coverage and the agent prompt. See `FirstFlowPort`. */
|
|
85
|
+
firstFlow) {
|
|
80
86
|
const port = parsed.port ?? RETICLE_DEFAULT_PORT;
|
|
87
|
+
const stop = () => {
|
|
88
|
+
if (true === parsed.keepGoing)
|
|
89
|
+
process.exitCode = 1;
|
|
90
|
+
else
|
|
91
|
+
process.exit(1);
|
|
92
|
+
};
|
|
81
93
|
// Real installs persist the key whichever way setup ends. A preview must leave .env and
|
|
82
94
|
// .gitignore untouched, just as it leaves project wiring and agent configuration untouched.
|
|
83
95
|
if (!parsed.dryRun && undefined !== parsed.licenseKey) {
|
|
@@ -105,7 +117,7 @@ export async function continueAfterInit(parsed, result, io, cwd) {
|
|
|
105
117
|
if (true === parsed.json)
|
|
106
118
|
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
107
119
|
if (!result.ok)
|
|
108
|
-
|
|
120
|
+
stop();
|
|
109
121
|
});
|
|
110
122
|
}
|
|
111
123
|
// From here on init left the ask to us, so it is the last thing on every exit below.
|
|
@@ -114,17 +126,31 @@ export async function continueAfterInit(parsed, result, io, cwd) {
|
|
|
114
126
|
io.print('');
|
|
115
127
|
io.print(FEEDBACK_HINT);
|
|
116
128
|
};
|
|
129
|
+
// `init` deferred its outcome to this phase, so every exit below reports it, and only once: the
|
|
130
|
+
// success path, a failure, a throw and an interrupt can each reach here, and two rows for one run
|
|
131
|
+
// would double the funnel this event exists to measure.
|
|
132
|
+
let outcomeReported = false;
|
|
133
|
+
const reportOnce = (init) => {
|
|
134
|
+
if (outcomeReported)
|
|
135
|
+
return;
|
|
136
|
+
outcomeReported = true;
|
|
137
|
+
reportInitOutcome(init);
|
|
138
|
+
};
|
|
117
139
|
const context = result.context;
|
|
118
140
|
if (context === undefined) {
|
|
119
|
-
// Nothing was established, so there is nothing to run against. init has already said why
|
|
141
|
+
// Nothing was established, so there is nothing to run against. init has already said why, and
|
|
142
|
+
// the outcome it deferred (a failed dependency install, usually) is reported here or nowhere.
|
|
143
|
+
if (result.outcome !== undefined)
|
|
144
|
+
reportOnce(result.outcome);
|
|
120
145
|
ask();
|
|
121
146
|
if (true === parsed.json)
|
|
122
147
|
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
123
|
-
|
|
148
|
+
stop();
|
|
149
|
+
return;
|
|
124
150
|
}
|
|
125
151
|
const reportFailure = (reason) => {
|
|
126
152
|
if (result.outcome !== undefined) {
|
|
127
|
-
|
|
153
|
+
reportOnce({ ...result.outcome, ok: false, reason });
|
|
128
154
|
}
|
|
129
155
|
};
|
|
130
156
|
// A PENDING connect step is not a reason to skip the runtime phase, and treating it as one made
|
|
@@ -142,10 +168,13 @@ export async function continueAfterInit(parsed, result, io, cwd) {
|
|
|
142
168
|
// Before the connect wait, never after: a bridge held by a stranger makes a session impossible,
|
|
143
169
|
// so going ahead spends the entire budget and then reports what reads as an instrumentation
|
|
144
170
|
// problem — the one place that is fine. See bridge-port.ts.
|
|
145
|
-
const
|
|
171
|
+
const presence = await probePresence(port, { tcpOpen: probeDaemon, status: fetchStatus }).catch((error) => {
|
|
146
172
|
reportFailure(InitFailure.RUNTIME_ERROR);
|
|
147
173
|
throw error;
|
|
148
|
-
})
|
|
174
|
+
});
|
|
175
|
+
const refusal = bridgeOccupied(presence, port, PortPresence.FOREIGN === presence
|
|
176
|
+
? await freePortAfter(port, (p) => probeDaemon(p))
|
|
177
|
+
: undefined);
|
|
149
178
|
if (refusal !== undefined) {
|
|
150
179
|
reportFailure(InitFailure.BRIDGE_OCCUPIED);
|
|
151
180
|
io.print(refusal);
|
|
@@ -153,8 +182,12 @@ export async function continueAfterInit(parsed, result, io, cwd) {
|
|
|
153
182
|
if (true === parsed.json) {
|
|
154
183
|
process.stdout.write(`${JSON.stringify({ ok: false, reason: InitFailure.BRIDGE_OCCUPIED }, null, 2)}\n`);
|
|
155
184
|
}
|
|
156
|
-
|
|
185
|
+
stop();
|
|
186
|
+
return;
|
|
157
187
|
}
|
|
188
|
+
// A Ctrl-C during the wait ends the process with no `finally`, so the outcome is reported from the
|
|
189
|
+
// signal itself. The send is detached, so it survives the exit that follows.
|
|
190
|
+
const releaseInterrupt = reportOnInterrupt(() => reportFailure(InitFailure.INTERRUPTED));
|
|
158
191
|
return runSetupCommand({
|
|
159
192
|
appDir: context.appDir,
|
|
160
193
|
invokedAt: cwd,
|
|
@@ -164,6 +197,9 @@ export async function continueAfterInit(parsed, result, io, cwd) {
|
|
|
164
197
|
pairingToken: readOrCreatePairingTokenSync(defaultPairingTokenDir()),
|
|
165
198
|
env: collectEnv(parsed.env ?? []),
|
|
166
199
|
openBrowser: false !== parsed.open,
|
|
200
|
+
firstRun: false !== parsed.firstRun,
|
|
201
|
+
json: true === parsed.json,
|
|
202
|
+
firstFlow,
|
|
167
203
|
registerAgents: wantsAgents(parsed),
|
|
168
204
|
phaseTimeoutMs: undefined === parsed.timeoutSeconds
|
|
169
205
|
? DEFAULT_PHASE_TIMEOUT_MS
|
|
@@ -181,17 +217,19 @@ export async function continueAfterInit(parsed, result, io, cwd) {
|
|
|
181
217
|
// A plain page with no dev script gets Reticle's own static server, so the page is actually
|
|
182
218
|
// served and the connect can be proved, instead of stopping at "start the app yourself".
|
|
183
219
|
...(() => {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
220
|
+
if (undefined !== context.devCommand)
|
|
221
|
+
return { devCommand: context.devCommand };
|
|
222
|
+
if (undefined !== parsed.url)
|
|
223
|
+
return {};
|
|
224
|
+
const devCommand = staticPageDevCommand({
|
|
225
|
+
appDir: context.appDir,
|
|
226
|
+
isStaticPage: Framework.HTML === context.framework,
|
|
227
|
+
});
|
|
228
|
+
return undefined === devCommand ? {} : { devCommand, devCommandIsStaticPage: true };
|
|
192
229
|
})(),
|
|
193
230
|
...(undefined === parsed.url ? {} : { suppliedUrl: parsed.url }),
|
|
194
|
-
}, (line) => io.print(line))
|
|
231
|
+
}, (line) => io.print(line))
|
|
232
|
+
.then(async (outcome) => {
|
|
195
233
|
if (result.outcome !== undefined) {
|
|
196
234
|
const init = {
|
|
197
235
|
...result.outcome,
|
|
@@ -210,26 +248,28 @@ export async function continueAfterInit(parsed, result, io, cwd) {
|
|
|
210
248
|
? InitFailure.DEV_SERVER
|
|
211
249
|
: InitFailure.APP_CONNECTION;
|
|
212
250
|
}
|
|
213
|
-
|
|
251
|
+
reportOnce(init);
|
|
214
252
|
}
|
|
215
253
|
// One object, so an agent reads a result instead of interpreting a report.
|
|
216
254
|
if (true === parsed.json) {
|
|
217
255
|
process.stdout.write(`${JSON.stringify(outcome, null, 2)}\n`);
|
|
218
256
|
if (!outcome.ok)
|
|
219
|
-
|
|
257
|
+
stop();
|
|
220
258
|
return;
|
|
221
259
|
}
|
|
222
260
|
io.print('');
|
|
223
261
|
// The precondition for everything the closing asks for, printed on the path that could not say
|
|
224
|
-
// it. An agent client reads its MCP server list when it STARTS and never re-reads it, so
|
|
225
|
-
//
|
|
226
|
-
//
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
262
|
+
// it. An agent client reads its MCP server list when it STARTS and never re-reads it, so an
|
|
263
|
+
// agent that ran this without the `reticle_*` tools cannot do what the closing tells it to.
|
|
264
|
+
// See agent-restart.ts for the two ways that is known.
|
|
265
|
+
const restart = restartNotice({
|
|
266
|
+
insideAgent: CLAUDE_CODE_MARKER === process.env[CLAUDE_CODE_ENV] ||
|
|
267
|
+
undefined !== codexSessionFor(cwd),
|
|
268
|
+
newlyRegistered: true === result.mcpNewlyRegistered,
|
|
269
|
+
attached: attachedAgents(await fetchStatus(port)),
|
|
270
|
+
});
|
|
271
|
+
if (undefined !== restart) {
|
|
272
|
+
io.print(restart);
|
|
233
273
|
io.print('');
|
|
234
274
|
}
|
|
235
275
|
if (outcome.ok && !outcome.flowSaved) {
|
|
@@ -245,11 +285,8 @@ export async function continueAfterInit(parsed, result, io, cwd) {
|
|
|
245
285
|
return;
|
|
246
286
|
}
|
|
247
287
|
if (outcome.ok) {
|
|
248
|
-
io.print(`✓ setup complete — ${outcome.url ?? 'the app'} is instrumented and
|
|
249
|
-
|
|
250
|
-
// themselves, and it deserves a line of its own rather than a paragraph that gets skimmed.
|
|
251
|
-
io.print(' Read the FINDINGS above before moving on: a flow can pass with a failed request or a ' +
|
|
252
|
-
'console error behind it, and that is the app, not the check.');
|
|
288
|
+
io.print(`✓ setup complete — ${outcome.url ?? 'the app'} is instrumented and its first flow is ` +
|
|
289
|
+
'saved. The tab stays open; a linked project sends the flow and its run to your dashboard.');
|
|
253
290
|
ask();
|
|
254
291
|
return;
|
|
255
292
|
}
|
|
@@ -259,9 +296,31 @@ export async function continueAfterInit(parsed, result, io, cwd) {
|
|
|
259
296
|
for (const [i, step] of outcome.fallback.entries())
|
|
260
297
|
io.print(` ${i + 1}. ${step}`);
|
|
261
298
|
ask();
|
|
262
|
-
|
|
299
|
+
stop();
|
|
263
300
|
}, (error) => {
|
|
264
301
|
reportFailure(InitFailure.RUNTIME_ERROR);
|
|
265
302
|
throw error;
|
|
303
|
+
})
|
|
304
|
+
.finally(releaseInterrupt);
|
|
305
|
+
}
|
|
306
|
+
const INTERRUPT_SIGNALS = ['SIGINT', 'SIGTERM'];
|
|
307
|
+
/** 128 + the signal number, which is what a shell reports. */
|
|
308
|
+
const INTERRUPT_EXIT_CODE = { SIGINT: 130, SIGTERM: 143 };
|
|
309
|
+
/** Run `report` if the process is interrupted. Returns the disposer. */
|
|
310
|
+
function reportOnInterrupt(report) {
|
|
311
|
+
const handlers = INTERRUPT_SIGNALS.map((signal) => {
|
|
312
|
+
const handler = () => {
|
|
313
|
+
report();
|
|
314
|
+
// Before setup installs its own handler ours may be the only one, and a listener present
|
|
315
|
+
// means Node no longer exits on the signal by itself: without this, Ctrl-C would be ignored.
|
|
316
|
+
if (1 === process.listenerCount(signal))
|
|
317
|
+
process.exit(INTERRUPT_EXIT_CODE[signal]);
|
|
318
|
+
};
|
|
319
|
+
process.on(signal, handler);
|
|
320
|
+
return { signal, handler };
|
|
266
321
|
});
|
|
322
|
+
return () => {
|
|
323
|
+
for (const { signal, handler } of handlers)
|
|
324
|
+
process.off(signal, handler);
|
|
325
|
+
};
|
|
267
326
|
}
|
|
@@ -53,6 +53,8 @@ export declare class OwnedDevServer {
|
|
|
53
53
|
handOver(url?: string): void;
|
|
54
54
|
stop(): void;
|
|
55
55
|
}
|
|
56
|
+
/** Run a command and return what it printed, or '' if it failed to finish within `timeoutMs`. */
|
|
57
|
+
export declare function run(file: string, args: string[], timeoutMs?: number): string;
|
|
56
58
|
/**
|
|
57
59
|
* Fetch the page and say what came back.
|
|
58
60
|
*
|
|
@@ -63,7 +63,13 @@ export class OwnedDevServer {
|
|
|
63
63
|
this.child = spawn(process.execPath, [LOG_CAP_SCRIPT, log, String(DEV_SERVER_LOG_CAP_BYTES), command], {
|
|
64
64
|
cwd,
|
|
65
65
|
// Its own process group, so stopping it stops what it started rather than only the wrapper.
|
|
66
|
-
|
|
66
|
+
// Detached on Windows too: there libuv puts every non-detached child in a job object that
|
|
67
|
+
// kills it when this process exits. The supervisor died with `init`, the server it fed lost
|
|
68
|
+
// its pipe reader, and its next log line was an EPIPE: every Windows install cell whose
|
|
69
|
+
// server logs per request (Next, Astro) or on an edit (CRA, Angular) failed that way.
|
|
70
|
+
detached: true,
|
|
71
|
+
// Detached on Windows means no console; this keeps one from opening as a visible window.
|
|
72
|
+
windowsHide: true,
|
|
67
73
|
// Nothing of ours: the supervisor holds the server's pipes, and init holds none of its.
|
|
68
74
|
stdio: 'ignore',
|
|
69
75
|
// Reticle already provides the detached supervisor. Astro's agent auto-backgrounding
|
|
@@ -169,8 +175,21 @@ export class OwnedDevServer {
|
|
|
169
175
|
this.child = undefined;
|
|
170
176
|
}
|
|
171
177
|
}
|
|
172
|
-
|
|
173
|
-
|
|
178
|
+
/**
|
|
179
|
+
* How long one process-listing command may take. `init` calls these on every dev-server poll, and
|
|
180
|
+
* spawnSync blocks the event loop: with no bound, one stalled WMI query on a Windows install cell
|
|
181
|
+
* froze `init` silently for nine and a half minutes, until the gate killed it.
|
|
182
|
+
*/
|
|
183
|
+
const RUN_TIMEOUT_MS = 15_000;
|
|
184
|
+
/** Run a command and return what it printed, or '' if it failed to finish within `timeoutMs`. */
|
|
185
|
+
export function run(file, args, timeoutMs = RUN_TIMEOUT_MS) {
|
|
186
|
+
const r = spawnSync(file, args, {
|
|
187
|
+
encoding: 'utf8',
|
|
188
|
+
maxBuffer: 8 * 1024 * 1024,
|
|
189
|
+
timeout: timeoutMs,
|
|
190
|
+
});
|
|
191
|
+
if (undefined !== r.error)
|
|
192
|
+
return '';
|
|
174
193
|
return r.stdout ?? '';
|
|
175
194
|
}
|
|
176
195
|
/**
|
|
@@ -183,13 +202,22 @@ function run(file, args) {
|
|
|
183
202
|
* `init` then waits out the full quiet window and reports "the dev server stopped producing output
|
|
184
203
|
* without ever serving a page" about a Vite server that was serving perfectly the whole time.
|
|
185
204
|
*
|
|
186
|
-
* The fallback prints the same
|
|
187
|
-
* without knowing which produced it.
|
|
188
|
-
*
|
|
205
|
+
* The fallback prints the same `CreationDate ParentProcessId ProcessId` shape (UTC, in WMI's
|
|
206
|
+
* datetime format), so `parseWmicProcesses` reads either without knowing which produced it. The
|
|
207
|
+
* creation time is not decoration: Windows keeps a dead parent's pid as ParentProcessId and reuses
|
|
208
|
+
* pids, and without it the tree walk adopted the runner's sshd and reported port 22 as the dev
|
|
209
|
+
* server. A process with no creation time (System) prints the old two-column row.
|
|
210
|
+
*
|
|
211
|
+
* Tried in this order because `wmic` is an order of magnitude faster to start than PowerShell, and
|
|
212
|
+
* on a machine that still has it nothing needs to change.
|
|
189
213
|
*/
|
|
190
|
-
const POWERSHELL_PAIRS = 'Get-CimInstance Win32_Process | ForEach-Object {
|
|
214
|
+
const POWERSHELL_PAIRS = 'Get-CimInstance Win32_Process | ForEach-Object { ' +
|
|
215
|
+
'$c = $_.CreationDate; ' +
|
|
216
|
+
"$t = if ($c) { $c.ToUniversalTime().ToString('yyyyMMddHHmmss.ffffff', " +
|
|
217
|
+
"[Globalization.CultureInfo]::InvariantCulture) + '+000' } else { '' }; " +
|
|
218
|
+
'"$t $($_.ParentProcessId) $($_.ProcessId)".Trim() }';
|
|
191
219
|
function windowsProcessPairs() {
|
|
192
|
-
const fromWmic = parseWmicProcesses(run('wmic', ['process', 'get', 'ParentProcessId,ProcessId']));
|
|
220
|
+
const fromWmic = parseWmicProcesses(run('wmic', ['process', 'get', 'CreationDate,ParentProcessId,ProcessId']));
|
|
193
221
|
if (0 < fromWmic.length)
|
|
194
222
|
return fromWmic;
|
|
195
223
|
return parseWmicProcesses(run('powershell', ['-NoProfile', '-NonInteractive', '-Command', POWERSHELL_PAIRS]));
|
|
@@ -10,3 +10,15 @@ export declare function urlOfExistingApp(entries: readonly DevServerEntry[], sco
|
|
|
10
10
|
projectId?: string | undefined;
|
|
11
11
|
root?: string | undefined;
|
|
12
12
|
}): string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* The url of a window of THIS project already connected to the daemon, if one is.
|
|
15
|
+
*
|
|
16
|
+
* A desktop app with a packaged renderer announces no dev server, so the registry above cannot see
|
|
17
|
+
* it, and setup started the app again beside the running one. On macOS a build signed differently
|
|
18
|
+
* from the installed app is a different app to the keychain, so every start asked for the password
|
|
19
|
+
* again. Scoped to the project the page reported, like the registry: never a sibling's window.
|
|
20
|
+
*/
|
|
21
|
+
export declare function connectedAppUrl(sessions: readonly {
|
|
22
|
+
readonly url?: string;
|
|
23
|
+
readonly projectId?: string;
|
|
24
|
+
}[], projectId: string | undefined): string | undefined;
|
|
@@ -11,3 +11,17 @@ export function urlOfExistingApp(entries, scope) {
|
|
|
11
11
|
const first = mine[0];
|
|
12
12
|
return first === undefined ? undefined : first.url;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* The url of a window of THIS project already connected to the daemon, if one is.
|
|
16
|
+
*
|
|
17
|
+
* A desktop app with a packaged renderer announces no dev server, so the registry above cannot see
|
|
18
|
+
* it, and setup started the app again beside the running one. On macOS a build signed differently
|
|
19
|
+
* from the installed app is a different app to the keychain, so every start asked for the password
|
|
20
|
+
* again. Scoped to the project the page reported, like the registry: never a sibling's window.
|
|
21
|
+
*/
|
|
22
|
+
export function connectedAppUrl(sessions, projectId) {
|
|
23
|
+
if (projectId === undefined)
|
|
24
|
+
return undefined;
|
|
25
|
+
const mine = sessions.find((s) => s.projectId === projectId && 0 < (s.url ?? '').length);
|
|
26
|
+
return mine?.url;
|
|
27
|
+
}
|
|
@@ -35,7 +35,7 @@ export function remainingSteps(p) {
|
|
|
35
35
|
'what produce a verdict. Or hand the whole drive to Reticle with `reticle_verify { action: ' +
|
|
36
36
|
'"explore", persona: "<who does what>" }`, which records what it drove so later runs replay ' +
|
|
37
37
|
'with no model in the loop; that route runs on the Reticle platform and needs a linked ' +
|
|
38
|
-
'project (`reticle connect`);
|
|
38
|
+
'project (`reticle connect`); a new account gets 10 free credits to try it.');
|
|
39
39
|
}
|
|
40
40
|
// Whether anything is actually outstanding, read BEFORE the docs pointer is added -- that line is
|
|
41
41
|
// an offer, not a task, and a run with nothing left still gets it.
|
|
@@ -2,12 +2,8 @@
|
|
|
2
2
|
* The half of setup that happens after the files are written.
|
|
3
3
|
*
|
|
4
4
|
* `init` wires a project; this gets the app running with the SDK inside it and proves a session
|
|
5
|
-
* connected. That is where ONBOARDING ends
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* It does NOT drive a flow. `reticle_verify { action: "explore" }` does that, with a model inside
|
|
9
|
-
* the daemon that already holds the tools — so no client restart is needed and no second CLI has to
|
|
10
|
-
* exist on the machine.
|
|
5
|
+
* connected. That is where ONBOARDING ends. Then init says what Reticle sees and hands the first
|
|
6
|
+
* flow to the coding agent (`try-command.ts`'s `initFirstFlow`); nothing in init drives.
|
|
11
7
|
*
|
|
12
8
|
* Every effect is injected. That is not ceremony: the sequence has five phases, each with its own
|
|
13
9
|
* way of going wrong, and the alternative to injecting them is a test that boots a real dev server
|
|
@@ -16,6 +12,20 @@
|
|
|
16
12
|
import { type CandidateSession } from './session-pick.js';
|
|
17
13
|
import { type PageProbe } from './probe/page-probe.js';
|
|
18
14
|
import { AppShape } from './desktop-shape.js';
|
|
15
|
+
/**
|
|
16
|
+
* Said before Reticle starts its own static server for a plain page, while it can still be acted
|
|
17
|
+
* on: the page may already be served by something with an API behind it, and only the person
|
|
18
|
+
* running init knows that (#1426).
|
|
19
|
+
*/
|
|
20
|
+
export declare const STATIC_PAGE_URL_HINT: string;
|
|
21
|
+
/** Whose server the success line names, so a session on Reticle's own is never mistaken for the app. */
|
|
22
|
+
export declare const ServerStartedBy: {
|
|
23
|
+
readonly CALLER: "you passed its url";
|
|
24
|
+
readonly ALREADY_RUNNING: "it was already running";
|
|
25
|
+
readonly RETICLE_STATIC: "Reticle started this static server";
|
|
26
|
+
readonly SETUP: "setup started the dev server";
|
|
27
|
+
};
|
|
28
|
+
export type ServerStartedBy = (typeof ServerStartedBy)[keyof typeof ServerStartedBy];
|
|
19
29
|
export declare const SetupPhase: {
|
|
20
30
|
readonly DEV_SERVER: "dev-server";
|
|
21
31
|
readonly CONNECT: "connect";
|
|
@@ -29,11 +39,14 @@ export interface SetupOutcome {
|
|
|
29
39
|
readonly url?: string | undefined;
|
|
30
40
|
readonly sessionId?: string | undefined;
|
|
31
41
|
/**
|
|
32
|
-
* Always false
|
|
33
|
-
*
|
|
34
|
-
* Onboarding does not drive, so it cannot save a flow. The first run is what saves one.
|
|
42
|
+
* Always false: init never drives, and the coding agent proves the first flow after it.
|
|
35
43
|
*/
|
|
36
44
|
readonly flowSaved: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* The session was a Reticle-owned headless browser, now closed: there is no tab of the person's
|
|
47
|
+
* own to drive a first flow in.
|
|
48
|
+
*/
|
|
49
|
+
readonly leased?: boolean;
|
|
37
50
|
/** What the caller should do next, when this did not finish. */
|
|
38
51
|
readonly fallback: string[];
|
|
39
52
|
readonly notes: string[];
|
|
@@ -125,6 +138,13 @@ export interface SetupInput {
|
|
|
125
138
|
/** This project's id, so a live tab of it can be told from another app's on the same url. */
|
|
126
139
|
readonly projectId?: string | undefined;
|
|
127
140
|
readonly devCommand?: string | undefined;
|
|
141
|
+
/**
|
|
142
|
+
* `devCommand` is Reticle's own static server, not the project's. The page may already be served
|
|
143
|
+
* by something else (python, php, a Node server with an API), and only the person running init
|
|
144
|
+
* can say so — with --url — so they are told before :5500 starts, and the success line says
|
|
145
|
+
* whose server it is (#1426).
|
|
146
|
+
*/
|
|
147
|
+
readonly devCommandIsStaticPage?: boolean | undefined;
|
|
128
148
|
/** The app is already served here, so nothing is started. */
|
|
129
149
|
readonly suppliedUrl?: string | undefined;
|
|
130
150
|
/**
|