@reticlehq/server 2.4.0 → 2.5.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 +702 -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} +1 -1
- package/dist/{bridge.js → bridge/bridge.js} +63 -13
- package/dist/{bridge.test-harness.d.ts → bridge/bridge.test-harness.d.ts} +1 -11
- package/dist/{bridge.test-harness.js → bridge/bridge.test-harness.js} +9 -9
- 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-doctor.js → cli/cli-doctor.js} +9 -2
- 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-parse.d.ts → cli/cli-parse.d.ts} +2 -11
- package/dist/{cli-parse.js → cli/cli-parse.js} +113 -60
- 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.d.ts +2 -2
- package/dist/cli.js +174 -92
- 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 +49 -0
- package/dist/daemon/daemon-resilience.js +191 -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} +80 -48
- 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} +13 -0
- package/dist/{idle-shutdown.js → daemon/idle-shutdown.js} +27 -4
- 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 +43 -20
- package/dist/events/predicate-eval.js +159 -55
- package/dist/events/predicate.d.ts +2 -2
- package/dist/events/predicate.js +112 -35
- package/dist/events/reconcile.js +5 -5
- package/dist/events/ring-buffer.js +1 -1
- 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 +5 -7
- package/dist/flows/flow-replay.js +114 -47
- 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 +157 -6
- package/dist/flows/flow-success.js +20 -15
- package/dist/flows/flow-tools.js +53 -7
- 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/server-verify.d.ts +1 -1
- package/dist/flows/server-verify.js +5 -5
- 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 +16 -3
- package/dist/honesty/blind-spots.js +24 -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 +22 -3
- package/dist/honesty/verified.js +48 -8
- package/dist/http-server.js +14 -7
- package/dist/hunt/hunt-report.d.ts +2 -1
- package/dist/hunt/hunt-report.js +2 -2
- package/dist/index.d.ts +8 -6
- package/dist/index.js +32 -25
- package/dist/init/agent-rules.d.ts +2 -1
- package/dist/init/agent-rules.js +45 -7
- 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 +37 -0
- package/dist/init/cra.js +90 -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 +3 -2
- package/dist/init/detect.js +16 -5
- 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 +23 -6
- package/dist/init/plan-framework.d.ts +16 -1
- package/dist/init/plan-framework.js +132 -8
- package/dist/init/plan.d.ts +73 -8
- package/dist/init/plan.js +133 -34
- package/dist/init/project-id.d.ts +5 -9
- package/dist/init/project-id.js +10 -22
- package/dist/init/run.d.ts +5 -0
- package/dist/init/run.js +210 -36
- 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/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 +31 -0
- package/dist/mcp/mcp-outage.js +48 -0
- package/dist/mcp/mcp-proxy.d.ts +124 -0
- package/dist/mcp/mcp-proxy.js +697 -0
- package/dist/{mcp.d.ts → mcp/mcp.d.ts} +13 -10
- package/dist/{mcp.js → mcp/mcp.js} +110 -35
- 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/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/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 +38 -0
- package/dist/session/no-session-diagnosis.js +70 -0
- package/dist/session/no-session-watch.d.ts +19 -0
- package/dist/session/no-session-watch.js +61 -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/session-health.d.ts +8 -1
- package/dist/session/session-health.js +8 -7
- package/dist/session/session-info.d.ts +26 -7
- package/dist/session/session-info.js +42 -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 +3 -0
- package/dist/session/session-manager.js +52 -9
- 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 +14 -2
- package/dist/session/session.js +69 -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/daemon-telemetry.d.ts +19 -0
- package/dist/telemetry/daemon-telemetry.js +12 -2
- package/dist/telemetry/dev-repo.js +4 -4
- package/dist/telemetry/error-fingerprint.js +21 -2
- package/dist/telemetry/feedback-cli.d.ts +1 -1
- package/dist/telemetry/feedback-cli.js +4 -4
- package/dist/telemetry/feedback-context.d.ts +22 -0
- package/dist/telemetry/feedback-context.js +41 -1
- 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.js +1 -1
- package/dist/telemetry/session-metrics.d.ts +2 -0
- package/dist/telemetry/session-metrics.js +68 -6
- package/dist/telemetry/telemetry.d.ts +27 -2
- package/dist/telemetry/telemetry.js +119 -29
- 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 +84 -115
- 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 +3 -1
- package/dist/tools/assert-verdict.js +8 -5
- package/dist/tools/browser-tools.js +30 -11
- package/dist/tools/contract-tools.js +1 -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 +90 -18
- package/dist/tools/error-recovery.d.ts +20 -2
- package/dist/tools/error-recovery.js +179 -4
- 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 -6
- package/dist/tools/invoke-tool.js +57 -32
- 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-result.d.ts +17 -0
- package/dist/tools/navigate-result.js +31 -0
- package/dist/tools/observe-tools.js +54 -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 +88 -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 +8 -0
- package/dist/tools/tool-surface.d.ts +83 -0
- package/dist/tools/tool-surface.js +204 -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/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.md +28 -0
- package/docs/flows.md +166 -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/mint.json +61 -0
- package/docs/multi-agent-testing.md +55 -0
- package/docs/platform-integration.md +122 -0
- package/docs/telemetry-contract.md +214 -0
- package/docs/telemetry.md +184 -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-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-doctor.d.ts → cli/cli-doctor.d.ts} +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
|
@@ -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,44 +20,67 @@ 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;
|
|
63
86
|
/**
|
|
@@ -82,19 +105,19 @@ export interface EvalResult {
|
|
|
82
105
|
*/
|
|
83
106
|
export declare function matchValue(got: unknown, want: unknown): boolean;
|
|
84
107
|
export declare function evalNet(events: ReticleEvent[], p: Extract<Predicate, {
|
|
85
|
-
kind:
|
|
108
|
+
kind: typeof PredicateKind.NET;
|
|
86
109
|
}>): EvalResult;
|
|
87
110
|
export declare function evalRoute(events: ReticleEvent[], p: Extract<Predicate, {
|
|
88
|
-
kind:
|
|
111
|
+
kind: typeof PredicateKind.ROUTE;
|
|
89
112
|
}>): EvalResult;
|
|
90
113
|
export declare function evalConsole(events: ReticleEvent[], p: Extract<Predicate, {
|
|
91
|
-
kind:
|
|
114
|
+
kind: typeof PredicateKind.CONSOLE;
|
|
92
115
|
}>): EvalResult;
|
|
93
116
|
export declare function evalAnimation(events: ReticleEvent[], p: Extract<Predicate, {
|
|
94
|
-
kind:
|
|
117
|
+
kind: typeof PredicateKind.ANIMATION;
|
|
95
118
|
}>): EvalResult;
|
|
96
119
|
export declare function evalSignal(events: ReticleEvent[], p: Extract<Predicate, {
|
|
97
|
-
kind:
|
|
120
|
+
kind: typeof PredicateKind.SIGNAL;
|
|
98
121
|
}>): EvalResult;
|
|
99
122
|
/**
|
|
100
123
|
* "The page has gone quiet": no network/DOM/animation activity for at least `quietMs`. Needs the
|
|
@@ -102,6 +125,6 @@ export declare function evalSignal(events: ReticleEvent[], p: Extract<Predicate,
|
|
|
102
125
|
* now, not to any buffered event — so `now` is injected (CLAUDE.md rule 7), and the wait loop's
|
|
103
126
|
* poll interval is what eventually flips this to pass once activity stops.
|
|
104
127
|
*/
|
|
105
|
-
export declare function evalSettled(
|
|
106
|
-
kind:
|
|
128
|
+
export declare function evalSettled(allEvents: ReticleEvent[], p: Extract<Predicate, {
|
|
129
|
+
kind: typeof PredicateKind.SETTLED;
|
|
107
130
|
}>, now: number): EvalResult;
|