@atsumell/trace-weave 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/index.js +5 -1
- package/dist/ai/index.js.map +1 -1
- package/dist/builder/index.d.ts +7 -0
- package/dist/builder/index.js +1 -1
- package/dist/{chunk-EICHUHZH.js → chunk-BERJ36PI.js} +17 -3
- package/dist/chunk-BERJ36PI.js.map +1 -0
- package/dist/{chunk-WIW3TVEK.js → chunk-JB27QVDU.js} +5 -4
- package/dist/chunk-JB27QVDU.js.map +1 -0
- package/dist/chunk-NWSJAWTR.js +37 -0
- package/dist/chunk-NWSJAWTR.js.map +1 -0
- package/dist/{chunk-35PKIXFV.js → chunk-URKC7X5C.js} +1 -1
- package/dist/chunk-URKC7X5C.js.map +1 -0
- package/dist/chunk-ZLMOGNRR.js +44 -0
- package/dist/chunk-ZLMOGNRR.js.map +1 -0
- package/dist/compiler/index.js +1 -1
- package/dist/fast-check/index.js +10 -3
- package/dist/fast-check/index.js.map +1 -1
- package/dist/monitor/index.js +2 -2
- package/dist/patterns/index.js +1 -1
- package/dist/vitest/index.js +15 -5
- package/dist/vitest/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-35PKIXFV.js.map +0 -1
- package/dist/chunk-EICHUHZH.js.map +0 -1
- package/dist/chunk-WIW3TVEK.js.map +0 -1
package/dist/ai/index.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import {
|
|
2
|
+
safeStringify
|
|
3
|
+
} from "../chunk-NWSJAWTR.js";
|
|
4
|
+
|
|
1
5
|
// src/ai/schema.ts
|
|
2
6
|
var formulaDocumentSchema = {
|
|
3
7
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
@@ -102,7 +106,7 @@ function formatReport(report, doc) {
|
|
|
102
106
|
...steps.map((s) => ` [step ${s.step}] ${s.label} (${s.nodeId}): ${s.verdict}`),
|
|
103
107
|
"",
|
|
104
108
|
"Trace:",
|
|
105
|
-
...report.traceSlice.map((t) => ` step ${t.step}: ${
|
|
109
|
+
...report.traceSlice.map((t) => ` step ${t.step}: ${safeStringify(t.event)}`),
|
|
106
110
|
"",
|
|
107
111
|
report.summary
|
|
108
112
|
];
|
package/dist/ai/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ai/schema.ts","../../src/ai/metadata.ts","../../src/ai/format-report.ts"],"sourcesContent":["import type { JsonValue } from \"../core/values.js\";\n\nexport const formulaDocumentSchema: JsonValue = {\n\t$schema: \"http://json-schema.org/draft-07/schema#\",\n\ttitle: \"FormulaDocument\",\n\tdescription: \"A compiled LTLf formula document for trace-weave\",\n\ttype: \"object\",\n\trequired: [\"schemaVersion\", \"root\", \"nodes\"],\n\tproperties: {\n\t\tschemaVersion: { type: \"number\", const: 1 },\n\t\troot: { type: \"string\", description: \"NodeId of the root formula node\" },\n\t\tnodes: {\n\t\t\ttype: \"object\",\n\t\t\tdescription: \"Map from NodeId to FormulaNode\",\n\t\t\tadditionalProperties: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"kind\"],\n\t\t\t\tproperties: {\n\t\t\t\t\tkind: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tenum: [\n\t\t\t\t\t\t\t\"literal\",\n\t\t\t\t\t\t\t\"predicate\",\n\t\t\t\t\t\t\t\"when\",\n\t\t\t\t\t\t\t\"capture\",\n\t\t\t\t\t\t\t\"not\",\n\t\t\t\t\t\t\t\"and\",\n\t\t\t\t\t\t\t\"or\",\n\t\t\t\t\t\t\t\"implies\",\n\t\t\t\t\t\t\t\"always\",\n\t\t\t\t\t\t\t\"eventually\",\n\t\t\t\t\t\t\t\"next\",\n\t\t\t\t\t\t\t\"weakNext\",\n\t\t\t\t\t\t\t\"until\",\n\t\t\t\t\t\t\t\"release\",\n\t\t\t\t\t\t\t\"once\",\n\t\t\t\t\t\t\t\"historically\",\n\t\t\t\t\t\t\t\"since\",\n\t\t\t\t\t\t\t\"withinSteps\",\n\t\t\t\t\t\t\t\"withinMs\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tprovenance: {\n\t\t\ttype: \"object\",\n\t\t\tdescription: \"Optional provenance information for nodes\",\n\t\t\tadditionalProperties: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\tnodeId: { type: \"string\" },\n\t\t\t\t\torigin: { type: \"string\", enum: [\"user\", \"compiler\", \"pattern\"] },\n\t\t\t\t\tsourceExprKind: { type: \"string\" },\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\thumanLabel: { type: \"string\" },\n\t\t\t\t\t\t\tconfidence: { type: \"number\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n};\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { NodeId } from \"../core/ids.js\";\nimport type { FormulaMeta, NodeProvenance } from \"../core/meta.js\";\n\nexport function getNodeLabel(doc: FormulaDocument, nodeId: NodeId): string {\n\tconst provenance = doc.provenance?.[nodeId];\n\tif (provenance?.meta?.humanLabel) return provenance.meta.humanLabel;\n\n\tconst node = doc.nodes[nodeId];\n\treturn node?.kind ?? \"unknown\";\n}\n\nexport function getNodeProvenance(\n\tdoc: FormulaDocument,\n\tnodeId: NodeId,\n): NodeProvenance | undefined {\n\treturn doc.provenance?.[nodeId];\n}\n\nexport function getAllLabels(doc: FormulaDocument): Record<NodeId, string> {\n\tconst labels: Record<string, string> = {};\n\tfor (const nodeId of Object.keys(doc.nodes)) {\n\t\tlabels[nodeId] = getNodeLabel(doc, nodeId as NodeId);\n\t}\n\treturn labels as Record<NodeId, string>;\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { CounterexampleReport } from \"../monitor/types.js\";\nimport { getNodeLabel } from \"./metadata.js\";\n\nexport interface FormattedReport {\n\treadonly structured: {\n\t\treadonly verdict: string;\n\t\treadonly steps: readonly {\n\t\t\treadonly nodeId: string;\n\t\t\treadonly label: string;\n\t\t\treadonly verdict: string;\n\t\t\treadonly step: number;\n\t\t}[];\n\t\treadonly traceSlice: readonly { step: number; event: unknown }[];\n\t};\n\treadonly text: string;\n}\n\nexport function formatReport(report: CounterexampleReport, doc: FormulaDocument): FormattedReport {\n\tconst steps = report.failurePath.map((snap) => ({\n\t\tnodeId: snap.nodeId as string,\n\t\tlabel: getNodeLabel(doc, snap.nodeId),\n\t\tverdict: snap.verdict,\n\t\tstep: snap.step,\n\t}));\n\n\tconst structured = {\n\t\tverdict: report.verdict,\n\t\tsteps,\n\t\ttraceSlice: report.traceSlice,\n\t};\n\n\tconst textParts: string[] = [\n\t\t`Verdict: ${report.verdict}`,\n\t\t\"\",\n\t\t\"Failure Path:\",\n\t\t...steps.map((s) => ` [step ${s.step}] ${s.label} (${s.nodeId}): ${s.verdict}`),\n\t\t\"\",\n\t\t\"Trace:\",\n\t\t...report.traceSlice.map((t) => ` step ${t.step}: ${
|
|
1
|
+
{"version":3,"sources":["../../src/ai/schema.ts","../../src/ai/metadata.ts","../../src/ai/format-report.ts"],"sourcesContent":["import type { JsonValue } from \"../core/values.js\";\n\nexport const formulaDocumentSchema: JsonValue = {\n\t$schema: \"http://json-schema.org/draft-07/schema#\",\n\ttitle: \"FormulaDocument\",\n\tdescription: \"A compiled LTLf formula document for trace-weave\",\n\ttype: \"object\",\n\trequired: [\"schemaVersion\", \"root\", \"nodes\"],\n\tproperties: {\n\t\tschemaVersion: { type: \"number\", const: 1 },\n\t\troot: { type: \"string\", description: \"NodeId of the root formula node\" },\n\t\tnodes: {\n\t\t\ttype: \"object\",\n\t\t\tdescription: \"Map from NodeId to FormulaNode\",\n\t\t\tadditionalProperties: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"kind\"],\n\t\t\t\tproperties: {\n\t\t\t\t\tkind: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tenum: [\n\t\t\t\t\t\t\t\"literal\",\n\t\t\t\t\t\t\t\"predicate\",\n\t\t\t\t\t\t\t\"when\",\n\t\t\t\t\t\t\t\"capture\",\n\t\t\t\t\t\t\t\"not\",\n\t\t\t\t\t\t\t\"and\",\n\t\t\t\t\t\t\t\"or\",\n\t\t\t\t\t\t\t\"implies\",\n\t\t\t\t\t\t\t\"always\",\n\t\t\t\t\t\t\t\"eventually\",\n\t\t\t\t\t\t\t\"next\",\n\t\t\t\t\t\t\t\"weakNext\",\n\t\t\t\t\t\t\t\"until\",\n\t\t\t\t\t\t\t\"release\",\n\t\t\t\t\t\t\t\"once\",\n\t\t\t\t\t\t\t\"historically\",\n\t\t\t\t\t\t\t\"since\",\n\t\t\t\t\t\t\t\"withinSteps\",\n\t\t\t\t\t\t\t\"withinMs\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tprovenance: {\n\t\t\ttype: \"object\",\n\t\t\tdescription: \"Optional provenance information for nodes\",\n\t\t\tadditionalProperties: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\tnodeId: { type: \"string\" },\n\t\t\t\t\torigin: { type: \"string\", enum: [\"user\", \"compiler\", \"pattern\"] },\n\t\t\t\t\tsourceExprKind: { type: \"string\" },\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\thumanLabel: { type: \"string\" },\n\t\t\t\t\t\t\tconfidence: { type: \"number\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n};\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { NodeId } from \"../core/ids.js\";\nimport type { FormulaMeta, NodeProvenance } from \"../core/meta.js\";\n\nexport function getNodeLabel(doc: FormulaDocument, nodeId: NodeId): string {\n\tconst provenance = doc.provenance?.[nodeId];\n\tif (provenance?.meta?.humanLabel) return provenance.meta.humanLabel;\n\n\tconst node = doc.nodes[nodeId];\n\treturn node?.kind ?? \"unknown\";\n}\n\nexport function getNodeProvenance(\n\tdoc: FormulaDocument,\n\tnodeId: NodeId,\n): NodeProvenance | undefined {\n\treturn doc.provenance?.[nodeId];\n}\n\nexport function getAllLabels(doc: FormulaDocument): Record<NodeId, string> {\n\tconst labels: Record<string, string> = {};\n\tfor (const nodeId of Object.keys(doc.nodes)) {\n\t\tlabels[nodeId] = getNodeLabel(doc, nodeId as NodeId);\n\t}\n\treturn labels as Record<NodeId, string>;\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport { safeStringify } from \"../core/safe-stringify.js\";\nimport type { CounterexampleReport } from \"../monitor/types.js\";\nimport { getNodeLabel } from \"./metadata.js\";\n\nexport interface FormattedReport {\n\treadonly structured: {\n\t\treadonly verdict: string;\n\t\treadonly steps: readonly {\n\t\t\treadonly nodeId: string;\n\t\t\treadonly label: string;\n\t\t\treadonly verdict: string;\n\t\t\treadonly step: number;\n\t\t}[];\n\t\treadonly traceSlice: readonly { step: number; event: unknown }[];\n\t};\n\treadonly text: string;\n}\n\nexport function formatReport(report: CounterexampleReport, doc: FormulaDocument): FormattedReport {\n\tconst steps = report.failurePath.map((snap) => ({\n\t\tnodeId: snap.nodeId as string,\n\t\tlabel: getNodeLabel(doc, snap.nodeId),\n\t\tverdict: snap.verdict,\n\t\tstep: snap.step,\n\t}));\n\n\tconst structured = {\n\t\tverdict: report.verdict,\n\t\tsteps,\n\t\ttraceSlice: report.traceSlice,\n\t};\n\n\tconst textParts: string[] = [\n\t\t`Verdict: ${report.verdict}`,\n\t\t\"\",\n\t\t\"Failure Path:\",\n\t\t...steps.map((s) => ` [step ${s.step}] ${s.label} (${s.nodeId}): ${s.verdict}`),\n\t\t\"\",\n\t\t\"Trace:\",\n\t\t...report.traceSlice.map((t) => ` step ${t.step}: ${safeStringify(t.event)}`),\n\t\t\"\",\n\t\treport.summary,\n\t];\n\n\treturn {\n\t\tstructured,\n\t\ttext: textParts.join(\"\\n\"),\n\t};\n}\n"],"mappings":"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","names":[]}
|
package/dist/builder/index.d.ts
CHANGED
|
@@ -4,6 +4,13 @@ import { F as FormulaExpr, A as AlwaysExpr, a as AndExpr, C as CaptureExpr, E as
|
|
|
4
4
|
declare function toExpr(v: boolean | FormulaExpr): FormulaExpr;
|
|
5
5
|
declare function annotate(expr: FormulaExpr, meta: FormulaMeta): FormulaExpr;
|
|
6
6
|
declare function literal(value: boolean): LiteralExpr;
|
|
7
|
+
/**
|
|
8
|
+
* Point assertion at the current trace position.
|
|
9
|
+
*
|
|
10
|
+
* When used as the root formula, this checks only position 0 of the trace.
|
|
11
|
+
* Wrap it with `eventually(...)` to ask whether the predicate appears anywhere
|
|
12
|
+
* in the trace, or with `always(...)` to require it at every position.
|
|
13
|
+
*/
|
|
7
14
|
declare function predicate(predicateId: PredicateId, ...args: readonly ValueExprArg[]): PredicateExpr;
|
|
8
15
|
declare function when(captureName: CaptureName, selectorId: SelectorId, child: boolean | FormulaExpr): WhenExpr;
|
|
9
16
|
declare function capture(captureName: CaptureName, selectorId: SelectorId, child: boolean | FormulaExpr): CaptureExpr;
|
package/dist/builder/index.js
CHANGED
|
@@ -7,8 +7,9 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
compile,
|
|
9
9
|
print,
|
|
10
|
+
printNodeAt,
|
|
10
11
|
validate
|
|
11
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-JB27QVDU.js";
|
|
12
13
|
import {
|
|
13
14
|
activationId
|
|
14
15
|
} from "./chunk-B4SEKVLL.js";
|
|
@@ -362,9 +363,22 @@ function buildCounterexampleReport(doc, runtime, trace) {
|
|
|
362
363
|
verdict: "violated",
|
|
363
364
|
failurePath,
|
|
364
365
|
traceSlice: trace.map((event, i) => ({ step: i + 1, event })),
|
|
365
|
-
summary:
|
|
366
|
+
summary: buildViolationSummary(doc, trace, failurePath)
|
|
366
367
|
};
|
|
367
368
|
}
|
|
369
|
+
function buildViolationSummary(doc, trace, failurePath) {
|
|
370
|
+
const renderedFormula = print(doc);
|
|
371
|
+
const terminal = failurePath.at(-1);
|
|
372
|
+
if (!terminal) {
|
|
373
|
+
return `Formula violated: ${renderedFormula}`;
|
|
374
|
+
}
|
|
375
|
+
const focusedObligation = printNodeAt(terminal.nodeId, doc);
|
|
376
|
+
const traceEntry = trace[terminal.step];
|
|
377
|
+
if (traceEntry === void 0) {
|
|
378
|
+
return `Formula violated: ${renderedFormula} at trace end (position ${terminal.step}) while checking ${focusedObligation}`;
|
|
379
|
+
}
|
|
380
|
+
return `Formula violated: ${renderedFormula} at position ${terminal.step} (step ${terminal.step + 1}) while checking ${focusedObligation}`;
|
|
381
|
+
}
|
|
368
382
|
function collectFailurePath(ctx, nodeId, pos, env, path) {
|
|
369
383
|
const verdict = evaluateFiniteNode(ctx, nodeId, pos, env);
|
|
370
384
|
path.push({
|
|
@@ -686,4 +700,4 @@ export {
|
|
|
686
700
|
evaluateFormula,
|
|
687
701
|
runOracle
|
|
688
702
|
};
|
|
689
|
-
//# sourceMappingURL=chunk-
|
|
703
|
+
//# sourceMappingURL=chunk-BERJ36PI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/monitor/eval-common.ts","../src/monitor/unsupported.ts","../src/monitor/time.ts","../src/monitor/evaluate-finite.ts","../src/monitor/evaluate.ts","../src/monitor/diagnostics.ts","../src/monitor/run-oracle.ts"],"sourcesContent":["import type { NodeId } from \"../core/ids.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport type { JsonValue, ValueExprArg } from \"../core/values.js\";\n\nexport type EvalEnv = Map<string, JsonValue>;\n\nexport function envKey(env: EvalEnv): string {\n\tconst entries = [...env.entries()].sort(([left], [right]) => left.localeCompare(right));\n\treturn JSON.stringify(entries);\n}\n\nexport function cacheKey(nodeId: NodeId, pos: number, env: EvalEnv): string {\n\treturn `${nodeId}:${pos}:${envKey(env)}`;\n}\n\nexport function resolveArg<TEvent>(\n\targ: ValueExprArg,\n\tevent: TEvent,\n\truntime: MonitorRuntime<TEvent>,\n): JsonValue {\n\tif (arg.kind === \"literal\") {\n\t\treturn arg.value;\n\t}\n\n\tconst selectorFn = runtime.selectors[arg.selectorId];\n\tif (!selectorFn) {\n\t\treturn null;\n\t}\n\n\treturn selectorFn(event);\n}\n\nexport function jsonEqual(a: JsonValue, b: JsonValue): boolean {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tif (a === null || b === null) {\n\t\treturn a === b;\n\t}\n\n\tif (typeof a !== typeof b) {\n\t\treturn false;\n\t}\n\n\tif (typeof a !== \"object\") {\n\t\treturn a === b;\n\t}\n\n\tif (Array.isArray(a)) {\n\t\tif (!Array.isArray(b) || a.length !== b.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn a.every((value, index) => jsonEqual(value, b[index]!));\n\t}\n\n\tif (Array.isArray(b)) {\n\t\treturn false;\n\t}\n\n\tconst aObject = a as Record<string, JsonValue>;\n\tconst bObject = b as Record<string, JsonValue>;\n\tconst aKeys = Object.keys(aObject).sort();\n\tconst bKeys = Object.keys(bObject).sort();\n\tif (aKeys.length !== bKeys.length) {\n\t\treturn false;\n\t}\n\n\treturn aKeys.every(\n\t\t(key, index) => key === bKeys[index] && jsonEqual(aObject[key]!, bObject[key]!),\n\t);\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\n\nexport const WITHIN_MS_RUNTIME_MESSAGE =\n\t\"withinMs requires MonitorRuntime.timestamp to be defined and return event timestamps in milliseconds.\";\n\nexport const WITHIN_MS_TIMESTAMP_MESSAGE =\n\t\"MonitorRuntime.timestamp must return a finite number of milliseconds for every event.\";\n\nexport const WITHIN_MS_NON_MONOTONIC_MESSAGE =\n\t\"MonitorRuntime.timestamp must be non-decreasing across the trace when using withinMs.\";\n\nexport function usesWithinMs(doc: FormulaDocument): boolean {\n\tfor (const node of Object.values(doc.nodes)) {\n\t\tif (node.kind === \"withinMs\") {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function assertWithinMsRuntimeSupport<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n): void {\n\tif (usesWithinMs(doc) && !runtime.timestamp) {\n\t\tthrow new Error(WITHIN_MS_RUNTIME_MESSAGE);\n\t}\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport {\n\tWITHIN_MS_NON_MONOTONIC_MESSAGE,\n\tWITHIN_MS_TIMESTAMP_MESSAGE,\n\tassertWithinMsRuntimeSupport,\n\tusesWithinMs,\n} from \"./unsupported.js\";\n\nexport function getTimestamp<TEvent>(runtime: MonitorRuntime<TEvent>, event: TEvent): number {\n\tconst timestamp = runtime.timestamp?.(event);\n\tif (timestamp === undefined || !Number.isFinite(timestamp)) {\n\t\tthrow new Error(WITHIN_MS_TIMESTAMP_MESSAGE);\n\t}\n\treturn timestamp;\n}\n\nexport function assertTimeSupportForTrace<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): void {\n\tif (!usesWithinMs(doc)) return;\n\tassertWithinMsRuntimeSupport(doc, runtime);\n\n\tlet previous = Number.NEGATIVE_INFINITY;\n\tfor (const event of trace) {\n\t\tconst current = getTimestamp(runtime, event);\n\t\tif (current < previous) {\n\t\t\tthrow new Error(WITHIN_MS_NON_MONOTONIC_MESSAGE);\n\t\t}\n\t\tprevious = current;\n\t}\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { FormulaNode } from \"../core/formula-node.js\";\nimport type { NodeId } from \"../core/ids.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport type { Verdict } from \"../core/verdict.js\";\nimport { andV, impliesV, notV, orV } from \"../core/verdict.js\";\nimport { type EvalEnv, cacheKey, jsonEqual, resolveArg } from \"./eval-common.js\";\nimport { assertTimeSupportForTrace, getTimestamp } from \"./time.js\";\n\nexport interface FiniteEvalContext<TEvent> {\n\treadonly doc: FormulaDocument;\n\treadonly runtime: MonitorRuntime<TEvent>;\n\treadonly trace: readonly TEvent[];\n\treadonly cache: Map<string, Verdict>;\n}\n\nexport function createFiniteEvalContext<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): FiniteEvalContext<TEvent> {\n\tassertTimeSupportForTrace(doc, runtime, trace);\n\n\treturn {\n\t\tdoc,\n\t\truntime,\n\t\ttrace,\n\t\tcache: new Map(),\n\t};\n}\n\nexport function evaluateFiniteFormula<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): Verdict {\n\tconst ctx = createFiniteEvalContext(doc, runtime, trace);\n\treturn evaluateFiniteNode(ctx, doc.root, 0, new Map());\n}\n\nexport function evaluateFiniteNode<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnodeId: NodeId,\n\tpos: number,\n\tenv: EvalEnv,\n): Verdict {\n\tconst entryKey = cacheKey(nodeId, pos, env);\n\tconst cached = ctx.cache.get(entryKey);\n\tif (cached !== undefined) {\n\t\treturn cached;\n\t}\n\n\tconst node = ctx.doc.nodes[nodeId];\n\tif (!node) {\n\t\treturn \"violated\";\n\t}\n\n\t// Prevent infinite recursion by marking the current evaluation as open.\n\tctx.cache.set(entryKey, \"pending\");\n\tconst verdict = evaluateFiniteNodeInner(ctx, node, pos, env);\n\tctx.cache.set(entryKey, verdict);\n\treturn verdict;\n}\n\nfunction evaluateFiniteNodeInner<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnode: FormulaNode,\n\tpos: number,\n\tenv: EvalEnv,\n): Verdict {\n\tconst len = ctx.trace.length;\n\n\tswitch (node.kind) {\n\t\tcase \"literal\":\n\t\t\treturn node.value ? \"satisfied\" : \"violated\";\n\n\t\tcase \"predicate\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst predicateFn = ctx.runtime.predicates[node.predicateId];\n\t\t\tif (!predicateFn) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst event = ctx.trace[pos]!;\n\t\t\tconst args = (node.args ?? []).map((arg) => resolveArg(arg, event, ctx.runtime));\n\t\t\treturn predicateFn(event, args) ? \"satisfied\" : \"violated\";\n\t\t}\n\n\t\tcase \"when\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst captured = env.get(node.captureName as string);\n\t\t\tif (captured === undefined) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst selectorFn = ctx.runtime.selectors[node.selectorId];\n\t\t\tif (!selectorFn) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst currentValue = selectorFn(ctx.trace[pos]!);\n\t\t\tif (!jsonEqual(captured, currentValue)) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\treturn evaluateFiniteNode(ctx, node.child, pos, env);\n\t\t}\n\n\t\tcase \"capture\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst selectorFn = ctx.runtime.selectors[node.selectorId];\n\t\t\tif (!selectorFn) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst nextEnv = new Map(env);\n\t\t\tnextEnv.set(node.captureName as string, selectorFn(ctx.trace[pos]!));\n\t\t\treturn evaluateFiniteNode(ctx, node.child, pos, nextEnv);\n\t\t}\n\n\t\tcase \"not\":\n\t\t\treturn notV(evaluateFiniteNode(ctx, node.child, pos, env));\n\n\t\tcase \"and\": {\n\t\t\tlet result: Verdict = \"satisfied\";\n\t\t\tfor (const childId of node.children) {\n\t\t\t\tresult = andV(result, evaluateFiniteNode(ctx, childId, pos, env));\n\t\t\t\tif (result === \"violated\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tcase \"or\": {\n\t\t\tlet result: Verdict = \"violated\";\n\t\t\tfor (const childId of node.children) {\n\t\t\t\tresult = orV(result, evaluateFiniteNode(ctx, childId, pos, env));\n\t\t\t\tif (result === \"satisfied\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tcase \"implies\":\n\t\t\treturn impliesV(\n\t\t\t\tevaluateFiniteNode(ctx, node.left, pos, env),\n\t\t\t\tevaluateFiniteNode(ctx, node.right, pos, env),\n\t\t\t);\n\n\t\tcase \"always\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"satisfied\";\n\t\t\t}\n\n\t\t\tlet result: Verdict = \"satisfied\";\n\t\t\tfor (let step = pos; step < len; step++) {\n\t\t\t\tresult = andV(result, evaluateFiniteNode(ctx, node.child, step, env));\n\t\t\t\tif (result === \"violated\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tcase \"eventually\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tlet result: Verdict = \"violated\";\n\t\t\tfor (let step = pos; step < len; step++) {\n\t\t\t\tresult = orV(result, evaluateFiniteNode(ctx, node.child, step, env));\n\t\t\t\tif (result === \"satisfied\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tcase \"next\":\n\t\t\treturn pos + 1 >= len ? \"violated\" : evaluateFiniteNode(ctx, node.child, pos + 1, env);\n\n\t\tcase \"weakNext\":\n\t\t\treturn pos + 1 >= len ? \"satisfied\" : evaluateFiniteNode(ctx, node.child, pos + 1, env);\n\n\t\tcase \"until\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tlet leftAccumulator: Verdict = \"satisfied\";\n\t\t\tfor (let step = pos; step < len; step++) {\n\t\t\t\tconst rightVerdict = evaluateFiniteNode(ctx, node.right, step, env);\n\t\t\t\tif (rightVerdict === \"satisfied\" && leftAccumulator === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\n\t\t\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, step, env);\n\t\t\t\tleftAccumulator = step === pos ? leftVerdict : andV(leftAccumulator, leftVerdict);\n\t\t\t\tif (leftAccumulator === \"violated\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"violated\";\n\t\t}\n\n\t\tcase \"release\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"satisfied\";\n\t\t\t}\n\n\t\t\tlet allRight: Verdict = \"satisfied\";\n\t\t\tfor (let step = pos; step < len; step++) {\n\t\t\t\tallRight = andV(allRight, evaluateFiniteNode(ctx, node.right, step, env));\n\t\t\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, step, env);\n\t\t\t\tif (leftVerdict === \"satisfied\" && allRight === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\t\t\t\tif (allRight === \"violated\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn allRight === \"satisfied\" ? \"satisfied\" : \"violated\";\n\t\t}\n\n\t\tcase \"once\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tfor (let step = pos; step >= 0; step--) {\n\t\t\t\tif (evaluateFiniteNode(ctx, node.child, step, env) === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"violated\";\n\t\t}\n\n\t\tcase \"historically\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"satisfied\";\n\t\t\t}\n\n\t\t\tfor (let step = 0; step <= pos; step++) {\n\t\t\t\tif (evaluateFiniteNode(ctx, node.child, step, env) === \"violated\") {\n\t\t\t\t\treturn \"violated\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"satisfied\";\n\t\t}\n\n\t\tcase \"since\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tfor (let witness = pos; witness >= 0; witness--) {\n\t\t\t\tif (evaluateFiniteNode(ctx, node.right, witness, env) !== \"satisfied\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet leftOk: Verdict = \"satisfied\";\n\t\t\t\tfor (let step = witness + 1; step <= pos; step++) {\n\t\t\t\t\tleftOk = andV(leftOk, evaluateFiniteNode(ctx, node.left, step, env));\n\t\t\t\t\tif (leftOk === \"violated\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (leftOk === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"violated\";\n\t\t}\n\n\t\tcase \"withinSteps\": {\n\t\t\tconst upper = Math.min(pos + node.steps, len);\n\t\t\tfor (let step = pos; step < upper; step++) {\n\t\t\t\tif (evaluateFiniteNode(ctx, node.child, step, env) === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn \"violated\";\n\t\t}\n\n\t\tcase \"withinMs\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst startTs = getTimestamp(ctx.runtime, ctx.trace[pos]!);\n\t\t\tfor (let step = pos; step < len; step++) {\n\t\t\t\tconst currentTs = getTimestamp(ctx.runtime, ctx.trace[step]!);\n\t\t\t\tif (currentTs - startTs > node.ms) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (evaluateFiniteNode(ctx, node.child, step, env) === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"violated\";\n\t\t}\n\t}\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport type { Verdict } from \"../core/verdict.js\";\nimport { evaluateFiniteFormula } from \"./evaluate-finite.js\";\n\nexport function evaluateFormula<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): Verdict {\n\treturn evaluateFiniteFormula(doc, runtime, trace);\n}\n","import { print, printNodeAt } from \"../compiler/printer.js\";\nimport type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { FormulaNode } from \"../core/formula-node.js\";\nimport { type ActivationId, type NodeId, activationId } from \"../core/ids.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport type { JsonValue } from \"../core/values.js\";\nimport type { Verdict } from \"../core/verdict.js\";\nimport { andV } from \"../core/verdict.js\";\nimport { type EvalEnv, envKey, jsonEqual } from \"./eval-common.js\";\nimport {\n\ttype FiniteEvalContext,\n\tcreateFiniteEvalContext,\n\tevaluateFiniteNode,\n} from \"./evaluate-finite.js\";\nimport { getTimestamp } from \"./time.js\";\nimport type { CounterexampleReport, ObligationSnapshot } from \"./types.js\";\n\nexport function buildCounterexampleReport<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): CounterexampleReport | null {\n\tconst ctx = createFiniteEvalContext(doc, runtime, trace);\n\tconst env: EvalEnv = new Map();\n\tconst verdict = evaluateFiniteNode(ctx, doc.root, 0, env);\n\tif (verdict !== \"violated\") {\n\t\treturn null;\n\t}\n\n\tconst failurePath: ObligationSnapshot[] = [];\n\tcollectFailurePath(ctx, doc.root, 0, env, failurePath);\n\n\treturn {\n\t\tverdict: \"violated\",\n\t\tfailurePath,\n\t\ttraceSlice: trace.map((event, i) => ({ step: i + 1, event })),\n\t\tsummary: buildViolationSummary(doc, trace, failurePath),\n\t};\n}\n\nfunction buildViolationSummary<TEvent>(\n\tdoc: FormulaDocument,\n\ttrace: readonly TEvent[],\n\tfailurePath: readonly ObligationSnapshot[],\n): string {\n\tconst renderedFormula = print(doc);\n\tconst terminal = failurePath.at(-1);\n\tif (!terminal) {\n\t\treturn `Formula violated: ${renderedFormula}`;\n\t}\n\n\tconst focusedObligation = printNodeAt(terminal.nodeId, doc);\n\tconst traceEntry = trace[terminal.step];\n\tif (traceEntry === undefined) {\n\t\treturn `Formula violated: ${renderedFormula} at trace end (position ${terminal.step}) while checking ${focusedObligation}`;\n\t}\n\n\treturn `Formula violated: ${renderedFormula} at position ${terminal.step} (step ${terminal.step + 1}) while checking ${focusedObligation}`;\n}\n\nfunction collectFailurePath<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnodeId: NodeId,\n\tpos: number,\n\tenv: EvalEnv,\n\tpath: ObligationSnapshot[],\n): void {\n\tconst verdict = evaluateFiniteNode(ctx, nodeId, pos, env);\n\tpath.push({\n\t\tnodeId,\n\t\tactivationId: toActivationId(nodeId, pos, env),\n\t\tverdict,\n\t\tstep: pos,\n\t});\n\n\tconst node = ctx.doc.nodes[nodeId];\n\tif (!node) {\n\t\treturn;\n\t}\n\n\tswitch (node.kind) {\n\t\tcase \"literal\":\n\t\tcase \"predicate\":\n\t\t\treturn;\n\n\t\tcase \"when\": {\n\t\t\tif (pos >= ctx.trace.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst captured = env.get(node.captureName as string);\n\t\t\tif (captured === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst selectorFn = ctx.runtime.selectors[node.selectorId];\n\t\t\tif (!selectorFn) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst currentVal = selectorFn(ctx.trace[pos]!);\n\t\t\tif (!jsonEqual(captured, currentVal)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcollectFailurePath(ctx, node.child, pos, env, path);\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"capture\": {\n\t\t\tif (pos >= ctx.trace.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst selectorFn = ctx.runtime.selectors[node.selectorId];\n\t\t\tif (!selectorFn) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst nextEnv = new Map(env);\n\t\t\tnextEnv.set(node.captureName as string, selectorFn(ctx.trace[pos]!));\n\t\t\tcollectFailurePath(ctx, node.child, pos, nextEnv, path);\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"not\":\n\t\t\tcollectFailurePath(ctx, node.child, pos, env, path);\n\t\t\treturn;\n\n\t\tcase \"and\":\n\t\tcase \"or\": {\n\t\t\tconst childId = pickBooleanChild(ctx, node, pos, env, verdict);\n\t\t\tif (childId) {\n\t\t\t\tcollectFailurePath(ctx, childId, pos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"implies\": {\n\t\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, pos, env);\n\t\t\tconst rightVerdict = evaluateFiniteNode(ctx, node.right, pos, env);\n\t\t\tif (verdict === \"violated\") {\n\t\t\t\tcollectFailurePath(ctx, node.right, pos, env, path);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rightVerdict === \"satisfied\") {\n\t\t\t\tcollectFailurePath(ctx, node.right, pos, env, path);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (leftVerdict !== verdict || rightVerdict === \"pending\") {\n\t\t\t\tcollectFailurePath(ctx, node.left, pos, env, path);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"always\": {\n\t\t\tconst childPos =\n\t\t\t\tverdict === \"violated\"\n\t\t\t\t\t? findFirstPosition(ctx, node.child, pos, ctx.trace.length - 1, env, \"violated\")\n\t\t\t\t\t: pos < ctx.trace.length\n\t\t\t\t\t\t? pos\n\t\t\t\t\t\t: null;\n\t\t\tif (childPos !== null) {\n\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"eventually\": {\n\t\t\tconst childPos =\n\t\t\t\tverdict === \"satisfied\"\n\t\t\t\t\t? findFirstPosition(ctx, node.child, pos, ctx.trace.length - 1, env, \"satisfied\")\n\t\t\t\t\t: findLastPosition(ctx, node.child, pos, ctx.trace.length - 1, env, \"violated\");\n\t\t\tif (childPos !== null) {\n\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"next\":\n\t\tcase \"weakNext\":\n\t\t\tif (pos + 1 < ctx.trace.length) {\n\t\t\t\tcollectFailurePath(ctx, node.child, pos + 1, env, path);\n\t\t\t}\n\t\t\treturn;\n\n\t\tcase \"until\": {\n\t\t\tconst witness = findUntilFailureOrWitness(ctx, node, pos, env, verdict);\n\t\t\tif (witness) {\n\t\t\t\tcollectFailurePath(ctx, witness.nodeId, witness.pos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"release\": {\n\t\t\tconst witness = findReleaseFailureOrWitness(ctx, node, pos, env, verdict);\n\t\t\tif (witness) {\n\t\t\t\tcollectFailurePath(ctx, witness.nodeId, witness.pos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"once\": {\n\t\t\tconst childPos =\n\t\t\t\tverdict === \"satisfied\"\n\t\t\t\t\t? findLastPosition(ctx, node.child, 0, pos, env, \"satisfied\")\n\t\t\t\t\t: pos < ctx.trace.length\n\t\t\t\t\t\t? pos\n\t\t\t\t\t\t: null;\n\t\t\tif (childPos !== null) {\n\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"historically\": {\n\t\t\tconst childPos =\n\t\t\t\tverdict === \"violated\"\n\t\t\t\t\t? findFirstPosition(ctx, node.child, 0, pos, env, \"violated\")\n\t\t\t\t\t: pos < ctx.trace.length\n\t\t\t\t\t\t? pos\n\t\t\t\t\t\t: null;\n\t\t\tif (childPos !== null) {\n\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"since\": {\n\t\t\tconst witness = findSinceFailureOrWitness(ctx, node, pos, env, verdict);\n\t\t\tif (witness) {\n\t\t\t\tcollectFailurePath(ctx, witness.nodeId, witness.pos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"withinSteps\": {\n\t\t\tconst upper = Math.min(pos + node.steps - 1, ctx.trace.length - 1);\n\t\t\tconst childPos =\n\t\t\t\tverdict === \"satisfied\"\n\t\t\t\t\t? findFirstPosition(ctx, node.child, pos, upper, env, \"satisfied\")\n\t\t\t\t\t: findLastPosition(ctx, node.child, pos, upper, env, \"violated\");\n\t\t\tif (childPos !== null) {\n\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"withinMs\": {\n\t\t\tif (pos >= ctx.trace.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst startTs = getTimestamp(ctx.runtime, ctx.trace[pos]!);\n\t\t\tlet lastInBudget: number | null = null;\n\t\t\tfor (let i = pos; i < ctx.trace.length; i++) {\n\t\t\t\tconst currentTs = getTimestamp(ctx.runtime, ctx.trace[i]!);\n\t\t\t\tif (currentTs - startTs > node.ms) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tlastInBudget = i;\n\t\t\t\tif (\n\t\t\t\t\tverdict === \"satisfied\" &&\n\t\t\t\t\tevaluateFiniteNode(ctx, node.child, i, env) === \"satisfied\"\n\t\t\t\t) {\n\t\t\t\t\tcollectFailurePath(ctx, node.child, i, env, path);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (verdict === \"violated\" && lastInBudget !== null) {\n\t\t\t\tconst childPos = findLastPosition(ctx, node.child, pos, lastInBudget, env, \"violated\");\n\t\t\t\tif (childPos !== null) {\n\t\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction pickBooleanChild<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnode: Extract<FormulaNode, { kind: \"and\" | \"or\" }>,\n\tpos: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): NodeId | null {\n\tfor (const childId of node.children) {\n\t\tconst childVerdict = evaluateFiniteNode(ctx, childId, pos, env);\n\t\tif (verdict === \"violated\" && childVerdict === \"violated\") {\n\t\t\treturn childId;\n\t\t}\n\t\tif (verdict === \"satisfied\" && childVerdict === \"satisfied\") {\n\t\t\treturn childId;\n\t\t}\n\t\tif (verdict === \"pending\" && childVerdict === \"pending\") {\n\t\t\treturn childId;\n\t\t}\n\t}\n\treturn node.children[0] ?? null;\n}\n\nfunction findUntilFailureOrWitness<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnode: Extract<FormulaNode, { kind: \"until\" }>,\n\tpos: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): { readonly nodeId: NodeId; readonly pos: number } | null {\n\tif (pos >= ctx.trace.length) {\n\t\treturn null;\n\t}\n\n\tlet leftAcc: Verdict = \"satisfied\";\n\tfor (let j = pos; j < ctx.trace.length; j++) {\n\t\tconst rightVerdict = evaluateFiniteNode(ctx, node.right, j, env);\n\t\tif (rightVerdict === \"satisfied\" && leftAcc === \"satisfied\") {\n\t\t\treturn verdict === \"satisfied\" ? { nodeId: node.right, pos: j } : null;\n\t\t}\n\n\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, j, env);\n\t\tif (verdict === \"violated\" && leftAcc === \"satisfied\" && leftVerdict === \"violated\") {\n\t\t\treturn { nodeId: node.left, pos: j };\n\t\t}\n\t\tleftAcc = j === pos ? leftVerdict : andV(leftAcc, leftVerdict);\n\t\tif (leftAcc === \"violated\") {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (verdict === \"violated\") {\n\t\tconst rightPos = findLastPosition(ctx, node.right, pos, ctx.trace.length - 1, env, \"violated\");\n\t\tif (rightPos !== null) {\n\t\t\treturn { nodeId: node.right, pos: rightPos };\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction findReleaseFailureOrWitness<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnode: Extract<FormulaNode, { kind: \"release\" }>,\n\tpos: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): { readonly nodeId: NodeId; readonly pos: number } | null {\n\tif (pos >= ctx.trace.length) {\n\t\treturn null;\n\t}\n\n\tlet allRight: Verdict = \"satisfied\";\n\tfor (let j = pos; j < ctx.trace.length; j++) {\n\t\tconst rightVerdict = evaluateFiniteNode(ctx, node.right, j, env);\n\t\tif (verdict === \"violated\" && allRight === \"satisfied\" && rightVerdict === \"violated\") {\n\t\t\treturn { nodeId: node.right, pos: j };\n\t\t}\n\n\t\tallRight = andV(allRight, rightVerdict);\n\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, j, env);\n\t\tif (leftVerdict === \"satisfied\" && allRight === \"satisfied\") {\n\t\t\treturn verdict === \"satisfied\" ? { nodeId: node.left, pos: j } : null;\n\t\t}\n\t\tif (allRight === \"violated\") {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (verdict === \"satisfied\" && pos < ctx.trace.length) {\n\t\treturn { nodeId: node.right, pos };\n\t}\n\n\treturn null;\n}\n\nfunction findSinceFailureOrWitness<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnode: Extract<FormulaNode, { kind: \"since\" }>,\n\tpos: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): { readonly nodeId: NodeId; readonly pos: number } | null {\n\tif (pos >= ctx.trace.length) {\n\t\treturn null;\n\t}\n\n\tfor (let j = pos; j >= 0; j--) {\n\t\tconst rightVerdict = evaluateFiniteNode(ctx, node.right, j, env);\n\t\tif (rightVerdict === \"satisfied\") {\n\t\t\tlet leftOk: Verdict = \"satisfied\";\n\t\t\tfor (let i = j + 1; i <= pos; i++) {\n\t\t\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, i, env);\n\t\t\t\tif (verdict === \"violated\" && leftVerdict === \"violated\") {\n\t\t\t\t\treturn { nodeId: node.left, pos: i };\n\t\t\t\t}\n\t\t\t\tleftOk = andV(leftOk, leftVerdict);\n\t\t\t\tif (leftOk === \"violated\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (leftOk === \"satisfied\") {\n\t\t\t\treturn verdict === \"satisfied\" ? { nodeId: node.right, pos: j } : null;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (verdict === \"violated\") {\n\t\tconst rightPos = findFirstPosition(ctx, node.right, 0, pos, env, \"violated\");\n\t\tif (rightPos !== null) {\n\t\t\treturn { nodeId: node.right, pos: rightPos };\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction findFirstPosition<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnodeId: NodeId,\n\tstart: number,\n\tend: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): number | null {\n\tif (start > end) {\n\t\treturn null;\n\t}\n\tfor (let pos = start; pos <= end; pos++) {\n\t\tif (evaluateFiniteNode(ctx, nodeId, pos, env) === verdict) {\n\t\t\treturn pos;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction findLastPosition<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnodeId: NodeId,\n\tstart: number,\n\tend: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): number | null {\n\tif (start > end) {\n\t\treturn null;\n\t}\n\tfor (let pos = end; pos >= start; pos--) {\n\t\tif (evaluateFiniteNode(ctx, nodeId, pos, env) === verdict) {\n\t\t\treturn pos;\n\t\t}\n\t}\n\treturn null;\n}\nfunction toActivationId(nodeId: NodeId, pos: number, env: EvalEnv): ActivationId {\n\treturn activationId(`${nodeId}:${pos}:${encodeURIComponent(envKey(env))}`);\n}\n","import { compile } from \"../compiler/compile.js\";\nimport { print } from \"../compiler/printer.js\";\nimport { validate } from \"../compiler/validate.js\";\nimport type { FormulaExpr } from \"../core/formula-expr.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport { buildCounterexampleReport } from \"./diagnostics.js\";\nimport { evaluateFormula } from \"./evaluate.js\";\nimport type { CounterexampleReport, OracleRunResult } from \"./types.js\";\n\nexport function runOracle<TEvent>(\n\tformula: FormulaExpr,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): OracleRunResult {\n\tconst doc = compile(formula);\n\n\tconst errors = validate(doc);\n\tif (errors.length > 0) {\n\t\tconst messages = errors.map((e) => `${e.nodeId}: ${e.message}`).join(\"; \");\n\t\tthrow new Error(`Invalid formula: ${messages}`);\n\t}\n\n\tconst verdict = evaluateFormula(doc, runtime, trace);\n\n\tconst report: CounterexampleReport | null =\n\t\tverdict === \"violated\"\n\t\t\t? (buildCounterexampleReport(doc, runtime, trace) ?? {\n\t\t\t\t\tverdict: \"violated\",\n\t\t\t\t\tfailurePath: [],\n\t\t\t\t\ttraceSlice: trace.map((event, i) => ({ step: i + 1, event })),\n\t\t\t\t\tsummary: `Formula violated: ${print(doc)}`,\n\t\t\t\t})\n\t\t\t: null;\n\n\treturn {\n\t\tverdict,\n\t\tsteps: trace.length,\n\t\treport,\n\t};\n}\n"],"mappings":"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","names":[]}
|
|
@@ -261,12 +261,12 @@ function needsParens(node) {
|
|
|
261
261
|
return false;
|
|
262
262
|
}
|
|
263
263
|
}
|
|
264
|
-
function
|
|
264
|
+
function printNodeAt(nid, doc) {
|
|
265
265
|
const node = doc.nodes[nid];
|
|
266
266
|
if (!node) return `<unknown:${nid}>`;
|
|
267
267
|
function child(cid) {
|
|
268
268
|
const cnode = doc.nodes[cid];
|
|
269
|
-
const s =
|
|
269
|
+
const s = printNodeAt(cid, doc);
|
|
270
270
|
return cnode && needsParens(cnode) ? `(${s})` : s;
|
|
271
271
|
}
|
|
272
272
|
switch (node.kind) {
|
|
@@ -311,7 +311,7 @@ function printNode(nid, doc) {
|
|
|
311
311
|
}
|
|
312
312
|
}
|
|
313
313
|
function print(doc) {
|
|
314
|
-
return
|
|
314
|
+
return printNodeAt(doc.root, doc);
|
|
315
315
|
}
|
|
316
316
|
|
|
317
317
|
export {
|
|
@@ -319,6 +319,7 @@ export {
|
|
|
319
319
|
contentHash,
|
|
320
320
|
compile,
|
|
321
321
|
validate,
|
|
322
|
+
printNodeAt,
|
|
322
323
|
print
|
|
323
324
|
};
|
|
324
|
-
//# sourceMappingURL=chunk-
|
|
325
|
+
//# sourceMappingURL=chunk-JB27QVDU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/compiler/hash.ts","../src/compiler/compile.ts","../src/compiler/validate.ts","../src/compiler/printer.ts"],"sourcesContent":["const FNV_OFFSET = 0x811c9dc5;\nconst FNV_PRIME = 0x01000193;\n\nexport function fnv1a(input: string): number {\n\tlet hash = FNV_OFFSET;\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst code = input.charCodeAt(i);\n\t\t// Handle UTF-16: XOR both bytes for codes > 0xFF\n\t\tif (code > 0xff) {\n\t\t\thash ^= code >> 8;\n\t\t\thash = Math.imul(hash, FNV_PRIME) >>> 0;\n\t\t\thash ^= code & 0xff;\n\t\t} else {\n\t\t\thash ^= code;\n\t\t}\n\t\thash = Math.imul(hash, FNV_PRIME) >>> 0;\n\t}\n\treturn hash;\n}\n\nexport function contentHash(input: string): string {\n\treturn fnv1a(input).toString(16).padStart(8, \"0\");\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { FormulaExpr } from \"../core/formula-expr.js\";\nimport type { FormulaNode } from \"../core/formula-node.js\";\nimport type { NodeId } from \"../core/ids.js\";\nimport { nodeId } from \"../core/ids.js\";\nimport type { NodeProvenance } from \"../core/meta.js\";\nimport { contentHash } from \"./hash.js\";\n\ninterface CompileContext {\n\tnodes: Record<string, FormulaNode>;\n\tprovenance: Record<string, NodeProvenance>;\n}\n\nfunction canonicalKey(node: FormulaNode): string {\n\treturn JSON.stringify(node);\n}\n\nfunction addNode(ctx: CompileContext, node: FormulaNode, expr: FormulaExpr): NodeId {\n\tconst key = canonicalKey(node);\n\tconst id = nodeId(contentHash(key));\n\tif (!Object.hasOwn(ctx.nodes, id)) {\n\t\tctx.nodes[id] = node;\n\t\tif (expr.meta) {\n\t\t\tctx.provenance[id] = {\n\t\t\t\tnodeId: id,\n\t\t\t\torigin: \"user\",\n\t\t\t\tsourceExprKind: expr.kind,\n\t\t\t\tmeta: expr.meta,\n\t\t\t};\n\t\t}\n\t}\n\treturn id;\n}\n\nfunction flattenVariadic(\n\texprs: readonly FormulaExpr[],\n\tkind: \"and\" | \"or\",\n\tctx: CompileContext,\n): NodeId[] {\n\tconst result: NodeId[] = [];\n\tfor (const expr of exprs) {\n\t\tif (expr.kind === kind) {\n\t\t\tresult.push(...flattenVariadic(expr.children, kind, ctx));\n\t\t} else {\n\t\t\tresult.push(compileExpr(expr, ctx));\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction sortNodeIds(ids: NodeId[]): NodeId[] {\n\treturn [...ids].sort((a, b) => a.localeCompare(b));\n}\n\nfunction compileExpr(expr: FormulaExpr, ctx: CompileContext): NodeId {\n\tswitch (expr.kind) {\n\t\tcase \"literal\":\n\t\t\treturn addNode(ctx, { kind: \"literal\", value: expr.value }, expr);\n\n\t\tcase \"predicate\": {\n\t\t\tconst node: FormulaNode = expr.args\n\t\t\t\t? { kind: \"predicate\", predicateId: expr.predicateId, args: expr.args }\n\t\t\t\t: { kind: \"predicate\", predicateId: expr.predicateId };\n\t\t\treturn addNode(ctx, node, expr);\n\t\t}\n\n\t\tcase \"when\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(\n\t\t\t\tctx,\n\t\t\t\t{ kind: \"when\", captureName: expr.captureName, selectorId: expr.selectorId, child },\n\t\t\t\texpr,\n\t\t\t);\n\t\t}\n\n\t\tcase \"capture\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(\n\t\t\t\tctx,\n\t\t\t\t{\n\t\t\t\t\tkind: \"capture\",\n\t\t\t\t\tcaptureName: expr.captureName,\n\t\t\t\t\tselectorId: expr.selectorId,\n\t\t\t\t\tchild,\n\t\t\t\t},\n\t\t\t\texpr,\n\t\t\t);\n\t\t}\n\n\t\tcase \"not\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"not\", child }, expr);\n\t\t}\n\n\t\tcase \"and\": {\n\t\t\tconst children = sortNodeIds(flattenVariadic(expr.children, \"and\", ctx));\n\t\t\treturn addNode(ctx, { kind: \"and\", children }, expr);\n\t\t}\n\n\t\tcase \"or\": {\n\t\t\tconst children = sortNodeIds(flattenVariadic(expr.children, \"or\", ctx));\n\t\t\treturn addNode(ctx, { kind: \"or\", children }, expr);\n\t\t}\n\n\t\tcase \"implies\": {\n\t\t\tconst left = compileExpr(expr.left, ctx);\n\t\t\tconst right = compileExpr(expr.right, ctx);\n\t\t\treturn addNode(ctx, { kind: \"implies\", left, right }, expr);\n\t\t}\n\n\t\tcase \"always\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"always\", child }, expr);\n\t\t}\n\n\t\tcase \"eventually\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"eventually\", child }, expr);\n\t\t}\n\n\t\tcase \"next\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"next\", child }, expr);\n\t\t}\n\n\t\tcase \"weakNext\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"weakNext\", child }, expr);\n\t\t}\n\n\t\tcase \"until\": {\n\t\t\tconst left = compileExpr(expr.left, ctx);\n\t\t\tconst right = compileExpr(expr.right, ctx);\n\t\t\treturn addNode(ctx, { kind: \"until\", left, right }, expr);\n\t\t}\n\n\t\tcase \"release\": {\n\t\t\tconst left = compileExpr(expr.left, ctx);\n\t\t\tconst right = compileExpr(expr.right, ctx);\n\t\t\treturn addNode(ctx, { kind: \"release\", left, right }, expr);\n\t\t}\n\n\t\tcase \"once\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"once\", child }, expr);\n\t\t}\n\n\t\tcase \"historically\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"historically\", child }, expr);\n\t\t}\n\n\t\tcase \"since\": {\n\t\t\tconst left = compileExpr(expr.left, ctx);\n\t\t\tconst right = compileExpr(expr.right, ctx);\n\t\t\treturn addNode(ctx, { kind: \"since\", left, right }, expr);\n\t\t}\n\n\t\tcase \"withinSteps\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"withinSteps\", steps: expr.steps, child }, expr);\n\t\t}\n\n\t\tcase \"withinMs\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"withinMs\", ms: expr.ms, child }, expr);\n\t\t}\n\t}\n}\n\nexport function compile(expr: FormulaExpr): FormulaDocument {\n\tconst ctx: CompileContext = { nodes: {}, provenance: {} };\n\tconst root = compileExpr(expr, ctx);\n\treturn {\n\t\tschemaVersion: 1,\n\t\troot,\n\t\tnodes: ctx.nodes as Record<NodeId, FormulaNode>,\n\t\t...(Object.keys(ctx.provenance).length > 0\n\t\t\t? { provenance: ctx.provenance as Record<NodeId, NodeProvenance> }\n\t\t\t: {}),\n\t};\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { NodeId } from \"../core/ids.js\";\n\nexport interface ValidationError {\n\treadonly nodeId: NodeId;\n\treadonly message: string;\n}\n\nexport function validate(doc: FormulaDocument): ValidationError[] {\n\tconst errors: ValidationError[] = [];\n\n\tfunction walk(nid: NodeId, scopedCaptures: Set<string>): void {\n\t\tconst node = doc.nodes[nid];\n\t\tif (!node) {\n\t\t\terrors.push({ nodeId: nid, message: `Node ${nid} not found in document` });\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (node.kind) {\n\t\t\tcase \"capture\": {\n\t\t\t\tconst name = node.captureName as string;\n\t\t\t\tif (scopedCaptures.has(name)) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tnodeId: nid,\n\t\t\t\t\t\tmessage: `Capture name \"${name}\" shadows an outer capture`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst inner = new Set(scopedCaptures);\n\t\t\t\tinner.add(name);\n\t\t\t\twalk(node.child, inner);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"when\": {\n\t\t\t\tconst name = node.captureName as string;\n\t\t\t\tif (!scopedCaptures.has(name)) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tnodeId: nid,\n\t\t\t\t\t\tmessage: `When references capture \"${name}\" which is not in scope`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\twalk(node.child, scopedCaptures);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"withinSteps\":\n\t\t\t\tif (node.steps <= 0 || !Number.isInteger(node.steps)) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tnodeId: nid,\n\t\t\t\t\t\tmessage: `withinSteps requires a positive integer, got ${node.steps}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\twalk(node.child, scopedCaptures);\n\t\t\t\tbreak;\n\n\t\t\tcase \"withinMs\":\n\t\t\t\tif (!Number.isFinite(node.ms) || node.ms <= 0) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tnodeId: nid,\n\t\t\t\t\t\tmessage: `withinMs requires a positive number, got ${node.ms}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\twalk(node.child, scopedCaptures);\n\t\t\t\tbreak;\n\n\t\t\tcase \"not\":\n\t\t\tcase \"always\":\n\t\t\tcase \"eventually\":\n\t\t\tcase \"next\":\n\t\t\tcase \"weakNext\":\n\t\t\tcase \"once\":\n\t\t\tcase \"historically\":\n\t\t\t\twalk(node.child, scopedCaptures);\n\t\t\t\tbreak;\n\n\t\t\tcase \"and\":\n\t\t\tcase \"or\":\n\t\t\t\tfor (const child of node.children) {\n\t\t\t\t\twalk(child, scopedCaptures);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"implies\":\n\t\t\tcase \"until\":\n\t\t\tcase \"release\":\n\t\t\tcase \"since\":\n\t\t\t\twalk(node.left, scopedCaptures);\n\t\t\t\twalk(node.right, scopedCaptures);\n\t\t\t\tbreak;\n\n\t\t\tcase \"literal\":\n\t\t\tcase \"predicate\":\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\twalk(doc.root, new Set());\n\treturn errors;\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { FormulaNode } from \"../core/formula-node.js\";\nimport type { NodeId } from \"../core/ids.js\";\n\nfunction needsParens(node: FormulaNode): boolean {\n\tswitch (node.kind) {\n\t\tcase \"and\":\n\t\tcase \"or\":\n\t\tcase \"implies\":\n\t\tcase \"until\":\n\t\tcase \"release\":\n\t\tcase \"since\":\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nexport function printNodeAt(nid: NodeId, doc: FormulaDocument): string {\n\tconst node = doc.nodes[nid];\n\tif (!node) return `<unknown:${nid}>`;\n\n\tfunction child(cid: NodeId): string {\n\t\tconst cnode = doc.nodes[cid];\n\t\tconst s = printNodeAt(cid, doc);\n\t\treturn cnode && needsParens(cnode) ? `(${s})` : s;\n\t}\n\n\tswitch (node.kind) {\n\t\tcase \"literal\":\n\t\t\treturn node.value ? \"true\" : \"false\";\n\t\tcase \"predicate\":\n\t\t\treturn node.args && node.args.length > 0\n\t\t\t\t? `${node.predicateId}(${node.args.map((a) => (a.kind === \"literal\" ? JSON.stringify(a.value) : `$${a.selectorId}`)).join(\", \")})`\n\t\t\t\t: String(node.predicateId);\n\t\tcase \"when\":\n\t\t\treturn `when(${node.captureName}, $${node.selectorId}, ${child(node.child)})`;\n\t\tcase \"capture\":\n\t\t\treturn `capture(${node.captureName}, $${node.selectorId}, ${child(node.child)})`;\n\t\tcase \"not\":\n\t\t\treturn `!${child(node.child)}`;\n\t\tcase \"and\":\n\t\t\treturn node.children.map((c) => child(c)).join(\" & \");\n\t\tcase \"or\":\n\t\t\treturn node.children.map((c) => child(c)).join(\" | \");\n\t\tcase \"implies\":\n\t\t\treturn `${child(node.left)} -> ${child(node.right)}`;\n\t\tcase \"always\":\n\t\t\treturn `G ${child(node.child)}`;\n\t\tcase \"eventually\":\n\t\t\treturn `F ${child(node.child)}`;\n\t\tcase \"next\":\n\t\t\treturn `X ${child(node.child)}`;\n\t\tcase \"weakNext\":\n\t\t\treturn `Xw ${child(node.child)}`;\n\t\tcase \"until\":\n\t\t\treturn `${child(node.left)} U ${child(node.right)}`;\n\t\tcase \"release\":\n\t\t\treturn `${child(node.left)} R ${child(node.right)}`;\n\t\tcase \"once\":\n\t\t\treturn `P ${child(node.child)}`;\n\t\tcase \"historically\":\n\t\t\treturn `H ${child(node.child)}`;\n\t\tcase \"since\":\n\t\t\treturn `${child(node.left)} S ${child(node.right)}`;\n\t\tcase \"withinSteps\":\n\t\t\treturn `within[${node.steps}] ${child(node.child)}`;\n\t\tcase \"withinMs\":\n\t\t\treturn `withinMs[${node.ms}] ${child(node.child)}`;\n\t}\n}\n\nexport function print(doc: FormulaDocument): string {\n\treturn printNodeAt(doc.root, doc);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// src/core/safe-stringify.ts
|
|
2
|
+
function fallbackToString(value) {
|
|
3
|
+
try {
|
|
4
|
+
return String(value);
|
|
5
|
+
} catch {
|
|
6
|
+
return "[Unserializable value]";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function safeStringify(value) {
|
|
10
|
+
const ancestors = [];
|
|
11
|
+
try {
|
|
12
|
+
const json = JSON.stringify(value, function(_key, current) {
|
|
13
|
+
if (typeof current === "bigint") {
|
|
14
|
+
return `${current}n`;
|
|
15
|
+
}
|
|
16
|
+
if (typeof current !== "object" || current === null) {
|
|
17
|
+
return current;
|
|
18
|
+
}
|
|
19
|
+
while (ancestors.length > 0 && ancestors.at(-1) !== this) {
|
|
20
|
+
ancestors.pop();
|
|
21
|
+
}
|
|
22
|
+
if (ancestors.includes(current)) {
|
|
23
|
+
return "[Circular]";
|
|
24
|
+
}
|
|
25
|
+
ancestors.push(current);
|
|
26
|
+
return current;
|
|
27
|
+
});
|
|
28
|
+
return json ?? fallbackToString(value);
|
|
29
|
+
} catch {
|
|
30
|
+
return fallbackToString(value);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
safeStringify
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=chunk-NWSJAWTR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/safe-stringify.ts"],"sourcesContent":["function fallbackToString(value: unknown): string {\n\ttry {\n\t\treturn String(value);\n\t} catch {\n\t\treturn \"[Unserializable value]\";\n\t}\n}\n\nexport function safeStringify(value: unknown): string {\n\tconst ancestors: object[] = [];\n\n\ttry {\n\t\tconst json = JSON.stringify(value, function (_key, current: unknown) {\n\t\t\tif (typeof current === \"bigint\") {\n\t\t\t\treturn `${current}n`;\n\t\t\t}\n\n\t\t\tif (typeof current !== \"object\" || current === null) {\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\twhile (ancestors.length > 0 && ancestors.at(-1) !== this) {\n\t\t\t\tancestors.pop();\n\t\t\t}\n\n\t\t\tif (ancestors.includes(current)) {\n\t\t\t\treturn \"[Circular]\";\n\t\t\t}\n\n\t\t\tancestors.push(current);\n\t\t\treturn current;\n\t\t});\n\n\t\treturn json ?? fallbackToString(value);\n\t} catch {\n\t\treturn fallbackToString(value);\n\t}\n}\n"],"mappings":";AAAA,SAAS,iBAAiB,OAAwB;AACjD,MAAI;AACH,WAAO,OAAO,KAAK;AAAA,EACpB,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEO,SAAS,cAAc,OAAwB;AACrD,QAAM,YAAsB,CAAC;AAE7B,MAAI;AACH,UAAM,OAAO,KAAK,UAAU,OAAO,SAAU,MAAM,SAAkB;AACpE,UAAI,OAAO,YAAY,UAAU;AAChC,eAAO,GAAG,OAAO;AAAA,MAClB;AAEA,UAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACpD,eAAO;AAAA,MACR;AAEA,aAAO,UAAU,SAAS,KAAK,UAAU,GAAG,EAAE,MAAM,MAAM;AACzD,kBAAU,IAAI;AAAA,MACf;AAEA,UAAI,UAAU,SAAS,OAAO,GAAG;AAChC,eAAO;AAAA,MACR;AAEA,gBAAU,KAAK,OAAO;AACtB,aAAO;AAAA,IACR,CAAC;AAED,WAAO,QAAQ,iBAAiB,KAAK;AAAA,EACtC,QAAQ;AACP,WAAO,iBAAiB,KAAK;AAAA,EAC9B;AACD;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builder/factory.ts"],"sourcesContent":["import type {\n\tAlwaysExpr,\n\tAndExpr,\n\tCaptureExpr,\n\tCaptureName,\n\tEventuallyExpr,\n\tFormulaExpr,\n\tFormulaMeta,\n\tHistoricallyExpr,\n\tImpliesExpr,\n\tLiteralExpr,\n\tNextExpr,\n\tNotExpr,\n\tOnceExpr,\n\tOrExpr,\n\tPredicateExpr,\n\tPredicateId,\n\tReleaseExpr,\n\tSelectorId,\n\tSinceExpr,\n\tUntilExpr,\n\tValueExprArg,\n\tWeakNextExpr,\n\tWhenExpr,\n\tWithinMsExpr,\n\tWithinStepsExpr,\n} from \"../core/index.js\";\n\nexport function toExpr(v: boolean | FormulaExpr): FormulaExpr {\n\tif (typeof v === \"boolean\") return literal(v);\n\treturn v;\n}\n\nexport function annotate(expr: FormulaExpr, meta: FormulaMeta): FormulaExpr {\n\treturn { ...expr, meta } as FormulaExpr;\n}\n\n// --- Leaf nodes ---\n\nexport function literal(value: boolean): LiteralExpr {\n\treturn { kind: \"literal\", value };\n}\n\n/**\n * Point assertion at the current trace position.\n *\n * When used as the root formula, this checks only position 0 of the trace.\n * Wrap it with `eventually(...)` to ask whether the predicate appears anywhere\n * in the trace, or with `always(...)` to require it at every position.\n */\nexport function predicate(\n\tpredicateId: PredicateId,\n\t...args: readonly ValueExprArg[]\n): PredicateExpr {\n\treturn args.length > 0\n\t\t? { kind: \"predicate\", predicateId, args }\n\t\t: { kind: \"predicate\", predicateId };\n}\n\nexport function when(\n\tcaptureName: CaptureName,\n\tselectorId: SelectorId,\n\tchild: boolean | FormulaExpr,\n): WhenExpr {\n\treturn { kind: \"when\", captureName, selectorId, child: toExpr(child) };\n}\n\nexport function capture(\n\tcaptureName: CaptureName,\n\tselectorId: SelectorId,\n\tchild: boolean | FormulaExpr,\n): CaptureExpr {\n\treturn { kind: \"capture\", captureName, selectorId, child: toExpr(child) };\n}\n\n// --- Boolean operators ---\n\nexport function not(child: boolean | FormulaExpr): NotExpr {\n\treturn { kind: \"not\", child: toExpr(child) };\n}\n\nexport function and(...children: readonly (boolean | FormulaExpr)[]): AndExpr {\n\treturn { kind: \"and\", children: children.map(toExpr) };\n}\n\nexport function or(...children: readonly (boolean | FormulaExpr)[]): OrExpr {\n\treturn { kind: \"or\", children: children.map(toExpr) };\n}\n\nexport function implies(left: boolean | FormulaExpr, right: boolean | FormulaExpr): ImpliesExpr {\n\treturn { kind: \"implies\", left: toExpr(left), right: toExpr(right) };\n}\n\n// --- Future temporal operators ---\n\nexport function always(child: boolean | FormulaExpr): AlwaysExpr {\n\treturn { kind: \"always\", child: toExpr(child) };\n}\n\nexport function eventually(child: boolean | FormulaExpr): EventuallyExpr {\n\treturn { kind: \"eventually\", child: toExpr(child) };\n}\n\nexport function next(child: boolean | FormulaExpr): NextExpr {\n\treturn { kind: \"next\", child: toExpr(child) };\n}\n\nexport function weakNext(child: boolean | FormulaExpr): WeakNextExpr {\n\treturn { kind: \"weakNext\", child: toExpr(child) };\n}\n\nexport function until(left: boolean | FormulaExpr, right: boolean | FormulaExpr): UntilExpr {\n\treturn { kind: \"until\", left: toExpr(left), right: toExpr(right) };\n}\n\nexport function release(left: boolean | FormulaExpr, right: boolean | FormulaExpr): ReleaseExpr {\n\treturn { kind: \"release\", left: toExpr(left), right: toExpr(right) };\n}\n\n// --- Past temporal operators ---\n\nexport function once(child: boolean | FormulaExpr): OnceExpr {\n\treturn { kind: \"once\", child: toExpr(child) };\n}\n\nexport function historically(child: boolean | FormulaExpr): HistoricallyExpr {\n\treturn { kind: \"historically\", child: toExpr(child) };\n}\n\nexport function since(left: boolean | FormulaExpr, right: boolean | FormulaExpr): SinceExpr {\n\treturn { kind: \"since\", left: toExpr(left), right: toExpr(right) };\n}\n\n// --- Bounded operators ---\n\nexport function withinSteps(steps: number, child: boolean | FormulaExpr): WithinStepsExpr {\n\treturn { kind: \"withinSteps\", steps, child: toExpr(child) };\n}\n\nexport function withinMs(ms: number, child: boolean | FormulaExpr): WithinMsExpr {\n\treturn { kind: \"withinMs\", ms, child: toExpr(child) };\n}\n"],"mappings":";AA4BO,SAAS,OAAO,GAAuC;AAC7D,MAAI,OAAO,MAAM,UAAW,QAAO,QAAQ,CAAC;AAC5C,SAAO;AACR;AAEO,SAAS,SAAS,MAAmB,MAAgC;AAC3E,SAAO,EAAE,GAAG,MAAM,KAAK;AACxB;AAIO,SAAS,QAAQ,OAA6B;AACpD,SAAO,EAAE,MAAM,WAAW,MAAM;AACjC;AASO,SAAS,UACf,gBACG,MACa;AAChB,SAAO,KAAK,SAAS,IAClB,EAAE,MAAM,aAAa,aAAa,KAAK,IACvC,EAAE,MAAM,aAAa,YAAY;AACrC;AAEO,SAAS,KACf,aACA,YACA,OACW;AACX,SAAO,EAAE,MAAM,QAAQ,aAAa,YAAY,OAAO,OAAO,KAAK,EAAE;AACtE;AAEO,SAAS,QACf,aACA,YACA,OACc;AACd,SAAO,EAAE,MAAM,WAAW,aAAa,YAAY,OAAO,OAAO,KAAK,EAAE;AACzE;AAIO,SAAS,IAAI,OAAuC;AAC1D,SAAO,EAAE,MAAM,OAAO,OAAO,OAAO,KAAK,EAAE;AAC5C;AAEO,SAAS,OAAO,UAAuD;AAC7E,SAAO,EAAE,MAAM,OAAO,UAAU,SAAS,IAAI,MAAM,EAAE;AACtD;AAEO,SAAS,MAAM,UAAsD;AAC3E,SAAO,EAAE,MAAM,MAAM,UAAU,SAAS,IAAI,MAAM,EAAE;AACrD;AAEO,SAAS,QAAQ,MAA6B,OAA2C;AAC/F,SAAO,EAAE,MAAM,WAAW,MAAM,OAAO,IAAI,GAAG,OAAO,OAAO,KAAK,EAAE;AACpE;AAIO,SAAS,OAAO,OAA0C;AAChE,SAAO,EAAE,MAAM,UAAU,OAAO,OAAO,KAAK,EAAE;AAC/C;AAEO,SAAS,WAAW,OAA8C;AACxE,SAAO,EAAE,MAAM,cAAc,OAAO,OAAO,KAAK,EAAE;AACnD;AAEO,SAAS,KAAK,OAAwC;AAC5D,SAAO,EAAE,MAAM,QAAQ,OAAO,OAAO,KAAK,EAAE;AAC7C;AAEO,SAAS,SAAS,OAA4C;AACpE,SAAO,EAAE,MAAM,YAAY,OAAO,OAAO,KAAK,EAAE;AACjD;AAEO,SAAS,MAAM,MAA6B,OAAyC;AAC3F,SAAO,EAAE,MAAM,SAAS,MAAM,OAAO,IAAI,GAAG,OAAO,OAAO,KAAK,EAAE;AAClE;AAEO,SAAS,QAAQ,MAA6B,OAA2C;AAC/F,SAAO,EAAE,MAAM,WAAW,MAAM,OAAO,IAAI,GAAG,OAAO,OAAO,KAAK,EAAE;AACpE;AAIO,SAAS,KAAK,OAAwC;AAC5D,SAAO,EAAE,MAAM,QAAQ,OAAO,OAAO,KAAK,EAAE;AAC7C;AAEO,SAAS,aAAa,OAAgD;AAC5E,SAAO,EAAE,MAAM,gBAAgB,OAAO,OAAO,KAAK,EAAE;AACrD;AAEO,SAAS,MAAM,MAA6B,OAAyC;AAC3F,SAAO,EAAE,MAAM,SAAS,MAAM,OAAO,IAAI,GAAG,OAAO,OAAO,KAAK,EAAE;AAClE;AAIO,SAAS,YAAY,OAAe,OAA+C;AACzF,SAAO,EAAE,MAAM,eAAe,OAAO,OAAO,OAAO,KAAK,EAAE;AAC3D;AAEO,SAAS,SAAS,IAAY,OAA4C;AAChF,SAAO,EAAE,MAAM,YAAY,IAAI,OAAO,OAAO,KAAK,EAAE;AACrD;","names":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import {
|
|
2
|
+
printNodeAt
|
|
3
|
+
} from "./chunk-JB27QVDU.js";
|
|
4
|
+
import {
|
|
5
|
+
safeStringify
|
|
6
|
+
} from "./chunk-NWSJAWTR.js";
|
|
7
|
+
|
|
8
|
+
// src/monitor/format-message.ts
|
|
9
|
+
function formatCounterexampleMessage(report, doc) {
|
|
10
|
+
const lines = [report.summary];
|
|
11
|
+
const terminal = report.failurePath.at(-1);
|
|
12
|
+
if (terminal) {
|
|
13
|
+
if (doc) {
|
|
14
|
+
lines.push(`Focused obligation: ${printNodeAt(terminal.nodeId, doc)}`);
|
|
15
|
+
} else {
|
|
16
|
+
lines.push(`Focused obligation node: ${terminal.nodeId}`);
|
|
17
|
+
}
|
|
18
|
+
const traceEntry = report.traceSlice[terminal.step];
|
|
19
|
+
if (traceEntry) {
|
|
20
|
+
lines.push(`Observed event at step ${traceEntry.step}: ${safeStringify(traceEntry.event)}`);
|
|
21
|
+
} else {
|
|
22
|
+
lines.push("Failure point is at trace end; no event exists at that position.");
|
|
23
|
+
}
|
|
24
|
+
lines.push("");
|
|
25
|
+
lines.push("Failure path:");
|
|
26
|
+
for (const snapshot of report.failurePath) {
|
|
27
|
+
const label = doc ? printNodeAt(snapshot.nodeId, doc) : snapshot.nodeId;
|
|
28
|
+
lines.push(`- position ${snapshot.step}: ${label} => ${snapshot.verdict}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (report.traceSlice.length > 0) {
|
|
32
|
+
lines.push("");
|
|
33
|
+
lines.push("Trace:");
|
|
34
|
+
for (const entry of report.traceSlice) {
|
|
35
|
+
lines.push(`- step ${entry.step}: ${safeStringify(entry.event)}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return lines.join("\n");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
formatCounterexampleMessage
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=chunk-ZLMOGNRR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/monitor/format-message.ts"],"sourcesContent":["import { printNodeAt } from \"../compiler/printer.js\";\nimport type { FormulaDocument } from \"../core/formula-document.js\";\nimport { safeStringify } from \"../core/safe-stringify.js\";\nimport type { CounterexampleReport } from \"./types.js\";\n\nexport function formatCounterexampleMessage(\n\treport: CounterexampleReport,\n\tdoc?: FormulaDocument,\n): string {\n\tconst lines = [report.summary];\n\tconst terminal = report.failurePath.at(-1);\n\n\tif (terminal) {\n\t\tif (doc) {\n\t\t\tlines.push(`Focused obligation: ${printNodeAt(terminal.nodeId, doc)}`);\n\t\t} else {\n\t\t\tlines.push(`Focused obligation node: ${terminal.nodeId}`);\n\t\t}\n\n\t\tconst traceEntry = report.traceSlice[terminal.step];\n\t\tif (traceEntry) {\n\t\t\tlines.push(`Observed event at step ${traceEntry.step}: ${safeStringify(traceEntry.event)}`);\n\t\t} else {\n\t\t\tlines.push(\"Failure point is at trace end; no event exists at that position.\");\n\t\t}\n\n\t\tlines.push(\"\");\n\t\tlines.push(\"Failure path:\");\n\t\tfor (const snapshot of report.failurePath) {\n\t\t\tconst label = doc ? printNodeAt(snapshot.nodeId, doc) : snapshot.nodeId;\n\t\t\tlines.push(`- position ${snapshot.step}: ${label} => ${snapshot.verdict}`);\n\t\t}\n\t}\n\n\tif (report.traceSlice.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(\"Trace:\");\n\t\tfor (const entry of report.traceSlice) {\n\t\t\tlines.push(`- step ${entry.step}: ${safeStringify(entry.event)}`);\n\t\t}\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;AAKO,SAAS,4BACf,QACA,KACS;AACT,QAAM,QAAQ,CAAC,OAAO,OAAO;AAC7B,QAAM,WAAW,OAAO,YAAY,GAAG,EAAE;AAEzC,MAAI,UAAU;AACb,QAAI,KAAK;AACR,YAAM,KAAK,uBAAuB,YAAY,SAAS,QAAQ,GAAG,CAAC,EAAE;AAAA,IACtE,OAAO;AACN,YAAM,KAAK,4BAA4B,SAAS,MAAM,EAAE;AAAA,IACzD;AAEA,UAAM,aAAa,OAAO,WAAW,SAAS,IAAI;AAClD,QAAI,YAAY;AACf,YAAM,KAAK,0BAA0B,WAAW,IAAI,KAAK,cAAc,WAAW,KAAK,CAAC,EAAE;AAAA,IAC3F,OAAO;AACN,YAAM,KAAK,kEAAkE;AAAA,IAC9E;AAEA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,eAAe;AAC1B,eAAW,YAAY,OAAO,aAAa;AAC1C,YAAM,QAAQ,MAAM,YAAY,SAAS,QAAQ,GAAG,IAAI,SAAS;AACjE,YAAM,KAAK,cAAc,SAAS,IAAI,KAAK,KAAK,OAAO,SAAS,OAAO,EAAE;AAAA,IAC1E;AAAA,EACD;AAEA,MAAI,OAAO,WAAW,SAAS,GAAG;AACjC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,QAAQ;AACnB,eAAW,SAAS,OAAO,YAAY;AACtC,YAAM,KAAK,UAAU,MAAM,IAAI,KAAK,cAAc,MAAM,KAAK,CAAC,EAAE;AAAA,IACjE;AAAA,EACD;AAEA,SAAO,MAAM,KAAK,IAAI;AACvB;","names":[]}
|
package/dist/compiler/index.js
CHANGED
package/dist/fast-check/index.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
formatCounterexampleMessage
|
|
3
|
+
} from "../chunk-ZLMOGNRR.js";
|
|
1
4
|
import {
|
|
2
5
|
runOracle
|
|
3
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-BERJ36PI.js";
|
|
4
7
|
import "../chunk-AS6LZLUH.js";
|
|
5
|
-
import
|
|
8
|
+
import {
|
|
9
|
+
compile
|
|
10
|
+
} from "../chunk-JB27QVDU.js";
|
|
6
11
|
import "../chunk-B4SEKVLL.js";
|
|
12
|
+
import "../chunk-NWSJAWTR.js";
|
|
7
13
|
|
|
8
14
|
// src/fast-check/trace-arbitrary.ts
|
|
9
15
|
import * as fc from "fast-check";
|
|
@@ -40,10 +46,11 @@ function commandAdapter(config) {
|
|
|
40
46
|
// src/fast-check/properties.ts
|
|
41
47
|
import * as fc3 from "fast-check";
|
|
42
48
|
function traceProperty(config) {
|
|
49
|
+
const doc = compile(config.formula);
|
|
43
50
|
return fc3.property(config.traceArbitrary, (trace) => {
|
|
44
51
|
const result = runOracle(config.formula, config.runtime, trace);
|
|
45
52
|
if (result.verdict === "violated") {
|
|
46
|
-
const msg = result.report
|
|
53
|
+
const msg = result.report ? formatCounterexampleMessage(result.report, doc) : "Formula violated";
|
|
47
54
|
throw new Error(msg);
|
|
48
55
|
}
|
|
49
56
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fast-check/trace-arbitrary.ts","../../src/fast-check/command-adapter.ts","../../src/fast-check/properties.ts"],"sourcesContent":["import * as fc from \"fast-check\";\n\nexport interface TraceConfig<TEvent> {\n\treadonly eventArbitrary: fc.Arbitrary<TEvent>;\n\treadonly minLength?: number;\n\treadonly maxLength?: number;\n}\n\nexport function traceArbitrary<TEvent>(config: TraceConfig<TEvent>): fc.Arbitrary<TEvent[]> {\n\treturn fc.array(config.eventArbitrary, {\n\t\tminLength: config.minLength ?? 1,\n\t\tmaxLength: config.maxLength ?? 50,\n\t});\n}\n","import * as fc from \"fast-check\";\n\nexport interface TraceEvent<TModel> {\n\treadonly type: string;\n\treadonly payload?: unknown;\n\treadonly modelBefore?: TModel;\n\treadonly modelAfter?: TModel;\n}\n\nexport interface CommandAdapterConfig<TModel extends object, TReal> {\n\treadonly commands: fc.Arbitrary<fc.Command<TModel, TReal>>[];\n\treadonly initialModel: () => TModel;\n\treadonly initialReal: () => TReal;\n}\n\nexport function commandAdapter<TModel extends object, TReal>(\n\tconfig: CommandAdapterConfig<TModel, TReal>,\n): fc.Arbitrary<TraceEvent<TModel>[]> {\n\treturn fc.commands(config.commands).map((cmds) => {\n\t\tconst events: TraceEvent<TModel>[] = [];\n\t\tconst model = config.initialModel();\n\t\tconst real = config.initialReal();\n\n\t\tfor (const cmd of cmds) {\n\t\t\tif (cmd.check(model)) {\n\t\t\t\tconst modelBefore = JSON.parse(JSON.stringify(model)) as TModel;\n\t\t\t\tcmd.run(model, real);\n\t\t\t\tconst modelAfter = JSON.parse(JSON.stringify(model)) as TModel;\n\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: cmd.toString(),\n\t\t\t\t\tmodelBefore,\n\t\t\t\t\tmodelAfter,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn events;\n\t});\n}\n","import * as fc from \"fast-check\";\nimport type { FormulaExpr } from \"../core/formula-expr.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport { runOracle } from \"../monitor/run-oracle.js\";\n\nexport interface TracePropertyConfig<TEvent> {\n\treadonly formula: FormulaExpr;\n\treadonly runtime: MonitorRuntime<TEvent>;\n\treadonly traceArbitrary: fc.Arbitrary<TEvent[]>;\n}\n\nexport function traceProperty<TEvent>(\n\tconfig: TracePropertyConfig<TEvent>,\n): fc.IPropertyWithHooks<[TEvent[]]> {\n\treturn fc.property(config.traceArbitrary, (trace) => {\n\t\tconst result = runOracle(config.formula, config.runtime, trace);\n\t\tif (result.verdict === \"violated\") {\n\t\t\tconst msg = result.report
|
|
1
|
+
{"version":3,"sources":["../../src/fast-check/trace-arbitrary.ts","../../src/fast-check/command-adapter.ts","../../src/fast-check/properties.ts"],"sourcesContent":["import * as fc from \"fast-check\";\n\nexport interface TraceConfig<TEvent> {\n\treadonly eventArbitrary: fc.Arbitrary<TEvent>;\n\treadonly minLength?: number;\n\treadonly maxLength?: number;\n}\n\nexport function traceArbitrary<TEvent>(config: TraceConfig<TEvent>): fc.Arbitrary<TEvent[]> {\n\treturn fc.array(config.eventArbitrary, {\n\t\tminLength: config.minLength ?? 1,\n\t\tmaxLength: config.maxLength ?? 50,\n\t});\n}\n","import * as fc from \"fast-check\";\n\nexport interface TraceEvent<TModel> {\n\treadonly type: string;\n\treadonly payload?: unknown;\n\treadonly modelBefore?: TModel;\n\treadonly modelAfter?: TModel;\n}\n\nexport interface CommandAdapterConfig<TModel extends object, TReal> {\n\treadonly commands: fc.Arbitrary<fc.Command<TModel, TReal>>[];\n\treadonly initialModel: () => TModel;\n\treadonly initialReal: () => TReal;\n}\n\nexport function commandAdapter<TModel extends object, TReal>(\n\tconfig: CommandAdapterConfig<TModel, TReal>,\n): fc.Arbitrary<TraceEvent<TModel>[]> {\n\treturn fc.commands(config.commands).map((cmds) => {\n\t\tconst events: TraceEvent<TModel>[] = [];\n\t\tconst model = config.initialModel();\n\t\tconst real = config.initialReal();\n\n\t\tfor (const cmd of cmds) {\n\t\t\tif (cmd.check(model)) {\n\t\t\t\tconst modelBefore = JSON.parse(JSON.stringify(model)) as TModel;\n\t\t\t\tcmd.run(model, real);\n\t\t\t\tconst modelAfter = JSON.parse(JSON.stringify(model)) as TModel;\n\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: cmd.toString(),\n\t\t\t\t\tmodelBefore,\n\t\t\t\t\tmodelAfter,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn events;\n\t});\n}\n","import * as fc from \"fast-check\";\nimport { compile } from \"../compiler/compile.js\";\nimport type { FormulaExpr } from \"../core/formula-expr.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport { formatCounterexampleMessage } from \"../monitor/format-message.js\";\nimport { runOracle } from \"../monitor/run-oracle.js\";\n\nexport interface TracePropertyConfig<TEvent> {\n\treadonly formula: FormulaExpr;\n\treadonly runtime: MonitorRuntime<TEvent>;\n\treadonly traceArbitrary: fc.Arbitrary<TEvent[]>;\n}\n\nexport function traceProperty<TEvent>(\n\tconfig: TracePropertyConfig<TEvent>,\n): fc.IPropertyWithHooks<[TEvent[]]> {\n\tconst doc = compile(config.formula);\n\n\treturn fc.property(config.traceArbitrary, (trace) => {\n\t\tconst result = runOracle(config.formula, config.runtime, trace);\n\t\tif (result.verdict === \"violated\") {\n\t\t\tconst msg = result.report\n\t\t\t\t? formatCounterexampleMessage(result.report, doc)\n\t\t\t\t: \"Formula violated\";\n\t\t\tthrow new Error(msg);\n\t\t}\n\t});\n}\n\nexport function commandProperty<TEvent>(\n\tformula: FormulaExpr,\n\truntime: MonitorRuntime<TEvent>,\n\tcommandArbitrary: fc.Arbitrary<TEvent[]>,\n): fc.IPropertyWithHooks<[TEvent[]]> {\n\treturn traceProperty({\n\t\tformula,\n\t\truntime,\n\t\ttraceArbitrary: commandArbitrary,\n\t});\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AAQb,SAAS,eAAuB,QAAqD;AAC3F,SAAU,SAAM,OAAO,gBAAgB;AAAA,IACtC,WAAW,OAAO,aAAa;AAAA,IAC/B,WAAW,OAAO,aAAa;AAAA,EAChC,CAAC;AACF;;;ACbA,YAAYA,SAAQ;AAeb,SAAS,eACf,QACqC;AACrC,SAAU,aAAS,OAAO,QAAQ,EAAE,IAAI,CAAC,SAAS;AACjD,UAAM,SAA+B,CAAC;AACtC,UAAM,QAAQ,OAAO,aAAa;AAClC,UAAM,OAAO,OAAO,YAAY;AAEhC,eAAW,OAAO,MAAM;AACvB,UAAI,IAAI,MAAM,KAAK,GAAG;AACrB,cAAM,cAAc,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACpD,YAAI,IAAI,OAAO,IAAI;AACnB,cAAM,aAAa,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAEnD,eAAO,KAAK;AAAA,UACX,MAAM,IAAI,SAAS;AAAA,UACnB;AAAA,UACA;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAO;AAAA,EACR,CAAC;AACF;;;ACvCA,YAAYC,SAAQ;AAab,SAAS,cACf,QACoC;AACpC,QAAM,MAAM,QAAQ,OAAO,OAAO;AAElC,SAAU,aAAS,OAAO,gBAAgB,CAAC,UAAU;AACpD,UAAM,SAAS,UAAU,OAAO,SAAS,OAAO,SAAS,KAAK;AAC9D,QAAI,OAAO,YAAY,YAAY;AAClC,YAAM,MAAM,OAAO,SAChB,4BAA4B,OAAO,QAAQ,GAAG,IAC9C;AACH,YAAM,IAAI,MAAM,GAAG;AAAA,IACpB;AAAA,EACD,CAAC;AACF;AAEO,SAAS,gBACf,SACA,SACA,kBACoC;AACpC,SAAO,cAAc;AAAA,IACpB;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,EACjB,CAAC;AACF;","names":["fc","fc"]}
|
package/dist/monitor/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
jsonEqual,
|
|
9
9
|
resolveArg,
|
|
10
10
|
runOracle
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-BERJ36PI.js";
|
|
12
12
|
import {
|
|
13
13
|
andV,
|
|
14
14
|
impliesV,
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
} from "../chunk-AS6LZLUH.js";
|
|
18
18
|
import {
|
|
19
19
|
print
|
|
20
|
-
} from "../chunk-
|
|
20
|
+
} from "../chunk-JB27QVDU.js";
|
|
21
21
|
import "../chunk-B4SEKVLL.js";
|
|
22
22
|
|
|
23
23
|
// src/monitor/create.ts
|
package/dist/patterns/index.js
CHANGED
package/dist/vitest/index.js
CHANGED
|
@@ -1,28 +1,38 @@
|
|
|
1
|
+
import {
|
|
2
|
+
formatCounterexampleMessage
|
|
3
|
+
} from "../chunk-ZLMOGNRR.js";
|
|
1
4
|
import {
|
|
2
5
|
runOracle
|
|
3
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-BERJ36PI.js";
|
|
4
7
|
import "../chunk-AS6LZLUH.js";
|
|
5
|
-
import
|
|
8
|
+
import {
|
|
9
|
+
compile,
|
|
10
|
+
print
|
|
11
|
+
} from "../chunk-JB27QVDU.js";
|
|
6
12
|
import "../chunk-B4SEKVLL.js";
|
|
13
|
+
import "../chunk-NWSJAWTR.js";
|
|
7
14
|
|
|
8
15
|
// src/vitest/matchers.ts
|
|
9
16
|
function createMatchers() {
|
|
10
17
|
return {
|
|
11
18
|
toSatisfy(received, formula, runtime) {
|
|
19
|
+
const doc = compile(formula);
|
|
20
|
+
const renderedFormula = print(doc);
|
|
12
21
|
const result = runOracle(formula, runtime, received);
|
|
13
22
|
const pass = result.verdict === "satisfied";
|
|
14
23
|
return {
|
|
15
24
|
pass,
|
|
16
|
-
message: () => pass ? "Expected trace NOT to satisfy formula, but it did" : `Expected trace to satisfy formula, but got verdict: ${result.verdict}
|
|
17
|
-
${result.report
|
|
25
|
+
message: () => pass ? "Expected trace NOT to satisfy formula, but it did" : result.report ? `Expected trace to satisfy formula, but got verdict: ${result.verdict}
|
|
26
|
+
${formatCounterexampleMessage(result.report, doc)}` : `Expected trace to satisfy formula ${renderedFormula}, but got verdict: ${result.verdict}`
|
|
18
27
|
};
|
|
19
28
|
},
|
|
20
29
|
toViolate(received, formula, runtime) {
|
|
30
|
+
const renderedFormula = print(compile(formula));
|
|
21
31
|
const result = runOracle(formula, runtime, received);
|
|
22
32
|
const pass = result.verdict === "violated";
|
|
23
33
|
return {
|
|
24
34
|
pass,
|
|
25
|
-
message: () => pass ? "Expected trace NOT to violate formula, but it did" : `Expected trace to violate formula, but got verdict: ${result.verdict}`
|
|
35
|
+
message: () => pass ? "Expected trace NOT to violate formula, but it did" : `Expected trace to violate formula ${renderedFormula}, but got verdict: ${result.verdict}`
|
|
26
36
|
};
|
|
27
37
|
}
|
|
28
38
|
};
|
package/dist/vitest/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/vitest/matchers.ts","../../src/vitest/setup.ts"],"sourcesContent":["import type { FormulaExpr } from \"../core/formula-expr.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport { runOracle } from \"../monitor/run-oracle.js\";\n\nexport interface TraceMatcherOptions<TEvent> {\n\treadonly formula: FormulaExpr;\n\treadonly runtime: MonitorRuntime<TEvent>;\n}\n\nexport function createMatchers() {\n\treturn {\n\t\ttoSatisfy<TEvent>(received: TEvent[], formula: FormulaExpr, runtime: MonitorRuntime<TEvent>) {\n\t\t\tconst result = runOracle(formula, runtime, received);\n\t\t\tconst pass = result.verdict === \"satisfied\";\n\t\t\treturn {\n\t\t\t\tpass,\n\t\t\t\tmessage: () =>\n\t\t\t\t\tpass\n\t\t\t\t\t\t? \"Expected trace NOT to satisfy formula, but it did\"\n\t\t\t\t\t\t: `Expected trace to satisfy formula, but got verdict: ${result.verdict}\\n${result.report
|
|
1
|
+
{"version":3,"sources":["../../src/vitest/matchers.ts","../../src/vitest/setup.ts"],"sourcesContent":["import { compile } from \"../compiler/compile.js\";\nimport { print } from \"../compiler/printer.js\";\nimport type { FormulaExpr } from \"../core/formula-expr.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport { formatCounterexampleMessage } from \"../monitor/format-message.js\";\nimport { runOracle } from \"../monitor/run-oracle.js\";\n\nexport interface TraceMatcherOptions<TEvent> {\n\treadonly formula: FormulaExpr;\n\treadonly runtime: MonitorRuntime<TEvent>;\n}\n\nexport function createMatchers() {\n\treturn {\n\t\ttoSatisfy<TEvent>(received: TEvent[], formula: FormulaExpr, runtime: MonitorRuntime<TEvent>) {\n\t\t\tconst doc = compile(formula);\n\t\t\tconst renderedFormula = print(doc);\n\t\t\tconst result = runOracle(formula, runtime, received);\n\t\t\tconst pass = result.verdict === \"satisfied\";\n\t\t\treturn {\n\t\t\t\tpass,\n\t\t\t\tmessage: () =>\n\t\t\t\t\tpass\n\t\t\t\t\t\t? \"Expected trace NOT to satisfy formula, but it did\"\n\t\t\t\t\t\t: result.report\n\t\t\t\t\t\t\t? `Expected trace to satisfy formula, but got verdict: ${result.verdict}\\n${formatCounterexampleMessage(result.report, doc)}`\n\t\t\t\t\t\t\t: `Expected trace to satisfy formula ${renderedFormula}, but got verdict: ${result.verdict}`,\n\t\t\t};\n\t\t},\n\n\t\ttoViolate<TEvent>(received: TEvent[], formula: FormulaExpr, runtime: MonitorRuntime<TEvent>) {\n\t\t\tconst renderedFormula = print(compile(formula));\n\t\t\tconst result = runOracle(formula, runtime, received);\n\t\t\tconst pass = result.verdict === \"violated\";\n\t\t\treturn {\n\t\t\t\tpass,\n\t\t\t\tmessage: () =>\n\t\t\t\t\tpass\n\t\t\t\t\t\t? \"Expected trace NOT to violate formula, but it did\"\n\t\t\t\t\t\t: `Expected trace to violate formula ${renderedFormula}, but got verdict: ${result.verdict}`,\n\t\t\t};\n\t\t},\n\t};\n}\n","import { expect } from \"vitest\";\nimport type { FormulaExpr } from \"../core/formula-expr.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport { createMatchers } from \"./matchers.js\";\n\ndeclare module \"vitest\" {\n\tinterface CustomMatchers<R> {\n\t\ttoSatisfy<TEvent>(formula: FormulaExpr, runtime: MonitorRuntime<TEvent>): R;\n\t\ttoViolate<TEvent>(formula: FormulaExpr, runtime: MonitorRuntime<TEvent>): R;\n\t}\n}\n\nexport function installMatchers(): void {\n\texpect.extend(createMatchers());\n}\n"],"mappings":";;;;;;;;;;;;;;;AAYO,SAAS,iBAAiB;AAChC,SAAO;AAAA,IACN,UAAkB,UAAoB,SAAsB,SAAiC;AAC5F,YAAM,MAAM,QAAQ,OAAO;AAC3B,YAAM,kBAAkB,MAAM,GAAG;AACjC,YAAM,SAAS,UAAU,SAAS,SAAS,QAAQ;AACnD,YAAM,OAAO,OAAO,YAAY;AAChC,aAAO;AAAA,QACN;AAAA,QACA,SAAS,MACR,OACG,sDACA,OAAO,SACN,uDAAuD,OAAO,OAAO;AAAA,EAAK,4BAA4B,OAAO,QAAQ,GAAG,CAAC,KACzH,qCAAqC,eAAe,sBAAsB,OAAO,OAAO;AAAA,MAC9F;AAAA,IACD;AAAA,IAEA,UAAkB,UAAoB,SAAsB,SAAiC;AAC5F,YAAM,kBAAkB,MAAM,QAAQ,OAAO,CAAC;AAC9C,YAAM,SAAS,UAAU,SAAS,SAAS,QAAQ;AACnD,YAAM,OAAO,OAAO,YAAY;AAChC,aAAO;AAAA,QACN;AAAA,QACA,SAAS,MACR,OACG,sDACA,qCAAqC,eAAe,sBAAsB,OAAO,OAAO;AAAA,MAC7F;AAAA,IACD;AAAA,EACD;AACD;;;AC3CA,SAAS,cAAc;AAYhB,SAAS,kBAAwB;AACvC,SAAO,OAAO,eAAe,CAAC;AAC/B;","names":[]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/builder/factory.ts"],"sourcesContent":["import type {\n\tAlwaysExpr,\n\tAndExpr,\n\tCaptureExpr,\n\tCaptureName,\n\tEventuallyExpr,\n\tFormulaExpr,\n\tFormulaMeta,\n\tHistoricallyExpr,\n\tImpliesExpr,\n\tLiteralExpr,\n\tNextExpr,\n\tNotExpr,\n\tOnceExpr,\n\tOrExpr,\n\tPredicateExpr,\n\tPredicateId,\n\tReleaseExpr,\n\tSelectorId,\n\tSinceExpr,\n\tUntilExpr,\n\tValueExprArg,\n\tWeakNextExpr,\n\tWhenExpr,\n\tWithinMsExpr,\n\tWithinStepsExpr,\n} from \"../core/index.js\";\n\nexport function toExpr(v: boolean | FormulaExpr): FormulaExpr {\n\tif (typeof v === \"boolean\") return literal(v);\n\treturn v;\n}\n\nexport function annotate(expr: FormulaExpr, meta: FormulaMeta): FormulaExpr {\n\treturn { ...expr, meta } as FormulaExpr;\n}\n\n// --- Leaf nodes ---\n\nexport function literal(value: boolean): LiteralExpr {\n\treturn { kind: \"literal\", value };\n}\n\nexport function predicate(\n\tpredicateId: PredicateId,\n\t...args: readonly ValueExprArg[]\n): PredicateExpr {\n\treturn args.length > 0\n\t\t? { kind: \"predicate\", predicateId, args }\n\t\t: { kind: \"predicate\", predicateId };\n}\n\nexport function when(\n\tcaptureName: CaptureName,\n\tselectorId: SelectorId,\n\tchild: boolean | FormulaExpr,\n): WhenExpr {\n\treturn { kind: \"when\", captureName, selectorId, child: toExpr(child) };\n}\n\nexport function capture(\n\tcaptureName: CaptureName,\n\tselectorId: SelectorId,\n\tchild: boolean | FormulaExpr,\n): CaptureExpr {\n\treturn { kind: \"capture\", captureName, selectorId, child: toExpr(child) };\n}\n\n// --- Boolean operators ---\n\nexport function not(child: boolean | FormulaExpr): NotExpr {\n\treturn { kind: \"not\", child: toExpr(child) };\n}\n\nexport function and(...children: readonly (boolean | FormulaExpr)[]): AndExpr {\n\treturn { kind: \"and\", children: children.map(toExpr) };\n}\n\nexport function or(...children: readonly (boolean | FormulaExpr)[]): OrExpr {\n\treturn { kind: \"or\", children: children.map(toExpr) };\n}\n\nexport function implies(left: boolean | FormulaExpr, right: boolean | FormulaExpr): ImpliesExpr {\n\treturn { kind: \"implies\", left: toExpr(left), right: toExpr(right) };\n}\n\n// --- Future temporal operators ---\n\nexport function always(child: boolean | FormulaExpr): AlwaysExpr {\n\treturn { kind: \"always\", child: toExpr(child) };\n}\n\nexport function eventually(child: boolean | FormulaExpr): EventuallyExpr {\n\treturn { kind: \"eventually\", child: toExpr(child) };\n}\n\nexport function next(child: boolean | FormulaExpr): NextExpr {\n\treturn { kind: \"next\", child: toExpr(child) };\n}\n\nexport function weakNext(child: boolean | FormulaExpr): WeakNextExpr {\n\treturn { kind: \"weakNext\", child: toExpr(child) };\n}\n\nexport function until(left: boolean | FormulaExpr, right: boolean | FormulaExpr): UntilExpr {\n\treturn { kind: \"until\", left: toExpr(left), right: toExpr(right) };\n}\n\nexport function release(left: boolean | FormulaExpr, right: boolean | FormulaExpr): ReleaseExpr {\n\treturn { kind: \"release\", left: toExpr(left), right: toExpr(right) };\n}\n\n// --- Past temporal operators ---\n\nexport function once(child: boolean | FormulaExpr): OnceExpr {\n\treturn { kind: \"once\", child: toExpr(child) };\n}\n\nexport function historically(child: boolean | FormulaExpr): HistoricallyExpr {\n\treturn { kind: \"historically\", child: toExpr(child) };\n}\n\nexport function since(left: boolean | FormulaExpr, right: boolean | FormulaExpr): SinceExpr {\n\treturn { kind: \"since\", left: toExpr(left), right: toExpr(right) };\n}\n\n// --- Bounded operators ---\n\nexport function withinSteps(steps: number, child: boolean | FormulaExpr): WithinStepsExpr {\n\treturn { kind: \"withinSteps\", steps, child: toExpr(child) };\n}\n\nexport function withinMs(ms: number, child: boolean | FormulaExpr): WithinMsExpr {\n\treturn { kind: \"withinMs\", ms, child: toExpr(child) };\n}\n"],"mappings":";AA4BO,SAAS,OAAO,GAAuC;AAC7D,MAAI,OAAO,MAAM,UAAW,QAAO,QAAQ,CAAC;AAC5C,SAAO;AACR;AAEO,SAAS,SAAS,MAAmB,MAAgC;AAC3E,SAAO,EAAE,GAAG,MAAM,KAAK;AACxB;AAIO,SAAS,QAAQ,OAA6B;AACpD,SAAO,EAAE,MAAM,WAAW,MAAM;AACjC;AAEO,SAAS,UACf,gBACG,MACa;AAChB,SAAO,KAAK,SAAS,IAClB,EAAE,MAAM,aAAa,aAAa,KAAK,IACvC,EAAE,MAAM,aAAa,YAAY;AACrC;AAEO,SAAS,KACf,aACA,YACA,OACW;AACX,SAAO,EAAE,MAAM,QAAQ,aAAa,YAAY,OAAO,OAAO,KAAK,EAAE;AACtE;AAEO,SAAS,QACf,aACA,YACA,OACc;AACd,SAAO,EAAE,MAAM,WAAW,aAAa,YAAY,OAAO,OAAO,KAAK,EAAE;AACzE;AAIO,SAAS,IAAI,OAAuC;AAC1D,SAAO,EAAE,MAAM,OAAO,OAAO,OAAO,KAAK,EAAE;AAC5C;AAEO,SAAS,OAAO,UAAuD;AAC7E,SAAO,EAAE,MAAM,OAAO,UAAU,SAAS,IAAI,MAAM,EAAE;AACtD;AAEO,SAAS,MAAM,UAAsD;AAC3E,SAAO,EAAE,MAAM,MAAM,UAAU,SAAS,IAAI,MAAM,EAAE;AACrD;AAEO,SAAS,QAAQ,MAA6B,OAA2C;AAC/F,SAAO,EAAE,MAAM,WAAW,MAAM,OAAO,IAAI,GAAG,OAAO,OAAO,KAAK,EAAE;AACpE;AAIO,SAAS,OAAO,OAA0C;AAChE,SAAO,EAAE,MAAM,UAAU,OAAO,OAAO,KAAK,EAAE;AAC/C;AAEO,SAAS,WAAW,OAA8C;AACxE,SAAO,EAAE,MAAM,cAAc,OAAO,OAAO,KAAK,EAAE;AACnD;AAEO,SAAS,KAAK,OAAwC;AAC5D,SAAO,EAAE,MAAM,QAAQ,OAAO,OAAO,KAAK,EAAE;AAC7C;AAEO,SAAS,SAAS,OAA4C;AACpE,SAAO,EAAE,MAAM,YAAY,OAAO,OAAO,KAAK,EAAE;AACjD;AAEO,SAAS,MAAM,MAA6B,OAAyC;AAC3F,SAAO,EAAE,MAAM,SAAS,MAAM,OAAO,IAAI,GAAG,OAAO,OAAO,KAAK,EAAE;AAClE;AAEO,SAAS,QAAQ,MAA6B,OAA2C;AAC/F,SAAO,EAAE,MAAM,WAAW,MAAM,OAAO,IAAI,GAAG,OAAO,OAAO,KAAK,EAAE;AACpE;AAIO,SAAS,KAAK,OAAwC;AAC5D,SAAO,EAAE,MAAM,QAAQ,OAAO,OAAO,KAAK,EAAE;AAC7C;AAEO,SAAS,aAAa,OAAgD;AAC5E,SAAO,EAAE,MAAM,gBAAgB,OAAO,OAAO,KAAK,EAAE;AACrD;AAEO,SAAS,MAAM,MAA6B,OAAyC;AAC3F,SAAO,EAAE,MAAM,SAAS,MAAM,OAAO,IAAI,GAAG,OAAO,OAAO,KAAK,EAAE;AAClE;AAIO,SAAS,YAAY,OAAe,OAA+C;AACzF,SAAO,EAAE,MAAM,eAAe,OAAO,OAAO,OAAO,KAAK,EAAE;AAC3D;AAEO,SAAS,SAAS,IAAY,OAA4C;AAChF,SAAO,EAAE,MAAM,YAAY,IAAI,OAAO,OAAO,KAAK,EAAE;AACrD;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/monitor/eval-common.ts","../src/monitor/unsupported.ts","../src/monitor/time.ts","../src/monitor/evaluate-finite.ts","../src/monitor/evaluate.ts","../src/monitor/diagnostics.ts","../src/monitor/run-oracle.ts"],"sourcesContent":["import type { NodeId } from \"../core/ids.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport type { JsonValue, ValueExprArg } from \"../core/values.js\";\n\nexport type EvalEnv = Map<string, JsonValue>;\n\nexport function envKey(env: EvalEnv): string {\n\tconst entries = [...env.entries()].sort(([left], [right]) => left.localeCompare(right));\n\treturn JSON.stringify(entries);\n}\n\nexport function cacheKey(nodeId: NodeId, pos: number, env: EvalEnv): string {\n\treturn `${nodeId}:${pos}:${envKey(env)}`;\n}\n\nexport function resolveArg<TEvent>(\n\targ: ValueExprArg,\n\tevent: TEvent,\n\truntime: MonitorRuntime<TEvent>,\n): JsonValue {\n\tif (arg.kind === \"literal\") {\n\t\treturn arg.value;\n\t}\n\n\tconst selectorFn = runtime.selectors[arg.selectorId];\n\tif (!selectorFn) {\n\t\treturn null;\n\t}\n\n\treturn selectorFn(event);\n}\n\nexport function jsonEqual(a: JsonValue, b: JsonValue): boolean {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tif (a === null || b === null) {\n\t\treturn a === b;\n\t}\n\n\tif (typeof a !== typeof b) {\n\t\treturn false;\n\t}\n\n\tif (typeof a !== \"object\") {\n\t\treturn a === b;\n\t}\n\n\tif (Array.isArray(a)) {\n\t\tif (!Array.isArray(b) || a.length !== b.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn a.every((value, index) => jsonEqual(value, b[index]!));\n\t}\n\n\tif (Array.isArray(b)) {\n\t\treturn false;\n\t}\n\n\tconst aObject = a as Record<string, JsonValue>;\n\tconst bObject = b as Record<string, JsonValue>;\n\tconst aKeys = Object.keys(aObject).sort();\n\tconst bKeys = Object.keys(bObject).sort();\n\tif (aKeys.length !== bKeys.length) {\n\t\treturn false;\n\t}\n\n\treturn aKeys.every(\n\t\t(key, index) => key === bKeys[index] && jsonEqual(aObject[key]!, bObject[key]!),\n\t);\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\n\nexport const WITHIN_MS_RUNTIME_MESSAGE =\n\t\"withinMs requires MonitorRuntime.timestamp to be defined and return event timestamps in milliseconds.\";\n\nexport const WITHIN_MS_TIMESTAMP_MESSAGE =\n\t\"MonitorRuntime.timestamp must return a finite number of milliseconds for every event.\";\n\nexport const WITHIN_MS_NON_MONOTONIC_MESSAGE =\n\t\"MonitorRuntime.timestamp must be non-decreasing across the trace when using withinMs.\";\n\nexport function usesWithinMs(doc: FormulaDocument): boolean {\n\tfor (const node of Object.values(doc.nodes)) {\n\t\tif (node.kind === \"withinMs\") {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function assertWithinMsRuntimeSupport<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n): void {\n\tif (usesWithinMs(doc) && !runtime.timestamp) {\n\t\tthrow new Error(WITHIN_MS_RUNTIME_MESSAGE);\n\t}\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport {\n\tWITHIN_MS_NON_MONOTONIC_MESSAGE,\n\tWITHIN_MS_TIMESTAMP_MESSAGE,\n\tassertWithinMsRuntimeSupport,\n\tusesWithinMs,\n} from \"./unsupported.js\";\n\nexport function getTimestamp<TEvent>(runtime: MonitorRuntime<TEvent>, event: TEvent): number {\n\tconst timestamp = runtime.timestamp?.(event);\n\tif (timestamp === undefined || !Number.isFinite(timestamp)) {\n\t\tthrow new Error(WITHIN_MS_TIMESTAMP_MESSAGE);\n\t}\n\treturn timestamp;\n}\n\nexport function assertTimeSupportForTrace<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): void {\n\tif (!usesWithinMs(doc)) return;\n\tassertWithinMsRuntimeSupport(doc, runtime);\n\n\tlet previous = Number.NEGATIVE_INFINITY;\n\tfor (const event of trace) {\n\t\tconst current = getTimestamp(runtime, event);\n\t\tif (current < previous) {\n\t\t\tthrow new Error(WITHIN_MS_NON_MONOTONIC_MESSAGE);\n\t\t}\n\t\tprevious = current;\n\t}\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { FormulaNode } from \"../core/formula-node.js\";\nimport type { NodeId } from \"../core/ids.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport type { Verdict } from \"../core/verdict.js\";\nimport { andV, impliesV, notV, orV } from \"../core/verdict.js\";\nimport { type EvalEnv, cacheKey, jsonEqual, resolveArg } from \"./eval-common.js\";\nimport { assertTimeSupportForTrace, getTimestamp } from \"./time.js\";\n\nexport interface FiniteEvalContext<TEvent> {\n\treadonly doc: FormulaDocument;\n\treadonly runtime: MonitorRuntime<TEvent>;\n\treadonly trace: readonly TEvent[];\n\treadonly cache: Map<string, Verdict>;\n}\n\nexport function createFiniteEvalContext<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): FiniteEvalContext<TEvent> {\n\tassertTimeSupportForTrace(doc, runtime, trace);\n\n\treturn {\n\t\tdoc,\n\t\truntime,\n\t\ttrace,\n\t\tcache: new Map(),\n\t};\n}\n\nexport function evaluateFiniteFormula<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): Verdict {\n\tconst ctx = createFiniteEvalContext(doc, runtime, trace);\n\treturn evaluateFiniteNode(ctx, doc.root, 0, new Map());\n}\n\nexport function evaluateFiniteNode<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnodeId: NodeId,\n\tpos: number,\n\tenv: EvalEnv,\n): Verdict {\n\tconst entryKey = cacheKey(nodeId, pos, env);\n\tconst cached = ctx.cache.get(entryKey);\n\tif (cached !== undefined) {\n\t\treturn cached;\n\t}\n\n\tconst node = ctx.doc.nodes[nodeId];\n\tif (!node) {\n\t\treturn \"violated\";\n\t}\n\n\t// Prevent infinite recursion by marking the current evaluation as open.\n\tctx.cache.set(entryKey, \"pending\");\n\tconst verdict = evaluateFiniteNodeInner(ctx, node, pos, env);\n\tctx.cache.set(entryKey, verdict);\n\treturn verdict;\n}\n\nfunction evaluateFiniteNodeInner<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnode: FormulaNode,\n\tpos: number,\n\tenv: EvalEnv,\n): Verdict {\n\tconst len = ctx.trace.length;\n\n\tswitch (node.kind) {\n\t\tcase \"literal\":\n\t\t\treturn node.value ? \"satisfied\" : \"violated\";\n\n\t\tcase \"predicate\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst predicateFn = ctx.runtime.predicates[node.predicateId];\n\t\t\tif (!predicateFn) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst event = ctx.trace[pos]!;\n\t\t\tconst args = (node.args ?? []).map((arg) => resolveArg(arg, event, ctx.runtime));\n\t\t\treturn predicateFn(event, args) ? \"satisfied\" : \"violated\";\n\t\t}\n\n\t\tcase \"when\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst captured = env.get(node.captureName as string);\n\t\t\tif (captured === undefined) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst selectorFn = ctx.runtime.selectors[node.selectorId];\n\t\t\tif (!selectorFn) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst currentValue = selectorFn(ctx.trace[pos]!);\n\t\t\tif (!jsonEqual(captured, currentValue)) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\treturn evaluateFiniteNode(ctx, node.child, pos, env);\n\t\t}\n\n\t\tcase \"capture\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst selectorFn = ctx.runtime.selectors[node.selectorId];\n\t\t\tif (!selectorFn) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst nextEnv = new Map(env);\n\t\t\tnextEnv.set(node.captureName as string, selectorFn(ctx.trace[pos]!));\n\t\t\treturn evaluateFiniteNode(ctx, node.child, pos, nextEnv);\n\t\t}\n\n\t\tcase \"not\":\n\t\t\treturn notV(evaluateFiniteNode(ctx, node.child, pos, env));\n\n\t\tcase \"and\": {\n\t\t\tlet result: Verdict = \"satisfied\";\n\t\t\tfor (const childId of node.children) {\n\t\t\t\tresult = andV(result, evaluateFiniteNode(ctx, childId, pos, env));\n\t\t\t\tif (result === \"violated\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tcase \"or\": {\n\t\t\tlet result: Verdict = \"violated\";\n\t\t\tfor (const childId of node.children) {\n\t\t\t\tresult = orV(result, evaluateFiniteNode(ctx, childId, pos, env));\n\t\t\t\tif (result === \"satisfied\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tcase \"implies\":\n\t\t\treturn impliesV(\n\t\t\t\tevaluateFiniteNode(ctx, node.left, pos, env),\n\t\t\t\tevaluateFiniteNode(ctx, node.right, pos, env),\n\t\t\t);\n\n\t\tcase \"always\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"satisfied\";\n\t\t\t}\n\n\t\t\tlet result: Verdict = \"satisfied\";\n\t\t\tfor (let step = pos; step < len; step++) {\n\t\t\t\tresult = andV(result, evaluateFiniteNode(ctx, node.child, step, env));\n\t\t\t\tif (result === \"violated\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tcase \"eventually\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tlet result: Verdict = \"violated\";\n\t\t\tfor (let step = pos; step < len; step++) {\n\t\t\t\tresult = orV(result, evaluateFiniteNode(ctx, node.child, step, env));\n\t\t\t\tif (result === \"satisfied\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tcase \"next\":\n\t\t\treturn pos + 1 >= len ? \"violated\" : evaluateFiniteNode(ctx, node.child, pos + 1, env);\n\n\t\tcase \"weakNext\":\n\t\t\treturn pos + 1 >= len ? \"satisfied\" : evaluateFiniteNode(ctx, node.child, pos + 1, env);\n\n\t\tcase \"until\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tlet leftAccumulator: Verdict = \"satisfied\";\n\t\t\tfor (let step = pos; step < len; step++) {\n\t\t\t\tconst rightVerdict = evaluateFiniteNode(ctx, node.right, step, env);\n\t\t\t\tif (rightVerdict === \"satisfied\" && leftAccumulator === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\n\t\t\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, step, env);\n\t\t\t\tleftAccumulator = step === pos ? leftVerdict : andV(leftAccumulator, leftVerdict);\n\t\t\t\tif (leftAccumulator === \"violated\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"violated\";\n\t\t}\n\n\t\tcase \"release\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"satisfied\";\n\t\t\t}\n\n\t\t\tlet allRight: Verdict = \"satisfied\";\n\t\t\tfor (let step = pos; step < len; step++) {\n\t\t\t\tallRight = andV(allRight, evaluateFiniteNode(ctx, node.right, step, env));\n\t\t\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, step, env);\n\t\t\t\tif (leftVerdict === \"satisfied\" && allRight === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\t\t\t\tif (allRight === \"violated\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn allRight === \"satisfied\" ? \"satisfied\" : \"violated\";\n\t\t}\n\n\t\tcase \"once\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tfor (let step = pos; step >= 0; step--) {\n\t\t\t\tif (evaluateFiniteNode(ctx, node.child, step, env) === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"violated\";\n\t\t}\n\n\t\tcase \"historically\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"satisfied\";\n\t\t\t}\n\n\t\t\tfor (let step = 0; step <= pos; step++) {\n\t\t\t\tif (evaluateFiniteNode(ctx, node.child, step, env) === \"violated\") {\n\t\t\t\t\treturn \"violated\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"satisfied\";\n\t\t}\n\n\t\tcase \"since\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tfor (let witness = pos; witness >= 0; witness--) {\n\t\t\t\tif (evaluateFiniteNode(ctx, node.right, witness, env) !== \"satisfied\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet leftOk: Verdict = \"satisfied\";\n\t\t\t\tfor (let step = witness + 1; step <= pos; step++) {\n\t\t\t\t\tleftOk = andV(leftOk, evaluateFiniteNode(ctx, node.left, step, env));\n\t\t\t\t\tif (leftOk === \"violated\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (leftOk === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"violated\";\n\t\t}\n\n\t\tcase \"withinSteps\": {\n\t\t\tconst upper = Math.min(pos + node.steps, len);\n\t\t\tfor (let step = pos; step < upper; step++) {\n\t\t\t\tif (evaluateFiniteNode(ctx, node.child, step, env) === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn \"violated\";\n\t\t}\n\n\t\tcase \"withinMs\": {\n\t\t\tif (pos >= len) {\n\t\t\t\treturn \"violated\";\n\t\t\t}\n\n\t\t\tconst startTs = getTimestamp(ctx.runtime, ctx.trace[pos]!);\n\t\t\tfor (let step = pos; step < len; step++) {\n\t\t\t\tconst currentTs = getTimestamp(ctx.runtime, ctx.trace[step]!);\n\t\t\t\tif (currentTs - startTs > node.ms) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (evaluateFiniteNode(ctx, node.child, step, env) === \"satisfied\") {\n\t\t\t\t\treturn \"satisfied\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"violated\";\n\t\t}\n\t}\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport type { Verdict } from \"../core/verdict.js\";\nimport { evaluateFiniteFormula } from \"./evaluate-finite.js\";\n\nexport function evaluateFormula<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): Verdict {\n\treturn evaluateFiniteFormula(doc, runtime, trace);\n}\n","import { print } from \"../compiler/printer.js\";\nimport type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { FormulaNode } from \"../core/formula-node.js\";\nimport { type ActivationId, type NodeId, activationId } from \"../core/ids.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport type { JsonValue } from \"../core/values.js\";\nimport type { Verdict } from \"../core/verdict.js\";\nimport { andV } from \"../core/verdict.js\";\nimport { type EvalEnv, envKey, jsonEqual } from \"./eval-common.js\";\nimport {\n\ttype FiniteEvalContext,\n\tcreateFiniteEvalContext,\n\tevaluateFiniteNode,\n} from \"./evaluate-finite.js\";\nimport { getTimestamp } from \"./time.js\";\nimport type { CounterexampleReport, ObligationSnapshot } from \"./types.js\";\n\nexport function buildCounterexampleReport<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): CounterexampleReport | null {\n\tconst ctx = createFiniteEvalContext(doc, runtime, trace);\n\tconst env: EvalEnv = new Map();\n\tconst verdict = evaluateFiniteNode(ctx, doc.root, 0, env);\n\tif (verdict !== \"violated\") {\n\t\treturn null;\n\t}\n\n\tconst failurePath: ObligationSnapshot[] = [];\n\tcollectFailurePath(ctx, doc.root, 0, env, failurePath);\n\n\treturn {\n\t\tverdict: \"violated\",\n\t\tfailurePath,\n\t\ttraceSlice: trace.map((event, i) => ({ step: i + 1, event })),\n\t\tsummary: `Formula violated: ${print(doc)}`,\n\t};\n}\n\nfunction collectFailurePath<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnodeId: NodeId,\n\tpos: number,\n\tenv: EvalEnv,\n\tpath: ObligationSnapshot[],\n): void {\n\tconst verdict = evaluateFiniteNode(ctx, nodeId, pos, env);\n\tpath.push({\n\t\tnodeId,\n\t\tactivationId: toActivationId(nodeId, pos, env),\n\t\tverdict,\n\t\tstep: pos,\n\t});\n\n\tconst node = ctx.doc.nodes[nodeId];\n\tif (!node) {\n\t\treturn;\n\t}\n\n\tswitch (node.kind) {\n\t\tcase \"literal\":\n\t\tcase \"predicate\":\n\t\t\treturn;\n\n\t\tcase \"when\": {\n\t\t\tif (pos >= ctx.trace.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst captured = env.get(node.captureName as string);\n\t\t\tif (captured === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst selectorFn = ctx.runtime.selectors[node.selectorId];\n\t\t\tif (!selectorFn) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst currentVal = selectorFn(ctx.trace[pos]!);\n\t\t\tif (!jsonEqual(captured, currentVal)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcollectFailurePath(ctx, node.child, pos, env, path);\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"capture\": {\n\t\t\tif (pos >= ctx.trace.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst selectorFn = ctx.runtime.selectors[node.selectorId];\n\t\t\tif (!selectorFn) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst nextEnv = new Map(env);\n\t\t\tnextEnv.set(node.captureName as string, selectorFn(ctx.trace[pos]!));\n\t\t\tcollectFailurePath(ctx, node.child, pos, nextEnv, path);\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"not\":\n\t\t\tcollectFailurePath(ctx, node.child, pos, env, path);\n\t\t\treturn;\n\n\t\tcase \"and\":\n\t\tcase \"or\": {\n\t\t\tconst childId = pickBooleanChild(ctx, node, pos, env, verdict);\n\t\t\tif (childId) {\n\t\t\t\tcollectFailurePath(ctx, childId, pos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"implies\": {\n\t\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, pos, env);\n\t\t\tconst rightVerdict = evaluateFiniteNode(ctx, node.right, pos, env);\n\t\t\tif (verdict === \"violated\") {\n\t\t\t\tcollectFailurePath(ctx, node.right, pos, env, path);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rightVerdict === \"satisfied\") {\n\t\t\t\tcollectFailurePath(ctx, node.right, pos, env, path);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (leftVerdict !== verdict || rightVerdict === \"pending\") {\n\t\t\t\tcollectFailurePath(ctx, node.left, pos, env, path);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"always\": {\n\t\t\tconst childPos =\n\t\t\t\tverdict === \"violated\"\n\t\t\t\t\t? findFirstPosition(ctx, node.child, pos, ctx.trace.length - 1, env, \"violated\")\n\t\t\t\t\t: pos < ctx.trace.length\n\t\t\t\t\t\t? pos\n\t\t\t\t\t\t: null;\n\t\t\tif (childPos !== null) {\n\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"eventually\": {\n\t\t\tconst childPos =\n\t\t\t\tverdict === \"satisfied\"\n\t\t\t\t\t? findFirstPosition(ctx, node.child, pos, ctx.trace.length - 1, env, \"satisfied\")\n\t\t\t\t\t: findLastPosition(ctx, node.child, pos, ctx.trace.length - 1, env, \"violated\");\n\t\t\tif (childPos !== null) {\n\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"next\":\n\t\tcase \"weakNext\":\n\t\t\tif (pos + 1 < ctx.trace.length) {\n\t\t\t\tcollectFailurePath(ctx, node.child, pos + 1, env, path);\n\t\t\t}\n\t\t\treturn;\n\n\t\tcase \"until\": {\n\t\t\tconst witness = findUntilFailureOrWitness(ctx, node, pos, env, verdict);\n\t\t\tif (witness) {\n\t\t\t\tcollectFailurePath(ctx, witness.nodeId, witness.pos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"release\": {\n\t\t\tconst witness = findReleaseFailureOrWitness(ctx, node, pos, env, verdict);\n\t\t\tif (witness) {\n\t\t\t\tcollectFailurePath(ctx, witness.nodeId, witness.pos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"once\": {\n\t\t\tconst childPos =\n\t\t\t\tverdict === \"satisfied\"\n\t\t\t\t\t? findLastPosition(ctx, node.child, 0, pos, env, \"satisfied\")\n\t\t\t\t\t: pos < ctx.trace.length\n\t\t\t\t\t\t? pos\n\t\t\t\t\t\t: null;\n\t\t\tif (childPos !== null) {\n\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"historically\": {\n\t\t\tconst childPos =\n\t\t\t\tverdict === \"violated\"\n\t\t\t\t\t? findFirstPosition(ctx, node.child, 0, pos, env, \"violated\")\n\t\t\t\t\t: pos < ctx.trace.length\n\t\t\t\t\t\t? pos\n\t\t\t\t\t\t: null;\n\t\t\tif (childPos !== null) {\n\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"since\": {\n\t\t\tconst witness = findSinceFailureOrWitness(ctx, node, pos, env, verdict);\n\t\t\tif (witness) {\n\t\t\t\tcollectFailurePath(ctx, witness.nodeId, witness.pos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"withinSteps\": {\n\t\t\tconst upper = Math.min(pos + node.steps - 1, ctx.trace.length - 1);\n\t\t\tconst childPos =\n\t\t\t\tverdict === \"satisfied\"\n\t\t\t\t\t? findFirstPosition(ctx, node.child, pos, upper, env, \"satisfied\")\n\t\t\t\t\t: findLastPosition(ctx, node.child, pos, upper, env, \"violated\");\n\t\t\tif (childPos !== null) {\n\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tcase \"withinMs\": {\n\t\t\tif (pos >= ctx.trace.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst startTs = getTimestamp(ctx.runtime, ctx.trace[pos]!);\n\t\t\tlet lastInBudget: number | null = null;\n\t\t\tfor (let i = pos; i < ctx.trace.length; i++) {\n\t\t\t\tconst currentTs = getTimestamp(ctx.runtime, ctx.trace[i]!);\n\t\t\t\tif (currentTs - startTs > node.ms) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tlastInBudget = i;\n\t\t\t\tif (\n\t\t\t\t\tverdict === \"satisfied\" &&\n\t\t\t\t\tevaluateFiniteNode(ctx, node.child, i, env) === \"satisfied\"\n\t\t\t\t) {\n\t\t\t\t\tcollectFailurePath(ctx, node.child, i, env, path);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (verdict === \"violated\" && lastInBudget !== null) {\n\t\t\t\tconst childPos = findLastPosition(ctx, node.child, pos, lastInBudget, env, \"violated\");\n\t\t\t\tif (childPos !== null) {\n\t\t\t\t\tcollectFailurePath(ctx, node.child, childPos, env, path);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction pickBooleanChild<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnode: Extract<FormulaNode, { kind: \"and\" | \"or\" }>,\n\tpos: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): NodeId | null {\n\tfor (const childId of node.children) {\n\t\tconst childVerdict = evaluateFiniteNode(ctx, childId, pos, env);\n\t\tif (verdict === \"violated\" && childVerdict === \"violated\") {\n\t\t\treturn childId;\n\t\t}\n\t\tif (verdict === \"satisfied\" && childVerdict === \"satisfied\") {\n\t\t\treturn childId;\n\t\t}\n\t\tif (verdict === \"pending\" && childVerdict === \"pending\") {\n\t\t\treturn childId;\n\t\t}\n\t}\n\treturn node.children[0] ?? null;\n}\n\nfunction findUntilFailureOrWitness<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnode: Extract<FormulaNode, { kind: \"until\" }>,\n\tpos: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): { readonly nodeId: NodeId; readonly pos: number } | null {\n\tif (pos >= ctx.trace.length) {\n\t\treturn null;\n\t}\n\n\tlet leftAcc: Verdict = \"satisfied\";\n\tfor (let j = pos; j < ctx.trace.length; j++) {\n\t\tconst rightVerdict = evaluateFiniteNode(ctx, node.right, j, env);\n\t\tif (rightVerdict === \"satisfied\" && leftAcc === \"satisfied\") {\n\t\t\treturn verdict === \"satisfied\" ? { nodeId: node.right, pos: j } : null;\n\t\t}\n\n\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, j, env);\n\t\tif (verdict === \"violated\" && leftAcc === \"satisfied\" && leftVerdict === \"violated\") {\n\t\t\treturn { nodeId: node.left, pos: j };\n\t\t}\n\t\tleftAcc = j === pos ? leftVerdict : andV(leftAcc, leftVerdict);\n\t\tif (leftAcc === \"violated\") {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (verdict === \"violated\") {\n\t\tconst rightPos = findLastPosition(ctx, node.right, pos, ctx.trace.length - 1, env, \"violated\");\n\t\tif (rightPos !== null) {\n\t\t\treturn { nodeId: node.right, pos: rightPos };\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction findReleaseFailureOrWitness<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnode: Extract<FormulaNode, { kind: \"release\" }>,\n\tpos: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): { readonly nodeId: NodeId; readonly pos: number } | null {\n\tif (pos >= ctx.trace.length) {\n\t\treturn null;\n\t}\n\n\tlet allRight: Verdict = \"satisfied\";\n\tfor (let j = pos; j < ctx.trace.length; j++) {\n\t\tconst rightVerdict = evaluateFiniteNode(ctx, node.right, j, env);\n\t\tif (verdict === \"violated\" && allRight === \"satisfied\" && rightVerdict === \"violated\") {\n\t\t\treturn { nodeId: node.right, pos: j };\n\t\t}\n\n\t\tallRight = andV(allRight, rightVerdict);\n\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, j, env);\n\t\tif (leftVerdict === \"satisfied\" && allRight === \"satisfied\") {\n\t\t\treturn verdict === \"satisfied\" ? { nodeId: node.left, pos: j } : null;\n\t\t}\n\t\tif (allRight === \"violated\") {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (verdict === \"satisfied\" && pos < ctx.trace.length) {\n\t\treturn { nodeId: node.right, pos };\n\t}\n\n\treturn null;\n}\n\nfunction findSinceFailureOrWitness<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnode: Extract<FormulaNode, { kind: \"since\" }>,\n\tpos: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): { readonly nodeId: NodeId; readonly pos: number } | null {\n\tif (pos >= ctx.trace.length) {\n\t\treturn null;\n\t}\n\n\tfor (let j = pos; j >= 0; j--) {\n\t\tconst rightVerdict = evaluateFiniteNode(ctx, node.right, j, env);\n\t\tif (rightVerdict === \"satisfied\") {\n\t\t\tlet leftOk: Verdict = \"satisfied\";\n\t\t\tfor (let i = j + 1; i <= pos; i++) {\n\t\t\t\tconst leftVerdict = evaluateFiniteNode(ctx, node.left, i, env);\n\t\t\t\tif (verdict === \"violated\" && leftVerdict === \"violated\") {\n\t\t\t\t\treturn { nodeId: node.left, pos: i };\n\t\t\t\t}\n\t\t\t\tleftOk = andV(leftOk, leftVerdict);\n\t\t\t\tif (leftOk === \"violated\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (leftOk === \"satisfied\") {\n\t\t\t\treturn verdict === \"satisfied\" ? { nodeId: node.right, pos: j } : null;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (verdict === \"violated\") {\n\t\tconst rightPos = findFirstPosition(ctx, node.right, 0, pos, env, \"violated\");\n\t\tif (rightPos !== null) {\n\t\t\treturn { nodeId: node.right, pos: rightPos };\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction findFirstPosition<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnodeId: NodeId,\n\tstart: number,\n\tend: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): number | null {\n\tif (start > end) {\n\t\treturn null;\n\t}\n\tfor (let pos = start; pos <= end; pos++) {\n\t\tif (evaluateFiniteNode(ctx, nodeId, pos, env) === verdict) {\n\t\t\treturn pos;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction findLastPosition<TEvent>(\n\tctx: FiniteEvalContext<TEvent>,\n\tnodeId: NodeId,\n\tstart: number,\n\tend: number,\n\tenv: EvalEnv,\n\tverdict: Verdict,\n): number | null {\n\tif (start > end) {\n\t\treturn null;\n\t}\n\tfor (let pos = end; pos >= start; pos--) {\n\t\tif (evaluateFiniteNode(ctx, nodeId, pos, env) === verdict) {\n\t\t\treturn pos;\n\t\t}\n\t}\n\treturn null;\n}\nfunction toActivationId(nodeId: NodeId, pos: number, env: EvalEnv): ActivationId {\n\treturn activationId(`${nodeId}:${pos}:${encodeURIComponent(envKey(env))}`);\n}\n","import { compile } from \"../compiler/compile.js\";\nimport { print } from \"../compiler/printer.js\";\nimport { validate } from \"../compiler/validate.js\";\nimport type { FormulaExpr } from \"../core/formula-expr.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport { buildCounterexampleReport } from \"./diagnostics.js\";\nimport { evaluateFormula } from \"./evaluate.js\";\nimport type { CounterexampleReport, OracleRunResult } from \"./types.js\";\n\nexport function runOracle<TEvent>(\n\tformula: FormulaExpr,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): OracleRunResult {\n\tconst doc = compile(formula);\n\n\tconst errors = validate(doc);\n\tif (errors.length > 0) {\n\t\tconst messages = errors.map((e) => `${e.nodeId}: ${e.message}`).join(\"; \");\n\t\tthrow new Error(`Invalid formula: ${messages}`);\n\t}\n\n\tconst verdict = evaluateFormula(doc, runtime, trace);\n\n\tconst report: CounterexampleReport | null =\n\t\tverdict === \"violated\"\n\t\t\t? (buildCounterexampleReport(doc, runtime, trace) ?? {\n\t\t\t\t\tverdict: \"violated\",\n\t\t\t\t\tfailurePath: [],\n\t\t\t\t\ttraceSlice: trace.map((event, i) => ({ step: i + 1, event })),\n\t\t\t\t\tsummary: `Formula violated: ${print(doc)}`,\n\t\t\t\t})\n\t\t\t: null;\n\n\treturn {\n\t\tverdict,\n\t\tsteps: trace.length,\n\t\treport,\n\t};\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/compiler/hash.ts","../src/compiler/compile.ts","../src/compiler/validate.ts","../src/compiler/printer.ts"],"sourcesContent":["const FNV_OFFSET = 0x811c9dc5;\nconst FNV_PRIME = 0x01000193;\n\nexport function fnv1a(input: string): number {\n\tlet hash = FNV_OFFSET;\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst code = input.charCodeAt(i);\n\t\t// Handle UTF-16: XOR both bytes for codes > 0xFF\n\t\tif (code > 0xff) {\n\t\t\thash ^= code >> 8;\n\t\t\thash = Math.imul(hash, FNV_PRIME) >>> 0;\n\t\t\thash ^= code & 0xff;\n\t\t} else {\n\t\t\thash ^= code;\n\t\t}\n\t\thash = Math.imul(hash, FNV_PRIME) >>> 0;\n\t}\n\treturn hash;\n}\n\nexport function contentHash(input: string): string {\n\treturn fnv1a(input).toString(16).padStart(8, \"0\");\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { FormulaExpr } from \"../core/formula-expr.js\";\nimport type { FormulaNode } from \"../core/formula-node.js\";\nimport type { NodeId } from \"../core/ids.js\";\nimport { nodeId } from \"../core/ids.js\";\nimport type { NodeProvenance } from \"../core/meta.js\";\nimport { contentHash } from \"./hash.js\";\n\ninterface CompileContext {\n\tnodes: Record<string, FormulaNode>;\n\tprovenance: Record<string, NodeProvenance>;\n}\n\nfunction canonicalKey(node: FormulaNode): string {\n\treturn JSON.stringify(node);\n}\n\nfunction addNode(ctx: CompileContext, node: FormulaNode, expr: FormulaExpr): NodeId {\n\tconst key = canonicalKey(node);\n\tconst id = nodeId(contentHash(key));\n\tif (!Object.hasOwn(ctx.nodes, id)) {\n\t\tctx.nodes[id] = node;\n\t\tif (expr.meta) {\n\t\t\tctx.provenance[id] = {\n\t\t\t\tnodeId: id,\n\t\t\t\torigin: \"user\",\n\t\t\t\tsourceExprKind: expr.kind,\n\t\t\t\tmeta: expr.meta,\n\t\t\t};\n\t\t}\n\t}\n\treturn id;\n}\n\nfunction flattenVariadic(\n\texprs: readonly FormulaExpr[],\n\tkind: \"and\" | \"or\",\n\tctx: CompileContext,\n): NodeId[] {\n\tconst result: NodeId[] = [];\n\tfor (const expr of exprs) {\n\t\tif (expr.kind === kind) {\n\t\t\tresult.push(...flattenVariadic(expr.children, kind, ctx));\n\t\t} else {\n\t\t\tresult.push(compileExpr(expr, ctx));\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction sortNodeIds(ids: NodeId[]): NodeId[] {\n\treturn [...ids].sort((a, b) => a.localeCompare(b));\n}\n\nfunction compileExpr(expr: FormulaExpr, ctx: CompileContext): NodeId {\n\tswitch (expr.kind) {\n\t\tcase \"literal\":\n\t\t\treturn addNode(ctx, { kind: \"literal\", value: expr.value }, expr);\n\n\t\tcase \"predicate\": {\n\t\t\tconst node: FormulaNode = expr.args\n\t\t\t\t? { kind: \"predicate\", predicateId: expr.predicateId, args: expr.args }\n\t\t\t\t: { kind: \"predicate\", predicateId: expr.predicateId };\n\t\t\treturn addNode(ctx, node, expr);\n\t\t}\n\n\t\tcase \"when\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(\n\t\t\t\tctx,\n\t\t\t\t{ kind: \"when\", captureName: expr.captureName, selectorId: expr.selectorId, child },\n\t\t\t\texpr,\n\t\t\t);\n\t\t}\n\n\t\tcase \"capture\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(\n\t\t\t\tctx,\n\t\t\t\t{\n\t\t\t\t\tkind: \"capture\",\n\t\t\t\t\tcaptureName: expr.captureName,\n\t\t\t\t\tselectorId: expr.selectorId,\n\t\t\t\t\tchild,\n\t\t\t\t},\n\t\t\t\texpr,\n\t\t\t);\n\t\t}\n\n\t\tcase \"not\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"not\", child }, expr);\n\t\t}\n\n\t\tcase \"and\": {\n\t\t\tconst children = sortNodeIds(flattenVariadic(expr.children, \"and\", ctx));\n\t\t\treturn addNode(ctx, { kind: \"and\", children }, expr);\n\t\t}\n\n\t\tcase \"or\": {\n\t\t\tconst children = sortNodeIds(flattenVariadic(expr.children, \"or\", ctx));\n\t\t\treturn addNode(ctx, { kind: \"or\", children }, expr);\n\t\t}\n\n\t\tcase \"implies\": {\n\t\t\tconst left = compileExpr(expr.left, ctx);\n\t\t\tconst right = compileExpr(expr.right, ctx);\n\t\t\treturn addNode(ctx, { kind: \"implies\", left, right }, expr);\n\t\t}\n\n\t\tcase \"always\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"always\", child }, expr);\n\t\t}\n\n\t\tcase \"eventually\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"eventually\", child }, expr);\n\t\t}\n\n\t\tcase \"next\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"next\", child }, expr);\n\t\t}\n\n\t\tcase \"weakNext\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"weakNext\", child }, expr);\n\t\t}\n\n\t\tcase \"until\": {\n\t\t\tconst left = compileExpr(expr.left, ctx);\n\t\t\tconst right = compileExpr(expr.right, ctx);\n\t\t\treturn addNode(ctx, { kind: \"until\", left, right }, expr);\n\t\t}\n\n\t\tcase \"release\": {\n\t\t\tconst left = compileExpr(expr.left, ctx);\n\t\t\tconst right = compileExpr(expr.right, ctx);\n\t\t\treturn addNode(ctx, { kind: \"release\", left, right }, expr);\n\t\t}\n\n\t\tcase \"once\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"once\", child }, expr);\n\t\t}\n\n\t\tcase \"historically\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"historically\", child }, expr);\n\t\t}\n\n\t\tcase \"since\": {\n\t\t\tconst left = compileExpr(expr.left, ctx);\n\t\t\tconst right = compileExpr(expr.right, ctx);\n\t\t\treturn addNode(ctx, { kind: \"since\", left, right }, expr);\n\t\t}\n\n\t\tcase \"withinSteps\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"withinSteps\", steps: expr.steps, child }, expr);\n\t\t}\n\n\t\tcase \"withinMs\": {\n\t\t\tconst child = compileExpr(expr.child, ctx);\n\t\t\treturn addNode(ctx, { kind: \"withinMs\", ms: expr.ms, child }, expr);\n\t\t}\n\t}\n}\n\nexport function compile(expr: FormulaExpr): FormulaDocument {\n\tconst ctx: CompileContext = { nodes: {}, provenance: {} };\n\tconst root = compileExpr(expr, ctx);\n\treturn {\n\t\tschemaVersion: 1,\n\t\troot,\n\t\tnodes: ctx.nodes as Record<NodeId, FormulaNode>,\n\t\t...(Object.keys(ctx.provenance).length > 0\n\t\t\t? { provenance: ctx.provenance as Record<NodeId, NodeProvenance> }\n\t\t\t: {}),\n\t};\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { NodeId } from \"../core/ids.js\";\n\nexport interface ValidationError {\n\treadonly nodeId: NodeId;\n\treadonly message: string;\n}\n\nexport function validate(doc: FormulaDocument): ValidationError[] {\n\tconst errors: ValidationError[] = [];\n\n\tfunction walk(nid: NodeId, scopedCaptures: Set<string>): void {\n\t\tconst node = doc.nodes[nid];\n\t\tif (!node) {\n\t\t\terrors.push({ nodeId: nid, message: `Node ${nid} not found in document` });\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (node.kind) {\n\t\t\tcase \"capture\": {\n\t\t\t\tconst name = node.captureName as string;\n\t\t\t\tif (scopedCaptures.has(name)) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tnodeId: nid,\n\t\t\t\t\t\tmessage: `Capture name \"${name}\" shadows an outer capture`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst inner = new Set(scopedCaptures);\n\t\t\t\tinner.add(name);\n\t\t\t\twalk(node.child, inner);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"when\": {\n\t\t\t\tconst name = node.captureName as string;\n\t\t\t\tif (!scopedCaptures.has(name)) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tnodeId: nid,\n\t\t\t\t\t\tmessage: `When references capture \"${name}\" which is not in scope`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\twalk(node.child, scopedCaptures);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"withinSteps\":\n\t\t\t\tif (node.steps <= 0 || !Number.isInteger(node.steps)) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tnodeId: nid,\n\t\t\t\t\t\tmessage: `withinSteps requires a positive integer, got ${node.steps}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\twalk(node.child, scopedCaptures);\n\t\t\t\tbreak;\n\n\t\t\tcase \"withinMs\":\n\t\t\t\tif (!Number.isFinite(node.ms) || node.ms <= 0) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tnodeId: nid,\n\t\t\t\t\t\tmessage: `withinMs requires a positive number, got ${node.ms}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\twalk(node.child, scopedCaptures);\n\t\t\t\tbreak;\n\n\t\t\tcase \"not\":\n\t\t\tcase \"always\":\n\t\t\tcase \"eventually\":\n\t\t\tcase \"next\":\n\t\t\tcase \"weakNext\":\n\t\t\tcase \"once\":\n\t\t\tcase \"historically\":\n\t\t\t\twalk(node.child, scopedCaptures);\n\t\t\t\tbreak;\n\n\t\t\tcase \"and\":\n\t\t\tcase \"or\":\n\t\t\t\tfor (const child of node.children) {\n\t\t\t\t\twalk(child, scopedCaptures);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"implies\":\n\t\t\tcase \"until\":\n\t\t\tcase \"release\":\n\t\t\tcase \"since\":\n\t\t\t\twalk(node.left, scopedCaptures);\n\t\t\t\twalk(node.right, scopedCaptures);\n\t\t\t\tbreak;\n\n\t\t\tcase \"literal\":\n\t\t\tcase \"predicate\":\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\twalk(doc.root, new Set());\n\treturn errors;\n}\n","import type { FormulaDocument } from \"../core/formula-document.js\";\nimport type { FormulaNode } from \"../core/formula-node.js\";\nimport type { NodeId } from \"../core/ids.js\";\n\nfunction needsParens(node: FormulaNode): boolean {\n\tswitch (node.kind) {\n\t\tcase \"and\":\n\t\tcase \"or\":\n\t\tcase \"implies\":\n\t\tcase \"until\":\n\t\tcase \"release\":\n\t\tcase \"since\":\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction printNode(nid: NodeId, doc: FormulaDocument): string {\n\tconst node = doc.nodes[nid];\n\tif (!node) return `<unknown:${nid}>`;\n\n\tfunction child(cid: NodeId): string {\n\t\tconst cnode = doc.nodes[cid];\n\t\tconst s = printNode(cid, doc);\n\t\treturn cnode && needsParens(cnode) ? `(${s})` : s;\n\t}\n\n\tswitch (node.kind) {\n\t\tcase \"literal\":\n\t\t\treturn node.value ? \"true\" : \"false\";\n\t\tcase \"predicate\":\n\t\t\treturn node.args && node.args.length > 0\n\t\t\t\t? `${node.predicateId}(${node.args.map((a) => (a.kind === \"literal\" ? JSON.stringify(a.value) : `$${a.selectorId}`)).join(\", \")})`\n\t\t\t\t: String(node.predicateId);\n\t\tcase \"when\":\n\t\t\treturn `when(${node.captureName}, $${node.selectorId}, ${child(node.child)})`;\n\t\tcase \"capture\":\n\t\t\treturn `capture(${node.captureName}, $${node.selectorId}, ${child(node.child)})`;\n\t\tcase \"not\":\n\t\t\treturn `!${child(node.child)}`;\n\t\tcase \"and\":\n\t\t\treturn node.children.map((c) => child(c)).join(\" & \");\n\t\tcase \"or\":\n\t\t\treturn node.children.map((c) => child(c)).join(\" | \");\n\t\tcase \"implies\":\n\t\t\treturn `${child(node.left)} -> ${child(node.right)}`;\n\t\tcase \"always\":\n\t\t\treturn `G ${child(node.child)}`;\n\t\tcase \"eventually\":\n\t\t\treturn `F ${child(node.child)}`;\n\t\tcase \"next\":\n\t\t\treturn `X ${child(node.child)}`;\n\t\tcase \"weakNext\":\n\t\t\treturn `Xw ${child(node.child)}`;\n\t\tcase \"until\":\n\t\t\treturn `${child(node.left)} U ${child(node.right)}`;\n\t\tcase \"release\":\n\t\t\treturn `${child(node.left)} R ${child(node.right)}`;\n\t\tcase \"once\":\n\t\t\treturn `P ${child(node.child)}`;\n\t\tcase \"historically\":\n\t\t\treturn `H ${child(node.child)}`;\n\t\tcase \"since\":\n\t\t\treturn `${child(node.left)} S ${child(node.right)}`;\n\t\tcase \"withinSteps\":\n\t\t\treturn `within[${node.steps}] ${child(node.child)}`;\n\t\tcase \"withinMs\":\n\t\t\treturn `withinMs[${node.ms}] ${child(node.child)}`;\n\t}\n}\n\nexport function print(doc: FormulaDocument): string {\n\treturn printNode(doc.root, doc);\n}\n"],"mappings":"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","names":[]}
|