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,3 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ /** Contract checks use declarations only; runtime inputs and entity enumeration play no part. */
3
+ export declare const componentContractDiagnostics: (ir: IR.WorldIR) => IR.Diagnostic[];
@@ -0,0 +1,307 @@
1
+ import { operationDeclarationProblem } from "./component-operations.js";
2
+ import { canonicalJson, contentDigest } from "./content-digest.js";
3
+ import { componentContractDigest, componentContractSurface } from "./contracts.js";
4
+ /** Contract checks use declarations only; runtime inputs and entity enumeration play no part. */
5
+ export const componentContractDiagnostics = (ir) => {
6
+ if (!ir.componentContracts?.length &&
7
+ !ir.componentImports?.length &&
8
+ !ir.components.some((c) => c.library || c.operations !== undefined))
9
+ return [];
10
+ const diagnostics = ir.components.flatMap((c) => {
11
+ const d = operationDeclarationProblem(ir, c);
12
+ return d ? [d] : [];
13
+ });
14
+ const report = (code, message, at) => diagnostics.push({
15
+ code,
16
+ severity: "error",
17
+ message,
18
+ at,
19
+ help: "Import the provider's completed component contract at its declared version. Read published outputs or explicitly public inputs; keep private requirements/state inside the component and invoke declared operations for changes.",
20
+ });
21
+ const unique = (names) => new Set(names).size === names.length;
22
+ const contracts = ir.componentContracts ?? [], imports = ir.componentImports ?? [];
23
+ for (const values of [
24
+ ir.libraries,
25
+ ir.components,
26
+ ir.roles,
27
+ ir.types,
28
+ ir.derives,
29
+ ir.evidence,
30
+ ir.interactions,
31
+ ir.connectors,
32
+ ir.decisions ?? [],
33
+ contracts,
34
+ imports,
35
+ ])
36
+ if (!unique(values.map((v) => v.name))) {
37
+ report("E_COMPONENT_CONTRACT", "Contract models require unambiguous named declarations.", values[0].at);
38
+ return diagnostics;
39
+ }
40
+ const components = new Map(ir.components.map((c) => [c.name, c]));
41
+ for (const component of ir.components) {
42
+ if (component.library && !ir.libraries.some((l) => l.name === component.library))
43
+ report("E_COMPONENT_CONTRACT", `Unknown owner of ${component.name}.`, component.at);
44
+ for (const values of [
45
+ component.inputs,
46
+ component.params,
47
+ component.outputs,
48
+ component.actions,
49
+ ...(contracts.some((c) => c.component === component.name) ? [component.requirements] : []),
50
+ component.slots,
51
+ ])
52
+ if (!unique(values.map((v) => v.name)))
53
+ report("E_COMPONENT_CONTRACT", `${component.name} has ambiguous members.`, component.at);
54
+ }
55
+ for (const c of contracts) {
56
+ const target = components.get(c.component);
57
+ if (!target ||
58
+ target.library !== c.library ||
59
+ !ir.libraries.some((l) => l.name === c.library)) {
60
+ report("E_COMPONENT_CONTRACT", `${c.name} must export its own declared component.`, c.at);
61
+ continue;
62
+ }
63
+ if (target.operations && c.operations.some((o) => !target.operations.includes(o.name))) {
64
+ report("E_NOT_AN_OPERATION", `${c.name} exports an operation private to ${target.name}.`, c.at);
65
+ continue;
66
+ }
67
+ const outputs = c.outputs.map((o) => o.name), operations = c.operations.map((o) => o.name), capabilities = c.capabilities.map((o) => o.connector);
68
+ if (!unique(outputs) ||
69
+ !unique(operations) ||
70
+ !unique(capabilities) ||
71
+ outputs.some((n) => !target.outputs.some((o) => o.name === n)) ||
72
+ operations.some((n) => {
73
+ return (Number(target.actions.some((a) => a.name === n)) +
74
+ (ir.decisions ?? []).filter((d) => d.of === target.name && d.name === n).length !==
75
+ 1);
76
+ }) ||
77
+ capabilities.some((n) => !ir.connectors.some((connector) => connector.name === n))) {
78
+ report("E_COMPONENT_CONTRACT", `${c.name} exposes an undeclared or ambiguous member.`, c.at);
79
+ continue;
80
+ }
81
+ const expected = {
82
+ name: c.name,
83
+ library: c.library,
84
+ ...componentContractSurface(ir, target, outputs, operations, capabilities),
85
+ };
86
+ const { digest, doc: _doc, at: _at, ...actual } = c;
87
+ if (componentContractDigest(expected) !== digest || contentDigest(actual) !== digest)
88
+ report("E_COMPONENT_CONTRACT", `${c.name} has a stale or forged public surface/digest.`, c.at);
89
+ for (const action of target.actions)
90
+ if (action.via.kind === "connector" && !capabilities.includes(action.via.connector))
91
+ report("E_COMPONENT_CONTRACT", `${c.name} omits required service ${action.via.connector}.`, c.at);
92
+ for (const resource of target.resources ?? [])
93
+ for (const call of [resource.acquire, resource.release])
94
+ if (!capabilities.includes(call.connector))
95
+ report("E_COMPONENT_CONTRACT", `${c.name} omits required service ${call.connector}.`, c.at);
96
+ }
97
+ const importKeys = new Set();
98
+ for (const i of imports) {
99
+ const c = contracts.find((c) => c.name === i.contract), key = JSON.stringify([i.library, c?.component]);
100
+ if (!ir.libraries.some((l) => l.name === i.library) ||
101
+ !ir.libraries.some((l) => l.name === i.from && l.version === i.version) ||
102
+ !c ||
103
+ c.library !== i.from ||
104
+ c.digest !== i.digest ||
105
+ importKeys.has(key))
106
+ report("E_COMPONENT_IMPORT", `${i.name} has an invalid or ambiguous contract pin.`, i.at);
107
+ importKeys.add(key);
108
+ }
109
+ if (diagnostics.length)
110
+ return diagnostics;
111
+ const libraryOf = (c) => c.library ?? ir.libraries[0]?.name;
112
+ const visible = (owner, target, at) => {
113
+ const candidates = contracts.filter((c) => c.component === target.name);
114
+ if (!candidates.length)
115
+ return undefined;
116
+ const imported = imports.find((i) => i.library === libraryOf(owner) && candidates.some((c) => c.name === i.contract));
117
+ const contract = imported
118
+ ? candidates.find((c) => c.name === imported.contract)
119
+ : libraryOf(owner) === libraryOf(target) && candidates.length === 1
120
+ ? candidates[0]
121
+ : undefined;
122
+ if (!contract)
123
+ report("E_COMPONENT_IMPORT", `${owner.name} needs an unambiguous imported contract for ${target.name}.`, at);
124
+ return contract;
125
+ };
126
+ for (const owner of ir.components) {
127
+ for (const slot of owner.slots) {
128
+ const target = components.get(slot.component);
129
+ if (!target) {
130
+ report("E_COMPONENT_IMPORT", `${slot.name} names no component.`, slot.at);
131
+ continue;
132
+ }
133
+ if (target.library &&
134
+ libraryOf(owner) !== target.library &&
135
+ !contracts.some((c) => c.component === target.name))
136
+ report("E_COMPONENT_IMPORT", `${target.name} is private to ${target.library}.`, slot.at);
137
+ visible(owner, target, slot.at);
138
+ }
139
+ for (const output of owner.outputs)
140
+ for (const path of output.paths) {
141
+ let current = owner;
142
+ for (const [index, segment] of path.segments.entries()) {
143
+ const boundary = current.name === owner.name ? undefined : visible(owner, current, path.at);
144
+ if (boundary && !boundary.outputs.some((o) => o.name === segment)) {
145
+ report("E_COMPONENT_PRIVATE", `${current.name}.${segment} is outside its public contract.`, path.at);
146
+ break;
147
+ }
148
+ const slot = current.slots.find((s) => s.name === segment);
149
+ if (slot) {
150
+ const next = components.get(slot.component);
151
+ if (next) {
152
+ current = next;
153
+ if (index === path.segments.length - 1) {
154
+ const whole = visible(owner, next, path.at);
155
+ if (whole &&
156
+ next.outputs.some((o) => !whole.outputs.some((p) => p.name === o.name)))
157
+ report("E_COMPONENT_PRIVATE", `${next.name} has unexported outputs; name a published output explicitly.`, path.at);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ }
164
+ const unwrap = (t, seen = new Set()) => {
165
+ if (typeof t === "string") {
166
+ const a = ir.types.find((a) => a.name === t);
167
+ if (a && !seen.has(t))
168
+ return unwrap(a.type, new Set([...seen, t]));
169
+ }
170
+ if (Array.isArray(t) && (t[0] === "Option" || t[0] === "Brand"))
171
+ return unwrap(t[1], seen);
172
+ return t;
173
+ };
174
+ const reference = (t) => {
175
+ const v = unwrap(t);
176
+ return Array.isArray(v) && v[0] === "Id" && typeof v[1] === "string" ? v[1] : undefined;
177
+ };
178
+ const fieldType = (t, field) => {
179
+ const name = reference(t), c = components.get(name ?? "");
180
+ if (c) {
181
+ const slot = c.slots.find((s) => s.name === field);
182
+ if (slot)
183
+ return ["Id", slot.component];
184
+ if (field === "attached")
185
+ return ["List", ["Id", ir.libraries[0].subject]];
186
+ return [...c.inputs, ...c.params].find((f) => f.name === field)?.type ?? "Status";
187
+ }
188
+ return [...ir.roles, ...ir.entities]
189
+ .find((r) => r.name === name)
190
+ ?.fields.find((f) => f.name === field)?.type;
191
+ };
192
+ const typeOf = (e, scope) => {
193
+ switch (e.k) {
194
+ case "var":
195
+ return scope.get(e.name);
196
+ case "inst":
197
+ return fieldType(typeOf(e.of, scope), e.field);
198
+ case "read":
199
+ return ir.roles.find((r) => r.name === e.role)?.fields.find((f) => f.name === e.field)
200
+ ?.type;
201
+ case "attr":
202
+ return ir.entities
203
+ .find((r) => e.attr.startsWith(r.ns + "/"))
204
+ ?.fields.find((f) => f.attr === e.attr)?.type;
205
+ case "if": {
206
+ const a = typeOf(e.then, scope), b = typeOf(e.else, scope);
207
+ return canonicalJson(a) === canonicalJson(b) ? a : undefined;
208
+ }
209
+ case "list":
210
+ return ["List", e.items[0] ? (typeOf(e.items[0], scope) ?? "Unknown") : "Unknown"];
211
+ case "call": {
212
+ const derive = ir.derives.find((d) => d.name === e.fn);
213
+ if (derive)
214
+ return derive.returns;
215
+ if (e.fn === "filter" || e.fn === "spells")
216
+ return typeOf(e.args[e.fn === "filter" ? 1 : 0], scope);
217
+ return undefined;
218
+ }
219
+ default:
220
+ return undefined;
221
+ }
222
+ };
223
+ const walk = (e, scope, owner, active = new Set()) => {
224
+ if (e.k === "inst") {
225
+ const target = components.get(reference(typeOf(e.of, scope)) ?? "");
226
+ if (!target)
227
+ report("E_COMPONENT_PRIVATE", "A component read needs a statically resolved public receiver.", e.at);
228
+ else if (target.name !== owner?.name) {
229
+ const boundary = owner
230
+ ? visible(owner, target, e.at)
231
+ : contracts.find((c) => c.component === target.name);
232
+ if (boundary &&
233
+ ![...boundary.inputs, ...boundary.params, ...boundary.outputs].some((f) => f.name === e.field))
234
+ report("E_COMPONENT_PRIVATE", `${target.name}.${e.field} is outside its public contract.`, e.at);
235
+ }
236
+ walk(e.of, scope, owner, active);
237
+ }
238
+ else if (e.k === "read" || e.k === "attr")
239
+ walk(e.of, scope, owner, active);
240
+ else if (e.k === "if") {
241
+ walk(e.test, scope, owner, active);
242
+ walk(e.then, scope, owner, active);
243
+ walk(e.else, scope, owner, active);
244
+ }
245
+ else if (e.k === "list")
246
+ e.items.forEach((x) => walk(x, scope, owner, active));
247
+ else if (e.k === "fn") {
248
+ const inner = new Map(scope);
249
+ e.params.forEach((p) => inner.delete(p));
250
+ walk(e.body, inner, owner, active);
251
+ }
252
+ else if (e.k === "call") {
253
+ for (const [i, arg] of e.args.entries()) {
254
+ if (arg.k === "fn" && i === 0 && (e.fn === "map" || e.fn === "filter")) {
255
+ const list = unwrap(typeOf(e.args[1], scope)), inner = new Map(scope);
256
+ arg.params.forEach((p) => inner.set(p, Array.isArray(list) && list[0] === "List" ? list[1] : "Unknown"));
257
+ walk(arg.body, inner, owner, active);
258
+ }
259
+ else
260
+ walk(arg, scope, owner, active);
261
+ }
262
+ const d = ir.derives.find((d) => d.name === e.fn);
263
+ if (d && !active.has(d.name))
264
+ walk(d.body, new Map(d.params.map((p) => [p.name, p.type])), owner, new Set([...active, d.name]));
265
+ }
266
+ };
267
+ const visit = (value, scope, owner) => {
268
+ if (!value || typeof value !== "object")
269
+ return;
270
+ if ("k" in value)
271
+ walk(value, scope, owner);
272
+ else
273
+ for (const [key, child] of Object.entries(value))
274
+ if (key !== "at")
275
+ visit(child, scope, owner);
276
+ };
277
+ for (const c of ir.components) {
278
+ const scope = new Map([...c.inputs, ...c.params].map((f) => [f.name, f.type]));
279
+ scope.set("self", ["Id", c.name]);
280
+ scope.set("attached", ["List", ["Id", ir.libraries[0].subject]]);
281
+ visit(c, scope, c);
282
+ for (const d of ir.decisions ?? [])
283
+ if (d.of === c.name)
284
+ visit(d, scope, c);
285
+ for (const e of ir.evidence)
286
+ if (e.of === c.name) {
287
+ visit(e, scope, c);
288
+ for (const i of ir.interactions)
289
+ if (i.produces === e.name)
290
+ visit(i, scope, c);
291
+ }
292
+ for (const a of ir.accounts)
293
+ for (const p of a.policies ?? [])
294
+ if (p.of === c.name)
295
+ visit(p, scope, c);
296
+ }
297
+ for (const d of ir.derives)
298
+ walk(d.body, new Map(d.params.map((p) => [p.name, p.type])), undefined);
299
+ const seen = new Set();
300
+ return diagnostics.filter((d) => {
301
+ const key = JSON.stringify([d.code, d.at]);
302
+ if (seen.has(key))
303
+ return false;
304
+ seen.add(key);
305
+ return true;
306
+ });
307
+ };
@@ -0,0 +1,25 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const componentContractSurface: (ir: Pick<IR.WorldIR, "types" | "roles" | "components" | "evidence" | "interactions" | "decisions" | "connectors" | "vaults">, component: IR.Component, outputs: readonly string[], operations: readonly string[], capabilities: readonly string[]) => {
3
+ component: string;
4
+ key: readonly string[];
5
+ home: IR.InputHome;
6
+ inputs: IR.Field[];
7
+ params: IR.Field[];
8
+ paramBounds: IR.ParamBound[];
9
+ types: IR.Field[];
10
+ roles: {
11
+ name: string;
12
+ fields: readonly IR.Field[];
13
+ }[];
14
+ outputs: {
15
+ name: string;
16
+ type: "Status";
17
+ }[];
18
+ operations: IR.ContractOperation[];
19
+ capabilities: {
20
+ connector: string;
21
+ capabilities: string[];
22
+ }[];
23
+ vaults?: readonly [IR.Vault, ...IR.Vault[]];
24
+ };
25
+ export declare const componentContractDigest: (contract: Omit<IR.ComponentContract, "digest" | "doc" | "at">) => string;
@@ -0,0 +1,80 @@
1
+ import { contentDigest } from "./content-digest.js";
2
+ export const componentContractSurface = (ir, component, outputs, operations, capabilities) => {
3
+ const sorted = (values) => [...values].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
4
+ const selectedOperations = operations.map((name) => {
5
+ const action = component.actions.find((a) => a.name === name);
6
+ if (action) {
7
+ const via = action.via;
8
+ const interaction = via.kind === "interaction" ? ir.interactions.find((i) => i.name === via.name) : undefined;
9
+ const evidence = interaction
10
+ ? ir.evidence.find((e) => e.name === interaction.produces)
11
+ : undefined;
12
+ return {
13
+ name,
14
+ kind: "action",
15
+ input: sorted(evidence?.fields ?? []),
16
+ result: evidence ? "Evidence" : "Command",
17
+ ...(evidence?.sealedBy ? { sealedBy: evidence.sealedBy } : {}),
18
+ ...(evidence?.amend && evidence.of === component.name ? { amendable: true } : {}),
19
+ ...(evidence?.attest?.audit
20
+ ? { signature: { method: evidence.attest.method, audit: evidence.attest.audit } }
21
+ : {}),
22
+ };
23
+ }
24
+ const decision = ir.decisions?.find((d) => d.name === name && d.of === component.name);
25
+ if (!decision)
26
+ throw Error(`No operation ${component.name}/${name}`);
27
+ return {
28
+ name,
29
+ kind: "decision",
30
+ input: [{ name: "reason", type: decision.reason }],
31
+ result: "Decision",
32
+ };
33
+ });
34
+ const types = new Map(), roles = new Map();
35
+ const visit = (type) => {
36
+ if (Array.isArray(type)) {
37
+ type.forEach(visit);
38
+ return;
39
+ }
40
+ const alias = ir.types.find((t) => t.name === type), role = ir.roles.find((r) => r.name === type);
41
+ if (alias && !types.has(alias.name)) {
42
+ types.set(alias.name, { name: alias.name, type: alias.type });
43
+ visit(alias.type);
44
+ }
45
+ if (role && !roles.has(role.name)) {
46
+ roles.set(role.name, { name: role.name, fields: sorted(role.fields) });
47
+ role.fields.forEach((f) => visit(f.type));
48
+ }
49
+ };
50
+ [...component.inputs, ...component.params, ...selectedOperations.flatMap((o) => o.input)].forEach((f) => visit(f.type));
51
+ const seals = new Set([
52
+ ...component.inputs,
53
+ ...component.params,
54
+ ...[...roles.values()].flatMap((r) => r.fields),
55
+ ...selectedOperations.flatMap((o) => o.input),
56
+ ].flatMap((f) => (f.sealedBy ? [f.sealedBy.vault] : [])));
57
+ selectedOperations.forEach((o) => {
58
+ if (o.sealedBy)
59
+ seals.add(o.sealedBy.vault);
60
+ });
61
+ const vaults = sorted((ir.vaults ?? []).filter((v) => seals.has(v.name)));
62
+ return {
63
+ ...(vaults.length ? { vaults: [vaults[0], ...vaults.slice(1)] } : {}),
64
+ component: component.name,
65
+ key: component.key,
66
+ home: component.home,
67
+ inputs: sorted(component.inputs),
68
+ params: sorted(component.params),
69
+ paramBounds: sorted(component.paramBounds ?? []),
70
+ types: sorted([...types.values()]),
71
+ roles: sorted([...roles.values()]),
72
+ outputs: [...outputs].sort().map((name) => ({ name, type: "Status" })),
73
+ operations: sorted(selectedOperations),
74
+ capabilities: [...capabilities].sort().map((name) => ({
75
+ connector: name,
76
+ capabilities: [...ir.connectors.find((c) => c.name === name).capabilities].sort(),
77
+ })),
78
+ };
79
+ };
80
+ export const componentContractDigest = (contract) => contentDigest(contract);
@@ -0,0 +1,2 @@
1
+ /** Four-digit ISO local dates, checked without consulting the clock or a time zone. */
2
+ export declare const isLocalDate: (value: unknown) => value is string;
@@ -0,0 +1,7 @@
1
+ /** Four-digit ISO local dates, checked without consulting the clock or a time zone. */
2
+ export const isLocalDate = (value) => {
3
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value))
4
+ return false;
5
+ const ms = Date.parse(`${value}T00:00:00Z`);
6
+ return Number.isFinite(ms) && new Date(ms).toISOString().slice(0, 10) === value;
7
+ };
@@ -0,0 +1,3 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const documentHelp = "Use :of Component :from [OwnEvidence] :edition \"1\" :effective {:from \"YYYY-MM-DD\"} :template {:title \"Document\" :fields [{:label \"Field\" :from [OwnEvidence field]}]}. Map fixed scalar fields of the owning component only; use unique nonempty sources/labels and a fixed template.";
3
+ export declare const documentDiagnostics: (ir: Pick<IR.WorldIR, "documents" | "components" | "evidence" | "types">) => IR.Diagnostic[];
@@ -0,0 +1,45 @@
1
+ import { resourceProofRequirement } from "./resource-proofs.js";
2
+ import { collectionType } from "./collect-types.js";
3
+ import { isLocalDate } from "./dates.js";
4
+ export const documentHelp = 'Use :of Component :from [OwnEvidence] :edition "1" :effective {:from "YYYY-MM-DD"} :template {:title "Document" :fields [{:label "Field" :from [OwnEvidence field]}]}. Map fixed scalar fields of the owning component only; use unique nonempty sources/labels and a fixed template.';
5
+ export const documentDiagnostics = (ir) => {
6
+ const errors = [], names = new Set();
7
+ for (const d of ir.documents ?? []) {
8
+ const error = (code, message, at = d.at) => errors.push({ code, severity: "error", message, at, help: documentHelp });
9
+ if (names.has(d.name))
10
+ error("E_DOCUMENT_TEMPLATE", "Document names must be unique.");
11
+ names.add(d.name);
12
+ if (!d.edition.trim() ||
13
+ !d.title.trim() ||
14
+ !d.fields.length ||
15
+ new Set(d.fields.map((f) => f.label)).size !== d.fields.length ||
16
+ d.fields.some((f) => !f.label.trim()))
17
+ error("E_DOCUMENT_TEMPLATE", "Templates need fixed nonempty editions, titles and unique labels.");
18
+ const { from, until } = d.effective;
19
+ if ((!from && !until) ||
20
+ (from !== undefined && !isLocalDate(from)) ||
21
+ (until !== undefined && !isLocalDate(until)) ||
22
+ (from && until && from >= until))
23
+ error("E_DOCUMENT_TEMPLATE", "Template effective dates must form a fixed valid window.", d.effective.at);
24
+ if (!ir.components.some((c) => c.name === d.of) ||
25
+ !d.sources.length ||
26
+ new Set(d.sources).size !== d.sources.length ||
27
+ d.sources.some((name) => !ir.evidence.some((e) => e.name === name && e.of === d.of)))
28
+ error("E_DOCUMENT_SOURCE", "A document reads unique evidence types owned by its component.");
29
+ if (d.resource) {
30
+ const component = ir.components.find((c) => c.name === d.of);
31
+ if (!component?.resources?.some((r) => r.name === d.resource.name) ||
32
+ d.sources.some((type) => !resourceProofRequirement(component, d.resource.name, type)))
33
+ error("E_DOCUMENT_RESOURCE", "A resource-scoped document needs an owned resource and uniquely generation-cycled source proofs.", d.resource.at);
34
+ }
35
+ for (const f of d.fields) {
36
+ const evidence = ir.evidence.find((e) => e.name === f.evidence), field = evidence?.fields.find((x) => x.name === f.field);
37
+ if (!d.sources.includes(f.evidence) ||
38
+ evidence?.of !== d.of ||
39
+ !field ||
40
+ !collectionType(field.type, ir.types))
41
+ error("E_DOCUMENT_SOURCE", "Document fields must name scalar fields of the selected own evidence.", f.at);
42
+ }
43
+ }
44
+ return errors;
45
+ };
@@ -0,0 +1,20 @@
1
+ import type { Span } from "./index.js";
2
+ interface Model {
3
+ readonly evidence?: readonly {
4
+ readonly expires?: unknown;
5
+ }[];
6
+ readonly derives: readonly {
7
+ readonly name: string;
8
+ readonly body: unknown;
9
+ }[];
10
+ }
11
+ export interface EvidenceScopeDiagnostic {
12
+ readonly code: "E_EXPIRES_SCOPE";
13
+ readonly severity: "error";
14
+ readonly message: string;
15
+ readonly help: string;
16
+ readonly at?: Span;
17
+ }
18
+ /** Expiry is a function of a signed record, not its owner's live operational context. */
19
+ export declare const evidenceScopeDiagnostics: (ir: Model) => EvidenceScopeDiagnostic[];
20
+ export {};
@@ -0,0 +1,56 @@
1
+ /** Expiry is a function of a signed record, not its owner's live operational context. */
2
+ export const evidenceScopeDiagnostics = (ir) => {
3
+ const derives = new Map(ir.derives.map((d) => [d.name, d.body]));
4
+ const diagnostics = [];
5
+ const checked = new Set();
6
+ const scan = (value, active) => {
7
+ if (Array.isArray(value)) {
8
+ for (const child of value)
9
+ scan(child, active);
10
+ return;
11
+ }
12
+ if (!value || typeof value !== "object")
13
+ return;
14
+ const node = value;
15
+ const forbidden = ["read", "attr", "inst"].includes(String(node.k)) ||
16
+ (node.k === "ref" && node.kind !== "calendar") ||
17
+ (node.k === "call" &&
18
+ [
19
+ "attested",
20
+ "resource-generation",
21
+ "entered-at",
22
+ "attested-for",
23
+ "notice-delivered?",
24
+ "notice-acknowledged?",
25
+ "valid",
26
+ "decided",
27
+ "added-on",
28
+ "carried-over?",
29
+ "started?",
30
+ "final?",
31
+ "in-state?",
32
+ ].includes(String(node.fn)));
33
+ const name = node.k === "call" && node.derive === true ? String(node.fn) : undefined;
34
+ if (forbidden || (name && active.has(name))) {
35
+ diagnostics.push({
36
+ code: "E_EXPIRES_SCOPE",
37
+ severity: "error",
38
+ message: "Expiry must use signed fields and pure, acyclic date logic.",
39
+ help: "Use a date field or a pure derive over the signed fields. Put live facts, evidence and decisions in requirement predicates.",
40
+ ...(node.at ? { at: node.at } : {}),
41
+ });
42
+ return;
43
+ }
44
+ if (name && !checked.has(name)) {
45
+ scan(derives.get(name), new Set([...active, name]));
46
+ checked.add(name);
47
+ }
48
+ for (const [key, child] of Object.entries(node))
49
+ if (key !== "at")
50
+ scan(child, active);
51
+ };
52
+ for (const evidence of ir.evidence ?? [])
53
+ if (evidence.expires)
54
+ scan(evidence.expires, new Set());
55
+ return diagnostics;
56
+ };
@@ -0,0 +1,7 @@
1
+ import type * as IR from "../world-ir/types.generated.js";
2
+ export declare const fileDigest: (value: unknown) => value is string;
3
+ export declare const filePolicyHelp = "Use a File (including classified, optional or aliased File) field with :files {:field {:accept [\"application/pdf\"] :max-bytes 1048576}}. Declare fixed unique lowercase media types and a positive safe-integer byte limit; do not use wildcards, expressions or structured File collections.";
4
+ export declare const fileShape: (type: IR.TypeRef, aliases: readonly IR.TypeAlias[], seen?: Set<string>) => "file" | "other" | "unsupported";
5
+ export declare const fileMediaType: (value: unknown) => value is string;
6
+ export declare const filePolicyValid: (value: IR.FilePolicy) => boolean;
7
+ export declare const fileFieldDiagnostics: (ir: Pick<IR.WorldIR, "types" | "roles" | "entities" | "evidence">) => IR.Diagnostic[];
@@ -0,0 +1,47 @@
1
+ import { sensitivePayload } from "./sensitivity.js";
2
+ export const fileDigest = (value) => typeof value === "string" && /^sha256:[a-f0-9]{64}$/.test(value);
3
+ export const filePolicyHelp = 'Use a File (including classified, optional or aliased File) field with :files {:field {:accept ["application/pdf"] :max-bytes 1048576}}. Declare fixed unique lowercase media types and a positive safe-integer byte limit; do not use wildcards, expressions or structured File collections.';
4
+ export const fileShape = (type, aliases, seen = new Set()) => {
5
+ if (type === "File")
6
+ return "file";
7
+ if (typeof type === "string") {
8
+ const alias = aliases.find((a) => a.name === type);
9
+ return alias && !seen.has(type)
10
+ ? fileShape(alias.type, aliases, new Set([...seen, type]))
11
+ : "other";
12
+ }
13
+ if (type[0] === "Sensitive") {
14
+ const payload = sensitivePayload(type);
15
+ return payload ? fileShape(payload, aliases, seen) : "unsupported";
16
+ }
17
+ if (type[0] === "Option" || type[0] === "Brand")
18
+ return type[1] ? fileShape(type[1], aliases, seen) : "other";
19
+ return type.slice(1).some((t) => fileShape(t, aliases, seen) !== "other")
20
+ ? "unsupported"
21
+ : "other";
22
+ };
23
+ export const fileMediaType = (value) => typeof value === "string" &&
24
+ /^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/.test(value);
25
+ export const filePolicyValid = (value) => Number.isSafeInteger(value.maxBytes) &&
26
+ value.maxBytes > 0 &&
27
+ value.accept.length > 0 &&
28
+ value.accept.every(fileMediaType) &&
29
+ new Set(value.accept).size === value.accept.length;
30
+ export const fileFieldDiagnostics = (ir) => {
31
+ const errors = [];
32
+ for (const owner of [...ir.roles, ...ir.entities, ...ir.evidence])
33
+ for (const field of owner.fields) {
34
+ const shape = fileShape(field.type, ir.types);
35
+ if (shape === "unsupported" ||
36
+ (shape === "file" && !field.file) ||
37
+ (field.file && (shape !== "file" || !filePolicyValid(field.file))))
38
+ errors.push({
39
+ code: "E_FILE_POLICY",
40
+ severity: "error",
41
+ message: `${owner.name}/${field.name} needs a fixed policy for a single File reference.`,
42
+ at: field.file?.at ?? owner.at,
43
+ help: filePolicyHelp,
44
+ });
45
+ }
46
+ return errors;
47
+ };