modality-ts 0.0.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 (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/dist/checker/encode/index.d.ts +2 -0
  4. package/dist/checker/encode/index.d.ts.map +1 -0
  5. package/dist/checker/encode/index.js +2 -0
  6. package/dist/checker/encode/index.js.map +1 -0
  7. package/dist/checker/index.d.ts +6 -0
  8. package/dist/checker/index.d.ts.map +1 -0
  9. package/dist/checker/index.js +6 -0
  10. package/dist/checker/index.js.map +1 -0
  11. package/dist/checker/monitors/index.d.ts +2 -0
  12. package/dist/checker/monitors/index.d.ts.map +1 -0
  13. package/dist/checker/monitors/index.js +2 -0
  14. package/dist/checker/monitors/index.js.map +1 -0
  15. package/dist/checker/search/eval.d.ts +16 -0
  16. package/dist/checker/search/eval.d.ts.map +1 -0
  17. package/dist/checker/search/eval.js +254 -0
  18. package/dist/checker/search/eval.js.map +1 -0
  19. package/dist/checker/search/index.d.ts +43 -0
  20. package/dist/checker/search/index.d.ts.map +1 -0
  21. package/dist/checker/search/index.js +532 -0
  22. package/dist/checker/search/index.js.map +1 -0
  23. package/dist/checker/slicing/index.d.ts +2 -0
  24. package/dist/checker/slicing/index.d.ts.map +1 -0
  25. package/dist/checker/slicing/index.js +2 -0
  26. package/dist/checker/slicing/index.js.map +1 -0
  27. package/dist/checker/traces/index.d.ts +2 -0
  28. package/dist/checker/traces/index.d.ts.map +1 -0
  29. package/dist/checker/traces/index.js +2 -0
  30. package/dist/checker/traces/index.js.map +1 -0
  31. package/dist/extraction/index.d.ts +31 -0
  32. package/dist/extraction/index.d.ts.map +1 -0
  33. package/dist/extraction/index.js +2254 -0
  34. package/dist/extraction/index.js.map +1 -0
  35. package/dist/extraction/pipeline/index.d.ts +45 -0
  36. package/dist/extraction/pipeline/index.d.ts.map +1 -0
  37. package/dist/extraction/pipeline/index.js +101 -0
  38. package/dist/extraction/pipeline/index.js.map +1 -0
  39. package/dist/extraction/spi/index.d.ts +99 -0
  40. package/dist/extraction/spi/index.d.ts.map +1 -0
  41. package/dist/extraction/spi/index.js +2 -0
  42. package/dist/extraction/spi/index.js.map +1 -0
  43. package/dist/harness/index.d.ts +109 -0
  44. package/dist/harness/index.d.ts.map +1 -0
  45. package/dist/harness/index.js +377 -0
  46. package/dist/harness/index.js.map +1 -0
  47. package/dist/kernel/artifacts/index.d.ts +11 -0
  48. package/dist/kernel/artifacts/index.d.ts.map +1 -0
  49. package/dist/kernel/artifacts/index.js +127 -0
  50. package/dist/kernel/artifacts/index.js.map +1 -0
  51. package/dist/kernel/index.d.ts +10 -0
  52. package/dist/kernel/index.d.ts.map +1 -0
  53. package/dist/kernel/index.js +10 -0
  54. package/dist/kernel/index.js.map +1 -0
  55. package/dist/kernel/ir/canonical.d.ts +5 -0
  56. package/dist/kernel/ir/canonical.d.ts.map +1 -0
  57. package/dist/kernel/ir/canonical.js +47 -0
  58. package/dist/kernel/ir/canonical.js.map +1 -0
  59. package/dist/kernel/ir/domains.d.ts +9 -0
  60. package/dist/kernel/ir/domains.d.ts.map +1 -0
  61. package/dist/kernel/ir/domains.js +102 -0
  62. package/dist/kernel/ir/domains.js.map +1 -0
  63. package/dist/kernel/ir/types.d.ts +224 -0
  64. package/dist/kernel/ir/types.d.ts.map +1 -0
  65. package/dist/kernel/ir/types.js +2 -0
  66. package/dist/kernel/ir/types.js.map +1 -0
  67. package/dist/kernel/ir/validator.d.ts +11 -0
  68. package/dist/kernel/ir/validator.d.ts.map +1 -0
  69. package/dist/kernel/ir/validator.js +674 -0
  70. package/dist/kernel/ir/validator.js.map +1 -0
  71. package/dist/kernel/overlay/index.d.ts +18 -0
  72. package/dist/kernel/overlay/index.d.ts.map +1 -0
  73. package/dist/kernel/overlay/index.js +59 -0
  74. package/dist/kernel/overlay/index.js.map +1 -0
  75. package/dist/kernel/props/index.d.ts +71 -0
  76. package/dist/kernel/props/index.d.ts.map +1 -0
  77. package/dist/kernel/props/index.js +122 -0
  78. package/dist/kernel/props/index.js.map +1 -0
  79. package/dist/kernel/report/types.d.ts +115 -0
  80. package/dist/kernel/report/types.d.ts.map +1 -0
  81. package/dist/kernel/report/types.js +2 -0
  82. package/dist/kernel/report/types.js.map +1 -0
  83. package/dist/kernel/trace/types.d.ts +19 -0
  84. package/dist/kernel/trace/types.d.ts.map +1 -0
  85. package/dist/kernel/trace/types.js +2 -0
  86. package/dist/kernel/trace/types.js.map +1 -0
  87. package/dist/modality/check.d.ts +3 -0
  88. package/dist/modality/check.d.ts.map +1 -0
  89. package/dist/modality/check.js +2 -0
  90. package/dist/modality/check.js.map +1 -0
  91. package/dist/modality/ci.d.ts +3 -0
  92. package/dist/modality/ci.d.ts.map +1 -0
  93. package/dist/modality/ci.js +2 -0
  94. package/dist/modality/ci.js.map +1 -0
  95. package/dist/modality/cli.d.ts +3 -0
  96. package/dist/modality/cli.d.ts.map +1 -0
  97. package/dist/modality/cli.js +223 -0
  98. package/dist/modality/cli.js.map +1 -0
  99. package/dist/modality/codegen/model.d.ts +3 -0
  100. package/dist/modality/codegen/model.d.ts.map +1 -0
  101. package/dist/modality/codegen/model.js +59 -0
  102. package/dist/modality/codegen/model.js.map +1 -0
  103. package/dist/modality/codegen/replay-test.d.ts +10 -0
  104. package/dist/modality/codegen/replay-test.d.ts.map +1 -0
  105. package/dist/modality/codegen/replay-test.js +104 -0
  106. package/dist/modality/codegen/replay-test.js.map +1 -0
  107. package/dist/modality/conform.d.ts +3 -0
  108. package/dist/modality/conform.d.ts.map +1 -0
  109. package/dist/modality/conform.js +2 -0
  110. package/dist/modality/conform.js.map +1 -0
  111. package/dist/modality/export-tla.d.ts +3 -0
  112. package/dist/modality/export-tla.d.ts.map +1 -0
  113. package/dist/modality/export-tla.js +2 -0
  114. package/dist/modality/export-tla.js.map +1 -0
  115. package/dist/modality/extract.d.ts +3 -0
  116. package/dist/modality/extract.d.ts.map +1 -0
  117. package/dist/modality/extract.js +2 -0
  118. package/dist/modality/extract.js.map +1 -0
  119. package/dist/modality/features/check/command.d.ts +23 -0
  120. package/dist/modality/features/check/command.d.ts.map +1 -0
  121. package/dist/modality/features/check/command.js +174 -0
  122. package/dist/modality/features/check/command.js.map +1 -0
  123. package/dist/modality/features/check/index.d.ts +3 -0
  124. package/dist/modality/features/check/index.d.ts.map +1 -0
  125. package/dist/modality/features/check/index.js +2 -0
  126. package/dist/modality/features/check/index.js.map +1 -0
  127. package/dist/modality/features/ci/command.d.ts +23 -0
  128. package/dist/modality/features/ci/command.d.ts.map +1 -0
  129. package/dist/modality/features/ci/command.js +176 -0
  130. package/dist/modality/features/ci/command.js.map +1 -0
  131. package/dist/modality/features/ci/index.d.ts +3 -0
  132. package/dist/modality/features/ci/index.d.ts.map +1 -0
  133. package/dist/modality/features/ci/index.js +2 -0
  134. package/dist/modality/features/ci/index.js.map +1 -0
  135. package/dist/modality/features/conform/command.d.ts +35 -0
  136. package/dist/modality/features/conform/command.d.ts.map +1 -0
  137. package/dist/modality/features/conform/command.js +162 -0
  138. package/dist/modality/features/conform/command.js.map +1 -0
  139. package/dist/modality/features/conform/index.d.ts +3 -0
  140. package/dist/modality/features/conform/index.d.ts.map +1 -0
  141. package/dist/modality/features/conform/index.js +2 -0
  142. package/dist/modality/features/conform/index.js.map +1 -0
  143. package/dist/modality/features/export/command.d.ts +13 -0
  144. package/dist/modality/features/export/command.d.ts.map +1 -0
  145. package/dist/modality/features/export/command.js +250 -0
  146. package/dist/modality/features/export/command.js.map +1 -0
  147. package/dist/modality/features/export/index.d.ts +3 -0
  148. package/dist/modality/features/export/index.d.ts.map +1 -0
  149. package/dist/modality/features/export/index.js +2 -0
  150. package/dist/modality/features/export/index.js.map +1 -0
  151. package/dist/modality/features/extract/command.d.ts +37 -0
  152. package/dist/modality/features/extract/command.d.ts.map +1 -0
  153. package/dist/modality/features/extract/command.js +443 -0
  154. package/dist/modality/features/extract/command.js.map +1 -0
  155. package/dist/modality/features/extract/index.d.ts +3 -0
  156. package/dist/modality/features/extract/index.d.ts.map +1 -0
  157. package/dist/modality/features/extract/index.js +2 -0
  158. package/dist/modality/features/extract/index.js.map +1 -0
  159. package/dist/modality/features/replay/command.d.ts +16 -0
  160. package/dist/modality/features/replay/command.d.ts.map +1 -0
  161. package/dist/modality/features/replay/command.js +50 -0
  162. package/dist/modality/features/replay/command.js.map +1 -0
  163. package/dist/modality/features/replay/index.d.ts +3 -0
  164. package/dist/modality/features/replay/index.d.ts.map +1 -0
  165. package/dist/modality/features/replay/index.js +2 -0
  166. package/dist/modality/features/replay/index.js.map +1 -0
  167. package/dist/modality/overlay.d.ts +3 -0
  168. package/dist/modality/overlay.d.ts.map +1 -0
  169. package/dist/modality/overlay.js +9 -0
  170. package/dist/modality/overlay.js.map +1 -0
  171. package/dist/modality/registry/index.d.ts +22 -0
  172. package/dist/modality/registry/index.d.ts.map +1 -0
  173. package/dist/modality/registry/index.js +89 -0
  174. package/dist/modality/registry/index.js.map +1 -0
  175. package/dist/modality/replay.d.ts +3 -0
  176. package/dist/modality/replay.d.ts.map +1 -0
  177. package/dist/modality/replay.js +2 -0
  178. package/dist/modality/replay.js.map +1 -0
  179. package/dist/runtime/index.d.ts +53 -0
  180. package/dist/runtime/index.d.ts.map +1 -0
  181. package/dist/runtime/index.js +83 -0
  182. package/dist/runtime/index.js.map +1 -0
  183. package/dist/sources/jotai/harness.d.ts +13 -0
  184. package/dist/sources/jotai/harness.d.ts.map +1 -0
  185. package/dist/sources/jotai/harness.js +20 -0
  186. package/dist/sources/jotai/harness.js.map +1 -0
  187. package/dist/sources/jotai/index.d.ts +11 -0
  188. package/dist/sources/jotai/index.d.ts.map +1 -0
  189. package/dist/sources/jotai/index.js +405 -0
  190. package/dist/sources/jotai/index.js.map +1 -0
  191. package/dist/sources/router/harness.d.ts +9 -0
  192. package/dist/sources/router/harness.d.ts.map +1 -0
  193. package/dist/sources/router/harness.js +32 -0
  194. package/dist/sources/router/harness.js.map +1 -0
  195. package/dist/sources/router/index.d.ts +15 -0
  196. package/dist/sources/router/index.d.ts.map +1 -0
  197. package/dist/sources/router/index.js +41 -0
  198. package/dist/sources/router/index.js.map +1 -0
  199. package/dist/sources/swr/harness.d.ts +12 -0
  200. package/dist/sources/swr/harness.d.ts.map +1 -0
  201. package/dist/sources/swr/harness.js +25 -0
  202. package/dist/sources/swr/harness.js.map +1 -0
  203. package/dist/sources/swr/index.d.ts +51 -0
  204. package/dist/sources/swr/index.d.ts.map +1 -0
  205. package/dist/sources/swr/index.js +428 -0
  206. package/dist/sources/swr/index.js.map +1 -0
  207. package/dist/sources/use-state/harness.d.ts +12 -0
  208. package/dist/sources/use-state/harness.d.ts.map +1 -0
  209. package/dist/sources/use-state/harness.js +19 -0
  210. package/dist/sources/use-state/harness.js.map +1 -0
  211. package/dist/sources/use-state/index.d.ts +9 -0
  212. package/dist/sources/use-state/index.d.ts.map +1 -0
  213. package/dist/sources/use-state/index.js +248 -0
  214. package/dist/sources/use-state/index.js.map +1 -0
  215. package/package.json +136 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Harineko0
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # modality-ts
2
+
3
+ [![npm version](https://img.shields.io/npm/v/modality-ts.svg)](https://www.npmjs.com/package/modality-ts)
4
+ [![CI](https://github.com/Harineko0/modality-ts/actions/workflows/ci.yml/badge.svg)](https://github.com/Harineko0/modality-ts/actions/workflows/ci.yml)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
7
+
8
+ `modality-ts` is a model-checking-based testing tool for React state-transition bugs.
9
+
10
+ It extracts a finite transition model from React + TypeScript code, checks developer-defined properties against every reachable state within stated bounds, and turns counterexamples into replayable tests.
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm install -g modality-ts
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ Start by extracting a model from a React component:
21
+
22
+ ```bash
23
+ modality extract src/App.tsx --out .modality/model.json
24
+ ```
25
+
26
+ If your component calls side-effect APIs that should appear in the model, name them explicitly:
27
+
28
+ ```bash
29
+ modality extract src/App.tsx --out .modality/model.json --effect-api api.placeOrder
30
+ ```
31
+
32
+ Check the extracted model against a property file:
33
+
34
+ ```bash
35
+ modality check .modality/model.json src/app.props.mjs --report .modality/report.json --traces .modality/traces
36
+ ```
37
+
38
+ When a property fails, replay the generated counterexample trace:
39
+
40
+ ```bash
41
+ modality replay .modality/traces/noDoubleSubmit.violated.trace.json
42
+ ```
43
+
44
+ For CI, write all verification artifacts into one directory:
45
+
46
+ ```bash
47
+ modality ci .modality/model.json src/app.props.mjs --artifacts .modality
48
+ ```
49
+
50
+ Useful commands:
51
+
52
+ ```bash
53
+ modality extract <source.tsx> --out model.json
54
+ modality check <model.json> [props.ts] --report report.json
55
+ modality replay <trace.json>
56
+ modality conform --model model.json --count 8 --depth 4
57
+ modality export <model.json> --format tla --out model.tla
58
+ modality ci <model.json> [props.ts] --artifacts .modality
59
+ ```
60
+
61
+ ## Limitation
62
+
63
+ `modality-ts` verifies the model it can extract, not arbitrary browser behavior. It works best for React apps where important behavior is represented as bounded, deterministic state transitions in TypeScript.
64
+
65
+ Good fits include:
66
+
67
+ - Components with local `useState` transitions.
68
+ - Apps that use supported state/data sources such as Jotai, SWR, and router state.
69
+ - Flows with finite domains, bounded collections, and named side effects.
70
+ - Business rules that can be expressed as safety properties over reachable states.
71
+
72
+ Current weak fits include:
73
+
74
+ - Apps whose correctness depends mainly on DOM layout, CSS, animation timing, canvas rendering, or browser quirks.
75
+ - Unbounded or highly numeric behavior without explicit finite bounds.
76
+ - External services that are not modeled as effects or bounded data.
77
+ - Concurrency, timers, and network races that are not represented in the extracted model.
78
+ - Code patterns outside the supported React + TypeScript extraction subset.
79
+
80
+ For those cases, use `modality-ts` alongside regular unit, integration, and end-to-end tests.
81
+
82
+ ## License
83
+
84
+ MIT
@@ -0,0 +1,2 @@
1
+ export { canonicalState } from "modality-ts/kernel";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/checker/encode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { canonicalState } from "modality-ts/kernel";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checker/encode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./encode/index.js";
2
+ export * from "./monitors/index.js";
3
+ export * from "./search/index.js";
4
+ export * from "./slicing/index.js";
5
+ export * from "./traces/index.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checker/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./encode/index.js";
2
+ export * from "./monitors/index.js";
3
+ export * from "./search/index.js";
4
+ export * from "./slicing/index.js";
5
+ export * from "./traces/index.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checker/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type { CheckOptions, CheckResult, PropertyVerdict } from "../search/index.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/checker/monitors/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checker/monitors/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { EffectIR, ExprIR, Model, ModelState, Transition, Value } from "modality-ts/kernel";
2
+ export interface PendingOp {
3
+ [key: string]: Value;
4
+ opId: string;
5
+ continuation: string;
6
+ args: Record<string, Value>;
7
+ }
8
+ export interface EvalOptions {
9
+ onBoundHit?: (hit: string) => void;
10
+ }
11
+ export declare function evalExpr(model: Model, state: ModelState, expr: ExprIR, options?: EvalOptions): Value;
12
+ export declare function guardHolds(model: Model, transition: Transition, state: ModelState): boolean;
13
+ export declare function applyEffect(model: Model, state: ModelState, effect: EffectIR, options?: EvalOptions): ModelState[];
14
+ export declare function readPending(state: ModelState): PendingOp[];
15
+ export declare function normalizeInitialRouteLocals(model: Model, state: ModelState): ModelState[];
16
+ //# sourceMappingURL=eval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../../src/checker/search/eval.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAa,UAAU,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE5G,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAaD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,KAAK,CAyCxG;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAE3F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAE,WAAgB,GAAG,UAAU,EAAE,CAUtH;AAsCD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,CAG1D;AAgBD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,CAEzF"}
@@ -0,0 +1,254 @@
1
+ import { createRequire } from "node:module";
2
+ import { isAbsolute, resolve } from "node:path";
3
+ import { enumerateDomain, initialValues, UNMOUNTED, validateValue } from "modality-ts/kernel";
4
+ const require = createRequire(import.meta.url);
5
+ const opaqueCache = new Map();
6
+ class TokenExhausted extends Error {
7
+ domainOf;
8
+ constructor(domainOf) {
9
+ super(`token cap exhausted for ${domainOf}`);
10
+ this.domainOf = domainOf;
11
+ }
12
+ }
13
+ export function evalExpr(model, state, expr, options = {}) {
14
+ switch (expr.kind) {
15
+ case "lit":
16
+ return expr.value;
17
+ case "read":
18
+ return readPath(state[expr.var], expr.path ?? []);
19
+ case "eq":
20
+ return JSON.stringify(evalExpr(model, state, expr.args[0], options)) === JSON.stringify(evalExpr(model, state, expr.args[1], options));
21
+ case "neq":
22
+ return JSON.stringify(evalExpr(model, state, expr.args[0], options)) !== JSON.stringify(evalExpr(model, state, expr.args[1], options));
23
+ case "and":
24
+ return expr.args.every((arg) => Boolean(evalExpr(model, state, arg, options)));
25
+ case "or":
26
+ return expr.args.some((arg) => Boolean(evalExpr(model, state, arg, options)));
27
+ case "not":
28
+ return !Boolean(evalExpr(model, state, expr.args[0], options));
29
+ case "cond":
30
+ return Boolean(evalExpr(model, state, expr.args[0], options)) ? evalExpr(model, state, expr.args[1], options) : evalExpr(model, state, expr.args[2], options);
31
+ case "updateField":
32
+ return writePath(evalExpr(model, state, expr.target, options), expr.path, evalExpr(model, state, expr.value, options));
33
+ case "tagIs": {
34
+ const arg = evalExpr(model, state, expr.arg, options);
35
+ return typeof arg === "object" && arg !== null && !Array.isArray(arg) && Object.values(arg).includes(expr.tag);
36
+ }
37
+ case "lenCat": {
38
+ const arg = evalExpr(model, state, expr.arg, options);
39
+ if (!Array.isArray(arg))
40
+ return "0";
41
+ return arg.length === 0 ? "0" : arg.length === 1 ? "1" : "many";
42
+ }
43
+ case "freshToken": {
44
+ const decl = model.vars.find((candidate) => candidate.id === expr.domainOf);
45
+ if (!decl || decl.domain.kind !== "tokens")
46
+ throw new Error(`freshToken domainOf must reference token var: ${expr.domainOf}`);
47
+ const names = enumerateDomain(decl.domain);
48
+ const tokenSet = new Set(names);
49
+ const used = new Set();
50
+ for (const value of Object.values(state))
51
+ collectTokens(value, used, tokenSet);
52
+ const fresh = names.find((name) => !used.has(name));
53
+ if (!fresh)
54
+ throw new TokenExhausted(expr.domainOf);
55
+ return fresh;
56
+ }
57
+ }
58
+ }
59
+ export function guardHolds(model, transition, state) {
60
+ return Boolean(evalExpr(model, state, transition.guard));
61
+ }
62
+ export function applyEffect(model, state, effect, options = {}) {
63
+ try {
64
+ return applyEffectUnsafe(model, state, effect, options);
65
+ }
66
+ catch (error) {
67
+ if (error instanceof TokenExhausted) {
68
+ options.onBoundHit?.(`token cap exhausted for ${error.domainOf}`);
69
+ return [];
70
+ }
71
+ throw error;
72
+ }
73
+ }
74
+ function applyEffectUnsafe(model, state, effect, options) {
75
+ switch (effect.kind) {
76
+ case "assign":
77
+ return [{ ...state, [effect.var]: evalExpr(model, state, effect.expr, options) }];
78
+ case "havoc": {
79
+ const decl = mustVar(model, effect.var);
80
+ return enumerateDomain(decl.domain).map((value) => ({ ...state, [effect.var]: value }));
81
+ }
82
+ case "choose":
83
+ return effect.among.map((expr) => ({ ...state, [effect.var]: evalExpr(model, state, expr, options) }));
84
+ case "if":
85
+ return applyEffect(model, state, Boolean(evalExpr(model, state, effect.cond, options)) ? effect.then : effect.else, options);
86
+ case "seq":
87
+ return effect.effects.reduce((states, next) => states.flatMap((candidate) => applyEffect(model, candidate, next, options)), [state]);
88
+ case "enqueue": {
89
+ const pending = readPending(state);
90
+ if (pending.length >= model.bounds.maxPending)
91
+ return [];
92
+ const op = {
93
+ opId: effect.op,
94
+ continuation: effect.continuation,
95
+ args: Object.fromEntries(Object.entries(effect.args).map(([k, expr]) => [k, evalExpr(model, state, expr, options)]))
96
+ };
97
+ return [{ ...state, "sys:pending": [...pending, op] }];
98
+ }
99
+ case "dequeue": {
100
+ const pending = readPending(state);
101
+ if (effect.index < 0 || effect.index >= pending.length)
102
+ return [state];
103
+ return [{ ...state, "sys:pending": pending.filter((_, i) => i !== effect.index) }];
104
+ }
105
+ case "navigate":
106
+ return navigate(model, state, effect);
107
+ case "opaque":
108
+ return applyOpaqueEffect(model, state, effect.ref);
109
+ }
110
+ }
111
+ export function readPending(state) {
112
+ const pending = state["sys:pending"];
113
+ return Array.isArray(pending) ? pending : [];
114
+ }
115
+ function navigate(model, state, effect) {
116
+ const route = state["sys:route"];
117
+ const history = Array.isArray(state["sys:history"]) ? state["sys:history"] : [];
118
+ if (effect.mode === "back") {
119
+ const previous = history[history.length - 1];
120
+ if (typeof previous !== "string")
121
+ return [state];
122
+ return resetRouteLocals(model, { ...state, "sys:route": previous, "sys:history": history.slice(0, -1) }, route);
123
+ }
124
+ const to = effect.to ? evalExpr(model, state, effect.to) : undefined;
125
+ if (typeof to !== "string")
126
+ return [state];
127
+ const nextHistory = effect.mode === "push" && typeof route === "string" ? [...history, route] : history;
128
+ return resetRouteLocals(model, { ...state, "sys:route": to, "sys:history": nextHistory }, route);
129
+ }
130
+ export function normalizeInitialRouteLocals(model, state) {
131
+ return resetRouteLocals(model, state, undefined, { preserveMounted: true });
132
+ }
133
+ function resetRouteLocals(model, state, previousRoute, options = {}) {
134
+ const currentRoute = state["sys:route"];
135
+ if (previousRoute === currentRoute)
136
+ return [state];
137
+ let states = [state];
138
+ for (const decl of model.vars) {
139
+ if (decl.scope.kind !== "route-local")
140
+ continue;
141
+ if (decl.scope.route === currentRoute) {
142
+ if (options.preserveMounted)
143
+ continue;
144
+ states = states.flatMap((candidate) => initialValues(decl.domain, decl.initial).map((value) => ({ ...candidate, [decl.id]: value })));
145
+ }
146
+ else {
147
+ states = states.map((candidate) => ({ ...candidate, [decl.id]: UNMOUNTED }));
148
+ }
149
+ }
150
+ return states;
151
+ }
152
+ function readPath(value, path) {
153
+ let current = value;
154
+ for (const segment of path) {
155
+ if (Array.isArray(current))
156
+ current = current[Number(segment)];
157
+ else if (current && typeof current === "object")
158
+ current = current[segment];
159
+ else
160
+ return undefined;
161
+ }
162
+ return current;
163
+ }
164
+ function writePath(target, path, value) {
165
+ if (path.length === 0)
166
+ return value;
167
+ const [head, ...tail] = path;
168
+ if (Array.isArray(target)) {
169
+ const copy = [...target];
170
+ copy[Number(head)] = writePath(copy[Number(head)], tail, value);
171
+ return copy;
172
+ }
173
+ const base = target && typeof target === "object" ? target : {};
174
+ return { ...base, [head]: writePath(base[head], tail, value) };
175
+ }
176
+ function collectTokens(value, out, tokenSet) {
177
+ if (typeof value === "string" && tokenSet.has(value))
178
+ out.add(value);
179
+ else if (Array.isArray(value))
180
+ value.forEach((item) => collectTokens(item, out, tokenSet));
181
+ else if (value && typeof value === "object")
182
+ Object.values(value).forEach((item) => collectTokens(item, out, tokenSet));
183
+ }
184
+ function applyOpaqueEffect(model, state, ref) {
185
+ const fn = loadOpaqueEffect(ref);
186
+ const first = normalizeOpaqueResults(fn(deepFreeze(cloneValue(state))));
187
+ const second = normalizeOpaqueResults(fn(deepFreeze(cloneValue(state))));
188
+ if (JSON.stringify(first) !== JSON.stringify(second)) {
189
+ throw new Error(`Opaque effect ${ref.module}#${ref.export} returned nondeterministic results for identical input`);
190
+ }
191
+ const states = first;
192
+ return states.map((candidate, index) => validateOpaqueState(model, state, candidate, ref, index));
193
+ }
194
+ function normalizeOpaqueResults(results) {
195
+ return Array.isArray(results) ? results : [results];
196
+ }
197
+ function loadOpaqueEffect(ref) {
198
+ const key = `${ref.module}#${ref.export}`;
199
+ const cached = opaqueCache.get(key);
200
+ if (cached)
201
+ return cached;
202
+ const modulePath = isAbsolute(ref.module) ? ref.module : resolve(process.cwd(), ref.module);
203
+ const moduleValue = require(modulePath);
204
+ const fn = moduleValue[ref.export];
205
+ if (typeof fn !== "function")
206
+ throw new Error(`Opaque effect ${key} does not export a function`);
207
+ opaqueCache.set(key, fn);
208
+ return fn;
209
+ }
210
+ function validateOpaqueState(model, pre, post, ref, index) {
211
+ if (!post || typeof post !== "object" || Array.isArray(post)) {
212
+ throw new Error(`Opaque effect ${ref.module}#${ref.export} result ${index} must be a state object`);
213
+ }
214
+ const declaredWrites = new Set(ref.declaredWrites);
215
+ const varIds = new Set(model.vars.map((decl) => decl.id));
216
+ for (const key of Object.keys(post)) {
217
+ if (!varIds.has(key))
218
+ throw new Error(`Opaque effect ${ref.module}#${ref.export} wrote unknown var ${key}`);
219
+ }
220
+ for (const decl of model.vars) {
221
+ if (!Object.hasOwn(post, decl.id))
222
+ throw new Error(`Opaque effect ${ref.module}#${ref.export} result ${index} omitted var ${decl.id}`);
223
+ if (!validateValue(decl.domain, post[decl.id])) {
224
+ throw new Error(`Opaque effect ${ref.module}#${ref.export} produced invalid value for ${decl.id}: ${JSON.stringify(post[decl.id])}`);
225
+ }
226
+ }
227
+ for (const id of changedKeys(pre, post)) {
228
+ if (!declaredWrites.has(id))
229
+ throw new Error(`Opaque effect ${ref.module}#${ref.export} wrote undeclared var ${id}`);
230
+ }
231
+ return post;
232
+ }
233
+ function changedKeys(left, right) {
234
+ const ids = new Set([...Object.keys(left), ...Object.keys(right)]);
235
+ return [...ids].filter((id) => JSON.stringify(left[id]) !== JSON.stringify(right[id]));
236
+ }
237
+ function cloneValue(value) {
238
+ return JSON.parse(JSON.stringify(value));
239
+ }
240
+ function deepFreeze(value) {
241
+ if (value && typeof value === "object") {
242
+ Object.freeze(value);
243
+ for (const child of Object.values(value))
244
+ deepFreeze(child);
245
+ }
246
+ return value;
247
+ }
248
+ function mustVar(model, id) {
249
+ const decl = model.vars.find((candidate) => candidate.id === id);
250
+ if (!decl)
251
+ throw new Error(`Unknown var ${id}`);
252
+ return decl;
253
+ }
254
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../../../src/checker/search/eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { Model, ModelState, Property, Trace, TraceStep } from "modality-ts/kernel";
2
+ export type PropertyVerdict = {
3
+ status: "verified-within-bounds";
4
+ property: string;
5
+ } | {
6
+ status: "violated";
7
+ property: string;
8
+ trace: Trace;
9
+ replayable?: boolean;
10
+ replayBlockedReason?: string;
11
+ } | {
12
+ status: "reachable";
13
+ property: string;
14
+ trace: Trace;
15
+ replayable?: boolean;
16
+ replayBlockedReason?: string;
17
+ } | {
18
+ status: "vacuous-warning";
19
+ property: string;
20
+ message: string;
21
+ } | {
22
+ status: "error";
23
+ property: string;
24
+ message: string;
25
+ };
26
+ export interface CheckResult {
27
+ verdicts: PropertyVerdict[];
28
+ stats: {
29
+ states: number;
30
+ edges: number;
31
+ depth: number;
32
+ };
33
+ vacuityWarnings: string[];
34
+ boundHits: string[];
35
+ }
36
+ export interface CheckOptions {
37
+ slicing?: boolean;
38
+ }
39
+ export declare function checkModel(model: Model, properties: readonly Property[], options?: CheckOptions): CheckResult;
40
+ export declare function sliceModel(model: Model, propertyReads: readonly string[]): Model;
41
+ export declare function modelInitialStates(model: Model): ModelState[];
42
+ export declare function modelSuccessors(model: Model, pre: ModelState): TraceStep[];
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/checker/search/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAa,KAAK,EAAE,SAAS,EAAqB,MAAM,oBAAoB,CAAC;AAIlI,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,wBAAwB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3G;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAkBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,QAAQ,EAAE,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW,CAKjH;AAgID,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,KAAK,CAEhF;AAoCD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,EAAE,CAE7D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,GAAG,SAAS,EAAE,CAM1E"}