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

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 +160 -0
  2. package/LICENSE +21 -0
  3. package/README.md +210 -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 +373 -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 +105 -0
  106. package/dist/cjs/Deadline.d.ts.map +1 -0
  107. package/dist/cjs/Deadline.js +104 -0
  108. package/dist/cjs/Deadline.js.map +7 -0
  109. package/dist/cjs/DurableClock.d.ts +61 -0
  110. package/dist/cjs/DurableClock.d.ts.map +1 -0
  111. package/dist/cjs/DurableClock.js +90 -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 +338 -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 +160 -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 +134 -0
  182. package/dist/cjs/Flow/make.d.ts.map +1 -0
  183. package/dist/cjs/Flow/make.js +104 -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 +198 -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 +175 -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 +1022 -0
  224. package/dist/cjs/Graph.js.map +7 -0
  225. package/dist/cjs/HumanTask.d.ts +440 -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 +222 -0
  230. package/dist/cjs/Interpreter.d.ts.map +1 -0
  231. package/dist/cjs/Interpreter.js +888 -0
  232. package/dist/cjs/Interpreter.js.map +7 -0
  233. package/dist/cjs/Poll.d.ts +238 -0
  234. package/dist/cjs/Poll.d.ts.map +1 -0
  235. package/dist/cjs/Poll.js +150 -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 +133 -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 +405 -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 +105 -0
  383. package/dist/esm/Deadline.d.ts.map +1 -0
  384. package/dist/esm/Deadline.js +152 -0
  385. package/dist/esm/Deadline.js.map +1 -0
  386. package/dist/esm/DurableClock.d.ts +61 -0
  387. package/dist/esm/DurableClock.d.ts.map +1 -0
  388. package/dist/esm/DurableClock.js +75 -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 +231 -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 +134 -0
  459. package/dist/esm/Flow/make.d.ts.map +1 -0
  460. package/dist/esm/Flow/make.js +106 -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 +198 -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 +175 -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 +1482 -0
  501. package/dist/esm/Graph.js.map +1 -0
  502. package/dist/esm/HumanTask.d.ts +440 -0
  503. package/dist/esm/HumanTask.d.ts.map +1 -0
  504. package/dist/esm/HumanTask.js +794 -0
  505. package/dist/esm/HumanTask.js.map +1 -0
  506. package/dist/esm/Interpreter.d.ts +222 -0
  507. package/dist/esm/Interpreter.d.ts.map +1 -0
  508. package/dist/esm/Interpreter.js +1269 -0
  509. package/dist/esm/Interpreter.js.map +1 -0
  510. package/dist/esm/Poll.d.ts +238 -0
  511. package/dist/esm/Poll.d.ts.map +1 -0
  512. package/dist/esm/Poll.js +282 -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 +230 -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 +150 -0
  559. package/docs/api.md +436 -0
  560. package/docs/concepts/bodies-and-plans.md +157 -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 +161 -0
  568. package/docs/guides/cancel-and-roll-back.md +112 -0
  569. package/docs/guides/implement-an-action.md +147 -0
  570. package/docs/guides/inspect-the-plan.md +154 -0
  571. package/docs/guides/poll-until-ready.md +167 -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 +122 -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 +82 -0
  581. package/docs/quickstart.md +155 -0
  582. package/docs/reference/flow.md +1831 -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 +657 -0
  609. package/src/Action/raceAll.ts +48 -0
  610. package/src/Action/retry.ts +92 -0
  611. package/src/Deadline.ts +185 -0
  612. package/src/DurableClock.ts +133 -0
  613. package/src/DurableDeferred.ts +753 -0
  614. package/src/DurableQueue.ts +519 -0
  615. package/src/ExternalJob.ts +432 -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 +309 -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 +279 -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 +333 -0
  637. package/src/FlowRuntime/NodeRecord.ts +183 -0
  638. package/src/FlowRuntime/WaitingAnnotation.ts +85 -0
  639. package/src/FlowRuntime/index.ts +17 -0
  640. package/src/Graph.ts +1860 -0
  641. package/src/HumanTask.ts +1003 -0
  642. package/src/Interpreter.ts +1593 -0
  643. package/src/Poll.ts +414 -0
  644. package/src/RetryPolicy.ts +550 -0
  645. package/src/Sleep.ts +267 -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,157 @@
1
+ ---
2
+ title: "Bodies are plans"
3
+ description: "Why a flow body runs at plan time, what a planned value is and the one rule it obeys, and how branches, fan-out, and recovery stay static topology."
4
+ sidebar:
5
+ order: 2
6
+ ---
7
+
8
+ A flow's `body` is a pure function from the decoded payload to a
9
+ [`Node`](/api/plan). Calling it builds topology. It runs nothing, reads nothing,
10
+ and returns a description that `Graph.build` can walk without dispatching a
11
+ single step.
12
+
13
+ A flow authored with `prompt` has the same body contract: `Flow.make` supplies
14
+ a body that records one ordinary action call. Planning never renders the prompt
15
+ or calls a model. The host implements the exposed `flow.action` and renders
16
+ `flow.prompt` with the decoded payload when that action runs.
17
+
18
+ Reproducible plans require complete, stable declaration identities as well as
19
+ the same payload. Use `Node.capture` to declare semantic captures and imported
20
+ implementation versions, and select stable callback validation. The low-level
21
+ process-local callback policy permits inspection but does not promise the same
22
+ plan across processes. Stable node addresses alone do not prove unchanged
23
+ behavior.
24
+
25
+ ## What a body may not do
26
+
27
+ The body's source digest enters the flow's content identity, so the body must not
28
+ depend on anything the digest cannot observe. In practice:
29
+
30
+ - No mutable module state, clocks, random values, services, or environment
31
+ values captured outside `payload`.
32
+ - No conditionals on a step result written as ordinary JavaScript. A decision
33
+ between two continuations is `Node.branch`, which stores both arms.
34
+ - No work that genuinely wants opaque code. That work is an action, and its
35
+ implementation attaches as a layer.
36
+
37
+ `Flow.make` cannot enforce purity or verify capture completeness. An omitted
38
+ semantic input can change behavior without changing a key, allowing stale
39
+ replay. Do not rely on a key mismatch to detect undeclared behavior changes.
40
+
41
+ ## Planned values
42
+
43
+ The payload a body receives is real data. Every step result inside it is a value
44
+ that does not exist yet, and the body sees it as a `Planned` placeholder.
45
+
46
+ A planned value obeys one rule: **pass it, never compute on it.** Passing it into
47
+ a payload field, into a branch, or into a `map` is fine, and field access is
48
+ allowed because it records a reference path rather than reading anything.
49
+
50
+ ```ts
51
+ import { Node } from "@smthrs/plan"
52
+
53
+ // Allowed: the placeholder is passed on, and `report.summary` records a path.
54
+ Build.call({ target: "site" }).pipe(
55
+ Node.bindPlanned((report) => Publish.call({ summary: report.summary }))
56
+ )
57
+ ```
58
+
59
+ Misuse fails twice, and both failures are deliberate. `Planned` is branded, so
60
+ arithmetic and template interpolation are compile errors. At run time the
61
+ placeholder is a strict proxy whose `Symbol.toPrimitive`, `valueOf`, `toString`,
62
+ `toJSON`, and call traps throw a `GraphBuildError` with the code
63
+ `planned_value_computed`, rather than let a plan be built around `NaN` or
64
+ `"[object Object]"`.
65
+
66
+ Two operations JavaScript exposes no trap for, `Boolean(value)` and strict
67
+ identity, cannot be refused at run time. They reveal only the proxy's truthiness
68
+ or identity, never the result. Decide on real values with `Node.branch`.
69
+
70
+ ## The node vocabulary
71
+
72
+ A body is written in [`@smthrs/plan`](/api/plan)'s `Node` combinators, and each
73
+ one has a job:
74
+
75
+ | Combinator | What it is for |
76
+ | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
77
+ | `Node.succeed(value)` | A constant, for a body that settles without a step. |
78
+ | `Node.all({ ... })` | Independent children, settled concurrently, keyed by name. Width is fixed here, at plan time. |
79
+ | `Node.map(node, f)` | Computation on a step result. The function is digested, not run; it executes later on the real value. |
80
+ | `Node.andThen(node, next)` | A success barrier: no part of the next subtree starts until the first node succeeds. Bound long chains as described below. |
81
+ | `Node.bindPlanned(node, build)` | Builds data dependencies from a placeholder. Independent descendants may run concurrently with the producer. |
82
+ | `Node.branch(node, { if, then, else })` | A decision. Both arms are built once at plan time and both are stored. |
83
+ | `Node.catch(node, { onFailure, error? })` | Recovery. The failure arm is topology too, and a schema narrows which failures it handles. |
84
+ | `Node.priority(node, n)` | Scheduling order for ready work. It never enters key material, so raising it cannot invalidate a recorded result. |
85
+
86
+ Nested explicit `andThen` subtrees carry only their nearest success barrier.
87
+ That prerequisite already depends on the outer barriers, so ordering remains
88
+ transitive and a right-nested chain has linear continuation edges and `Pending`
89
+ inputs.
90
+
91
+ Structural node IDs retain the `.andThen` and `.then` path segments because
92
+ these addresses participate in durable dispatch identity. Each ID grows with
93
+ nesting depth, and total ID bytes in a sequential chain grow quadratically,
94
+ including fluent left-nested chains. Plans repeat IDs in inputs and dependency
95
+ lists. Split long chains into bounded [trampoline rounds](./trampoline-rounds.md)
96
+ or `.child()` flow boundaries; shorter barrier lists do not bound ID bytes.
97
+
98
+ A `map` that decides what happens next is a `branch` written wrongly. Both a
99
+ branch's arms and a catch's failure arm contribute their requirements to the
100
+ node, because both are topology the plan carries: a run takes one of them, but
101
+ which one is not known until the predicate sees the real value.
102
+
103
+ ## Fixed width, and what to do instead
104
+
105
+ `Node.all` settles its members concurrently with no bound, and the member set is
106
+ fixed when the plan is built. Fanning out over something a step discovered is not
107
+ this. End the round and carry the list in the next flow's payload, where it is
108
+ real data. See [Trampoline rounds](./trampoline-rounds.md).
109
+
110
+ For explicit batches, sequence whole `Node.all` subtrees with `Node.andThen`.
111
+ Members within an opened batch remain concurrent. A `bindPlanned` reference
112
+ orders its consumers, not every independent member of the continuation; it is
113
+ not a whole-batch admission barrier. This manual batching is distinct from the
114
+ compiled scheduler's admission caps, which the public interpreter does not yet
115
+ consume.
116
+
117
+ ## What the build refuses
118
+
119
+ `Graph.build` reports what it can and throws what it cannot. Recoverable topology
120
+ issues land in `Graph.diagnostics(graph)`, and a graph carrying diagnostics is
121
+ inspectable but deliberately not compilable, so an incomplete body is reported
122
+ rather than half-driven.
123
+
124
+ Fatal refusals throw a `GraphBuildError` naming the site and the fix. The ones an
125
+ author meets are:
126
+
127
+ | Code | What happened |
128
+ | ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- |
129
+ | `planned_value_computed` | A body computed on a step result. |
130
+ | `invalid_all_member`, `invalid_continuation` | An `all` member or a branch arm was not a node. |
131
+ | `invalid_join` | A race, any, or quorum had a non-node member, no members, or a quorum count its members cannot reach. |
132
+ | `recursion_requires_boundary` | A flow called itself inline. Use `flow.to` or `flow.child`. |
133
+ | `placement_requires_boundary` | An inline callee declares a placement the caller cannot satisfy. Use `flow.child`. |
134
+ | `duplicate_node` | Two structural addresses resolved to one durable node id, which would let a later settlement overwrite an earlier one. |
135
+ | `graph_too_deep`, `payload_too_deep`, `cyclic_payload` | Topology or payload past the build bound, or a payload that contains itself. |
136
+ | `invalid_priority`, `invalid_payload` | A priority that is not a safe integer, or a payload member that cannot be captured as inert JSON. |
137
+
138
+ The two depth refusals exist because the build walks with an explicit stack and
139
+ refuses at a bound, rather than recursing until the native stack overflows
140
+ without a typed error.
141
+
142
+ ## The walk
143
+
144
+ `Interpreter.interpret` builds the graph in full and then drives it, demand
145
+ driven from the root rather than as a sweep over the node list. Dependency order
146
+ puts both branch arms before the branch that chooses between them, and executing
147
+ an arm to discover it was not taken is exactly what static topology exists to
148
+ avoid.
149
+
150
+ ## Related pages
151
+
152
+ - [Compose a body from branches and fan-out](../guides/build-a-body.md): the same
153
+ vocabulary as worked code.
154
+ - [Inspect the plan a body builds](../guides/inspect-the-plan.md): read nodes,
155
+ edges, and diagnostics before anything runs.
156
+ - [Execution identity](./execution-identity.md): how a node address becomes a
157
+ durable step key.
@@ -0,0 +1,142 @@
1
+ ---
2
+ title: "Execution identity"
3
+ description: "How a run gets its execution id, how one dispatch gets its step key, and what enters each of those keys."
4
+ sidebar:
5
+ order: 3
6
+ ---
7
+
8
+ Durability is identity. A re-driven run reads a recorded result only if it asks
9
+ under the same name, so this package is careful about two names: the id of a
10
+ whole execution, and the key of one dispatch inside it.
11
+
12
+ ## The execution id
13
+
14
+ `Flow.execute` resolves identity from the first source that has one:
15
+
16
+ 1. The `executionId` the caller named on `execute`.
17
+ 2. The flow's declared `idempotencyKey`, JSON-tuple framed with the flow tag and
18
+ hashed.
19
+ 3. The ambient `Flow.CurrentExecutionIds` source. Its default, `Flow.fresh`,
20
+ mints a cryptographic UUID, so equal unkeyed requests start independent work.
21
+
22
+ A declared key beats the ambient source because it is the narrower statement:
23
+ this author said what makes two invocations of _this_ flow the same, where the
24
+ source is the host's blanket answer for every flow it drives. Both preimage
25
+ encodings freeze at rc.0, and neither applies Unicode normalization.
26
+
27
+ Install `Flow.derived` explicitly when equal encoded payloads of one flow are
28
+ one piece of work. It encodes the payload with the flow's own codec,
29
+ canonicalizes it under RFC 8785, hashes it, and hashes that together with the
30
+ flow tag:
31
+
32
+ ```ts
33
+ const derivedIdentity = Flow.layerExecutionIds(Flow.derived)
34
+ ```
35
+
36
+ Install the deterministic `derived` source only when equal payloads deliberately
37
+ identify one request. Its existing codec, canonicalization and hash framing are
38
+ unchanged, so this is also the migration path for callers that need to reattach
39
+ to historical automatically derived executions.
40
+
41
+ ```ts
42
+ import { Flow } from "@smthrs/flow"
43
+
44
+ const intentionalPayloadIdentity = Flow.layerExecutionIds(Flow.derived)
45
+ ```
46
+
47
+ `flow.start(payload)` always creates fresh work and returns its id, including
48
+ when the declaration carries an idempotency key. `flow.ensure(payload, { key })`
49
+ returns the id of an explicitly keyed new or existing execution. After a crash,
50
+ reattach with the saved id or the same explicit key; calling unkeyed `execute`
51
+ again starts new work. Read a run with `poll(id)`, or await it with
52
+ `execute(payload, { executionId: id })`.
53
+
54
+ Callers that name an `executionId` and flows that declare an `idempotencyKey` are
55
+ unaffected, because both are decided before the source is consulted.
56
+
57
+ ### When identity cannot be derived
58
+
59
+ `Flow.ExecutionIdRequired` is a defect, not a typed failure. The opt-in derived source raises it when the payload has no canonical
60
+ form: a non-finite number, a lone surrogate, or a cycle. Derivation fails before the
61
+ engine is invoked, because a run under the wrong id is worse than a run that
62
+ does not start.
63
+
64
+ `Flow.executionId(payload)` asks the configured source for an id. With the fresh
65
+ source, pass that returned id explicitly to `execute`; asking again mints a new id. It dies when the payload
66
+ fails the flow's own schema, where `Flow.execute` fails with a typed
67
+ `Schema.SchemaError` for the same input. Precompute an id only for a payload you
68
+ have already validated. Identity and `tokenFromPayload` helpers carry the payload schema's
69
+ `EncodingServices` requirement because the ambient source may encode the payload.
70
+
71
+ ### Child executions
72
+
73
+ A `flow.child(payload)` boundary derives its child's id from the parent
74
+ execution id, the node's address, the callee tag, and a digest of the payload.
75
+ `Interpreter.childExecutionId` is that derivation, exported so a host can name a
76
+ child the same way the interpreter does. Because the id is derived from the
77
+ node's address rather than minted, a re-driven parent lands on the child it
78
+ already started.
79
+
80
+ ## The step key
81
+
82
+ Inside one execution, every dispatch is recorded under a key derived from three
83
+ things.
84
+
85
+ **The allocation scope** comes from `StepIdentity.AllocationIdentity`: the `kind`
86
+ (`action` for user dispatches, `internal` for engine-owned operations, which own
87
+ disjoint counter namespaces), the declaration `name`, an optional `idempotency`
88
+ refinement, and the optional `site`, which is the replay-stable address of the
89
+ graph node driving the dispatch. Distinct graph sites are distinct scopes, so two
90
+ call sites of one declaration never contend for one counter.
91
+
92
+ **The ordinal** is allocated per scope and pinned by dispatch position.
93
+ `Action.CurrentOrdinal` carries an `OrdinalSlot` (`{ values, cursors }`) rather
94
+ than a number, which is what lets every attempt of one `Action.retry` sequence
95
+ reuse its own action's ordinals even when the block dispatches several
96
+ declarations. A nested block shares the pinned `values` with the enclosing block
97
+ and owns a private `cursors` view seeded at entry and merged back on exit, so a
98
+ concurrent sibling never rewinds another block's mid-flight cursor.
99
+
100
+ **The tier** distinguishes an unsealed key from a compensable or irreversible
101
+ one. `StepIdentity.invocationKey` is the single derivation.
102
+
103
+ Concurrent dispatch of one allocation scope is refused with
104
+ `Action.ConcurrentKeylessDispatch`, because arrival order would otherwise decide
105
+ which fiber got which ordinal, and with it which attempt row and which recorded
106
+ outcome. Only a sealed action with a declared `idempotencyKey` is exempt: that
107
+ key is a pure cache key rather than an ordinal, and distinct keys are distinct
108
+ scopes that overlap freely.
109
+
110
+ ## What enters a sealed action's cache key
111
+
112
+ A sealed action's recorded result can be replayed, and with the right
113
+ declarations reused. What the key covers is deliberate:
114
+
115
+ - **Caller-owned identity.** A string `idempotencyKey` is namespaced by the
116
+ action name and the declared schemas. An object key is caller-owned canonical
117
+ JSON and stays stable across an action rename. An object key carrying material
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, and the refusal is not retryable because the same
121
+ declaration derives it on every attempt.
122
+ - **Runtime facts the engine adds.** The complete `Action.CacheEnvironment`
123
+ (`layers` and `capabilities`) and any file boundary derived from the action's
124
+ `metadata`. The engine adds these separately, so caller identity cannot
125
+ override them. When the environment is absent, the engine scopes the key to the
126
+ current execution rather than presenting incomplete data as reusable identity.
127
+
128
+ A flow call node folds the declared schemas into its key material as their JSON
129
+ Schema documents, so changing what a callee accepts or produces re-keys the call.
130
+ The limit is worth stating plainly: two schemas whose decoders disagree can
131
+ serialize to the same document, so changing only a codec's behavior does **not**
132
+ re-key the call, and a result recorded under the old codec is replayed under the
133
+ new one. Effect codecs are not serializable, so nothing can close this
134
+ automatically. Rename the declaration when a transformation changes and the call
135
+ has to be re-keyed.
136
+
137
+ ## Related pages
138
+
139
+ - [Reuse a recorded result](../guides/reuse-a-recorded-result.md): cache policy,
140
+ scope, and the three declarations a shareable result needs.
141
+ - [Suspension and replay](./suspension-and-replay.md): what a replay actually
142
+ does with these keys.
@@ -0,0 +1,129 @@
1
+ ---
2
+ title: "Flows and actions"
3
+ description: "The two nouns of the authoring model: an action carries an implementation attached as a layer, a flow carries a pure body, and the requirement channel is what connects them."
4
+ sidebar:
5
+ order: 1
6
+ ---
7
+
8
+ The package has two nouns and one rule about each.
9
+
10
+ - An **action** is the atom that does the work. It carries an implementation,
11
+ and that implementation attaches separately, as a layer.
12
+ - A **flow** is the composite. It carries a `body`, and never opaque executable
13
+ code.
14
+
15
+ A typed `prompt` declaration lowers to a flow whose body calls one ordinary
16
+ action. The host attaches the model implementation to `flow.action`; the
17
+ renderer is `flow.prompt`. See [Prompt-backed flows](../guides/use-a-prompt.md).
18
+
19
+ Everything else follows from that split, including the surprising part: there is
20
+ no `toLayer` on a flow. A flow has exactly one behavior and it is the body, so
21
+ there is no second behavior to attach.
22
+
23
+ ## Two forms of action
24
+
25
+ `Action.make` selects its form by whether the first argument is a string.
26
+
27
+ The **declared** form is the one you write in a body. It is pure data: a tag,
28
+ schemas, a tier, and optional identity. It holds no code.
29
+
30
+ ```ts
31
+ import { Action } from "@smthrs/flow"
32
+ import * as Schema from "effect/Schema"
33
+
34
+ export const Charge = Action.make("payments/Charge", {
35
+ payload: { customer: Schema.String, cents: Schema.Number },
36
+ success: Schema.String,
37
+ tier: "irreversible",
38
+ idempotencyKey: { charge: "checkout-v1" }
39
+ })
40
+ ```
41
+
42
+ The **inline** form carries its `execute` effect directly and is itself an
43
+ `Effect`. It is what an implementation reaches for when it needs a nested durable
44
+ operation of its own, and it is what `Action.retry` and `Action.raceAll` take.
45
+
46
+ ```ts
47
+ import * as Effect from "effect/Effect"
48
+
49
+ const probe = Action.make({
50
+ name: "payments/Probe",
51
+ success: Schema.String,
52
+ execute: Effect.succeed("ok")
53
+ })
54
+ ```
55
+
56
+ ## The requirement channel
57
+
58
+ `Action.make(tag, ...)` mints one context key for that declaration, derived from
59
+ the tag. `Charge.call(payload)` records a node whose type carries that key.
60
+ `Flow.make` reads the union of those keys off the node its body returns, so a
61
+ flow states in its own type which implementations it names and does not hold:
62
+
63
+ ```ts
64
+ Checkout.execute({ customer: "ada", cents: 4_200 }, { executionId: "checkout-1" })
65
+ // Effect<string, ..., FlowRuntime | Crypto.Crypto | Action.Requirement<"payments/Charge">>
66
+ ```
67
+
68
+ `Charge.toLayer(...)` provides that key. A composition missing an implementation
69
+ therefore fails to compile at the call site instead of dying partway through a
70
+ run. Planning stays requirement-free: building the plan a body describes asks for
71
+ no service at all, and `execute` is the one place the obligations are collected.
72
+
73
+ Three propagation rules follow from where a plan actually goes:
74
+
75
+ | Where | What happens to the requirement |
76
+ | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
77
+ | `flow.call(payload)` | Propagates. The callee's steps join the caller's plan, so its obligations are the caller's. |
78
+ | `flow.child(payload)` and `flow.to(payload)` | Dropped. Each opens a new execution whose own driver supplies its context. Dropping at `to` is also what keeps a self-looping lineage's type finite. |
79
+ | `poll`, `interrupt`, `resume` | Not collected. The first two never drive a body, and a re-driven round runs under the context the flow was registered with, not the resumer's. |
80
+
81
+ ## System actions mint nothing
82
+
83
+ `Action.makeSystem` is the declared form with the requirement erased. `Sleep`,
84
+ `WaitFor`, `HumanTask`, and `Poll`'s exhaustion step all use it, so a body that
85
+ waits pushes no layer obligation onto its callers. The engine owns those
86
+ implementations, and an author cannot be the party who forgot them. You still
87
+ provide `Sleep.layer` or `WaitFor.layer` in the composition; the compiler does
88
+ not force you to.
89
+
90
+ ## The name-keyed table
91
+
92
+ The requirement is the compile-time half. `Action.Implementations` is the
93
+ run-time half: a table keyed by action tag that `toLayer` files itself into. A
94
+ driver expanding a plan it read back out of a journal has no types left to
95
+ consult, so it resolves by tag.
96
+
97
+ That is why `Action.layerImplementations` goes **under** the implementation
98
+ layers rather than beside them:
99
+
100
+ ```ts
101
+ import { Interpreter } from "@smthrs/flow"
102
+ import * as Layer from "effect/Layer"
103
+
104
+ Layer.mergeAll(Charge.toLayer(chargeCard), Interpreter.layer(Checkout)).pipe(
105
+ Layer.provideMerge(Action.layerImplementations)
106
+ )
107
+ ```
108
+
109
+ Filing an implementation happens while its layer is built, so the table has to
110
+ exist first. The table is optional: a composition that only executes handlers
111
+ registered directly with the runtime never needs it.
112
+
113
+ ## Tiers
114
+
115
+ Every action declares a `tier`, which tells the engine what a retry of it means.
116
+
117
+ | Tier | Meaning |
118
+ | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
119
+ | `sealed` | The default. The result is a pure function of the inputs, so a recorded result can be replayed and, with the right declarations, reused across runs. |
120
+ | `compensable` | The body changes the workspace. The engine takes a pre-image before an attempt and restores it before the next one, so the undo is the engine's rather than the body's. |
121
+ | `irreversible` | The body changes the world outside the workspace. Retrying one without a declared `idempotencyKey` fails with `IrreversibleRetryRequiresIdempotencyKey`. |
122
+
123
+ ## Related pages
124
+
125
+ - [Bodies are plans](./bodies-and-plans.md): what a body may and may not do.
126
+ - [Attach an implementation to an action](../guides/implement-an-action.md): the
127
+ layer, the tier, and the ordering rules, in one place.
128
+ - [The runtime port](./the-runtime-port.md): what an engine has to supply for any
129
+ of this to run.
@@ -0,0 +1,130 @@
1
+ ---
2
+ title: "Suspension and replay"
3
+ description: "The three results a flow settles with, what parking on a durable wait actually does, and what a re-driven round replays."
4
+ sidebar:
5
+ order: 4
6
+ ---
7
+
8
+ A flow round settles with one of three results, and the difference between them
9
+ is the whole durability story.
10
+
11
+ | Result | Meaning |
12
+ | ---------------- | --------------------------------------------------------------------------------- |
13
+ | `Flow.Complete` | The round finished. It carries an `Exit`, so a typed failure is a completion too. |
14
+ | `Flow.Suspended` | The round parked on a durable wait and will be re-driven. |
15
+ | `Flow.Handoff` | The round ended by handing off to the next round of a trampoline lineage. |
16
+
17
+ `Flow.isResult` is the guard, `Flow.Result({ success, error })` builds the schema,
18
+ and `Flow.ResultEncoded` is the stored form.
19
+
20
+ ## What parking does
21
+
22
+ A durable wait is not a held fiber. When a body reaches `Sleep.action`,
23
+ `WaitFor.action`, `HumanTask.action`, or an unresolved `DurableDeferred`, the
24
+ implementation declares how it is about to wait through
25
+ `FlowRuntime.annotateWaiting` and then suspends. The engine records a waiting row
26
+ carrying that annotation and releases the run. The process can exit.
27
+
28
+ A `WaitingAnnotation` is `{ reason, wakeAt?, token? }`, and the reason is what an
29
+ operator reads off the run:
30
+
31
+ | Reason | Declared by |
32
+ | ---------- | ------------------------------------------------------------------- |
33
+ | `timer` | `Sleep`, with the deadline as `wakeAt`. |
34
+ | `event` | `WaitFor`, carrying the wake token a completion is matched against. |
35
+ | `approval` | `HumanTask`, carrying the current attempt's token. |
36
+
37
+ `execute(payload, { discard: true })`, `start(payload)`, and
38
+ `ensure(payload, { key })` acknowledge admission without awaiting the result;
39
+ the run can stay parked after the caller receives its execution id.
40
+ Ordinary `execute` follows the run instead: a parked run keeps its caller waiting.
41
+ `flow.poll(executionId)` answers `Option.none` for a run that is known and has
42
+ not settled. An id the
43
+ runtime never recorded is `FlowRuntime.FlowExecutionNotFound` instead, which is a
44
+ different fact and a different failure.
45
+
46
+ ## What a re-drive replays
47
+
48
+ `flow.resume(executionId)` re-drives a suspended execution. The round starts over
49
+ from the top of the body, which is safe precisely because the body is a plan:
50
+
51
+ 1. The graph is rebuilt. Same declarations, same payload, same node addresses.
52
+ 2. Every node whose result the engine already recorded settles from that record.
53
+ No dispatch happens.
54
+ 3. The walk reaches the node that was unsettled and drives it. If its wait is now
55
+ resolved, the recorded completion is what it reads.
56
+
57
+ Nothing about a resume collects the flow's requirements. The runtime captures the
58
+ context a flow was registered under and merges it beneath whatever the run
59
+ supplies, so the implementations that made the first round possible are the ones
60
+ a re-driven round reaches. A party holding an execution id is not the party
61
+ holding the layers.
62
+
63
+ Completion is first-writer-wins. A `DurableDeferred` records the first exit
64
+ submitted against it, and every later read replays that exit. A second completion
65
+ does not overwrite the first.
66
+
67
+ ## The caller's polling budget
68
+
69
+ Ordinary `execute` follows a suspended run, polling and re-driving it instead
70
+ of returning a suspended result. Its default `suspendedRetryPolicy` has no
71
+ attempt or expiry bound, so the caller can keep waiting while the run is parked.
72
+ A bounded `Flow.make` `suspendedRetryPolicy` limits **one caller**: if its
73
+ schedule is spent, `execute` fails with a `SuspendedResumeGaveUp` defect, but
74
+ the execution stays parked. The next caller starts a budget of its own. This
75
+ budget is not durable and does not cancel the run.
76
+
77
+ What bounds work durably is an action's own `RetryPolicy`. The engine restores
78
+ `maxAttempts` from the persisted attempt sequence and the `expirationMs` origin
79
+ from the first attempt's start time, so those survive park, resume, and process
80
+ death. See [Retry a failing action](../guides/retry-a-failing-action.md).
81
+
82
+ ## Failures, defects, and parking on either
83
+
84
+ Two annotations on the flow decide what a round does with something that went
85
+ wrong:
86
+
87
+ ```ts
88
+ import { Flow } from "@smthrs/flow"
89
+
90
+ const Hardened = Review
91
+ .annotate(Flow.CaptureDefects, true)
92
+ .annotate(Flow.SuspendOnFailure, true)
93
+ ```
94
+
95
+ - `Flow.CaptureDefects` defaults to `true`. It includes defects in the result of
96
+ the flow and its actions instead of letting them escape the execution.
97
+ - `Flow.SuspendOnFailure` defaults to `false`. Set it when a round should park on
98
+ any error rather than fail, so an operator can fix the cause and resume.
99
+
100
+ `Flow.intoResult` is what turns a handler effect into a `Result` under those two
101
+ annotations, and it closes the round's flow scope on completion or handoff.
102
+
103
+ ## Scope and cleanup
104
+
105
+ Each round has its own flow scope. Suspension keeps that scope open for a
106
+ re-drive of the same instance. Terminal completion closes it with the round's
107
+ success or failure exit. Handoff closes it with a success exit; the next round
108
+ has a fresh scope.
109
+
110
+ A handoff completes the round successfully and discards its `withRollback` registrations.
111
+ A later round's failure cannot invoke an earlier round's rollback. The engine
112
+ does not provide lineage-scoped compensation. Compensation across rounds
113
+ requires an explicit durable design, not an in-memory scope finalizer. Open
114
+ scopes and their resources do not survive process death.
115
+
116
+ - `Flow.scope` is the scope itself.
117
+ - `Flow.provideScope(effect)` runs an effect against it.
118
+ - `Flow.addFinalizer(f)` registers an exit finalizer, preserving the services
119
+ available where it was registered.
120
+ - `Flow.withRollback(effect, rollback)` registers how to undo a successful effect
121
+ if the current round later exits unsuccessfully. See
122
+ [Cancel a run and undo its effects](../guides/cancel-and-roll-back.md).
123
+
124
+ ## Related pages
125
+
126
+ - [Wait for a deadline](../guides/wait-for-a-deadline.md) and
127
+ [wait for an external signal](../guides/wait-for-an-external-signal.md): the
128
+ two ways a body parks on purpose.
129
+ - [Trampoline rounds](./trampoline-rounds.md): the third result, and the loops it
130
+ makes possible.