@reticlehq/server 3.5.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SKILL.md +123 -116
- package/dist/chromium-launch-options.d.ts +3 -1
- package/dist/chromium-launch-options.js +2 -1
- package/dist/command/cli/adhoc-suite.d.ts +14 -0
- package/dist/command/cli/adhoc-suite.js +42 -7
- package/dist/command/cli/adhoc-verdict.d.ts +19 -2
- package/dist/command/cli/adhoc-verdict.js +76 -9
- package/dist/command/cli/answers/gate-exit.d.ts +23 -0
- package/dist/command/cli/answers/gate-exit.js +45 -0
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +3 -1
- package/dist/command/cli/answers/open-note.d.ts +2 -0
- package/dist/command/cli/answers/open-note.js +22 -0
- package/dist/command/cli/auth/device-flow.d.ts +13 -2
- package/dist/command/cli/auth/device-flow.js +17 -0
- package/dist/command/cli/cli-doctor.js +14 -0
- package/dist/command/cli/cli-flow-commands.d.ts +0 -11
- package/dist/command/cli/cli-flow-commands.js +31 -112
- package/dist/command/cli/cli-kill.js +3 -2
- package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
- package/dist/command/cli/cli-parse-grammar.js +75 -0
- package/dist/command/cli/cli-parse-verify.d.ts +2 -0
- package/dist/command/cli/cli-parse-verify.js +18 -0
- package/dist/command/cli/cli-parse.d.ts +19 -28
- package/dist/command/cli/cli-parse.js +82 -182
- package/dist/command/cli/cli-update-commands.d.ts +1 -1
- package/dist/command/cli/cli-update-commands.js +61 -9
- package/dist/command/cli/cli-usage.d.ts +33 -0
- package/dist/command/cli/cli-usage.js +287 -0
- package/dist/command/cli/cli-verify.d.ts +35 -5
- package/dist/command/cli/cli-verify.js +114 -35
- package/dist/command/cli/cloud-cli.d.ts +13 -0
- package/dist/command/cli/cloud-cli.js +192 -341
- package/dist/command/cli/cloud-kit.d.ts +12 -0
- package/dist/command/cli/cloud-kit.js +41 -2
- package/dist/command/cli/cloud-link.d.ts +57 -0
- package/dist/command/cli/cloud-link.js +308 -0
- package/dist/command/cli/cloud-login.d.ts +22 -0
- package/dist/command/cli/cloud-login.js +96 -8
- package/dist/command/cli/context-command.d.ts +1 -0
- package/dist/command/cli/context-command.js +33 -0
- package/dist/command/cli/daemon-start-options.d.ts +3 -0
- package/dist/command/cli/daemon-start-options.js +24 -3
- package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
- package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
- package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
- package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
- package/dist/command/cli/doctor/doctor-project-line.js +5 -4
- package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
- package/dist/command/cli/doctor/doctor-rows.js +6 -0
- package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
- package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
- package/dist/command/cli/drive/drive-attach.d.ts +27 -2
- package/dist/command/cli/drive/drive-attach.js +71 -4
- package/dist/command/cli/drive/drive-command.d.ts +2 -1
- package/dist/command/cli/drive/drive-command.js +13 -7
- package/dist/command/cli/known-regression.d.ts +13 -0
- package/dist/command/cli/known-regression.js +34 -0
- package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
- package/dist/command/cli/launch/sdk-version-match.js +25 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
- package/dist/command/cli/mcp-command.d.ts +6 -0
- package/dist/command/cli/mcp-command.js +13 -5
- package/dist/command/cli/ports/port-holder.d.ts +10 -0
- package/dist/command/cli/ports/port-holder.js +25 -1
- package/dist/command/cli/project-name.d.ts +29 -1
- package/dist/command/cli/project-name.js +107 -2
- package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
- package/dist/command/cli/setup-mcp-cli.js +35 -12
- package/dist/command/cli/status/status-lines.d.ts +1 -0
- package/dist/command/cli/status/status-lines.js +47 -2
- package/dist/command/cli/status/workspace-links.d.ts +10 -0
- package/dist/command/cli/status/workspace-links.js +29 -0
- package/dist/command/cli/try-command.d.ts +96 -0
- package/dist/command/cli/try-command.js +362 -0
- package/dist/command/cli/tutorial.d.ts +0 -100
- package/dist/command/cli/tutorial.js +0 -181
- package/dist/command/cli/verify-results.d.ts +19 -0
- package/dist/command/cli/verify-results.js +29 -0
- package/dist/command/cli-onboarding.d.ts +0 -11
- package/dist/command/cli-onboarding.js +0 -15
- package/dist/command/cli.d.ts +20 -0
- package/dist/command/cli.js +130 -104
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
- package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
- package/dist/command/daemon/daemon-resilience.js +4 -4
- package/dist/command/daemon/daemon-resolve.d.ts +23 -1
- package/dist/command/daemon/daemon-resolve.js +79 -9
- package/dist/command/setup/agent-writer.d.ts +1 -1
- package/dist/command/setup/agent-writer.js +3 -2
- package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
- package/dist/command/setup/bringup/bridge-port.js +13 -3
- package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
- package/dist/command/setup/bringup/connect-lease.js +1 -0
- package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
- package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
- package/dist/command/setup/bringup/dev-server-wait.js +19 -0
- package/dist/command/setup/bringup/ensure-daemon.js +9 -2
- package/dist/command/setup/init/agent-restart.d.ts +23 -0
- package/dist/command/setup/init/agent-restart.js +28 -0
- package/dist/command/setup/init/init-port.d.ts +14 -1
- package/dist/command/setup/init/init-port.js +32 -2
- package/dist/command/setup/init/init-runtime.d.ts +22 -2
- package/dist/command/setup/init/init-runtime.js +114 -38
- package/dist/command/setup/node-effects.d.ts +2 -0
- package/dist/command/setup/node-effects.js +38 -9
- package/dist/command/setup/probe/existing-app.d.ts +12 -0
- package/dist/command/setup/probe/existing-app.js +14 -0
- package/dist/command/setup/remaining-steps.js +2 -1
- package/dist/command/setup/run-setup.d.ts +34 -9
- package/dist/command/setup/run-setup.js +65 -51
- package/dist/command/setup/setup-command.d.ts +25 -1
- package/dist/command/setup/setup-command.js +59 -4
- package/dist/command/setup/setup-mcp.js +25 -2
- package/dist/command/setup/tauri-signing.d.ts +19 -0
- package/dist/command/setup/tauri-signing.js +79 -0
- package/dist/command/setup/terminal/listeners.d.ts +10 -1
- package/dist/command/setup/terminal/listeners.js +37 -6
- package/dist/command/update/update-nudge.d.ts +9 -0
- package/dist/command/update/update-nudge.js +1 -1
- package/dist/command/update/updater.js +11 -15
- package/dist/command/version/version-nudge.js +3 -0
- package/dist/command/version/version-skew.d.ts +20 -1
- package/dist/command/version/version-skew.js +49 -4
- package/dist/features/crawl/crawl-tools.js +4 -0
- package/dist/features/crawl/crawl.d.ts +6 -0
- package/dist/features/crawl/crawl.js +23 -2
- package/dist/features/exhaust/ledger.d.ts +21 -14
- package/dist/features/exhaust/ledger.js +35 -9
- package/dist/features/harness/app-findings.d.ts +2 -0
- package/dist/features/harness/app-findings.js +52 -0
- package/dist/features/harness/drive-report.d.ts +61 -1
- package/dist/features/harness/drive-report.js +394 -26
- package/dist/features/harness/drive-runs.d.ts +120 -0
- package/dist/features/harness/drive-runs.js +289 -0
- package/dist/features/harness/drivers.d.ts +10 -14
- package/dist/features/harness/drivers.js +10 -14
- package/dist/features/harness/explore/console-pages.d.ts +15 -0
- package/dist/features/harness/explore/console-pages.js +146 -0
- package/dist/features/harness/explore/disparity.d.ts +19 -0
- package/dist/features/harness/explore/disparity.js +71 -0
- package/dist/features/harness/explore/fake-app.d.ts +16 -0
- package/dist/features/harness/explore/fake-app.js +49 -0
- package/dist/features/harness/explore/goal-search.d.ts +26 -0
- package/dist/features/harness/explore/goal-search.js +144 -0
- package/dist/features/harness/explore/page-tree.d.ts +49 -0
- package/dist/features/harness/explore/page-tree.js +148 -0
- package/dist/features/harness/explore/site-map.d.ts +34 -0
- package/dist/features/harness/explore/site-map.js +150 -0
- package/dist/features/harness/fill-values.d.ts +3 -73
- package/dist/features/harness/fill-values.js +3 -169
- package/dist/features/harness/goals.d.ts +82 -0
- package/dist/features/harness/goals.js +330 -0
- package/dist/features/harness/harness.d.ts +51 -1
- package/dist/features/harness/harness.js +207 -6
- package/dist/features/harness/platform/drive-target.d.ts +30 -0
- package/dist/features/harness/platform/drive-target.js +81 -0
- package/dist/features/harness/platform/local-apps.d.ts +127 -0
- package/dist/features/harness/platform/local-apps.js +280 -0
- package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
- package/dist/features/harness/platform/persona-credentials.js +69 -0
- package/dist/features/harness/platform/platform-drives.d.ts +61 -0
- package/dist/features/harness/platform/platform-drives.js +114 -0
- package/dist/features/harness/platform/refusal.d.ts +52 -0
- package/dist/features/harness/platform/refusal.js +71 -0
- package/dist/features/harness/platform/remote-drive.d.ts +186 -0
- package/dist/features/harness/platform/remote-drive.js +378 -0
- package/dist/features/harness/platform/script.d.ts +94 -0
- package/dist/features/harness/platform/script.js +260 -0
- package/dist/features/harness/platform/server-driver.d.ts +54 -0
- package/dist/features/harness/platform/server-driver.js +182 -0
- package/dist/features/harness/platform-config.d.ts +41 -1
- package/dist/features/harness/platform-config.js +106 -9
- package/dist/features/harness/route-guess.d.ts +13 -0
- package/dist/features/harness/route-guess.js +49 -0
- package/dist/features/harness/script/app-controls.d.ts +5 -0
- package/dist/features/harness/script/app-controls.js +40 -0
- package/dist/features/harness/script/lane-ids.d.ts +14 -0
- package/dist/features/harness/script/lane-ids.js +16 -0
- package/dist/features/harness/script/script-run.d.ts +70 -0
- package/dist/features/harness/script/script-run.js +606 -0
- package/dist/features/license/license.d.ts +2 -2
- package/dist/features/visual/step-shots.d.ts +31 -0
- package/dist/features/visual/step-shots.js +231 -0
- package/dist/features/visual/visual-tools.d.ts +10 -1
- package/dist/features/visual/visual-tools.js +62 -17
- package/dist/hooks/client-directory.d.ts +18 -0
- package/dist/hooks/client-directory.js +57 -0
- package/dist/hooks/coding-agents.d.ts +34 -0
- package/dist/hooks/coding-agents.js +117 -0
- package/dist/hooks/driven-by.d.ts +23 -0
- package/dist/hooks/driven-by.js +56 -0
- package/dist/hooks/hook-bus.d.ts +4 -0
- package/dist/hooks/hook-bus.js +18 -0
- package/dist/hooks/hook-commands.js +15 -4
- package/dist/hooks/tool-log.d.ts +9 -0
- package/dist/hooks/tool-log.js +29 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +80 -243
- package/dist/judgement/capsule/capsule-store.d.ts +2 -2
- package/dist/judgement/capsule/causal-summary.d.ts +15 -1
- package/dist/judgement/capsule/causal-summary.js +33 -0
- package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
- package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
- package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
- package/dist/judgement/runs/artifact/gap-summary.js +12 -3
- package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
- package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
- package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
- package/dist/judgement/runs/artifact/run-store.js +195 -3
- package/dist/judgement/runs/context-tools.js +59 -1
- package/dist/judgement/runs/default-run-id.d.ts +3 -0
- package/dist/judgement/runs/default-run-id.js +16 -0
- package/dist/judgement/runs/drive-run.d.ts +71 -1
- package/dist/judgement/runs/drive-run.js +317 -5
- package/dist/judgement/runs/repair-prompt.js +1 -1
- package/dist/judgement/runs/resume.d.ts +44 -0
- package/dist/judgement/runs/resume.js +137 -0
- package/dist/judgement/runs/reticle-runner.js +13 -3
- package/dist/judgement/runs/runner-port.d.ts +5 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +5 -2
- package/dist/judgement/runs/verification-sync.js +40 -18
- package/dist/language/flows/change/gate.d.ts +10 -0
- package/dist/language/flows/change/gate.js +22 -0
- package/dist/language/flows/decision.js +36 -1
- package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
- package/dist/language/flows/fields/flow-secret-field.js +25 -2
- package/dist/language/flows/flow-anchor.d.ts +61 -10
- package/dist/language/flows/flow-anchor.js +98 -6
- package/dist/language/flows/flow-cross-step.d.ts +15 -0
- package/dist/language/flows/flow-cross-step.js +21 -0
- package/dist/language/flows/flow-intent.d.ts +1 -0
- package/dist/language/flows/flow-journey.d.ts +6 -0
- package/dist/language/flows/flow-journey.js +20 -0
- package/dist/language/flows/flow-learning.d.ts +4 -0
- package/dist/language/flows/flow-learning.js +45 -14
- package/dist/language/flows/flow-mutate-tools.js +5 -3
- package/dist/language/flows/flow-replay-run.d.ts +23 -9
- package/dist/language/flows/flow-replay-run.js +115 -110
- package/dist/language/flows/flow-replay-types.d.ts +1 -1
- package/dist/language/flows/flow-replay.d.ts +40 -1
- package/dist/language/flows/flow-replay.js +110 -22
- package/dist/language/flows/flow-result.d.ts +22 -1
- package/dist/language/flows/flow-result.js +47 -2
- package/dist/language/flows/flow-scope.js +5 -1
- package/dist/language/flows/flow-step-runners.d.ts +22 -2
- package/dist/language/flows/flow-step-runners.js +247 -47
- package/dist/language/flows/flow-store-for-session.d.ts +2 -2
- package/dist/language/flows/flow-store-for-session.js +7 -3
- package/dist/language/flows/flow-tools.d.ts +10 -0
- package/dist/language/flows/flow-tools.js +112 -89
- package/dist/language/flows/flows.d.ts +16 -1
- package/dist/language/flows/flows.js +74 -12
- package/dist/language/flows/heal-run.js +6 -4
- package/dist/language/flows/narrow-write.d.ts +7 -0
- package/dist/language/flows/narrow-write.js +36 -1
- package/dist/language/flows/recording/flake.d.ts +2 -2
- package/dist/language/flows/recording/recording-backtrack.js +14 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
- package/dist/language/flows/recording/tape/recordings.js +95 -13
- package/dist/language/flows/replay-from-hud.d.ts +20 -0
- package/dist/language/flows/replay-from-hud.js +51 -0
- package/dist/language/flows/replay.d.ts +9 -5
- package/dist/language/flows/replay.js +56 -15
- package/dist/language/flows/single-replay.d.ts +7 -0
- package/dist/language/flows/single-replay.js +26 -0
- package/dist/language/flows/suite/suite-flakes.js +2 -0
- package/dist/language/flows/suite-selection.d.ts +2 -15
- package/dist/language/flows/suite-selection.js +4 -3
- package/dist/language/flows/verify-change-tools.d.ts +1 -0
- package/dist/language/flows/verify-change-tools.js +202 -191
- package/dist/launch-chromium.d.ts +27 -5
- package/dist/launch-chromium.js +38 -8
- package/dist/memory/cloud/cloud-config.d.ts +22 -1
- package/dist/memory/cloud/cloud-config.js +34 -5
- package/dist/memory/cloud/cloud-sync.d.ts +17 -14
- package/dist/memory/cloud/cloud-sync.js +15 -4
- package/dist/memory/cloud/harness-config.d.ts +75 -1
- package/dist/memory/cloud/harness-config.js +115 -24
- package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
- package/dist/memory/cloud/hud-notices-source.js +128 -0
- package/dist/memory/cloud/memory-scope.d.ts +161 -0
- package/dist/memory/cloud/memory-scope.js +227 -0
- package/dist/memory/cloud/sync-cycle.d.ts +44 -7
- package/dist/memory/cloud/sync-cycle.js +129 -15
- package/dist/memory/cloud/sync-daemon.d.ts +11 -0
- package/dist/memory/cloud/sync-daemon.js +121 -9
- package/dist/memory/cloud/sync-disk.d.ts +1 -1
- package/dist/memory/cloud/sync-disk.js +31 -10
- package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
- package/dist/memory/cloud/sync-screenshots.js +105 -0
- package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
- package/dist/memory/cloud/unsynced-roots.js +166 -0
- package/dist/memory/impact/account-watch.d.ts +34 -0
- package/dist/memory/impact/account-watch.js +59 -0
- package/dist/memory/impact/impact-recorder.d.ts +8 -0
- package/dist/memory/impact/impact-recorder.js +12 -2
- package/dist/memory/impact/impact-store.d.ts +17 -4
- package/dist/memory/impact/impact-store.js +169 -63
- package/dist/memory/intent/inline-intent.d.ts +1 -0
- package/dist/memory/intent/intent-shard-store.js +16 -4
- package/dist/memory/intent/intent-shard.d.ts +14 -2
- package/dist/memory/intent/intent-store.d.ts +1 -0
- package/dist/memory/intent/intent-tools.js +122 -4
- package/dist/memory/intent/open-intents.d.ts +6 -0
- package/dist/memory/intent/open-intents.js +10 -1
- package/dist/memory/intent/settled-words.d.ts +24 -0
- package/dist/memory/intent/settled-words.js +130 -0
- package/dist/memory/journal/drive-flow.d.ts +16 -0
- package/dist/memory/journal/drive-flow.js +34 -2
- package/dist/memory/journal/drive-run-flush.d.ts +2 -0
- package/dist/memory/journal/drive-run-flush.js +20 -5
- package/dist/memory/journal/envelope.d.ts +8 -8
- package/dist/memory/journal/journal-recorder.js +52 -3
- package/dist/memory/journal/on-disk/retention.d.ts +8 -0
- package/dist/memory/journal/on-disk/retention.js +32 -2
- package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
- package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
- package/dist/memory/journal/session-end.d.ts +15 -1
- package/dist/memory/journal/session-end.js +42 -9
- package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
- package/dist/memory/project/artifact-root-resolver.js +125 -16
- package/dist/memory/project/artifact-root.d.ts +46 -8
- package/dist/memory/project/artifact-root.js +89 -10
- package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
- package/dist/memory/project/dir/reticle-dir.js +26 -3
- package/dist/memory/project/link-directory.d.ts +15 -0
- package/dist/memory/project/link-directory.js +44 -0
- package/dist/memory/project/project-tools.js +22 -3
- package/dist/memory/project/root-claims.d.ts +6 -0
- package/dist/memory/project/root-claims.js +39 -0
- package/dist/memory/project/session-root.d.ts +26 -1
- package/dist/memory/project/session-root.js +49 -5
- package/dist/memory/project/sync-status.d.ts +85 -0
- package/dist/memory/project/sync-status.js +224 -0
- package/dist/memory/recall/memory-tools.js +47 -2
- package/dist/memory/recall/platform-memory.d.ts +34 -0
- package/dist/memory/recall/platform-memory.js +139 -0
- package/dist/memory/recall/project-memory.d.ts +19 -0
- package/dist/memory/recall/project-memory.js +80 -13
- package/dist/portal/bridge/bridge.d.ts +9 -3
- package/dist/portal/bridge/bridge.js +82 -22
- package/dist/portal/bridge/harness-request.d.ts +23 -0
- package/dist/portal/bridge/harness-request.js +27 -0
- package/dist/portal/bridge/pairing-token.d.ts +9 -0
- package/dist/portal/bridge/pairing-token.js +17 -0
- package/dist/portal/bridge/wrong-path.d.ts +17 -0
- package/dist/portal/bridge/wrong-path.js +35 -0
- package/dist/portal/input/network-mock-tools.js +11 -2
- package/dist/portal/input/real-input.d.ts +83 -10
- package/dist/portal/input/real-input.js +218 -30
- package/dist/portal/input/viewport-tools.js +3 -3
- package/dist/portal/pool/browser-pool.d.ts +70 -9
- package/dist/portal/pool/browser-pool.js +190 -37
- package/dist/portal/pool/context-permissions.d.ts +33 -0
- package/dist/portal/pool/context-permissions.js +33 -0
- package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
- package/dist/portal/pool/lease-marker-stamp.js +49 -0
- package/dist/portal/pool/playwright-launcher.d.ts +35 -0
- package/dist/portal/pool/playwright-launcher.js +64 -3
- package/dist/portal/pool/pool-contract.d.ts +28 -5
- package/dist/portal/session/agent-link.d.ts +8 -0
- package/dist/portal/session/agent-link.js +17 -0
- package/dist/portal/session/command-payload.d.ts +8 -0
- package/dist/portal/session/command-payload.js +24 -0
- package/dist/portal/session/daemon-answers.d.ts +3 -3
- package/dist/portal/session/daemon-answers.js +4 -2
- package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
- package/dist/portal/session/dev-server/dev-command.js +87 -12
- package/dist/portal/session/facts/departure-note.d.ts +22 -0
- package/dist/portal/session/facts/departure-note.js +47 -0
- package/dist/portal/session/facts/observed-state.d.ts +16 -18
- package/dist/portal/session/facts/observed-state.js +46 -3
- package/dist/portal/session/facts/session-replaced.d.ts +5 -0
- package/dist/portal/session/facts/session-replaced.js +5 -0
- package/dist/portal/session/first-run-wiring.d.ts +42 -0
- package/dist/portal/session/first-run-wiring.js +132 -0
- package/dist/portal/session/human/live-control.d.ts +9 -2
- package/dist/portal/session/human/live-control.js +12 -3
- package/dist/portal/session/human/notes-ledger.d.ts +20 -0
- package/dist/portal/session/human/notes-ledger.js +55 -0
- package/dist/portal/session/human/review-store.d.ts +12 -0
- package/dist/portal/session/human/review-store.js +18 -10
- package/dist/portal/session/live-control-tools.d.ts +0 -13
- package/dist/portal/session/live-control-tools.js +107 -13
- package/dist/portal/session/narration-args.d.ts +5 -0
- package/dist/portal/session/narration-args.js +17 -0
- package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
- package/dist/portal/session/no-session-diagnosis.js +46 -9
- package/dist/portal/session/no-session-next-action.d.ts +31 -0
- package/dist/portal/session/no-session-next-action.js +159 -60
- package/dist/portal/session/no-session-watch.d.ts +14 -1
- package/dist/portal/session/no-session-watch.js +227 -17
- package/dist/portal/session/presence/session-lease.js +1 -1
- package/dist/portal/session/presence/session-mirror.js +3 -0
- package/dist/portal/session/recorded-gaps.d.ts +97 -0
- package/dist/portal/session/recorded-gaps.js +251 -0
- package/dist/portal/session/serving-directory.d.ts +27 -0
- package/dist/portal/session/serving-directory.js +45 -0
- package/dist/portal/session/session-health.d.ts +18 -0
- package/dist/portal/session/session-health.js +9 -1
- package/dist/portal/session/session-info.d.ts +8 -1
- package/dist/portal/session/session-info.js +8 -1
- package/dist/portal/session/session-manager.d.ts +39 -0
- package/dist/portal/session/session-manager.js +98 -11
- package/dist/portal/session/session-reaper.js +4 -1
- package/dist/portal/session/session-successor.d.ts +13 -0
- package/dist/portal/session/session-successor.js +1 -1
- package/dist/portal/session/session-tools.js +26 -3
- package/dist/portal/session/session.d.ts +22 -30
- package/dist/portal/session/session.js +81 -79
- package/dist/portal/session/timing/command-timeout.js +25 -1
- package/dist/portal/session/timing/wall-clock.d.ts +1 -1
- package/dist/portal/session/timing/wall-clock.js +1 -1
- package/dist/portal/session/zero-install-first-call.d.ts +31 -0
- package/dist/portal/session/zero-install-first-call.js +88 -0
- package/dist/start-options.d.ts +12 -0
- package/dist/start-wiring.d.ts +63 -0
- package/dist/start-wiring.js +169 -0
- package/dist/status-payload.d.ts +23 -1
- package/dist/status-payload.js +36 -1
- package/dist/surface/http-server.js +18 -2
- package/dist/surface/mcp/attach-memory.d.ts +1 -0
- package/dist/surface/mcp/attach-memory.js +12 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
- package/dist/surface/mcp/mcp-proxy.js +65 -13
- package/dist/surface/mcp/mcp.d.ts +34 -6
- package/dist/surface/mcp/mcp.js +61 -17
- package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
- package/dist/surface/mcp/proxy/drive-calls.js +27 -0
- package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
- package/dist/surface/mcp/server-instructions.d.ts +4 -2
- package/dist/surface/mcp/server-instructions.js +32 -14
- package/dist/surface/mcp/shared-params.js +2 -2
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +1 -0
- package/dist/surface/tools/account-tool.d.ts +22 -0
- package/dist/surface/tools/account-tool.js +157 -0
- package/dist/surface/tools/act/act-danger.d.ts +11 -0
- package/dist/surface/tools/act/act-danger.js +38 -1
- package/dist/surface/tools/act/act-observation.d.ts +33 -0
- package/dist/surface/tools/act/act-observation.js +57 -0
- package/dist/surface/tools/act/act-preflight.js +25 -2
- package/dist/surface/tools/act/act-target.js +8 -3
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
- package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
- package/dist/surface/tools/act/resolve-target.d.ts +1 -1
- package/dist/surface/tools/act/resolve-target.js +18 -3
- package/dist/surface/tools/act/screen-request.d.ts +34 -0
- package/dist/surface/tools/act/screen-request.js +113 -0
- package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
- package/dist/surface/tools/act/sequence-grade.js +13 -2
- package/dist/surface/tools/act/settle-in-flight.js +25 -3
- package/dist/surface/tools/act-sequence-tool.js +138 -29
- package/dist/surface/tools/act-tools.d.ts +0 -9
- package/dist/surface/tools/act-tools.js +71 -41
- package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
- package/dist/surface/tools/agent/app-notes-learning.js +80 -0
- package/dist/surface/tools/agent/app-notes.d.ts +4 -0
- package/dist/surface/tools/agent/app-notes.js +48 -0
- package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
- package/dist/surface/tools/agent/build-staleness.js +62 -0
- package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
- package/dist/surface/tools/agent/compact-envelope.js +374 -0
- package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
- package/dist/surface/tools/agent/for-the-agent.js +44 -0
- package/dist/surface/tools/agent/notices.d.ts +50 -0
- package/dist/surface/tools/agent/notices.js +152 -0
- package/dist/surface/tools/agent/reteach.d.ts +11 -0
- package/dist/surface/tools/agent/reteach.js +50 -0
- package/dist/surface/tools/args/alias-args.d.ts +5 -0
- package/dist/surface/tools/args/alias-args.js +10 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
- package/dist/surface/tools/assert/assert-source.d.ts +15 -0
- package/dist/surface/tools/assert/assert-source.js +40 -0
- package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
- package/dist/surface/tools/assert/assert-verdict.js +42 -17
- package/dist/surface/tools/browser-tools.js +51 -2
- package/dist/surface/tools/chat-drives.d.ts +101 -0
- package/dist/surface/tools/chat-drives.js +409 -0
- package/dist/surface/tools/coverage-tools.d.ts +2 -10
- package/dist/surface/tools/coverage-tools.js +2 -53
- package/dist/surface/tools/dynamic-tools.js +29 -1
- package/dist/surface/tools/empty-session-list.d.ts +51 -0
- package/dist/surface/tools/empty-session-list.js +120 -0
- package/dist/surface/tools/error-recovery.d.ts +14 -0
- package/dist/surface/tools/error-recovery.js +105 -8
- package/dist/surface/tools/explore-tools.d.ts +31 -1
- package/dist/surface/tools/explore-tools.js +438 -66
- package/dist/surface/tools/feedback-tools.d.ts +2 -3
- package/dist/surface/tools/feedback-tools.js +18 -3
- package/dist/surface/tools/gap-novelty.d.ts +3 -1
- package/dist/surface/tools/gap-novelty.js +8 -1
- package/dist/surface/tools/harness-explore.d.ts +118 -57
- package/dist/surface/tools/harness-explore.js +344 -292
- package/dist/surface/tools/harness-gate.d.ts +88 -0
- package/dist/surface/tools/harness-gate.js +235 -0
- package/dist/surface/tools/harness-hunt.d.ts +43 -0
- package/dist/surface/tools/harness-hunt.js +215 -0
- package/dist/surface/tools/harness-plan.d.ts +17 -0
- package/dist/surface/tools/harness-plan.js +38 -0
- package/dist/surface/tools/harness-script.d.ts +30 -0
- package/dist/surface/tools/harness-script.js +560 -0
- package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
- package/dist/surface/tools/harness-tab-guard.js +27 -0
- package/dist/surface/tools/harness-toolset.d.ts +22 -1
- package/dist/surface/tools/harness-toolset.js +101 -7
- package/dist/surface/tools/human-notes.d.ts +16 -0
- package/dist/surface/tools/human-notes.js +27 -0
- package/dist/surface/tools/invoke-tool.d.ts +5 -2
- package/dist/surface/tools/invoke-tool.js +263 -85
- package/dist/surface/tools/lease-hint.js +26 -5
- package/dist/surface/tools/lease-permissions.d.ts +33 -0
- package/dist/surface/tools/lease-permissions.js +73 -0
- package/dist/surface/tools/lease-readiness.d.ts +38 -0
- package/dist/surface/tools/lease-readiness.js +57 -0
- package/dist/surface/tools/lease-seed.d.ts +49 -0
- package/dist/surface/tools/lease-seed.js +167 -0
- package/dist/surface/tools/lease-tools.d.ts +13 -24
- package/dist/surface/tools/lease-tools.js +146 -197
- package/dist/surface/tools/live-call-text.js +4 -4
- package/dist/surface/tools/merge-tools.js +42 -2
- package/dist/surface/tools/merged-name-redirect.js +4 -0
- package/dist/surface/tools/next-step.d.ts +29 -0
- package/dist/surface/tools/next-step.js +214 -0
- package/dist/surface/tools/observe-tools.js +45 -9
- package/dist/surface/tools/platform-moment.d.ts +72 -0
- package/dist/surface/tools/platform-moment.js +296 -0
- package/dist/surface/tools/query-hint-schema.d.ts +7 -0
- package/dist/surface/tools/query-hint-schema.js +10 -0
- package/dist/surface/tools/read-tools.js +71 -14
- package/dist/surface/tools/real-input-attempt.js +96 -13
- package/dist/surface/tools/reticle-result.d.ts +120 -0
- package/dist/surface/tools/reticle-result.js +364 -0
- package/dist/surface/tools/tool-kit.d.ts +83 -3
- package/dist/surface/tools/tool-kit.js +77 -7
- package/dist/surface/tools/tools.js +43 -59
- package/dist/telemetry/account-envelope.d.ts +7 -0
- package/dist/telemetry/account-envelope.js +61 -0
- package/dist/telemetry/agent-client.d.ts +15 -0
- package/dist/telemetry/agent-client.js +57 -0
- package/dist/telemetry/app-instrumented.js +9 -2
- package/dist/telemetry/argument-shape.d.ts +7 -0
- package/dist/telemetry/argument-shape.js +86 -1
- package/dist/telemetry/automation-hint.d.ts +2 -3
- package/dist/telemetry/automation-hint.js +33 -8
- package/dist/telemetry/cli-telemetry.js +7 -2
- package/dist/telemetry/daemon-telemetry.js +3 -0
- package/dist/telemetry/error-fingerprint.d.ts +10 -1
- package/dist/telemetry/error-fingerprint.js +61 -5
- package/dist/telemetry/feedback-cli.d.ts +0 -13
- package/dist/telemetry/feedback-cli.js +0 -77
- package/dist/telemetry/feedback.d.ts +13 -0
- package/dist/telemetry/feedback.js +183 -17
- package/dist/telemetry/harness-run.d.ts +18 -0
- package/dist/telemetry/harness-run.js +80 -0
- package/dist/telemetry/hud-events.d.ts +16 -0
- package/dist/telemetry/hud-events.js +27 -0
- package/dist/telemetry/hud-metrics.d.ts +29 -6
- package/dist/telemetry/hud-metrics.js +116 -25
- package/dist/telemetry/init-telemetry.js +2 -2
- package/dist/telemetry/install-source.d.ts +13 -25
- package/dist/telemetry/install-source.js +44 -3
- package/dist/telemetry/mcp-connection.d.ts +0 -14
- package/dist/telemetry/mcp-connection.js +5 -1
- package/dist/telemetry/onboarding-firsts.d.ts +32 -0
- package/dist/telemetry/onboarding-firsts.js +81 -6
- package/dist/telemetry/platform-linked.d.ts +5 -0
- package/dist/telemetry/platform-linked.js +32 -0
- package/dist/telemetry/project-profile.js +5 -3
- package/dist/telemetry/proxy-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.d.ts +15 -4
- package/dist/telemetry/session-metrics.js +88 -52
- package/dist/telemetry/telemetry.d.ts +38 -2
- package/dist/telemetry/telemetry.js +144 -34
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +13 -4
- package/dist/wire-journal.d.ts +2 -2
- package/dist/wire-journal.js +20 -6
- package/docs/README.md +3 -3
- package/docs/actions.mdx +6 -3
- package/docs/adapters.md +1 -1
- package/docs/agent-cheatsheet.md +25 -28
- package/docs/architecture.md +5 -5
- package/docs/autodrive.md +33 -28
- package/docs/benchmarks.md +5 -5
- package/docs/best-practices.mdx +27 -9
- package/docs/capabilities.mdx +14 -16
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +54 -75
- package/docs/cli/doctor.mdx +14 -3
- package/docs/cli/drive.mdx +20 -14
- package/docs/cli/feedback.mdx +3 -3
- package/docs/cli/gate.mdx +7 -2
- package/docs/cli/help.mdx +50 -55
- package/docs/cli/init.mdx +43 -28
- package/docs/cli/license.mdx +12 -8
- package/docs/cli/mcp.mdx +4 -4
- package/docs/cli/open.mdx +3 -3
- package/docs/cli/report.mdx +4 -2
- package/docs/cli/restart.mdx +2 -2
- package/docs/cli/rollback.mdx +14 -8
- package/docs/cli/serve.mdx +4 -4
- package/docs/cli/setup.mdx +23 -0
- package/docs/cli/status.mdx +18 -5
- package/docs/cli/stop.mdx +67 -8
- package/docs/cli/try.mdx +62 -0
- package/docs/cli/update.mdx +4 -3
- package/docs/cli/verify.mdx +17 -6
- package/docs/cli/version.mdx +5 -4
- package/docs/cli.mdx +111 -42
- package/docs/debugging.md +3 -3
- package/docs/deploy-checks.md +1 -1
- package/docs/desktop.mdx +9 -3
- package/docs/enterprise.md +11 -10
- package/docs/environment.mdx +7 -8
- package/docs/faq.mdx +3 -3
- package/docs/first-drive.md +5 -4
- package/docs/flows.md +35 -27
- package/docs/for-agents.md +4 -5
- package/docs/frameworks.mdx +32 -21
- package/docs/getting-started.md +65 -61
- package/docs/human-control.md +16 -16
- package/docs/index.mdx +15 -42
- package/docs/install-agentic.mdx +22 -37
- package/docs/install-manual.mdx +23 -13
- package/docs/instrumentation.mdx +5 -3
- package/docs/integration-patterns.md +7 -7
- package/docs/license-activation.mdx +1 -1
- package/docs/multi-agent-testing.md +24 -6
- package/docs/packages/babel-plugin.mdx +4 -2
- package/docs/packages/browser.mdx +16 -10
- package/docs/packages/core.mdx +12 -5
- package/docs/packages/electron.mdx +3 -2
- package/docs/packages/engine.mdx +1 -1
- package/docs/packages/eslint-plugin.mdx +18 -12
- package/docs/packages/next.mdx +8 -7
- package/docs/packages/open-verification.mdx +1 -1
- package/docs/packages/server.mdx +5 -5
- package/docs/packages/tauri.mdx +9 -9
- package/docs/packages/test.mdx +4 -10
- package/docs/packages/vite-plugin.mdx +32 -4
- package/docs/packages.mdx +11 -15
- package/docs/platform-integration.md +6 -5
- package/docs/predicates.mdx +40 -24
- package/docs/quickstart.mdx +69 -30
- package/docs/required-checks.md +8 -7
- package/docs/reticle-manual.md +15 -5
- package/docs/skill-file.mdx +17 -79
- package/docs/skill-setup.md +9 -9
- package/docs/skill.md +200 -0
- package/docs/system-map.md +7 -7
- package/docs/telemetry.md +23 -25
- package/docs/testing.md +4 -4
- package/docs/token-efficiency.md +12 -12
- package/docs/tools/act-and-wait.mdx +9 -2
- package/docs/tools/act-sequence.mdx +6 -7
- package/docs/tools/act.mdx +2 -2
- package/docs/tools/assert.mdx +18 -17
- package/docs/tools/console.mdx +9 -9
- package/docs/tools/inspect.mdx +16 -7
- package/docs/tools/look.mdx +24 -0
- package/docs/tools/navigate.mdx +5 -3
- package/docs/tools/network.mdx +2 -2
- package/docs/tools/observe.mdx +6 -6
- package/docs/tools/overview.mdx +34 -33
- package/docs/tools/query.mdx +5 -5
- package/docs/tools/session-and-feedback.mdx +22 -13
- package/docs/tools/sessions.mdx +8 -8
- package/docs/tools/snapshot.mdx +6 -5
- package/docs/tools/state.mdx +9 -9
- package/docs/tools/tools-and-run.mdx +26 -24
- package/docs/tools/verify.mdx +28 -0
- package/docs/tools/wait-for.mdx +8 -4
- package/docs/troubleshooting.mdx +21 -6
- package/docs/usage.md +55 -46
- package/docs/use-cases.mdx +3 -3
- package/docs/vs-chrome-devtools-mcp.mdx +9 -6
- package/docs/vs-playwright-mcp.mdx +3 -1
- package/docs/what-is-recorded.md +17 -5
- package/docs/what-is-reticle.mdx +5 -3
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/cli/demo/demo-page.d.ts +0 -78
- package/dist/command/cli/demo/demo-page.js +0 -241
- package/dist/command/cli/demo/demo-run.d.ts +0 -38
- package/dist/command/cli/demo/demo-run.js +0 -138
- package/dist/features/harness/driver.d.ts +0 -50
- package/dist/features/harness/driver.js +0 -236
- package/dist/features/harness/jev-driver.d.ts +0 -188
- package/dist/features/harness/jev-driver.js +0 -678
- package/dist/features/harness/openai-driver.d.ts +0 -58
- package/dist/features/harness/openai-driver.js +0 -206
- package/dist/judgement/hunt/hunt-report.d.ts +0 -49
- package/dist/judgement/hunt/hunt-report.js +0 -84
- package/dist/language/flows/buddy-status.d.ts +0 -25
- package/dist/language/flows/buddy-status.js +0 -32
- package/dist/language/flows/change/watch-batcher.d.ts +0 -18
- package/dist/language/flows/change/watch-batcher.js +0 -19
- package/dist/memory/cloud/harness-offer.d.ts +0 -44
- package/dist/memory/cloud/harness-offer.js +0 -145
- package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
- package/dist/memory/project/dir/fill-value-store.js +0 -88
- package/dist/surface/tools/feature-capture.d.ts +0 -151
- package/dist/surface/tools/feature-capture.js +0 -235
- package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
- package/dist/surface/tools/tool-hit-rate.js +0 -90
- package/dist/telemetry/harness-drive.d.ts +0 -4
- package/dist/telemetry/harness-drive.js +0 -35
- package/dist/telemetry/identify.d.ts +0 -22
- package/dist/telemetry/identify.js +0 -73
- package/docs/cli/capsules.mdx +0 -70
- package/docs/cli/hunt.mdx +0 -73
- package/docs/cli/identify.mdx +0 -76
- package/docs/cli/kill.mdx +0 -91
- package/docs/cli/watch.mdx +0 -62
- package/docs/local-registry.md +0 -143
|
@@ -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
|
|
@@ -106,7 +112,8 @@ export class OwnedDevServer {
|
|
|
106
112
|
catch {
|
|
107
113
|
/* not written yet */
|
|
108
114
|
}
|
|
109
|
-
|
|
115
|
+
// Filesystem timestamps can include a fractional millisecond beyond Date.now()'s integer.
|
|
116
|
+
return Math.max(0, Date.now() - lastOutputAt);
|
|
110
117
|
}
|
|
111
118
|
/** Ports anything in this server's process tree is listening on. */
|
|
112
119
|
listeningPorts() {
|
|
@@ -168,8 +175,21 @@ export class OwnedDevServer {
|
|
|
168
175
|
this.child = undefined;
|
|
169
176
|
}
|
|
170
177
|
}
|
|
171
|
-
|
|
172
|
-
|
|
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 '';
|
|
173
193
|
return r.stdout ?? '';
|
|
174
194
|
}
|
|
175
195
|
/**
|
|
@@ -182,13 +202,22 @@ function run(file, args) {
|
|
|
182
202
|
* `init` then waits out the full quiet window and reports "the dev server stopped producing output
|
|
183
203
|
* without ever serving a page" about a Vite server that was serving perfectly the whole time.
|
|
184
204
|
*
|
|
185
|
-
* The fallback prints the same
|
|
186
|
-
* without knowing which produced it.
|
|
187
|
-
*
|
|
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.
|
|
188
213
|
*/
|
|
189
|
-
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() }';
|
|
190
219
|
function windowsProcessPairs() {
|
|
191
|
-
const fromWmic = parseWmicProcesses(run('wmic', ['process', 'get', 'ParentProcessId,ProcessId']));
|
|
220
|
+
const fromWmic = parseWmicProcesses(run('wmic', ['process', 'get', 'CreationDate,ParentProcessId,ProcessId']));
|
|
192
221
|
if (0 < fromWmic.length)
|
|
193
222
|
return fromWmic;
|
|
194
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
|
+
}
|
|
@@ -34,7 +34,8 @@ export function remainingSteps(p) {
|
|
|
34
34
|
'`reticle_*` tools, ending in `reticle_act_and_wait` or `reticle_assert` — those two are ' +
|
|
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
|
-
'with no model in the loop; that route needs
|
|
37
|
+
'with no model in the loop; that route runs on the Reticle platform and needs a linked ' +
|
|
38
|
+
'project (`reticle connect`); a new account gets 10 free credits to try it.');
|
|
38
39
|
}
|
|
39
40
|
// Whether anything is actually outstanding, read BEFORE the docs pointer is added -- that line is
|
|
40
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[];
|
|
@@ -55,6 +68,11 @@ export interface DaemonReason {
|
|
|
55
68
|
export interface OwnedBrowser {
|
|
56
69
|
readonly sessionId: string;
|
|
57
70
|
readonly release: () => Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* The page never dialled in, so the lease injected Reticle's own reader. That session proves the
|
|
73
|
+
* reader, not this install, and must never end onboarding as "connected".
|
|
74
|
+
*/
|
|
75
|
+
readonly zeroInstall?: boolean;
|
|
58
76
|
}
|
|
59
77
|
export interface SetupEffects {
|
|
60
78
|
/** Start the dev server. Resolves once started; the caller owns stopping it. */
|
|
@@ -120,6 +138,13 @@ export interface SetupInput {
|
|
|
120
138
|
/** This project's id, so a live tab of it can be told from another app's on the same url. */
|
|
121
139
|
readonly projectId?: string | undefined;
|
|
122
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;
|
|
123
148
|
/** The app is already served here, so nothing is started. */
|
|
124
149
|
readonly suppliedUrl?: string | undefined;
|
|
125
150
|
/**
|
|
@@ -2,18 +2,14 @@
|
|
|
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
|
|
14
10
|
* and a real browser to find out what happens when neither works.
|
|
15
11
|
*/
|
|
16
|
-
import { judgeWait, portBusyMessage, QUIET_MEANS_HUNG_MS, urlToWatch, WaitVerdict, } from './bringup/dev-server-wait.js';
|
|
12
|
+
import { judgeWait, devServerDiedMessage, portBusyMessage, QUIET_MEANS_HUNG_MS, urlToWatch, WaitVerdict, } from './bringup/dev-server-wait.js';
|
|
17
13
|
import { connectProgressLine, waitProgressLine } from './terminal/wait-progress.js';
|
|
18
14
|
/**
|
|
19
15
|
* Windows gets longer to say something before silence counts as a wedge.
|
|
@@ -47,6 +43,21 @@ const NO_BROWSER_GRACE_MS = 3_000;
|
|
|
47
43
|
* as opened, and init then waited out its whole connect budget over a correct install.
|
|
48
44
|
*/
|
|
49
45
|
const SYSTEM_BROWSER_GRACE_MS = 15_000;
|
|
46
|
+
/**
|
|
47
|
+
* Said before Reticle starts its own static server for a plain page, while it can still be acted
|
|
48
|
+
* on: the page may already be served by something with an API behind it, and only the person
|
|
49
|
+
* running init knows that (#1426).
|
|
50
|
+
*/
|
|
51
|
+
export const STATIC_PAGE_URL_HINT = 'This page has no dev server of its own, so Reticle is starting a static one. ' +
|
|
52
|
+
'If the page is already served (python -m http.server, php -S, a Node server with an API), ' +
|
|
53
|
+
're-run with `reticle init --url <app>` to attach to that server instead.';
|
|
54
|
+
/** Whose server the success line names, so a session on Reticle's own is never mistaken for the app. */
|
|
55
|
+
export const ServerStartedBy = {
|
|
56
|
+
CALLER: 'you passed its url',
|
|
57
|
+
ALREADY_RUNNING: 'it was already running',
|
|
58
|
+
RETICLE_STATIC: 'Reticle started this static server',
|
|
59
|
+
SETUP: 'setup started the dev server',
|
|
60
|
+
};
|
|
50
61
|
export const SetupPhase = {
|
|
51
62
|
DEV_SERVER: 'dev-server',
|
|
52
63
|
CONNECT: 'connect',
|
|
@@ -129,12 +140,14 @@ export async function runSetupPhases(input, fx) {
|
|
|
129
140
|
note(
|
|
130
141
|
// "stop here rather than invent one" is the SKILL.md rule, and the words are the contract —
|
|
131
142
|
// inventing a dev command is how a setup script runs the wrong thing and reports success.
|
|
132
|
-
'No dev command: the project names no dev, start or serve script, and
|
|
143
|
+
'No dev command: the project names no dev, start or serve script, and no app url was given (`reticle init --url <app>`). ' +
|
|
133
144
|
'Stopping here rather than invent one — start the app yourself and pass --url to say ' +
|
|
134
145
|
'where it is serving, or add a dev/start/serve script to package.json and re-run.');
|
|
135
146
|
return stop(input, SetupPhase.DEV_SERVER, {}, notes);
|
|
136
147
|
}
|
|
137
148
|
else {
|
|
149
|
+
if (true === input.devCommandIsStaticPage)
|
|
150
|
+
note(STATIC_PAGE_URL_HINT);
|
|
138
151
|
await fx.startDevServer(input.devCommand, input.appDir);
|
|
139
152
|
const startedAt = fx.now();
|
|
140
153
|
// This loop used to poll in complete silence. Reported as thirty minutes of nothing ending in a
|
|
@@ -177,18 +190,20 @@ export async function runSetupPhases(input, fx) {
|
|
|
177
190
|
break;
|
|
178
191
|
}
|
|
179
192
|
if (WaitVerdict.DEAD === verdict) {
|
|
180
|
-
note(portBusyMessage(fx.devServerOutput()) ??
|
|
181
|
-
'The dev server exited without serving anything.');
|
|
193
|
+
note(portBusyMessage(fx.devServerOutput()) ?? devServerDiedMessage(fx.devServerOutput()));
|
|
182
194
|
return stop(input, SetupPhase.DEV_SERVER, {}, notes);
|
|
183
195
|
}
|
|
184
196
|
if (WaitVerdict.HUNG === verdict) {
|
|
185
197
|
// Says BOTH were checked. A server that prints nothing but IS listening is the CRA case and
|
|
186
198
|
// must not be failed, so a reader has to be able to tell "we looked at the log" from "we
|
|
187
199
|
// looked at the log AND the ports".
|
|
188
|
-
|
|
189
|
-
? `
|
|
190
|
-
: undefined
|
|
191
|
-
|
|
200
|
+
const within = input.startupBudgetMs !== undefined && fx.now() - startedAt >= input.startupBudgetMs
|
|
201
|
+
? ` within ${String(input.startupBudgetMs)}ms`
|
|
202
|
+
: undefined;
|
|
203
|
+
note((undefined === watching
|
|
204
|
+
? `The dev server neither printed a URL nor bound a port${within ?? ''}, so setup has nothing to open. `
|
|
205
|
+
: undefined !== within
|
|
206
|
+
? `The dev server did not become ready${within}. `
|
|
192
207
|
: `The dev server stopped making progress before ${watching} became ready. `) +
|
|
193
208
|
'Check its log, increase --timeout for a slow build, or pass --url with the address it serves.');
|
|
194
209
|
return stop(input, SetupPhase.DEV_SERVER, {}, notes);
|
|
@@ -232,6 +247,23 @@ export async function runSetupPhases(input, fx) {
|
|
|
232
247
|
// dialled the bridge" over a correct install. With a lease to fall back on it is entered too, and
|
|
233
248
|
// only the system browser is skipped.
|
|
234
249
|
const canLease = undefined !== fx.openLease;
|
|
250
|
+
const injected = new Set();
|
|
251
|
+
/**
|
|
252
|
+
* The lease to keep, or undefined. A lease whose page only connected through Reticle's injected
|
|
253
|
+
* reader is handed straight back and its session excluded: it would otherwise be picked below and
|
|
254
|
+
* report a plain server with no SDK as an instrumented app.
|
|
255
|
+
*/
|
|
256
|
+
const keepLease = async (owned) => {
|
|
257
|
+
if ('failed' in owned) {
|
|
258
|
+
note(`Could not open ${url} in a Reticle-owned browser either: ${owned.failed}`);
|
|
259
|
+
return undefined;
|
|
260
|
+
}
|
|
261
|
+
if (true !== owned.zeroInstall)
|
|
262
|
+
return owned;
|
|
263
|
+
injected.add(owned.sessionId);
|
|
264
|
+
await releaseLease(owned);
|
|
265
|
+
return undefined;
|
|
266
|
+
};
|
|
235
267
|
if (null === alreadyConnected && policy.openBrowser && (input.openBrowser || canLease)) {
|
|
236
268
|
// SERVED is the precondition, not SDK_PRESENT: a url that answers nothing is the only state
|
|
237
269
|
// where a window is certainly useless. Whether the SDK is in the served HTML is a DIFFERENT
|
|
@@ -260,14 +292,9 @@ export async function runSetupPhases(input, fx) {
|
|
|
260
292
|
const launcherFailed = input.openBrowser ? await fx.openBrowser(url) : undefined;
|
|
261
293
|
openedBrowser = input.openBrowser;
|
|
262
294
|
if (undefined !== fx.openLease && (!input.openBrowser || undefined !== launcherFailed)) {
|
|
263
|
-
|
|
264
|
-
if (
|
|
265
|
-
note(`Could not open ${url} in a Reticle-owned browser either: ${owned.failed}`);
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
lease = owned;
|
|
295
|
+
lease = await keepLease(await fx.openLease(url));
|
|
296
|
+
if (undefined !== lease)
|
|
269
297
|
openedBrowser = true;
|
|
270
|
-
}
|
|
271
298
|
}
|
|
272
299
|
}
|
|
273
300
|
}
|
|
@@ -288,7 +315,8 @@ export async function runSetupPhases(input, fx) {
|
|
|
288
315
|
while (null === session) {
|
|
289
316
|
// On a desktop app, only the desktop window counts. AppShape and the runtime a page reports use
|
|
290
317
|
// the same three names, so the shape IS the requirement — see session-pick.
|
|
291
|
-
|
|
318
|
+
const listedNow = (await fx.listSessions()).filter((s) => !injected.has(s.sessionId));
|
|
319
|
+
session = pickSession(listedNow, url, before, requiredRuntime);
|
|
292
320
|
if (null !== session)
|
|
293
321
|
break;
|
|
294
322
|
if (deadline <= fx.now())
|
|
@@ -301,13 +329,7 @@ export async function runSetupPhases(input, fx) {
|
|
|
301
329
|
!isDesktop(input.shape) &&
|
|
302
330
|
fx.now() - waitStartedAt >= SYSTEM_BROWSER_GRACE_MS) {
|
|
303
331
|
leaseFallbackTried = true;
|
|
304
|
-
|
|
305
|
-
if ('failed' in owned) {
|
|
306
|
-
note(`Could not open ${url} in a Reticle-owned browser either: ${owned.failed}`);
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
lease = owned;
|
|
310
|
-
}
|
|
332
|
+
lease = await keepLease(await fx.openLease(url));
|
|
311
333
|
continue;
|
|
312
334
|
}
|
|
313
335
|
// Not in silence: a desktop run used to print one line and then nothing for ten minutes.
|
|
@@ -363,41 +385,33 @@ export async function runSetupPhases(input, fx) {
|
|
|
363
385
|
// Getting started is three stages — installation puts the CLI on the machine, onboarding wires
|
|
364
386
|
// the project, the first run proves a flow — and this command owns the middle one. A connected
|
|
365
387
|
// session is the whole proof that onboarding worked: the SDK is in the page, the bridge paired,
|
|
366
|
-
// and the tools now have something to talk to.
|
|
367
|
-
//
|
|
368
|
-
// `<url>` stays a placeholder in this string on purpose: `guidance-commands-run` feeds every
|
|
369
|
-
// command we print to the real parser, and an interpolated value reads there as a missing operand.
|
|
370
|
-
// The live url is named in the sentence instead, where a reader needs it anyway.
|
|
371
|
-
// Both routes, because `explore` needs a model: without ANTHROPIC_API_KEY it answers "No model
|
|
372
|
-
// configured to drive the app". Naming only that one hands the reader a dead end on any machine
|
|
373
|
-
// without a key, which is the same defect this release spent its time removing everywhere else.
|
|
374
|
-
// A heading and a numbered list rather than one paragraph: a reader scans for what to do next.
|
|
388
|
+
// and the tools now have something to talk to. What to do next is the first flow's to say.
|
|
375
389
|
//
|
|
376
|
-
//
|
|
377
|
-
//
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
390
|
+
// It names whose server that is, because a session on Reticle's static server is not the app a
|
|
391
|
+
// real server was serving, and "connected" alone let an agent verify the wrong one (#1426).
|
|
392
|
+
const startedBy = undefined !== input.suppliedUrl
|
|
393
|
+
? ServerStartedBy.CALLER
|
|
394
|
+
: attachedToExisting
|
|
395
|
+
? ServerStartedBy.ALREADY_RUNNING
|
|
396
|
+
: true === input.devCommandIsStaticPage
|
|
397
|
+
? ServerStartedBy.RETICLE_STATIC
|
|
398
|
+
: ServerStartedBy.SETUP;
|
|
399
|
+
note(`✓ Connected to ${new URL(url).origin} (${startedBy}). Onboarding is done; nothing is verified yet.`);
|
|
381
400
|
// Said, because "connected" otherwise reads as "your browser connected": the page that dialled
|
|
382
401
|
// was a headless one Reticle launched and has now closed, and nothing is open on this screen.
|
|
383
|
-
|
|
402
|
+
const leased = undefined !== lease && session.sessionId === lease.sessionId;
|
|
403
|
+
if (leased) {
|
|
384
404
|
note('The proof came from a Reticle-owned headless browser (now closed), not a window of yours — ' +
|
|
385
405
|
`open ${url} in your own browser to use the app.`);
|
|
386
406
|
}
|
|
387
407
|
await releaseLease(lease);
|
|
388
|
-
note('');
|
|
389
|
-
note('Next, prove one flow. Your agent does this:');
|
|
390
|
-
note(' 1. Drive one flow and end it with `reticle_act_and_wait` or `reticle_assert`. Those two ' +
|
|
391
|
-
'produce a verdict; nothing else does.');
|
|
392
|
-
note(' 2. Or hand over the whole drive: `reticle_verify { action: "explore", persona: "<who does ' +
|
|
393
|
-
'what>" }` records what it drove, so later runs replay with no model in the loop. Needs ' +
|
|
394
|
-
'ANTHROPIC_API_KEY.');
|
|
395
408
|
return {
|
|
396
409
|
ok: true,
|
|
397
410
|
reachedPhase: SetupPhase.CONNECT,
|
|
398
411
|
url,
|
|
399
412
|
sessionId: session.sessionId,
|
|
400
413
|
flowSaved: false,
|
|
414
|
+
leased,
|
|
401
415
|
notes,
|
|
402
416
|
fallback: [],
|
|
403
417
|
};
|
|
@@ -29,8 +29,32 @@ interface SetupCommandInput extends Omit<SetupInput, 'shape'> {
|
|
|
29
29
|
readonly registerAgents: boolean;
|
|
30
30
|
/** The bridge's pairing token, for the MCP transport a connect-proof lease is opened over. */
|
|
31
31
|
readonly pairingToken?: string | undefined;
|
|
32
|
+
/** False for `--no-first-run`: connect, and say nothing more. */
|
|
33
|
+
readonly firstRun: boolean;
|
|
34
|
+
/** `--json`: an agent is reading, so nothing is driven on its behalf. */
|
|
35
|
+
readonly json: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* What happens once the connection is proved: the coverage summary and the agent prompt. A port,
|
|
38
|
+
* because it reads the daemon's status and the link, which this directory does not reach for.
|
|
39
|
+
*/
|
|
40
|
+
readonly firstFlow?: FirstFlowPort | undefined;
|
|
32
41
|
}
|
|
33
|
-
|
|
42
|
+
/** init's ending, as `command/cli/try-command.ts` says it. Structural, so setup imports nothing. */
|
|
43
|
+
export type FirstFlowPort = (ctx: {
|
|
44
|
+
appDir: string;
|
|
45
|
+
bridgePort: number;
|
|
46
|
+
pairingToken?: string | undefined;
|
|
47
|
+
url: string;
|
|
48
|
+
sessionId: string;
|
|
49
|
+
leased: boolean;
|
|
50
|
+
openBrowser: boolean;
|
|
51
|
+
firstRun: boolean;
|
|
52
|
+
json: boolean;
|
|
53
|
+
}, say: (line: string) => void) => Promise<{
|
|
54
|
+
flowSaved: boolean;
|
|
55
|
+
}>;
|
|
56
|
+
/** Returns how many agents it wrote a config for, so a caller does not then say "none found". */
|
|
57
|
+
export declare function registerOtherAgents(print: (line: string) => void): number;
|
|
34
58
|
type SetupCommandResult = SetupOutcome;
|
|
35
59
|
export declare function runSetupCommand(input: SetupCommandInput, print: (line: string) => void): Promise<SetupCommandResult>;
|
|
36
60
|
export {};
|
|
@@ -5,11 +5,12 @@
|
|
|
5
5
|
* three lines it was. The only decision here is which effects to hand over; the sequencing lives in
|
|
6
6
|
* run-setup.ts and the pieces it calls.
|
|
7
7
|
*/
|
|
8
|
-
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { chmodSync, existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
9
|
import { homedir } from 'node:os';
|
|
10
10
|
import { join } from 'node:path';
|
|
11
11
|
import { planAgentConfigs } from './agent-configs.js';
|
|
12
12
|
import { AppShape, describeShape, readShape } from './desktop-shape.js';
|
|
13
|
+
import { SigningEnv, tauriSigningEnv } from './tauri-signing.js';
|
|
13
14
|
import { stopOnInterrupt } from './terminal/interrupt.js';
|
|
14
15
|
import { stopOnCrash, crashSentence } from './terminal/crash.js';
|
|
15
16
|
import { applyAgentPlan, applyAgentSkills } from './agent-writer.js';
|
|
@@ -22,7 +23,7 @@ import { readProjectId } from '../cli/ports/resolve/cli-port.js';
|
|
|
22
23
|
import { spawnSync } from 'node:child_process';
|
|
23
24
|
import { isAlive, reticleStateHome } from '../daemon/daemon.js';
|
|
24
25
|
import { readDevServers } from '../daemon/dev-servers.js';
|
|
25
|
-
import { urlOfExistingApp } from './probe/existing-app.js';
|
|
26
|
+
import { connectedAppUrl, urlOfExistingApp } from './probe/existing-app.js';
|
|
26
27
|
import { handedOverUrl, stopHandedOver } from './bringup/dev-server-files.js';
|
|
27
28
|
import { listSessions, OwnedDevServer, probePage } from './node-effects.js';
|
|
28
29
|
import { fetchStatus } from '../daemon/binding/daemon-status-probe.js';
|
|
@@ -89,6 +90,7 @@ function hasElectronDependency(dir) {
|
|
|
89
90
|
*/
|
|
90
91
|
/** `agent`, `agents`. */
|
|
91
92
|
const agentWord = (n) => (1 === n ? 'agent' : 'agents');
|
|
93
|
+
/** Returns how many agents it wrote a config for, so a caller does not then say "none found". */
|
|
92
94
|
export function registerOtherAgents(print) {
|
|
93
95
|
const platform = process.platform;
|
|
94
96
|
const home = homedir();
|
|
@@ -124,6 +126,7 @@ export function registerOtherAgents(print) {
|
|
|
124
126
|
for (const noted of approvals.filter((a) => undefined !== a.warn)) {
|
|
125
127
|
print(` ⚠ ${noted.name}: ${String(noted.warn)}`);
|
|
126
128
|
}
|
|
129
|
+
return wrote.length;
|
|
127
130
|
}
|
|
128
131
|
/**
|
|
129
132
|
* Run the phases against the real world.
|
|
@@ -162,6 +165,31 @@ async function restartHandedOverServer(appDir) {
|
|
|
162
165
|
}
|
|
163
166
|
return stopped;
|
|
164
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* init's ending, inside the dev server's lifetime: coverage is read off the open tab, and the `finally`
|
|
170
|
+
* in `runSetupCommand` only stops a server that was not handed over. Its lines join the notes, so
|
|
171
|
+
* `--json` carries the next step too.
|
|
172
|
+
*/
|
|
173
|
+
async function afterConnect(input, url, sessionId, outcome, print) {
|
|
174
|
+
const notes = [...outcome.notes];
|
|
175
|
+
if (input.firstFlow === undefined)
|
|
176
|
+
return { flowSaved: false, notes };
|
|
177
|
+
const { flowSaved } = await input.firstFlow({
|
|
178
|
+
appDir: input.appDir,
|
|
179
|
+
bridgePort: input.bridgePort,
|
|
180
|
+
pairingToken: input.pairingToken,
|
|
181
|
+
url,
|
|
182
|
+
sessionId,
|
|
183
|
+
leased: true === outcome.leased,
|
|
184
|
+
openBrowser: input.openBrowser,
|
|
185
|
+
firstRun: input.firstRun,
|
|
186
|
+
json: input.json,
|
|
187
|
+
}, (line) => {
|
|
188
|
+
notes.push(line);
|
|
189
|
+
print(line);
|
|
190
|
+
});
|
|
191
|
+
return { flowSaved, notes };
|
|
192
|
+
}
|
|
165
193
|
export async function runSetupCommand(input, print) {
|
|
166
194
|
if (input.registerAgents)
|
|
167
195
|
registerOtherAgents(print);
|
|
@@ -212,7 +240,29 @@ export async function runSetupCommand(input, print) {
|
|
|
212
240
|
const effects = {
|
|
213
241
|
startDevServer: (command, cwd) => {
|
|
214
242
|
print(`starting: ${command}`);
|
|
215
|
-
|
|
243
|
+
const signing = AppShape.TAURI === shape
|
|
244
|
+
? tauriSigningEnv({
|
|
245
|
+
platform: process.platform,
|
|
246
|
+
env: { ...process.env, ...input.env },
|
|
247
|
+
read: (path) => {
|
|
248
|
+
try {
|
|
249
|
+
return readFileSync(join(cwd, path), 'utf8');
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
writeRunner: (name, script) => {
|
|
256
|
+
const path = join(reticleStateHome(), name);
|
|
257
|
+
writeFileSync(path, script);
|
|
258
|
+
chmodSync(path, 0o755);
|
|
259
|
+
return path;
|
|
260
|
+
},
|
|
261
|
+
})
|
|
262
|
+
: {};
|
|
263
|
+
if (SigningEnv.IDENTITY in signing)
|
|
264
|
+
print(`signing the dev build as ${String(signing[SigningEnv.IDENTITY])}, so macOS does not ask for the keychain password`);
|
|
265
|
+
server.start(command, cwd, { ...input.env, ...signing });
|
|
216
266
|
return Promise.resolve();
|
|
217
267
|
},
|
|
218
268
|
// The server the plugin announced (Vite), or failing that the one a previous init handed over
|
|
@@ -224,7 +274,9 @@ export async function runSetupCommand(input, print) {
|
|
|
224
274
|
(await handedOverUrl(reticleStateHome(), input.appDir, {
|
|
225
275
|
alive: isAlive,
|
|
226
276
|
answers: async (url) => (await probePage(url)).served,
|
|
227
|
-
}))
|
|
277
|
+
})) ??
|
|
278
|
+
// A desktop window of this project already connected: its renderer announces no server.
|
|
279
|
+
connectedAppUrl(await listSessions(input.bridgePort), readProjectId(input.appDir)),
|
|
228
280
|
devServerOutput: () => server.output(),
|
|
229
281
|
devServerExited: () => server.exited(),
|
|
230
282
|
devServerQuietForMs: () => server.quietForMs(),
|
|
@@ -285,8 +337,11 @@ export async function runSetupCommand(input, print) {
|
|
|
285
337
|
if (undefined !== log)
|
|
286
338
|
print(`The dev server keeps running; its output goes to ${log}`);
|
|
287
339
|
}
|
|
340
|
+
if (!outcome.ok || undefined === outcome.url || undefined === outcome.sessionId)
|
|
341
|
+
return outcome;
|
|
288
342
|
return {
|
|
289
343
|
...outcome,
|
|
344
|
+
...(await afterConnect(input, outcome.url, outcome.sessionId, outcome, print)),
|
|
290
345
|
};
|
|
291
346
|
}
|
|
292
347
|
finally {
|
|
@@ -1,5 +1,22 @@
|
|
|
1
|
-
import { McpClient, MCP_CLIENTS, claudeAddCommand, claudeAvailableProbe, claudeHasReticle, detectMcpClients, mergeClientConfig, clientSpec, ClientMergeStatus, } from '@reticlehq/init';
|
|
1
|
+
import { McpClient, MCP_CLIENTS, claudeAddCommand, claudeAvailableProbe, claudeHasReticle, codexAddCommand, codexAvailableProbe, codexNamesOurServer, detectMcpClients, mergeClientConfig, clientSpec, ClientMergeStatus, } from '@reticlehq/init';
|
|
2
2
|
import { OnboardingPhase, OnboardingStepStatus, } from '@reticlehq/core/telemetry';
|
|
3
|
+
/**
|
|
4
|
+
* Codex registers through `codex mcp add`, which does the TOML editing we refuse to do (#1238).
|
|
5
|
+
* `undefined` when that does not apply, and the caller reports a hand edit exactly as before: not
|
|
6
|
+
* Codex, the `codex` binary is not here, or the config already names a `reticle` server. That last
|
|
7
|
+
* one matters: `codex mcp add` REPLACES an entry of the same name and still exits 0, so an entry
|
|
8
|
+
* somebody wrote themselves, in any shape, must never reach it. Otherwise: did the command take.
|
|
9
|
+
*/
|
|
10
|
+
function registerWithCodexCli(io, client, serversKey) {
|
|
11
|
+
if (McpClient.CODEX !== client.id || codexNamesOurServer(client.existing, serversKey)) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const probe = codexAvailableProbe();
|
|
15
|
+
if (!io.runCli(probe.command, probe.args))
|
|
16
|
+
return undefined;
|
|
17
|
+
const cmd = codexAddCommand();
|
|
18
|
+
return io.runCli(cmd.command, cmd.args);
|
|
19
|
+
}
|
|
3
20
|
export function setupMcp(io) {
|
|
4
21
|
const detected = [];
|
|
5
22
|
const registered = [];
|
|
@@ -47,7 +64,13 @@ export function setupMcp(io) {
|
|
|
47
64
|
// on an existing file and would CREATE an empty one otherwise, and either way claiming success
|
|
48
65
|
// sends somebody to an agent that has no Reticle tools in it.
|
|
49
66
|
if (ClientMergeStatus.MANUAL === merged.status) {
|
|
50
|
-
|
|
67
|
+
const viaCli = registerWithCodexCli(io, client, spec.serversKey);
|
|
68
|
+
if (true === viaCli)
|
|
69
|
+
registered.push(client.id);
|
|
70
|
+
else if (false === viaCli)
|
|
71
|
+
failed.push(client.id);
|
|
72
|
+
else
|
|
73
|
+
manual.push({ id: client.id, configPath: client.configPath, docs: spec.docs });
|
|
51
74
|
continue;
|
|
52
75
|
}
|
|
53
76
|
try {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** The env the runner reads its arguments from: the script stays a fixed file. */
|
|
2
|
+
export declare const SigningEnv: {
|
|
3
|
+
readonly IDENTITY: "RETICLE_SIGNING_IDENTITY";
|
|
4
|
+
readonly IDENTIFIER: "RETICLE_SIGNING_IDENTIFIER";
|
|
5
|
+
readonly APPLE: "APPLE_SIGNING_IDENTITY";
|
|
6
|
+
};
|
|
7
|
+
export declare const RUNNER_FILE = "tauri-sign-runner.sh";
|
|
8
|
+
/** The runner: sign the binary Cargo built, then run it exactly as Cargo would have. */
|
|
9
|
+
export declare const RUNNER_SCRIPT: string;
|
|
10
|
+
export interface SigningDeps {
|
|
11
|
+
readonly platform: string;
|
|
12
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
13
|
+
/** A file's text relative to the app directory, or undefined when it is absent. */
|
|
14
|
+
readonly read: (path: string) => string | undefined;
|
|
15
|
+
/** Writes the runner and makes it executable; returns its absolute path. */
|
|
16
|
+
readonly writeRunner: (name: string, script: string) => string;
|
|
17
|
+
}
|
|
18
|
+
/** The extra env for starting a Tauri dev build signed, or `{}` when there is nothing to sign with. */
|
|
19
|
+
export declare function tauriSigningEnv(deps: SigningDeps): Record<string, string>;
|