@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,86 @@
1
+ ---
2
+ title: "Run an external job"
3
+ description: "Start external work once, park between probes, and reattach after a host restart."
4
+ sidebar:
5
+ order: 8
6
+ ---
7
+
8
+ `ExternalJob.make` composes recorded Start, Status, Collect and Cancel actions
9
+ with ordinary flow handoffs and durable timers. The adapter owns the external
10
+ worker; a parked Smithers execution owns no worker process scope.
11
+
12
+ ```ts
13
+ import { Action, ExternalJob, Flow, Interpreter } from "@smthrs/flow"
14
+ import { Node } from "@smthrs/plan"
15
+ import { RemoteChildProcessSpawner, Sandbox } from "@smthrs/sandbox"
16
+ import { Effect, Layer, Schema } from "effect"
17
+
18
+ const Build = ExternalJob.make("build/external", {
19
+ payload: { source: Schema.String },
20
+ handle: Sandbox.JobHandle,
21
+ success: Sandbox.JobResult,
22
+ error: Schema.Union([RemoteChildProcessSpawner.ProviderError, Sandbox.CaptureError]),
23
+ probe: { every: "15 seconds", max: "2 minutes" },
24
+ timeout: "2 hours",
25
+ restarts: 1
26
+ })
27
+
28
+ // The provider adapter supplies create-or-get, observation, collection and
29
+ // cancellation. Convert cleanup transport errors to visible defects.
30
+ const adapter = Sandbox.job(provider, { command: "make" })
31
+ const buildLayer = Build.toLayer({
32
+ ...adapter,
33
+ cancel: (handle, key) => adapter.cancel(handle, key).pipe(Effect.orDie)
34
+ })
35
+
36
+ const Pipeline = Flow.make("build/pipeline", {
37
+ payload: { source: Schema.String },
38
+ success: Sandbox.JobResult,
39
+ error: Build.errorSchema,
40
+ body: Node.capture({ version: "build/pipeline/v1", build: Build._tag }, (payload) => Build.call(payload))
41
+ })
42
+
43
+ const implementations = Layer.mergeAll(buildLayer, Interpreter.layer(Pipeline))
44
+ .pipe(Layer.provideMerge(Action.layerImplementations))
45
+ ```
46
+
47
+ Use a retained provider. Supply the runtime and the adapter's services, including durable capture receipt
48
+ storage, to that layer. Declare the complete adapter failure union in `error`;
49
+ errors are encoded in durable action outcomes.
50
+
51
+ ## Identity and replay
52
+
53
+ `Build.call` uses the existing child boundary, so each call has its own durable
54
+ execution identity. It does not inline the job into its caller. `.child` and
55
+ `.execute` also retain the ordinary flow APIs. Two calls with identical payloads
56
+ start separate jobs. `.execute` with the same execution id rejoins its lineage.
57
+
58
+ The initial action journals the enclosing job execution id and start time.
59
+ Adapters receive `<execution id>#g1`, then `#g2` for one allowed replacement.
60
+ The public payload cannot select an identity or supply a continuation handle.
61
+ `start` must atomically create-or-get by that key. Smithers replay alone cannot
62
+ make a provider's non-idempotent spawn safe.
63
+
64
+ Status actions have separate probe keys, while the provider receives the same
65
+ job key throughout one generation. Delays double from `probe.every` up to
66
+ `probe.max`, and stop at the original timeout deadline. That deadline is carried
67
+ through every generation and survives a host restart.
68
+
69
+ ## Replacement and cancellation
70
+
71
+ Status returns `Running`, `Exited` with `exitCode`, or `Lost`. `Exited` calls
72
+ `collect`. A collected exit can fail with `ExternalJob.Again` to request a
73
+ replacement. Both Lost and Again complete Cancel before a durable backoff and
74
+ the next Start. A failed cancellation cannot launch another worker.
75
+ `Again` is a dependency fault if it escapes the replacement boundary. A flow's
76
+ own `DeadlineExceeded` is a policy fault: its elapsed deadline is terminal.
77
+
78
+ Exhaustion fails with `ExternalJobLost` (`infra`). Timeout completes Cancel and
79
+ fails with `ExternalJobTimedOut` (`dependency`). `restarts: 0`, the default,
80
+ permits only the first generation. Adapter infrastructure errors retain their
81
+ declared type and use the runtime's repeat-safe retry policy.
82
+
83
+ The actual flow scope retains `Flow.withRollback` cancellation. Timer parking,
84
+ replay and host release preserve the external worker. Explicit cancellation
85
+ cancels it, including a retained parked scope. The rollback is process-local;
86
+ providers still need their retained-machine lease or reaper after a host dies.
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: "Prompt-backed flows"
3
+ description: "Declare a typed prompt with Flow.make and attach its host implementation to the ordinary action it lowers to."
4
+ ---
5
+
6
+ Declare exactly one of `body` or `prompt` with the same tagged constructor:
7
+
8
+ ```ts
9
+ import { Flow } from "@smthrs/flow"
10
+ import * as Schema from "effect/Schema"
11
+
12
+ export const Draft = Flow.make("draft", {
13
+ description: "Drafts a response.",
14
+ payload: { message: Schema.String },
15
+ success: Schema.String,
16
+ prompt: ({ message }) => `Respond to: ${message}`
17
+ })
18
+ ```
19
+
20
+ `Draft` is an ordinary flow. Its body calls `Draft.action`, an ordinary action
21
+ named `draft/prompt`. Constructing the declaration and building its graph never
22
+ render the prompt or call a model. The host renders `Draft.prompt(payload)`
23
+ inside the implementation it attaches with `Draft.action.toLayer(...)`.
24
+
25
+ The prompt receives the decoded payload. Missing or incorrectly typed props
26
+ are TypeScript errors. A host may render an imported typed MDX component from
27
+ that callback; see [MDX prompts](/pkg/registry/guides/mdx-prompts).
28
+
29
+ `model` may name a seat or an ordered nonempty fallback list. When omitted,
30
+ the host supplies its resolved seat. `effort`, `flows`, `system`, and `chat`
31
+ retain host metadata. They do not start a model or widen authority. Declare
32
+ `capabilities` and `effects` for the same ceiling a body-backed flow uses.
33
+
34
+ Supply the model implementation's failure schema as `error`. For the existing
35
+ agent host, use `AgentAction.AgentFailure` from `@smthrs/agent/AgentAction`.
36
+ A prompt action defaults to the irreversible tier and has no content cache key.
37
+ Register `Interpreter.layer(Draft)` and the action implementation under the
38
+ host's ordinary runtime and `Action.layerImplementations`.
@@ -0,0 +1,141 @@
1
+ ---
2
+ title: "Wait for a deadline"
3
+ description: "Park a round on a durable timer with Sleep.action, sleep inside an implementation with DurableClock, and read the refusals an unarmable deadline earns."
4
+ sidebar:
5
+ order: 4
6
+ ---
7
+
8
+ There are two ways to wait for time to pass, and which one you reach for depends
9
+ on where you are standing.
10
+
11
+ - In a **body**, call `Sleep.action`. The wait becomes a keyed plan node: visible
12
+ in the graph, skippable by a branch, and replayed like any other step.
13
+ - In an **implementation**, call `DurableClock.sleep`. A body cannot see it, but
14
+ a handler can reach it.
15
+
16
+ Both park the execution rather than holding a fiber, so the wait outlives the
17
+ process.
18
+
19
+ ## Wait inside a body
20
+
21
+ ```ts
22
+ import { Action, Flow, Interpreter, Sleep } from "@smthrs/flow"
23
+ import { Node } from "@smthrs/plan"
24
+ import * as Layer from "effect/Layer"
25
+ import * as Schema from "effect/Schema"
26
+
27
+ const Notify = Action.make("release/Notify", {
28
+ payload: { build: Schema.String },
29
+ success: Schema.String
30
+ })
31
+
32
+ export const Cooldown = Flow.make("release/Cooldown", {
33
+ payload: { build: Schema.String },
34
+ success: Schema.String,
35
+ error: Sleep.SleepRequestInvalid,
36
+ body: ({ build }) =>
37
+ Sleep.action.call({ millis: 60_000 }).pipe(
38
+ Node.andThen(Notify.call({ build }))
39
+ )
40
+ })
41
+
42
+ export const layer = Layer.mergeAll(
43
+ Sleep.layer,
44
+ Notify.toLayer(({ build }) => notifyRelease(build)),
45
+ Interpreter.layer(Cooldown)
46
+ ).pipe(Layer.provideMerge(Action.layerImplementations))
47
+ ```
48
+
49
+ `Sleep.layer` is not optional. `Sleep.action` is declared with
50
+ `Action.makeSystem`, so it pushes no compile-time obligation onto callers, but a
51
+ composition without the layer has a plan node no implementation answers.
52
+
53
+ The implementation arms a durable clock, declares its park as `timer` with the
54
+ deadline as `wakeAt`, and awaits the clock's deferred. Once the clock has fired,
55
+ its result is persisted, so a re-driven round reads it and runs straight through
56
+ instead of parking a second time.
57
+
58
+ ## Name exactly one deadline
59
+
60
+ A payload carries a relative `millis` or an absolute `until` in epoch
61
+ milliseconds, and exactly one of them. `Sleep.SleepRequestInvalid` is the typed
62
+ refusal, so a body can recover from it with `Node.catch` like any other declared
63
+ failure:
64
+
65
+ | Code | What was wrong |
66
+ | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
67
+ | `missing_deadline` | The payload named neither `millis` nor `until`. |
68
+ | `ambiguous_deadline` | It named both, which are the same fact stated twice. |
69
+ | `invalid_deadline` | It named a number that is not a length of time: a non-finite or negative `millis`, a non-finite `until`, an addition that overflows, or a deadline after epoch millisecond `Number.MAX_SAFE_INTEGER`. |
70
+
71
+ Two behaviors are worth knowing before you write the body:
72
+
73
+ - **Two waits of the same length are two waits.** Each call is its own node with
74
+ its own identity, so a sleep followed by a sleep waits twice.
75
+ - **A deadline that has already passed settles the node instead of parking it.**
76
+ A run that resumes after its own deadline has to make progress.
77
+
78
+ ## Wait inside an implementation
79
+
80
+ `DurableClock.sleep` is the handler-side wait:
81
+
82
+ ```ts
83
+ import { DurableClock } from "@smthrs/flow"
84
+
85
+ const wait = DurableClock.sleep({
86
+ name: "cooldown",
87
+ duration: "2 days",
88
+ inMemoryThreshold: "30 seconds"
89
+ })
90
+ ```
91
+
92
+ The threshold decides the mechanism. A duration at or below
93
+ `inMemoryThreshold`, 60 seconds by default, runs as an in-memory sealed action.
94
+ A longer one schedules a durable clock and suspends the execution. A zero
95
+ duration returns immediately. Both the duration and the threshold must be finite
96
+ and not negative.
97
+
98
+ `DurableClock.make({ name, duration })` builds the clock value on its own, which
99
+ is what you want when you need the clock's deferred rather than the wait, for
100
+ example to race it against real work.
101
+
102
+ ## Bound work with a clock
103
+
104
+ Racing a durable clock against the work is how you put a durable time limit on
105
+ something that can hang. The race records its winner, so a re-driven round reads
106
+ the recorded outcome instead of racing again:
107
+
108
+ ```ts
109
+ import { DurableDeferred } from "@smthrs/flow"
110
+ import * as Duration from "effect/Duration"
111
+ import * as Effect from "effect/Effect"
112
+
113
+ const bounded = DurableDeferred.raceAll({
114
+ name: "deploy/status",
115
+ success: Schema.String,
116
+ error: Schema.Never,
117
+ effects: [
118
+ readDeployment("web"),
119
+ Effect.as(
120
+ DurableClock.sleep({
121
+ name: "deploy/status",
122
+ duration: Duration.seconds(30),
123
+ inMemoryThreshold: Duration.zero
124
+ }),
125
+ "unknown"
126
+ )
127
+ ]
128
+ })
129
+ ```
130
+
131
+ `inMemoryThreshold: Duration.zero` forces the durable path, so the bound outlives
132
+ the process waiting on it rather than living in a fiber.
133
+
134
+ ## Related pages
135
+
136
+ - [Wait for an external signal](./wait-for-an-external-signal.md): the other
137
+ system wait, and the tokens that resolve it.
138
+ - [Poll until something is ready](./poll-until-ready.md): a timer and a check,
139
+ packaged as a lineage of rounds.
140
+ - [Suspension and replay](../concepts/suspension-and-replay.md): what parking
141
+ does to the run.
@@ -0,0 +1,151 @@
1
+ ---
2
+ title: "Wait for an external signal"
3
+ description: "Park a round on a named wait point, resolve it from another process with a completion token, and use durable deferreds directly."
4
+ sidebar:
5
+ order: 5
6
+ ---
7
+
8
+ A run often has to wait for something that is not time and not a step: an
9
+ approval, a webhook, a human closing a ticket. `WaitFor.action` is that wait as an
10
+ ordinary plan node, and a `DurableDeferred` token is how the outside world
11
+ resolves it.
12
+
13
+ ## Park the body on a named wait point
14
+
15
+ ```ts
16
+ import { Action, Flow, Interpreter, WaitFor } from "@smthrs/flow"
17
+ import { Node } from "@smthrs/plan"
18
+ import * as Layer from "effect/Layer"
19
+ import * as Schema from "effect/Schema"
20
+
21
+ const Deploy = Action.make("release/Deploy", {
22
+ payload: { build: Schema.String },
23
+ success: Schema.String
24
+ })
25
+
26
+ export const Ship = Flow.make("release/Ship", {
27
+ payload: { build: Schema.String },
28
+ success: Schema.String,
29
+ error: WaitFor.WaitForRequestInvalid,
30
+ body: ({ build }) =>
31
+ WaitFor.action.call({ name: "ship" }).pipe(
32
+ Node.andThen(Deploy.call({ build }))
33
+ )
34
+ })
35
+
36
+ export const layer = Layer.mergeAll(
37
+ WaitFor.layer,
38
+ Deploy.toLayer(({ build }) => deployBuild(build)),
39
+ Interpreter.layer(Ship)
40
+ ).pipe(Layer.provideMerge(Action.layerImplementations))
41
+ ```
42
+
43
+ The implementation parks the execution under the `event` waiting reason, carrying
44
+ the wake token a completion is matched against, and settles with whatever value
45
+ resolved the wait. `WaitFor.action` succeeds with `Schema.Json`, so decode the
46
+ answer with a schema when you need a typed value.
47
+
48
+ `WaitFor.layer` is required in the composition for the same reason `Sleep.layer`
49
+ is: the node is a system declaration, so the compiler does not ask for it, but
50
+ the run does.
51
+
52
+ ## Resolve it from outside
53
+
54
+ `WaitFor.deferred(name)` is the resolver's half of the same wait point. Derive
55
+ the token from the flow and the execution id, then complete it:
56
+
57
+ ```ts
58
+ import { DurableDeferred } from "@smthrs/flow"
59
+ import * as Effect from "effect/Effect"
60
+
61
+ const gate = WaitFor.deferred("ship")
62
+
63
+ export const approve = (executionId: string) =>
64
+ Effect.gen(function*() {
65
+ const token = DurableDeferred.tokenFromExecutionId(gate, { flow: Ship, executionId })
66
+ yield* DurableDeferred.succeed(gate, { token, value: { approved: true } })
67
+ })
68
+ ```
69
+
70
+ The resolver needs the `FlowRuntime` the run was started on, because a completion
71
+ is recorded against the flow and execution that own the wait point. In practice
72
+ that means the resolver and the engine share a store.
73
+
74
+ `DurableDeferred.tokenFromPayload(gate, { flow, payload })` derives the same token
75
+ from a payload, for a resolver that knows what was asked for but not which id it
76
+ was admitted under. This requires the flow to declare `idempotencyKey`; use
77
+ `tokenFromExecutionId` when the caller supplied an execution id explicitly.
78
+
79
+ A token is an address, not a credential. Anyone who knows the flow and the
80
+ execution id, or the payload, can rebuild it, so a resolver that accepts
81
+ completions from other parties must authorize the caller before it calls
82
+ `DurableDeferred.succeed`.
83
+
84
+ ## Name exactly one target
85
+
86
+ A `WaitFor` payload names the wait point by `name`, relative to the running
87
+ execution, or by an absolute `token`. `WaitFor.WaitForRequestInvalid` is the
88
+ typed refusal:
89
+
90
+ | Code | What was wrong |
91
+ | ------------------- | ------------------------------------------------------------------------------------------------- |
92
+ | `missing_target` | The payload named neither `name` nor `token`. |
93
+ | `ambiguous_target` | It named both. |
94
+ | `malformed_token` | The token does not parse. |
95
+ | `foreign_execution` | The token is addressed to another flow or another execution, which this execution cannot observe. |
96
+
97
+ `foreign_execution` is a refusal rather than a silent park because a foreign
98
+ token would park forever while the value it names was recorded somewhere else.
99
+
100
+ ## Durable deferreds on their own
101
+
102
+ `WaitFor` is a thin declaration over `DurableDeferred`, and you can use the
103
+ primitive directly inside an implementation:
104
+
105
+ ```ts
106
+ const Approval = DurableDeferred.make("Approval", {
107
+ success: Schema.Boolean,
108
+ error: Schema.String
109
+ })
110
+
111
+ // Inside a flow: park until it is completed.
112
+ const awaited = DurableDeferred.await(Approval)
113
+
114
+ // Or run an effect and record its exit into the deferred.
115
+ const computed = DurableDeferred.into(Effect.succeed(true), Approval)
116
+
117
+ // Race several, persisting the first exit under `raceAll/first-answer`.
118
+ const winner = DurableDeferred.raceAll({
119
+ name: "first-answer",
120
+ success: Schema.Boolean,
121
+ error: Schema.String,
122
+ effects: [awaited, computed]
123
+ })
124
+ ```
125
+
126
+ Four surfaces complete a deferred from outside, and all four take a token:
127
+ `DurableDeferred.succeed`, `fail`, `failCause`, and `done` with a full `Exit`.
128
+ Inside a running flow, `DurableDeferred.token(self)` mints the token for the
129
+ current execution.
130
+
131
+ Two rules govern every completion:
132
+
133
+ - **First writer wins.** The first recorded exit is the one every later read
134
+ replays. A second completion does not overwrite it.
135
+ - **A token names one deferred.** A token whose `deferredName` is not this
136
+ deferred's fails with `DurableDeferred.TokenInvalid` carrying
137
+ `deferred_mismatch`, and a token that does not parse fails with
138
+ `malformed_token`.
139
+
140
+ A token encodes the flow name, the execution id, and the deferred name, which is
141
+ exactly what another process needs to write to the right durable address.
142
+ `DurableDeferred.TokenParsed` is the decoded form.
143
+
144
+ ## Related pages
145
+
146
+ - [Ask a person for a decision](./ask-a-person.md): the same wait point machinery
147
+ with validation, re-asking, and a deadline on top.
148
+ - [Wait for a deadline](./wait-for-a-deadline.md): the timer half of the same
149
+ vocabulary.
150
+ - [Hand work to a durable worker](./queue-work-to-a-worker.md): a deferred used
151
+ as a request and response channel.
@@ -0,0 +1,87 @@
1
+ ---
2
+ title: "Installation"
3
+ description: "Install @smthrs/flow from npm, its runtime requirements and effect range, its import forms, and the packages a runnable composition adds."
4
+ sidebar:
5
+ order: 1
6
+ ---
7
+
8
+ ## Install the package
9
+
10
+ ```bash
11
+ npm install @smthrs/flow@next effect
12
+ ```
13
+
14
+ The `next` tag carries the 1.0 release candidates.
15
+
16
+ `effect` is a peer dependency of this package, in the range `^4.0.4`. Add one
17
+ `effect` in that range to your own dependencies: your declarations import
18
+ `effect/Schema` and your implementations import `effect/Effect` directly, and two
19
+ copies of `effect` in one program are two sets of service tags.
20
+
21
+ The package requires Node.js 26.4.0 or later. It ships as both ESM and
22
+ CommonJS with TypeScript declarations, and it pulls in
23
+ [`@smthrs/plan`](/api/plan), [`@smthrs/crypto`](/api/crypto),
24
+ [`@smthrs/keys`](/api/keys), and [`@smthrs/canonical`](/api/canonical), which
25
+ supply the node vocabulary a body is written in, the digests identity is built
26
+ from, and the canonical JSON checks applied to values.
27
+
28
+ ## Use the libraries
29
+
30
+ Every `@smthrs` library installs from npm the same way. Name each package your
31
+ code imports with the `next` tag, and add one `effect` in the `^4.0.4` range
32
+ the libraries peer. The [Quickstart](./quickstart.md) program needs these:
33
+
34
+ ```bash
35
+ npm install @smthrs/flow@next @smthrs/engine@next @smthrs/plan@next @effect/platform-node effect
36
+ ```
37
+
38
+ `next` resolves every `@smthrs` package to the same release candidate. With
39
+ pnpm 11, name that version instead of the tag; the
40
+ [Flows installation](https://github.com/smithersai/smithers/blob/main/packages/smithers/flows/docs/installation.md)
41
+ explains why.
42
+
43
+ ## Import forms
44
+
45
+ The root entry point re-exports every module as a namespace:
46
+
47
+ ```ts
48
+ import { Action, DurableDeferred, Flow, Interpreter, RetryPolicy } from "@smthrs/flow"
49
+ ```
50
+
51
+ Several modules are also importable from their own subpath, which is the form the
52
+ reference uses:
53
+
54
+ ```ts
55
+ import * as CacheEnvironment from "@smthrs/flow/CacheEnvironment"
56
+ import * as Flow from "@smthrs/flow/Flow"
57
+ ```
58
+
59
+ The `exports` map publishes `@smthrs/flow/Action`, `/CacheEnvironment`,
60
+ `/FileBoundary`, `/FileInput`, `/Flow`, `/FlowRuntime`, `/StepIdentity`, and one
61
+ subpath per top-level module (`DurableClock`, `DurableDeferred`, `DurableQueue`,
62
+ `Graph`, `HumanTask`, `Interpreter`, `Poll`, `RetryPolicy`, `Sleep`, `WaitFor`).
63
+ Four subpath shapes resolve to nothing on purpose: `@smthrs/flow/internal/*`,
64
+ `@smthrs/flow/*/index`, and the per-file paths under `Action/`, `Flow/`, and
65
+ `FlowRuntime/`. Reach those namespaces through their directory subpath instead.
66
+ `@smthrs/flow/package.json` is exported.
67
+
68
+ ## What a runnable composition adds
69
+
70
+ This package declares the `FlowRuntime` port and implements none of it, so a
71
+ composition that runs a flow adds an engine and a platform crypto service.
72
+
73
+ - [`@smthrs/engine`](/api/engine) implements `FlowRuntime`. Its
74
+ `FlowEngine.layerMemory` keeps every recorded step in the process, which is
75
+ what the [Quickstart](./quickstart.md) and most tests use.
76
+ - `@effect/platform-node` supplies `NodeCrypto.layer`. An action dispatch is
77
+ recorded under a derived step identity, so the engine needs a `Crypto` service
78
+ even in memory. A browser host supplies its own, such as `BrowserCrypto` from
79
+ `@effect/platform-browser`; nothing in this package imports a Node built-in.
80
+
81
+ Add [`@smthrs/engine-store`](/api/engine-store) when the recorded steps have to
82
+ outlive the process. It backs the same port with SQLite, which is what turns a
83
+ suspended run into one a later process resumes.
84
+
85
+ ## Next step
86
+
87
+ Run a flow end to end in the [Quickstart](./quickstart.md).
@@ -0,0 +1,164 @@
1
+ ---
2
+ title: "Quickstart"
3
+ description: "Declare an action and a flow, compose the layers, run the flow on the in-memory engine, and read a typed result."
4
+ sidebar:
5
+ order: 2
6
+ ---
7
+
8
+ This quickstart runs one flow end to end on the in-memory engine. Nothing here
9
+ touches a database or the network, and the result arrives as a typed value
10
+ decoded by the schema you declared.
11
+
12
+ A runnable copy of this program is published in the Smithers examples,
13
+ [`01-define-and-run.ts`](https://github.com/smithersai/smithers/blob/main/examples/src/01-define-and-run.ts).
14
+
15
+ ## Prerequisites
16
+
17
+ - Node.js 26.4.0 or later.
18
+ - A project with the packages installed:
19
+
20
+ ```bash
21
+ npm install @smthrs/flow@next @smthrs/engine@next @smthrs/plan@next @effect/platform-node effect
22
+ ```
23
+
24
+ ## Declare the action and the flow
25
+
26
+ Create `quickstart.ts`. `Action.make` with a string tag is the declared form:
27
+ schemas and a stable name, no code.
28
+
29
+ ```ts
30
+ import { Action, Flow } from "@smthrs/flow"
31
+ import { Node } from "@smthrs/plan"
32
+ import * as Schema from "effect/Schema"
33
+
34
+ export const Greet = Action.make("examples/Greet", {
35
+ payload: { name: Schema.String },
36
+ success: Schema.String
37
+ })
38
+
39
+ export const Greeting = Flow.make("examples/Greeting", {
40
+ payload: { name: Schema.String },
41
+ success: Schema.String,
42
+ body: Node.capture(
43
+ { action: Greet.name, implementationVersion: "greeting/v1" },
44
+ (payload) => Greet.call(payload)
45
+ )
46
+ })
47
+ ```
48
+
49
+ `Greet.call(payload)` records one node and runs nothing. It also puts a
50
+ requirement in the node's type, which `Flow.make` reads off the body: the flow
51
+ now says in its own type that it names an implementation it does not carry.
52
+
53
+ ## Attach the implementation and compose the layers
54
+
55
+ `Node.capture` declares every semantic value outside the callback source. Here
56
+ it names the action and versions the imported behavior. Change that version when
57
+ that behavior changes. JavaScript cannot verify capture completeness.
58
+
59
+ `toLayer` is where the code lives. `Interpreter.layerWithImplementations`
60
+ registers the flow and its implementations with stable callback admission. It
61
+ refuses uncaptured callbacks before dispatch. The lower-level `Graph.build` and
62
+ `Interpreter.layer` default to `process-local`, which makes no cross-process
63
+ callback identity guarantee.
64
+
65
+ All interpreter paths require `implementationVersion` on a sealed action with an
66
+ `idempotencyKey`, and the same version in its `toLayer` registration. Bump the
67
+ version when its implementation changes. This quickstart uses invocation-scoped
68
+ actions without an idempotency key, so no implementation version is required.
69
+
70
+ Compose the layers:
71
+
72
+ ```ts
73
+ import * as NodeCrypto from "@effect/platform-node/NodeCrypto"
74
+ import { FlowEngine } from "@smthrs/engine"
75
+ import { Interpreter } from "@smthrs/flow"
76
+ import * as Effect from "effect/Effect"
77
+ import * as Layer from "effect/Layer"
78
+
79
+ const GreetingLayer = Interpreter.layerWithImplementations(
80
+ Greeting,
81
+ Greet.toLayer(({ name }) => Effect.succeed(`Hello, ${name}.`))
82
+ ).pipe(
83
+ Layer.provideMerge(FlowEngine.layerMemory),
84
+ Layer.provideMerge(NodeCrypto.layer)
85
+ )
86
+ ```
87
+
88
+ `layerWithImplementations` supplies the action registry while building the
89
+ implementation layers. The remaining providers supply the runtime and digest:
90
+
91
+ - `FlowEngine.layerMemory` supplies the `FlowRuntime` port. Swap it for the
92
+ durable engine from [`@smthrs/engine-store`](/api/engine-store) and nothing
93
+ above changes.
94
+ - `NodeCrypto.layer` supplies `Crypto`. Every dispatch is recorded under a
95
+ derived step identity, so the engine needs a digest even in memory.
96
+
97
+ ## Run it
98
+
99
+ `execute` takes the payload and an execution id:
100
+
101
+ ```ts
102
+ export const main: Effect.Effect<string> = Greeting.execute(
103
+ { name: "Ada" },
104
+ { executionId: "greeting-ada-1" }
105
+ ).pipe(
106
+ // A payload that misses the flow's schema is a typed failure, not a defect.
107
+ // This payload is statically valid, so a refusal here would be a bug.
108
+ Effect.orDie,
109
+ Effect.provide(GreetingLayer)
110
+ )
111
+
112
+ console.log(await Effect.runPromise(main))
113
+ ```
114
+
115
+ Run the file with your TypeScript runner. The output is the decoded success
116
+ value:
117
+
118
+ ```text
119
+ Hello, Ada.
120
+ ```
121
+
122
+ ## Run it twice
123
+
124
+ Execute the same flow again under the same execution id. The action does not run
125
+ a second time:
126
+
127
+ ```ts
128
+ export const twice: Effect.Effect<string> = Effect.gen(function*() {
129
+ const run = Effect.orDie(
130
+ Greeting.execute({ name: "Ada" }, { executionId: "greeting-ada-1" })
131
+ )
132
+ yield* run
133
+ return yield* run
134
+ }).pipe(Effect.provide(GreetingLayer))
135
+ ```
136
+
137
+ An execution id names one run. The second call finds the run that already
138
+ settled and answers with its result instead of starting another, and a durable
139
+ engine behaves the same way across a restart: it rebuilds the plan, derives the
140
+ same key for the same node, reads the recorded result, and reaches only the
141
+ steps that never settled. That is what separating the plan from the code buys.
142
+ Identity is a function of the declaration, so a repeat is a read.
143
+
144
+ An execution id is also a claim about what the run is. Reusing one for a
145
+ different flow, or for a different payload, is refused rather than silently
146
+ joined.
147
+
148
+ ## What just happened
149
+
150
+ `Greeting.execute` asked the runtime for an execution under
151
+ `greeting-ada-1`. The interpreter built the graph of the body, walked it, and
152
+ dispatched `examples/Greet` through the engine, which recorded the attempt and
153
+ its result. With a pure body, complete captures, and stable callback admission,
154
+ unchanged source, captures, declarations, and payload reproduce the same plan
155
+ keys across processes. Changed source, captures, or implementation versions
156
+ require a newly planned run.
157
+
158
+ ## Next steps
159
+
160
+ - [Flows and actions](./concepts/flows-and-actions.md): why the implementation
161
+ attaches separately, and what the requirement channel buys you.
162
+ - [Build a body](./guides/build-a-body.md): sequencing, fan-out, branches, and
163
+ recovering from a typed failure.
164
+ - [Testing](./testing.md): the same in-memory composition as a test habit.