@reticlehq/server 2.2.0 → 2.3.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/README.md +1 -1
- package/dist/bridge-security.d.ts +0 -1
- package/dist/bridge-security.js +0 -1
- package/dist/bridge.d.ts +0 -1
- package/dist/bridge.js +60 -10
- package/dist/bridge.test-harness.d.ts +0 -1
- package/dist/bridge.test-harness.js +0 -1
- package/dist/capsule/capsule-store.d.ts +2 -3
- package/dist/capsule/capsule-store.js +0 -1
- package/dist/capsule/capsule.d.ts +0 -1
- package/dist/capsule/capsule.js +0 -1
- package/dist/capsule/causal-summary.d.ts +21 -1
- package/dist/capsule/causal-summary.js +20 -2
- package/dist/capsule/divergence.d.ts +0 -1
- package/dist/capsule/divergence.js +0 -1
- package/dist/capsule/minimize.d.ts +0 -1
- package/dist/capsule/minimize.js +0 -1
- package/dist/capsule/predicate-to-links.d.ts +0 -1
- package/dist/capsule/predicate-to-links.js +0 -1
- package/dist/cli-doctor.d.ts +6 -0
- package/dist/cli-doctor.js +60 -0
- package/dist/cli-flow-commands.d.ts +0 -1
- package/dist/cli-flow-commands.js +0 -1
- package/dist/cli-launch.d.ts +0 -1
- package/dist/cli-launch.js +7 -3
- package/dist/cli-parse.d.ts +52 -2
- package/dist/cli-parse.js +147 -3
- package/dist/cli-port.d.ts +0 -1
- package/dist/cli-port.js +0 -1
- package/dist/cli-verify.d.ts +2 -1
- package/dist/cli-verify.js +24 -3
- package/dist/cli.d.ts +2 -4
- package/dist/cli.js +109 -10
- package/dist/cloud/cloud-config.d.ts +36 -0
- package/dist/cloud/cloud-config.js +86 -0
- package/dist/cloud/cloud-sync.d.ts +96 -4
- package/dist/cloud/cloud-sync.js +131 -3
- package/dist/cloud-cli.d.ts +3 -0
- package/dist/cloud-cli.js +514 -0
- package/dist/crawl/crawl-tools.d.ts +0 -1
- package/dist/crawl/crawl-tools.js +1 -2
- package/dist/crawl/crawl.d.ts +17 -3
- package/dist/crawl/crawl.js +43 -4
- package/dist/daemon-resilience.d.ts +6 -1
- package/dist/daemon-resilience.js +63 -1
- package/dist/daemon.d.ts +23 -3
- package/dist/daemon.js +78 -21
- package/dist/domain/domain-model.d.ts +0 -1
- package/dist/domain/domain-model.js +1 -2
- package/dist/domain/domain-tools.d.ts +0 -7
- package/dist/domain/domain-tools.js +21 -4
- package/dist/domain/flow-risk.d.ts +0 -1
- package/dist/domain/flow-risk.js +0 -1
- package/dist/ee/audit-log.d.ts +0 -1
- package/dist/ee/audit-log.js +0 -1
- package/dist/events/body-failures.d.ts +4 -0
- package/dist/events/body-failures.js +113 -0
- package/dist/events/contradictions.d.ts +53 -0
- package/dist/events/contradictions.js +282 -0
- package/dist/events/echo-mismatch.d.ts +4 -0
- package/dist/events/echo-mismatch.js +138 -0
- package/dist/events/event-filters.d.ts +17 -3
- package/dist/events/event-filters.js +13 -3
- package/dist/events/json-salvage.d.ts +32 -0
- package/dist/events/json-salvage.js +96 -0
- package/dist/events/predicate-eval.d.ts +2 -1
- package/dist/events/predicate-eval.js +56 -9
- package/dist/events/predicate.d.ts +0 -1
- package/dist/events/predicate.js +56 -2
- package/dist/events/reaction.d.ts +0 -1
- package/dist/events/reaction.js +0 -1
- package/dist/events/reconcile.d.ts +39 -0
- package/dist/events/reconcile.js +211 -0
- package/dist/events/ring-buffer.d.ts +0 -1
- package/dist/events/ring-buffer.js +0 -1
- package/dist/events/stale-response.d.ts +4 -0
- package/dist/events/stale-response.js +139 -0
- package/dist/events/unit-mismatch.d.ts +16 -0
- package/dist/events/unit-mismatch.js +167 -0
- package/dist/flows/affected-tools.d.ts +18 -0
- package/dist/flows/affected-tools.js +52 -0
- package/dist/flows/affected.d.ts +0 -1
- package/dist/flows/affected.js +0 -1
- package/dist/flows/annotate-tools.d.ts +0 -1
- package/dist/flows/annotate-tools.js +21 -3
- package/dist/flows/annotate.d.ts +0 -1
- package/dist/flows/annotate.js +0 -1
- package/dist/flows/annotation-store.d.ts +0 -1
- package/dist/flows/annotation-store.js +0 -1
- package/dist/flows/assertion-integrity.d.ts +0 -1
- package/dist/flows/assertion-integrity.js +0 -1
- package/dist/flows/assertion-tiers-store.d.ts +0 -1
- package/dist/flows/assertion-tiers-store.js +0 -1
- package/dist/flows/buddy-status.d.ts +0 -1
- package/dist/flows/buddy-status.js +0 -1
- package/dist/flows/coverage.d.ts +0 -1
- package/dist/flows/coverage.js +0 -1
- package/dist/flows/decision.d.ts +0 -1
- package/dist/flows/decision.js +0 -1
- package/dist/flows/flake-store.d.ts +0 -1
- package/dist/flows/flake-store.js +0 -1
- package/dist/flows/flake.d.ts +0 -1
- package/dist/flows/flake.js +0 -1
- package/dist/flows/flow-classify.d.ts +0 -1
- package/dist/flows/flow-classify.js +0 -1
- package/dist/flows/flow-replay-run.d.ts +0 -1
- package/dist/flows/flow-replay-run.js +24 -8
- package/dist/flows/flow-replay.d.ts +20 -4
- package/dist/flows/flow-replay.js +9 -43
- package/dist/flows/flow-report.d.ts +0 -1
- package/dist/flows/flow-report.js +0 -1
- package/dist/flows/flow-scope.d.ts +0 -1
- package/dist/flows/flow-scope.js +0 -1
- package/dist/flows/flow-sources.d.ts +0 -1
- package/dist/flows/flow-sources.js +0 -1
- package/dist/flows/flow-step-runners.d.ts +23 -0
- package/dist/flows/flow-step-runners.js +102 -0
- package/dist/flows/flow-success.d.ts +0 -1
- package/dist/flows/flow-success.js +0 -1
- package/dist/flows/flow-tools.d.ts +0 -1
- package/dist/flows/flow-tools.js +54 -16
- package/dist/flows/flows.d.ts +6 -2
- package/dist/flows/flows.js +15 -2
- package/dist/flows/gate.d.ts +0 -1
- package/dist/flows/gate.js +0 -1
- package/dist/flows/git-changed.d.ts +0 -1
- package/dist/flows/git-changed.js +0 -1
- package/dist/flows/heal-run.d.ts +0 -1
- package/dist/flows/heal-run.js +0 -1
- package/dist/flows/heal.d.ts +0 -1
- package/dist/flows/heal.js +0 -1
- package/dist/flows/parallel-suite.d.ts +0 -1
- package/dist/flows/parallel-suite.js +0 -1
- package/dist/flows/recordings.d.ts +0 -1
- package/dist/flows/recordings.js +0 -1
- package/dist/flows/replay.d.ts +0 -1
- package/dist/flows/replay.js +71 -4
- package/dist/flows/server-verify.d.ts +15 -0
- package/dist/flows/server-verify.js +42 -0
- package/dist/flows/verify-change-tools.d.ts +2 -0
- package/dist/flows/verify-change-tools.js +187 -0
- package/dist/flows/watch-batcher.d.ts +0 -1
- package/dist/flows/watch-batcher.js +0 -1
- package/dist/honesty/accepted-write.d.ts +14 -0
- package/dist/honesty/accepted-write.js +17 -0
- package/dist/honesty/blind-spots.d.ts +18 -1
- package/dist/honesty/blind-spots.js +47 -5
- package/dist/honesty/honesty.d.ts +0 -1
- package/dist/honesty/honesty.js +0 -1
- package/dist/honesty/uncaptured-bodies.d.ts +19 -0
- package/dist/honesty/uncaptured-bodies.js +30 -0
- package/dist/honesty/unread-outcome.d.ts +2 -0
- package/dist/honesty/unread-outcome.js +50 -0
- package/dist/honesty/verified.d.ts +40 -0
- package/dist/honesty/verified.js +86 -0
- package/dist/http-server.d.ts +0 -1
- package/dist/http-server.js +5 -1
- package/dist/hunt/hunt-report.d.ts +50 -0
- package/dist/hunt/hunt-report.js +84 -0
- package/dist/idle-shutdown.d.ts +0 -1
- package/dist/idle-shutdown.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/init/agent-rules.d.ts +0 -1
- package/dist/init/agent-rules.js +4 -2
- package/dist/init/cursor.d.ts +0 -1
- package/dist/init/cursor.js +0 -1
- package/dist/init/desktop-doctor.d.ts +40 -0
- package/dist/init/desktop-doctor.js +198 -0
- package/dist/init/detect.d.ts +0 -1
- package/dist/init/detect.js +0 -1
- package/dist/init/mcp.d.ts +0 -1
- package/dist/init/mcp.js +0 -1
- package/dist/init/node-io.d.ts +0 -1
- package/dist/init/node-io.js +0 -1
- package/dist/init/plan.d.ts +4 -1
- package/dist/init/plan.js +23 -5
- package/dist/init/project-id.d.ts +0 -1
- package/dist/init/project-id.js +0 -1
- package/dist/init/run.d.ts +0 -1
- package/dist/init/run.js +31 -3
- package/dist/init/snippets.d.ts +5 -1
- package/dist/init/snippets.js +5 -1
- package/dist/init/vite-config.d.ts +0 -1
- package/dist/init/vite-config.js +0 -1
- package/dist/input/network-detail.d.ts +0 -1
- package/dist/input/network-detail.js +0 -1
- package/dist/input/network-mock-tools.d.ts +0 -1
- package/dist/input/network-mock-tools.js +3 -4
- package/dist/input/network-mock.d.ts +0 -1
- package/dist/input/network-mock.js +0 -1
- package/dist/input/real-input.d.ts +14 -1
- package/dist/input/real-input.js +45 -3
- package/dist/input/scroll-find.d.ts +0 -1
- package/dist/input/scroll-find.js +0 -1
- package/dist/input/scroll-tools.d.ts +0 -1
- package/dist/input/scroll-tools.js +0 -1
- package/dist/input/viewport-tools.d.ts +0 -1
- package/dist/input/viewport-tools.js +3 -4
- package/dist/journal/ambient-store.d.ts +0 -1
- package/dist/journal/ambient-store.js +0 -1
- package/dist/journal/ambient.d.ts +0 -1
- package/dist/journal/ambient.js +0 -1
- package/dist/journal/attach-journal.d.ts +0 -1
- package/dist/journal/attach-journal.js +0 -1
- package/dist/journal/deviation-report.d.ts +0 -1
- package/dist/journal/deviation-report.js +0 -1
- package/dist/journal/deviation-service.d.ts +0 -1
- package/dist/journal/deviation-service.js +0 -1
- package/dist/journal/envelope-store.d.ts +0 -1
- package/dist/journal/envelope-store.js +0 -1
- package/dist/journal/envelope.d.ts +8 -9
- package/dist/journal/envelope.js +0 -1
- package/dist/journal/journal-query.d.ts +0 -1
- package/dist/journal/journal-query.js +0 -1
- package/dist/journal/journal-recorder.d.ts +0 -1
- package/dist/journal/journal-recorder.js +0 -1
- package/dist/journal/retention.d.ts +0 -1
- package/dist/journal/retention.js +0 -1
- package/dist/journal/rollups.d.ts +0 -1
- package/dist/journal/rollups.js +0 -1
- package/dist/journal/session-end.d.ts +0 -1
- package/dist/journal/session-end.js +0 -1
- package/dist/journal/session-journal.d.ts +0 -1
- package/dist/journal/session-journal.js +0 -1
- package/dist/license/license.d.ts +0 -1
- package/dist/license/license.js +0 -1
- package/dist/log.d.ts +0 -1
- package/dist/log.js +0 -1
- package/dist/mcp-proxy.d.ts +0 -1
- package/dist/mcp-proxy.js +0 -1
- package/dist/mcp.d.ts +15 -1
- package/dist/mcp.js +145 -17
- package/dist/oracles/flow-instrument-gaps.d.ts +0 -1
- package/dist/oracles/flow-instrument-gaps.js +0 -1
- package/dist/oracles/propose-consequences.d.ts +0 -1
- package/dist/oracles/propose-consequences.js +0 -1
- package/dist/oracles/self-instrument.d.ts +0 -1
- package/dist/oracles/self-instrument.js +0 -1
- package/dist/pairing-token.d.ts +0 -1
- package/dist/pairing-token.js +0 -1
- package/dist/phenomena/phenomena.d.ts +0 -1
- package/dist/phenomena/phenomena.js +0 -1
- package/dist/pool/browser-pool.d.ts +0 -1
- package/dist/pool/browser-pool.js +0 -1
- package/dist/pool/lease-reaper.d.ts +0 -1
- package/dist/pool/lease-reaper.js +0 -1
- package/dist/pool/playwright-launcher.d.ts +2 -1
- package/dist/pool/playwright-launcher.js +22 -2
- package/dist/project/baselines.d.ts +0 -1
- package/dist/project/baselines.js +5 -4
- package/dist/project/file-lock.d.ts +2 -1
- package/dist/project/file-lock.js +12 -2
- package/dist/project/fs-port.d.ts +0 -1
- package/dist/project/fs-port.js +0 -1
- package/dist/project/project-store.d.ts +0 -1
- package/dist/project/project-store.js +20 -9
- package/dist/project/project-tools.d.ts +0 -1
- package/dist/project/project-tools.js +57 -9
- package/dist/project/reticle-dir.d.ts +0 -1
- package/dist/project/reticle-dir.js +0 -1
- package/dist/runs/build-verification-run.d.ts +0 -1
- package/dist/runs/build-verification-run.js +0 -1
- package/dist/runs/profile-redact.d.ts +0 -1
- package/dist/runs/profile-redact.js +0 -1
- package/dist/runs/render-report.d.ts +0 -1
- package/dist/runs/render-report.js +0 -1
- package/dist/runs/repair-prompt.d.ts +0 -1
- package/dist/runs/repair-prompt.js +0 -1
- package/dist/runs/replay-mapping.d.ts +0 -1
- package/dist/runs/replay-mapping.js +0 -1
- package/dist/runs/reticle-runner.d.ts +0 -1
- package/dist/runs/reticle-runner.js +4 -2
- package/dist/runs/risk-classify.d.ts +0 -1
- package/dist/runs/risk-classify.js +0 -1
- package/dist/runs/run-diff.d.ts +0 -1
- package/dist/runs/run-diff.js +0 -1
- package/dist/runs/run-store.d.ts +0 -1
- package/dist/runs/run-store.js +0 -1
- package/dist/runs/run-tools.d.ts +0 -1
- package/dist/runs/run-tools.js +0 -1
- package/dist/runs/runner-port.d.ts +0 -1
- package/dist/runs/runner-port.js +0 -1
- package/dist/runs/verification-sync.d.ts +23 -0
- package/dist/runs/verification-sync.js +66 -0
- package/dist/runs/verify-http.d.ts +0 -1
- package/dist/runs/verify-http.js +0 -1
- package/dist/runs/verify-server.d.ts +0 -1
- package/dist/runs/verify-server.js +0 -1
- package/dist/server-version.d.ts +0 -1
- package/dist/server-version.js +0 -1
- package/dist/session/command-timeout.d.ts +35 -0
- package/dist/session/command-timeout.js +41 -0
- package/dist/session/control-envelope.d.ts +2 -3
- package/dist/session/control-envelope.js +2 -3
- package/dist/session/last-act.d.ts +31 -0
- package/dist/session/last-act.js +24 -0
- package/dist/session/live-control-tools.d.ts +0 -1
- package/dist/session/live-control-tools.js +3 -4
- package/dist/session/live-control.d.ts +0 -1
- package/dist/session/live-control.js +0 -1
- package/dist/session/observed-state.d.ts +12 -2
- package/dist/session/observed-state.js +29 -2
- package/dist/session/output-budget.d.ts +0 -1
- package/dist/session/output-budget.js +0 -1
- package/dist/session/pending-commands.d.ts +12 -0
- package/dist/session/pending-commands.js +36 -0
- package/dist/session/presenter-args.d.ts +0 -1
- package/dist/session/presenter-args.js +0 -1
- package/dist/session/review-store.d.ts +0 -1
- package/dist/session/review-store.js +0 -1
- package/dist/session/session-health.d.ts +26 -2
- package/dist/session/session-health.js +13 -1
- package/dist/session/session-info.d.ts +29 -0
- package/dist/session/session-info.js +1 -0
- package/dist/session/session-lease.d.ts +25 -0
- package/dist/session/session-lease.js +14 -0
- package/dist/session/session-manager.d.ts +7 -19
- package/dist/session/session-manager.js +29 -2
- package/dist/session/session-readiness.d.ts +0 -1
- package/dist/session/session-readiness.js +3 -4
- package/dist/session/session-reaper.d.ts +0 -1
- package/dist/session/session-reaper.js +0 -1
- package/dist/session/session-recommendation.d.ts +0 -1
- package/dist/session/session-recommendation.js +0 -1
- package/dist/session/session-tools.d.ts +0 -1
- package/dist/session/session-tools.js +2 -3
- package/dist/session/session.d.ts +27 -53
- package/dist/session/session.js +95 -66
- package/dist/session/state-select.d.ts +0 -1
- package/dist/session/state-select.js +0 -1
- package/dist/telemetry/argument-shape.d.ts +41 -0
- package/dist/telemetry/argument-shape.js +87 -0
- package/dist/telemetry/bug-found.d.ts +33 -0
- package/dist/telemetry/bug-found.js +95 -0
- package/dist/telemetry/cli-telemetry.d.ts +13 -0
- package/dist/telemetry/cli-telemetry.js +43 -0
- package/dist/telemetry/connect-failure.d.ts +16 -0
- package/dist/telemetry/connect-failure.js +44 -0
- package/dist/telemetry/daemon-telemetry.d.ts +19 -0
- package/dist/telemetry/daemon-telemetry.js +76 -0
- package/dist/telemetry/dev-repo.d.ts +10 -0
- package/dist/telemetry/dev-repo.js +80 -0
- package/dist/telemetry/error-fingerprint.d.ts +24 -0
- package/dist/telemetry/error-fingerprint.js +88 -0
- package/dist/telemetry/feedback-cli.d.ts +31 -0
- package/dist/telemetry/feedback-cli.js +102 -0
- package/dist/telemetry/feedback-context.d.ts +32 -0
- package/dist/telemetry/feedback-context.js +143 -0
- package/dist/telemetry/feedback.d.ts +66 -0
- package/dist/telemetry/feedback.js +175 -0
- package/dist/telemetry/git-facts.d.ts +21 -0
- package/dist/telemetry/git-facts.js +109 -0
- package/dist/telemetry/identify.d.ts +22 -0
- package/dist/telemetry/identify.js +73 -0
- package/dist/telemetry/init-telemetry.d.ts +26 -0
- package/dist/telemetry/init-telemetry.js +33 -0
- package/dist/telemetry/machine-snapshot.d.ts +6 -0
- package/dist/telemetry/machine-snapshot.js +39 -0
- package/dist/telemetry/mcp-connection.d.ts +5 -0
- package/dist/telemetry/mcp-connection.js +44 -0
- package/dist/telemetry/project-profile.d.ts +44 -0
- package/dist/telemetry/project-profile.js +205 -0
- package/dist/telemetry/run-telemetry.d.ts +21 -0
- package/dist/telemetry/run-telemetry.js +62 -0
- package/dist/telemetry/session-metrics.d.ts +103 -0
- package/dist/telemetry/session-metrics.js +329 -0
- package/dist/telemetry/telemetry.d.ts +68 -0
- package/dist/telemetry/telemetry.js +313 -0
- package/dist/token-auth.d.ts +0 -1
- package/dist/token-auth.js +0 -1
- package/dist/tools/act-capsule.d.ts +23 -0
- package/dist/tools/act-capsule.js +47 -0
- package/dist/tools/act-danger.d.ts +7 -0
- package/dist/tools/act-danger.js +44 -0
- package/dist/tools/act-helpers.d.ts +17 -0
- package/dist/tools/act-helpers.js +40 -0
- package/dist/tools/act-tools.d.ts +8 -1
- package/dist/tools/act-tools.js +96 -98
- package/dist/tools/act-view.d.ts +7 -1
- package/dist/tools/act-view.js +13 -1
- package/dist/tools/assert-grade.d.ts +22 -1
- package/dist/tools/assert-grade.js +46 -1
- package/dist/tools/assert-verdict.d.ts +21 -0
- package/dist/tools/assert-verdict.js +62 -0
- package/dist/tools/browser-tools.d.ts +0 -1
- package/dist/tools/browser-tools.js +2 -2
- package/dist/tools/contract-tools.d.ts +0 -1
- package/dist/tools/contract-tools.js +0 -1
- package/dist/tools/coverage-tools.d.ts +9 -0
- package/dist/tools/coverage-tools.js +92 -0
- package/dist/tools/dynamic-tools.d.ts +0 -1
- package/dist/tools/dynamic-tools.js +21 -2
- package/dist/tools/error-recovery.d.ts +18 -2
- package/dist/tools/error-recovery.js +42 -7
- package/dist/tools/feedback-tools.d.ts +24 -0
- package/dist/tools/feedback-tools.js +180 -0
- package/dist/tools/invoke-tool.d.ts +0 -1
- package/dist/tools/invoke-tool.js +116 -2
- package/dist/tools/lease-tools.d.ts +0 -1
- package/dist/tools/lease-tools.js +6 -5
- package/dist/tools/merge-tools.d.ts +0 -1
- package/dist/tools/merge-tools.js +0 -1
- package/dist/tools/observe-tools.d.ts +0 -1
- package/dist/tools/observe-tools.js +91 -39
- package/dist/tools/profiles.d.ts +1 -2
- package/dist/tools/profiles.js +43 -16
- package/dist/tools/query-paginate.d.ts +0 -1
- package/dist/tools/query-paginate.js +0 -1
- package/dist/tools/read-tools.d.ts +0 -1
- package/dist/tools/read-tools.js +10 -8
- package/dist/tools/reconcile-tools.d.ts +2 -0
- package/dist/tools/reconcile-tools.js +111 -0
- package/dist/tools/snapshot-delta.d.ts +0 -1
- package/dist/tools/snapshot-delta.js +0 -0
- package/dist/tools/tool-invoker.d.ts +0 -1
- package/dist/tools/tool-invoker.js +0 -1
- package/dist/tools/tool-kit.d.ts +16 -1
- package/dist/tools/tool-kit.js +8 -2
- package/dist/tools/tool-names.d.ts +6 -1
- package/dist/tools/tool-names.js +6 -1
- package/dist/tools/tools-helpers.d.ts +0 -1
- package/dist/tools/tools-helpers.js +0 -1
- package/dist/tools/tools.d.ts +0 -1
- package/dist/tools/tools.js +24 -4
- package/dist/update/update-checker.d.ts +0 -1
- package/dist/update/update-checker.js +26 -2
- package/dist/update/update-nudge.d.ts +20 -0
- package/dist/update/update-nudge.js +72 -0
- package/dist/update/updater.d.ts +14 -1
- package/dist/update/updater.js +33 -2
- package/dist/visual/visual-diff.d.ts +0 -1
- package/dist/visual/visual-diff.js +0 -1
- package/dist/visual/visual-store.d.ts +0 -1
- package/dist/visual/visual-store.js +0 -1
- package/dist/visual/visual-tools.d.ts +0 -1
- package/dist/visual/visual-tools.js +103 -16
- package/package.json +2 -2
- package/dist/bridge-security.d.ts.map +0 -1
- package/dist/bridge-security.js.map +0 -1
- package/dist/bridge.d.ts.map +0 -1
- package/dist/bridge.js.map +0 -1
- package/dist/bridge.test-harness.d.ts.map +0 -1
- package/dist/bridge.test-harness.js.map +0 -1
- package/dist/capsule/capsule-store.d.ts.map +0 -1
- package/dist/capsule/capsule-store.js.map +0 -1
- package/dist/capsule/capsule.d.ts.map +0 -1
- package/dist/capsule/capsule.js.map +0 -1
- package/dist/capsule/causal-summary.d.ts.map +0 -1
- package/dist/capsule/causal-summary.js.map +0 -1
- package/dist/capsule/divergence.d.ts.map +0 -1
- package/dist/capsule/divergence.js.map +0 -1
- package/dist/capsule/minimize.d.ts.map +0 -1
- package/dist/capsule/minimize.js.map +0 -1
- package/dist/capsule/predicate-to-links.d.ts.map +0 -1
- package/dist/capsule/predicate-to-links.js.map +0 -1
- package/dist/cli-flow-commands.d.ts.map +0 -1
- package/dist/cli-flow-commands.js.map +0 -1
- package/dist/cli-launch.d.ts.map +0 -1
- package/dist/cli-launch.js.map +0 -1
- package/dist/cli-parse.d.ts.map +0 -1
- package/dist/cli-parse.js.map +0 -1
- package/dist/cli-port.d.ts.map +0 -1
- package/dist/cli-port.js.map +0 -1
- package/dist/cli-verify.d.ts.map +0 -1
- package/dist/cli-verify.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/cloud/cloud-sync.d.ts.map +0 -1
- package/dist/cloud/cloud-sync.js.map +0 -1
- package/dist/crawl/crawl-tools.d.ts.map +0 -1
- package/dist/crawl/crawl-tools.js.map +0 -1
- package/dist/crawl/crawl.d.ts.map +0 -1
- package/dist/crawl/crawl.js.map +0 -1
- package/dist/daemon-resilience.d.ts.map +0 -1
- package/dist/daemon-resilience.js.map +0 -1
- package/dist/daemon.d.ts.map +0 -1
- package/dist/daemon.js.map +0 -1
- package/dist/domain/domain-model.d.ts.map +0 -1
- package/dist/domain/domain-model.js.map +0 -1
- package/dist/domain/domain-tools.d.ts.map +0 -1
- package/dist/domain/domain-tools.js.map +0 -1
- package/dist/domain/flow-risk.d.ts.map +0 -1
- package/dist/domain/flow-risk.js.map +0 -1
- package/dist/ee/audit-log.d.ts.map +0 -1
- package/dist/ee/audit-log.js.map +0 -1
- package/dist/events/event-filters.d.ts.map +0 -1
- package/dist/events/event-filters.js.map +0 -1
- package/dist/events/predicate-eval.d.ts.map +0 -1
- package/dist/events/predicate-eval.js.map +0 -1
- package/dist/events/predicate.d.ts.map +0 -1
- package/dist/events/predicate.js.map +0 -1
- package/dist/events/reaction.d.ts.map +0 -1
- package/dist/events/reaction.js.map +0 -1
- package/dist/events/ring-buffer.d.ts.map +0 -1
- package/dist/events/ring-buffer.js.map +0 -1
- package/dist/flows/affected.d.ts.map +0 -1
- package/dist/flows/affected.js.map +0 -1
- package/dist/flows/annotate-tools.d.ts.map +0 -1
- package/dist/flows/annotate-tools.js.map +0 -1
- package/dist/flows/annotate.d.ts.map +0 -1
- package/dist/flows/annotate.js.map +0 -1
- package/dist/flows/annotation-store.d.ts.map +0 -1
- package/dist/flows/annotation-store.js.map +0 -1
- package/dist/flows/assertion-integrity.d.ts.map +0 -1
- package/dist/flows/assertion-integrity.js.map +0 -1
- package/dist/flows/assertion-tiers-store.d.ts.map +0 -1
- package/dist/flows/assertion-tiers-store.js.map +0 -1
- package/dist/flows/buddy-status.d.ts.map +0 -1
- package/dist/flows/buddy-status.js.map +0 -1
- package/dist/flows/coverage.d.ts.map +0 -1
- package/dist/flows/coverage.js.map +0 -1
- package/dist/flows/decision.d.ts.map +0 -1
- package/dist/flows/decision.js.map +0 -1
- package/dist/flows/flake-store.d.ts.map +0 -1
- package/dist/flows/flake-store.js.map +0 -1
- package/dist/flows/flake.d.ts.map +0 -1
- package/dist/flows/flake.js.map +0 -1
- package/dist/flows/flow-classify.d.ts.map +0 -1
- package/dist/flows/flow-classify.js.map +0 -1
- package/dist/flows/flow-replay-run.d.ts.map +0 -1
- package/dist/flows/flow-replay-run.js.map +0 -1
- package/dist/flows/flow-replay.d.ts.map +0 -1
- package/dist/flows/flow-replay.js.map +0 -1
- package/dist/flows/flow-report.d.ts.map +0 -1
- package/dist/flows/flow-report.js.map +0 -1
- package/dist/flows/flow-scope.d.ts.map +0 -1
- package/dist/flows/flow-scope.js.map +0 -1
- package/dist/flows/flow-sources.d.ts.map +0 -1
- package/dist/flows/flow-sources.js.map +0 -1
- package/dist/flows/flow-success.d.ts.map +0 -1
- package/dist/flows/flow-success.js.map +0 -1
- package/dist/flows/flow-tools.d.ts.map +0 -1
- package/dist/flows/flow-tools.js.map +0 -1
- package/dist/flows/flows.d.ts.map +0 -1
- package/dist/flows/flows.js.map +0 -1
- package/dist/flows/gate.d.ts.map +0 -1
- package/dist/flows/gate.js.map +0 -1
- package/dist/flows/git-changed.d.ts.map +0 -1
- package/dist/flows/git-changed.js.map +0 -1
- package/dist/flows/heal-run.d.ts.map +0 -1
- package/dist/flows/heal-run.js.map +0 -1
- package/dist/flows/heal.d.ts.map +0 -1
- package/dist/flows/heal.js.map +0 -1
- package/dist/flows/parallel-suite.d.ts.map +0 -1
- package/dist/flows/parallel-suite.js.map +0 -1
- package/dist/flows/recordings.d.ts.map +0 -1
- package/dist/flows/recordings.js.map +0 -1
- package/dist/flows/replay.d.ts.map +0 -1
- package/dist/flows/replay.js.map +0 -1
- package/dist/flows/watch-batcher.d.ts.map +0 -1
- package/dist/flows/watch-batcher.js.map +0 -1
- package/dist/honesty/blind-spots.d.ts.map +0 -1
- package/dist/honesty/blind-spots.js.map +0 -1
- package/dist/honesty/honesty.d.ts.map +0 -1
- package/dist/honesty/honesty.js.map +0 -1
- package/dist/http-server.d.ts.map +0 -1
- package/dist/http-server.js.map +0 -1
- package/dist/idle-shutdown.d.ts.map +0 -1
- package/dist/idle-shutdown.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init/agent-rules.d.ts.map +0 -1
- package/dist/init/agent-rules.js.map +0 -1
- package/dist/init/cursor.d.ts.map +0 -1
- package/dist/init/cursor.js.map +0 -1
- package/dist/init/detect.d.ts.map +0 -1
- package/dist/init/detect.js.map +0 -1
- package/dist/init/mcp.d.ts.map +0 -1
- package/dist/init/mcp.js.map +0 -1
- package/dist/init/node-io.d.ts.map +0 -1
- package/dist/init/node-io.js.map +0 -1
- package/dist/init/plan.d.ts.map +0 -1
- package/dist/init/plan.js.map +0 -1
- package/dist/init/project-id.d.ts.map +0 -1
- package/dist/init/project-id.js.map +0 -1
- package/dist/init/run.d.ts.map +0 -1
- package/dist/init/run.js.map +0 -1
- package/dist/init/snippets.d.ts.map +0 -1
- package/dist/init/snippets.js.map +0 -1
- package/dist/init/vite-config.d.ts.map +0 -1
- package/dist/init/vite-config.js.map +0 -1
- package/dist/input/network-detail.d.ts.map +0 -1
- package/dist/input/network-detail.js.map +0 -1
- package/dist/input/network-mock-tools.d.ts.map +0 -1
- package/dist/input/network-mock-tools.js.map +0 -1
- package/dist/input/network-mock.d.ts.map +0 -1
- package/dist/input/network-mock.js.map +0 -1
- package/dist/input/real-input.d.ts.map +0 -1
- package/dist/input/real-input.js.map +0 -1
- package/dist/input/scroll-find.d.ts.map +0 -1
- package/dist/input/scroll-find.js.map +0 -1
- package/dist/input/scroll-tools.d.ts.map +0 -1
- package/dist/input/scroll-tools.js.map +0 -1
- package/dist/input/viewport-tools.d.ts.map +0 -1
- package/dist/input/viewport-tools.js.map +0 -1
- package/dist/journal/ambient-store.d.ts.map +0 -1
- package/dist/journal/ambient-store.js.map +0 -1
- package/dist/journal/ambient.d.ts.map +0 -1
- package/dist/journal/ambient.js.map +0 -1
- package/dist/journal/attach-journal.d.ts.map +0 -1
- package/dist/journal/attach-journal.js.map +0 -1
- package/dist/journal/deviation-report.d.ts.map +0 -1
- package/dist/journal/deviation-report.js.map +0 -1
- package/dist/journal/deviation-service.d.ts.map +0 -1
- package/dist/journal/deviation-service.js.map +0 -1
- package/dist/journal/envelope-store.d.ts.map +0 -1
- package/dist/journal/envelope-store.js.map +0 -1
- package/dist/journal/envelope.d.ts.map +0 -1
- package/dist/journal/envelope.js.map +0 -1
- package/dist/journal/journal-query.d.ts.map +0 -1
- package/dist/journal/journal-query.js.map +0 -1
- package/dist/journal/journal-recorder.d.ts.map +0 -1
- package/dist/journal/journal-recorder.js.map +0 -1
- package/dist/journal/retention.d.ts.map +0 -1
- package/dist/journal/retention.js.map +0 -1
- package/dist/journal/rollups.d.ts.map +0 -1
- package/dist/journal/rollups.js.map +0 -1
- package/dist/journal/session-end.d.ts.map +0 -1
- package/dist/journal/session-end.js.map +0 -1
- package/dist/journal/session-journal.d.ts.map +0 -1
- package/dist/journal/session-journal.js.map +0 -1
- package/dist/license/license.d.ts.map +0 -1
- package/dist/license/license.js.map +0 -1
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js.map +0 -1
- package/dist/mcp-proxy.d.ts.map +0 -1
- package/dist/mcp-proxy.js.map +0 -1
- package/dist/mcp.d.ts.map +0 -1
- package/dist/mcp.js.map +0 -1
- package/dist/oracles/flow-instrument-gaps.d.ts.map +0 -1
- package/dist/oracles/flow-instrument-gaps.js.map +0 -1
- package/dist/oracles/propose-consequences.d.ts.map +0 -1
- package/dist/oracles/propose-consequences.js.map +0 -1
- package/dist/oracles/self-instrument.d.ts.map +0 -1
- package/dist/oracles/self-instrument.js.map +0 -1
- package/dist/pairing-token.d.ts.map +0 -1
- package/dist/pairing-token.js.map +0 -1
- package/dist/phenomena/phenomena.d.ts.map +0 -1
- package/dist/phenomena/phenomena.js.map +0 -1
- package/dist/pool/browser-pool.d.ts.map +0 -1
- package/dist/pool/browser-pool.js.map +0 -1
- package/dist/pool/lease-reaper.d.ts.map +0 -1
- package/dist/pool/lease-reaper.js.map +0 -1
- package/dist/pool/playwright-launcher.d.ts.map +0 -1
- package/dist/pool/playwright-launcher.js.map +0 -1
- package/dist/project/baselines.d.ts.map +0 -1
- package/dist/project/baselines.js.map +0 -1
- package/dist/project/file-lock.d.ts.map +0 -1
- package/dist/project/file-lock.js.map +0 -1
- package/dist/project/fs-port.d.ts.map +0 -1
- package/dist/project/fs-port.js.map +0 -1
- package/dist/project/project-store.d.ts.map +0 -1
- package/dist/project/project-store.js.map +0 -1
- package/dist/project/project-tools.d.ts.map +0 -1
- package/dist/project/project-tools.js.map +0 -1
- package/dist/project/reticle-dir.d.ts.map +0 -1
- package/dist/project/reticle-dir.js.map +0 -1
- package/dist/runs/build-verification-run.d.ts.map +0 -1
- package/dist/runs/build-verification-run.js.map +0 -1
- package/dist/runs/profile-redact.d.ts.map +0 -1
- package/dist/runs/profile-redact.js.map +0 -1
- package/dist/runs/render-report.d.ts.map +0 -1
- package/dist/runs/render-report.js.map +0 -1
- package/dist/runs/repair-prompt.d.ts.map +0 -1
- package/dist/runs/repair-prompt.js.map +0 -1
- package/dist/runs/replay-mapping.d.ts.map +0 -1
- package/dist/runs/replay-mapping.js.map +0 -1
- package/dist/runs/reticle-runner.d.ts.map +0 -1
- package/dist/runs/reticle-runner.js.map +0 -1
- package/dist/runs/risk-classify.d.ts.map +0 -1
- package/dist/runs/risk-classify.js.map +0 -1
- package/dist/runs/run-diff.d.ts.map +0 -1
- package/dist/runs/run-diff.js.map +0 -1
- package/dist/runs/run-store.d.ts.map +0 -1
- package/dist/runs/run-store.js.map +0 -1
- package/dist/runs/run-tools.d.ts.map +0 -1
- package/dist/runs/run-tools.js.map +0 -1
- package/dist/runs/runner-port.d.ts.map +0 -1
- package/dist/runs/runner-port.js.map +0 -1
- package/dist/runs/verify-http.d.ts.map +0 -1
- package/dist/runs/verify-http.js.map +0 -1
- package/dist/runs/verify-server.d.ts.map +0 -1
- package/dist/runs/verify-server.js.map +0 -1
- package/dist/server-version.d.ts.map +0 -1
- package/dist/server-version.js.map +0 -1
- package/dist/session/control-envelope.d.ts.map +0 -1
- package/dist/session/control-envelope.js.map +0 -1
- package/dist/session/live-control-tools.d.ts.map +0 -1
- package/dist/session/live-control-tools.js.map +0 -1
- package/dist/session/live-control.d.ts.map +0 -1
- package/dist/session/live-control.js.map +0 -1
- package/dist/session/observed-state.d.ts.map +0 -1
- package/dist/session/observed-state.js.map +0 -1
- package/dist/session/output-budget.d.ts.map +0 -1
- package/dist/session/output-budget.js.map +0 -1
- package/dist/session/presenter-args.d.ts.map +0 -1
- package/dist/session/presenter-args.js.map +0 -1
- package/dist/session/review-store.d.ts.map +0 -1
- package/dist/session/review-store.js.map +0 -1
- package/dist/session/session-health.d.ts.map +0 -1
- package/dist/session/session-health.js.map +0 -1
- package/dist/session/session-manager.d.ts.map +0 -1
- package/dist/session/session-manager.js.map +0 -1
- package/dist/session/session-readiness.d.ts.map +0 -1
- package/dist/session/session-readiness.js.map +0 -1
- package/dist/session/session-reaper.d.ts.map +0 -1
- package/dist/session/session-reaper.js.map +0 -1
- package/dist/session/session-recommendation.d.ts.map +0 -1
- package/dist/session/session-recommendation.js.map +0 -1
- package/dist/session/session-tools.d.ts.map +0 -1
- package/dist/session/session-tools.js.map +0 -1
- package/dist/session/session.d.ts.map +0 -1
- package/dist/session/session.js.map +0 -1
- package/dist/session/state-select.d.ts.map +0 -1
- package/dist/session/state-select.js.map +0 -1
- package/dist/token-auth.d.ts.map +0 -1
- package/dist/token-auth.js.map +0 -1
- package/dist/tools/act-tools.d.ts.map +0 -1
- package/dist/tools/act-tools.js.map +0 -1
- package/dist/tools/act-view.d.ts.map +0 -1
- package/dist/tools/act-view.js.map +0 -1
- package/dist/tools/assert-grade.d.ts.map +0 -1
- package/dist/tools/assert-grade.js.map +0 -1
- package/dist/tools/browser-tools.d.ts.map +0 -1
- package/dist/tools/browser-tools.js.map +0 -1
- package/dist/tools/contract-tools.d.ts.map +0 -1
- package/dist/tools/contract-tools.js.map +0 -1
- package/dist/tools/dynamic-tools.d.ts.map +0 -1
- package/dist/tools/dynamic-tools.js.map +0 -1
- package/dist/tools/error-recovery.d.ts.map +0 -1
- package/dist/tools/error-recovery.js.map +0 -1
- package/dist/tools/invoke-tool.d.ts.map +0 -1
- package/dist/tools/invoke-tool.js.map +0 -1
- package/dist/tools/lease-tools.d.ts.map +0 -1
- package/dist/tools/lease-tools.js.map +0 -1
- package/dist/tools/merge-tools.d.ts.map +0 -1
- package/dist/tools/merge-tools.js.map +0 -1
- package/dist/tools/observe-tools.d.ts.map +0 -1
- package/dist/tools/observe-tools.js.map +0 -1
- package/dist/tools/profiles.d.ts.map +0 -1
- package/dist/tools/profiles.js.map +0 -1
- package/dist/tools/query-paginate.d.ts.map +0 -1
- package/dist/tools/query-paginate.js.map +0 -1
- package/dist/tools/read-tools.d.ts.map +0 -1
- package/dist/tools/read-tools.js.map +0 -1
- package/dist/tools/snapshot-delta.d.ts.map +0 -1
- package/dist/tools/snapshot-delta.js.map +0 -1
- package/dist/tools/tool-invoker.d.ts.map +0 -1
- package/dist/tools/tool-invoker.js.map +0 -1
- package/dist/tools/tool-kit.d.ts.map +0 -1
- package/dist/tools/tool-kit.js.map +0 -1
- package/dist/tools/tool-names.d.ts.map +0 -1
- package/dist/tools/tool-names.js.map +0 -1
- package/dist/tools/tools-helpers.d.ts.map +0 -1
- package/dist/tools/tools-helpers.js.map +0 -1
- package/dist/tools/tools.d.ts.map +0 -1
- package/dist/tools/tools.js.map +0 -1
- package/dist/update/update-checker.d.ts.map +0 -1
- package/dist/update/update-checker.js.map +0 -1
- package/dist/update/updater.d.ts.map +0 -1
- package/dist/update/updater.js.map +0 -1
- package/dist/visual/visual-diff.d.ts.map +0 -1
- package/dist/visual/visual-diff.js.map +0 -1
- package/dist/visual/visual-store.d.ts.map +0 -1
- package/dist/visual/visual-store.js.map +0 -1
- package/dist/visual/visual-tools.d.ts.map +0 -1
- package/dist/visual/visual-tools.js.map +0 -1
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { ContradictionKind, EventType } from '@reticlehq/core';
|
|
2
|
+
/**
|
|
3
|
+
* The app sent a money value back in a DIFFERENT unit than the API gave it.
|
|
4
|
+
*
|
|
5
|
+
* Payment APIs overwhelmingly speak minor units — Stripe, Razorpay, Adyen, PayPal all state amounts
|
|
6
|
+
* in paise/cents as integers. A UI renders that as a major-unit string, and the bug is writing the
|
|
7
|
+
* rendered number back into the field the integer came from.
|
|
8
|
+
*
|
|
9
|
+
* Measured on a real payments dashboard: `GET /payments` returns `amount: 118701` for a payment, the
|
|
10
|
+
* row renders "₹1,187.01", and the refund posts `{"amount": 1187.01}` into the same field. The server
|
|
11
|
+
* takes 1187 paise and answers `200 {"status": "processed"}`. That is a 100x UNDER-REFUND, and every
|
|
12
|
+
* channel agrees it worked: the status is 200, the payload says processed, the UI advances, the page
|
|
13
|
+
* settles, and the number in the request is exactly the number on the screen. Nothing disagrees,
|
|
14
|
+
* because the disagreement is with a value the API returned EARLIER in the session.
|
|
15
|
+
*
|
|
16
|
+
* Which is the point: this is only visible to something holding the whole request timeline with
|
|
17
|
+
* bodies. A snapshot cannot see it, a status column cannot see it, and a human reading the request
|
|
18
|
+
* sees the amount they expected.
|
|
19
|
+
*
|
|
20
|
+
* Not a heuristic about decimals. Firing on "an amount had a fractional part" would accuse every API
|
|
21
|
+
* that legitimately uses major units. This fires only when the SAME field of the SAME entity was
|
|
22
|
+
* observed at a different scale — a comparison, not a guess.
|
|
23
|
+
*/
|
|
24
|
+
/** Fields worth comparing. Deliberately short: money, not every number an app sends. */
|
|
25
|
+
const MONEY_FIELDS = new Set(['amount', 'value', 'price', 'total', 'fee', 'cost', 'balance']);
|
|
26
|
+
/**
|
|
27
|
+
* Scales that indicate a minor/major confusion. 100 covers two-decimal currencies; 1000 covers the
|
|
28
|
+
* three-decimal ones (KWD, BHD, JOD, TND).
|
|
29
|
+
*/
|
|
30
|
+
const SCALES = [100, 1000];
|
|
31
|
+
/**
|
|
32
|
+
* Prefixed ids (`pay_NkT10001`) and uuids, matched anywhere in a URL or a string field.
|
|
33
|
+
*
|
|
34
|
+
* Numeric ids are handled separately by path segment: `/api/orders/9/capture` is at least as common
|
|
35
|
+
* as a prefixed id, and a bare `9` cannot be pattern-matched out of arbitrary text without matching
|
|
36
|
+
* every other number too.
|
|
37
|
+
*/
|
|
38
|
+
const ID_PATTERN = /[A-Za-z]{2,}_[A-Za-z0-9]{2,}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}/g;
|
|
39
|
+
function parse(raw) {
|
|
40
|
+
if (typeof raw !== 'string' || raw.length === 0)
|
|
41
|
+
return undefined;
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(raw);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Every (id, field, value) triple in a payload, from objects that carry an id of their own. */
|
|
50
|
+
function moneyByEntity(node, into) {
|
|
51
|
+
if (Array.isArray(node)) {
|
|
52
|
+
for (const item of node)
|
|
53
|
+
moneyByEntity(item, into);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (typeof node !== 'object' || node === null)
|
|
57
|
+
return;
|
|
58
|
+
const record = node;
|
|
59
|
+
// An id may arrive as a number (`{"id": 9}`) — normalised so a numeric path segment matches it.
|
|
60
|
+
const raw = record['id'];
|
|
61
|
+
const id = typeof raw === 'string' ? raw : typeof raw === 'number' ? String(raw) : undefined;
|
|
62
|
+
if (id !== undefined) {
|
|
63
|
+
for (const [key, value] of Object.entries(record)) {
|
|
64
|
+
if (!MONEY_FIELDS.has(key) || typeof value !== 'number')
|
|
65
|
+
continue;
|
|
66
|
+
const fields = into.get(id) ?? new Map();
|
|
67
|
+
fields.set(key, value);
|
|
68
|
+
into.set(id, fields);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
for (const value of Object.values(record))
|
|
72
|
+
moneyByEntity(value, into);
|
|
73
|
+
}
|
|
74
|
+
/** Ids named anywhere in a URL or a request payload — how a write says which entity it targets. */
|
|
75
|
+
function idsIn(url, body) {
|
|
76
|
+
const found = new Set(url.match(ID_PATTERN) ?? []);
|
|
77
|
+
// Numeric path segments: `/api/orders/9/capture` names entity 9.
|
|
78
|
+
for (const segment of url.split('?')[0]?.split('/') ?? []) {
|
|
79
|
+
if (segment.length > 0 && /^\d+$/.test(segment))
|
|
80
|
+
found.add(segment);
|
|
81
|
+
}
|
|
82
|
+
if (typeof body === 'object' && body !== null) {
|
|
83
|
+
for (const value of Object.values(body)) {
|
|
84
|
+
if (typeof value === 'string')
|
|
85
|
+
for (const id of value.match(ID_PATTERN) ?? [])
|
|
86
|
+
found.add(id);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return Array.from(found);
|
|
90
|
+
}
|
|
91
|
+
/** The scale between a known value and a sent one, or undefined when they are consistent. */
|
|
92
|
+
function scaleBetween(known, sent) {
|
|
93
|
+
if (sent === 0 || known === 0)
|
|
94
|
+
return undefined;
|
|
95
|
+
for (const scale of SCALES) {
|
|
96
|
+
// A tolerance, because the major-unit form is a rounded render of the minor one.
|
|
97
|
+
if (Math.abs(known - sent * scale) <= scale / 2)
|
|
98
|
+
return scale;
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* @param prior events from BEFORE the window, used only to learn what the API has stated.
|
|
104
|
+
*
|
|
105
|
+
* The scale error is a disagreement with a value the API gave EARLIER — by definition before the
|
|
106
|
+
* action that sends it back. `reticle_assert` scopes its window to the last act's cursor, so the
|
|
107
|
+
* stating response falls outside it and `known` is empty exactly when it matters. Measured live on
|
|
108
|
+
* the payments panel: `reticle_observe` over a wide window reported the mismatch while `assert` on
|
|
109
|
+
* the same session reported none — the verdict tool, the one an agent gates on, was the blind one.
|
|
110
|
+
*
|
|
111
|
+
* Prior events TEACH, they are never themselves findings: widening the window instead would make
|
|
112
|
+
* every other rule blame this action for events it did not cause, and would re-report every earlier
|
|
113
|
+
* mistake on every assert.
|
|
114
|
+
*/
|
|
115
|
+
export function findUnitMismatches(events, prior = []) {
|
|
116
|
+
// What the API has told us about each entity so far, in the API's own units.
|
|
117
|
+
const known = new Map();
|
|
118
|
+
for (const event of prior) {
|
|
119
|
+
if (event.type !== EventType.NET_REQUEST)
|
|
120
|
+
continue;
|
|
121
|
+
const body = parse(event.data['responseBody']);
|
|
122
|
+
if (body !== undefined)
|
|
123
|
+
moneyByEntity(body, known);
|
|
124
|
+
}
|
|
125
|
+
const found = [];
|
|
126
|
+
const seen = new Set();
|
|
127
|
+
for (const event of events) {
|
|
128
|
+
if (event.type !== EventType.NET_REQUEST)
|
|
129
|
+
continue;
|
|
130
|
+
const url = typeof event.data['url'] === 'string' ? event.data['url'] : '';
|
|
131
|
+
const requestBody = parse(event.data['requestBody']);
|
|
132
|
+
// Compare BEFORE recording this call's own response, or a request that echoes its own reply
|
|
133
|
+
// would compare against itself.
|
|
134
|
+
if (typeof requestBody === 'object' && requestBody !== null) {
|
|
135
|
+
const sentFields = requestBody;
|
|
136
|
+
for (const id of idsIn(url, requestBody)) {
|
|
137
|
+
const fields = known.get(id);
|
|
138
|
+
if (fields === undefined)
|
|
139
|
+
continue;
|
|
140
|
+
for (const [key, sent] of Object.entries(sentFields)) {
|
|
141
|
+
if (!MONEY_FIELDS.has(key) || typeof sent !== 'number')
|
|
142
|
+
continue;
|
|
143
|
+
const priorValue = fields.get(key);
|
|
144
|
+
if (priorValue === undefined)
|
|
145
|
+
continue;
|
|
146
|
+
const scale = scaleBetween(priorValue, sent);
|
|
147
|
+
if (scale === undefined)
|
|
148
|
+
continue;
|
|
149
|
+
const key2 = `${id}:${key}`;
|
|
150
|
+
if (seen.has(key2))
|
|
151
|
+
continue;
|
|
152
|
+
seen.add(key2);
|
|
153
|
+
found.push({
|
|
154
|
+
kind: ContradictionKind.UNIT_MISMATCH,
|
|
155
|
+
claim: `the request sent ${key}=${String(sent)} and the server accepted it`,
|
|
156
|
+
counter: `the API reports ${key}=${String(priorValue)} for ${id} — the value sent is ${String(scale)}x SMALLER, i.e. a major-unit number written into a minor-unit field`,
|
|
157
|
+
detail: `${url} — at this scale the operation moves ${String(sent)} minor units instead of ${String(priorValue)}; nothing else can see this, because the number sent is exactly the number rendered on screen`,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const responseBody = parse(event.data['responseBody']);
|
|
163
|
+
if (responseBody !== undefined)
|
|
164
|
+
moneyByEntity(responseBody, known);
|
|
165
|
+
}
|
|
166
|
+
return found;
|
|
167
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ToolDef } from '../tools/tools.js';
|
|
2
|
+
/**
|
|
3
|
+
* `reticle_affected` — which saved flows must re-verify for a set of changed files.
|
|
4
|
+
*
|
|
5
|
+
* This logic already existed as `reticle affected`, deliberately kept off the MCP surface because an
|
|
6
|
+
* advertised tool costs tokens on every turn whether or not it is used. That reasoning is right, and
|
|
7
|
+
* this does not change it: the tool is NOT advertised by any profile. It is reachable through
|
|
8
|
+
* `reticle_run`, so it costs nothing per turn and is still discoverable via `reticle_tools`.
|
|
9
|
+
*
|
|
10
|
+
* What the reasoning missed is who holds the question. The AGENT is the one that just edited files
|
|
11
|
+
* and has to decide what to re-check; a shell command it may not be able to run is not an answer for
|
|
12
|
+
* an MCP client that has no shell. Leaving it CLI-only meant the party with the diff could not ask
|
|
13
|
+
* the party with the index.
|
|
14
|
+
*
|
|
15
|
+
* Unknown-provenance flows are returned as affected (fail-safe) AND listed separately, so "re-verify
|
|
16
|
+
* this" is never confused with "this definitely touches your change".
|
|
17
|
+
*/
|
|
18
|
+
export declare const AFFECTED_TOOLS: ToolDef[];
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ReticleTool } from '../tools/tool-names.js';
|
|
3
|
+
import { loadNamedFlows, resolveChangedFiles } from '../cli-flow-commands.js';
|
|
4
|
+
import { affectedSavedFlows } from './flow-sources.js';
|
|
5
|
+
/**
|
|
6
|
+
* `reticle_affected` — which saved flows must re-verify for a set of changed files.
|
|
7
|
+
*
|
|
8
|
+
* This logic already existed as `reticle affected`, deliberately kept off the MCP surface because an
|
|
9
|
+
* advertised tool costs tokens on every turn whether or not it is used. That reasoning is right, and
|
|
10
|
+
* this does not change it: the tool is NOT advertised by any profile. It is reachable through
|
|
11
|
+
* `reticle_run`, so it costs nothing per turn and is still discoverable via `reticle_tools`.
|
|
12
|
+
*
|
|
13
|
+
* What the reasoning missed is who holds the question. The AGENT is the one that just edited files
|
|
14
|
+
* and has to decide what to re-check; a shell command it may not be able to run is not an answer for
|
|
15
|
+
* an MCP client that has no shell. Leaving it CLI-only meant the party with the diff could not ask
|
|
16
|
+
* the party with the index.
|
|
17
|
+
*
|
|
18
|
+
* Unknown-provenance flows are returned as affected (fail-safe) AND listed separately, so "re-verify
|
|
19
|
+
* this" is never confused with "this definitely touches your change".
|
|
20
|
+
*/
|
|
21
|
+
export const AFFECTED_TOOLS = [
|
|
22
|
+
{
|
|
23
|
+
name: ReticleTool.AFFECTED,
|
|
24
|
+
description: 'Which saved flows must re-verify for a set of changed files. Pass the files you edited (and/or `since` for a git ref to diff against). Returns { changedFiles, affected, unknownProvenance } — `affected` is what to re-run, and `unknownProvenance` are flows included only because Reticle cannot tell which sources they cover, so they are re-verified by default rather than silently skipped.',
|
|
25
|
+
example: { files: ['src/App.tsx'] },
|
|
26
|
+
inputSchema: {
|
|
27
|
+
files: z
|
|
28
|
+
.array(z.string())
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Changed file paths, repo-relative (e.g. ["src/App.tsx"]).'),
|
|
31
|
+
since: z
|
|
32
|
+
.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Git ref to diff against (e.g. "HEAD~1", "main"). Unioned with `files`.'),
|
|
35
|
+
},
|
|
36
|
+
outputSchema: {
|
|
37
|
+
changedFiles: z.array(z.string()),
|
|
38
|
+
affected: z.array(z.string()),
|
|
39
|
+
unknownProvenance: z.array(z.string()),
|
|
40
|
+
},
|
|
41
|
+
handler: async (deps, args) => {
|
|
42
|
+
const files = Array.isArray(args['files'])
|
|
43
|
+
? args['files'].filter((f) => typeof f === 'string')
|
|
44
|
+
: [];
|
|
45
|
+
const since = typeof args['since'] === 'string' ? args['since'] : undefined;
|
|
46
|
+
const changedFiles = await resolveChangedFiles(files, since);
|
|
47
|
+
const flows = await loadNamedFlows(deps.fs, deps.reticleRoot);
|
|
48
|
+
const result = affectedSavedFlows(flows, changedFiles);
|
|
49
|
+
return { changedFiles, ...result };
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
];
|
package/dist/flows/affected.d.ts
CHANGED
|
@@ -22,4 +22,3 @@ export interface AffectedResult {
|
|
|
22
22
|
* a repo-relative change matches an absolute stamp and vice-versa.
|
|
23
23
|
*/
|
|
24
24
|
export declare function affectedFlows(flows: readonly FlowSources[], changedFiles: readonly string[]): AffectedResult;
|
|
25
|
-
//# sourceMappingURL=affected.d.ts.map
|
package/dist/flows/affected.js
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { AnnotationErrorCode, AnnotationSchema } from '@reticlehq/core';
|
|
3
|
+
import { RECOVERY } from '../tools/error-recovery.js';
|
|
4
|
+
/**
|
|
5
|
+
* An unknown kind is almost always a free-text annotation, which this tool deliberately refuses to
|
|
6
|
+
* guess into a predicate. Naming the six kinds turns a dead end into one retry.
|
|
7
|
+
*/
|
|
8
|
+
const UNKNOWN_KIND_RECOVERY = 'Annotations are structured, never free text. Pass one of: ' +
|
|
9
|
+
'{ kind: "assert-signal", name }, { kind: "assert-visible", testid }, ' +
|
|
10
|
+
'{ kind: "assert-state", statePath }, { kind: "mark-dynamic", testid }, ' +
|
|
11
|
+
'{ kind: "success-state", signal|testid }, or { kind: "intent", text }.';
|
|
3
12
|
import { ReticleTool } from '../tools/tool-names.js';
|
|
4
13
|
import { asString } from '../tools/tools-helpers.js';
|
|
5
14
|
import { compileAnnotation } from './annotate.js';
|
|
@@ -20,6 +29,7 @@ const DEFAULT_RECORDING = 'default';
|
|
|
20
29
|
export const ANNOTATE_TOOLS = [
|
|
21
30
|
{
|
|
22
31
|
name: ReticleTool.ANNOTATE,
|
|
32
|
+
example: { kind: 'assert-signal', name: 'todos:loaded' },
|
|
23
33
|
description: 'Attach a STRUCTURED annotation to the active recording, compiling it into the flow. kind: ' +
|
|
24
34
|
'assert-signal { name, dataMatches? } → the last step asserts that signal; assert-visible ' +
|
|
25
35
|
'{ testid } → the last step asserts that element is present; assert-state ' +
|
|
@@ -98,6 +108,7 @@ export const ANNOTATE_TOOLS = [
|
|
|
98
108
|
},
|
|
99
109
|
outputSchema: {
|
|
100
110
|
ok: z.boolean(),
|
|
111
|
+
recovery: z.string().optional(),
|
|
101
112
|
target: z.string().optional(),
|
|
102
113
|
compiled: z.string().optional(),
|
|
103
114
|
code: z.string().optional(),
|
|
@@ -107,12 +118,20 @@ export const ANNOTATE_TOOLS = [
|
|
|
107
118
|
// Structured boundary: a free NL string / unknown kind fails the schema → UNKNOWN_KIND.
|
|
108
119
|
const parsed = AnnotationSchema.safeParse(args);
|
|
109
120
|
if (!parsed.success) {
|
|
110
|
-
return Promise.resolve({
|
|
121
|
+
return Promise.resolve({
|
|
122
|
+
ok: false,
|
|
123
|
+
code: AnnotationErrorCode.UNKNOWN_KIND,
|
|
124
|
+
recovery: UNKNOWN_KIND_RECOVERY,
|
|
125
|
+
});
|
|
111
126
|
}
|
|
112
127
|
const stepCount = deps.recordings.stepCount(name);
|
|
113
128
|
const compiled = deps.recordings.getCompiled(name) !== undefined;
|
|
114
129
|
if (stepCount === undefined && !compiled) {
|
|
115
|
-
return Promise.resolve({
|
|
130
|
+
return Promise.resolve({
|
|
131
|
+
ok: false,
|
|
132
|
+
code: AnnotationErrorCode.NO_ACTIVE_RECORDING,
|
|
133
|
+
recovery: RECOVERY.MISSING_RECORDING,
|
|
134
|
+
});
|
|
116
135
|
}
|
|
117
136
|
const outcome = compileAnnotation(parsed.data, stepCount ?? 0);
|
|
118
137
|
if (!outcome.result.ok)
|
|
@@ -133,4 +152,3 @@ export const ANNOTATE_TOOLS = [
|
|
|
133
152
|
},
|
|
134
153
|
},
|
|
135
154
|
];
|
|
136
|
-
//# sourceMappingURL=annotate-tools.js.map
|
package/dist/flows/annotate.d.ts
CHANGED
|
@@ -19,4 +19,3 @@ export declare function compileAnnotation(a: Annotation, stepCount: number): Ann
|
|
|
19
19
|
* e.g. `will assert signal diff:shown`. The leading word is the named COMPILED_PREDICATE_PREFIX.
|
|
20
20
|
*/
|
|
21
21
|
export declare function describeCompiled(a: Annotation): string;
|
|
22
|
-
//# sourceMappingURL=annotate.d.ts.map
|
package/dist/flows/annotate.js
CHANGED
|
@@ -77,4 +77,3 @@ export declare class AssertionTiersStore {
|
|
|
77
77
|
/** Record one flow's assertion shape + covered sources after it PASSED. Never breaks a replay. */
|
|
78
78
|
recordPassing(name: string, steps: readonly StepExpect[], sources?: readonly string[]): Promise<void>;
|
|
79
79
|
}
|
|
80
|
-
//# sourceMappingURL=assertion-tiers-store.d.ts.map
|
package/dist/flows/coverage.d.ts
CHANGED
package/dist/flows/coverage.js
CHANGED
package/dist/flows/decision.d.ts
CHANGED
package/dist/flows/decision.js
CHANGED
package/dist/flows/flake.d.ts
CHANGED
|
@@ -55,4 +55,3 @@ export declare function recordOutcome(record: FlakeRecord, passed: boolean): Fla
|
|
|
55
55
|
export declare function isFlaky(record: FlakeRecord, minRuns?: number): boolean;
|
|
56
56
|
/** Observed intermittent-failure rate (0 when too few runs to judge). */
|
|
57
57
|
export declare function flakeRate(record: FlakeRecord): number;
|
|
58
|
-
//# sourceMappingURL=flake.d.ts.map
|
package/dist/flows/flake.js
CHANGED
|
@@ -30,4 +30,3 @@ export declare function replayNamedFlow(deps: ToolDeps, args: Record<string, unk
|
|
|
30
30
|
* documented to work headless), so a missing/unknown session degrades to the global/legacy store.
|
|
31
31
|
*/
|
|
32
32
|
export declare function sessionProjectId(deps: ToolDeps, sessionId: string | undefined): string | undefined;
|
|
33
|
-
//# sourceMappingURL=flow-replay-run.d.ts.map
|
|
@@ -9,6 +9,10 @@ import { AssertionTiersStore } from './assertion-tiers-store.js';
|
|
|
9
9
|
import { toFlowSources } from './flow-sources.js';
|
|
10
10
|
import { reportAndAccumulate } from '../journal/deviation-service.js';
|
|
11
11
|
import { EnvelopeStore } from '../journal/envelope-store.js';
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { syncRunRecordToCloud, SyncOutcome } from '../cloud/cloud-sync.js';
|
|
14
|
+
import { resolveProjectCloud } from '../cloud/cloud-config.js';
|
|
15
|
+
import { log } from '../log.js';
|
|
12
16
|
export function latestRecordedFlow(events) {
|
|
13
17
|
for (let i = events.length - 1; i >= 0; i--) {
|
|
14
18
|
const event = events[i];
|
|
@@ -26,11 +30,11 @@ export function flowErrorMessage(code) {
|
|
|
26
30
|
case FlowErrorCode.INVALID_NAME:
|
|
27
31
|
return 'invalid flow name — use a single safe segment (letters/digits/-/_), no path separators';
|
|
28
32
|
case FlowErrorCode.NOT_FOUND:
|
|
29
|
-
return 'no such flow on disk — run
|
|
33
|
+
return 'no such flow on disk — run reticle_flow{action:"list"} to see saved flows';
|
|
30
34
|
case FlowErrorCode.PARSE_FAILED:
|
|
31
35
|
return 'flow file is malformed — fix or regenerate it with reticle_flow_save';
|
|
32
36
|
case FlowErrorCode.NO_RECORDING:
|
|
33
|
-
return 'no compiled recording by that name — record one (
|
|
37
|
+
return 'no compiled recording by that name — record one (reticle_record{action:"start"|"stop"}) first';
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
40
|
/** Map the wire ReplayStatus onto the persisted RunStatus (ok→pass). */
|
|
@@ -44,15 +48,28 @@ function replayToRunStatus(status) {
|
|
|
44
48
|
return RunStatus.ERROR;
|
|
45
49
|
}
|
|
46
50
|
}
|
|
47
|
-
/**
|
|
48
|
-
|
|
51
|
+
/**
|
|
52
|
+
* Append a flow-replay outcome to .reticle/project.json (never throws into replay) and, when logged in,
|
|
53
|
+
* best-effort mirror it to Reticle Cloud so the team's server-side regression history stays current. The
|
|
54
|
+
* cloud push is fire-and-forget: not logged in → skipped, a network failure is logged and swallowed.
|
|
55
|
+
*/
|
|
56
|
+
async function recordReplayRun(deps, name, status, driftSteps, durationMs, projectId) {
|
|
57
|
+
const runStatus = replayToRunStatus(status);
|
|
49
58
|
await deps.project.recordRun({
|
|
50
59
|
kind: RunKind.FLOW_REPLAY,
|
|
51
60
|
name,
|
|
52
|
-
status:
|
|
61
|
+
status: runStatus,
|
|
53
62
|
evidence: { driftSteps },
|
|
54
63
|
durationMs,
|
|
55
64
|
});
|
|
65
|
+
// Per-project cloud: push memory outcomes only when cloud is attached AND memory sync is enabled.
|
|
66
|
+
const cloud = await resolveProjectCloud(deps.fs, deps.reticleRoot, homedir(), process.env);
|
|
67
|
+
if (cloud.config === null || !cloud.policy.memory)
|
|
68
|
+
return; // not attached / memory disabled → local only
|
|
69
|
+
const result = await syncRunRecordToCloud({ kind: RunKind.FLOW_REPLAY, name, status: runStatus, at: deps.now(), durationMs }, projectId, cloud.config, (url, init) => fetch(url, init));
|
|
70
|
+
if (result.outcome !== SyncOutcome.SYNCED) {
|
|
71
|
+
log('cloud-run-record-sync-failed', { flow: name, status: result.status, error: result.error });
|
|
72
|
+
}
|
|
56
73
|
}
|
|
57
74
|
/**
|
|
58
75
|
* When a flow records the page its journey started on (`startPath`) and the tab is currently on a
|
|
@@ -95,7 +112,7 @@ export async function replayNamedFlow(deps, args) {
|
|
|
95
112
|
}
|
|
96
113
|
const loaded = await deps.flows.load(name, projectId);
|
|
97
114
|
if (!loaded.ok) {
|
|
98
|
-
await recordReplayRun(deps, name, ReplayStatus.ERROR, 0, deps.now() - startedAt);
|
|
115
|
+
await recordReplayRun(deps, name, ReplayStatus.ERROR, 0, deps.now() - startedAt, projectId);
|
|
99
116
|
return {
|
|
100
117
|
name,
|
|
101
118
|
status: ReplayStatus.ERROR,
|
|
@@ -129,7 +146,7 @@ export async function replayNamedFlow(deps, args) {
|
|
|
129
146
|
const driftSteps = steps.filter((s) => s.drift !== undefined).length;
|
|
130
147
|
const allOk = steps.every((s) => s.ok);
|
|
131
148
|
const status = driftSteps > 0 ? ReplayStatus.DRIFT : allOk ? ReplayStatus.OK : ReplayStatus.ERROR;
|
|
132
|
-
await recordReplayRun(deps, name, status, driftSteps, deps.now() - startedAt);
|
|
149
|
+
await recordReplayRun(deps, name, status, driftSteps, deps.now() - startedAt, projectId);
|
|
133
150
|
// Anti-reward-hacking baseline: record what this flow asserted ONLY when it passed clean. A
|
|
134
151
|
// failing run must never become the baseline a later weakening is measured against.
|
|
135
152
|
if (status === ReplayStatus.OK) {
|
|
@@ -199,4 +216,3 @@ export function sessionProjectId(deps, sessionId) {
|
|
|
199
216
|
return undefined;
|
|
200
217
|
}
|
|
201
218
|
}
|
|
202
|
-
//# sourceMappingURL=flow-replay-run.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CommandResult, type FlowFile, type FlowStepResult, type ReticleEvent } from '@reticlehq/core';
|
|
1
|
+
import { AnchorKind, type CommandResult, type FlowAnchor, type FlowFile, type FlowStepResult, type ReticleEvent, type QueryEmptyHint } from '@reticlehq/core';
|
|
2
2
|
import type { EvalResult, Predicate } from '../events/predicate.js';
|
|
3
3
|
/**
|
|
4
4
|
* The session surface flow-replay needs: QUERY to re-resolve a testid anchor against the live
|
|
@@ -40,13 +40,31 @@ export declare function editDistance(a: string, b: string): number;
|
|
|
40
40
|
*/
|
|
41
41
|
export declare function nearestTestid(missing: string, present: string[]): string | null;
|
|
42
42
|
/** Injected sleeper so tests drive replay with a no-op clock; production waits on a real timer. */
|
|
43
|
-
type Sleep = (ms: number) => Promise<void>;
|
|
43
|
+
export type Sleep = (ms: number) => Promise<void>;
|
|
44
44
|
/**
|
|
45
45
|
* True when ≥2 present testids tie at the minimum edit distance to the missing one — `nearest` is
|
|
46
46
|
* then an arbitrary lexical-tiebreak pick, so auto-healing would be a coin-flip between candidates.
|
|
47
47
|
* Such a drift is surfaced (with a nearest) but never auto-healed.
|
|
48
48
|
*/
|
|
49
49
|
export declare function nearestIsAmbiguous(missing: string, present: string[]): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Re-resolve any QUERY against the live DOM, tolerating an in-flight render: QUERY, and while it
|
|
52
|
+
* returns zero refs, sleep and retry up to ANCHOR_SETTLE_ATTEMPTS. Returns as soon as refs appear,
|
|
53
|
+
* so a present anchor costs one query; a genuinely missing one costs the full (bounded) settle and
|
|
54
|
+
* then drifts. The last result's near-miss hint is returned for the drift record.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveQuery(session: FlowReplaySession, queryArgs: Record<string, unknown>, sleep: Sleep): Promise<{
|
|
57
|
+
refs: string[];
|
|
58
|
+
hint?: QueryEmptyHint;
|
|
59
|
+
}>;
|
|
60
|
+
/** A compact, legible label for a component auto-anchor (component@file:line, or its best part). */
|
|
61
|
+
export declare function componentLabel(anchor: Extract<FlowAnchor, {
|
|
62
|
+
kind: typeof AnchorKind.COMPONENT;
|
|
63
|
+
}>): string;
|
|
64
|
+
/** QUERY args for a component auto-anchor — source (precise) + component name (coarse) as given. */
|
|
65
|
+
export declare function componentQueryArgs(anchor: Extract<FlowAnchor, {
|
|
66
|
+
kind: typeof AnchorKind.COMPONENT;
|
|
67
|
+
}>): Record<string, unknown>;
|
|
50
68
|
/**
|
|
51
69
|
* Replay a loaded flow by RE-RESOLVING every step's semantic anchor against the live DOM — never
|
|
52
70
|
* a stale ref. A testid anchor is re-found by reticle_query; a signal anchor waits on a predicate.
|
|
@@ -54,5 +72,3 @@ export declare function nearestIsAmbiguous(missing: string, present: string[]):
|
|
|
54
72
|
* results. This is the "whose fault is it" contract, not a blind "command failed".
|
|
55
73
|
*/
|
|
56
74
|
export declare function replayFlow(session: FlowReplaySession, flow: FlowFile, waitForSignal: WaitForSignal, signalTimeoutMs: number, confirmDangerous?: boolean, sleep?: Sleep): Promise<FlowStepResult[]>;
|
|
57
|
-
export {};
|
|
58
|
-
//# sourceMappingURL=flow-replay.d.ts.map
|