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

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