@atsumell/trace-weave 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +99 -0
  3. package/README.md +105 -0
  4. package/dist/ai/index.d.ts +32 -0
  5. package/dist/ai/index.js +121 -0
  6. package/dist/ai/index.js.map +1 -0
  7. package/dist/builder/index.d.ts +26 -0
  8. package/dist/builder/index.js +47 -0
  9. package/dist/builder/index.js.map +1 -0
  10. package/dist/chunk-35PKIXFV.js +90 -0
  11. package/dist/chunk-35PKIXFV.js.map +1 -0
  12. package/dist/chunk-AS6LZLUH.js +32 -0
  13. package/dist/chunk-AS6LZLUH.js.map +1 -0
  14. package/dist/chunk-B4SEKVLL.js +29 -0
  15. package/dist/chunk-B4SEKVLL.js.map +1 -0
  16. package/dist/chunk-EICHUHZH.js +689 -0
  17. package/dist/chunk-EICHUHZH.js.map +1 -0
  18. package/dist/chunk-WIW3TVEK.js +324 -0
  19. package/dist/chunk-WIW3TVEK.js.map +1 -0
  20. package/dist/compiler/index.d.ts +19 -0
  21. package/dist/compiler/index.js +24 -0
  22. package/dist/compiler/index.js.map +1 -0
  23. package/dist/core/index.d.ts +5 -0
  24. package/dist/core/index.js +37 -0
  25. package/dist/core/index.js.map +1 -0
  26. package/dist/fast-check/index.d.ts +34 -0
  27. package/dist/fast-check/index.js +64 -0
  28. package/dist/fast-check/index.js.map +1 -0
  29. package/dist/formula-document-ChXznpvJ.d.ts +99 -0
  30. package/dist/formula-expr-DAHklv9S.d.ts +111 -0
  31. package/dist/monitor/index.d.ts +23 -0
  32. package/dist/monitor/index.js +251 -0
  33. package/dist/monitor/index.js.map +1 -0
  34. package/dist/patterns/index.d.ts +61 -0
  35. package/dist/patterns/index.js +57 -0
  36. package/dist/patterns/index.js.map +1 -0
  37. package/dist/prepare-CrKEArDt.d.ts +8 -0
  38. package/dist/runtime-Do1rQFhQ.d.ts +9 -0
  39. package/dist/types-xatgZlwH.d.ts +35 -0
  40. package/dist/values-CEF1lKTL.d.ts +48 -0
  41. package/dist/verdict-DYG0WE3o.d.ts +7 -0
  42. package/dist/vitest/index.d.ts +24 -0
  43. package/dist/vitest/index.js +40 -0
  44. package/dist/vitest/index.js.map +1 -0
  45. package/package.json +95 -0
@@ -0,0 +1,64 @@
1
+ import {
2
+ runOracle
3
+ } from "../chunk-EICHUHZH.js";
4
+ import "../chunk-AS6LZLUH.js";
5
+ import "../chunk-WIW3TVEK.js";
6
+ import "../chunk-B4SEKVLL.js";
7
+
8
+ // src/fast-check/trace-arbitrary.ts
9
+ import * as fc from "fast-check";
10
+ function traceArbitrary(config) {
11
+ return fc.array(config.eventArbitrary, {
12
+ minLength: config.minLength ?? 1,
13
+ maxLength: config.maxLength ?? 50
14
+ });
15
+ }
16
+
17
+ // src/fast-check/command-adapter.ts
18
+ import * as fc2 from "fast-check";
19
+ function commandAdapter(config) {
20
+ return fc2.commands(config.commands).map((cmds) => {
21
+ const events = [];
22
+ const model = config.initialModel();
23
+ const real = config.initialReal();
24
+ for (const cmd of cmds) {
25
+ if (cmd.check(model)) {
26
+ const modelBefore = JSON.parse(JSON.stringify(model));
27
+ cmd.run(model, real);
28
+ const modelAfter = JSON.parse(JSON.stringify(model));
29
+ events.push({
30
+ type: cmd.toString(),
31
+ modelBefore,
32
+ modelAfter
33
+ });
34
+ }
35
+ }
36
+ return events;
37
+ });
38
+ }
39
+
40
+ // src/fast-check/properties.ts
41
+ import * as fc3 from "fast-check";
42
+ function traceProperty(config) {
43
+ return fc3.property(config.traceArbitrary, (trace) => {
44
+ const result = runOracle(config.formula, config.runtime, trace);
45
+ if (result.verdict === "violated") {
46
+ const msg = result.report?.summary ?? "Formula violated";
47
+ throw new Error(msg);
48
+ }
49
+ });
50
+ }
51
+ function commandProperty(formula, runtime, commandArbitrary) {
52
+ return traceProperty({
53
+ formula,
54
+ runtime,
55
+ traceArbitrary: commandArbitrary
56
+ });
57
+ }
58
+ export {
59
+ commandAdapter,
60
+ commandProperty,
61
+ traceArbitrary,
62
+ traceProperty
63
+ };
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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?.summary ?? \"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;AAWb,SAAS,cACf,QACoC;AACpC,SAAU,aAAS,OAAO,gBAAgB,CAAC,UAAU;AACpD,UAAM,SAAS,UAAU,OAAO,SAAS,OAAO,SAAS,KAAK;AAC9D,QAAI,OAAO,YAAY,YAAY;AAClC,YAAM,MAAM,OAAO,QAAQ,WAAW;AACtC,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"]}
@@ -0,0 +1,99 @@
1
+ import { N as NodeId, C as CaptureName, S as SelectorId, P as PredicateId, V as ValueExprArg, a as NodeProvenance } from './values-CEF1lKTL.js';
2
+
3
+ interface LiteralNode {
4
+ readonly kind: "literal";
5
+ readonly value: boolean;
6
+ }
7
+ interface PredicateNode {
8
+ readonly kind: "predicate";
9
+ readonly predicateId: PredicateId;
10
+ readonly args?: readonly ValueExprArg[];
11
+ }
12
+ interface WhenNode {
13
+ readonly kind: "when";
14
+ readonly captureName: CaptureName;
15
+ readonly selectorId: SelectorId;
16
+ readonly child: NodeId;
17
+ }
18
+ interface CaptureNode {
19
+ readonly kind: "capture";
20
+ readonly captureName: CaptureName;
21
+ readonly selectorId: SelectorId;
22
+ readonly child: NodeId;
23
+ }
24
+ interface NotNode {
25
+ readonly kind: "not";
26
+ readonly child: NodeId;
27
+ }
28
+ interface AndNode {
29
+ readonly kind: "and";
30
+ readonly children: readonly NodeId[];
31
+ }
32
+ interface OrNode {
33
+ readonly kind: "or";
34
+ readonly children: readonly NodeId[];
35
+ }
36
+ interface ImpliesNode {
37
+ readonly kind: "implies";
38
+ readonly left: NodeId;
39
+ readonly right: NodeId;
40
+ }
41
+ interface AlwaysNode {
42
+ readonly kind: "always";
43
+ readonly child: NodeId;
44
+ }
45
+ interface EventuallyNode {
46
+ readonly kind: "eventually";
47
+ readonly child: NodeId;
48
+ }
49
+ interface NextNode {
50
+ readonly kind: "next";
51
+ readonly child: NodeId;
52
+ }
53
+ interface WeakNextNode {
54
+ readonly kind: "weakNext";
55
+ readonly child: NodeId;
56
+ }
57
+ interface UntilNode {
58
+ readonly kind: "until";
59
+ readonly left: NodeId;
60
+ readonly right: NodeId;
61
+ }
62
+ interface ReleaseNode {
63
+ readonly kind: "release";
64
+ readonly left: NodeId;
65
+ readonly right: NodeId;
66
+ }
67
+ interface OnceNode {
68
+ readonly kind: "once";
69
+ readonly child: NodeId;
70
+ }
71
+ interface HistoricallyNode {
72
+ readonly kind: "historically";
73
+ readonly child: NodeId;
74
+ }
75
+ interface SinceNode {
76
+ readonly kind: "since";
77
+ readonly left: NodeId;
78
+ readonly right: NodeId;
79
+ }
80
+ interface WithinStepsNode {
81
+ readonly kind: "withinSteps";
82
+ readonly steps: number;
83
+ readonly child: NodeId;
84
+ }
85
+ interface WithinMsNode {
86
+ readonly kind: "withinMs";
87
+ readonly ms: number;
88
+ readonly child: NodeId;
89
+ }
90
+ type FormulaNode = LiteralNode | PredicateNode | WhenNode | CaptureNode | NotNode | AndNode | OrNode | ImpliesNode | AlwaysNode | EventuallyNode | NextNode | WeakNextNode | UntilNode | ReleaseNode | OnceNode | HistoricallyNode | SinceNode | WithinStepsNode | WithinMsNode;
91
+
92
+ interface FormulaDocument {
93
+ readonly schemaVersion: 1;
94
+ readonly root: NodeId;
95
+ readonly nodes: Readonly<Record<NodeId, FormulaNode>>;
96
+ readonly provenance?: Readonly<Record<NodeId, NodeProvenance>>;
97
+ }
98
+
99
+ export type { AlwaysNode as A, CaptureNode as C, EventuallyNode as E, FormulaDocument as F, HistoricallyNode as H, ImpliesNode as I, LiteralNode as L, NextNode as N, OnceNode as O, PredicateNode as P, ReleaseNode as R, SinceNode as S, UntilNode as U, WeakNextNode as W, AndNode as a, FormulaNode as b, NotNode as c, OrNode as d, WhenNode as e, WithinMsNode as f, WithinStepsNode as g };
@@ -0,0 +1,111 @@
1
+ import { F as FormulaMeta, P as PredicateId, V as ValueExprArg, C as CaptureName, S as SelectorId } from './values-CEF1lKTL.js';
2
+
3
+ interface LiteralExpr {
4
+ readonly kind: "literal";
5
+ readonly value: boolean;
6
+ readonly meta?: FormulaMeta;
7
+ }
8
+ interface PredicateExpr {
9
+ readonly kind: "predicate";
10
+ readonly predicateId: PredicateId;
11
+ readonly args?: readonly ValueExprArg[];
12
+ readonly meta?: FormulaMeta;
13
+ }
14
+ interface WhenExpr {
15
+ readonly kind: "when";
16
+ readonly captureName: CaptureName;
17
+ readonly selectorId: SelectorId;
18
+ readonly child: FormulaExpr;
19
+ readonly meta?: FormulaMeta;
20
+ }
21
+ interface CaptureExpr {
22
+ readonly kind: "capture";
23
+ readonly captureName: CaptureName;
24
+ readonly selectorId: SelectorId;
25
+ readonly child: FormulaExpr;
26
+ readonly meta?: FormulaMeta;
27
+ }
28
+ interface NotExpr {
29
+ readonly kind: "not";
30
+ readonly child: FormulaExpr;
31
+ readonly meta?: FormulaMeta;
32
+ }
33
+ interface AndExpr {
34
+ readonly kind: "and";
35
+ readonly children: readonly FormulaExpr[];
36
+ readonly meta?: FormulaMeta;
37
+ }
38
+ interface OrExpr {
39
+ readonly kind: "or";
40
+ readonly children: readonly FormulaExpr[];
41
+ readonly meta?: FormulaMeta;
42
+ }
43
+ interface ImpliesExpr {
44
+ readonly kind: "implies";
45
+ readonly left: FormulaExpr;
46
+ readonly right: FormulaExpr;
47
+ readonly meta?: FormulaMeta;
48
+ }
49
+ interface AlwaysExpr {
50
+ readonly kind: "always";
51
+ readonly child: FormulaExpr;
52
+ readonly meta?: FormulaMeta;
53
+ }
54
+ interface EventuallyExpr {
55
+ readonly kind: "eventually";
56
+ readonly child: FormulaExpr;
57
+ readonly meta?: FormulaMeta;
58
+ }
59
+ interface NextExpr {
60
+ readonly kind: "next";
61
+ readonly child: FormulaExpr;
62
+ readonly meta?: FormulaMeta;
63
+ }
64
+ interface WeakNextExpr {
65
+ readonly kind: "weakNext";
66
+ readonly child: FormulaExpr;
67
+ readonly meta?: FormulaMeta;
68
+ }
69
+ interface UntilExpr {
70
+ readonly kind: "until";
71
+ readonly left: FormulaExpr;
72
+ readonly right: FormulaExpr;
73
+ readonly meta?: FormulaMeta;
74
+ }
75
+ interface ReleaseExpr {
76
+ readonly kind: "release";
77
+ readonly left: FormulaExpr;
78
+ readonly right: FormulaExpr;
79
+ readonly meta?: FormulaMeta;
80
+ }
81
+ interface OnceExpr {
82
+ readonly kind: "once";
83
+ readonly child: FormulaExpr;
84
+ readonly meta?: FormulaMeta;
85
+ }
86
+ interface HistoricallyExpr {
87
+ readonly kind: "historically";
88
+ readonly child: FormulaExpr;
89
+ readonly meta?: FormulaMeta;
90
+ }
91
+ interface SinceExpr {
92
+ readonly kind: "since";
93
+ readonly left: FormulaExpr;
94
+ readonly right: FormulaExpr;
95
+ readonly meta?: FormulaMeta;
96
+ }
97
+ interface WithinStepsExpr {
98
+ readonly kind: "withinSteps";
99
+ readonly steps: number;
100
+ readonly child: FormulaExpr;
101
+ readonly meta?: FormulaMeta;
102
+ }
103
+ interface WithinMsExpr {
104
+ readonly kind: "withinMs";
105
+ readonly ms: number;
106
+ readonly child: FormulaExpr;
107
+ readonly meta?: FormulaMeta;
108
+ }
109
+ type FormulaExpr = LiteralExpr | PredicateExpr | WhenExpr | CaptureExpr | NotExpr | AndExpr | OrExpr | ImpliesExpr | AlwaysExpr | EventuallyExpr | NextExpr | WeakNextExpr | UntilExpr | ReleaseExpr | OnceExpr | HistoricallyExpr | SinceExpr | WithinStepsExpr | WithinMsExpr;
110
+
111
+ export type { AlwaysExpr as A, CaptureExpr as C, EventuallyExpr as E, FormulaExpr as F, HistoricallyExpr as H, ImpliesExpr as I, LiteralExpr as L, NextExpr as N, OnceExpr as O, PredicateExpr as P, ReleaseExpr as R, SinceExpr as S, UntilExpr as U, WeakNextExpr as W, AndExpr as a, NotExpr as b, OrExpr as c, WhenExpr as d, WithinMsExpr as e, WithinStepsExpr as f };
@@ -0,0 +1,23 @@
1
+ import { M as MonitorState, O as OracleRunResult, C as CounterexampleReport } from '../types-xatgZlwH.js';
2
+ export { a as ObligationSnapshot } from '../types-xatgZlwH.js';
3
+ import { C as CompiledFormula } from '../prepare-CrKEArDt.js';
4
+ import { M as MonitorRuntime } from '../runtime-Do1rQFhQ.js';
5
+ import { V as Verdict } from '../verdict-DYG0WE3o.js';
6
+ import { F as FormulaDocument } from '../formula-document-ChXznpvJ.js';
7
+ import { F as FormulaExpr } from '../formula-expr-DAHklv9S.js';
8
+ import '../values-CEF1lKTL.js';
9
+
10
+ declare function createMonitor<TEvent>(compiled: CompiledFormula, runtime: MonitorRuntime<TEvent>): MonitorState<TEvent>;
11
+
12
+ declare function evaluateStep<TEvent>(state: MonitorState<TEvent>, event: TEvent): Verdict;
13
+
14
+ declare function finalize<TEvent>(state: MonitorState<TEvent>, lastEvent: TEvent): Verdict;
15
+ declare function finalizeEmpty<TEvent>(state: MonitorState<TEvent>): Verdict;
16
+
17
+ declare function evaluateFormula<TEvent>(doc: FormulaDocument, runtime: MonitorRuntime<TEvent>, trace: readonly TEvent[]): Verdict;
18
+
19
+ declare function runOracle<TEvent>(formula: FormulaExpr, runtime: MonitorRuntime<TEvent>, trace: readonly TEvent[]): OracleRunResult;
20
+
21
+ declare function buildReport<TEvent>(state: MonitorState<TEvent>, trace: readonly TEvent[]): CounterexampleReport | null;
22
+
23
+ export { CounterexampleReport, MonitorState, OracleRunResult, buildReport, createMonitor, evaluateFormula, evaluateStep, finalize, finalizeEmpty, runOracle };
@@ -0,0 +1,251 @@
1
+ import {
2
+ assertTimeSupportForTrace,
3
+ assertWithinMsRuntimeSupport,
4
+ buildCounterexampleReport,
5
+ cacheKey,
6
+ evaluateFormula,
7
+ getTimestamp,
8
+ jsonEqual,
9
+ resolveArg,
10
+ runOracle
11
+ } from "../chunk-EICHUHZH.js";
12
+ import {
13
+ andV,
14
+ impliesV,
15
+ notV,
16
+ orV
17
+ } from "../chunk-AS6LZLUH.js";
18
+ import {
19
+ print
20
+ } from "../chunk-WIW3TVEK.js";
21
+ import "../chunk-B4SEKVLL.js";
22
+
23
+ // src/monitor/create.ts
24
+ function createMonitor(compiled, runtime) {
25
+ assertWithinMsRuntimeSupport(compiled.document, runtime);
26
+ const state = {
27
+ compiled,
28
+ runtime,
29
+ step: 0,
30
+ trace: [],
31
+ currentVerdict: "pending",
32
+ finalized: false,
33
+ finalVerdict: null,
34
+ finalReport: null
35
+ };
36
+ return state;
37
+ }
38
+
39
+ // src/monitor/evaluate-prefix.ts
40
+ function evalNode(ctx, nodeId, pos) {
41
+ const ck = cacheKey(nodeId, pos, ctx.envStack);
42
+ const cached = ctx.cache.get(ck);
43
+ if (cached !== void 0) return cached;
44
+ const node = ctx.doc.nodes[nodeId];
45
+ if (!node) return "violated";
46
+ ctx.cache.set(ck, "pending");
47
+ const result = evalNodeInner(ctx, node, pos);
48
+ ctx.cache.set(ck, result);
49
+ return result;
50
+ }
51
+ function evalNodeInner(ctx, node, pos) {
52
+ const len = ctx.trace.length;
53
+ switch (node.kind) {
54
+ case "literal":
55
+ return node.value ? "satisfied" : "violated";
56
+ case "predicate": {
57
+ if (pos >= len) return "pending";
58
+ const event = ctx.trace[pos];
59
+ const predicateFn = ctx.runtime.predicates[node.predicateId];
60
+ if (!predicateFn) return "violated";
61
+ const args = (node.args ?? []).map((arg) => resolveArg(arg, event, ctx.runtime));
62
+ return predicateFn(event, args) ? "satisfied" : "violated";
63
+ }
64
+ case "when": {
65
+ if (pos >= len) return "pending";
66
+ const event = ctx.trace[pos];
67
+ const captured = ctx.envStack.get(node.captureName);
68
+ if (captured === void 0) return "violated";
69
+ const selectorFn = ctx.runtime.selectors[node.selectorId];
70
+ if (!selectorFn) return "violated";
71
+ const currentVal = selectorFn(event);
72
+ if (!jsonEqual(captured, currentVal)) return "violated";
73
+ return evalNode(ctx, node.child, pos);
74
+ }
75
+ case "capture": {
76
+ if (pos >= len) return "pending";
77
+ const event = ctx.trace[pos];
78
+ const selectorFn = ctx.runtime.selectors[node.selectorId];
79
+ if (!selectorFn) return "violated";
80
+ const value = selectorFn(event);
81
+ const newEnv = new Map(ctx.envStack);
82
+ newEnv.set(node.captureName, value);
83
+ return evalNode({ ...ctx, envStack: newEnv }, node.child, pos);
84
+ }
85
+ case "not":
86
+ return notV(evalNode(ctx, node.child, pos));
87
+ case "and":
88
+ return node.children.reduce(
89
+ (result, childId) => andV(result, evalNode(ctx, childId, pos)),
90
+ "satisfied"
91
+ );
92
+ case "or":
93
+ return node.children.reduce(
94
+ (result, childId) => orV(result, evalNode(ctx, childId, pos)),
95
+ "violated"
96
+ );
97
+ case "implies":
98
+ return impliesV(evalNode(ctx, node.left, pos), evalNode(ctx, node.right, pos));
99
+ case "always":
100
+ if (pos >= len) return "pending";
101
+ return andV(evalNode(ctx, node.child, pos), evalNodeInner(ctx, node, pos + 1));
102
+ case "eventually":
103
+ if (pos >= len) return "pending";
104
+ return orV(evalNode(ctx, node.child, pos), evalNodeInner(ctx, node, pos + 1));
105
+ case "next":
106
+ if (pos + 1 >= len) return "pending";
107
+ return evalNode(ctx, node.child, pos + 1);
108
+ case "weakNext":
109
+ if (pos + 1 >= len) return "pending";
110
+ return evalNode(ctx, node.child, pos + 1);
111
+ case "until":
112
+ if (pos >= len) return "pending";
113
+ return orV(
114
+ evalNode(ctx, node.right, pos),
115
+ andV(evalNode(ctx, node.left, pos), evalNodeInner(ctx, node, pos + 1))
116
+ );
117
+ case "release":
118
+ if (pos >= len) return "pending";
119
+ return andV(
120
+ evalNode(ctx, node.right, pos),
121
+ orV(evalNode(ctx, node.left, pos), evalNodeInner(ctx, node, pos + 1))
122
+ );
123
+ case "once":
124
+ if (pos < 0) return "violated";
125
+ return orV(evalNode(ctx, node.child, pos), evalNodeInner(ctx, node, pos - 1));
126
+ case "historically":
127
+ if (pos < 0) return "satisfied";
128
+ return andV(evalNode(ctx, node.child, pos), evalNodeInner(ctx, node, pos - 1));
129
+ case "since":
130
+ if (pos < 0) return "violated";
131
+ return orV(
132
+ evalNode(ctx, node.right, pos),
133
+ andV(evalNode(ctx, node.left, pos), evalNodeInner(ctx, node, pos - 1))
134
+ );
135
+ case "withinSteps": {
136
+ if (pos >= len) return "pending";
137
+ const bound = pos + node.steps;
138
+ let sawPending = false;
139
+ for (let i = pos; i < Math.min(bound, len); i++) {
140
+ const verdict = evalNode(ctx, node.child, i);
141
+ if (verdict === "satisfied") return "satisfied";
142
+ if (verdict === "pending") sawPending = true;
143
+ }
144
+ if (sawPending) return "pending";
145
+ return len >= bound ? "violated" : "pending";
146
+ }
147
+ case "withinMs": {
148
+ if (pos >= len) return "pending";
149
+ const startTs = getTimestamp(ctx.runtime, ctx.trace[pos]);
150
+ let sawPending = false;
151
+ let sawPastDeadline = false;
152
+ for (let i = pos; i < len; i++) {
153
+ const currentTs = getTimestamp(ctx.runtime, ctx.trace[i]);
154
+ if (currentTs - startTs > node.ms) {
155
+ sawPastDeadline = true;
156
+ break;
157
+ }
158
+ const verdict = evalNode(ctx, node.child, i);
159
+ if (verdict === "satisfied") return "satisfied";
160
+ if (verdict === "pending") sawPending = true;
161
+ }
162
+ if (sawPending) return "pending";
163
+ return sawPastDeadline ? "violated" : "pending";
164
+ }
165
+ }
166
+ }
167
+ function evaluateObservedPrefix(doc, runtime, trace) {
168
+ assertTimeSupportForTrace(doc, runtime, trace);
169
+ const ctx = {
170
+ doc,
171
+ runtime,
172
+ trace,
173
+ envStack: /* @__PURE__ */ new Map(),
174
+ cache: /* @__PURE__ */ new Map()
175
+ };
176
+ return evalNode(ctx, doc.root, 0);
177
+ }
178
+
179
+ // src/monitor/evaluate-step.ts
180
+ function evaluateStep(state, event) {
181
+ if (state.finalized) {
182
+ throw new Error("Cannot evaluate step on a finalized monitor");
183
+ }
184
+ state.trace.push(event);
185
+ state.step++;
186
+ state.currentVerdict = evaluateObservedPrefix(
187
+ state.compiled.document,
188
+ state.runtime,
189
+ state.trace
190
+ );
191
+ return state.currentVerdict;
192
+ }
193
+
194
+ // src/monitor/finalize.ts
195
+ function finalize(state, lastEvent) {
196
+ if (state.finalized) {
197
+ return getFinalizedVerdict(state);
198
+ }
199
+ if (state.trace.length === 0) {
200
+ state.trace.push(lastEvent);
201
+ }
202
+ return finalizeObservedTrace(state);
203
+ }
204
+ function finalizeEmpty(state) {
205
+ if (state.finalized) {
206
+ return getFinalizedVerdict(state);
207
+ }
208
+ if (state.trace.length > 0) {
209
+ throw new Error("Cannot finalize a non-empty monitor with finalizeEmpty(); use finalize()");
210
+ }
211
+ return finalizeObservedTrace(state);
212
+ }
213
+ function getFinalizedVerdict(state) {
214
+ const internalState = state;
215
+ return internalState.finalVerdict ?? state.currentVerdict;
216
+ }
217
+ function finalizeObservedTrace(state) {
218
+ const internalState = state;
219
+ state.finalized = true;
220
+ const verdict = evaluateFormula(state.compiled.document, state.runtime, state.trace);
221
+ state.currentVerdict = verdict;
222
+ internalState.finalVerdict = verdict;
223
+ internalState.finalReport = verdict === "violated" ? buildCounterexampleReport(state.compiled.document, state.runtime, state.trace) ?? {
224
+ verdict: "violated",
225
+ failurePath: [],
226
+ traceSlice: state.trace.map((event, i) => ({ step: i + 1, event })),
227
+ summary: `Formula violated: ${print(state.compiled.document)}`
228
+ } : null;
229
+ return verdict;
230
+ }
231
+
232
+ // src/monitor/report.ts
233
+ function buildReport(state, trace) {
234
+ if (state.finalized) {
235
+ return state.finalReport;
236
+ }
237
+ if (state.currentVerdict !== "violated") {
238
+ return null;
239
+ }
240
+ return buildCounterexampleReport(state.compiled.document, state.runtime, trace);
241
+ }
242
+ export {
243
+ buildReport,
244
+ createMonitor,
245
+ evaluateFormula,
246
+ evaluateStep,
247
+ finalize,
248
+ finalizeEmpty,
249
+ runOracle
250
+ };
251
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/monitor/create.ts","../../src/monitor/evaluate-prefix.ts","../../src/monitor/evaluate-step.ts","../../src/monitor/finalize.ts","../../src/monitor/report.ts"],"sourcesContent":["import type { CompiledFormula } from \"../compiler/prepare.js\";\nimport type { MonitorRuntime } from \"../core/runtime.js\";\nimport type { InternalMonitorState, MonitorState } from \"./types.js\";\nimport { assertWithinMsRuntimeSupport } from \"./unsupported.js\";\n\nexport function createMonitor<TEvent>(\n\tcompiled: CompiledFormula,\n\truntime: MonitorRuntime<TEvent>,\n): MonitorState<TEvent> {\n\tassertWithinMsRuntimeSupport(compiled.document, runtime);\n\n\tconst state: InternalMonitorState<TEvent> = {\n\t\tcompiled,\n\t\truntime,\n\t\tstep: 0,\n\t\ttrace: [],\n\t\tcurrentVerdict: \"pending\",\n\t\tfinalized: false,\n\t\tfinalVerdict: null,\n\t\tfinalReport: null,\n\t};\n\n\treturn state;\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 { JsonValue } from \"../core/values.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\ninterface EvalContext<TEvent> {\n\treadonly doc: FormulaDocument;\n\treadonly runtime: MonitorRuntime<TEvent>;\n\treadonly trace: readonly TEvent[];\n\treadonly envStack: EvalEnv;\n\treadonly cache: Map<string, Verdict>;\n}\n\nfunction evalNode<TEvent>(ctx: EvalContext<TEvent>, nodeId: NodeId, pos: number): Verdict {\n\tconst ck = cacheKey(nodeId, pos, ctx.envStack);\n\tconst cached = ctx.cache.get(ck);\n\tif (cached !== undefined) return cached;\n\n\tconst node = ctx.doc.nodes[nodeId];\n\tif (!node) return \"violated\";\n\n\tctx.cache.set(ck, \"pending\");\n\tconst result = evalNodeInner(ctx, node, pos);\n\tctx.cache.set(ck, result);\n\treturn result;\n}\n\nfunction evalNodeInner<TEvent>(ctx: EvalContext<TEvent>, node: FormulaNode, pos: number): 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) return \"pending\";\n\t\t\tconst event = ctx.trace[pos]!;\n\t\t\tconst predicateFn = ctx.runtime.predicates[node.predicateId];\n\t\t\tif (!predicateFn) return \"violated\";\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) return \"pending\";\n\t\t\tconst event = ctx.trace[pos]!;\n\t\t\tconst captured = ctx.envStack.get(node.captureName as string);\n\t\t\tif (captured === undefined) return \"violated\";\n\t\t\tconst selectorFn = ctx.runtime.selectors[node.selectorId];\n\t\t\tif (!selectorFn) return \"violated\";\n\t\t\tconst currentVal = selectorFn(event);\n\t\t\tif (!jsonEqual(captured, currentVal)) return \"violated\";\n\t\t\treturn evalNode(ctx, node.child, pos);\n\t\t}\n\n\t\tcase \"capture\": {\n\t\t\tif (pos >= len) return \"pending\";\n\t\t\tconst event = ctx.trace[pos]!;\n\t\t\tconst selectorFn = ctx.runtime.selectors[node.selectorId];\n\t\t\tif (!selectorFn) return \"violated\";\n\t\t\tconst value = selectorFn(event);\n\t\t\tconst newEnv = new Map(ctx.envStack);\n\t\t\tnewEnv.set(node.captureName as string, value);\n\t\t\treturn evalNode({ ...ctx, envStack: newEnv }, node.child, pos);\n\t\t}\n\n\t\tcase \"not\":\n\t\t\treturn notV(evalNode(ctx, node.child, pos));\n\n\t\tcase \"and\":\n\t\t\treturn node.children.reduce<Verdict>(\n\t\t\t\t(result, childId) => andV(result, evalNode(ctx, childId, pos)),\n\t\t\t\t\"satisfied\",\n\t\t\t);\n\n\t\tcase \"or\":\n\t\t\treturn node.children.reduce<Verdict>(\n\t\t\t\t(result, childId) => orV(result, evalNode(ctx, childId, pos)),\n\t\t\t\t\"violated\",\n\t\t\t);\n\n\t\tcase \"implies\":\n\t\t\treturn impliesV(evalNode(ctx, node.left, pos), evalNode(ctx, node.right, pos));\n\n\t\tcase \"always\":\n\t\t\tif (pos >= len) return \"pending\";\n\t\t\treturn andV(evalNode(ctx, node.child, pos), evalNodeInner(ctx, node, pos + 1));\n\n\t\tcase \"eventually\":\n\t\t\tif (pos >= len) return \"pending\";\n\t\t\treturn orV(evalNode(ctx, node.child, pos), evalNodeInner(ctx, node, pos + 1));\n\n\t\tcase \"next\":\n\t\t\tif (pos + 1 >= len) return \"pending\";\n\t\t\treturn evalNode(ctx, node.child, pos + 1);\n\n\t\tcase \"weakNext\":\n\t\t\tif (pos + 1 >= len) return \"pending\";\n\t\t\treturn evalNode(ctx, node.child, pos + 1);\n\n\t\tcase \"until\":\n\t\t\tif (pos >= len) return \"pending\";\n\t\t\treturn orV(\n\t\t\t\tevalNode(ctx, node.right, pos),\n\t\t\t\tandV(evalNode(ctx, node.left, pos), evalNodeInner(ctx, node, pos + 1)),\n\t\t\t);\n\n\t\tcase \"release\":\n\t\t\tif (pos >= len) return \"pending\";\n\t\t\treturn andV(\n\t\t\t\tevalNode(ctx, node.right, pos),\n\t\t\t\torV(evalNode(ctx, node.left, pos), evalNodeInner(ctx, node, pos + 1)),\n\t\t\t);\n\n\t\tcase \"once\":\n\t\t\tif (pos < 0) return \"violated\";\n\t\t\treturn orV(evalNode(ctx, node.child, pos), evalNodeInner(ctx, node, pos - 1));\n\n\t\tcase \"historically\":\n\t\t\tif (pos < 0) return \"satisfied\";\n\t\t\treturn andV(evalNode(ctx, node.child, pos), evalNodeInner(ctx, node, pos - 1));\n\n\t\tcase \"since\":\n\t\t\tif (pos < 0) return \"violated\";\n\t\t\treturn orV(\n\t\t\t\tevalNode(ctx, node.right, pos),\n\t\t\t\tandV(evalNode(ctx, node.left, pos), evalNodeInner(ctx, node, pos - 1)),\n\t\t\t);\n\n\t\tcase \"withinSteps\": {\n\t\t\tif (pos >= len) return \"pending\";\n\t\t\tconst bound = pos + node.steps;\n\t\t\tlet sawPending = false;\n\t\t\tfor (let i = pos; i < Math.min(bound, len); i++) {\n\t\t\t\tconst verdict = evalNode(ctx, node.child, i);\n\t\t\t\tif (verdict === \"satisfied\") return \"satisfied\";\n\t\t\t\tif (verdict === \"pending\") sawPending = true;\n\t\t\t}\n\t\t\tif (sawPending) return \"pending\";\n\t\t\treturn len >= bound ? \"violated\" : \"pending\";\n\t\t}\n\n\t\tcase \"withinMs\": {\n\t\t\tif (pos >= len) return \"pending\";\n\t\t\tconst startTs = getTimestamp(ctx.runtime, ctx.trace[pos]!);\n\t\t\tlet sawPending = false;\n\t\t\tlet sawPastDeadline = false;\n\t\t\tfor (let i = pos; i < len; 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\tsawPastDeadline = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst verdict = evalNode(ctx, node.child, i);\n\t\t\t\tif (verdict === \"satisfied\") return \"satisfied\";\n\t\t\t\tif (verdict === \"pending\") sawPending = true;\n\t\t\t}\n\t\t\tif (sawPending) return \"pending\";\n\t\t\treturn sawPastDeadline ? \"violated\" : \"pending\";\n\t\t}\n\t}\n}\n\nexport function evaluateObservedPrefix<TEvent>(\n\tdoc: FormulaDocument,\n\truntime: MonitorRuntime<TEvent>,\n\ttrace: readonly TEvent[],\n): Verdict {\n\tassertTimeSupportForTrace(doc, runtime, trace);\n\tconst ctx: EvalContext<TEvent> = {\n\t\tdoc,\n\t\truntime,\n\t\ttrace,\n\t\tenvStack: new Map(),\n\t\tcache: new Map(),\n\t};\n\treturn evalNode(ctx, doc.root, 0);\n}\n","import type { Verdict } from \"../core/verdict.js\";\nimport { evaluateObservedPrefix } from \"./evaluate-prefix.js\";\nimport type { MonitorState } from \"./types.js\";\n\nexport function evaluateStep<TEvent>(state: MonitorState<TEvent>, event: TEvent): Verdict {\n\tif (state.finalized) {\n\t\tthrow new Error(\"Cannot evaluate step on a finalized monitor\");\n\t}\n\n\tstate.trace.push(event);\n\tstate.step++;\n\n\tstate.currentVerdict = evaluateObservedPrefix(\n\t\tstate.compiled.document,\n\t\tstate.runtime,\n\t\tstate.trace,\n\t);\n\treturn state.currentVerdict;\n}\n","import { print } from \"../compiler/printer.js\";\nimport type { Verdict } from \"../core/verdict.js\";\nimport { buildCounterexampleReport } from \"./diagnostics.js\";\nimport { evaluateFormula } from \"./evaluate.js\";\nimport type { InternalMonitorState, MonitorState } from \"./types.js\";\n\nexport function finalize<TEvent>(state: MonitorState<TEvent>, lastEvent: TEvent): Verdict {\n\tif (state.finalized) {\n\t\treturn getFinalizedVerdict(state);\n\t}\n\n\tif (state.trace.length === 0) {\n\t\tstate.trace.push(lastEvent);\n\t}\n\n\treturn finalizeObservedTrace(state);\n}\n\nexport function finalizeEmpty<TEvent>(state: MonitorState<TEvent>): Verdict {\n\tif (state.finalized) {\n\t\treturn getFinalizedVerdict(state);\n\t}\n\n\tif (state.trace.length > 0) {\n\t\tthrow new Error(\"Cannot finalize a non-empty monitor with finalizeEmpty(); use finalize()\");\n\t}\n\n\treturn finalizeObservedTrace(state);\n}\n\nfunction getFinalizedVerdict<TEvent>(state: MonitorState<TEvent>): Verdict {\n\tconst internalState = state as InternalMonitorState<TEvent>;\n\treturn internalState.finalVerdict ?? state.currentVerdict;\n}\n\nfunction finalizeObservedTrace<TEvent>(state: MonitorState<TEvent>): Verdict {\n\tconst internalState = state as InternalMonitorState<TEvent>;\n\tstate.finalized = true;\n\n\tconst verdict = evaluateFormula(state.compiled.document, state.runtime, state.trace);\n\tstate.currentVerdict = verdict;\n\tinternalState.finalVerdict = verdict;\n\tinternalState.finalReport =\n\t\tverdict === \"violated\"\n\t\t\t? (buildCounterexampleReport(state.compiled.document, state.runtime, state.trace) ?? {\n\t\t\t\t\tverdict: \"violated\",\n\t\t\t\t\tfailurePath: [],\n\t\t\t\t\ttraceSlice: state.trace.map((event, i) => ({ step: i + 1, event })),\n\t\t\t\t\tsummary: `Formula violated: ${print(state.compiled.document)}`,\n\t\t\t\t})\n\t\t\t: null;\n\n\treturn verdict;\n}\n","import { buildCounterexampleReport } from \"./diagnostics.js\";\nimport type { CounterexampleReport, InternalMonitorState, MonitorState } from \"./types.js\";\n\nexport function buildReport<TEvent>(\n\tstate: MonitorState<TEvent>,\n\ttrace: readonly TEvent[],\n): CounterexampleReport | null {\n\tif (state.finalized) {\n\t\treturn (state as InternalMonitorState<TEvent>).finalReport;\n\t}\n\n\tif (state.currentVerdict !== \"violated\") {\n\t\treturn null;\n\t}\n\n\treturn buildCounterexampleReport(state.compiled.document, state.runtime, trace);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,61 @@
1
+ import { F as FormulaExpr } from '../formula-expr-DAHklv9S.js';
2
+ import '../values-CEF1lKTL.js';
3
+
4
+ /**
5
+ * Absence: p never holds globally.
6
+ * LTLf: G(!p)
7
+ */
8
+ declare function absence(p: FormulaExpr): FormulaExpr;
9
+ /**
10
+ * Response: every p is eventually followed by q.
11
+ * LTLf: G(p -> F q)
12
+ */
13
+ declare function response(p: FormulaExpr, q: FormulaExpr): FormulaExpr;
14
+ /**
15
+ * Bounded Response: every p is followed by q within N steps (N positions from current).
16
+ * LTLf: G(p -> withinSteps(n, q))
17
+ * Consistent with withinSteps semantics: checks positions [pos, pos+n).
18
+ */
19
+ declare function boundedResponse(p: FormulaExpr, q: FormulaExpr, steps: number): FormulaExpr;
20
+ /**
21
+ * Precedence: q can only occur after p has occurred.
22
+ * LTLf: (!q) U p (or equivalently, G(!q) if p never happens)
23
+ * Weak until variant: !q W p = ((!q) U p) | G(!q)
24
+ */
25
+ declare function precedence(p: FormulaExpr, q: FormulaExpr): FormulaExpr;
26
+ /**
27
+ * Persistence: once p holds, it holds forever after.
28
+ * LTLf: G(p -> G p)
29
+ */
30
+ declare function persistence(p: FormulaExpr): FormulaExpr;
31
+ /**
32
+ * Stability: once p holds, q holds forever after.
33
+ * LTLf: G(p -> G q)
34
+ */
35
+ declare function stability(p: FormulaExpr, q: FormulaExpr): FormulaExpr;
36
+
37
+ /**
38
+ * Globally scope — the pattern holds at every step.
39
+ * Just wraps the pattern in always(). Included for API completeness.
40
+ */
41
+ declare function globally(pattern: FormulaExpr): FormulaExpr;
42
+ /**
43
+ * After scope — the pattern holds at every step after q has occurred.
44
+ * LTLf: G(once(q) -> pattern)
45
+ */
46
+ declare function after(q: FormulaExpr, pattern: FormulaExpr): FormulaExpr;
47
+ /**
48
+ * Before scope — the pattern holds at every step before r occurs.
49
+ * LTLf: G(!once(r) -> pattern) which simplifies to: pattern holds until r.
50
+ * We use historically(!r) -> pattern for each step.
51
+ */
52
+ declare function before(r: FormulaExpr, pattern: FormulaExpr): FormulaExpr;
53
+ /**
54
+ * Between scope — the pattern holds between every occurrence of q and the next r.
55
+ * LTLf: G( (not(r) S q) -> pattern )
56
+ * "not(r) since q" is true when q has occurred and r has not occurred since the last q.
57
+ * This correctly handles re-entry: q→r→q reactivates the scope.
58
+ */
59
+ declare function between(q: FormulaExpr, r: FormulaExpr, pattern: FormulaExpr): FormulaExpr;
60
+
61
+ export { absence, after, before, between, boundedResponse, globally, persistence, precedence, response, stability };