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,190 @@
1
+ import { sourceSyntax } from "../source-syntax.js";
2
+ import { collectionType, isLocalDate, normalizeInstant, fileDigest, } from "../../../ir-checks/index.js";
3
+ import {} from "@forma-language/forma/reader";
4
+ import {} from "./context.js";
5
+ import { children, headOf, items, LowerError, mapPairs, option, spanOf, symName, } from "./syntax.js";
6
+ const layoutChildren = (form) => {
7
+ const parts = items(form), out = [];
8
+ for (let i = 2; i < parts.length; i++) {
9
+ const part = parts[i];
10
+ if (symName(part)?.startsWith(":"))
11
+ i++;
12
+ else if (part._tag === "List")
13
+ out.push(part);
14
+ }
15
+ return out;
16
+ };
17
+ const layoutItemDiagnostic = (item, at) => ({
18
+ code: "E_LAYOUT_ITEM",
19
+ severity: "error",
20
+ message: `Unknown layout item head ${headOf(item) ?? "(empty)"}.`,
21
+ at,
22
+ help: "Use field, group, widget or sign as layout items; put conditions in :show-when.",
23
+ });
24
+ /** Report the actual item before native child validation widens its span to the layout. */
25
+ export const layoutSourceDiagnostics = (files) => {
26
+ const diagnostics = [];
27
+ for (const file of files) {
28
+ const parsed = sourceSyntax(file);
29
+ if (parsed.errors.length)
30
+ continue;
31
+ const visit = (item) => {
32
+ const head = headOf(item);
33
+ if (head === "group")
34
+ layoutChildren(item).forEach(visit);
35
+ else if (!["field", "widget", "sign"].includes(head ?? ""))
36
+ diagnostics.push(layoutItemDiagnostic(item, spanOf(file.id, item)));
37
+ };
38
+ for (const form of parsed.forms)
39
+ if (headOf(form) === "layout")
40
+ for (const step of children(form, "step"))
41
+ layoutChildren(step).forEach(visit);
42
+ }
43
+ return diagnostics;
44
+ };
45
+ export const lowerInteractions = (context, evidenceByName) => {
46
+ const { byForm, payload, formOf, componentScope, docOf, lowerExpr, at } = context;
47
+ return byForm("interaction").map((d) => {
48
+ const p = payload(d);
49
+ const form = formOf(d);
50
+ const evidence = evidenceByName.get(p.produces);
51
+ const scope = componentScope(evidence.of);
52
+ const bindings = new Map();
53
+ for (const [key, value] of mapPairs(option(form, "prefill"))) {
54
+ const field = symName(key).replace(/^:/, "");
55
+ bindings.set(field, { field, from: lowerExpr(d, value, scope) });
56
+ }
57
+ for (const [target, key] of mapPairs(option(form, "proposes"))) {
58
+ const field = symName(key);
59
+ bindings.set(field, { ...bindings.get(field), field, target: lowerExpr(d, target, scope) });
60
+ }
61
+ for (const [key, value] of mapPairs(option(form, "binds"))) {
62
+ const field = symName(key).replace(/^:/, ""), from = lowerExpr(d, value, scope);
63
+ bindings.set(field, { field, from, target: from });
64
+ }
65
+ const fixed = option(form, "fixes");
66
+ if (fixed && fixed._tag !== "Map")
67
+ throw new LowerError("E_FIXES_SHAPE", ":fixes must be a map of evidence fields to scalar literals.", at(d, fixed));
68
+ const fixes = mapPairs(fixed).map(([key, value]) => {
69
+ const field = symName(key)?.replace(/^:/, ""), declared = evidence.fields.find((f) => f.name === field);
70
+ if (!declared || !symName(key)?.startsWith(":"))
71
+ throw new LowerError("E_UNKNOWN_FIELD", "A fixed value must name a declared evidence field.", at(d, key));
72
+ if (bindings.has(field))
73
+ throw new LowerError("E_FIXES_CONFLICT", "A fixed field cannot also use :binds, :prefill or :proposes.", at(d, key));
74
+ const scalar = value._tag === "Str" || value._tag === "Bool"
75
+ ? value.value
76
+ : value._tag === "Num"
77
+ ? Number(value.value)
78
+ : symName(value)?.startsWith(":")
79
+ ? symName(value).slice(1)
80
+ : undefined;
81
+ const keyword = symName(value)?.startsWith(":") ?? false;
82
+ const fits = (type) => {
83
+ if (!type)
84
+ return false;
85
+ switch (type.kind) {
86
+ case "union":
87
+ return type.members.some(fits);
88
+ case "literal":
89
+ return keyword && scalar === type.value;
90
+ case "Keyword":
91
+ return keyword;
92
+ case "String":
93
+ return value._tag === "Str";
94
+ case "Bool":
95
+ return typeof scalar === "boolean";
96
+ case "Int":
97
+ return typeof scalar === "number" && Number.isSafeInteger(scalar);
98
+ case "Float":
99
+ return typeof scalar === "number" && Number.isFinite(scalar);
100
+ case "Date":
101
+ return value._tag === "Str" && isLocalDate(value.value);
102
+ case "Instant":
103
+ return value._tag === "Str" && !!normalizeInstant(value.value);
104
+ case "File":
105
+ return value._tag === "Str" && !!fileDigest(value.value);
106
+ }
107
+ };
108
+ if (scalar === undefined || !fits(collectionType(declared.type, context.authoredTypes)))
109
+ throw new LowerError("E_FIXES_TYPE", "The fixed literal does not match the evidence field type.", at(d, value));
110
+ return { field: field, value: scalar };
111
+ });
112
+ if (new Set(fixes.map((f) => f.field)).size !== fixes.length)
113
+ throw new LowerError("E_FIXES_CONFLICT", "A field may be fixed only once.", at(d, fixed));
114
+ return {
115
+ name: d.summary.name,
116
+ ...docOf(p.doc),
117
+ actor: p.actor,
118
+ produces: p.produces,
119
+ binds: [...bindings.values()],
120
+ ...(fixes.length ? { fixes } : {}),
121
+ ...(p.layout ? { layout: p.layout } : {}),
122
+ at: at(d, form),
123
+ };
124
+ });
125
+ };
126
+ export const lowerLayouts = (context, interactionIR, evidenceByName) => {
127
+ const { byForm, formOf, fieldScope, lowerExpr, source, at, docOf, payload } = context;
128
+ return byForm("layout").map((d) => {
129
+ const form = formOf(d);
130
+ const owner = interactionIR.find((i) => i.layout === d.summary.name);
131
+ const scope = fieldScope(owner ? evidenceByName.get(owner.produces).fields : []);
132
+ const item = (x) => {
133
+ const head = headOf(x);
134
+ const name = symName(items(x)[1]) ?? "";
135
+ const label = option(x, "label");
136
+ const showWhen = option(x, "show-when");
137
+ const common = {
138
+ ...(label?._tag === "Str" ? { label: label.value } : {}),
139
+ ...(showWhen ? { showWhen: lowerExpr(d, showWhen, scope) } : {}),
140
+ };
141
+ if (head === "field") {
142
+ if (interactionIR.some((i) => i.layout === d.summary.name && i.fixes?.some((f) => f.field === name)))
143
+ throw new LowerError("E_FIXES_LAYOUT", `Fixed field ${name} must be omitted from the layout.`, at(d, x));
144
+ const options = option(x, "options");
145
+ return {
146
+ kind: "field",
147
+ name,
148
+ ...common,
149
+ ...(options
150
+ ? {
151
+ options: mapPairs(options).map(([k, v]) => ({
152
+ value: symName(k).replace(/^:/, ""),
153
+ label: v._tag === "Str" ? v.value : source(d, v),
154
+ })),
155
+ }
156
+ : {}),
157
+ at: at(d, x),
158
+ };
159
+ }
160
+ if (head === "group")
161
+ return {
162
+ kind: "group",
163
+ name,
164
+ ...common,
165
+ items: layoutChildren(x).map(item),
166
+ at: at(d, x),
167
+ };
168
+ if (head === "widget")
169
+ return { kind: "widget", name, at: at(d, x) };
170
+ if (head === "sign")
171
+ return { kind: "sign", at: at(d, x) };
172
+ const error = layoutItemDiagnostic(x, at(d, x));
173
+ throw new LowerError(error.code, error.message, error.at, error.help);
174
+ };
175
+ return {
176
+ name: d.summary.name,
177
+ ...docOf(payload(d).doc),
178
+ steps: children(form, "step").map((step) => {
179
+ const label = items(step)[2];
180
+ return {
181
+ name: symName(items(step)[1]),
182
+ ...(label?._tag === "Str" ? { label: label.value } : {}),
183
+ items: layoutChildren(step).map(item),
184
+ at: at(d, step),
185
+ };
186
+ }),
187
+ at: at(d, form),
188
+ };
189
+ });
190
+ };
@@ -0,0 +1,5 @@
1
+ import type * as IR from "../../../world-ir/types.generated.js";
2
+ import { type LoweringContext } from "./context.js";
3
+ export declare const lowerRoles: (context: LoweringContext) => IR.Role[];
4
+ export declare const lowerCalendars: (context: LoweringContext) => IR.Calendar[];
5
+ export declare const lowerLibraries: (context: LoweringContext, libraryContent: object) => IR.Library[];
@@ -0,0 +1,41 @@
1
+ import { lowerFileFields } from "./files.js";
2
+ import { lowerSealedFields } from "./vaults.js";
3
+ import { contentDigest } from "../digest.js";
4
+ import {} from "./context.js";
5
+ export const lowerRoles = (context) => {
6
+ const { byForm, docOf, roles, at, formOf } = context;
7
+ return byForm("role").map((d) => ({
8
+ name: d.summary.name,
9
+ ...docOf(roles.get(d.summary.name).doc),
10
+ fields: lowerSealedFields(context, d, lowerFileFields(context, d, roles.get(d.summary.name).fields.map((f) => ({ name: f.name, type: f.type })))),
11
+ at: at(d, formOf(d)),
12
+ }));
13
+ };
14
+ export const lowerCalendars = (context) => {
15
+ const { byForm, payload, docOf, at, formOf } = context;
16
+ return byForm("calendar").map((d) => {
17
+ const p = payload(d);
18
+ return {
19
+ name: d.summary.name,
20
+ ...docOf(p.doc),
21
+ version: p.version,
22
+ weekend: p.weekend,
23
+ holidays: p.holidays.map(({ kind: _kind, ...h }) => h),
24
+ at: at(d, formOf(d)),
25
+ };
26
+ });
27
+ };
28
+ export const lowerLibraries = (context, libraryContent) => {
29
+ const { byForm, libraries, docOf, at, formOf } = context;
30
+ return byForm("library").map((d) => {
31
+ const p = libraries.find((l) => l.name === d.summary.name);
32
+ return {
33
+ name: p.name,
34
+ ...docOf(p.doc),
35
+ version: p.version,
36
+ subject: p.subject,
37
+ digest: contentDigest({ ...p, ...libraryContent }),
38
+ at: at(d, formOf(d)),
39
+ };
40
+ });
41
+ };
@@ -0,0 +1,6 @@
1
+ import type { ElaboratedDeclaration } from "@forma-language/forma/descriptor";
2
+ import type { SExpr } from "@forma-language/forma/reader";
3
+ import type * as IR from "../../../world-ir/types.generated.js";
4
+ import type { LoweringContext } from "./context.js";
5
+ import { type Scope } from "./syntax.js";
6
+ export declare const lowerMilestones: (context: LoweringContext, declaration: ElaboratedDeclaration, form: SExpr, scope: Scope) => IR.Milestone[];
@@ -0,0 +1,17 @@
1
+ import { children, items, LowerError, option, symName } from "./syntax.js";
2
+ export const lowerMilestones = (context, declaration, form, scope) => {
3
+ const names = new Set();
4
+ return children(form, "milestone").map((milestone) => {
5
+ const name = symName(items(milestone)[1]);
6
+ if (names.has(name))
7
+ throw new LowerError("E_MILESTONE_NAME", "Duplicate milestone name.", context.at(declaration, items(milestone)[1]), "Use a unique name for each milestone in this component.");
8
+ names.add(name);
9
+ const label = option(milestone, "label");
10
+ return {
11
+ name,
12
+ ...(label?._tag === "Str" ? { label: label.value } : {}),
13
+ when: context.lowerExpr(declaration, option(milestone, "when"), scope),
14
+ at: context.at(declaration, milestone),
15
+ };
16
+ });
17
+ };
@@ -0,0 +1,3 @@
1
+ import type * as IR from "../../../world-ir/types.generated.js";
2
+ import type { LoweringContext } from "./context.js";
3
+ export declare const lowerNotices: (cx: LoweringContext, documents: readonly IR.Document[]) => IR.Notice[];
@@ -0,0 +1,33 @@
1
+ import { noticeHelp } from "../../../ir-checks/index.js";
2
+ import { lowerRecordSeal } from "./vaults.js";
3
+ import { LowerError, option, symName } from "./syntax.js";
4
+ export const lowerNotices = (cx, documents) => cx.byForm("notice").map((d) => {
5
+ const form = cx.formOf(d), of = option(form, "of"), doc = option(form, "document"), to = option(form, "to"), owner = symName(of), document = symName(doc);
6
+ const fail = (code, node, message) => {
7
+ throw new LowerError(code, message, cx.at(d, node ?? form), noticeHelp);
8
+ };
9
+ if (!owner || !cx.components.has(owner))
10
+ return fail("E_NOTICE_DOCUMENT", of, "Name a declared owning component.");
11
+ if (!documents.some((x) => x.name === document && x.of === owner))
12
+ return fail("E_NOTICE_DOCUMENT", doc, "Choose a document owned by the notice's component.");
13
+ if (!to)
14
+ return fail("E_NOTICE_RECIPIENT", form, "Choose one entity recipient.");
15
+ let recipient;
16
+ try {
17
+ recipient = cx.lowerExpr(d, to, cx.componentScope(owner));
18
+ }
19
+ catch (error) {
20
+ if (!(error instanceof LowerError))
21
+ throw error;
22
+ return fail("E_NOTICE_RECIPIENT", to, "Choose an entity reference in the component's key-closed scope.");
23
+ }
24
+ return {
25
+ name: d.summary.name,
26
+ ...lowerRecordSeal(cx, d),
27
+ ...cx.docOf(cx.payload(d).doc),
28
+ of: owner,
29
+ document: document,
30
+ to: recipient,
31
+ at: cx.at(d, form),
32
+ };
33
+ });
@@ -0,0 +1,15 @@
1
+ import type { ElaboratedDeclaration } from "@forma-language/forma/descriptor";
2
+ import type { SExpr } from "@forma-language/forma/reader";
3
+ import type * as IR from "../../../world-ir/types.generated.js";
4
+ import type { LoweringContext } from "./context.js";
5
+ import { type Fields } from "./syntax.js";
6
+ export declare const policyError: (context: LoweringContext, d: ElaboratedDeclaration, value: SExpr, message: string, assistance?: string) => never;
7
+ export declare const policyMap: (context: LoweringContext, d: ElaboratedDeclaration, value: SExpr | undefined) => readonly (readonly [SExpr, SExpr])[];
8
+ export declare const lowerPolicyNumber: (context: LoweringContext, d: ElaboratedDeclaration, value: SExpr) => IR.PolicyNumber;
9
+ export declare const lowerParamBounds: (context: LoweringContext, d: ElaboratedDeclaration, form: SExpr, params: Fields) => IR.ParamBound[];
10
+ export declare const lowerPolicyParams: (context: LoweringContext, d: ElaboratedDeclaration, form: SExpr, component: IR.Component) => {
11
+ name: string;
12
+ value: IR.PolicyNumber;
13
+ at: IR.Span;
14
+ }[];
15
+ export declare const checkAccountParams: (context: LoweringContext, d: ElaboratedDeclaration, form: SExpr, components: readonly IR.Component[]) => void;
@@ -0,0 +1,71 @@
1
+ import { policyBoundValid, policyParameterType, policyValueWithin } from "../../../ir-checks/index.js";
2
+ import { headOf, items, LowerError, mapPairs, option, symName } from "./syntax.js";
3
+ const help = "Declare :param-bounds with fixed :default/:min/:max and :tighten :lower or :higher. Use safe nonnegative integers or one fixed duration unit; policy values must stay in the declared tightening interval.";
4
+ export const policyError = (context, d, value, message, assistance = help) => {
5
+ throw new LowerError("E_POLICY_LOOSENS", message, context.at(d, value), assistance);
6
+ };
7
+ export const policyMap = (context, d, value) => {
8
+ if (!value)
9
+ return [];
10
+ if (value._tag !== "Map")
11
+ return policyError(context, d, value, "Policy data must be an explicit map.");
12
+ const pairs = mapPairs(value), names = pairs.map(([key]) => symName(key)?.replace(/^:/, ""));
13
+ if (names.some((name) => !name) || new Set(names).size !== names.length)
14
+ return policyError(context, d, value, "Policy maps need unique named keys.");
15
+ return pairs;
16
+ };
17
+ export const lowerPolicyNumber = (context, d, value) => {
18
+ const unit = value._tag === "Num" ? "integer" : headOf(value), number = value._tag === "Num" ? value : items(value)[1];
19
+ if (!unit ||
20
+ !["integer", "days", "years", "hours", "minutes"].includes(unit) ||
21
+ number?._tag !== "Num" ||
22
+ (value._tag !== "Num" && items(value).length !== 2) ||
23
+ !Number.isSafeInteger(Number(number.value)) ||
24
+ Number(number.value) < 0)
25
+ return policyError(context, d, value, "A policy parameter requires a fixed nonnegative safe integer or duration.");
26
+ return { n: Number(number.value), unit: unit };
27
+ };
28
+ export const lowerParamBounds = (context, d, form, params) => policyMap(context, d, option(form, "param-bounds")).map(([key, value]) => {
29
+ const name = symName(key).replace(/^:/, ""), param = params.find((p) => p.name === name);
30
+ const type = param ? policyParameterType(param.type, context.authoredTypes) : null;
31
+ if (!type)
32
+ return policyError(context, d, key, "Bounds must name an Int or Duration parameter declared by this component.");
33
+ const pairs = policyMap(context, d, value), names = pairs.map(([k]) => symName(k));
34
+ if (pairs.length !== 4 ||
35
+ [":default", ":min", ":max", ":tighten"].some((k) => !names.includes(k)))
36
+ return policyError(context, d, value, "Bounds require exactly :default, :min, :max and :tighten.");
37
+ const get = (name) => pairs.find(([k]) => symName(k) === name)[1];
38
+ const direction = symName(get(":tighten"));
39
+ if (direction !== ":lower" && direction !== ":higher")
40
+ return policyError(context, d, get(":tighten"), "Unknown tightening direction.");
41
+ const bound = {
42
+ name,
43
+ default: lowerPolicyNumber(context, d, get(":default")),
44
+ min: lowerPolicyNumber(context, d, get(":min")),
45
+ max: lowerPolicyNumber(context, d, get(":max")),
46
+ tighten: direction === ":lower" ? "lower" : "higher",
47
+ at: context.at(d, value),
48
+ };
49
+ if (!policyBoundValid(bound) || (type === "integer") !== (bound.default.unit === "integer"))
50
+ return policyError(context, d, value, "Bounds must share the parameter's unit and tighten from its library default.");
51
+ return bound;
52
+ });
53
+ export const lowerPolicyParams = (context, d, form, component) => policyMap(context, d, option(form, "params")).map(([key, value]) => {
54
+ const name = symName(key).replace(/^:/, ""), bound = component.paramBounds?.find((b) => b.name === name);
55
+ if (!bound)
56
+ return policyError(context, d, key, `Parameter ${name} has no declared library tightening bounds.`);
57
+ const parsed = lowerPolicyNumber(context, d, value);
58
+ if (!policyValueWithin(bound, parsed))
59
+ return policyError(context, d, value, `Parameter ${name} exceeds its library tightening bounds.`);
60
+ return { name, value: parsed, at: context.at(d, value) };
61
+ });
62
+ export const checkAccountParams = (context, d, form, components) => {
63
+ for (const [key, value] of mapPairs(option(form, "params"))) {
64
+ const name = symName(key)?.replace(/^:/, "");
65
+ for (const bound of components
66
+ .flatMap((c) => c.paramBounds ?? [])
67
+ .filter((b) => b.name === name))
68
+ if (!policyValueWithin(bound, lowerPolicyNumber(context, d, value)))
69
+ policyError(context, d, value, `Account parameter ${name} exceeds its library tightening bounds.`);
70
+ }
71
+ };
@@ -0,0 +1,6 @@
1
+ import { type PrincipalIR } from "../../../ir-checks/index.js";
2
+ import type { ElaboratedDeclaration } from "@forma-language/forma/descriptor";
3
+ import type { SExpr } from "@forma-language/forma/reader";
4
+ import type * as IR from "../../../world-ir/types.generated.js";
5
+ import type { LoweringContext } from "./context.js";
6
+ export declare const lowerPolicies: (context: LoweringContext, d: ElaboratedDeclaration, account: SExpr, components: readonly IR.Component[], model: PrincipalIR) => IR.AccountPolicy[];
@@ -0,0 +1,95 @@
1
+ import { principalActionKey, principalKinds } from "../../../ir-checks/index.js";
2
+ import { lowerEffective } from "./effective.js";
3
+ import { lowerPolicyParams, policyError, policyMap } from "./param-bounds.js";
4
+ import { children, items, LowerError, option, symName } from "./syntax.js";
5
+ const help = "Target a declared component; cite a source, add Truth constraints and restrict named actions. Read only keyed inputs and pure facts/time; do not replace law satisfaction or authority.";
6
+ const closed = (component, expr, fail, bound = new Set()) => {
7
+ if (expr.k === "var" &&
8
+ !bound.has(expr.name) &&
9
+ (expr.name === "self" || component.requirements.some((r) => r.name === expr.name)))
10
+ fail(expr, "Policies cannot depend on their own requirement status.");
11
+ if (expr.k === "var" &&
12
+ !bound.has(expr.name) &&
13
+ component.inputs.some((i) => i.name === expr.name) &&
14
+ !component.key.includes(expr.name))
15
+ fail(expr, "Policy reads a component input outside its key.");
16
+ if (expr.k === "inst" ||
17
+ (expr.k === "ref" && expr.kind !== "evidence" && expr.kind !== "calendar"))
18
+ fail(expr, "Policies cannot depend on component or decision status projections.");
19
+ if (expr.k === "call")
20
+ expr.args.forEach((a) => closed(component, a, fail, bound));
21
+ if (expr.k === "list")
22
+ expr.items.forEach((a) => closed(component, a, fail, bound));
23
+ if (expr.k === "fn")
24
+ closed(component, expr.body, fail, new Set([...bound, ...expr.params]));
25
+ if (expr.k === "if")
26
+ [expr.test, expr.then, expr.else].forEach((a) => closed(component, a, fail, bound));
27
+ if (expr.k === "read" || expr.k === "attr")
28
+ closed(component, expr.of, fail, bound);
29
+ };
30
+ export const lowerPolicies = (context, d, account, components, model) => {
31
+ const names = new Set();
32
+ return children(account, "policy").map((form) => {
33
+ const name = symName(items(form)[1]), doc = items(form)[2], of = symName(option(form, "of"));
34
+ if (names.has(name))
35
+ return policyError(context, d, items(form)[1], "Policy names must be unique within an account.", help);
36
+ names.add(name);
37
+ const component = components.find((c) => c.name === of);
38
+ if (!component)
39
+ return policyError(context, d, option(form, "of"), "Policy target is not a declared component.", help);
40
+ const expression = (value, guard = false) => {
41
+ const scope = new Map(context.componentScope(of));
42
+ if (guard)
43
+ component.params.forEach((param) => scope.delete(param.name));
44
+ let expr;
45
+ try {
46
+ expr = context.lowerExpr(d, value, scope);
47
+ }
48
+ catch (error) {
49
+ if (!(error instanceof LowerError))
50
+ throw error;
51
+ return policyError(context, d, value, error.message, help);
52
+ }
53
+ closed(component, expr, (e, message) => {
54
+ throw new LowerError("E_POLICY_LOOSENS", message, e.at, help);
55
+ });
56
+ return expr;
57
+ };
58
+ const when = option(form, "when"), require = option(form, "require"), cites = context.citations(d, form).cites ?? [];
59
+ if (!cites.length)
60
+ return policyError(context, d, option(form, "cites") ?? form, "Account policies require a specific source citation.", help);
61
+ const assignments = policyMap(context, d, option(form, "assign")).map(([key, value]) => {
62
+ const action = symName(key).replace(/^:/, ""), original = component.actions.find((a) => a.name === action);
63
+ if (!original || original.via.kind !== "interaction" || !original.assignee)
64
+ return policyError(context, d, key, "Policy assignments restrict declared human actions with existing assignees.", help);
65
+ const assignee = expression(value);
66
+ const kinds = principalKinds({
67
+ ...model,
68
+ components: components.map((c) => c.name !== of
69
+ ? c
70
+ : { ...c, actions: [{ ...original, assignee, assigneeKind: undefined }] }),
71
+ });
72
+ if (kinds.diagnostics.length) {
73
+ const error = kinds.diagnostics[0];
74
+ throw new LowerError(error.code, error.message, error.at, error.help);
75
+ }
76
+ const assigneeKind = kinds.assignees.get(principalActionKey(of, action));
77
+ if (!assigneeKind)
78
+ return policyError(context, d, value, "An assignment restriction must name an entity or group.", help);
79
+ return { action, assignee, assigneeKind, at: context.at(d, value) };
80
+ });
81
+ const effective = lowerEffective(context, d, form);
82
+ return {
83
+ name,
84
+ doc: doc?._tag === "Str" ? doc.value : "",
85
+ of,
86
+ cites: [cites[0], ...cites.slice(1)],
87
+ ...(when ? { when: expression(when, true) } : {}),
88
+ ...(require ? { require: expression(require) } : {}),
89
+ params: lowerPolicyParams(context, d, form, component),
90
+ assign: assignments,
91
+ ...(effective ? { effective } : {}),
92
+ at: context.at(d, form),
93
+ };
94
+ });
95
+ };
@@ -0,0 +1,62 @@
1
+ import { type PrincipalIR } from "../../../ir-checks/index.js";
2
+ import type * as IR from "../../../world-ir/types.generated.js";
3
+ export declare const lowerPrincipals: (model: PrincipalIR, components: readonly IR.Component[], decisions: readonly IR.Decision[]) => {
4
+ components: {
5
+ requirements: IR.Requirement[];
6
+ actions: IR.Action[];
7
+ library?: string;
8
+ operations?: ReadonlyArray<string>;
9
+ milestones?: ReadonlyArray<IR.Milestone>;
10
+ holds?: ReadonlyArray<IR.Hold>;
11
+ resources?: readonly [IR.Resource, ...IR.Resource[]];
12
+ name: string;
13
+ doc?: string;
14
+ key: ReadonlyArray<string>;
15
+ home: IR.Home;
16
+ inputs: ReadonlyArray<IR.Field>;
17
+ params: ReadonlyArray<IR.Field>;
18
+ paramBounds?: readonly [IR.ParamBound, ...IR.ParamBound[]];
19
+ cycle?: IR.Expr;
20
+ slots: ReadonlyArray<IR.Slot>;
21
+ outputs: ReadonlyArray<IR.Output>;
22
+ machines: ReadonlyArray<{
23
+ readonly name: string;
24
+ readonly protocol: string;
25
+ readonly at: IR.Span;
26
+ }>;
27
+ invariants: ReadonlyArray<{
28
+ readonly name: string;
29
+ readonly cites?: ReadonlyArray<IR.Citation>;
30
+ readonly forbids: {
31
+ readonly action: string;
32
+ readonly subject: IR.Expr;
33
+ };
34
+ readonly while: IR.Expr;
35
+ readonly at: IR.Span;
36
+ }>;
37
+ retention?: {
38
+ readonly until: IR.Expr;
39
+ readonly disposal: string;
40
+ readonly cites?: ReadonlyArray<IR.Citation>;
41
+ readonly at: IR.Span;
42
+ };
43
+ at: IR.Span;
44
+ }[];
45
+ decisions: {
46
+ byKind: "group" | "individual";
47
+ name: string;
48
+ doc?: string;
49
+ of: string;
50
+ by: IR.Expr;
51
+ applies: string;
52
+ when?: IR.Expr;
53
+ effect: "approve" | "reject" | "waive" | "defer" | "accept" | "add";
54
+ reason: IR.TypeRef;
55
+ until?: IR.Expr;
56
+ expires?: IR.Expr;
57
+ approvals?: IR.Expr;
58
+ distinctFrom?: ReadonlyArray<IR.Expr>;
59
+ cites?: ReadonlyArray<IR.Citation>;
60
+ at: IR.Span;
61
+ }[];
62
+ };
@@ -0,0 +1,32 @@
1
+ import { principalActionKey, principalEscalationKey, principalKinds, } from "../../../ir-checks/index.js";
2
+ import { LowerError } from "./syntax.js";
3
+ export const lowerPrincipals = (model, components, decisions) => {
4
+ const kinds = principalKinds(model), diagnostic = kinds.diagnostics[0];
5
+ if (diagnostic)
6
+ throw new LowerError(diagnostic.code, diagnostic.message, diagnostic.at, diagnostic.help);
7
+ return {
8
+ components: components.map((component) => ({
9
+ ...component,
10
+ requirements: component.requirements.map((requirement) => requirement.escalate
11
+ ? {
12
+ ...requirement,
13
+ escalate: requirement.escalate.map((step, index) => {
14
+ const kind = kinds.escalations.get(principalEscalationKey(component.name, requirement.name, index));
15
+ return { ...step, whoKind: kind };
16
+ }),
17
+ }
18
+ : requirement),
19
+ actions: component.actions.map((action) => {
20
+ const kind = kinds.assignees.get(principalActionKey(component.name, action.name));
21
+ return kind ? { ...action, assigneeKind: kind } : action;
22
+ }),
23
+ })),
24
+ decisions: decisions.map((decision) => {
25
+ const kind = kinds.authorities.get(decision.name);
26
+ return {
27
+ ...decision,
28
+ byKind: kind === "entity" ? "individual" : "group",
29
+ };
30
+ }),
31
+ };
32
+ };
@@ -0,0 +1,9 @@
1
+ import type { ElaboratedDeclaration } from "@forma-language/forma/descriptor";
2
+ import { type SExpr } from "@forma-language/forma/reader";
3
+ import type * as IR from "../../../world-ir/types.generated.js";
4
+ import type { SourceFile } from "../compile.js";
5
+ import type { LoweringContext } from "./context.js";
6
+ import { type Scope } from "./syntax.js";
7
+ /** Check closed syntax before nested Expr validation so malformed maps get actionable spans. */
8
+ export declare const recurrenceDiagnostics: (files: readonly SourceFile[]) => IR.Diagnostic[];
9
+ export declare const lowerRecurrence: (context: LoweringContext, declaration: ElaboratedDeclaration, form: SExpr, scope: Scope) => IR.Recurrence | undefined;