@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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as http from 'node:http';
|
|
2
2
|
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
3
|
-
import { MCP_SSE_PATH, MCP_MESSAGE_PATH, MCP_SHUTDOWN_EVENT, STATUS_PATH, STATUS_HOLD_QUERY, DRIVE_PATH, } from '@reticlehq/core';
|
|
3
|
+
import { MCP_SSE_PATH, MCP_MESSAGE_PATH, MCP_SHUTDOWN_EVENT, STATUS_PATH, STATUS_HOLD_QUERY, DRIVE_PATH, SHUTDOWN_PATH, PROXY_ID_PARAM, } from '@reticlehq/core';
|
|
4
4
|
import { getSessionMetrics } from '../telemetry/session-metrics.js';
|
|
5
|
-
import { agentPeerSkew, PEER_VERSION_PARAM, PEER_CONTRACT_PARAM, } from '../command/version/peer-announce.js';
|
|
5
|
+
import { agentPeerSkew, agentSessionOf, AGENT_SESSION_PARAM, PEER_VERSION_PARAM, PEER_CONTRACT_PARAM, } from '../command/version/peer-announce.js';
|
|
6
6
|
import { log } from '../log.js';
|
|
7
7
|
import { isLoopbackHost, isLocalWebOrigin, isLoopbackPeer, requestToken, tokensMatch, } from '../portal/bridge/token-auth.js';
|
|
8
8
|
import { clientDirectoryFromPeer, runWithClientDirectory } from '../hooks/client-directory.js';
|
|
@@ -18,8 +18,10 @@ import { LOOPBACK_IDLE_MS } from './loopback-agent.js';
|
|
|
18
18
|
*/
|
|
19
19
|
export function createSharedServer(options = {}) {
|
|
20
20
|
let mcpFactory;
|
|
21
|
+
let pageSdkVersions = () => [];
|
|
21
22
|
let statusProvider;
|
|
22
23
|
let driveProvider;
|
|
24
|
+
let shutdownHandler;
|
|
23
25
|
let agentPresence;
|
|
24
26
|
const transports = new Map();
|
|
25
27
|
/**
|
|
@@ -47,10 +49,12 @@ export function createSharedServer(options = {}) {
|
|
|
47
49
|
const localClient = isLoopbackPeer(req.socket.remoteAddress) &&
|
|
48
50
|
isLoopbackHost(req.headers.host) &&
|
|
49
51
|
isLocalWebOrigin(req.headers.origin, req.headers.referer);
|
|
50
|
-
if (localClient)
|
|
52
|
+
if (localClient) {
|
|
51
53
|
return true;
|
|
52
|
-
|
|
54
|
+
}
|
|
55
|
+
if (token === undefined) {
|
|
53
56
|
return false;
|
|
57
|
+
}
|
|
54
58
|
return tokensMatch(token, requestToken(req, url));
|
|
55
59
|
};
|
|
56
60
|
const httpServer = http.createServer((req, res) => {
|
|
@@ -90,6 +94,30 @@ export function createSharedServer(options = {}) {
|
|
|
90
94
|
res.end(body);
|
|
91
95
|
return;
|
|
92
96
|
}
|
|
97
|
+
if ('POST' === req.method && path === SHUTDOWN_PATH) {
|
|
98
|
+
// Stricter than the routes above: loopback alone is not enough to stop a daemon that serves
|
|
99
|
+
// every agent on this machine. The caller must also show the pairing token.
|
|
100
|
+
if (!isLoopbackPeer(req.socket.remoteAddress) || token === undefined) {
|
|
101
|
+
res.writeHead(403, { 'Content-Type': 'text/plain' });
|
|
102
|
+
res.end('forbidden');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (!tokensMatch(token, requestToken(req, url))) {
|
|
106
|
+
res.writeHead(401, { 'Content-Type': 'text/plain' });
|
|
107
|
+
res.end('unauthorized');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const handler = shutdownHandler;
|
|
111
|
+
if (handler === undefined) {
|
|
112
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
113
|
+
res.end('not found');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// Answer first: the shutdown closes this server.
|
|
117
|
+
res.writeHead(202, { 'Content-Type': 'text/plain' });
|
|
118
|
+
res.end('stopping', () => handler());
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
93
121
|
if ('POST' === req.method && path === DRIVE_PATH) {
|
|
94
122
|
if (driveProvider === undefined) {
|
|
95
123
|
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
@@ -148,7 +176,7 @@ export function createSharedServer(options = {}) {
|
|
|
148
176
|
// own check (a stderr line no agent reads), a nudge queued here rides out on the agent's next
|
|
149
177
|
// tool result. That is the pair the user hits after `npm update`: a cached npx MCP package
|
|
150
178
|
// talking to a daemon from a different build.
|
|
151
|
-
const peerSkew = agentPeerSkew(url.searchParams.get(PEER_VERSION_PARAM), url.searchParams.get(PEER_CONTRACT_PARAM));
|
|
179
|
+
const peerSkew = agentPeerSkew(url.searchParams.get(PEER_VERSION_PARAM), url.searchParams.get(PEER_CONTRACT_PARAM), pageSdkVersions());
|
|
152
180
|
if (mcpFactory === undefined) {
|
|
153
181
|
res.writeHead(503, { 'Content-Type': 'text/plain' });
|
|
154
182
|
res.end('MCP server not ready');
|
|
@@ -158,16 +186,19 @@ export function createSharedServer(options = {}) {
|
|
|
158
186
|
// one active transport per Server instance, so concurrent clients each need
|
|
159
187
|
// their own instance backed by the same shared ToolDeps.
|
|
160
188
|
// Handed to THIS connection's server only: the skew is about this agent, not the daemon (#1136).
|
|
161
|
-
|
|
189
|
+
// The agent's own session id, so this connection's episode joins the agent hooks' records.
|
|
190
|
+
const mcpServer = mcpFactory(peerSkew, proxyIdOf(url.searchParams.get(PROXY_ID_PARAM)), agentSessionOf(url.searchParams.get(AGENT_SESSION_PARAM)));
|
|
162
191
|
const transport = new SSEServerTransport(MCP_MESSAGE_PATH, res);
|
|
163
192
|
const sid = transport.sessionId;
|
|
164
193
|
transports.set(sid, transport);
|
|
165
194
|
sseStreams.set(sid, res);
|
|
166
195
|
const peerVersion = url.searchParams.get(PEER_VERSION_PARAM);
|
|
167
|
-
if (null !== peerVersion && 0 < peerVersion.length)
|
|
196
|
+
if (null !== peerVersion && 0 < peerVersion.length) {
|
|
168
197
|
peerVersions.set(sid, peerVersion);
|
|
169
|
-
|
|
170
|
-
|
|
198
|
+
}
|
|
199
|
+
if (1 === transports.size) {
|
|
200
|
+
agentPresence?.(true);
|
|
201
|
+
} // first agent attached
|
|
171
202
|
res.on('close', () => {
|
|
172
203
|
transports.delete(sid);
|
|
173
204
|
sseStreams.delete(sid);
|
|
@@ -183,8 +214,9 @@ export function createSharedServer(options = {}) {
|
|
|
183
214
|
catch {
|
|
184
215
|
/* a counter must never affect a disconnect path */
|
|
185
216
|
}
|
|
186
|
-
if (0 === transports.size)
|
|
187
|
-
agentPresence?.(false);
|
|
217
|
+
if (0 === transports.size) {
|
|
218
|
+
agentPresence?.(false);
|
|
219
|
+
} // last agent detached → it's the human's turn
|
|
188
220
|
});
|
|
189
221
|
mcpServer
|
|
190
222
|
.connect(transport)
|
|
@@ -233,12 +265,18 @@ export function createSharedServer(options = {}) {
|
|
|
233
265
|
function attachDrive(provider) {
|
|
234
266
|
driveProvider = provider;
|
|
235
267
|
}
|
|
268
|
+
function attachShutdown(handler) {
|
|
269
|
+
shutdownHandler = handler;
|
|
270
|
+
}
|
|
236
271
|
function attachAgentPresence(cb) {
|
|
237
272
|
agentPresence = cb;
|
|
238
273
|
}
|
|
239
274
|
function attachMcp(factory) {
|
|
240
275
|
mcpFactory = factory;
|
|
241
276
|
}
|
|
277
|
+
function attachPageSdkVersions(provider) {
|
|
278
|
+
pageSdkVersions = provider;
|
|
279
|
+
}
|
|
242
280
|
function announceShutdown() {
|
|
243
281
|
for (const [sid, stream] of sseStreams) {
|
|
244
282
|
try {
|
|
@@ -271,8 +309,9 @@ export function createSharedServer(options = {}) {
|
|
|
271
309
|
'ERR_SERVER_NOT_RUNNING' !== err.code) {
|
|
272
310
|
reject(err);
|
|
273
311
|
}
|
|
274
|
-
else
|
|
312
|
+
else {
|
|
275
313
|
resolve();
|
|
314
|
+
}
|
|
276
315
|
});
|
|
277
316
|
});
|
|
278
317
|
}
|
|
@@ -290,8 +329,10 @@ export function createSharedServer(options = {}) {
|
|
|
290
329
|
return {
|
|
291
330
|
httpServer,
|
|
292
331
|
attachMcp,
|
|
332
|
+
attachPageSdkVersions,
|
|
293
333
|
attachStatus,
|
|
294
334
|
attachDrive,
|
|
335
|
+
attachShutdown,
|
|
295
336
|
attachAgentPresence,
|
|
296
337
|
announceShutdown,
|
|
297
338
|
close,
|
|
@@ -308,12 +349,18 @@ const MAX_DRIVE_BODY_BYTES = 8 * 1024;
|
|
|
308
349
|
* because real clients send them.
|
|
309
350
|
*/
|
|
310
351
|
const JSON_MEDIA_TYPE = 'application/json';
|
|
352
|
+
/** A proxy id is a UUID. Anything else is not an id this daemon keys an agent by. */
|
|
353
|
+
const PROXY_ID_SHAPE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
354
|
+
function proxyIdOf(raw) {
|
|
355
|
+
return null !== raw && PROXY_ID_SHAPE.test(raw) ? raw : undefined;
|
|
356
|
+
}
|
|
311
357
|
function isJsonRequest(req) {
|
|
312
358
|
// Read through the typed accessor rather than indexing the header bag: the index signature is
|
|
313
359
|
// `any`-shaped, and narrowing after an unsafe read is narrowing a lie.
|
|
314
360
|
const value = req.headersDistinct['content-type']?.[0];
|
|
315
|
-
if (undefined === value)
|
|
361
|
+
if (undefined === value) {
|
|
316
362
|
return false;
|
|
363
|
+
}
|
|
317
364
|
return JSON_MEDIA_TYPE === value.split(';')[0]?.trim().toLowerCase();
|
|
318
365
|
}
|
|
319
366
|
function readBody(req) {
|
|
@@ -361,8 +408,9 @@ function schemeOf(url) {
|
|
|
361
408
|
}
|
|
362
409
|
function driveSchemeRefusal(url) {
|
|
363
410
|
const scheme = schemeOf(url);
|
|
364
|
-
if (scheme !== undefined && DRIVEABLE_SCHEMES.includes(scheme))
|
|
411
|
+
if (scheme !== undefined && DRIVEABLE_SCHEMES.includes(scheme)) {
|
|
365
412
|
return undefined;
|
|
413
|
+
}
|
|
366
414
|
// Names what it got, because the caller is a CLI printing this to somebody who typed the url and
|
|
367
415
|
// needs to see which part of it was the problem.
|
|
368
416
|
return (`unsupported scheme ${scheme ?? '(unparseable url)'} — reticle drive opens a running web app, ` +
|
|
@@ -376,8 +424,9 @@ function urlFromDriveRequest(body) {
|
|
|
376
424
|
catch {
|
|
377
425
|
return undefined;
|
|
378
426
|
}
|
|
379
|
-
if (typeof parsed !== 'object' || null === parsed)
|
|
427
|
+
if (typeof parsed !== 'object' || null === parsed) {
|
|
380
428
|
return undefined;
|
|
429
|
+
}
|
|
381
430
|
const url = parsed['url'];
|
|
382
431
|
return 'string' === typeof url && url.length > 0 ? url : undefined;
|
|
383
432
|
}
|
|
@@ -13,12 +13,22 @@
|
|
|
13
13
|
* it was removed. What a dashboard needs is the SHARE OF SESSIONS that lose MCP at all (the first
|
|
14
14
|
* outage) and the share where it never came back on its own (the budget being spent).
|
|
15
15
|
*/
|
|
16
|
-
import { OutageReason, OutageStage } from '@reticlehq/core/telemetry';
|
|
16
|
+
import { OutageErrCode, OutageReason, OutageStage } from '@reticlehq/core/telemetry';
|
|
17
17
|
/**
|
|
18
18
|
* `OutageStage` and `OutageReason` are core's — this re-export only saves the proxy an import. They
|
|
19
19
|
* cross the wire, so the vocabulary lives in the contract package and is never re-listed here.
|
|
20
20
|
*/
|
|
21
21
|
export { OutageReason, OutageStage };
|
|
22
|
+
/**
|
|
23
|
+
* What the proxy knew about a drop besides its reason: the socket error, if one came with it, and
|
|
24
|
+
* whether the stream had got a response first.
|
|
25
|
+
*/
|
|
26
|
+
export interface DropCause {
|
|
27
|
+
readonly error?: unknown;
|
|
28
|
+
readonly responded: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** The error's `code`, narrowed to the closed set. Never the message. */
|
|
31
|
+
export declare function outageErrCode(error: unknown): OutageErrCode;
|
|
22
32
|
/** Reset between tests; a real process reports each stage at most once. */
|
|
23
33
|
export declare function resetOutageReporting(): void;
|
|
24
34
|
/**
|
|
@@ -30,4 +40,4 @@ export declare function reportMcpOutage(stage: OutageStage, facts: {
|
|
|
30
40
|
reason: string;
|
|
31
41
|
attempts: number;
|
|
32
42
|
pendingLost?: number;
|
|
33
|
-
}): void;
|
|
43
|
+
} & Partial<DropCause>): void;
|
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
* it was removed. What a dashboard needs is the SHARE OF SESSIONS that lose MCP at all (the first
|
|
14
14
|
* outage) and the share where it never came back on its own (the budget being spent).
|
|
15
15
|
*/
|
|
16
|
-
import { OutageReason, OutageStage, TelemetryEventKind } from '@reticlehq/core/telemetry';
|
|
16
|
+
import { OutageErrCode, OutageReason, OutageStage, TelemetryEventKind, } from '@reticlehq/core/telemetry';
|
|
17
17
|
import { getTelemetry } from '../../../telemetry/telemetry.js';
|
|
18
|
+
import { PROXY_ID } from '../../../telemetry/proxy-telemetry.js';
|
|
18
19
|
/**
|
|
19
20
|
* `OutageStage` and `OutageReason` are core's — this re-export only saves the proxy an import. They
|
|
20
21
|
* cross the wire, so the vocabulary lives in the contract package and is never re-listed here.
|
|
@@ -29,6 +30,14 @@ const KNOWN_REASONS = new Set(Object.values(OutageReason));
|
|
|
29
30
|
function outageReason(raw) {
|
|
30
31
|
return KNOWN_REASONS.has(raw) ? raw : OutageReason.OTHER;
|
|
31
32
|
}
|
|
33
|
+
const KNOWN_ERR_CODES = new Set(Object.values(OutageErrCode));
|
|
34
|
+
/** The error's `code`, narrowed to the closed set. Never the message. */
|
|
35
|
+
export function outageErrCode(error) {
|
|
36
|
+
const raw = error?.code;
|
|
37
|
+
return 'string' === typeof raw && KNOWN_ERR_CODES.has(raw)
|
|
38
|
+
? raw
|
|
39
|
+
: OutageErrCode.OTHER;
|
|
40
|
+
}
|
|
32
41
|
/**
|
|
33
42
|
* The daemon retiring on schedule is not a fault, and it is by far the commonest drop.
|
|
34
43
|
*
|
|
@@ -54,6 +63,11 @@ export function resetOutageReporting() {
|
|
|
54
63
|
*/
|
|
55
64
|
export function reportMcpOutage(stage, facts) {
|
|
56
65
|
const reason = outageReason(facts.reason);
|
|
66
|
+
// The idle exit is not an outage. The daemon retires on schedule, `daemon_stopped` says so, and
|
|
67
|
+
// a `first` row for it was most of this event's volume. A real fault keeps its own slot below.
|
|
68
|
+
if (OutageStage.FIRST === stage && isBenign(reason)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
57
71
|
const slot = `${stage}:${isBenign(reason) ? 'benign' : 'fault'}`;
|
|
58
72
|
if (reported.has(slot))
|
|
59
73
|
return;
|
|
@@ -66,6 +80,10 @@ export function reportMcpOutage(stage, facts) {
|
|
|
66
80
|
// Always sent, including zero: zero is the finding — a drop no agent could feel. See
|
|
67
81
|
// McpOutageSchema.pendingLost.
|
|
68
82
|
pendingLost: facts.pendingLost ?? 0,
|
|
83
|
+
...(facts.error !== undefined ? { errCode: outageErrCode(facts.error) } : {}),
|
|
84
|
+
...(facts.responded !== undefined ? { responded: facts.responded } : {}),
|
|
85
|
+
// The join key: this event has no `sessionId`, and `mcp_client_connected` carries this id.
|
|
86
|
+
proxyId: PROXY_ID,
|
|
69
87
|
},
|
|
70
88
|
});
|
|
71
89
|
}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { HandshakeReplay, RECONNECT_INITIALIZE_ID } from './proxy/proxy-handshake.js';
|
|
2
|
+
export { SseFrameParser, buildSessionUrl, type SseFrame } from './sse-frame-parser.js';
|
|
3
|
+
export { daemonProcessAlive, probeDaemon, waitForDaemon, waitForDaemonBind, } from './proxy/proxy-daemon-probe.js';
|
|
4
|
+
export { flushProxyExit, reportWakeRefused } from '../../telemetry/proxy-telemetry.js';
|
|
5
|
+
import type { ProxyBoot } from './proxy/proxy-boot.js';
|
|
6
|
+
export type { ProxyBoot } from './proxy/proxy-boot.js';
|
|
3
7
|
/**
|
|
4
8
|
* Re-exported so every existing caller (and every spec) keeps importing the proxy's log from the
|
|
5
9
|
* proxy. Where the code lives is a file-size decision; where it is imported from is an API.
|
|
6
10
|
*/
|
|
7
11
|
export { accountProxyLogWrite, proxyLog, proxyLogPath, PROXY_LOG_CHECK_BYTES, recoverOversizedProxyLog, setProxyLogPort, } from './proxy/proxy-log.js';
|
|
12
|
+
export { PendingRequests, streamLossReplies } from './proxy/drive-calls.js';
|
|
8
13
|
export { reconnectDelayMs } from './proxy/proxy-backoff.js';
|
|
9
14
|
export { MCP_PROXY_HTTP_AGENT_OPTIONS, postToSession, shouldRetryUnsentPost, type PostFailure, } from './proxy/mcp-post-transport.js';
|
|
10
15
|
/**
|
|
@@ -13,45 +18,6 @@ export { MCP_PROXY_HTTP_AGENT_OPTIONS, postToSession, shouldRetryUnsentPost, typ
|
|
|
13
18
|
* so a typo cannot silently disable the retry loop.
|
|
14
19
|
*/
|
|
15
20
|
export declare const MAX_RECONNECT_ATTEMPTS: number;
|
|
16
|
-
/** JSON-RPC id the proxy uses for its own replayed `initialize` — never one the client could send. */
|
|
17
|
-
export declare const RECONNECT_INITIALIZE_ID = "__reticle_proxy_reinit";
|
|
18
|
-
/**
|
|
19
|
-
* JSON-RPC requests forwarded on behalf of the client that have not been answered yet.
|
|
20
|
-
*
|
|
21
|
-
* Only used at shutdown, where it is the difference between "the client closed stdin" and "the client
|
|
22
|
-
* closed stdin and we dropped its `tools/list` on the floor while reporting exit 0". A request has an
|
|
23
|
-
* id AND a method; a notification has no id and is owed nothing; a response has an id and no method.
|
|
24
|
-
*/
|
|
25
|
-
export declare class PendingRequests {
|
|
26
|
-
#private;
|
|
27
|
-
observeOutbound(line: string): void;
|
|
28
|
-
/** Whether this unanswered request asked for a Harness drive. */
|
|
29
|
-
isDrive(id: unknown): boolean;
|
|
30
|
-
observeInbound(line: string): void;
|
|
31
|
-
get unanswered(): string[];
|
|
32
|
-
/**
|
|
33
|
-
* Claim ONE unanswered id, so exactly one path may answer it. False means somebody already did —
|
|
34
|
-
* a duplicate response to one id is a protocol violation, not a belt-and-braces retry.
|
|
35
|
-
*/
|
|
36
|
-
take(id: unknown): boolean;
|
|
37
|
-
/** Take every unanswered id and forget them, so the same request is failed at most once. */
|
|
38
|
-
drain(): string[];
|
|
39
|
-
/** Forget which requests were drives, once their replies are written. */
|
|
40
|
-
clearDrives(): void;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* JSON-RPC errors for every request that was in flight when the stream died.
|
|
44
|
-
*
|
|
45
|
-
* These are unrecoverable BY CONSTRUCTION: the daemon builds a fresh MCP session per SSE
|
|
46
|
-
* connection, so the reconnected session has never seen them. Re-sending them is not an option
|
|
47
|
-
* either — a `reticle_act` that already clicked would click twice, and inventing a second action in
|
|
48
|
-
* somebody's app is worse than reporting a failure.
|
|
49
|
-
*
|
|
50
|
-
* So the proxy answers them itself, under each request's own id. Found by brute force: killing the
|
|
51
|
-
* daemon under a live client left 20 of 20 concurrent calls hanging until the client's own timeout,
|
|
52
|
-
* with the MCP server still perfectly alive. An agent cannot tell that apart from "still working".
|
|
53
|
-
*/
|
|
54
|
-
export declare function streamLossReplies(pending: PendingRequests, reason: string, nextStep?: string): string[];
|
|
55
21
|
/**
|
|
56
22
|
* How long a request may sit in the queue, unsent, before the proxy answers it itself.
|
|
57
23
|
*
|
|
@@ -74,47 +40,19 @@ export declare function shouldRetryFirstConnect(error: unknown, elapsedMs: numbe
|
|
|
74
40
|
* wait, not whether to retry, not whether the install itself is broken.
|
|
75
41
|
*/
|
|
76
42
|
export declare function queueExpiryNextStep(port: number): string;
|
|
77
|
-
/**
|
|
78
|
-
* Makes a reconnect invisible to the client.
|
|
79
|
-
*
|
|
80
|
-
* The daemon builds a FRESH `McpServer` per SSE connection, so a reconnected session has never seen
|
|
81
|
-
* the client's `initialize` — every subsequent `tools/call` would hit an uninitialized server. The
|
|
82
|
-
* proxy therefore remembers the handshake the client sent once and replays it into each new session.
|
|
83
|
-
* The replay is re-issued under a reserved id so the daemon's response to it can be dropped rather
|
|
84
|
-
* than reaching the client's stdout, where a duplicate JSON-RPC id would be a protocol violation.
|
|
85
|
-
*/
|
|
86
|
-
export declare class HandshakeReplay {
|
|
87
|
-
#private;
|
|
88
|
-
/** Record one outbound client line. Cheap enough to call for every stdin message. */
|
|
89
|
-
observeOutbound(line: string): void;
|
|
90
|
-
/** Lines to POST into a freshly-established session, before any queued client traffic. */
|
|
91
|
-
replayLines(): string[];
|
|
92
|
-
/** True when this inbound daemon line is the echo of our replayed handshake and must not be forwarded. */
|
|
93
|
-
shouldSuppressInbound(line: string): boolean;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Turn an `endpoint` frame's data into a POST target, or null when there is nothing usable in it.
|
|
97
|
-
*
|
|
98
|
-
* An empty (or whitespace) data field is the shape a malformed daemon response takes, and it used to
|
|
99
|
-
* be accepted: `postUrl` became `''`, which is not `null`, so the proxy considered itself CONNECTED
|
|
100
|
-
* and posted every subsequent message to the empty string. Each one failed, the queue never armed
|
|
101
|
-
* its deadline because nothing was ever queued, and the agent held a session that could not carry a
|
|
102
|
-
* single call. Refusing the frame keeps the proxy in its disconnected path, which already knows how
|
|
103
|
-
* to reconnect and how to answer what it cannot send.
|
|
104
|
-
*/
|
|
105
|
-
export declare function buildSessionUrl(rawData: string, port: number): string | null;
|
|
106
43
|
/** The briefing's facts about this directory; a live session outweighs stale memory (#1138). */
|
|
107
44
|
export declare function instructionStateAt(port: number, liveSessions?: number): {
|
|
108
45
|
previouslyConnected: boolean;
|
|
109
46
|
appHere: boolean;
|
|
110
47
|
};
|
|
111
|
-
export declare function startMcpProxy(
|
|
48
|
+
export declare function startMcpProxy(bootPort: number,
|
|
112
49
|
/**
|
|
113
50
|
* Bring a daemon back before reconnecting. Without it the proxy retried a DEAD port until the
|
|
114
51
|
* budget ran out and then killed itself, taking the agent's whole Reticle surface with it — the
|
|
115
|
-
* failure mode for a daemon that crashed, was stopped, or shut itself down as idle.
|
|
52
|
+
* failure mode for a daemon that crashed, was stopped, or shut itself down as idle. A returned
|
|
53
|
+
* port is where the daemon now is; the proxy dials it from then on.
|
|
116
54
|
*/
|
|
117
|
-
ensureDaemon?: () => Promise<void>,
|
|
55
|
+
ensureDaemon?: () => Promise<number | void>,
|
|
118
56
|
/** Observe the real shutdown boundary in transport tests without terminating their worker. */
|
|
119
57
|
exitProcess?: (code: number) => void,
|
|
120
58
|
/**
|
|
@@ -125,4 +63,9 @@ exitProcess?: (code: number) => void,
|
|
|
125
63
|
* drops it, and an `endpoint` frame is not. Optional, because a transport test drives this
|
|
126
64
|
* function with no resilience installed.
|
|
127
65
|
*/
|
|
128
|
-
onUsableSession?: () => void
|
|
66
|
+
onUsableSession?: () => void,
|
|
67
|
+
/**
|
|
68
|
+
* The daemon start that runs while the proxy already reads stdin. A client that does not wait
|
|
69
|
+
* for MCP servers gets the handshake and the tool list before the daemon is up.
|
|
70
|
+
*/
|
|
71
|
+
boot?: ProxyBoot): Promise<never>;
|