@smthrs/flow 0.0.0-stage → 1.0.0-rc.12

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 (654) hide show
  1. package/CHANGELOG.md +161 -0
  2. package/LICENSE +21 -0
  3. package/README.md +212 -2
  4. package/THIRD_PARTY_NOTICES.md +52 -0
  5. package/dist/cjs/Action/Action.d.ts +250 -0
  6. package/dist/cjs/Action/Action.d.ts.map +1 -0
  7. package/dist/cjs/Action/Action.js +42 -0
  8. package/dist/cjs/Action/Action.js.map +7 -0
  9. package/dist/cjs/Action/AttemptTimedOut.d.ts +33 -0
  10. package/dist/cjs/Action/AttemptTimedOut.d.ts.map +1 -0
  11. package/dist/cjs/Action/AttemptTimedOut.js +51 -0
  12. package/dist/cjs/Action/AttemptTimedOut.js.map +7 -0
  13. package/dist/cjs/Action/BoundaryMode.d.ts +29 -0
  14. package/dist/cjs/Action/BoundaryMode.d.ts.map +1 -0
  15. package/dist/cjs/Action/BoundaryMode.js +36 -0
  16. package/dist/cjs/Action/BoundaryMode.js.map +7 -0
  17. package/dist/cjs/Action/CacheEnvironment.d.ts +158 -0
  18. package/dist/cjs/Action/CacheEnvironment.d.ts.map +1 -0
  19. package/dist/cjs/Action/CacheEnvironment.js +57 -0
  20. package/dist/cjs/Action/CacheEnvironment.js.map +7 -0
  21. package/dist/cjs/Action/ConcurrentKeylessDispatch.d.ts +34 -0
  22. package/dist/cjs/Action/ConcurrentKeylessDispatch.d.ts.map +1 -0
  23. package/dist/cjs/Action/ConcurrentKeylessDispatch.js +46 -0
  24. package/dist/cjs/Action/ConcurrentKeylessDispatch.js.map +7 -0
  25. package/dist/cjs/Action/Context.d.ts +131 -0
  26. package/dist/cjs/Action/Context.d.ts.map +1 -0
  27. package/dist/cjs/Action/Context.js +68 -0
  28. package/dist/cjs/Action/Context.js.map +7 -0
  29. package/dist/cjs/Action/DuplicateImplementation.d.ts +20 -0
  30. package/dist/cjs/Action/DuplicateImplementation.d.ts.map +1 -0
  31. package/dist/cjs/Action/DuplicateImplementation.js +46 -0
  32. package/dist/cjs/Action/DuplicateImplementation.js.map +7 -0
  33. package/dist/cjs/Action/FileBoundary.d.ts +59 -0
  34. package/dist/cjs/Action/FileBoundary.d.ts.map +1 -0
  35. package/dist/cjs/Action/FileBoundary.js +81 -0
  36. package/dist/cjs/Action/FileBoundary.js.map +7 -0
  37. package/dist/cjs/Action/FileInput.d.ts +28 -0
  38. package/dist/cjs/Action/FileInput.d.ts.map +1 -0
  39. package/dist/cjs/Action/FileInput.js +42 -0
  40. package/dist/cjs/Action/FileInput.js.map +7 -0
  41. package/dist/cjs/Action/Filegroup.d.ts +16 -0
  42. package/dist/cjs/Action/Filegroup.d.ts.map +1 -0
  43. package/dist/cjs/Action/Filegroup.js +27 -0
  44. package/dist/cjs/Action/Filegroup.js.map +7 -0
  45. package/dist/cjs/Action/Glob.d.ts +8 -0
  46. package/dist/cjs/Action/Glob.d.ts.map +1 -0
  47. package/dist/cjs/Action/Glob.js +28 -0
  48. package/dist/cjs/Action/Glob.js.map +7 -0
  49. package/dist/cjs/Action/ImplementationVersionMismatch.d.ts +26 -0
  50. package/dist/cjs/Action/ImplementationVersionMismatch.d.ts.map +1 -0
  51. package/dist/cjs/Action/ImplementationVersionMismatch.js +45 -0
  52. package/dist/cjs/Action/ImplementationVersionMismatch.js.map +7 -0
  53. package/dist/cjs/Action/Implementations.d.ts +114 -0
  54. package/dist/cjs/Action/Implementations.d.ts.map +1 -0
  55. package/dist/cjs/Action/Implementations.js +65 -0
  56. package/dist/cjs/Action/Implementations.js.map +7 -0
  57. package/dist/cjs/Action/InfraInterrupt.d.ts +26 -0
  58. package/dist/cjs/Action/InfraInterrupt.d.ts.map +1 -0
  59. package/dist/cjs/Action/InfraInterrupt.js +46 -0
  60. package/dist/cjs/Action/InfraInterrupt.js.map +7 -0
  61. package/dist/cjs/Action/InfraInterruptRetriesExhausted.d.ts +33 -0
  62. package/dist/cjs/Action/InfraInterruptRetriesExhausted.d.ts.map +1 -0
  63. package/dist/cjs/Action/InfraInterruptRetriesExhausted.js +54 -0
  64. package/dist/cjs/Action/InfraInterruptRetriesExhausted.js.map +7 -0
  65. package/dist/cjs/Action/IrreversibleRetryRequiresIdempotencyKey.d.ts +26 -0
  66. package/dist/cjs/Action/IrreversibleRetryRequiresIdempotencyKey.d.ts.map +1 -0
  67. package/dist/cjs/Action/IrreversibleRetryRequiresIdempotencyKey.js +47 -0
  68. package/dist/cjs/Action/IrreversibleRetryRequiresIdempotencyKey.js.map +7 -0
  69. package/dist/cjs/Action/StepIdentity.d.ts +153 -0
  70. package/dist/cjs/Action/StepIdentity.d.ts.map +1 -0
  71. package/dist/cjs/Action/StepIdentity.js +75 -0
  72. package/dist/cjs/Action/StepIdentity.js.map +7 -0
  73. package/dist/cjs/Action/TreeArtifact.d.ts +8 -0
  74. package/dist/cjs/Action/TreeArtifact.d.ts.map +1 -0
  75. package/dist/cjs/Action/TreeArtifact.js +25 -0
  76. package/dist/cjs/Action/TreeArtifact.js.map +7 -0
  77. package/dist/cjs/Action/TypeId.d.ts +8 -0
  78. package/dist/cjs/Action/TypeId.d.ts.map +1 -0
  79. package/dist/cjs/Action/TypeId.js +25 -0
  80. package/dist/cjs/Action/TypeId.js.map +7 -0
  81. package/dist/cjs/Action/UncanonicalIdempotencyKey.d.ts +32 -0
  82. package/dist/cjs/Action/UncanonicalIdempotencyKey.d.ts.map +1 -0
  83. package/dist/cjs/Action/UncanonicalIdempotencyKey.js +51 -0
  84. package/dist/cjs/Action/UncanonicalIdempotencyKey.js.map +7 -0
  85. package/dist/cjs/Action/idempotencyKey.d.ts +21 -0
  86. package/dist/cjs/Action/idempotencyKey.d.ts.map +1 -0
  87. package/dist/cjs/Action/idempotencyKey.js +59 -0
  88. package/dist/cjs/Action/idempotencyKey.js.map +7 -0
  89. package/dist/cjs/Action/index.d.ts +29 -0
  90. package/dist/cjs/Action/index.d.ts.map +1 -0
  91. package/dist/cjs/Action/index.js +60 -0
  92. package/dist/cjs/Action/index.js.map +7 -0
  93. package/dist/cjs/Action/make.d.ts +128 -0
  94. package/dist/cjs/Action/make.d.ts.map +1 -0
  95. package/dist/cjs/Action/make.js +387 -0
  96. package/dist/cjs/Action/make.js.map +7 -0
  97. package/dist/cjs/Action/raceAll.d.ts +21 -0
  98. package/dist/cjs/Action/raceAll.d.ts.map +1 -0
  99. package/dist/cjs/Action/raceAll.js +46 -0
  100. package/dist/cjs/Action/raceAll.js.map +7 -0
  101. package/dist/cjs/Action/retry.d.ts +19 -0
  102. package/dist/cjs/Action/retry.d.ts.map +1 -0
  103. package/dist/cjs/Action/retry.js +75 -0
  104. package/dist/cjs/Action/retry.js.map +7 -0
  105. package/dist/cjs/Deadline.d.ts +110 -0
  106. package/dist/cjs/Deadline.d.ts.map +1 -0
  107. package/dist/cjs/Deadline.js +112 -0
  108. package/dist/cjs/Deadline.js.map +7 -0
  109. package/dist/cjs/DurableClock.d.ts +60 -0
  110. package/dist/cjs/DurableClock.d.ts.map +1 -0
  111. package/dist/cjs/DurableClock.js +107 -0
  112. package/dist/cjs/DurableClock.js.map +7 -0
  113. package/dist/cjs/DurableDeferred.d.ts +311 -0
  114. package/dist/cjs/DurableDeferred.d.ts.map +1 -0
  115. package/dist/cjs/DurableDeferred.js +322 -0
  116. package/dist/cjs/DurableDeferred.js.map +7 -0
  117. package/dist/cjs/DurableQueue.d.ts +160 -0
  118. package/dist/cjs/DurableQueue.d.ts.map +1 -0
  119. package/dist/cjs/DurableQueue.js +229 -0
  120. package/dist/cjs/DurableQueue.js.map +7 -0
  121. package/dist/cjs/ExternalJob.d.ts +179 -0
  122. package/dist/cjs/ExternalJob.d.ts.map +1 -0
  123. package/dist/cjs/ExternalJob.js +339 -0
  124. package/dist/cjs/ExternalJob.js.map +7 -0
  125. package/dist/cjs/Fault.d.ts +131 -0
  126. package/dist/cjs/Fault.d.ts.map +1 -0
  127. package/dist/cjs/Fault.js +157 -0
  128. package/dist/cjs/Fault.js.map +7 -0
  129. package/dist/cjs/Flow/Annotations.d.ts +245 -0
  130. package/dist/cjs/Flow/Annotations.d.ts.map +1 -0
  131. package/dist/cjs/Flow/Annotations.js +72 -0
  132. package/dist/cjs/Flow/Annotations.js.map +7 -0
  133. package/dist/cjs/Flow/CapabilityCeiling.d.ts +21 -0
  134. package/dist/cjs/Flow/CapabilityCeiling.d.ts.map +1 -0
  135. package/dist/cjs/Flow/CapabilityCeiling.js +49 -0
  136. package/dist/cjs/Flow/CapabilityCeiling.js.map +7 -0
  137. package/dist/cjs/Flow/DeadlineExceeded.d.ts +33 -0
  138. package/dist/cjs/Flow/DeadlineExceeded.d.ts.map +1 -0
  139. package/dist/cjs/Flow/DeadlineExceeded.js +52 -0
  140. package/dist/cjs/Flow/DeadlineExceeded.js.map +7 -0
  141. package/dist/cjs/Flow/ExecutionIdRequired.d.ts +25 -0
  142. package/dist/cjs/Flow/ExecutionIdRequired.d.ts.map +1 -0
  143. package/dist/cjs/Flow/ExecutionIdRequired.js +46 -0
  144. package/dist/cjs/Flow/ExecutionIdRequired.js.map +7 -0
  145. package/dist/cjs/Flow/ExecutionIds.d.ts +80 -0
  146. package/dist/cjs/Flow/ExecutionIds.d.ts.map +1 -0
  147. package/dist/cjs/Flow/ExecutionIds.js +66 -0
  148. package/dist/cjs/Flow/ExecutionIds.js.map +7 -0
  149. package/dist/cjs/Flow/Flow.d.ts +422 -0
  150. package/dist/cjs/Flow/Flow.d.ts.map +1 -0
  151. package/dist/cjs/Flow/Flow.js +17 -0
  152. package/dist/cjs/Flow/Flow.js.map +7 -0
  153. package/dist/cjs/Flow/MaxRoundsExceeded.d.ts +35 -0
  154. package/dist/cjs/Flow/MaxRoundsExceeded.d.ts.map +1 -0
  155. package/dist/cjs/Flow/MaxRoundsExceeded.js +50 -0
  156. package/dist/cjs/Flow/MaxRoundsExceeded.js.map +7 -0
  157. package/dist/cjs/Flow/Outcome.d.ts +162 -0
  158. package/dist/cjs/Flow/Outcome.d.ts.map +1 -0
  159. package/dist/cjs/Flow/Outcome.js +80 -0
  160. package/dist/cjs/Flow/Outcome.js.map +7 -0
  161. package/dist/cjs/Flow/Result.d.ts +186 -0
  162. package/dist/cjs/Flow/Result.d.ts.map +1 -0
  163. package/dist/cjs/Flow/Result.js +159 -0
  164. package/dist/cjs/Flow/Result.js.map +7 -0
  165. package/dist/cjs/Flow/Runtime.d.ts +98 -0
  166. package/dist/cjs/Flow/Runtime.d.ts.map +1 -0
  167. package/dist/cjs/Flow/Runtime.js +186 -0
  168. package/dist/cjs/Flow/Runtime.js.map +7 -0
  169. package/dist/cjs/Flow/TypeId.d.ts +8 -0
  170. package/dist/cjs/Flow/TypeId.d.ts.map +1 -0
  171. package/dist/cjs/Flow/TypeId.js +25 -0
  172. package/dist/cjs/Flow/TypeId.js.map +7 -0
  173. package/dist/cjs/Flow/index.d.ts +17 -0
  174. package/dist/cjs/Flow/index.d.ts.map +1 -0
  175. package/dist/cjs/Flow/index.js +29 -0
  176. package/dist/cjs/Flow/index.js.map +7 -0
  177. package/dist/cjs/Flow/internal.d.ts +34 -0
  178. package/dist/cjs/Flow/internal.d.ts.map +1 -0
  179. package/dist/cjs/Flow/internal.js +187 -0
  180. package/dist/cjs/Flow/internal.js.map +7 -0
  181. package/dist/cjs/Flow/make.d.ts +135 -0
  182. package/dist/cjs/Flow/make.d.ts.map +1 -0
  183. package/dist/cjs/Flow/make.js +107 -0
  184. package/dist/cjs/Flow/make.js.map +7 -0
  185. package/dist/cjs/FlowRuntime/CancelRequestFailed.d.ts +55 -0
  186. package/dist/cjs/FlowRuntime/CancelRequestFailed.d.ts.map +1 -0
  187. package/dist/cjs/FlowRuntime/CancelRequestFailed.js +51 -0
  188. package/dist/cjs/FlowRuntime/CancelRequestFailed.js.map +7 -0
  189. package/dist/cjs/FlowRuntime/ExecutionIdentityConflict.d.ts +23 -0
  190. package/dist/cjs/FlowRuntime/ExecutionIdentityConflict.d.ts.map +1 -0
  191. package/dist/cjs/FlowRuntime/ExecutionIdentityConflict.js +55 -0
  192. package/dist/cjs/FlowRuntime/ExecutionIdentityConflict.js.map +7 -0
  193. package/dist/cjs/FlowRuntime/FlowCycleDetected.d.ts +28 -0
  194. package/dist/cjs/FlowRuntime/FlowCycleDetected.d.ts.map +1 -0
  195. package/dist/cjs/FlowRuntime/FlowCycleDetected.js +49 -0
  196. package/dist/cjs/FlowRuntime/FlowCycleDetected.js.map +7 -0
  197. package/dist/cjs/FlowRuntime/FlowExecutionNotFound.d.ts +38 -0
  198. package/dist/cjs/FlowRuntime/FlowExecutionNotFound.d.ts.map +1 -0
  199. package/dist/cjs/FlowRuntime/FlowExecutionNotFound.js +53 -0
  200. package/dist/cjs/FlowRuntime/FlowExecutionNotFound.js.map +7 -0
  201. package/dist/cjs/FlowRuntime/FlowInstance.d.ts +115 -0
  202. package/dist/cjs/FlowRuntime/FlowInstance.d.ts.map +1 -0
  203. package/dist/cjs/FlowRuntime/FlowInstance.js +37 -0
  204. package/dist/cjs/FlowRuntime/FlowInstance.js.map +7 -0
  205. package/dist/cjs/FlowRuntime/FlowRuntime.d.ts +204 -0
  206. package/dist/cjs/FlowRuntime/FlowRuntime.d.ts.map +1 -0
  207. package/dist/cjs/FlowRuntime/FlowRuntime.js +37 -0
  208. package/dist/cjs/FlowRuntime/FlowRuntime.js.map +7 -0
  209. package/dist/cjs/FlowRuntime/NodeRecord.d.ts +177 -0
  210. package/dist/cjs/FlowRuntime/NodeRecord.d.ts.map +1 -0
  211. package/dist/cjs/FlowRuntime/NodeRecord.js +17 -0
  212. package/dist/cjs/FlowRuntime/NodeRecord.js.map +7 -0
  213. package/dist/cjs/FlowRuntime/WaitingAnnotation.d.ts +69 -0
  214. package/dist/cjs/FlowRuntime/WaitingAnnotation.d.ts.map +1 -0
  215. package/dist/cjs/FlowRuntime/WaitingAnnotation.js +53 -0
  216. package/dist/cjs/FlowRuntime/WaitingAnnotation.js.map +7 -0
  217. package/dist/cjs/FlowRuntime/index.d.ts +14 -0
  218. package/dist/cjs/FlowRuntime/index.d.ts.map +1 -0
  219. package/dist/cjs/FlowRuntime/index.js +26 -0
  220. package/dist/cjs/FlowRuntime/index.js.map +7 -0
  221. package/dist/cjs/Graph.d.ts +325 -0
  222. package/dist/cjs/Graph.d.ts.map +1 -0
  223. package/dist/cjs/Graph.js +1020 -0
  224. package/dist/cjs/Graph.js.map +7 -0
  225. package/dist/cjs/HumanTask.d.ts +442 -0
  226. package/dist/cjs/HumanTask.d.ts.map +1 -0
  227. package/dist/cjs/HumanTask.js +413 -0
  228. package/dist/cjs/HumanTask.js.map +7 -0
  229. package/dist/cjs/Interpreter.d.ts +223 -0
  230. package/dist/cjs/Interpreter.d.ts.map +1 -0
  231. package/dist/cjs/Interpreter.js +908 -0
  232. package/dist/cjs/Interpreter.js.map +7 -0
  233. package/dist/cjs/Poll.d.ts +240 -0
  234. package/dist/cjs/Poll.d.ts.map +1 -0
  235. package/dist/cjs/Poll.js +154 -0
  236. package/dist/cjs/Poll.js.map +7 -0
  237. package/dist/cjs/RetryPolicy.d.ts +273 -0
  238. package/dist/cjs/RetryPolicy.d.ts.map +1 -0
  239. package/dist/cjs/RetryPolicy.js +251 -0
  240. package/dist/cjs/RetryPolicy.js.map +7 -0
  241. package/dist/cjs/Sleep.d.ts +98 -0
  242. package/dist/cjs/Sleep.d.ts.map +1 -0
  243. package/dist/cjs/Sleep.js +141 -0
  244. package/dist/cjs/Sleep.js.map +7 -0
  245. package/dist/cjs/Stall.d.ts +173 -0
  246. package/dist/cjs/Stall.d.ts.map +1 -0
  247. package/dist/cjs/Stall.js +92 -0
  248. package/dist/cjs/Stall.js.map +7 -0
  249. package/dist/cjs/WaitFor.d.ts +109 -0
  250. package/dist/cjs/WaitFor.d.ts.map +1 -0
  251. package/dist/cjs/WaitFor.js +117 -0
  252. package/dist/cjs/WaitFor.js.map +7 -0
  253. package/dist/cjs/index.d.ts +107 -0
  254. package/dist/cjs/index.d.ts.map +1 -0
  255. package/dist/cjs/index.js +69 -0
  256. package/dist/cjs/index.js.map +7 -0
  257. package/dist/cjs/internal/BoundedJson.d.ts +48 -0
  258. package/dist/cjs/internal/BoundedJson.d.ts.map +1 -0
  259. package/dist/cjs/internal/BoundedJson.js +96 -0
  260. package/dist/cjs/internal/BoundedJson.js.map +7 -0
  261. package/dist/cjs/internal/DeclarationSite.d.ts +135 -0
  262. package/dist/cjs/internal/DeclarationSite.d.ts.map +1 -0
  263. package/dist/cjs/internal/DeclarationSite.js +89 -0
  264. package/dist/cjs/internal/DeclarationSite.js.map +7 -0
  265. package/dist/cjs/internal/Declarations.d.ts +35 -0
  266. package/dist/cjs/internal/Declarations.d.ts.map +1 -0
  267. package/dist/cjs/internal/Declarations.js +50 -0
  268. package/dist/cjs/internal/Declarations.js.map +7 -0
  269. package/dist/cjs/internal/ExecutionMiddleware.d.ts +21 -0
  270. package/dist/cjs/internal/ExecutionMiddleware.d.ts.map +1 -0
  271. package/dist/cjs/internal/ExecutionMiddleware.js +39 -0
  272. package/dist/cjs/internal/ExecutionMiddleware.js.map +7 -0
  273. package/dist/cjs/internal/JsonSchemaSubset.d.ts +133 -0
  274. package/dist/cjs/internal/JsonSchemaSubset.d.ts.map +1 -0
  275. package/dist/cjs/internal/JsonSchemaSubset.js +229 -0
  276. package/dist/cjs/internal/JsonSchemaSubset.js.map +7 -0
  277. package/dist/cjs/internal/OutcomeMarker.d.ts +18 -0
  278. package/dist/cjs/internal/OutcomeMarker.d.ts.map +1 -0
  279. package/dist/cjs/internal/OutcomeMarker.js +27 -0
  280. package/dist/cjs/internal/OutcomeMarker.js.map +7 -0
  281. package/dist/cjs/package.json +1 -0
  282. package/dist/esm/Action/Action.d.ts +250 -0
  283. package/dist/esm/Action/Action.d.ts.map +1 -0
  284. package/dist/esm/Action/Action.js +30 -0
  285. package/dist/esm/Action/Action.js.map +1 -0
  286. package/dist/esm/Action/AttemptTimedOut.d.ts +33 -0
  287. package/dist/esm/Action/AttemptTimedOut.d.ts.map +1 -0
  288. package/dist/esm/Action/AttemptTimedOut.js +32 -0
  289. package/dist/esm/Action/AttemptTimedOut.js.map +1 -0
  290. package/dist/esm/Action/BoundaryMode.d.ts +29 -0
  291. package/dist/esm/Action/BoundaryMode.d.ts.map +1 -0
  292. package/dist/esm/Action/BoundaryMode.js +23 -0
  293. package/dist/esm/Action/BoundaryMode.js.map +1 -0
  294. package/dist/esm/Action/CacheEnvironment.d.ts +158 -0
  295. package/dist/esm/Action/CacheEnvironment.d.ts.map +1 -0
  296. package/dist/esm/Action/CacheEnvironment.js +130 -0
  297. package/dist/esm/Action/CacheEnvironment.js.map +1 -0
  298. package/dist/esm/Action/ConcurrentKeylessDispatch.d.ts +34 -0
  299. package/dist/esm/Action/ConcurrentKeylessDispatch.d.ts.map +1 -0
  300. package/dist/esm/Action/ConcurrentKeylessDispatch.js +33 -0
  301. package/dist/esm/Action/ConcurrentKeylessDispatch.js.map +1 -0
  302. package/dist/esm/Action/Context.d.ts +131 -0
  303. package/dist/esm/Action/Context.d.ts.map +1 -0
  304. package/dist/esm/Action/Context.js +99 -0
  305. package/dist/esm/Action/Context.js.map +1 -0
  306. package/dist/esm/Action/DuplicateImplementation.d.ts +20 -0
  307. package/dist/esm/Action/DuplicateImplementation.d.ts.map +1 -0
  308. package/dist/esm/Action/DuplicateImplementation.js +20 -0
  309. package/dist/esm/Action/DuplicateImplementation.js.map +1 -0
  310. package/dist/esm/Action/FileBoundary.d.ts +59 -0
  311. package/dist/esm/Action/FileBoundary.d.ts.map +1 -0
  312. package/dist/esm/Action/FileBoundary.js +60 -0
  313. package/dist/esm/Action/FileBoundary.js.map +1 -0
  314. package/dist/esm/Action/FileInput.d.ts +28 -0
  315. package/dist/esm/Action/FileInput.d.ts.map +1 -0
  316. package/dist/esm/Action/FileInput.js +32 -0
  317. package/dist/esm/Action/FileInput.js.map +1 -0
  318. package/dist/esm/Action/Filegroup.d.ts +16 -0
  319. package/dist/esm/Action/Filegroup.d.ts.map +1 -0
  320. package/dist/esm/Action/Filegroup.js +15 -0
  321. package/dist/esm/Action/Filegroup.js.map +1 -0
  322. package/dist/esm/Action/Glob.d.ts +8 -0
  323. package/dist/esm/Action/Glob.d.ts.map +1 -0
  324. package/dist/esm/Action/Glob.js +7 -0
  325. package/dist/esm/Action/Glob.js.map +1 -0
  326. package/dist/esm/Action/ImplementationVersionMismatch.d.ts +26 -0
  327. package/dist/esm/Action/ImplementationVersionMismatch.d.ts.map +1 -0
  328. package/dist/esm/Action/ImplementationVersionMismatch.js +24 -0
  329. package/dist/esm/Action/ImplementationVersionMismatch.js.map +1 -0
  330. package/dist/esm/Action/Implementations.d.ts +114 -0
  331. package/dist/esm/Action/Implementations.d.ts.map +1 -0
  332. package/dist/esm/Action/Implementations.js +94 -0
  333. package/dist/esm/Action/Implementations.js.map +1 -0
  334. package/dist/esm/Action/InfraInterrupt.d.ts +26 -0
  335. package/dist/esm/Action/InfraInterrupt.d.ts.map +1 -0
  336. package/dist/esm/Action/InfraInterrupt.js +25 -0
  337. package/dist/esm/Action/InfraInterrupt.js.map +1 -0
  338. package/dist/esm/Action/InfraInterruptRetriesExhausted.d.ts +33 -0
  339. package/dist/esm/Action/InfraInterruptRetriesExhausted.d.ts.map +1 -0
  340. package/dist/esm/Action/InfraInterruptRetriesExhausted.js +32 -0
  341. package/dist/esm/Action/InfraInterruptRetriesExhausted.js.map +1 -0
  342. package/dist/esm/Action/IrreversibleRetryRequiresIdempotencyKey.d.ts +26 -0
  343. package/dist/esm/Action/IrreversibleRetryRequiresIdempotencyKey.d.ts.map +1 -0
  344. package/dist/esm/Action/IrreversibleRetryRequiresIdempotencyKey.js +25 -0
  345. package/dist/esm/Action/IrreversibleRetryRequiresIdempotencyKey.js.map +1 -0
  346. package/dist/esm/Action/StepIdentity.d.ts +153 -0
  347. package/dist/esm/Action/StepIdentity.d.ts.map +1 -0
  348. package/dist/esm/Action/StepIdentity.js +139 -0
  349. package/dist/esm/Action/StepIdentity.js.map +1 -0
  350. package/dist/esm/Action/TreeArtifact.d.ts +8 -0
  351. package/dist/esm/Action/TreeArtifact.d.ts.map +1 -0
  352. package/dist/esm/Action/TreeArtifact.js +7 -0
  353. package/dist/esm/Action/TreeArtifact.js.map +1 -0
  354. package/dist/esm/Action/TypeId.d.ts +8 -0
  355. package/dist/esm/Action/TypeId.d.ts.map +1 -0
  356. package/dist/esm/Action/TypeId.js +9 -0
  357. package/dist/esm/Action/TypeId.js.map +1 -0
  358. package/dist/esm/Action/UncanonicalIdempotencyKey.d.ts +32 -0
  359. package/dist/esm/Action/UncanonicalIdempotencyKey.d.ts.map +1 -0
  360. package/dist/esm/Action/UncanonicalIdempotencyKey.js +31 -0
  361. package/dist/esm/Action/UncanonicalIdempotencyKey.js.map +1 -0
  362. package/dist/esm/Action/idempotencyKey.d.ts +21 -0
  363. package/dist/esm/Action/idempotencyKey.d.ts.map +1 -0
  364. package/dist/esm/Action/idempotencyKey.js +50 -0
  365. package/dist/esm/Action/idempotencyKey.js.map +1 -0
  366. package/dist/esm/Action/index.d.ts +29 -0
  367. package/dist/esm/Action/index.d.ts.map +1 -0
  368. package/dist/esm/Action/index.js +30 -0
  369. package/dist/esm/Action/index.js.map +1 -0
  370. package/dist/esm/Action/make.d.ts +128 -0
  371. package/dist/esm/Action/make.d.ts.map +1 -0
  372. package/dist/esm/Action/make.js +413 -0
  373. package/dist/esm/Action/make.js.map +1 -0
  374. package/dist/esm/Action/raceAll.d.ts +21 -0
  375. package/dist/esm/Action/raceAll.d.ts.map +1 -0
  376. package/dist/esm/Action/raceAll.js +20 -0
  377. package/dist/esm/Action/raceAll.js.map +1 -0
  378. package/dist/esm/Action/retry.d.ts +19 -0
  379. package/dist/esm/Action/retry.d.ts.map +1 -0
  380. package/dist/esm/Action/retry.js +72 -0
  381. package/dist/esm/Action/retry.js.map +1 -0
  382. package/dist/esm/Deadline.d.ts +110 -0
  383. package/dist/esm/Deadline.d.ts.map +1 -0
  384. package/dist/esm/Deadline.js +164 -0
  385. package/dist/esm/Deadline.js.map +1 -0
  386. package/dist/esm/DurableClock.d.ts +60 -0
  387. package/dist/esm/DurableClock.d.ts.map +1 -0
  388. package/dist/esm/DurableClock.js +122 -0
  389. package/dist/esm/DurableClock.js.map +1 -0
  390. package/dist/esm/DurableDeferred.d.ts +311 -0
  391. package/dist/esm/DurableDeferred.d.ts.map +1 -0
  392. package/dist/esm/DurableDeferred.js +357 -0
  393. package/dist/esm/DurableDeferred.js.map +1 -0
  394. package/dist/esm/DurableQueue.d.ts +160 -0
  395. package/dist/esm/DurableQueue.d.ts.map +1 -0
  396. package/dist/esm/DurableQueue.js +303 -0
  397. package/dist/esm/DurableQueue.js.map +1 -0
  398. package/dist/esm/ExternalJob.d.ts +179 -0
  399. package/dist/esm/ExternalJob.d.ts.map +1 -0
  400. package/dist/esm/ExternalJob.js +296 -0
  401. package/dist/esm/ExternalJob.js.map +1 -0
  402. package/dist/esm/Fault.d.ts +131 -0
  403. package/dist/esm/Fault.d.ts.map +1 -0
  404. package/dist/esm/Fault.js +198 -0
  405. package/dist/esm/Fault.js.map +1 -0
  406. package/dist/esm/Flow/Annotations.d.ts +245 -0
  407. package/dist/esm/Flow/Annotations.d.ts.map +1 -0
  408. package/dist/esm/Flow/Annotations.js +110 -0
  409. package/dist/esm/Flow/Annotations.js.map +1 -0
  410. package/dist/esm/Flow/CapabilityCeiling.d.ts +21 -0
  411. package/dist/esm/Flow/CapabilityCeiling.d.ts.map +1 -0
  412. package/dist/esm/Flow/CapabilityCeiling.js +27 -0
  413. package/dist/esm/Flow/CapabilityCeiling.js.map +1 -0
  414. package/dist/esm/Flow/DeadlineExceeded.d.ts +33 -0
  415. package/dist/esm/Flow/DeadlineExceeded.d.ts.map +1 -0
  416. package/dist/esm/Flow/DeadlineExceeded.js +34 -0
  417. package/dist/esm/Flow/DeadlineExceeded.js.map +1 -0
  418. package/dist/esm/Flow/ExecutionIdRequired.d.ts +25 -0
  419. package/dist/esm/Flow/ExecutionIdRequired.d.ts.map +1 -0
  420. package/dist/esm/Flow/ExecutionIdRequired.js +30 -0
  421. package/dist/esm/Flow/ExecutionIdRequired.js.map +1 -0
  422. package/dist/esm/Flow/ExecutionIds.d.ts +80 -0
  423. package/dist/esm/Flow/ExecutionIds.d.ts.map +1 -0
  424. package/dist/esm/Flow/ExecutionIds.js +91 -0
  425. package/dist/esm/Flow/ExecutionIds.js.map +1 -0
  426. package/dist/esm/Flow/Flow.d.ts +422 -0
  427. package/dist/esm/Flow/Flow.d.ts.map +1 -0
  428. package/dist/esm/Flow/Flow.js +3 -0
  429. package/dist/esm/Flow/Flow.js.map +1 -0
  430. package/dist/esm/Flow/MaxRoundsExceeded.d.ts +35 -0
  431. package/dist/esm/Flow/MaxRoundsExceeded.d.ts.map +1 -0
  432. package/dist/esm/Flow/MaxRoundsExceeded.js +34 -0
  433. package/dist/esm/Flow/MaxRoundsExceeded.js.map +1 -0
  434. package/dist/esm/Flow/Outcome.d.ts +162 -0
  435. package/dist/esm/Flow/Outcome.d.ts.map +1 -0
  436. package/dist/esm/Flow/Outcome.js +115 -0
  437. package/dist/esm/Flow/Outcome.js.map +1 -0
  438. package/dist/esm/Flow/Result.d.ts +186 -0
  439. package/dist/esm/Flow/Result.d.ts.map +1 -0
  440. package/dist/esm/Flow/Result.js +171 -0
  441. package/dist/esm/Flow/Result.js.map +1 -0
  442. package/dist/esm/Flow/Runtime.d.ts +98 -0
  443. package/dist/esm/Flow/Runtime.d.ts.map +1 -0
  444. package/dist/esm/Flow/Runtime.js +252 -0
  445. package/dist/esm/Flow/Runtime.js.map +1 -0
  446. package/dist/esm/Flow/TypeId.d.ts +8 -0
  447. package/dist/esm/Flow/TypeId.d.ts.map +1 -0
  448. package/dist/esm/Flow/TypeId.js +9 -0
  449. package/dist/esm/Flow/TypeId.js.map +1 -0
  450. package/dist/esm/Flow/index.d.ts +17 -0
  451. package/dist/esm/Flow/index.d.ts.map +1 -0
  452. package/dist/esm/Flow/index.js +18 -0
  453. package/dist/esm/Flow/index.js.map +1 -0
  454. package/dist/esm/Flow/internal.d.ts +34 -0
  455. package/dist/esm/Flow/internal.d.ts.map +1 -0
  456. package/dist/esm/Flow/internal.js +149 -0
  457. package/dist/esm/Flow/internal.js.map +1 -0
  458. package/dist/esm/Flow/make.d.ts +135 -0
  459. package/dist/esm/Flow/make.d.ts.map +1 -0
  460. package/dist/esm/Flow/make.js +111 -0
  461. package/dist/esm/Flow/make.js.map +1 -0
  462. package/dist/esm/FlowRuntime/CancelRequestFailed.d.ts +55 -0
  463. package/dist/esm/FlowRuntime/CancelRequestFailed.d.ts.map +1 -0
  464. package/dist/esm/FlowRuntime/CancelRequestFailed.js +53 -0
  465. package/dist/esm/FlowRuntime/CancelRequestFailed.js.map +1 -0
  466. package/dist/esm/FlowRuntime/ExecutionIdentityConflict.d.ts +23 -0
  467. package/dist/esm/FlowRuntime/ExecutionIdentityConflict.d.ts.map +1 -0
  468. package/dist/esm/FlowRuntime/ExecutionIdentityConflict.js +24 -0
  469. package/dist/esm/FlowRuntime/ExecutionIdentityConflict.js.map +1 -0
  470. package/dist/esm/FlowRuntime/FlowCycleDetected.d.ts +28 -0
  471. package/dist/esm/FlowRuntime/FlowCycleDetected.d.ts.map +1 -0
  472. package/dist/esm/FlowRuntime/FlowCycleDetected.js +35 -0
  473. package/dist/esm/FlowRuntime/FlowCycleDetected.js.map +1 -0
  474. package/dist/esm/FlowRuntime/FlowExecutionNotFound.d.ts +38 -0
  475. package/dist/esm/FlowRuntime/FlowExecutionNotFound.d.ts.map +1 -0
  476. package/dist/esm/FlowRuntime/FlowExecutionNotFound.js +40 -0
  477. package/dist/esm/FlowRuntime/FlowExecutionNotFound.js.map +1 -0
  478. package/dist/esm/FlowRuntime/FlowInstance.d.ts +115 -0
  479. package/dist/esm/FlowRuntime/FlowInstance.d.ts.map +1 -0
  480. package/dist/esm/FlowRuntime/FlowInstance.js +24 -0
  481. package/dist/esm/FlowRuntime/FlowInstance.js.map +1 -0
  482. package/dist/esm/FlowRuntime/FlowRuntime.d.ts +204 -0
  483. package/dist/esm/FlowRuntime/FlowRuntime.d.ts.map +1 -0
  484. package/dist/esm/FlowRuntime/FlowRuntime.js +34 -0
  485. package/dist/esm/FlowRuntime/FlowRuntime.js.map +1 -0
  486. package/dist/esm/FlowRuntime/NodeRecord.d.ts +177 -0
  487. package/dist/esm/FlowRuntime/NodeRecord.d.ts.map +1 -0
  488. package/dist/esm/FlowRuntime/NodeRecord.js +21 -0
  489. package/dist/esm/FlowRuntime/NodeRecord.js.map +1 -0
  490. package/dist/esm/FlowRuntime/WaitingAnnotation.d.ts +69 -0
  491. package/dist/esm/FlowRuntime/WaitingAnnotation.d.ts.map +1 -0
  492. package/dist/esm/FlowRuntime/WaitingAnnotation.js +53 -0
  493. package/dist/esm/FlowRuntime/WaitingAnnotation.js.map +1 -0
  494. package/dist/esm/FlowRuntime/index.d.ts +14 -0
  495. package/dist/esm/FlowRuntime/index.d.ts.map +1 -0
  496. package/dist/esm/FlowRuntime/index.js +15 -0
  497. package/dist/esm/FlowRuntime/index.js.map +1 -0
  498. package/dist/esm/Graph.d.ts +325 -0
  499. package/dist/esm/Graph.d.ts.map +1 -0
  500. package/dist/esm/Graph.js +1485 -0
  501. package/dist/esm/Graph.js.map +1 -0
  502. package/dist/esm/HumanTask.d.ts +442 -0
  503. package/dist/esm/HumanTask.d.ts.map +1 -0
  504. package/dist/esm/HumanTask.js +798 -0
  505. package/dist/esm/HumanTask.js.map +1 -0
  506. package/dist/esm/Interpreter.d.ts +223 -0
  507. package/dist/esm/Interpreter.d.ts.map +1 -0
  508. package/dist/esm/Interpreter.js +1289 -0
  509. package/dist/esm/Interpreter.js.map +1 -0
  510. package/dist/esm/Poll.d.ts +240 -0
  511. package/dist/esm/Poll.d.ts.map +1 -0
  512. package/dist/esm/Poll.js +289 -0
  513. package/dist/esm/Poll.js.map +1 -0
  514. package/dist/esm/RetryPolicy.d.ts +273 -0
  515. package/dist/esm/RetryPolicy.d.ts.map +1 -0
  516. package/dist/esm/RetryPolicy.js +429 -0
  517. package/dist/esm/RetryPolicy.js.map +1 -0
  518. package/dist/esm/Sleep.d.ts +98 -0
  519. package/dist/esm/Sleep.d.ts.map +1 -0
  520. package/dist/esm/Sleep.js +256 -0
  521. package/dist/esm/Sleep.js.map +1 -0
  522. package/dist/esm/Stall.d.ts +173 -0
  523. package/dist/esm/Stall.d.ts.map +1 -0
  524. package/dist/esm/Stall.js +138 -0
  525. package/dist/esm/Stall.js.map +1 -0
  526. package/dist/esm/WaitFor.d.ts +109 -0
  527. package/dist/esm/WaitFor.d.ts.map +1 -0
  528. package/dist/esm/WaitFor.js +184 -0
  529. package/dist/esm/WaitFor.js.map +1 -0
  530. package/dist/esm/index.d.ts +107 -0
  531. package/dist/esm/index.d.ts.map +1 -0
  532. package/dist/esm/index.js +108 -0
  533. package/dist/esm/index.js.map +1 -0
  534. package/dist/esm/internal/BoundedJson.d.ts +48 -0
  535. package/dist/esm/internal/BoundedJson.d.ts.map +1 -0
  536. package/dist/esm/internal/BoundedJson.js +107 -0
  537. package/dist/esm/internal/BoundedJson.js.map +1 -0
  538. package/dist/esm/internal/DeclarationSite.d.ts +135 -0
  539. package/dist/esm/internal/DeclarationSite.d.ts.map +1 -0
  540. package/dist/esm/internal/DeclarationSite.js +196 -0
  541. package/dist/esm/internal/DeclarationSite.js.map +1 -0
  542. package/dist/esm/internal/Declarations.d.ts +35 -0
  543. package/dist/esm/internal/Declarations.d.ts.map +1 -0
  544. package/dist/esm/internal/Declarations.js +43 -0
  545. package/dist/esm/internal/Declarations.js.map +1 -0
  546. package/dist/esm/internal/ExecutionMiddleware.d.ts +21 -0
  547. package/dist/esm/internal/ExecutionMiddleware.d.ts.map +1 -0
  548. package/dist/esm/internal/ExecutionMiddleware.js +13 -0
  549. package/dist/esm/internal/ExecutionMiddleware.js.map +1 -0
  550. package/dist/esm/internal/JsonSchemaSubset.d.ts +133 -0
  551. package/dist/esm/internal/JsonSchemaSubset.d.ts.map +1 -0
  552. package/dist/esm/internal/JsonSchemaSubset.js +363 -0
  553. package/dist/esm/internal/JsonSchemaSubset.js.map +1 -0
  554. package/dist/esm/internal/OutcomeMarker.d.ts +18 -0
  555. package/dist/esm/internal/OutcomeMarker.d.ts.map +1 -0
  556. package/dist/esm/internal/OutcomeMarker.js +18 -0
  557. package/dist/esm/internal/OutcomeMarker.js.map +1 -0
  558. package/docs/README.md +152 -0
  559. package/docs/api.md +440 -0
  560. package/docs/concepts/bodies-and-plans.md +167 -0
  561. package/docs/concepts/execution-identity.md +142 -0
  562. package/docs/concepts/flows-and-actions.md +129 -0
  563. package/docs/concepts/suspension-and-replay.md +130 -0
  564. package/docs/concepts/the-runtime-port.md +110 -0
  565. package/docs/concepts/trampoline-rounds.md +151 -0
  566. package/docs/guides/ask-a-person.md +184 -0
  567. package/docs/guides/build-a-body.md +164 -0
  568. package/docs/guides/cancel-and-roll-back.md +112 -0
  569. package/docs/guides/implement-an-action.md +155 -0
  570. package/docs/guides/inspect-the-plan.md +235 -0
  571. package/docs/guides/poll-until-ready.md +169 -0
  572. package/docs/guides/queue-work-to-a-worker.md +122 -0
  573. package/docs/guides/retry-a-failing-action.md +243 -0
  574. package/docs/guides/reuse-a-recorded-result.md +129 -0
  575. package/docs/guides/run-a-child-flow.md +108 -0
  576. package/docs/guides/run-an-external-job.md +86 -0
  577. package/docs/guides/use-a-prompt.md +38 -0
  578. package/docs/guides/wait-for-a-deadline.md +141 -0
  579. package/docs/guides/wait-for-an-external-signal.md +151 -0
  580. package/docs/installation.md +87 -0
  581. package/docs/quickstart.md +164 -0
  582. package/docs/reference/flow.md +1835 -0
  583. package/docs/testing.md +157 -0
  584. package/docs/troubleshooting.md +286 -0
  585. package/package.json +327 -3
  586. package/src/Action/Action.ts +333 -0
  587. package/src/Action/AttemptTimedOut.ts +37 -0
  588. package/src/Action/BoundaryMode.ts +33 -0
  589. package/src/Action/CacheEnvironment.ts +170 -0
  590. package/src/Action/ConcurrentKeylessDispatch.ts +38 -0
  591. package/src/Action/Context.ts +156 -0
  592. package/src/Action/DuplicateImplementation.ts +24 -0
  593. package/src/Action/FileBoundary.ts +77 -0
  594. package/src/Action/FileInput.ts +42 -0
  595. package/src/Action/Filegroup.ts +16 -0
  596. package/src/Action/Glob.ts +8 -0
  597. package/src/Action/ImplementationVersionMismatch.ts +27 -0
  598. package/src/Action/Implementations.ts +149 -0
  599. package/src/Action/InfraInterrupt.ts +30 -0
  600. package/src/Action/InfraInterruptRetriesExhausted.ts +37 -0
  601. package/src/Action/IrreversibleRetryRequiresIdempotencyKey.ts +32 -0
  602. package/src/Action/StepIdentity.ts +219 -0
  603. package/src/Action/TreeArtifact.ts +8 -0
  604. package/src/Action/TypeId.ts +9 -0
  605. package/src/Action/UncanonicalIdempotencyKey.ts +36 -0
  606. package/src/Action/idempotencyKey.ts +67 -0
  607. package/src/Action/index.ts +31 -0
  608. package/src/Action/make.ts +671 -0
  609. package/src/Action/raceAll.ts +48 -0
  610. package/src/Action/retry.ts +92 -0
  611. package/src/Deadline.ts +201 -0
  612. package/src/DurableClock.ts +176 -0
  613. package/src/DurableDeferred.ts +753 -0
  614. package/src/DurableQueue.ts +519 -0
  615. package/src/ExternalJob.ts +437 -0
  616. package/src/Fault.ts +279 -0
  617. package/src/Flow/Annotations.ts +151 -0
  618. package/src/Flow/CapabilityCeiling.ts +37 -0
  619. package/src/Flow/DeadlineExceeded.ts +40 -0
  620. package/src/Flow/ExecutionIdRequired.ts +36 -0
  621. package/src/Flow/ExecutionIds.ts +133 -0
  622. package/src/Flow/Flow.ts +576 -0
  623. package/src/Flow/MaxRoundsExceeded.ts +39 -0
  624. package/src/Flow/Outcome.ts +179 -0
  625. package/src/Flow/Result.ts +284 -0
  626. package/src/Flow/Runtime.ts +339 -0
  627. package/src/Flow/TypeId.ts +9 -0
  628. package/src/Flow/index.ts +19 -0
  629. package/src/Flow/internal.ts +237 -0
  630. package/src/Flow/make.ts +285 -0
  631. package/src/FlowRuntime/CancelRequestFailed.ts +56 -0
  632. package/src/FlowRuntime/ExecutionIdentityConflict.ts +32 -0
  633. package/src/FlowRuntime/FlowCycleDetected.ts +41 -0
  634. package/src/FlowRuntime/FlowExecutionNotFound.ts +46 -0
  635. package/src/FlowRuntime/FlowInstance.ts +128 -0
  636. package/src/FlowRuntime/FlowRuntime.ts +339 -0
  637. package/src/FlowRuntime/NodeRecord.ts +185 -0
  638. package/src/FlowRuntime/WaitingAnnotation.ts +85 -0
  639. package/src/FlowRuntime/index.ts +17 -0
  640. package/src/Graph.ts +1865 -0
  641. package/src/HumanTask.ts +1007 -0
  642. package/src/Interpreter.ts +1620 -0
  643. package/src/Poll.ts +420 -0
  644. package/src/RetryPolicy.ts +550 -0
  645. package/src/Sleep.ts +296 -0
  646. package/src/Stall.ts +217 -0
  647. package/src/WaitFor.ts +228 -0
  648. package/src/index.ts +125 -0
  649. package/src/internal/BoundedJson.ts +109 -0
  650. package/src/internal/DeclarationSite.ts +214 -0
  651. package/src/internal/Declarations.ts +49 -0
  652. package/src/internal/ExecutionMiddleware.ts +29 -0
  653. package/src/internal/JsonSchemaSubset.ts +392 -0
  654. package/src/internal/OutcomeMarker.ts +19 -0
@@ -0,0 +1,122 @@
1
+ ---
2
+ title: "Hand work to a durable worker"
3
+ description: "Declare a durable queue, suspend a flow until a worker records its result, and run the worker as a layer with bounded concurrency."
4
+ sidebar:
5
+ order: 10
6
+ ---
7
+
8
+ A `DurableQueue` moves work out of the flow that asked for it. The flow offers a
9
+ payload, parks, and resumes when a worker persists a result. Requests and recorded
10
+ results survive the process that made them.
11
+
12
+ ## Declare the queue
13
+
14
+ ```ts
15
+ import { DurableQueue } from "@smthrs/flow"
16
+ import * as Schema from "effect/Schema"
17
+
18
+ export const Renders = DurableQueue.make({
19
+ name: "Renders",
20
+ payload: Schema.Struct({ page: Schema.String }),
21
+ success: Schema.String,
22
+ idempotencyKey: ({ page }) => page
23
+ })
24
+ ```
25
+
26
+ `idempotencyKey` is required. The payload key scopes an occurrence counter;
27
+ the execution ID and occurrence ordinal also contribute to the queue item ID.
28
+ Distinct offers of the same page create distinct items, including within one
29
+ execution. Replaying the same occurrence derives the same ID for queue deduplication.
30
+ Business-level deduplication across distinct offers or runs is the caller's job.
31
+ `success` defaults to `Schema.Void` and `error` to `Schema.Never`.
32
+
33
+ ## Offer work from a flow
34
+
35
+ ```ts
36
+ const rendered = DurableQueue.process(Renders, { page: "home" })
37
+ ```
38
+
39
+ `process` offers the payload under the name `DurableQueue/<name>`, attaches a
40
+ completion token, and suspends the execution until a worker records the handler's
41
+ exit against it. The success and error channels are the queue's declared schemas,
42
+ so the caller sees the worker's own outcome. While suspended, the execution's
43
+ waiting annotation has reason `event` and the item's completion token.
44
+
45
+ Invalid payloads and offer encoding failures die with `SchemaError` without
46
+ retrying. The final offer failure of an exhausted retry schedule also becomes a
47
+ defect. The typed error channel is reserved for the worker's declared error.
48
+
49
+ `retrySchedule` bounds how a failing offer is retried. The default retries with
50
+ exponential delays capped at one minute and never gives up, so a caller that
51
+ wants a bound supplies its own:
52
+
53
+ ```ts
54
+ import * as Schedule from "effect/Schedule"
55
+
56
+ const bounded = DurableQueue.process(Renders, { page: "home" }, {
57
+ retrySchedule: Schedule.recurs(5)
58
+ })
59
+ ```
60
+
61
+ ## Run the worker
62
+
63
+ `DurableQueue.worker` is the layer form: it forks the worker into the layer's
64
+ scope, so it starts with the composition and stops with it.
65
+
66
+ ```ts
67
+ import * as Effect from "effect/Effect"
68
+
69
+ export const RendersWorker = DurableQueue.worker(
70
+ Renders,
71
+ ({ page }) => Effect.succeed(`<html>${page}</html>`),
72
+ { concurrency: 4, maxAttempts: 10 }
73
+ )
74
+ ```
75
+
76
+ `concurrency` defaults to `1` and must be a positive safe integer;
77
+ `DurableQueue.makeWorker` and `DurableQueue.worker` throw a `RangeError`
78
+ otherwise. `makeWorker` is the underlying effect, for a host that wants to fork
79
+ it itself.
80
+
81
+ The handler's exit is what the waiting flow receives. A handler that fails with
82
+ the queue's declared error type resumes the caller with that typed failure; a
83
+ handler that dies resumes it with a defect. An interrupt-only handler exit records
84
+ nothing and requeues the item without consuming an attempt. Mixed failures are
85
+ recorded with interrupt reasons removed.
86
+
87
+ Handler execution is at least once: if recording its result fails, a subsequent
88
+ take runs the handler again. Make side effects idempotent using a business key in
89
+ the payload. `maxAttempts` is passed to the persisted queue and defaults to `10`
90
+ on both worker constructors. Failed takes consume attempts; interrupt-only exits
91
+ do not. A declared handler failure that is successfully recorded completes the
92
+ item instead of retrying it.
93
+
94
+ A worker completes only the wait its own `process` call created: an item stored
95
+ under ID `key` must carry a token for `DurableQueue/<name>/<key>`. An item whose
96
+ token is malformed or names any other wait point is logged at error level and
97
+ acknowledged without running the handler. The worker links its span to the
98
+ offering span only when the stored trace and span ids are 32 and 16 lowercase hex
99
+ characters.
100
+
101
+ A take failure after the handler produces a recordable exit is logged at error
102
+ level with the queue name, item ID, completion token, attempt, attempt limit, and
103
+ whether that limit was reached. At exhaustion the store drops or quarantines the
104
+ item according to its policy. If completion writes exhaust the attempts without
105
+ recording a result, the caller remains suspended and requires recovery by the
106
+ host. Raising `maxAttempts` allows more retries but does not guarantee completion.
107
+
108
+ ## When to reach for it
109
+
110
+ A durable queue is the right shape when the work has a different lifetime or a
111
+ different scaling story from the flow that asked for it: a render farm, a batch
112
+ of uploads, anything where the caller should park rather than hold a slot. When
113
+ the work belongs to the same run, an action is simpler and keeps the step in the
114
+ plan. When it is its own unit of work with its own journal,
115
+ [a child execution](./run-a-child-flow.md) is the closer fit.
116
+
117
+ ## Related pages
118
+
119
+ - [Wait for an external signal](./wait-for-an-external-signal.md): the deferred
120
+ and token machinery the queue's reply channel is built on.
121
+ - [Suspension and replay](../concepts/suspension-and-replay.md): what the caller
122
+ is doing while the worker works.
@@ -0,0 +1,243 @@
1
+ ---
2
+ title: "Retry a failing action"
3
+ description: "Declare a retry policy, understand where the engine makes its retry decision, keep integrity failures unretried, and read the two terminal defects."
4
+ sidebar:
5
+ order: 3
6
+ ---
7
+
8
+ A `RetryPolicy` is plain data, not a `Schedule`. That is deliberate: the next
9
+ delay is derived from a **persisted** attempt count rather than from fiber-local
10
+ state, so a backoff ladder survives a park, a resume, and the death of the
11
+ process that started it.
12
+
13
+ ## Declare a policy
14
+
15
+ ```ts
16
+ import { RetryPolicy } from "@smthrs/flow"
17
+
18
+ const policy = RetryPolicy.make({
19
+ initialMs: 200,
20
+ factor: 2,
21
+ maxMs: 10_000,
22
+ maxAttempts: 5,
23
+ expirationMs: 5 * 60_000,
24
+ jitterRatio: 0.2,
25
+ nonRetryable: ["payments/ChargeDeclined"]
26
+ })
27
+ ```
28
+
29
+ `RetryPolicy.make` checks every bound and throws a `RangeError` naming the field
30
+ that is wrong: `initialMs` finite and greater than zero, `factor` finite and
31
+ positive, `maxMs` finite and not below `initialMs`, `maxAttempts` a safe integer
32
+ of at least one, `expirationMs` finite and positive, and `jitterRatio` finite
33
+ and within zero and one inclusive. `initialMs: 0` is refused rather than read as
34
+ "retry immediately": every computed delay would be zero, which `nextDelay`
35
+ treats as exhausted, so the policy would give up on the first failure whatever
36
+ `maxAttempts` promised. Use `initialMs: 1` for a near-immediate retry.
37
+ `jitterRatio: 0` disables jitter. The
38
+ `nonRetryable` array is copied and frozen, so mutating your array later cannot
39
+ change what a parked policy means.
40
+
41
+ `RetryPolicy.defaultRetryPolicy` is `{ initialMs: 200, factor: 1.5, maxMs: 30000 }`.
42
+ It declares neither `maxAttempts` nor `expirationMs`, so it never gives up. Bound
43
+ a long-lived retry with `expirationMs` when a wall-clock give-up is required.
44
+
45
+ ## Attach it to the work
46
+
47
+ The engine reads `action.retryPolicy` at dispatch. Both forms of `Action.make`
48
+ take it; the [`Action.make` reference](../reference/flow.md#actionmake) lists
49
+ every option. The inline form:
50
+
51
+ ```ts
52
+ import { Action } from "@smthrs/flow"
53
+ import * as Effect from "effect/Effect"
54
+ import * as Schema from "effect/Schema"
55
+
56
+ const settle = Action.make({
57
+ name: "payments/Settle",
58
+ success: Schema.String,
59
+ error: Schema.String,
60
+ tier: "irreversible",
61
+ idempotencyKey: "settle:checkout-v1",
62
+ retryPolicy: policy,
63
+ execute: Effect.suspend(() => callProvider())
64
+ })
65
+ ```
66
+
67
+ A **declared** action, the kind a body names, takes the same option:
68
+
69
+ ```ts
70
+ const Settle = Action.make("payments/Settle", {
71
+ payload: { orderId: Schema.String },
72
+ success: Schema.String,
73
+ error: Schema.String,
74
+ retryPolicy: policy
75
+ })
76
+ ```
77
+
78
+ Two other tools cover different needs:
79
+
80
+ - Dispatch an inline action from inside an implementation when a nested step
81
+ needs its own record and its own attempt sequence.
82
+ - Wrap work in `Action.retry`, which is `Effect.retry` with the durable attempt
83
+ context threaded through it, for a retry the policy does not describe.
84
+
85
+ ```ts
86
+ const attempts = Action.retry(settle, { times: 3 })
87
+ ```
88
+
89
+ `Action.retry` updates `Action.CurrentAttempt` on each attempt and pins ordinals
90
+ per allocation scope, so every attempt of one sequence reuses its own action's
91
+ ordinals instead of drawing new step keys. A nested block shares the enclosing
92
+ block's pinned slot, so a completed inner dispatch replays rather than
93
+ re-executing.
94
+
95
+ ## Infrastructure failures without a declared policy
96
+
97
+ When no `retryPolicy` is declared, Dispatch uses `RetryPolicy.transient` only
98
+ for a typed failure whose `Fault.of(error).class` is `infra`, and only when the
99
+ action has an `idempotencyKey` or explicitly declares an empty `effects.writes`.
100
+ A missing effect declaration does not promise repeat safety. Other failures
101
+ return immediately. A declared policy retains its existing behavior.
102
+
103
+ The transient policy starts at 5 seconds, doubles to a 5-minute cap, and expires
104
+ 2 hours after the first attempt. Durable engines retain the origin and attempt
105
+ count across recovery. Exhaustion preserves the final error and its fault class.
106
+ An unkeyed irreversible action still cannot retry under the irreversible guard.
107
+
108
+ For plain effects that the caller knows are safe to repeat:
109
+
110
+ ```ts
111
+ import { Fault } from "@smthrs/flow"
112
+
113
+ const recovered = Fault.retryTransient(readStatus)
114
+ ```
115
+
116
+ This helper retries typed infrastructure failures under the same bounded policy.
117
+ It preserves the final typed error; defects and cancellation propagate directly.
118
+ Host command adapters can use `Unreachable.classifyExit(stderr)` from
119
+ `@smthrs/kernel` to turn DNS, connection, HTTP 429, and HTTP 5xx failures into
120
+ typed infrastructure errors. Ordinary command failures remain domain errors.
121
+
122
+ ## What the engine decides, and when
123
+
124
+ `RetryPolicy.decide` is the engine's single retry decision point, and
125
+ non-retryable classification happens there and nowhere else. On a failing
126
+ attempt the engine asks the policy, passing the current attempt, the error, and
127
+ the elapsed time since the first attempt:
128
+
129
+ | Decision | What happens |
130
+ | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
131
+ | `RetryAfter(delayMs)` | The engine sleeps and dispatches attempt `n + 1`. An irreversible action with no `idempotencyKey` dies with `IrreversibleRetryRequiresIdempotencyKey` instead. |
132
+ | `GiveUp("nonRetryable")` | The original typed failure propagates unchanged. |
133
+ | `GiveUp("exhausted")` | The final declared failure propagates unchanged. |
134
+ | `GiveUp("expired")` | The final declared failure propagates unchanged. |
135
+
136
+ A spent retry policy preserves the action's error channel. `Node.catch` and
137
+ ordinary typed Effect recovery can handle the final failure. The execution span
138
+ records `retry.stopReason` and `retry.attempt`; adding retries does not turn a
139
+ business failure into a defect. Previously persisted exhaustion defects remain
140
+ historical outcomes and are not rewritten.
141
+
142
+ A durable engine persists the first attempt's start time and the attempt
143
+ sequence, so `expirationMs` is measured from the true first attempt and a
144
+ resumed run does not re-sleep the ladder from attempt one.
145
+
146
+ ## Failures that are never retried
147
+
148
+ `RetryPolicy.defaultNonRetryable` lists error tags that are non-retryable under
149
+ **every** policy, with no per-callsite opt-out. They are integrity verdicts from
150
+ [`@smthrs/engine-store`](/api/engine-store), and they must reach the driver
151
+ without an action-level retry hiding the first detection.
152
+
153
+ Your own tags go in `nonRetryable`. `RetryPolicy.errorTag` is how a tag is read
154
+ off an error: an own string `_tag` when present, otherwise the first own `name`
155
+ descriptor found while walking a bounded prototype chain.
156
+
157
+ ## Bound a hung attempt
158
+
159
+ A retry policy only sees attempts that end. Declare `attemptTimeoutMs` to end
160
+ one that hangs, or `heartbeatTimeoutMs` to end one that stops reporting
161
+ progress through `Action.heartbeat`. Both forms of `Action.make` take them, as
162
+ positive integers:
163
+
164
+ ```ts
165
+ const Fetch = Action.make("sandbox/Fetch", {
166
+ payload: { url: Schema.String },
167
+ success: Schema.String,
168
+ retryPolicy: policy,
169
+ attemptTimeoutMs: 30_000,
170
+ heartbeatTimeoutMs: 5_000
171
+ })
172
+
173
+ const layer = Fetch.toLayer(({ url }) =>
174
+ Effect.gen(function*() {
175
+ const stream = yield* openStream(url)
176
+ // Each heartbeat restarts the 5 second gap.
177
+ return yield* readChunks(stream, { onChunk: () => Action.heartbeat })
178
+ })
179
+ )
180
+ ```
181
+
182
+ An expired bound interrupts the body and dies with `Action.AttemptTimedOut`,
183
+ naming the action, the attempt, the `bound` that expired (`"attempt"` or
184
+ `"heartbeat"`), and its `timeoutMs`. The engine counts that defect as a failed
185
+ attempt: `retryPolicy` decides on it like a typed failure, a durable engine
186
+ records it as a failed attempt row, and listing `"@smthrs/flow/AttemptTimedOut"`
187
+ in `nonRetryable` stops the retries. Without a retry policy, or once the policy
188
+ gives up, the defect is the action's outcome. Every other defect stays
189
+ unretried.
190
+
191
+ ## Infrastructure interrupts
192
+
193
+ An action implementation or transport adapter may fail with
194
+ `Action.InfraInterrupt` when it can identify a retryable infrastructure event.
195
+ It is not an ordinary domain failure and `retryPolicy` does not see it. Only an
196
+ inline action's `interruptRetryPolicy`, an Effect `Schedule`, retries the
197
+ explicit marker. The shipped engines do not convert owner loss, host shutdown,
198
+ or ordinary fiber interruption into it:
199
+
200
+ ```ts
201
+ import * as Schedule from "effect/Schedule"
202
+
203
+ const resilient = Action.make({
204
+ name: "payments/Settle",
205
+ success: Schema.String,
206
+ error: Schema.String,
207
+ interruptRetryPolicy: Schedule.recurs(3),
208
+ execute: callProvider().pipe(
209
+ Effect.catchTag(
210
+ "TransportUnavailable",
211
+ (error) => Effect.fail(new Action.InfraInterrupt({ reason: error.message }))
212
+ )
213
+ )
214
+ })
215
+ ```
216
+
217
+ Spending that schedule without reaching an ordinary success or failure dies with
218
+ `Action.InfraInterruptRetriesExhausted`, carrying the action name, the attempt
219
+ count, and the final interrupt.
220
+
221
+ ## Deciding without an engine
222
+
223
+ The policy functions are pure and exported, so a host can ask the same questions
224
+ the engine asks:
225
+
226
+ ```ts
227
+ RetryPolicy.nextDelay(policy, 2) // Option<number>; None means give up
228
+ RetryPolicy.isNonRetryable(policy, error)
229
+ RetryPolicy.decide(policy, { attempt: 2, error })
230
+ ```
231
+
232
+ `nextDelay` is total even for a policy decoded from a persisted row: a
233
+ non-finite attempt, elapsed time, bound, or computed delay answers `None` rather
234
+ than handing a caller a negative or `NaN` duration. `RetryPolicy.nextDelayEffect`
235
+ and `RetryPolicy.decideEffect` are the variants that sample the `Random` service
236
+ for jitter.
237
+
238
+ ## Related pages
239
+
240
+ - [Attach an implementation to an action](./implement-an-action.md): the tiers a
241
+ retry has to respect.
242
+ - [Suspension and replay](../concepts/suspension-and-replay.md): why
243
+ `suspendedRetryPolicy` on a flow is a different thing entirely.
@@ -0,0 +1,129 @@
1
+ ---
2
+ title: "Reuse a recorded result"
3
+ description: "Declare a cache policy on a sealed action, supply the composition's complete cache environment, and declare the file boundary that makes a result shareable across runs."
4
+ sidebar:
5
+ order: 12
6
+ ---
7
+
8
+ Every sealed action's result is recorded and replayed inside its own execution.
9
+ Reusing one across executions requires an explicit implementation version plus
10
+ the three declarations below. Every interpreter refuses a sealed action with an
11
+ `idempotencyKey` but no `implementationVersion`, before dispatch. Declare the
12
+ version on `Action.make` and attest the same version in `toLayer`. Bump it when
13
+ the implementation or its imported behavior changes, then start a new execution.
14
+ The runtime does not fingerprint code or detect edits under an unchanged version.
15
+
16
+ Without a hard boundary or complete environment, results stay scoped to their
17
+ producing execution.
18
+
19
+ 1. **An identity a second run can derive.** The action's `idempotencyKey`.
20
+ 2. **A hermetic boundary.** The action's declared `FileBoundary`, with
21
+ `boundaryMode: "hard"`.
22
+ 3. **A complete environment.** The composition's `Action.CacheEnvironment`.
23
+
24
+ ## Declare how long the result stays good
25
+
26
+ `Action.withCache` returns a copy of the action annotated with a `CachePolicy`.
27
+ The action is not mutated: `annotate` returns a separate declaration, and that
28
+ copy is what a plan captures.
29
+
30
+ ```ts
31
+ import { Action } from "@smthrs/flow"
32
+ import * as Effect from "effect/Effect"
33
+ import * as Schema from "effect/Schema"
34
+
35
+ const compile = Action.withCache(
36
+ Action.make({
37
+ name: "build/Compile",
38
+ success: Schema.String,
39
+ tier: "sealed",
40
+ idempotencyKey: "build/compile/v1",
41
+ implementationVersion: "compile/v1",
42
+ fileBoundary: { readSet: [], writeSet: [], boundaryMode: "hard" },
43
+ execute: Effect.sync(() => "dist/server.js")
44
+ }),
45
+ { ttlMs: 15 * 60_000, scope: "shared" }
46
+ )
47
+ ```
48
+
49
+ Both policy fields are optional and both defaults are the behavior you get
50
+ without a policy: no age bound, and the reach the composition's environment
51
+ already granted.
52
+
53
+ | Field | Meaning |
54
+ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
55
+ | `ttlMs` | A positive whole number of milliseconds bounding the age of a row the engine may serve. Past it the dispatch executes again. |
56
+ | `scope` | `shared` names the inputs and the environment, so any run on any host that would have produced the same bytes may reuse the row. `flow` and `run` narrow that, folding the flow or the execution into the key so a sibling never reads it. |
57
+
58
+ The engine journals its age judgement as a `flows.engine.cache-provenance`
59
+ record before acting on it, so a reader can tell an expiry from a plain miss, and
60
+ a resumed run reads the verdict it already took instead of re-judging it against
61
+ a fresh clock.
62
+
63
+ `Action.cachePolicyOf(annotations)` reads a policy back off an annotation bag,
64
+ and `Action.CachePolicyAnnotation` is the key it is carried under.
65
+
66
+ ## Declare the file boundary
67
+
68
+ An action's typed `fileBoundary` declares its `Action.FileBoundary`, and the engine folds
69
+ that boundary into the key rather than trusting a caller-supplied field:
70
+
71
+ | Field | Meaning |
72
+ | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
73
+ | `readSet` | Exact files already measured (`Action.FileInput`, a workspace-relative path plus its content digest), or globs to expand while preparing. |
74
+ | `writeSet` | The files or patterns the action may write. |
75
+ | `removes` | The paths the action may delete. Optional, empty by default, and disjoint from `writeSet`: a path cannot be both promised and disclaimed. |
76
+ | `boundaryMode` | `hard` rejects undeclared access immediately. `expected` validates it later. |
77
+
78
+ `removes` exists because a declared write that is absent when the action
79
+ finishes is a defect: recording the absence as valid evidence would cache the
80
+ claim that the file should not exist, and a later replay would act on it by
81
+ deleting the path. A declared removal is what makes an absent path legitimate.
82
+
83
+ `Action.Filegroup`, `Action.Glob`, and `Action.TreeArtifact` are the reusable
84
+ vocabulary those sets are written in: named groups of declarations,
85
+ Bazel-style include and exclude patterns, and a directory output captured and
86
+ replayed as one tree artifact.
87
+
88
+ Both inline and declared actions accept `fileBoundary`. Declared actions may
89
+ compute it from decoded payload fields, and can derive `idempotencyKey` from
90
+ the same payload. They also accept `retryPolicy` and `interruptRetryPolicy`;
91
+ see the [`Action.make` reference](../reference/flow.md#actionmake) for every
92
+ option. A new typed boundary is validated before dispatch. Historical
93
+ inline `metadata` boundary declarations remain readable for existing callers.
94
+
95
+ ## Declare the composition's environment
96
+
97
+ ```ts
98
+ const environment = Action.layerCacheEnvironment({
99
+ layers: ["node@26.4.0", "toolchain@3.1.0"],
100
+ capabilities: { filesystem: ["read", "write"] }
101
+ })
102
+ ```
103
+
104
+ `Action.CacheEnvironment` is `{ layers, capabilities }`: the ordered semantic
105
+ runtime layers, including versions and configuration, and the complete effective
106
+ capability groups. A composition either provides a **complete** value or leaves
107
+ it absent. When it is absent, the engine scopes action keys to the current
108
+ execution rather than presenting incomplete environment data as reusable
109
+ identity, and `Action.CurrentCacheEnvironment` reads `undefined`.
110
+
111
+ That is the safe default and it is doing real work: a half-declared environment
112
+ would let a result computed under one toolchain be served to a run under
113
+ another.
114
+
115
+ ## What cannot enter a key
116
+
117
+ An object-form `idempotencyKey` is caller-owned canonical JSON. Material that
118
+ canonical serialization rejects, such as a `Date`, an `undefined`, a class
119
+ instance, or a `Redacted`, is refused with `Action.UncanonicalIdempotencyKey`
120
+ naming the offending path. The refusal is a typed, non-retryable recorded
121
+ completion rather than an untyped defect, because the same declaration derives
122
+ the same rejection on every attempt and the body never runs.
123
+
124
+ ## Related pages
125
+
126
+ - [Execution identity](../concepts/execution-identity.md): the full account of
127
+ what enters a key, and the one limit of schema-shaped key material.
128
+ - [Attach an implementation to an action](./implement-an-action.md): tiers, and
129
+ when an inline action is the right form.
@@ -0,0 +1,108 @@
1
+ ---
2
+ title: "Run a flow as a child execution"
3
+ description: "Choose between splicing a callee inline, opening a real child execution, and handing off to the next round, and know which build refusals force a boundary."
4
+ sidebar:
5
+ order: 8
6
+ ---
7
+
8
+ A flow can reach another flow in three ways, and they are three different things.
9
+
10
+ | Call | What the caller's plan holds | Requirements | Identity |
11
+ | ----------------------- | ---------------------------------------------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------- |
12
+ | `callee.call(payload)` | The callee's whole body, spliced in. Every inner step is visible and individually keyed. | Propagate to the caller. | The caller's execution. |
13
+ | `callee.child(payload)` | One leaf. | Dropped. | A separate execution, with its own row, journal lineage, retry policy, and placement. |
14
+ | `callee.to(payload)` | The settlement of this round. | Dropped. | The next round of this trampoline lineage. |
15
+
16
+ ## Splice a callee inline
17
+
18
+ ```ts
19
+ import { Action, Flow } from "@smthrs/flow"
20
+ import { Node } from "@smthrs/plan"
21
+ import * as Schema from "effect/Schema"
22
+
23
+ const Build = Action.make("release/Build", {
24
+ payload: { target: Schema.String },
25
+ success: Schema.String
26
+ })
27
+
28
+ export const Compile = Flow.make("release/Compile", {
29
+ payload: { target: Schema.String },
30
+ success: Schema.String,
31
+ body: (payload) => Build.call(payload)
32
+ })
33
+
34
+ export const Release = Flow.make("release/Release", {
35
+ payload: { target: Schema.String },
36
+ success: Schema.String,
37
+ body: ({ target }) => Compile.call({ target })
38
+ })
39
+ ```
40
+
41
+ Inline is the default choice. One plan, one run, and every step of the callee is
42
+ a node the caller's operator can see, key, and replay. The callee's obligations
43
+ become the caller's, which is exactly right: they are running in the caller's
44
+ execution.
45
+
46
+ ## Open a real child
47
+
48
+ ```ts
49
+ export const Fanout = Flow.make("release/Fanout", {
50
+ payload: { targets: Schema.Array(Schema.String) },
51
+ success: Schema.Struct({ web: Schema.String, api: Schema.String }),
52
+ body: () =>
53
+ Node.all({
54
+ web: Compile.child({ target: "web" }),
55
+ api: Compile.child({ target: "api" })
56
+ })
57
+ })
58
+ ```
59
+
60
+ Choose `child` when the callee should be its own unit of work: its own run row to
61
+ watch, its own journal lineage, its own retry and placement decisions. The
62
+ parent's plan holds one leaf naming it, the parent suspends while the child is
63
+ unsettled, and it resumes when the child settles.
64
+
65
+ The identity is derived rather than minted. `Interpreter.childExecutionId`
66
+ combines the parent execution id, the node's address, the callee tag, and a digest
67
+ of the payload, so a re-driven parent lands on the child it already started
68
+ instead of opening a second one. That is what makes a child at most once without
69
+ the caller naming an id.
70
+
71
+ Requirements are dropped at the boundary because the child runs under its own
72
+ driver, which provides its own context. The caller's composition does not have to
73
+ carry the child's implementations, and the child's driver does.
74
+
75
+ ## Hand off to the next round
76
+
77
+ `callee.to(payload)` ends the current round and names the next one. It is the
78
+ loop construct, not a call: nothing comes back, because this execution is over.
79
+ See [Trampoline rounds](../concepts/trampoline-rounds.md).
80
+
81
+ ## When a boundary is required
82
+
83
+ Two build refusals exist to send you to `child` or `to`, and both throw from
84
+ `Graph.build` rather than landing in diagnostics:
85
+
86
+ - `recursion_requires_boundary`: a flow called itself inline. Inline expansion
87
+ would never terminate. Use `to` for a loop or `child` for a nested run.
88
+ - `placement_requires_boundary`: an inline callee declares a `Flow.Placement`
89
+ the enclosing flow cannot satisfy. A placement is a property of an execution,
90
+ so a callee that needs a different one needs its own execution.
91
+
92
+ At run time, `FlowRuntime.FlowCycleDetected` is the separate refusal for a child
93
+ whose execution would close a cycle in the persisted parent chain. Its `path`
94
+ holds the ordered execution ids from the cycle's target back to itself.
95
+
96
+ ## Cancellation and cleanup travel
97
+
98
+ A parent's interruption reaches its children, and a child's suspension reaches
99
+ its parent, because the engine records the lineage edge. Cleanup follows the
100
+ same edges: see
101
+ [Cancel a run and undo its effects](./cancel-and-roll-back.md).
102
+
103
+ ## Related pages
104
+
105
+ - [Flows and actions](../concepts/flows-and-actions.md): the propagation rules,
106
+ stated once.
107
+ - [Execution identity](../concepts/execution-identity.md): how a child's id is
108
+ derived.