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,124 @@
1
+ import { parse, isRedNode } from "@forma-language/forma/reader";
2
+ export const readForma = (source) => {
3
+ const parsed = parse(source);
4
+ const convert = (element) => {
5
+ if (!isRedNode(element)) {
6
+ const comments = element
7
+ .leadingTrivia()
8
+ .filter((t) => t.kind === "line-comment")
9
+ .map((t) => ({
10
+ kind: "Comment",
11
+ text: t.text.replace(/[\r\n]+$/, ""),
12
+ from: t.loc.start,
13
+ to: t.loc.end,
14
+ children: [],
15
+ }));
16
+ if (["lparen", "rparen", "lbracket", "rbracket", "lbrace", "rbrace", "eof"].includes(element.tokenType()))
17
+ return comments;
18
+ const span = element.span();
19
+ return [
20
+ ...comments,
21
+ { kind: "Atom", text: element.text(), from: span.start, to: span.end, children: [] },
22
+ ];
23
+ }
24
+ const children = element.children().flatMap(convert);
25
+ if (element.kind() === "Root")
26
+ return children;
27
+ if (!["List", "Vector", "Map", "Set"].includes(element.kind()))
28
+ return children;
29
+ const span = element.span();
30
+ // Leading comments on an opening delimiter belong before the collection.
31
+ const leading = [];
32
+ while (children[0]?.kind === "Comment" && children[0].from < span.start)
33
+ leading.push(children.shift());
34
+ return [
35
+ ...leading,
36
+ {
37
+ kind: element.kind(),
38
+ text: source.slice(span.start, span.end),
39
+ from: span.start,
40
+ to: span.end,
41
+ children,
42
+ },
43
+ ];
44
+ };
45
+ return { forms: convert(parsed.redTree), valid: parsed.errors.length === 0 };
46
+ };
47
+ const delimiters = {
48
+ List: ["(", ")"],
49
+ Vector: ["[", "]"],
50
+ Map: ["{", "}"],
51
+ Set: ["#{", "}"],
52
+ };
53
+ const flat = (node) => {
54
+ if (node.kind === "Comment")
55
+ return null;
56
+ const delimit = delimiters[node.kind];
57
+ if (!delimit)
58
+ return node.text.includes("\n") ? null : node.text;
59
+ const parts = node.children.map(flat);
60
+ return parts.some((p) => p === null) ? null : delimit[0] + parts.join(" ") + delimit[1];
61
+ };
62
+ /** Two spaces, 100 columns (soft for indivisible strings/tokens), LF and a final newline.
63
+ * Comments are kept verbatim on their own lines. Keyword/value and map pairs share a line.
64
+ * Invalid source is rejected so a formatter never silently repairs or drops a token.
65
+ */
66
+ export const formatForma = (source) => {
67
+ const { forms, valid } = readForma(source);
68
+ if (!valid)
69
+ throw new SyntaxError("Cannot format invalid Forma source.");
70
+ const render = (node, column) => {
71
+ const inline = flat(node);
72
+ if (inline !== null && column + inline.length <= 100)
73
+ return inline;
74
+ const delimit = delimiters[node.kind];
75
+ if (!delimit)
76
+ return node.text;
77
+ const indent = " ".repeat(column + 2);
78
+ const groups = [];
79
+ for (let i = 0; i < node.children.length; i++) {
80
+ const child = node.children[i];
81
+ const next = node.children[i + 1];
82
+ if (child.kind !== "Comment" &&
83
+ next &&
84
+ next.kind !== "Comment" &&
85
+ (node.kind === "Map" || (child.kind === "Atom" && child.text.startsWith(":")))) {
86
+ groups.push([child, next]);
87
+ i++;
88
+ }
89
+ else
90
+ groups.push([child]);
91
+ }
92
+ let result = delimit[0];
93
+ for (let i = 0; i < groups.length; i++) {
94
+ const group = groups[i];
95
+ const parts = [];
96
+ let col = column + 2;
97
+ for (const child of group) {
98
+ const part = render(child, col);
99
+ parts.push(part);
100
+ col = part.includes("\n")
101
+ ? part.length - part.lastIndexOf("\n") - 1
102
+ : col + part.length + 1;
103
+ }
104
+ const text = parts.join(" ");
105
+ // Keep a list's head and declared name together, as in existing worlds.
106
+ if (i === 0 && node.kind === "List" && group[0]?.kind === "Atom")
107
+ result += text;
108
+ else if (i === 1 &&
109
+ node.kind === "List" &&
110
+ group.length === 1 &&
111
+ group[0]?.kind === "Atom" &&
112
+ !group[0].text.startsWith(":"))
113
+ result += " " + text;
114
+ else
115
+ result += "\n" + indent + text;
116
+ }
117
+ if (node.children.at(-1)?.kind === "Comment")
118
+ result += "\n" + " ".repeat(column);
119
+ return result + delimit[1];
120
+ };
121
+ return (forms
122
+ .map((form, i) => render(form, 0) + (form.kind !== "Comment" && i < forms.length - 1 ? "\n" : ""))
123
+ .join("\n") + (forms.length ? "\n" : ""));
124
+ };
@@ -0,0 +1,7 @@
1
+ import type { Action } from "../world-ir/types.generated.js";
2
+ /** A scalar keeps its wire representation; consumers can uniformly inspect its targets. */
3
+ export declare const advanceTargets: (action: Pick<Action, "advances">) => readonly string[];
4
+ /** Shared work keys stay inside one home; changing non-key facts never renames work. */
5
+ export declare const stableWorkIdentity: (component: {
6
+ readonly key: readonly string[];
7
+ }, action: Pick<Action, "idempotency">) => boolean;
@@ -0,0 +1,6 @@
1
+ /** A scalar keeps its wire representation; consumers can uniformly inspect its targets. */
2
+ export const advanceTargets = (action) => typeof action.advances === "string" ? [action.advances] : action.advances;
3
+ /** Shared work keys stay inside one home; changing non-key facts never renames work. */
4
+ export const stableWorkIdentity = (component, action) => action.idempotency === undefined ||
5
+ (action.idempotency.every((e) => e.k === "var" && (e.name === "self" || component.key.includes(e.name))) &&
6
+ action.idempotency.some((e) => e.k === "var" && (e.name === "self" || e.name === component.key[0])));
@@ -0,0 +1,14 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ import { type SensitiveClass } from "./sensitivity.js";
3
+ export declare const agentReadHelp = "Use :of Component, :reads [input.field], and :may-read [{:class :pii :vault vault-name}]. Grant every source class in its exact vault; grants do not replace current read authority. Powers and execution remain M10.";
4
+ export interface AgentReadPermission {
5
+ readonly class: SensitiveClass;
6
+ readonly vault: string;
7
+ }
8
+ export interface AgentReadInfo {
9
+ readonly path: string;
10
+ readonly permissions: readonly AgentReadPermission[];
11
+ }
12
+ /** Resolve authored paths, never caller-supplied classification or display-path hints. */
13
+ export declare const agentReadInfo: (ir: IR.WorldIR, agent: IR.Agent, expr: IR.Expr) => AgentReadInfo | undefined;
14
+ export declare const agentReadDiagnostics: (ir: IR.WorldIR) => IR.Diagnostic[];
@@ -0,0 +1,118 @@
1
+ import { readTypeModel } from "./read-types.js";
2
+ import { sealingModel } from "./sealing.js";
3
+ import { sensitiveClasses, sensitivityOfType } from "./sensitivity.js";
4
+ export const agentReadHelp = "Use :of Component, :reads [input.field], and :may-read [{:class :pii :vault vault-name}]. Grant every source class in its exact vault; grants do not replace current read authority. Powers and execution remain M10.";
5
+ const one = (values) => values.length === 1 ? values[0] : undefined;
6
+ const only = (value, keys) => Object.keys(value).every((k) => keys.includes(k));
7
+ /** Resolve authored paths, never caller-supplied classification or display-path hints. */
8
+ export const agentReadInfo = (ir, agent, expr) => {
9
+ const owner = one(ir.components.filter((c) => c.name === agent.of));
10
+ if (!owner)
11
+ return undefined;
12
+ const model = sealingModel(ir);
13
+ const known = readTypeModel(ir);
14
+ const resolve = (e) => {
15
+ if (!e || typeof e !== "object")
16
+ return undefined;
17
+ if (e.k === "var") {
18
+ const field = one([...owner.inputs, ...owner.params].filter((f) => f.name === e.name));
19
+ return field ? { path: e.name, type: field.type, fields: [] } : undefined;
20
+ }
21
+ if (e.k !== "read" && e.k !== "attr")
22
+ return undefined;
23
+ const base = resolve(e.of), target = base && model.reference(base.type), record = one([...ir.roles, ...ir.entities].filter((r) => r.name === target));
24
+ if (!base || !record || !known(base.type))
25
+ return undefined;
26
+ let field;
27
+ if (e.k === "read") {
28
+ const role = one(ir.roles.filter((r) => r === record && r.name === e.role));
29
+ field = role && one(role.fields.filter((f) => f.name === e.field));
30
+ }
31
+ else {
32
+ const entity = one(ir.entities.filter((r) => r === record));
33
+ const matches = ir.entities.flatMap((r) => r.fields).filter((f) => f.attr === e.attr);
34
+ const found = entity && one(entity.fields.filter((f) => f.attr === e.attr));
35
+ field =
36
+ found && matches.length === 1 && found.attr === `${entity.ns}/${found.name}`
37
+ ? found
38
+ : undefined;
39
+ }
40
+ if (!field || !known(field.type))
41
+ return undefined;
42
+ const path = `${base.path}.${field.name}`;
43
+ return e.meta?.path === path
44
+ ? { path, type: field.type, fields: [...base.fields, field] }
45
+ : undefined;
46
+ };
47
+ const result = resolve(expr);
48
+ if (!result || !result.fields.length)
49
+ return undefined;
50
+ const permissions = new Map();
51
+ for (const field of result.fields) {
52
+ const classes = sensitivityOfType(field.type, ir.types);
53
+ if (!classes.ok)
54
+ return undefined;
55
+ for (const classification of classes.classes) {
56
+ const vault = one((ir.vaults ?? []).filter((v) => v.name === field.sealedBy?.vault));
57
+ if (!vault || !vault.holds.includes(classification))
58
+ return undefined;
59
+ permissions.set(`${classification}:${vault.name}`, {
60
+ class: classification,
61
+ vault: vault.name,
62
+ });
63
+ }
64
+ }
65
+ return { path: result.path, permissions: [...permissions.values()] };
66
+ };
67
+ export const agentReadDiagnostics = (ir) => {
68
+ const out = [], names = new Set();
69
+ const report = (message, at) => out.push({
70
+ code: "E_AGENT_SENSITIVE_READ",
71
+ severity: "error",
72
+ message,
73
+ at,
74
+ help: agentReadHelp,
75
+ });
76
+ for (const agent of ir.agents ?? []) {
77
+ if (!only(agent, ["name", "doc", "of", "reads", "mayRead", "at"]) ||
78
+ typeof agent.name !== "string" ||
79
+ !agent.name.trim() ||
80
+ names.has(agent.name) ||
81
+ !one(ir.components.filter((c) => c.name === agent.of)))
82
+ report("An agent needs a unique name and one declared owning component, with read options only.", agent.at);
83
+ names.add(agent.name);
84
+ if (!Array.isArray(agent.reads) || !agent.reads.length || !Array.isArray(agent.mayRead)) {
85
+ report("An agent needs nonempty reads and an explicit canonical grant list.", agent.at);
86
+ continue;
87
+ }
88
+ const grants = new Set();
89
+ for (const grant of agent.mayRead) {
90
+ if (!grant ||
91
+ !only(grant, ["class", "vault", "at"]) ||
92
+ !sensitiveClasses.includes(grant.class) ||
93
+ !one((ir.vaults ?? []).filter((v) => v.name === grant.vault))?.holds.includes(grant.class)) {
94
+ report("A read grant needs a declared class and a vault that holds it.", grant?.at ?? agent.at);
95
+ continue;
96
+ }
97
+ const key = `${grant.class}:${grant.vault}`;
98
+ if (grants.has(key))
99
+ report("Read grants must be unique class/vault pairs.", grant.at);
100
+ grants.add(key);
101
+ }
102
+ const paths = new Set();
103
+ for (const read of agent.reads) {
104
+ if (!read || typeof read !== "object") {
105
+ report("A read must be a concrete authored field path.", agent.at);
106
+ continue;
107
+ }
108
+ const info = agentReadInfo(ir, agent, read);
109
+ if (!info ||
110
+ paths.has(info.path) ||
111
+ info.permissions.some((p) => !grants.has(`${p.class}:${p.vault}`)))
112
+ report("Every requested path must be known, unique and covered by its exact class/vault grants.", read.at);
113
+ if (info)
114
+ paths.add(info.path);
115
+ }
116
+ }
117
+ return out;
118
+ };
@@ -0,0 +1,3 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const amendmentHelp = "Use (amend) on evidence with an all-values attestation and an owned public producing interaction action. Correct through that operation with a standing previous evidence ID, reason and fresh human attestation.";
3
+ export declare const amendmentDiagnostics: (ir: Pick<IR.WorldIR, "evidence" | "components" | "interactions" | "componentContracts">) => IR.Diagnostic[];
@@ -0,0 +1,21 @@
1
+ import { componentOperationNames } from "./component-operations.js";
2
+ export const amendmentHelp = "Use (amend) on evidence with an all-values attestation and an owned public producing interaction action. Correct through that operation with a standing previous evidence ID, reason and fresh human attestation.";
3
+ export const amendmentDiagnostics = (ir) => ir.evidence.flatMap((e) => {
4
+ if (!e.amend)
5
+ return [];
6
+ const error = (code, message) => [
7
+ { code, severity: "error", message, at: e.amend.at, help: amendmentHelp },
8
+ ];
9
+ if (!e.attest || e.attest.covers !== "all")
10
+ return error("E_AMEND_EVIDENCE", "Amendments require an all-values attestation.");
11
+ const owner = ir.components.find((c) => c.name === e.of);
12
+ if (!owner ||
13
+ !owner.actions.some((a) => {
14
+ const via = a.via;
15
+ return (via.kind === "interaction" &&
16
+ componentOperationNames(ir, owner).includes(a.name) &&
17
+ ir.interactions.some((i) => i.name === via.name && i.produces === e.name));
18
+ }))
19
+ return error("E_AMEND_OPERATION", "Amendments require an owned public producing interaction action.");
20
+ return [];
21
+ });
@@ -0,0 +1,3 @@
1
+ /** Canonical JSON data: sorted object keys, ordered arrays, no silent non-JSON coercions. */
2
+ export declare const canonicalJson: (value: unknown) => string;
3
+ export declare const semanticJson: (value: unknown) => string;
@@ -0,0 +1,85 @@
1
+ const isSpan = (value) => {
2
+ if (!value || typeof value !== "object" || Object.keys(value).length !== 5)
3
+ return false;
4
+ const span = value;
5
+ return (typeof span.src === "string" &&
6
+ ["from", "to", "line", "col"].every((k) => typeof span[k] === "number"));
7
+ };
8
+ const encode = (value, ignoreSpans) => {
9
+ const active = new Set();
10
+ const memo = new WeakMap();
11
+ let numericKeys = false;
12
+ const visit = (item) => {
13
+ if (item === null || typeof item === "string" || typeof item === "boolean")
14
+ return item;
15
+ if (typeof item === "number" && Number.isFinite(item))
16
+ return item;
17
+ if (!item || typeof item !== "object" || active.has(item))
18
+ throw new TypeError("Cannot canonicalize non-JSON or cyclic value");
19
+ if (!Array.isArray(item) && Object.prototype.toString.call(item) !== "[object Object]")
20
+ throw new TypeError("Cannot canonicalize non-JSON object");
21
+ if (memo.has(item))
22
+ return memo.get(item);
23
+ active.add(item);
24
+ try {
25
+ // Captured lexical data is passive; resolving Env.get would read a different basis.
26
+ if (ignoreSpans &&
27
+ "params" in item &&
28
+ Array.isArray(item.params) &&
29
+ "body" in item &&
30
+ "env" in item &&
31
+ item.env &&
32
+ typeof item.env === "object" &&
33
+ "snapshot" in item.env &&
34
+ typeof item.env.snapshot === "function")
35
+ return visit({
36
+ closure: { params: item.params, body: item.body, scope: item.env.snapshot() },
37
+ });
38
+ let normalized;
39
+ if (Array.isArray(item))
40
+ normalized = Array.from(item, visit);
41
+ else {
42
+ const record = item;
43
+ const out = {};
44
+ for (const key of Object.keys(record).sort()) {
45
+ if (ignoreSpans && key === "at" && isSpan(record[key]))
46
+ continue;
47
+ // Native JSON reorders integer property names; those require lexical emission.
48
+ const first = key.charCodeAt(0);
49
+ if (first >= 48 &&
50
+ first <= 57 &&
51
+ String(Number(key) >>> 0) === key &&
52
+ key !== "4294967295")
53
+ numericKeys = true;
54
+ const value = visit(record[key]);
55
+ if (key === "__proto__")
56
+ Object.defineProperty(out, key, { value, enumerable: true });
57
+ else
58
+ out[key] = value;
59
+ }
60
+ normalized = out;
61
+ }
62
+ memo.set(item, normalized);
63
+ return normalized;
64
+ }
65
+ finally {
66
+ active.delete(item);
67
+ }
68
+ };
69
+ const normalized = visit(value);
70
+ const lexical = (item) => {
71
+ if (!item || typeof item !== "object")
72
+ return JSON.stringify(item);
73
+ if (Array.isArray(item))
74
+ return `[${item.map(lexical).join(",")}]`;
75
+ const record = item;
76
+ return `{${Object.keys(record)
77
+ .sort()
78
+ .map((key) => `${JSON.stringify(key)}:${lexical(record[key])}`)
79
+ .join(",")}}`;
80
+ };
81
+ return numericKeys ? lexical(normalized) : JSON.stringify(normalized);
82
+ };
83
+ /** Canonical JSON data: sorted object keys, ordered arrays, no silent non-JSON coercions. */
84
+ export const canonicalJson = (value) => encode(value, false);
85
+ export const semanticJson = (value) => encode(value, true);
@@ -0,0 +1,2 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const childParameterDiagnostics: (ir: Pick<IR.WorldIR, "components" | "types">) => IR.Diagnostic[];
@@ -0,0 +1,43 @@
1
+ import { policyValueWithin, policyParameterType } from "./policy-bounds.js";
2
+ export const childParameterDiagnostics = (ir) => {
3
+ const edges = ir.components.flatMap((parent) => parent.slots.filter((s) => s.with?.length).map((slot) => ({ parent, slot })));
4
+ if (!edges.length)
5
+ return [];
6
+ const result = [], report = (message, at) => result.push({
7
+ code: "E_PARAM_OUT_OF_BOUNDS",
8
+ severity: "error",
9
+ message,
10
+ at,
11
+ help: "Set only declared bounded child parameters with fixed safe Int/Duration values in their tightening interval and unit. Use an acyclic composition graph; use account/policy parameters for unsupported shapes.",
12
+ });
13
+ const components = new Map(ir.components.map((c) => [c.name, c]));
14
+ for (const { slot } of edges) {
15
+ const target = components.get(slot.component), seen = new Set();
16
+ for (const param of slot.with) {
17
+ const bound = target?.paramBounds?.find((b) => b.name === param.name), field = target?.params.find((p) => p.name === param.name), type = field ? policyParameterType(field.type, ir.types) : null;
18
+ if (seen.has(param.name) ||
19
+ !bound ||
20
+ !type ||
21
+ type !== (param.value.unit === "integer" ? "integer" : "duration") ||
22
+ !policyValueWithin(bound, param.value))
23
+ report(`${slot.name}/${param.name} is not a valid bounded child parameter.`, param.at);
24
+ seen.add(param.name);
25
+ }
26
+ }
27
+ const done = new Set(), active = new Set();
28
+ const cyclic = (name) => {
29
+ if (active.has(name))
30
+ return true;
31
+ if (done.has(name))
32
+ return false;
33
+ active.add(name);
34
+ if (components.get(name)?.slots.some((s) => cyclic(s.component)))
35
+ return true;
36
+ active.delete(name);
37
+ done.add(name);
38
+ return false;
39
+ };
40
+ if (ir.components.some((c) => cyclic(c.name)))
41
+ report("Models with child parameter overrides require acyclic component composition.", edges[0].slot.with[0].at);
42
+ return result;
43
+ };
@@ -0,0 +1,3 @@
1
+ import type { ClockDiagnostic } from "./index.js";
2
+ /** Raw IR hosts receive the same guard, at the containing declaration/function span. */
3
+ export declare const clockBindingDiagnostics: (ir: unknown) => ClockDiagnostic[];
@@ -0,0 +1,43 @@
1
+ /** Raw IR hosts receive the same guard, at the containing declaration/function span. */
2
+ export const clockBindingDiagnostics = (ir) => {
3
+ const out = [];
4
+ const object = (v) => v && typeof v === "object" ? v : {};
5
+ const list = (v) => (Array.isArray(v) ? v : []);
6
+ const check = (names, at) => {
7
+ if (!names.some((n) => n === "today" || n === "now"))
8
+ return;
9
+ out.push({
10
+ code: "E_CLOCK_BINDING",
11
+ severity: "error",
12
+ message: "Clock names cannot be shadowed by runtime bindings.",
13
+ help: "Rename the binding; today and now are reserved clock expressions. Access role/entity fields through their paths.",
14
+ ...(at ? { at: at } : {}),
15
+ });
16
+ };
17
+ const root = object(ir);
18
+ for (const [group, fields] of [
19
+ ["components", ["inputs", "params"]],
20
+ ["derives", ["params"]],
21
+ ["evidence", ["fields"]],
22
+ ["accounts", ["params"]],
23
+ ])
24
+ for (const node of list(root[group]).map(object))
25
+ for (const field of fields)
26
+ check(list(node[field]).map((v) => object(v).name), node.at);
27
+ const walk = (value) => {
28
+ if (Array.isArray(value)) {
29
+ value.forEach(walk);
30
+ return;
31
+ }
32
+ if (!value || typeof value !== "object")
33
+ return;
34
+ const node = object(value);
35
+ if (node.k === "fn")
36
+ check(list(node.params), node.at);
37
+ for (const [key, v] of Object.entries(node))
38
+ if (key !== "at")
39
+ walk(v);
40
+ };
41
+ walk(ir);
42
+ return out;
43
+ };
@@ -0,0 +1,14 @@
1
+ export type CollectionType = {
2
+ readonly kind: "String" | "Keyword" | "Bool" | "Int" | "Float" | "Date" | "Instant" | "File";
3
+ } | {
4
+ readonly kind: "literal";
5
+ readonly value: string;
6
+ } | {
7
+ readonly kind: "union";
8
+ readonly members: readonly CollectionType[];
9
+ };
10
+ /** Scalar collection contracts cannot silently accept relation or structured values. */
11
+ export declare const collectionType: (type: unknown, aliases: readonly {
12
+ readonly name: string;
13
+ readonly type: unknown;
14
+ }[], seen?: ReadonlySet<string>) => CollectionType | null;
@@ -0,0 +1,34 @@
1
+ import { sensitivePayload } from "./sensitivity.js";
2
+ /** Scalar collection contracts cannot silently accept relation or structured values. */
3
+ export const collectionType = (type, aliases, seen = new Set()) => {
4
+ if (Array.isArray(type)) {
5
+ // This describes the payload; classification and sealing are checked independently.
6
+ if (type[0] === "Sensitive") {
7
+ const payload = sensitivePayload(type);
8
+ return payload ? collectionType(payload, aliases, seen) : null;
9
+ }
10
+ if (type[0] === "Option" || type[0] === "Brand")
11
+ return type[1] ? collectionType(type[1], aliases, seen) : null;
12
+ if (type[0] === "Union") {
13
+ const members = type.slice(1).map((t) => collectionType(t, aliases, seen));
14
+ return members.length && members.every((m) => m !== null)
15
+ ? { kind: "union", members }
16
+ : null;
17
+ }
18
+ return null;
19
+ }
20
+ if (typeof type !== "string")
21
+ return null;
22
+ if (type.startsWith(":"))
23
+ return { kind: "literal", value: type.slice(1) };
24
+ if (["String", "Keyword", "Bool", "Int", "Float", "Date", "Instant", "File"].includes(type))
25
+ return {
26
+ kind: type,
27
+ };
28
+ if (type === "Group")
29
+ return { kind: "String" };
30
+ const alias = aliases.find((a) => a.name === type);
31
+ return alias && !seen.has(type)
32
+ ? collectionType(alias.type, aliases, new Set([...seen, type]))
33
+ : null;
34
+ };
@@ -0,0 +1,4 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ /** Pre-keyword contract lists remain declarations; omitted legacy components expose no public API. */
3
+ export declare const componentOperationNames: (ir: Pick<IR.WorldIR, "componentContracts">, c: IR.Component) => readonly string[];
4
+ export declare const operationDeclarationProblem: (ir: Pick<IR.WorldIR, "decisions">, c: IR.Component) => IR.Diagnostic | undefined;
@@ -0,0 +1,23 @@
1
+ /** Pre-keyword contract lists remain declarations; omitted legacy components expose no public API. */
2
+ export const componentOperationNames = (ir, c) => c.operations ?? [
3
+ ...new Set((ir.componentContracts ?? [])
4
+ .filter((x) => x.component === c.name)
5
+ .flatMap((x) => x.operations.map((o) => o.name))),
6
+ ];
7
+ export const operationDeclarationProblem = (ir, c) => {
8
+ if (c.operations === undefined)
9
+ return;
10
+ const names = [
11
+ ...c.actions.map((a) => a.name),
12
+ ...(ir.decisions ?? []).filter((d) => d.of === c.name).map((d) => d.name),
13
+ ];
14
+ if (new Set(c.operations).size !== c.operations.length ||
15
+ c.operations.some((n) => names.filter((x) => x === n).length !== 1))
16
+ return {
17
+ code: "E_NOT_AN_OPERATION",
18
+ severity: "error",
19
+ message: `${c.name} declares an unknown or ambiguous public operation.`,
20
+ at: c.at,
21
+ help: "Expose only unique authored actions/decisions owned by this component; [] exposes none. Requirements, state and private helpers are not operations.",
22
+ };
23
+ };
@@ -0,0 +1,4 @@
1
+ export { canonicalJson } from "./canonical-json.js";
2
+ export declare const sha256: (text: string) => string;
3
+ /** Content identity ignores `at` source spans: moving code is not a semantic change. */
4
+ export declare const contentDigest: (value: unknown) => string;
@@ -0,0 +1,78 @@
1
+ import { canonicalJson } from "./canonical-json.js";
2
+ export { canonicalJson } from "./canonical-json.js";
3
+ // Content digests for the IR: SHA-256 over canonical JSON (sorted keys). Synchronous, so the
4
+ // compiler runs unchanged in Node, a browser worker and tests.
5
+ // Resolve the pure synchronous primitive once; browser execution keeps the portable hash.
6
+ const nativeHash = globalThis.process?.getBuiltinModule?.("node:crypto")?.hash;
7
+ export const sha256 = (text) => nativeHash ? nativeHash("sha256", text, "hex") : portableSha256(text);
8
+ const K = new Uint32Array([
9
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
10
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
11
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
12
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
13
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
14
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
15
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
16
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
17
+ ]);
18
+ const portableSha256 = (text) => {
19
+ const bytes = new TextEncoder().encode(text);
20
+ const length = bytes.length;
21
+ const blocks = Math.ceil((length + 9) / 64);
22
+ const data = new Uint8Array(blocks * 64);
23
+ data.set(bytes);
24
+ data[length] = 0x80;
25
+ const view = new DataView(data.buffer);
26
+ view.setUint32(data.length - 8, Math.floor((length * 8) / 2 ** 32));
27
+ view.setUint32(data.length - 4, (length * 8) >>> 0);
28
+ const h = new Uint32Array([
29
+ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
30
+ ]);
31
+ const w = new Uint32Array(64);
32
+ const rotr = (x, n) => (x >>> n) | (x << (32 - n));
33
+ for (let block = 0; block < blocks; block++) {
34
+ for (let i = 0; i < 16; i++)
35
+ w[i] = view.getUint32(block * 64 + i * 4);
36
+ for (let i = 16; i < 64; i++) {
37
+ const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >>> 3);
38
+ const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >>> 10);
39
+ w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;
40
+ }
41
+ let [a, b, c, d, e, f, g, hh] = h;
42
+ for (let i = 0; i < 64; i++) {
43
+ const t1 = (hh +
44
+ (rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)) +
45
+ ((e & f) ^ (~e & g)) +
46
+ K[i] +
47
+ w[i]) >>>
48
+ 0;
49
+ const t2 = ((rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)) + ((a & b) ^ (a & c) ^ (b & c))) >>> 0;
50
+ hh = g;
51
+ g = f;
52
+ f = e;
53
+ e = (d + t1) >>> 0;
54
+ d = c;
55
+ c = b;
56
+ b = a;
57
+ a = (t1 + t2) >>> 0;
58
+ }
59
+ h[0] = (h[0] + a) >>> 0;
60
+ h[1] = (h[1] + b) >>> 0;
61
+ h[2] = (h[2] + c) >>> 0;
62
+ h[3] = (h[3] + d) >>> 0;
63
+ h[4] = (h[4] + e) >>> 0;
64
+ h[5] = (h[5] + f) >>> 0;
65
+ h[6] = (h[6] + g) >>> 0;
66
+ h[7] = (h[7] + hh) >>> 0;
67
+ }
68
+ return [...h].map((x) => x.toString(16).padStart(8, "0")).join("");
69
+ };
70
+ /** Content identity ignores `at` source spans: moving code is not a semantic change. */
71
+ export const contentDigest = (value) => sha256(canonicalJson(value === undefined ? null : stripSpans(value)));
72
+ const stripSpans = (value) => Array.isArray(value)
73
+ ? value.map(stripSpans)
74
+ : value && typeof value === "object"
75
+ ? Object.fromEntries(Object.entries(value)
76
+ .filter(([key]) => key !== "at")
77
+ .map(([key, item]) => [key, stripSpans(item)]))
78
+ : value;