@reticlehq/server 2.14.0 → 3.2.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 +54 -136
- package/bin/reticle.js +1 -1
- package/dist/command/cli/adhoc-verdict.d.ts +64 -0
- package/dist/command/cli/adhoc-verdict.js +144 -0
- package/dist/command/cli/answers/status-next-action.d.ts +61 -0
- package/dist/command/cli/answers/status-next-action.js +84 -0
- package/dist/command/cli/auth/cloud-keystore.js +97 -0
- package/dist/command/cli/auth/device-flow.d.ts +76 -0
- package/dist/command/cli/auth/device-flow.js +56 -0
- package/dist/command/cli/cli-doctor.js +215 -0
- package/dist/command/cli/cli-flow-commands.d.ts +47 -0
- package/dist/command/cli/cli-flow-commands.js +255 -0
- package/dist/command/cli/cli-kill.d.ts +59 -0
- package/dist/command/cli/cli-kill.js +162 -0
- package/dist/command/cli/cli-parse-grammar.d.ts +29 -0
- package/dist/command/cli/cli-parse-grammar.js +39 -0
- package/dist/command/cli/cli-parse-verify.d.ts +22 -0
- package/dist/command/cli/cli-parse-verify.js +143 -0
- package/dist/command/cli/cli-parse.d.ts +193 -0
- package/dist/command/cli/cli-parse.js +833 -0
- package/dist/command/cli/cli-update-commands.js +112 -0
- package/dist/command/cli/cli-verify.d.ts +124 -0
- package/dist/command/cli/cli-verify.js +426 -0
- package/dist/command/cli/cloud-cli.js +694 -0
- package/dist/command/cli/cloud-kit.d.ts +37 -0
- package/dist/command/cli/cloud-kit.js +117 -0
- package/dist/command/cli/cloud-login.js +183 -0
- package/dist/command/cli/config/config-discovery.d.ts +48 -0
- package/dist/command/cli/config/config-discovery.js +183 -0
- package/dist/command/cli/daemon-start-options.d.ts +33 -0
- package/dist/command/cli/demo/demo-page.d.ts +78 -0
- package/dist/command/cli/demo/demo-page.js +238 -0
- package/dist/command/cli/demo/demo-run.d.ts +38 -0
- package/dist/command/cli/demo/demo-run.js +138 -0
- package/dist/command/cli/doctor/doctor-daemon-line.js +47 -0
- package/dist/command/cli/doctor/doctor-rows.d.ts +75 -0
- package/dist/command/cli/doctor/doctor-rows.js +77 -0
- package/dist/command/cli/doctor/doctor-sessions-line.js +69 -0
- package/dist/command/cli/drive/drive-attach.d.ts +113 -0
- package/dist/command/cli/drive/drive-attach.js +221 -0
- package/dist/command/cli/drive/drive-command.js +107 -0
- package/dist/command/cli/launch/cli-launch.d.ts +100 -0
- package/dist/command/cli/launch/cli-launch.js +216 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.d.ts +33 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +198 -0
- package/dist/command/cli/mcp-command.js +176 -0
- package/dist/command/cli/ports/port-holder.js +123 -0
- package/dist/command/cli/ports/resolve/cli-port.d.ts +71 -0
- package/dist/command/cli/ports/resolve/cli-port.js +140 -0
- package/dist/command/cli/setup-mcp-cli.d.ts +29 -0
- package/dist/command/cli/setup-mcp-cli.js +107 -0
- package/dist/command/cli/status/status-lines.d.ts +28 -0
- package/dist/command/cli/status/status-lines.js +117 -0
- package/dist/command/cli/status-fields.d.ts +28 -0
- package/dist/command/cli/status-fields.js +29 -0
- package/dist/command/cli/tutorial.d.ts +116 -0
- package/dist/command/cli/tutorial.js +189 -0
- package/dist/command/cli-onboarding.d.ts +21 -0
- package/dist/command/cli-onboarding.js +27 -0
- package/dist/command/cli.d.ts +6 -0
- package/dist/command/cli.js +710 -0
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
- package/dist/command/daemon/binding/daemon-status-probe.js +48 -0
- package/dist/command/daemon/binding/loopback-reach.d.ts +42 -0
- package/dist/command/daemon/binding/loopback-reach.js +63 -0
- package/dist/command/daemon/daemon-resilience.d.ts +86 -0
- package/dist/command/daemon/daemon-resilience.js +339 -0
- package/dist/command/daemon/daemon-resolve.d.ts +113 -0
- package/dist/command/daemon/daemon-resolve.js +187 -0
- package/dist/command/daemon/daemon.d.ts +86 -0
- package/dist/command/daemon/daemon.js +333 -0
- package/dist/command/daemon/idle-shutdown.d.ts +54 -0
- package/dist/command/daemon/idle-shutdown.js +98 -0
- package/dist/command/daemon/lifetime/daemon-usefulness.d.ts +60 -0
- package/dist/command/daemon/lifetime/daemon-usefulness.js +61 -0
- package/dist/command/daemon/lifetime/heartbeat.d.ts +119 -0
- package/dist/command/daemon/lifetime/heartbeat.js +151 -0
- package/dist/command/daemon/lifetime/idle-grace.d.ts +32 -0
- package/dist/command/daemon/lifetime/idle-grace.js +41 -0
- package/dist/command/daemon/lifetime/log-cap.d.ts +68 -0
- package/dist/command/daemon/lifetime/log-cap.js +115 -0
- package/dist/command/daemon/state-dir.js +59 -0
- package/dist/command/daemon/wake-decision.d.ts +32 -0
- package/dist/command/daemon/wake-decision.js +38 -0
- package/dist/command/dev/stale-issue-guard.d.ts +35 -0
- package/dist/command/dev/stale-issue-guard.js +69 -0
- package/dist/command/setup/agent-configs.d.ts +111 -0
- package/dist/command/setup/agent-configs.js +365 -0
- package/dist/command/setup/agent-notice-memory.d.ts +16 -0
- package/dist/command/setup/agent-notice-memory.js +65 -0
- package/dist/command/setup/agent-writer.d.ts +52 -0
- package/dist/command/setup/agent-writer.js +116 -0
- package/dist/command/setup/auto-approve.js +153 -0
- package/dist/command/setup/bringup/bridge-port.d.ts +15 -0
- package/dist/command/setup/bringup/bridge-port.js +24 -0
- package/dist/command/setup/bringup/dev-server-wait.d.ts +69 -0
- package/dist/command/setup/bringup/dev-server-wait.js +83 -0
- package/dist/command/setup/bringup/ensure-daemon.js +58 -0
- package/dist/command/setup/init/init-host.js +37 -0
- package/dist/command/setup/init/init-runtime.d.ts +39 -0
- package/dist/command/setup/init/init-runtime.js +168 -0
- package/dist/command/setup/node-effects.d.ts +63 -0
- package/dist/command/setup/node-effects.js +225 -0
- package/dist/command/setup/probe/page-probe.d.ts +71 -0
- package/dist/command/setup/probe/page-probe.js +89 -0
- package/dist/command/setup/remaining-steps.js +53 -0
- package/dist/command/setup/run-setup.d.ts +123 -0
- package/dist/command/setup/run-setup.js +316 -0
- package/dist/command/setup/setup-command.d.ts +48 -0
- package/dist/command/setup/setup-command.js +224 -0
- package/dist/command/setup/setup-install.d.ts +18 -0
- package/dist/command/setup/setup-install.js +40 -0
- package/dist/command/setup/setup-mcp.d.ts +57 -0
- package/dist/command/setup/setup-mcp.js +92 -0
- package/dist/command/setup/setup-options.d.ts +66 -0
- package/dist/command/setup/setup-options.js +63 -0
- package/dist/command/setup/terminal/confirm.js +206 -0
- package/dist/command/setup/terminal/crash.d.ts +55 -0
- package/dist/command/setup/terminal/crash.js +74 -0
- package/dist/command/update/nudge-credit.js +53 -0
- package/dist/command/update/sdk-sync.d.ts +20 -0
- package/dist/command/update/sdk-sync.js +22 -0
- package/dist/command/update/update-checker.js +122 -0
- package/dist/command/update/update-nudge.d.ts +90 -0
- package/dist/command/update/update-nudge.js +211 -0
- package/dist/command/update/updater.d.ts +81 -0
- package/dist/command/update/updater.js +223 -0
- package/dist/command/version/identity/server-version.js +50 -0
- package/dist/command/version/peer-announce.js +32 -0
- package/dist/command/version/sdk-fix.js +127 -0
- package/dist/command/version/version-nudge.js +61 -0
- package/dist/command/version/version-skew.d.ts +113 -0
- package/dist/command/version/version-skew.js +192 -0
- package/dist/features/crawl/crawl-tools.d.ts +7 -0
- package/dist/features/crawl/crawl-tools.js +89 -0
- package/dist/features/crawl/crawl.d.ts +98 -0
- package/dist/features/crawl/crawl.js +444 -0
- package/dist/features/ee/audit-log.js +11 -0
- package/dist/features/harness/drive-report.d.ts +73 -0
- package/dist/features/harness/drive-report.js +196 -0
- package/dist/features/harness/driver.d.ts +50 -0
- package/dist/features/harness/driver.js +239 -0
- package/dist/features/harness/drivers.d.ts +19 -0
- package/dist/features/harness/drivers.js +19 -0
- package/dist/features/harness/fill-values.d.ts +67 -0
- package/dist/features/harness/fill-values.js +153 -0
- package/dist/features/harness/harness.d.ts +159 -0
- package/dist/features/harness/harness.js +203 -0
- package/dist/features/harness/jev-driver.d.ts +188 -0
- package/dist/features/harness/jev-driver.js +664 -0
- package/dist/features/harness/openai-driver.d.ts +46 -0
- package/dist/features/harness/openai-driver.js +197 -0
- package/dist/features/harness/platform-config.d.ts +52 -0
- package/dist/features/harness/platform-config.js +89 -0
- package/dist/features/harness/with-timeout.d.ts +18 -0
- package/dist/features/harness/with-timeout.js +34 -0
- package/dist/features/license/license-env.d.ts +24 -0
- package/dist/features/license/license-env.js +140 -0
- package/dist/features/license/license.d.ts +161 -0
- package/dist/features/license/license.js +287 -0
- package/dist/features/visual/visual-store.d.ts +22 -0
- package/dist/features/visual/visual-store.js +66 -0
- package/dist/features/visual/visual-tools.d.ts +26 -0
- package/dist/features/visual/visual-tools.js +352 -0
- package/dist/hooks/hook-bus.d.ts +53 -0
- package/dist/hooks/hook-bus.js +106 -0
- package/dist/hooks/hook-commands.d.ts +59 -0
- package/dist/hooks/hook-commands.js +184 -0
- package/dist/hooks/hook-emit.d.ts +44 -0
- package/dist/hooks/hook-emit.js +85 -0
- package/dist/import-graph.d.ts +48 -0
- package/dist/import-graph.js +106 -0
- package/dist/index.d.ts +91 -125
- package/dist/index.js +250 -160
- package/dist/judgement/capsule/capsule-store.d.ts +70 -0
- package/dist/judgement/capsule/capsule-store.js +113 -0
- package/dist/judgement/capsule/capsule.d.ts +42 -0
- package/dist/judgement/capsule/capsule.js +73 -0
- package/dist/judgement/capsule/causal-summary.d.ts +119 -0
- package/dist/judgement/capsule/causal-summary.js +172 -0
- package/dist/judgement/capsule/divergence.d.ts +26 -0
- package/dist/judgement/domain/domain-model.js +126 -0
- package/dist/judgement/domain/domain-tools.d.ts +2 -0
- package/dist/judgement/domain/domain-tools.js +96 -0
- package/dist/judgement/domain/flow-risk.js +80 -0
- package/dist/judgement/oracles/propose-consequences.d.ts +22 -0
- package/dist/judgement/oracles/propose-consequences.js +106 -0
- package/dist/judgement/outcome/predicate-to-expect.d.ts +44 -0
- package/dist/judgement/outcome/predicate-to-expect.js +148 -0
- package/dist/judgement/runs/artifact/build-verification-run.d.ts +34 -0
- package/dist/judgement/runs/artifact/build-verification-run.js +83 -0
- package/dist/judgement/runs/artifact/render-report.js +84 -0
- package/dist/judgement/runs/artifact/replay-mapping.js +34 -0
- package/dist/judgement/runs/artifact/run-store.d.ts +54 -0
- package/dist/judgement/runs/artifact/run-store.js +150 -0
- package/dist/judgement/runs/artifact/to-artifact.d.ts +119 -0
- package/dist/judgement/runs/artifact/to-artifact.js +83 -0
- package/dist/judgement/runs/context-tools.d.ts +2 -0
- package/dist/judgement/runs/context-tools.js +70 -0
- package/dist/judgement/runs/default-run-id.d.ts +8 -0
- package/dist/judgement/runs/default-run-id.js +11 -0
- package/dist/judgement/runs/drive-run.d.ts +61 -0
- package/dist/judgement/runs/drive-run.js +130 -0
- package/dist/judgement/runs/late-answer.d.ts +55 -0
- package/dist/judgement/runs/late-answer.js +81 -0
- package/dist/judgement/runs/reticle-runner.d.ts +60 -0
- package/dist/judgement/runs/reticle-runner.js +95 -0
- package/dist/judgement/runs/run-tools.d.ts +17 -0
- package/dist/judgement/runs/run-tools.js +97 -0
- package/dist/judgement/runs/runner-port.d.ts +11 -0
- package/dist/judgement/runs/runner-port.js +18 -0
- package/dist/judgement/runs/verification-sync.d.ts +13 -0
- package/dist/judgement/runs/verification-sync.js +93 -0
- package/dist/language/flows/affected-tools.d.ts +18 -0
- package/dist/language/flows/affected-tools.js +83 -0
- package/dist/language/flows/annotate-tools.d.ts +15 -0
- package/dist/language/flows/annotate-tools.js +179 -0
- package/dist/language/flows/change/affected.d.ts +24 -0
- package/dist/language/flows/change/affected.js +35 -0
- package/dist/language/flows/change/flow-sources.d.ts +19 -0
- package/dist/language/flows/change/flow-sources.js +55 -0
- package/dist/language/flows/change/gate.js +33 -0
- package/dist/language/flows/decision.d.ts +45 -0
- package/dist/language/flows/decision.js +371 -0
- package/dist/language/flows/empty-flow.js +24 -0
- package/dist/language/flows/fields/flow-secret-field.d.ts +53 -0
- package/dist/language/flows/fields/flow-secret-field.js +75 -0
- package/dist/language/flows/fields/flow-upload-resolve.d.ts +23 -0
- package/dist/language/flows/fields/flow-upload-resolve.js +46 -0
- package/dist/language/flows/flow-anchor.d.ts +59 -0
- package/dist/language/flows/flow-anchor.js +240 -0
- package/dist/language/flows/flow-classify.d.ts +73 -0
- package/dist/language/flows/flow-classify.js +146 -0
- package/dist/language/flows/flow-expect-grammar.d.ts +33 -0
- package/dist/language/flows/flow-expect-grammar.js +155 -0
- package/dist/language/flows/flow-intent.d.ts +52 -0
- package/dist/language/flows/flow-intent.js +123 -0
- package/dist/language/flows/flow-learning.d.ts +52 -0
- package/dist/language/flows/flow-learning.js +76 -0
- package/dist/language/flows/flow-mutate-tools.d.ts +14 -0
- package/dist/language/flows/flow-mutate-tools.js +82 -0
- package/dist/language/flows/flow-replay-run.d.ts +91 -0
- package/dist/language/flows/flow-replay-run.js +748 -0
- package/dist/language/flows/flow-replay-types.d.ts +37 -0
- package/dist/language/flows/flow-replay-types.js +1 -0
- package/dist/language/flows/flow-replay.d.ts +91 -0
- package/dist/language/flows/flow-replay.js +487 -0
- package/dist/language/flows/flow-result.d.ts +35 -0
- package/dist/language/flows/flow-result.js +26 -0
- package/dist/language/flows/flow-step-runners.d.ts +54 -0
- package/dist/language/flows/flow-step-runners.js +369 -0
- package/dist/language/flows/flow-store-for-session.d.ts +32 -0
- package/dist/language/flows/flow-success.d.ts +32 -0
- package/dist/language/flows/flow-success.js +181 -0
- package/dist/language/flows/flow-tools.d.ts +15 -0
- package/dist/language/flows/flow-tools.js +842 -0
- package/dist/language/flows/flows.d.ts +114 -0
- package/dist/language/flows/flows.js +492 -0
- package/dist/language/flows/heal-precondition.d.ts +28 -0
- package/dist/language/flows/heal-precondition.js +38 -0
- package/dist/language/flows/heal-run.d.ts +17 -0
- package/dist/language/flows/heal-run.js +186 -0
- package/dist/language/flows/heal.js +97 -0
- package/dist/language/flows/mutation-run.d.ts +33 -0
- package/dist/language/flows/mutation-run.js +60 -0
- package/dist/language/flows/narrow-write.d.ts +32 -0
- package/dist/language/flows/narrow-write.js +26 -0
- package/dist/language/flows/recording/flake.d.ts +56 -0
- package/dist/language/flows/recording/recording-backtrack.js +73 -0
- package/dist/language/flows/recording/tape/recordings.d.ts +134 -0
- package/dist/language/flows/recording/tape/recordings.js +144 -0
- package/dist/language/flows/replay.d.ts +83 -0
- package/dist/language/flows/replay.js +397 -0
- package/dist/language/flows/role-anchor-nearest.js +45 -0
- package/dist/language/flows/stores/assertion-tiers-store.d.ts +26 -0
- package/dist/language/flows/stores/assertion-tiers-store.js +107 -0
- package/dist/language/flows/stores/flake-store.d.ts +18 -0
- package/dist/language/flows/stores/flake-store.js +58 -0
- package/dist/language/flows/suite/server-verify.d.ts +15 -0
- package/dist/language/flows/suite/server-verify.js +56 -0
- package/dist/language/flows/suite/suite-flakes.d.ts +34 -0
- package/dist/language/flows/suite/suite-flakes.js +32 -0
- package/dist/language/flows/suite-selection.d.ts +45 -0
- package/dist/language/flows/suite-selection.js +84 -0
- package/dist/language/flows/verify-change-tools.d.ts +2 -0
- package/dist/language/flows/verify-change-tools.js +244 -0
- package/dist/machine/clock.d.ts +24 -0
- package/dist/machine/clock.js +1 -0
- package/dist/machine/repo-root.d.ts +16 -0
- package/dist/machine/repo-root.js +20 -0
- package/dist/memory/cloud/account-state.d.ts +20 -0
- package/dist/memory/cloud/account-state.js +70 -0
- package/dist/memory/cloud/cloud-config.d.ts +79 -0
- package/dist/memory/cloud/cloud-config.js +156 -0
- package/dist/memory/cloud/cloud-sync.d.ts +195 -0
- package/dist/memory/cloud/cloud-sync.js +359 -0
- package/dist/memory/cloud/harness-config.d.ts +10 -0
- package/dist/memory/cloud/harness-config.js +58 -0
- package/dist/memory/cloud/harness-offer.d.ts +44 -0
- package/dist/memory/cloud/harness-offer.js +146 -0
- package/dist/memory/cloud/harness-switch.d.ts +11 -0
- package/dist/memory/cloud/harness-switch.js +53 -0
- package/dist/memory/cloud/sync-cycle.d.ts +121 -0
- package/dist/memory/cloud/sync-cycle.js +295 -0
- package/dist/memory/cloud/sync-daemon.d.ts +73 -0
- package/dist/memory/cloud/sync-daemon.js +297 -0
- package/dist/memory/cloud/sync-disk.js +193 -0
- package/dist/memory/impact/impact-recorder.d.ts +54 -0
- package/dist/memory/impact/impact-recorder.js +160 -0
- package/dist/memory/impact/impact-store.d.ts +52 -0
- package/dist/memory/impact/impact-store.js +274 -0
- package/dist/memory/intent/inline-intent.d.ts +60 -0
- package/dist/memory/intent/inline-intent.js +206 -0
- package/dist/memory/intent/intent-shard-store.d.ts +87 -0
- package/dist/memory/intent/intent-shard-store.js +215 -0
- package/dist/memory/intent/intent-shard.d.ts +389 -0
- package/dist/memory/intent/intent-shard.js +153 -0
- package/dist/memory/intent/intent-store.d.ts +47 -0
- package/dist/memory/intent/intent-store.js +133 -0
- package/dist/memory/intent/intent-subject.d.ts +46 -0
- package/dist/memory/intent/intent-subject.js +175 -0
- package/dist/memory/intent/intent-tools.d.ts +2 -0
- package/dist/memory/intent/intent-tools.js +157 -0
- package/dist/memory/intent/open-intents.d.ts +36 -0
- package/dist/memory/intent/open-intents.js +58 -0
- package/dist/memory/journal/ambient-store.d.ts +13 -0
- package/dist/memory/journal/ambient-store.js +52 -0
- package/dist/memory/journal/attach-journal.d.ts +37 -0
- package/dist/memory/journal/attach-journal.js +26 -0
- package/dist/memory/journal/drive-flow.d.ts +74 -0
- package/dist/memory/journal/drive-flow.js +157 -0
- package/dist/memory/journal/drive-run-flush.d.ts +42 -0
- package/dist/memory/journal/drive-run-flush.js +82 -0
- package/dist/memory/journal/envelope-store.d.ts +16 -0
- package/dist/memory/journal/envelope-store.js +61 -0
- package/dist/memory/journal/envelope.d.ts +230 -0
- package/dist/memory/journal/journal-query.d.ts +66 -0
- package/dist/memory/journal/journal-query.js +98 -0
- package/dist/memory/journal/journal-recorder.d.ts +109 -0
- package/dist/memory/journal/journal-recorder.js +153 -0
- package/dist/memory/journal/on-disk/ambient-file.d.ts +21 -0
- package/dist/memory/journal/on-disk/ambient-file.js +15 -0
- package/dist/memory/journal/on-disk/retention.d.ts +141 -0
- package/dist/memory/journal/on-disk/retention.js +291 -0
- package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +21 -0
- package/dist/memory/journal/on-disk/workspace-gitignore.js +93 -0
- package/dist/memory/journal/self-observation.d.ts +3 -0
- package/dist/memory/journal/self-observation.js +67 -0
- package/dist/memory/journal/session-end.d.ts +112 -0
- package/dist/memory/journal/session-end.js +179 -0
- package/dist/memory/journal/session-journal.d.ts +134 -0
- package/dist/memory/journal/session-journal.js +614 -0
- package/dist/memory/project/artifact-root-resolver.d.ts +3 -0
- package/dist/memory/project/artifact-root-resolver.js +89 -0
- package/dist/memory/project/artifact-root.d.ts +109 -0
- package/dist/memory/project/artifact-root.js +157 -0
- package/dist/memory/project/dir/fill-value-store.d.ts +32 -0
- package/dist/memory/project/dir/fill-value-store.js +88 -0
- package/dist/memory/project/dir/reticle-dir.d.ts +139 -0
- package/dist/memory/project/dir/reticle-dir.js +229 -0
- package/dist/memory/project/fs/fs-port.d.ts +68 -0
- package/dist/memory/project/fs/fs-port.js +82 -0
- package/dist/memory/project/learned-routes.d.ts +38 -0
- package/dist/memory/project/learned-routes.js +79 -0
- package/dist/memory/project/memory-fs.d.ts +10 -0
- package/dist/memory/project/project-for-root.d.ts +30 -0
- package/dist/memory/project/project-for-root.js +43 -0
- package/dist/memory/project/project-store.d.ts +54 -0
- package/dist/memory/project/project-store.js +244 -0
- package/dist/memory/project/project-tools.d.ts +8 -0
- package/dist/memory/project/project-tools.js +160 -0
- package/dist/memory/project/reticle-deps.d.ts +15 -0
- package/dist/memory/project/reticle-deps.js +33 -0
- package/dist/memory/project/session-root.d.ts +52 -0
- package/dist/memory/project/session-root.js +100 -0
- package/dist/memory/recall/memory-tools.d.ts +2 -0
- package/dist/memory/recall/memory-tools.js +81 -0
- package/dist/memory/recall/prior/connection-memory.d.ts +65 -0
- package/dist/memory/recall/prior/connection-memory.js +114 -0
- package/dist/memory/recall/project-memory.d.ts +33 -0
- package/dist/portal/bridge/auth-failure-reason.d.ts +32 -0
- package/dist/portal/bridge/auth-failure-reason.js +68 -0
- package/dist/portal/bridge/bridge-security.d.ts +30 -0
- package/dist/portal/bridge/bridge-security.js +53 -0
- package/dist/portal/bridge/bridge.d.ts +109 -0
- package/dist/portal/bridge/bridge.js +808 -0
- package/dist/portal/input/drive-url-stamp.d.ts +14 -0
- package/dist/portal/input/drive-url-stamp.js +33 -0
- package/dist/portal/input/network-detail.d.ts +97 -0
- package/dist/portal/input/network-detail.js +138 -0
- package/dist/portal/input/network-mock-tools.d.ts +21 -0
- package/dist/portal/input/network-mock-tools.js +124 -0
- package/dist/portal/input/network-mock.js +83 -0
- package/dist/portal/input/network-mutation.d.ts +47 -0
- package/dist/portal/input/network-mutation.js +53 -0
- package/dist/portal/input/real-input.d.ts +261 -0
- package/dist/portal/input/real-input.js +488 -0
- package/dist/portal/input/scroll-find.js +111 -0
- package/dist/portal/input/scroll-tools.d.ts +2 -0
- package/dist/portal/input/scroll-tools.js +76 -0
- package/dist/portal/input/storage-fixture.d.ts +57 -0
- package/dist/portal/input/storage-fixture.js +92 -0
- package/dist/portal/input/viewport-tools.d.ts +2 -0
- package/dist/portal/input/viewport-tools.js +72 -0
- package/dist/portal/pool/browser-pool.d.ts +174 -0
- package/dist/portal/pool/browser-pool.js +559 -0
- package/dist/portal/pool/lease-reaper.js +40 -0
- package/dist/portal/pool/playwright-launcher.js +150 -0
- package/dist/portal/pool/pool-contract.d.ts +116 -0
- package/dist/portal/pool/pool-contract.js +8 -0
- package/dist/portal/pool/storage-seed.d.ts +23 -0
- package/dist/portal/realm/conformance-client.d.ts +43 -0
- package/dist/portal/realm/conformance-client.js +227 -0
- package/dist/portal/realm/http-witness.d.ts +48 -0
- package/dist/portal/realm/http-witness.js +135 -0
- package/dist/portal/realm/web-realm.d.ts +225 -0
- package/dist/portal/realm/web-realm.js +661 -0
- package/dist/portal/session/daemon-answers.d.ts +20 -0
- package/dist/portal/session/daemon-answers.js +20 -0
- package/dist/portal/session/dev-server/dev-server-probe.js +147 -0
- package/dist/portal/session/facts/handshake-facts.d.ts +56 -0
- package/dist/portal/session/facts/handshake-facts.js +1 -0
- package/dist/portal/session/facts/observed-state.d.ts +60 -0
- package/dist/portal/session/facts/observed-state.js +121 -0
- package/dist/portal/session/facts/session-replaced.d.ts +43 -0
- package/dist/portal/session/facts/session-replaced.js +51 -0
- package/dist/portal/session/live-control-tools.d.ts +15 -0
- package/dist/portal/session/live-control-tools.js +242 -0
- package/dist/portal/session/no-session-diagnosis.d.ts +176 -0
- package/dist/portal/session/no-session-diagnosis.js +457 -0
- package/dist/portal/session/no-session-next-action.d.ts +76 -0
- package/dist/portal/session/no-session-next-action.js +211 -0
- package/dist/portal/session/no-session-watch.js +351 -0
- package/dist/portal/session/output-budget.d.ts +82 -0
- package/dist/portal/session/output-budget.js +108 -0
- package/dist/portal/session/page-commands/undeclared-command.d.ts +30 -0
- package/dist/portal/session/page-commands/undeclared-command.js +44 -0
- package/dist/portal/session/presence/session-recommendation.js +29 -0
- package/dist/portal/session/rebind.d.ts +18 -0
- package/dist/portal/session/rebind.js +38 -0
- package/dist/portal/session/session-health.d.ts +145 -0
- package/dist/portal/session/session-health.js +154 -0
- package/dist/portal/session/session-manager.d.ts +81 -0
- package/dist/portal/session/session-manager.js +504 -0
- package/dist/portal/session/session-reaper.d.ts +36 -0
- package/dist/portal/session/session-reaper.js +93 -0
- package/dist/portal/session/session-tools.d.ts +8 -0
- package/dist/portal/session/session-tools.js +42 -0
- package/dist/portal/session/session.d.ts +279 -0
- package/dist/portal/session/session.js +875 -0
- package/dist/portal/session/stall-clock.js +48 -0
- package/dist/portal/session/timing/command-timeout.d.ts +40 -0
- package/dist/portal/session/timing/command-timeout.js +42 -0
- package/dist/start-options.d.ts +51 -0
- package/dist/start-options.js +7 -0
- package/dist/status-payload.d.ts +16 -10
- package/dist/status-payload.js +5 -2
- package/dist/surface/http-server.d.ts +52 -0
- package/dist/surface/http-server.js +379 -0
- package/dist/surface/mcp/consumer-verdict-guard.d.ts +40 -0
- package/dist/surface/mcp/consumer-verdict-guard.js +57 -0
- package/dist/surface/mcp/faults/mcp-is-error.d.ts +13 -0
- package/dist/surface/mcp/faults/mcp-is-error.js +18 -0
- package/dist/surface/mcp/faults/mcp-outage.d.ts +33 -0
- package/dist/surface/mcp/faults/mcp-outage.js +71 -0
- package/dist/surface/mcp/mcp-proxy.d.ts +119 -0
- package/dist/surface/mcp/mcp-proxy.js +882 -0
- package/dist/surface/mcp/mcp.d.ts +89 -0
- package/dist/surface/mcp/mcp.js +676 -0
- package/dist/surface/mcp/proxy/mcp-post-transport.js +109 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +22 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.js +71 -0
- package/dist/surface/mcp/proxy/proxy-handshake.js +192 -0
- package/dist/surface/mcp/proxy/proxy-lifecycle.d.ts +90 -0
- package/dist/surface/mcp/proxy/proxy-lifecycle.js +98 -0
- package/dist/surface/mcp/proxy/proxy-log.d.ts +57 -0
- package/dist/surface/mcp/proxy/proxy-log.js +117 -0
- package/dist/surface/mcp/server-instructions.d.ts +26 -0
- package/dist/surface/mcp/server-instructions.js +156 -0
- package/dist/surface/mcp/surface-vocabulary.d.ts +47 -0
- package/dist/surface/mcp/surface-vocabulary.js +56 -0
- package/dist/surface/mcp/tool-catalog-cache.d.ts +45 -0
- package/dist/surface/mcp/tool-catalog-cache.js +77 -0
- package/dist/surface/tools/act/act-danger.js +69 -0
- package/dist/surface/tools/act/act-helpers.d.ts +17 -0
- package/dist/surface/tools/act/act-helpers.js +40 -0
- package/dist/surface/tools/act/act-observation.d.ts +42 -0
- package/dist/surface/tools/act/act-observation.js +36 -0
- package/dist/surface/tools/act/act-preflight.d.ts +27 -0
- package/dist/surface/tools/act/act-preflight.js +168 -0
- package/dist/surface/tools/act/act-target.d.ts +10 -0
- package/dist/surface/tools/act/act-target.js +100 -0
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +68 -0
- package/dist/surface/tools/act/resolve-target.js +115 -0
- package/dist/surface/tools/act/sequence-grade.d.ts +79 -0
- package/dist/surface/tools/act/sequence-grade.js +104 -0
- package/dist/surface/tools/act-capsule.d.ts +33 -0
- package/dist/surface/tools/act-capsule.js +79 -0
- package/dist/surface/tools/act-merged.d.ts +20 -0
- package/dist/surface/tools/act-merged.js +53 -0
- package/dist/surface/tools/act-sequence-tool.js +330 -0
- package/dist/surface/tools/act-tools.d.ts +24 -0
- package/dist/surface/tools/act-tools.js +835 -0
- package/dist/surface/tools/args/numeric-bounds.d.ts +97 -0
- package/dist/surface/tools/args/numeric-bounds.js +133 -0
- package/dist/surface/tools/assert/assert-grade.d.ts +42 -0
- package/dist/surface/tools/assert/assert-grade.js +125 -0
- package/dist/surface/tools/assert/assert-source.d.ts +52 -0
- package/dist/surface/tools/assert/assert-source.js +74 -0
- package/dist/surface/tools/assert/assert-verdict.d.ts +48 -0
- package/dist/surface/tools/assert/assert-verdict.js +247 -0
- package/dist/surface/tools/browser-tools.d.ts +2 -0
- package/dist/surface/tools/browser-tools.js +115 -0
- package/dist/surface/tools/contract-tools.d.ts +2 -0
- package/dist/surface/tools/contract-tools.js +112 -0
- package/dist/surface/tools/coverage-tools.d.ts +18 -0
- package/dist/surface/tools/coverage-tools.js +178 -0
- package/dist/surface/tools/dynamic-tools.d.ts +17 -0
- package/dist/surface/tools/dynamic-tools.js +282 -0
- package/dist/surface/tools/error-recovery.d.ts +116 -0
- package/dist/surface/tools/error-recovery.js +527 -0
- package/dist/surface/tools/explore-tools.d.ts +14 -0
- package/dist/surface/tools/explore-tools.js +162 -0
- package/dist/surface/tools/feature-capture.d.ts +151 -0
- package/dist/surface/tools/feature-capture.js +235 -0
- package/dist/surface/tools/feedback-invite.d.ts +48 -0
- package/dist/surface/tools/feedback-invite.js +71 -0
- package/dist/surface/tools/feedback-tools.d.ts +35 -0
- package/dist/surface/tools/feedback-tools.js +280 -0
- package/dist/surface/tools/first-sentence.d.ts +24 -0
- package/dist/surface/tools/first-sentence.js +0 -0
- package/dist/surface/tools/gap-novelty.d.ts +39 -0
- package/dist/surface/tools/gap-novelty.js +69 -0
- package/dist/surface/tools/gaps/capability-absences.d.ts +39 -0
- package/dist/surface/tools/gaps/capability-absences.js +46 -0
- package/dist/surface/tools/harness-explore.d.ts +177 -0
- package/dist/surface/tools/harness-explore.js +453 -0
- package/dist/surface/tools/harness-plan.d.ts +76 -0
- package/dist/surface/tools/harness-plan.js +156 -0
- package/dist/surface/tools/harness-toolset.d.ts +35 -0
- package/dist/surface/tools/harness-toolset.js +144 -0
- package/dist/surface/tools/inspect-tool.d.ts +4 -0
- package/dist/surface/tools/inspect-tool.js +142 -0
- package/dist/surface/tools/invoke-tool.d.ts +10 -0
- package/dist/surface/tools/invoke-tool.js +668 -0
- package/dist/surface/tools/lease-hint.d.ts +50 -0
- package/dist/surface/tools/lease-hint.js +125 -0
- package/dist/surface/tools/lease-tools.d.ts +195 -0
- package/dist/surface/tools/lease-tools.js +797 -0
- package/dist/surface/tools/lineage-tools.d.ts +14 -0
- package/dist/surface/tools/lineage-tools.js +64 -0
- package/dist/surface/tools/live-call-text.d.ts +25 -0
- package/dist/surface/tools/live-call-text.js +191 -0
- package/dist/surface/tools/merge-tools.d.ts +68 -0
- package/dist/surface/tools/merge-tools.js +110 -0
- package/dist/surface/tools/merged-name-redirect.d.ts +36 -0
- package/dist/surface/tools/merged-name-redirect.js +107 -0
- package/dist/surface/tools/observe-tools.js +700 -0
- package/dist/surface/tools/read/query-windowed.d.ts +54 -0
- package/dist/surface/tools/read/query-windowed.js +75 -0
- package/dist/surface/tools/read/snapshot-delta.d.ts +92 -0
- package/dist/surface/tools/read/snapshot-delta.js +356 -0
- package/dist/surface/tools/read-tools.js +569 -0
- package/dist/surface/tools/real-input-attempt.d.ts +68 -0
- package/dist/surface/tools/real-input-attempt.js +360 -0
- package/dist/surface/tools/reconcile-tools.js +211 -0
- package/dist/surface/tools/tool-hit-rate.js +90 -0
- package/dist/surface/tools/tool-kit.d.ts +254 -0
- package/dist/surface/tools/tool-kit.js +123 -0
- package/dist/surface/tools/tool-surface.d.ts +195 -0
- package/dist/surface/tools/tool-surface.js +429 -0
- package/dist/surface/tools/tools-helpers.d.ts +40 -0
- package/dist/surface/tools/tools-helpers.js +76 -0
- package/dist/surface/tools/tools.d.ts +76 -0
- package/dist/surface/tools/tools.js +799 -0
- package/dist/surface/tools/unadvertised-help.js +60 -0
- package/dist/surface/tools/verify-next-baton.js +52 -0
- package/dist/telemetry/app-instrumented.d.ts +3 -5
- package/dist/telemetry/app-instrumented.js +17 -6
- package/dist/telemetry/argument-shape.js +4 -4
- package/dist/telemetry/bug-found.js +49 -27
- package/dist/telemetry/cli-telemetry.js +27 -10
- package/dist/telemetry/daemon-telemetry.d.ts +7 -13
- package/dist/telemetry/daemon-telemetry.js +15 -22
- package/dist/telemetry/error-fingerprint.js +26 -1
- package/dist/telemetry/feedback-cli.d.ts +1 -1
- package/dist/telemetry/feedback-cli.js +2 -2
- package/dist/telemetry/feedback-context.js +4 -4
- package/dist/telemetry/feedback.js +1 -1
- package/dist/telemetry/harness-drive.d.ts +6 -0
- package/dist/telemetry/harness-drive.js +39 -0
- package/dist/telemetry/install-source.js +1 -1
- package/dist/telemetry/install-trace.d.ts +8 -0
- package/dist/telemetry/install-trace.js +74 -0
- package/dist/telemetry/license-activation.js +1 -1
- package/dist/telemetry/mcp-connection.d.ts +14 -1
- package/dist/telemetry/mcp-connection.js +17 -2
- package/dist/telemetry/onboarding-firsts.d.ts +40 -0
- package/dist/telemetry/onboarding-firsts.js +109 -0
- package/dist/telemetry/onboarding-funnel.d.ts +26 -0
- package/dist/telemetry/onboarding-funnel.js +60 -0
- package/dist/telemetry/project-profile.js +1 -1
- package/dist/telemetry/run-telemetry.js +13 -0
- package/dist/telemetry/session-metrics.d.ts +6 -7
- package/dist/telemetry/session-metrics.js +14 -21
- package/dist/telemetry/telemetry.d.ts +8 -1
- package/dist/telemetry/telemetry.js +6 -5
- package/dist/telemetry/verification-of.d.ts +6 -8
- package/dist/telemetry/verification-of.js +38 -12
- package/dist/workspace-packages.d.ts +22 -0
- package/dist/workspace-packages.js +57 -0
- package/docs/README.md +29 -23
- package/docs/actions.mdx +4 -4
- package/docs/adapters.md +75 -0
- package/docs/agent-cheatsheet.md +37 -27
- package/docs/architecture.md +3 -2
- package/docs/autodrive.md +99 -0
- package/docs/benchmarks.md +1 -1
- package/docs/best-practices.mdx +3 -3
- package/docs/capabilities.mdx +4 -4
- package/docs/cli/cloud.mdx +4 -4
- package/docs/cli/doctor.mdx +1 -0
- package/docs/cli/feedback.mdx +1 -1
- package/docs/cli/init.mdx +3 -3
- package/docs/cli/mcp.mdx +1 -1
- package/docs/cli/status.mdx +35 -20
- package/docs/cli/watch.mdx +1 -1
- package/docs/cli.mdx +15 -25
- package/docs/desktop.mdx +1 -1
- package/docs/enterprise.md +3 -2
- package/docs/faq.mdx +4 -4
- package/docs/first-drive.md +5 -5
- package/docs/flows.md +5 -5
- package/docs/for-agents.md +2 -1
- package/docs/frameworks.mdx +1 -1
- package/docs/getting-started.md +30 -21
- package/docs/http-transport.md +1 -1
- package/docs/index.mdx +28 -10
- package/docs/install-agentic.mdx +12 -4
- package/docs/install-manual.mdx +23 -7
- package/docs/instrumentation.mdx +3 -3
- package/docs/local-registry.md +15 -4
- package/docs/packages/babel-plugin.mdx +1 -1
- package/docs/packages/browser.mdx +2 -2
- package/docs/packages/core.mdx +2 -2
- package/docs/packages/engine.mdx +40 -0
- package/docs/packages/open-verification.mdx +40 -0
- package/docs/packages/tauri.mdx +1 -1
- package/docs/packages.mdx +22 -2
- package/docs/platform-integration.md +3 -3
- package/docs/predicates.mdx +19 -3
- package/docs/protocol.mdx +60 -0
- package/docs/quickstart.mdx +48 -13
- package/docs/recipes.mdx +1 -1
- package/docs/required-checks.md +37 -0
- package/docs/skill-file.mdx +2 -2
- package/docs/skill-setup.md +104 -0
- package/docs/state-files.md +46 -0
- package/docs/state-management.mdx +1 -1
- package/docs/system-map.md +8 -6
- package/docs/telemetry.md +4 -3
- package/docs/testing.md +12 -3
- package/docs/token-efficiency.md +3 -3
- package/docs/tools/act-and-wait.mdx +173 -0
- package/docs/tools/act-sequence.mdx +160 -0
- package/docs/tools/act.mdx +95 -0
- package/docs/tools/assert.mdx +129 -0
- package/docs/tools/console.mdx +70 -0
- package/docs/tools/inspect.mdx +95 -0
- package/docs/tools/navigate.mdx +107 -0
- package/docs/tools/network.mdx +126 -0
- package/docs/tools/observe.mdx +145 -0
- package/docs/tools/overview.mdx +163 -0
- package/docs/tools/query.mdx +133 -0
- package/docs/tools/sessions.mdx +101 -0
- package/docs/tools/snapshot.mdx +136 -0
- package/docs/tools/state.mdx +111 -0
- package/docs/tools/wait-for.mdx +92 -0
- package/docs/troubleshooting.mdx +43 -9
- package/docs/usage.md +59 -59
- package/package.json +31 -13
- package/dist/bridge/auth-failure-reason.d.ts +0 -23
- package/dist/bridge/auth-failure-reason.js +0 -47
- package/dist/bridge/bridge-security.d.ts +0 -30
- package/dist/bridge/bridge-security.js +0 -53
- package/dist/bridge/bridge.d.ts +0 -95
- package/dist/bridge/bridge.js +0 -713
- package/dist/bridge/bridge.test-harness.d.ts +0 -65
- package/dist/bridge/bridge.test-harness.js +0 -230
- package/dist/capsule/capsule-store.d.ts +0 -71
- package/dist/capsule/capsule-store.js +0 -114
- package/dist/capsule/capsule.d.ts +0 -18
- package/dist/capsule/capsule.js +0 -35
- package/dist/capsule/causal-summary.d.ts +0 -119
- package/dist/capsule/causal-summary.js +0 -172
- package/dist/capsule/divergence.d.ts +0 -35
- package/dist/capsule/predicate-to-links.d.ts +0 -8
- package/dist/capsule/predicate-to-links.js +0 -33
- package/dist/cli/adhoc-verdict.d.ts +0 -58
- package/dist/cli/adhoc-verdict.js +0 -115
- package/dist/cli/cli-doctor.js +0 -195
- package/dist/cli/cli-flow-commands.d.ts +0 -46
- package/dist/cli/cli-flow-commands.js +0 -255
- package/dist/cli/cli-kill.d.ts +0 -59
- package/dist/cli/cli-kill.js +0 -162
- package/dist/cli/cli-launch.d.ts +0 -92
- package/dist/cli/cli-launch.js +0 -223
- package/dist/cli/cli-parse.d.ts +0 -171
- package/dist/cli/cli-parse.js +0 -874
- package/dist/cli/cli-port.d.ts +0 -70
- package/dist/cli/cli-port.js +0 -136
- package/dist/cli/cli-update-commands.js +0 -112
- package/dist/cli/cli-verify.d.ts +0 -86
- package/dist/cli/cli-verify.js +0 -340
- package/dist/cli/cloud-cli.js +0 -694
- package/dist/cli/cloud-keystore.js +0 -97
- package/dist/cli/cloud-kit.d.ts +0 -37
- package/dist/cli/cloud-kit.js +0 -121
- package/dist/cli/cloud-login.js +0 -183
- package/dist/cli/config-discovery.d.ts +0 -36
- package/dist/cli/config-discovery.js +0 -164
- package/dist/cli/daemon-start-options.d.ts +0 -33
- package/dist/cli/device-flow.d.ts +0 -76
- package/dist/cli/device-flow.js +0 -56
- package/dist/cli/doctor-daemon-line.js +0 -47
- package/dist/cli/doctor-rows.d.ts +0 -63
- package/dist/cli/doctor-rows.js +0 -65
- package/dist/cli/doctor-sessions-line.js +0 -69
- package/dist/cli/drive-attach.d.ts +0 -113
- package/dist/cli/drive-attach.js +0 -221
- package/dist/cli/drive-command.js +0 -107
- package/dist/cli/mcp-command.js +0 -174
- package/dist/cli/port-holder.js +0 -123
- package/dist/cli/status-next-action.d.ts +0 -51
- package/dist/cli/status-next-action.js +0 -60
- package/dist/cli.d.ts +0 -6
- package/dist/cli.js +0 -828
- package/dist/cloud/account-state.d.ts +0 -20
- package/dist/cloud/account-state.js +0 -65
- package/dist/cloud/cloud-config.d.ts +0 -57
- package/dist/cloud/cloud-config.js +0 -145
- package/dist/cloud/cloud-sync.d.ts +0 -190
- package/dist/cloud/cloud-sync.js +0 -354
- package/dist/cloud/sync-cycle.d.ts +0 -111
- package/dist/cloud/sync-cycle.js +0 -270
- package/dist/cloud/sync-daemon.d.ts +0 -53
- package/dist/cloud/sync-daemon.js +0 -260
- package/dist/cloud/sync-disk.js +0 -191
- package/dist/crawl/crawl-tools.d.ts +0 -7
- package/dist/crawl/crawl-tools.js +0 -87
- package/dist/crawl/crawl.d.ts +0 -98
- package/dist/crawl/crawl.js +0 -441
- package/dist/daemon/daemon-resilience.d.ts +0 -74
- package/dist/daemon/daemon-resilience.js +0 -318
- package/dist/daemon/daemon-resolve.d.ts +0 -113
- package/dist/daemon/daemon-resolve.js +0 -187
- package/dist/daemon/daemon-usefulness.d.ts +0 -61
- package/dist/daemon/daemon-usefulness.js +0 -62
- package/dist/daemon/daemon.d.ts +0 -95
- package/dist/daemon/daemon.js +0 -336
- package/dist/daemon/heartbeat.d.ts +0 -111
- package/dist/daemon/heartbeat.js +0 -141
- package/dist/daemon/idle-grace.d.ts +0 -32
- package/dist/daemon/idle-grace.js +0 -41
- package/dist/daemon/idle-shutdown.d.ts +0 -54
- package/dist/daemon/idle-shutdown.js +0 -98
- package/dist/daemon/state-dir.js +0 -59
- package/dist/daemon/wake-decision.d.ts +0 -32
- package/dist/daemon/wake-decision.js +0 -38
- package/dist/dev/stale-issue-guard.d.ts +0 -41
- package/dist/dev/stale-issue-guard.js +0 -75
- package/dist/domain/domain-model.js +0 -126
- package/dist/domain/domain-tools.d.ts +0 -2
- package/dist/domain/domain-tools.js +0 -94
- package/dist/domain/flow-risk.js +0 -80
- package/dist/ee/audit-log.js +0 -11
- package/dist/events/body-failures.d.ts +0 -4
- package/dist/events/body-failures.js +0 -113
- package/dist/events/contradiction-folds.d.ts +0 -45
- package/dist/events/contradiction-folds.js +0 -42
- package/dist/events/contradictions.d.ts +0 -170
- package/dist/events/contradictions.js +0 -718
- package/dist/events/declared.d.ts +0 -74
- package/dist/events/declared.js +0 -171
- package/dist/events/echo-mismatch.d.ts +0 -10
- package/dist/events/echo-mismatch.js +0 -299
- package/dist/events/event-filters.d.ts +0 -121
- package/dist/events/event-filters.js +0 -215
- package/dist/events/json-salvage.d.ts +0 -33
- package/dist/events/json-salvage.js +0 -96
- package/dist/events/lineage.d.ts +0 -52
- package/dist/events/lineage.js +0 -122
- package/dist/events/net-evidence.d.ts +0 -21
- package/dist/events/net-evidence.js +0 -81
- package/dist/events/observed-in-window.d.ts +0 -24
- package/dist/events/observed-in-window.js +0 -38
- package/dist/events/predicate-asks.d.ts +0 -30
- package/dist/events/predicate-asks.js +0 -48
- package/dist/events/predicate-console.d.ts +0 -13
- package/dist/events/predicate-console.js +0 -138
- package/dist/events/predicate-element.d.ts +0 -13
- package/dist/events/predicate-element.js +0 -214
- package/dist/events/predicate-eval.d.ts +0 -101
- package/dist/events/predicate-eval.js +0 -834
- package/dist/events/predicate-parse.d.ts +0 -17
- package/dist/events/predicate-parse.js +0 -175
- package/dist/events/predicate-precheck.d.ts +0 -8
- package/dist/events/predicate-precheck.js +0 -41
- package/dist/events/predicate-request-body.d.ts +0 -50
- package/dist/events/predicate-request-body.js +0 -120
- package/dist/events/predicate-route.d.ts +0 -66
- package/dist/events/predicate-route.js +0 -258
- package/dist/events/predicate-schema.d.ts +0 -168
- package/dist/events/predicate-schema.js +0 -501
- package/dist/events/predicate.d.ts +0 -74
- package/dist/events/predicate.js +0 -725
- package/dist/events/reaction.d.ts +0 -33
- package/dist/events/reaction.js +0 -59
- package/dist/events/reconcile.d.ts +0 -39
- package/dist/events/reconcile.js +0 -211
- package/dist/events/ring-buffer.d.ts +0 -41
- package/dist/events/ring-buffer.js +0 -151
- package/dist/events/split-text-miss.d.ts +0 -32
- package/dist/events/split-text-miss.js +0 -51
- package/dist/events/stale-response.d.ts +0 -3
- package/dist/events/stale-response.js +0 -186
- package/dist/events/testid-near-miss.d.ts +0 -22
- package/dist/events/testid-near-miss.js +0 -33
- package/dist/events/unit-mismatch.d.ts +0 -16
- package/dist/events/unit-mismatch.js +0 -167
- package/dist/flows/affected-tools.d.ts +0 -18
- package/dist/flows/affected-tools.js +0 -80
- package/dist/flows/affected.d.ts +0 -24
- package/dist/flows/affected.js +0 -35
- package/dist/flows/annotate-tools.d.ts +0 -15
- package/dist/flows/annotate-tools.js +0 -179
- package/dist/flows/assertion-tiers-store.d.ts +0 -16
- package/dist/flows/assertion-tiers-store.js +0 -98
- package/dist/flows/decision.d.ts +0 -25
- package/dist/flows/decision.js +0 -201
- package/dist/flows/empty-flow.js +0 -24
- package/dist/flows/flake-store.d.ts +0 -18
- package/dist/flows/flake-store.js +0 -58
- package/dist/flows/flake.d.ts +0 -56
- package/dist/flows/flow-classify.d.ts +0 -51
- package/dist/flows/flow-classify.js +0 -102
- package/dist/flows/flow-expect-grammar.d.ts +0 -33
- package/dist/flows/flow-expect-grammar.js +0 -155
- package/dist/flows/flow-intent.d.ts +0 -52
- package/dist/flows/flow-intent.js +0 -123
- package/dist/flows/flow-replay-run.d.ts +0 -43
- package/dist/flows/flow-replay-run.js +0 -478
- package/dist/flows/flow-replay.d.ts +0 -82
- package/dist/flows/flow-replay.js +0 -519
- package/dist/flows/flow-secret-field.d.ts +0 -14
- package/dist/flows/flow-secret-field.js +0 -22
- package/dist/flows/flow-sources.d.ts +0 -19
- package/dist/flows/flow-sources.js +0 -32
- package/dist/flows/flow-step-runners.d.ts +0 -52
- package/dist/flows/flow-step-runners.js +0 -315
- package/dist/flows/flow-store-for-session.d.ts +0 -31
- package/dist/flows/flow-success.d.ts +0 -32
- package/dist/flows/flow-success.js +0 -169
- package/dist/flows/flow-tools.d.ts +0 -15
- package/dist/flows/flow-tools.js +0 -639
- package/dist/flows/flow-upload-resolve.d.ts +0 -23
- package/dist/flows/flow-upload-resolve.js +0 -46
- package/dist/flows/flows.d.ts +0 -130
- package/dist/flows/flows.js +0 -870
- package/dist/flows/gate.js +0 -33
- package/dist/flows/heal-run.d.ts +0 -10
- package/dist/flows/heal-run.js +0 -139
- package/dist/flows/heal.js +0 -97
- package/dist/flows/predicate-to-expect.d.ts +0 -44
- package/dist/flows/predicate-to-expect.js +0 -130
- package/dist/flows/recording-backtrack.js +0 -73
- package/dist/flows/recordings.d.ts +0 -63
- package/dist/flows/recordings.js +0 -57
- package/dist/flows/replay.d.ts +0 -62
- package/dist/flows/replay.js +0 -337
- package/dist/flows/role-anchor-nearest.js +0 -45
- package/dist/flows/server-verify.d.ts +0 -15
- package/dist/flows/server-verify.js +0 -56
- package/dist/flows/suite-flakes.d.ts +0 -34
- package/dist/flows/suite-flakes.js +0 -32
- package/dist/flows/verify-change-tools.d.ts +0 -2
- package/dist/flows/verify-change-tools.js +0 -231
- package/dist/honesty/accepted-write.d.ts +0 -17
- package/dist/honesty/accepted-write.js +0 -22
- package/dist/honesty/already-true.d.ts +0 -16
- package/dist/honesty/already-true.js +0 -89
- package/dist/honesty/blind-spots.d.ts +0 -133
- package/dist/honesty/blind-spots.js +0 -248
- package/dist/honesty/body-capture-remedy.d.ts +0 -42
- package/dist/honesty/body-capture-remedy.js +0 -95
- package/dist/honesty/feature-capture.d.ts +0 -151
- package/dist/honesty/feature-capture.js +0 -233
- package/dist/honesty/gap-ledger.d.ts +0 -52
- package/dist/honesty/gap-ledger.js +0 -63
- package/dist/honesty/honesty.d.ts +0 -103
- package/dist/honesty/honesty.js +0 -95
- package/dist/honesty/instrumentation-gaps.d.ts +0 -95
- package/dist/honesty/instrumentation-gaps.js +0 -114
- package/dist/honesty/observability.d.ts +0 -38
- package/dist/honesty/observability.js +0 -40
- package/dist/honesty/tool-hit-rate.js +0 -90
- package/dist/honesty/uncaptured-bodies.d.ts +0 -23
- package/dist/honesty/uncaptured-bodies.js +0 -41
- package/dist/honesty/undeclared-change.d.ts +0 -51
- package/dist/honesty/undeclared-change.js +0 -56
- package/dist/honesty/unread-outcome.d.ts +0 -10
- package/dist/honesty/unread-outcome.js +0 -77
- package/dist/honesty/unsettled.d.ts +0 -58
- package/dist/honesty/unsettled.js +0 -127
- package/dist/honesty/verified.d.ts +0 -148
- package/dist/honesty/verified.js +0 -330
- package/dist/http-server.d.ts +0 -52
- package/dist/http-server.js +0 -381
- package/dist/impact/impact-recorder.d.ts +0 -46
- package/dist/impact/impact-recorder.js +0 -159
- package/dist/impact/impact-store.d.ts +0 -47
- package/dist/impact/impact-store.js +0 -255
- package/dist/input/network-detail.d.ts +0 -104
- package/dist/input/network-detail.js +0 -211
- package/dist/input/network-mock-tools.d.ts +0 -21
- package/dist/input/network-mock-tools.js +0 -124
- package/dist/input/network-mock.js +0 -61
- package/dist/input/real-input.d.ts +0 -222
- package/dist/input/real-input.js +0 -405
- package/dist/input/scroll-find.js +0 -111
- package/dist/input/scroll-tools.d.ts +0 -2
- package/dist/input/scroll-tools.js +0 -76
- package/dist/input/viewport-tools.d.ts +0 -2
- package/dist/input/viewport-tools.js +0 -72
- package/dist/intent/inline-intent.d.ts +0 -27
- package/dist/intent/inline-intent.js +0 -193
- package/dist/intent/intent-shard-store.d.ts +0 -73
- package/dist/intent/intent-shard-store.js +0 -203
- package/dist/intent/intent-shard.d.ts +0 -411
- package/dist/intent/intent-shard.js +0 -176
- package/dist/intent/intent-store.d.ts +0 -49
- package/dist/intent/intent-store.js +0 -133
- package/dist/intent/intent-subject.d.ts +0 -46
- package/dist/intent/intent-subject.js +0 -177
- package/dist/intent/intent-tools.d.ts +0 -2
- package/dist/intent/intent-tools.js +0 -143
- package/dist/intent/open-intents.d.ts +0 -43
- package/dist/intent/open-intents.js +0 -40
- package/dist/journal/ambient-store.d.ts +0 -13
- package/dist/journal/ambient-store.js +0 -45
- package/dist/journal/ambient.d.ts +0 -47
- package/dist/journal/ambient.js +0 -47
- package/dist/journal/attach-journal.d.ts +0 -30
- package/dist/journal/attach-journal.js +0 -30
- package/dist/journal/envelope-store.d.ts +0 -16
- package/dist/journal/envelope-store.js +0 -61
- package/dist/journal/envelope.d.ts +0 -230
- package/dist/journal/journal-query.d.ts +0 -32
- package/dist/journal/journal-query.js +0 -52
- package/dist/journal/journal-recorder.d.ts +0 -61
- package/dist/journal/journal-recorder.js +0 -115
- package/dist/journal/retention.d.ts +0 -20
- package/dist/journal/retention.js +0 -49
- package/dist/journal/session-end.d.ts +0 -32
- package/dist/journal/session-end.js +0 -51
- package/dist/journal/session-journal.d.ts +0 -24
- package/dist/journal/session-journal.js +0 -167
- package/dist/journal/workspace-gitignore.d.ts +0 -10
- package/dist/journal/workspace-gitignore.js +0 -59
- package/dist/license/license-env.d.ts +0 -29
- package/dist/license/license-env.js +0 -148
- package/dist/license/license.d.ts +0 -169
- package/dist/license/license.js +0 -289
- package/dist/mcp/mcp-is-error.d.ts +0 -13
- package/dist/mcp/mcp-is-error.js +0 -18
- package/dist/mcp/mcp-outage.d.ts +0 -32
- package/dist/mcp/mcp-outage.js +0 -55
- package/dist/mcp/mcp-post-transport.js +0 -109
- package/dist/mcp/mcp-proxy.d.ts +0 -110
- package/dist/mcp/mcp-proxy.js +0 -872
- package/dist/mcp/mcp.d.ts +0 -80
- package/dist/mcp/mcp.js +0 -536
- package/dist/mcp/proxy-daemon-probe.d.ts +0 -9
- package/dist/mcp/proxy-daemon-probe.js +0 -54
- package/dist/mcp/proxy-handshake.js +0 -192
- package/dist/mcp/proxy-lifecycle.d.ts +0 -92
- package/dist/mcp/proxy-lifecycle.js +0 -100
- package/dist/mcp/proxy-log.d.ts +0 -63
- package/dist/mcp/proxy-log.js +0 -132
- package/dist/mcp/server-instructions.d.ts +0 -18
- package/dist/mcp/server-instructions.js +0 -98
- package/dist/mcp/tool-catalog-cache.d.ts +0 -45
- package/dist/mcp/tool-catalog-cache.js +0 -77
- package/dist/memory/memory-tools.d.ts +0 -2
- package/dist/memory/memory-tools.js +0 -82
- package/dist/memory/project-memory.d.ts +0 -33
- package/dist/oracles/propose-consequences.d.ts +0 -22
- package/dist/oracles/propose-consequences.js +0 -106
- package/dist/pool/browser-pool.d.ts +0 -282
- package/dist/pool/browser-pool.js +0 -560
- package/dist/pool/lease-reaper.js +0 -40
- package/dist/pool/playwright-launcher.js +0 -150
- package/dist/pool/storage-seed.d.ts +0 -23
- package/dist/project/artifact-root.d.ts +0 -84
- package/dist/project/artifact-root.js +0 -112
- package/dist/project/fs-port.d.ts +0 -47
- package/dist/project/fs-port.js +0 -54
- package/dist/project/learned-routes.d.ts +0 -24
- package/dist/project/learned-routes.js +0 -63
- package/dist/project/memory-fs.d.ts +0 -10
- package/dist/project/project-store.d.ts +0 -54
- package/dist/project/project-store.js +0 -201
- package/dist/project/project-tools.d.ts +0 -2
- package/dist/project/project-tools.js +0 -155
- package/dist/project/reticle-dir.d.ts +0 -102
- package/dist/project/reticle-dir.js +0 -188
- package/dist/project/session-root.d.ts +0 -23
- package/dist/project/session-root.js +0 -38
- package/dist/runs/build-verification-run.d.ts +0 -29
- package/dist/runs/build-verification-run.js +0 -70
- package/dist/runs/context-tools.d.ts +0 -2
- package/dist/runs/context-tools.js +0 -89
- package/dist/runs/render-report.js +0 -69
- package/dist/runs/replay-mapping.js +0 -34
- package/dist/runs/reticle-runner.d.ts +0 -60
- package/dist/runs/reticle-runner.js +0 -95
- package/dist/runs/run-store.d.ts +0 -54
- package/dist/runs/run-store.js +0 -147
- package/dist/runs/run-tools.d.ts +0 -9
- package/dist/runs/run-tools.js +0 -82
- package/dist/runs/runner-port.d.ts +0 -13
- package/dist/runs/runner-port.js +0 -22
- package/dist/runs/verification-sync.d.ts +0 -12
- package/dist/runs/verification-sync.js +0 -87
- package/dist/session/command-timeout.d.ts +0 -46
- package/dist/session/command-timeout.js +0 -42
- package/dist/session/connection-memory.d.ts +0 -59
- package/dist/session/connection-memory.js +0 -108
- package/dist/session/dev-server-probe.js +0 -147
- package/dist/session/live-control-tools.d.ts +0 -15
- package/dist/session/live-control-tools.js +0 -242
- package/dist/session/no-session-diagnosis.d.ts +0 -176
- package/dist/session/no-session-diagnosis.js +0 -477
- package/dist/session/no-session-next-action.d.ts +0 -72
- package/dist/session/no-session-next-action.js +0 -174
- package/dist/session/no-session-watch.js +0 -335
- package/dist/session/observed-state.d.ts +0 -60
- package/dist/session/observed-state.js +0 -121
- package/dist/session/output-budget.d.ts +0 -49
- package/dist/session/output-budget.js +0 -67
- package/dist/session/session-health.d.ts +0 -138
- package/dist/session/session-health.js +0 -154
- package/dist/session/session-manager.d.ts +0 -76
- package/dist/session/session-manager.js +0 -464
- package/dist/session/session-reaper.d.ts +0 -36
- package/dist/session/session-reaper.js +0 -93
- package/dist/session/session-recommendation.js +0 -29
- package/dist/session/session-replaced.d.ts +0 -24
- package/dist/session/session-replaced.js +0 -29
- package/dist/session/session-tools.d.ts +0 -8
- package/dist/session/session-tools.js +0 -42
- package/dist/session/session.d.ts +0 -280
- package/dist/session/session.js +0 -891
- package/dist/session/stall-clock.js +0 -48
- package/dist/setup/agent-configs.d.ts +0 -97
- package/dist/setup/agent-configs.js +0 -333
- package/dist/setup/agent-writer.d.ts +0 -52
- package/dist/setup/agent-writer.js +0 -115
- package/dist/setup/auto-approve.js +0 -153
- package/dist/setup/bridge-port.d.ts +0 -15
- package/dist/setup/bridge-port.js +0 -24
- package/dist/setup/confirm.js +0 -205
- package/dist/setup/dev-server-wait.d.ts +0 -68
- package/dist/setup/dev-server-wait.js +0 -67
- package/dist/setup/drive-agent.d.ts +0 -70
- package/dist/setup/drive-agent.js +0 -171
- package/dist/setup/drive-plan.d.ts +0 -69
- package/dist/setup/drive-plan.js +0 -130
- package/dist/setup/ensure-daemon.js +0 -58
- package/dist/setup/init-host.js +0 -26
- package/dist/setup/init-runtime.d.ts +0 -41
- package/dist/setup/init-runtime.js +0 -167
- package/dist/setup/node-effects.d.ts +0 -63
- package/dist/setup/node-effects.js +0 -225
- package/dist/setup/page-probe.d.ts +0 -44
- package/dist/setup/page-probe.js +0 -49
- package/dist/setup/remaining-steps.js +0 -31
- package/dist/setup/run-setup.d.ts +0 -103
- package/dist/setup/run-setup.js +0 -294
- package/dist/setup/setup-command.d.ts +0 -46
- package/dist/setup/setup-command.js +0 -207
- package/dist/setup/setup-options.d.ts +0 -76
- package/dist/setup/setup-options.js +0 -68
- package/dist/tools/act-capsule.d.ts +0 -33
- package/dist/tools/act-capsule.js +0 -53
- package/dist/tools/act-danger.js +0 -69
- package/dist/tools/act-helpers.d.ts +0 -17
- package/dist/tools/act-helpers.js +0 -40
- package/dist/tools/act-observation.d.ts +0 -42
- package/dist/tools/act-observation.js +0 -36
- package/dist/tools/act-preflight.d.ts +0 -20
- package/dist/tools/act-preflight.js +0 -103
- package/dist/tools/act-sequence-tool.js +0 -135
- package/dist/tools/act-target.d.ts +0 -18
- package/dist/tools/act-target.js +0 -56
- package/dist/tools/act-tools.d.ts +0 -20
- package/dist/tools/act-tools.js +0 -763
- package/dist/tools/assert-grade.d.ts +0 -42
- package/dist/tools/assert-grade.js +0 -108
- package/dist/tools/assert-source.d.ts +0 -52
- package/dist/tools/assert-source.js +0 -74
- package/dist/tools/assert-verdict.d.ts +0 -48
- package/dist/tools/assert-verdict.js +0 -197
- package/dist/tools/browser-tools.d.ts +0 -2
- package/dist/tools/browser-tools.js +0 -115
- package/dist/tools/contract-tools.d.ts +0 -2
- package/dist/tools/contract-tools.js +0 -98
- package/dist/tools/coverage-tools.d.ts +0 -18
- package/dist/tools/coverage-tools.js +0 -175
- package/dist/tools/dynamic-tools.d.ts +0 -7
- package/dist/tools/dynamic-tools.js +0 -257
- package/dist/tools/error-recovery.d.ts +0 -110
- package/dist/tools/error-recovery.js +0 -499
- package/dist/tools/feedback-invite.d.ts +0 -48
- package/dist/tools/feedback-invite.js +0 -71
- package/dist/tools/feedback-tools.d.ts +0 -35
- package/dist/tools/feedback-tools.js +0 -228
- package/dist/tools/invoke-tool.d.ts +0 -10
- package/dist/tools/invoke-tool.js +0 -569
- package/dist/tools/lease-hint.d.ts +0 -49
- package/dist/tools/lease-hint.js +0 -124
- package/dist/tools/lease-tools.d.ts +0 -143
- package/dist/tools/lease-tools.js +0 -688
- package/dist/tools/lineage-tools.d.ts +0 -14
- package/dist/tools/lineage-tools.js +0 -64
- package/dist/tools/merge-tools.d.ts +0 -51
- package/dist/tools/merge-tools.js +0 -69
- package/dist/tools/merged-name-redirect.d.ts +0 -26
- package/dist/tools/merged-name-redirect.js +0 -77
- package/dist/tools/navigate-arrival.d.ts +0 -68
- package/dist/tools/numeric-bounds.d.ts +0 -89
- package/dist/tools/numeric-bounds.js +0 -125
- package/dist/tools/observe-tools.js +0 -578
- package/dist/tools/read-tools.js +0 -569
- package/dist/tools/real-input-attempt.d.ts +0 -68
- package/dist/tools/real-input-attempt.js +0 -360
- package/dist/tools/reconcile-tools.js +0 -126
- package/dist/tools/resolve-target.js +0 -116
- package/dist/tools/snapshot-delta.d.ts +0 -92
- package/dist/tools/snapshot-delta.js +0 -356
- package/dist/tools/tool-kit.d.ts +0 -221
- package/dist/tools/tool-kit.js +0 -114
- package/dist/tools/tool-names.d.ts +0 -112
- package/dist/tools/tool-names.js +0 -112
- package/dist/tools/tool-surface.d.ts +0 -222
- package/dist/tools/tool-surface.js +0 -439
- package/dist/tools/tools-helpers.d.ts +0 -42
- package/dist/tools/tools-helpers.js +0 -87
- package/dist/tools/tools.d.ts +0 -20
- package/dist/tools/tools.js +0 -739
- package/dist/tools/unadvertised-help.js +0 -42
- package/dist/tools/verify-next-baton.js +0 -52
- package/dist/update/nudge-credit.js +0 -53
- package/dist/update/reticle-deps.d.ts +0 -9
- package/dist/update/reticle-deps.js +0 -27
- package/dist/update/sdk-sync.d.ts +0 -20
- package/dist/update/sdk-sync.js +0 -22
- package/dist/update/update-checker.js +0 -122
- package/dist/update/update-nudge.d.ts +0 -92
- package/dist/update/update-nudge.js +0 -214
- package/dist/update/updater.d.ts +0 -54
- package/dist/update/updater.js +0 -190
- package/dist/version/peer-announce.js +0 -32
- package/dist/version/sdk-fix.js +0 -127
- package/dist/version/server-version.js +0 -13
- package/dist/version/version-nudge.js +0 -61
- package/dist/version/version-skew.d.ts +0 -93
- package/dist/version/version-skew.js +0 -147
- package/dist/visual/visual-store.d.ts +0 -22
- package/dist/visual/visual-store.js +0 -66
- package/dist/visual/visual-tools.d.ts +0 -26
- package/dist/visual/visual-tools.js +0 -328
- package/docs/docs.json +0 -369
- package/docs/fixtures.md +0 -51
- package/docs/gate-plan.md +0 -104
- package/docs/gates.md +0 -131
- package/docs/style.css +0 -14
- package/docs/telemetry-contract.md +0 -390
- package/docs/telemetry-events.mdx +0 -442
- package/docs/tools-act-and-wait.mdx +0 -173
- package/docs/tools-act-sequence.mdx +0 -153
- package/docs/tools-act.mdx +0 -95
- package/docs/tools-assert.mdx +0 -129
- package/docs/tools-console.mdx +0 -63
- package/docs/tools-inspect.mdx +0 -88
- package/docs/tools-navigate.mdx +0 -107
- package/docs/tools-network.mdx +0 -119
- package/docs/tools-observe.mdx +0 -145
- package/docs/tools-overview.mdx +0 -160
- package/docs/tools-query.mdx +0 -126
- package/docs/tools-sessions.mdx +0 -94
- package/docs/tools-snapshot.mdx +0 -129
- package/docs/tools-state.mdx +0 -104
- package/docs/tools-wait-for.mdx +0 -85
- /package/dist/{cli → command/cli/answers}/gate-exit.d.ts +0 -0
- /package/dist/{cli → command/cli/answers}/gate-exit.js +0 -0
- /package/dist/{cli → command/cli/answers}/gate-hook-message.d.ts +0 -0
- /package/dist/{cli → command/cli/answers}/gate-hook-message.js +0 -0
- /package/dist/{cli → command/cli/answers}/open-note.d.ts +0 -0
- /package/dist/{cli → command/cli/answers}/open-note.js +0 -0
- /package/dist/{cli → command/cli/auth}/cloud-keystore.d.ts +0 -0
- /package/dist/{cli → command/cli/auth}/cloud-session.d.ts +0 -0
- /package/dist/{cli → command/cli/auth}/cloud-session.js +0 -0
- /package/dist/{cli → command/cli}/cli-doctor.d.ts +0 -0
- /package/dist/{cli → command/cli}/cli-parse-feedback.d.ts +0 -0
- /package/dist/{cli → command/cli}/cli-parse-feedback.js +0 -0
- /package/dist/{cli → command/cli}/cli-update-commands.d.ts +0 -0
- /package/dist/{cli → command/cli}/cloud-cli.d.ts +0 -0
- /package/dist/{cli → command/cli}/cloud-login.d.ts +0 -0
- /package/dist/{cli → command/cli}/daemon-start-options.js +0 -0
- /package/dist/{cli → command/cli/doctor/browser}/chromium-hint.d.ts +0 -0
- /package/dist/{cli → command/cli/doctor/browser}/chromium-hint.js +0 -0
- /package/dist/{cli → command/cli/doctor}/doctor-daemon-line.d.ts +0 -0
- /package/dist/{cli → command/cli/doctor}/doctor-project-line.d.ts +0 -0
- /package/dist/{cli → command/cli/doctor}/doctor-project-line.js +0 -0
- /package/dist/{cli → command/cli/doctor}/doctor-sessions-line.d.ts +0 -0
- /package/dist/{cli → command/cli/drive}/drive-command.d.ts +0 -0
- /package/dist/{cli → command/cli}/mcp-command.d.ts +0 -0
- /package/dist/{cli → command/cli/ports}/port-holder.d.ts +0 -0
- /package/dist/{cli → command/cli/ports}/sibling-ports.d.ts +0 -0
- /package/dist/{cli → command/cli/ports}/sibling-ports.js +0 -0
- /package/dist/{cli → command/cli}/project-name.d.ts +0 -0
- /package/dist/{cli → command/cli}/project-name.js +0 -0
- /package/dist/{daemon → command/daemon/binding}/free-port.d.ts +0 -0
- /package/dist/{daemon → command/daemon/binding}/free-port.js +0 -0
- /package/dist/{daemon → command/daemon/binding}/loopback-alias.d.ts +0 -0
- /package/dist/{daemon → command/daemon/binding}/loopback-alias.js +0 -0
- /package/dist/{daemon → command/daemon/binding}/port-presence.d.ts +0 -0
- /package/dist/{daemon → command/daemon/binding}/port-presence.js +0 -0
- /package/dist/{daemon → command/daemon}/dev-servers.d.ts +0 -0
- /package/dist/{daemon → command/daemon}/dev-servers.js +0 -0
- /package/dist/{daemon → command/daemon/lifetime}/startup-failure.d.ts +0 -0
- /package/dist/{daemon → command/daemon/lifetime}/startup-failure.js +0 -0
- /package/dist/{daemon → command/daemon/lifetime}/unclean-predecessor.d.ts +0 -0
- /package/dist/{daemon → command/daemon/lifetime}/unclean-predecessor.js +0 -0
- /package/dist/{daemon → command/daemon}/state-dir.d.ts +0 -0
- /package/dist/{setup → command/setup}/agent-io.d.ts +0 -0
- /package/dist/{setup → command/setup}/agent-io.js +0 -0
- /package/dist/{setup → command/setup}/approval-migration.d.ts +0 -0
- /package/dist/{setup → command/setup}/approval-migration.js +0 -0
- /package/dist/{setup → command/setup}/auto-approve.d.ts +0 -0
- /package/dist/{setup → command/setup/bringup}/ensure-daemon.d.ts +0 -0
- /package/dist/{setup → command/setup/bringup}/relaunch.d.ts +0 -0
- /package/dist/{setup → command/setup/bringup}/relaunch.js +0 -0
- /package/dist/{setup → command/setup}/desktop-shape.d.ts +0 -0
- /package/dist/{setup → command/setup}/desktop-shape.js +0 -0
- /package/dist/{setup → command/setup/init}/init-host.d.ts +0 -0
- /package/dist/{setup → command/setup}/license-key.d.ts +0 -0
- /package/dist/{setup → command/setup}/license-key.js +0 -0
- /package/dist/{setup → command/setup/probe}/existing-app.d.ts +0 -0
- /package/dist/{setup → command/setup/probe}/existing-app.js +0 -0
- /package/dist/{setup → command/setup/probe}/loopback-probe-urls.d.ts +0 -0
- /package/dist/{setup → command/setup/probe}/loopback-probe-urls.js +0 -0
- /package/dist/{setup → command/setup}/remaining-steps.d.ts +0 -0
- /package/dist/{setup → command/setup}/session-pick.d.ts +0 -0
- /package/dist/{setup → command/setup}/session-pick.js +0 -0
- /package/dist/{setup → command/setup/terminal}/confirm.d.ts +0 -0
- /package/dist/{setup → command/setup/terminal}/interrupt.d.ts +0 -0
- /package/dist/{setup → command/setup/terminal}/interrupt.js +0 -0
- /package/dist/{setup → command/setup/terminal}/listeners.d.ts +0 -0
- /package/dist/{setup → command/setup/terminal}/listeners.js +0 -0
- /package/dist/{setup → command/setup/terminal}/transcripts.d.ts +0 -0
- /package/dist/{setup → command/setup/terminal}/transcripts.js +0 -0
- /package/dist/{setup → command/setup/terminal}/wait-progress.d.ts +0 -0
- /package/dist/{setup → command/setup/terminal}/wait-progress.js +0 -0
- /package/dist/{update → command/update}/nudge-credit.d.ts +0 -0
- /package/dist/{update → command/update}/update-checker.d.ts +0 -0
- /package/dist/{version → command/version/identity}/server-version.d.ts +0 -0
- /package/dist/{version → command/version}/peer-announce.d.ts +0 -0
- /package/dist/{version → command/version}/sdk-fix.d.ts +0 -0
- /package/dist/{version → command/version}/version-nudge.d.ts +0 -0
- /package/dist/{crawl → features/crawl}/crawl-empty.d.ts +0 -0
- /package/dist/{crawl → features/crawl}/crawl-empty.js +0 -0
- /package/dist/{ee → features/ee}/audit-log.d.ts +0 -0
- /package/dist/{visual → features/visual}/capture-cleanup.d.ts +0 -0
- /package/dist/{visual → features/visual}/capture-cleanup.js +0 -0
- /package/dist/{visual → features/visual}/visual-diff.d.ts +0 -0
- /package/dist/{visual → features/visual}/visual-diff.js +0 -0
- /package/dist/{capsule → judgement/capsule}/divergence.js +0 -0
- /package/dist/{capsule → judgement/capsule}/minimize.d.ts +0 -0
- /package/dist/{capsule → judgement/capsule}/minimize.js +0 -0
- /package/dist/{domain → judgement/domain}/domain-model.d.ts +0 -0
- /package/dist/{domain → judgement/domain}/flow-risk.d.ts +0 -0
- /package/dist/{hunt → judgement/hunt}/hunt-report.d.ts +0 -0
- /package/dist/{hunt → judgement/hunt}/hunt-report.js +0 -0
- /package/dist/{oracles → judgement/oracles}/flow-instrument-gaps.d.ts +0 -0
- /package/dist/{oracles → judgement/oracles}/flow-instrument-gaps.js +0 -0
- /package/dist/{oracles → judgement/oracles}/self-instrument.d.ts +0 -0
- /package/dist/{oracles → judgement/oracles}/self-instrument.js +0 -0
- /package/dist/{flows → judgement/outcome}/assertion-integrity.d.ts +0 -0
- /package/dist/{flows → judgement/outcome}/assertion-integrity.js +0 -0
- /package/dist/{flows → judgement/outcome}/attributed-failure.d.ts +0 -0
- /package/dist/{flows → judgement/outcome}/attributed-failure.js +0 -0
- /package/dist/{flows → judgement/outcome}/role-drift-reason.d.ts +0 -0
- /package/dist/{flows → judgement/outcome}/role-drift-reason.js +0 -0
- /package/dist/{flows → judgement/outcome}/verify-change-verdict.d.ts +0 -0
- /package/dist/{flows → judgement/outcome}/verify-change-verdict.js +0 -0
- /package/dist/{phenomena → judgement/phenomena}/phenomena.d.ts +0 -0
- /package/dist/{phenomena → judgement/phenomena}/phenomena.js +0 -0
- /package/dist/{runs → judgement/runs/artifact}/profile-redact.d.ts +0 -0
- /package/dist/{runs → judgement/runs/artifact}/profile-redact.js +0 -0
- /package/dist/{runs → judgement/runs/artifact}/render-report.d.ts +0 -0
- /package/dist/{runs → judgement/runs/artifact}/replay-mapping.d.ts +0 -0
- /package/dist/{runs → judgement/runs/artifact}/run-context.d.ts +0 -0
- /package/dist/{runs → judgement/runs/artifact}/run-context.js +0 -0
- /package/dist/{runs → judgement/runs/artifact}/run-diff.d.ts +0 -0
- /package/dist/{runs → judgement/runs/artifact}/run-diff.js +0 -0
- /package/dist/{runs → judgement/runs}/repair-prompt.d.ts +0 -0
- /package/dist/{runs → judgement/runs}/repair-prompt.js +0 -0
- /package/dist/{runs → judgement/runs}/risk-classify.d.ts +0 -0
- /package/dist/{runs → judgement/runs}/risk-classify.js +0 -0
- /package/dist/{runs → judgement/runs}/verify-http.d.ts +0 -0
- /package/dist/{runs → judgement/runs}/verify-http.js +0 -0
- /package/dist/{runs → judgement/runs}/verify-server.d.ts +0 -0
- /package/dist/{runs → judgement/runs}/verify-server.js +0 -0
- /package/dist/{flows → language/flows/annotate-notes}/annotate-target.d.ts +0 -0
- /package/dist/{flows → language/flows/annotate-notes}/annotate-target.js +0 -0
- /package/dist/{flows → language/flows/annotate-notes}/annotate.d.ts +0 -0
- /package/dist/{flows → language/flows/annotate-notes}/annotate.js +0 -0
- /package/dist/{flows → language/flows}/buddy-status.d.ts +0 -0
- /package/dist/{flows → language/flows}/buddy-status.js +0 -0
- /package/dist/{flows → language/flows/change}/gate.d.ts +0 -0
- /package/dist/{flows → language/flows/change}/git-changed.d.ts +0 -0
- /package/dist/{flows → language/flows/change}/git-changed.js +0 -0
- /package/dist/{flows → language/flows/change}/watch-batcher.d.ts +0 -0
- /package/dist/{flows → language/flows/change}/watch-batcher.js +0 -0
- /package/dist/{flows → language/flows}/empty-flow.d.ts +0 -0
- /package/dist/{flows → language/flows}/flow-memory-consult.d.ts +0 -0
- /package/dist/{flows → language/flows}/flow-memory-consult.js +0 -0
- /package/dist/{flows → language/flows}/flow-report.d.ts +0 -0
- /package/dist/{flows → language/flows}/flow-report.js +0 -0
- /package/dist/{flows → language/flows}/flow-scope.d.ts +0 -0
- /package/dist/{flows → language/flows}/flow-scope.js +0 -0
- /package/dist/{flows → language/flows}/flow-store-for-session.js +0 -0
- /package/dist/{flows → language/flows}/heal.d.ts +0 -0
- /package/dist/{flows → language/flows/recording}/flake.js +0 -0
- /package/dist/{flows → language/flows/recording}/recording-backtrack.d.ts +0 -0
- /package/dist/{flows → language/flows/recording}/replay-halt.d.ts +0 -0
- /package/dist/{flows → language/flows/recording}/replay-halt.js +0 -0
- /package/dist/{flows → language/flows}/role-anchor-nearest.d.ts +0 -0
- /package/dist/{flows → language/flows/stores}/annotation-store.d.ts +0 -0
- /package/dist/{flows → language/flows/stores}/annotation-store.js +0 -0
- /package/dist/{flows → language/flows/suite}/coverage.d.ts +0 -0
- /package/dist/{flows → language/flows/suite}/coverage.js +0 -0
- /package/dist/{flows → language/flows/suite}/parallel-suite.d.ts +0 -0
- /package/dist/{flows → language/flows/suite}/parallel-suite.js +0 -0
- /package/dist/{platform.d.ts → machine/platform.d.ts} +0 -0
- /package/dist/{platform.js → machine/platform.js} +0 -0
- /package/dist/{temp-dir.d.ts → machine/temp-dir.d.ts} +0 -0
- /package/dist/{temp-dir.js → machine/temp-dir.js} +0 -0
- /package/dist/{cloud → memory/cloud}/sync-disk.d.ts +0 -0
- /package/dist/{cloud → memory/cloud}/sync-hash.d.ts +0 -0
- /package/dist/{cloud → memory/cloud}/sync-hash.js +0 -0
- /package/dist/{journal → memory/journal}/deviation-report.d.ts +0 -0
- /package/dist/{journal → memory/journal}/deviation-report.js +0 -0
- /package/dist/{journal → memory/journal}/deviation-service.d.ts +0 -0
- /package/dist/{journal → memory/journal}/deviation-service.js +0 -0
- /package/dist/{journal → memory/journal}/envelope.js +0 -0
- /package/dist/{journal → memory/journal}/rollups.d.ts +0 -0
- /package/dist/{journal → memory/journal}/rollups.js +0 -0
- /package/dist/{project → memory/project}/baselines.d.ts +0 -0
- /package/dist/{project → memory/project}/baselines.js +0 -0
- /package/dist/{project → memory/project}/file-lock.d.ts +0 -0
- /package/dist/{project → memory/project}/file-lock.js +0 -0
- /package/dist/{project → memory/project}/memory-fs.js +0 -0
- /package/dist/{session → memory/recall}/looks-like-dev-server.d.ts +0 -0
- /package/dist/{session → memory/recall}/looks-like-dev-server.js +0 -0
- /package/dist/memory/{project-memory.js → recall/project-memory.js} +0 -0
- /package/dist/{session → memory/recall}/registered-projects.d.ts +0 -0
- /package/dist/{session → memory/recall}/registered-projects.js +0 -0
- /package/dist/{bridge → portal/bridge}/pairing-token.d.ts +0 -0
- /package/dist/{bridge → portal/bridge}/pairing-token.js +0 -0
- /package/dist/{bridge → portal/bridge}/protocol-skew.d.ts +0 -0
- /package/dist/{bridge → portal/bridge}/protocol-skew.js +0 -0
- /package/dist/{bridge → portal/bridge}/token-auth.d.ts +0 -0
- /package/dist/{bridge → portal/bridge}/token-auth.js +0 -0
- /package/dist/{input → portal/input}/driven-redaction.d.ts +0 -0
- /package/dist/{input → portal/input}/driven-redaction.js +0 -0
- /package/dist/{input → portal/input}/network-mock.d.ts +0 -0
- /package/dist/{input → portal/input}/scroll-find.d.ts +0 -0
- /package/dist/{pool → portal/pool}/lease-reaper.d.ts +0 -0
- /package/dist/{pool → portal/pool}/playwright-launcher.d.ts +0 -0
- /package/dist/{pool → portal/pool}/storage-seed.js +0 -0
- /package/dist/{session → portal/session}/control-envelope.d.ts +0 -0
- /package/dist/{session → portal/session}/control-envelope.js +0 -0
- /package/dist/{session → portal/session/dev-server}/dev-command.d.ts +0 -0
- /package/dist/{session → portal/session/dev-server}/dev-command.js +0 -0
- /package/dist/{session → portal/session/dev-server}/dev-server-probe.d.ts +0 -0
- /package/dist/{session → portal/session/facts}/ref-provenance.d.ts +0 -0
- /package/dist/{session → portal/session/facts}/ref-provenance.js +0 -0
- /package/dist/{session → portal/session}/fake-session.d.ts +0 -0
- /package/dist/{session → portal/session}/fake-session.js +0 -0
- /package/dist/{session → portal/session/human}/live-control.d.ts +0 -0
- /package/dist/{session → portal/session/human}/live-control.js +0 -0
- /package/dist/{session → portal/session/human}/presenter-args.d.ts +0 -0
- /package/dist/{session → portal/session/human}/presenter-args.js +0 -0
- /package/dist/{session → portal/session/human}/review-store.d.ts +0 -0
- /package/dist/{session → portal/session/human}/review-store.js +0 -0
- /package/dist/{session → portal/session}/last-act.d.ts +0 -0
- /package/dist/{session → portal/session}/last-act.js +0 -0
- /package/dist/{session → portal/session}/lease-visibility.d.ts +0 -0
- /package/dist/{session → portal/session}/lease-visibility.js +0 -0
- /package/dist/{session → portal/session}/no-session-watch.d.ts +0 -0
- /package/dist/{session → portal/session/page-commands}/pending-commands.d.ts +0 -0
- /package/dist/{session → portal/session/page-commands}/pending-commands.js +0 -0
- /package/dist/{session → portal/session/presence}/attachment-history.d.ts +0 -0
- /package/dist/{session → portal/session/presence}/attachment-history.js +0 -0
- /package/dist/{session → portal/session/presence}/lease-availability.d.ts +0 -0
- /package/dist/{session → portal/session/presence}/lease-availability.js +0 -0
- /package/dist/{session → portal/session/presence}/session-lease.d.ts +0 -0
- /package/dist/{session → portal/session/presence}/session-lease.js +0 -0
- /package/dist/{session → portal/session/presence}/session-mirror.d.ts +0 -0
- /package/dist/{session → portal/session/presence}/session-mirror.js +0 -0
- /package/dist/{session → portal/session/presence}/session-recommendation.d.ts +0 -0
- /package/dist/{session → portal/session}/session-info.d.ts +0 -0
- /package/dist/{session → portal/session}/session-info.js +0 -0
- /package/dist/{session → portal/session}/session-reconnect.d.ts +0 -0
- /package/dist/{session → portal/session}/session-reconnect.js +0 -0
- /package/dist/{session → portal/session}/session-successor.d.ts +0 -0
- /package/dist/{session → portal/session}/session-successor.js +0 -0
- /package/dist/{session → portal/session}/stall-clock.d.ts +0 -0
- /package/dist/{session → portal/session}/state-select.d.ts +0 -0
- /package/dist/{session → portal/session}/state-select.js +0 -0
- /package/dist/{session → portal/session/timing}/resolve-within.d.ts +0 -0
- /package/dist/{session → portal/session/timing}/resolve-within.js +0 -0
- /package/dist/{session → portal/session/timing}/wall-clock.d.ts +0 -0
- /package/dist/{session → portal/session/timing}/wall-clock.js +0 -0
- /package/dist/{loopback-agent.d.ts → surface/loopback-agent.d.ts} +0 -0
- /package/dist/{loopback-agent.js → surface/loopback-agent.js} +0 -0
- /package/dist/{mcp → surface/mcp}/attach-memory.d.ts +0 -0
- /package/dist/{mcp → surface/mcp}/attach-memory.js +0 -0
- /package/dist/{mcp → surface/mcp/peer}/client-identity.d.ts +0 -0
- /package/dist/{mcp → surface/mcp/peer}/client-identity.js +0 -0
- /package/dist/{mcp → surface/mcp/proxy}/mcp-post-transport.d.ts +0 -0
- /package/dist/{mcp → surface/mcp/proxy}/proxy-backoff.d.ts +0 -0
- /package/dist/{mcp → surface/mcp/proxy}/proxy-backoff.js +0 -0
- /package/dist/{mcp → surface/mcp/proxy}/proxy-handshake.d.ts +0 -0
- /package/dist/{mcp → surface/mcp}/proxy-idle-exit.d.ts +0 -0
- /package/dist/{mcp → surface/mcp}/proxy-idle-exit.js +0 -0
- /package/dist/{mcp → surface/mcp}/shared-params.d.ts +0 -0
- /package/dist/{mcp → surface/mcp}/shared-params.js +0 -0
- /package/dist/{mcp → surface/mcp}/sse-frame-parser.d.ts +0 -0
- /package/dist/{mcp → surface/mcp}/sse-frame-parser.js +0 -0
- /package/dist/{tools → surface/tools/act}/act-danger.d.ts +0 -0
- /package/dist/{tools → surface/tools/act}/act-sequence-retry.d.ts +0 -0
- /package/dist/{tools → surface/tools/act}/act-sequence-retry.js +0 -0
- /package/dist/{tools → surface/tools/act}/act-view.d.ts +0 -0
- /package/dist/{tools → surface/tools/act}/act-view.js +0 -0
- /package/dist/{tools → surface/tools/act/navigation}/navigate-arrival.js +0 -0
- /package/dist/{tools → surface/tools/act/navigation}/navigate-result.d.ts +0 -0
- /package/dist/{tools → surface/tools/act/navigation}/navigate-result.js +0 -0
- /package/dist/{tools → surface/tools/act/navigation}/reload-result.d.ts +0 -0
- /package/dist/{tools → surface/tools/act/navigation}/reload-result.js +0 -0
- /package/dist/{tools → surface/tools/act}/react-grace.d.ts +0 -0
- /package/dist/{tools → surface/tools/act}/react-grace.js +0 -0
- /package/dist/{tools → surface/tools/act}/resolve-target.d.ts +0 -0
- /package/dist/{tools → surface/tools/act}/settle-in-flight.d.ts +0 -0
- /package/dist/{tools → surface/tools/act}/settle-in-flight.js +0 -0
- /package/dist/{tools → surface/tools}/act-sequence-tool.d.ts +0 -0
- /package/dist/{tools → surface/tools/args}/alias-args.d.ts +0 -0
- /package/dist/{tools → surface/tools/args}/alias-args.js +0 -0
- /package/dist/{tools → surface/tools/gaps}/coverage-identity.d.ts +0 -0
- /package/dist/{tools → surface/tools/gaps}/coverage-identity.js +0 -0
- /package/dist/{tools → surface/tools/gaps}/observed-nothing.d.ts +0 -0
- /package/dist/{tools → surface/tools/gaps}/observed-nothing.js +0 -0
- /package/dist/{tools → surface/tools/gaps}/sdk-marker-probe.d.ts +0 -0
- /package/dist/{tools → surface/tools/gaps}/sdk-marker-probe.js +0 -0
- /package/dist/{tools → surface/tools}/observe-tools.d.ts +0 -0
- /package/dist/{tools → surface/tools/read}/complete-snapshot.d.ts +0 -0
- /package/dist/{tools → surface/tools/read}/complete-snapshot.js +0 -0
- /package/dist/{tools → surface/tools/read}/query-paginate.d.ts +0 -0
- /package/dist/{tools → surface/tools/read}/query-paginate.js +0 -0
- /package/dist/{tools → surface/tools/read}/query-shape.d.ts +0 -0
- /package/dist/{tools → surface/tools/read}/query-shape.js +0 -0
- /package/dist/{tools → surface/tools}/read-tools.d.ts +0 -0
- /package/dist/{tools → surface/tools}/reconcile-tools.d.ts +0 -0
- /package/dist/{honesty → surface/tools}/tool-hit-rate.d.ts +0 -0
- /package/dist/{tools → surface/tools}/tool-invoker.d.ts +0 -0
- /package/dist/{tools → surface/tools}/tool-invoker.js +0 -0
- /package/dist/{tools → surface/tools}/unadvertised-help.d.ts +0 -0
- /package/dist/{tools → surface/tools}/verify-next-baton.d.ts +0 -0
- /package/docs/{tools-session-and-feedback.mdx → tools/session-and-feedback.mdx} +0 -0
- /package/docs/{tools-tools-and-run.mdx → tools/tools-and-run.mdx} +0 -0
|
@@ -1,718 +0,0 @@
|
|
|
1
|
-
import { ContradictionKind, EventType, MUTATING_METHODS, isDevToolingUrl, isSameDocument, isThirdPartyUrl, isSameEditEpoch, urlForMatch, } from '@reticlehq/core';
|
|
2
|
-
import { describeSuperseded } from './observed-in-window.js';
|
|
3
|
-
import { findStaleResponses } from './stale-response.js';
|
|
4
|
-
import { findBodyFailures } from './body-failures.js';
|
|
5
|
-
import { findEchoMismatches } from './echo-mismatch.js';
|
|
6
|
-
import { findUnitMismatches } from './unit-mismatch.js';
|
|
7
|
-
import { asNumber, asString } from '../tools/tools-helpers.js';
|
|
8
|
-
import { matchesDeclaredFailure } from './declared.js';
|
|
9
|
-
import { runRegisteredFolds } from './contradiction-folds.js';
|
|
10
|
-
function netCall(e) {
|
|
11
|
-
const status = asNumber(e.data['status']);
|
|
12
|
-
return {
|
|
13
|
-
method: (asString(e.data['method']) ?? '').toUpperCase(),
|
|
14
|
-
url: asString(e.data['url']) ?? '',
|
|
15
|
-
matchUrl: urlForMatch(e.data),
|
|
16
|
-
status,
|
|
17
|
-
// `ok` is authoritative when present (IPC sets it explicitly); status is the HTTP fallback.
|
|
18
|
-
// Neither present = no verdict was ever reported, which stays undefined all the way through.
|
|
19
|
-
ok: e.data['ok'] === undefined && status === undefined
|
|
20
|
-
? undefined
|
|
21
|
-
: true === e.data['ok'] || (e.data['ok'] === undefined && (status ?? 0) < 400),
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* The failed calls that a LATER successful call to the same endpoint replaced.
|
|
26
|
-
*
|
|
27
|
-
* Identity, not index: each `netCall` is a fresh object held by `settled`, and `settled` is built
|
|
28
|
-
* from events in sequence order, so "later" is simply "further along the array". Compared on
|
|
29
|
-
* `matchUrl` so a cache-buster or a changing query token cannot make a retry look like a different
|
|
30
|
-
* call — the same normalisation every other url comparison here uses.
|
|
31
|
-
*/
|
|
32
|
-
function recoveredByRetry(settled) {
|
|
33
|
-
const out = new Set();
|
|
34
|
-
for (let i = 0; i < settled.length; i += 1) {
|
|
35
|
-
const call = settled[i];
|
|
36
|
-
if (call === undefined || false !== call.ok)
|
|
37
|
-
continue;
|
|
38
|
-
for (let j = i + 1; j < settled.length; j += 1) {
|
|
39
|
-
const later = settled[j];
|
|
40
|
-
if (later === undefined)
|
|
41
|
-
continue;
|
|
42
|
-
if (true === later.ok && later.method === call.method && later.matchUrl === call.matchUrl) {
|
|
43
|
-
out.add(call);
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return out;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Did the user-visible application state move forward? DOM, store and route only — deliberately NOT
|
|
52
|
-
* network, animation or signal. The question every rule below asks is "did the app act as if it
|
|
53
|
-
* succeeded", and a request firing is not the app acting as if anything.
|
|
54
|
-
*/
|
|
55
|
-
function uiAdvanced(events) {
|
|
56
|
-
return events.some((e) => e.type === EventType.DOM_ADDED ||
|
|
57
|
-
e.type === EventType.DOM_REMOVED ||
|
|
58
|
-
e.type === EventType.DOM_ATTR ||
|
|
59
|
-
e.type === EventType.DOM_TEXT ||
|
|
60
|
-
e.type === EventType.STATE_CHANGE ||
|
|
61
|
-
e.type === EventType.ROUTE_CHANGE);
|
|
62
|
-
}
|
|
63
|
-
function isMutating(call) {
|
|
64
|
-
return MUTATING_METHODS.includes(call.method);
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* State paths/values that read as the app recording a failure rather than hiding one.
|
|
68
|
-
*
|
|
69
|
-
* English-only, and knowingly so — this is the softest edge in the file. It is a fallback for when
|
|
70
|
-
* the structural check below cannot decide, not the primary signal.
|
|
71
|
-
*/
|
|
72
|
-
const ACKNOWLEDGED = /error|fail|invalid|reject|denied|unable|could not|couldn't/i;
|
|
73
|
-
/**
|
|
74
|
-
* Below this length an error string is too generic to be evidence — "no", "err", a bare code — and
|
|
75
|
-
* could coincide with unrelated state text.
|
|
76
|
-
*/
|
|
77
|
-
const MIN_ECHOED_ERROR_LENGTH = 8;
|
|
78
|
-
/**
|
|
79
|
-
* Wording that blames the USER — bad credentials, no permission, wrong input. Distinct from
|
|
80
|
-
* ACKNOWLEDGED, which merely means "a failure was recorded": an app can honestly report a failure
|
|
81
|
-
* ("server error, try again") without misattributing it.
|
|
82
|
-
*/
|
|
83
|
-
const BLAMES_USER = /denied|invalid|unauthor|forbidden|incorrect|wrong |not allowed|not permitted/i;
|
|
84
|
-
/** A server-fault status: the user cannot fix it and should never be asked to. */
|
|
85
|
-
const SERVER_FAULT_MIN = 500;
|
|
86
|
-
/**
|
|
87
|
-
* Did the app record the failure in its OWN state — the layer the UI renders from?
|
|
88
|
-
*
|
|
89
|
-
* Without this, "the UI moved while a request failed" fires on correct code: a handler that catches
|
|
90
|
-
* the rejection and renders "could not add" also moves the UI. Both look identical at the level of
|
|
91
|
-
* "DOM changed + request failed"; what separates them is whether the app acknowledged the failure
|
|
92
|
-
* anywhere, or silently proceeded as if it had succeeded.
|
|
93
|
-
*
|
|
94
|
-
* Deliberately NOT satisfied by a console error. `console.error` is invisible to the user, so an app
|
|
95
|
-
* that logs and then shows success is still lying to whoever is looking at it — precisely the case
|
|
96
|
-
* worth reporting.
|
|
97
|
-
*
|
|
98
|
-
* A heuristic, and the one soft edge in this file: an app that surfaces failure through a value this
|
|
99
|
-
* pattern does not recognize will produce a finding a human must dismiss. That direction is the safe
|
|
100
|
-
* one — a false alarm costs a glance, a missed false green ships.
|
|
101
|
-
*/
|
|
102
|
-
function failureAcknowledged(events) {
|
|
103
|
-
// STRUCTURAL first, and language-independent: if the app put the failed call's OWN error text into
|
|
104
|
-
// its state, it plainly knows the call failed — whatever language it says so in. The lexical
|
|
105
|
-
// patterns below are English-only, so without this a German or Japanese app that surfaces its
|
|
106
|
-
// failure perfectly well would be reported as hiding it.
|
|
107
|
-
const errors = events
|
|
108
|
-
.filter((e) => e.type === EventType.NET_REQUEST && e.data['ok'] !== true)
|
|
109
|
-
.map((e) => asString(e.data['error']))
|
|
110
|
-
.filter((text) => text !== undefined && text.length >= MIN_ECHOED_ERROR_LENGTH);
|
|
111
|
-
const echoesAnError = events.some((e) => {
|
|
112
|
-
if (e.type !== EventType.STATE_CHANGE)
|
|
113
|
-
return false;
|
|
114
|
-
const value = asString(e.data['value']);
|
|
115
|
-
return value !== undefined && errors.some((text) => value.includes(text));
|
|
116
|
-
});
|
|
117
|
-
if (echoesAnError)
|
|
118
|
-
return true;
|
|
119
|
-
return events.some((e) => {
|
|
120
|
-
// A failure-shaped SIGNAL is an acknowledgement too. An app that fires `auth:denied` has plainly
|
|
121
|
-
// not proceeded as if it succeeded, whatever its state paths happen to be named.
|
|
122
|
-
if (e.type === EventType.SIGNAL)
|
|
123
|
-
return ACKNOWLEDGED.test(asString(e.data['name']) ?? '');
|
|
124
|
-
if (e.type !== EventType.STATE_CHANGE)
|
|
125
|
-
return false;
|
|
126
|
-
const path = asString(e.data['path']) ?? '';
|
|
127
|
-
const value = e.data['value'];
|
|
128
|
-
return ACKNOWLEDGED.test(path) || ('string' === typeof value && ACKNOWLEDGED.test(value));
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
function describe(call) {
|
|
132
|
-
return `${call.method} ${call.url}${call.status === undefined ? '' : ` → ${String(call.status)}`}`;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Actions that are SUPPOSED to make something happen, so producing nothing is a finding.
|
|
136
|
-
*
|
|
137
|
-
* Deliberately narrow. `hover`, `focus` and `scrollIntoView` can legitimately move nothing, and
|
|
138
|
-
* `fill`/`type` change an input's value without necessarily mutating the DOM tree — flagging those
|
|
139
|
-
* would manufacture noise, which is the failure mode opposite to a false green and just as bad.
|
|
140
|
-
*/
|
|
141
|
-
const MUST_DO_SOMETHING = new Set(['click', 'dblclick', 'submit']);
|
|
142
|
-
/**
|
|
143
|
-
* Whether NOTHING in this window is attributable to the action.
|
|
144
|
-
*
|
|
145
|
-
* Ambient churn is deliberately not counted as evidence the action worked — a background event
|
|
146
|
-
* stream, a polling store, a perf sample and a scroll position all move on their own. What counts:
|
|
147
|
-
*
|
|
148
|
-
* - a mutation inside the target's own subtree (what the target itself did),
|
|
149
|
-
* - a request (the action asked the server for something),
|
|
150
|
-
* - a navigation, or a dialog/live region appearing — the two ways a real reaction legitimately
|
|
151
|
-
* lands OUTSIDE the target, e.g. a modal portalled to the body.
|
|
152
|
-
*
|
|
153
|
-
* The last clause is what keeps this from manufacturing noise: a button that opens a modal mutates
|
|
154
|
-
* nothing within itself, and must not be called dead.
|
|
155
|
-
*/
|
|
156
|
-
function didNothing(events, requests, mutatedWithin) {
|
|
157
|
-
if (mutatedWithin === undefined)
|
|
158
|
-
return 0 === events.length;
|
|
159
|
-
if (mutatedWithin > 0 || requests.length > 0)
|
|
160
|
-
return false;
|
|
161
|
-
return !events.some((e) => e.type === EventType.ROUTE_CHANGE || e.type === EventType.VISIBLE_SHOWN);
|
|
162
|
-
}
|
|
163
|
-
/** Net-shaped events — the only ones that carry a URL a dev-tooling channel could occupy. */
|
|
164
|
-
const NET_TYPES = new Set([
|
|
165
|
-
EventType.NET_PENDING,
|
|
166
|
-
EventType.NET_REQUEST,
|
|
167
|
-
EventType.NET_STREAM,
|
|
168
|
-
]);
|
|
169
|
-
/**
|
|
170
|
-
* Hash-router paths put the route in the fragment (`#/settings`, `#!/home`). An in-page skip link
|
|
171
|
-
* does not (`#main-content`, `#`, empty). The blank-destination rule must still see the former.
|
|
172
|
-
*/
|
|
173
|
-
function isInPageFragment(hash) {
|
|
174
|
-
if ('' === hash || '#' === hash)
|
|
175
|
-
return true;
|
|
176
|
-
const body = hash.startsWith('#') ? hash.slice(1) : hash;
|
|
177
|
-
return !body.startsWith('/') && !body.startsWith('!');
|
|
178
|
-
}
|
|
179
|
-
function hrefAsUrl(value) {
|
|
180
|
-
if (value === undefined || '' === value)
|
|
181
|
-
return undefined;
|
|
182
|
-
try {
|
|
183
|
-
return new URL(value);
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
return undefined;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Same origin + pathname + search, different in-page fragment — a skip link, not a new view.
|
|
191
|
-
*
|
|
192
|
-
* Returns false when `from`/`to` are missing, so older events without hrefs keep the existing rule.
|
|
193
|
-
*/
|
|
194
|
-
function isSameDocumentHashAnchor(event) {
|
|
195
|
-
if (event.type !== EventType.ROUTE_CHANGE)
|
|
196
|
-
return false;
|
|
197
|
-
const from = hrefAsUrl(asString(event.data['from']));
|
|
198
|
-
const to = hrefAsUrl(asString(event.data['to']));
|
|
199
|
-
if (from === undefined || to === undefined)
|
|
200
|
-
return false;
|
|
201
|
-
if (from.origin !== to.origin || from.pathname !== to.pathname || from.search !== to.search) {
|
|
202
|
-
return false;
|
|
203
|
-
}
|
|
204
|
-
if (from.hash === to.hash)
|
|
205
|
-
return false;
|
|
206
|
-
return isInPageFragment(to.hash);
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Split the window into the app's traffic and the dev toolchain's own (see `DevToolingChannel`).
|
|
210
|
-
*
|
|
211
|
-
* NOTHING below may judge the toolchain. Reported from a real drive: a correct Next.js navigation
|
|
212
|
-
* graded `verified: "no"` because the dev overlay was resolving a source map for an unrelated React
|
|
213
|
-
* key warning, and that in-flight `POST /__nextjs_original-stack-frames` read as "the UI advanced
|
|
214
|
-
* over a request that never settled". Every app that logs one dev warning got a false negative on
|
|
215
|
-
* every action. The overlay's own 404s and duplicate fetches are the same story on other checks,
|
|
216
|
-
* which is why the split happens ONCE here rather than in the one check that reported it.
|
|
217
|
-
*/
|
|
218
|
-
function splitForeignTraffic(events, appOrigin) {
|
|
219
|
-
const ignored = [];
|
|
220
|
-
const app = events.filter((e) => {
|
|
221
|
-
if (!NET_TYPES.has(e.type))
|
|
222
|
-
return true;
|
|
223
|
-
const url = asString(e.data['url']);
|
|
224
|
-
// Somebody else's code, twice over: the toolchain's own channel, and any site that is not the
|
|
225
|
-
// app under test. Neither can answer the question every rule below asks.
|
|
226
|
-
if (!isDevToolingUrl(url) && !isThirdPartyUrl(url, appOrigin))
|
|
227
|
-
return true;
|
|
228
|
-
if (url !== undefined && !ignored.includes(url))
|
|
229
|
-
ignored.push(url);
|
|
230
|
-
return false;
|
|
231
|
-
});
|
|
232
|
-
return { app, ignored };
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Cross-channel contradictions in this window, with the edit-epoch caveat attached when it applies.
|
|
236
|
-
*
|
|
237
|
-
* Cross-epoch evidence is LABELLED rather than excluded, which is the opposite of what the document
|
|
238
|
-
* scoping does, and the difference is the point. A navigation is total — it throws away the page,
|
|
239
|
-
* the refs, the in-flight requests and the state — so nothing recorded before it is still about the
|
|
240
|
-
* world, and dropping it is the only honest option. A hot update is not: most modules, most of the
|
|
241
|
-
* DOM, the whole network log and every console line survive one, so most of what was observed a
|
|
242
|
-
* second before an edit is still true a second after. Excluding it would empty windows that hold
|
|
243
|
-
* real findings, and an emptied window reads as "nothing happened" — which is the more expensive of
|
|
244
|
-
* the two wrong answers and the one this whole family of checks exists to prevent.
|
|
245
|
-
*
|
|
246
|
-
* So the findings stand and the caveat is said out loud, and only when it is unambiguous: EVERY
|
|
247
|
-
* observation in the window predates the edit. One post-edit observation and the agent is already
|
|
248
|
-
* looking at the code it wrote, so the label would be noise.
|
|
249
|
-
*/
|
|
250
|
-
/**
|
|
251
|
-
* Below this, repeated writes are a BURST, whatever their spacing.
|
|
252
|
-
*
|
|
253
|
-
* A double submit is two clicks, or one click and a re-render: milliseconds apart. Nothing a human
|
|
254
|
-
* or a StrictMode remount does lands on a quarter-second grid, so this is the floor under which
|
|
255
|
-
* regularity means nothing.
|
|
256
|
-
*/
|
|
257
|
-
const POLL_MIN_INTERVAL_MS = 250;
|
|
258
|
-
/**
|
|
259
|
-
* How far a gap may sit from the median and still count as the same cadence.
|
|
260
|
-
*
|
|
261
|
-
* Loose on purpose: a real poll drifts under load, and a `setInterval` competing with a busy main
|
|
262
|
-
* thread is not metronomic. Tight enough that a burst followed by a late retry — the shape a double
|
|
263
|
-
* submit plus a user's second attempt makes — is not read as a rhythm.
|
|
264
|
-
*/
|
|
265
|
-
const POLL_JITTER_RATIO = 0.4;
|
|
266
|
-
/**
|
|
267
|
-
* Is this the same write on a steady interval, rather than the same write twice?
|
|
268
|
-
*
|
|
269
|
-
* THREE samples minimum, and that is the load-bearing part: two writes give one gap, and a single
|
|
270
|
-
* gap cannot distinguish a cadence from a coincidence. Two writes stay a duplicate however far
|
|
271
|
-
* apart they are, which is the classic double submit and every case this rule was written for.
|
|
272
|
-
*/
|
|
273
|
-
function isSteadyCadence(times) {
|
|
274
|
-
if (times.length < 3)
|
|
275
|
-
return false;
|
|
276
|
-
const ordered = [...times].sort((a, b) => a - b);
|
|
277
|
-
const gaps = [];
|
|
278
|
-
for (let i = 1; i < ordered.length; i += 1)
|
|
279
|
-
gaps.push((ordered[i] ?? 0) - (ordered[i - 1] ?? 0));
|
|
280
|
-
const sorted = [...gaps].sort((a, b) => a - b);
|
|
281
|
-
const median = sorted[Math.floor(sorted.length / 2)] ?? 0;
|
|
282
|
-
if (median < POLL_MIN_INTERVAL_MS)
|
|
283
|
-
return false;
|
|
284
|
-
return gaps.every((gap) => Math.abs(gap - median) <= median * POLL_JITTER_RATIO);
|
|
285
|
-
}
|
|
286
|
-
export function findContradictions(allEvents, options = {}) {
|
|
287
|
-
const found = findWindowContradictions(allEvents, options);
|
|
288
|
-
const predates = allEvents.length > 0 &&
|
|
289
|
-
allEvents.every((e) => !isSameEditEpoch(e.editEpoch, options.currentEditEpoch));
|
|
290
|
-
if (!predates)
|
|
291
|
-
return found;
|
|
292
|
-
// Prepended, not appended: the caveat governs how everything under it should be read, and it has
|
|
293
|
-
// to survive the rules that return early with a single finding of their own.
|
|
294
|
-
return [
|
|
295
|
-
{
|
|
296
|
-
kind: ContradictionKind.EVIDENCE_PREDATES_EDIT,
|
|
297
|
-
claim: 'these observations describe the code as it is now',
|
|
298
|
-
counter: 'every one of them was recorded before the last hot update landed in the page',
|
|
299
|
-
detail: 'the source changed and the page re-rendered after this evidence was captured, so it describes code that has since been replaced — nothing here is necessarily wrong, but nothing here has seen the edit either. Drive the app again to verify the current code',
|
|
300
|
-
},
|
|
301
|
-
...found,
|
|
302
|
-
];
|
|
303
|
-
}
|
|
304
|
-
function findWindowContradictions(allEvents, options) {
|
|
305
|
-
const found = [];
|
|
306
|
-
const { app: allApp, ignored: ignoredForeign } = splitForeignTraffic(allEvents, options.appOrigin);
|
|
307
|
-
// ── Evidence belonging to a document that has since been replaced ───────────────────────────
|
|
308
|
-
// Scoped ONCE, here, for the same reason the dev-tooling split is: every rule below asks "what
|
|
309
|
-
// else was in this window", and answering that with a dead page's traffic is a defect in all of
|
|
310
|
-
// them rather than in whichever one reported it. Applied after the dev-tooling split so the count
|
|
311
|
-
// reported below is the app's own evidence and not the toolchain's noise.
|
|
312
|
-
const scoped = allApp.filter((e) => isSameDocument(e.documentId, options.currentDocumentId));
|
|
313
|
-
const superseded = allApp.length - scoped.length;
|
|
314
|
-
// An empty window was always allowed to mean "nothing happened"; that reading is only unsafe once
|
|
315
|
-
// supersession is what emptied it. Reported ALONE and before every rule below, because a window
|
|
316
|
-
// with nothing left in it is exactly the shape `action-had-no-effect` fires on — so without this
|
|
317
|
-
// the fix would have swapped a wrong citation for a wrong accusation.
|
|
318
|
-
if (superseded > 0 && 0 === scoped.length) {
|
|
319
|
-
return [
|
|
320
|
-
{
|
|
321
|
-
kind: ContradictionKind.EVIDENCE_SUPERSEDED,
|
|
322
|
-
claim: 'this window holds observations that could answer for the action',
|
|
323
|
-
counter: describeSuperseded('observations', superseded),
|
|
324
|
-
detail: 'a full navigation or a reload built a new document, and everything recorded here belongs to the old one — citing it would name requests, errors and state that no longer describe anything on screen',
|
|
325
|
-
},
|
|
326
|
-
];
|
|
327
|
-
}
|
|
328
|
-
// ── Evidence that predates the action ───────────────────────────────────────────────────────
|
|
329
|
-
// The attribution floor, and it is scoped ONCE here for the same reason the two filters above are:
|
|
330
|
-
// a rule that reads "what else was in this window" and gets handed traffic from before the caller
|
|
331
|
-
// acted is not refining its answer, it is answering about somebody else's action. Three rules
|
|
332
|
-
// (`duplicate-request`, `signal-without-consequence`, `consequence-elsewhere`) each checked this
|
|
333
|
-
// for themselves and the other six swept the whole window — which is how an assert with no `since`
|
|
334
|
-
// came to be judged against everything that had ever happened in the tab.
|
|
335
|
-
//
|
|
336
|
-
// Undefined means nothing attributed the window to an action at all; the floor then does nothing,
|
|
337
|
-
// and the consequence rules below decline to speak instead. See `advanced`.
|
|
338
|
-
const floor = options.actionSince;
|
|
339
|
-
const events = floor === undefined ? scoped : scoped.filter((e) => e.t >= floor);
|
|
340
|
-
const settled = events.filter((e) => e.type === EventType.NET_REQUEST).map(netCall);
|
|
341
|
-
// ── Overlapping reads that settled out of order ─────────────────────────────────────────────
|
|
342
|
-
// Independent of any action, so it runs on every window: the race is a property of the timeline.
|
|
343
|
-
found.push(...findStaleResponses(events));
|
|
344
|
-
// ── A 2xx whose BODY says it failed ─────────────────────────────────────────────────────────
|
|
345
|
-
// Needs body capture; silent without it, which is why the assert path also declares when bodies
|
|
346
|
-
// were never recorded rather than letting an unread payload read as an empty one.
|
|
347
|
-
found.push(...findBodyFailures(events));
|
|
348
|
-
found.push(...findEchoMismatches(events, options.actionSince));
|
|
349
|
-
// ── A money value written back at the wrong SCALE ───────────────────────────────────────────
|
|
350
|
-
found.push(...findUnitMismatches(events, options.prior ?? []));
|
|
351
|
-
// ── The action landed on something that does not react ──────────────────────────────────────
|
|
352
|
-
// Checked first and returned alone: nothing is attributable to the action, so every rule below is
|
|
353
|
-
// reasoning about someone else's events.
|
|
354
|
-
const action = (options.action ?? '').toLowerCase();
|
|
355
|
-
if (MUST_DO_SOMETHING.has(action) && didNothing(events, settled, options.mutatedWithin)) {
|
|
356
|
-
const measured = options.mutatedWithin !== undefined;
|
|
357
|
-
return [
|
|
358
|
-
{
|
|
359
|
-
kind: ContradictionKind.ACTION_HAD_NO_EFFECT,
|
|
360
|
-
claim: `the ${action} was dispatched and the page settled`,
|
|
361
|
-
counter: measured
|
|
362
|
-
? 'nothing changed inside the target, and no request, navigation or dialog followed — whatever else moved on the page was not this'
|
|
363
|
-
: 'no channel observed anything at all — DOM, store, route, network, signal, console',
|
|
364
|
-
detail: 'the target does not react to this action (a non-interactive wrapper resolved instead of the control, a disabled handler, or a no-op) — settling proves only that the page was quiet, which a page that did nothing always is',
|
|
365
|
-
},
|
|
366
|
-
];
|
|
367
|
-
}
|
|
368
|
-
// A failure the app RECOVERED from is not evidence against anything.
|
|
369
|
-
//
|
|
370
|
-
// Reported from the field on an app whose api-client documents the pattern every token-refreshing
|
|
371
|
-
// app has: a 401 re-hydrates the session and retries once. One extraction produced a 401 and then
|
|
372
|
-
// a 200 to the same endpoint, with exactly one extraction in state, and Reticle called it two
|
|
373
|
-
// separate contradictions. Both were false, both cost calls to disprove, and a rule that
|
|
374
|
-
// manufactures reds costs more trust than a missed bug does.
|
|
375
|
-
//
|
|
376
|
-
// Structural, not a timing heuristic: what makes it a retry is that a LATER call to the same
|
|
377
|
-
// method and url SUCCEEDED. The write landed, so the UI was entitled to move and a success signal
|
|
378
|
-
// was entitled to fire. Filtered at the definition rather than at the two reading sites, because
|
|
379
|
-
// both rules make the same claim about the same evidence and a fix in one is a fix in half.
|
|
380
|
-
const recovered = recoveredByRetry(settled);
|
|
381
|
-
const failed = settled.filter((c) => false === c.ok && !recovered.has(c));
|
|
382
|
-
// The failures NOBODY declared — see ContradictionOptions.expectedFailures. Only the heuristic
|
|
383
|
-
// "the UI moved while a request failed" rule reads this; the sharp rules still read `failed`.
|
|
384
|
-
const unexpected = failed.filter((c) => !matchesDeclaredFailure(c, options.expectedFailures ?? []));
|
|
385
|
-
/**
|
|
386
|
-
* Did the UI move — and is anybody entitled to say so?
|
|
387
|
-
*
|
|
388
|
-
* `undefined` is the third answer and the point of the tri-state: "the UI moved forward while a
|
|
389
|
-
* request failed" is a claim about CAUSATION, and over a window nothing attributed to an action
|
|
390
|
-
* the two halves merely co-occurred. A passive `reticle_assert` performs nothing, so ambient
|
|
391
|
-
* traffic — a poll, a page-load bootstrap, a branding call — is not its consequence and must not
|
|
392
|
-
* decide its verdict.
|
|
393
|
-
*
|
|
394
|
-
* Typed rather than gated with a boolean so it cannot be skipped: every rule that reasons from UI
|
|
395
|
-
* movement has to answer `undefined` explicitly, including one added later. The rules that read
|
|
396
|
-
* the app's OWN claims (a success signal over a failed call) or its payloads (a 2xx whose body
|
|
397
|
-
* says it failed, a field echoed back wrong) are untouched — those are things the app said, not
|
|
398
|
-
* consequences anybody inferred, and they are true whoever caused them.
|
|
399
|
-
*/
|
|
400
|
-
const advanced = floor === undefined ? undefined : uiAdvanced(events);
|
|
401
|
-
const signals = events
|
|
402
|
-
.filter((e) => e.type === EventType.SIGNAL)
|
|
403
|
-
.map((e) => asString(e.data['name']) ?? 'signal');
|
|
404
|
-
// ── The route moved and nothing was rendered for it ─────────────────────────────────────────
|
|
405
|
-
// A navigation that neither fetches nor renders arrived nowhere. Distinct from a dead control:
|
|
406
|
-
// the control worked, the DESTINATION is empty — which is why every "did the click do something"
|
|
407
|
-
// heuristic passes it, a route change being unambiguously something.
|
|
408
|
-
const routeEvents = events.filter((e) => e.type === EventType.ROUTE_CHANGE);
|
|
409
|
-
const routed = routeEvents.length > 0;
|
|
410
|
-
// A skip link (`href="#main-content"`) is a same-document hash change. The observable
|
|
411
|
-
// consequences are location.hash, focus, and scroll — not a DOM mutation. Treating it as a
|
|
412
|
-
// blank destination made "did my skip link work" unanswerable. Hash-router paths (`#/invoices`)
|
|
413
|
-
// still go through the rule: those ARE a new view.
|
|
414
|
-
const hashAnchorOnly = routed && routeEvents.every(isSameDocumentHashAnchor);
|
|
415
|
-
// `dom.text` counts as rendered, and it has to: React reconciles a destination IN PLACE far more
|
|
416
|
-
// often than it adds nodes. Measured on three ordinary sidebar navigations of the bench app — every
|
|
417
|
-
// one emitted { dom.attr:2, dom.text:2, render.commit, state.change } and ZERO dom.added/removed,
|
|
418
|
-
// so all three were flagged as blank destinations, `verified` came back "no" on a correct green,
|
|
419
|
-
// and a bug_found was emitted for a navigation that worked.
|
|
420
|
-
//
|
|
421
|
-
// Deliberately NOT `dom.attr`: the nav link marks itself active whether or not the destination
|
|
422
|
-
// rendered, which is the true positive this rule exists for. Deliberately NOT `render.commit`
|
|
423
|
-
// either: React commits a render for a component that returns null, which is one of the very bugs
|
|
424
|
-
// named in `detail` below.
|
|
425
|
-
const rendered = events.some((e) => e.type === EventType.DOM_ADDED ||
|
|
426
|
-
e.type === EventType.DOM_REMOVED ||
|
|
427
|
-
e.type === EventType.DOM_TEXT);
|
|
428
|
-
const fetched = events.some((e) => e.type === EventType.NET_REQUEST || e.type === EventType.NET_PENDING);
|
|
429
|
-
if (routed && !hashAnchorOnly && !rendered && !fetched && true !== options.renderProved) {
|
|
430
|
-
// A console error in the SAME window turns "nothing rendered" from an absence into a positive
|
|
431
|
-
// claim: the destination did not merely fail to produce content, it crashed while trying to.
|
|
432
|
-
// Reported once as `unknown` when this held — a React hooks error and an empty destination were
|
|
433
|
-
// both in hand, and the honest, definitive answer was available and not given (#897).
|
|
434
|
-
const consoleErrors = events
|
|
435
|
-
.filter((e) => e.type === EventType.CONSOLE_ERROR)
|
|
436
|
-
.map((e) => asString(e.data['message']))
|
|
437
|
-
.filter((m) => undefined !== m && m.length > 0);
|
|
438
|
-
if (consoleErrors.length > 0) {
|
|
439
|
-
found.push({
|
|
440
|
-
kind: ContradictionKind.ROUTE_RENDERED_NOTHING_CRASHED,
|
|
441
|
-
claim: 'the app navigated to a new route',
|
|
442
|
-
counter: `nothing was rendered for it, and the console shows why: ${consoleErrors[0] ?? ''}`,
|
|
443
|
-
detail: `the URL moved but the destination produced no content, and the same window logged ` +
|
|
444
|
-
`${String(consoleErrors.length)} console error(s) — the first: "${consoleErrors[0] ?? ''}". ` +
|
|
445
|
-
'The destination crashed rather than merely rendering nothing; read the error for the ' +
|
|
446
|
-
'component and line at fault.',
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
else {
|
|
450
|
-
found.push({
|
|
451
|
-
kind: ContradictionKind.ROUTE_RENDERED_NOTHING,
|
|
452
|
-
claim: 'the app navigated to a new route',
|
|
453
|
-
counter: 'nothing was rendered for it — no content added or removed, and no request made',
|
|
454
|
-
detail: 'the URL moved but the destination produced no content: a route with no view, a view that returned null, or data the page never asked for. A control that navigates always looks alive, so this is invisible to a dead-control check. Confirm by reading the page — a view revealed from DOM that already existed emits this same window',
|
|
455
|
-
});
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
// ── The app claimed success while its own request failed ────────────────────────────────────
|
|
459
|
-
// A signal is the sharper claim: the app did not merely LOOK right, it explicitly asserted
|
|
460
|
-
// success. When both hold it is one fact, so only the sharper one is reported.
|
|
461
|
-
// ── The server faulted and the app blamed the user ──────────────────────────────────────────
|
|
462
|
-
// Checked BEFORE the success-claim rules, because it is the sharper reading of the same events:
|
|
463
|
-
// the app did not claim success, it claimed the wrong failure. Telling someone their password is
|
|
464
|
-
// wrong while the backend is down sends them to fix something they cannot fix.
|
|
465
|
-
const serverFaults = settled.filter((c) => false === c.ok && c.status !== undefined && c.status >= SERVER_FAULT_MIN);
|
|
466
|
-
const userBlame = [
|
|
467
|
-
...signals.filter((name) => BLAMES_USER.test(name)),
|
|
468
|
-
...events
|
|
469
|
-
.filter((e) => e.type === EventType.STATE_CHANGE)
|
|
470
|
-
.map((e) => asString(e.data['value']) ?? '')
|
|
471
|
-
.filter((value) => BLAMES_USER.test(value)),
|
|
472
|
-
];
|
|
473
|
-
const misattributed = serverFaults.length > 0 && userBlame.length > 0;
|
|
474
|
-
if (misattributed) {
|
|
475
|
-
found.push({
|
|
476
|
-
kind: ContradictionKind.FAILURE_MISATTRIBUTED,
|
|
477
|
-
claim: `the app told the user they were at fault (${userBlame.map((b) => `"${b}"`).join(', ')})`,
|
|
478
|
-
counter: 'the server returned a 5xx — the user cannot fix this and the real fault is unreported',
|
|
479
|
-
detail: serverFaults.map(describe).join('; '),
|
|
480
|
-
});
|
|
481
|
-
}
|
|
482
|
-
// A failure-shaped signal is not a success claim, so it must not be read as one: saying "the app
|
|
483
|
-
// claimed success" about an app that plainly reported a failure is true in outline and wrong in
|
|
484
|
-
// its reasoning, which is how a checker stops being believed.
|
|
485
|
-
const successSignals = signals.filter((name) => !ACKNOWLEDGED.test(name));
|
|
486
|
-
// An app that RETRACTED has not claimed success, whenever it fired the optimistic signal.
|
|
487
|
-
//
|
|
488
|
-
// The weaker UI rule below already consulted this and the sharper signal rule did not, so an app
|
|
489
|
-
// that announced "ack:requested", met a 500, and then correctly emitted "ack:failed" and rolled the
|
|
490
|
-
// row back was reported as explicitly asserting success — the strongest accusation this file makes,
|
|
491
|
-
// against code doing exactly the right thing. On a fixture suite the scenario's FIXED twin produced
|
|
492
|
-
// the same finding as the build that swallowed the failure, which makes the finding worthless on
|
|
493
|
-
// the one measurement that scores precision.
|
|
494
|
-
//
|
|
495
|
-
// Ordering cannot decide this: an optimistic UI legitimately fires its success signal BEFORE the
|
|
496
|
-
// response, so "the claim must follow the failure" would miss the real defect. What separates them
|
|
497
|
-
// is not when the app spoke, it is whether it took it back.
|
|
498
|
-
// WHAT failed decides this, not whether an action was attributed.
|
|
499
|
-
//
|
|
500
|
-
// The claim is a thing the app said, so the attribution floor does not apply to it — the flagship
|
|
501
|
-
// false green is an app asserting success on a PASSIVE assert while its own write failed, and
|
|
502
|
-
// requiring an action would lose exactly that. But the COUNTER was any failure in the window, and
|
|
503
|
-
// that is the same window statement scoped out of every other rule here. Measured: two of the
|
|
504
|
-
// three false positives surviving the first scoping pass were this rule.
|
|
505
|
-
//
|
|
506
|
-
// A success signal claims a CHANGE was made. A failed mutation is evidence against that claim; a
|
|
507
|
-
// failed read is not. Background polls, prefetches and telemetry GETs fail constantly in healthy
|
|
508
|
-
// apps and say nothing about whether a write landed. Structural, not a timing heuristic, and the
|
|
509
|
-
// distinction was already encoded next door in `isMutating`.
|
|
510
|
-
const failedWrites = failed.filter(isMutating);
|
|
511
|
-
// The same scoping, for the same reason, one branch down. "The UI moved forward" is also a claim
|
|
512
|
-
// that something CHANGED, and it was still reading ANY failure — so a first-party poll failing
|
|
513
|
-
// during an action contradicted a verdict the action had genuinely earned. Measured on the
|
|
514
|
-
// observation benchmark: one of two false positives across 47 cells, and the argument for it is
|
|
515
|
-
// the paragraph above, which had simply not been carried down here.
|
|
516
|
-
const unexpectedWrites = unexpected.filter(isMutating);
|
|
517
|
-
if (failedWrites.length > 0 && successSignals.length > 0 && !failureAcknowledged(events)) {
|
|
518
|
-
found.push({
|
|
519
|
-
kind: ContradictionKind.SIGNAL_CONTRADICTED,
|
|
520
|
-
claim: `the app fired ${successSignals.map((s) => `"${s}"`).join(', ')}`,
|
|
521
|
-
counter: `${String(failedWrites.length)} write(s) in the same window failed`,
|
|
522
|
-
detail: failedWrites.map(describe).join('; '),
|
|
523
|
-
});
|
|
524
|
-
}
|
|
525
|
-
else if (unexpectedWrites.length > 0 &&
|
|
526
|
-
true === advanced &&
|
|
527
|
-
!misattributed &&
|
|
528
|
-
!failureAcknowledged(events)) {
|
|
529
|
-
found.push({
|
|
530
|
-
kind: ContradictionKind.UI_ADVANCED_REQUEST_FAILED,
|
|
531
|
-
claim: 'the UI moved forward (DOM/store/route changed)',
|
|
532
|
-
counter: `${String(unexpectedWrites.length)} request(s) in the same window failed`,
|
|
533
|
-
detail: unexpectedWrites.map(describe).join('; '),
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
|
-
// ── A write succeeded and nothing on the client moved ───────────────────────────────────────
|
|
537
|
-
// Writes only: a GET that changes nothing is a prefetch; a POST that changes nothing is a lost
|
|
538
|
-
// write, a response parsed into the void, or a render that never happened.
|
|
539
|
-
if (false === advanced) {
|
|
540
|
-
const ignoredWrites = settled.filter((c) => true === c.ok && isMutating(c));
|
|
541
|
-
if (ignoredWrites.length > 0) {
|
|
542
|
-
// ...unless THIS document handed the consequence to another browsing context. An OAuth sign-in
|
|
543
|
-
// posts, succeeds, and continues in a popup the in-page SDK cannot follow (#508): the original
|
|
544
|
-
// tab legitimately never changes, and response-ignored would accuse it of ignoring a response
|
|
545
|
-
// it handed off. The opened-context event flips the reading from "the client did nothing" to
|
|
546
|
-
// "the client went where we cannot look". Scoped like every rule here to the attribution floor
|
|
547
|
-
// (`options.actionSince`; the local below is declared later, for the window rules).
|
|
548
|
-
const contextFloor = options.actionSince;
|
|
549
|
-
const openedContext = events.some((e) => e.type === EventType.CONTEXT_OPENED && contextFloor !== undefined && e.t >= contextFloor);
|
|
550
|
-
found.push(openedContext
|
|
551
|
-
? {
|
|
552
|
-
kind: ContradictionKind.CONSEQUENCE_ELSEWHERE,
|
|
553
|
-
claim: `${String(ignoredWrites.length)} write(s) succeeded on the server`,
|
|
554
|
-
counter: 'this document never changed because the page opened another browsing context during this window (e.g. an OAuth popup), where the in-page SDK cannot observe the result',
|
|
555
|
-
detail: ignoredWrites.map(describe).join('; '),
|
|
556
|
-
}
|
|
557
|
-
: {
|
|
558
|
-
kind: ContradictionKind.RESPONSE_IGNORED,
|
|
559
|
-
claim: `${String(ignoredWrites.length)} write(s) succeeded on the server`,
|
|
560
|
-
counter: 'nothing on the client changed — no DOM, store or route movement',
|
|
561
|
-
detail: ignoredWrites.map(describe).join('; '),
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
// ── The app announced a consequence and nothing else moved ─────────────────────────────────
|
|
566
|
-
// Scoped as tightly as the evidence allows, because this rule fires on the ABSENCE of everything
|
|
567
|
-
// else and that is the easiest way to build a false positive.
|
|
568
|
-
//
|
|
569
|
-
// Only when the window is otherwise EMPTY: no DOM, no store, no route (`!advanced`) and no request
|
|
570
|
-
// at all. A request means the app reached for something, and whether it settled, failed or was
|
|
571
|
-
// ignored belongs to three other rules — firing here too would report one fact twice.
|
|
572
|
-
//
|
|
573
|
-
// `successSignals` reuses the failure-shaped filter above: an app that announced `deploy:failed`
|
|
574
|
-
// is correctly reporting that nothing happened, and accusing it inverts the meaning of the one app
|
|
575
|
-
// doing this right.
|
|
576
|
-
//
|
|
577
|
-
// And only for a window attributed to an ACTION. `reticle_assert` OBSERVES — there is no click
|
|
578
|
-
// whose consequence should have corroborated anything, so an assert over a quiet window carrying
|
|
579
|
-
// one signal is an ordinary read, not a claim nothing backs. Without this the rule reddened eight
|
|
580
|
-
// existing tests that assert exactly that, which is the false-positive class this scoping exists
|
|
581
|
-
// to prevent.
|
|
582
|
-
if (options.actionSince !== undefined &&
|
|
583
|
-
false === advanced &&
|
|
584
|
-
0 === settled.length &&
|
|
585
|
-
successSignals.length > 0) {
|
|
586
|
-
found.push({
|
|
587
|
-
kind: ContradictionKind.SIGNAL_WITHOUT_CONSEQUENCE,
|
|
588
|
-
claim: `the app fired ${successSignals.map((s) => `"${s}"`).join(', ')}`,
|
|
589
|
-
counter: 'nothing else in the window moved — no DOM, no store, no route, no request — so the only ' +
|
|
590
|
-
'evidence that anything happened is the app saying so',
|
|
591
|
-
detail: 'a signal emitted from the value the app was ASKED for, rather than the one it committed, ' +
|
|
592
|
-
'reads identically to one that worked',
|
|
593
|
-
});
|
|
594
|
-
}
|
|
595
|
-
// ── The same write fired more than once, inside ONE action's window ─────────────────────────
|
|
596
|
-
// Attribution is the whole rule here, not a refinement of it: counting `method + url` over whatever
|
|
597
|
-
// window the caller handed in turns two legitimate separate saves into a double submit. See
|
|
598
|
-
// ContradictionOptions.actionSince.
|
|
599
|
-
//
|
|
600
|
-
// A captured request body joins the identity. A command-bus API posts every mutation to one URL
|
|
601
|
-
// and discriminates on a body field (`{"command":"study.stage.set"}` vs `{"command":"mesh.plan"}`),
|
|
602
|
-
// so under URL alone each of those distinct writes read as a repeat of the first, and clean
|
|
603
|
-
// verdicts degraded to unknown behind doubles that were never doubles. When no body was captured
|
|
604
|
-
// (capture off, or a non-text body, which reports a type marker instead) there is nothing to
|
|
605
|
-
// compare and the URL alone stands, as before; a window where only some calls carried bodies
|
|
606
|
-
// compares nothing rather than guess.
|
|
607
|
-
const actionSince = options.actionSince;
|
|
608
|
-
if (actionSince !== undefined) {
|
|
609
|
-
/**
|
|
610
|
-
* When the window navigated, and therefore when a write stops belonging to the user's action.
|
|
611
|
-
*
|
|
612
|
-
* React StrictMode double-invokes a mount effect in development, so clicking a nav link lands
|
|
613
|
-
* two identical writes inside the action's own window. Nothing scoped them out and they read as
|
|
614
|
-
* a double submit — measured on the observation benchmark as one of two false positives.
|
|
615
|
-
*
|
|
616
|
-
* The route change is the structural tell, not a heuristic: the claim this rule makes is "one
|
|
617
|
-
* user action was performed", and writes that follow a navigation belong to the mount of the
|
|
618
|
-
* view navigated TO. A real double submit fires from the view it is already on, with nothing in
|
|
619
|
-
* between — and one that navigates AFTER submitting is still counted, because the order is what
|
|
620
|
-
* distinguishes them.
|
|
621
|
-
*/
|
|
622
|
-
const navigatedAt = events.find((e) => EventType.ROUTE_CHANGE === e.type && e.t >= actionSince)?.t;
|
|
623
|
-
const writeTimes = new Map();
|
|
624
|
-
for (const event of events) {
|
|
625
|
-
if (event.type !== EventType.NET_REQUEST || event.t < actionSince)
|
|
626
|
-
continue;
|
|
627
|
-
if (navigatedAt !== undefined && event.t >= navigatedAt)
|
|
628
|
-
continue;
|
|
629
|
-
const call = netCall(event);
|
|
630
|
-
if (!isMutating(call))
|
|
631
|
-
continue;
|
|
632
|
-
const label = `${call.method} ${call.url}`;
|
|
633
|
-
const body = asString(event.data['requestBody']);
|
|
634
|
-
const key = body === undefined || 0 === body.length ? label : `${label} ${body}`;
|
|
635
|
-
const entry = writeTimes.get(key) ?? { label, times: [], landed: 0 };
|
|
636
|
-
entry.times.push(event.t);
|
|
637
|
-
// Counted separately from the occurrences, because the claim is about what APPLIED.
|
|
638
|
-
if (false !== call.ok)
|
|
639
|
-
entry.landed += 1;
|
|
640
|
-
writeTimes.set(key, entry);
|
|
641
|
-
}
|
|
642
|
-
/**
|
|
643
|
-
* Did the assertion name this endpoint?
|
|
644
|
-
*
|
|
645
|
-
* `undefined` means the caller declared nothing (a bare `observe`), and with nothing declared
|
|
646
|
-
* nothing is unrelated — every duplicate keeps the behaviour it had. An empty-string entry is a
|
|
647
|
-
* net clause with no `urlContains`, which named the whole channel and therefore matches
|
|
648
|
-
* everything.
|
|
649
|
-
*/
|
|
650
|
-
const named = options.namedNetUrls;
|
|
651
|
-
const wasNamed = (label) => named === undefined || named.some((u) => label.includes(u));
|
|
652
|
-
for (const [, { label, times, landed }] of writeTimes) {
|
|
653
|
-
if (times.length < 2)
|
|
654
|
-
continue;
|
|
655
|
-
// A DOUBLE SUBMIT is a write that landed twice. Two attempts of which one failed is a RETRY,
|
|
656
|
-
// and the field case is the commonest retry there is: a 401 that refreshed a token and went
|
|
657
|
-
// again, one row created, reported here as `duplicate-request ×2`. Two attempts that both
|
|
658
|
-
// failed are not a double submit either — nothing applied even once, so the claim "one user
|
|
659
|
-
// action was performed" is not contradicted by them. A call with no verdict at all still
|
|
660
|
-
// counts, because absence of a status is not evidence the write was rejected.
|
|
661
|
-
if (landed < 2)
|
|
662
|
-
continue;
|
|
663
|
-
// A steady cadence is a POLL, and a poll is not a double submit. An app that polls could not
|
|
664
|
-
// produce a verdict at all: a camera scan loop POSTing until it acquires a lock had every
|
|
665
|
-
// assertion that had already seen its consequence come back `unknown` behind writes that
|
|
666
|
-
// were the app working correctly (#673).
|
|
667
|
-
if (isSteadyCadence(times))
|
|
668
|
-
continue;
|
|
669
|
-
// A burst the assertion never mentioned is still worth telling the caller about -- a retry
|
|
670
|
-
// loop or a bursty beacon is a real finding -- but it is not evidence about the consequence
|
|
671
|
-
// they declared, so it is reported and decides nothing. The named case keeps its downgrade:
|
|
672
|
-
// "the write you asked about fired twice" is exactly what this rule is for.
|
|
673
|
-
const related = wasNamed(label);
|
|
674
|
-
found.push({
|
|
675
|
-
kind: related
|
|
676
|
-
? ContradictionKind.DUPLICATE_REQUEST
|
|
677
|
-
: ContradictionKind.DUPLICATE_REQUEST_UNRELATED,
|
|
678
|
-
claim: related
|
|
679
|
-
? 'one user action was performed'
|
|
680
|
-
: 'the assertion did not name this endpoint',
|
|
681
|
-
counter: `the same write fired ${String(times.length)} times`,
|
|
682
|
-
detail: `${label} ×${String(times.length)}`,
|
|
683
|
-
});
|
|
684
|
-
}
|
|
685
|
-
}
|
|
686
|
-
// ── The UI advanced over a request that never came back ─────────────────────────────────────
|
|
687
|
-
// Gated on the UI having moved: an in-flight request while the app is still visibly waiting is
|
|
688
|
-
// just a slow request, not a contradiction. It becomes one when the app proceeded regardless —
|
|
689
|
-
// which is also what makes a later `{ kind: "settled" }` assertion a false green.
|
|
690
|
-
if (true === advanced) {
|
|
691
|
-
const settledIds = new Set(events
|
|
692
|
-
.filter((e) => e.type === EventType.NET_REQUEST)
|
|
693
|
-
.map((e) => asString(e.data['id']))
|
|
694
|
-
.filter((id) => id !== undefined));
|
|
695
|
-
const inFlight = events
|
|
696
|
-
.filter((e) => e.type === EventType.NET_PENDING)
|
|
697
|
-
.map((e) => ({ id: asString(e.data['id']), call: netCall(e) }))
|
|
698
|
-
.filter((p) => p.id === undefined || !settledIds.has(p.id));
|
|
699
|
-
if (inFlight.length > 0) {
|
|
700
|
-
found.push({
|
|
701
|
-
kind: ContradictionKind.REQUEST_NEVER_SETTLED,
|
|
702
|
-
claim: 'the UI moved forward and the action reported done',
|
|
703
|
-
counter: `${String(inFlight.length)} request(s) were still in flight`,
|
|
704
|
-
// The exclusion is never silent: if the toolchain's own traffic was dropped from this count,
|
|
705
|
-
// the finding says which URLs, so an agent reading it can see what Reticle chose to ignore.
|
|
706
|
-
detail: [
|
|
707
|
-
inFlight.map((p) => describe(p.call)).join('; '),
|
|
708
|
-
...(0 === ignoredForeign.length
|
|
709
|
-
? []
|
|
710
|
-
: [`ignored as dev tooling or third-party: ${ignoredForeign.join(', ')}`]),
|
|
711
|
-
].join(' — '),
|
|
712
|
-
});
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
// Consumer rules run LAST and over the same app-only window, so a service embedding this engine
|
|
716
|
-
// adds to the verdict rather than forking the file that produces it.
|
|
717
|
-
return [...found, ...runRegisteredFolds(events, options)];
|
|
718
|
-
}
|