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
@@ -0,0 +1,223 @@
1
+ #!/usr/bin/env node
2
+ import { runCheckCommand } from "./features/check/index.js";
3
+ import { runCiCommand } from "./features/ci/index.js";
4
+ import { runConformCommand } from "./features/conform/index.js";
5
+ import { runExportTlaCommand } from "./features/export/index.js";
6
+ import { runExtractCommand } from "./features/extract/index.js";
7
+ import { runReplayCommand } from "./features/replay/index.js";
8
+ async function main() {
9
+ const [, , command, ...args] = process.argv;
10
+ if (command !== "check" && command !== "ci" && command !== "conform" && command !== "export" && command !== "extract" && command !== "replay") {
11
+ console.log("Usage: modality extract <source.tsx> --out model.json [--app-model app.model.ts] [--report extraction-report.json] [--expect-model expected.json] [--config modality.config.ts] [--package-json package.json] [--disable-plugin id] [--effect-api name] [--explain-drift]");
12
+ console.log("Usage: modality check <model.json> [props.ts] [--report report.json]");
13
+ console.log(" modality ci <model.json> [props.ts] --artifacts .modality [--baseline report.json] [--source source.tsx] [--conform-count 8] [--min-transition-conform-pass-rate 1]");
14
+ console.log(" modality replay <trace.json> [--states states.json] [--observed observed-states.json] [--report report.json]");
15
+ console.log(" modality conform <walks.json> [--report conform-report.json]");
16
+ console.log(" modality conform --model model.json [--count 8] [--depth 4] [--seed 1] [--report conform-report.json]");
17
+ console.log(" modality export <model.json> --format tla --out model.tla");
18
+ process.exit(command ? 1 : 0);
19
+ }
20
+ if (command === "ci") {
21
+ const artifactsFlag = args.indexOf("--artifacts");
22
+ const overlayFlag = args.indexOf("--overlay");
23
+ const baselineFlag = args.indexOf("--baseline");
24
+ const sourceFlag = args.indexOf("--source");
25
+ const conformWalksFlag = args.indexOf("--conform-walks");
26
+ const conformCountFlag = args.indexOf("--conform-count");
27
+ const conformDepthFlag = args.indexOf("--conform-depth");
28
+ const conformSeedFlag = args.indexOf("--conform-seed");
29
+ const minConformPassRateFlag = args.indexOf("--min-conform-pass-rate");
30
+ const minTransitionConformPassRateFlag = args.indexOf("--min-transition-conform-pass-rate");
31
+ const artifactDir = artifactsFlag >= 0 ? args[artifactsFlag + 1] : undefined;
32
+ const overlayPath = overlayFlag >= 0 ? args[overlayFlag + 1] : undefined;
33
+ const baselinePath = baselineFlag >= 0 ? args[baselineFlag + 1] : undefined;
34
+ const sourcePath = sourceFlag >= 0 ? args[sourceFlag + 1] : undefined;
35
+ const conformWalksPath = conformWalksFlag >= 0 ? args[conformWalksFlag + 1] : undefined;
36
+ const conformCount = conformCountFlag >= 0 && args[conformCountFlag + 1] ? Number(args[conformCountFlag + 1]) : undefined;
37
+ const conformDepth = conformDepthFlag >= 0 && args[conformDepthFlag + 1] ? Number(args[conformDepthFlag + 1]) : undefined;
38
+ const conformSeed = conformSeedFlag >= 0 && args[conformSeedFlag + 1] ? Number(args[conformSeedFlag + 1]) : undefined;
39
+ const minConformPassRate = minConformPassRateFlag >= 0 && args[minConformPassRateFlag + 1] ? Number(args[minConformPassRateFlag + 1]) : undefined;
40
+ const minTransitionConformPassRate = minTransitionConformPassRateFlag >= 0 && args[minTransitionConformPassRateFlag + 1] ? Number(args[minTransitionConformPassRateFlag + 1]) : undefined;
41
+ const positional = args.filter((arg, index) => index !== artifactsFlag && index !== artifactsFlag + 1 &&
42
+ index !== overlayFlag && index !== overlayFlag + 1 &&
43
+ index !== baselineFlag && index !== baselineFlag + 1 &&
44
+ index !== sourceFlag && index !== sourceFlag + 1 &&
45
+ index !== conformWalksFlag && index !== conformWalksFlag + 1 &&
46
+ index !== conformCountFlag && index !== conformCountFlag + 1 &&
47
+ index !== conformDepthFlag && index !== conformDepthFlag + 1 &&
48
+ index !== conformSeedFlag && index !== conformSeedFlag + 1 &&
49
+ index !== minConformPassRateFlag && index !== minConformPassRateFlag + 1 &&
50
+ index !== minTransitionConformPassRateFlag && index !== minTransitionConformPassRateFlag + 1);
51
+ const [modelPath, propsPath] = positional;
52
+ if (!modelPath)
53
+ throw new Error("Missing model.json path");
54
+ if (!artifactDir)
55
+ throw new Error("Missing --artifacts path");
56
+ if (overlayFlag >= 0 && !overlayPath)
57
+ throw new Error("Missing --overlay path");
58
+ if (baselineFlag >= 0 && !baselinePath)
59
+ throw new Error("Missing --baseline path");
60
+ if (sourceFlag >= 0 && !sourcePath)
61
+ throw new Error("Missing --source path");
62
+ if (conformWalksFlag >= 0 && !conformWalksPath)
63
+ throw new Error("Missing --conform-walks path");
64
+ const result = await runCiCommand({ modelPath, propsPath, artifactDir, overlayPath, baselinePath, sourcePath, conformWalksPath, conformCount, conformDepth, conformSeed, minConformPassRate, minTransitionConformPassRate });
65
+ for (const line of result.lines)
66
+ console.log(line);
67
+ process.exit(result.exitCode);
68
+ }
69
+ if (command === "conform") {
70
+ const reportFlag = args.indexOf("--report");
71
+ const modelFlag = args.indexOf("--model");
72
+ const walksFlag = args.indexOf("--walks");
73
+ const countFlag = args.indexOf("--count");
74
+ const depthFlag = args.indexOf("--depth");
75
+ const seedFlag = args.indexOf("--seed");
76
+ const reportPath = reportFlag >= 0 ? args[reportFlag + 1] : undefined;
77
+ const modelPath = modelFlag >= 0 ? args[modelFlag + 1] : undefined;
78
+ const flaggedWalksPath = walksFlag >= 0 ? args[walksFlag + 1] : undefined;
79
+ const walkCount = countFlag >= 0 && args[countFlag + 1] ? Number(args[countFlag + 1]) : undefined;
80
+ const depth = depthFlag >= 0 && args[depthFlag + 1] ? Number(args[depthFlag + 1]) : undefined;
81
+ const seed = seedFlag >= 0 && args[seedFlag + 1] ? Number(args[seedFlag + 1]) : undefined;
82
+ const walksPath = flaggedWalksPath ?? args.find((arg, index) => !arg.startsWith("--") &&
83
+ index !== reportFlag + 1 &&
84
+ index !== modelFlag + 1 &&
85
+ index !== walksFlag + 1 &&
86
+ index !== countFlag + 1 &&
87
+ index !== depthFlag + 1 &&
88
+ index !== seedFlag + 1);
89
+ if (!walksPath && !modelPath)
90
+ throw new Error("Missing walks.json path or --model path");
91
+ if (reportFlag >= 0 && !reportPath)
92
+ throw new Error("Missing --report path");
93
+ if (modelFlag >= 0 && !modelPath)
94
+ throw new Error("Missing --model path");
95
+ if (walksFlag >= 0 && !flaggedWalksPath)
96
+ throw new Error("Missing --walks path");
97
+ const result = await runConformCommand({ walksPath, modelPath, reportPath, walkCount, depth, seed });
98
+ for (const line of result.lines)
99
+ console.log(line);
100
+ process.exit(result.exitCode);
101
+ }
102
+ if (command === "export") {
103
+ const outFlag = args.indexOf("--out");
104
+ const formatFlag = args.indexOf("--format");
105
+ const moduleFlag = args.indexOf("--module");
106
+ const outPath = outFlag >= 0 ? args[outFlag + 1] : undefined;
107
+ const format = formatFlag >= 0 ? args[formatFlag + 1] : "tla";
108
+ const moduleName = moduleFlag >= 0 ? args[moduleFlag + 1] : undefined;
109
+ const modelPath = args.find((arg, index) => !arg.startsWith("--") && index !== outFlag + 1 && index !== formatFlag + 1 && index !== moduleFlag + 1);
110
+ if (!modelPath)
111
+ throw new Error("Missing model.json path");
112
+ if (!outPath)
113
+ throw new Error("Missing --out path");
114
+ if (format !== "tla")
115
+ throw new Error(`Unsupported export format ${format}`);
116
+ if (moduleFlag >= 0 && !moduleName)
117
+ throw new Error("Missing --module path");
118
+ const result = await runExportTlaCommand({ modelPath, outPath, moduleName });
119
+ for (const line of result.lines)
120
+ console.log(line);
121
+ process.exit(0);
122
+ }
123
+ if (command === "extract") {
124
+ const outFlag = args.indexOf("--out");
125
+ const appModelFlag = args.indexOf("--app-model");
126
+ const reportFlag = args.indexOf("--report");
127
+ const overlayFlag = args.indexOf("--overlay");
128
+ const expectModelFlag = args.indexOf("--expect-model");
129
+ const configFlag = args.indexOf("--config");
130
+ const packageJsonFlag = args.indexOf("--package-json");
131
+ const explainDrift = args.includes("--explain-drift");
132
+ const effectApiFlags = args.flatMap((arg, index) => (arg === "--effect-api" && args[index + 1] ? [args[index + 1]] : []));
133
+ const disabledPlugins = args.flatMap((arg, index) => (arg === "--disable-plugin" && args[index + 1] ? [args[index + 1]] : []));
134
+ const sourcePath = args.find((arg, index) => !arg.startsWith("--") && index !== outFlag + 1 && index !== appModelFlag + 1 && index !== reportFlag + 1 && index !== overlayFlag + 1 && index !== expectModelFlag + 1 && index !== configFlag + 1 && index !== packageJsonFlag + 1 && args[index - 1] !== "--effect-api" && args[index - 1] !== "--disable-plugin");
135
+ const modelPath = outFlag >= 0 ? args[outFlag + 1] : undefined;
136
+ const appModelPath = appModelFlag >= 0 ? args[appModelFlag + 1] : undefined;
137
+ const reportPath = reportFlag >= 0 ? args[reportFlag + 1] : undefined;
138
+ const overlayPath = overlayFlag >= 0 ? args[overlayFlag + 1] : undefined;
139
+ const expectModelPath = expectModelFlag >= 0 ? args[expectModelFlag + 1] : undefined;
140
+ const configPath = configFlag >= 0 ? args[configFlag + 1] : undefined;
141
+ const packageJsonPath = packageJsonFlag >= 0 ? args[packageJsonFlag + 1] : undefined;
142
+ if (!sourcePath)
143
+ throw new Error("Missing source.tsx path");
144
+ if (!modelPath)
145
+ throw new Error("Missing --out path");
146
+ if (appModelFlag >= 0 && !appModelPath)
147
+ throw new Error("Missing --app-model path");
148
+ if (reportFlag >= 0 && !reportPath)
149
+ throw new Error("Missing --report path");
150
+ if (overlayFlag >= 0 && !overlayPath)
151
+ throw new Error("Missing --overlay path");
152
+ if (expectModelFlag >= 0 && !expectModelPath)
153
+ throw new Error("Missing --expect-model path");
154
+ if (configFlag >= 0 && !configPath)
155
+ throw new Error("Missing --config path");
156
+ if (packageJsonFlag >= 0 && !packageJsonPath)
157
+ throw new Error("Missing --package-json path");
158
+ if (args.includes("--disable-plugin") && disabledPlugins.length === 0)
159
+ throw new Error("Missing --disable-plugin id");
160
+ const result = await runExtractCommand({ sourcePath, modelPath, appModelPath, reportPath, overlayPath, expectModelPath, configPath, packageJsonPath, disabledPlugins, effectApis: effectApiFlags, explainDrift });
161
+ for (const line of result.lines)
162
+ console.log(line);
163
+ process.exit(0);
164
+ }
165
+ if (command === "replay") {
166
+ const reportFlag = args.indexOf("--report");
167
+ const statesFlag = args.indexOf("--states");
168
+ const observedFlag = args.indexOf("--observed");
169
+ const reportPath = reportFlag >= 0 ? args[reportFlag + 1] : undefined;
170
+ const statesPath = statesFlag >= 0 ? args[statesFlag + 1] : undefined;
171
+ const observedPath = observedFlag >= 0 ? args[observedFlag + 1] : undefined;
172
+ const tracePath = args.find((arg, index) => !arg.startsWith("--") && index !== reportFlag + 1 && index !== statesFlag + 1 && index !== observedFlag + 1);
173
+ if (!tracePath)
174
+ throw new Error("Missing trace.json path");
175
+ if (reportFlag >= 0 && !reportPath)
176
+ throw new Error("Missing --report path");
177
+ if (statesFlag >= 0 && !statesPath)
178
+ throw new Error("Missing --states path");
179
+ if (observedFlag >= 0 && !observedPath)
180
+ throw new Error("Missing --observed path");
181
+ const result = await runReplayCommand({ tracePath, statesPath, observedPath, reportPath });
182
+ for (const line of result.lines)
183
+ console.log(line);
184
+ process.exit(result.exitCode);
185
+ }
186
+ const reportFlag = args.indexOf("--report");
187
+ const overlayFlag = args.indexOf("--overlay");
188
+ const tracesFlag = args.indexOf("--traces");
189
+ const replayTestsFlag = args.indexOf("--replay-tests");
190
+ const actionReplayTestsFlag = args.indexOf("--action-replay-tests");
191
+ const statesFlag = args.indexOf("--states");
192
+ const reportPath = reportFlag >= 0 ? args[reportFlag + 1] : undefined;
193
+ const tracesDir = tracesFlag >= 0 ? args[tracesFlag + 1] : undefined;
194
+ const replayTestsDir = replayTestsFlag >= 0 ? args[replayTestsFlag + 1] : undefined;
195
+ const actionReplayTestsDir = actionReplayTestsFlag >= 0 ? args[actionReplayTestsFlag + 1] : undefined;
196
+ const statesPath = statesFlag >= 0 ? args[statesFlag + 1] : undefined;
197
+ const positional = args.filter((arg, index) => index !== reportFlag && index !== reportFlag + 1 && index !== overlayFlag && index !== overlayFlag + 1 && index !== tracesFlag && index !== tracesFlag + 1 && index !== replayTestsFlag && index !== replayTestsFlag + 1 && index !== actionReplayTestsFlag && index !== actionReplayTestsFlag + 1 && index !== statesFlag && index !== statesFlag + 1);
198
+ const [modelPath, propsPath] = positional;
199
+ const overlayPath = overlayFlag >= 0 ? args[overlayFlag + 1] : undefined;
200
+ if (!modelPath)
201
+ throw new Error("Missing model.json path");
202
+ if (reportFlag >= 0 && !reportPath)
203
+ throw new Error("Missing --report path");
204
+ if (overlayFlag >= 0 && !overlayPath)
205
+ throw new Error("Missing --overlay path");
206
+ if (tracesFlag >= 0 && !tracesDir)
207
+ throw new Error("Missing --traces path");
208
+ if (replayTestsFlag >= 0 && !replayTestsDir)
209
+ throw new Error("Missing --replay-tests path");
210
+ if (actionReplayTestsFlag >= 0 && !actionReplayTestsDir)
211
+ throw new Error("Missing --action-replay-tests path");
212
+ if (statesFlag >= 0 && !statesPath)
213
+ throw new Error("Missing --states path");
214
+ const result = await runCheckCommand({ modelPath, propsPath, reportPath, overlayPath, tracesDir, replayTestsDir, actionReplayTestsDir, statesPath });
215
+ for (const line of result.lines)
216
+ console.log(line);
217
+ process.exit(result.exitCode);
218
+ }
219
+ main().catch((error) => {
220
+ console.error(error instanceof Error ? error.message : String(error));
221
+ process.exit(1);
222
+ });
223
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/modality/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Model } from "modality-ts/kernel";
2
+ export declare function emitAppModel(model: Model): string;
3
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/modality/codegen/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,KAAK,EAAiC,MAAM,oBAAoB,CAAC;AAEnH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAejD"}
@@ -0,0 +1,59 @@
1
+ import { canonicalJson } from "modality-ts/kernel";
2
+ export function emitAppModel(model) {
3
+ return [
4
+ "import type { Model } from \"modality-ts/kernel\";",
5
+ "",
6
+ `export const M = ${canonicalJson(model)} as const satisfies Model;`,
7
+ "",
8
+ "export type AppState = {",
9
+ ...model.vars.map((decl) => ` ${quoteProperty(decl.id)}: ${typeForDomain(decl.domain)};`),
10
+ "};",
11
+ "",
12
+ "export type VarId = keyof AppState;",
13
+ "",
14
+ `export const initialState = ${canonicalJson(initialState(model.vars))} as const satisfies AppState;`,
15
+ ""
16
+ ].join("\n");
17
+ }
18
+ function typeForDomain(domain) {
19
+ switch (domain.kind) {
20
+ case "bool":
21
+ return "boolean";
22
+ case "enum":
23
+ return domain.values.length > 0 ? domain.values.map(stringLiteralType).join(" | ") : "never";
24
+ case "boundedInt":
25
+ return domain.min === domain.max ? JSON.stringify(domain.min) : "number";
26
+ case "option":
27
+ return `${typeForDomain(domain.inner)} | null`;
28
+ case "record":
29
+ return `{ ${Object.entries(domain.fields).map(([key, field]) => `${quoteProperty(key)}: ${typeForDomain(field)};`).join(" ")} }`;
30
+ case "tagged":
31
+ return Object.entries(domain.variants)
32
+ .map(([tagValue, variant]) => {
33
+ const body = variant.kind === "record"
34
+ ? Object.entries(variant.fields).map(([key, field]) => `${quoteProperty(key)}: ${typeForDomain(field)};`).join(" ")
35
+ : `value: ${typeForDomain(variant)};`;
36
+ return `{ ${quoteProperty(domain.tag)}: ${stringLiteralType(tagValue)}; ${body} }`;
37
+ })
38
+ .join(" | ") || "never";
39
+ case "tokens":
40
+ return domain.names?.length ? domain.names.map(stringLiteralType).join(" | ") : "string";
41
+ case "lengthCat":
42
+ return "\"0\" | \"1\" | \"many\"";
43
+ case "boundedList":
44
+ return `readonly ${parenthesizeIfUnion(typeForDomain(domain.inner))}[]`;
45
+ }
46
+ }
47
+ function initialState(vars) {
48
+ return Object.fromEntries(vars.map((decl) => [decl.id, decl.initial]));
49
+ }
50
+ function quoteProperty(value) {
51
+ return /^[A-Za-z_$][\w$]*$/.test(value) ? value : JSON.stringify(value);
52
+ }
53
+ function stringLiteralType(value) {
54
+ return JSON.stringify(value);
55
+ }
56
+ function parenthesizeIfUnion(value) {
57
+ return value.includes(" | ") ? `(${value})` : value;
58
+ }
59
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/modality/codegen/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type Trace } from "modality-ts/kernel";
2
+ export interface ReplayTestArtifact {
3
+ fileName: string;
4
+ source: string;
5
+ }
6
+ export declare function generateAbstractReplayTest(property: string, trace: Trace): ReplayTestArtifact;
7
+ export declare function generateActionReplayTest(property: string, trace: Trace): ReplayTestArtifact;
8
+ export declare function generateReplayHarness(): ReplayTestArtifact;
9
+ export declare function safeFileName(value: string): string;
10
+ //# sourceMappingURL=replay-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-test.d.ts","sourceRoot":"","sources":["../../../src/modality/codegen/replay-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,kBAAkB,CAmB7F;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,kBAAkB,CAmC3F;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,CA0C1D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -0,0 +1,104 @@
1
+ import { canonicalJson } from "modality-ts/kernel";
2
+ export function generateAbstractReplayTest(property, trace) {
3
+ const safeName = safeFileName(property);
4
+ return {
5
+ fileName: `${safeName}.replay.test.ts`,
6
+ source: [
7
+ `import { describe, expect, it } from "vitest";`,
8
+ `import { replayTrace, StateSequenceDriver, statesFromTrace } from "modality-ts/harness";`,
9
+ ``,
10
+ `const trace = ${canonicalJson(trace)};`,
11
+ ``,
12
+ `describe(${JSON.stringify(`replay ${property}`)}, () => {`,
13
+ ` it("reproduces the model trace", async () => {`,
14
+ ` const verdict = await replayTrace(trace, new StateSequenceDriver(statesFromTrace(trace)));`,
15
+ ` expect(verdict.status).toBe("reproduced");`,
16
+ ` });`,
17
+ `});`,
18
+ ``
19
+ ].join("\n")
20
+ };
21
+ }
22
+ export function generateActionReplayTest(property, trace) {
23
+ const safeName = safeFileName(property);
24
+ return {
25
+ fileName: `${safeName}.action.replay.test.ts`,
26
+ source: [
27
+ `/**`,
28
+ ` * @vitest-environment jsdom`,
29
+ ` */`,
30
+ `import { describe, expect, it } from "vitest";`,
31
+ `import { createDomReplayActor, ObservableActionReplayDriver, replayTrace } from "modality-ts/harness";`,
32
+ `import type { ModalityReplayHarness, ObservationSource } from "modality-ts/harness";`,
33
+ `import { observeModalityReplay, renderModalityReplay } from "./modality.replay.harness.js";`,
34
+ ``,
35
+ `const trace = ${canonicalJson(trace)};`,
36
+ `const observedVars = [...new Set(trace.steps.flatMap((step) => [...Object.keys(step.pre), ...Object.keys(step.post)]))];`,
37
+ ``,
38
+ `describe(${JSON.stringify(`replay ${property}`)}, () => {`,
39
+ ` it("drives the app through the model trace", async () => {`,
40
+ ` const replayHarness: ModalityReplayHarness = await renderModalityReplay(trace);`,
41
+ ` const observationSources: ObservationSource[] = [observeModalityReplay(replayHarness), ...(replayHarness.sources ?? [])];`,
42
+ ` const actor = createDomReplayActor({`,
43
+ ` document: replayHarness.document,`,
44
+ ` navigate: replayHarness.navigate,`,
45
+ ` resolve: replayHarness.resolve,`,
46
+ ` focusRevalidate: replayHarness.focusRevalidate,`,
47
+ ` timer: replayHarness.timer,`,
48
+ ` stabilize: replayHarness.stabilize`,
49
+ ` });`,
50
+ ` const verdict = await replayTrace(trace, new ObservableActionReplayDriver(actor, observedVars, observationSources));`,
51
+ ` expect(verdict.status).toBe("reproduced");`,
52
+ ` });`,
53
+ `});`,
54
+ ``
55
+ ].join("\n")
56
+ };
57
+ }
58
+ export function generateReplayHarness() {
59
+ return {
60
+ fileName: "modality.replay.harness.ts",
61
+ source: [
62
+ `import { observationSource, type ModalityReplayHarness, type ObservationSource } from "modality-ts/harness";`,
63
+ `import type { Trace } from "modality-ts/kernel";`,
64
+ ``,
65
+ `declare global {`,
66
+ ` var __modalityRenderReplayApp: ((trace: Trace) => Partial<ModalityReplayHarness> | Promise<Partial<ModalityReplayHarness>>) | undefined;`,
67
+ `}`,
68
+ ``,
69
+ `export async function renderModalityReplay(trace: Trace): Promise<ModalityReplayHarness> {`,
70
+ ` const appHarness = await globalThis.__modalityRenderReplayApp?.(trace);`,
71
+ ` return {`,
72
+ ` document: globalThis.document,`,
73
+ ` stabilize: async () => Promise.resolve(),`,
74
+ ` ...(appHarness ?? {})`,
75
+ ` };`,
76
+ `}`,
77
+ ``,
78
+ `export function observeModalityReplay(_harness: ModalityReplayHarness): ObservationSource {`,
79
+ ` return observationSource("dom-projection", (varId) => {`,
80
+ ` const element = globalThis.document?.querySelector(\`[data-modality-var="\${cssString(varId)}"]\`);`,
81
+ ` if (!element) return "unobservable";`,
82
+ ` return { value: parseObservedValue(element.textContent ?? "") };`,
83
+ ` });`,
84
+ `}`,
85
+ ``,
86
+ `function parseObservedValue(text: string): unknown {`,
87
+ ` try {`,
88
+ ` return JSON.parse(text);`,
89
+ ` } catch {`,
90
+ ` return text;`,
91
+ ` }`,
92
+ `}`,
93
+ ``,
94
+ `function cssString(value: string): string {`,
95
+ ` return value.replace(/["\\\\]/g, "\\\\$&");`,
96
+ `}`,
97
+ ``
98
+ ].join("\n")
99
+ };
100
+ }
101
+ export function safeFileName(value) {
102
+ return value.replace(/[^a-zA-Z0-9._-]+/g, "_");
103
+ }
104
+ //# sourceMappingURL=replay-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-test.js","sourceRoot":"","sources":["../../../src/modality/codegen/replay-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAc,MAAM,oBAAoB,CAAC;AAO/D,MAAM,UAAU,0BAA0B,CAAC,QAAgB,EAAE,KAAY;IACvE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO;QACL,QAAQ,EAAE,GAAG,QAAQ,iBAAiB;QACtC,MAAM,EAAE;YACN,gDAAgD;YAChD,0FAA0F;YAC1F,EAAE;YACF,iBAAiB,aAAa,CAAC,KAAK,CAAC,GAAG;YACxC,EAAE;YACF,YAAY,IAAI,CAAC,SAAS,CAAC,UAAU,QAAQ,EAAE,CAAC,WAAW;YAC3D,kDAAkD;YAClD,gGAAgG;YAChG,gDAAgD;YAChD,OAAO;YACP,KAAK;YACL,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAgB,EAAE,KAAY;IACrE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO;QACL,QAAQ,EAAE,GAAG,QAAQ,wBAAwB;QAC7C,MAAM,EAAE;YACN,KAAK;YACL,8BAA8B;YAC9B,KAAK;YACL,gDAAgD;YAChD,wGAAwG;YACxG,sFAAsF;YACtF,6FAA6F;YAC7F,EAAE;YACF,iBAAiB,aAAa,CAAC,KAAK,CAAC,GAAG;YACxC,0HAA0H;YAC1H,EAAE;YACF,YAAY,IAAI,CAAC,SAAS,CAAC,UAAU,QAAQ,EAAE,CAAC,WAAW;YAC3D,8DAA8D;YAC9D,qFAAqF;YACrF,+HAA+H;YAC/H,0CAA0C;YAC1C,yCAAyC;YACzC,yCAAyC;YACzC,uCAAuC;YACvC,uDAAuD;YACvD,mCAAmC;YACnC,0CAA0C;YAC1C,SAAS;YACT,0HAA0H;YAC1H,gDAAgD;YAChD,OAAO;YACP,KAAK;YACL,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,QAAQ,EAAE,4BAA4B;QACtC,MAAM,EAAE;YACN,8GAA8G;YAC9G,kDAAkD;YAClD,EAAE;YACF,kBAAkB;YAClB,4IAA4I;YAC5I,GAAG;YACH,EAAE;YACF,4FAA4F;YAC5F,2EAA2E;YAC3E,YAAY;YACZ,oCAAoC;YACpC,+CAA+C;YAC/C,2BAA2B;YAC3B,MAAM;YACN,GAAG;YACH,EAAE;YACF,6FAA6F;YAC7F,2DAA2D;YAC3D,yGAAyG;YACzG,0CAA0C;YAC1C,sEAAsE;YACtE,OAAO;YACP,GAAG;YACH,EAAE;YACF,sDAAsD;YACtD,SAAS;YACT,8BAA8B;YAC9B,aAAa;YACb,kBAAkB;YAClB,KAAK;YACL,GAAG;YACH,EAAE;YACF,6CAA6C;YAC7C,+CAA+C;YAC/C,GAAG;YACH,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { generateConformWalks, runConformCommand } from "./features/conform/index.js";
2
+ export type { ConformCommandOptions, ConformCommandResult } from "./features/conform/index.js";
3
+ //# sourceMappingURL=conform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conform.d.ts","sourceRoot":"","sources":["../../src/modality/conform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACtF,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { generateConformWalks, runConformCommand } from "./features/conform/index.js";
2
+ //# sourceMappingURL=conform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conform.js","sourceRoot":"","sources":["../../src/modality/conform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { generateTlaModule, runExportTlaCommand } from "./features/export/index.js";
2
+ export type { ExportTlaCommandOptions, ExportTlaCommandResult } from "./features/export/index.js";
3
+ //# sourceMappingURL=export-tla.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-tla.d.ts","sourceRoot":"","sources":["../../src/modality/export-tla.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACpF,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { generateTlaModule, runExportTlaCommand } from "./features/export/index.js";
2
+ //# sourceMappingURL=export-tla.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-tla.js","sourceRoot":"","sources":["../../src/modality/export-tla.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { runExtractCommand } from "./features/extract/index.js";
2
+ export type { ExtractCommandOptions, ExtractCommandResult, ModalityConfig } from "./features/extract/index.js";
3
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/modality/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { runExtractCommand } from "./features/extract/index.js";
2
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/modality/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type CheckResult } from "modality-ts/checker";
2
+ import { type CheckReport, type Model } from "modality-ts/kernel";
3
+ export interface CheckCommandOptions {
4
+ modelPath: string;
5
+ propsPath?: string;
6
+ reportPath?: string;
7
+ overlayPath?: string;
8
+ tracesDir?: string;
9
+ replayTestsDir?: string;
10
+ actionReplayTestsDir?: string;
11
+ statesPath?: string;
12
+ now?: Date;
13
+ }
14
+ export interface CheckCommandResult {
15
+ check: CheckResult;
16
+ report: CheckReport;
17
+ exitCode: number;
18
+ lines: string[];
19
+ }
20
+ export declare function runCheckCommand(options: CheckCommandOptions): Promise<CheckCommandResult>;
21
+ export declare function createCheckReport(model: Model, check: CheckResult, now: Date, overlayWarnings?: readonly string[], ignoredVars?: readonly string[]): CheckReport;
22
+ export declare function renderCheckResult(check: CheckResult): string[];
23
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/modality/features/check/command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,WAAW,EAAwB,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAoD,KAAK,WAAW,EAA0B,KAAK,KAAK,EAAoC,MAAM,oBAAoB,CAAC;AAI9K,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuB/F;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,GAAE,SAAS,MAAM,EAAO,EAAE,WAAW,GAAE,SAAS,MAAM,EAAO,GAAG,WAAW,CA2BxK;AAgBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAa9D"}