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,704 @@
1
+ import { noticeCopiesFor } from "./notices.js";
2
+ import { evidenceSuperseded } from "./evidence-history.js";
3
+ import { resourceGeneration, resourceProofRecords, resourceMachineScope, } from "./resource-generation.js";
4
+ import { signatureValid } from "./signatures.js";
5
+ import { signedFilesAllowed } from "./files.js";
6
+ import { policyParameter } from "./policies.js";
7
+ import { isInstant, isLocalDate } from "../ir-checks/index.js";
8
+ import { normalizeInstant, localDateAt, shiftTime, timeOrder } from "./instants.js";
9
+ import { readValidity } from "./evidence-validity.js";
10
+ import { emptyBasis } from "./basis.js";
11
+ import { addDays, addMonths, addYears, businessDaysAfter, formatDate, } from "./dates.js";
12
+ import { validApprovalCount } from "./decision-records.js";
13
+ import { decisionApprovalCount, selectedDecision, withinProofPeriod, selectedAddition, legacyAcceptance, } from "./decision-evaluation.js";
14
+ export { selectedDecision, selectedAddition, legacyAcceptance } from "./decision-evaluation.js";
15
+ import { ReadSet } from "./dependencies.js";
16
+ import { Unknown, } from "./model.js";
17
+ import { clockCutoffs } from "./temporal.js";
18
+ export const assertSnapshot = (b, now) => {
19
+ if (b.now !== now)
20
+ throw new Error(`Basis snapshot is at ${b.now}; evaluation requested ${now}`);
21
+ };
22
+ export const emptyEnv = { get: () => undefined, snapshot: () => ({ bindings: [] }) };
23
+ export const vars = (entries, parent = emptyEnv) => {
24
+ const own = new Map(entries);
25
+ return {
26
+ get: (name, statusRead, parameter) => own.has(name) ? own.get(name) : parent.get(name, statusRead, parameter),
27
+ snapshot: () => ({
28
+ bindings: [...own].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)),
29
+ parent: parent.snapshot(),
30
+ }),
31
+ };
32
+ };
33
+ export const componentNames = new WeakMap();
34
+ /** An instance's names: its inputs, its component's params, self, attached, machines and
35
+ * requirements (whose statuses come from `status`). */
36
+ export const instanceEnv = (p, inst, status, reads) => {
37
+ const component = p.components.get(inst.component);
38
+ let names = componentNames.get(component);
39
+ if (!names) {
40
+ names = {
41
+ params: new Set(component.params.map((x) => x.name)),
42
+ machines: new Set(component.machines.map((x) => x.name)),
43
+ requirements: new Set(component.requirements.map((x) => x.name)),
44
+ };
45
+ componentNames.set(component, names);
46
+ }
47
+ const { params, machines, requirements } = names;
48
+ return {
49
+ snapshot: () => ({ instance: inst.id }),
50
+ get: (name, statusRead, parameter) => {
51
+ const input = inst.inputs.get(name);
52
+ if (input !== undefined) {
53
+ reads?.add({ kind: "input", instance: inst.id, name, value: input });
54
+ return input;
55
+ }
56
+ if (name === "attached") {
57
+ reads?.add({ kind: "members", instance: inst.id, value: inst.attached });
58
+ return inst.attached;
59
+ }
60
+ if (name === "self")
61
+ return { inst: inst.id };
62
+ if (params.has(name)) {
63
+ const base = inst.params?.get(name) ?? p.params.get(name);
64
+ if (inst.params?.has(name))
65
+ reads?.add({ kind: "input", instance: inst.id, name, value: base });
66
+ return parameter ? parameter(name, base) : (base ?? new Unknown(`no ${name}`));
67
+ }
68
+ if (machines.has(name))
69
+ return { machine: name };
70
+ if (requirements.has(name)) {
71
+ const value = statusRead ? statusRead(inst, name) : status(name);
72
+ if (!statusRead)
73
+ reads?.add({ kind: "status", instance: inst.id, name, value });
74
+ return value;
75
+ }
76
+ return undefined;
77
+ },
78
+ };
79
+ };
80
+ export const isUnknown = (v) => v instanceof Unknown;
81
+ export const isInst = (v) => typeof v === "object" && v !== null && "inst" in v;
82
+ export const isDuration = (v) => typeof v === "object" && v !== null && "unit" in v;
83
+ export const truth = (v) => (v === true ? true : v === false ? false : "unknown");
84
+ export const kleene = (t) => (t === "unknown" ? new Unknown("undetermined") : t);
85
+ export const and = (ts) => ts.includes(false) ? false : ts.includes("unknown") ? "unknown" : true;
86
+ export const or = (ts) => ts.includes(true) ? true : ts.includes("unknown") ? "unknown" : false;
87
+ export const plus = (date, d, sign = 1) => date.length === 10 && (d.unit === "days" || d.unit === "months" || d.unit === "years")
88
+ ? d.unit === "years"
89
+ ? addYears(date, sign * d.n)
90
+ : d.unit === "months"
91
+ ? addMonths(date, sign * d.n)
92
+ : addDays(date, sign * d.n)
93
+ : shiftTime(date.length === 10 ? `${date}T00:00:00.000Z` : date, sign * d.n, d.unit);
94
+ /** Evaluate an expression that reads no facts (account parameters). */
95
+ export const constant = (p, e) => {
96
+ const b = emptyBasis("1970-01-01");
97
+ return evaluateIn({ p, b, inst: undefined, env: emptyEnv }, e);
98
+ };
99
+ export const keyText = (v) => isInst(v) ? v.inst : isUnknown(v) ? "?" : Array.isArray(v) ? v.map(keyText).join(" ") : String(v);
100
+ export const instanceId = (component, key, cycle) => `${component}[${key.map(keyText).join(", ")}]${cycle > 1 ? `#${cycle}` : ""}`;
101
+ export const lookup = (cx, name) => {
102
+ const v = cx.env.get(name, cx.statusRead, (key, base) => policyParameter(cx, key, base));
103
+ if (v === undefined)
104
+ throw new Error(`Unbound ${name}`);
105
+ return v;
106
+ };
107
+ export const describe = (v) => isUnknown(v)
108
+ ? "Unknown"
109
+ : v === null
110
+ ? "—"
111
+ : typeof v === "string" && /^\d{4}-\d{2}-\d{2}$/.test(v)
112
+ ? formatDate(v)
113
+ : isDuration(v)
114
+ ? `${v.n} ${v.unit}`
115
+ : isInst(v)
116
+ ? v.inst
117
+ : Array.isArray(v)
118
+ ? `[${v.map(describe).join(", ")}]`
119
+ : typeof v === "object"
120
+ ? JSON.stringify(v)
121
+ : String(v);
122
+ export const describeValue = describe;
123
+ const evaluateList = (cx, items, evaluate) => {
124
+ if (!cx.trace)
125
+ return items.map(evaluate);
126
+ const trace = cx.trace;
127
+ let last = trace.witness;
128
+ const witnesses = [];
129
+ const values = items.map((item) => {
130
+ // A branch without a witness must not inherit one from its predecessor.
131
+ delete trace.witness;
132
+ const value = evaluate(item);
133
+ witnesses.push(trace.witness);
134
+ if (trace.witness)
135
+ last = trace.witness;
136
+ return value;
137
+ });
138
+ // Ordinary list evaluation retains its last witness; combinators use the per-item trace.
139
+ if (last)
140
+ trace.witness = last;
141
+ (trace.listWitnesses ??= new WeakMap()).set(values, witnesses);
142
+ return values;
143
+ };
144
+ export const evaluateIn = (cx, e) => {
145
+ switch (e.k) {
146
+ case "lit":
147
+ return e.v;
148
+ case "kw":
149
+ return e.v;
150
+ case "var":
151
+ if (e.name === "today") {
152
+ return localDateAt(cx.b.now);
153
+ }
154
+ if (e.name === "now")
155
+ return cx.b.now.length === 10 ? `${cx.b.now}T00:00:00.000Z` : cx.b.now;
156
+ return lookup(cx, e.name);
157
+ case "ref":
158
+ return { ref: e.kind, name: e.name };
159
+ case "read":
160
+ throw new Error(`Unlinked read of ${e.role}.${e.field}`);
161
+ case "attr": {
162
+ const of = evaluateIn(cx, e.of);
163
+ if (isUnknown(of))
164
+ return of;
165
+ if (typeof of !== "string")
166
+ return new Unknown(`${e.meta.path}: not a reference`);
167
+ const f = cx.b.fact(of, e.attr);
168
+ return f ? f.v : new Unknown(`no current fact ${e.attr} for ${of}`);
169
+ }
170
+ case "inst": {
171
+ const of = evaluateIn(cx, e.of);
172
+ if (isUnknown(of))
173
+ return of;
174
+ const inst = isInst(of) ? cx.k?.instances.get(of.inst) : undefined;
175
+ if (!inst || !cx.k)
176
+ return new Unknown(`${e.field}: no such instance`);
177
+ if (e.field === "attached") {
178
+ cx.reads?.add({ kind: "members", instance: inst.id, value: inst.attached });
179
+ return inst.attached;
180
+ }
181
+ const input = inst.inputs.get(e.field);
182
+ if (input !== undefined) {
183
+ cx.reads?.add({ kind: "input", instance: inst.id, name: e.field, value: input });
184
+ return input;
185
+ }
186
+ const value = cx.statusRead ? cx.statusRead(inst, e.field) : cx.k.status(inst, e.field);
187
+ if (!cx.statusRead)
188
+ cx.reads?.add({ kind: "status", instance: inst.id, name: e.field, value });
189
+ return value;
190
+ }
191
+ case "if": {
192
+ const test = evaluateIn(cx, e.test);
193
+ cx.trace?.steps.push({
194
+ at: e.at,
195
+ value: test,
196
+ branch: isUnknown(test) ? "Unknown" : test === true ? "true" : "false",
197
+ });
198
+ if (isUnknown(test))
199
+ return test;
200
+ return evaluateIn(cx, test === true ? e.then : e.else);
201
+ }
202
+ case "fn":
203
+ return { params: e.params, body: e.body, env: cx.env };
204
+ case "list":
205
+ return evaluateList(cx, e.items, (x) => evaluateIn(cx, x));
206
+ case "call":
207
+ return call(cx, e);
208
+ }
209
+ };
210
+ export const apply = (cx, fn, args) => {
211
+ if (!fn || typeof fn !== "object" || !("body" in fn))
212
+ throw new Error("Not a function");
213
+ const env = vars(fn.params.map((p, i) => [p, args[i] ?? null]), fn.env);
214
+ return evaluateIn({ ...cx, env }, fn.body);
215
+ };
216
+ export const timeOf = (v) => isUnknown(v)
217
+ ? v
218
+ : typeof v === "string" && isLocalDate(v)
219
+ ? v
220
+ : (normalizeInstant(v) ?? new Unknown("Invalid date or instant"));
221
+ export const dateOf = (v) => isUnknown(v) ? v : typeof v === "string" ? v : new Unknown("not a date");
222
+ export const call = (cx, e) => {
223
+ if (e.derive) {
224
+ const d = cx.p.derives.get(e.fn);
225
+ const args = e.args.map((a) => evaluateIn(cx, a));
226
+ const env = vars(d.params.map((p, i) => [p.name, args[i] ?? null]));
227
+ const value = evaluateIn({ ...cx, env }, d.body);
228
+ cx.trace?.steps.push({ at: e.at, value });
229
+ return value;
230
+ }
231
+ const ev = (i) => evaluateIn(cx, e.args[i]);
232
+ switch (e.fn) {
233
+ case "table": {
234
+ const selector = ev(0);
235
+ if (isUnknown(selector))
236
+ return selector;
237
+ for (let i = 1; i < e.args.length; i += 2) {
238
+ const key = e.args[i];
239
+ if (key?.k === "kw" && (key.v === "else" || key.v === selector))
240
+ return ev(i + 1);
241
+ }
242
+ return new Unknown(`No table row for ${String(selector)}`);
243
+ }
244
+ case "=":
245
+ case "not=": {
246
+ const [a, b] = [ev(0), ev(1)];
247
+ if (isUnknown(a))
248
+ return a;
249
+ if (isUnknown(b))
250
+ return b;
251
+ const clock = (arg) => arg?.k === "var" && ["today", "now"].includes(arg.name);
252
+ for (const at of clockCutoffs(e.fn, clock(e.args[0]), clock(e.args[1]), a, b, e.args.some((arg) => arg.k === "var" && arg.name === "now") ? "instant" : "date"))
253
+ cx.temporal?.add(at);
254
+ const point = (value) => typeof value === "string" && (isLocalDate(value) || isInstant(value));
255
+ return ((point(a) && point(b)
256
+ ? timeOrder(a, b) === 0
257
+ : String(a) === String(b)) ===
258
+ (e.fn === "="));
259
+ }
260
+ case "<":
261
+ case "<=":
262
+ case ">":
263
+ case ">=": {
264
+ const [a, b] = [ev(0), ev(1)];
265
+ if (isUnknown(a))
266
+ return a;
267
+ if (isUnknown(b))
268
+ return b;
269
+ const [x, y] = [Number(a), Number(b)];
270
+ return e.fn === "<" ? x < y : e.fn === "<=" ? x <= y : e.fn === ">" ? x > y : x >= y;
271
+ }
272
+ case "in?": {
273
+ const [a, list] = [ev(0), ev(1)];
274
+ if (isUnknown(a))
275
+ return a;
276
+ return Array.isArray(list) && list.some((x) => String(x) === String(a));
277
+ }
278
+ case "all?":
279
+ case "any?": {
280
+ // Evaluate every branch: later branches still contribute reads and time cutoffs.
281
+ const values = ev(0);
282
+ const ts = values.map(truth);
283
+ const result = e.fn === "all?" ? and(ts) : or(ts);
284
+ if (cx.trace) {
285
+ const witnesses = cx.trace.listWitnesses?.get(values);
286
+ const branch = (i) => {
287
+ const value = values[i];
288
+ return (witnesses?.[i] ?? {
289
+ evidence: null,
290
+ via: "",
291
+ detail: isUnknown(value) ? `Unknown: ${value.why}` : String(ts[i]),
292
+ });
293
+ };
294
+ const deciding = ts.indexOf(e.fn === "all?" ? false : true);
295
+ cx.trace.witness =
296
+ deciding >= 0
297
+ ? branch(deciding)
298
+ : values.length === 1
299
+ ? branch(0)
300
+ : {
301
+ evidence: null,
302
+ via: "",
303
+ detail: values.length
304
+ ? values.map((_, i) => branch(i).detail).join("; ")
305
+ : String(result),
306
+ };
307
+ }
308
+ return kleene(result);
309
+ }
310
+ case "negate": {
311
+ const t = truth(ev(0));
312
+ return t === "unknown" ? kleene(t) : !t;
313
+ }
314
+ case "true?":
315
+ return ev(0) === true;
316
+ case "false?":
317
+ return ev(0) === false;
318
+ case "unknown?":
319
+ return isUnknown(ev(0));
320
+ case "known?": {
321
+ const v = ev(0);
322
+ return !isUnknown(v) && v !== null;
323
+ }
324
+ case "earliest":
325
+ case "latest": {
326
+ const dates = ev(0).map(dateOf);
327
+ const unknown = dates.find(isUnknown);
328
+ if (unknown)
329
+ return unknown;
330
+ if (dates.length === 0)
331
+ return new Unknown(`${e.fn} of nothing`);
332
+ return dates.reduce((a, b) => e.fn === "earliest" ? (a < b ? a : b) : a > b ? a : b);
333
+ }
334
+ case "instant": {
335
+ const value = ev(0);
336
+ if (isUnknown(value))
337
+ return value;
338
+ return normalizeInstant(value) ?? new Unknown("Invalid explicitly zoned instant");
339
+ }
340
+ case "hours-after":
341
+ case "minutes-after": {
342
+ const value = ev(0), count = ev(1);
343
+ if (isUnknown(value))
344
+ return value;
345
+ if (isUnknown(count))
346
+ return count;
347
+ const point = normalizeInstant(value);
348
+ if (!point || typeof count !== "number" || !Number.isSafeInteger(count))
349
+ return new Unknown("Invalid instant or offset");
350
+ try {
351
+ return shiftTime(point, count, e.fn === "hours-after" ? "hours" : "minutes");
352
+ }
353
+ catch (error) {
354
+ if (!(error instanceof RangeError))
355
+ throw error;
356
+ return new Unknown("Instant offset is outside the supported calendar");
357
+ }
358
+ }
359
+ case "days":
360
+ case "months":
361
+ case "years":
362
+ case "hours":
363
+ case "minutes": {
364
+ const n = ev(0);
365
+ return isUnknown(n)
366
+ ? n
367
+ : typeof n === "number" && Number.isSafeInteger(n)
368
+ ? { n, unit: e.fn }
369
+ : new Unknown("Invalid duration count");
370
+ }
371
+ case "years-after":
372
+ case "months-after":
373
+ case "days-after":
374
+ case "days-before": {
375
+ const d = dateOf(ev(0));
376
+ const count = ev(1);
377
+ if (isUnknown(d))
378
+ return d;
379
+ if (isUnknown(count))
380
+ return count;
381
+ const n = Number(count);
382
+ if (!Number.isFinite(n))
383
+ return new Unknown("Invalid date offset");
384
+ if (e.fn === "years-after")
385
+ return addYears(d, n);
386
+ if (e.fn === "months-after")
387
+ return Number.isSafeInteger(n) ? addMonths(d, n) : new Unknown("Invalid date offset");
388
+ return addDays(d, e.fn === "days-after" ? n : -n);
389
+ }
390
+ case "business-days-after": {
391
+ const d = dateOf(ev(0));
392
+ const count = ev(1);
393
+ if (isUnknown(count))
394
+ return count;
395
+ const n = Number(count);
396
+ if (!Number.isFinite(n))
397
+ return new Unknown("Invalid business-day offset");
398
+ const ref = ev(3);
399
+ const calendar = cx.p.calendars.get(ref.name);
400
+ if (isUnknown(d))
401
+ return d;
402
+ const { date, skipped } = businessDaysAfter(d, n, calendar);
403
+ cx.trace?.steps.push({
404
+ at: e.at,
405
+ value: date,
406
+ note: `${n} business days after ${formatDate(d, false)} on ${calendar.id}@${calendar.version}${skipped.length ? `; skips ${skipped.map((s) => s.why).join(", ")}` : ""}`,
407
+ });
408
+ return date;
409
+ }
410
+ case "before?":
411
+ case "on-or-after?": {
412
+ const [a, b] = [timeOf(ev(0)), timeOf(ev(1))];
413
+ if (isUnknown(a))
414
+ return a;
415
+ if (isUnknown(b))
416
+ return b;
417
+ const clock = (arg) => arg?.k === "var" && ["today", "now"].includes(arg.name);
418
+ for (const at of clockCutoffs(e.fn, clock(e.args[0]), clock(e.args[1]), a, b, e.args.some((arg) => arg.k === "var" && arg.name === "now") ? "instant" : "date"))
419
+ cx.temporal?.add(at);
420
+ return e.fn === "before?" ? timeOrder(a, b) < 0 : timeOrder(a, b) >= 0;
421
+ }
422
+ case "asserted-at": {
423
+ const read = e.args[0];
424
+ if (read.k !== "attr")
425
+ return new Unknown("asserted-at needs a fact read");
426
+ const of = evaluateIn(cx, read.of);
427
+ if (isUnknown(of) || typeof of !== "string")
428
+ return new Unknown(`${read.meta.path}: unknown`);
429
+ const f = cx.b.fact(of, read.attr);
430
+ const value = f ? localDateAt(f.at) : new Unknown(`no current fact ${read.attr} for ${of}`);
431
+ cx.trace?.steps.push({ at: e.at, value });
432
+ return value;
433
+ }
434
+ case "spells": {
435
+ const items = ev(0);
436
+ const [start, end] = [ev(1), ev(2)];
437
+ const gap = ev(3);
438
+ const dated = items
439
+ .map((item) => ({ item, s: apply(cx, start, [item]), e: apply(cx, end, [item]) }))
440
+ .sort((x, y) => (String(x.s) < String(y.s) ? -1 : 1));
441
+ // Retain existing spell keys while resource hosts hold effects on uncertain membership.
442
+ if (cx.k && dated.some((x) => isUnknown(x.s) || x.s === null))
443
+ cx.k.uncertainMembership = true;
444
+ const spells = [];
445
+ // undefined: no spell yet; Unknown: the current spell is open-ended (still running).
446
+ let until;
447
+ for (const x of dated) {
448
+ const current = spells.at(-1);
449
+ const s = String(x.s);
450
+ if (current && (isUnknown(until) || s <= plus(until, gap))) {
451
+ current.push(x.item);
452
+ until =
453
+ isUnknown(until) || isUnknown(x.e)
454
+ ? new Unknown("open")
455
+ : String(x.e) > until
456
+ ? String(x.e)
457
+ : until;
458
+ }
459
+ else {
460
+ spells.push([x.item]);
461
+ until = isUnknown(x.e) || x.e === null ? new Unknown("open") : String(x.e);
462
+ }
463
+ }
464
+ return spells;
465
+ }
466
+ case "resource-generation":
467
+ return cx.inst
468
+ ? resourceGeneration(cx.p, cx.b, cx.inst)
469
+ : new Unknown("No resource occurrence");
470
+ case "entered-at": {
471
+ if (!cx.inst)
472
+ return new Unknown("No machine occurrence");
473
+ const m = ev(0), target = ev(1), scope = resourceMachineScope(cx.p, cx.b, cx.inst, m.machine);
474
+ const history = cx.b
475
+ .history(cx.inst.id, m.machine)
476
+ .filter((r) => !scope ||
477
+ ((r.generation ?? 1) === scope.generation &&
478
+ (r.account === undefined || r.account === scope.account)));
479
+ let entry;
480
+ for (let i = history.length - 1; i >= 0; i--) {
481
+ const record = history[i];
482
+ if (record.state === target)
483
+ entry = record.at;
484
+ else if (entry)
485
+ break;
486
+ }
487
+ return entry
488
+ ? localDateAt(entry)
489
+ : new Unknown(scope
490
+ ? "No observed entry for this state in the current generation"
491
+ : "No observed entry for this state");
492
+ }
493
+ case "attested-for": {
494
+ if (!cx.inst)
495
+ return new Unknown("No resource occurrence");
496
+ const m = ev(0), type = ev(1).name;
497
+ const { proofPeriod: _period, ...sourceContext } = cx;
498
+ return attested(sourceContext, type, resourceProofRecords(cx.p, cx.b, cx.inst, m.machine, type));
499
+ }
500
+ case "notice-delivered?":
501
+ case "notice-acknowledged?": {
502
+ const ref = ev(0), notice = cx.p.ir.notices?.find((n) => n.name === ref.name && n.of === cx.inst?.component);
503
+ if (!notice)
504
+ return new Unknown("No owned notice");
505
+ const recipient = evaluateIn(cx, notice.to);
506
+ if (typeof recipient !== "string" || !recipient || !cx.b.nsOf(recipient))
507
+ return new Unknown("Unknown notice recipient");
508
+ const copy = noticeCopiesFor(cx, ref.name)[0];
509
+ return !!(e.fn === "notice-delivered?" ? copy?.delivery : copy?.acknowledgment);
510
+ }
511
+ case "attested":
512
+ return attested(cx, ev(0).name);
513
+ case "valid":
514
+ return readValidity(cx, ev(0).name).value;
515
+ case "added-on": {
516
+ const target = ev(0);
517
+ const addition = typeof target === "string"
518
+ ? selectedAddition(cx, target, (date) => cx.temporal?.add(date))
519
+ : null;
520
+ return addition?.record.at ?? new Unknown("No standing addition for this item");
521
+ }
522
+ case "status-is?": {
523
+ const status = ev(0);
524
+ return (isUnknown(status) ? "Unknown" : status) === ev(1);
525
+ }
526
+ case "satisfied?": {
527
+ const s = ev(0);
528
+ if (isUnknown(s))
529
+ return s;
530
+ if (s === "Unknown")
531
+ return new Unknown("status Unknown");
532
+ return s === "Satisfied" || s === "Waived";
533
+ }
534
+ case "met?": {
535
+ // Satisfied, Waived or NotApplicable: "nothing is owed here".
536
+ const s = ev(0);
537
+ if (isUnknown(s))
538
+ return s;
539
+ if (s === "Unknown")
540
+ return new Unknown("status Unknown");
541
+ return s === "Satisfied" || s === "Waived" || s === "NotApplicable";
542
+ }
543
+ case "carried-over?": {
544
+ const arg = e.args[0];
545
+ if (arg.k !== "var" || !cx.inst)
546
+ return false;
547
+ const requirement = cx.p.components
548
+ .get(cx.inst.component)
549
+ .requirements.find((r) => r.name === arg.name);
550
+ const decision = selectedDecision(cx, arg.name, (date) => cx.temporal?.add(date));
551
+ return decision
552
+ ? decision.record.effect === "accept"
553
+ : !!requirement && legacyAcceptance(cx, requirement)?.decision === "accepted";
554
+ }
555
+ case "started?":
556
+ case "final?":
557
+ case "in-state?": {
558
+ const m = ev(0);
559
+ if (!cx.inst)
560
+ return false;
561
+ const state = machineState(cx.b, cx.inst.id, m.machine, resourceMachineScope(cx.p, cx.b, cx.inst, m.machine));
562
+ const protocol = machineProtocol(cx.p, cx.inst.component, m.machine);
563
+ if (protocol) {
564
+ const connector = [...cx.p.connectors.values()].find((c) => c.owns.includes(protocol.name));
565
+ if (connector && cx.trace)
566
+ cx.trace.awaits = `signal ${connector.name}/${protocol.signal}`;
567
+ }
568
+ if (cx.trace)
569
+ cx.trace.witness = {
570
+ evidence: null,
571
+ via: state ? "signal" : "",
572
+ detail: state
573
+ ? `${m.machine} is ${protocol?.states.find((s) => s.name === state)?.label ?? state}`
574
+ : `No ${m.machine} yet`,
575
+ };
576
+ if (e.fn === "started?")
577
+ return state !== null;
578
+ if (!state)
579
+ return false;
580
+ if (e.fn === "final?")
581
+ return protocol?.final.includes(state) ?? false;
582
+ return ev(1).some((s) => s === state);
583
+ }
584
+ case "decided": {
585
+ const ref = ev(0), definition = cx.p.ir.decisions?.find((d) => d.name === ref.name && d.of === cx.inst?.component);
586
+ if (!definition)
587
+ return false;
588
+ if (definition.approvals && !validApprovalCount(decisionApprovalCount(cx, definition)))
589
+ return new Unknown("Decision approval count is unknown or not a positive integer");
590
+ const selected = selectedDecision(cx, definition.applies, (date) => cx.temporal?.add(date));
591
+ const approved = selected?.definition.name === definition.name &&
592
+ (selected.definition.effect === "approve" || selected.definition.effect === "accept");
593
+ if (cx.trace && selected)
594
+ cx.trace.witness = {
595
+ evidence: null,
596
+ via: `decision:${selected.record.id}`,
597
+ detail: `Decision ${selected.record.id} by ${selected.record.by}: ${selected.definition.effect}`,
598
+ };
599
+ return approved;
600
+ }
601
+ case "members":
602
+ return ev(0);
603
+ case "map":
604
+ return evaluateList(cx, ev(1), (x) => apply(cx, ev(0), [x]));
605
+ case "filter":
606
+ return ev(1).filter((x) => apply(cx, ev(0), [x]) === true);
607
+ case "count":
608
+ return ev(0).length;
609
+ }
610
+ throw new Error(`Unknown function ${e.fn}`);
611
+ };
612
+ /** Attested evidence of a type: for the requirement being evaluated, or anywhere in the instance. */
613
+ export const attested = (cx, type, pinned) => {
614
+ const evidence = cx.p.evidence.get(type);
615
+ const label = evidence?.label ?? type;
616
+ const records = pinned ??
617
+ (cx.occurrence
618
+ ? cx.b.evidence(cx.occurrence).filter((e) => e.type === type)
619
+ : cx.inst
620
+ ? cx.b.evidenceOf(cx.inst.id).filter((e) => e.type === type)
621
+ : []);
622
+ const signed = records
623
+ .filter((r) => r.status === "attested" &&
624
+ !evidenceSuperseded(cx.b, r) &&
625
+ signatureValid(r) &&
626
+ withinProofPeriod(cx, r.at) &&
627
+ signedFilesAllowed(cx, type, r.values))
628
+ .at(-1);
629
+ if (signed) {
630
+ if (cx.trace)
631
+ cx.trace.witness = {
632
+ evidence: signed,
633
+ via: "evidence",
634
+ type,
635
+ detail: `${label} attested by ${signed.by} on ${formatDate(signed.at, false)}`,
636
+ };
637
+ return true;
638
+ }
639
+ const unsigned = records.find((r) => r.status === "submitted");
640
+ if (cx.trace)
641
+ cx.trace.witness = {
642
+ evidence: unsigned ?? null,
643
+ via: "",
644
+ type,
645
+ detail: unsigned
646
+ ? `${label} was submitted on ${formatDate(unsigned.at, false)} but not attested. A completed task is not proof.`
647
+ : `No attested ${label}`,
648
+ };
649
+ return false;
650
+ };
651
+ export const machineProtocol = (p, component, machine) => {
652
+ const use = p.components.get(component)?.machines.find((m) => m.name === machine);
653
+ return use ? p.machines.get(use.protocol) : undefined;
654
+ };
655
+ /** A machine's current state: the last accepted signal, or null before it starts. */
656
+ export const machineState = (b, instance, machine, scope) => (scope
657
+ ? b
658
+ .history(instance, machine)
659
+ .filter((r) => (r.generation ?? 1) === scope.generation &&
660
+ (r.account === undefined || r.account === scope.account))
661
+ : b.history(instance, machine)).at(-1)?.state ?? null;
662
+ /** May a signal move this machine to `state`? Only along declared transitions. */
663
+ export const canTransition = (p, b, instance, machine, state) => {
664
+ const protocol = machineProtocol(p, instance.component, machine);
665
+ if (!protocol)
666
+ return false;
667
+ const current = machineState(b, instance.id, machine, resourceMachineScope(p, b, instance, machine));
668
+ return current === null
669
+ ? state === protocol.initial
670
+ : protocol.transitions.some((t) => t.from === current && t.to === state);
671
+ };
672
+ /** The evaluation context of one reconciled instance, for writes outside reconcile. */
673
+ export const instanceContext = (recon, b, inst, reads) => {
674
+ const p = recon.programs.find((x) => x.account.name === inst.account);
675
+ const component = p.components.get(inst.component);
676
+ // Settled results: a name is a requirement or an output (self.<output>).
677
+ const settled = (id, name) => {
678
+ const result = recon.results.get(id);
679
+ return (result?.requirements.find((r) => r.name === name)?.status ??
680
+ result?.outputs.find((o) => o.name === name)?.status ??
681
+ "Unknown");
682
+ };
683
+ return {
684
+ p,
685
+ b,
686
+ inst,
687
+ ...(reads ? { reads } : {}),
688
+ env: instanceEnv(p, inst, (name) => settled(inst.id, name), reads),
689
+ k: {
690
+ instances: recon.instances,
691
+ status: (i, name) => settled(i.id, name),
692
+ },
693
+ };
694
+ };
695
+ /** Evaluate an expression in a reconciled instance's scope. */
696
+ export const evaluateFor = (recon, b, now, instance, e, occurrence) => {
697
+ assertSnapshot(b, now);
698
+ const inst = recon.instances.get(instance);
699
+ if (!inst)
700
+ return new Unknown(`no instance ${instance}`);
701
+ return evaluateIn({ ...instanceContext(recon, b, inst), ...(occurrence === undefined ? {} : { occurrence }) }, e);
702
+ };
703
+ /** Evaluate an expression over plain values (a draft's fields), with no facts. */
704
+ export const evaluateValues = (p, values, now, e) => evaluateIn({ p, b: emptyBasis(now), inst: undefined, env: vars(Object.entries(values)) }, e);