@astrale-os/sdk 0.6.0-beta.4 → 0.6.0-beta.40

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 (514) hide show
  1. package/README.md +191 -58
  2. package/dist/application/action/action.d.ts +6 -0
  3. package/dist/application/action/authoring.d.ts +1 -1
  4. package/dist/application/action/context.d.ts +47 -31
  5. package/dist/application/action/define.d.ts +3 -3
  6. package/dist/application/action/index.d.ts +1 -1
  7. package/dist/application/define.d.ts +8 -6
  8. package/dist/application/define.js +28 -14
  9. package/dist/application/dependency/index.d.ts +1 -1
  10. package/dist/application/dependency/invoker.d.ts +21 -10
  11. package/dist/application/domain.d.ts +30 -0
  12. package/dist/application/index.d.ts +4 -4
  13. package/dist/application/index.js +1 -1
  14. package/dist/application/integration/define.d.ts +8 -1
  15. package/dist/application/integration/index.d.ts +2 -2
  16. package/dist/application/integration/integration.d.ts +13 -1
  17. package/dist/application/integration/operation.d.ts +16 -3
  18. package/dist/application/mutation/authoring/properties.d.ts +5 -3
  19. package/dist/application/mutation/authoring/properties.js +35 -2
  20. package/dist/application/mutation/authoring/transition.js +4 -1
  21. package/dist/application/mutation/execution/execute.js +1 -1
  22. package/dist/application/mutation/failure.d.ts +6 -0
  23. package/dist/application/mutation/failure.js +24 -18
  24. package/dist/application/mutation/index.d.ts +1 -1
  25. package/dist/application/query/collection/union.js +11 -4
  26. package/dist/application/query/composite/plan.d.ts +0 -4
  27. package/dist/application/query/composite/plan.js +0 -2
  28. package/dist/application/query/conformance.d.ts +15 -0
  29. package/dist/application/query/conformance.js +46 -0
  30. package/dist/application/query/define.js +4 -3
  31. package/dist/application/query/execution/execute.d.ts +0 -1
  32. package/dist/application/query/execution/execute.js +7 -1
  33. package/dist/application/query/failure.d.ts +8 -0
  34. package/dist/application/query/failure.js +8 -0
  35. package/dist/application/query/index.d.ts +1 -1
  36. package/dist/application/query/index.js +1 -1
  37. package/dist/application/routes/admission.d.ts +2 -2
  38. package/dist/application/routes/admission.js +1 -1
  39. package/dist/application/routes/route.d.ts +2 -2
  40. package/dist/application/runtime/actions.js +3 -0
  41. package/dist/application/runtime/workflows.d.ts +3 -1
  42. package/dist/application/runtime/workflows.js +3 -4
  43. package/dist/application/view/define.js +4 -6
  44. package/dist/application/view/frontend.d.ts +2 -2
  45. package/dist/application/view/index.d.ts +1 -1
  46. package/dist/application/view/route.d.ts +0 -14
  47. package/dist/application/view/route.js +1 -64
  48. package/dist/application/workflow/authoring.d.ts +3 -2
  49. package/dist/application/workflow/context.d.ts +8 -2
  50. package/dist/application/workflow/define.d.ts +4 -4
  51. package/dist/application/workflow/define.js +14 -9
  52. package/dist/application/workflow/durable.d.ts +185 -0
  53. package/dist/application/workflow/index.d.ts +3 -2
  54. package/dist/application/workflow/runner/inline.js +3 -4
  55. package/dist/application/workflow/runner/runner.d.ts +2 -2
  56. package/dist/application/workflow/step/output.d.ts +2 -0
  57. package/dist/application/workflow/step/output.js +73 -0
  58. package/dist/application/workflow/workflow.d.ts +5 -3
  59. package/dist/deployment/adapter/adapter.d.ts +55 -13
  60. package/dist/deployment/adapter/bundle/bundle.d.ts +36 -0
  61. package/dist/deployment/adapter/bundle/file.d.ts +10 -0
  62. package/dist/deployment/adapter/bundle/index.d.ts +2 -0
  63. package/dist/deployment/adapter/define.d.ts +4 -3
  64. package/dist/deployment/adapter/define.js +107 -23
  65. package/dist/deployment/adapter/index.d.ts +4 -3
  66. package/dist/deployment/adapter/index.js +1 -0
  67. package/dist/deployment/adapter/release/command.d.ts +33 -0
  68. package/dist/deployment/adapter/release/context.d.ts +94 -0
  69. package/dist/deployment/adapter/release/index.d.ts +4 -0
  70. package/dist/deployment/adapter/release/index.js +1 -0
  71. package/dist/deployment/adapter/release/list.d.ts +53 -0
  72. package/dist/deployment/adapter/release/list.js +1 -0
  73. package/dist/deployment/adapter/release/refusal.d.ts +10 -0
  74. package/dist/deployment/adapter/release/refusal.js +14 -0
  75. package/dist/deployment/adapter/release/result.d.ts +56 -0
  76. package/dist/deployment/adapter/release/result.js +1 -0
  77. package/dist/deployment/address/configuration.d.ts +96 -0
  78. package/dist/deployment/address/configuration.js +274 -0
  79. package/dist/deployment/address/fingerprint.d.ts +5 -0
  80. package/dist/deployment/address/fingerprint.js +27 -0
  81. package/dist/deployment/address/index.d.ts +5 -0
  82. package/dist/deployment/address/index.js +4 -0
  83. package/dist/deployment/address/label.d.ts +42 -0
  84. package/dist/deployment/address/label.js +80 -0
  85. package/dist/deployment/address/line.d.ts +29 -0
  86. package/dist/deployment/address/line.js +53 -0
  87. package/dist/deployment/address/record.d.ts +73 -0
  88. package/dist/deployment/address/record.js +138 -0
  89. package/dist/deployment/address/summary.d.ts +30 -0
  90. package/dist/deployment/address/summary.js +1 -0
  91. package/dist/deployment/address/vectors.d.ts +60 -0
  92. package/dist/deployment/address/vectors.js +517 -0
  93. package/dist/deployment/authoring.d.ts +0 -2
  94. package/dist/deployment/authoring.js +0 -1
  95. package/dist/deployment/build/build.d.ts +8 -2
  96. package/dist/deployment/build/compile.d.ts +4 -4
  97. package/dist/deployment/build/compile.js +19 -17
  98. package/dist/deployment/build/frontend/compilation.d.ts +2 -4
  99. package/dist/deployment/build/frontend/compilation.js +0 -5
  100. package/dist/deployment/build/frontend/digest.js +1 -5
  101. package/dist/deployment/build/index.d.ts +1 -0
  102. package/dist/deployment/build/index.js +1 -0
  103. package/dist/deployment/build/manifest.d.ts +59 -0
  104. package/dist/deployment/build/manifest.js +118 -0
  105. package/dist/deployment/build/material.d.ts +2 -2
  106. package/dist/deployment/build/material.js +28 -13
  107. package/dist/deployment/build/schema.d.ts +2 -2
  108. package/dist/deployment/deployment.d.ts +3 -2
  109. package/dist/deployment/environment.d.ts +6 -0
  110. package/dist/deployment/environment.js +6 -0
  111. package/dist/deployment/index.d.ts +4 -6
  112. package/dist/deployment/index.js +1 -2
  113. package/dist/deployment/release/addressing.d.ts +6 -5
  114. package/dist/deployment/release/addressing.js +2 -3
  115. package/dist/deployment/release/assemble.d.ts +6 -3
  116. package/dist/deployment/release/assemble.js +12 -10
  117. package/dist/deployment/release/release.d.ts +16 -5
  118. package/dist/deployment/release/seal.d.ts +14 -0
  119. package/dist/deployment/release/seal.js +22 -0
  120. package/dist/deployment/release/{publication → served}/callables.d.ts +2 -2
  121. package/dist/deployment/release/{publication → served}/callables.js +2 -2
  122. package/dist/deployment/release/served/index.d.ts +11 -0
  123. package/dist/deployment/release/served/index.js +26 -0
  124. package/dist/deployment/release/{publication → served}/views.d.ts +2 -2
  125. package/dist/deployment/release/{publication → served}/views.js +0 -1
  126. package/dist/deployment/runtime/admission.d.ts +2 -2
  127. package/dist/deployment/runtime/admission.js +5 -5
  128. package/dist/deployment/verify/index.d.ts +3 -4
  129. package/dist/deployment/verify/index.js +2 -3
  130. package/dist/deployment/verify/preflight/bundle.d.ts +18 -0
  131. package/dist/deployment/verify/preflight/bundle.js +71 -0
  132. package/dist/deployment/verify/preflight/index.d.ts +1 -12
  133. package/dist/deployment/verify/preflight/index.js +1 -12
  134. package/dist/deployment/verify/readiness/fetch.d.ts +13 -0
  135. package/dist/deployment/verify/readiness/fetch.js +26 -0
  136. package/dist/deployment/verify/readiness/identity.d.ts +3 -6
  137. package/dist/deployment/verify/readiness/identity.js +3 -3
  138. package/dist/deployment/verify/readiness/index.d.ts +15 -8
  139. package/dist/deployment/verify/readiness/index.js +25 -6
  140. package/dist/deployment/verify/readiness/release.d.ts +8 -0
  141. package/dist/deployment/verify/readiness/release.js +22 -0
  142. package/dist/deployment/worker/address.d.ts +26 -0
  143. package/dist/deployment/worker/address.js +43 -0
  144. package/dist/deployment/worker/build.d.ts +60 -0
  145. package/dist/deployment/worker/build.js +172 -0
  146. package/dist/deployment/worker/configuration.d.ts +73 -0
  147. package/dist/deployment/worker/configuration.js +165 -0
  148. package/dist/deployment/worker/content.d.ts +38 -0
  149. package/dist/deployment/worker/content.js +169 -0
  150. package/dist/deployment/worker/index.d.ts +29 -0
  151. package/dist/deployment/worker/index.js +29 -0
  152. package/dist/deployment/worker/limits.d.ts +30 -0
  153. package/dist/deployment/worker/limits.js +30 -0
  154. package/dist/deployment/worker/record.d.ts +29 -0
  155. package/dist/deployment/worker/record.js +69 -0
  156. package/dist/deployment/worker/request.d.ts +118 -0
  157. package/dist/deployment/worker/request.js +280 -0
  158. package/dist/deployment/worker/response.d.ts +101 -0
  159. package/dist/deployment/worker/response.js +207 -0
  160. package/dist/execution/cache/cache.d.ts +17 -0
  161. package/dist/execution/cache/cache.js +11 -0
  162. package/dist/execution/cache/index.d.ts +2 -0
  163. package/dist/execution/cache/index.js +2 -0
  164. package/dist/execution/cache/memory.d.ts +13 -0
  165. package/dist/execution/cache/memory.js +48 -0
  166. package/dist/execution/identity/authentication.d.ts +33 -3
  167. package/dist/execution/identity/authentication.js +90 -36
  168. package/dist/execution/identity/callback.d.ts +20 -20
  169. package/dist/execution/identity/callback.js +34 -26
  170. package/dist/execution/identity/delivery.d.ts +6 -4
  171. package/dist/execution/identity/delivery.js +25 -20
  172. package/dist/execution/identity/identity.d.ts +17 -3
  173. package/dist/execution/identity/identity.js +12 -4
  174. package/dist/execution/identity/jwks.d.ts +5 -0
  175. package/dist/execution/identity/jwks.js +92 -102
  176. package/dist/execution/index.d.ts +6 -4
  177. package/dist/execution/index.js +4 -2
  178. package/dist/execution/invocation/admission/age.d.ts +57 -0
  179. package/dist/execution/invocation/admission/age.js +208 -0
  180. package/dist/execution/invocation/admission/authentication.d.ts +13 -13
  181. package/dist/execution/invocation/admission/authentication.js +52 -44
  182. package/dist/execution/invocation/admission/authority.d.ts +28 -6
  183. package/dist/execution/invocation/admission/authority.js +9 -2
  184. package/dist/execution/invocation/admission/index.d.ts +4 -3
  185. package/dist/execution/invocation/admission/index.js +3 -2
  186. package/dist/execution/invocation/admission/input.d.ts +2 -2
  187. package/dist/execution/invocation/admission/input.js +16 -2
  188. package/dist/execution/invocation/admission/target.d.ts +11 -0
  189. package/dist/execution/invocation/admission/target.js +22 -3
  190. package/dist/execution/invocation/capabilities/bind.d.ts +11 -0
  191. package/dist/execution/invocation/capabilities/bind.js +25 -0
  192. package/dist/execution/invocation/capabilities/index.d.ts +1 -0
  193. package/dist/execution/invocation/capabilities/index.js +1 -0
  194. package/dist/execution/invocation/dependency/bind.d.ts +3 -1
  195. package/dist/execution/invocation/dependency/bind.js +36 -16
  196. package/dist/execution/invocation/dispatch/context.d.ts +7 -6
  197. package/dist/execution/invocation/dispatch/context.js +11 -44
  198. package/dist/execution/invocation/dispatch/workflow.js +0 -4
  199. package/dist/execution/invocation/handler.js +8 -2
  200. package/dist/execution/invocation/index.d.ts +2 -2
  201. package/dist/execution/invocation/index.js +1 -1
  202. package/dist/execution/invocation/integration/authentication.d.ts +3 -3
  203. package/dist/execution/invocation/integration/authentication.js +7 -7
  204. package/dist/execution/invocation/integration/call.d.ts +2 -1
  205. package/dist/execution/invocation/integration/call.js +3 -3
  206. package/dist/execution/invocation/integration/clients.d.ts +1 -1
  207. package/dist/execution/invocation/integration/index.d.ts +1 -0
  208. package/dist/execution/invocation/integration/index.js +1 -0
  209. package/dist/execution/invocation/invocation.d.ts +6 -0
  210. package/dist/execution/invocation/invocation.js +129 -21
  211. package/dist/execution/invocation/lifecycle/active.d.ts +8 -2
  212. package/dist/execution/invocation/lifecycle/active.js +3 -3
  213. package/dist/execution/invocation/lifecycle/index.d.ts +1 -1
  214. package/dist/execution/invocation/result/errors.d.ts +0 -10
  215. package/dist/execution/invocation/result/errors.js +0 -17
  216. package/dist/execution/invocation/result/index.d.ts +2 -2
  217. package/dist/execution/invocation/result/index.js +1 -1
  218. package/dist/execution/invocation/result/project.js +41 -1
  219. package/dist/execution/node/serve.d.ts +2 -2
  220. package/dist/execution/node/serve.js +1 -1
  221. package/dist/execution/runtime/index.d.ts +1 -0
  222. package/dist/execution/runtime/index.js +1 -0
  223. package/dist/execution/runtime/load.d.ts +3 -3
  224. package/dist/execution/runtime/load.js +3 -2
  225. package/dist/execution/runtime/release.d.ts +17 -0
  226. package/dist/execution/runtime/release.js +7 -0
  227. package/dist/execution/serve.d.ts +18 -4
  228. package/dist/execution/serve.js +10 -0
  229. package/dist/execution/service/create.js +43 -7
  230. package/dist/execution/service/initialization.d.ts +4 -4
  231. package/dist/execution/service/initialization.js +23 -14
  232. package/dist/execution/service/release.d.ts +2 -2
  233. package/dist/execution/service/release.js +3 -2
  234. package/dist/execution/service/service.d.ts +20 -5
  235. package/dist/execution/service/serving/delivery.d.ts +5 -0
  236. package/dist/execution/service/{publication → serving}/delivery.js +4 -1
  237. package/dist/execution/service/{publication → serving}/index.d.ts +1 -1
  238. package/dist/execution/service/serving/installation.d.ts +4 -0
  239. package/dist/execution/service/serving/installation.js +9 -0
  240. package/dist/execution/service/serving/source.d.ts +11 -0
  241. package/dist/execution/service/serving/source.js +15 -0
  242. package/dist/execution/workflows/discovery.d.ts +14 -0
  243. package/dist/execution/workflows/discovery.js +151 -0
  244. package/dist/execution/workflows/engine.d.ts +89 -0
  245. package/dist/execution/workflows/engine.js +1 -0
  246. package/dist/execution/workflows/envelope.d.ts +12 -0
  247. package/dist/execution/workflows/envelope.js +46 -0
  248. package/dist/execution/workflows/failure.d.ts +46 -0
  249. package/dist/execution/workflows/failure.js +160 -0
  250. package/dist/execution/workflows/index.d.ts +4 -0
  251. package/dist/execution/workflows/index.js +3 -0
  252. package/dist/execution/workflows/integrations.d.ts +13 -0
  253. package/dist/execution/workflows/integrations.js +25 -0
  254. package/dist/execution/workflows/options.d.ts +66 -0
  255. package/dist/execution/workflows/options.js +148 -0
  256. package/dist/execution/workflows/receiver.d.ts +24 -0
  257. package/dist/execution/workflows/receiver.js +99 -0
  258. package/dist/execution/workflows/route.d.ts +12 -0
  259. package/dist/execution/workflows/route.js +35 -0
  260. package/dist/execution/workflows/run.d.ts +21 -0
  261. package/dist/execution/workflows/run.js +321 -0
  262. package/dist/execution/workflows/steps.d.ts +42 -0
  263. package/dist/execution/workflows/steps.js +67 -0
  264. package/dist/index.d.ts +4 -4
  265. package/dist/index.js +2 -2
  266. package/dist/platform/graph/alias.d.ts +1 -5
  267. package/dist/platform/graph/alias.js +1 -5
  268. package/dist/platform/graph/document/index.d.ts +1 -1
  269. package/dist/platform/graph/document/index.js +1 -1
  270. package/dist/platform/graph/index.d.ts +1 -1
  271. package/dist/platform/graph/index.js +1 -1
  272. package/dist/platform/release/index.d.ts +2 -0
  273. package/dist/platform/release/index.js +2 -0
  274. package/dist/platform/schema/callable-authoring.d.ts +21 -0
  275. package/dist/platform/schema/callable-authoring.js +27 -0
  276. package/dist/platform/schema/class-authoring.d.ts +61 -11
  277. package/dist/platform/schema/class-authoring.js +37 -4
  278. package/dist/platform/schema/class-icon-svg.d.ts +9 -0
  279. package/dist/platform/schema/class-icon-svg.js +29 -0
  280. package/dist/platform/schema/class-icon.d.ts +3 -8
  281. package/dist/platform/schema/class-icon.js +2 -29
  282. package/dist/platform/schema/index.d.ts +6 -4
  283. package/dist/platform/schema/index.js +2 -1
  284. package/dist/platform/schema/property.d.ts +5 -0
  285. package/dist/platform/schema/schema-authoring.d.ts +14 -7
  286. package/dist/platform/schema/schema-authoring.js +5 -1
  287. package/dist/platform/versioning/dependents.d.ts +18 -0
  288. package/dist/platform/versioning/dependents.js +15 -0
  289. package/dist/platform/versioning/index.d.ts +5 -0
  290. package/dist/platform/versioning/index.js +5 -0
  291. package/dist/platform/versioning/name.d.ts +38 -0
  292. package/dist/platform/versioning/name.js +58 -0
  293. package/dist/platform/versioning/reference.d.ts +48 -0
  294. package/dist/platform/versioning/reference.js +95 -0
  295. package/dist/platform/versioning/version.d.ts +72 -0
  296. package/dist/platform/versioning/version.js +98 -0
  297. package/dist/project/admit.js +1 -5
  298. package/dist/project/define.d.ts +4 -4
  299. package/dist/project/define.js +55 -35
  300. package/dist/project/index.d.ts +1 -1
  301. package/dist/project/install-command.d.ts +6 -0
  302. package/dist/project/install-command.js +9 -0
  303. package/dist/project/project.d.ts +10 -8
  304. package/dist/testing/dataset/define.d.ts +1 -1
  305. package/dist/testing/durable/engine.d.ts +121 -0
  306. package/dist/testing/durable/engine.js +614 -0
  307. package/dist/testing/durable/index.d.ts +3 -0
  308. package/dist/testing/durable/index.js +1 -0
  309. package/dist/testing/durable/steps.d.ts +30 -0
  310. package/dist/testing/durable/steps.js +40 -0
  311. package/dist/testing/index.d.ts +6 -1
  312. package/dist/testing/index.js +5 -1
  313. package/dist/testing/load.js +1 -1
  314. package/dist/tooling/cli/adapter-command.d.ts +35 -0
  315. package/dist/tooling/cli/adapter-command.js +66 -0
  316. package/dist/tooling/cli/arguments.d.ts +17 -6
  317. package/dist/tooling/cli/arguments.js +175 -52
  318. package/dist/tooling/cli/build.d.ts +55 -0
  319. package/dist/tooling/cli/build.js +77 -0
  320. package/dist/tooling/cli/bun.d.ts +0 -1
  321. package/dist/tooling/cli/bun.js +0 -7
  322. package/dist/tooling/cli/commit.d.ts +35 -0
  323. package/dist/tooling/cli/commit.js +235 -0
  324. package/dist/tooling/cli/deploy-mode.d.ts +26 -0
  325. package/dist/tooling/cli/deploy-mode.js +59 -0
  326. package/dist/tooling/cli/deploy-result.d.ts +80 -0
  327. package/dist/tooling/cli/deploy-result.js +64 -0
  328. package/dist/tooling/cli/diff/declared.d.ts +7 -0
  329. package/dist/tooling/cli/diff/declared.js +27 -0
  330. package/dist/tooling/cli/diff/index.d.ts +30 -0
  331. package/dist/tooling/cli/diff/index.js +58 -0
  332. package/dist/tooling/cli/diff/render.d.ts +15 -0
  333. package/dist/tooling/cli/diff/render.js +131 -0
  334. package/dist/tooling/cli/diff/report.d.ts +88 -0
  335. package/dist/tooling/cli/diff/report.js +154 -0
  336. package/dist/tooling/cli/dotenv.d.ts +5 -5
  337. package/dist/tooling/cli/dotenv.js +6 -36
  338. package/dist/tooling/cli/help.js +173 -60
  339. package/dist/tooling/cli/immutable-deployment.d.ts +83 -0
  340. package/dist/tooling/cli/immutable-deployment.js +135 -0
  341. package/dist/tooling/cli/index.d.ts +12 -4
  342. package/dist/tooling/cli/index.js +6 -3
  343. package/dist/tooling/cli/installed-on.d.ts +83 -0
  344. package/dist/tooling/cli/installed-on.js +156 -0
  345. package/dist/tooling/cli/list.d.ts +152 -0
  346. package/dist/tooling/cli/list.js +331 -0
  347. package/dist/tooling/cli/log.d.ts +5 -2
  348. package/dist/tooling/cli/log.js +9 -2
  349. package/dist/tooling/cli/orchestrate.d.ts +0 -6
  350. package/dist/tooling/cli/orchestrate.js +246 -90
  351. package/dist/tooling/cli/project.d.ts +3 -3
  352. package/dist/tooling/cli/publish/index.d.ts +81 -0
  353. package/dist/tooling/cli/publish/index.js +383 -0
  354. package/dist/tooling/cli/publish/report.d.ts +49 -0
  355. package/dist/tooling/cli/publish/report.js +15 -0
  356. package/dist/tooling/cli/registry/client.d.ts +121 -0
  357. package/dist/tooling/cli/registry/client.js +354 -0
  358. package/dist/tooling/cli/registry/error.d.ts +11 -0
  359. package/dist/tooling/cli/registry/error.js +17 -0
  360. package/dist/tooling/cli/registry/executable.d.ts +35 -0
  361. package/dist/tooling/cli/registry/executable.js +96 -0
  362. package/dist/tooling/cli/registry/index.d.ts +9 -0
  363. package/dist/tooling/cli/registry/index.js +8 -0
  364. package/dist/tooling/cli/registry/installations.d.ts +67 -0
  365. package/dist/tooling/cli/registry/installations.js +108 -0
  366. package/dist/tooling/cli/registry/process.d.ts +36 -0
  367. package/dist/tooling/cli/registry/process.js +119 -0
  368. package/dist/tooling/cli/secrets.d.ts +9 -0
  369. package/dist/tooling/cli/secrets.js +19 -0
  370. package/dist/tooling/cli/yank.d.ts +34 -0
  371. package/dist/tooling/cli/yank.js +32 -0
  372. package/dist/tooling/linter/adapters/typescript/imports.d.ts +0 -1
  373. package/dist/tooling/linter/adapters/typescript/imports.js +1 -5
  374. package/dist/tooling/linter/adapters/typescript/index.d.ts +1 -1
  375. package/dist/tooling/linter/adapters/typescript/index.js +1 -1
  376. package/dist/tooling/linter/adapters/typescript/syntax.d.ts +3 -3
  377. package/dist/tooling/linter/adapters/typescript/syntax.js +13 -25
  378. package/dist/tooling/linter/implementations/source/callable-requirements.d.ts +1 -2
  379. package/dist/tooling/linter/implementations/source/callable-requirements.js +11 -16
  380. package/dist/tooling/linter/implementations/source/dependencies.js +13 -72
  381. package/dist/tooling/linter/implementations/source/global.js +1 -2
  382. package/dist/tooling/linter/implementations/source/mutations.js +18 -29
  383. package/dist/tooling/linter/implementations/source/providers.js +5 -5
  384. package/dist/tooling/linter/implementations/source/queries.js +1 -17
  385. package/dist/tooling/linter/implementations/source/shared.d.ts +12 -4
  386. package/dist/tooling/linter/implementations/source/shared.js +101 -46
  387. package/dist/tooling/linter/implementations/source/verifiers.js +0 -2
  388. package/dist/tooling/linter/implementations/source/views.js +2 -2
  389. package/dist/tooling/linter/implementations/source/workflows.js +500 -17
  390. package/dist/tooling/linter/policy/generated.js +14 -63
  391. package/dist/tooling/linter/requirements/registry.js +6 -8
  392. package/dist/tooling/packaging/declarations/ownership.js +1 -1
  393. package/dist/tooling/packaging/finalize.d.ts +1 -1
  394. package/dist/tooling/packaging/finalize.js +1 -1
  395. package/docs/admission-age.md +88 -0
  396. package/docs/auth-api-migration.md +55 -0
  397. package/docs/business-errors.md +42 -0
  398. package/docs/domain-definition-migration.md +44 -0
  399. package/docs/domain-schema-migration.md +36 -0
  400. package/docs/durable-workflows.md +418 -0
  401. package/docs/handler-dependencies.md +213 -0
  402. package/docs/release.md +155 -0
  403. package/docs/schema-cost.md +124 -0
  404. package/package.json +45 -16
  405. package/dist/application/application.d.ts +0 -28
  406. package/dist/application/query/execution/projection.d.ts +0 -3
  407. package/dist/application/query/execution/projection.js +0 -3
  408. package/dist/deployment/adapter/deploy/context.d.ts +0 -15
  409. package/dist/deployment/adapter/deploy/index.d.ts +0 -2
  410. package/dist/deployment/adapter/deploy/result.d.ts +0 -50
  411. package/dist/deployment/adapter/prepare/artifact.d.ts +0 -33
  412. package/dist/deployment/adapter/prepare/context.d.ts +0 -23
  413. package/dist/deployment/adapter/prepare/index.d.ts +0 -2
  414. package/dist/deployment/deploy.d.ts +0 -20
  415. package/dist/deployment/deploy.js +0 -31
  416. package/dist/deployment/release/publication/index.d.ts +0 -6
  417. package/dist/deployment/release/publication/index.js +0 -6
  418. package/dist/deployment/release/publication/manifest.d.ts +0 -3
  419. package/dist/deployment/release/publication/manifest.js +0 -5
  420. package/dist/deployment/release/publication/requirements.d.ts +0 -3
  421. package/dist/deployment/release/publication/requirements.js +0 -3
  422. package/dist/deployment/release/publication/seal.d.ts +0 -10
  423. package/dist/deployment/release/publication/seal.js +0 -39
  424. package/dist/deployment/verify/preflight/artifact.d.ts +0 -6
  425. package/dist/deployment/verify/preflight/artifact.js +0 -122
  426. package/dist/deployment/verify/preflight/publication.d.ts +0 -4
  427. package/dist/deployment/verify/preflight/publication.js +0 -14
  428. package/dist/deployment/verify/readiness/deployment.d.ts +0 -3
  429. package/dist/deployment/verify/readiness/deployment.js +0 -151
  430. package/dist/deployment/verify/readiness/publication.d.ts +0 -11
  431. package/dist/deployment/verify/readiness/publication.js +0 -41
  432. package/dist/execution/service/errors.d.ts +0 -3
  433. package/dist/execution/service/errors.js +0 -3
  434. package/dist/execution/service/publication/delivery.d.ts +0 -2
  435. package/dist/execution/service/publication/installation.d.ts +0 -3
  436. package/dist/execution/service/publication/installation.js +0 -8
  437. package/dist/execution/service/publication/source.d.ts +0 -3
  438. package/dist/execution/service/publication/source.js +0 -11
  439. package/dist/platform/publication/index.d.ts +0 -2
  440. package/dist/platform/publication/index.js +0 -2
  441. package/dist/tooling/cli/astrale/authority.d.ts +0 -5
  442. package/dist/tooling/cli/astrale/authority.js +0 -11
  443. package/dist/tooling/cli/astrale/executable.d.ts +0 -2
  444. package/dist/tooling/cli/astrale/executable.js +0 -47
  445. package/dist/tooling/cli/astrale/failure.d.ts +0 -6
  446. package/dist/tooling/cli/astrale/failure.js +0 -48
  447. package/dist/tooling/cli/astrale/instance.d.ts +0 -11
  448. package/dist/tooling/cli/astrale/instance.js +0 -52
  449. package/dist/tooling/cli/astrale/process.d.ts +0 -13
  450. package/dist/tooling/cli/astrale/process.js +0 -94
  451. package/dist/tooling/cli/astrale/version.d.ts +0 -18
  452. package/dist/tooling/cli/astrale/version.js +0 -55
  453. package/dist/tooling/cli/credential.d.ts +0 -2
  454. package/dist/tooling/cli/credential.js +0 -57
  455. package/dist/tooling/cli/deprecations.d.ts +0 -9
  456. package/dist/tooling/cli/deprecations.js +0 -15
  457. package/dist/tooling/cli/development/candidate.d.ts +0 -25
  458. package/dist/tooling/cli/development/candidate.js +0 -176
  459. package/dist/tooling/cli/development/deployment.d.ts +0 -16
  460. package/dist/tooling/cli/development/deployment.js +0 -39
  461. package/dist/tooling/cli/development/develop.d.ts +0 -11
  462. package/dist/tooling/cli/development/develop.js +0 -243
  463. package/dist/tooling/cli/development/lease.d.ts +0 -18
  464. package/dist/tooling/cli/development/lease.js +0 -163
  465. package/dist/tooling/cli/development/lifecycle.d.ts +0 -9
  466. package/dist/tooling/cli/development/lifecycle.js +0 -43
  467. package/dist/tooling/cli/development/project-imports.d.ts +0 -22
  468. package/dist/tooling/cli/development/project-imports.js +0 -39
  469. package/dist/tooling/cli/development/project-lock.d.ts +0 -16
  470. package/dist/tooling/cli/development/project-lock.js +0 -41
  471. package/dist/tooling/cli/development/rebuild.d.ts +0 -13
  472. package/dist/tooling/cli/development/rebuild.js +0 -58
  473. package/dist/tooling/cli/development/release-evidence.d.ts +0 -4
  474. package/dist/tooling/cli/development/release-evidence.js +0 -10
  475. package/dist/tooling/cli/development/report.d.ts +0 -6
  476. package/dist/tooling/cli/development/report.js +0 -14
  477. package/dist/tooling/cli/development/session-file.d.ts +0 -53
  478. package/dist/tooling/cli/development/session-file.js +0 -337
  479. package/dist/tooling/cli/development/source-watch.d.ts +0 -14
  480. package/dist/tooling/cli/development/source-watch.js +0 -140
  481. package/dist/tooling/cli/development/sources.d.ts +0 -7
  482. package/dist/tooling/cli/development/sources.js +0 -48
  483. package/dist/tooling/cli/development/target-lock.d.ts +0 -16
  484. package/dist/tooling/cli/development/target-lock.js +0 -68
  485. package/dist/tooling/cli/development/view.d.ts +0 -28
  486. package/dist/tooling/cli/development/view.js +0 -151
  487. package/dist/tooling/cli/environment-release.d.ts +0 -21
  488. package/dist/tooling/cli/environment-release.js +0 -46
  489. package/dist/tooling/cli/evidence.d.ts +0 -11
  490. package/dist/tooling/cli/evidence.js +0 -53
  491. package/dist/tooling/cli/installation/index.d.ts +0 -2
  492. package/dist/tooling/cli/installation/index.js +0 -1
  493. package/dist/tooling/cli/installation/observation.d.ts +0 -10
  494. package/dist/tooling/cli/installation/observation.js +0 -44
  495. package/dist/tooling/cli/installation/reconcile.d.ts +0 -32
  496. package/dist/tooling/cli/installation/reconcile.js +0 -122
  497. package/dist/tooling/linter/implementations/source/migrations.d.ts +0 -2
  498. package/dist/tooling/linter/implementations/source/migrations.js +0 -113
  499. package/dist/tooling/linter/qualification/index.d.ts +0 -10
  500. package/dist/tooling/linter/qualification/index.js +0 -2
  501. package/dist/tooling/linter/qualification/query-fixtures.d.ts +0 -2
  502. package/dist/tooling/linter/qualification/query-fixtures.js +0 -68
  503. package/dist/tooling/linter/qualification/runner.d.ts +0 -3
  504. package/dist/tooling/linter/qualification/runner.js +0 -6
  505. /package/dist/application/{application.js → domain.js} +0 -0
  506. /package/dist/{deployment/adapter/deploy/context.js → application/workflow/durable.js} +0 -0
  507. /package/dist/deployment/adapter/{deploy/index.js → bundle/bundle.js} +0 -0
  508. /package/dist/deployment/adapter/{deploy/result.js → bundle/file.js} +0 -0
  509. /package/dist/deployment/adapter/{prepare → bundle}/index.js +0 -0
  510. /package/dist/deployment/adapter/{prepare/artifact.js → release/command.js} +0 -0
  511. /package/dist/deployment/adapter/{prepare → release}/context.js +0 -0
  512. /package/dist/deployment/release/{publication → served}/routes.d.ts +0 -0
  513. /package/dist/deployment/release/{publication → served}/routes.js +0 -0
  514. /package/dist/execution/service/{publication → serving}/index.js +0 -0
@@ -0,0 +1,614 @@
1
+ import { bindProviders } from '../../application/integration/index.js';
2
+ import { runtimeCallables } from '../../application/runtime/callables.js';
3
+ import { admitWorkflows } from '../../application/runtime/workflows.js';
4
+ import { durableServing } from '../../execution/workflows/options.js';
5
+ import { durableHandlers } from '../../execution/workflows/run.js';
6
+ import { issuer } from '../../platform/auth/index.js';
7
+ import { NodeId as nodeId } from '../../platform/graph/node/index.js';
8
+ import { testSteps } from './steps.js';
9
+ /** Kernel every test Execution names; Steps never reach it. */
10
+ const TEST_KERNEL = issuer.accept('https://kernel.test.astrale.invalid');
11
+ /** Microtask turns without progress after which a blocked attempt counts as suspended. */
12
+ const QUIET_TURNS = 64;
13
+ /** Metadata the Kernel reads a declared failure from. */
14
+ const FAILURE = 'astrale.failure';
15
+ class TerminalError extends Error {
16
+ code;
17
+ metadata;
18
+ constructor(message, options) {
19
+ super(message);
20
+ this.name = 'TerminalError';
21
+ this.code = options?.errorCode ?? 500;
22
+ if (options?.metadata !== undefined)
23
+ this.metadata = Object.freeze({ ...options.metadata });
24
+ }
25
+ }
26
+ class CancelledError extends TerminalError {
27
+ constructor() {
28
+ super('Cancelled', { errorCode: 409 });
29
+ this.name = 'CancelledError';
30
+ }
31
+ }
32
+ class TimeoutError extends TerminalError {
33
+ constructor() {
34
+ super('Timeout occurred', { errorCode: 408 });
35
+ this.name = 'TimeoutError';
36
+ }
37
+ }
38
+ class RetryableError extends Error {
39
+ retryAfter;
40
+ constructor(message, options) {
41
+ super(message, options?.cause === undefined ? undefined : { cause: options.cause });
42
+ this.name = 'RetryableError';
43
+ if (options?.retryAfter !== undefined)
44
+ this.retryAfter = options.retryAfter;
45
+ }
46
+ }
47
+ /** The attempt lost its Step result on purpose; the engine retries it. */
48
+ class Interruption extends Error {
49
+ constructor(step) {
50
+ super(`Test interruption after Step ${step}, before the journal recorded it.`);
51
+ this.name = 'Interruption';
52
+ }
53
+ }
54
+ /** The Workflow did not do what its journal recorded at this position. */
55
+ class JournalMismatch extends Error {
56
+ constructor(index, recorded, requested) {
57
+ super(`Journal entry ${index} recorded ${recorded}, but the Workflow requested ${requested}: ` +
58
+ 'code between Steps must be deterministic.');
59
+ this.name = 'JournalMismatch';
60
+ }
61
+ }
62
+ /** The promises the test engine's `run` returned: the only ones its combinator accepts. */
63
+ const RUNS = new WeakSet();
64
+ const ENGINE = Object.freeze({
65
+ createEndpointHandler: () => () => Promise.reject(new Error('A test engine serves no HTTP.')),
66
+ workflow: (definition) => definition,
67
+ TerminalError,
68
+ CancelledError,
69
+ RetryableError,
70
+ TimeoutError,
71
+ RestatePromise: Object.freeze({
72
+ allSettled(values) {
73
+ // As the engine refuses a promise it did not create: only its own runs combine.
74
+ values.forEach((value, index) => {
75
+ if (!RUNS.has(value)) {
76
+ throw new TypeError(`Promise index ${index} used inside the combinator is not a run.`);
77
+ }
78
+ });
79
+ return Promise.allSettled(values);
80
+ },
81
+ }),
82
+ });
83
+ /** Create an in-memory workflow engine for tests. */
84
+ export function createTestEngine(options = {}) {
85
+ const serving = durableServing({
86
+ engine: ENGINE,
87
+ ...(options.retry === undefined ? {} : { retry: options.retry }),
88
+ });
89
+ const maxAttempts = serving.retryPolicy.maxAttempts;
90
+ let now = options.now ?? Date.now();
91
+ if (!Number.isFinite(now))
92
+ throw new TypeError('Test engine now must be finite.');
93
+ let sequence = 0;
94
+ const runs = new Set();
95
+ const clock = { now: () => now };
96
+ return Object.freeze({
97
+ get now() {
98
+ return now;
99
+ },
100
+ async start(workflow, input) {
101
+ sequence += 1;
102
+ const run = new TestRun(workflow, input, clock, serving, maxAttempts, sequence);
103
+ runs.add(run);
104
+ await run.settle();
105
+ return run.execution;
106
+ },
107
+ async advance(durationMs) {
108
+ if (!Number.isSafeInteger(durationMs) || durationMs < 0) {
109
+ throw new TypeError('Test engine advance takes a non-negative integer of milliseconds.');
110
+ }
111
+ now += durationMs;
112
+ for (const run of runs)
113
+ if (run.state === 'waiting')
114
+ await run.settle();
115
+ },
116
+ });
117
+ }
118
+ class TestRun {
119
+ clock;
120
+ maxAttempts;
121
+ state = 'running';
122
+ outcome;
123
+ failure;
124
+ attempts = 0;
125
+ journal = [];
126
+ signals = new Map();
127
+ interruptions = new Set();
128
+ cancellation = 'none';
129
+ failures = 0;
130
+ handlers;
131
+ envelope;
132
+ execution;
133
+ constructor(workflow, input, clock, serving, maxAttempts, sequence) {
134
+ this.clock = clock;
135
+ this.maxAttempts = maxAttempts;
136
+ const domain = input.schema;
137
+ const [admitted] = admitWorkflows(runtimeCallables(domain), [workflow]);
138
+ if (admitted === undefined || !admitted.durable) {
139
+ throw new TypeError(`Workflow ${workflow.address} is not durable: its callable must declare execution: { durable: true }.`);
140
+ }
141
+ const providers = (input.providers ?? {});
142
+ const integrations = Object.fromEntries(Object.entries(providers).map(([name, provider]) => [name, provider.integration]));
143
+ this.handlers = durableHandlers({
144
+ kernel: TEST_KERNEL,
145
+ workflow: admitted,
146
+ domain,
147
+ serving,
148
+ steps: testSteps({
149
+ domain,
150
+ capabilities: (input.capabilities ?? {}),
151
+ integrations: bindProviders(integrations, providers),
152
+ }),
153
+ });
154
+ const id = input.id ?? nodeId(`execution-test-${String(sequence).padStart(6, '0')}`);
155
+ this.envelope = Object.freeze({
156
+ execution: id,
157
+ function: { id: `function-test-${admitted.address}`, version: `sha256:${'0'.repeat(64)}` },
158
+ kernel: TEST_KERNEL,
159
+ initiator: input.initiator ?? { principal: 'principal-test', caller: 'caller-test' },
160
+ input: input.input,
161
+ ...(input.self === undefined ? {} : { receiver: input.self }),
162
+ });
163
+ for (const step of (input.interruptAfter ?? [])) {
164
+ this.interruptions.add(`step:${step}`);
165
+ }
166
+ this.execution = this.view(id);
167
+ }
168
+ /** Attempt the run until it ends, waits, or pauses. */
169
+ async settle() {
170
+ if (this.ended || this.state === 'paused')
171
+ return;
172
+ this.state = 'running';
173
+ for (;;) {
174
+ const attempted = await this.attempt('run');
175
+ if (attempted.kind === 'suspended') {
176
+ this.state = 'waiting';
177
+ return;
178
+ }
179
+ if (attempted.kind === 'completed') {
180
+ this.end({ kind: 'completed', value: attempted.value });
181
+ return;
182
+ }
183
+ if (attempted.kind === 'retried') {
184
+ this.failure = attempted.error;
185
+ continue;
186
+ }
187
+ const { error } = attempted;
188
+ if (error instanceof TerminalError) {
189
+ this.end(outcomeOf(error));
190
+ return;
191
+ }
192
+ this.failure = error;
193
+ this.failures += 1;
194
+ if (this.failures >= this.maxAttempts) {
195
+ this.state = 'paused';
196
+ return;
197
+ }
198
+ }
199
+ }
200
+ get ended() {
201
+ return this.state === 'completed' || this.state === 'failed' || this.state === 'cancelled';
202
+ }
203
+ end(outcome) {
204
+ this.outcome = Object.freeze(outcome);
205
+ this.state = outcome.kind;
206
+ }
207
+ /** One attempt of the run: replay the journal, then run on until it ends or blocks. */
208
+ attempt(mode) {
209
+ this.attempts += 1;
210
+ const attempt = new Attempt(this, mode);
211
+ const running = Promise.resolve()
212
+ .then(() => this.handlers.run(attempt.context, this.envelope))
213
+ .then((value) => ({ kind: 'completed', value }), (error) => ({ kind: 'failed', error }))
214
+ .finally(() => attempt.finish());
215
+ return Promise.race([running, attempt.suspended(), attempt.ended]).finally(() => attempt.finish());
216
+ }
217
+ async signal(name, value) {
218
+ if (this.ended)
219
+ throw new Error(`Execution ${String(this.envelope.execution)} has ended.`);
220
+ const shared = {
221
+ promise: (promise) => ({
222
+ resolve: async (resolved) => {
223
+ if (this.signals.has(promise))
224
+ throw new TerminalError('Promise already resolved.');
225
+ this.signals.set(promise, resolved);
226
+ },
227
+ }),
228
+ };
229
+ const { accepted } = (await this.handlers.signal(shared, { name, value }));
230
+ if (this.state === 'waiting')
231
+ await this.settle();
232
+ return accepted;
233
+ }
234
+ async cancel() {
235
+ if (this.ended)
236
+ return;
237
+ if (this.cancellation === 'none')
238
+ this.cancellation = 'requested';
239
+ if (this.state === 'paused') {
240
+ this.failures = 0;
241
+ this.state = 'running';
242
+ }
243
+ await this.settle();
244
+ }
245
+ async resume() {
246
+ if (this.state !== 'paused') {
247
+ throw new Error(`Execution ${String(this.envelope.execution)} is not paused.`);
248
+ }
249
+ this.failures = 0;
250
+ this.state = 'running';
251
+ await this.settle();
252
+ }
253
+ async replay() {
254
+ if (this.state === 'paused' || this.state === 'running') {
255
+ throw new Error('Replay an Execution that ended or waits; resume a paused one first.');
256
+ }
257
+ const attempted = await this.attempt('replay');
258
+ if (this.state === 'waiting') {
259
+ if (attempted.kind !== 'suspended')
260
+ throw divergence('ended instead of waiting', attempted);
261
+ return;
262
+ }
263
+ const outcome = attempted.kind === 'completed'
264
+ ? { kind: 'completed', value: attempted.value }
265
+ : attempted.kind === 'failed' && attempted.error instanceof TerminalError
266
+ ? outcomeOf(attempted.error)
267
+ : undefined;
268
+ if (outcome === undefined || JSON.stringify(outcome) !== JSON.stringify(this.outcome)) {
269
+ throw divergence(`did not reach ${JSON.stringify(this.outcome)}`, attempted);
270
+ }
271
+ }
272
+ view(id) {
273
+ const live = (read) => ({ enumerable: true, get: read });
274
+ return Object.freeze(Object.defineProperties({
275
+ id,
276
+ signal: (name, value) => this.signal(name, value),
277
+ cancel: () => this.cancel(),
278
+ resume: () => this.resume(),
279
+ replay: () => this.replay(),
280
+ interruptAfter: (step) => {
281
+ this.interruptions.add(`step:${step}`);
282
+ },
283
+ }, {
284
+ state: live(() => this.state),
285
+ outcome: live(() => this.outcome),
286
+ failure: live(() => this.failure),
287
+ attempts: live(() => this.attempts),
288
+ journal: live(() => Object.freeze(this.journal.map(snapshot))),
289
+ }));
290
+ }
291
+ }
292
+ /**
293
+ * The engine context of one attempt. Every operation takes the next journal position: a settled
294
+ * entry answers as it did, a pending one waits, and a new one runs. A replay records nothing new.
295
+ */
296
+ class Attempt {
297
+ run;
298
+ mode;
299
+ cursor = 0;
300
+ active = 0;
301
+ blocked = 0;
302
+ progress = 0;
303
+ done = false;
304
+ controller = new AbortController();
305
+ end;
306
+ /** Settles when a Step ends the attempt without reaching the Workflow, as a retry or a crash. */
307
+ ended = new Promise((resolve) => {
308
+ this.end = resolve;
309
+ });
310
+ context;
311
+ constructor(run, mode) {
312
+ this.run = run;
313
+ this.mode = mode;
314
+ this.context = Object.freeze({
315
+ run: (name, action, options) => {
316
+ const run = this.journalRun(name, action, options);
317
+ RUNS.add(run);
318
+ return run;
319
+ },
320
+ sleep: (durationMs) => this.sleep(durationMs),
321
+ promise: (name) => ({ get: () => this.promise(name) }),
322
+ request: () => ({ attemptCompletedSignal: this.controller.signal }),
323
+ });
324
+ }
325
+ finish() {
326
+ if (this.done)
327
+ return;
328
+ this.done = true;
329
+ this.controller.abort();
330
+ }
331
+ /** Resolves once the attempt waits on a pending entry and nothing else can move it. */
332
+ async suspended() {
333
+ for (;;) {
334
+ if (this.done)
335
+ return new Promise(() => { });
336
+ if (this.active > 0) {
337
+ await macrotask();
338
+ continue;
339
+ }
340
+ const before = this.progress;
341
+ for (let turn = 0; turn < QUIET_TURNS && this.progress === before; turn++) {
342
+ await Promise.resolve();
343
+ }
344
+ if (this.done)
345
+ return new Promise(() => { });
346
+ if (this.progress !== before)
347
+ continue;
348
+ if (this.blocked > 0)
349
+ return { kind: 'suspended' };
350
+ await macrotask();
351
+ }
352
+ }
353
+ take(kind, name) {
354
+ this.progress += 1;
355
+ const index = this.cursor++;
356
+ const recorded = this.run.journal[index];
357
+ if (recorded !== undefined) {
358
+ if (recorded.kind !== kind || recorded.name !== name) {
359
+ throw new JournalMismatch(index, describe(recorded), describe({ kind, name }));
360
+ }
361
+ return recorded;
362
+ }
363
+ if (this.mode === 'replay') {
364
+ throw new JournalMismatch(index, 'nothing', describe({ kind, name }));
365
+ }
366
+ const entry = { kind, name, settled: false };
367
+ this.run.journal.push(entry);
368
+ return entry;
369
+ }
370
+ /** Deliver a requested cancellation to the first entry that is not settled yet. */
371
+ cancelled(entry) {
372
+ if (this.mode === 'replay' || this.run.cancellation !== 'requested')
373
+ return false;
374
+ this.run.cancellation = 'delivered';
375
+ entry.settled = true;
376
+ entry.error = new CancelledError();
377
+ if (entry.kind === 'race')
378
+ entry.outcome = 'cancelled';
379
+ return true;
380
+ }
381
+ answer(entry) {
382
+ return entry.error === undefined
383
+ ? Promise.resolve(entry.value)
384
+ : Promise.reject(entry.error);
385
+ }
386
+ block() {
387
+ this.blocked += 1;
388
+ this.progress += 1;
389
+ return new Promise(() => { });
390
+ }
391
+ /**
392
+ * One journaled `run`. A failure within the budget of `options` ends the attempt before the
393
+ * Workflow sees it, as the engine retries the `run` with a fresh attempt; a spent budget settles
394
+ * the entry with a `TerminalError`. Without options, the failure reaches the Workflow.
395
+ */
396
+ journalRun(name, action, options) {
397
+ let entry;
398
+ try {
399
+ entry = this.take('run', name);
400
+ }
401
+ catch (cause) {
402
+ return Promise.reject(cause);
403
+ }
404
+ if (entry.settled)
405
+ return this.answer(entry);
406
+ if (this.cancelled(entry))
407
+ return this.answer(entry);
408
+ if (this.mode === 'replay') {
409
+ return Promise.reject(new JournalMismatch(this.cursor - 1, 'a pending entry', `${name} to run again`));
410
+ }
411
+ this.active += 1;
412
+ entry.attempts = (entry.attempts ?? 0) + 1;
413
+ return (async () => {
414
+ try {
415
+ const value = await action();
416
+ // A Step that completes once its attempt ended, as a parallel sibling may, is lost with it.
417
+ if (this.done)
418
+ return this.block();
419
+ if (this.run.interruptions.delete(name)) {
420
+ // A crash after the effect: the run is attempted again, and the Step with it.
421
+ this.end({ kind: 'failed', error: new Interruption(name.replace(/^step:/u, '')) });
422
+ return this.block();
423
+ }
424
+ entry.settled = true;
425
+ entry.value = value;
426
+ return value;
427
+ }
428
+ catch (cause) {
429
+ if (this.done)
430
+ return this.block();
431
+ if (cause instanceof TerminalError) {
432
+ entry.settled = true;
433
+ entry.error = cause;
434
+ throw cause;
435
+ }
436
+ this.run.failure = cause;
437
+ if (options === undefined)
438
+ throw cause;
439
+ if (spent(entry, options)) {
440
+ entry.settled = true;
441
+ entry.error = new TerminalError(cause?.message ?? String(cause));
442
+ throw entry.error;
443
+ }
444
+ // An attempt takes time too: a zero delay still spends a duration budget, by a millisecond.
445
+ entry.waitedMs = (entry.waitedMs ?? 0) + Math.max(1, delayOf(entry, options, cause));
446
+ this.end({ kind: 'retried', error: cause });
447
+ return this.block();
448
+ }
449
+ finally {
450
+ this.active -= 1;
451
+ this.progress += 1;
452
+ }
453
+ })();
454
+ }
455
+ sleep(durationMs) {
456
+ let entry;
457
+ try {
458
+ entry = this.take('sleep', '');
459
+ }
460
+ catch (cause) {
461
+ return Promise.reject(cause);
462
+ }
463
+ entry.until ??= this.run.clock.now() + durationMs;
464
+ if (entry.settled)
465
+ return this.answer(entry);
466
+ if (this.run.clock.now() >= entry.until) {
467
+ if (this.mode === 'run')
468
+ entry.settled = true;
469
+ return Promise.resolve();
470
+ }
471
+ if (this.cancelled(entry))
472
+ return this.answer(entry);
473
+ return this.block();
474
+ }
475
+ /**
476
+ * The engine promise of signal `name`. Awaited, it waits for the signal; `orTimeout` races it
477
+ * against a timer instead, so only one of the two takes a journal position.
478
+ */
479
+ promise(name) {
480
+ let raced = false;
481
+ const awaited = Promise.resolve().then(() => (raced ? new Promise(() => { }) : this.wait(name)));
482
+ return Object.assign(awaited, {
483
+ orTimeout: (millis) => {
484
+ raced = true;
485
+ return this.race(name, millis);
486
+ },
487
+ });
488
+ }
489
+ wait(name) {
490
+ let entry;
491
+ try {
492
+ entry = this.take('signal', name);
493
+ }
494
+ catch (cause) {
495
+ return Promise.reject(cause);
496
+ }
497
+ if (entry.settled)
498
+ return this.answer(entry);
499
+ if (this.run.signals.has(name))
500
+ return this.settle(entry, this.run.signals.get(name));
501
+ if (this.cancelled(entry))
502
+ return this.answer(entry);
503
+ return this.block();
504
+ }
505
+ race(name, millis) {
506
+ let entry;
507
+ try {
508
+ entry = this.take('race', name);
509
+ }
510
+ catch (cause) {
511
+ return Promise.reject(cause);
512
+ }
513
+ entry.until ??= this.run.clock.now() + millis;
514
+ if (entry.settled)
515
+ return this.answer(entry);
516
+ if (this.run.signals.has(name)) {
517
+ if (this.mode === 'run')
518
+ entry.outcome = 'signal';
519
+ return this.settle(entry, this.run.signals.get(name));
520
+ }
521
+ if (this.run.clock.now() >= entry.until) {
522
+ if (this.mode === 'run') {
523
+ entry.settled = true;
524
+ entry.outcome = 'timeout';
525
+ entry.error = new TimeoutError();
526
+ }
527
+ return Promise.reject(new TimeoutError());
528
+ }
529
+ if (this.cancelled(entry))
530
+ return this.answer(entry);
531
+ return this.block();
532
+ }
533
+ settle(entry, value) {
534
+ if (this.mode === 'run') {
535
+ entry.settled = true;
536
+ entry.value = value;
537
+ }
538
+ return Promise.resolve(value);
539
+ }
540
+ }
541
+ /** Whether a Step that just failed spent its budget: its attempts, or the backoff it waited. */
542
+ function spent(entry, options) {
543
+ return ((options.maxRetryAttempts !== undefined && (entry.attempts ?? 0) >= options.maxRetryAttempts) ||
544
+ (options.maxRetryDuration !== undefined && (entry.waitedMs ?? 0) >= options.maxRetryDuration));
545
+ }
546
+ /** The delay before a failed Step's next attempt: the one its failure prescribes, or its backoff. */
547
+ function delayOf(entry, options, cause) {
548
+ if (cause instanceof RetryableError && cause.retryAfter !== undefined)
549
+ return cause.retryAfter;
550
+ const retries = (entry.attempts ?? 1) - 1;
551
+ return Math.min(options.maxRetryInterval, options.initialRetryInterval * options.retryIntervalFactor ** retries);
552
+ }
553
+ function outcomeOf(error) {
554
+ const declared = error.metadata?.[FAILURE];
555
+ if (declared !== undefined) {
556
+ const failure = JSON.parse(declared);
557
+ return {
558
+ kind: 'failed',
559
+ error: Object.freeze({
560
+ ...(failure.family === undefined ? {} : { family: failure.family }),
561
+ code: failure.code,
562
+ message: failure.message,
563
+ ...(failure.details === undefined ? {} : { details: failure.details }),
564
+ }),
565
+ };
566
+ }
567
+ // As the Kernel decodes it: a bare 409 is the engine's cancellation.
568
+ if (error.code === 409)
569
+ return { kind: 'cancelled' };
570
+ return {
571
+ kind: 'failed',
572
+ error: Object.freeze({ code: String(error.code), message: error.message }),
573
+ };
574
+ }
575
+ function snapshot(entry) {
576
+ switch (entry.kind) {
577
+ case 'run':
578
+ return Object.freeze({
579
+ kind: 'run',
580
+ name: entry.name,
581
+ settled: entry.settled,
582
+ attempts: entry.attempts ?? 0,
583
+ ...(entry.settled && entry.error === undefined ? { value: entry.value } : {}),
584
+ ...(entry.error === undefined ? {} : { error: entry.error }),
585
+ });
586
+ case 'sleep':
587
+ return Object.freeze({ kind: 'sleep', until: entry.until, settled: entry.settled });
588
+ case 'signal':
589
+ return Object.freeze({
590
+ kind: 'signal',
591
+ name: entry.name,
592
+ settled: entry.settled,
593
+ ...(entry.settled && entry.error === undefined ? { value: entry.value } : {}),
594
+ });
595
+ case 'race':
596
+ return Object.freeze({
597
+ kind: 'race',
598
+ name: entry.name,
599
+ until: entry.until,
600
+ settled: entry.settled,
601
+ ...(entry.outcome === undefined ? {} : { outcome: entry.outcome }),
602
+ });
603
+ }
604
+ }
605
+ function describe(entry) {
606
+ return entry.name === '' ? entry.kind : `${entry.kind} ${entry.name}`;
607
+ }
608
+ function divergence(reason, attempted) {
609
+ const cause = attempted.kind === 'failed' ? attempted.error : undefined;
610
+ return new Error(`Replay diverged: the Workflow ${reason}.`, { cause });
611
+ }
612
+ function macrotask() {
613
+ return new Promise((resolve) => setTimeout(resolve, 0));
614
+ }
@@ -0,0 +1,3 @@
1
+ export { createTestEngine } from './engine.js';
2
+ export type { TestEngine, TestEngineOptions, TestExecution, TestJournalEntry, TestStartOptions, } from './engine.js';
3
+ export type { TestStepCapabilities } from './steps.js';
@@ -0,0 +1 @@
1
+ export { createTestEngine } from './engine.js';
@@ -0,0 +1,30 @@
1
+ import type { IntegrationClientFactory, Integrations } from '../../application/integration/index.js';
2
+ import type { StepAuthorities } from '../../execution/workflows/steps.js';
3
+ import type { BoundClientSession } from '../../platform/client/session/index.js';
4
+ import type { Domain } from '../../platform/schema/index.js';
5
+ /**
6
+ * What the Steps of a test Execution reach instead of a Kernel. Each answers the calls a Step makes
7
+ * through its capabilities; an absent one fails the call that needs it.
8
+ */
9
+ export interface TestStepCapabilities {
10
+ /** Answers each Query a Step runs, through `query`, `graph.query` or `step.query`. */
11
+ readonly query?: (query: object, input: unknown) => unknown;
12
+ /**
13
+ * Answers each Mutation a Step runs, through `mutate`, `graph.mutate` or `step.mutate`. `call`
14
+ * carries the key the Host engine sends, so a retried Step presents the same one.
15
+ */
16
+ readonly mutate?: (mutation: object, input: unknown, call: {
17
+ readonly idempotencyKey: string;
18
+ }) => unknown;
19
+ /**
20
+ * The Kernel Session of a Step. `kernel.invoke` and every `dependencies` call reach its `invoke`,
21
+ * with the Step's next key in `options.idempotencyKey` when the callee is durable.
22
+ */
23
+ readonly kernel?: Partial<BoundClientSession>;
24
+ }
25
+ /** Bind each Step attempt of a test Execution to the test's capabilities, keyed as on a Host. */
26
+ export declare function testSteps(input: {
27
+ readonly domain: Domain;
28
+ readonly capabilities: TestStepCapabilities;
29
+ readonly integrations: IntegrationClientFactory<Integrations>;
30
+ }): StepAuthorities;
@@ -0,0 +1,40 @@
1
+ import { bindDependencies } from '../../execution/invocation/dependency/index.js';
2
+ import { stepCalls } from '../../execution/workflows/integrations.js';
3
+ import { keyed } from '../../execution/workflows/steps.js';
4
+ /** Bind each Step attempt of a test Execution to the test's capabilities, keyed as on a Host. */
5
+ export function testSteps(input) {
6
+ const { domain, capabilities, integrations } = input;
7
+ return ({ next, lifetime }) => {
8
+ const session = keyed({
9
+ ...capabilities.kernel,
10
+ invoke: capabilities.kernel?.invoke ?? absent('kernel.invoke'),
11
+ mutate: capabilities.kernel?.mutate ?? absent('kernel.mutate'),
12
+ }, domain, next);
13
+ const query = (definition, value) => call(capabilities.query, 'query', (answer) => answer(definition, value));
14
+ const mutate = (definition, value) => call(capabilities.mutate, 'mutate', (answer) => answer(definition, value, Object.freeze({ idempotencyKey: next() })));
15
+ const graph = Object.freeze({ query, mutate });
16
+ const auth = Object.freeze({
17
+ mint: (request) => call(capabilities.kernel?.auth?.mint, 'kernel.auth.mint', (mint) => mint(request)),
18
+ });
19
+ const authority = Object.freeze({
20
+ kernel: Object.freeze({ ...session, self: session }),
21
+ dependencies: bindDependencies(domain, { self: session }),
22
+ graph: Object.freeze({ ...graph, self: graph }),
23
+ query,
24
+ mutate,
25
+ integrations: integrations(stepCalls({ next, lifetime, auth })),
26
+ });
27
+ return Object.freeze({ authority, close() { } });
28
+ };
29
+ }
30
+ function call(answer, name, apply) {
31
+ if (answer === undefined)
32
+ return Promise.reject(missing(name));
33
+ return Promise.resolve().then(() => apply(answer));
34
+ }
35
+ function absent(name) {
36
+ return () => Promise.reject(missing(name));
37
+ }
38
+ function missing(name) {
39
+ return new Error(`The test Execution supplies no ${name}: add it to its capabilities.`);
40
+ }