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

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 (516) 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 +197 -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/attempts.d.ts +87 -0
  243. package/dist/execution/workflows/attempts.js +205 -0
  244. package/dist/execution/workflows/discovery.d.ts +14 -0
  245. package/dist/execution/workflows/discovery.js +151 -0
  246. package/dist/execution/workflows/engine.d.ts +83 -0
  247. package/dist/execution/workflows/engine.js +1 -0
  248. package/dist/execution/workflows/envelope.d.ts +12 -0
  249. package/dist/execution/workflows/envelope.js +46 -0
  250. package/dist/execution/workflows/failure.d.ts +39 -0
  251. package/dist/execution/workflows/failure.js +143 -0
  252. package/dist/execution/workflows/index.d.ts +4 -0
  253. package/dist/execution/workflows/index.js +3 -0
  254. package/dist/execution/workflows/integrations.d.ts +13 -0
  255. package/dist/execution/workflows/integrations.js +25 -0
  256. package/dist/execution/workflows/options.d.ts +81 -0
  257. package/dist/execution/workflows/options.js +158 -0
  258. package/dist/execution/workflows/receiver.d.ts +24 -0
  259. package/dist/execution/workflows/receiver.js +99 -0
  260. package/dist/execution/workflows/route.d.ts +12 -0
  261. package/dist/execution/workflows/route.js +35 -0
  262. package/dist/execution/workflows/run.d.ts +23 -0
  263. package/dist/execution/workflows/run.js +365 -0
  264. package/dist/execution/workflows/steps.d.ts +48 -0
  265. package/dist/execution/workflows/steps.js +93 -0
  266. package/dist/index.d.ts +4 -4
  267. package/dist/index.js +2 -2
  268. package/dist/platform/graph/alias.d.ts +1 -5
  269. package/dist/platform/graph/alias.js +1 -5
  270. package/dist/platform/graph/document/index.d.ts +1 -1
  271. package/dist/platform/graph/document/index.js +1 -1
  272. package/dist/platform/graph/index.d.ts +1 -1
  273. package/dist/platform/graph/index.js +1 -1
  274. package/dist/platform/release/index.d.ts +2 -0
  275. package/dist/platform/release/index.js +2 -0
  276. package/dist/platform/schema/callable-authoring.d.ts +21 -0
  277. package/dist/platform/schema/callable-authoring.js +27 -0
  278. package/dist/platform/schema/class-authoring.d.ts +61 -11
  279. package/dist/platform/schema/class-authoring.js +37 -4
  280. package/dist/platform/schema/class-icon-svg.d.ts +9 -0
  281. package/dist/platform/schema/class-icon-svg.js +29 -0
  282. package/dist/platform/schema/class-icon.d.ts +3 -8
  283. package/dist/platform/schema/class-icon.js +2 -29
  284. package/dist/platform/schema/index.d.ts +6 -4
  285. package/dist/platform/schema/index.js +2 -1
  286. package/dist/platform/schema/property.d.ts +5 -0
  287. package/dist/platform/schema/schema-authoring.d.ts +14 -7
  288. package/dist/platform/schema/schema-authoring.js +5 -1
  289. package/dist/platform/versioning/dependents.d.ts +18 -0
  290. package/dist/platform/versioning/dependents.js +15 -0
  291. package/dist/platform/versioning/index.d.ts +5 -0
  292. package/dist/platform/versioning/index.js +5 -0
  293. package/dist/platform/versioning/name.d.ts +38 -0
  294. package/dist/platform/versioning/name.js +58 -0
  295. package/dist/platform/versioning/reference.d.ts +48 -0
  296. package/dist/platform/versioning/reference.js +95 -0
  297. package/dist/platform/versioning/version.d.ts +72 -0
  298. package/dist/platform/versioning/version.js +98 -0
  299. package/dist/project/admit.js +1 -5
  300. package/dist/project/define.d.ts +4 -4
  301. package/dist/project/define.js +55 -35
  302. package/dist/project/index.d.ts +1 -1
  303. package/dist/project/install-command.d.ts +6 -0
  304. package/dist/project/install-command.js +9 -0
  305. package/dist/project/project.d.ts +10 -8
  306. package/dist/testing/dataset/define.d.ts +1 -1
  307. package/dist/testing/durable/engine.d.ts +128 -0
  308. package/dist/testing/durable/engine.js +619 -0
  309. package/dist/testing/durable/index.d.ts +3 -0
  310. package/dist/testing/durable/index.js +1 -0
  311. package/dist/testing/durable/steps.d.ts +30 -0
  312. package/dist/testing/durable/steps.js +45 -0
  313. package/dist/testing/index.d.ts +6 -1
  314. package/dist/testing/index.js +5 -1
  315. package/dist/testing/load.js +1 -1
  316. package/dist/tooling/cli/adapter-command.d.ts +35 -0
  317. package/dist/tooling/cli/adapter-command.js +66 -0
  318. package/dist/tooling/cli/arguments.d.ts +17 -6
  319. package/dist/tooling/cli/arguments.js +175 -52
  320. package/dist/tooling/cli/build.d.ts +55 -0
  321. package/dist/tooling/cli/build.js +77 -0
  322. package/dist/tooling/cli/bun.d.ts +0 -1
  323. package/dist/tooling/cli/bun.js +0 -7
  324. package/dist/tooling/cli/commit.d.ts +35 -0
  325. package/dist/tooling/cli/commit.js +235 -0
  326. package/dist/tooling/cli/deploy-mode.d.ts +26 -0
  327. package/dist/tooling/cli/deploy-mode.js +59 -0
  328. package/dist/tooling/cli/deploy-result.d.ts +80 -0
  329. package/dist/tooling/cli/deploy-result.js +64 -0
  330. package/dist/tooling/cli/diff/declared.d.ts +7 -0
  331. package/dist/tooling/cli/diff/declared.js +27 -0
  332. package/dist/tooling/cli/diff/index.d.ts +30 -0
  333. package/dist/tooling/cli/diff/index.js +58 -0
  334. package/dist/tooling/cli/diff/render.d.ts +15 -0
  335. package/dist/tooling/cli/diff/render.js +131 -0
  336. package/dist/tooling/cli/diff/report.d.ts +88 -0
  337. package/dist/tooling/cli/diff/report.js +154 -0
  338. package/dist/tooling/cli/dotenv.d.ts +5 -5
  339. package/dist/tooling/cli/dotenv.js +6 -36
  340. package/dist/tooling/cli/help.js +173 -60
  341. package/dist/tooling/cli/immutable-deployment.d.ts +83 -0
  342. package/dist/tooling/cli/immutable-deployment.js +135 -0
  343. package/dist/tooling/cli/index.d.ts +12 -4
  344. package/dist/tooling/cli/index.js +6 -3
  345. package/dist/tooling/cli/installed-on.d.ts +83 -0
  346. package/dist/tooling/cli/installed-on.js +156 -0
  347. package/dist/tooling/cli/list.d.ts +152 -0
  348. package/dist/tooling/cli/list.js +331 -0
  349. package/dist/tooling/cli/log.d.ts +5 -2
  350. package/dist/tooling/cli/log.js +9 -2
  351. package/dist/tooling/cli/orchestrate.d.ts +0 -6
  352. package/dist/tooling/cli/orchestrate.js +246 -90
  353. package/dist/tooling/cli/project.d.ts +3 -3
  354. package/dist/tooling/cli/publish/index.d.ts +81 -0
  355. package/dist/tooling/cli/publish/index.js +383 -0
  356. package/dist/tooling/cli/publish/report.d.ts +49 -0
  357. package/dist/tooling/cli/publish/report.js +15 -0
  358. package/dist/tooling/cli/registry/client.d.ts +121 -0
  359. package/dist/tooling/cli/registry/client.js +354 -0
  360. package/dist/tooling/cli/registry/error.d.ts +11 -0
  361. package/dist/tooling/cli/registry/error.js +17 -0
  362. package/dist/tooling/cli/registry/executable.d.ts +35 -0
  363. package/dist/tooling/cli/registry/executable.js +96 -0
  364. package/dist/tooling/cli/registry/index.d.ts +9 -0
  365. package/dist/tooling/cli/registry/index.js +8 -0
  366. package/dist/tooling/cli/registry/installations.d.ts +67 -0
  367. package/dist/tooling/cli/registry/installations.js +108 -0
  368. package/dist/tooling/cli/registry/process.d.ts +36 -0
  369. package/dist/tooling/cli/registry/process.js +119 -0
  370. package/dist/tooling/cli/secrets.d.ts +9 -0
  371. package/dist/tooling/cli/secrets.js +19 -0
  372. package/dist/tooling/cli/yank.d.ts +34 -0
  373. package/dist/tooling/cli/yank.js +32 -0
  374. package/dist/tooling/linter/adapters/typescript/imports.d.ts +0 -1
  375. package/dist/tooling/linter/adapters/typescript/imports.js +1 -5
  376. package/dist/tooling/linter/adapters/typescript/index.d.ts +1 -1
  377. package/dist/tooling/linter/adapters/typescript/index.js +1 -1
  378. package/dist/tooling/linter/adapters/typescript/syntax.d.ts +3 -3
  379. package/dist/tooling/linter/adapters/typescript/syntax.js +13 -25
  380. package/dist/tooling/linter/implementations/source/callable-requirements.d.ts +1 -2
  381. package/dist/tooling/linter/implementations/source/callable-requirements.js +11 -16
  382. package/dist/tooling/linter/implementations/source/dependencies.js +13 -72
  383. package/dist/tooling/linter/implementations/source/global.js +1 -2
  384. package/dist/tooling/linter/implementations/source/mutations.js +18 -29
  385. package/dist/tooling/linter/implementations/source/providers.js +5 -5
  386. package/dist/tooling/linter/implementations/source/queries.js +1 -17
  387. package/dist/tooling/linter/implementations/source/shared.d.ts +12 -4
  388. package/dist/tooling/linter/implementations/source/shared.js +101 -46
  389. package/dist/tooling/linter/implementations/source/verifiers.js +0 -2
  390. package/dist/tooling/linter/implementations/source/views.js +2 -2
  391. package/dist/tooling/linter/implementations/source/workflows.js +499 -17
  392. package/dist/tooling/linter/policy/generated.js +14 -63
  393. package/dist/tooling/linter/requirements/registry.js +6 -8
  394. package/dist/tooling/packaging/declarations/ownership.js +1 -1
  395. package/dist/tooling/packaging/finalize.d.ts +1 -1
  396. package/dist/tooling/packaging/finalize.js +1 -1
  397. package/docs/admission-age.md +88 -0
  398. package/docs/auth-api-migration.md +55 -0
  399. package/docs/business-errors.md +42 -0
  400. package/docs/domain-definition-migration.md +44 -0
  401. package/docs/domain-schema-migration.md +36 -0
  402. package/docs/durable-workflows.md +445 -0
  403. package/docs/handler-dependencies.md +213 -0
  404. package/docs/release.md +155 -0
  405. package/docs/schema-cost.md +124 -0
  406. package/package.json +45 -16
  407. package/dist/application/application.d.ts +0 -28
  408. package/dist/application/query/execution/projection.d.ts +0 -3
  409. package/dist/application/query/execution/projection.js +0 -3
  410. package/dist/deployment/adapter/deploy/context.d.ts +0 -15
  411. package/dist/deployment/adapter/deploy/index.d.ts +0 -2
  412. package/dist/deployment/adapter/deploy/result.d.ts +0 -50
  413. package/dist/deployment/adapter/prepare/artifact.d.ts +0 -33
  414. package/dist/deployment/adapter/prepare/context.d.ts +0 -23
  415. package/dist/deployment/adapter/prepare/index.d.ts +0 -2
  416. package/dist/deployment/deploy.d.ts +0 -20
  417. package/dist/deployment/deploy.js +0 -31
  418. package/dist/deployment/release/publication/index.d.ts +0 -6
  419. package/dist/deployment/release/publication/index.js +0 -6
  420. package/dist/deployment/release/publication/manifest.d.ts +0 -3
  421. package/dist/deployment/release/publication/manifest.js +0 -5
  422. package/dist/deployment/release/publication/requirements.d.ts +0 -3
  423. package/dist/deployment/release/publication/requirements.js +0 -3
  424. package/dist/deployment/release/publication/seal.d.ts +0 -10
  425. package/dist/deployment/release/publication/seal.js +0 -39
  426. package/dist/deployment/verify/preflight/artifact.d.ts +0 -6
  427. package/dist/deployment/verify/preflight/artifact.js +0 -122
  428. package/dist/deployment/verify/preflight/publication.d.ts +0 -4
  429. package/dist/deployment/verify/preflight/publication.js +0 -14
  430. package/dist/deployment/verify/readiness/deployment.d.ts +0 -3
  431. package/dist/deployment/verify/readiness/deployment.js +0 -151
  432. package/dist/deployment/verify/readiness/publication.d.ts +0 -11
  433. package/dist/deployment/verify/readiness/publication.js +0 -41
  434. package/dist/execution/service/errors.d.ts +0 -3
  435. package/dist/execution/service/errors.js +0 -3
  436. package/dist/execution/service/publication/delivery.d.ts +0 -2
  437. package/dist/execution/service/publication/installation.d.ts +0 -3
  438. package/dist/execution/service/publication/installation.js +0 -8
  439. package/dist/execution/service/publication/source.d.ts +0 -3
  440. package/dist/execution/service/publication/source.js +0 -11
  441. package/dist/platform/publication/index.d.ts +0 -2
  442. package/dist/platform/publication/index.js +0 -2
  443. package/dist/tooling/cli/astrale/authority.d.ts +0 -5
  444. package/dist/tooling/cli/astrale/authority.js +0 -11
  445. package/dist/tooling/cli/astrale/executable.d.ts +0 -2
  446. package/dist/tooling/cli/astrale/executable.js +0 -47
  447. package/dist/tooling/cli/astrale/failure.d.ts +0 -6
  448. package/dist/tooling/cli/astrale/failure.js +0 -48
  449. package/dist/tooling/cli/astrale/instance.d.ts +0 -11
  450. package/dist/tooling/cli/astrale/instance.js +0 -52
  451. package/dist/tooling/cli/astrale/process.d.ts +0 -13
  452. package/dist/tooling/cli/astrale/process.js +0 -94
  453. package/dist/tooling/cli/astrale/version.d.ts +0 -18
  454. package/dist/tooling/cli/astrale/version.js +0 -55
  455. package/dist/tooling/cli/credential.d.ts +0 -2
  456. package/dist/tooling/cli/credential.js +0 -57
  457. package/dist/tooling/cli/deprecations.d.ts +0 -9
  458. package/dist/tooling/cli/deprecations.js +0 -15
  459. package/dist/tooling/cli/development/candidate.d.ts +0 -25
  460. package/dist/tooling/cli/development/candidate.js +0 -176
  461. package/dist/tooling/cli/development/deployment.d.ts +0 -16
  462. package/dist/tooling/cli/development/deployment.js +0 -39
  463. package/dist/tooling/cli/development/develop.d.ts +0 -11
  464. package/dist/tooling/cli/development/develop.js +0 -243
  465. package/dist/tooling/cli/development/lease.d.ts +0 -18
  466. package/dist/tooling/cli/development/lease.js +0 -163
  467. package/dist/tooling/cli/development/lifecycle.d.ts +0 -9
  468. package/dist/tooling/cli/development/lifecycle.js +0 -43
  469. package/dist/tooling/cli/development/project-imports.d.ts +0 -22
  470. package/dist/tooling/cli/development/project-imports.js +0 -39
  471. package/dist/tooling/cli/development/project-lock.d.ts +0 -16
  472. package/dist/tooling/cli/development/project-lock.js +0 -41
  473. package/dist/tooling/cli/development/rebuild.d.ts +0 -13
  474. package/dist/tooling/cli/development/rebuild.js +0 -58
  475. package/dist/tooling/cli/development/release-evidence.d.ts +0 -4
  476. package/dist/tooling/cli/development/release-evidence.js +0 -10
  477. package/dist/tooling/cli/development/report.d.ts +0 -6
  478. package/dist/tooling/cli/development/report.js +0 -14
  479. package/dist/tooling/cli/development/session-file.d.ts +0 -53
  480. package/dist/tooling/cli/development/session-file.js +0 -337
  481. package/dist/tooling/cli/development/source-watch.d.ts +0 -14
  482. package/dist/tooling/cli/development/source-watch.js +0 -140
  483. package/dist/tooling/cli/development/sources.d.ts +0 -7
  484. package/dist/tooling/cli/development/sources.js +0 -48
  485. package/dist/tooling/cli/development/target-lock.d.ts +0 -16
  486. package/dist/tooling/cli/development/target-lock.js +0 -68
  487. package/dist/tooling/cli/development/view.d.ts +0 -28
  488. package/dist/tooling/cli/development/view.js +0 -151
  489. package/dist/tooling/cli/environment-release.d.ts +0 -21
  490. package/dist/tooling/cli/environment-release.js +0 -46
  491. package/dist/tooling/cli/evidence.d.ts +0 -11
  492. package/dist/tooling/cli/evidence.js +0 -53
  493. package/dist/tooling/cli/installation/index.d.ts +0 -2
  494. package/dist/tooling/cli/installation/index.js +0 -1
  495. package/dist/tooling/cli/installation/observation.d.ts +0 -10
  496. package/dist/tooling/cli/installation/observation.js +0 -44
  497. package/dist/tooling/cli/installation/reconcile.d.ts +0 -32
  498. package/dist/tooling/cli/installation/reconcile.js +0 -122
  499. package/dist/tooling/linter/implementations/source/migrations.d.ts +0 -2
  500. package/dist/tooling/linter/implementations/source/migrations.js +0 -113
  501. package/dist/tooling/linter/qualification/index.d.ts +0 -10
  502. package/dist/tooling/linter/qualification/index.js +0 -2
  503. package/dist/tooling/linter/qualification/query-fixtures.d.ts +0 -2
  504. package/dist/tooling/linter/qualification/query-fixtures.js +0 -68
  505. package/dist/tooling/linter/qualification/runner.d.ts +0 -3
  506. package/dist/tooling/linter/qualification/runner.js +0 -6
  507. /package/dist/application/{application.js → domain.js} +0 -0
  508. /package/dist/{deployment/adapter/deploy/context.js → application/workflow/durable.js} +0 -0
  509. /package/dist/deployment/adapter/{deploy/index.js → bundle/bundle.js} +0 -0
  510. /package/dist/deployment/adapter/{deploy/result.js → bundle/file.js} +0 -0
  511. /package/dist/deployment/adapter/{prepare → bundle}/index.js +0 -0
  512. /package/dist/deployment/adapter/{prepare/artifact.js → release/command.js} +0 -0
  513. /package/dist/deployment/adapter/{prepare → release}/context.js +0 -0
  514. /package/dist/deployment/release/{publication → served}/routes.d.ts +0 -0
  515. /package/dist/deployment/release/{publication → served}/routes.js +0 -0
  516. /package/dist/execution/service/{publication → serving}/index.js +0 -0
@@ -0,0 +1,87 @@
1
+ import type { DurableEngine } from './engine.js';
2
+ import type { KernelRefusal } from './failure.js';
3
+ import type { StepRetryBudget } from './options.js';
4
+ /**
5
+ * What the failure of one Step attempt means for its Step, read from protocol facts alone:
6
+ *
7
+ * - `permanent`: the Kernel refused a request that cannot succeed sent again unchanged. The Step
8
+ * fails at once.
9
+ * - `platform`: the Kernel or the way to it was unavailable, and sending the request again repeats
10
+ * no effect. The Step waits and tries again without spending an attempt, bounded only by its
11
+ * `maxDurationMs` and by cancellation. An attempt after an unkeyed `invoke` that may have run,
12
+ * which the next attempt sends again, is never one: it spends an attempt.
13
+ * - `own`: anything else, the Step's code, a Provider, or a refusal whose retry meaning the Kernel
14
+ * leaves open. The attempt spends one of the Step's attempts.
15
+ */
16
+ export type AttemptFailureKind = 'permanent' | 'platform' | 'own';
17
+ /** One failed Step attempt, as its journal entry records it. */
18
+ export interface FailedAttempt {
19
+ readonly kind: AttemptFailureKind;
20
+ /** The delay the failure prescribes: a Kernel `retryAfterMs`, or the Step's own `retryAfter`. */
21
+ readonly delayMs?: number;
22
+ readonly refusal?: KernelRefusal;
23
+ /** When the attempt started and ended, on the run's clock. */
24
+ readonly startedAt: number;
25
+ readonly endedAt: number;
26
+ }
27
+ /** What the failed attempts of one Step spent so far. */
28
+ export interface StepSpending {
29
+ /** The start of the Step's first attempt, from which `maxDurationMs` runs. */
30
+ readonly startedAt: number;
31
+ /** Attempts that failed for the Step's own reason. */
32
+ readonly attempts: number;
33
+ /** Platform failures since the Step's last own failure, which space the next platform wait. */
34
+ readonly unavailable: number;
35
+ }
36
+ /** How a Step goes on after a failed attempt. */
37
+ export type NextAttempt = {
38
+ readonly kind: 'retry';
39
+ readonly delayMs: number;
40
+ /** A wait for the platform, or the backoff of an own failure. */
41
+ readonly wait: typeof UNAVAILABLE | typeof BACKOFF;
42
+ readonly spending: StepSpending;
43
+ } | {
44
+ readonly kind: 'exhausted';
45
+ readonly refusal?: KernelRefusal;
46
+ };
47
+ /** Name prefix of the durable wait before the attempt that follows an own failure. */
48
+ export declare const BACKOFF = "retry";
49
+ /** Name prefix of the durable wait before the attempt that follows a platform failure. */
50
+ export declare const UNAVAILABLE = "unavailable";
51
+ /**
52
+ * The outcome of a Kernel call that repeats no effect when sent again, a read or a call carrying
53
+ * its idempotency key: its failure lets the Step tell an unreachable Kernel from its own failure.
54
+ */
55
+ export declare function resendableCall<Output>(call: () => Output): Output;
56
+ /**
57
+ * The outcome of a Kernel call that runs its effect again when sent again, an `invoke` without a
58
+ * key: `ran` hears that the call may have run, unless its failure proves it did not.
59
+ */
60
+ export declare function unkeyedCall<Output>(call: () => Promise<Output>, ran: () => void): Promise<Output>;
61
+ /**
62
+ * Classify the failure of one Step attempt, a declared error excepted, by the first Kernel answer or
63
+ * transport failure among its causes, and name the Kernel refusal behind it, if any.
64
+ */
65
+ export declare function classifyFailure(cause: unknown): Pick<FailedAttempt, 'kind' | 'delayMs' | 'refusal'>;
66
+ /**
67
+ * The terminal failure a Step attempt hands the engine for `cause`: the engine journals it as the
68
+ * attempt's outcome, so the Step decides whether to go on from the journal alone, live and on
69
+ * replay. Its message starts with the Kernel refusal's codes, if any, and is bounded.
70
+ * `repeatsEffects` says whether the attempt ran a request the next attempt runs again with its
71
+ * effect, so an outage never repeats that effect beyond the Step's budget.
72
+ */
73
+ export declare function failedAttemptError(engine: DurableEngine, cause: unknown, startedAt: number, endedAt: number, repeatsEffects: boolean): Error;
74
+ /** The failed attempt a journaled `run` outcome records, if it records one. */
75
+ export declare function failedAttemptOf(engine: DurableEngine, outcome: unknown): FailedAttempt | undefined;
76
+ /**
77
+ * How a Step goes on after `failed`, given what its earlier attempts spent:
78
+ *
79
+ * - A permanent failure exhausts the Step at once.
80
+ * - An own failure spends an attempt; the next one waits the delay the failure prescribes, or the
81
+ * Step's backoff over its own failures.
82
+ * - A platform failure spends no attempt; the next one waits the longer of the delay the Kernel
83
+ * prescribes and the Step's backoff over its platform failures since its last own one, so a long
84
+ * outage costs one attempt per `maxIntervalMs`.
85
+ * - Either way, a failure at or past `maxDurationMs` from the Step's first attempt exhausts it.
86
+ */
87
+ export declare function nextAttempt(spent: StepSpending | undefined, failed: FailedAttempt, budget: StepRetryBudget): NextAttempt;
@@ -0,0 +1,205 @@
1
+ import { ClientError, ResponseError, TransportError, isExpectationMismatch, isMaintenanceSessionStale, isSnapshotStale, retryAfterOf, } from '../../platform/client/index.js';
2
+ import { attemptMessage, kernelRefusalOf, StepRetryAfter } from './failure.js';
3
+ /** Name prefix of the durable wait before the attempt that follows an own failure. */
4
+ export const BACKOFF = 'retry';
5
+ /** Name prefix of the durable wait before the attempt that follows a platform failure. */
6
+ export const UNAVAILABLE = 'unavailable';
7
+ /** Metadata key under which a failed attempt's journal entry records its `FailedAttempt`. */
8
+ const ATTEMPT = 'astrale.attempt';
9
+ /** The longest message a failed attempt's journal entry keeps, so an outage journals little. */
10
+ const MAXIMUM_MESSAGE = 1_024;
11
+ /** How deep a failure's causes are searched for the call that failed. */
12
+ const MAXIMUM_CAUSE_DEPTH = 8;
13
+ /**
14
+ * Kernel refusals that name a request that cannot succeed sent again unchanged: a malformed or
15
+ * unsupported request, or a Domain meaning this Instance does not serve.
16
+ */
17
+ const PERMANENT_CODES = new Set([
18
+ 1001, // PARSE_ERROR
19
+ 1002, // INVALID_REQUEST
20
+ 3003, // METHOD_NOT_ALLOWED
21
+ 4002, // UNSUPPORTED
22
+ ]);
23
+ const OUTCOME_UNKNOWN = 5002;
24
+ /** HTTP answers without an invocation response that say the server took no work. */
25
+ const UNAVAILABLE_STATUS = /^(?:429|502|503)$/u;
26
+ const STATUS_OF_ANSWER = /^server returned HTTP (\d{3}) without an invocation response\.$/u;
27
+ const STATUS_OF_DISCOVERY = /^Release discovery returned HTTP (\d{3})\.$/u;
28
+ /** Failures of Kernel calls that send again without repeating an effect: reads and keyed calls. */
29
+ const resendable = new WeakSet();
30
+ /**
31
+ * The outcome of a Kernel call that repeats no effect when sent again, a read or a call carrying
32
+ * its idempotency key: its failure lets the Step tell an unreachable Kernel from its own failure.
33
+ */
34
+ export function resendableCall(call) {
35
+ let output;
36
+ try {
37
+ output = call();
38
+ }
39
+ catch (cause) {
40
+ markResendable(cause);
41
+ throw cause;
42
+ }
43
+ if (!(output instanceof Promise))
44
+ return output;
45
+ return output.catch((cause) => {
46
+ markResendable(cause);
47
+ throw cause;
48
+ });
49
+ }
50
+ function markResendable(cause) {
51
+ if (cause !== null && typeof cause === 'object')
52
+ resendable.add(cause);
53
+ }
54
+ /**
55
+ * The outcome of a Kernel call that runs its effect again when sent again, an `invoke` without a
56
+ * key: `ran` hears that the call may have run, unless its failure proves it did not.
57
+ */
58
+ export function unkeyedCall(call, ran) {
59
+ const failed = (cause) => {
60
+ // For a call sent without a key, only a failure that proves nothing ran is the platform's.
61
+ if (classifyFailure(cause).kind !== 'platform')
62
+ ran();
63
+ throw cause;
64
+ };
65
+ let output;
66
+ try {
67
+ output = call();
68
+ }
69
+ catch (cause) {
70
+ return failed(cause);
71
+ }
72
+ return Promise.resolve(output).then((value) => {
73
+ ran();
74
+ return value;
75
+ }, failed);
76
+ }
77
+ /**
78
+ * Classify the failure of one Step attempt, a declared error excepted, by the first Kernel answer or
79
+ * transport failure among its causes, and name the Kernel refusal behind it, if any.
80
+ */
81
+ export function classifyFailure(cause) {
82
+ const refusal = kernelRefusalOf(cause);
83
+ const named = refusal === undefined ? {} : { refusal };
84
+ if (cause instanceof StepRetryAfter)
85
+ return { kind: 'own', delayMs: cause.delayMs, ...named };
86
+ let resent = false;
87
+ let current = cause;
88
+ for (let depth = 0; depth < MAXIMUM_CAUSE_DEPTH; depth += 1) {
89
+ if (current === null || typeof current !== 'object')
90
+ break;
91
+ resent ||= resendable.has(current);
92
+ if (current instanceof ResponseError)
93
+ return { ...refusalKind(current, resent), ...named };
94
+ if (current instanceof TransportError)
95
+ return { kind: transportKind(current, resent), ...named };
96
+ if (current instanceof ClientError && unavailableStatus(STATUS_OF_DISCOVERY, current.message)) {
97
+ // Release discovery is a read the Kernel's own server failed to answer.
98
+ return { kind: 'platform', ...named };
99
+ }
100
+ current = current.cause;
101
+ }
102
+ return { kind: 'own', ...named };
103
+ }
104
+ function refusalKind(error, resent) {
105
+ // Read before the refusal guards, which narrow a `ResponseError` they reject to nothing.
106
+ const { code } = error;
107
+ // Capacity, draining and maintenance: refused before any work was admitted.
108
+ const delayMs = retryAfterOf(error);
109
+ if (delayMs !== undefined)
110
+ return { kind: 'platform', delayMs };
111
+ // A sealed conflict whose snapshot advanced ran nothing, and may be sent again at once.
112
+ if (isSnapshotStale(error))
113
+ return { kind: 'platform' };
114
+ if (PERMANENT_CODES.has(code) ||
115
+ isExpectationMismatch(error) ||
116
+ isMaintenanceSessionStale(error)) {
117
+ return { kind: 'permanent' };
118
+ }
119
+ // The Kernel asks not to send again an unknown outcome automatically, unless its key replays it.
120
+ if (code === OUTCOME_UNKNOWN && resent)
121
+ return { kind: 'platform' };
122
+ return { kind: 'own' };
123
+ }
124
+ /**
125
+ * A transport failure is the platform's when it is no local bound or deadline, and its request
126
+ * provably did not reach the Kernel or repeats no effect when sent again.
127
+ */
128
+ function transportKind(error, resent) {
129
+ // A deadline may be the request's own cost: it spends an attempt, as any slow attempt does.
130
+ if (error.phase === 'timeout')
131
+ return 'own';
132
+ // A failure with neither a network cause nor an unavailable answer is a local bound.
133
+ const network = error.cause !== undefined || unavailableStatus(STATUS_OF_ANSWER, error.message);
134
+ if (!network)
135
+ return 'own';
136
+ if (error.context.kind === 'acquisition')
137
+ return 'platform';
138
+ return error.context.delivery === 'not-sent' || resent ? 'platform' : 'own';
139
+ }
140
+ function unavailableStatus(pattern, message) {
141
+ const status = pattern.exec(message)?.[1];
142
+ return status !== undefined && UNAVAILABLE_STATUS.test(status);
143
+ }
144
+ /**
145
+ * The terminal failure a Step attempt hands the engine for `cause`: the engine journals it as the
146
+ * attempt's outcome, so the Step decides whether to go on from the journal alone, live and on
147
+ * replay. Its message starts with the Kernel refusal's codes, if any, and is bounded.
148
+ * `repeatsEffects` says whether the attempt ran a request the next attempt runs again with its
149
+ * effect, so an outage never repeats that effect beyond the Step's budget.
150
+ */
151
+ export function failedAttemptError(engine, cause, startedAt, endedAt, repeatsEffects) {
152
+ const classified = classifyFailure(cause);
153
+ const kind = repeatsEffects && classified.kind === 'platform' ? 'own' : classified.kind;
154
+ const failed = { ...classified, kind, startedAt, endedAt };
155
+ const message = attemptMessage(cause);
156
+ const error = new engine.TerminalError(message.length > MAXIMUM_MESSAGE ? `${message.slice(0, MAXIMUM_MESSAGE - 1)}…` : message, { metadata: { [ATTEMPT]: JSON.stringify(failed) } });
157
+ // Kept on the live error only: what the attempt threw, for a test engine to show.
158
+ Object.defineProperty(error, 'cause', { value: cause, configurable: true, writable: true });
159
+ return error;
160
+ }
161
+ /** The failed attempt a journaled `run` outcome records, if it records one. */
162
+ export function failedAttemptOf(engine, outcome) {
163
+ if (!(outcome instanceof engine.TerminalError) || outcome instanceof engine.CancelledError) {
164
+ return undefined;
165
+ }
166
+ const encoded = outcome.metadata?.[ATTEMPT];
167
+ return encoded === undefined ? undefined : JSON.parse(encoded);
168
+ }
169
+ /**
170
+ * How a Step goes on after `failed`, given what its earlier attempts spent:
171
+ *
172
+ * - A permanent failure exhausts the Step at once.
173
+ * - An own failure spends an attempt; the next one waits the delay the failure prescribes, or the
174
+ * Step's backoff over its own failures.
175
+ * - A platform failure spends no attempt; the next one waits the longer of the delay the Kernel
176
+ * prescribes and the Step's backoff over its platform failures since its last own one, so a long
177
+ * outage costs one attempt per `maxIntervalMs`.
178
+ * - Either way, a failure at or past `maxDurationMs` from the Step's first attempt exhausts it.
179
+ */
180
+ export function nextAttempt(spent, failed, budget) {
181
+ const refusal = failed.refusal === undefined ? {} : { refusal: failed.refusal };
182
+ if (failed.kind === 'permanent')
183
+ return { kind: 'exhausted', ...refusal };
184
+ const startedAt = spent?.startedAt ?? failed.startedAt;
185
+ const own = failed.kind === 'own';
186
+ const attempts = (spent?.attempts ?? 0) + (own ? 1 : 0);
187
+ const unavailable = own ? 0 : (spent?.unavailable ?? 0) + 1;
188
+ if ((budget.maxAttempts !== undefined && attempts >= budget.maxAttempts) ||
189
+ (budget.maxDurationMs !== undefined && failed.endedAt - startedAt >= budget.maxDurationMs)) {
190
+ return { kind: 'exhausted', ...refusal };
191
+ }
192
+ const delayMs = own
193
+ ? (failed.delayMs ?? backoff(budget, attempts))
194
+ : Math.max(failed.delayMs ?? 0, backoff(budget, unavailable));
195
+ return {
196
+ kind: 'retry',
197
+ delayMs,
198
+ wait: own ? BACKOFF : UNAVAILABLE,
199
+ spending: { startedAt, attempts, unavailable },
200
+ };
201
+ }
202
+ /** The `failures`-th wait of a capped exponential backoff, the first one `initialIntervalMs`. */
203
+ function backoff(budget, failures) {
204
+ return Math.min(budget.maxIntervalMs, budget.initialIntervalMs * budget.intervalFactor ** (failures - 1));
205
+ }
@@ -0,0 +1,14 @@
1
+ import type { Fetch } from '@astrale-os/kernel-client';
2
+ import type { WorkflowEngine } from '@astrale-os/kernel-protocol/issuer/workflow-engine';
3
+ /** Discovery failure never admits static keys for an issuer-prefixed request. */
4
+ export declare class WorkflowEngineUnavailable extends Error {
5
+ readonly name = "WorkflowEngineUnavailable";
6
+ }
7
+ /** One receiver retains bounded, recently admitted engine authority and deduplicates refreshes. */
8
+ export declare function workflowEngineDiscovery(fetch: Fetch, now?: () => number): Readonly<{
9
+ resolve(issuer: string): Promise<WorkflowEngine>;
10
+ /** A crypto provider rejected this authority; the next request must discover it again. */
11
+ forget(issuer: string, observedKeys: readonly string[]): void;
12
+ /** Authentication refusal expires the basis for the next request, without replaying its body. */
13
+ invalidate(issuer: string, observedKeys: readonly string[]): void;
14
+ }>;
@@ -0,0 +1,151 @@
1
+ import { paths } from '@astrale-os/kernel-protocol/issuer/paths';
2
+ import { acceptWorkflowEngine } from '@astrale-os/kernel-protocol/issuer/workflow-engine';
3
+ const MAXIMUM_BYTES = 16 * 1024;
4
+ const MAXIMUM_ISSUERS = 64;
5
+ const TTL_MS = 60_000;
6
+ const TIMEOUT_MS = 10_000;
7
+ /** Discovery failure never admits static keys for an issuer-prefixed request. */
8
+ export class WorkflowEngineUnavailable extends Error {
9
+ name = 'WorkflowEngineUnavailable';
10
+ }
11
+ /** One receiver retains bounded, recently admitted engine authority and deduplicates refreshes. */
12
+ export function workflowEngineDiscovery(fetch, now = Date.now) {
13
+ const bases = new Map();
14
+ return Object.freeze({
15
+ async resolve(issuer) {
16
+ const basis = bases.get(issuer);
17
+ if (basis?.pending !== undefined)
18
+ return basis.pending;
19
+ const observedAt = now();
20
+ if (basis?.engine !== undefined &&
21
+ observedAt >= basis.expiresAt - TTL_MS &&
22
+ observedAt < basis.expiresAt)
23
+ return basis.engine;
24
+ if (basis === undefined) {
25
+ if (bases.size >= MAXIMUM_ISSUERS) {
26
+ // Pending requests retain their slot; arbitrary issuers cannot exceed the concurrency cap.
27
+ const oldest = [...bases].find(([, value]) => value.pending === undefined);
28
+ if (oldest === undefined)
29
+ throw new WorkflowEngineUnavailable('Engine discovery is busy.');
30
+ bases.delete(oldest[0]);
31
+ }
32
+ }
33
+ // A refresh owns a new basis, so a late rejection of old keys cannot discard pending work.
34
+ const selected = {
35
+ expiresAt: 0,
36
+ ...(basis?.rejectedAt === undefined ? {} : { rejectedAt: basis.rejectedAt }),
37
+ };
38
+ bases.set(issuer, selected);
39
+ const pending = discover(fetch, issuer)
40
+ .then((engine) => {
41
+ selected.engine = engine;
42
+ selected.expiresAt = now() + TTL_MS;
43
+ // Move the successfully refreshed authority to the end of the bounded cache.
44
+ bases.delete(issuer);
45
+ bases.set(issuer, selected);
46
+ return engine;
47
+ })
48
+ .finally(() => {
49
+ if (selected.pending === pending)
50
+ selected.pending = undefined;
51
+ });
52
+ selected.pending = pending;
53
+ return pending;
54
+ },
55
+ /** A crypto provider rejected this authority; the next request must discover it again. */
56
+ forget(issuer, observedKeys) {
57
+ if (bases.get(issuer)?.engine?.identity_keys === observedKeys)
58
+ bases.delete(issuer);
59
+ },
60
+ /** Authentication refusal expires the basis for the next request, without replaying its body. */
61
+ invalidate(issuer, observedKeys) {
62
+ const basis = bases.get(issuer);
63
+ const observedAt = now();
64
+ if (basis?.engine?.identity_keys !== observedKeys ||
65
+ (basis.rejectedAt !== undefined &&
66
+ observedAt >= basis.rejectedAt &&
67
+ observedAt - basis.rejectedAt < TTL_MS))
68
+ return;
69
+ basis.rejectedAt = observedAt;
70
+ basis.expiresAt = 0;
71
+ },
72
+ });
73
+ }
74
+ async function discover(fetch, issuer) {
75
+ const url = new URL(paths(issuer).workflowEngine, issuer);
76
+ if (url.protocol !== 'https:')
77
+ throw new WorkflowEngineUnavailable('Engine discovery requires HTTPS.');
78
+ const controller = new AbortController();
79
+ const timer = setTimeout(() => controller.abort(new WorkflowEngineUnavailable('Engine discovery timed out.')), TIMEOUT_MS);
80
+ let expired;
81
+ const timeout = new Promise((_resolve, reject) => {
82
+ expired = () => reject(controller.signal.reason);
83
+ controller.signal.addEventListener('abort', expired, { once: true });
84
+ });
85
+ try {
86
+ return await Promise.race([readDocument(fetch, url, issuer, controller.signal), timeout]);
87
+ }
88
+ catch (cause) {
89
+ if (cause instanceof WorkflowEngineUnavailable)
90
+ throw cause;
91
+ throw new WorkflowEngineUnavailable('Engine discovery is unavailable or invalid.', { cause });
92
+ }
93
+ finally {
94
+ clearTimeout(timer);
95
+ controller.signal.removeEventListener('abort', expired);
96
+ }
97
+ }
98
+ async function readDocument(fetch, url, issuer, signal) {
99
+ const response = await fetch(url.href, {
100
+ method: 'GET',
101
+ redirect: 'manual',
102
+ signal: signal,
103
+ });
104
+ if (!response.ok || response.redirected || (response.url !== '' && response.url !== url.href)) {
105
+ await response.body?.cancel();
106
+ throw new WorkflowEngineUnavailable('Engine discovery did not return its document.');
107
+ }
108
+ if (signal.aborted) {
109
+ await response.body?.cancel();
110
+ signal.throwIfAborted();
111
+ }
112
+ const advertised = response.headers.get('content-length');
113
+ if (advertised !== null && Number(advertised) > MAXIMUM_BYTES) {
114
+ await response.body?.cancel();
115
+ throw new WorkflowEngineUnavailable('Engine discovery exceeds its byte limit.');
116
+ }
117
+ if (response.body === null)
118
+ throw new WorkflowEngineUnavailable('Engine discovery is empty.');
119
+ const reader = response.body.getReader();
120
+ const cancel = () => {
121
+ void reader.cancel(signal.reason).catch(() => { });
122
+ };
123
+ signal.addEventListener('abort', cancel, { once: true });
124
+ const chunks = [];
125
+ let size = 0;
126
+ try {
127
+ for (;;) {
128
+ const { done, value } = await reader.read();
129
+ signal.throwIfAborted();
130
+ if (done)
131
+ break;
132
+ size += value.byteLength;
133
+ if (size > MAXIMUM_BYTES)
134
+ throw new WorkflowEngineUnavailable('Engine discovery exceeds its byte limit.');
135
+ chunks.push(value);
136
+ }
137
+ }
138
+ finally {
139
+ signal.removeEventListener('abort', cancel);
140
+ await reader.cancel();
141
+ reader.releaseLock();
142
+ }
143
+ const bytes = new Uint8Array(size);
144
+ let offset = 0;
145
+ for (const chunk of chunks) {
146
+ bytes.set(chunk, offset);
147
+ offset += chunk.byteLength;
148
+ }
149
+ const document = JSON.parse(new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(bytes));
150
+ return acceptWorkflowEngine(document, issuer);
151
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * The part of the Restate TypeScript SDK's Fetch entrypoint the durable receiver uses. A runtime
3
+ * supplies the build for its platform: `@restatedev/restate-sdk/fetch` on Node and Bun,
4
+ * `@restatedev/restate-sdk-cloudflare-workers/fetch` on Cloudflare Workers, which cannot compile
5
+ * WebAssembly at run time. Both expose this exact surface.
6
+ */
7
+ export interface DurableEngine {
8
+ createEndpointHandler(options: {
9
+ readonly services: unknown[];
10
+ readonly identityKeys?: string[];
11
+ }): (request: Request) => Promise<Response>;
12
+ workflow(definition: EngineWorkflowDefinition): unknown;
13
+ readonly TerminalError: new (message: string, options?: {
14
+ readonly errorCode?: number;
15
+ readonly metadata?: Record<string, string>;
16
+ }) => Error;
17
+ readonly CancelledError: abstract new (...input: never[]) => Error;
18
+ /** A failure inside `run` that the engine attempts again no earlier than `retryAfter` ms. */
19
+ readonly RetryableError: new (message: string, options?: {
20
+ readonly retryAfter?: number;
21
+ readonly cause?: unknown;
22
+ }) => Error;
23
+ /** The rejection of `orTimeout` once its duration elapses first. */
24
+ readonly TimeoutError: abstract new (...input: never[]) => Error;
25
+ /**
26
+ * The engine's own combinators, the one way to await several journaled operations together: the
27
+ * engine then follows them as one operation, and a replay settles them as the first run did.
28
+ */
29
+ readonly RestatePromise: EngineCombinators;
30
+ }
31
+ export interface EngineCombinators {
32
+ /** Settle once every one of `values`, promises of this engine's `run`, has settled. */
33
+ allSettled(values: readonly PromiseLike<unknown>[]): PromiseLike<readonly PromiseSettledResult<unknown>[]>;
34
+ }
35
+ export interface EngineWorkflowDefinition {
36
+ readonly name: string;
37
+ readonly handlers: {
38
+ readonly run: (context: EngineWorkflowContext, input: unknown) => Promise<unknown>;
39
+ readonly signal: (context: EngineSharedContext, input: unknown) => Promise<unknown>;
40
+ };
41
+ readonly options: {
42
+ readonly workflowRetention: number;
43
+ readonly retryPolicy: EngineRetryPolicy;
44
+ /** How long an attempt may run without progress before the engine aborts it. */
45
+ readonly abortTimeout: number;
46
+ };
47
+ }
48
+ export interface EngineRetryPolicy {
49
+ readonly maxAttempts: number;
50
+ readonly onMaxAttempts: 'pause' | 'kill';
51
+ readonly initialInterval: number;
52
+ readonly maxInterval: number;
53
+ readonly exponentiationFactor: number;
54
+ }
55
+ /**
56
+ * A promise the engine journals. Its combinators are journaled too, so a replay settles them as the
57
+ * first run did; racing it against another promise with `Promise.race` would not be.
58
+ */
59
+ export interface EnginePromise<Output> extends PromiseLike<Output> {
60
+ /** Settle with this promise, or reject with `TimeoutError` once `millis` elapse first. */
61
+ orTimeout(millis: number): PromiseLike<unknown>;
62
+ }
63
+ /** Journaled operations of one workflow run. */
64
+ export interface EngineWorkflowContext {
65
+ /**
66
+ * Run `action` once and journal its outcome: its value, or the `TerminalError` it throws. Any
67
+ * other failure fails the run's attempt, which the engine attempts again under its retry policy.
68
+ */
69
+ run<Output>(name: string, action: () => Promise<Output>): PromiseLike<Output>;
70
+ /** A durable timer; `name` labels its journal entry. */
71
+ sleep(durationMs: number, name?: string): PromiseLike<void>;
72
+ promise(name: string): {
73
+ get(): EnginePromise<unknown>;
74
+ };
75
+ request(): {
76
+ readonly attemptCompletedSignal: AbortSignal;
77
+ };
78
+ }
79
+ export interface EngineSharedContext {
80
+ promise<Output>(name: string): {
81
+ resolve(value?: Output): PromiseLike<void>;
82
+ };
83
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { DurableExecution } from '../../application/workflow/index.js';
2
+ import type { Value } from '../../platform/value/index.js';
3
+ /** Engine input of one run, as the Kernel submits it. */
4
+ export interface Envelope {
5
+ readonly execution: DurableExecution;
6
+ readonly input: Value;
7
+ }
8
+ /**
9
+ * Decode the run input the engine delivers. Fields a newer Kernel may add are ignored, so a Domain
10
+ * keeps running Executions submitted by it.
11
+ */
12
+ export declare function decodeEnvelope(input: unknown): Envelope;
@@ -0,0 +1,46 @@
1
+ import { issuer } from '../../platform/auth/index.js';
2
+ import { NodeId } from '../../platform/graph/node/index.js';
3
+ import * as portable from '../../platform/value/index.js';
4
+ const VERSION = /^sha256:[0-9a-f]{64}$/u;
5
+ /**
6
+ * Decode the run input the engine delivers. Fields a newer Kernel may add are ignored, so a Domain
7
+ * keeps running Executions submitted by it.
8
+ */
9
+ export function decodeEnvelope(input) {
10
+ const envelope = record(input, 'envelope');
11
+ const fn = record(envelope.function, 'envelope.function');
12
+ const initiator = record(envelope.initiator, 'envelope.initiator');
13
+ if (typeof fn.version !== 'string' || !VERSION.test(fn.version)) {
14
+ throw new TypeError('Durable envelope.function.version is invalid.');
15
+ }
16
+ if (typeof envelope.kernel !== 'string')
17
+ throw new TypeError('Durable envelope.kernel is invalid.');
18
+ const receiver = envelope.receiver === undefined ? undefined : node(envelope.receiver, 'receiver');
19
+ const execution = Object.freeze({
20
+ id: node(envelope.execution, 'execution'),
21
+ function: Object.freeze({
22
+ id: node(fn.id, 'function.id'),
23
+ version: fn.version,
24
+ }),
25
+ kernel: issuer.accept(envelope.kernel),
26
+ initiator: Object.freeze({
27
+ principal: node(initiator.principal, 'initiator.principal'),
28
+ caller: node(initiator.caller, 'initiator.caller'),
29
+ }),
30
+ ...(receiver === undefined ? {} : { receiver }),
31
+ });
32
+ if (!Object.hasOwn(envelope, 'input'))
33
+ throw new TypeError('Durable envelope.input is missing.');
34
+ return Object.freeze({ execution, input: portable.accept(envelope.input) });
35
+ }
36
+ function record(input, label) {
37
+ if (input === null || typeof input !== 'object' || Array.isArray(input)) {
38
+ throw new TypeError(`Durable ${label} must be an object.`);
39
+ }
40
+ return input;
41
+ }
42
+ function node(input, label) {
43
+ if (typeof input !== 'string')
44
+ throw new TypeError(`Durable envelope.${label} is invalid.`);
45
+ return NodeId(input);
46
+ }
@@ -0,0 +1,39 @@
1
+ import type { DurableEngine } from './engine.js';
2
+ /** Failure code of an Execution whose Workflow did not catch a Step that spent its retry budget. */
3
+ export declare const STEP_EXHAUSTED = "STEP_EXHAUSTED";
4
+ /** A Kernel refusal as the wire names it: its protocol code and, when given, its reason code. */
5
+ export interface KernelRefusal {
6
+ readonly code: number;
7
+ readonly reason?: string;
8
+ }
9
+ /**
10
+ * A Step that spent its retry budget, or whose attempt the Kernel refused for good. Its message
11
+ * never carries what the last attempt threw; when the Kernel refused that attempt, `refusal` names
12
+ * the refusal by its codes alone.
13
+ */
14
+ export declare class StepExhausted extends Error {
15
+ readonly step: string;
16
+ readonly refusal?: KernelRefusal;
17
+ constructor(step: string, refusal?: KernelRefusal);
18
+ }
19
+ /** The Kernel refusal behind `cause`, itself or one of its causes. */
20
+ export declare function kernelRefusalOf(cause: unknown): KernelRefusal | undefined;
21
+ /** The message of a failed attempt: what it threw, after the Kernel refusal's codes, if any. */
22
+ export declare function attemptMessage(cause: unknown, refusal?: KernelRefusal | undefined): string;
23
+ /** A Step attempt's failure that asks to wait `delayMs` before the next attempt. */
24
+ export declare class StepRetryAfter extends Error {
25
+ readonly delayMs: number;
26
+ constructor(delayMs: number, cause?: unknown);
27
+ }
28
+ /**
29
+ * Encode a declared business error of `definition`, or a Step that spent its retry budget, as a
30
+ * terminal engine failure, or return undefined for any other error, which the engine retries.
31
+ */
32
+ export declare function terminalFailure(engine: DurableEngine, cause: unknown, definition: object): Error | undefined;
33
+ /**
34
+ * What a journaled Step failed with, as the Workflow sees it: its declared business error, rebuilt
35
+ * through the definition's own factory, or `StepExhausted` once the engine spent its retry budget
36
+ * or the Step threw an exhaustion caught from an earlier Step. A replay throws what the live run
37
+ * threw.
38
+ */
39
+ export declare function replayedFailure(engine: DurableEngine, cause: unknown, definition: object, step: string): Error | undefined;