@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,671 @@
1
+ // Deep reviewed and polished by a human on 2026-08-10.
2
+
3
+ /**
4
+ * Constructs executable durable action values.
5
+ *
6
+ * @since 0.1.0
7
+ */
8
+
9
+ import type * as Effects from "@smthrs/plan/Effects"
10
+ import * as Node from "@smthrs/plan/Node"
11
+ import * as Cause from "effect/Cause"
12
+ import * as Context from "effect/Context"
13
+ import * as Deferred from "effect/Deferred"
14
+ import * as Effect from "effect/Effect"
15
+ import * as Effectable from "effect/Effectable"
16
+ import * as Exit from "effect/Exit"
17
+ import * as Fiber from "effect/Fiber"
18
+ import * as Layer from "effect/Layer"
19
+ import * as Option from "effect/Option"
20
+ import * as Predicate from "effect/Predicate"
21
+ import type * as Schedule from "effect/Schedule"
22
+ import * as Schema from "effect/Schema"
23
+ import type { Scope } from "effect/Scope"
24
+ import type * as Flow from "../Flow/Flow.ts"
25
+ import { makeProto } from "../Flow/internal.ts"
26
+ import * as FlowHelpers from "../Flow/Runtime.ts"
27
+ import { FlowInstance } from "../FlowRuntime/FlowInstance.ts"
28
+ import { FlowRuntime } from "../FlowRuntime/FlowRuntime.ts"
29
+ import { lowerDeclarations } from "../internal/Declarations.ts"
30
+ import * as DeclarationSite from "../internal/DeclarationSite.ts"
31
+ import type * as RetryPolicy from "../RetryPolicy.ts"
32
+ import type { Action, Declared, IdempotencyKey, Requirement, Tier } from "./Action.ts"
33
+ import { AttemptTimedOut } from "./AttemptTimedOut.ts"
34
+ import { CurrentAttempt, CurrentHeartbeat } from "./Context.ts"
35
+ import { FileBoundary } from "./FileBoundary.ts"
36
+ import { type Implementation, Implementations } from "./Implementations.ts"
37
+ import { ImplementationVersionMismatch } from "./ImplementationVersionMismatch.ts"
38
+ import type { InfraInterrupt } from "./InfraInterrupt.ts"
39
+ import { InfraInterruptRetriesExhausted } from "./InfraInterruptRetriesExhausted.ts"
40
+ import { TypeId } from "./TypeId.ts"
41
+
42
+ interface ExitSchemas {
43
+ readonly exitSchema: Schema.Exit<any, any, any>
44
+ readonly exitSchemaPartial: Schema.Exit<any, any, any>
45
+ }
46
+
47
+ // A declared action mints a fresh inline action per dispatch. Effect caches
48
+ // compiled parsers by AST identity, so the exit schemas are shared per
49
+ // (success, error) pair rather than rebuilt on every dispatch.
50
+ const exitSchemaCache = new WeakMap<object, WeakMap<object, ExitSchemas>>()
51
+
52
+ const exitSchemasFor = (
53
+ success: Schema.Constraint,
54
+ error: Schema.Constraint,
55
+ successJson: Schema.Top,
56
+ errorJson: Schema.Top
57
+ ): ExitSchemas => {
58
+ let byError = exitSchemaCache.get(success)
59
+ if (byError === undefined) {
60
+ byError = new WeakMap()
61
+ exitSchemaCache.set(success, byError)
62
+ }
63
+ let cached = byError.get(error)
64
+ if (cached === undefined) {
65
+ cached = {
66
+ exitSchema: Schema.Exit(successJson, errorJson, Schema.Defect()),
67
+ exitSchemaPartial: Schema.Exit(successJson, errorJson, Schema.Unknown)
68
+ }
69
+ byError.set(error, cached)
70
+ }
71
+ return cached
72
+ }
73
+
74
+ /**
75
+ * The options of a declared action, shared by {@link make}'s declared form and
76
+ * {@link makeSystem}.
77
+ */
78
+ interface DeclaredOptions<
79
+ Payload extends Schema.Struct.Fields | Flow.AnyStructSchema,
80
+ Success extends Schema.Top,
81
+ Error extends Schema.Top
82
+ > {
83
+ readonly payload: Payload
84
+ /**
85
+ * Native declaration whose source location this reconstructed action retains.
86
+ * A source with no recorded location preserves that absence. This affects
87
+ * diagnostics only, never identity; calls still refer to the new declaration.
88
+ */
89
+ readonly declaredFrom?: object | undefined
90
+ readonly implementationVersion?: string | undefined
91
+ readonly success?: Success | undefined
92
+ readonly error?: Error | undefined
93
+ /**
94
+ * The capability ceiling this action dispatches under, as string literals.
95
+ *
96
+ * It is the same ceiling {@link module:Flow/Annotations.Capabilities}
97
+ * carries, and declaring it here is what makes it READABLE without importing
98
+ * the module, exactly as `Flow.make`'s option is: a catalog projects a
99
+ * discovered declaration's authority from the source text of this literal,
100
+ * and an annotation built at run time is invisible to that projection.
101
+ *
102
+ * {@link module:Graph.build} records a `capability_outside_grant` refusal for
103
+ * every capability named here that the calling flow does not hold. The
104
+ * refusal is advisory: execution intersects this ceiling with every caller ceiling.
105
+ */
106
+ readonly capabilities?: ReadonlyArray<string> | undefined
107
+ /**
108
+ * The effect envelope this action dispatches under, as a literal.
109
+ *
110
+ * It is the same declaration {@link module:Flow/Annotations.EffectEnvelope}
111
+ * carries, declared here for the same reason `capabilities` is.
112
+ *
113
+ * An action is a leaf, so this envelope encloses nothing; it is checked
114
+ * against the envelope the calling flow granted, and
115
+ * {@link module:Graph.build} refuses a dispatch that reads or writes outside
116
+ * that grant, loosens `hermetic` to `expected`, or raises the tier. `reads`
117
+ * and `writes` are normalized to sorted, duplicate-free arrays.
118
+ */
119
+ readonly effects?: Effects.MakeOptions | undefined
120
+ readonly tier?: Tier | undefined
121
+ readonly idempotencyKey?:
122
+ | IdempotencyKey
123
+ | ((payload: (Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload)["Type"]) => IdempotencyKey)
124
+ | undefined
125
+ readonly nondeterministic?: true | undefined
126
+ readonly retryPolicy?: RetryPolicy.RetryPolicy | undefined
127
+ /**
128
+ * Milliseconds one attempt may run. A longer attempt is interrupted and
129
+ * fails with {@link module:AttemptTimedOut.AttemptTimedOut}, which
130
+ * `retryPolicy` retries like any other attempt failure.
131
+ */
132
+ readonly attemptTimeoutMs?: number | undefined
133
+ /**
134
+ * Milliseconds one attempt may go without calling
135
+ * {@link module:Context.heartbeat}, measured from the attempt's start and
136
+ * then from each heartbeat. A missed heartbeat fails the attempt like
137
+ * `attemptTimeoutMs`.
138
+ */
139
+ readonly heartbeatTimeoutMs?: number | undefined
140
+ readonly interruptRetryPolicy?: Schedule.Schedule<any, unknown> | undefined
141
+ readonly fileBoundary?:
142
+ | FileBoundary
143
+ | ((payload: (Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload)["Type"]) => FileBoundary)
144
+ | undefined
145
+ readonly annotations?: Context.Context<never> | undefined
146
+ }
147
+
148
+ /**
149
+ * Creates a flow action from an effect, using the provided schemas to
150
+ * encode successes and failures for durable execution.
151
+ *
152
+ * @category constructors
153
+ * @since 0.1.0
154
+ */
155
+ const makeInline = <
156
+ R,
157
+ Success extends Schema.Constraint = Schema.Void,
158
+ Error extends Schema.Constraint = Schema.Never
159
+ >(options: {
160
+ readonly name: string
161
+ readonly implementationVersion?: string | undefined
162
+ readonly success?: Success | undefined
163
+ readonly error?: Error | undefined
164
+ readonly execute: Effect.Effect<Success["Type"], Error["Type"], R>
165
+ readonly tier?: Tier | undefined
166
+ readonly idempotencyKey?: IdempotencyKey | undefined
167
+ readonly nondeterministic?: true | undefined
168
+ readonly metadata?: unknown
169
+ readonly fileBoundary?: FileBoundary | undefined
170
+ readonly interruptRetryPolicy?: Schedule.Schedule<any, unknown> | undefined
171
+ readonly retryPolicy?: RetryPolicy.RetryPolicy | undefined
172
+ readonly attemptTimeoutMs?: number | undefined
173
+ readonly heartbeatTimeoutMs?: number | undefined
174
+ readonly annotations?: Context.Context<never> | undefined
175
+ }): Action<Success, Error, Exclude<R, FlowInstance | FlowRuntime | Scope>> => {
176
+ const implementationVersion = options.implementationVersion === undefined
177
+ ? undefined
178
+ : Schema.decodeUnknownSync(Schema.NonEmptyString)(options.implementationVersion)
179
+ const successSchema = options.success ?? (Schema.Void as any as Success)
180
+ const errorSchema = options.error ?? (Schema.Never as any as Error)
181
+ const successSchemaJson = Schema.toCodecJson(successSchema)
182
+ const errorSchemaJson = Schema.toCodecJson(errorSchema)
183
+ const exitSchemas = exitSchemasFor(successSchema, errorSchema, successSchemaJson, errorSchemaJson)
184
+ let execute!: Effect.Effect<Success["Type"], Error["Type"], any>
185
+ const attemptTimeoutMs = timeoutMs(options.name, "attemptTimeoutMs", options.attemptTimeoutMs)
186
+ const heartbeatTimeoutMs = timeoutMs(options.name, "heartbeatTimeoutMs", options.heartbeatTimeoutMs)
187
+ const executeWithInfraRetry = boundAttempt(options.name, attemptTimeoutMs, heartbeatTimeoutMs)(
188
+ retryInfraInterrupt(
189
+ options.name,
190
+ options.interruptRetryPolicy
191
+ )(options.execute)
192
+ )
193
+ const self: Action<Success, Error, Exclude<R, FlowInstance | FlowRuntime>> = {
194
+ ...Effectable.Prototype<Action<Success, Error, R>>({
195
+ label: "Action",
196
+ evaluate(_) {
197
+ return execute
198
+ }
199
+ }),
200
+ [TypeId]: TypeId,
201
+ name: options.name,
202
+ implementationVersion,
203
+ successSchema,
204
+ errorSchema,
205
+ exitSchema: exitSchemas.exitSchema,
206
+ exitSchemaPartial: exitSchemas.exitSchemaPartial,
207
+ annotations: options.annotations ?? Context.empty(),
208
+ tier: options.tier ?? "sealed",
209
+ idempotencyKey: options.idempotencyKey,
210
+ nondeterministic: options.nondeterministic,
211
+ metadata: options.fileBoundary === undefined ? options.metadata : FileBoundary.make(options.fileBoundary),
212
+ fileBoundary: options.fileBoundary === undefined ? undefined : FileBoundary.make(options.fileBoundary),
213
+ retryPolicy: options.retryPolicy,
214
+ attemptTimeoutMs,
215
+ heartbeatTimeoutMs,
216
+ annotate(tag: Context.Key<any, any>, value: any) {
217
+ return makeInline({
218
+ ...options,
219
+ annotations: Context.add(self.annotations, tag, value)
220
+ })
221
+ },
222
+ annotateMerge(context: Context.Context<any>) {
223
+ return makeInline({
224
+ ...options,
225
+ annotations: Context.merge(self.annotations, context)
226
+ })
227
+ },
228
+ execute: executeWithInfraRetry,
229
+ executeEncoded: Effect.matchEffect(
230
+ // Recovery handlers in Effect discard typed reasons during interruption.
231
+ // Preserve failed cleanup as defects before entering the encoder.
232
+ Effect.onExit(
233
+ executeWithInfraRetry,
234
+ (exit) => {
235
+ if (Exit.isSuccess(exit) || !Cause.hasInterrupts(exit.cause)) return Effect.void
236
+ const failures = exit.cause.reasons.filter(Cause.isFailReason)
237
+ return failures.length === 0 ? Effect.void : Effect.failCause(
238
+ Cause.fromReasons(failures.map((reason) => Cause.makeDieReason(reason.error)))
239
+ )
240
+ }
241
+ ),
242
+ {
243
+ onFailure: (error) => Effect.flatMap(Effect.orDie(Schema.encodeEffect(errorSchemaJson)(error)), Effect.fail),
244
+ onSuccess: (value) => Effect.orDie(Schema.encodeEffect(successSchemaJson)(value))
245
+ }
246
+ )
247
+ } as any
248
+ execute = makeExecute(self)
249
+ return self
250
+ }
251
+
252
+ const makeDeclared = <
253
+ const Tag extends string,
254
+ Payload extends Schema.Struct.Fields | Flow.AnyStructSchema,
255
+ Success extends Schema.Top = Schema.Void,
256
+ Error extends Schema.Top = Schema.Never
257
+ >(tag: Tag, options: DeclaredOptions<Payload, Success, Error>, site: DeclarationSite.DeclaredAt | undefined): Declared<
258
+ Tag,
259
+ Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload,
260
+ Success,
261
+ Error
262
+ > => {
263
+ type PayloadSchema = Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload
264
+ const payloadSchema = (Schema.isSchema(options.payload)
265
+ ? options.payload
266
+ : Schema.Struct(options.payload)) as PayloadSchema
267
+ const implementationVersion = options.implementationVersion === undefined
268
+ ? undefined
269
+ : Schema.decodeUnknownSync(Schema.NonEmptyString)(options.implementationVersion)
270
+ const successSchema = options.success ?? (Schema.Void as unknown as Success)
271
+ const errorSchema = options.error ?? (Schema.Never as unknown as Error)
272
+ const attemptTimeoutMs = timeoutMs(tag, "attemptTimeoutMs", options.attemptTimeoutMs)
273
+ const heartbeatTimeoutMs = timeoutMs(tag, "heartbeatTimeoutMs", options.heartbeatTimeoutMs)
274
+ const annotations = lowerDeclarations(options)
275
+ // The literals are already in the bag above, so an annotated copy rebuilds
276
+ // from options WITHOUT them: re-lowering would overwrite a `Capabilities` or
277
+ // `EffectEnvelope` the caller annotated on top of the declared one.
278
+ const lowered: DeclaredOptions<Payload, Success, Error> = {
279
+ ...options,
280
+ capabilities: undefined,
281
+ effects: undefined
282
+ }
283
+ // The requirement this declaration mints for itself. Context keys are
284
+ // compared by their string key, so re-minting one for an annotated copy of
285
+ // this declaration names the same slot the original does.
286
+ const requirement = Context.Service<Requirement<Tag>, Implementation>(
287
+ `@smthrs/flow/Action/Requirement/${tag}`
288
+ )
289
+ const self: Declared<Tag, PayloadSchema, Success, Error> = {
290
+ [TypeId]: TypeId,
291
+ name: tag,
292
+ implementationVersion,
293
+ payloadSchema,
294
+ successSchema,
295
+ errorSchema,
296
+ tier: options.tier ?? "sealed",
297
+ idempotencyKey: options.idempotencyKey,
298
+ nondeterministic: options.nondeterministic,
299
+ retryPolicy: options.retryPolicy,
300
+ attemptTimeoutMs,
301
+ heartbeatTimeoutMs,
302
+ fileBoundary: options.fileBoundary,
303
+ annotations,
304
+ requirement,
305
+ annotate(key: Context.Key<any, any>, value: any) {
306
+ return makeDeclared(tag, {
307
+ ...lowered,
308
+ annotations: Context.add(annotations, key, value)
309
+ }, site)
310
+ },
311
+ annotateMerge(context: Context.Context<any>) {
312
+ return makeDeclared(tag, {
313
+ ...lowered,
314
+ annotations: Context.merge(annotations, context)
315
+ }, site)
316
+ },
317
+ call(payload) {
318
+ return Node.actionCall<Success["Type"], Error["Type"]>(self, tag, payload)
319
+ },
320
+ toLayer(execute, registrationOptions) {
321
+ if (registrationOptions?.implementationVersion !== implementationVersion) {
322
+ throw new ImplementationVersionMismatch({
323
+ actionName: tag,
324
+ declaredVersion: implementationVersion ?? null,
325
+ registeredVersion: registrationOptions?.implementationVersion ?? null,
326
+ message: `Action "${tag}" requires its declared implementationVersion at registration.`
327
+ })
328
+ }
329
+ // The flow form of this action: same tag, same schemas, and a body that
330
+ // is the one call to it. Registering that flow is what lets a caller
331
+ // `execute` the action as a durable execution of its own, and the body
332
+ // says truthfully what such an execution does. It stays INTERNAL — a flow
333
+ // carries a body and never a handler, so `Flow` has no `toLayer` for an
334
+ // author to reach this seam with.
335
+ //
336
+ // The private constructor preserves the ordinary flow representation
337
+ // without importing the public constructor back through this action.
338
+ const registration = DeclarationSite.annotate(
339
+ makeProto({
340
+ _tag: tag,
341
+ payloadSchema,
342
+ successSchema,
343
+ errorSchema,
344
+ annotations,
345
+ body: (payload) => Node.actionCall<Success["Type"], Error["Type"]>(self, tag, payload)
346
+ }),
347
+ DeclarationSite.capture()
348
+ )
349
+ const action = (payload: PayloadSchema["Type"]) =>
350
+ makeInline({
351
+ name: tag,
352
+ implementationVersion,
353
+ success: successSchema,
354
+ error: errorSchema,
355
+ tier: self.tier,
356
+ idempotencyKey: typeof self.idempotencyKey === "function"
357
+ ? self.idempotencyKey(payload)
358
+ : self.idempotencyKey,
359
+ nondeterministic: self.nondeterministic,
360
+ retryPolicy: options.retryPolicy,
361
+ attemptTimeoutMs,
362
+ heartbeatTimeoutMs,
363
+ interruptRetryPolicy: options.interruptRetryPolicy,
364
+ fileBoundary: typeof options.fileBoundary === "function"
365
+ ? options.fileBoundary(payload)
366
+ : options.fileBoundary,
367
+ annotations,
368
+ execute: execute(payload)
369
+ })
370
+ // The implementation, provided under the requirement this declaration
371
+ // minted. That is the compile-time half: a body that called this action
372
+ // produced a node requiring the tag, and this layer is the only thing
373
+ // that answers it, so a plan cannot reach `execute` without its code.
374
+ //
375
+ // The name-keyed table is the run-time half and stays exactly as it was.
376
+ // A driver expanding a persisted plan has no types left to consult and
377
+ // resolves by tag, so the same implementation is filed there when a
378
+ // composition wired a table up. The table is optional on purpose: a
379
+ // composition that only executes handlers registered directly with the
380
+ // runtime has no use for it, and requiring it would change what every
381
+ // existing `toLayer` call site must provide.
382
+ const implement = Layer.effect(requirement)(Effect.gen(function*() {
383
+ const services = yield* Effect.context<never>()
384
+ // The captured context is what the runtime's own `register` captures
385
+ // for the handler path: the services the implementation was wired with,
386
+ // overridable by whatever the run provides on top of them.
387
+ const provided = (payload: unknown) =>
388
+ Effect.flatMap(
389
+ // A driver assembles this payload from plan values rather than from
390
+ // a typed call site, so the declaration validates it exactly as
391
+ // `Flow.execute` validates a caller's. The cast is the erasure that
392
+ // hands an unknown to the constructor; `makeEffect` is what decides
393
+ // whether it was one.
394
+ Effect.orDie(payloadSchema.makeEffect(payload as never)),
395
+ (decoded) => action(decoded)
396
+ ).pipe(Effect.updateContext((input) => Context.merge(services, input) as Context.Context<any>))
397
+ const implementation: Implementation = {
398
+ name: tag,
399
+ ...(implementationVersion === undefined ? {} : { implementationVersion }),
400
+ action: provided as Implementation["action"]
401
+ }
402
+ const table = yield* Effect.serviceOption(Implementations)
403
+ if (Option.isSome(table)) yield* table.value.add(implementation, registrationOptions)
404
+ return implementation
405
+ }))
406
+ return Layer.merge(
407
+ Layer.effectDiscard(
408
+ Effect.flatMap(FlowRuntime, (engine) => engine.register(registration, action))
409
+ ),
410
+ implement
411
+ )
412
+ }
413
+ }
414
+ return DeclarationSite.annotate(self, site)
415
+ }
416
+
417
+ /**
418
+ * Creates either an inline executable action or a named action
419
+ * declaration, selected by whether the first argument is a string.
420
+ *
421
+ * @category constructors
422
+ * @since 0.1.0
423
+ */
424
+ export const make: {
425
+ <
426
+ const Tag extends string,
427
+ Payload extends Schema.Struct.Fields | Flow.AnyStructSchema,
428
+ Success extends Schema.Top = Schema.Void,
429
+ Error extends Schema.Top = Schema.Never
430
+ >(tag: Tag, options: DeclaredOptions<Payload, Success, Error>): Declared<
431
+ Tag,
432
+ Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload,
433
+ Success,
434
+ Error
435
+ >
436
+ <
437
+ R,
438
+ Success extends Schema.Constraint = Schema.Void,
439
+ Error extends Schema.Constraint = Schema.Never
440
+ >(options: {
441
+ readonly name: string
442
+ readonly implementationVersion?: string | undefined
443
+ readonly success?: Success | undefined
444
+ readonly error?: Error | undefined
445
+ readonly execute: Effect.Effect<Success["Type"], Error["Type"], R>
446
+ readonly tier?: Tier | undefined
447
+ readonly idempotencyKey?: IdempotencyKey | undefined
448
+ readonly nondeterministic?: true | undefined
449
+ readonly metadata?: unknown
450
+ readonly fileBoundary?: FileBoundary | undefined
451
+ readonly interruptRetryPolicy?: Schedule.Schedule<any, unknown> | undefined
452
+ readonly retryPolicy?: RetryPolicy.RetryPolicy | undefined
453
+ readonly attemptTimeoutMs?: number | undefined
454
+ readonly heartbeatTimeoutMs?: number | undefined
455
+ readonly annotations?: Context.Context<never> | undefined
456
+ }): Action<Success, Error, Exclude<R, FlowInstance | FlowRuntime | Scope>>
457
+ } = ((first: string | Parameters<typeof makeInline>[0], second?: object) => {
458
+ if (typeof first !== "string") return makeInline(first)
459
+ const options = second as Parameters<typeof makeDeclared>[1]
460
+ return makeDeclared(
461
+ first,
462
+ options,
463
+ options.declaredFrom === undefined ? DeclarationSite.capture() : DeclarationSite.declaredAt(options.declaredFrom)
464
+ )
465
+ }) as any
466
+
467
+ /**
468
+ * Declares a SYSTEM action: one whose implementation ships with the engine
469
+ * rather than with the composition that calls it.
470
+ *
471
+ * It is {@link make}'s declared form in every respect except the requirement.
472
+ * A system declaration mints none, so `.call()` records a node that demands
473
+ * nothing and a body using {@link module:Sleep} or {@link module:WaitFor} does
474
+ * not push a layer obligation onto its callers. That is the whole difference,
475
+ * and it is a deliberate hole in the compile-time enforcement: the engine owns
476
+ * these implementations, so an author cannot be the one who forgot them.
477
+ *
478
+ * Everything else is unchanged — the layer still registers with the runtime and
479
+ * still files itself in {@link module:Implementations.Implementations}, so a
480
+ * driver resolves a system action by tag exactly like any other.
481
+ *
482
+ * @category constructors
483
+ * @since 0.1.0
484
+ */
485
+ export const makeSystem = <
486
+ const Tag extends string,
487
+ Payload extends Schema.Struct.Fields | Flow.AnyStructSchema,
488
+ Success extends Schema.Top = Schema.Void,
489
+ Error extends Schema.Top = Schema.Never
490
+ >(tag: Tag, options: DeclaredOptions<Payload, Success, Error>): Declared<
491
+ Tag,
492
+ Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload,
493
+ Success,
494
+ Error,
495
+ never
496
+ > =>
497
+ // The erasure IS the declaration: the value still provides its requirement
498
+ // from `toLayer`, and dropping it from `call` only means nothing asks for it.
499
+ // Providing a service no one requires is always sound; the reverse would not
500
+ // be, which is why this is the one place the channel is written off.
501
+ makeDeclared(
502
+ tag,
503
+ options,
504
+ options.declaredFrom === undefined ? DeclarationSite.capture() : DeclarationSite.declaredAt(options.declaredFrom)
505
+ ) as unknown as Declared<
506
+ Tag,
507
+ Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload,
508
+ Success,
509
+ Error,
510
+ never
511
+ >
512
+
513
+ /**
514
+ * Validates one declared attempt bound. An invalid bound is a programmer
515
+ * error thrown at declaration, like `Flow.make`'s `maxRounds`.
516
+ */
517
+ const timeoutMs = (name: string, field: string, value: number | undefined): number | undefined => {
518
+ if (value === undefined) return undefined
519
+ if (!Number.isSafeInteger(value) || value < 1) {
520
+ throw new RangeError(`Action.make: "${name}" ${field} must be a positive safe integer`)
521
+ }
522
+ return value
523
+ }
524
+
525
+ /**
526
+ * Bounds one attempt by its declared timeouts. An expired bound interrupts the
527
+ * body and dies with {@link AttemptTimedOut}, which the engine's retry
528
+ * decision point counts as a retryable attempt failure. A defect the body
529
+ * raises while it is being interrupted is kept beside the timeout, so the
530
+ * attempt is not mistaken for a clean timeout and retried past it.
531
+ *
532
+ * Every attempt gets its own heartbeat, a no-op without `heartbeatTimeoutMs`,
533
+ * so a nested action never feeds the watchdog of the action that called it.
534
+ */
535
+ const boundAttempt = (
536
+ name: string,
537
+ attemptTimeoutMs: number | undefined,
538
+ heartbeatTimeoutMs: number | undefined
539
+ ) =>
540
+ <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
541
+ heartbeatTimeoutMs === undefined && attemptTimeoutMs === undefined
542
+ ? Effect.provideService(effect, CurrentHeartbeat, Effect.void)
543
+ : Effect.gen(function*() {
544
+ const attempt = yield* CurrentAttempt
545
+ // Each heartbeat completes the signal the watchdog is waiting on and
546
+ // installs a fresh one. Waiting on sleeps rather than reading the clock
547
+ // keeps the gap immune to wall-clock adjustments.
548
+ let signal = Deferred.makeUnsafe<void>()
549
+ const beat = Effect.sync(() => {
550
+ const done = signal
551
+ signal = Deferred.makeUnsafe<void>()
552
+ Deferred.doneUnsafe(done, Exit.void)
553
+ })
554
+ const expiries: Array<Effect.Effect<AttemptTimedOut["bound"]>> = []
555
+ if (attemptTimeoutMs !== undefined) {
556
+ expiries.push(Effect.as(Effect.sleep(attemptTimeoutMs), "attempt" as const))
557
+ }
558
+ if (heartbeatTimeoutMs !== undefined) {
559
+ expiries.push(Effect.gen(function*() {
560
+ while (true) {
561
+ const beaten = yield* Effect.raceFirst(
562
+ Effect.as(Deferred.await(signal), true),
563
+ Effect.as(Effect.sleep(heartbeatTimeoutMs), false)
564
+ )
565
+ if (!beaten) return "heartbeat" as const
566
+ }
567
+ }))
568
+ }
569
+ const body = yield* Effect.forkChild(
570
+ Effect.provideService(effect, CurrentHeartbeat, heartbeatTimeoutMs === undefined ? Effect.void : beat),
571
+ { startImmediately: true }
572
+ )
573
+ const outcome = yield* Effect.raceFirst(
574
+ Fiber.await(body),
575
+ Effect.raceAll(expiries)
576
+ )
577
+ if (typeof outcome !== "string") return yield* outcome
578
+ yield* Fiber.interrupt(body)
579
+ // The interruption was requested, so the body cannot settle with an
580
+ // answer: an uninterruptible region it was in ends in the interrupt.
581
+ // What remains beside the interrupt is a defect its cleanup raised.
582
+ const cleanup = yield* Fiber.join(body).pipe(
583
+ Effect.as([]),
584
+ Effect.catchCause((cause) => Effect.succeed(cause.reasons.filter((reason) => !Cause.isInterruptReason(reason))))
585
+ )
586
+ const timeoutMs = outcome === "attempt" ? attemptTimeoutMs! : heartbeatTimeoutMs!
587
+ const timedOut = new AttemptTimedOut({
588
+ actionName: name,
589
+ attempt,
590
+ bound: outcome,
591
+ timeoutMs,
592
+ message: `Action "${name}" attempt ${attempt} ` +
593
+ (outcome === "attempt" ? `ran past ${timeoutMs}ms` : `sent no heartbeat for ${timeoutMs}ms`)
594
+ })
595
+ return yield* Effect.failCause(Cause.fromReasons([Cause.makeDieReason(timedOut), ...cleanup]))
596
+ })
597
+
598
+ const isInfraInterrupt = (value: unknown): value is InfraInterrupt =>
599
+ Predicate.isTagged("@smthrs/flow/InfraInterrupt")(value)
600
+
601
+ const retryInfraInterrupt = (
602
+ name: string,
603
+ policy: Schedule.Schedule<any, unknown> | undefined
604
+ ) =>
605
+ <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
606
+ policy === undefined
607
+ ? effect
608
+ : Effect.suspend(() => {
609
+ let attempts = 0
610
+ return effect.pipe(
611
+ // Each failed execution reaches this tap once, including the final
612
+ // failure the schedule declines to retry, so this is the real attempt
613
+ // count rather than an estimate derived from schedule shape.
614
+ Effect.tapError((error) =>
615
+ isInfraInterrupt(error)
616
+ ? Effect.sync(() => void attempts++)
617
+ : Effect.void
618
+ ),
619
+ Effect.retry({
620
+ schedule: policy,
621
+ while: isInfraInterrupt
622
+ }),
623
+ Effect.catch((error) =>
624
+ isInfraInterrupt(error)
625
+ ? Effect.die(
626
+ new InfraInterruptRetriesExhausted({
627
+ actionName: name,
628
+ attempts,
629
+ interrupt: error,
630
+ message: `Action "${name}" infrastructure interrupt retry attempts exhausted after ` +
631
+ `${attempts} attempts.`
632
+ })
633
+ )
634
+ : Effect.fail(error)
635
+ )
636
+ )
637
+ })
638
+
639
+ // Untraced because action execution is retried in the flow hot path.
640
+ const makeExecute = Effect.fnUntraced(function*<
641
+ R,
642
+ Success extends Schema.Constraint = typeof Schema.Void,
643
+ Error extends Schema.Constraint = typeof Schema.Never
644
+ >(action: Action<Success, Error, R>) {
645
+ const engine = yield* FlowRuntime
646
+ const instance = yield* FlowInstance
647
+ const attempt = yield* CurrentAttempt
648
+ yield* Effect.annotateCurrentSpan({
649
+ executionId: instance.executionId,
650
+ action: action.name,
651
+ attempt,
652
+ tier: action.tier
653
+ })
654
+ const result = yield* FlowHelpers.wrapActionResult(
655
+ engine.actionExecute(action, attempt),
656
+ (_) => _._tag === "Suspended"
657
+ )
658
+ // An action settles with an exit or with a suspension; a handoff is a
659
+ // FLOW settlement, and the engine's action path never produces one. The
660
+ // narrowing is written as "not complete" so the third result variant needs
661
+ // no unreachable arm of its own.
662
+ if (result._tag !== "Complete") {
663
+ yield* Effect.annotateCurrentSpan({ outcome: "suspended" })
664
+ return yield* FlowHelpers.suspend(instance)
665
+ }
666
+ yield* Effect.annotateCurrentSpan({ outcome: result.exit._tag === "Success" ? "success" : "failure" })
667
+ return yield* result.exit
668
+ }, (effect) =>
669
+ Effect.withSpan(effect, "Action.execute", {
670
+ captureStackTrace: false
671
+ }))