@virune/compiler 1.1.0-rc.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 (300) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +2 -0
  3. package/dist/src/analysis/control-flow.d.ts +9 -0
  4. package/dist/src/analysis/control-flow.d.ts.map +1 -0
  5. package/dist/src/analysis/control-flow.js +47 -0
  6. package/dist/src/analysis/control-flow.js.map +1 -0
  7. package/dist/src/ast/nodes.d.ts +495 -0
  8. package/dist/src/ast/nodes.d.ts.map +1 -0
  9. package/dist/src/ast/nodes.js +2 -0
  10. package/dist/src/ast/nodes.js.map +1 -0
  11. package/dist/src/binder/symbols.d.ts +36 -0
  12. package/dist/src/binder/symbols.d.ts.map +1 -0
  13. package/dist/src/binder/symbols.js +30 -0
  14. package/dist/src/binder/symbols.js.map +1 -0
  15. package/dist/src/checker/builtin-members.d.ts +4 -0
  16. package/dist/src/checker/builtin-members.d.ts.map +1 -0
  17. package/dist/src/checker/builtin-members.js +175 -0
  18. package/dist/src/checker/builtin-members.js.map +1 -0
  19. package/dist/src/checker/checker.d.ts +148 -0
  20. package/dist/src/checker/checker.d.ts.map +1 -0
  21. package/dist/src/checker/checker.js +2985 -0
  22. package/dist/src/checker/checker.js.map +1 -0
  23. package/dist/src/checker/effect-registry.d.ts +14 -0
  24. package/dist/src/checker/effect-registry.d.ts.map +1 -0
  25. package/dist/src/checker/effect-registry.js +11 -0
  26. package/dist/src/checker/effect-registry.js.map +1 -0
  27. package/dist/src/checker/type-operations.d.ts +27 -0
  28. package/dist/src/checker/type-operations.d.ts.map +1 -0
  29. package/dist/src/checker/type-operations.js +268 -0
  30. package/dist/src/checker/type-operations.js.map +1 -0
  31. package/dist/src/codegen/emitter.d.ts +83 -0
  32. package/dist/src/codegen/emitter.d.ts.map +1 -0
  33. package/dist/src/codegen/emitter.js +1029 -0
  34. package/dist/src/codegen/emitter.js.map +1 -0
  35. package/dist/src/codegen/helpers.d.ts +7 -0
  36. package/dist/src/codegen/helpers.d.ts.map +1 -0
  37. package/dist/src/codegen/helpers.js +48 -0
  38. package/dist/src/codegen/helpers.js.map +1 -0
  39. package/dist/src/codegen/runtime-imports.d.ts +6 -0
  40. package/dist/src/codegen/runtime-imports.d.ts.map +1 -0
  41. package/dist/src/codegen/runtime-imports.js +45 -0
  42. package/dist/src/codegen/runtime-imports.js.map +1 -0
  43. package/dist/src/codegen/writer.d.ts +14 -0
  44. package/dist/src/codegen/writer.d.ts.map +1 -0
  45. package/dist/src/codegen/writer.js +56 -0
  46. package/dist/src/codegen/writer.js.map +1 -0
  47. package/dist/src/compiler.d.ts +24 -0
  48. package/dist/src/compiler.d.ts.map +1 -0
  49. package/dist/src/compiler.js +97 -0
  50. package/dist/src/compiler.js.map +1 -0
  51. package/dist/src/diagnostics/codes.d.ts +18 -0
  52. package/dist/src/diagnostics/codes.d.ts.map +1 -0
  53. package/dist/src/diagnostics/codes.js +43 -0
  54. package/dist/src/diagnostics/codes.js.map +1 -0
  55. package/dist/src/diagnostics/diagnostic.d.ts +41 -0
  56. package/dist/src/diagnostics/diagnostic.d.ts.map +1 -0
  57. package/dist/src/diagnostics/diagnostic.js +50 -0
  58. package/dist/src/diagnostics/diagnostic.js.map +1 -0
  59. package/dist/src/diagnostics/render.d.ts +44 -0
  60. package/dist/src/diagnostics/render.d.ts.map +1 -0
  61. package/dist/src/diagnostics/render.js +44 -0
  62. package/dist/src/diagnostics/render.js.map +1 -0
  63. package/dist/src/experimental-api.d.ts +19 -0
  64. package/dist/src/experimental-api.d.ts.map +1 -0
  65. package/dist/src/experimental-api.js +17 -0
  66. package/dist/src/experimental-api.js.map +1 -0
  67. package/dist/src/hir/lower.d.ts +6 -0
  68. package/dist/src/hir/lower.d.ts.map +1 -0
  69. package/dist/src/hir/lower.js +124 -0
  70. package/dist/src/hir/lower.js.map +1 -0
  71. package/dist/src/hir/nodes.d.ts +12 -0
  72. package/dist/src/hir/nodes.d.ts.map +1 -0
  73. package/dist/src/hir/nodes.js +2 -0
  74. package/dist/src/hir/nodes.js.map +1 -0
  75. package/dist/src/index.d.ts +2 -0
  76. package/dist/src/index.d.ts.map +1 -0
  77. package/dist/src/index.js +2 -0
  78. package/dist/src/index.js.map +1 -0
  79. package/dist/src/interop/checked-api.d.ts +21 -0
  80. package/dist/src/interop/checked-api.d.ts.map +1 -0
  81. package/dist/src/interop/checked-api.js +46 -0
  82. package/dist/src/interop/checked-api.js.map +1 -0
  83. package/dist/src/interop/decision.d.ts +24 -0
  84. package/dist/src/interop/decision.d.ts.map +1 -0
  85. package/dist/src/interop/decision.js +96 -0
  86. package/dist/src/interop/decision.js.map +1 -0
  87. package/dist/src/interop/frontend-component-emission.d.ts +17 -0
  88. package/dist/src/interop/frontend-component-emission.d.ts.map +1 -0
  89. package/dist/src/interop/frontend-component-emission.js +271 -0
  90. package/dist/src/interop/frontend-component-emission.js.map +1 -0
  91. package/dist/src/interop/jsx-view-validation.d.ts +20 -0
  92. package/dist/src/interop/jsx-view-validation.d.ts.map +1 -0
  93. package/dist/src/interop/jsx-view-validation.js +847 -0
  94. package/dist/src/interop/jsx-view-validation.js.map +1 -0
  95. package/dist/src/interop/operation-api.d.ts +32 -0
  96. package/dist/src/interop/operation-api.d.ts.map +1 -0
  97. package/dist/src/interop/operation-api.js +61 -0
  98. package/dist/src/interop/operation-api.js.map +1 -0
  99. package/dist/src/interop/operation.d.ts +136 -0
  100. package/dist/src/interop/operation.d.ts.map +1 -0
  101. package/dist/src/interop/operation.js +575 -0
  102. package/dist/src/interop/operation.js.map +1 -0
  103. package/dist/src/interop/repetition-host-locator.d.ts +25 -0
  104. package/dist/src/interop/repetition-host-locator.d.ts.map +1 -0
  105. package/dist/src/interop/repetition-host-locator.js +61 -0
  106. package/dist/src/interop/repetition-host-locator.js.map +1 -0
  107. package/dist/src/interop/repetition-host-usage-validation.d.ts +11 -0
  108. package/dist/src/interop/repetition-host-usage-validation.d.ts.map +1 -0
  109. package/dist/src/interop/repetition-host-usage-validation.js +89 -0
  110. package/dist/src/interop/repetition-host-usage-validation.js.map +1 -0
  111. package/dist/src/interop/types.d.ts +365 -0
  112. package/dist/src/interop/types.d.ts.map +1 -0
  113. package/dist/src/interop/types.js +2 -0
  114. package/dist/src/interop/types.js.map +1 -0
  115. package/dist/src/mir/lower.d.ts +4 -0
  116. package/dist/src/mir/lower.d.ts.map +1 -0
  117. package/dist/src/mir/lower.js +131 -0
  118. package/dist/src/mir/lower.js.map +1 -0
  119. package/dist/src/mir/nodes.d.ts +36 -0
  120. package/dist/src/mir/nodes.d.ts.map +1 -0
  121. package/dist/src/mir/nodes.js +2 -0
  122. package/dist/src/mir/nodes.js.map +1 -0
  123. package/dist/src/project/incremental.d.ts +9 -0
  124. package/dist/src/project/incremental.d.ts.map +1 -0
  125. package/dist/src/project/incremental.js +15 -0
  126. package/dist/src/project/incremental.js.map +1 -0
  127. package/dist/src/project/project.d.ts +98 -0
  128. package/dist/src/project/project.d.ts.map +1 -0
  129. package/dist/src/project/project.js +884 -0
  130. package/dist/src/project/project.js.map +1 -0
  131. package/dist/src/public-api.d.ts +45 -0
  132. package/dist/src/public-api.d.ts.map +1 -0
  133. package/dist/src/public-api.js +37 -0
  134. package/dist/src/public-api.js.map +1 -0
  135. package/dist/src/reference/evaluator.d.ts +13 -0
  136. package/dist/src/reference/evaluator.d.ts.map +1 -0
  137. package/dist/src/reference/evaluator.js +304 -0
  138. package/dist/src/reference/evaluator.js.map +1 -0
  139. package/dist/src/selfhost/bootstrap-artifact-normalizer.d.ts +65 -0
  140. package/dist/src/selfhost/bootstrap-artifact-normalizer.d.ts.map +1 -0
  141. package/dist/src/selfhost/bootstrap-artifact-normalizer.js +226 -0
  142. package/dist/src/selfhost/bootstrap-artifact-normalizer.js.map +1 -0
  143. package/dist/src/selfhost/bootstrap-artifact-snapshot.d.ts +23 -0
  144. package/dist/src/selfhost/bootstrap-artifact-snapshot.d.ts.map +1 -0
  145. package/dist/src/selfhost/bootstrap-artifact-snapshot.js +122 -0
  146. package/dist/src/selfhost/bootstrap-artifact-snapshot.js.map +1 -0
  147. package/dist/src/selfhost/bootstrap-compiler-selection.d.ts +36 -0
  148. package/dist/src/selfhost/bootstrap-compiler-selection.d.ts.map +1 -0
  149. package/dist/src/selfhost/bootstrap-compiler-selection.js +52 -0
  150. package/dist/src/selfhost/bootstrap-compiler-selection.js.map +1 -0
  151. package/dist/src/selfhost/bootstrap-execution-probe.d.ts +42 -0
  152. package/dist/src/selfhost/bootstrap-execution-probe.d.ts.map +1 -0
  153. package/dist/src/selfhost/bootstrap-execution-probe.js +115 -0
  154. package/dist/src/selfhost/bootstrap-execution-probe.js.map +1 -0
  155. package/dist/src/selfhost/bootstrap-rollback-decision.d.ts +40 -0
  156. package/dist/src/selfhost/bootstrap-rollback-decision.d.ts.map +1 -0
  157. package/dist/src/selfhost/bootstrap-rollback-decision.js +144 -0
  158. package/dist/src/selfhost/bootstrap-rollback-decision.js.map +1 -0
  159. package/dist/src/selfhost/bootstrap-shadow-history.d.ts +49 -0
  160. package/dist/src/selfhost/bootstrap-shadow-history.d.ts.map +1 -0
  161. package/dist/src/selfhost/bootstrap-shadow-history.js +348 -0
  162. package/dist/src/selfhost/bootstrap-shadow-history.js.map +1 -0
  163. package/dist/src/selfhost/bootstrap-shadow-report.d.ts +43 -0
  164. package/dist/src/selfhost/bootstrap-shadow-report.d.ts.map +1 -0
  165. package/dist/src/selfhost/bootstrap-shadow-report.js +94 -0
  166. package/dist/src/selfhost/bootstrap-shadow-report.js.map +1 -0
  167. package/dist/src/selfhost/bootstrap-stage-executor.d.ts +53 -0
  168. package/dist/src/selfhost/bootstrap-stage-executor.d.ts.map +1 -0
  169. package/dist/src/selfhost/bootstrap-stage-executor.js +159 -0
  170. package/dist/src/selfhost/bootstrap-stage-executor.js.map +1 -0
  171. package/dist/src/selfhost/bootstrap-stage-loader.d.ts +14 -0
  172. package/dist/src/selfhost/bootstrap-stage-loader.d.ts.map +1 -0
  173. package/dist/src/selfhost/bootstrap-stage-loader.js +112 -0
  174. package/dist/src/selfhost/bootstrap-stage-loader.js.map +1 -0
  175. package/dist/src/selfhost/bootstrap-stage-pipeline.d.ts +8 -0
  176. package/dist/src/selfhost/bootstrap-stage-pipeline.d.ts.map +1 -0
  177. package/dist/src/selfhost/bootstrap-stage-pipeline.js +85 -0
  178. package/dist/src/selfhost/bootstrap-stage-pipeline.js.map +1 -0
  179. package/dist/src/selfhost/bootstrap-stage-runner.d.ts +47 -0
  180. package/dist/src/selfhost/bootstrap-stage-runner.d.ts.map +1 -0
  181. package/dist/src/selfhost/bootstrap-stage-runner.js +106 -0
  182. package/dist/src/selfhost/bootstrap-stage-runner.js.map +1 -0
  183. package/dist/src/selfhost/clean-bootstrap-evidence.d.ts +83 -0
  184. package/dist/src/selfhost/clean-bootstrap-evidence.d.ts.map +1 -0
  185. package/dist/src/selfhost/clean-bootstrap-evidence.js +233 -0
  186. package/dist/src/selfhost/clean-bootstrap-evidence.js.map +1 -0
  187. package/dist/src/selfhost/compiler-facade.d.ts +33 -0
  188. package/dist/src/selfhost/compiler-facade.d.ts.map +1 -0
  189. package/dist/src/selfhost/compiler-facade.js +65 -0
  190. package/dist/src/selfhost/compiler-facade.js.map +1 -0
  191. package/dist/src/selfhost/contract.d.ts +151 -0
  192. package/dist/src/selfhost/contract.d.ts.map +1 -0
  193. package/dist/src/selfhost/contract.js +335 -0
  194. package/dist/src/selfhost/contract.js.map +1 -0
  195. package/dist/src/selfhost/differential-artifacts.d.ts +8 -0
  196. package/dist/src/selfhost/differential-artifacts.d.ts.map +1 -0
  197. package/dist/src/selfhost/differential-artifacts.js +50 -0
  198. package/dist/src/selfhost/differential-artifacts.js.map +1 -0
  199. package/dist/src/selfhost/differential-harness.d.ts +91 -0
  200. package/dist/src/selfhost/differential-harness.d.ts.map +1 -0
  201. package/dist/src/selfhost/differential-harness.js +246 -0
  202. package/dist/src/selfhost/differential-harness.js.map +1 -0
  203. package/dist/src/selfhost/full-language-inventory-runner.d.ts +49 -0
  204. package/dist/src/selfhost/full-language-inventory-runner.d.ts.map +1 -0
  205. package/dist/src/selfhost/full-language-inventory-runner.js +225 -0
  206. package/dist/src/selfhost/full-language-inventory-runner.js.map +1 -0
  207. package/dist/src/selfhost/full-language-inventory.d.ts +42 -0
  208. package/dist/src/selfhost/full-language-inventory.d.ts.map +1 -0
  209. package/dist/src/selfhost/full-language-inventory.js +163 -0
  210. package/dist/src/selfhost/full-language-inventory.js.map +1 -0
  211. package/dist/src/selfhost/interop-resolution-witness.d.ts +35 -0
  212. package/dist/src/selfhost/interop-resolution-witness.d.ts.map +1 -0
  213. package/dist/src/selfhost/interop-resolution-witness.js +186 -0
  214. package/dist/src/selfhost/interop-resolution-witness.js.map +1 -0
  215. package/dist/src/selfhost/kernel-model-host-adapter.d.ts +28 -0
  216. package/dist/src/selfhost/kernel-model-host-adapter.d.ts.map +1 -0
  217. package/dist/src/selfhost/kernel-model-host-adapter.js +36 -0
  218. package/dist/src/selfhost/kernel-model-host-adapter.js.map +1 -0
  219. package/dist/src/selfhost/legacy-adapter.d.ts +8 -0
  220. package/dist/src/selfhost/legacy-adapter.d.ts.map +1 -0
  221. package/dist/src/selfhost/legacy-adapter.js +186 -0
  222. package/dist/src/selfhost/legacy-adapter.js.map +1 -0
  223. package/dist/src/selfhost/module-graph.d.ts +57 -0
  224. package/dist/src/selfhost/module-graph.d.ts.map +1 -0
  225. package/dist/src/selfhost/module-graph.js +267 -0
  226. package/dist/src/selfhost/module-graph.js.map +1 -0
  227. package/dist/src/selfhost/mvp-adapter.d.ts +19 -0
  228. package/dist/src/selfhost/mvp-adapter.d.ts.map +1 -0
  229. package/dist/src/selfhost/mvp-adapter.js +186 -0
  230. package/dist/src/selfhost/mvp-adapter.js.map +1 -0
  231. package/dist/src/selfhost/node-executor.d.ts +6 -0
  232. package/dist/src/selfhost/node-executor.d.ts.map +1 -0
  233. package/dist/src/selfhost/node-executor.js +138 -0
  234. package/dist/src/selfhost/node-executor.js.map +1 -0
  235. package/dist/src/selfhost/project-compiler-adapter.d.ts +77 -0
  236. package/dist/src/selfhost/project-compiler-adapter.d.ts.map +1 -0
  237. package/dist/src/selfhost/project-compiler-adapter.js +358 -0
  238. package/dist/src/selfhost/project-compiler-adapter.js.map +1 -0
  239. package/dist/src/selfhost/project-differential-adapter.d.ts +15 -0
  240. package/dist/src/selfhost/project-differential-adapter.d.ts.map +1 -0
  241. package/dist/src/selfhost/project-differential-adapter.js +65 -0
  242. package/dist/src/selfhost/project-differential-adapter.js.map +1 -0
  243. package/dist/src/selfhost/promotion-evidence.d.ts +62 -0
  244. package/dist/src/selfhost/promotion-evidence.d.ts.map +1 -0
  245. package/dist/src/selfhost/promotion-evidence.js +332 -0
  246. package/dist/src/selfhost/promotion-evidence.js.map +1 -0
  247. package/dist/src/selfhost/promotion-policy-replay-v2.d.ts +54 -0
  248. package/dist/src/selfhost/promotion-policy-replay-v2.d.ts.map +1 -0
  249. package/dist/src/selfhost/promotion-policy-replay-v2.js +343 -0
  250. package/dist/src/selfhost/promotion-policy-replay-v2.js.map +1 -0
  251. package/dist/src/selfhost/promotion-shadow-history-v2.d.ts +55 -0
  252. package/dist/src/selfhost/promotion-shadow-history-v2.d.ts.map +1 -0
  253. package/dist/src/selfhost/promotion-shadow-history-v2.js +227 -0
  254. package/dist/src/selfhost/promotion-shadow-history-v2.js.map +1 -0
  255. package/dist/src/selfhost/promotion-subject.d.ts +34 -0
  256. package/dist/src/selfhost/promotion-subject.d.ts.map +1 -0
  257. package/dist/src/selfhost/promotion-subject.js +141 -0
  258. package/dist/src/selfhost/promotion-subject.js.map +1 -0
  259. package/dist/src/selfhost/source-manifest.d.ts +31 -0
  260. package/dist/src/selfhost/source-manifest.d.ts.map +1 -0
  261. package/dist/src/selfhost/source-manifest.js +194 -0
  262. package/dist/src/selfhost/source-manifest.js.map +1 -0
  263. package/dist/src/selfhost/stage-compiler-facade.d.ts +25 -0
  264. package/dist/src/selfhost/stage-compiler-facade.d.ts.map +1 -0
  265. package/dist/src/selfhost/stage-compiler-facade.js +100 -0
  266. package/dist/src/selfhost/stage-compiler-facade.js.map +1 -0
  267. package/dist/src/semantic-evidence/snapshot.d.ts +114 -0
  268. package/dist/src/semantic-evidence/snapshot.d.ts.map +1 -0
  269. package/dist/src/semantic-evidence/snapshot.js +336 -0
  270. package/dist/src/semantic-evidence/snapshot.js.map +1 -0
  271. package/dist/src/source.d.ts +25 -0
  272. package/dist/src/source.d.ts.map +1 -0
  273. package/dist/src/source.js +10 -0
  274. package/dist/src/source.js.map +1 -0
  275. package/dist/src/syntax/cst-to-ast.d.ts +108 -0
  276. package/dist/src/syntax/cst-to-ast.d.ts.map +1 -0
  277. package/dist/src/syntax/cst-to-ast.js +383 -0
  278. package/dist/src/syntax/cst-to-ast.js.map +1 -0
  279. package/dist/src/syntax/documentation.d.ts +11 -0
  280. package/dist/src/syntax/documentation.d.ts.map +1 -0
  281. package/dist/src/syntax/documentation.js +261 -0
  282. package/dist/src/syntax/documentation.js.map +1 -0
  283. package/dist/src/syntax/parser.d.ts +114 -0
  284. package/dist/src/syntax/parser.d.ts.map +1 -0
  285. package/dist/src/syntax/parser.js +970 -0
  286. package/dist/src/syntax/parser.js.map +1 -0
  287. package/dist/src/syntax/syntax-metadata.d.ts +8 -0
  288. package/dist/src/syntax/syntax-metadata.d.ts.map +1 -0
  289. package/dist/src/syntax/syntax-metadata.js +14 -0
  290. package/dist/src/syntax/syntax-metadata.js.map +1 -0
  291. package/dist/src/syntax/tokens.d.ts +96 -0
  292. package/dist/src/syntax/tokens.d.ts.map +1 -0
  293. package/dist/src/syntax/tokens.js +260 -0
  294. package/dist/src/syntax/tokens.js.map +1 -0
  295. package/dist/src/types/types.d.ts +97 -0
  296. package/dist/src/types/types.d.ts.map +1 -0
  297. package/dist/src/types/types.js +105 -0
  298. package/dist/src/types/types.js.map +1 -0
  299. package/package.json +47 -0
  300. package/schema/diagnostics-v1.schema.json +75 -0
@@ -0,0 +1,115 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
3
+ import { dirname, join } from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { buildProject } from '../project/project.js';
6
+ import { normalizeKernelPath, validateKernelInput, } from './contract.js';
7
+ import { snapshotProjectBuild, } from './bootstrap-artifact-snapshot.js';
8
+ import { compileWithSelfhostMvp, } from './mvp-adapter.js';
9
+ export const BOOTSTRAP_EXECUTION_PROBE_VERSION = 1;
10
+ /**
11
+ * Build the current Self-host MVP with Stage 0, load the emitted compiler as an
12
+ * executable candidate, and compile one canonical Kernel Contract input.
13
+ *
14
+ * This is deliberately an execution probe. It does not claim that the emitted
15
+ * compiler rebuilt its own multi-module source tree, produced Stage 1/2, or is
16
+ * eligible for production promotion.
17
+ */
18
+ export async function runBootstrapExecutionProbe(projectRoot, value, options) {
19
+ const input = validateKernelInput(value);
20
+ const build = await buildProject(projectRoot, { write: false });
21
+ const compilerArtifact = snapshotProjectBuild(build, {
22
+ ...options,
23
+ stage: 'stage0',
24
+ });
25
+ const temporaryDirectory = await materializeBootstrapCompilerCandidate(compilerArtifact, options.temporaryRoot);
26
+ try {
27
+ const module = await loadBootstrapCompilerCandidate(temporaryDirectory, options.entryModulePath ?? 'dist/main.js');
28
+ const output = await compileWithSelfhostMvp(module, input);
29
+ const artifact = createProbeArtifact(compilerArtifact, input, output);
30
+ const serialized = JSON.stringify(canonicalizeJson(artifact));
31
+ return {
32
+ compilerArtifact,
33
+ output,
34
+ artifact,
35
+ serialized,
36
+ sha256: sha256(serialized),
37
+ };
38
+ }
39
+ finally {
40
+ await rm(temporaryDirectory, { recursive: true, force: true });
41
+ }
42
+ }
43
+ export function validateSelfhostMvpModule(value) {
44
+ if (value === null || typeof value !== 'object') {
45
+ throw new Error('Bootstrap compiler candidate must be an ES module object');
46
+ }
47
+ const compileMvp = value.compileMvp;
48
+ if (typeof compileMvp !== 'function') {
49
+ throw new Error('Bootstrap compiler candidate must export compileMvp');
50
+ }
51
+ return value;
52
+ }
53
+ /** Materialize a normalized compiler artifact without changing repository outputs. */
54
+ export async function materializeBootstrapCompilerCandidate(compilerArtifact, temporaryRoot) {
55
+ await mkdir(temporaryRoot, { recursive: true });
56
+ const root = await mkdtemp(join(temporaryRoot, 'selfhost-bootstrap-candidate-'));
57
+ try {
58
+ for (const module of compilerArtifact.artifact.modules) {
59
+ const outputPath = join(root, module.path);
60
+ await mkdir(dirname(outputPath), { recursive: true });
61
+ await writeFile(outputPath, module.code, 'utf8');
62
+ }
63
+ return root;
64
+ }
65
+ catch (error) {
66
+ await rm(root, { recursive: true, force: true });
67
+ throw error;
68
+ }
69
+ }
70
+ /** Load the declared compiler entry from an isolated materialized artifact. */
71
+ export async function loadBootstrapCompilerCandidate(root, entryModulePath) {
72
+ const canonicalEntryPath = normalizeKernelPath(entryModulePath, '$.entryModulePath');
73
+ if (!canonicalEntryPath.endsWith('.js'))
74
+ throw new Error('Bootstrap compiler entry module must be JavaScript');
75
+ const moduleUrl = new URL(pathToFileURL(join(root, canonicalEntryPath)).href);
76
+ moduleUrl.searchParams.set('probe', `${Date.now()}-${Math.random()}`);
77
+ return validateSelfhostMvpModule(await import(moduleUrl.href));
78
+ }
79
+ function createProbeArtifact(compilerArtifact, input, output) {
80
+ return {
81
+ policyVersion: BOOTSTRAP_EXECUTION_PROBE_VERSION,
82
+ claim: 'stage0-compiler-execution-probe',
83
+ productionEligible: false,
84
+ compilerArtifactSha256: compilerArtifact.sha256,
85
+ inputSha256: sha256(JSON.stringify(canonicalizeJson(input))),
86
+ outputSha256: sha256(JSON.stringify(canonicalizeJson(output))),
87
+ accepted: output.accepted,
88
+ diagnosticCodes: output.diagnostics.map(diagnostic => diagnostic.code),
89
+ emittedModulePaths: output.emittedModules.map(module => module.outputPath),
90
+ };
91
+ }
92
+ function canonicalizeJson(value) {
93
+ if (value === null || typeof value === 'string' || typeof value === 'boolean')
94
+ return value;
95
+ if (typeof value === 'number') {
96
+ if (!Number.isFinite(value))
97
+ throw new Error('Probe evidence contains a non-finite number');
98
+ return value;
99
+ }
100
+ if (Array.isArray(value))
101
+ return value.map(item => canonicalizeJson(item));
102
+ const objectValue = value;
103
+ const output = {};
104
+ for (const key of Object.keys(objectValue).sort()) {
105
+ const child = objectValue[key];
106
+ if (child === undefined)
107
+ throw new Error(`Probe evidence field ${key} is undefined`);
108
+ output[key] = canonicalizeJson(child);
109
+ }
110
+ return output;
111
+ }
112
+ function sha256(value) {
113
+ return createHash('sha256').update(value).digest('hex');
114
+ }
115
+ //# sourceMappingURL=bootstrap-execution-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap-execution-probe.js","sourceRoot":"","sources":["../../../src/selfhost/bootstrap-execution-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export declare const BOOTSTRAP_ROLLBACK_DECISION_VERSION: 1;
2
+ export declare const REQUIRED_ROLLBACK_GATES: readonly ["bootstrap-determinism", "legacy-compatibility", "runtime-behaviour", "performance", "clean-bootstrap", "rollback-smoke"];
3
+ export type RollbackGateName = typeof REQUIRED_ROLLBACK_GATES[number];
4
+ export interface RollbackGateEvidenceInput {
5
+ readonly name: RollbackGateName;
6
+ readonly candidateSha256: string;
7
+ readonly checkedAt: string;
8
+ readonly status: 'pass' | 'fail';
9
+ readonly evidenceSha256: string;
10
+ }
11
+ export interface BootstrapRollbackDecisionInput {
12
+ readonly version: typeof BOOTSTRAP_ROLLBACK_DECISION_VERSION;
13
+ readonly candidateVersion: string;
14
+ readonly candidateSha256: string;
15
+ readonly releaseVersion: string;
16
+ readonly evaluatedAt: string;
17
+ readonly maximumEvidenceAgeSeconds: number;
18
+ readonly gates: readonly RollbackGateEvidenceInput[];
19
+ }
20
+ export interface BootstrapRollbackReason {
21
+ readonly gate: RollbackGateName;
22
+ readonly code: 'FAILED' | 'FUTURE' | 'MISSING' | 'STALE' | 'SUBJECT_MISMATCH';
23
+ }
24
+ export interface BootstrapRollbackDecision {
25
+ readonly version: typeof BOOTSTRAP_ROLLBACK_DECISION_VERSION;
26
+ readonly candidateVersion: string;
27
+ readonly candidateSha256: string;
28
+ readonly releaseVersion: string;
29
+ readonly selection: 'legacy' | 'self-host';
30
+ readonly rollbackRequired: boolean;
31
+ readonly reasons: readonly BootstrapRollbackReason[];
32
+ readonly evaluatedGateEvidenceSha256: readonly string[];
33
+ }
34
+ export interface BootstrapRollbackDecisionResult {
35
+ readonly decision: BootstrapRollbackDecision;
36
+ readonly serialized: string;
37
+ readonly sha256: string;
38
+ }
39
+ export declare function evaluateBootstrapRollbackDecision(value: unknown): BootstrapRollbackDecisionResult;
40
+ //# sourceMappingURL=bootstrap-rollback-decision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap-rollback-decision.d.ts","sourceRoot":"","sources":["../../../src/selfhost/bootstrap-rollback-decision.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mCAAmC,EAAG,CAAU,CAAC;AAE9D,eAAO,MAAM,uBAAuB,qIAO1B,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAEtE,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,8BAA8B;IAC9C,QAAQ,CAAC,OAAO,EAAE,OAAO,mCAAmC,CAAC;IAC7D,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,yBAAyB,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,kBAAkB,CAAC;CAC9E;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,mCAAmC,CAAC;IAC7D,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACrD,QAAQ,CAAC,2BAA2B,EAAE,SAAS,MAAM,EAAE,CAAC;CACxD;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAID,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,+BAA+B,CAuCjG"}
@@ -0,0 +1,144 @@
1
+ import { createHash } from 'node:crypto';
2
+ export const BOOTSTRAP_ROLLBACK_DECISION_VERSION = 1;
3
+ export const REQUIRED_ROLLBACK_GATES = [
4
+ 'bootstrap-determinism',
5
+ 'legacy-compatibility',
6
+ 'runtime-behaviour',
7
+ 'performance',
8
+ 'clean-bootstrap',
9
+ 'rollback-smoke',
10
+ ];
11
+ const sha256Pattern = /^[0-9a-f]{64}$/u;
12
+ export function evaluateBootstrapRollbackDecision(value) {
13
+ const input = validateInput(value);
14
+ const evaluatedAt = Date.parse(input.evaluatedAt);
15
+ const byName = new Map(input.gates.map(gate => [gate.name, gate]));
16
+ const reasons = [];
17
+ for (const gateName of REQUIRED_ROLLBACK_GATES) {
18
+ const gate = byName.get(gateName);
19
+ if (gate === undefined) {
20
+ reasons.push({ gate: gateName, code: 'MISSING' });
21
+ continue;
22
+ }
23
+ if (gate.candidateSha256 !== input.candidateSha256) {
24
+ reasons.push({ gate: gateName, code: 'SUBJECT_MISMATCH' });
25
+ continue;
26
+ }
27
+ const checkedAt = Date.parse(gate.checkedAt);
28
+ if (checkedAt > evaluatedAt) {
29
+ reasons.push({ gate: gateName, code: 'FUTURE' });
30
+ continue;
31
+ }
32
+ if (evaluatedAt - checkedAt > input.maximumEvidenceAgeSeconds * 1000) {
33
+ reasons.push({ gate: gateName, code: 'STALE' });
34
+ continue;
35
+ }
36
+ if (gate.status === 'fail')
37
+ reasons.push({ gate: gateName, code: 'FAILED' });
38
+ }
39
+ const sortedReasons = reasons.sort(compareReason);
40
+ const decision = {
41
+ version: BOOTSTRAP_ROLLBACK_DECISION_VERSION,
42
+ candidateVersion: input.candidateVersion,
43
+ candidateSha256: input.candidateSha256,
44
+ releaseVersion: input.releaseVersion,
45
+ selection: sortedReasons.length === 0 ? 'self-host' : 'legacy',
46
+ rollbackRequired: sortedReasons.length !== 0,
47
+ reasons: sortedReasons,
48
+ evaluatedGateEvidenceSha256: [...input.gates].sort(compareGate).map(gate => gate.evidenceSha256),
49
+ };
50
+ const serialized = JSON.stringify(decision);
51
+ return { decision, serialized, sha256: sha256(serialized) };
52
+ }
53
+ function validateInput(value) {
54
+ const input = record(value, '$');
55
+ exactKeys(input, ['version', 'candidateVersion', 'candidateSha256', 'releaseVersion', 'evaluatedAt', 'maximumEvidenceAgeSeconds', 'gates'], '$');
56
+ if (input.version !== BOOTSTRAP_ROLLBACK_DECISION_VERSION)
57
+ throw new Error('$.version is invalid');
58
+ const candidateVersion = nonEmptyString(input.candidateVersion, '$.candidateVersion');
59
+ const candidateSha256 = sha256Value(input.candidateSha256, '$.candidateSha256');
60
+ const releaseVersion = nonEmptyString(input.releaseVersion, '$.releaseVersion');
61
+ const evaluatedAt = timestamp(input.evaluatedAt, '$.evaluatedAt');
62
+ const maximumEvidenceAgeSeconds = positiveSafeInteger(input.maximumEvidenceAgeSeconds, '$.maximumEvidenceAgeSeconds');
63
+ const gateValues = array(input.gates, '$.gates');
64
+ const gates = gateValues.map((gate, index) => validateGate(gate, `$.gates[${index}]`)).sort(compareGate);
65
+ for (let index = 1; index < gates.length; index += 1) {
66
+ if (gates[index - 1].name === gates[index].name)
67
+ throw new Error(`$.gates[${index}].name is duplicated`);
68
+ }
69
+ return { version: 1, candidateVersion, candidateSha256, releaseVersion, evaluatedAt, maximumEvidenceAgeSeconds, gates };
70
+ }
71
+ function validateGate(value, path) {
72
+ const gate = record(value, path);
73
+ exactKeys(gate, ['name', 'candidateSha256', 'checkedAt', 'status', 'evidenceSha256'], path);
74
+ if (!REQUIRED_ROLLBACK_GATES.includes(gate.name))
75
+ throw new Error(`${path}.name is invalid`);
76
+ if (gate.status !== 'pass' && gate.status !== 'fail')
77
+ throw new Error(`${path}.status is invalid`);
78
+ return {
79
+ name: gate.name,
80
+ candidateSha256: sha256Value(gate.candidateSha256, `${path}.candidateSha256`),
81
+ checkedAt: timestamp(gate.checkedAt, `${path}.checkedAt`),
82
+ status: gate.status,
83
+ evidenceSha256: sha256Value(gate.evidenceSha256, `${path}.evidenceSha256`),
84
+ };
85
+ }
86
+ function record(value, path) {
87
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
88
+ throw new Error(`${path} must be a plain object`);
89
+ const prototype = Object.getPrototypeOf(value);
90
+ if (prototype !== Object.prototype && prototype !== null)
91
+ throw new Error(`${path} must be a plain object`);
92
+ return value;
93
+ }
94
+ function array(value, path) {
95
+ if (!Array.isArray(value))
96
+ throw new Error(`${path} must be an array`);
97
+ return value;
98
+ }
99
+ function exactKeys(value, keys, path) {
100
+ const expected = new Set(keys);
101
+ for (const key of Object.keys(value))
102
+ if (!expected.has(key))
103
+ throw new Error(`${path}.${key} is unknown`);
104
+ for (const key of keys)
105
+ if (!Object.hasOwn(value, key))
106
+ throw new Error(`${path}.${key} is missing`);
107
+ }
108
+ function nonEmptyString(value, path) {
109
+ if (typeof value !== 'string' || value.length === 0)
110
+ throw new Error(`${path} must be a non-empty string`);
111
+ return value;
112
+ }
113
+ function sha256Value(value, path) {
114
+ const result = nonEmptyString(value, path);
115
+ if (!sha256Pattern.test(result))
116
+ throw new Error(`${path} must be a lowercase SHA-256`);
117
+ return result;
118
+ }
119
+ function timestamp(value, path) {
120
+ const result = nonEmptyString(value, path);
121
+ const parsed = new Date(result);
122
+ if (Number.isNaN(parsed.getTime()) || parsed.toISOString() !== result) {
123
+ throw new Error(`${path} must be a canonical UTC ISO timestamp`);
124
+ }
125
+ return result;
126
+ }
127
+ function positiveSafeInteger(value, path) {
128
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0)
129
+ throw new Error(`${path} must be a positive safe integer`);
130
+ return value;
131
+ }
132
+ function compareGate(left, right) {
133
+ return compareText(left.name, right.name);
134
+ }
135
+ function compareReason(left, right) {
136
+ return compareText(left.gate, right.gate) || compareText(left.code, right.code);
137
+ }
138
+ function compareText(left, right) {
139
+ return left < right ? -1 : left > right ? 1 : 0;
140
+ }
141
+ function sha256(value) {
142
+ return createHash('sha256').update(value, 'utf8').digest('hex');
143
+ }
144
+ //# sourceMappingURL=bootstrap-rollback-decision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap-rollback-decision.js","sourceRoot":"","sources":["../../../src/selfhost/bootstrap-rollback-decision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { PromotionEvidenceObservation } from './promotion-evidence.js';
2
+ import type { BootstrapShadowReport } from './bootstrap-shadow-report.js';
3
+ export declare const BOOTSTRAP_SHADOW_HISTORY_VERSION: 1;
4
+ export interface BootstrapShadowHistoryEntryInputV1 {
5
+ readonly version: typeof BOOTSTRAP_SHADOW_HISTORY_VERSION;
6
+ readonly runId: string;
7
+ readonly candidateSha: string;
8
+ readonly completedAt: string;
9
+ readonly report: BootstrapShadowReport;
10
+ readonly reportSha256: string;
11
+ }
12
+ export interface BootstrapShadowHistoryInputV1 {
13
+ readonly version: typeof BOOTSTRAP_SHADOW_HISTORY_VERSION;
14
+ readonly candidateSha: string;
15
+ readonly entries: readonly BootstrapShadowHistoryEntryInputV1[];
16
+ }
17
+ export interface BootstrapShadowHistoryEntryV1 {
18
+ readonly runId: string;
19
+ readonly completedAt: string;
20
+ readonly reportSha256: string;
21
+ readonly status: 'equivalent' | 'mismatch';
22
+ readonly unexpectedDifferentials: number;
23
+ }
24
+ export interface BootstrapShadowHistoryV1 {
25
+ readonly version: typeof BOOTSTRAP_SHADOW_HISTORY_VERSION;
26
+ readonly candidateSha: string;
27
+ readonly successfulRuns: number;
28
+ readonly observationDays: number;
29
+ readonly unexplainedDifferentials: number;
30
+ readonly firstSuccessfulAt: string | null;
31
+ readonly latestCompletedAt: string;
32
+ readonly latestReportSha256: string;
33
+ readonly entries: readonly BootstrapShadowHistoryEntryV1[];
34
+ }
35
+ export interface BootstrapShadowHistoryPayloadV1 {
36
+ readonly history: BootstrapShadowHistoryV1;
37
+ readonly observation: PromotionEvidenceObservation;
38
+ }
39
+ export interface BootstrapShadowHistoryResultV1 extends BootstrapShadowHistoryPayloadV1 {
40
+ readonly serialized: string;
41
+ readonly sha256: string;
42
+ }
43
+ export declare class BootstrapShadowHistoryError extends Error {
44
+ readonly path: string;
45
+ readonly name = "BootstrapShadowHistoryError";
46
+ constructor(path: string, message: string);
47
+ }
48
+ export declare function createBootstrapShadowHistory(value: unknown): BootstrapShadowHistoryResultV1;
49
+ //# sourceMappingURL=bootstrap-shadow-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap-shadow-history.d.ts","sourceRoot":"","sources":["../../../src/selfhost/bootstrap-shadow-history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,4BAA4B,EAE5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACX,qBAAqB,EAErB,MAAM,8BAA8B,CAAC;AAEtC,eAAO,MAAM,gCAAgC,EAAG,CAAU,CAAC;AAE3D,MAAM,WAAW,kCAAkC;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,gCAAgC,CAAC;IAC1D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,gCAAgC,CAAC;IAC1D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,kCAAkC,EAAE,CAAC;CAChE;AAED,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CAAC;IAC3C,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;CACzC;AAOD,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,gCAAgC,CAAC;IAC1D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,6BAA6B,EAAE,CAAC;CAC3D;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,4BAA4B,CAAC;CACnD;AAED,MAAM,WAAW,8BAA+B,SAAQ,+BAA+B;IACtF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,2BAA4B,SAAQ,KAAK;aAElB,IAAI,EAAE,MAAM;IAD/C,SAAyB,IAAI,iCAAiC;gBAC3B,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAGhE;AAkBD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,8BAA8B,CAiE3F"}