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,240 @@
1
+ import { sealingModel, derivedLeakHelp } from "./sealing.js";
2
+ /** All branches and call arguments participate; no operation implicitly declassifies data. */
3
+ export const sensitiveFlowDiagnostics = (ir, classify) => {
4
+ const diagnostics = [], model = sealingModel(ir);
5
+ const unique = (names, at) => {
6
+ if (new Set(names).size !== names.length)
7
+ diagnostics.push({
8
+ code: "E_DERIVED_LEAK",
9
+ severity: "error",
10
+ message: "Sensitive flow requires unambiguous declarations and data slots.",
11
+ at,
12
+ help: derivedLeakHelp + " Use unique declaration, field, parameter and entity-attribute names.",
13
+ });
14
+ };
15
+ for (const group of [ir.roles, ir.entities, ir.evidence, ir.components, ir.derives])
16
+ if (group.length)
17
+ unique(group.map((d) => d.name), group[0].at);
18
+ for (const owner of [...ir.roles, ...ir.entities, ...ir.evidence])
19
+ unique(owner.fields.map((f) => f.name), owner.at);
20
+ if (ir.entities.length)
21
+ unique(ir.entities.map((e) => e.ns), ir.entities[0].at);
22
+ for (const entity of ir.entities) {
23
+ unique(entity.fields.map((f) => f.attr), entity.at);
24
+ if (entity.fields.some((f) => f.attr !== `${entity.ns}/${f.name}`))
25
+ diagnostics.push({
26
+ code: "E_DERIVED_LEAK",
27
+ severity: "error",
28
+ message: "Sensitive flow requires canonical entity attributes.",
29
+ at: entity.at,
30
+ help: derivedLeakHelp + " Keep each attribute equal to its entity namespace and field name.",
31
+ });
32
+ }
33
+ for (const c of ir.components)
34
+ unique([...c.inputs, ...c.params].map((f) => f.name), c.at);
35
+ for (const d of ir.derives)
36
+ unique(d.params.map((f) => f.name), d.at);
37
+ if (diagnostics.length)
38
+ return diagnostics;
39
+ const value = (type) => {
40
+ const c = type ? classify(type) : undefined;
41
+ return {
42
+ ...(type ? { type } : {}),
43
+ classes: c?.ok ? c.classes : [],
44
+ ...(c && !c.ok ? { unknown: true } : {}),
45
+ };
46
+ };
47
+ const merge = (parts, type) => {
48
+ const result = value(type);
49
+ return {
50
+ ...result,
51
+ classes: [...new Set([...result.classes, ...parts.flatMap((p) => p.classes)])].sort(),
52
+ ...(parts.some((p) => p.unknown) ? { unknown: true } : {}),
53
+ };
54
+ };
55
+ const scope = (fields) => new Map(fields.map((f) => [f.name, value(f.type)]));
56
+ const componentScope = (c) => {
57
+ const result = scope([...c.inputs, ...c.params]);
58
+ result.set("self", value(["Id", c.name]));
59
+ result.set("attached", value(["List", ["Id", ir.libraries[0]?.subject ?? "Unknown"]]));
60
+ for (const f of [...c.requirements, ...c.outputs])
61
+ if (!result.has(f.name))
62
+ result.set(f.name, value("Status"));
63
+ for (const f of c.machines)
64
+ if (!result.has(f.name))
65
+ result.set(f.name, value("Machine"));
66
+ for (const f of c.slots)
67
+ if (!result.has(f.name))
68
+ result.set(f.name, value(["Id", f.component]));
69
+ return result;
70
+ };
71
+ const infer = (e, env, active = new Set()) => {
72
+ switch (e.k) {
73
+ case "lit":
74
+ case "kw":
75
+ case "ref":
76
+ return value();
77
+ case "var":
78
+ return (env.get(e.name) ??
79
+ (["today", "now"].includes(e.name) ? value() : { classes: [], unknown: true }));
80
+ case "read":
81
+ case "attr":
82
+ case "inst": {
83
+ const receiver = infer(e.of, env, active), target = model.reference(receiver.type);
84
+ const field = e.k === "read"
85
+ ? ir.roles.find((r) => r.name === e.role)?.fields.find((f) => f.name === e.field)
86
+ : e.k === "attr"
87
+ ? ir.entities.flatMap((r) => r.fields).find((f) => f.attr === e.attr)
88
+ : model.field(receiver.type, e.field);
89
+ const receiverMatches = e.k === "read"
90
+ ? target === e.role ||
91
+ ir.entities.some((r) => r.name === target && r.implements.some((b) => b.role === e.role))
92
+ : e.k === "attr"
93
+ ? ir.entities.some((r) => r.name === target && r.fields.some((f) => f.attr === e.attr))
94
+ : !!field;
95
+ const declarations = e.k === "attr"
96
+ ? ir.entities.flatMap((r) => r.fields).filter((f) => f.attr === e.attr)
97
+ : e.k === "read"
98
+ ? ir.roles
99
+ .filter((r) => r.name === e.role)
100
+ .flatMap((r) => r.fields)
101
+ .filter((f) => f.name === e.field)
102
+ : [];
103
+ return merge([
104
+ receiver,
105
+ ...declarations.map((f) => value(f.type)),
106
+ field && receiverMatches ? value(field.type) : { classes: [], unknown: true },
107
+ ], field?.type);
108
+ }
109
+ case "if": {
110
+ const yes = infer(e.then, env, active), no = infer(e.else, env, active);
111
+ return merge([infer(e.test, env, active), yes, no], JSON.stringify(yes.type) === JSON.stringify(no.type) ? yes.type : undefined);
112
+ }
113
+ case "list": {
114
+ const parts = e.items.map((x) => infer(x, env, active));
115
+ return merge(parts, ["List", parts[0]?.type ?? "Unknown"]);
116
+ }
117
+ case "fn": {
118
+ const inner = new Map(env);
119
+ e.params.forEach((p) => inner.delete(p));
120
+ return infer(e.body, inner, active);
121
+ }
122
+ case "call": {
123
+ const parts = e.args.map((arg, i) => {
124
+ const callbackList = i === 0 && ["map", "filter"].includes(e.fn)
125
+ ? e.args[1]
126
+ : (i === 1 || i === 2) && e.fn === "spells"
127
+ ? e.args[0]
128
+ : undefined;
129
+ if (!e.derive && arg.k === "fn" && callbackList) {
130
+ const collection = infer(callbackList, env, active), type = model.unwrap(collection.type), inner = new Map(env);
131
+ arg.params.forEach((p) => inner.set(p, merge([collection], Array.isArray(type) && type[0] === "List" ? type[1] : undefined)));
132
+ return infer(arg.body, inner, active);
133
+ }
134
+ return infer(arg, env, active);
135
+ });
136
+ const d = ir.derives.find((d) => d.name === e.fn);
137
+ if (d) {
138
+ if (active.has(d.name))
139
+ return { classes: [], unknown: true };
140
+ const inner = scope(d.params);
141
+ d.params.forEach((p, i) => inner.set(p.name, merge([value(p.type), parts[i] ?? value()], p.type)));
142
+ return merge([...parts, infer(d.body, inner, new Set([...active, d.name]))], d.returns);
143
+ }
144
+ if (e.derive)
145
+ return { classes: [], unknown: true };
146
+ const type = e.fn === "spells"
147
+ ? ["List", parts[0]?.type ?? "Unknown"]
148
+ : e.fn === "filter"
149
+ ? parts[1]?.type
150
+ : e.fn === "map"
151
+ ? ["List", parts[0]?.type ?? "Unknown"]
152
+ : undefined;
153
+ const first = model.unwrap(parts[0]?.type);
154
+ return merge(parts, type ??
155
+ (["first", "last"].includes(e.fn) && Array.isArray(first) && first[0] === "List"
156
+ ? first[1]
157
+ : undefined));
158
+ }
159
+ }
160
+ };
161
+ const check = (expr, env, allowed = []) => {
162
+ const result = infer(expr, env);
163
+ if (result.unknown || result.classes.some((c) => !allowed.includes(c)))
164
+ diagnostics.push({
165
+ code: "E_DERIVED_LEAK",
166
+ severity: "error",
167
+ message: result.unknown
168
+ ? "Sensitive reads need a statically resolved receiver and field."
169
+ : "This expression exposes sensitive data outside its sealed destination.",
170
+ at: expr.at,
171
+ help: derivedLeakHelp,
172
+ });
173
+ };
174
+ const visit = (node, env, allowed = []) => {
175
+ if (!node || typeof node !== "object")
176
+ return;
177
+ if ("k" in node)
178
+ check(node, env, allowed);
179
+ else
180
+ for (const [key, child] of Object.entries(node))
181
+ if (key !== "at")
182
+ visit(child, env, allowed);
183
+ };
184
+ for (const d of ir.derives)
185
+ if (d.body)
186
+ check(d.body, scope(d.params));
187
+ for (const c of ir.components) {
188
+ const env = componentScope(c);
189
+ visit(c, env);
190
+ for (const d of ir.decisions ?? [])
191
+ if (d.of === c.name)
192
+ visit(d, env);
193
+ for (const a of ir.accounts)
194
+ for (const p of a.policies ?? [])
195
+ if (p.of === c.name)
196
+ visit(p, env);
197
+ }
198
+ for (const e of ir.evidence) {
199
+ const c = ir.components.find((c) => c.name === e.of), env = c ? componentScope(c) : new Map();
200
+ const fields = scope(e.fields), allowed = e.fields.flatMap((f) => value(f.type).classes);
201
+ visit(e.rules, fields, allowed);
202
+ if (e.expires)
203
+ check(e.expires, fields);
204
+ for (const i of ir.interactions.filter((i) => i.produces === e.name)) {
205
+ for (const b of i.binds) {
206
+ const destination = e.fields.find((f) => f.name === b.field), classes = destination ? value(destination.type).classes : [];
207
+ if (b.from)
208
+ check(b.from, env, classes);
209
+ if (b.target) {
210
+ const target = infer(b.target, env);
211
+ if (target.unknown || classes.some((c) => !target.classes.includes(c)))
212
+ diagnostics.push({
213
+ code: "E_DERIVED_LEAK",
214
+ severity: "error",
215
+ message: "A proposed write must preserve every signed field classification.",
216
+ at: b.target.at,
217
+ help: derivedLeakHelp,
218
+ });
219
+ }
220
+ }
221
+ const layout = ir.layouts.find((l) => l.name === i.layout);
222
+ if (layout)
223
+ visit(layout, fields, allowed);
224
+ }
225
+ }
226
+ for (const n of ir.notices ?? []) {
227
+ const c = ir.components.find((c) => c.name === n.of);
228
+ check(n.to, c ? componentScope(c) : new Map());
229
+ }
230
+ for (const v of ir.vaults ?? []) {
231
+ const c = ir.components.find((c) => c.name === v.key.target), env = v.key.kind === "subject"
232
+ ? scope([{ name: "subject", type: ["Id", v.key.target] }])
233
+ : c
234
+ ? componentScope(c)
235
+ : new Map();
236
+ check(v.retain, env);
237
+ check(v.dispose.by, env);
238
+ }
239
+ return diagnostics;
240
+ };
@@ -0,0 +1,19 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const sensitiveClasses: readonly ["pii", "financial", "health", "immigration"];
3
+ export type SensitiveClass = (typeof sensitiveClasses)[number];
4
+ /** Value codecs inspect this payload without removing classification from the declared type. */
5
+ export declare const sensitivePayload: (type: IR.TypeRef) => IR.TypeRef | undefined;
6
+ export type Sensitivity = {
7
+ readonly ok: true;
8
+ readonly classes: readonly SensitiveClass[];
9
+ } | {
10
+ readonly ok: false;
11
+ readonly message: string;
12
+ };
13
+ export declare const sensitiveTypeHelp = "Use (Sensitive :pii String), with one of :pii, :financial, :health or :immigration and exactly one base type. Keep classification in concrete canonical aliases/fields; do not hide it in unsupported record or generic aliases.";
14
+ export declare const sensitiveSealHelp = "Declare a compatible cited retention-scoped vault and seal this field or record before publishing sensitive data. Changing the label to an ordinary public type is not a sealing policy.";
15
+ export declare const sensitivityOfType: (type: IR.TypeRef, aliases: readonly IR.TypeAlias[]) => Sensitivity;
16
+ /** An unknown attribute has no implicit public-data grant. */
17
+ export declare const factSensitivity: (ir: Pick<IR.WorldIR, "types" | "entities">, attribute: string) => Sensitivity;
18
+ /** Source publication and raw linking share admission and conservative flow checks. */
19
+ export declare const sensitivityDiagnostics: (ir: Pick<IR.WorldIR, "types"> & Readonly<Record<string, unknown>>) => IR.Diagnostic[];
@@ -0,0 +1,133 @@
1
+ import { sealingDiagnostics } from "./sealing.js";
2
+ import { sensitiveFlowDiagnostics } from "./sensitive-flow.js";
3
+ export const sensitiveClasses = ["pii", "financial", "health", "immigration"];
4
+ /** Value codecs inspect this payload without removing classification from the declared type. */
5
+ export const sensitivePayload = (type) => Array.isArray(type) &&
6
+ type[0] === "Sensitive" &&
7
+ type.length === 3 &&
8
+ sensitiveClasses.some((c) => type[1] === `:${c}`)
9
+ ? type[2]
10
+ : undefined;
11
+ export const sensitiveTypeHelp = "Use (Sensitive :pii String), with one of :pii, :financial, :health or :immigration and exactly one base type. Keep classification in concrete canonical aliases/fields; do not hide it in unsupported record or generic aliases.";
12
+ export const sensitiveSealHelp = "Declare a compatible cited retention-scoped vault and seal this field or record before publishing sensitive data. Changing the label to an ordinary public type is not a sealing policy.";
13
+ const merge = (parts) => {
14
+ const invalid = parts.find((p) => !p.ok);
15
+ if (invalid)
16
+ return invalid;
17
+ return { ok: true, classes: [...new Set(parts.flatMap((p) => (p.ok ? p.classes : [])))].sort() };
18
+ };
19
+ /** Classification follows every container argument; cycles do not erase another sensitive branch. */
20
+ const classifier = (aliases) => {
21
+ const definitions = new Map(aliases.map((a) => [a.name, a.type]));
22
+ const results = new Map();
23
+ const visit = (ref, seen) => {
24
+ if (typeof ref === "string") {
25
+ const alias = definitions.get(ref);
26
+ return alias && !seen.has(ref)
27
+ ? visit(alias, new Set([...seen, ref]))
28
+ : { ok: true, classes: [] };
29
+ }
30
+ if (ref[0] === "Sensitive") {
31
+ const classification = ref[1];
32
+ if (ref.length !== 3 || typeof classification !== "string" || !classification.startsWith(":"))
33
+ return {
34
+ ok: false,
35
+ message: "Sensitive needs a literal classification keyword and one base type.",
36
+ };
37
+ const value = classification.slice(1);
38
+ if (!sensitiveClasses.some((c) => c === value))
39
+ return { ok: false, message: "Unknown sensitive classification." };
40
+ return merge([{ ok: true, classes: [value] }, visit(ref[2], seen)]);
41
+ }
42
+ return merge(ref.map((r) => visit(r, seen)));
43
+ };
44
+ return (type) => {
45
+ const old = results.get(type);
46
+ if (old)
47
+ return old;
48
+ // Memoize only complete traversals: an alias cycle's partial result depends on its path.
49
+ const result = definitions.size !== aliases.length
50
+ ? { ok: false, message: "Duplicate type aliases cannot establish a classification." }
51
+ : visit(type, new Set());
52
+ results.set(type, result);
53
+ return result;
54
+ };
55
+ };
56
+ export const sensitivityOfType = (type, aliases) => classifier(aliases)(type);
57
+ /** An unknown attribute has no implicit public-data grant. */
58
+ export const factSensitivity = (ir, attribute) => {
59
+ const fields = ir.entities.flatMap((e) => e.fields).filter((f) => f.attr === attribute);
60
+ return fields.length
61
+ ? merge(fields.map((f) => sensitivityOfType(f.type, ir.types)))
62
+ : { ok: false, message: "The fact attribute has no declared classification." };
63
+ };
64
+ /** Source publication and raw linking share admission and conservative flow checks. */
65
+ export const sensitivityDiagnostics = (ir) => {
66
+ const model = {
67
+ format: "worldvm/world-ir@1",
68
+ sources: [],
69
+ calendars: [],
70
+ connectors: [],
71
+ machines: [],
72
+ roles: [],
73
+ entities: [],
74
+ evidence: [],
75
+ components: [],
76
+ derives: [],
77
+ libraries: [],
78
+ interactions: [],
79
+ layouts: [],
80
+ accounts: [],
81
+ ...ir,
82
+ };
83
+ const classify = classifier(ir.types);
84
+ const diagnostics = [];
85
+ const stored = new Set([...model.roles, ...model.entities, ...model.evidence].flatMap((r) => r.fields));
86
+ const report = (result, at, label = "Data") => {
87
+ if (!result.ok || result.classes.length)
88
+ diagnostics.push({
89
+ code: result.ok ? "E_UNSEALED_SENSITIVE" : "E_SENSITIVE_TYPE",
90
+ severity: "error",
91
+ message: result.ok
92
+ ? `${label} requires an explicit supported sealing policy.`
93
+ : result.message,
94
+ ...(at ? { at } : {}),
95
+ help: result.ok ? sensitiveSealHelp : sensitiveTypeHelp,
96
+ });
97
+ };
98
+ for (const alias of ir.types) {
99
+ const result = classify(alias.type);
100
+ if (alias.name === "Sensitive")
101
+ report({ ok: false, message: "Sensitive is a reserved type constructor." }, alias.at);
102
+ else if (!result.ok)
103
+ report(result, alias.at);
104
+ }
105
+ const walk = (value, at, position = "other") => {
106
+ if (Array.isArray(value)) {
107
+ value.forEach((v) => walk(v, at, position));
108
+ return;
109
+ }
110
+ if (!value || typeof value !== "object")
111
+ return;
112
+ const node = value, location = node.at ?? at;
113
+ for (const slot of [node.type, node.returns])
114
+ if (typeof slot === "string" || Array.isArray(slot)) {
115
+ const result = classify(slot);
116
+ if (position !== "field" || !result.ok)
117
+ report(result, location, typeof node.name === "string" ? node.name : "Data");
118
+ }
119
+ for (const [key, child] of Object.entries(node))
120
+ if (key !== "at")
121
+ walk(child, location, position === "owner" && key === "fields" ? "field" : "other");
122
+ };
123
+ for (const [key, value] of Object.entries(ir))
124
+ if (key !== "types" && key !== "componentContracts")
125
+ walk(value, undefined, ["roles", "entities", "evidence"].includes(key) ? "owner" : "other");
126
+ diagnostics.push(...sealingDiagnostics(model, classify));
127
+ if ([...stored].some((f) => {
128
+ const c = classify(f.type);
129
+ return c.ok && c.classes.length;
130
+ }))
131
+ diagnostics.push(...sensitiveFlowDiagnostics(model, classify));
132
+ return diagnostics;
133
+ };
@@ -0,0 +1,4 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const signatureHelp = "Use :covers :all with a fixed :method and :audit {:consent \"Electronic-records consent\" :intent \"Intent to sign\"}. Both statements must be nonempty literal strings of at most 2000 characters; no extra keys.";
3
+ export declare const auditPolicyValid: (value: unknown) => value is IR.SignaturePolicy;
4
+ export declare const signatureDiagnostics: (ir: Pick<IR.WorldIR, "evidence">) => IR.Diagnostic[];
@@ -0,0 +1,22 @@
1
+ export const signatureHelp = 'Use :covers :all with a fixed :method and :audit {:consent "Electronic-records consent" :intent "Intent to sign"}. Both statements must be nonempty literal strings of at most 2000 characters; no extra keys.';
2
+ export const auditPolicyValid = (value) => {
3
+ if (!value || typeof value !== "object" || Array.isArray(value))
4
+ return false;
5
+ const policy = value;
6
+ return (Object.keys(policy).length === 2 &&
7
+ ["consent", "intent"].every((key) => typeof policy[key] === "string" &&
8
+ policy[key].trim().length > 0 &&
9
+ policy[key].length <= 2000));
10
+ };
11
+ export const signatureDiagnostics = (ir) => ir.evidence.flatMap((e) => e.attest?.audit !== undefined &&
12
+ (!auditPolicyValid(e.attest.audit) || e.attest.covers !== "all" || !e.attest.method.trim())
13
+ ? [
14
+ {
15
+ code: "E_ATTEST_AUDIT",
16
+ severity: "error",
17
+ message: "An audited attestation needs fixed consent, intent, method and complete coverage.",
18
+ at: e.at,
19
+ help: signatureHelp,
20
+ },
21
+ ]
22
+ : []);
@@ -0,0 +1,10 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const vaultHelp = "Declare a unique cited vault with (per-occurrence Component) or (per-subject Role), nonempty held classes, finite retention, :held-until-retained or :on-request erasure, and an explicit (decision name :by principal :approvals positive-integer).";
3
+ type Model = Pick<IR.WorldIR, "types" | "roles" | "entities" | "components" | "derives" | "references" | "vaults"> & Partial<Pick<IR.WorldIR, "evidence" | "documents" | "notices">>;
4
+ export declare const vaultAuthority: (ir: Model, key: IR.VaultKey, by: IR.Expr) => {
5
+ kind: import("./principals.js").PrincipalKind | undefined;
6
+ diagnostics: import("./principals.js").PrincipalDiagnostic[];
7
+ };
8
+ /** Policies are checked before either source publication or raw-IR linking. */
9
+ export declare const vaultDiagnostics: (ir: Model) => IR.Diagnostic[];
10
+ export {};
@@ -0,0 +1,140 @@
1
+ import { principalKinds } from "./principals.js";
2
+ import { sensitiveClasses } from "./sensitivity.js";
3
+ import { isLocalDate } from "./dates.js";
4
+ export const vaultHelp = "Declare a unique cited vault with (per-occurrence Component) or (per-subject Role), nonempty held classes, finite retention, :held-until-retained or :on-request erasure, and an explicit (decision name :by principal :approvals positive-integer).";
5
+ export const vaultAuthority = (ir, key, by) => {
6
+ const component = ir.components.find((c) => c.name === key.target), owner = key.kind === "occurrence"
7
+ ? component
8
+ : {
9
+ name: JSON.stringify(["vault-subject", key.target]),
10
+ inputs: [{ name: "subject", type: ["Id", key.target] }],
11
+ params: [],
12
+ };
13
+ const name = "vault-disposal", result = principalKinds({
14
+ ...ir,
15
+ components: [{ ...owner, actions: [], requirements: [] }],
16
+ decisions: [{ name, of: owner?.name, by }],
17
+ });
18
+ return { kind: result.authorities.get(name), diagnostics: result.diagnostics };
19
+ };
20
+ /** Policies are checked before either source publication or raw-IR linking. */
21
+ export const vaultDiagnostics = (ir) => {
22
+ const diagnostics = [], names = new Set();
23
+ const report = (code, message, at, severity = "error") => diagnostics.push({ code, severity, message, at, help: vaultHelp });
24
+ for (const v of ir.vaults ?? []) {
25
+ if (!v.name.trim() || names.has(v.name))
26
+ report("E_VAULT_POLICY", "Vault names must be unique and nonempty.", v.at);
27
+ names.add(v.name);
28
+ const component = ir.components.find((c) => c.name === v.key.target), role = ir.roles.find((r) => r.name === v.key.target);
29
+ if (!(v.key.kind === "occurrence" ? component : v.key.kind === "subject" && role)) {
30
+ report("E_VAULT_SCOPE", "A vault key must name its declared component or role.", v.key.at);
31
+ continue;
32
+ }
33
+ if (!v.holds.length ||
34
+ new Set(v.holds).size !== v.holds.length ||
35
+ v.holds.some((c) => !sensitiveClasses.includes(c)))
36
+ report("E_VAULT_POLICY", "Held classes must be nonempty, unique and supported.", v.at);
37
+ if (!v.cites?.length ||
38
+ v.cites.some((c) => !c.clause.trim() || !ir.references?.some((s) => s.name === c.source)))
39
+ report("E_VAULT_UNCITED", "Vault retention needs a declared source and specific clause.", v.at);
40
+ if (!["on-request", "held-until-retained"].includes(v.erasure.kind))
41
+ report("E_VAULT_POLICY", "Choose a supported erasure policy.", v.erasure.at);
42
+ else if (v.erasure.kind === "on-request")
43
+ report("W_ERASURE_CONFLICT", "On-request erasure may conflict with cited retention; resolve the retention obligation before shredding.", v.erasure.at, "warning");
44
+ if (!v.dispose.name.trim() ||
45
+ !Number.isSafeInteger(v.dispose.approvals) ||
46
+ v.dispose.approvals < 1)
47
+ report("E_VAULT_POLICY", "Disposal needs an explicit name and positive fixed approval count.", v.dispose.at);
48
+ const authority = vaultAuthority(ir, v.key, v.dispose.by), expected = authority.kind === "entity" ? "individual" : "group";
49
+ if (authority.diagnostics.length || !authority.kind || v.dispose.byKind !== expected)
50
+ report("E_VAULT_AUTHORITY", "The disposal authority must have one proven principal kind.", v.dispose.by.at);
51
+ const scope = new Set(v.key.kind === "subject"
52
+ ? ["subject", "today", "now"]
53
+ : [
54
+ ...component.key,
55
+ ...component.params.map((p) => p.name),
56
+ "attached",
57
+ "self",
58
+ "today",
59
+ "now",
60
+ ]);
61
+ const scan = (e, bound, active) => {
62
+ if (e.k === "var" && !bound.has(e.name))
63
+ report("E_VAULT_SCOPE", "Vault expressions must stay within their declared key scope.", e.at);
64
+ if (e.k === "fn")
65
+ return scan(e.body, new Set([...bound, ...e.params]), active);
66
+ if (e.k === "call") {
67
+ if (e.derive) {
68
+ const derive = ir.derives.find((d) => d.name === e.fn);
69
+ if (!derive || active.has(e.fn))
70
+ report("E_VAULT_RETENTION", "Vault expressions need declared acyclic derives.", e.at);
71
+ else
72
+ scan(derive.body, new Set(derive.params.map((p) => p.name)), new Set([...active, e.fn]));
73
+ }
74
+ e.args.forEach((a) => scan(a, bound, active));
75
+ }
76
+ if (e.k === "list")
77
+ e.items.forEach((a) => scan(a, bound, active));
78
+ if (e.k === "if")
79
+ [e.test, e.then, e.else].forEach((a) => scan(a, bound, active));
80
+ if (e.k === "read" || e.k === "attr" || e.k === "inst")
81
+ scan(e.of, bound, active);
82
+ if (e.k === "inst" &&
83
+ e.of.k === "var" &&
84
+ e.of.name === "self" &&
85
+ component?.inputs.some((i) => i.name === e.field) &&
86
+ !component.key.includes(e.field))
87
+ report("E_VAULT_SCOPE", "Vault expressions cannot read non-key inputs through self.", e.at);
88
+ };
89
+ scan(v.retain, scope, new Set());
90
+ scan(v.dispose.by, scope, new Set());
91
+ const unwrap = (t, seen = new Set()) => {
92
+ if (typeof t === "string") {
93
+ const alias = ir.types.find((a) => a.name === t);
94
+ return alias && !seen.has(t) ? unwrap(alias.type, new Set([...seen, t])) : t;
95
+ }
96
+ return Array.isArray(t) && ["Option", "Brand"].includes(String(t[0]))
97
+ ? unwrap(t[1], seen)
98
+ : t;
99
+ };
100
+ const date = (e) => {
101
+ if (e.k === "lit")
102
+ return e.v === null || (typeof e.v === "string" && isLocalDate(e.v));
103
+ if (e.k === "if")
104
+ return date(e.then) && date(e.else);
105
+ if (e.k === "var")
106
+ return (e.name === "today" ||
107
+ unwrap([...(component?.inputs ?? []), ...(component?.params ?? [])].find((f) => f.name === e.name)?.type) === "Date");
108
+ if (e.k === "read")
109
+ return (unwrap(ir.roles.find((r) => r.name === e.role)?.fields.find((f) => f.name === e.field)?.type) === "Date");
110
+ if (e.k === "attr")
111
+ return (unwrap(ir.entities.flatMap((x) => x.fields).find((f) => f.attr === e.attr)?.type) ===
112
+ "Date");
113
+ if (e.k === "call")
114
+ return e.derive
115
+ ? unwrap(ir.derives.find((d) => d.name === e.fn)?.returns) === "Date"
116
+ : [
117
+ "years-after",
118
+ "months-after",
119
+ "days-after",
120
+ "days-before",
121
+ "business-days-after",
122
+ "earliest",
123
+ "latest",
124
+ "asserted-at",
125
+ ].includes(e.fn);
126
+ return false;
127
+ };
128
+ if (!date(v.retain))
129
+ report("E_VAULT_RETENTION", "Retention must produce a local date or an unknown date.", v.retain.at);
130
+ }
131
+ const seal = (value) => {
132
+ if (value && !names.has(value.vault))
133
+ report("E_VAULT_SEAL", "A seal must name a declared vault.", value.at);
134
+ };
135
+ for (const owner of [...ir.roles, ...ir.entities, ...(ir.evidence ?? [])])
136
+ owner.fields.forEach((f) => seal(f.sealedBy));
137
+ for (const owner of [...(ir.evidence ?? []), ...(ir.documents ?? []), ...(ir.notices ?? [])])
138
+ seal(owner.sealedBy);
139
+ return diagnostics;
140
+ };