@reticlehq/server 2.4.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +719 -0
- package/dist/bridge/auth-failure-reason.d.ts +19 -0
- package/dist/bridge/auth-failure-reason.js +29 -0
- package/dist/{bridge-security.d.ts → bridge/bridge-security.d.ts} +1 -1
- package/dist/{bridge-security.js → bridge/bridge-security.js} +1 -1
- package/dist/{bridge.d.ts → bridge/bridge.d.ts} +13 -1
- package/dist/{bridge.js → bridge/bridge.js} +95 -15
- package/dist/{bridge.test-harness.d.ts → bridge/bridge.test-harness.d.ts} +9 -11
- package/dist/{bridge.test-harness.js → bridge/bridge.test-harness.js} +18 -10
- package/dist/{pairing-token.js → bridge/pairing-token.js} +1 -1
- package/dist/capsule/capsule-store.d.ts +8 -3
- package/dist/capsule/capsule-store.js +7 -2
- package/dist/capsule/capsule.js +3 -3
- package/dist/capsule/causal-summary.d.ts +8 -0
- package/dist/capsule/causal-summary.js +22 -12
- package/dist/capsule/divergence.d.ts +9 -4
- package/dist/capsule/divergence.js +8 -8
- package/dist/capsule/predicate-to-links.js +11 -8
- package/dist/cli/cli-doctor.d.ts +1 -0
- package/dist/cli/cli-doctor.js +135 -0
- package/dist/{cli-flow-commands.d.ts → cli/cli-flow-commands.d.ts} +2 -2
- package/dist/{cli-flow-commands.js → cli/cli-flow-commands.js} +15 -15
- package/dist/{cli-launch.d.ts → cli/cli-launch.d.ts} +32 -3
- package/dist/cli/cli-launch.js +171 -0
- package/dist/cli/cli-parse-feedback.d.ts +31 -0
- package/dist/cli/cli-parse-feedback.js +56 -0
- package/dist/{cli-parse.d.ts → cli/cli-parse.d.ts} +6 -19
- package/dist/{cli-parse.js → cli/cli-parse.js} +118 -81
- package/dist/{cli-port.d.ts → cli/cli-port.d.ts} +12 -0
- package/dist/{cli-port.js → cli/cli-port.js} +9 -9
- package/dist/cli/cli-update-commands.d.ts +4 -0
- package/dist/cli/cli-update-commands.js +93 -0
- package/dist/{cli-verify.js → cli/cli-verify.js} +14 -14
- package/dist/{cloud-cli.js → cli/cloud-cli.js} +29 -24
- package/dist/cli/doctor-daemon-line.d.ts +37 -0
- package/dist/cli/doctor-daemon-line.js +35 -0
- package/dist/cli/port-holder.d.ts +43 -0
- package/dist/cli/port-holder.js +99 -0
- package/dist/cli.d.ts +2 -2
- package/dist/cli.js +302 -100
- package/dist/cloud/cloud-config.d.ts +0 -1
- package/dist/cloud/cloud-config.js +9 -9
- package/dist/cloud/cloud-sync.d.ts +1 -7
- package/dist/cloud/cloud-sync.js +12 -12
- package/dist/crawl/crawl-empty.d.ts +16 -0
- package/dist/crawl/crawl-empty.js +24 -0
- package/dist/crawl/crawl-tools.js +4 -1
- package/dist/crawl/crawl.js +26 -7
- package/dist/daemon/daemon-resilience.d.ts +73 -0
- package/dist/daemon/daemon-resilience.js +279 -0
- package/dist/daemon/daemon-usefulness.d.ts +61 -0
- package/dist/daemon/daemon-usefulness.js +62 -0
- package/dist/{daemon.d.ts → daemon/daemon.d.ts} +33 -8
- package/dist/{daemon.js → daemon/daemon.js} +105 -48
- package/dist/daemon/heartbeat.d.ts +115 -0
- package/dist/daemon/heartbeat.js +141 -0
- package/dist/daemon/idle-grace.d.ts +32 -0
- package/dist/daemon/idle-grace.js +41 -0
- package/dist/{idle-shutdown.d.ts → daemon/idle-shutdown.d.ts} +23 -2
- package/dist/{idle-shutdown.js → daemon/idle-shutdown.js} +37 -6
- package/dist/daemon/port-presence.d.ts +76 -0
- package/dist/daemon/port-presence.js +93 -0
- package/dist/daemon/state-dir.d.ts +7 -0
- package/dist/daemon/state-dir.js +59 -0
- package/dist/daemon/unclean-predecessor.d.ts +23 -0
- package/dist/daemon/unclean-predecessor.js +27 -0
- package/dist/domain/domain-model.js +2 -2
- package/dist/events/body-failures.js +8 -8
- package/dist/events/contradictions.d.ts +1 -1
- package/dist/events/contradictions.js +60 -10
- package/dist/events/echo-mismatch.js +10 -10
- package/dist/events/event-filters.js +6 -6
- package/dist/events/json-salvage.d.ts +2 -1
- package/dist/events/json-salvage.js +6 -6
- package/dist/events/observed-in-window.d.ts +12 -0
- package/dist/events/observed-in-window.js +21 -0
- package/dist/events/predicate-eval.d.ts +53 -20
- package/dist/events/predicate-eval.js +179 -55
- package/dist/events/predicate-parse.d.ts +23 -0
- package/dist/events/predicate-parse.js +54 -0
- package/dist/events/predicate.d.ts +7 -2
- package/dist/events/predicate.js +126 -35
- package/dist/events/reconcile.js +5 -5
- package/dist/events/ring-buffer.js +2 -17
- package/dist/events/stale-response.js +6 -6
- package/dist/events/testid-near-miss.d.ts +22 -0
- package/dist/events/testid-near-miss.js +33 -0
- package/dist/events/unit-mismatch.js +8 -8
- package/dist/flows/affected-tools.js +19 -4
- package/dist/flows/affected.js +1 -1
- package/dist/flows/annotate-target.d.ts +1 -0
- package/dist/flows/annotate-target.js +20 -0
- package/dist/flows/annotate-tools.js +25 -3
- package/dist/flows/annotate.js +17 -4
- package/dist/flows/assertion-integrity.d.ts +2 -1
- package/dist/flows/assertion-tiers-store.d.ts +3 -66
- package/dist/flows/assertion-tiers-store.js +2 -2
- package/dist/flows/attributed-failure.d.ts +17 -0
- package/dist/flows/attributed-failure.js +20 -0
- package/dist/flows/buddy-status.d.ts +2 -1
- package/dist/flows/buddy-status.js +2 -2
- package/dist/flows/coverage.d.ts +3 -2
- package/dist/flows/coverage.js +2 -2
- package/dist/flows/decision.js +24 -9
- package/dist/flows/empty-flow.d.ts +6 -0
- package/dist/flows/empty-flow.js +24 -0
- package/dist/flows/flake-store.d.ts +0 -1
- package/dist/flows/flake-store.js +1 -1
- package/dist/flows/flake.d.ts +2 -1
- package/dist/flows/flake.js +2 -2
- package/dist/flows/flow-classify.js +12 -0
- package/dist/flows/flow-replay-run.js +4 -4
- package/dist/flows/flow-replay.d.ts +6 -8
- package/dist/flows/flow-replay.js +132 -48
- package/dist/flows/flow-report.js +1 -1
- package/dist/flows/flow-scope.d.ts +1 -6
- package/dist/flows/flow-step-runners.d.ts +26 -6
- package/dist/flows/flow-step-runners.js +156 -6
- package/dist/flows/flow-success.js +20 -15
- package/dist/flows/flow-tools.js +63 -21
- package/dist/flows/flows.js +15 -11
- package/dist/flows/gate.d.ts +4 -3
- package/dist/flows/gate.js +1 -1
- package/dist/flows/heal-run.d.ts +0 -8
- package/dist/flows/heal-run.js +5 -5
- package/dist/flows/heal.js +3 -3
- package/dist/flows/predicate-to-expect.d.ts +38 -0
- package/dist/flows/predicate-to-expect.js +95 -0
- package/dist/flows/replay.d.ts +16 -1
- package/dist/flows/replay.js +58 -22
- package/dist/flows/role-anchor-nearest.d.ts +6 -0
- package/dist/flows/role-anchor-nearest.js +45 -0
- package/dist/flows/role-drift-reason.d.ts +20 -0
- package/dist/flows/role-drift-reason.js +39 -0
- package/dist/flows/server-verify.d.ts +1 -1
- package/dist/flows/server-verify.js +5 -5
- package/dist/flows/suite-flakes.d.ts +33 -0
- package/dist/flows/suite-flakes.js +32 -0
- package/dist/flows/verify-change-tools.js +32 -10
- package/dist/flows/verify-change-verdict.d.ts +15 -0
- package/dist/flows/verify-change-verdict.js +25 -0
- package/dist/flows/watch-batcher.d.ts +3 -2
- package/dist/honesty/already-true.d.ts +2 -0
- package/dist/honesty/already-true.js +31 -0
- package/dist/honesty/blind-spots.d.ts +35 -3
- package/dist/honesty/blind-spots.js +57 -12
- package/dist/honesty/honesty.d.ts +3 -2
- package/dist/honesty/honesty.js +4 -4
- package/dist/honesty/uncaptured-bodies.js +1 -1
- package/dist/honesty/unread-outcome.js +2 -2
- package/dist/honesty/verified.d.ts +31 -3
- package/dist/honesty/verified.js +64 -8
- package/dist/http-server.js +23 -7
- package/dist/hunt/hunt-report.d.ts +2 -1
- package/dist/hunt/hunt-report.js +2 -2
- package/dist/index.d.ts +9 -6
- package/dist/index.js +41 -25
- package/dist/init/agent-rules.d.ts +20 -1
- package/dist/init/agent-rules.js +64 -8
- package/dist/init/app-choice.d.ts +20 -0
- package/dist/init/app-choice.js +25 -0
- package/dist/init/astro-host.d.ts +21 -0
- package/dist/init/astro-host.js +27 -0
- package/dist/init/astro-patch.d.ts +16 -0
- package/dist/init/astro-patch.js +240 -0
- package/dist/init/capabilities.js +4 -1
- package/dist/init/cra.d.ts +50 -0
- package/dist/init/cra.js +106 -0
- package/dist/init/cursor.js +39 -4
- package/dist/init/desktop-doctor.d.ts +3 -2
- package/dist/init/desktop-doctor.js +4 -4
- package/dist/init/detect.d.ts +9 -2
- package/dist/init/detect.js +24 -5
- package/dist/init/mcp-clients.d.ts +81 -0
- package/dist/init/mcp-clients.js +248 -0
- package/dist/init/mcp-registered.d.ts +12 -0
- package/dist/init/mcp-registered.js +14 -0
- package/dist/init/mcp.d.ts +27 -2
- package/dist/init/mcp.js +40 -4
- package/dist/init/next-patch.d.ts +2 -4
- package/dist/init/next-patch.js +109 -19
- package/dist/init/node-io.js +29 -6
- package/dist/init/plan-framework.d.ts +16 -1
- package/dist/init/plan-framework.js +166 -8
- package/dist/init/plan.d.ts +85 -6
- package/dist/init/plan.js +196 -33
- package/dist/init/project-id.d.ts +5 -9
- package/dist/init/project-id.js +10 -22
- package/dist/init/run.d.ts +23 -1
- package/dist/init/run.js +338 -47
- package/dist/init/slash-command.d.ts +9 -0
- package/dist/init/slash-command.js +10 -1
- package/dist/init/snippets.d.ts +7 -10
- package/dist/init/snippets.js +44 -15
- package/dist/init/vite-config.js +1 -1
- package/dist/init/windows-quote.d.ts +38 -0
- package/dist/init/windows-quote.js +70 -0
- package/dist/init/workspace-apps.d.ts +23 -0
- package/dist/init/workspace-apps.js +68 -0
- package/dist/input/driven-redaction.js +1 -1
- package/dist/input/network-detail.js +8 -8
- package/dist/input/network-mock-tools.js +2 -2
- package/dist/input/network-mock.js +4 -4
- package/dist/input/real-input.js +8 -3
- package/dist/input/scroll-find.js +2 -2
- package/dist/input/scroll-tools.d.ts +0 -5
- package/dist/input/scroll-tools.js +11 -4
- package/dist/input/viewport-tools.js +2 -2
- package/dist/journal/ambient-store.d.ts +0 -2
- package/dist/journal/ambient-store.js +1 -1
- package/dist/journal/ambient.js +1 -1
- package/dist/journal/attach-journal.d.ts +2 -1
- package/dist/journal/deviation-report.js +6 -6
- package/dist/journal/deviation-service.js +1 -1
- package/dist/journal/envelope-store.d.ts +0 -2
- package/dist/journal/envelope-store.js +1 -1
- package/dist/journal/envelope.d.ts +2 -3
- package/dist/journal/envelope.js +3 -3
- package/dist/journal/journal-query.js +1 -1
- package/dist/journal/journal-recorder.d.ts +2 -1
- package/dist/journal/journal-recorder.js +2 -2
- package/dist/journal/rollups.js +9 -9
- package/dist/journal/session-end.d.ts +2 -1
- package/dist/journal/session-journal.js +4 -4
- package/dist/license/license.d.ts +0 -14
- package/dist/license/license.js +8 -8
- package/dist/log.d.ts +10 -0
- package/dist/log.js +11 -1
- package/dist/mcp/mcp-is-error.d.ts +13 -0
- package/dist/mcp/mcp-is-error.js +18 -0
- package/dist/mcp/mcp-outage.d.ts +32 -0
- package/dist/mcp/mcp-outage.js +55 -0
- package/dist/mcp/mcp-proxy.d.ts +134 -0
- package/dist/mcp/mcp-proxy.js +720 -0
- package/dist/{mcp.d.ts → mcp/mcp.d.ts} +13 -10
- package/dist/{mcp.js → mcp/mcp.js} +139 -37
- package/dist/mcp/proxy-handshake.d.ts +3 -0
- package/dist/mcp/proxy-handshake.js +54 -0
- package/dist/mcp/proxy-lifecycle.d.ts +64 -0
- package/dist/mcp/proxy-lifecycle.js +70 -0
- package/dist/mcp/tool-catalog-cache.d.ts +29 -0
- package/dist/mcp/tool-catalog-cache.js +55 -0
- package/dist/oracles/propose-consequences.d.ts +2 -1
- package/dist/oracles/propose-consequences.js +16 -11
- package/dist/oracles/self-instrument.d.ts +2 -1
- package/dist/oracles/self-instrument.js +1 -1
- package/dist/phenomena/phenomena.js +3 -3
- package/dist/platform.d.ts +16 -0
- package/dist/platform.js +16 -0
- package/dist/pool/browser-pool.d.ts +9 -0
- package/dist/pool/browser-pool.js +38 -9
- package/dist/pool/playwright-launcher.d.ts +15 -2
- package/dist/pool/playwright-launcher.js +21 -2
- package/dist/project/fs-port.js +1 -1
- package/dist/project/project-tools.js +2 -2
- package/dist/runs/build-verification-run.js +1 -1
- package/dist/runs/repair-prompt.d.ts +0 -6
- package/dist/runs/repair-prompt.js +3 -3
- package/dist/runs/risk-classify.js +1 -1
- package/dist/runs/run-diff.d.ts +0 -2
- package/dist/runs/run-diff.js +3 -3
- package/dist/runs/run-tools.js +2 -2
- package/dist/runs/verification-sync.js +2 -2
- package/dist/runs/verify-http.js +1 -1
- package/dist/runs/verify-server.js +1 -1
- package/dist/session/attachment-history.d.ts +46 -0
- package/dist/session/attachment-history.js +65 -0
- package/dist/session/command-timeout.d.ts +11 -3
- package/dist/session/command-timeout.js +2 -2
- package/dist/session/control-envelope.d.ts +6 -0
- package/dist/session/control-envelope.js +7 -1
- package/dist/session/dev-server-probe.d.ts +13 -0
- package/dist/session/dev-server-probe.js +52 -0
- package/dist/session/last-act.d.ts +17 -3
- package/dist/session/last-act.js +16 -4
- package/dist/session/live-control-tools.js +7 -2
- package/dist/session/live-control.js +1 -1
- package/dist/session/looks-like-dev-server.d.ts +14 -0
- package/dist/session/looks-like-dev-server.js +25 -0
- package/dist/session/no-session-diagnosis.d.ts +45 -0
- package/dist/session/no-session-diagnosis.js +120 -0
- package/dist/session/no-session-watch.d.ts +21 -0
- package/dist/session/no-session-watch.js +69 -0
- package/dist/session/observed-state.d.ts +4 -0
- package/dist/session/observed-state.js +19 -1
- package/dist/session/output-budget.js +1 -1
- package/dist/session/pending-commands.js +1 -0
- package/dist/session/session-health.d.ts +8 -1
- package/dist/session/session-health.js +8 -7
- package/dist/session/session-info.d.ts +43 -8
- package/dist/session/session-info.js +46 -1
- package/dist/session/session-lease.d.ts +0 -11
- package/dist/session/session-lease.js +1 -1
- package/dist/session/session-manager.d.ts +6 -0
- package/dist/session/session-manager.js +124 -12
- package/dist/session/session-readiness.d.ts +1 -1
- package/dist/session/session-readiness.js +6 -1
- package/dist/session/session-reaper.js +1 -1
- package/dist/session/session-reconnect.d.ts +32 -0
- package/dist/session/session-reconnect.js +42 -0
- package/dist/session/session.d.ts +15 -2
- package/dist/session/session.js +77 -26
- package/dist/session/state-select.d.ts +1 -1
- package/dist/session/state-select.js +1 -1
- package/dist/status-payload.d.ts +19 -0
- package/dist/status-payload.js +11 -0
- package/dist/telemetry/argument-shape.js +10 -1
- package/dist/telemetry/browser-mode.d.ts +27 -0
- package/dist/telemetry/browser-mode.js +33 -0
- package/dist/telemetry/bug-found.d.ts +17 -21
- package/dist/telemetry/bug-found.js +120 -8
- package/dist/telemetry/cli-telemetry.d.ts +2 -12
- package/dist/telemetry/cli-telemetry.js +27 -4
- package/dist/telemetry/crash-cause.d.ts +47 -0
- package/dist/telemetry/crash-cause.js +104 -0
- package/dist/telemetry/daemon-telemetry.d.ts +38 -1
- package/dist/telemetry/daemon-telemetry.js +37 -12
- package/dist/telemetry/dev-repo.js +4 -4
- package/dist/telemetry/error-class.d.ts +26 -0
- package/dist/telemetry/error-class.js +52 -0
- package/dist/telemetry/error-fingerprint.js +21 -2
- package/dist/telemetry/feedback-cli.d.ts +8 -3
- package/dist/telemetry/feedback-cli.js +52 -8
- package/dist/telemetry/feedback-context.d.ts +23 -6
- package/dist/telemetry/feedback-context.js +105 -5
- package/dist/telemetry/feedback-delivery.d.ts +20 -0
- package/dist/telemetry/feedback-delivery.js +30 -0
- package/dist/telemetry/feedback-outbox.d.ts +22 -0
- package/dist/telemetry/feedback-outbox.js +87 -0
- package/dist/telemetry/feedback.d.ts +22 -1
- package/dist/telemetry/feedback.js +67 -8
- package/dist/telemetry/git-facts.d.ts +7 -0
- package/dist/telemetry/git-facts.js +5 -5
- package/dist/telemetry/project-profile.js +2 -1
- package/dist/telemetry/session-metrics.d.ts +47 -3
- package/dist/telemetry/session-metrics.js +315 -15
- package/dist/telemetry/telemetry.d.ts +45 -2
- package/dist/telemetry/telemetry.js +150 -37
- package/dist/telemetry/verification-of.d.ts +22 -0
- package/dist/telemetry/verification-of.js +84 -0
- package/dist/tools/act-capsule.js +2 -2
- package/dist/tools/act-danger.d.ts +12 -0
- package/dist/tools/act-danger.js +20 -3
- package/dist/tools/act-helpers.js +4 -4
- package/dist/tools/act-tools.d.ts +0 -8
- package/dist/tools/act-tools.js +114 -118
- package/dist/tools/act-view.js +7 -7
- package/dist/tools/alias-args.d.ts +17 -0
- package/dist/tools/alias-args.js +25 -0
- package/dist/tools/assert-grade.js +9 -9
- package/dist/tools/assert-verdict.d.ts +9 -1
- package/dist/tools/assert-verdict.js +21 -6
- package/dist/tools/browser-tools.js +36 -11
- package/dist/tools/contract-tools.d.ts +0 -5
- package/dist/tools/contract-tools.js +27 -1
- package/dist/tools/coverage-identity.d.ts +34 -0
- package/dist/tools/coverage-identity.js +46 -0
- package/dist/tools/coverage-tools.js +10 -14
- package/dist/tools/dynamic-tools.d.ts +2 -1
- package/dist/tools/dynamic-tools.js +96 -19
- package/dist/tools/error-recovery.d.ts +34 -2
- package/dist/tools/error-recovery.js +255 -4
- package/dist/tools/feedback-invite.d.ts +48 -0
- package/dist/tools/feedback-invite.js +71 -0
- package/dist/tools/feedback-tools.d.ts +12 -1
- package/dist/tools/feedback-tools.js +28 -5
- package/dist/tools/invoke-tool.d.ts +0 -12
- package/dist/tools/invoke-tool.js +126 -33
- package/dist/tools/lease-hint.d.ts +17 -0
- package/dist/tools/lease-hint.js +24 -0
- package/dist/tools/lease-tools.js +6 -5
- package/dist/tools/merge-tools.d.ts +10 -1
- package/dist/tools/merge-tools.js +9 -3
- package/dist/tools/merged-name-redirect.d.ts +13 -0
- package/dist/tools/merged-name-redirect.js +55 -0
- package/dist/tools/navigate-arrival.d.ts +26 -0
- package/dist/tools/navigate-arrival.js +60 -0
- package/dist/tools/navigate-result.d.ts +31 -0
- package/dist/tools/navigate-result.js +38 -0
- package/dist/tools/observe-tools.js +72 -20
- package/dist/tools/observed-nothing.d.ts +25 -0
- package/dist/tools/observed-nothing.js +33 -0
- package/dist/tools/query-paginate.js +2 -2
- package/dist/tools/query-shape.d.ts +18 -0
- package/dist/tools/query-shape.js +39 -0
- package/dist/tools/read-tools.js +81 -20
- package/dist/tools/real-input-attempt.d.ts +28 -0
- package/dist/tools/real-input-attempt.js +93 -0
- package/dist/tools/reconcile-tools.js +7 -7
- package/dist/tools/reload-result.d.ts +14 -0
- package/dist/tools/reload-result.js +29 -0
- package/dist/tools/snapshot-delta.d.ts +4 -5
- package/dist/tools/snapshot-delta.js +0 -0
- package/dist/tools/tool-kit.d.ts +16 -0
- package/dist/tools/tool-surface.d.ts +83 -0
- package/dist/tools/tool-surface.js +217 -0
- package/dist/tools/tools-helpers.js +6 -6
- package/dist/tools/tools.d.ts +15 -0
- package/dist/tools/tools.js +53 -17
- package/dist/tools/unadvertised-help.d.ts +5 -0
- package/dist/tools/unadvertised-help.js +39 -0
- package/dist/trace.d.ts +69 -0
- package/dist/trace.js +150 -0
- package/dist/update/nudge-credit.d.ts +4 -0
- package/dist/update/nudge-credit.js +53 -0
- package/dist/update/sdk-sync.d.ts +21 -0
- package/dist/update/sdk-sync.js +42 -0
- package/dist/update/update-checker.js +3 -3
- package/dist/update/update-nudge.d.ts +63 -6
- package/dist/update/update-nudge.js +128 -15
- package/dist/update/updater.d.ts +1 -9
- package/dist/update/updater.js +13 -8
- package/dist/version/peer-announce.d.ts +4 -0
- package/dist/version/peer-announce.js +30 -0
- package/dist/{server-version.js → version/server-version.js} +5 -1
- package/dist/version/version-nudge.d.ts +28 -0
- package/dist/version/version-nudge.js +40 -0
- package/dist/version/version-skew.d.ts +66 -0
- package/dist/version/version-skew.js +71 -0
- package/dist/visual/visual-diff.js +2 -2
- package/dist/visual/visual-tools.js +4 -4
- package/docs/README.md +55 -0
- package/docs/agent-cheatsheet.md +85 -0
- package/docs/architecture.md +113 -0
- package/docs/benchmarks.md +255 -0
- package/docs/debugging.md +102 -0
- package/docs/deploy-checks.md +69 -0
- package/docs/desktop-apps.md +256 -0
- package/docs/enterprise.md +62 -0
- package/docs/fixtures-dispatch-receiver.yml +76 -0
- package/docs/fixtures.md +45 -0
- package/docs/flows.md +166 -0
- package/docs/gate-plan.md +98 -0
- package/docs/gates.md +117 -0
- package/docs/getting-started.md +469 -0
- package/docs/human-control.md +63 -0
- package/docs/integration-patterns.md +171 -0
- package/docs/local-registry.md +126 -0
- package/docs/matrix/2.5.0/claude-code-machine.json +19 -0
- package/docs/matrix/2.5.0/codex-machine.json +20 -0
- package/docs/matrix/2.5.0/cursor-machine.json +22 -0
- package/docs/matrix/2.5.0/gemini-machine.json +22 -0
- package/docs/matrix/2.5.0/opencode-machine.json +22 -0
- package/docs/matrix/2.5.0/vscode-machine.json +22 -0
- package/docs/matrix/2.5.0/windsurf-machine.json +22 -0
- package/docs/matrix/MATRIX.md +26 -0
- package/docs/matrix/README.md +59 -0
- package/docs/mint.json +61 -0
- package/docs/multi-agent-testing.md +55 -0
- package/docs/platform-integration.md +122 -0
- package/docs/system-map.md +152 -0
- package/docs/telemetry-contract.md +214 -0
- package/docs/telemetry.md +191 -0
- package/docs/testing.md +82 -0
- package/docs/token-efficiency.md +80 -0
- package/docs/usage.md +1046 -0
- package/package.json +8 -5
- package/dist/cli-doctor.d.ts +0 -6
- package/dist/cli-doctor.js +0 -60
- package/dist/cli-launch.js +0 -112
- package/dist/daemon-resilience.d.ts +0 -22
- package/dist/daemon-resilience.js +0 -85
- package/dist/mcp-proxy.d.ts +0 -67
- package/dist/mcp-proxy.js +0 -337
- package/dist/tools/profiles.d.ts +0 -37
- package/dist/tools/profiles.js +0 -139
- /package/dist/{pairing-token.d.ts → bridge/pairing-token.d.ts} +0 -0
- /package/dist/{token-auth.d.ts → bridge/token-auth.d.ts} +0 -0
- /package/dist/{token-auth.js → bridge/token-auth.js} +0 -0
- /package/dist/{cli-verify.d.ts → cli/cli-verify.d.ts} +0 -0
- /package/dist/{cloud-cli.d.ts → cli/cloud-cli.d.ts} +0 -0
- /package/dist/{server-version.d.ts → version/server-version.d.ts} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ContradictionKind, EventType, MUTATING_METHODS } from '@reticlehq/core';
|
|
1
|
+
import { ContradictionKind, EventType, MUTATING_METHODS, isDevToolingUrl, } from '@reticlehq/core';
|
|
2
2
|
import { findStaleResponses } from './stale-response.js';
|
|
3
3
|
import { findBodyFailures } from './body-failures.js';
|
|
4
4
|
import { findEchoMismatches } from './echo-mismatch.js';
|
|
@@ -14,7 +14,7 @@ function netCall(e) {
|
|
|
14
14
|
// Neither present = no verdict was ever reported, which stays undefined all the way through.
|
|
15
15
|
ok: e.data['ok'] === undefined && status === undefined
|
|
16
16
|
? undefined
|
|
17
|
-
: e.data['ok']
|
|
17
|
+
: true === e.data['ok'] || (e.data['ok'] === undefined && (status ?? 0) < 400),
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
@@ -95,7 +95,7 @@ function failureAcknowledged(events) {
|
|
|
95
95
|
return false;
|
|
96
96
|
const path = asString(e.data['path']) ?? '';
|
|
97
97
|
const value = e.data['value'];
|
|
98
|
-
return ACKNOWLEDGED.test(path) || (typeof value
|
|
98
|
+
return ACKNOWLEDGED.test(path) || ('string' === typeof value && ACKNOWLEDGED.test(value));
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
function describe(call) {
|
|
@@ -125,13 +125,44 @@ const MUST_DO_SOMETHING = new Set(['click', 'dblclick', 'submit']);
|
|
|
125
125
|
*/
|
|
126
126
|
function didNothing(events, requests, mutatedWithin) {
|
|
127
127
|
if (mutatedWithin === undefined)
|
|
128
|
-
return events.length
|
|
128
|
+
return 0 === events.length;
|
|
129
129
|
if (mutatedWithin > 0 || requests.length > 0)
|
|
130
130
|
return false;
|
|
131
131
|
return !events.some((e) => e.type === EventType.ROUTE_CHANGE || e.type === EventType.VISIBLE_SHOWN);
|
|
132
132
|
}
|
|
133
|
-
|
|
133
|
+
/** Net-shaped events — the only ones that carry a URL a dev-tooling channel could occupy. */
|
|
134
|
+
const NET_TYPES = new Set([
|
|
135
|
+
EventType.NET_PENDING,
|
|
136
|
+
EventType.NET_REQUEST,
|
|
137
|
+
EventType.NET_STREAM,
|
|
138
|
+
]);
|
|
139
|
+
/**
|
|
140
|
+
* Split the window into the app's traffic and the dev toolchain's own (see `DevToolingChannel`).
|
|
141
|
+
*
|
|
142
|
+
* NOTHING below may judge the toolchain. Reported from a real drive: a correct Next.js navigation
|
|
143
|
+
* graded `verified: "no"` because the dev overlay was resolving a source map for an unrelated React
|
|
144
|
+
* key warning, and that in-flight `POST /__nextjs_original-stack-frames` read as "the UI advanced
|
|
145
|
+
* over a request that never settled". Every app that logs one dev warning got a false negative on
|
|
146
|
+
* every action. The overlay's own 404s and duplicate fetches are the same story on other checks,
|
|
147
|
+
* which is why the split happens ONCE here rather than in the one check that reported it.
|
|
148
|
+
*/
|
|
149
|
+
function splitDevTooling(events) {
|
|
150
|
+
const ignored = [];
|
|
151
|
+
const app = events.filter((e) => {
|
|
152
|
+
if (!NET_TYPES.has(e.type))
|
|
153
|
+
return true;
|
|
154
|
+
const url = asString(e.data['url']);
|
|
155
|
+
if (!isDevToolingUrl(url))
|
|
156
|
+
return true;
|
|
157
|
+
if (url !== undefined && !ignored.includes(url))
|
|
158
|
+
ignored.push(url);
|
|
159
|
+
return false;
|
|
160
|
+
});
|
|
161
|
+
return { app, ignored };
|
|
162
|
+
}
|
|
163
|
+
export function findContradictions(allEvents, options = {}) {
|
|
134
164
|
const found = [];
|
|
165
|
+
const { app: events, ignored: ignoredDevTooling } = splitDevTooling(allEvents);
|
|
135
166
|
const settled = events.filter((e) => e.type === EventType.NET_REQUEST).map(netCall);
|
|
136
167
|
// ── Overlapping reads that settled out of order ─────────────────────────────────────────────
|
|
137
168
|
// Independent of any action, so it runs on every window: the race is a property of the timeline.
|
|
@@ -160,7 +191,7 @@ export function findContradictions(events, options = {}) {
|
|
|
160
191
|
},
|
|
161
192
|
];
|
|
162
193
|
}
|
|
163
|
-
const failed = settled.filter((c) => c.ok
|
|
194
|
+
const failed = settled.filter((c) => false === c.ok);
|
|
164
195
|
const advanced = uiAdvanced(events);
|
|
165
196
|
const signals = events
|
|
166
197
|
.filter((e) => e.type === EventType.SIGNAL)
|
|
@@ -170,7 +201,19 @@ export function findContradictions(events, options = {}) {
|
|
|
170
201
|
// the control worked, the DESTINATION is empty — which is why every "did the click do something"
|
|
171
202
|
// heuristic passes it, a route change being unambiguously something.
|
|
172
203
|
const routed = events.some((e) => e.type === EventType.ROUTE_CHANGE);
|
|
173
|
-
|
|
204
|
+
// `dom.text` counts as rendered, and it has to: React reconciles a destination IN PLACE far more
|
|
205
|
+
// often than it adds nodes. Measured on three ordinary sidebar navigations of the bench app — every
|
|
206
|
+
// one emitted { dom.attr:2, dom.text:2, render.commit, state.change } and ZERO dom.added/removed,
|
|
207
|
+
// so all three were flagged as blank destinations, `verified` came back "no" on a correct green,
|
|
208
|
+
// and a bug_found was emitted for a navigation that worked.
|
|
209
|
+
//
|
|
210
|
+
// Deliberately NOT `dom.attr`: the nav link marks itself active whether or not the destination
|
|
211
|
+
// rendered, which is the true positive this rule exists for. Deliberately NOT `render.commit`
|
|
212
|
+
// either: React commits a render for a component that returns null, which is one of the very bugs
|
|
213
|
+
// named in `detail` below.
|
|
214
|
+
const rendered = events.some((e) => e.type === EventType.DOM_ADDED ||
|
|
215
|
+
e.type === EventType.DOM_REMOVED ||
|
|
216
|
+
e.type === EventType.DOM_TEXT);
|
|
174
217
|
const fetched = events.some((e) => e.type === EventType.NET_REQUEST || e.type === EventType.NET_PENDING);
|
|
175
218
|
if (routed && !rendered && !fetched) {
|
|
176
219
|
found.push({
|
|
@@ -187,7 +230,7 @@ export function findContradictions(events, options = {}) {
|
|
|
187
230
|
// Checked BEFORE the success-claim rules, because it is the sharper reading of the same events:
|
|
188
231
|
// the app did not claim success, it claimed the wrong failure. Telling someone their password is
|
|
189
232
|
// wrong while the backend is down sends them to fix something they cannot fix.
|
|
190
|
-
const serverFaults = settled.filter((c) => c.ok
|
|
233
|
+
const serverFaults = settled.filter((c) => false === c.ok && c.status !== undefined && c.status >= SERVER_FAULT_MIN);
|
|
191
234
|
const userBlame = [
|
|
192
235
|
...signals.filter((name) => BLAMES_USER.test(name)),
|
|
193
236
|
...events
|
|
@@ -228,7 +271,7 @@ export function findContradictions(events, options = {}) {
|
|
|
228
271
|
// Writes only: a GET that changes nothing is a prefetch; a POST that changes nothing is a lost
|
|
229
272
|
// write, a response parsed into the void, or a render that never happened.
|
|
230
273
|
if (!advanced) {
|
|
231
|
-
const ignoredWrites = settled.filter((c) => c.ok
|
|
274
|
+
const ignoredWrites = settled.filter((c) => true === c.ok && isMutating(c));
|
|
232
275
|
if (ignoredWrites.length > 0) {
|
|
233
276
|
found.push({
|
|
234
277
|
kind: ContradictionKind.RESPONSE_IGNORED,
|
|
@@ -274,7 +317,14 @@ export function findContradictions(events, options = {}) {
|
|
|
274
317
|
kind: ContradictionKind.REQUEST_NEVER_SETTLED,
|
|
275
318
|
claim: 'the UI moved forward and the action reported done',
|
|
276
319
|
counter: `${String(inFlight.length)} request(s) were still in flight`,
|
|
277
|
-
|
|
320
|
+
// The exclusion is never silent: if the toolchain's own traffic was dropped from this count,
|
|
321
|
+
// the finding says which URLs, so an agent reading it can see what Reticle chose to ignore.
|
|
322
|
+
detail: [
|
|
323
|
+
inFlight.map((p) => describe(p.call)).join('; '),
|
|
324
|
+
...(0 === ignoredDevTooling.length
|
|
325
|
+
? []
|
|
326
|
+
: [`ignored as dev tooling: ${ignoredDevTooling.join(', ')}`]),
|
|
327
|
+
].join(' — '),
|
|
278
328
|
});
|
|
279
329
|
}
|
|
280
330
|
}
|
|
@@ -31,7 +31,7 @@ import { ContradictionKind, EventType } from '@reticlehq/core';
|
|
|
31
31
|
/** Bodies larger than this are skipped — a diff over a huge payload is neither cheap nor legible. */
|
|
32
32
|
const MAX_ECHO_KEYS = 200;
|
|
33
33
|
function isRecord(value) {
|
|
34
|
-
return typeof value
|
|
34
|
+
return 'object' === typeof value && value !== null && !Array.isArray(value);
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
37
|
* Any JSON value, not just an object. An HTTP write sends an object; an IPC call sends its ARGUMENT
|
|
@@ -39,7 +39,7 @@ function isRecord(value) {
|
|
|
39
39
|
* silently excluded every desktop write from this check — the exact platform the finding came from.
|
|
40
40
|
*/
|
|
41
41
|
function parse(raw) {
|
|
42
|
-
if (typeof raw !== 'string' || raw.length
|
|
42
|
+
if (typeof raw !== 'string' || 0 === raw.length)
|
|
43
43
|
return undefined;
|
|
44
44
|
try {
|
|
45
45
|
return JSON.parse(raw);
|
|
@@ -50,11 +50,11 @@ function parse(raw) {
|
|
|
50
50
|
}
|
|
51
51
|
/** Comparable form of a scalar. Non-scalars return undefined and are never compared. */
|
|
52
52
|
function normalize(value) {
|
|
53
|
-
if (typeof value
|
|
53
|
+
if ('string' === typeof value)
|
|
54
54
|
return value.trim().toLowerCase();
|
|
55
|
-
if (typeof value
|
|
55
|
+
if ('number' === typeof value)
|
|
56
56
|
return Number.isFinite(value) ? String(value) : undefined;
|
|
57
|
-
if (typeof value
|
|
57
|
+
if ('boolean' === typeof value)
|
|
58
58
|
return String(value);
|
|
59
59
|
return undefined;
|
|
60
60
|
}
|
|
@@ -98,7 +98,7 @@ export function findEchoMismatches(events) {
|
|
|
98
98
|
// IPC reports `ok` rather than a status; HTTP reports a status. Either must say success — a write
|
|
99
99
|
// that already failed is a different (and louder) finding than one that half-applied.
|
|
100
100
|
const status = event.data['status'];
|
|
101
|
-
const httpOk = typeof status
|
|
101
|
+
const httpOk = 'number' === typeof status && status >= OK_MIN && status < OK_MAX;
|
|
102
102
|
if (!httpOk && event.data['ok'] !== true)
|
|
103
103
|
continue;
|
|
104
104
|
const request = parse(event.data['requestBody']);
|
|
@@ -117,16 +117,16 @@ export function findEchoMismatches(events) {
|
|
|
117
117
|
const values = echoed.get(key);
|
|
118
118
|
// Not echoed at all = no evidence either way. Only a key the server chose to report back can
|
|
119
119
|
// contradict the request, and silence is not a contradiction.
|
|
120
|
-
if (values === undefined || values.size
|
|
120
|
+
if (values === undefined || 0 === values.size)
|
|
121
121
|
continue;
|
|
122
122
|
const [want] = [...wanted];
|
|
123
123
|
if (want !== undefined && !values.has(want))
|
|
124
124
|
dropped.push(`${key}: asked ${want}, got ${[...values].join('/')}`);
|
|
125
125
|
}
|
|
126
|
-
if (dropped.length
|
|
126
|
+
if (0 === dropped.length)
|
|
127
127
|
continue;
|
|
128
|
-
const url = typeof event.data['url']
|
|
129
|
-
const method = typeof event.data['method']
|
|
128
|
+
const url = 'string' === typeof event.data['url'] ? event.data['url'] : '';
|
|
129
|
+
const method = 'string' === typeof event.data['method'] ? event.data['method'] : '';
|
|
130
130
|
found.push({
|
|
131
131
|
kind: ContradictionKind.WRITE_FIELD_IGNORED,
|
|
132
132
|
claim: 'the write returned success and the page treated it as saved',
|
|
@@ -98,7 +98,7 @@ export function projectNetCall(e) {
|
|
|
98
98
|
method: asString(e.data['method']) ?? '',
|
|
99
99
|
url: asString(e.data['url']) ?? '',
|
|
100
100
|
};
|
|
101
|
-
if (
|
|
101
|
+
if ('number' === typeof status || 'string' === typeof status)
|
|
102
102
|
view.status = status;
|
|
103
103
|
if (statusText !== undefined)
|
|
104
104
|
view.statusText = statusText;
|
|
@@ -110,15 +110,15 @@ export function projectNetCall(e) {
|
|
|
110
110
|
view.requestBody = requestBody;
|
|
111
111
|
if (responseBody !== undefined)
|
|
112
112
|
view.responseBody = responseBody;
|
|
113
|
-
if (e.data['requestBodyTruncated']
|
|
113
|
+
if (true === e.data['requestBodyTruncated'] || true === e.data['responseBodyTruncated']) {
|
|
114
114
|
view.bodyTruncated = true;
|
|
115
115
|
}
|
|
116
116
|
if (ms !== undefined)
|
|
117
117
|
view.ms = ms;
|
|
118
|
-
if (e.data['oneWay']
|
|
118
|
+
if (true === e.data['oneWay'])
|
|
119
119
|
view.oneWay = true;
|
|
120
120
|
const headers = e.data['headers'];
|
|
121
|
-
if (headers !== null && typeof headers
|
|
121
|
+
if (headers !== null && 'object' === typeof headers) {
|
|
122
122
|
view.headers = headers;
|
|
123
123
|
}
|
|
124
124
|
return view;
|
|
@@ -146,7 +146,7 @@ export function projectConsoleLog(e) {
|
|
|
146
146
|
const source = asString(e.data['source']);
|
|
147
147
|
const line = e.data['line'];
|
|
148
148
|
if (source !== undefined && source.length > 0) {
|
|
149
|
-
view.source = typeof line
|
|
149
|
+
view.source = 'number' === typeof line ? `${source}:${String(line)}` : source;
|
|
150
150
|
}
|
|
151
151
|
return view;
|
|
152
152
|
}
|
|
@@ -165,7 +165,7 @@ export function matchConsole(e, level) {
|
|
|
165
165
|
return false;
|
|
166
166
|
if (level === undefined)
|
|
167
167
|
return true;
|
|
168
|
-
return (e.type === `console.${level}` || (
|
|
168
|
+
return (e.type === `console.${level}` || ('error' === level && e.type === EventType.ERROR_UNCAUGHT));
|
|
169
169
|
}
|
|
170
170
|
/** How many present calls/levels a zero-match hint samples before truncating. */
|
|
171
171
|
const HINT_SAMPLE_MAX = 5;
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* before the cut and reports how many it had to drop, so a partial answer is delivered AS partial
|
|
16
16
|
* rather than as a clean one.
|
|
17
17
|
*/
|
|
18
|
-
|
|
18
|
+
interface Salvaged {
|
|
19
19
|
/** Parsed values — one whole body, or the records recovered from a truncated one. */
|
|
20
20
|
values: unknown[];
|
|
21
21
|
/** True when the payload was incomplete and only part of it could be read. */
|
|
@@ -30,3 +30,4 @@ export interface Salvaged {
|
|
|
30
30
|
* costs nothing, because each record still carries its own id and its own fields.
|
|
31
31
|
*/
|
|
32
32
|
export declare function salvageJson(raw: string): Salvaged;
|
|
33
|
+
export {};
|
|
@@ -38,22 +38,22 @@ function completeObjects(text) {
|
|
|
38
38
|
if (inString) {
|
|
39
39
|
if (escaped)
|
|
40
40
|
escaped = false;
|
|
41
|
-
else if (
|
|
41
|
+
else if ('\\' === ch)
|
|
42
42
|
escaped = true;
|
|
43
|
-
else if (
|
|
43
|
+
else if ('"' === ch)
|
|
44
44
|
inString = false;
|
|
45
45
|
continue;
|
|
46
46
|
}
|
|
47
|
-
if (
|
|
47
|
+
if ('"' === ch) {
|
|
48
48
|
inString = true;
|
|
49
49
|
continue;
|
|
50
50
|
}
|
|
51
|
-
if (
|
|
51
|
+
if ('{' === ch) {
|
|
52
52
|
starts.push(i);
|
|
53
53
|
depth += 1;
|
|
54
54
|
continue;
|
|
55
55
|
}
|
|
56
|
-
if (
|
|
56
|
+
if ('}' === ch) {
|
|
57
57
|
depth -= 1;
|
|
58
58
|
// A negative depth means the cut removed an opening brace; nothing further is trustworthy.
|
|
59
59
|
if (depth < 0)
|
|
@@ -63,7 +63,7 @@ function completeObjects(text) {
|
|
|
63
63
|
found.push({ depth: depth + 1, text: text.slice(start, i + 1) });
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
-
if (found.length
|
|
66
|
+
if (0 === found.length)
|
|
67
67
|
return [];
|
|
68
68
|
const shallowest = Math.min(...found.map((f) => f.depth));
|
|
69
69
|
return found.filter((f) => f.depth === shallowest).map((f) => f.text);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What DID happen, when the thing you asserted did not.
|
|
3
|
+
*
|
|
4
|
+
* "signal 'x' never fired" and "no matching network call" are true and useless: a typo'd name and a
|
|
5
|
+
* genuinely broken app produce the same sentence, and the agent cannot tell them apart without a
|
|
6
|
+
* round trip it does not know to make. `{ kind:'state' }` already answers a bad path by naming the
|
|
7
|
+
* stores that exist; this gives `signal` and `net` the same courtesy.
|
|
8
|
+
*
|
|
9
|
+
* It also distinguishes the two failures that matter: NOTHING happened in the window (the action did
|
|
10
|
+
* not do what you thought) versus things happened but not that one (you named it wrong).
|
|
11
|
+
*/
|
|
12
|
+
export declare function describeObserved(noun: string, seen: readonly string[]): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What DID happen, when the thing you asserted did not.
|
|
3
|
+
*
|
|
4
|
+
* "signal 'x' never fired" and "no matching network call" are true and useless: a typo'd name and a
|
|
5
|
+
* genuinely broken app produce the same sentence, and the agent cannot tell them apart without a
|
|
6
|
+
* round trip it does not know to make. `{ kind:'state' }` already answers a bad path by naming the
|
|
7
|
+
* stores that exist; this gives `signal` and `net` the same courtesy.
|
|
8
|
+
*
|
|
9
|
+
* It also distinguishes the two failures that matter: NOTHING happened in the window (the action did
|
|
10
|
+
* not do what you thought) versus things happened but not that one (you named it wrong).
|
|
11
|
+
*/
|
|
12
|
+
/** Enough to recognise the one you meant; not so many that a chatty window floods the message. */
|
|
13
|
+
const MAX_LISTED = 8;
|
|
14
|
+
export function describeObserved(noun, seen) {
|
|
15
|
+
const unique = [...new Set(seen.filter((s) => s.length > 0))];
|
|
16
|
+
if (0 === unique.length)
|
|
17
|
+
return `no ${noun} at all in this window`;
|
|
18
|
+
const shown = unique.slice(0, MAX_LISTED);
|
|
19
|
+
const rest = unique.length - shown.length;
|
|
20
|
+
return `${noun} seen in this window: ${shown.join(', ')}${rest > 0 ? `, and ${String(rest)} more` : ''}`;
|
|
21
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { ElementState, type ElementQuery, type ReticleEvent } from '@reticlehq/core';
|
|
1
|
+
import { ElementState, PredicateKind, type ElementQuery, type ReticleEvent } from '@reticlehq/core';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
export type Predicate = {
|
|
4
|
-
kind:
|
|
4
|
+
kind: typeof PredicateKind.ELEMENT;
|
|
5
5
|
query: ElementQuery;
|
|
6
6
|
state?: ElementState;
|
|
7
7
|
absent?: boolean;
|
|
8
8
|
} | {
|
|
9
|
-
kind:
|
|
9
|
+
kind: typeof PredicateKind.TEXT;
|
|
10
10
|
contains: string;
|
|
11
11
|
visible?: boolean;
|
|
12
12
|
absent?: boolean;
|
|
13
13
|
} | {
|
|
14
|
-
kind:
|
|
14
|
+
kind: typeof PredicateKind.NET;
|
|
15
15
|
method?: string;
|
|
16
16
|
urlContains?: string;
|
|
17
17
|
status?: number;
|
|
@@ -20,46 +20,79 @@ export type Predicate = {
|
|
|
20
20
|
since?: number;
|
|
21
21
|
count?: number;
|
|
22
22
|
} | {
|
|
23
|
-
kind:
|
|
23
|
+
kind: typeof PredicateKind.ROUTE;
|
|
24
24
|
pathname?: string;
|
|
25
25
|
contains?: string;
|
|
26
|
+
since?: number;
|
|
26
27
|
} | {
|
|
27
|
-
kind:
|
|
28
|
+
kind: typeof PredicateKind.CONSOLE;
|
|
28
29
|
level?: string;
|
|
29
30
|
absent?: boolean;
|
|
30
31
|
since?: number;
|
|
31
32
|
} | {
|
|
32
|
-
kind:
|
|
33
|
+
kind: typeof PredicateKind.ANIMATION;
|
|
33
34
|
name?: string;
|
|
34
35
|
target?: string;
|
|
35
36
|
completed?: boolean;
|
|
37
|
+
since?: number;
|
|
36
38
|
} | {
|
|
37
|
-
kind:
|
|
39
|
+
kind: typeof PredicateKind.SIGNAL;
|
|
38
40
|
name?: string;
|
|
39
41
|
dataMatches?: Record<string, unknown>;
|
|
42
|
+
since?: number;
|
|
40
43
|
} | {
|
|
41
|
-
kind:
|
|
44
|
+
kind: typeof PredicateKind.STATE;
|
|
42
45
|
store?: string;
|
|
43
46
|
path: string;
|
|
44
47
|
equals?: unknown;
|
|
45
48
|
} | {
|
|
46
|
-
kind:
|
|
49
|
+
kind: typeof PredicateKind.SETTLED;
|
|
47
50
|
quietMs?: number;
|
|
48
51
|
} | {
|
|
49
|
-
kind:
|
|
52
|
+
kind: typeof PredicateKind.ALL_OF;
|
|
50
53
|
predicates: Predicate[];
|
|
51
54
|
} | {
|
|
52
|
-
kind:
|
|
55
|
+
kind: typeof PredicateKind.ANY_OF;
|
|
53
56
|
predicates: Predicate[];
|
|
54
57
|
} | {
|
|
55
|
-
kind:
|
|
58
|
+
kind: typeof PredicateKind.NOT;
|
|
56
59
|
predicate: Predicate;
|
|
57
60
|
};
|
|
61
|
+
/**
|
|
62
|
+
* Strict on every branch. A key that is nobody's spelling is now a schema error naming it, instead of
|
|
63
|
+
* a stripped field and a green — see predicate-strict.test.ts for the MCP session that found this.
|
|
64
|
+
*/
|
|
58
65
|
export declare const PredicateSchema: z.ZodType<Predicate>;
|
|
59
66
|
export interface EvalResult {
|
|
60
67
|
pass: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* For a TIME-based failure: how long until this predicate could first become true, if nothing else
|
|
70
|
+
* changes. Purely a scheduling hint for `waitForPredicate` — it replaces a blind poll tick with one
|
|
71
|
+
* timed to the moment that matters, and never decides anything. Absent when the wait is on an
|
|
72
|
+
* external event (a request in flight settles when the server answers, not on a clock).
|
|
73
|
+
*/
|
|
74
|
+
retryAfterMs?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Set when the assertion could not be EVALUATED — the call was under-specified or there was
|
|
77
|
+
* nothing instrumented to read — rather than evaluated and found false. Carries the sentence that
|
|
78
|
+
* names what is missing.
|
|
79
|
+
*
|
|
80
|
+
* `pass` stays false because nothing was proven, but a false that nobody could have made true is
|
|
81
|
+
* not a defect in the user's app, and reporting it as one puts agent mistakes into the bug count.
|
|
82
|
+
*/
|
|
83
|
+
inconclusive?: string;
|
|
61
84
|
evidence?: unknown;
|
|
62
85
|
failureReason?: string;
|
|
86
|
+
/**
|
|
87
|
+
* The wait ended because the TAB went away, not because the app did anything observable.
|
|
88
|
+
*
|
|
89
|
+
* A sibling of `inconclusive` and for the same reason: `pass` is false because nothing was
|
|
90
|
+
* proven, but nobody could have made it true, so grading it as a defect in the user's app is a
|
|
91
|
+
* false claim. Without this the verdict rule saw only `pass: false` and answered
|
|
92
|
+
* `assertion_failed` — "the declared consequence did not hold" — naming the component the agent
|
|
93
|
+
* had just clicked. See VerifiedReason.OBSERVATION_LOST.
|
|
94
|
+
*/
|
|
95
|
+
observationLost?: boolean;
|
|
63
96
|
/**
|
|
64
97
|
* The failure, structured — what was seen, what was required, and which oracle judged it.
|
|
65
98
|
*
|
|
@@ -82,19 +115,19 @@ export interface EvalResult {
|
|
|
82
115
|
*/
|
|
83
116
|
export declare function matchValue(got: unknown, want: unknown): boolean;
|
|
84
117
|
export declare function evalNet(events: ReticleEvent[], p: Extract<Predicate, {
|
|
85
|
-
kind:
|
|
118
|
+
kind: typeof PredicateKind.NET;
|
|
86
119
|
}>): EvalResult;
|
|
87
120
|
export declare function evalRoute(events: ReticleEvent[], p: Extract<Predicate, {
|
|
88
|
-
kind:
|
|
121
|
+
kind: typeof PredicateKind.ROUTE;
|
|
89
122
|
}>): EvalResult;
|
|
90
123
|
export declare function evalConsole(events: ReticleEvent[], p: Extract<Predicate, {
|
|
91
|
-
kind:
|
|
124
|
+
kind: typeof PredicateKind.CONSOLE;
|
|
92
125
|
}>): EvalResult;
|
|
93
126
|
export declare function evalAnimation(events: ReticleEvent[], p: Extract<Predicate, {
|
|
94
|
-
kind:
|
|
127
|
+
kind: typeof PredicateKind.ANIMATION;
|
|
95
128
|
}>): EvalResult;
|
|
96
129
|
export declare function evalSignal(events: ReticleEvent[], p: Extract<Predicate, {
|
|
97
|
-
kind:
|
|
130
|
+
kind: typeof PredicateKind.SIGNAL;
|
|
98
131
|
}>): EvalResult;
|
|
99
132
|
/**
|
|
100
133
|
* "The page has gone quiet": no network/DOM/animation activity for at least `quietMs`. Needs the
|
|
@@ -102,6 +135,6 @@ export declare function evalSignal(events: ReticleEvent[], p: Extract<Predicate,
|
|
|
102
135
|
* now, not to any buffered event — so `now` is injected (CLAUDE.md rule 7), and the wait loop's
|
|
103
136
|
* poll interval is what eventually flips this to pass once activity stops.
|
|
104
137
|
*/
|
|
105
|
-
export declare function evalSettled(
|
|
106
|
-
kind:
|
|
138
|
+
export declare function evalSettled(allEvents: ReticleEvent[], p: Extract<Predicate, {
|
|
139
|
+
kind: typeof PredicateKind.SETTLED;
|
|
107
140
|
}>, now: number): EvalResult;
|