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,225 @@
1
+ import { resolve } from "node:path";
2
+ import { basis, createScenarioRunner, link, proofOf, reconcileSubject, timeOrder, Unknown, workItems, } from "./_internal/reconciler/index.js";
3
+ import { citationView, projectRequirements } from "./manual/projections.js";
4
+ import { loadProject } from "./project.js";
5
+ import { readSnapshot } from "./snapshot.js";
6
+ const plain = (value) => {
7
+ if (value instanceof Unknown)
8
+ return { unknown: value.why };
9
+ if (Array.isArray(value))
10
+ return value.map(plain);
11
+ if (value instanceof Map)
12
+ return Object.fromEntries([...value].map(([k, v]) => [k, plain(v)]));
13
+ if (value && typeof value === "object")
14
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, plain(v)]));
15
+ return value;
16
+ };
17
+ const usage = (code, message, help) => ({
18
+ code,
19
+ severity: "error",
20
+ message,
21
+ at: null,
22
+ help,
23
+ fix: null,
24
+ });
25
+ /** Shapes one reconciliation into located answers: why each status, due date and work item. */
26
+ export const explainReconciliation = (ir, files, recon, subject) => {
27
+ const views = new Map(projectRequirements(ir, files).map((v) => [v.id, v]));
28
+ const release = new Map(recon.programs.map((p) => [p.account.name, p.release]));
29
+ const selected = new Set([...recon.instances.values()]
30
+ .filter((i) => subject === null || i.attached.includes(subject) || i.id === subject)
31
+ .map((i) => i.id));
32
+ const instances = [...recon.results]
33
+ .filter(([id]) => selected.has(id))
34
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
35
+ .map(([id, result]) => {
36
+ const inst = recon.instances.get(id);
37
+ return {
38
+ instance: id,
39
+ component: inst.component,
40
+ account: inst.account,
41
+ attached: [...inst.attached].sort(),
42
+ wakeAt: result.wakeAt,
43
+ wakeReason: result.wakeReason,
44
+ requirements: result.requirements.map((q) => {
45
+ const view = views.get(`${inst.component}/${q.name}`), definition = ir.components
46
+ .find((c) => c.name === inst.component)
47
+ ?.requirements.find((r) => r.name === q.name);
48
+ return {
49
+ name: q.name,
50
+ label: q.label,
51
+ occurrence: q.occurrence,
52
+ status: q.status,
53
+ due: q.due,
54
+ dueUnknown: q.dueUnknown,
55
+ dueSteps: q.dueSteps.map((s) => ({
56
+ at: s.at,
57
+ value: plain(s.value),
58
+ branch: s.branch ?? null,
59
+ note: s.note ?? null,
60
+ })),
61
+ remindAt: q.remindAt,
62
+ reasons: q.reasons.map((r) => ({
63
+ label: r.label,
64
+ outcome: r.outcome,
65
+ detail: r.detail,
66
+ at: r.at ?? null,
67
+ })),
68
+ evidence: q.evidence
69
+ ? {
70
+ values: q.evidence.values,
71
+ id: q.evidence.id,
72
+ type: q.evidence.type,
73
+ status: q.evidence.status,
74
+ by: q.evidence.by,
75
+ at: q.evidence.at,
76
+ }
77
+ : null,
78
+ via: q.via,
79
+ awaits: q.awaits,
80
+ blocked: result.blocked.find((b) => b.requirement === q.name)?.reason ?? null,
81
+ proof: proofOf(release.get(inst.account) ?? "", recon.now, q),
82
+ rule: {
83
+ at: q.at,
84
+ prose: (view?.rows ?? []).map((r) => ({ label: r.label, text: r.description.text })),
85
+ cites: (definition?.cites ?? []).map((c) => {
86
+ const view = citationView(ir, c);
87
+ return { source: c.source, clause: view.clause, title: view.title, at: c.at };
88
+ }),
89
+ },
90
+ };
91
+ }),
92
+ };
93
+ });
94
+ const work = workItems(recon)
95
+ .filter((w) => w.members.some((m) => selected.has(m.instance)))
96
+ .map((w) => ({
97
+ key: w.key,
98
+ state: w.state,
99
+ assignee: w.assignee,
100
+ members: w.members.map((m) => ({
101
+ instance: m.instance,
102
+ action: m.action,
103
+ occurrences: m.occurrences,
104
+ })),
105
+ reason: w.reason ?? null,
106
+ }))
107
+ .sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
108
+ return { instances, work };
109
+ };
110
+ export const explainDirectory = async (directory, options) => {
111
+ const project = await loadProject(directory);
112
+ const base = {
113
+ format: "worldvm/explain@1",
114
+ command: "explain",
115
+ directory: project.directory,
116
+ subject: options.subject ?? null,
117
+ requestedAt: options.at ?? null,
118
+ };
119
+ const fail = (diagnostics) => ({
120
+ ...base,
121
+ ok: false,
122
+ source: null,
123
+ now: null,
124
+ releases: [],
125
+ instances: [],
126
+ work: [],
127
+ diagnostics: [...project.diagnostics, ...diagnostics],
128
+ });
129
+ const ir = project.ir;
130
+ if (!ir || project.diagnostics.some((d) => d.severity === "error"))
131
+ return fail([]);
132
+ if ((options.scenario === undefined) === (options.world === undefined))
133
+ return fail([
134
+ usage("E_EXPLAIN_SOURCE", "Explain needs exactly one of --scenario or --world.", "Pass --scenario name to explain an authored instant, or --world snapshot.json --subject id --at instant for a live subject."),
135
+ ]);
136
+ if (options.scenario !== undefined) {
137
+ const scenario = ir.scenarios?.find((s) => s.name === options.scenario);
138
+ if (!scenario)
139
+ return fail([
140
+ usage("E_EXPLAIN_SCENARIO", `Unknown scenario ${options.scenario}.`, `Pass one of: ${(ir.scenarios ?? []).map((s) => s.name).join(", ") || "(no scenarios declared)"}.`),
141
+ ]);
142
+ const result = createScenarioRunner(ir)(scenario);
143
+ const steps = result.steps;
144
+ let index = steps.length - 1;
145
+ if (options.at !== undefined) {
146
+ const at = options.at;
147
+ index = -1;
148
+ try {
149
+ steps.forEach((s, i) => {
150
+ if (timeOrder(s.date, at) <= 0)
151
+ index = i;
152
+ });
153
+ }
154
+ catch (cause) {
155
+ return fail([
156
+ usage("E_EXPLAIN_AT", String(cause), "Pass --at as YYYY-MM-DD or YYYY-MM-DDTHH:MM."),
157
+ ]);
158
+ }
159
+ if (index < 0)
160
+ return fail([
161
+ usage("E_EXPLAIN_AT", `Scenario ${scenario.name} has no step at or before ${at}.`, `Its steps are at ${steps.map((s) => s.date).join(", ") || "(none; the scenario failed to run)"}.`),
162
+ ]);
163
+ }
164
+ const step = steps[index];
165
+ if (!step)
166
+ return fail(result.failures.map((f) => ({
167
+ code: f.code,
168
+ severity: "error",
169
+ message: f.message,
170
+ at: f.at,
171
+ help: "Run worldvm test --scenario to see why this scenario cannot be replayed.",
172
+ fix: null,
173
+ })));
174
+ const explained = explainReconciliation(ir, project.files, step.reconciliation, options.subject ?? null);
175
+ return {
176
+ ...base,
177
+ ok: true,
178
+ source: { kind: "scenario", name: scenario.name, step: index },
179
+ now: step.reconciliation.now,
180
+ releases: step.reconciliation.releases,
181
+ ...explained,
182
+ diagnostics: project.diagnostics,
183
+ };
184
+ }
185
+ const path = resolve(options.world);
186
+ if (options.subject === undefined || options.at === undefined)
187
+ return fail([
188
+ usage("E_EXPLAIN_SUBJECT", "A snapshot explanation needs --subject and --at.", "Name the subject's entity id and the instant to evaluate; the CLI never reads the clock."),
189
+ ]);
190
+ const read = await readSnapshot(path, [ir], "E_EXPLAIN_SNAPSHOT");
191
+ if ("diagnostic" in read)
192
+ return fail([read.diagnostic]);
193
+ const snapshot = read.snapshot;
194
+ // Each account's program evaluates the subject's home; occurrence ids are account-qualified.
195
+ const parts = [];
196
+ try {
197
+ const b = basis(snapshot.world, options.at);
198
+ for (const account of snapshot.accounts)
199
+ parts.push(reconcileSubject(link(ir, account), b, options.subject, options.at));
200
+ }
201
+ catch (cause) {
202
+ return fail([
203
+ usage("E_EXPLAIN_AT", String(cause), "Pass --at as YYYY-MM-DD or YYYY-MM-DDTHH:MM and a snapshot recorded by this world."),
204
+ ]);
205
+ }
206
+ const recon = {
207
+ ...parts[0],
208
+ releases: parts.flatMap((p) => p.releases),
209
+ roots: parts.flatMap((p) => p.roots),
210
+ instances: new Map(parts.flatMap((p) => [...p.instances])),
211
+ results: new Map(parts.flatMap((p) => [...p.results])),
212
+ blockedTotal: parts.reduce((n, p) => n + p.blockedTotal, 0),
213
+ programs: parts.flatMap((p) => p.programs),
214
+ };
215
+ return {
216
+ ...base,
217
+ ok: true,
218
+ source: { kind: "snapshot", path, accounts: snapshot.accounts },
219
+ now: recon.now,
220
+ releases: recon.releases,
221
+ // reconcileSubject already scopes results to the subject's home.
222
+ ...explainReconciliation(ir, project.files, recon, null),
223
+ diagnostics: project.diagnostics,
224
+ };
225
+ };
@@ -0,0 +1,4 @@
1
+ import { type Diagnostic, type SourceFile } from "./_internal/forma/world/index.js";
2
+ import type { Fix } from "./project.js";
3
+ /** Mechanical fixes for the authoring diagnostics that have exactly one sensible repair. */
4
+ export declare const authoringFix: (d: Diagnostic, files: readonly SourceFile[]) => Fix | null;
package/dist/fixes.js ADDED
@@ -0,0 +1,70 @@
1
+ import { suggestForm } from "./_internal/forma/world/index.js";
2
+ const closers = { "(": ")", "[": "]", "{": "}" };
3
+ /** A minimal reader for one condition: enough to rewrite operator heads, never to evaluate. */
4
+ const read = (text) => {
5
+ const tokens = text.match(/"(?:\\.|[^"\\])*"|[()[\]{}]|[^\s()[\]{}"]+/g) ?? [];
6
+ let i = 0;
7
+ const node = () => {
8
+ const token = tokens[i++];
9
+ if (token === undefined || /^[)\]}]$/.test(token))
10
+ return undefined;
11
+ if (!closers[token])
12
+ return token;
13
+ const items = [];
14
+ while (tokens[i] !== closers[token]) {
15
+ if (i >= tokens.length)
16
+ return undefined;
17
+ const child = node();
18
+ if (child === undefined)
19
+ return undefined;
20
+ items.push(child);
21
+ }
22
+ i++;
23
+ return { open: token, close: closers[token], items };
24
+ };
25
+ const result = node();
26
+ return i === tokens.length ? result : undefined;
27
+ };
28
+ const print = (n) => typeof n === "string" ? n : `${n.open}${n.items.map(print).join(" ")}${n.close}`;
29
+ const list = (...items) => ({ open: "(", close: ")", items });
30
+ /** Rewrite Bool-only operators to their Truth spellings; the result keeps the author's meaning. */
31
+ const truthy = (n) => {
32
+ if (typeof n === "string" || n.open !== "(")
33
+ return n;
34
+ const [head, ...args] = n.items.map(truthy);
35
+ if ((head === "=" || head === "!=") && args.length === 2) {
36
+ const literal = args.findIndex((a) => a === "true" || a === "false");
37
+ if (literal >= 0 && typeof args[1 - literal] !== "undefined") {
38
+ const other = args[1 - literal];
39
+ return (head === "=") === (args[literal] === "true") ? other : list("not", other);
40
+ }
41
+ }
42
+ return head === undefined ? n : { ...n, items: [head, ...args] };
43
+ };
44
+ const located = (d, files) => d.at ? files.find((f) => f.id === d.at.src)?.text.slice(d.at.from, d.at.to) : undefined;
45
+ /** Mechanical fixes for the authoring diagnostics that have exactly one sensible repair. */
46
+ export const authoringFix = (d, files) => {
47
+ const text = located(d, files);
48
+ if (!d.at || text === undefined)
49
+ return null;
50
+ const { src, from, to } = d.at;
51
+ if (d.code === "E_ELABORATE_HOLE_TYPE" &&
52
+ /\bTruth\b/.test(d.message) &&
53
+ /\bBool\b/.test(d.message)) {
54
+ const tree = read(text);
55
+ if (!tree)
56
+ return null;
57
+ const rewritten = print(truthy(tree));
58
+ return rewritten === print(tree) ? null : { src, from, to, text: rewritten, expected: text };
59
+ }
60
+ if (d.code === "E_ELABORATE_UNKNOWN_FORM") {
61
+ const name = /Unknown form '([^']+)'/.exec(d.message)?.[1];
62
+ const suggestion = name && suggestForm(name);
63
+ if (!suggestion || !text.startsWith(`(${name}`))
64
+ return null;
65
+ return { src, from: from + 1, to: from + 1 + name.length, text: suggestion, expected: name };
66
+ }
67
+ if (d.code === "W_ATTESTED_EXPIRING" && text.startsWith("(attested"))
68
+ return { src, from: from + 1, to: from + 9, text: "valid", expected: "attested" };
69
+ return null;
70
+ };
package/dist/fmt.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ /** Same visible-source traversal policy as loadProject. Explicit files may be hidden. */
2
+ export declare const formaFiles: (input: string) => Promise<string[]>;
3
+ /** Prepare every result before writing anything; malformed source cannot cause partial formatting. */
4
+ export declare const formatPaths: (inputs: readonly string[], check?: boolean) => Promise<{
5
+ format: string;
6
+ ok: boolean;
7
+ files: {
8
+ path: string;
9
+ changed: boolean;
10
+ text: string;
11
+ }[];
12
+ }>;
package/dist/fmt.js ADDED
@@ -0,0 +1,39 @@
1
+ import { readdir, readFile, stat, writeFile } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { formatForma } from "./_internal/forma-tools/index.js";
4
+ /** Same visible-source traversal policy as loadProject. Explicit files may be hidden. */
5
+ export const formaFiles = async (input) => {
6
+ const path = resolve(input);
7
+ const info = await stat(path);
8
+ if (info.isFile()) {
9
+ if (!path.endsWith(".forma"))
10
+ throw new Error(`Expected a .forma file: ${path}`);
11
+ return [path];
12
+ }
13
+ if (!info.isDirectory())
14
+ throw new Error(`Expected a file or directory: ${path}`);
15
+ const entries = await readdir(path, { withFileTypes: true });
16
+ const nested = await Promise.all(entries
17
+ .filter((e) => !e.name.startsWith(".") &&
18
+ !["node_modules", "dist", "build", "coverage"].includes(e.name))
19
+ .map((e) => e.isDirectory() || (e.isFile() && e.name.endsWith(".forma"))
20
+ ? formaFiles(resolve(path, e.name))
21
+ : Promise.resolve([])));
22
+ return nested.flat().sort();
23
+ };
24
+ /** Prepare every result before writing anything; malformed source cannot cause partial formatting. */
25
+ export const formatPaths = async (inputs, check = false) => {
26
+ const paths = [...new Set((await Promise.all(inputs.map(formaFiles))).flat())].sort();
27
+ if (!paths.length)
28
+ throw new Error("No .forma source files found.");
29
+ const files = await Promise.all(paths.map(async (path) => {
30
+ const original = await readFile(path, "utf8");
31
+ const text = formatForma(original);
32
+ return { path, changed: text !== original, text };
33
+ }));
34
+ if (!check)
35
+ for (const file of files)
36
+ if (file.changed)
37
+ await writeFile(file.path, file.text);
38
+ return { format: "worldvm/fmt@1", ok: !check || files.every((f) => !f.changed), files };
39
+ };
@@ -0,0 +1,18 @@
1
+ import type { WorldTypes, TypedWorld } from "./types.js";
2
+ import type { SourceFile } from "../_internal/forma/world/index.js";
3
+ import type * as K from "../_internal/reconciler/index.js";
4
+ import { type HostOptions, type World } from "./world.js";
5
+ export interface OpenOptions extends Omit<HostOptions, "ir" | "files"> {
6
+ /** A directory of .forma sources. Omit source, files and ir to use the store’s deployed release. */
7
+ readonly source?: string;
8
+ /** In-memory sources, for hosts without a filesystem. */
9
+ readonly files?: readonly SourceFile[];
10
+ /** An already compiled release. */
11
+ readonly ir?: K.IR.WorldIR;
12
+ }
13
+ /**
14
+ * Open a world: compile (or accept) a release, attach a store, and return the handle that
15
+ * records facts, offers work and explains statuses. A source with errors is refused, with
16
+ * the same diagnostics `worldvm check` prints.
17
+ */
18
+ export declare function open<T extends WorldTypes = WorldTypes>(options: OpenOptions): Promise<WorldTypes extends T ? World : TypedWorld<T>>;
@@ -0,0 +1,28 @@
1
+ import { compileProject, loadProject } from "../project.js";
2
+ import { host, WorldError } from "./world.js";
3
+ export async function open(options) {
4
+ const { source, files, ir, ...rest } = options;
5
+ if ([source, files, ir].every((x) => x === undefined)) {
6
+ const store = options.store;
7
+ if (!store || !("deployed" in store) || typeof store.deployed !== "function")
8
+ throw new WorldError("E_OPEN", "Pass source, files or ir, or a store with a deployed release.");
9
+ const deployed = await store.deployed();
10
+ if (!deployed)
11
+ throw new WorldError("E_OPEN", "No deployed release. Run worldvm deploy first.");
12
+ if (options.account && options.account !== deployed.account)
13
+ throw new WorldError("E_ACCOUNT", `The deployed account is ${deployed.account}.`);
14
+ return host({ ...rest, ir: deployed.ir, account: deployed.account });
15
+ }
16
+ if ([source, files, ir].filter((x) => x !== undefined).length !== 1)
17
+ throw new WorldError("E_OPEN", "Pass exactly one of source, files or ir.");
18
+ if (ir)
19
+ return host({ ...rest, ir });
20
+ const project = source ? await loadProject(source) : compileProject("", files);
21
+ const errors = project.diagnostics.filter((d) => d.severity === "error");
22
+ if (!project.ir || errors.length)
23
+ throw new WorldError("E_CHECK", `The world has ${errors.length} error${errors.length === 1 ? "" : "s"}: ${errors
24
+ .slice(0, 3)
25
+ .map((d) => `${d.code} ${d.message}`)
26
+ .join("; ")}`, errors);
27
+ return host({ ...rest, ir: project.ir, files: project.files });
28
+ }
@@ -0,0 +1,12 @@
1
+ import { type ProtocolError, type Result, type Verb } from "../_internal/protocol/index.js";
2
+ import { type Actor, type World } from "./world.js";
3
+ export declare const failure: (code: ProtocolError["code"], message: string, details?: readonly string[]) => {
4
+ ok: false;
5
+ error: {
6
+ details?: readonly string[];
7
+ code: "invalid-request" | "unauthenticated" | "human-required" | "forbidden" | "not-found" | "command-duplicate" | "proposal-resolved" | "write-refused" | "internal";
8
+ message: string;
9
+ };
10
+ };
11
+ /** Transport-independent execution. The actor comes from the trusted host, never the body. */
12
+ export declare function operate<V extends Verb>(world: World, verb: V, input: unknown, identity: Actor): Promise<Result<V>>;
@@ -0,0 +1,96 @@
1
+ import { decodeActor, decodeRequest, errorCodes, mutations, } from "../_internal/protocol/index.js";
2
+ import { WorldError } from "./world.js";
3
+ export const failure = (code, message, details) => ({ ok: false, error: { code, message, ...(details ? { details } : {}) } });
4
+ /** Transport-independent execution. The actor comes from the trusted host, never the body. */
5
+ export async function operate(world, verb, input, identity) {
6
+ let by;
7
+ try {
8
+ by = decodeActor(typeof identity === "string"
9
+ ? { id: identity, kind: "human" }
10
+ : { ...identity, kind: identity.kind ?? "human" });
11
+ }
12
+ catch {
13
+ return failure("unauthenticated", "Supply a trusted actor with id and kind.");
14
+ }
15
+ let args;
16
+ try {
17
+ args = decodeRequest(verb, input);
18
+ }
19
+ catch (cause) {
20
+ return failure("invalid-request", String(cause));
21
+ }
22
+ if (by.kind === "agent" && mutations.includes(verb) && verb !== "propose")
23
+ return failure("human-required", "Agents propose; a human must authorize this write.");
24
+ try {
25
+ const run = async () => {
26
+ if (verb === "subjects")
27
+ return world.subjects(args.type);
28
+ if (verb === "changes")
29
+ return { revision: world.revision(), nextWake: world.nextWake() };
30
+ if (verb === "proposals") {
31
+ const a = args;
32
+ return world
33
+ .proposals()
34
+ .filter((p) => (!a.type || p.type === a.type) &&
35
+ (!a.subject || p.subject === a.subject) &&
36
+ (!a.state || p.state === a.state));
37
+ }
38
+ const a = args;
39
+ if (!mutations.includes(verb) && !world.canRead(by, a.type, a.subject))
40
+ throw new ReadDenied();
41
+ const subject = world.subject(a.type, a.subject);
42
+ switch (verb) {
43
+ case "facts":
44
+ return subject.facts(a.at);
45
+ case "status":
46
+ return subject.status(a.at);
47
+ case "work":
48
+ return subject.work(a.at);
49
+ case "operations":
50
+ return subject.operations(a.at);
51
+ case "explain":
52
+ return subject.explain(args.requirement, a.at);
53
+ case "assert": {
54
+ const { values, kind, id } = args;
55
+ return subject.assert(values, { by, id, ...(kind ? { kind } : {}) });
56
+ }
57
+ case "perform": {
58
+ const { operation, type: _t, subject: _s, ...options } = args;
59
+ return subject.perform(operation, { ...options, by });
60
+ }
61
+ case "signal": {
62
+ const { machine, state, id, instance } = args;
63
+ return subject.signal(machine, state, { by, id, ...(instance ? { instance } : {}) });
64
+ }
65
+ case "propose": {
66
+ const { draft, rationale, id } = args;
67
+ return subject.propose(draft, rationale, { by, id });
68
+ }
69
+ case "accept-proposal": {
70
+ const { proposal, id, signature } = args;
71
+ return subject.acceptProposal(proposal, { by, id, ...(signature ? { signature } : {}) });
72
+ }
73
+ case "reject-proposal": {
74
+ const { proposal, reason, id } = args;
75
+ return subject.rejectProposal(proposal, reason, { by, id });
76
+ }
77
+ }
78
+ };
79
+ const value = await run();
80
+ if (value && typeof value === "object" && "accepted" in value && !value.accepted) {
81
+ const codes = value.codes;
82
+ const code = codes.find((c) => errorCodes.includes(c)) ?? "write-refused";
83
+ return failure(code, codes.join(", "), codes);
84
+ }
85
+ return { ok: true, value };
86
+ }
87
+ catch (cause) {
88
+ if (cause instanceof ReadDenied)
89
+ return failure("forbidden", "Subject read denied.");
90
+ if (cause instanceof WorldError)
91
+ return failure("not-found", cause.message, [cause.code]);
92
+ return failure("internal", "World operation failed.");
93
+ }
94
+ }
95
+ class ReadDenied extends Error {
96
+ }
@@ -0,0 +1,31 @@
1
+ import type { World as Records } from "../_internal/reconciler/index.js";
2
+ import type { Proposal } from "../_internal/protocol/index.js";
3
+ import type { Outcome } from "./world.js";
4
+ /** The outcome kept for a command id, so a retry returns the first answer. */
5
+ export interface Receipt {
6
+ readonly digest: string;
7
+ readonly accepted: boolean;
8
+ readonly codes: readonly string[];
9
+ readonly outcome: Outcome;
10
+ }
11
+ /** Everything a host must keep for one account: its records, its release and its receipts. */
12
+ export interface StoreState {
13
+ /** The release these records were last written under. */
14
+ readonly release: string;
15
+ /** Count of committed writes; a reader can tell whether it has seen a change. */
16
+ readonly revision: number;
17
+ readonly records: Records;
18
+ readonly receipts: Readonly<Record<string, Receipt>>;
19
+ readonly proposals: Readonly<Record<string, Proposal>>;
20
+ }
21
+ /**
22
+ * A store keeps one account's state. `commit` must be atomic: after a crash, `load` returns
23
+ * either the state before the commit or the state after it, never a mixture.
24
+ */
25
+ export interface Store {
26
+ readonly load: () => StoreState | null | Promise<StoreState | null>;
27
+ readonly commit: (state: StoreState) => void | Promise<void>;
28
+ readonly close: () => void | Promise<void>;
29
+ }
30
+ /** Process-lifetime storage for tests and previews. Nothing survives the process. */
31
+ export declare const memory: (initial?: StoreState | null) => Store;
@@ -0,0 +1,11 @@
1
+ /** Process-lifetime storage for tests and previews. Nothing survives the process. */
2
+ export const memory = (initial = null) => {
3
+ let state = initial;
4
+ return {
5
+ load: () => state,
6
+ commit: (next) => {
7
+ state = next;
8
+ },
9
+ close: () => { },
10
+ };
11
+ };
@@ -0,0 +1,37 @@
1
+ import type { Outcome, PerformOptions, Subject, WorkItem, World, WriteOptions } from "./world.js";
2
+ /** Structural contract implemented by `worldvm codegen` output. */
3
+ export interface WorldTypes {
4
+ readonly entities: object;
5
+ readonly operations: object;
6
+ }
7
+ type Retractions<T> = {
8
+ readonly [F in keyof T]?: T[F] | null;
9
+ };
10
+ /** A work id carries its operation's input type without changing its string value. */
11
+ export type WorkId<O extends string> = string & {
12
+ readonly __worldvmOperation: O;
13
+ };
14
+ type TypedWork<T extends WorldTypes> = {
15
+ [O in keyof T["operations"] & string]: Omit<WorkItem, "id" | "operation" | "kind" | "proposal"> & {
16
+ readonly id: WorkId<O>;
17
+ readonly operation: O;
18
+ readonly kind: Exclude<WorkItem["kind"], "proposal">;
19
+ };
20
+ }[keyof T["operations"] & string] | (Omit<WorkItem, "kind" | "operation"> & {
21
+ readonly kind: "proposal";
22
+ readonly operation: "accept-proposal";
23
+ readonly proposal: string;
24
+ });
25
+ type Input<T> = Omit<PerformOptions, "values" | "reason"> & T;
26
+ export type TypedSubject<T extends WorldTypes, E extends keyof T["entities"]> = Omit<Subject, "assert" | "perform" | "work"> & {
27
+ readonly assert: (values: Retractions<T["entities"][E]>, options: WriteOptions & {
28
+ readonly kind?: string;
29
+ }) => Promise<Outcome>;
30
+ readonly perform: <O extends keyof T["operations"] & string>(operation: O | WorkId<O>, options: Input<T["operations"][O]>) => Promise<Outcome>;
31
+ readonly work: (at?: string) => readonly TypedWork<T>[];
32
+ };
33
+ export type TypedWorld<T extends WorldTypes> = Omit<World, "subject" | "subjects"> & {
34
+ readonly subject: <E extends keyof T["entities"] & string>(type: E, id: string) => TypedSubject<T, E>;
35
+ readonly subjects: (type: keyof T["entities"] & string) => readonly string[];
36
+ };
37
+ export {};
@@ -0,0 +1 @@
1
+ export {};