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,12 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ import type { AgentReadPermission } from "./agent-reads.js";
3
+ export type DataReadSelector = {
4
+ readonly kind: "fact";
5
+ readonly declaration: string;
6
+ readonly attribute: string;
7
+ } | {
8
+ readonly kind: "evidence" | "document" | "notice";
9
+ readonly declaration: string;
10
+ };
11
+ /** Resolve declarations, not caller-supplied public/private labels. A seal is never declassification. */
12
+ export declare const dataReadInfo: (ir: IR.WorldIR, source: DataReadSelector) => readonly AgentReadPermission[] | undefined;
@@ -0,0 +1,67 @@
1
+ import { readTypeModel } from "./read-types.js";
2
+ import { sensitiveClasses, sensitivityOfType } from "./sensitivity.js";
3
+ const one = (xs) => (xs.length === 1 ? xs[0] : undefined);
4
+ /** Resolve declarations, not caller-supplied public/private labels. A seal is never declassification. */
5
+ export const dataReadInfo = (ir, source) => {
6
+ const known = readTypeModel(ir);
7
+ const sealed = (fields, seal) => {
8
+ const classes = new Set();
9
+ for (const f of fields) {
10
+ if (!known(f.type))
11
+ return undefined;
12
+ const c = sensitivityOfType(f.type, ir.types);
13
+ if (!c.ok)
14
+ return undefined;
15
+ c.classes.forEach((v) => classes.add(v));
16
+ }
17
+ if (!seal)
18
+ return classes.size ? undefined : [];
19
+ const vault = one((ir.vaults ?? []).filter((v) => v.name === seal.vault));
20
+ if (!vault || !vault.holds.length || vault.holds.some((c) => !sensitiveClasses.includes(c)))
21
+ return undefined;
22
+ if (!classes.size)
23
+ vault.holds.forEach((c) => classes.add(c));
24
+ if ([...classes].some((c) => !vault.holds.includes(c)))
25
+ return undefined;
26
+ return [...classes].sort().map((c) => ({ class: c, vault: vault.name }));
27
+ };
28
+ const evidence = (name) => {
29
+ const e = one(ir.evidence.filter((e) => e.name === name));
30
+ return e && sealed(e.fields, e.sealedBy);
31
+ };
32
+ const document = (name) => {
33
+ const d = one((ir.documents ?? []).filter((d) => d.name === name));
34
+ if (!d || !d.sources.length)
35
+ return undefined;
36
+ const permissions = d.sources.map(evidence);
37
+ if (permissions.some((p) => !p || p.some((g) => g.vault !== d.sealedBy?.vault)))
38
+ return undefined;
39
+ const own = sealed([], d.sealedBy);
40
+ return (own && [
41
+ ...new Map([...permissions.flatMap((p) => p), ...own].map((p) => [`${p.class}:${p.vault}`, p])).values(),
42
+ ]);
43
+ };
44
+ switch (source.kind) {
45
+ case "fact": {
46
+ const entity = one(ir.entities.filter((e) => e.name === source.declaration));
47
+ const field = entity &&
48
+ one(entity.fields.filter((f) => f.attr === source.attribute && f.attr === `${entity.ns}/${f.name}`));
49
+ const unique = ir.entities
50
+ .flatMap((e) => e.fields)
51
+ .filter((f) => f.attr === source.attribute);
52
+ return field && unique.length === 1 ? sealed([field], field.sealedBy) : undefined;
53
+ }
54
+ case "evidence":
55
+ return evidence(source.declaration);
56
+ case "document":
57
+ return document(source.declaration);
58
+ case "notice": {
59
+ const n = one((ir.notices ?? []).filter((n) => n.name === source.declaration));
60
+ const inherited = n && document(n.document);
61
+ const own = n && sealed([], n.sealedBy);
62
+ return inherited && own && inherited.every((p) => p.vault === n.sealedBy?.vault)
63
+ ? [...new Map([...inherited, ...own].map((p) => [`${p.class}:${p.vault}`, p])).values()]
64
+ : undefined;
65
+ }
66
+ }
67
+ };
@@ -0,0 +1,2 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const readTypeModel: (ir: IR.WorldIR) => (type: IR.TypeRef, seen?: Set<string>) => boolean;
@@ -0,0 +1,40 @@
1
+ import { sensitivePayload } from "./sensitivity.js";
2
+ export const readTypeModel = (ir) => {
3
+ const known = (type, seen = new Set()) => {
4
+ if (typeof type === "string") {
5
+ const aliases = ir.types.filter((t) => t.name === type);
6
+ if (aliases.length)
7
+ return (aliases.length === 1 &&
8
+ !seen.has(type) &&
9
+ known(aliases[0].type, new Set([...seen, type])));
10
+ return (type.startsWith(":") ||
11
+ [
12
+ "String",
13
+ "Keyword",
14
+ "Bool",
15
+ "Int",
16
+ "Float",
17
+ "Date",
18
+ "Instant",
19
+ "File",
20
+ "Group",
21
+ "Truth",
22
+ "Status",
23
+ "Duration",
24
+ "Machine",
25
+ "Unit",
26
+ ].includes(type));
27
+ }
28
+ const payload = sensitivePayload(type);
29
+ if (payload)
30
+ return known(payload, seen);
31
+ if (["Option", "Brand", "List"].includes(String(type[0])))
32
+ return type.length === 2 && known(type[1], seen);
33
+ if (type[0] === "Union")
34
+ return type.length > 1 && type.slice(1).every((t) => known(t, seen));
35
+ return (type[0] === "Id" &&
36
+ type.length === 2 &&
37
+ [...ir.roles, ...ir.entities, ...ir.components].filter((t) => t.name === type[1]).length === 1);
38
+ };
39
+ return known;
40
+ };
@@ -0,0 +1,4 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ /** A case-bound proof has one explicitly generation-cycled producer. */
3
+ export declare const resourceProofRequirement: (c: IR.Component, resource: string, evidence: string) => IR.Requirement | undefined;
4
+ export declare const resourceProofDiagnostics: (ir: IR.WorldIR) => IR.Diagnostic[];
@@ -0,0 +1,98 @@
1
+ /** A case-bound proof has one explicitly generation-cycled producer. */
2
+ export const resourceProofRequirement = (c, resource, evidence) => {
3
+ const contains = (e) => e.k === "call" &&
4
+ ((e.fn === "attested" &&
5
+ e.args[0]?.k === "ref" &&
6
+ e.args[0].kind === "evidence" &&
7
+ e.args[0].name === evidence) ||
8
+ (["all?", "any?"].includes(e.fn) &&
9
+ e.args.some((a) => a.k === "list" && a.items.some(contains))));
10
+ const producers = c.requirements.filter((r) => r.cycle?.k === "call" &&
11
+ r.cycle.fn === "resource-generation" &&
12
+ r.cycle.args.length === 1 &&
13
+ r.cycle.args[0]?.k === "var" &&
14
+ r.cycle.args[0].name === resource &&
15
+ contains(r.satisfiedBy));
16
+ return producers.length === 1 ? producers[0] : undefined;
17
+ };
18
+ const proofForms = {
19
+ "entered-at": {
20
+ target: "a machine and one of its declared states",
21
+ help: "Use (entered-at machine :state) with a machine declared by this component, including a connector-owned machine, and a state declared by its protocol.",
22
+ },
23
+ "resource-generation": {
24
+ target: "a managed resource",
25
+ help: "Use (resource-generation machine) with a managed resource declared by this component.",
26
+ },
27
+ "attested-for": {
28
+ target: "a managed resource and its generation-bound evidence producer",
29
+ help: "Use (attested-for machine Evidence) with a managed resource declared by this component and owned evidence with exactly one producer cycled by (resource-generation machine).",
30
+ },
31
+ };
32
+ export const resourceProofDiagnostics = (ir) => {
33
+ const errors = [];
34
+ const scan = (v, c) => {
35
+ if (Array.isArray(v)) {
36
+ v.forEach((x) => scan(x, c));
37
+ return;
38
+ }
39
+ if (!v || typeof v !== "object")
40
+ return;
41
+ const e = v;
42
+ if (e.k === "call") {
43
+ let code;
44
+ if (["resource-generation", "entered-at", "attested-for"].includes(e.fn)) {
45
+ const machine = e.args[0], name = machine?.k === "var" ? machine.name : "";
46
+ let valid = e.fn === "entered-at"
47
+ ? !!c?.machines.some((m) => m.name === name)
48
+ : !!c?.resources?.some((r) => r.name === name);
49
+ if (e.fn === "resource-generation")
50
+ valid &&= e.args.length === 1;
51
+ if (e.fn === "entered-at") {
52
+ const state = e.args[1], protocol = ir.machines.find((m) => m.name === c?.machines.find((m) => m.name === name)?.protocol);
53
+ valid &&=
54
+ e.args.length === 2 &&
55
+ state?.k === "kw" &&
56
+ !!protocol?.states.some((s) => s.name === state.v);
57
+ }
58
+ if (e.fn === "attested-for") {
59
+ const proof = e.args[1];
60
+ valid &&=
61
+ e.args.length === 2 &&
62
+ proof?.k === "ref" &&
63
+ proof.kind === "evidence" &&
64
+ ir.evidence.some((x) => x.name === proof.name && x.of === c?.name) &&
65
+ !!c &&
66
+ !!resourceProofRequirement(c, name, proof.name);
67
+ }
68
+ if (!valid)
69
+ code = "E_RESOURCE_PROOF";
70
+ }
71
+ if (["notice-delivered?", "notice-acknowledged?"].includes(e.fn)) {
72
+ const ref = e.args[0];
73
+ if (e.args.length !== 1 ||
74
+ ref?.k !== "ref" ||
75
+ ref.kind !== "notice" ||
76
+ !ir.notices?.some((n) => n.name === ref.name && n.of === c?.name))
77
+ code = "E_NOTICE_PROOF";
78
+ }
79
+ if (code)
80
+ errors.push({
81
+ code,
82
+ severity: "error",
83
+ message: `${e.fn} must name ${proofForms[e.fn]?.target ?? "a notice"} of the current component.`,
84
+ help: `${proofForms[e.fn]?.help ?? "Use a notice owned by this component."} Keep these context reads directly in component expressions.`,
85
+ at: e.at,
86
+ });
87
+ }
88
+ for (const [key, x] of Object.entries(v))
89
+ if (key !== "at")
90
+ scan(x, c);
91
+ };
92
+ ir.components.forEach((c) => scan(c, c));
93
+ // Other declaration contexts have no component-owned machine or notice scope.
94
+ for (const [key, value] of Object.entries(ir))
95
+ if (key !== "components" && key !== "scenarios" && key !== "properties")
96
+ scan(value);
97
+ return errors;
98
+ };
@@ -0,0 +1,3 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const resourceHelp = "Declare a unique resource over its same-named machine, use capabilities of that machine's owning connector, and expose an owned acquisition action as a public operation.";
3
+ export declare const resourceDiagnostics: (ir: Pick<IR.WorldIR, "components" | "connectors" | "componentContracts" | "machines">) => IR.Diagnostic[];
@@ -0,0 +1,30 @@
1
+ import { componentOperationNames } from "./component-operations.js";
2
+ export const resourceHelp = "Declare a unique resource over its same-named machine, use capabilities of that machine's owning connector, and expose an owned acquisition action as a public operation.";
3
+ export const resourceDiagnostics = (ir) => ir.components.flatMap((c) => {
4
+ const seen = new Set(), actionsUsed = new Set();
5
+ return (c.resources ?? []).flatMap((r) => {
6
+ const error = (code, message, at = r.at) => [
7
+ { code, severity: "error", message, at, help: resourceHelp },
8
+ ];
9
+ if (seen.has(r.name))
10
+ return error("E_RESOURCE_NAME", "Duplicate resource name.");
11
+ seen.add(r.name);
12
+ const machine = c.machines.find((m) => m.name === r.name);
13
+ if (!machine || !ir.machines.some((m) => m.name === machine.protocol))
14
+ return error("E_RESOURCE_MACHINE", "A resource needs a same-named declared machine.");
15
+ for (const call of [r.acquire, r.release]) {
16
+ const connector = ir.connectors.find((x) => x.name === call.connector);
17
+ if (!connector?.capabilities.includes(call.capability) ||
18
+ !connector.owns.includes(machine.protocol))
19
+ return error("E_RESOURCE_CAPABILITY", "Resource calls must be capabilities of the protocol's owning connector.", call.at);
20
+ }
21
+ const actions = c.actions.filter((a) => a.via.kind === "connector" &&
22
+ a.via.connector === r.acquire.connector &&
23
+ a.via.capability === r.acquire.capability &&
24
+ componentOperationNames(ir, c).includes(a.name));
25
+ if (actions.length !== 1 || actionsUsed.has(actions[0].name))
26
+ return error("E_RESOURCE_ACTION", "A resource needs one unambiguous owned public acquisition action.", r.acquire.at);
27
+ actionsUsed.add(actions[0].name);
28
+ return [];
29
+ });
30
+ });
@@ -0,0 +1,10 @@
1
+ import type { Component, Requirement, Decision, WorldIR } from "../world-ir/types.generated.js";
2
+ export declare const reuseDecisionName: (component: string, requirement: string, choice: "accepted" | "declined") => string;
3
+ export declare const reuseDecisions: (component: Component, requirement: Requirement) => readonly Decision[];
4
+ /** Recheck raw IR before activation; no data-dependent discovery can repair an unsafe scope. */
5
+ export declare const reuseProblem: (ir: WorldIR) => {
6
+ code: string;
7
+ message: string;
8
+ at: Requirement["at"];
9
+ help: string;
10
+ } | undefined;
@@ -0,0 +1,99 @@
1
+ import { principalKinds, principalActionKey } from "./principals.js";
2
+ export const reuseDecisionName = (component, requirement, choice) => `${choice === "accepted" ? "accept" : "decline"}-reuse:${component}/${requirement}`;
3
+ export const reuseDecisions = (component, requirement) => {
4
+ const reuse = requirement.reuse;
5
+ if (!reuse?.confirm)
6
+ return [];
7
+ return ["accepted", "declined"].map((choice) => ({
8
+ name: reuseDecisionName(component.name, requirement.name, choice),
9
+ doc: `${choice === "accepted" ? "Accept" : "Decline"} scoped evidence for ${component.name}/${requirement.name}.`,
10
+ of: component.name,
11
+ applies: requirement.name,
12
+ by: reuse.confirm,
13
+ byKind: reuse.confirmKind === "entity" ? "individual" : "group",
14
+ effect: choice === "accepted" ? "accept" : "reject",
15
+ reason: ["Option", "String"],
16
+ ...(requirement.cites ? { cites: requirement.cites } : {}),
17
+ at: reuse.at,
18
+ }));
19
+ };
20
+ const semantic = (value) => JSON.stringify(value, (key, value) => key === "at"
21
+ ? undefined
22
+ : value && typeof value === "object" && !Array.isArray(value)
23
+ ? Object.fromEntries(Object.entries(value).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))
24
+ : value);
25
+ /** Recheck raw IR before activation; no data-dependent discovery can repair an unsafe scope. */
26
+ export const reuseProblem = (ir) => {
27
+ for (const component of ir.components)
28
+ for (const r of component.requirements) {
29
+ const reuse = r.reuse;
30
+ if (!reuse)
31
+ continue;
32
+ const error = (code, message) => ({
33
+ code,
34
+ message,
35
+ at: reuse.at,
36
+ help: "Republish direct owned evidence with a stable home-containing key scope, positive fixed window and a keyed confirmation principal.",
37
+ });
38
+ const names = reuse.scope.map((e) => (e.k === "var" ? e.name : ""));
39
+ if (!names.length ||
40
+ names.some((n) => !n || !component.key.includes(n)) ||
41
+ new Set(names).size !== names.length ||
42
+ component.home.path.length !== 1 ||
43
+ !names.includes(component.home.path[0]))
44
+ return error("E_REUSE_SCOPE", "Invalid evidence reuse scope");
45
+ if (!Number.isSafeInteger(reuse.within.n) ||
46
+ reuse.within.n <= 0 ||
47
+ !["days", "years", "hours", "minutes"].includes(reuse.within.unit))
48
+ return error("E_REUSE_INTERVAL", "Invalid evidence reuse window");
49
+ const proof = r.satisfiedBy;
50
+ const evidenceName = proof.k === "call" && proof.args[0]?.k === "ref" ? proof.args[0].name : undefined;
51
+ if (proof.k !== "call" ||
52
+ !["attested", "valid"].includes(proof.fn) ||
53
+ proof.args.length !== 1 ||
54
+ proof.args[0]?.k !== "ref" ||
55
+ proof.args[0].kind !== "evidence" ||
56
+ ir.evidence.find((e) => e.name === evidenceName)?.of !== component.name ||
57
+ r.accepts ||
58
+ r.cycle ||
59
+ r.recur ||
60
+ r.renewWithin)
61
+ return error("E_REUSE_TARGET", "Invalid evidence reuse proof context");
62
+ if (reuse.confirm) {
63
+ const path = (e) => e.k === "var"
64
+ ? component.key.includes(e.name)
65
+ : e.k === "read" || e.k === "attr"
66
+ ? path(e.of)
67
+ : false;
68
+ const expr = reuse.confirm, target = expr.k === "call" && expr.fn === "members" && expr.args.length === 1
69
+ ? expr.args[0]
70
+ : expr;
71
+ const kinds = principalKinds({
72
+ ...ir,
73
+ components: [
74
+ {
75
+ ...component,
76
+ actions: [{ name: "$reuse", assignee: expr, assigneeKind: reuse.confirmKind }],
77
+ },
78
+ ],
79
+ decisions: [],
80
+ }, true);
81
+ if (!path(target) ||
82
+ kinds.diagnostics.length ||
83
+ kinds.assignees.get(principalActionKey(component.name, "$reuse")) !== reuse.confirmKind)
84
+ return error("E_REUSE_CONFIRM", "Invalid evidence reuse confirmation principal");
85
+ }
86
+ else if (reuse.confirmKind)
87
+ return error("E_REUSE_CONFIRM", "Confirmation kind without a principal");
88
+ const contracts = reuseDecisions(component, r);
89
+ for (const d of ir.decisions ?? [])
90
+ if (d.of === component.name &&
91
+ d.applies === r.name &&
92
+ (d.effect === "accept" || contracts.some((c) => c.name === d.name))) {
93
+ const expected = contracts.find((c) => c.name === d.name);
94
+ if (!expected || semantic(d) !== semantic(expected))
95
+ return error("E_REUSE_CONFIRM", "Scoped evidence confirmation must use its declared contract");
96
+ }
97
+ }
98
+ return undefined;
99
+ };
@@ -0,0 +1,14 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ import type { Sensitivity } from "./sensitivity.js";
3
+ export type Classify = (type: IR.TypeRef) => Sensitivity;
4
+ export declare const derivedLeakHelp = "Preserve every source classification and vault through aliases and generated artifacts. Use an explicitly sealed human snapshot for a separately retained copy; public expressions cannot declassify private values.";
5
+ export declare const sealingModel: (ir: IR.WorldIR) => {
6
+ unwrap: (type: IR.TypeRef | undefined, seen?: Set<string>) => IR.TypeRef | undefined;
7
+ reference: (type: IR.TypeRef | undefined) => string | undefined;
8
+ field: (type: IR.TypeRef | undefined, name: string) => IR.Field | undefined;
9
+ binding: (entity: IR.Entity, b: IR.Binding) => {
10
+ owner: IR.Entity;
11
+ field: IR.EntityField;
12
+ } | undefined;
13
+ };
14
+ export declare const sealingDiagnostics: (ir: IR.WorldIR, classify: Classify) => IR.Diagnostic[];
@@ -0,0 +1,123 @@
1
+ export const derivedLeakHelp = "Preserve every source classification and vault through aliases and generated artifacts. Use an explicitly sealed human snapshot for a separately retained copy; public expressions cannot declassify private values.";
2
+ export const sealingModel = (ir) => {
3
+ const unwrap = (type, seen = new Set()) => {
4
+ if (typeof type === "string") {
5
+ const alias = ir.types.find((a) => a.name === type);
6
+ if (alias && !seen.has(type))
7
+ return unwrap(alias.type, new Set([...seen, type]));
8
+ }
9
+ if (Array.isArray(type) && ["Option", "Brand"].includes(String(type[0])))
10
+ return unwrap(type[1], seen);
11
+ return type;
12
+ };
13
+ const reference = (type) => {
14
+ const t = unwrap(type);
15
+ return Array.isArray(t) && t[0] === "Id" && typeof t[1] === "string" ? t[1] : undefined;
16
+ };
17
+ const field = (type, name) => {
18
+ const target = reference(type), component = ir.components.find((c) => c.name === target);
19
+ if (component) {
20
+ const slot = component.slots.find((s) => s.name === name);
21
+ if (slot)
22
+ return { name, type: ["Id", slot.component] };
23
+ if (name === "attached")
24
+ return { name, type: ["List", ["Id", ir.libraries[0]?.subject ?? "Unknown"]] };
25
+ if ([...component.outputs, ...component.requirements].some((f) => f.name === name))
26
+ return { name, type: "Status" };
27
+ return [...component.inputs, ...component.params].find((f) => f.name === name);
28
+ }
29
+ return [...ir.roles, ...ir.entities]
30
+ .find((r) => r.name === target)
31
+ ?.fields.find((f) => f.name === name);
32
+ };
33
+ const binding = (entity, b) => {
34
+ if (b.attrs.length !== b.path.length)
35
+ return undefined;
36
+ let owner = entity;
37
+ for (const [i, name] of b.path.entries()) {
38
+ const f = owner.fields.find((f) => f.name === name);
39
+ if (!f || f.attr !== b.attrs[i])
40
+ return undefined;
41
+ if (i === b.path.length - 1)
42
+ return { owner, field: f };
43
+ const next = ir.entities.find((e) => e.name === reference(f.type));
44
+ if (!next)
45
+ return undefined;
46
+ owner = next;
47
+ }
48
+ return undefined;
49
+ };
50
+ return { unwrap, reference, field, binding };
51
+ };
52
+ export const sealingDiagnostics = (ir, classify) => {
53
+ const diagnostics = [], model = sealingModel(ir);
54
+ const report = (code, message, at) => diagnostics.push({ code, severity: "error", message, at, help: derivedLeakHelp });
55
+ const classes = (f) => {
56
+ const r = classify(f.type);
57
+ return r.ok ? r.classes : [];
58
+ };
59
+ const compatible = (fields, seal, at, scope) => {
60
+ const held = fields.flatMap(classes), vault = ir.vaults?.find((v) => v.name === seal?.vault);
61
+ if (held.length && (!vault || held.some((c) => !vault.holds.includes(c))))
62
+ report("E_UNSEALED_SENSITIVE", "Sensitive data needs a vault holding every declared class.", seal?.at ?? at);
63
+ if (vault && !scope(vault))
64
+ report("E_VAULT_SCOPE", "The seal does not belong to this subject or occurrence.", seal.at);
65
+ };
66
+ const entityScope = (entity, v) => v.key.kind === "subject" && entity.implements.some((b) => b.role === v.key.target);
67
+ for (const role of ir.roles)
68
+ for (const f of role.fields) {
69
+ compatible([f], f.sealedBy, role.at, (v) => {
70
+ if (v.key.kind !== "subject")
71
+ return false;
72
+ if (v.key.target === role.name)
73
+ return true;
74
+ const aliases = ir.entities.flatMap((e) => e.implements
75
+ .filter((b) => b.role === role.name && b.field === f.name)
76
+ .map((b) => model.binding(e, b)));
77
+ return aliases.length > 0 && aliases.every((b) => b && entityScope(b.owner, v));
78
+ });
79
+ }
80
+ for (const entity of ir.entities) {
81
+ for (const f of entity.fields)
82
+ compatible([f], f.sealedBy, entity.at, (v) => entityScope(entity, v));
83
+ for (const b of entity.implements) {
84
+ const declared = ir.roles
85
+ .find((r) => r.name === b.role)
86
+ ?.fields.find((f) => f.name === b.field), actual = model.binding(entity, b);
87
+ if (!declared || !actual) {
88
+ report("E_DERIVED_LEAK", "A role binding needs an exact declared entity path and attribute chain.", b.at);
89
+ continue;
90
+ }
91
+ if (JSON.stringify(classes(declared)) !== JSON.stringify(classes(actual.field)) ||
92
+ declared.sealedBy?.vault !== actual.field.sealedBy?.vault)
93
+ report("E_DERIVED_LEAK", "Role aliases must preserve the concrete field's classification and exact vault.", b.at);
94
+ }
95
+ const display = entity.fields.find((f) => f.name === entity.display);
96
+ if (display && classes(display).length)
97
+ report("E_DERIVED_LEAK", "Public display names cannot expose sensitive fields.", entity.at);
98
+ }
99
+ for (const evidence of ir.evidence) {
100
+ const component = ir.components.find((c) => c.name === evidence.of);
101
+ compatible(evidence.fields, evidence.sealedBy, evidence.at, (v) => {
102
+ if (v.key.kind === "occurrence")
103
+ return v.key.target === evidence.of;
104
+ let type = component ? ["Id", component.name] : undefined;
105
+ for (const segment of component?.home.path ?? [])
106
+ type = model.field(type, segment)?.type;
107
+ return model.reference(type) === v.key.target;
108
+ });
109
+ for (const f of evidence.fields)
110
+ if (f.sealedBy && f.sealedBy.vault !== evidence.sealedBy?.vault)
111
+ report("E_DERIVED_LEAK", "A record field cannot substitute another vault for its whole-record seal.", f.sealedBy.at);
112
+ }
113
+ const inherit = (seal, sources, at) => {
114
+ const expected = [...new Set(sources.flatMap((s) => (s ? [s.vault] : [])))];
115
+ if (expected.some((v) => v !== seal?.vault))
116
+ report("E_DERIVED_LEAK", "A generated artifact must retain every source vault.", seal?.at ?? at);
117
+ };
118
+ for (const d of ir.documents ?? [])
119
+ inherit(d.sealedBy, d.sources.map((s) => ir.evidence.find((e) => e.name === s)?.sealedBy), d.at);
120
+ for (const n of ir.notices ?? [])
121
+ inherit(n.sealedBy, [ir.documents?.find((d) => d.name === n.document)?.sealedBy], n.at);
122
+ return diagnostics;
123
+ };
@@ -0,0 +1,4 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ import { type Classify } from "./sealing.js";
3
+ /** All branches and call arguments participate; no operation implicitly declassifies data. */
4
+ export declare const sensitiveFlowDiagnostics: (ir: IR.WorldIR, classify: Classify) => IR.Diagnostic[];