worldvm 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/AUTHORING.md +833 -0
  2. package/README.md +154 -2
  3. package/bin/worldvm.mjs +3 -0
  4. package/dist/_internal/forma/index.d.ts +1 -0
  5. package/dist/_internal/forma/index.js +1 -0
  6. package/dist/_internal/forma/world/authoring-help.d.ts +25 -0
  7. package/dist/_internal/forma/world/authoring-help.js +130 -0
  8. package/dist/_internal/forma/world/citations.d.ts +3 -0
  9. package/dist/_internal/forma/world/citations.js +26 -0
  10. package/dist/_internal/forma/world/clock-bindings.d.ts +4 -0
  11. package/dist/_internal/forma/world/clock-bindings.js +45 -0
  12. package/dist/_internal/forma/world/compile.d.ts +13 -0
  13. package/dist/_internal/forma/world/compile.js +190 -0
  14. package/dist/_internal/forma/world/coverage.d.ts +10 -0
  15. package/dist/_internal/forma/world/coverage.js +242 -0
  16. package/dist/_internal/forma/world/digest.d.ts +1 -0
  17. package/dist/_internal/forma/world/digest.js +1 -0
  18. package/dist/_internal/forma/world/documentation.d.ts +3 -0
  19. package/dist/_internal/forma/world/documentation.js +38 -0
  20. package/dist/_internal/forma/world/homes.d.ts +4 -0
  21. package/dist/_internal/forma/world/homes.js +202 -0
  22. package/dist/_internal/forma/world/index.d.ts +6 -0
  23. package/dist/_internal/forma/world/index.js +5 -0
  24. package/dist/_internal/forma/world/lowering/accounts.d.ts +4 -0
  25. package/dist/_internal/forma/world/lowering/accounts.js +36 -0
  26. package/dist/_internal/forma/world/lowering/action-policy.d.ts +5 -0
  27. package/dist/_internal/forma/world/lowering/action-policy.js +16 -0
  28. package/dist/_internal/forma/world/lowering/agents.d.ts +6 -0
  29. package/dist/_internal/forma/world/lowering/agents.js +116 -0
  30. package/dist/_internal/forma/world/lowering/bundles.d.ts +3 -0
  31. package/dist/_internal/forma/world/lowering/bundles.js +13 -0
  32. package/dist/_internal/forma/world/lowering/child-parameters.d.ts +14 -0
  33. package/dist/_internal/forma/world/lowering/child-parameters.js +36 -0
  34. package/dist/_internal/forma/world/lowering/collects.d.ts +3 -0
  35. package/dist/_internal/forma/world/lowering/collects.js +51 -0
  36. package/dist/_internal/forma/world/lowering/component-operations.d.ts +6 -0
  37. package/dist/_internal/forma/world/lowering/component-operations.js +26 -0
  38. package/dist/_internal/forma/world/lowering/components.d.ts +7 -0
  39. package/dist/_internal/forma/world/lowering/components.js +236 -0
  40. package/dist/_internal/forma/world/lowering/connectors.d.ts +4 -0
  41. package/dist/_internal/forma/world/lowering/connectors.js +31 -0
  42. package/dist/_internal/forma/world/lowering/context.d.ts +80 -0
  43. package/dist/_internal/forma/world/lowering/context.js +316 -0
  44. package/dist/_internal/forma/world/lowering/contracts.d.ts +7 -0
  45. package/dist/_internal/forma/world/lowering/contracts.js +73 -0
  46. package/dist/_internal/forma/world/lowering/decisions.d.ts +3 -0
  47. package/dist/_internal/forma/world/lowering/decisions.js +164 -0
  48. package/dist/_internal/forma/world/lowering/derives.d.ts +3 -0
  49. package/dist/_internal/forma/world/lowering/derives.js +22 -0
  50. package/dist/_internal/forma/world/lowering/discretionary.d.ts +7 -0
  51. package/dist/_internal/forma/world/lowering/discretionary.js +15 -0
  52. package/dist/_internal/forma/world/lowering/documents.d.ts +3 -0
  53. package/dist/_internal/forma/world/lowering/documents.js +68 -0
  54. package/dist/_internal/forma/world/lowering/effective.d.ts +5 -0
  55. package/dist/_internal/forma/world/lowering/effective.js +26 -0
  56. package/dist/_internal/forma/world/lowering/entities.d.ts +3 -0
  57. package/dist/_internal/forma/world/lowering/entities.js +43 -0
  58. package/dist/_internal/forma/world/lowering/escalations.d.ts +6 -0
  59. package/dist/_internal/forma/world/lowering/escalations.js +31 -0
  60. package/dist/_internal/forma/world/lowering/evidence.d.ts +3 -0
  61. package/dist/_internal/forma/world/lowering/evidence.js +75 -0
  62. package/dist/_internal/forma/world/lowering/files.d.ts +4 -0
  63. package/dist/_internal/forma/world/lowering/files.js +56 -0
  64. package/dist/_internal/forma/world/lowering/holds.d.ts +6 -0
  65. package/dist/_internal/forma/world/lowering/holds.js +35 -0
  66. package/dist/_internal/forma/world/lowering/index.d.ts +89 -0
  67. package/dist/_internal/forma/world/lowering/index.js +115 -0
  68. package/dist/_internal/forma/world/lowering/interactions.d.ts +7 -0
  69. package/dist/_internal/forma/world/lowering/interactions.js +190 -0
  70. package/dist/_internal/forma/world/lowering/library.d.ts +5 -0
  71. package/dist/_internal/forma/world/lowering/library.js +41 -0
  72. package/dist/_internal/forma/world/lowering/milestones.d.ts +6 -0
  73. package/dist/_internal/forma/world/lowering/milestones.js +17 -0
  74. package/dist/_internal/forma/world/lowering/notices.d.ts +3 -0
  75. package/dist/_internal/forma/world/lowering/notices.js +33 -0
  76. package/dist/_internal/forma/world/lowering/param-bounds.d.ts +15 -0
  77. package/dist/_internal/forma/world/lowering/param-bounds.js +71 -0
  78. package/dist/_internal/forma/world/lowering/policies.d.ts +6 -0
  79. package/dist/_internal/forma/world/lowering/policies.js +95 -0
  80. package/dist/_internal/forma/world/lowering/principals.d.ts +62 -0
  81. package/dist/_internal/forma/world/lowering/principals.js +32 -0
  82. package/dist/_internal/forma/world/lowering/recurrences.d.ts +9 -0
  83. package/dist/_internal/forma/world/lowering/recurrences.js +56 -0
  84. package/dist/_internal/forma/world/lowering/renewal.d.ts +5 -0
  85. package/dist/_internal/forma/world/lowering/renewal.js +21 -0
  86. package/dist/_internal/forma/world/lowering/resources.d.ts +6 -0
  87. package/dist/_internal/forma/world/lowering/resources.js +19 -0
  88. package/dist/_internal/forma/world/lowering/reuse.d.ts +5 -0
  89. package/dist/_internal/forma/world/lowering/reuse.js +75 -0
  90. package/dist/_internal/forma/world/lowering/sources.d.ts +10 -0
  91. package/dist/_internal/forma/world/lowering/sources.js +47 -0
  92. package/dist/_internal/forma/world/lowering/syntax.d.ts +84 -0
  93. package/dist/_internal/forma/world/lowering/syntax.js +94 -0
  94. package/dist/_internal/forma/world/lowering/vaults.d.ts +11 -0
  95. package/dist/_internal/forma/world/lowering/vaults.js +148 -0
  96. package/dist/_internal/forma/world/prelude.generated.d.ts +1 -0
  97. package/dist/_internal/forma/world/prelude.generated.js +2 -0
  98. package/dist/_internal/forma/world/properties.d.ts +9 -0
  99. package/dist/_internal/forma/world/properties.js +387 -0
  100. package/dist/_internal/forma/world/scenarios.d.ts +10 -0
  101. package/dist/_internal/forma/world/scenarios.js +757 -0
  102. package/dist/_internal/forma/world/sensitivity.d.ts +3 -0
  103. package/dist/_internal/forma/world/sensitivity.js +118 -0
  104. package/dist/_internal/forma/world/source-syntax.d.ts +6 -0
  105. package/dist/_internal/forma/world/source-syntax.js +27 -0
  106. package/dist/_internal/forma/world/status-handling.d.ts +3 -0
  107. package/dist/_internal/forma/world/status-handling.js +143 -0
  108. package/dist/_internal/forma/world/surface.d.ts +30 -0
  109. package/dist/_internal/forma/world/surface.js +213 -0
  110. package/dist/_internal/forma/world/table-expressions.d.ts +3 -0
  111. package/dist/_internal/forma/world/table-expressions.js +41 -0
  112. package/dist/_internal/forma-tools/index.d.ts +17 -0
  113. package/dist/_internal/forma-tools/index.js +124 -0
  114. package/dist/_internal/ir-checks/advances.d.ts +7 -0
  115. package/dist/_internal/ir-checks/advances.js +6 -0
  116. package/dist/_internal/ir-checks/agent-reads.d.ts +14 -0
  117. package/dist/_internal/ir-checks/agent-reads.js +118 -0
  118. package/dist/_internal/ir-checks/amendments.d.ts +3 -0
  119. package/dist/_internal/ir-checks/amendments.js +21 -0
  120. package/dist/_internal/ir-checks/canonical-json.d.ts +3 -0
  121. package/dist/_internal/ir-checks/canonical-json.js +85 -0
  122. package/dist/_internal/ir-checks/child-parameters.d.ts +2 -0
  123. package/dist/_internal/ir-checks/child-parameters.js +43 -0
  124. package/dist/_internal/ir-checks/clock-bindings.d.ts +3 -0
  125. package/dist/_internal/ir-checks/clock-bindings.js +43 -0
  126. package/dist/_internal/ir-checks/collect-types.d.ts +14 -0
  127. package/dist/_internal/ir-checks/collect-types.js +34 -0
  128. package/dist/_internal/ir-checks/component-operations.d.ts +4 -0
  129. package/dist/_internal/ir-checks/component-operations.js +23 -0
  130. package/dist/_internal/ir-checks/content-digest.d.ts +4 -0
  131. package/dist/_internal/ir-checks/content-digest.js +78 -0
  132. package/dist/_internal/ir-checks/contract-validation.d.ts +3 -0
  133. package/dist/_internal/ir-checks/contract-validation.js +307 -0
  134. package/dist/_internal/ir-checks/contracts.d.ts +25 -0
  135. package/dist/_internal/ir-checks/contracts.js +80 -0
  136. package/dist/_internal/ir-checks/dates.d.ts +2 -0
  137. package/dist/_internal/ir-checks/dates.js +7 -0
  138. package/dist/_internal/ir-checks/documents.d.ts +3 -0
  139. package/dist/_internal/ir-checks/documents.js +45 -0
  140. package/dist/_internal/ir-checks/evidence.d.ts +20 -0
  141. package/dist/_internal/ir-checks/evidence.js +56 -0
  142. package/dist/_internal/ir-checks/files.d.ts +7 -0
  143. package/dist/_internal/ir-checks/files.js +47 -0
  144. package/dist/_internal/ir-checks/index.d.ts +59 -0
  145. package/dist/_internal/ir-checks/index.js +166 -0
  146. package/dist/_internal/ir-checks/instants.d.ts +7 -0
  147. package/dist/_internal/ir-checks/instants.js +61 -0
  148. package/dist/_internal/ir-checks/notices.d.ts +4 -0
  149. package/dist/_internal/ir-checks/notices.js +58 -0
  150. package/dist/_internal/ir-checks/policy-bounds.d.ts +5 -0
  151. package/dist/_internal/ir-checks/policy-bounds.js +28 -0
  152. package/dist/_internal/ir-checks/principals.d.ts +26 -0
  153. package/dist/_internal/ir-checks/principals.js +162 -0
  154. package/dist/_internal/ir-checks/prior-cycle.d.ts +41 -0
  155. package/dist/_internal/ir-checks/prior-cycle.js +21 -0
  156. package/dist/_internal/ir-checks/read-classification.d.ts +12 -0
  157. package/dist/_internal/ir-checks/read-classification.js +67 -0
  158. package/dist/_internal/ir-checks/read-types.d.ts +2 -0
  159. package/dist/_internal/ir-checks/read-types.js +40 -0
  160. package/dist/_internal/ir-checks/resource-proofs.d.ts +4 -0
  161. package/dist/_internal/ir-checks/resource-proofs.js +98 -0
  162. package/dist/_internal/ir-checks/resources.d.ts +3 -0
  163. package/dist/_internal/ir-checks/resources.js +30 -0
  164. package/dist/_internal/ir-checks/reuse.d.ts +10 -0
  165. package/dist/_internal/ir-checks/reuse.js +99 -0
  166. package/dist/_internal/ir-checks/sealing.d.ts +14 -0
  167. package/dist/_internal/ir-checks/sealing.js +123 -0
  168. package/dist/_internal/ir-checks/sensitive-flow.d.ts +4 -0
  169. package/dist/_internal/ir-checks/sensitive-flow.js +240 -0
  170. package/dist/_internal/ir-checks/sensitivity.d.ts +19 -0
  171. package/dist/_internal/ir-checks/sensitivity.js +133 -0
  172. package/dist/_internal/ir-checks/signatures.d.ts +4 -0
  173. package/dist/_internal/ir-checks/signatures.js +22 -0
  174. package/dist/_internal/ir-checks/vaults.d.ts +10 -0
  175. package/dist/_internal/ir-checks/vaults.js +140 -0
  176. package/dist/_internal/protocol/index.d.ts +1234 -0
  177. package/dist/_internal/protocol/index.js +215 -0
  178. package/dist/_internal/reconciler/action-intents.d.ts +17 -0
  179. package/dist/_internal/reconciler/action-intents.js +161 -0
  180. package/dist/_internal/reconciler/actions.d.ts +7 -0
  181. package/dist/_internal/reconciler/actions.js +134 -0
  182. package/dist/_internal/reconciler/amendments.d.ts +12 -0
  183. package/dist/_internal/reconciler/amendments.js +52 -0
  184. package/dist/_internal/reconciler/basis.d.ts +253 -0
  185. package/dist/_internal/reconciler/basis.js +16 -0
  186. package/dist/_internal/reconciler/bundles.d.ts +22 -0
  187. package/dist/_internal/reconciler/bundles.js +110 -0
  188. package/dist/_internal/reconciler/change-detection.d.ts +5 -0
  189. package/dist/_internal/reconciler/change-detection.js +82 -0
  190. package/dist/_internal/reconciler/collection-rules.d.ts +7 -0
  191. package/dist/_internal/reconciler/collection-rules.js +46 -0
  192. package/dist/_internal/reconciler/collection-state.d.ts +11 -0
  193. package/dist/_internal/reconciler/collection-state.js +62 -0
  194. package/dist/_internal/reconciler/collection-values.d.ts +5 -0
  195. package/dist/_internal/reconciler/collection-values.js +60 -0
  196. package/dist/_internal/reconciler/collections.d.ts +35 -0
  197. package/dist/_internal/reconciler/collections.js +141 -0
  198. package/dist/_internal/reconciler/commands.d.ts +60 -0
  199. package/dist/_internal/reconciler/commands.js +468 -0
  200. package/dist/_internal/reconciler/component-operations.d.ts +48 -0
  201. package/dist/_internal/reconciler/component-operations.js +256 -0
  202. package/dist/_internal/reconciler/context.d.ts +38 -0
  203. package/dist/_internal/reconciler/context.js +44 -0
  204. package/dist/_internal/reconciler/coverage.d.ts +31 -0
  205. package/dist/_internal/reconciler/coverage.js +124 -0
  206. package/dist/_internal/reconciler/dates.d.ts +38 -0
  207. package/dist/_internal/reconciler/dates.js +121 -0
  208. package/dist/_internal/reconciler/decide.d.ts +25 -0
  209. package/dist/_internal/reconciler/decide.js +263 -0
  210. package/dist/_internal/reconciler/decision-evaluation.d.ts +9 -0
  211. package/dist/_internal/reconciler/decision-evaluation.js +67 -0
  212. package/dist/_internal/reconciler/decision-records.d.ts +14 -0
  213. package/dist/_internal/reconciler/decision-records.js +77 -0
  214. package/dist/_internal/reconciler/decision-release.d.ts +3 -0
  215. package/dist/_internal/reconciler/decision-release.js +12 -0
  216. package/dist/_internal/reconciler/dependencies.d.ts +179 -0
  217. package/dist/_internal/reconciler/dependencies.js +372 -0
  218. package/dist/_internal/reconciler/discovery.d.ts +9 -0
  219. package/dist/_internal/reconciler/discovery.js +65 -0
  220. package/dist/_internal/reconciler/document-corrections.d.ts +18 -0
  221. package/dist/_internal/reconciler/document-corrections.js +59 -0
  222. package/dist/_internal/reconciler/documents.d.ts +26 -0
  223. package/dist/_internal/reconciler/documents.js +88 -0
  224. package/dist/_internal/reconciler/effective.d.ts +6 -0
  225. package/dist/_internal/reconciler/effective.js +17 -0
  226. package/dist/_internal/reconciler/escalations.d.ts +4 -0
  227. package/dist/_internal/reconciler/escalations.js +76 -0
  228. package/dist/_internal/reconciler/evaluation.d.ts +56 -0
  229. package/dist/_internal/reconciler/evaluation.js +704 -0
  230. package/dist/_internal/reconciler/evidence-authority.d.ts +6 -0
  231. package/dist/_internal/reconciler/evidence-authority.js +70 -0
  232. package/dist/_internal/reconciler/evidence-history.d.ts +5 -0
  233. package/dist/_internal/reconciler/evidence-history.js +22 -0
  234. package/dist/_internal/reconciler/evidence-validity.d.ts +17 -0
  235. package/dist/_internal/reconciler/evidence-validity.js +135 -0
  236. package/dist/_internal/reconciler/fact-validation.d.ts +5 -0
  237. package/dist/_internal/reconciler/fact-validation.js +49 -0
  238. package/dist/_internal/reconciler/files.d.ts +9 -0
  239. package/dist/_internal/reconciler/files.js +56 -0
  240. package/dist/_internal/reconciler/graph.d.ts +40 -0
  241. package/dist/_internal/reconciler/graph.js +298 -0
  242. package/dist/_internal/reconciler/holds.d.ts +6 -0
  243. package/dist/_internal/reconciler/holds.js +18 -0
  244. package/dist/_internal/reconciler/home-definitions.d.ts +11 -0
  245. package/dist/_internal/reconciler/home-definitions.js +25 -0
  246. package/dist/_internal/reconciler/homes.d.ts +6 -0
  247. package/dist/_internal/reconciler/homes.js +32 -0
  248. package/dist/_internal/reconciler/index.d.ts +42 -0
  249. package/dist/_internal/reconciler/index.js +58 -0
  250. package/dist/_internal/reconciler/instants.d.ts +17 -0
  251. package/dist/_internal/reconciler/instants.js +56 -0
  252. package/dist/_internal/reconciler/interaction-fields.d.ts +10 -0
  253. package/dist/_internal/reconciler/interaction-fields.js +30 -0
  254. package/dist/_internal/reconciler/invariants.d.ts +8 -0
  255. package/dist/_internal/reconciler/invariants.js +34 -0
  256. package/dist/_internal/reconciler/journal.d.ts +3 -0
  257. package/dist/_internal/reconciler/journal.js +4 -0
  258. package/dist/_internal/reconciler/linking.d.ts +10 -0
  259. package/dist/_internal/reconciler/linking.js +259 -0
  260. package/dist/_internal/reconciler/memory.d.ts +32 -0
  261. package/dist/_internal/reconciler/memory.js +190 -0
  262. package/dist/_internal/reconciler/milestones.d.ts +7 -0
  263. package/dist/_internal/reconciler/milestones.js +58 -0
  264. package/dist/_internal/reconciler/missing.d.ts +18 -0
  265. package/dist/_internal/reconciler/missing.js +79 -0
  266. package/dist/_internal/reconciler/model.d.ts +350 -0
  267. package/dist/_internal/reconciler/model.js +9 -0
  268. package/dist/_internal/reconciler/notices.d.ts +14 -0
  269. package/dist/_internal/reconciler/notices.js +80 -0
  270. package/dist/_internal/reconciler/occurrences.d.ts +3 -0
  271. package/dist/_internal/reconciler/occurrences.js +30 -0
  272. package/dist/_internal/reconciler/outputs.d.ts +12 -0
  273. package/dist/_internal/reconciler/outputs.js +132 -0
  274. package/dist/_internal/reconciler/parameters.d.ts +4 -0
  275. package/dist/_internal/reconciler/parameters.js +27 -0
  276. package/dist/_internal/reconciler/policies.d.ts +22 -0
  277. package/dist/_internal/reconciler/policies.js +94 -0
  278. package/dist/_internal/reconciler/policy-edits.d.ts +11 -0
  279. package/dist/_internal/reconciler/policy-edits.js +42 -0
  280. package/dist/_internal/reconciler/policy-linking.d.ts +4 -0
  281. package/dist/_internal/reconciler/policy-linking.js +104 -0
  282. package/dist/_internal/reconciler/principal-types.d.ts +2 -0
  283. package/dist/_internal/reconciler/principal-types.js +38 -0
  284. package/dist/_internal/reconciler/prior-decisions.d.ts +3 -0
  285. package/dist/_internal/reconciler/prior-decisions.js +34 -0
  286. package/dist/_internal/reconciler/projections.d.ts +4 -0
  287. package/dist/_internal/reconciler/projections.js +85 -0
  288. package/dist/_internal/reconciler/proofs.d.ts +9 -0
  289. package/dist/_internal/reconciler/proofs.js +24 -0
  290. package/dist/_internal/reconciler/properties.d.ts +25 -0
  291. package/dist/_internal/reconciler/properties.js +67 -0
  292. package/dist/_internal/reconciler/property-eval.d.ts +5 -0
  293. package/dist/_internal/reconciler/property-eval.js +101 -0
  294. package/dist/_internal/reconciler/property-generator.d.ts +9 -0
  295. package/dist/_internal/reconciler/property-generator.js +288 -0
  296. package/dist/_internal/reconciler/property-shrink.d.ts +14 -0
  297. package/dist/_internal/reconciler/property-shrink.js +183 -0
  298. package/dist/_internal/reconciler/provenance.d.ts +8 -0
  299. package/dist/_internal/reconciler/provenance.js +61 -0
  300. package/dist/_internal/reconciler/reconcile.d.ts +32 -0
  301. package/dist/_internal/reconciler/reconcile.js +164 -0
  302. package/dist/_internal/reconciler/recurrence.d.ts +9 -0
  303. package/dist/_internal/reconciler/recurrence.js +44 -0
  304. package/dist/_internal/reconciler/requirements.d.ts +5 -0
  305. package/dist/_internal/reconciler/requirements.js +331 -0
  306. package/dist/_internal/reconciler/resource-generation.d.ts +9 -0
  307. package/dist/_internal/reconciler/resource-generation.js +17 -0
  308. package/dist/_internal/reconciler/resource-scenarios.d.ts +26 -0
  309. package/dist/_internal/reconciler/resource-scenarios.js +78 -0
  310. package/dist/_internal/reconciler/resources.d.ts +24 -0
  311. package/dist/_internal/reconciler/resources.js +178 -0
  312. package/dist/_internal/reconciler/result-digest.d.ts +13 -0
  313. package/dist/_internal/reconciler/result-digest.js +66 -0
  314. package/dist/_internal/reconciler/reuse.d.ts +16 -0
  315. package/dist/_internal/reconciler/reuse.js +119 -0
  316. package/dist/_internal/reconciler/scenarios.d.ts +32 -0
  317. package/dist/_internal/reconciler/scenarios.js +442 -0
  318. package/dist/_internal/reconciler/scheduling.d.ts +9 -0
  319. package/dist/_internal/reconciler/scheduling.js +203 -0
  320. package/dist/_internal/reconciler/sha256.d.ts +1 -0
  321. package/dist/_internal/reconciler/sha256.js +1 -0
  322. package/dist/_internal/reconciler/signatures.d.ts +13 -0
  323. package/dist/_internal/reconciler/signatures.js +37 -0
  324. package/dist/_internal/reconciler/temporal.d.ts +10 -0
  325. package/dist/_internal/reconciler/temporal.js +46 -0
  326. package/dist/_internal/reconciler/upgrades.d.ts +6 -0
  327. package/dist/_internal/reconciler/upgrades.js +65 -0
  328. package/dist/_internal/reconciler/wire.d.ts +2 -0
  329. package/dist/_internal/reconciler/wire.js +5 -0
  330. package/dist/_internal/reconciler/work.d.ts +32 -0
  331. package/dist/_internal/reconciler/work.js +101 -0
  332. package/dist/_internal/world-ir/schema.generated.d.ts +180 -0
  333. package/dist/_internal/world-ir/schema.generated.js +1127 -0
  334. package/dist/_internal/world-ir/types.generated.d.ts +1011 -0
  335. package/dist/_internal/world-ir/types.generated.js +1 -0
  336. package/dist/authoring.d.ts +9 -0
  337. package/dist/authoring.js +10 -0
  338. package/dist/catalogue.d.ts +20 -0
  339. package/dist/catalogue.js +531 -0
  340. package/dist/cli.d.ts +2 -0
  341. package/dist/cli.js +553 -0
  342. package/dist/codegen.d.ts +6 -0
  343. package/dist/codegen.js +89 -0
  344. package/dist/coverage.d.ts +60 -0
  345. package/dist/coverage.js +128 -0
  346. package/dist/deploy.d.ts +21 -0
  347. package/dist/deploy.js +72 -0
  348. package/dist/diagnostics.d.ts +9 -0
  349. package/dist/diagnostics.js +37 -0
  350. package/dist/diff.d.ts +17 -0
  351. package/dist/diff.js +19 -0
  352. package/dist/durable-object.d.ts +14 -0
  353. package/dist/durable-object.js +30 -0
  354. package/dist/explain.d.ts +113 -0
  355. package/dist/explain.js +225 -0
  356. package/dist/fixes.d.ts +4 -0
  357. package/dist/fixes.js +70 -0
  358. package/dist/fmt.d.ts +12 -0
  359. package/dist/fmt.js +39 -0
  360. package/dist/handle/open.d.ts +18 -0
  361. package/dist/handle/open.js +28 -0
  362. package/dist/handle/protocol.d.ts +12 -0
  363. package/dist/handle/protocol.js +96 -0
  364. package/dist/handle/store.d.ts +31 -0
  365. package/dist/handle/store.js +11 -0
  366. package/dist/handle/types.d.ts +37 -0
  367. package/dist/handle/types.js +1 -0
  368. package/dist/handle/world.d.ts +190 -0
  369. package/dist/handle/world.js +533 -0
  370. package/dist/http.d.ts +3 -0
  371. package/dist/http.js +72 -0
  372. package/dist/impact.d.ts +21 -0
  373. package/dist/impact.js +57 -0
  374. package/dist/index.d.ts +30 -0
  375. package/dist/index.js +43 -0
  376. package/dist/init.d.ts +13 -0
  377. package/dist/init.js +99 -0
  378. package/dist/ir-schema.json +4213 -0
  379. package/dist/lints.d.ts +8 -0
  380. package/dist/lints.js +154 -0
  381. package/dist/lsp.d.ts +14 -0
  382. package/dist/lsp.js +380 -0
  383. package/dist/manual/catalog.d.ts +12 -0
  384. package/dist/manual/catalog.js +23 -0
  385. package/dist/manual/examples.d.ts +15 -0
  386. package/dist/manual/examples.js +39 -0
  387. package/dist/manual/projections.d.ts +77 -0
  388. package/dist/manual/projections.js +344 -0
  389. package/dist/manual/prose.d.ts +19 -0
  390. package/dist/manual/prose.js +215 -0
  391. package/dist/manual/render.d.ts +76 -0
  392. package/dist/manual/render.js +250 -0
  393. package/dist/manual/text.d.ts +7 -0
  394. package/dist/manual/text.js +15 -0
  395. package/dist/mcp.d.ts +32 -0
  396. package/dist/mcp.js +269 -0
  397. package/dist/mutate.d.ts +36 -0
  398. package/dist/mutate.js +123 -0
  399. package/dist/project.d.ts +26 -0
  400. package/dist/project.js +80 -0
  401. package/dist/refine.d.ts +18 -0
  402. package/dist/refine.js +197 -0
  403. package/dist/release/diff.d.ts +45 -0
  404. package/dist/release/diff.js +103 -0
  405. package/dist/release/impact.d.ts +83 -0
  406. package/dist/release/impact.js +214 -0
  407. package/dist/release/nodes.d.ts +20 -0
  408. package/dist/release/nodes.js +118 -0
  409. package/dist/render.d.ts +19 -0
  410. package/dist/render.js +43 -0
  411. package/dist/serve.d.ts +18 -0
  412. package/dist/serve.js +140 -0
  413. package/dist/snapshot.d.ts +19 -0
  414. package/dist/snapshot.js +45 -0
  415. package/dist/sqlite.d.ts +16 -0
  416. package/dist/sqlite.js +151 -0
  417. package/dist/test.d.ts +54 -0
  418. package/dist/test.js +131 -0
  419. package/dist/world.d.ts +7 -0
  420. package/dist/world.js +5 -0
  421. package/docs/authoring/vendor-risk/example.forma +11 -0
  422. package/docs/authoring/vendor-risk/library/vendor.forma +76 -0
  423. package/docs/authoring/vendor-risk/scenarios/reviews.forma +107 -0
  424. package/docs/protocol.md +195 -0
  425. package/docs/reference.md +258 -0
  426. package/package.json +81 -3
@@ -0,0 +1,132 @@
1
+ import { contextOf } from "./context.js";
2
+ import { ReadSet } from "./dependencies.js";
3
+ import {} from "./model.js";
4
+ import { evaluate } from "./requirements.js";
5
+ export const allOf = (statuses) => {
6
+ const live = statuses.filter((s) => s !== "NotApplicable" && s !== "Waived");
7
+ if (statuses.length > 0 && live.length === 0)
8
+ return "NotApplicable";
9
+ if (live.includes("Overdue"))
10
+ return "Overdue";
11
+ if (live.includes("Open"))
12
+ return "Open";
13
+ if (live.includes("Unknown"))
14
+ return "Unknown";
15
+ return "Satisfied";
16
+ };
17
+ export const anyOf = (statuses) => {
18
+ const live = statuses.filter((s) => s !== "NotApplicable");
19
+ if (statuses.length > 0 && live.length === 0)
20
+ return "NotApplicable";
21
+ if (live.includes("Satisfied") || live.includes("Waived"))
22
+ return "Satisfied";
23
+ if (live.includes("Unknown"))
24
+ return "Unknown";
25
+ if (live.includes("Overdue") && !live.includes("Open"))
26
+ return "Overdue";
27
+ return "Open";
28
+ };
29
+ export const outputTexts = new WeakMap();
30
+ export const outputText = (o) => {
31
+ let text = outputTexts.get(o);
32
+ if (text === undefined) {
33
+ text = `(${o.op} ${o.paths.map((path) => path.segments.join(".")).join(" ")})`;
34
+ outputTexts.set(o, text);
35
+ }
36
+ return text;
37
+ };
38
+ export function requirementStatus(ctx, inst, name) {
39
+ const partial = ctx.evaluating.get(inst.id)?.get(name);
40
+ if (partial)
41
+ return partial.status;
42
+ return ctx.state.status(inst, name);
43
+ }
44
+ export function statusAt(ctx, owner, segments, focus, reads) {
45
+ const [head, ...rest] = segments;
46
+ if (rest.length === 0) {
47
+ // An instance's own outputs read its requirements while it is still being evaluated.
48
+ const partial = ctx.evaluating.get(owner.id);
49
+ const r = partial ? undefined : evaluate(ctx, owner);
50
+ const output = ctx.programOf
51
+ .get(owner.id)
52
+ .components.get(owner.component)
53
+ .outputs.find((o) => o.name === head);
54
+ const own = partial?.get(head)?.status ??
55
+ r?.outputs.find((o) => o.name === head)?.status ??
56
+ r?.requirements.find((q) => q.name === head)?.status ??
57
+ (partial && output ? outputStatus(ctx, owner, output) : undefined);
58
+ if (own) {
59
+ reads.add({ kind: "status", instance: owner.id, name: head, value: own });
60
+ return own;
61
+ }
62
+ }
63
+ const slot = owner.children.find((s) => s.name === head);
64
+ if (!slot)
65
+ return "Unknown";
66
+ reads.add({
67
+ kind: "slot",
68
+ instance: owner.id,
69
+ name: head,
70
+ value: {
71
+ applies: slot.applies,
72
+ instances: [...slot.instances],
73
+ },
74
+ });
75
+ if (slot.applies === false)
76
+ return "NotApplicable";
77
+ if (slot.applies === "unknown")
78
+ return "Unknown";
79
+ const candidates = slot.instances.map((id) => ctx.instances.get(id));
80
+ const target = candidates.find((c) => {
81
+ if (focus === undefined)
82
+ return false;
83
+ reads.add({ kind: "members", instance: c.id, value: c.attached });
84
+ return c.attached.includes(focus);
85
+ }) ?? candidates.at(-1);
86
+ if (!target)
87
+ return "Unknown";
88
+ if (rest.length === 0)
89
+ return allOf(ctx.programOf
90
+ .get(target.id)
91
+ .components.get(target.component)
92
+ .outputs.map((output) => {
93
+ const value = ctx.state.status(target, output.name);
94
+ reads.add({ kind: "status", instance: target.id, name: output.name, value });
95
+ return value;
96
+ }));
97
+ return statusAt(ctx, target, rest, focus, reads);
98
+ }
99
+ export function outputStatus(ctx, inst, output) {
100
+ const key = JSON.stringify([inst.id, output.name]);
101
+ if (ctx.resolvingOutputs.has(key))
102
+ return "Unknown";
103
+ ctx.resolvingOutputs.add(key);
104
+ try {
105
+ const statuses = output.paths.map((path) => statusAt(ctx, inst, path.segments, ctx.rootFocus.get(inst.id), contextOf(ctx, inst).reads));
106
+ return output.op === "all-of"
107
+ ? allOf(statuses)
108
+ : output.op === "any-of"
109
+ ? anyOf(statuses)
110
+ : statuses[0];
111
+ }
112
+ finally {
113
+ ctx.resolvingOutputs.delete(key);
114
+ }
115
+ }
116
+ export const readStatus = (ctx, inst, name) => {
117
+ // Requirements are evaluated before children, so a child may read its parent's.
118
+ const partial = ctx.evaluating.get(inst.id)?.get(name);
119
+ if (partial)
120
+ return partial.status;
121
+ if (ctx.evaluating.has(inst.id)) {
122
+ const output = ctx.programOf
123
+ .get(inst.id)
124
+ .components.get(inst.component)
125
+ .outputs.find((output) => output.name === name);
126
+ return output ? outputStatus(ctx, inst, output) : "Unknown";
127
+ }
128
+ const r = evaluate(ctx, inst);
129
+ return (r.requirements.find((q) => q.name === name)?.status ??
130
+ r.outputs.find((o) => o.name === name)?.status ??
131
+ "Unknown");
132
+ };
@@ -0,0 +1,4 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ import { type Program, type Value } from "./model.js";
3
+ /** A shared occurrence receives the tightening intersection of its actual parent bindings. */
4
+ export declare const compositionParameters: (p: Program, c: IR.Component, overrides: ReadonlyArray<NonNullable<IR.Slot["with"]>[number]>) => ReadonlyMap<string, Value> | undefined;
@@ -0,0 +1,27 @@
1
+ import { Unknown } from "./model.js";
2
+ /** A shared occurrence receives the tightening intersection of its actual parent bindings. */
3
+ export const compositionParameters = (p, c, overrides) => {
4
+ if (!overrides.length)
5
+ return;
6
+ const values = new Map();
7
+ for (const item of overrides) {
8
+ const bound = c.paramBounds.find((b) => b.name === item.name);
9
+ const base = values.get(item.name) ??
10
+ p.params.get(item.name) ??
11
+ (bound.default.unit === "integer"
12
+ ? bound.default.n
13
+ : { n: bound.default.n, unit: bound.default.unit });
14
+ const n = typeof base === "number"
15
+ ? base
16
+ : base && typeof base === "object" && "n" in base
17
+ ? base.n
18
+ : null;
19
+ if (n === null) {
20
+ values.set(item.name, new Unknown(`Unknown composition parameter ${item.name}`));
21
+ continue;
22
+ }
23
+ const next = bound.tighten === "lower" ? Math.min(n, item.value.n) : Math.max(n, item.value.n);
24
+ values.set(item.name, bound.default.unit === "integer" ? next : { n: next, unit: bound.default.unit });
25
+ }
26
+ return new Map([...values].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
27
+ };
@@ -0,0 +1,22 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ import { type Cx, type Truth, type Value } from "./model.js";
3
+ export declare const occurrencePolicies: (cx: Cx) => readonly IR.AccountPolicy[];
4
+ export declare const policyActive: (cx: Cx, policy: IR.AccountPolicy) => Truth;
5
+ export declare const policyParameter: (cx: Cx, name: string, base: Value | undefined) => Value;
6
+ export declare const policyRequirements: (cx: Cx) => {
7
+ label: string;
8
+ outcome: "unknown" | "passed" | "failed";
9
+ detail: string;
10
+ at: IR.Span;
11
+ truth: Truth;
12
+ }[];
13
+ export interface AuthorityConstraint {
14
+ readonly id: string | null;
15
+ readonly kind: "entity" | "group";
16
+ readonly policy: string;
17
+ }
18
+ export declare const policyAssignments: (cx: Cx, action: IR.Action) => readonly AuthorityConstraint[];
19
+ export declare const permitsConstraints: (constraints: readonly AuthorityConstraint[], actor: {
20
+ readonly id: string;
21
+ readonly groups: readonly string[];
22
+ }) => boolean;
@@ -0,0 +1,94 @@
1
+ import { and, evaluateIn, isUnknown, truth } from "./evaluation.js";
2
+ import { readEffective } from "./effective.js";
3
+ import { Unknown } from "./model.js";
4
+ export const occurrencePolicies = (cx) => cx.inst ? (cx.p.account.policies ?? []).filter((p) => p.of === cx.inst.component) : [];
5
+ export const policyActive = (cx, policy) => {
6
+ const guard = { ...cx, policyGuard: true };
7
+ const effective = policy.effective ? readEffective(guard, policy.effective).truth : true;
8
+ if (effective === false)
9
+ return false;
10
+ return and([effective, policy.when ? truth(evaluateIn(guard, policy.when)) : true]);
11
+ };
12
+ const numberValue = (n) => n.unit === "integer" ? n.n : { n: n.n, unit: n.unit };
13
+ export const policyParameter = (cx, name, base) => {
14
+ const bound = cx.inst && cx.p.components.get(cx.inst.component).paramBounds?.find((b) => b.name === name);
15
+ if (!bound)
16
+ return base ?? new Unknown(`no ${name}`);
17
+ let value = base ?? numberValue(bound.default);
18
+ if (cx.policyGuard)
19
+ return value;
20
+ for (const policy of occurrencePolicies(cx)) {
21
+ const override = policy.params.find((p) => p.name === name);
22
+ if (!override)
23
+ continue;
24
+ const active = policyActive(cx, policy);
25
+ if (active === false)
26
+ continue;
27
+ if (active === "unknown")
28
+ return new Unknown(`Policy ${policy.name}: applicability unknown`);
29
+ const n = typeof value === "number"
30
+ ? value
31
+ : typeof value === "object" && value && "n" in value
32
+ ? value.n
33
+ : null;
34
+ if (n === null)
35
+ return new Unknown(`Policy ${policy.name}: unknown parameter ${name}`);
36
+ const next = bound.tighten === "lower" ? Math.min(n, override.value.n) : Math.max(n, override.value.n);
37
+ value = numberValue({ n: next, unit: bound.default.unit });
38
+ }
39
+ return value;
40
+ };
41
+ export const policyRequirements = (cx) => occurrencePolicies(cx).flatMap((policy) => {
42
+ if (!policy.require)
43
+ return [];
44
+ const active = policyActive(cx, policy);
45
+ if (active === false)
46
+ return [];
47
+ const value = evaluateIn(cx, policy.require);
48
+ const required = truth(value);
49
+ // An unknown guard cannot prove that an unsatisfied extra condition is inapplicable.
50
+ const result = active === true ? required : required === true ? true : "unknown";
51
+ return [
52
+ {
53
+ label: `Policy ${policy.name}`,
54
+ outcome: result === true
55
+ ? "passed"
56
+ : result === false
57
+ ? "failed"
58
+ : "unknown",
59
+ detail: `${policy.cites.map((c) => `${c.source} ${c.clause}`).join(", ")}: ${isUnknown(value) ? value.why : String(value)}${active === "unknown" ? "; applicability unknown" : ""}`,
60
+ at: policy.at,
61
+ truth: result,
62
+ },
63
+ ];
64
+ });
65
+ export const policyAssignments = (cx, action) => {
66
+ const restrictions = occurrencePolicies(cx).flatMap((policy) => {
67
+ const assignment = policy.assign.find((a) => a.action === action.name);
68
+ if (!assignment)
69
+ return [];
70
+ const active = policyActive(cx, policy);
71
+ if (active === false)
72
+ return [];
73
+ const value = active === true ? evaluateIn(cx, assignment.assignee) : null;
74
+ return [
75
+ {
76
+ id: typeof value === "string" && value.length ? value : null,
77
+ kind: assignment.assigneeKind,
78
+ policy: policy.name,
79
+ },
80
+ ];
81
+ });
82
+ if (!restrictions.length)
83
+ return [];
84
+ const base = action.assignee ? evaluateIn(cx, action.assignee) : null;
85
+ return [
86
+ {
87
+ id: typeof base === "string" && base.length ? base : null,
88
+ kind: action.assigneeKind ?? "entity",
89
+ policy: "library",
90
+ },
91
+ ...restrictions,
92
+ ];
93
+ };
94
+ export const permitsConstraints = (constraints, actor) => constraints.every((c) => c.id !== null && (c.kind === "entity" ? c.id === actor.id : actor.groups.includes(c.id)));
@@ -0,0 +1,11 @@
1
+ import type { Basis } from "./basis.js";
2
+ import type { Program, WorldReconciliation, UpgradeConsequence } from "./model.js";
3
+ export interface PolicyParameterPreview {
4
+ readonly program: Program;
5
+ readonly current: WorldReconciliation;
6
+ readonly candidate: WorldReconciliation;
7
+ readonly impact: readonly UpgradeConsequence[];
8
+ }
9
+ /** Account data edits change only bounded values in an already compiled policy. Authoring
10
+ * targets, guards, citations and authority still goes through the language compiler. */
11
+ export declare const previewPolicyParameters: (program: Program, name: string, input: unknown, snapshot: Basis) => PolicyParameterPreview;
@@ -0,0 +1,42 @@
1
+ import { Schema } from "effect";
2
+ import { PolicyNumber } from "../world-ir/schema.generated.js";
3
+ import { link } from "./linking.js";
4
+ import { reconcile } from "./reconcile.js";
5
+ import { planUpgrade } from "./upgrades.js";
6
+ const decode = Schema.decodeUnknownSync(Schema.Record(Schema.String, PolicyNumber));
7
+ /** Account data edits change only bounded values in an already compiled policy. Authoring
8
+ * targets, guards, citations and authority still goes through the language compiler. */
9
+ export const previewPolicyParameters = (program, name, input, snapshot) => {
10
+ const parameters = decode(input, { onExcessProperty: "error" });
11
+ if (!Object.keys(parameters).length)
12
+ throw new Error("A policy edit needs at least one parameter");
13
+ const policy = program.sourceIR.accounts
14
+ .find((a) => a.name === program.account.name)
15
+ ?.policies?.find((p) => p.name === name);
16
+ if (!policy)
17
+ throw new Error(`No published account policy ${name}`);
18
+ const byName = new Map(policy.params.map((p) => [p.name, p]));
19
+ for (const [key, value] of Object.entries(parameters))
20
+ byName.set(key, { name: key, value: { n: value.n, unit: value.unit }, at: policy.at });
21
+ const next = {
22
+ ...policy,
23
+ params: [...byName.values()].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)),
24
+ };
25
+ const ir = {
26
+ ...program.sourceIR,
27
+ accounts: program.sourceIR.accounts.map((a) => a.name !== program.account.name
28
+ ? a
29
+ : {
30
+ ...a,
31
+ policies: a.policies.map((p) => (p.name === name ? next : p)),
32
+ }),
33
+ };
34
+ const candidateProgram = link(ir, program.account.name);
35
+ const current = reconcile([program], snapshot), candidate = reconcile([candidateProgram], snapshot);
36
+ return {
37
+ program: candidateProgram,
38
+ current,
39
+ candidate,
40
+ impact: planUpgrade(current, candidate, snapshot.now),
41
+ };
42
+ };
@@ -0,0 +1,4 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ import type { Program } from "./model.js";
3
+ export declare const policyRelease: (account: IR.Account, library: IR.Library) => string;
4
+ export declare const validatePolicies: (program: Program) => void;
@@ -0,0 +1,104 @@
1
+ import { policyBoundValid, policyValueWithin, policyParameterType, principalKinds, principalActionKey, } from "../ir-checks/index.js";
2
+ import { isDuration } from "./evaluation.js";
3
+ import { semanticJson } from "./result-digest.js";
4
+ import { sha256 } from "./sha256.js";
5
+ export const policyRelease = (account, library) => {
6
+ const legacy = `${library.name}@${library.version} · ${library.digest.slice(0, 6)}`;
7
+ return account.policies?.length
8
+ ? `${legacy} · ${sha256(semanticJson({ account, library: library.digest }))}`
9
+ : legacy;
10
+ };
11
+ export const validatePolicies = (program) => {
12
+ const fail = (message) => {
13
+ throw new Error(`E_POLICY_LOOSENS: ${message}. Republish bounded policy data.`);
14
+ };
15
+ for (const component of program.components.values()) {
16
+ const names = new Set();
17
+ for (const bound of component.paramBounds ?? []) {
18
+ const param = component.params.find((p) => p.name === bound.name);
19
+ if (names.has(bound.name) ||
20
+ !policyBoundValid(bound) ||
21
+ !param ||
22
+ policyParameterType(param.type, program.ir.types) !==
23
+ (bound.default.unit === "integer" ? "integer" : "duration"))
24
+ fail(`Invalid bounds for ${component.name}.${bound.name}`);
25
+ names.add(bound.name);
26
+ const value = program.params.get(bound.name);
27
+ if (value !== undefined &&
28
+ !policyValueWithin(bound, typeof value === "number"
29
+ ? { n: value, unit: "integer" }
30
+ : // Policy bounds compare exact day/year/hour/minute counts; months are not bounded.
31
+ isDuration(value) && value.unit !== "months"
32
+ ? { n: value.n, unit: value.unit }
33
+ : { n: -1, unit: "integer" }))
34
+ fail(`Invalid account parameter ${bound.name}`);
35
+ }
36
+ }
37
+ const names = new Set();
38
+ for (const policy of program.account.policies ?? []) {
39
+ const component = program.components.get(policy.of);
40
+ if (names.has(policy.name) || !component || !policy.cites.length || !policy.doc.trim())
41
+ fail(`Invalid policy ${policy.name}`);
42
+ const closed = (expr, guard = false, bound = new Set()) => {
43
+ if (expr.k === "var" &&
44
+ !bound.has(expr.name) &&
45
+ (expr.name === "self" ||
46
+ component.requirements.some((r) => r.name === expr.name) ||
47
+ component.inputs.some((i) => i.name === expr.name && !component.key.includes(i.name)) ||
48
+ (guard && component.params.some((p) => p.name === expr.name))))
49
+ fail(`Circular or non-keyed policy expression ${policy.name}`);
50
+ if (expr.k === "inst" ||
51
+ (expr.k === "ref" && expr.kind !== "evidence" && expr.kind !== "calendar"))
52
+ fail(`Policy status projection ${policy.name}`);
53
+ if (expr.k === "call")
54
+ expr.args.forEach((e) => closed(e, guard, bound));
55
+ if (expr.k === "list")
56
+ expr.items.forEach((e) => closed(e, guard, bound));
57
+ if (expr.k === "if")
58
+ [expr.test, expr.then, expr.else].forEach((e) => closed(e, guard, bound));
59
+ if (expr.k === "fn")
60
+ closed(expr.body, guard, new Set([...bound, ...expr.params]));
61
+ if (expr.k === "read" || expr.k === "attr")
62
+ closed(expr.of, guard, bound);
63
+ };
64
+ if (policy.when)
65
+ closed(policy.when, true);
66
+ if (policy.require)
67
+ closed(policy.require);
68
+ policy.assign.forEach((a) => closed(a.assignee));
69
+ names.add(policy.name);
70
+ const params = new Set();
71
+ for (const override of policy.params) {
72
+ const bound = component.paramBounds?.find((b) => b.name === override.name);
73
+ if (params.has(override.name) || !bound || !policyValueWithin(bound, override.value))
74
+ fail(`Invalid policy override ${policy.name}.${override.name}`);
75
+ params.add(override.name);
76
+ }
77
+ const actions = new Set();
78
+ for (const restriction of policy.assign) {
79
+ const action = component.actions.find((a) => a.name === restriction.action);
80
+ if (actions.has(restriction.action) || !action?.assignee || action.via.kind !== "interaction")
81
+ fail(`Invalid policy assignment ${policy.name}.${restriction.action}`);
82
+ const kinds = principalKinds({
83
+ ...program.ir,
84
+ components: program.ir.components.map((c) => c.name === component.name
85
+ ? {
86
+ ...c,
87
+ actions: [
88
+ {
89
+ ...action,
90
+ assignee: restriction.assignee,
91
+ assigneeKind: restriction.assigneeKind,
92
+ },
93
+ ],
94
+ }
95
+ : c),
96
+ }, true);
97
+ if (kinds.diagnostics.length ||
98
+ kinds.assignees.get(principalActionKey(component.name, restriction.action)) !==
99
+ restriction.assigneeKind)
100
+ fail(`Invalid policy principal ${policy.name}`);
101
+ actions.add(restriction.action);
102
+ }
103
+ }
104
+ };
@@ -0,0 +1,2 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const withPrincipalKinds: (ir: IR.WorldIR) => IR.WorldIR;
@@ -0,0 +1,38 @@
1
+ import { principalActionKey, principalEscalationKey, principalKinds } from "../ir-checks/index.js";
2
+ const checked = new WeakMap();
3
+ export const withPrincipalKinds = (ir) => {
4
+ const cached = checked.get(ir);
5
+ if (cached)
6
+ return cached;
7
+ const kinds = principalKinds(ir, true), diagnostic = kinds.diagnostics[0];
8
+ if (diagnostic) {
9
+ const at = diagnostic.at;
10
+ throw new Error(`${diagnostic.code}: ${diagnostic.message}${at ? ` (${at.src}:${at.line}:${at.col})` : ""} ${diagnostic.help} Republish this model.`);
11
+ }
12
+ const components = ir.components.map((component) => ({
13
+ ...component,
14
+ requirements: component.requirements.map((requirement) => requirement.escalate
15
+ ? {
16
+ ...requirement,
17
+ escalate: requirement.escalate.map((step, index) => {
18
+ const kind = kinds.escalations.get(principalEscalationKey(component.name, requirement.name, index));
19
+ return { ...step, whoKind: kind };
20
+ }),
21
+ }
22
+ : requirement),
23
+ actions: component.actions.map((action) => {
24
+ const kind = kinds.assignees.get(principalActionKey(component.name, action.name));
25
+ return kind && action.assigneeKind === undefined ? { ...action, assigneeKind: kind } : action;
26
+ }),
27
+ }));
28
+ const decisions = ir.decisions?.map((decision) => {
29
+ const kind = kinds.authorities.get(decision.name);
30
+ return decision.byKind === undefined && kind
31
+ ? { ...decision, byKind: kind === "entity" ? "individual" : "group" }
32
+ : decision;
33
+ });
34
+ const normalized = { ...ir, components, ...(decisions ? { decisions } : {}) };
35
+ checked.set(ir, normalized);
36
+ checked.set(normalized, normalized);
37
+ return normalized;
38
+ };
@@ -0,0 +1,3 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ /** Elaborate prior-cycle sugar from canonical metadata, never entity scans. */
3
+ export declare const withPriorDecisions: (ir: IR.WorldIR) => IR.WorldIR;
@@ -0,0 +1,34 @@
1
+ import { priorCycleDecisions } from "../ir-checks/index.js";
2
+ /** Elaborate prior-cycle sugar from canonical metadata, never entity scans. */
3
+ export const withPriorDecisions = (ir) => {
4
+ const added = [];
5
+ for (const component of ir.components)
6
+ for (const requirement of component.requirements)
7
+ if (requirement.accepts?.from && !requirement.accepts.with) {
8
+ const path = component.home.path;
9
+ let by = { k: "var", name: path[0], at: requirement.at };
10
+ for (const field of path.slice(1))
11
+ by = { k: "inst", of: by, field, at: requirement.at };
12
+ if (requirement.accepts.confirm)
13
+ by = requirement.accepts.confirm;
14
+ const definitions = priorCycleDecisions({
15
+ component: component.name,
16
+ requirement: requirement.name,
17
+ by,
18
+ ...(!requirement.accepts.confirm ? { byKind: "individual" } : {}),
19
+ at: requirement.at,
20
+ ...(requirement.cites ? { cites: requirement.cites } : {}),
21
+ });
22
+ const explicit = ir.decisions?.find((d) => d.of === component.name &&
23
+ d.applies === requirement.name &&
24
+ d.effect === "accept" &&
25
+ d.name !== definitions[0].name);
26
+ const contracts = explicit
27
+ ? [{ ...explicit, name: definitions[1].name, effect: "reject" }]
28
+ : definitions;
29
+ for (const definition of contracts)
30
+ if (!ir.decisions?.some((d) => d.name === definition.name && d.of === definition.of))
31
+ added.push(definition);
32
+ }
33
+ return added.length ? { ...ir, decisions: [...(ir.decisions ?? []), ...added] } : ir;
34
+ };
@@ -0,0 +1,4 @@
1
+ import { type EvaluationContext } from "./context.js";
2
+ import { type WorldReconciliation } from "./model.js";
3
+ import { discoveryProvenance } from "./provenance.js";
4
+ export declare const finishReconciliation: (ctx: EvaluationContext, discovery: ReturnType<typeof discoveryProvenance>) => WorldReconciliation;
@@ -0,0 +1,85 @@
1
+ import { resolveWorkConflicts } from "./work.js";
2
+ import {} from "./context.js";
3
+ import { DependencyMap, isLocalDependency, ReadSet } from "./dependencies.js";
4
+ import { occurrenceHome } from "./homes.js";
5
+ import {} from "./model.js";
6
+ import { discoveryProvenance } from "./provenance.js";
7
+ import { makeResultDigester } from "./result-digest.js";
8
+ import { nextWake } from "./temporal.js";
9
+ export const finishReconciliation = (ctx, discovery) => {
10
+ resolveWorkConflicts(ctx);
11
+ const scope = ctx.scope;
12
+ let discoveryReads = discovery;
13
+ const selected = scope
14
+ ? new Map([...ctx.instances].filter(([, inst]) => scope.select(inst)))
15
+ : ctx.instances;
16
+ const projectedResults = scope
17
+ ? new Map([...ctx.results].filter(([id]) => selected.has(id)))
18
+ : ctx.results;
19
+ const selectedResults = new Map();
20
+ const groups = new Map();
21
+ const discoveryByGroup = new Map();
22
+ const footprints = new Map();
23
+ for (const [id] of projectedResults) {
24
+ const inst = ctx.instances.get(id), p = ctx.programOf.get(id);
25
+ const home = occurrenceHome(p, inst, ctx.instances);
26
+ let homes = groups.get(p);
27
+ if (!homes) {
28
+ homes = new Map();
29
+ groups.set(p, homes);
30
+ }
31
+ const homeKey = home?.id ?? id;
32
+ let shared = homes.get(homeKey);
33
+ if (!shared) {
34
+ shared = new ReadSet();
35
+ homes.set(homeKey, shared);
36
+ const discovered = home ? discoveryReads(p, home.id) : new Map();
37
+ for (const [key, d] of discovered)
38
+ if (!isLocalDependency(d))
39
+ shared.add(d, key);
40
+ discoveryByGroup.set(shared, discovered);
41
+ }
42
+ const local = new ReadSet();
43
+ for (const [key, d] of ctx.contexts.get(id).reads.entries())
44
+ (isLocalDependency(d) ? local : shared).add(d, key);
45
+ local.merge(discoveryByGroup.get(shared), isLocalDependency);
46
+ footprints.set(id, { shared, local: local.snapshot() });
47
+ }
48
+ if (scope)
49
+ scope.reads.merge(discoveryReads(ctx.programs[0], scope.home.id));
50
+ // All discovery closures have been materialized; release temporary projection graphs.
51
+ ctx.discoveryReadSets = new Map();
52
+ discoveryReads = undefined;
53
+ ctx.contexts.clear();
54
+ ctx.observations.clear();
55
+ ctx.predictions.clear();
56
+ const dependencies = new Map();
57
+ for (const [id, footprint] of footprints)
58
+ dependencies.set(id, new DependencyMap(footprint.shared.snapshot(), footprint.local));
59
+ footprints.clear();
60
+ groups.clear();
61
+ discoveryByGroup.clear();
62
+ const digester = makeResultDigester();
63
+ for (const [id, result] of projectedResults) {
64
+ const dependsOn = dependencies.get(id);
65
+ const complete = { ...result, ...nextWake(dependsOn.local.values(), ctx.now), dependsOn };
66
+ selectedResults.set(id, {
67
+ ...complete,
68
+ digest: digester.digest(ctx.instances.get(id), complete),
69
+ });
70
+ }
71
+ if (scope)
72
+ for (const result of selectedResults.values())
73
+ scope.reads.merge(result.dependsOn);
74
+ return {
75
+ releases: [...new Set(ctx.programs.map((p) => p.release))],
76
+ now: ctx.now,
77
+ roots: scope ? ctx.roots.filter((r) => selected.has(r.instance)) : ctx.roots,
78
+ instances: selected,
79
+ results: selectedResults,
80
+ blockedTotal: scope
81
+ ? [...selectedResults.values()].reduce((n, r) => n + r.blocked.length, 0)
82
+ : ctx.blockedTotal,
83
+ programs: ctx.programs,
84
+ };
85
+ };
@@ -0,0 +1,9 @@
1
+ import { type LocalDate } from "./dates.js";
2
+ import { type RequirementResult } from "./model.js";
3
+ /** SHA-256 over canonical JSON data; key insertion order never affects the digest. */
4
+ export declare const digest: (value: unknown) => string;
5
+ /** The decision projection deliberately excludes source spans and presentation labels. */
6
+ export declare const canonicalDecision: (release: string, now: LocalDate, r: RequirementResult) => string;
7
+ /** A decision digest is reproducible, not a signature or a durable basis proof. */
8
+ export declare const proofOf: (release: string, now: LocalDate, r: RequirementResult) => string;
9
+ export declare const verifyProof: (proof: string, release: string, now: LocalDate, r: RequirementResult) => boolean;
@@ -0,0 +1,24 @@
1
+ import {} from "./dates.js";
2
+ import {} from "./model.js";
3
+ import { canonicalJson } from "./result-digest.js";
4
+ import { sha256 } from "./sha256.js";
5
+ /** SHA-256 over canonical JSON data; key insertion order never affects the digest. */
6
+ export const digest = (value) => sha256(canonicalJson(value));
7
+ /** The decision projection deliberately excludes source spans and presentation labels. */
8
+ export const canonicalDecision = (release, now, r) => canonicalJson({
9
+ format: "worldvm/decision@1",
10
+ release,
11
+ occurrence: r.occurrence,
12
+ status: r.status,
13
+ reasons: r.reasons.map((x) => [x.label, x.outcome, x.detail]),
14
+ evidence: r.evidence?.id ?? null,
15
+ ...(r.decision ? { decision: r.decision } : {}),
16
+ ...(r.decisionVotes ? { votes: r.decisionVotes } : {}),
17
+ ...(r.addition ? { addition: r.addition } : {}),
18
+ ...(r.additionVotes ? { additionVotes: r.additionVotes } : {}),
19
+ due: r.due,
20
+ now: r.status === "Overdue" || r.status === "Open" ? now : null,
21
+ });
22
+ /** A decision digest is reproducible, not a signature or a durable basis proof. */
23
+ export const proofOf = (release, now, r) => `d:${sha256(canonicalDecision(release, now, r))}`;
24
+ export const verifyProof = (proof, release, now, r) => proof === proofOf(release, now, r);