@reticlehq/server 3.7.0 → 3.8.1
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 +59 -68
- package/bin/reticle.js +9 -2
- package/dist/command/cli/adhoc-suite.js +1 -1
- package/dist/command/cli/adhoc-verdict.d.ts +12 -0
- package/dist/command/cli/adhoc-verdict.js +62 -4
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +5 -1
- package/dist/command/cli/auth/cloud-session.d.ts +11 -19
- package/dist/command/cli/auth/cloud-session.js +23 -0
- package/dist/command/cli/auth/device-flow.d.ts +3 -37
- package/dist/command/cli/cli-doctor.js +66 -21
- package/dist/command/cli/cli-flow-commands.js +53 -11
- package/dist/command/cli/cli-kill.d.ts +8 -0
- package/dist/command/cli/cli-kill.js +43 -3
- package/dist/command/cli/cli-parse-feedback.d.ts +4 -0
- package/dist/command/cli/cli-parse-feedback.js +13 -1
- package/dist/command/cli/cli-parse-grammar.d.ts +1 -2
- package/dist/command/cli/cli-parse-grammar.js +1 -6
- package/dist/command/cli/cli-parse-serve.d.ts +24 -0
- package/dist/command/cli/cli-parse-serve.js +124 -0
- package/dist/command/cli/cli-parse.d.ts +12 -11
- package/dist/command/cli/cli-parse.js +100 -123
- package/dist/command/cli/cli-usage.d.ts +0 -11
- package/dist/command/cli/cli-usage.js +43 -16
- package/dist/command/cli/cli-verify.d.ts +1 -1
- package/dist/command/cli/cli-verify.js +29 -14
- package/dist/command/cli/cloud-cli.js +27 -9
- package/dist/command/cli/cloud-kit.js +3 -3
- package/dist/command/cli/cloud-link.d.ts +1 -20
- package/dist/command/cli/cloud-link.js +2 -0
- package/dist/command/cli/cloud-login.d.ts +6 -2
- package/dist/command/cli/cloud-login.js +13 -41
- package/dist/command/cli/config/checkout.d.ts +10 -0
- package/dist/command/cli/config/checkout.js +78 -0
- package/dist/command/cli/doctor/doctor-agent-link.d.ts +23 -0
- package/dist/command/cli/doctor/doctor-agent-link.js +28 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +1 -7
- package/dist/command/cli/doctor/doctor-rows.d.ts +4 -0
- package/dist/command/cli/doctor/doctor-rows.js +4 -0
- package/dist/command/cli/drive/drive-attach.d.ts +5 -0
- package/dist/command/cli/drive/drive-attach.js +21 -1
- package/dist/command/cli/hook/codex-transcript.d.ts +20 -0
- package/dist/command/cli/hook/codex-transcript.js +224 -0
- package/dist/command/cli/hook/episode-structure.d.ts +24 -0
- package/dist/command/cli/hook/episode-structure.js +138 -0
- package/dist/command/cli/hook/hook-command.d.ts +9 -0
- package/dist/command/cli/hook/hook-command.js +211 -0
- package/dist/command/cli/hook/hook-fast.d.ts +31 -0
- package/dist/command/cli/hook/hook-fast.js +136 -0
- package/dist/command/cli/hook/prompt-hook.d.ts +30 -0
- package/dist/command/cli/hook/prompt-hook.js +199 -0
- package/dist/command/cli/hook/tool-hook.d.ts +21 -0
- package/dist/command/cli/hook/tool-hook.js +259 -0
- package/dist/command/cli/launch/cli-launch.d.ts +2 -0
- package/dist/command/cli/launch/cli-launch.js +22 -2
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +28 -2
- package/dist/command/cli/mcp-command.d.ts +9 -0
- package/dist/command/cli/mcp-command.js +127 -41
- package/dist/command/cli/open-navigate.d.ts +43 -0
- package/dist/command/cli/open-navigate.js +85 -0
- package/dist/command/cli/ports/port-holder.d.ts +16 -4
- package/dist/command/cli/ports/port-holder.js +58 -12
- package/dist/command/cli/ports/resolve/cli-port.js +18 -2
- package/dist/command/cli/project-name.d.ts +1 -7
- package/dist/command/cli/project-name.js +1 -0
- package/dist/command/cli/report-command.d.ts +8 -2
- package/dist/command/cli/report-command.js +95 -18
- package/dist/command/cli/status-fields.d.ts +9 -2
- package/dist/command/cli/status-fields.js +148 -4
- package/dist/command/cli/try-command.d.ts +3 -4
- package/dist/command/cli/try-command.js +6 -11
- package/dist/command/cli/verify-results.d.ts +4 -1
- package/dist/command/cli/verify-results.js +3 -1
- package/dist/command/cli.d.ts +1 -7
- package/dist/command/cli.js +79 -160
- package/dist/command/daemon/daemon-resilience.d.ts +6 -1
- package/dist/command/daemon/daemon-resilience.js +31 -18
- package/dist/command/daemon/daemon.d.ts +11 -0
- package/dist/command/daemon/daemon.js +70 -2
- package/dist/command/daemon/lifetime/daemon-usefulness.d.ts +2 -0
- package/dist/command/daemon/lifetime/daemon-usefulness.js +13 -2
- package/dist/command/daemon/wake-decision.js +4 -2
- package/dist/command/daemon/win32-escape.d.ts +32 -0
- package/dist/command/daemon/win32-escape.js +119 -0
- package/dist/command/setup/agent-configs.d.ts +9 -0
- package/dist/command/setup/agent-configs.js +9 -0
- package/dist/command/setup/auto-approve.d.ts +10 -3
- package/dist/command/setup/auto-approve.js +51 -3
- package/dist/command/setup/bringup/dev-server-files.d.ts +1 -9
- package/dist/command/setup/bringup/dev-server-wait.js +5 -1
- package/dist/command/setup/bringup/ensure-daemon.js +4 -7
- package/dist/command/setup/init/init-host.js +6 -0
- package/dist/command/setup/init/init-port.js +5 -4
- package/dist/command/setup/init/init-runtime.js +7 -1
- package/dist/command/setup/node-effects.d.ts +8 -0
- package/dist/command/setup/node-effects.js +36 -4
- package/dist/command/setup/probe/dev-port.d.ts +26 -0
- package/dist/command/setup/probe/dev-port.js +117 -0
- package/dist/command/setup/probe/page-probe.d.ts +1 -1
- package/dist/command/setup/probe/page-probe.js +11 -3
- package/dist/command/setup/remaining-steps.d.ts +0 -7
- package/dist/command/setup/remaining-steps.js +3 -2
- package/dist/command/setup/run-setup.d.ts +11 -0
- package/dist/command/setup/run-setup.js +33 -5
- package/dist/command/setup/setup-command.d.ts +2 -0
- package/dist/command/setup/setup-command.js +22 -4
- package/dist/command/update/updater.d.ts +1 -6
- package/dist/command/update/updater.js +4 -5
- package/dist/command/update/version-seen.d.ts +24 -0
- package/dist/command/update/version-seen.js +65 -0
- package/dist/command/version/peer-announce.d.ts +9 -1
- package/dist/command/version/peer-announce.js +25 -2
- package/dist/command/version/sdk-fix.d.ts +5 -6
- package/dist/command/version/sdk-fix.js +17 -32
- package/dist/command/version/version-skew.d.ts +16 -1
- package/dist/command/version/version-skew.js +84 -10
- package/dist/features/crawl/crawl-tools.js +2 -2
- package/dist/features/crawl/crawl.js +2 -0
- package/dist/features/exhaust/ledger.d.ts +15 -96
- package/dist/features/exhaust/ledger.js +3 -3
- package/dist/features/harness/drive-runs.d.ts +28 -4
- package/dist/features/harness/drive-runs.js +99 -7
- package/dist/features/harness/drivers.d.ts +1 -1
- package/dist/features/harness/drivers.js +1 -1
- package/dist/features/harness/harness.d.ts +5 -0
- package/dist/features/harness/harness.js +24 -12
- package/dist/features/harness/platform/platform-drives.d.ts +7 -1
- package/dist/features/harness/platform/platform-drives.js +12 -7
- package/dist/features/harness/platform/refusal.d.ts +1 -1
- package/dist/features/harness/platform/refusal.js +4 -4
- package/dist/features/harness/platform/remote-drive.js +70 -28
- package/dist/features/harness/platform/server-driver.js +22 -1
- package/dist/features/harness/platform-config.d.ts +1 -10
- package/dist/features/harness/platform-config.js +0 -20
- package/dist/features/license/license.d.ts +2 -14
- package/dist/features/visual/step-shots.d.ts +33 -1
- package/dist/features/visual/step-shots.js +155 -1
- package/dist/features/visual/visual-tools.js +12 -4
- package/dist/hooks/coding-agents.d.ts +6 -0
- package/dist/hooks/coding-agents.js +24 -3
- package/dist/hooks/episode-stamp.d.ts +32 -0
- package/dist/hooks/episode-stamp.js +61 -0
- package/dist/hooks/hook-commands.js +19 -9
- package/dist/index.d.ts +5 -1
- package/dist/index.js +66 -24
- package/dist/judgement/app-graph/journal-steps.d.ts +8 -0
- package/dist/judgement/app-graph/journal-steps.js +92 -0
- package/dist/judgement/capsule/capsule-store.d.ts +2 -39
- package/dist/judgement/domain/domain-model.js +1 -10
- package/dist/judgement/domain/domain-tools.js +4 -2
- package/dist/judgement/runs/artifact/run-store.d.ts +28 -8
- package/dist/judgement/runs/artifact/run-store.js +153 -28
- package/dist/judgement/runs/default-run-id.d.ts +3 -1
- package/dist/judgement/runs/default-run-id.js +15 -3
- package/dist/judgement/runs/drive-run.d.ts +3 -3
- package/dist/judgement/runs/drive-run.js +11 -7
- package/dist/judgement/runs/run-ledger.d.ts +21 -0
- package/dist/judgement/runs/run-ledger.js +143 -0
- package/dist/judgement/runs/runner-port.d.ts +1 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +4 -3
- package/dist/judgement/runs/verification-sync.js +27 -5
- package/dist/language/flows/affected-tools.js +2 -1
- package/dist/language/flows/annotate-notes/annotate.js +8 -3
- package/dist/language/flows/annotate-tools.js +1 -1
- package/dist/language/flows/change/affected.d.ts +8 -0
- package/dist/language/flows/change/affected.js +20 -7
- package/dist/language/flows/decision.js +19 -4
- package/dist/language/flows/fields/flow-secret-field.d.ts +9 -0
- package/dist/language/flows/fields/flow-secret-field.js +67 -5
- package/dist/language/flows/flow-anchor.d.ts +5 -0
- package/dist/language/flows/flow-anchor.js +4 -0
- package/dist/language/flows/flow-cross-step.d.ts +7 -1
- package/dist/language/flows/flow-cross-step.js +9 -0
- package/dist/language/flows/flow-expect-grammar.js +15 -10
- package/dist/language/flows/flow-intent.js +6 -1
- package/dist/language/flows/flow-journey.d.ts +8 -0
- package/dist/language/flows/flow-journey.js +13 -0
- package/dist/language/flows/flow-lease.d.ts +27 -0
- package/dist/language/flows/flow-lease.js +59 -0
- package/dist/language/flows/flow-replay-run.d.ts +1 -87
- package/dist/language/flows/flow-replay-run.js +111 -310
- package/dist/language/flows/flow-replay.js +21 -19
- package/dist/language/flows/flow-replayable.d.ts +38 -0
- package/dist/language/flows/flow-replayable.js +179 -0
- package/dist/language/flows/flow-start-path.d.ts +108 -0
- package/dist/language/flows/flow-start-path.js +313 -0
- package/dist/language/flows/flow-step-runners.d.ts +23 -2
- package/dist/language/flows/flow-step-runners.js +191 -32
- package/dist/language/flows/flow-store-for-session.d.ts +8 -1
- package/dist/language/flows/flow-store-for-session.js +6 -0
- package/dist/language/flows/flow-tools.d.ts +2 -23
- package/dist/language/flows/flow-tools.js +63 -113
- package/dist/language/flows/flows.d.ts +4 -6
- package/dist/language/flows/flows.js +90 -15
- package/dist/language/flows/heal-run.d.ts +10 -4
- package/dist/language/flows/heal-run.js +26 -9
- package/dist/language/flows/recording/flake.d.ts +3 -27
- package/dist/language/flows/recording/flake.js +1 -1
- package/dist/language/flows/recording/recording-backtrack.js +1 -4
- package/dist/language/flows/recording/tape/recordings.d.ts +11 -1
- package/dist/language/flows/recording/tape/recordings.js +9 -3
- package/dist/language/flows/replay.d.ts +25 -5
- package/dist/language/flows/replay.js +83 -16
- package/dist/language/flows/stores/assertion-tiers-store.js +1 -1
- package/dist/language/flows/suite/coverage.d.ts +9 -0
- package/dist/language/flows/suite/coverage.js +12 -1
- package/dist/language/flows/suite-selection.d.ts +25 -0
- package/dist/language/flows/suite-selection.js +41 -9
- package/dist/machine/git-tracks.d.ts +6 -0
- package/dist/machine/git-tracks.js +36 -0
- package/dist/memory/cloud/background-sync.d.ts +25 -0
- package/dist/memory/cloud/background-sync.js +79 -0
- package/dist/memory/cloud/cloud-config.d.ts +12 -1
- package/dist/memory/cloud/cloud-config.js +39 -13
- package/dist/memory/cloud/cloud-sync.d.ts +3 -24
- package/dist/memory/cloud/cloud-sync.js +5 -2
- package/dist/memory/cloud/harness-config.d.ts +0 -7
- package/dist/memory/cloud/memory-scope.d.ts +19 -0
- package/dist/memory/cloud/memory-scope.js +48 -0
- package/dist/memory/cloud/sync-answer.d.ts +43 -0
- package/dist/memory/cloud/sync-answer.js +42 -0
- package/dist/memory/cloud/sync-cycle.d.ts +40 -10
- package/dist/memory/cloud/sync-cycle.js +97 -144
- package/dist/memory/cloud/sync-daemon.d.ts +50 -3
- package/dist/memory/cloud/sync-daemon.js +473 -83
- package/dist/memory/cloud/sync-describe.d.ts +28 -0
- package/dist/memory/cloud/sync-describe.js +92 -0
- package/dist/memory/cloud/sync-disk.d.ts +9 -1
- package/dist/memory/cloud/sync-disk.js +137 -33
- package/dist/memory/cloud/sync-flow-versions.d.ts +26 -0
- package/dist/memory/cloud/sync-flow-versions.js +42 -0
- package/dist/memory/impact/impact-store.js +32 -15
- package/dist/memory/intent/intent-shard.d.ts +41 -266
- package/dist/memory/intent/intent-tools.js +20 -61
- package/dist/memory/intent/record-request.d.ts +27 -0
- package/dist/memory/intent/record-request.js +88 -0
- package/dist/memory/intent/settled-words.js +9 -1
- package/dist/memory/journal/drive-flow.d.ts +3 -0
- package/dist/memory/journal/drive-flow.js +11 -41
- package/dist/memory/journal/envelope-store.js +1 -1
- package/dist/memory/journal/envelope.d.ts +6 -154
- package/dist/memory/journal/episode-log.d.ts +107 -0
- package/dist/memory/journal/episode-log.js +302 -0
- package/dist/memory/journal/journal-recorder.d.ts +7 -0
- package/dist/memory/journal/journal-recorder.js +22 -9
- package/dist/memory/journal/on-disk/ambient-file.d.ts +1 -7
- package/dist/memory/journal/on-disk/ambient-file.js +1 -1
- package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +24 -3
- package/dist/memory/journal/on-disk/workspace-gitignore.js +38 -7
- package/dist/memory/journal/on-disk/workspace-tiers.js +7 -0
- package/dist/memory/journal/self-observation.js +3 -1
- package/dist/memory/journal/session-end.js +23 -9
- package/dist/memory/journal/session-journal.js +39 -20
- package/dist/memory/project/artifact-root-resolver.d.ts +14 -1
- package/dist/memory/project/artifact-root-resolver.js +68 -23
- package/dist/memory/project/artifact-root.d.ts +17 -3
- package/dist/memory/project/artifact-root.js +47 -9
- package/dist/memory/project/fs/fs-port.d.ts +5 -0
- package/dist/memory/project/fs/fs-port.js +13 -0
- package/dist/memory/project/learned-routes.d.ts +3 -4
- package/dist/memory/project/learned-routes.js +3 -11
- package/dist/memory/project/link-directory.js +5 -2
- package/dist/memory/project/root-claims.d.ts +3 -1
- package/dist/memory/project/root-claims.js +41 -7
- package/dist/memory/project/session-root.d.ts +1 -1
- package/dist/memory/project/session-root.js +1 -15
- package/dist/memory/project/sync-status.js +5 -6
- package/dist/memory/recall/memory-tools.js +2 -2
- package/dist/memory/recall/platform-memory.d.ts +3 -1
- package/dist/memory/recall/platform-memory.js +9 -1
- package/dist/memory/recall/project-memory.js +15 -19
- package/dist/portal/bridge/auth-failure-reason.d.ts +13 -0
- package/dist/portal/bridge/auth-failure-reason.js +19 -0
- package/dist/portal/bridge/bridge.d.ts +19 -4
- package/dist/portal/bridge/bridge.js +150 -177
- package/dist/portal/bridge/harness-request.d.ts +15 -0
- package/dist/portal/bridge/harness-request.js +19 -0
- package/dist/portal/bridge/origin/origin-follow.d.ts +46 -0
- package/dist/portal/bridge/origin/origin-follow.js +110 -0
- package/dist/portal/bridge/pairing-token.d.ts +6 -0
- package/dist/portal/bridge/pairing-token.js +47 -16
- package/dist/portal/bridge/protocol-skew.d.ts +27 -2
- package/dist/portal/bridge/protocol-skew.js +66 -2
- package/dist/portal/bridge/session-nonces.d.ts +46 -0
- package/dist/portal/bridge/session-nonces.js +72 -0
- package/dist/portal/input/viewport-tools.d.ts +31 -0
- package/dist/portal/input/viewport-tools.js +106 -15
- package/dist/portal/pool/bounded-close.d.ts +23 -0
- package/dist/portal/pool/bounded-close.js +38 -0
- package/dist/portal/pool/browser-pool.d.ts +44 -39
- package/dist/portal/pool/browser-pool.js +247 -95
- package/dist/portal/pool/context-permissions.d.ts +9 -1
- package/dist/portal/pool/context-permissions.js +26 -0
- package/dist/portal/pool/lease-emulation.d.ts +37 -0
- package/dist/portal/pool/lease-emulation.js +29 -0
- package/dist/portal/pool/playwright-launcher.d.ts +6 -0
- package/dist/portal/pool/playwright-launcher.js +74 -7
- package/dist/portal/pool/pool-contract.d.ts +23 -1
- package/dist/portal/pool/pool-lease.d.ts +128 -0
- package/dist/portal/pool/pool-lease.js +49 -0
- package/dist/portal/pool/zero-install.d.ts +8 -1
- package/dist/portal/pool/zero-install.js +24 -2
- package/dist/portal/production/production-activation.d.ts +136 -0
- package/dist/portal/production/production-activation.js +173 -0
- package/dist/portal/production/production-drive.d.ts +52 -0
- package/dist/portal/production/production-drive.js +301 -0
- package/dist/portal/production/production-hello.d.ts +23 -0
- package/dist/portal/production/production-hello.js +23 -0
- package/dist/portal/realm/web-realm.js +42 -15
- package/dist/portal/session/control-envelope.d.ts +1 -1
- package/dist/portal/session/dev-server/served-document.d.ts +0 -5
- package/dist/portal/session/dev-server/served-document.js +6 -8
- package/dist/portal/session/facts/handshake-facts.d.ts +8 -1
- package/dist/portal/session/first-run-wiring.d.ts +3 -36
- package/dist/portal/session/first-run-wiring.js +10 -103
- package/dist/portal/session/live-control-tools.js +61 -19
- package/dist/portal/session/no-session-next-action.d.ts +11 -0
- package/dist/portal/session/no-session-next-action.js +40 -15
- package/dist/portal/session/no-session-watch.d.ts +7 -0
- package/dist/portal/session/no-session-watch.js +67 -23
- package/dist/portal/session/output-budget.d.ts +10 -0
- package/dist/portal/session/output-budget.js +16 -0
- package/dist/portal/session/presence/session-lease.d.ts +2 -0
- package/dist/portal/session/presence/session-lease.js +8 -0
- package/dist/portal/session/recorded-gaps.d.ts +15 -11
- package/dist/portal/session/recorded-gaps.js +39 -18
- package/dist/portal/session/serving-directory.d.ts +24 -2
- package/dist/portal/session/serving-directory.js +93 -5
- package/dist/portal/session/session-info.d.ts +26 -0
- package/dist/portal/session/session-info.js +20 -0
- package/dist/portal/session/session-manager.d.ts +35 -3
- package/dist/portal/session/session-manager.js +69 -14
- package/dist/portal/session/session-successor.js +1 -9
- package/dist/portal/session/session-tools.js +22 -4
- package/dist/portal/session/session.d.ts +10 -10
- package/dist/portal/session/session.js +37 -29
- package/dist/portal/session/zero-install-first-call.d.ts +7 -2
- package/dist/portal/session/zero-install-first-call.js +43 -20
- package/dist/start-wiring.d.ts +2 -2
- package/dist/start-wiring.js +17 -3
- package/dist/status-payload.d.ts +11 -1
- package/dist/status-payload.js +7 -1
- package/dist/surface/agent-presence-grace.d.ts +11 -0
- package/dist/surface/agent-presence-grace.js +34 -0
- package/dist/surface/http-server.d.ts +12 -1
- package/dist/surface/http-server.js +64 -15
- package/dist/surface/mcp/faults/mcp-outage.d.ts +12 -2
- package/dist/surface/mcp/faults/mcp-outage.js +19 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +17 -74
- package/dist/surface/mcp/mcp-proxy.js +194 -267
- package/dist/surface/mcp/mcp.d.ts +20 -3
- package/dist/surface/mcp/mcp.js +88 -25
- package/dist/surface/mcp/proxy/drive-calls.d.ts +44 -0
- package/dist/surface/mcp/proxy/drive-calls.js +114 -5
- package/dist/surface/mcp/proxy/proxy-boot.d.ts +11 -0
- package/dist/surface/mcp/proxy/proxy-boot.js +1 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +6 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.js +14 -1
- package/dist/surface/mcp/proxy/proxy-handshake.d.ts +34 -2
- package/dist/surface/mcp/proxy/proxy-handshake.js +76 -8
- package/dist/surface/mcp/server-instructions.js +35 -16
- package/dist/surface/mcp/shared-params.d.ts +8 -0
- package/dist/surface/mcp/shared-params.js +15 -1
- package/dist/surface/mcp/sse-frame-parser.d.ts +11 -0
- package/dist/surface/mcp/sse-frame-parser.js +18 -0
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +13 -0
- package/dist/surface/mcp/tool-catalog-cache.d.ts +2 -0
- package/dist/surface/mcp/tool-catalog-cache.js +14 -4
- package/dist/surface/tools/account-tool.d.ts +4 -3
- package/dist/surface/tools/account-tool.js +20 -31
- package/dist/surface/tools/act/act-danger.d.ts +2 -0
- package/dist/surface/tools/act/act-danger.js +41 -14
- package/dist/surface/tools/act/act-observation.d.ts +11 -0
- package/dist/surface/tools/act/act-observation.js +33 -0
- package/dist/surface/tools/act/act-preflight.js +10 -3
- package/dist/surface/tools/act/act-sequence-retry.js +2 -1
- package/dist/surface/tools/act/act-target.js +19 -5
- package/dist/surface/tools/act/durable.js +1 -1
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +9 -7
- package/dist/surface/tools/act/navigation/navigate-arrival.js +11 -14
- package/dist/surface/tools/act/unsettled-find.d.ts +36 -0
- package/dist/surface/tools/act/unsettled-find.js +71 -0
- package/dist/surface/tools/act-sequence-tool.js +53 -24
- package/dist/surface/tools/act-tools.d.ts +2 -3
- package/dist/surface/tools/act-tools.js +49 -47
- package/dist/surface/tools/agent/compact-envelope.d.ts +2 -2
- package/dist/surface/tools/agent/for-the-agent.js +41 -3
- package/dist/surface/tools/assert/assert-grade.js +8 -3
- package/dist/surface/tools/assert/assert-verdict.js +4 -2
- package/dist/surface/tools/browser-tools.js +7 -4
- package/dist/surface/tools/chat-drives.js +50 -25
- package/dist/surface/tools/coverage-tools.js +1 -1
- package/dist/surface/tools/dynamic-tools.d.ts +8 -0
- package/dist/surface/tools/dynamic-tools.js +89 -34
- package/dist/surface/tools/empty-session-list.d.ts +18 -25
- package/dist/surface/tools/empty-session-list.js +67 -38
- package/dist/surface/tools/error-recovery.d.ts +17 -7
- package/dist/surface/tools/error-recovery.js +53 -20
- package/dist/surface/tools/explore-tools.d.ts +10 -0
- package/dist/surface/tools/explore-tools.js +72 -19
- package/dist/surface/tools/feedback-tools.js +23 -2
- package/dist/surface/tools/gap-novelty.d.ts +6 -0
- package/dist/surface/tools/gap-novelty.js +9 -0
- package/dist/surface/tools/gaps/capability-absences.js +4 -3
- package/dist/surface/tools/harness-explore.d.ts +1 -1
- package/dist/surface/tools/harness-explore.js +6 -4
- package/dist/surface/tools/harness-gate.d.ts +43 -21
- package/dist/surface/tools/harness-gate.js +55 -81
- package/dist/surface/tools/harness-script.d.ts +2 -0
- package/dist/surface/tools/harness-script.js +11 -6
- package/dist/surface/tools/harness-toolset.js +3 -4
- package/dist/surface/tools/invoke-tool.d.ts +0 -8
- package/dist/surface/tools/invoke-tool.js +164 -178
- package/dist/surface/tools/lease-hint.d.ts +9 -0
- package/dist/surface/tools/lease-hint.js +22 -3
- package/dist/surface/tools/lease-permissions.d.ts +1 -1
- package/dist/surface/tools/lease-readiness.d.ts +55 -0
- package/dist/surface/tools/lease-readiness.js +150 -2
- package/dist/surface/tools/lease-tools.d.ts +3 -75
- package/dist/surface/tools/lease-tools.js +124 -188
- package/dist/surface/tools/map-tools.d.ts +20 -0
- package/dist/surface/tools/map-tools.js +145 -0
- package/dist/surface/tools/merge-tools.js +11 -7
- package/dist/surface/tools/next-step.js +6 -3
- package/dist/surface/tools/observe-tools.js +46 -35
- package/dist/surface/tools/platform-moment.d.ts +3 -12
- package/dist/surface/tools/platform-moment.js +12 -24
- package/dist/surface/tools/read/complete-snapshot.d.ts +7 -1
- package/dist/surface/tools/read/complete-snapshot.js +13 -2
- package/dist/surface/tools/read/query-paginate.js +6 -0
- package/dist/surface/tools/read/query-shape.d.ts +9 -0
- package/dist/surface/tools/read/query-shape.js +15 -0
- package/dist/surface/tools/read/snapshot-unmounted-note.d.ts +1 -0
- package/dist/surface/tools/read/snapshot-unmounted-note.js +73 -0
- package/dist/surface/tools/read-tools.js +5 -5
- package/dist/surface/tools/real-input-attempt.d.ts +11 -0
- package/dist/surface/tools/real-input-attempt.js +206 -38
- package/dist/surface/tools/reconcile-tools.js +21 -8
- package/dist/surface/tools/reticle-result.d.ts +3 -0
- package/dist/surface/tools/reticle-result.js +8 -1
- package/dist/surface/tools/run-report.d.ts +22 -0
- package/dist/surface/tools/run-report.js +141 -0
- package/dist/surface/tools/session-ports.d.ts +57 -0
- package/dist/surface/tools/session-ports.js +102 -0
- package/dist/surface/tools/tool-kit.d.ts +58 -4
- package/dist/surface/tools/tool-kit.js +140 -6
- package/dist/surface/tools/tool-surface.d.ts +2 -0
- package/dist/surface/tools/tool-surface.js +45 -0
- package/dist/surface/tools/tools.js +49 -87
- package/dist/telemetry/automation-hint.d.ts +5 -0
- package/dist/telemetry/automation-hint.js +7 -0
- package/dist/telemetry/cli-telemetry.d.ts +22 -0
- package/dist/telemetry/cli-telemetry.js +80 -11
- package/dist/telemetry/daemon-telemetry.d.ts +3 -1
- package/dist/telemetry/daemon-telemetry.js +9 -2
- package/dist/telemetry/feedback-cli.d.ts +1 -1
- package/dist/telemetry/feedback-cli.js +8 -3
- package/dist/telemetry/feedback.d.ts +1 -1
- package/dist/telemetry/feedback.js +51 -4
- package/dist/telemetry/harness-run.d.ts +3 -3
- package/dist/telemetry/harness-run.js +18 -7
- package/dist/telemetry/hud-events.d.ts +1 -1
- package/dist/telemetry/hud-metrics.d.ts +6 -3
- package/dist/telemetry/hud-metrics.js +20 -8
- package/dist/telemetry/install-source.js +1 -1
- package/dist/telemetry/mcp-connection.d.ts +1 -1
- package/dist/telemetry/mcp-connection.js +21 -2
- package/dist/telemetry/onboarding-firsts.d.ts +6 -1
- package/dist/telemetry/onboarding-firsts.js +41 -1
- package/dist/telemetry/proxy-telemetry.d.ts +42 -0
- package/dist/telemetry/proxy-telemetry.js +70 -1
- package/dist/telemetry/session-metrics.d.ts +1 -3
- package/dist/telemetry/session-metrics.js +16 -12
- package/dist/telemetry/telemetry.d.ts +9 -1
- package/dist/telemetry/telemetry.js +16 -1
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +7 -1
- package/dist/wire-journal.js +12 -2
- package/docs/README.md +4 -2
- package/docs/actions.mdx +7 -6
- package/docs/adapters.md +2 -1
- package/docs/agent-cheatsheet.md +19 -5
- package/docs/architecture.md +13 -10
- package/docs/autodrive.md +6 -5
- package/docs/benchmarks.md +2 -2
- package/docs/capabilities.mdx +1 -1
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +6 -6
- package/docs/cli/doctor.mdx +3 -1
- package/docs/cli/feedback.mdx +11 -7
- package/docs/cli/gate.mdx +1 -1
- package/docs/cli/help.mdx +1 -1
- package/docs/cli/init.mdx +20 -16
- package/docs/cli/mcp.mdx +5 -2
- package/docs/cli/open.mdx +5 -2
- package/docs/cli/report.mdx +1 -1
- package/docs/cli/restart.mdx +1 -1
- package/docs/cli/rollback.mdx +4 -4
- package/docs/cli/serve.mdx +7 -5
- package/docs/cli/setup.mdx +1 -1
- package/docs/cli/status.mdx +6 -2
- package/docs/cli/stop.mdx +3 -3
- package/docs/cli/telemetry.mdx +5 -1
- package/docs/cli/try.mdx +8 -8
- package/docs/cli/update.mdx +8 -5
- package/docs/cli/verify.mdx +12 -5
- package/docs/cli/version.mdx +1 -1
- package/docs/cli.mdx +10 -6
- package/docs/debugging.md +1 -1
- package/docs/deploy-checks.md +8 -6
- package/docs/desktop.mdx +14 -18
- package/docs/enterprise.md +6 -6
- package/docs/environment.mdx +5 -3
- package/docs/faq.mdx +9 -6
- package/docs/first-drive.md +19 -9
- package/docs/flows.md +3 -4
- package/docs/for-agents.md +1 -1
- package/docs/frameworks.mdx +34 -11
- package/docs/getting-started.md +46 -29
- package/docs/http-transport.md +2 -2
- package/docs/human-control.md +8 -8
- package/docs/index.mdx +2 -2
- package/docs/install-agentic.mdx +18 -19
- package/docs/install-manual.mdx +8 -4
- package/docs/integration-patterns.md +5 -5
- package/docs/multi-agent-testing.md +7 -5
- package/docs/packages/browser.mdx +34 -2
- package/docs/packages/core.mdx +2 -1
- package/docs/packages/electron.mdx +15 -3
- package/docs/packages/eslint-plugin.mdx +1 -1
- package/docs/packages/next.mdx +17 -5
- package/docs/packages/react.mdx +8 -1
- package/docs/packages/server.mdx +3 -3
- package/docs/packages/tauri.mdx +3 -3
- package/docs/packages/vite-plugin.mdx +1 -1
- package/docs/packages.mdx +19 -6
- package/docs/platform-integration.md +12 -4
- package/docs/predicates.mdx +18 -7
- package/docs/production-mode.md +108 -0
- package/docs/prompt-capture.md +99 -0
- package/docs/quickstart.mdx +14 -12
- package/docs/recipes.mdx +9 -8
- package/docs/required-checks.md +3 -2
- package/docs/skill-file.mdx +4 -3
- package/docs/skill-setup.md +2 -2
- package/docs/skill.md +62 -70
- package/docs/state-files.md +1 -0
- package/docs/state-management.mdx +11 -9
- package/docs/system-map.md +14 -13
- package/docs/telemetry.md +32 -24
- package/docs/testing.md +9 -5
- package/docs/tools/act-and-wait.mdx +17 -13
- package/docs/tools/act-sequence.mdx +40 -66
- package/docs/tools/act.mdx +7 -5
- package/docs/tools/assert.mdx +1 -1
- package/docs/tools/look.mdx +1 -1
- package/docs/tools/navigate.mdx +1 -1
- package/docs/tools/network.mdx +13 -11
- package/docs/tools/overview.mdx +3 -3
- package/docs/tools/query.mdx +3 -3
- package/docs/tools/session-and-feedback.mdx +9 -6
- package/docs/tools/sessions.mdx +7 -0
- package/docs/tools/snapshot.mdx +9 -7
- package/docs/tools/tools-and-run.mdx +11 -10
- package/docs/tools/verify.mdx +1 -1
- package/docs/troubleshooting.mdx +21 -9
- package/docs/usage.md +58 -43
- package/docs/use-cases.mdx +2 -2
- package/docs/vs-chrome-devtools-mcp.mdx +5 -5
- package/docs/vs-playwright-mcp.mdx +5 -4
- package/docs/what-is-recorded.md +12 -7
- package/docs/what-is-reticle.mdx +2 -2
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/dev/stale-issue-guard.d.ts +0 -34
- package/dist/command/dev/stale-issue-guard.js +0 -69
|
@@ -5,32 +5,28 @@
|
|
|
5
5
|
* because those answers are never actively wrong. When a project directory IS in hand, name the
|
|
6
6
|
* packages actually in package.json and the manager the lockfile implies.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
* (`library-path-boundary.test.ts`);
|
|
10
|
-
* lockfile → manager map is the same evidence `detectPackageManager` reads, kept here so a HELLO
|
|
11
|
-
* does not load the install plan.
|
|
8
|
+
* The manager is init's own rule, `detectPackageManager` over `resolveLockfiles`, read through a
|
|
9
|
+
* declared crossing (`library-path-boundary.test.ts`); a copy kept here had fallen behind it.
|
|
12
10
|
*/
|
|
13
11
|
import { join } from 'node:path';
|
|
14
12
|
import { readFileSync } from 'node:fs';
|
|
13
|
+
import { detectPackageManager, PackageManager, resolveLockfiles } from '@reticlehq/init';
|
|
15
14
|
import { reticleDepsOf } from '../../memory/project/reticle-deps.js';
|
|
16
|
-
/**
|
|
17
|
-
export const PackageManagerName =
|
|
18
|
-
PNPM: 'pnpm',
|
|
19
|
-
YARN: 'yarn',
|
|
20
|
-
BUN: 'bun',
|
|
21
|
-
NPM: 'npm',
|
|
22
|
-
};
|
|
15
|
+
/** init's manager names, under the name this module exports. */
|
|
16
|
+
export const PackageManagerName = PackageManager;
|
|
23
17
|
/** Same package a Vue/Nuxt install gets — never the React kit. */
|
|
24
18
|
const FRAMEWORK_NEUTRAL_SDK = '@reticlehq/browser';
|
|
25
19
|
const PACKAGE_JSON = 'package.json';
|
|
26
20
|
const NODE_MODULES = 'node_modules';
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
21
|
+
/** The files init's rule reads, probed one by one because this module is handed a file reader. */
|
|
22
|
+
const LOCKFILE_NAMES = [
|
|
23
|
+
'pnpm-lock.yaml',
|
|
24
|
+
'yarn.lock',
|
|
25
|
+
'bun.lockb',
|
|
26
|
+
'bun.lock',
|
|
27
|
+
'package-lock.json',
|
|
33
28
|
];
|
|
29
|
+
const NODE_MODULES_MARKERS = ['.modules.yaml', '.yarn-state.yml', '.package-lock.json'];
|
|
34
30
|
const INSTALL_FLAGS = {
|
|
35
31
|
[PackageManagerName.PNPM]: ['add', '-D'],
|
|
36
32
|
[PackageManagerName.YARN]: ['add', '-D'],
|
|
@@ -42,19 +38,6 @@ function packagesFor(ctx) {
|
|
|
42
38
|
return ctx.packages;
|
|
43
39
|
return [FRAMEWORK_NEUTRAL_SDK];
|
|
44
40
|
}
|
|
45
|
-
function managerOf(lockfiles, nodeModulesMarkers) {
|
|
46
|
-
if (lockfiles.has('pnpm-lock.yaml'))
|
|
47
|
-
return PackageManagerName.PNPM;
|
|
48
|
-
if (lockfiles.has('yarn.lock'))
|
|
49
|
-
return PackageManagerName.YARN;
|
|
50
|
-
if (lockfiles.has('bun.lockb') || lockfiles.has('bun.lock'))
|
|
51
|
-
return PackageManagerName.BUN;
|
|
52
|
-
for (const [name, pm] of NODE_MODULES_MARKERS) {
|
|
53
|
-
if (nodeModulesMarkers.has(name))
|
|
54
|
-
return pm;
|
|
55
|
-
}
|
|
56
|
-
return PackageManagerName.NPM;
|
|
57
|
-
}
|
|
58
41
|
function installLine(pm, pkgs) {
|
|
59
42
|
return `${pm} ${[...INSTALL_FLAGS[pm], ...pkgs].join(' ')}`;
|
|
60
43
|
}
|
|
@@ -86,7 +69,7 @@ export function sdkFixContextOf(pkgJson, lockfiles, nodeModulesMarkers = new Set
|
|
|
86
69
|
return undefined;
|
|
87
70
|
return {
|
|
88
71
|
packages: reticleDepsOf(pkgJson),
|
|
89
|
-
packageManager:
|
|
72
|
+
packageManager: detectPackageManager(lockfiles, nodeModulesMarkers, pkgJson),
|
|
90
73
|
};
|
|
91
74
|
}
|
|
92
75
|
/** Reads a file, or undefined if it is not there / not readable. */
|
|
@@ -122,6 +105,8 @@ function present(directory, names, read, extra = '') {
|
|
|
122
105
|
* `read` is injected so the decision is testable without a filesystem; the daemon uses the default.
|
|
123
106
|
*/
|
|
124
107
|
export function sdkFixForDirectory(daemonVersion, directory, read = readTextFile) {
|
|
125
|
-
const
|
|
108
|
+
const markers = present(directory, NODE_MODULES_MARKERS, read, NODE_MODULES);
|
|
109
|
+
const exists = (path) => read(path) !== undefined;
|
|
110
|
+
const ctx = sdkFixContextOf(parseJson(read(join(directory, PACKAGE_JSON))), resolveLockfiles(present(directory, LOCKFILE_NAMES, read), directory, { exists }, markers), markers);
|
|
126
111
|
return resolveSdkFix(daemonVersion, ctx);
|
|
127
112
|
}
|
|
@@ -67,6 +67,8 @@ interface SelfIdentity {
|
|
|
67
67
|
contract: string;
|
|
68
68
|
contractParts?: ContractParts | undefined;
|
|
69
69
|
}
|
|
70
|
+
/** The one line that converges every piece, after the detailed fix. Not said for one version. */
|
|
71
|
+
export declare const SKEW_CONVERGE: string;
|
|
70
72
|
/**
|
|
71
73
|
* The one sentence to tell the agent, or undefined when the pair agrees.
|
|
72
74
|
*
|
|
@@ -94,6 +96,14 @@ export declare function describeSkew(given: PeerIdentity, self: SelfIdentity): s
|
|
|
94
96
|
* `@reticlehq/react` and told Vue projects to install a React package (#618).
|
|
95
97
|
*/
|
|
96
98
|
export declare function sdkFix(daemonVersion: string): string;
|
|
99
|
+
/**
|
|
100
|
+
* Compare two of our own version strings. Numeric dotted compare, prerelease tags ignored: both
|
|
101
|
+
* sides are Reticle package versions, so this never sees a range or build metadata. Undefined when
|
|
102
|
+
* either side does not parse, so the caller can decline to guess a direction.
|
|
103
|
+
*/
|
|
104
|
+
export declare function compareVersions(a: string | undefined, b: string): number | undefined;
|
|
105
|
+
/** True when the page SDK is a minor release or more behind the daemon. A patch is not behind. */
|
|
106
|
+
export declare function sdkIsBehind(sdk: string | undefined, daemon: string): boolean;
|
|
97
107
|
/** The same fact for the person looking at the page, on its overlay. */
|
|
98
108
|
export declare const SDK_BEHIND_NARRATION: (sdk: string, daemon: string) => string;
|
|
99
109
|
/**
|
|
@@ -117,11 +127,16 @@ export declare function describeSdkBehind(sdk: string | undefined, daemon: strin
|
|
|
117
127
|
* contract hashes with the roles unchanged. Nothing the agent can do converges that, so say so and
|
|
118
128
|
* ask for the one thing that does, exactly as the SDK branch already does when the page is stale.
|
|
119
129
|
*
|
|
130
|
+
* It also branches on the connected pages' SDK versions (#1709). When the daemon is the older half
|
|
131
|
+
* and every connected page runs that same version, a restart replaces one mismatch with a wider
|
|
132
|
+
* one: the new daemon and every page. Name the SDK update instead. No pages, or pages already on
|
|
133
|
+
* the agent's version, still restart the daemon.
|
|
134
|
+
*
|
|
120
135
|
* Both versions are named by ROLE, not by which side is calling: this is read from both ends — a
|
|
121
136
|
* CLI judging the daemon it attached to, and the daemon judging an agent that announced itself —
|
|
122
137
|
* and the advice depends on which piece is behind, not on who noticed.
|
|
123
138
|
*/
|
|
124
|
-
export declare function daemonFix(daemonVersion: string | undefined, agentVersion: string | undefined): string;
|
|
139
|
+
export declare function daemonFix(daemonVersion: string | undefined, agentVersion: string | undefined, pageSdkVersions?: readonly (string | undefined)[]): string;
|
|
125
140
|
/** True when `error` is Playwright's closed-target class — not proof the tab is gone. */
|
|
126
141
|
export declare function isPlaywrightClosedError(error: unknown): boolean;
|
|
127
142
|
/**
|
|
@@ -56,6 +56,9 @@ function namesWeDoNotKnow(peer, self) {
|
|
|
56
56
|
].filter((name) => !RETIRED_WIRE_NAMES.includes(name));
|
|
57
57
|
return [...new Set(unknown)].sort();
|
|
58
58
|
}
|
|
59
|
+
/** The one line that converges every piece, after the detailed fix. Not said for one version. */
|
|
60
|
+
export const SKEW_CONVERGE = "To put every piece on one version, update the CLI and the app SDK (`reticle update` in the app's " +
|
|
61
|
+
'folder does both), then restart the MCP host.';
|
|
59
62
|
/** The fix for two builds of one version. */
|
|
60
63
|
const SAME_VERSION_FIX = 'Both say the same version, so one of them is an older build of it: run `reticle restart`, then ' +
|
|
61
64
|
'reload the page so it loads the SDK the dev server serves now.';
|
|
@@ -87,6 +90,7 @@ export function describeSkew(given, self) {
|
|
|
87
90
|
// One version, two builds (a daemon running code older than its install, a cached page bundle):
|
|
88
91
|
// installing that version again changes nothing, so the fix is the restart and the reload.
|
|
89
92
|
const peer = given.version === self.version ? { ...given, fix: SAME_VERSION_FIX } : given;
|
|
93
|
+
const converge = given.version === self.version ? '' : ` ${SKEW_CONVERGE}`;
|
|
90
94
|
// Both sides said which names they speak, so compare the names rather than a hash over them.
|
|
91
95
|
if (peer.contractParts !== undefined && self.contractParts !== undefined) {
|
|
92
96
|
const unknown = namesWeDoNotKnow(peer.contractParts, self.contractParts);
|
|
@@ -100,14 +104,14 @@ export function describeSkew(given, self) {
|
|
|
100
104
|
: 'so it was built against a newer contract than this one';
|
|
101
105
|
return (`version skew: ${versionPhrase(peer, self)}, and ${peer.what} speaks names this daemon does ` +
|
|
102
106
|
`not know (${unknown.join(', ')}) — ${why}. ` +
|
|
103
|
-
`Tools will behave in ways neither side reports. ${peer.fix}`);
|
|
107
|
+
`Tools will behave in ways neither side reports. ${peer.fix}${converge}`);
|
|
104
108
|
}
|
|
105
109
|
if (peer.contract === undefined) {
|
|
106
110
|
if (peer.version === undefined || peer.version === self.version)
|
|
107
111
|
return undefined;
|
|
108
112
|
return (`version skew: ${versionPhrase(peer, self)}, and it is too old to report which wire contract ` +
|
|
109
113
|
`it speaks. They connect anyway and then disagree about behaviour, which usually surfaces as ` +
|
|
110
|
-
`a bare -32000 with nothing naming a version. ${peer.fix}`);
|
|
114
|
+
`a bare -32000 with nothing naming a version. ${peer.fix}${converge}`);
|
|
111
115
|
}
|
|
112
116
|
/*
|
|
113
117
|
* A fingerprint alone cannot tell an ADDITION from a RENAME, so this sentence must not claim it can.
|
|
@@ -125,7 +129,7 @@ export function describeSkew(given, self) {
|
|
|
125
129
|
return (`version skew: ${versionPhrase(peer, self)}, and they were built against different wire ` +
|
|
126
130
|
`contracts (${peer.contract} vs ${self.contract}). ${peer.what} is too old to say WHICH names ` +
|
|
127
131
|
`it speaks, so this cannot tell an added name — which breaks nothing — from a renamed one, ` +
|
|
128
|
-
`which breaks the call that uses it. Update it and the question goes away. ${peer.fix}`);
|
|
132
|
+
`which breaks the call that uses it. Update it and the question goes away. ${peer.fix}${converge}`);
|
|
129
133
|
}
|
|
130
134
|
/**
|
|
131
135
|
* The fix line for a page whose SDK disagrees with this daemon, with no project to read.
|
|
@@ -143,7 +147,7 @@ export function sdkFix(daemonVersion) {
|
|
|
143
147
|
* sides are Reticle package versions, so this never sees a range or build metadata. Undefined when
|
|
144
148
|
* either side does not parse, so the caller can decline to guess a direction.
|
|
145
149
|
*/
|
|
146
|
-
function compareVersions(a, b) {
|
|
150
|
+
export function compareVersions(a, b) {
|
|
147
151
|
const parts = (v) => {
|
|
148
152
|
const head = v.split('-')[0];
|
|
149
153
|
if (head === undefined)
|
|
@@ -164,6 +168,15 @@ function compareVersions(a, b) {
|
|
|
164
168
|
}
|
|
165
169
|
return 0;
|
|
166
170
|
}
|
|
171
|
+
/** True when the page SDK is a minor release or more behind the daemon. A patch is not behind. */
|
|
172
|
+
export function sdkIsBehind(sdk, daemon) {
|
|
173
|
+
const minorOf = (v) => v.split('-')[0]?.split('.').slice(0, 2).join('.') ?? v;
|
|
174
|
+
if (sdk === undefined) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
const order = compareVersions(minorOf(sdk), minorOf(daemon));
|
|
178
|
+
return order !== undefined && order < 0;
|
|
179
|
+
}
|
|
167
180
|
/** The same fact for the person looking at the page, on its overlay. */
|
|
168
181
|
export const SDK_BEHIND_NARRATION = (sdk, daemon) => `This app runs Reticle SDK ${sdk}, older than Reticle ${daemon}. Run \`reticle update\` in the ` +
|
|
169
182
|
"app's folder, then restart its dev server.";
|
|
@@ -178,16 +191,61 @@ export const SDK_BEHIND_NARRATION = (sdk, daemon) => `This app runs Reticle SDK
|
|
|
178
191
|
* because reading the project's manifest is only worth it when the page IS behind.
|
|
179
192
|
*/
|
|
180
193
|
export function describeSdkBehind(sdk, daemon, fix) {
|
|
181
|
-
|
|
182
|
-
if (sdk === undefined)
|
|
183
|
-
return undefined;
|
|
184
|
-
const order = compareVersions(minorOf(sdk), minorOf(daemon));
|
|
185
|
-
if (order === undefined || order >= 0)
|
|
194
|
+
if (sdk === undefined || !sdkIsBehind(sdk, daemon))
|
|
186
195
|
return undefined;
|
|
187
196
|
return (`This page runs Reticle SDK ${sdk}, older than Reticle ${daemon}. It connects and verifies, ` +
|
|
188
197
|
`but everything added since is missing from the page, the overlay's newer controls included. ` +
|
|
189
198
|
fix());
|
|
190
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* True when every connected page reported the daemon's SDK version.
|
|
202
|
+
*
|
|
203
|
+
* An empty list is not a match: `Array.every` is true for no pages, and no pages is the case that
|
|
204
|
+
* still restarts the daemon. A page that did not report a version does not match.
|
|
205
|
+
*/
|
|
206
|
+
function pagesMatchDaemon(pageSdkVersions, daemonVersion) {
|
|
207
|
+
if (0 === pageSdkVersions.length)
|
|
208
|
+
return false;
|
|
209
|
+
return pageSdkVersions.every((version) => 0 === compareVersions(version, daemonVersion));
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Pages sit on the older daemon. Restarting it now moves the daemon to the agent and skews every
|
|
213
|
+
* page (#1709). The SDK update is the step that puts all three on one version.
|
|
214
|
+
*/
|
|
215
|
+
function sdkUpdateConverges(daemonVersion, agentVersion) {
|
|
216
|
+
return (`The connected pages run SDK ${daemonVersion}, the same version as this daemon. ` +
|
|
217
|
+
`\`reticle stop\` starts a daemon at ${agentVersion} and skews every page. ` +
|
|
218
|
+
`${sdkFix(agentVersion)} ` +
|
|
219
|
+
`That SDK update puts the pages, the daemon and the agent on one version. ` +
|
|
220
|
+
'Restart the daemon only after the pages load the new SDK.');
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* The newest page SDK version that is newer than `agentVersion`, or undefined when no page is.
|
|
224
|
+
*
|
|
225
|
+
* The agent's MCP server starts the daemon. When a page is newer than it, `reticle stop` only
|
|
226
|
+
* starts a daemon at the same old version again, and the advice loops.
|
|
227
|
+
*/
|
|
228
|
+
function newestPageAhead(pageSdkVersions, agentVersion) {
|
|
229
|
+
let newest;
|
|
230
|
+
for (const version of pageSdkVersions) {
|
|
231
|
+
const ahead = compareVersions(version, agentVersion);
|
|
232
|
+
if (version === undefined || ahead === undefined || ahead <= 0) {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const order = newest === undefined ? 1 : compareVersions(version, newest);
|
|
236
|
+
if (order !== undefined && order > 0) {
|
|
237
|
+
newest = version;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return newest;
|
|
241
|
+
}
|
|
242
|
+
/** The MCP server is the old part: a daemon restart comes back at its version. */
|
|
243
|
+
function mcpServerIsOld(agentVersion, pageVersion) {
|
|
244
|
+
return (`The connected pages run SDK ${pageVersion}, but the agent's MCP server is ${agentVersion}. ` +
|
|
245
|
+
`The MCP server starts the daemon, so \`reticle stop\` starts a ${agentVersion} daemon again. ` +
|
|
246
|
+
'Do not stop the daemon. Tell the human to update the MCP entry (or the Reticle plugin) to ' +
|
|
247
|
+
`@reticlehq/server@${pageVersion} or later, clear a cached npx copy, and restart the agent.`);
|
|
248
|
+
}
|
|
191
249
|
/**
|
|
192
250
|
* The fix line for another Reticle process that disagrees with the daemon it attached to.
|
|
193
251
|
*
|
|
@@ -198,17 +256,33 @@ export function describeSdkBehind(sdk, daemon, fix) {
|
|
|
198
256
|
* contract hashes with the roles unchanged. Nothing the agent can do converges that, so say so and
|
|
199
257
|
* ask for the one thing that does, exactly as the SDK branch already does when the page is stale.
|
|
200
258
|
*
|
|
259
|
+
* It also branches on the connected pages' SDK versions (#1709). When the daemon is the older half
|
|
260
|
+
* and every connected page runs that same version, a restart replaces one mismatch with a wider
|
|
261
|
+
* one: the new daemon and every page. Name the SDK update instead. No pages, or pages already on
|
|
262
|
+
* the agent's version, still restart the daemon.
|
|
263
|
+
*
|
|
201
264
|
* Both versions are named by ROLE, not by which side is calling: this is read from both ends — a
|
|
202
265
|
* CLI judging the daemon it attached to, and the daemon judging an agent that announced itself —
|
|
203
266
|
* and the advice depends on which piece is behind, not on who noticed.
|
|
204
267
|
*/
|
|
205
|
-
export function daemonFix(daemonVersion, agentVersion) {
|
|
268
|
+
export function daemonFix(daemonVersion, agentVersion, pageSdkVersions = []) {
|
|
206
269
|
const order = agentVersion === undefined ? undefined : compareVersions(daemonVersion, agentVersion);
|
|
207
270
|
if (order !== undefined && order > 0) {
|
|
208
271
|
return ('The daemon is NEWER than this process, so `reticle stop` will not converge them — it would ' +
|
|
209
272
|
'replace it with another newer daemon and leave the same mismatch. Tell the human to restart ' +
|
|
210
273
|
'the agent so it spawns a current MCP server (or update the package it spawns), then retry.');
|
|
211
274
|
}
|
|
275
|
+
const pageAhead = agentVersion === undefined ? undefined : newestPageAhead(pageSdkVersions, agentVersion);
|
|
276
|
+
if (agentVersion !== undefined && pageAhead !== undefined) {
|
|
277
|
+
return mcpServerIsOld(agentVersion, pageAhead);
|
|
278
|
+
}
|
|
279
|
+
if (order !== undefined &&
|
|
280
|
+
order < 0 &&
|
|
281
|
+
daemonVersion !== undefined &&
|
|
282
|
+
agentVersion !== undefined &&
|
|
283
|
+
pagesMatchDaemon(pageSdkVersions, daemonVersion)) {
|
|
284
|
+
return sdkUpdateConverges(daemonVersion, agentVersion);
|
|
285
|
+
}
|
|
212
286
|
return ('A daemon outlives the agents attached to it, so it keeps serving its OWN code until it restarts ' +
|
|
213
287
|
'— anything fixed in the newer package is simply absent. Run `reticle stop` and retry to replace ' +
|
|
214
288
|
'it (other agents on that daemon will need to reconnect).');
|
|
@@ -80,7 +80,7 @@ export const CRAWL_TOOLS = [
|
|
|
80
80
|
.optional()
|
|
81
81
|
.describe('Where the fault is written, as `file:line`; console errors prefer their own stack and fall back to the clicked control.'),
|
|
82
82
|
})),
|
|
83
|
-
counts: z.record(z.number()),
|
|
83
|
+
counts: z.record(z.string(), z.number()),
|
|
84
84
|
visited: z.array(z.string()).describe('The controls actually clicked, in order.'),
|
|
85
85
|
coverageNote: z
|
|
86
86
|
.string()
|
|
@@ -92,7 +92,7 @@ export const CRAWL_TOOLS = [
|
|
|
92
92
|
.optional()
|
|
93
93
|
.describe('Controls clicked whose silence could not be judged, e.g. on a background tab. They are NOT reported as dead, and they are not known to work either.'),
|
|
94
94
|
// Only on `exhaustive` — see features/exhaust/exhaust-run.ts. Loose: it carries the levels.
|
|
95
|
-
exhaustive: z.record(z.unknown()).optional(),
|
|
95
|
+
exhaustive: z.record(z.string(), z.unknown()).optional(),
|
|
96
96
|
},
|
|
97
97
|
handler: async (deps, args) => {
|
|
98
98
|
const session = deps.sessions.resolve(asString(args['sessionId']));
|
|
@@ -375,6 +375,8 @@ export async function crawl(session, opts, sleep) {
|
|
|
375
375
|
// need — without it a crawl would report nothing about the UI moving, which is most of what a
|
|
376
376
|
// crawl is for.
|
|
377
377
|
actionSince: since,
|
|
378
|
+
// The control clicked, so a failed write is judged by what became of it.
|
|
379
|
+
ref: item.ref,
|
|
378
380
|
})) {
|
|
379
381
|
counts.contradictions += 1;
|
|
380
382
|
anomalies.push({
|
|
@@ -32,110 +32,29 @@ export declare const CoverageLevel: {
|
|
|
32
32
|
export type CoverageLevel = (typeof CoverageLevel)[keyof typeof CoverageLevel];
|
|
33
33
|
declare const LedgerSchema: z.ZodObject<{
|
|
34
34
|
routes: z.ZodObject<{
|
|
35
|
-
discovered: z.ZodArray<z.ZodString
|
|
36
|
-
reached: z.ZodArray<z.ZodString
|
|
37
|
-
},
|
|
38
|
-
reached: string[];
|
|
39
|
-
discovered: string[];
|
|
40
|
-
}, {
|
|
41
|
-
reached: string[];
|
|
42
|
-
discovered: string[];
|
|
43
|
-
}>;
|
|
35
|
+
discovered: z.ZodArray<z.ZodString>;
|
|
36
|
+
reached: z.ZodArray<z.ZodString>;
|
|
37
|
+
}, z.core.$strip>;
|
|
44
38
|
controls: z.ZodObject<{
|
|
45
|
-
seen: z.ZodArray<z.ZodString
|
|
46
|
-
touched: z.ZodArray<z.ZodString
|
|
47
|
-
proved: z.ZodArray<z.ZodString
|
|
48
|
-
},
|
|
49
|
-
proved: string[];
|
|
50
|
-
seen: string[];
|
|
51
|
-
touched: string[];
|
|
52
|
-
}, {
|
|
53
|
-
proved: string[];
|
|
54
|
-
seen: string[];
|
|
55
|
-
touched: string[];
|
|
56
|
-
}>;
|
|
39
|
+
seen: z.ZodArray<z.ZodString>;
|
|
40
|
+
touched: z.ZodArray<z.ZodString>;
|
|
41
|
+
proved: z.ZodArray<z.ZodString>;
|
|
42
|
+
}, z.core.$strip>;
|
|
57
43
|
journeys: z.ZodObject<{
|
|
58
|
-
completed: z.ZodArray<z.ZodString
|
|
59
|
-
},
|
|
60
|
-
completed: string[];
|
|
61
|
-
}, {
|
|
62
|
-
completed: string[];
|
|
63
|
-
}>;
|
|
44
|
+
completed: z.ZodArray<z.ZodString>;
|
|
45
|
+
}, z.core.$strip>;
|
|
64
46
|
writes: z.ZodObject<{
|
|
65
|
-
seen: z.ZodArray<z.ZodString
|
|
66
|
-
branched: z.ZodArray<z.ZodString
|
|
67
|
-
unhandled: z.ZodArray<z.ZodString
|
|
68
|
-
},
|
|
69
|
-
seen: string[];
|
|
70
|
-
branched: string[];
|
|
71
|
-
unhandled: string[];
|
|
72
|
-
}, {
|
|
73
|
-
seen: string[];
|
|
74
|
-
branched: string[];
|
|
75
|
-
unhandled: string[];
|
|
76
|
-
}>;
|
|
47
|
+
seen: z.ZodArray<z.ZodString>;
|
|
48
|
+
branched: z.ZodArray<z.ZodString>;
|
|
49
|
+
unhandled: z.ZodArray<z.ZodString>;
|
|
50
|
+
}, z.core.$strip>;
|
|
77
51
|
code: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
78
52
|
name: z.ZodString;
|
|
79
53
|
executed: z.ZodBoolean;
|
|
80
|
-
},
|
|
81
|
-
name: string;
|
|
82
|
-
executed: boolean;
|
|
83
|
-
}, {
|
|
84
|
-
name: string;
|
|
85
|
-
executed: boolean;
|
|
86
|
-
}>>>;
|
|
87
|
-
/** Per file, when its code coverage was last taken. Absent in a ledger from before it existed. */
|
|
54
|
+
}, z.core.$strip>>>;
|
|
88
55
|
codeTaken: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
89
56
|
best: z.ZodRecord<z.ZodString, z.ZodNumber>;
|
|
90
|
-
},
|
|
91
|
-
code: Record<string, Record<string, {
|
|
92
|
-
name: string;
|
|
93
|
-
executed: boolean;
|
|
94
|
-
}>>;
|
|
95
|
-
journeys: {
|
|
96
|
-
completed: string[];
|
|
97
|
-
};
|
|
98
|
-
best: Record<string, number>;
|
|
99
|
-
routes: {
|
|
100
|
-
reached: string[];
|
|
101
|
-
discovered: string[];
|
|
102
|
-
};
|
|
103
|
-
controls: {
|
|
104
|
-
proved: string[];
|
|
105
|
-
seen: string[];
|
|
106
|
-
touched: string[];
|
|
107
|
-
};
|
|
108
|
-
writes: {
|
|
109
|
-
seen: string[];
|
|
110
|
-
branched: string[];
|
|
111
|
-
unhandled: string[];
|
|
112
|
-
};
|
|
113
|
-
codeTaken: Record<string, number>;
|
|
114
|
-
}, {
|
|
115
|
-
code: Record<string, Record<string, {
|
|
116
|
-
name: string;
|
|
117
|
-
executed: boolean;
|
|
118
|
-
}>>;
|
|
119
|
-
journeys: {
|
|
120
|
-
completed: string[];
|
|
121
|
-
};
|
|
122
|
-
best: Record<string, number>;
|
|
123
|
-
routes: {
|
|
124
|
-
reached: string[];
|
|
125
|
-
discovered: string[];
|
|
126
|
-
};
|
|
127
|
-
controls: {
|
|
128
|
-
proved: string[];
|
|
129
|
-
seen: string[];
|
|
130
|
-
touched: string[];
|
|
131
|
-
};
|
|
132
|
-
writes: {
|
|
133
|
-
seen: string[];
|
|
134
|
-
branched: string[];
|
|
135
|
-
unhandled: string[];
|
|
136
|
-
};
|
|
137
|
-
codeTaken?: Record<string, number> | undefined;
|
|
138
|
-
}>;
|
|
57
|
+
}, z.core.$strip>;
|
|
139
58
|
export type AppLedger = z.infer<typeof LedgerSchema>;
|
|
140
59
|
/** What one producer contributes. Every part optional: a drive adds what it saw and nothing else. */
|
|
141
60
|
export interface LedgerDelta {
|
|
@@ -41,10 +41,10 @@ const LedgerSchema = z.object({
|
|
|
41
41
|
controls: z.object({ seen: names, touched: names, proved: names }),
|
|
42
42
|
journeys: z.object({ completed: names }),
|
|
43
43
|
writes: z.object({ seen: names, branched: names, unhandled: names }),
|
|
44
|
-
code: z.record(z.record(z.object({ name: z.string(), executed: z.boolean() }))),
|
|
44
|
+
code: z.record(z.string(), z.record(z.string(), z.object({ name: z.string(), executed: z.boolean() }))),
|
|
45
45
|
/** Per file, when its code coverage was last taken. Absent in a ledger from before it existed. */
|
|
46
|
-
codeTaken: z.record(z.number()).default({}),
|
|
47
|
-
best: z.record(z.number()),
|
|
46
|
+
codeTaken: z.record(z.string(), z.number()).default({}),
|
|
47
|
+
best: z.record(z.string(), z.number()),
|
|
48
48
|
});
|
|
49
49
|
/** A ledger file's text, or an empty ledger for anything unreadable: coverage never throws. */
|
|
50
50
|
function parseLedger(text) {
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
* No I/O and no tool surface: what to run and where to write it arrive as functions, so this stays
|
|
11
11
|
* a sink the surface hands things to.
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
13
|
+
import { HarnessRunReason } from '@reticlehq/core/telemetry';
|
|
14
|
+
import { type ImpactSnapshot, type ReticleEvent } from '@reticlehq/core';
|
|
14
15
|
export declare const DriveStatus: {
|
|
15
16
|
readonly RUNNING: "running";
|
|
16
17
|
readonly DONE: "done";
|
|
@@ -25,6 +26,11 @@ export type DriveStatus = (typeof DriveStatus)[keyof typeof DriveStatus];
|
|
|
25
26
|
* such a run as "broken", which reads as a fault in the Harness; a refusal is a refusal.
|
|
26
27
|
*/
|
|
27
28
|
export declare class DriveRefusedError extends Error {
|
|
29
|
+
/** Why, as `harness_run` reports it. */
|
|
30
|
+
readonly reason: HarnessRunReason;
|
|
31
|
+
constructor(message: string,
|
|
32
|
+
/** Why, as `harness_run` reports it. */
|
|
33
|
+
reason?: HarnessRunReason);
|
|
28
34
|
}
|
|
29
35
|
/** Who asked for the drive. */
|
|
30
36
|
export declare const DriveOrigin: {
|
|
@@ -88,8 +94,23 @@ export declare function runningDrives(): DriveRecord[];
|
|
|
88
94
|
* is first. Ending the wait never ends the drive. `onChange` hears every step while waiting.
|
|
89
95
|
*/
|
|
90
96
|
export declare function awaitDrive(runId: string, ms: number | undefined, signal?: AbortSignal, onChange?: (record: DriveRecord) => void): Promise<void>;
|
|
91
|
-
/**
|
|
92
|
-
|
|
97
|
+
/**
|
|
98
|
+
* Ask a running drive to stop. False when there is no such drive running. `reason` is said on the
|
|
99
|
+
* Harness page when something other than the person stopped it (the page reloaded).
|
|
100
|
+
*/
|
|
101
|
+
export declare function stopDrive(runId: string, reason?: string): boolean;
|
|
102
|
+
/** Why no drive started on this tab (a refusal, the cloud unreachable), for its Harness page. */
|
|
103
|
+
export declare function noteHarnessWord(sessionId: string, said: string): void;
|
|
104
|
+
/** Said on the Harness page when a person reloads the page during a run. */
|
|
105
|
+
export declare const MSG_RELOADED = "The page reloaded, so this run stopped. Run again.";
|
|
106
|
+
/** The daemon asked this tab to reload: the page coming back is not a person reloading it. */
|
|
107
|
+
export declare function noteOwnReload(sessionId: string, at: number): void;
|
|
108
|
+
/**
|
|
109
|
+
* Read each event a tab sends. A document that arrives as a reload the daemon did not ask for is a
|
|
110
|
+
* person reloading the page, and a drive on that tab cannot go on as if the page had not started
|
|
111
|
+
* over: it is stopped, and its Harness page says why. Before, it drove on and ended "failed".
|
|
112
|
+
*/
|
|
113
|
+
export declare function notePageLoaded(sessionId: string, event: ReticleEvent, at: number): void;
|
|
93
114
|
/** Queue text for the driver's next turn. False when there is no such drive running. */
|
|
94
115
|
export declare function sayToDrive(runId: string, text: string): boolean;
|
|
95
116
|
/** One tool call a drive made. `harness` may be a lane's id (`<harness>-L2`). */
|
|
@@ -116,5 +137,8 @@ export declare const POLL_WAIT_DEFAULT_S = 50;
|
|
|
116
137
|
export declare function pollCall(runId: string): string;
|
|
117
138
|
/** What a poll answering `running` tells the agent to do, so it stays rather than walks away. */
|
|
118
139
|
export declare function stillRunning(runId: string, steps: number, elapsedS: number): string;
|
|
119
|
-
/**
|
|
140
|
+
/**
|
|
141
|
+
* The impact snapshot, with the drive running on this tab and its step log when there is one, else
|
|
142
|
+
* how the last one on this tab ended.
|
|
143
|
+
*/
|
|
120
144
|
export declare function withRunningDrive(snapshot: ImpactSnapshot | undefined, sessionId: string): ImpactSnapshot | undefined;
|