@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,148 @@
1
+ /**
2
+ * The members of the Restate SDK Fetch entrypoint the durable receiver uses, which a platform's
3
+ * engine module must export.
4
+ */
5
+ export const DURABLE_ENGINE_EXPORTS = Object.freeze([
6
+ 'createEndpointHandler',
7
+ 'workflow',
8
+ 'TerminalError',
9
+ 'CancelledError',
10
+ 'RetryableError',
11
+ 'TimeoutError',
12
+ 'RestatePromise',
13
+ ]);
14
+ /**
15
+ * Whether `module` exports the members of the Restate SDK Fetch entrypoint the durable receiver
16
+ * uses: each a function, but `RestatePromise`, the namespace of its combinators.
17
+ */
18
+ export function isDurableEngine(module) {
19
+ if (module === null || typeof module !== 'object')
20
+ return false;
21
+ return DURABLE_ENGINE_EXPORTS.every((member) => {
22
+ const value = Reflect.get(module, member);
23
+ if (member !== 'RestatePromise')
24
+ return typeof value === 'function';
25
+ return (typeof value === 'object' &&
26
+ value !== null &&
27
+ typeof Reflect.get(value, 'allSettled') === 'function');
28
+ });
29
+ }
30
+ const HOUR_MS = 60 * 60_000;
31
+ const DAY_MS = 24 * HOUR_MS;
32
+ const DEFAULT_ATTEMPTS = 20;
33
+ /** The longest attempt a Step may declare, which the engine's abort timeout leaves to end first. */
34
+ const MAXIMUM_STEP_TIMEOUT_MS = 10 * 60_000;
35
+ /**
36
+ * How long the engine lets an attempt run without progress before it aborts it, declared on every
37
+ * Workflow service. Restate's own default is ten minutes, which a ten-minute Step would race: the
38
+ * margin lets a Step's own timeout fail the attempt, and report it, before the engine cuts it.
39
+ */
40
+ export const ENGINE_ABORT_TIMEOUT_MS = MAXIMUM_STEP_TIMEOUT_MS + 5 * 60_000;
41
+ const DEFAULT_STEP_RETRY = Object.freeze({
42
+ maxRetryAttempts: DEFAULT_ATTEMPTS,
43
+ initialRetryInterval: 1_000,
44
+ maxRetryInterval: 60_000,
45
+ retryIntervalFactor: 2,
46
+ });
47
+ /** Capture one durable serving configuration, failing closed on any gap. */
48
+ export function durableServing(input) {
49
+ if (input === null ||
50
+ typeof input !== 'object' ||
51
+ Array.isArray(input) ||
52
+ Reflect.ownKeys(input).some((key) => key !== 'engine' &&
53
+ key !== 'fetch' &&
54
+ key !== 'retentionMs' &&
55
+ key !== 'retry' &&
56
+ key !== 'stepTimeoutMs')) {
57
+ invalid('Durable serving options are invalid.');
58
+ }
59
+ const engine = input.engine;
60
+ if (!isDurableEngine(engine)) {
61
+ invalid('Durable serving requires the Restate SDK Fetch entrypoint of this platform.');
62
+ }
63
+ const fetch = input.fetch ?? globalThis.fetch.bind(globalThis);
64
+ if (typeof fetch !== 'function')
65
+ invalid('Durable serving requires Fetch for engine discovery.');
66
+ const step = stepServing({ retry: input.retry, timeoutMs: input.stepTimeoutMs }, { retry: DEFAULT_STEP_RETRY, timeoutMs: 60_000 });
67
+ return Object.freeze({
68
+ engine: Object.freeze({
69
+ createEndpointHandler: engine.createEndpointHandler.bind(engine),
70
+ workflow: engine.workflow.bind(engine),
71
+ TerminalError: engine.TerminalError,
72
+ CancelledError: engine.CancelledError,
73
+ RetryableError: engine.RetryableError,
74
+ TimeoutError: engine.TimeoutError,
75
+ RestatePromise: Object.freeze({
76
+ allSettled: engine.RestatePromise.allSettled.bind(engine.RestatePromise),
77
+ }),
78
+ }),
79
+ fetch,
80
+ retentionMs: bounded(input.retentionMs, 7 * DAY_MS, HOUR_MS, 365 * DAY_MS, 'retentionMs'),
81
+ retryPolicy: Object.freeze({
82
+ maxAttempts: input.retry?.maxAttempts ?? DEFAULT_ATTEMPTS,
83
+ onMaxAttempts: 'pause',
84
+ initialInterval: step.retry.initialRetryInterval,
85
+ maxInterval: step.retry.maxRetryInterval,
86
+ exponentiationFactor: step.retry.retryIntervalFactor,
87
+ }),
88
+ step,
89
+ });
90
+ }
91
+ /**
92
+ * What one Step is held to: the retry budget and timeout it declares, in place of `fallback`'s. A
93
+ * declared limit replaces both limits of the fallback; an undeclared interval keeps the fallback's.
94
+ */
95
+ export function stepServing(declared, fallback) {
96
+ const retry = declared.retry;
97
+ if (retry === undefined) {
98
+ return Object.freeze({
99
+ retry: fallback.retry,
100
+ timeoutMs: stepTimeout(declared.timeoutMs, fallback.timeoutMs),
101
+ });
102
+ }
103
+ if (retry === null ||
104
+ typeof retry !== 'object' ||
105
+ Array.isArray(retry) ||
106
+ Reflect.ownKeys(retry).some((key) => key !== 'maxAttempts' &&
107
+ key !== 'maxDurationMs' &&
108
+ key !== 'initialIntervalMs' &&
109
+ key !== 'maxIntervalMs')) {
110
+ invalid('Durable retry options are invalid.');
111
+ }
112
+ const limited = retry.maxAttempts !== undefined || retry.maxDurationMs !== undefined;
113
+ const maxAttempts = limited
114
+ ? optionalBounded(retry.maxAttempts, 1, 1_000, 'maxAttempts')
115
+ : fallback.retry.maxRetryAttempts;
116
+ const maxDuration = limited
117
+ ? optionalBounded(retry.maxDurationMs, 1, 365 * DAY_MS, 'maxDurationMs')
118
+ : fallback.retry.maxRetryDuration;
119
+ const initialInterval = bounded(retry.initialIntervalMs, fallback.retry.initialRetryInterval, 1, HOUR_MS, 'initialIntervalMs');
120
+ const maxInterval = bounded(retry.maxIntervalMs, Math.max(fallback.retry.maxRetryInterval, initialInterval), initialInterval, DAY_MS, 'maxIntervalMs');
121
+ return Object.freeze({
122
+ retry: Object.freeze({
123
+ ...(maxAttempts === undefined ? {} : { maxRetryAttempts: maxAttempts }),
124
+ ...(maxDuration === undefined ? {} : { maxRetryDuration: maxDuration }),
125
+ initialRetryInterval: initialInterval,
126
+ maxRetryInterval: maxInterval,
127
+ retryIntervalFactor: fallback.retry.retryIntervalFactor,
128
+ }),
129
+ timeoutMs: stepTimeout(declared.timeoutMs, fallback.timeoutMs),
130
+ });
131
+ }
132
+ function stepTimeout(input, fallback) {
133
+ return bounded(input, fallback, 1_000, MAXIMUM_STEP_TIMEOUT_MS, 'Step timeout');
134
+ }
135
+ function optionalBounded(input, minimum, maximum, label) {
136
+ return input === undefined ? undefined : bounded(input, minimum, minimum, maximum, label);
137
+ }
138
+ function bounded(input, fallback, minimum, maximum, label) {
139
+ if (input === undefined)
140
+ return fallback;
141
+ if (!Number.isSafeInteger(input) || input < minimum || input > maximum) {
142
+ invalid(`Durable ${label} must be an integer between ${minimum} and ${maximum}.`);
143
+ }
144
+ return input;
145
+ }
146
+ function invalid(message) {
147
+ throw new TypeError(message);
148
+ }
@@ -0,0 +1,24 @@
1
+ import type { IntegrationClientFactory, Integrations } from '../../application/integration/index.js';
2
+ import type { RuntimeWorkflow } from '../../application/runtime/workflows.js';
3
+ import type { Domain } from '../../platform/schema/index.js';
4
+ import type { Identity } from '../identity/index.js';
5
+ import type { AdmittedDurableServing } from './options.js';
6
+ /** Serves the engine's discovery and invocations of this deployment's durable Workflows. */
7
+ export interface DurableReceiver {
8
+ fetch(request: Request): Promise<Response>;
9
+ }
10
+ /**
11
+ * Route `…/invoke/restate/<Kernel issuer>/<declaration key>/<service>/{discover,invoke/…}` to one
12
+ * engine endpoint. Routes discover
13
+ * their signing authority at the named Kernel; that issuer also binds the run envelope. Each
14
+ * endpoint serves exactly that service with the declared Workflow. A declaration this Release does not
15
+ * serve durably is refused, so an endpoint never runs code it does not declare.
16
+ */
17
+ export declare function createDurableReceiver(input: {
18
+ readonly workflows: readonly RuntimeWorkflow[];
19
+ readonly domain: Domain;
20
+ readonly identity: Identity;
21
+ readonly serving: AdmittedDurableServing;
22
+ /** Integration clients of the initialized Runtime, which every Step holds. */
23
+ readonly integrations: IntegrationClientFactory<Integrations>;
24
+ }): DurableReceiver;
@@ -0,0 +1,99 @@
1
+ import { workflowEngineDiscovery, WorkflowEngineUnavailable } from './discovery.js';
2
+ import { ENGINE_ABORT_TIMEOUT_MS } from './options.js';
3
+ import { durableRoute } from './route.js';
4
+ import { durableHandlers } from './run.js';
5
+ import { sessionSteps } from './steps.js';
6
+ const MAXIMUM_ENDPOINTS = 256;
7
+ /**
8
+ * Route `…/invoke/restate/<Kernel issuer>/<declaration key>/<service>/{discover,invoke/…}` to one
9
+ * engine endpoint. Routes discover
10
+ * their signing authority at the named Kernel; that issuer also binds the run envelope. Each
11
+ * endpoint serves exactly that service with the declared Workflow. A declaration this Release does not
12
+ * serve durably is refused, so an endpoint never runs code it does not declare.
13
+ */
14
+ export function createDurableReceiver(input) {
15
+ const executor = input.identity.executor;
16
+ if (executor === undefined) {
17
+ throw new TypeError('Durable Workflows require an execution Identity that can act as the Domain.');
18
+ }
19
+ const steps = sessionSteps({
20
+ executor: executor.bind(input.identity),
21
+ domain: input.domain,
22
+ integrations: input.integrations,
23
+ });
24
+ const declared = new Map(input.workflows
25
+ .filter((workflow) => workflow.durable)
26
+ .map((workflow) => [workflow.callable.key, workflow]));
27
+ const endpoints = new Map();
28
+ const { engine } = input.serving;
29
+ const discovery = workflowEngineDiscovery(input.serving.fetch);
30
+ return Object.freeze({
31
+ async fetch(request) {
32
+ const route = durableRoute(request);
33
+ if (route === undefined)
34
+ return refused();
35
+ const { kernel, declaration, service } = route;
36
+ const workflow = declared.get(declaration);
37
+ if (workflow === undefined)
38
+ return refused();
39
+ let identityKeys;
40
+ try {
41
+ identityKeys = (await discovery.resolve(kernel)).identity_keys;
42
+ }
43
+ catch (cause) {
44
+ if (!(cause instanceof WorkflowEngineUnavailable))
45
+ throw cause;
46
+ return unavailable();
47
+ }
48
+ request.signal.throwIfAborted();
49
+ const cacheKey = JSON.stringify([kernel, declaration, service, identityKeys]);
50
+ let endpoint = endpoints.get(cacheKey);
51
+ if (endpoint === undefined) {
52
+ const definition = engine.workflow({
53
+ name: service,
54
+ handlers: durableHandlers({
55
+ workflow,
56
+ domain: input.domain,
57
+ serving: input.serving,
58
+ steps,
59
+ kernel,
60
+ }),
61
+ options: {
62
+ workflowRetention: input.serving.retentionMs,
63
+ retryPolicy: input.serving.retryPolicy,
64
+ abortTimeout: ENGINE_ABORT_TIMEOUT_MS,
65
+ },
66
+ });
67
+ try {
68
+ endpoint = engine.createEndpointHandler({
69
+ identityKeys: [...identityKeys],
70
+ services: [definition],
71
+ });
72
+ }
73
+ catch {
74
+ discovery.forget(kernel, identityKeys);
75
+ return unavailable();
76
+ }
77
+ if (endpoints.size >= MAXIMUM_ENDPOINTS)
78
+ endpoints.delete(endpoints.keys().next().value);
79
+ endpoints.set(cacheKey, endpoint);
80
+ }
81
+ const response = await endpoint(request);
82
+ if (response.status === 401)
83
+ discovery.invalidate(kernel, identityKeys);
84
+ return response;
85
+ },
86
+ });
87
+ }
88
+ function refused() {
89
+ return new Response('{"error":"Unknown durable declaration."}', {
90
+ status: 404,
91
+ headers: { 'content-type': 'application/json', 'cache-control': 'no-store' },
92
+ });
93
+ }
94
+ function unavailable() {
95
+ return new Response('{"error":"Workflow engine authority is unavailable."}', {
96
+ status: 503,
97
+ headers: { 'content-type': 'application/json', 'cache-control': 'no-store' },
98
+ });
99
+ }
@@ -0,0 +1,12 @@
1
+ import type { IssuerId } from '../../platform/auth/index.js';
2
+ export interface DurableRoute {
3
+ readonly kernel: IssuerId;
4
+ readonly declaration: string;
5
+ readonly service: string;
6
+ }
7
+ /** Whether the request is owned by the durable receiver, including malformed paths. */
8
+ export declare function isDurableRequest(request: Request): boolean;
9
+ /** Canonical requests discover authority at the HTTPS Kernel named by this admitted route. */
10
+ export declare function isCanonicalDurableRequest(request: Request): boolean;
11
+ /** One wire decoder shared by the receiver and platform lazy-load eligibility. */
12
+ export declare function durableRoute(request: Request): DurableRoute | undefined;
@@ -0,0 +1,35 @@
1
+ import { Key } from '@astrale-os/kernel-dsl/v1/addressing';
2
+ import { invocationPath } from '../../deployment/release/invocation.js';
3
+ import { AuthValueError } from '../../platform/auth/index.js';
4
+ import { httpIssuer } from '../identity/errors.js';
5
+ const PREFIX = `${invocationPath()}/restate/`;
6
+ const SERVICE = /^[A-Za-z_][A-Za-z0-9_]{0,127}$/u;
7
+ /** Whether the request is owned by the durable receiver, including malformed paths. */
8
+ export function isDurableRequest(request) {
9
+ return new URL(request.url).pathname.startsWith(PREFIX);
10
+ }
11
+ /** Canonical requests discover authority at the HTTPS Kernel named by this admitted route. */
12
+ export function isCanonicalDurableRequest(request) {
13
+ return durableRoute(request)?.kernel !== undefined;
14
+ }
15
+ /** One wire decoder shared by the receiver and platform lazy-load eligibility. */
16
+ export function durableRoute(request) {
17
+ const pathname = new URL(request.url).pathname;
18
+ if (!pathname.startsWith(PREFIX))
19
+ return undefined;
20
+ const parts = pathname.slice(PREFIX.length).split('/');
21
+ try {
22
+ const first = decodeURIComponent(parts[0] ?? '');
23
+ const kernel = httpIssuer(first, false);
24
+ const declaration = decodeURIComponent(parts[1] ?? '');
25
+ const service = parts[2] ?? '';
26
+ if (!Key.is(declaration) || !SERVICE.test(service))
27
+ return undefined;
28
+ return Object.freeze({ kernel, declaration, service });
29
+ }
30
+ catch (cause) {
31
+ if (cause instanceof URIError || cause instanceof AuthValueError || cause instanceof TypeError)
32
+ return undefined;
33
+ throw cause;
34
+ }
35
+ }
@@ -0,0 +1,21 @@
1
+ import type { RuntimeWorkflow } from '../../application/runtime/workflows.js';
2
+ import type { IssuerId } from '../../platform/auth/index.js';
3
+ import type { Domain } from '../../platform/schema/index.js';
4
+ import type { EngineSharedContext, EngineWorkflowContext } from './engine.js';
5
+ import type { AdmittedDurableServing } from './options.js';
6
+ import type { StepAuthorities } from './steps.js';
7
+ export interface DurableRun {
8
+ readonly kernel: IssuerId;
9
+ readonly workflow: RuntimeWorkflow;
10
+ readonly domain: Domain;
11
+ readonly serving: AdmittedDurableServing;
12
+ /** What each Step attempt holds. */
13
+ readonly steps: StepAuthorities;
14
+ }
15
+ /** Engine handlers of one durable Workflow: the `run` and the shared `signal`. */
16
+ export declare function durableHandlers(input: DurableRun): Readonly<{
17
+ run: (context: EngineWorkflowContext, raw: unknown) => Promise<import("../../platform/schema/index.js").Value>;
18
+ signal(context: EngineSharedContext, raw: unknown): Promise<{
19
+ accepted: boolean;
20
+ }>;
21
+ }>;
@@ -0,0 +1,321 @@
1
+ import { declaredErrorFactory } from '../../application/error/index.js';
2
+ import { acceptStepId } from '../../application/workflow/step/index.js';
3
+ import { acceptStepOutput } from '../../application/workflow/step/output.js';
4
+ import { ResponseError } from '../../platform/client/index.js';
5
+ import { validateOutput } from '../invocation/result/index.js';
6
+ import { decodeEnvelope } from './envelope.js';
7
+ import { delayedRetry, replayedFailure, StepExhausted, StepRetryAfter, attemptFailure, terminalFailure, } from './failure.js';
8
+ import { stepServing } from './options.js';
9
+ import { keySequence } from './steps.js';
10
+ const MAXIMUM_SLEEP_MS = 365 * 24 * 60 * 60_000;
11
+ const MAXIMUM_SIGNAL_NAME = 128;
12
+ /** Bounds of one `result` wait and of the durable pause between two of them. */
13
+ const AWAIT_WAIT_MS = 10_000;
14
+ const AWAIT_MAXIMUM_PAUSE_MS = 5 * 60_000;
15
+ /** Engine handlers of one durable Workflow: the `run` and the shared `signal`. */
16
+ export function durableHandlers(input) {
17
+ const { engine } = input.serving;
18
+ return Object.freeze({
19
+ run: (context, raw) => run(input, context, raw),
20
+ async signal(context, raw) {
21
+ const request = signalRequest(raw);
22
+ try {
23
+ await context.promise(request.name).resolve(request.value);
24
+ return { accepted: true };
25
+ }
26
+ catch (cause) {
27
+ // The engine refuses to resolve a promise twice with a terminal failure.
28
+ if (cause instanceof engine.TerminalError)
29
+ return { accepted: false };
30
+ throw cause;
31
+ }
32
+ },
33
+ });
34
+ }
35
+ async function run(input, context, raw) {
36
+ const { workflow, serving } = input;
37
+ const { engine } = serving;
38
+ const definition = workflow.definition;
39
+ // A run replays the code of the release that started it, each release at its own URL. Code
40
+ // served in place of it replays the journal: the engine refuses a journal whose Steps no longer
41
+ // match, and code that cannot read what the Kernel recorded fails every attempt; both pause.
42
+ const envelope = admitted(workflow, raw, input.kernel);
43
+ const durable = durableContext(input, context, envelope);
44
+ let output;
45
+ try {
46
+ output = await definition.run(durable);
47
+ }
48
+ catch (cause) {
49
+ throw terminalFailure(engine, cause, definition) ?? cause;
50
+ }
51
+ return validateOutput(workflow.callable, output);
52
+ }
53
+ function admitted(workflow, raw, kernel) {
54
+ const envelope = decodeEnvelope(raw);
55
+ if (envelope.execution.kernel !== kernel) {
56
+ throw new TypeError('Durable envelope Kernel differs from its authenticated endpoint.');
57
+ }
58
+ const diagnostics = workflow.callable.validateInput(envelope.input);
59
+ if (diagnostics.length > 0) {
60
+ throw new TypeError(`Workflow ${workflow.address} cannot read the recorded input.`);
61
+ }
62
+ const instance = 'static' in workflow.callable && workflow.callable.static === false;
63
+ if (instance !== (envelope.execution.receiver !== undefined)) {
64
+ throw new TypeError(`Workflow ${workflow.address} cannot use the recorded receiver.`);
65
+ }
66
+ return envelope;
67
+ }
68
+ function durableContext(input, context, envelope) {
69
+ const { serving, domain, workflow } = input;
70
+ const { engine } = serving;
71
+ const definition = workflow.definition;
72
+ const execution = envelope.execution;
73
+ const signal = context.request().attemptCompletedSignal;
74
+ const steps = new Set();
75
+ let running;
76
+ /**
77
+ * Starts one durable operation, a Step or a wait, once the previous one has settled. The engine
78
+ * follows one awaited operation at a time: operations awaited together through `Promise` combinators
79
+ * make it lose track of the run, which then pauses.
80
+ */
81
+ const sequenced = (operation, start) => {
82
+ if (running !== undefined) {
83
+ return Promise.reject(new TypeError(`Workflow ${operation} started while ${running} runs: durable Steps and waits run one after another.`));
84
+ }
85
+ running = operation;
86
+ let started;
87
+ try {
88
+ started = start();
89
+ }
90
+ catch (cause) {
91
+ running = undefined;
92
+ return Promise.reject(cause);
93
+ }
94
+ return started.finally(() => {
95
+ running = undefined;
96
+ });
97
+ };
98
+ /**
99
+ * One journaled unit of work holding the capabilities of an Action as the Domain alone. Its
100
+ * Mutations, durable calls and Integration calls share one key sequence derived from its name.
101
+ * With a `retry` budget, the engine retries a failed attempt within it, after its backoff or the
102
+ * delay the failure prescribes, and the Step throws `StepExhausted` once it is spent; without
103
+ * one, a failed attempt fails the run's attempt, which the engine retries until it pauses.
104
+ *
105
+ * The engine promise is returned unawaited: awaiting it is what tells the engine the run waits on
106
+ * it, so parallel Steps hand theirs to the engine's own combinator instead.
107
+ */
108
+ const journaled = (id, name, timeoutMs, retry, execute) => context.run(name, async () => {
109
+ const expiry = new AbortController();
110
+ const timer = setTimeout(() => expiry.abort(new Error(`Workflow Step ${id} exceeded its ${timeoutMs} ms timeout.`)), timeoutMs);
111
+ let step;
112
+ try {
113
+ const lifetime = {
114
+ deadline: Date.now() + timeoutMs,
115
+ signal: AbortSignal.any([signal, expiry.signal]),
116
+ };
117
+ const next = await keySequence(execution.id, name);
118
+ const { authority } = (step = input.steps({ name, execution, next, lifetime }));
119
+ const output = await Promise.race([
120
+ Promise.resolve().then(() => execute(authority)),
121
+ expired(expiry.signal),
122
+ ]);
123
+ try {
124
+ return acceptStepOutput(output);
125
+ }
126
+ catch (cause) {
127
+ throw new TypeError(`Workflow ${name} output must be portable.`, { cause });
128
+ }
129
+ }
130
+ catch (cause) {
131
+ throw (terminalFailure(engine, cause, definition) ??
132
+ delayedRetry(engine, cause) ??
133
+ attemptFailure(cause));
134
+ }
135
+ finally {
136
+ clearTimeout(timer);
137
+ step?.close();
138
+ }
139
+ }, retry);
140
+ /** One Step, awaited alone; its failure reaches the Workflow as `replayedFailure` reads it. */
141
+ const journal = (id, name, timeoutMs, retry, execute) => Promise.resolve(journaled(id, name, timeoutMs, retry, execute)).catch((cause) => {
142
+ throw replayedFailure(engine, cause, definition, id) ?? cause;
143
+ });
144
+ const step = (declared, execute) => {
145
+ let accepted;
146
+ try {
147
+ accepted = stepDeclaration(declared, serving.step);
148
+ if (steps.has(accepted.id))
149
+ throw new TypeError(`Workflow Step ${accepted.id} occurs more than once.`);
150
+ }
151
+ catch (cause) {
152
+ return Promise.reject(cause);
153
+ }
154
+ steps.add(accepted.id);
155
+ const { held } = accepted;
156
+ return sequenced(`Step ${accepted.id}`, () => journal(accepted.id, `step:${accepted.id}`, held.timeoutMs, held.retry, execute));
157
+ };
158
+ /**
159
+ * The Steps `declare` declares, started together and awaited through the engine's combinator as
160
+ * one operation. Once all have settled, their outputs in declaration order, or the failure of the
161
+ * first failed one in that order, as that Step alone fails.
162
+ */
163
+ const parallel = (declare) => {
164
+ const declared = new Map();
165
+ const declaration = (id, execute) => {
166
+ const accepted = stepDeclaration(id, serving.step);
167
+ const token = Object.freeze({});
168
+ declared.set(token, { ...accepted, execute });
169
+ return token;
170
+ };
171
+ let group;
172
+ try {
173
+ if (typeof declare !== 'function') {
174
+ throw new TypeError('step.parallel takes a function declaring its Steps.');
175
+ }
176
+ const returned = declare(Object.freeze({
177
+ run: (id, execute) => declaration(id, execute),
178
+ query: (id, query, value) => declaration(id, (authority) => authority.query(query, value)),
179
+ mutate: (id, mutation, value) => declaration(id, (authority) => authority.mutate(mutation, value)),
180
+ }));
181
+ if (!Array.isArray(returned) ||
182
+ returned.length !== declared.size ||
183
+ new Set(returned).size !== returned.length ||
184
+ returned.some((entry) => !declared.has(entry))) {
185
+ throw new TypeError('step.parallel takes exactly the Steps its function declares, each once, as an array.');
186
+ }
187
+ group = returned.map((entry) => declared.get(entry));
188
+ const ids = new Set();
189
+ for (const { id } of group) {
190
+ if (steps.has(id) || ids.has(id)) {
191
+ throw new TypeError(`Workflow Step ${id} occurs more than once.`);
192
+ }
193
+ ids.add(id);
194
+ }
195
+ }
196
+ catch (cause) {
197
+ return Promise.reject(cause);
198
+ }
199
+ if (group.length === 0)
200
+ return Promise.resolve([]);
201
+ for (const { id } of group)
202
+ steps.add(id);
203
+ return sequenced(`parallel Steps ${group.map(({ id }) => id).join(', ')}`, async () => {
204
+ const started = group.map(({ id, held, execute }) => journaled(id, `step:${id}`, held.timeoutMs, held.retry, execute));
205
+ const settled = await engine.RestatePromise.allSettled(started);
206
+ const failed = settled.findIndex(({ status }) => status === 'rejected');
207
+ if (failed === -1) {
208
+ return settled.map((result) => result.value);
209
+ }
210
+ const cause = settled[failed].reason;
211
+ throw replayedFailure(engine, cause, definition, group[failed].id) ?? cause;
212
+ });
213
+ };
214
+ return Object.freeze({
215
+ domain,
216
+ input: envelope.input,
217
+ execution,
218
+ error: declaredErrorFactory(definition),
219
+ step: Object.freeze({
220
+ run: step,
221
+ query: (id, query, value) => step(id, (authority) => authority.query(query, value)),
222
+ mutate: (id, mutation, value) => step(id, (authority) => authority.mutate(mutation, value)),
223
+ parallel,
224
+ }),
225
+ async sleep(durationMs) {
226
+ if (!Number.isSafeInteger(durationMs) || durationMs < 0 || durationMs > MAXIMUM_SLEEP_MS) {
227
+ throw new TypeError(`Durable sleep must be an integer between 0 and ${MAXIMUM_SLEEP_MS} ms.`);
228
+ }
229
+ await sequenced('sleep', () => Promise.resolve(context.sleep(durationMs)));
230
+ },
231
+ async awaitSignal(name, options) {
232
+ if (typeof name !== 'string' || name.length === 0 || name.length > MAXIMUM_SIGNAL_NAME) {
233
+ throw new TypeError('Durable signal name must have 1 to 128 characters.');
234
+ }
235
+ if (options === undefined) {
236
+ return (await sequenced(`wait for signal ${name}`, () => Promise.resolve(context.promise(name).get())));
237
+ }
238
+ const timeoutMs = options?.timeoutMs;
239
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 0 || timeoutMs > MAXIMUM_SLEEP_MS) {
240
+ throw new TypeError(`Durable signal timeout must be an integer between 0 and ${MAXIMUM_SLEEP_MS} ms.`);
241
+ }
242
+ // The engine journals the race between the signal and the timer: a replay settles it alike.
243
+ try {
244
+ const value = await sequenced(`wait for signal ${name}`, () => Promise.resolve(context.promise(name).get().orTimeout(timeoutMs)));
245
+ return Object.freeze({ kind: 'signal', value });
246
+ }
247
+ catch (cause) {
248
+ if (cause instanceof engine.TimeoutError)
249
+ return Object.freeze({ kind: 'timeout' });
250
+ throw cause;
251
+ }
252
+ },
253
+ cancelled: (error) => error instanceof engine.CancelledError,
254
+ exhausted: (error) => error instanceof StepExhausted,
255
+ retryAfter: (delayMs, cause) => new StepRetryAfter(delayMs, cause),
256
+ awaitExecution: (target) => sequenced(`wait for Execution ${target.id}`, async () => {
257
+ for (let poll = 1;; poll++) {
258
+ // A poll is no Step of the author's: it has no budget, so an outage pauses the run instead.
259
+ const name = `await:${target.id}:${poll}`;
260
+ const polled = await journal(name, name, serving.step.timeoutMs, undefined, async ({ kernel }) => {
261
+ try {
262
+ const outcome = await kernel.execution.result(target, {
263
+ waitMs: Math.min(AWAIT_WAIT_MS, Math.floor(serving.step.timeoutMs / 2)),
264
+ });
265
+ return { ended: true, outcome };
266
+ }
267
+ catch (cause) {
268
+ if (cause instanceof ResponseError && cause.reason?.code === 'EXECUTION_PENDING') {
269
+ return { ended: false };
270
+ }
271
+ throw cause;
272
+ }
273
+ });
274
+ if (polled.ended)
275
+ return polled.outcome;
276
+ await context.sleep(Math.min(AWAIT_MAXIMUM_PAUSE_MS, 1_000 * 2 ** Math.min(poll, 16)));
277
+ }
278
+ }),
279
+ ...(execution.receiver === undefined ? {} : { self: execution.receiver }),
280
+ });
281
+ }
282
+ /** Admit a Step's id, and its declared retry budget and timeout over the deployment's. */
283
+ function stepDeclaration(declared, fallback) {
284
+ if (typeof declared === 'string')
285
+ return { id: acceptStepId(declared), held: fallback };
286
+ if (declared === null ||
287
+ typeof declared !== 'object' ||
288
+ Array.isArray(declared) ||
289
+ Reflect.ownKeys(declared).some((key) => key !== 'id' && key !== 'retry' && key !== 'timeoutMs')) {
290
+ throw new TypeError('A Workflow Step declaration takes only id, retry and timeoutMs.');
291
+ }
292
+ return {
293
+ id: acceptStepId(declared.id),
294
+ held: stepServing({ retry: declared.retry, timeoutMs: declared.timeoutMs }, fallback),
295
+ };
296
+ }
297
+ /**
298
+ * Rejects with the abort reason once `signal` aborts, at once if it already has: a timeout may fire
299
+ * while the attempt derives its keys. Never settles otherwise.
300
+ */
301
+ function expired(signal) {
302
+ return new Promise((_, reject) => {
303
+ if (signal.aborted)
304
+ reject(signal.reason);
305
+ else
306
+ signal.addEventListener('abort', () => reject(signal.reason), { once: true });
307
+ });
308
+ }
309
+ function signalRequest(input) {
310
+ if (input === null ||
311
+ typeof input !== 'object' ||
312
+ Array.isArray(input) ||
313
+ typeof input.name !== 'string') {
314
+ throw new TypeError('Durable signal request is invalid.');
315
+ }
316
+ const { name, value } = input;
317
+ if (name.length === 0 || name.length > MAXIMUM_SIGNAL_NAME) {
318
+ throw new TypeError('Durable signal name must have 1 to 128 characters.');
319
+ }
320
+ return { name, value: value ?? null };
321
+ }