@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,429 @@
1
+ // Deep reviewed and polished by a human on 2026-08-10.
2
+ /**
3
+ * Defines data-shaped retry policies for durable action retries.
4
+ *
5
+ * A `RetryPolicy` is a plain value — initial interval, backoff factor, cap,
6
+ * optional maximum attempts, optional jitter, and optional non-retryable
7
+ * error tags — so the next retry delay can be derived from a persisted
8
+ * attempt count instead of fiber-local `Schedule` state. `nextDelay` mirrors
9
+ * Temporal's `ExponentialRetryPolicy.ComputeNextDelay` formula, and `decide`
10
+ * is the engine's single retry decision point: the core default a pluggable
11
+ * `resolveRetry` resolution can later dispatch in front of.
12
+ *
13
+ * The historical terminal-failure schemas below use the `@smthrs/flow/` tags settled for
14
+ * 1.0.0-rc.0. The release candidate makes no compatibility promise to 0.x
15
+ * journals, and these tags freeze at the RC. Current action dispatch preserves
16
+ * the final declared failure when a retry policy is spent.
17
+ *
18
+ * See `docs/guides/retry-a-failing-action.md`; its "Infrastructure
19
+ * interrupts" section covers the interrupt retry schedule.
20
+ *
21
+ * @since 0.1.0
22
+ */
23
+ import * as Effect from "effect/Effect";
24
+ import * as Option from "effect/Option";
25
+ import * as Random from "effect/Random";
26
+ import * as Schema from "effect/Schema";
27
+ /**
28
+ * Data-shaped retry policy schema.
29
+ *
30
+ * The delay before attempt `n + 1` is
31
+ * `min(initialMs * factor^(n - 1), maxMs)`, where `n` is the attempt that
32
+ * just failed. `maxAttempts` bounds the total number of attempts;
33
+ * `expirationMs` bounds the total wall-clock retry duration
34
+ * (schedule-to-close, mirroring Temporal's `expirationInterval`);
35
+ * `jitterRatio` spreads the final portion of each delay uniformly;
36
+ * `nonRetryable` lists error tags that must never be retried.
37
+ *
38
+ * The bounds are per STEP KEY, which is what makes them the provider-retry
39
+ * budget for one agent ask rather than a budget for the exchange the ask
40
+ * belongs to. A structured-output correction re-prompts under a NEW session,
41
+ * so the corrected ask is a different sealed step with its own attempt
42
+ * sequence: `maxAttempts` bounds the provider retries inside one correction
43
+ * session and does not bound the correction ladder, which `AgentAction`
44
+ * bounds separately with its own `corrections` budget.
45
+ *
46
+ * @category models
47
+ * @since 0.1.0
48
+ */
49
+ const RetryPolicyFields = Schema.Struct({
50
+ initialMs: Schema.Number,
51
+ factor: Schema.Number,
52
+ maxMs: Schema.Number,
53
+ maxAttempts: Schema.optional(Schema.Number),
54
+ expirationMs: Schema.optional(Schema.Number),
55
+ jitterRatio: Schema.optional(Schema.Number),
56
+ nonRetryable: Schema.optional(Schema.Array(Schema.String))
57
+ });
58
+ /** Returns the first contract violation shared by decoding and construction. */
59
+ const validationIssue = (policy) => {
60
+ // Zero is refused rather than read as "retry immediately": every computed
61
+ // delay would be zero, so such a policy would give up on its first failure
62
+ // no matter what `maxAttempts` promised. Use `initialMs: 1` for a
63
+ // near-immediate retry.
64
+ if (!Number.isFinite(policy.initialMs) || policy.initialMs <= 0) {
65
+ return `"initialMs" must be a finite number of milliseconds greater than zero, and was ${policy.initialMs}.`;
66
+ }
67
+ if (!Number.isFinite(policy.factor) || policy.factor <= 0) {
68
+ return `"factor" must be a finite number greater than zero, and was ${policy.factor}.`;
69
+ }
70
+ if (!Number.isFinite(policy.maxMs) || policy.maxMs < policy.initialMs) {
71
+ return `"maxMs" must be a finite number of milliseconds at least as large as initialMs, and was ${policy.maxMs}.`;
72
+ }
73
+ if (policy.maxAttempts !== undefined &&
74
+ (!Number.isSafeInteger(policy.maxAttempts) || policy.maxAttempts < 1)) {
75
+ return `"maxAttempts" must be a safe integer of at least one, and was ${policy.maxAttempts}.`;
76
+ }
77
+ if (policy.expirationMs !== undefined &&
78
+ (!Number.isFinite(policy.expirationMs) || policy.expirationMs <= 0)) {
79
+ return `"expirationMs" must be a finite number of milliseconds greater than zero, and was ${policy.expirationMs}.`;
80
+ }
81
+ if (policy.jitterRatio !== undefined &&
82
+ (!Number.isFinite(policy.jitterRatio) || policy.jitterRatio < 0 || policy.jitterRatio > 1)) {
83
+ return `"jitterRatio" must be a finite number between zero and one, inclusive, and was ${policy.jitterRatio}.`;
84
+ }
85
+ return undefined;
86
+ };
87
+ /**
88
+ * Data-shaped retry policy schema. Decoding enforces the same relational
89
+ * contract as {@link make}; persisted data cannot bypass constructor checks.
90
+ *
91
+ * @category models
92
+ * @since 0.1.0
93
+ */
94
+ export const RetryPolicy = RetryPolicyFields.check(Schema.makeFilter((policy) => validationIssue(policy) ?? true, { title: "validRetryPolicy" }));
95
+ /**
96
+ * Creates a `RetryPolicy` value after checking every numeric bound.
97
+ * `initialMs` must be greater than zero: a zero initial interval would
98
+ * compute a zero delay for every attempt, which {@link nextDelay} reads as
99
+ * exhausted, so the policy would never retry. `jitterRatio` must be between
100
+ * zero and one, inclusive, and `jitterRatio: 0` disables jitter.
101
+ *
102
+ * @category constructors
103
+ * @since 0.1.0
104
+ */
105
+ export const make = (options) => {
106
+ const issue = validationIssue(options);
107
+ if (issue !== undefined)
108
+ throw new RangeError(`RetryPolicy.make: ${issue}`);
109
+ return Object.freeze({
110
+ initialMs: options.initialMs,
111
+ factor: options.factor,
112
+ maxMs: options.maxMs,
113
+ ...(options.maxAttempts !== undefined ? { maxAttempts: options.maxAttempts } : {}),
114
+ ...(options.expirationMs !== undefined ? { expirationMs: options.expirationMs } : {}),
115
+ ...(options.jitterRatio !== undefined ? { jitterRatio: options.jitterRatio } : {}),
116
+ ...(options.nonRetryable !== undefined
117
+ ? { nonRetryable: Object.freeze([...options.nonRetryable]) }
118
+ : {})
119
+ });
120
+ };
121
+ /**
122
+ * The default engine retry policy.
123
+ *
124
+ * Uses a 200ms initial delay growing by 1.5x, capped at 30s, and never gives
125
+ * up: it declares neither `maxAttempts` nor `expirationMs`. Bound long-lived
126
+ * retries with `make({ ..., expirationMs })` when a wall-clock give-up is
127
+ * required.
128
+ *
129
+ * @category constructors
130
+ * @since 0.1.0
131
+ */
132
+ export const defaultRetryPolicy = Object.freeze(make({
133
+ initialMs: 200,
134
+ factor: 1.5,
135
+ maxMs: 30000
136
+ }));
137
+ /**
138
+ * Bounded infrastructure retry: 5 seconds doubling to 5 minutes, for 2 hours.
139
+ *
140
+ * @category constructors
141
+ * @since 1.0.0
142
+ */
143
+ export const transient = make({
144
+ initialMs: 5000,
145
+ factor: 2,
146
+ maxMs: 300000,
147
+ expirationMs: 7200000
148
+ });
149
+ /**
150
+ * Creates a `RetryAfter` decision.
151
+ *
152
+ * @category constructors
153
+ * @since 0.1.0
154
+ */
155
+ export const retryAfter = (delayMs) => ({
156
+ _tag: "RetryAfter",
157
+ delayMs
158
+ });
159
+ /**
160
+ * Creates a `GiveUp` decision.
161
+ *
162
+ * @category constructors
163
+ * @since 0.1.0
164
+ */
165
+ export const giveUp = (reason) => ({
166
+ _tag: "GiveUp",
167
+ reason
168
+ });
169
+ /**
170
+ * A historical retry sequence crossed its `expirationMs` wall-clock bound.
171
+ * Current dispatch preserves the final declared failure instead of emitting this defect.
172
+ *
173
+ * @category errors
174
+ * @since 0.1.0
175
+ */
176
+ export class RetryPolicyExpired extends Schema.TaggedError()("@smthrs/flow/RetryPolicyExpired", {
177
+ code: Schema.Literal("retry_policy_expired").pipe(Schema.withConstructorDefault(Effect.succeed("retry_policy_expired"))),
178
+ actionName: Schema.String,
179
+ attempt: Schema.Number,
180
+ expirationMs: Schema.Number,
181
+ lastError: Schema.optional(Schema.Unknown)
182
+ }) {
183
+ }
184
+ /**
185
+ * A historical retry sequence exhausted its `maxAttempts` bound.
186
+ * Current dispatch preserves the final declared failure instead of emitting this defect.
187
+ *
188
+ * @category errors
189
+ * @since 0.1.0
190
+ */
191
+ export class RetryAttemptsExhausted extends Schema.TaggedError()("@smthrs/flow/RetryAttemptsExhausted", {
192
+ code: Schema.Literal("retry_attempts_exhausted").pipe(Schema.withConstructorDefault(Effect.succeed("retry_attempts_exhausted"))),
193
+ actionName: Schema.String,
194
+ attempt: Schema.Number,
195
+ maxAttempts: Schema.Number,
196
+ lastError: Schema.optional(Schema.Unknown)
197
+ }) {
198
+ }
199
+ /**
200
+ * Computes the delay before attempt `attempt + 1` from the persisted attempt
201
+ * count, mirroring Temporal's `ComputeNextDelay`
202
+ * (`common/backoff/retrypolicy.go`).
203
+ *
204
+ * `attempt` is the 1-based attempt that just failed. Returns `None` when the
205
+ * policy gives up: `maxAttempts` reached, a non-positive computed interval,
206
+ * a cap below the initial interval, or — when the policy declares
207
+ * `expirationMs` and the caller supplies `elapsedMs` — an elapsed duration
208
+ * past the expiration bound. Otherwise the delay is capped to the remaining
209
+ * expiration window, expiring only when that window cannot fit one more
210
+ * full-value (`initialMs`) attempt.
211
+ *
212
+ * Jitter is deterministic-friendly: `options.random` is a `[0, 1]` sample
213
+ * supplied by the caller and defaults to `1`, which leaves the delay at its
214
+ * un-jittered value. Use {@link nextDelayEffect} to sample the `Random`
215
+ * service instead. A sample outside `[0, 1]`, or a persisted `jitterRatio`
216
+ * above one, gives up rather than returning a delay the policy never
217
+ * declared. A sample of zero under `jitterRatio: 1` is a delay of zero, which
218
+ * retries immediately.
219
+ *
220
+ * @category attempts
221
+ * @since 0.1.0
222
+ */
223
+ export const nextDelay = (policy, attempt, options) => {
224
+ // Persisted policies can be decoded without `make`, so these guards treat a
225
+ // corrupt row as terminal instead of sending an invalid delay to the engine.
226
+ if (validationIssue(policy) !== undefined || !Number.isSafeInteger(attempt) || attempt < 1) {
227
+ return Option.none();
228
+ }
229
+ if (options?.elapsedMs !== undefined &&
230
+ (!Number.isFinite(options.elapsedMs) || options.elapsedMs < 0)) {
231
+ return Option.none();
232
+ }
233
+ if (policy.maxAttempts !== undefined && attempt >= policy.maxAttempts) {
234
+ return Option.none();
235
+ }
236
+ if (policy.expirationMs !== undefined &&
237
+ options?.elapsedMs !== undefined &&
238
+ options.elapsedMs > policy.expirationMs) {
239
+ return Option.none();
240
+ }
241
+ const raw = policy.initialMs * Math.pow(policy.factor, attempt - 1);
242
+ if (!(raw > 0)) {
243
+ return Option.none();
244
+ }
245
+ let delay = Math.min(raw, policy.maxMs);
246
+ // Temporal caps the delay to the remaining expiration window rather than
247
+ // refusing outright; the below-initial check then expires sequences whose
248
+ // remaining window cannot fit one more full-value attempt.
249
+ if (policy.expirationMs !== undefined && options?.elapsedMs !== undefined) {
250
+ delay = Math.min(delay, Math.max(0, policy.expirationMs - options.elapsedMs));
251
+ }
252
+ if (delay < policy.initialMs) {
253
+ return Option.none();
254
+ }
255
+ // `validationIssue` established finite `maxMs`, so `Math.min` made the
256
+ // un-jittered delay finite even when the exponential itself overflowed.
257
+ // This check belongs before jitter conceptually: a full-jitter sample of
258
+ // zero is a legitimate immediate retry rather than a give-up.
259
+ if (policy.jitterRatio !== undefined && policy.jitterRatio > 0) {
260
+ // Both jitter inputs are bounded to [0, 1] where they are accepted --
261
+ // `make` for `jitterRatio` and this function's contract for `random` --
262
+ // while `random` is a public option that still needs checking here.
263
+ const random = options?.random ?? 1;
264
+ if (!(random >= 0 && random <= 1)) {
265
+ return Option.none();
266
+ }
267
+ // In range, the result is between `delay * (1 - jitterRatio)` and `delay`,
268
+ // so it is finite and never negative. A jittered value of zero retries
269
+ // immediately; it does not exhaust the sequence.
270
+ //
271
+ // The two terms do not sum to exactly `delay` at `random: 1`: at
272
+ // `jitterRatio: 0.000002` a delay of 100 rounds up to 100.00000000000001,
273
+ // above the policy's own cap and above the remaining expiration window.
274
+ // Clamping down to the un-jittered delay is what makes the upper bound
275
+ // stated above exact rather than approximate.
276
+ const jittered = delay * (1 - policy.jitterRatio) + random * delay * policy.jitterRatio;
277
+ delay = Math.min(delay, jittered);
278
+ }
279
+ return Option.some(delay);
280
+ };
281
+ /**
282
+ * Computes the next retry delay, sampling the `Random` service for jitter.
283
+ *
284
+ * Deterministic under `Random.withSeed`. Policies without a `jitterRatio`
285
+ * never touch the service.
286
+ *
287
+ * @category attempts
288
+ * @since 0.1.0
289
+ */
290
+ export const nextDelayEffect = (policy, attempt, options) => policy.jitterRatio === undefined || policy.jitterRatio <= 0
291
+ ? Effect.sync(() => nextDelay(policy, attempt, { elapsedMs: options?.elapsedMs }))
292
+ : Effect.map(Random.next, (random) => nextDelay(policy, attempt, { random, elapsedMs: options?.elapsedMs }));
293
+ /**
294
+ * Extracts the stable identity tag of an error for non-retryable matching:
295
+ * an own string `_tag` when present, otherwise the first own `name` descriptor
296
+ * found while walking a bounded prototype chain. That first descriptor decides
297
+ * the result: only a string data value is a tag.
298
+ *
299
+ * Descriptors keep accessors inert instead of running author code through a
300
+ * property read. A bounded walk also terminates when a hostile proxy reports a
301
+ * cyclic prototype chain; any proxy trap that throws leaves the error untagged.
302
+ *
303
+ * @category attempts
304
+ * @since 0.1.0
305
+ */
306
+ export const errorTag = (error) => {
307
+ if (typeof error !== "object" || error === null)
308
+ return undefined;
309
+ try {
310
+ const tag = Object.getOwnPropertyDescriptor(error, "_tag");
311
+ if (tag !== undefined && "value" in tag && typeof tag.value === "string")
312
+ return tag.value;
313
+ let current = error;
314
+ for (let depth = 0; current !== null && depth < 64; depth++) {
315
+ const name = Object.getOwnPropertyDescriptor(current, "name");
316
+ if (name !== undefined) {
317
+ return "value" in name && typeof name.value === "string" ? name.value : undefined;
318
+ }
319
+ current = Object.getPrototypeOf(current);
320
+ }
321
+ }
322
+ catch {
323
+ // Proxies and hostile accessors are untrusted failure payloads. An error
324
+ // that cannot be inspected inertly simply has no stable retry tag.
325
+ }
326
+ return undefined;
327
+ };
328
+ /**
329
+ * Error tags that are non-retryable by type, under every policy (issue #156).
330
+ *
331
+ * These failures are integrity verdicts that must reach the driver without an
332
+ * action-level retry hiding the first detection. Their persistence seams
333
+ * take a quarantine state action before raising them, so a later dispatch can
334
+ * heal, but the detecting dispatch remains a non-retryable failure. No
335
+ * per-callsite or per-policy opt-out exists; the tags are matched by string so
336
+ * the classification does not invert the package dependency direction.
337
+ *
338
+ * `AttemptEvidenceQuarantined` (issue #171) is the succeeded-attempt-row
339
+ * counterpart: the corrupt boundary evidence is removed while the completed
340
+ * outcome stays durable. It reaches the driver unretried, which parks the
341
+ * first detection in the `quarantine` waiting state; the next explicit resume
342
+ * returns the recorded outcome without re-executing the action.
343
+ *
344
+ * @category attempts
345
+ * @since 0.1.0
346
+ */
347
+ export const defaultNonRetryable = [
348
+ "@smthrs/engine-store/CacheCorruptionDetected",
349
+ "@smthrs/engine-store/AttemptEvidenceQuarantined"
350
+ ];
351
+ /**
352
+ * Whether an error is classified non-retryable, either by type (see
353
+ * {@link defaultNonRetryable}) or by the policy's declared tag list.
354
+ *
355
+ * @category attempts
356
+ * @since 0.1.0
357
+ */
358
+ export const isNonRetryable = (policy, error) => {
359
+ const tag = errorTag(error);
360
+ if (tag === undefined) {
361
+ return false;
362
+ }
363
+ if (defaultNonRetryable.includes(tag)) {
364
+ return true;
365
+ }
366
+ return policy.nonRetryable !== undefined && policy.nonRetryable.includes(tag);
367
+ };
368
+ /**
369
+ * The pure core of the engine's single retry decision point.
370
+ *
371
+ * Non-retryable classification is evaluated here and nowhere else. This is
372
+ * the default a pluggable `resolveRetry` resolution falls back to when no
373
+ * plugin claims the decision.
374
+ *
375
+ * @category attempts
376
+ * @since 0.1.0
377
+ */
378
+ export const decide = (policy, options) => {
379
+ if (isNonRetryable(policy, options.error)) {
380
+ return giveUp("nonRetryable");
381
+ }
382
+ return Option.match(nextDelay(policy, options.attempt, { random: options.random, elapsedMs: options.elapsedMs }), {
383
+ onNone: () =>
384
+ // A policy can report `expired` only when it declares an expiration
385
+ // bound and dropping elapsed time would have allowed another attempt.
386
+ // A malformed elapsed value still gives up because the sequence cannot
387
+ // continue without a trustworthy clock reading; without an expiration
388
+ // bound, the public terminal reason for that refusal is `exhausted`.
389
+ policy.expirationMs !== undefined &&
390
+ Option.isSome(nextDelay(policy, options.attempt, { random: options.random }))
391
+ ? giveUp("expired")
392
+ : giveUp("exhausted"),
393
+ onSome: (delay) => {
394
+ // Tool failures may supply a delay instead of using policy backoff.
395
+ // Inspect only an own data property: failure payloads can be untrusted.
396
+ let hint;
397
+ if (typeof options.error === "object" && options.error !== null) {
398
+ try {
399
+ const descriptor = Object.getOwnPropertyDescriptor(options.error, "retryAfterMs");
400
+ if (descriptor !== undefined && "value" in descriptor)
401
+ hint = descriptor.value;
402
+ }
403
+ catch {
404
+ // An uninspectable failure falls back to the policy delay.
405
+ }
406
+ }
407
+ if (typeof hint !== "number" || !Number.isFinite(hint) || hint < 0) {
408
+ return retryAfter(delay);
409
+ }
410
+ return retryAfter(Math.min(hint, policy.maxMs, policy.expirationMs !== undefined && options.elapsedMs !== undefined
411
+ ? Math.max(0, policy.expirationMs - options.elapsedMs)
412
+ : policy.maxMs));
413
+ }
414
+ });
415
+ };
416
+ /**
417
+ * Effect form of {@link decide}, sampling the `Random` service for jitter.
418
+ *
419
+ * This is the engine-facing decision function: keep calls to it behind a
420
+ * single decision point so a plugin hook dispatch can later be inserted in
421
+ * front of it without touching call sites.
422
+ *
423
+ * @category attempts
424
+ * @since 0.1.0
425
+ */
426
+ export const decideEffect = (policy, options) => policy.jitterRatio === undefined || policy.jitterRatio <= 0
427
+ ? Effect.sync(() => decide(policy, options))
428
+ : Effect.map(Random.next, (random) => decide(policy, { ...options, random }));
429
+ //# sourceMappingURL=RetryPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RetryPolicy.js","sourceRoot":"","sources":["../../src/RetryPolicy.ts"],"names":[],"mappings":"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","sourcesContent":["// Deep reviewed and polished by a human on 2026-08-10.\n\n/**\n * Defines data-shaped retry policies for durable action retries.\n *\n * A `RetryPolicy` is a plain value — initial interval, backoff factor, cap,\n * optional maximum attempts, optional jitter, and optional non-retryable\n * error tags — so the next retry delay can be derived from a persisted\n * attempt count instead of fiber-local `Schedule` state. `nextDelay` mirrors\n * Temporal's `ExponentialRetryPolicy.ComputeNextDelay` formula, and `decide`\n * is the engine's single retry decision point: the core default a pluggable\n * `resolveRetry` resolution can later dispatch in front of.\n *\n * The historical terminal-failure schemas below use the `@smthrs/flow/` tags settled for\n * 1.0.0-rc.0. The release candidate makes no compatibility promise to 0.x\n * journals, and these tags freeze at the RC. Current action dispatch preserves\n * the final declared failure when a retry policy is spent.\n *\n * See `docs/guides/retry-a-failing-action.md`; its \"Infrastructure\n * interrupts\" section covers the interrupt retry schedule.\n *\n * @since 0.1.0\n */\n\nimport * as Effect from \"effect/Effect\"\nimport * as Option from \"effect/Option\"\nimport * as Random from \"effect/Random\"\nimport * as Schema from \"effect/Schema\"\n\n/**\n * Data-shaped retry policy schema.\n *\n * The delay before attempt `n + 1` is\n * `min(initialMs * factor^(n - 1), maxMs)`, where `n` is the attempt that\n * just failed. `maxAttempts` bounds the total number of attempts;\n * `expirationMs` bounds the total wall-clock retry duration\n * (schedule-to-close, mirroring Temporal's `expirationInterval`);\n * `jitterRatio` spreads the final portion of each delay uniformly;\n * `nonRetryable` lists error tags that must never be retried.\n *\n * The bounds are per STEP KEY, which is what makes them the provider-retry\n * budget for one agent ask rather than a budget for the exchange the ask\n * belongs to. A structured-output correction re-prompts under a NEW session,\n * so the corrected ask is a different sealed step with its own attempt\n * sequence: `maxAttempts` bounds the provider retries inside one correction\n * session and does not bound the correction ladder, which `AgentAction`\n * bounds separately with its own `corrections` budget.\n *\n * @category models\n * @since 0.1.0\n */\nconst RetryPolicyFields = Schema.Struct({\n initialMs: Schema.Number,\n factor: Schema.Number,\n maxMs: Schema.Number,\n maxAttempts: Schema.optional(Schema.Number),\n expirationMs: Schema.optional(Schema.Number),\n jitterRatio: Schema.optional(Schema.Number),\n nonRetryable: Schema.optional(Schema.Array(Schema.String))\n})\n\ntype RetryPolicyFields = typeof RetryPolicyFields.Type\n\n/** Returns the first contract violation shared by decoding and construction. */\nconst validationIssue = (policy: RetryPolicyFields): string | undefined => {\n // Zero is refused rather than read as \"retry immediately\": every computed\n // delay would be zero, so such a policy would give up on its first failure\n // no matter what `maxAttempts` promised. Use `initialMs: 1` for a\n // near-immediate retry.\n if (!Number.isFinite(policy.initialMs) || policy.initialMs <= 0) {\n return `\"initialMs\" must be a finite number of milliseconds greater than zero, and was ${policy.initialMs}.`\n }\n if (!Number.isFinite(policy.factor) || policy.factor <= 0) {\n return `\"factor\" must be a finite number greater than zero, and was ${policy.factor}.`\n }\n if (!Number.isFinite(policy.maxMs) || policy.maxMs < policy.initialMs) {\n return `\"maxMs\" must be a finite number of milliseconds at least as large as initialMs, and was ${policy.maxMs}.`\n }\n if (\n policy.maxAttempts !== undefined &&\n (!Number.isSafeInteger(policy.maxAttempts) || policy.maxAttempts < 1)\n ) {\n return `\"maxAttempts\" must be a safe integer of at least one, and was ${policy.maxAttempts}.`\n }\n if (\n policy.expirationMs !== undefined &&\n (!Number.isFinite(policy.expirationMs) || policy.expirationMs <= 0)\n ) {\n return `\"expirationMs\" must be a finite number of milliseconds greater than zero, and was ${policy.expirationMs}.`\n }\n if (\n policy.jitterRatio !== undefined &&\n (!Number.isFinite(policy.jitterRatio) || policy.jitterRatio < 0 || policy.jitterRatio > 1)\n ) {\n return `\"jitterRatio\" must be a finite number between zero and one, inclusive, and was ${policy.jitterRatio}.`\n }\n return undefined\n}\n\n/**\n * Data-shaped retry policy schema. Decoding enforces the same relational\n * contract as {@link make}; persisted data cannot bypass constructor checks.\n *\n * @category models\n * @since 0.1.0\n */\nexport const RetryPolicy = RetryPolicyFields.check(\n Schema.makeFilter(\n (policy) => validationIssue(policy) ?? true,\n { title: \"validRetryPolicy\" }\n )\n)\n\n/**\n * The value form of a {@link RetryPolicy}.\n *\n * @category models\n * @since 0.1.0\n */\nexport type RetryPolicy = typeof RetryPolicy.Type\n\n/**\n * Creates a `RetryPolicy` value after checking every numeric bound.\n * `initialMs` must be greater than zero: a zero initial interval would\n * compute a zero delay for every attempt, which {@link nextDelay} reads as\n * exhausted, so the policy would never retry. `jitterRatio` must be between\n * zero and one, inclusive, and `jitterRatio: 0` disables jitter.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const make = (options: {\n readonly initialMs: number\n readonly factor: number\n readonly maxMs: number\n readonly maxAttempts?: number | undefined\n readonly expirationMs?: number | undefined\n readonly jitterRatio?: number | undefined\n readonly nonRetryable?: ReadonlyArray<string> | undefined\n}): RetryPolicy => {\n const issue = validationIssue(options)\n if (issue !== undefined) throw new RangeError(`RetryPolicy.make: ${issue}`)\n return Object.freeze({\n initialMs: options.initialMs,\n factor: options.factor,\n maxMs: options.maxMs,\n ...(options.maxAttempts !== undefined ? { maxAttempts: options.maxAttempts } : {}),\n ...(options.expirationMs !== undefined ? { expirationMs: options.expirationMs } : {}),\n ...(options.jitterRatio !== undefined ? { jitterRatio: options.jitterRatio } : {}),\n ...(options.nonRetryable !== undefined\n ? { nonRetryable: Object.freeze([...options.nonRetryable]) }\n : {})\n })\n}\n\n/**\n * The default engine retry policy.\n *\n * Uses a 200ms initial delay growing by 1.5x, capped at 30s, and never gives\n * up: it declares neither `maxAttempts` nor `expirationMs`. Bound long-lived\n * retries with `make({ ..., expirationMs })` when a wall-clock give-up is\n * required.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const defaultRetryPolicy: RetryPolicy = Object.freeze(\n make({\n initialMs: 200,\n factor: 1.5,\n maxMs: 30000\n })\n)\n\n/**\n * Bounded infrastructure retry: 5 seconds doubling to 5 minutes, for 2 hours.\n *\n * @category constructors\n * @since 1.0.0\n */\nexport const transient: RetryPolicy = make({\n initialMs: 5000,\n factor: 2,\n maxMs: 300000,\n expirationMs: 7200000\n})\n\n/**\n * A retry decision: wait `delayMs` before the next attempt.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface RetryAfter {\n readonly _tag: \"RetryAfter\"\n readonly delayMs: number\n}\n\n/**\n * A retry decision: stop retrying.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface GiveUp {\n readonly _tag: \"GiveUp\"\n readonly reason: \"nonRetryable\" | \"exhausted\" | \"expired\"\n}\n\n/**\n * The outcome of the engine's retry decision point.\n *\n * @category models\n * @since 0.1.0\n */\nexport type RetryDecision = RetryAfter | GiveUp\n\n/**\n * Creates a `RetryAfter` decision.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const retryAfter = (delayMs: number): RetryDecision => ({\n _tag: \"RetryAfter\",\n delayMs\n})\n\n/**\n * Creates a `GiveUp` decision.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const giveUp = (reason: GiveUp[\"reason\"]): RetryDecision => ({\n _tag: \"GiveUp\",\n reason\n})\n\n/**\n * A historical retry sequence crossed its `expirationMs` wall-clock bound.\n * Current dispatch preserves the final declared failure instead of emitting this defect.\n *\n * @category errors\n * @since 0.1.0\n */\nexport class RetryPolicyExpired extends Schema.TaggedError<RetryPolicyExpired>()(\n \"@smthrs/flow/RetryPolicyExpired\",\n {\n code: Schema.Literal(\"retry_policy_expired\").pipe(\n Schema.withConstructorDefault(Effect.succeed(\"retry_policy_expired\"))\n ),\n actionName: Schema.String,\n attempt: Schema.Number,\n expirationMs: Schema.Number,\n lastError: Schema.optional(Schema.Unknown)\n }\n) {}\n\n/**\n * A historical retry sequence exhausted its `maxAttempts` bound.\n * Current dispatch preserves the final declared failure instead of emitting this defect.\n *\n * @category errors\n * @since 0.1.0\n */\nexport class RetryAttemptsExhausted extends Schema.TaggedError<RetryAttemptsExhausted>()(\n \"@smthrs/flow/RetryAttemptsExhausted\",\n {\n code: Schema.Literal(\"retry_attempts_exhausted\").pipe(\n Schema.withConstructorDefault(Effect.succeed(\"retry_attempts_exhausted\"))\n ),\n actionName: Schema.String,\n attempt: Schema.Number,\n maxAttempts: Schema.Number,\n lastError: Schema.optional(Schema.Unknown)\n }\n) {}\n\n/**\n * Computes the delay before attempt `attempt + 1` from the persisted attempt\n * count, mirroring Temporal's `ComputeNextDelay`\n * (`common/backoff/retrypolicy.go`).\n *\n * `attempt` is the 1-based attempt that just failed. Returns `None` when the\n * policy gives up: `maxAttempts` reached, a non-positive computed interval,\n * a cap below the initial interval, or — when the policy declares\n * `expirationMs` and the caller supplies `elapsedMs` — an elapsed duration\n * past the expiration bound. Otherwise the delay is capped to the remaining\n * expiration window, expiring only when that window cannot fit one more\n * full-value (`initialMs`) attempt.\n *\n * Jitter is deterministic-friendly: `options.random` is a `[0, 1]` sample\n * supplied by the caller and defaults to `1`, which leaves the delay at its\n * un-jittered value. Use {@link nextDelayEffect} to sample the `Random`\n * service instead. A sample outside `[0, 1]`, or a persisted `jitterRatio`\n * above one, gives up rather than returning a delay the policy never\n * declared. A sample of zero under `jitterRatio: 1` is a delay of zero, which\n * retries immediately.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const nextDelay = (\n policy: RetryPolicy,\n attempt: number,\n options?: {\n readonly random?: number | undefined\n readonly elapsedMs?: number | undefined\n }\n): Option.Option<number> => {\n // Persisted policies can be decoded without `make`, so these guards treat a\n // corrupt row as terminal instead of sending an invalid delay to the engine.\n if (validationIssue(policy) !== undefined || !Number.isSafeInteger(attempt) || attempt < 1) {\n return Option.none()\n }\n if (\n options?.elapsedMs !== undefined &&\n (!Number.isFinite(options.elapsedMs) || options.elapsedMs < 0)\n ) {\n return Option.none()\n }\n if (policy.maxAttempts !== undefined && attempt >= policy.maxAttempts) {\n return Option.none()\n }\n if (\n policy.expirationMs !== undefined &&\n options?.elapsedMs !== undefined &&\n options.elapsedMs > policy.expirationMs\n ) {\n return Option.none()\n }\n const raw = policy.initialMs * Math.pow(policy.factor, attempt - 1)\n if (!(raw > 0)) {\n return Option.none()\n }\n let delay = Math.min(raw, policy.maxMs)\n // Temporal caps the delay to the remaining expiration window rather than\n // refusing outright; the below-initial check then expires sequences whose\n // remaining window cannot fit one more full-value attempt.\n if (policy.expirationMs !== undefined && options?.elapsedMs !== undefined) {\n delay = Math.min(delay, Math.max(0, policy.expirationMs - options.elapsedMs))\n }\n if (delay < policy.initialMs) {\n return Option.none()\n }\n // `validationIssue` established finite `maxMs`, so `Math.min` made the\n // un-jittered delay finite even when the exponential itself overflowed.\n // This check belongs before jitter conceptually: a full-jitter sample of\n // zero is a legitimate immediate retry rather than a give-up.\n if (policy.jitterRatio !== undefined && policy.jitterRatio > 0) {\n // Both jitter inputs are bounded to [0, 1] where they are accepted --\n // `make` for `jitterRatio` and this function's contract for `random` --\n // while `random` is a public option that still needs checking here.\n const random = options?.random ?? 1\n if (!(random >= 0 && random <= 1)) {\n return Option.none()\n }\n // In range, the result is between `delay * (1 - jitterRatio)` and `delay`,\n // so it is finite and never negative. A jittered value of zero retries\n // immediately; it does not exhaust the sequence.\n //\n // The two terms do not sum to exactly `delay` at `random: 1`: at\n // `jitterRatio: 0.000002` a delay of 100 rounds up to 100.00000000000001,\n // above the policy's own cap and above the remaining expiration window.\n // Clamping down to the un-jittered delay is what makes the upper bound\n // stated above exact rather than approximate.\n const jittered = delay * (1 - policy.jitterRatio) + random * delay * policy.jitterRatio\n delay = Math.min(delay, jittered)\n }\n return Option.some(delay)\n}\n\n/**\n * Computes the next retry delay, sampling the `Random` service for jitter.\n *\n * Deterministic under `Random.withSeed`. Policies without a `jitterRatio`\n * never touch the service.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const nextDelayEffect = (\n policy: RetryPolicy,\n attempt: number,\n options?: { readonly elapsedMs?: number | undefined }\n): Effect.Effect<Option.Option<number>> =>\n policy.jitterRatio === undefined || policy.jitterRatio <= 0\n ? Effect.sync(() => nextDelay(policy, attempt, { elapsedMs: options?.elapsedMs }))\n : Effect.map(Random.next, (random) => nextDelay(policy, attempt, { random, elapsedMs: options?.elapsedMs }))\n\n/**\n * Extracts the stable identity tag of an error for non-retryable matching:\n * an own string `_tag` when present, otherwise the first own `name` descriptor\n * found while walking a bounded prototype chain. That first descriptor decides\n * the result: only a string data value is a tag.\n *\n * Descriptors keep accessors inert instead of running author code through a\n * property read. A bounded walk also terminates when a hostile proxy reports a\n * cyclic prototype chain; any proxy trap that throws leaves the error untagged.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const errorTag = (error: unknown): string | undefined => {\n if (typeof error !== \"object\" || error === null) return undefined\n try {\n const tag = Object.getOwnPropertyDescriptor(error, \"_tag\")\n if (tag !== undefined && \"value\" in tag && typeof tag.value === \"string\") return tag.value\n\n let current: object | null = error\n for (let depth = 0; current !== null && depth < 64; depth++) {\n const name = Object.getOwnPropertyDescriptor(current, \"name\")\n if (name !== undefined) {\n return \"value\" in name && typeof name.value === \"string\" ? name.value : undefined\n }\n current = Object.getPrototypeOf(current)\n }\n } catch {\n // Proxies and hostile accessors are untrusted failure payloads. An error\n // that cannot be inspected inertly simply has no stable retry tag.\n }\n return undefined\n}\n\n/**\n * Error tags that are non-retryable by type, under every policy (issue #156).\n *\n * These failures are integrity verdicts that must reach the driver without an\n * action-level retry hiding the first detection. Their persistence seams\n * take a quarantine state action before raising them, so a later dispatch can\n * heal, but the detecting dispatch remains a non-retryable failure. No\n * per-callsite or per-policy opt-out exists; the tags are matched by string so\n * the classification does not invert the package dependency direction.\n *\n * `AttemptEvidenceQuarantined` (issue #171) is the succeeded-attempt-row\n * counterpart: the corrupt boundary evidence is removed while the completed\n * outcome stays durable. It reaches the driver unretried, which parks the\n * first detection in the `quarantine` waiting state; the next explicit resume\n * returns the recorded outcome without re-executing the action.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const defaultNonRetryable: ReadonlyArray<string> = [\n \"@smthrs/engine-store/CacheCorruptionDetected\",\n \"@smthrs/engine-store/AttemptEvidenceQuarantined\"\n]\n\n/**\n * Whether an error is classified non-retryable, either by type (see\n * {@link defaultNonRetryable}) or by the policy's declared tag list.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const isNonRetryable = (policy: RetryPolicy, error: unknown): boolean => {\n const tag = errorTag(error)\n if (tag === undefined) {\n return false\n }\n if (defaultNonRetryable.includes(tag)) {\n return true\n }\n return policy.nonRetryable !== undefined && policy.nonRetryable.includes(tag)\n}\n\n/**\n * The pure core of the engine's single retry decision point.\n *\n * Non-retryable classification is evaluated here and nowhere else. This is\n * the default a pluggable `resolveRetry` resolution falls back to when no\n * plugin claims the decision.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const decide = (\n policy: RetryPolicy,\n options: {\n readonly attempt: number\n readonly error: unknown\n readonly random?: number | undefined\n readonly elapsedMs?: number | undefined\n }\n): RetryDecision => {\n if (isNonRetryable(policy, options.error)) {\n return giveUp(\"nonRetryable\")\n }\n return Option.match(\n nextDelay(policy, options.attempt, { random: options.random, elapsedMs: options.elapsedMs }),\n {\n onNone: () =>\n // A policy can report `expired` only when it declares an expiration\n // bound and dropping elapsed time would have allowed another attempt.\n // A malformed elapsed value still gives up because the sequence cannot\n // continue without a trustworthy clock reading; without an expiration\n // bound, the public terminal reason for that refusal is `exhausted`.\n policy.expirationMs !== undefined &&\n Option.isSome(nextDelay(policy, options.attempt, { random: options.random }))\n ? giveUp(\"expired\")\n : giveUp(\"exhausted\"),\n onSome: (delay) => {\n // Tool failures may supply a delay instead of using policy backoff.\n // Inspect only an own data property: failure payloads can be untrusted.\n let hint: unknown\n if (typeof options.error === \"object\" && options.error !== null) {\n try {\n const descriptor = Object.getOwnPropertyDescriptor(options.error, \"retryAfterMs\")\n if (descriptor !== undefined && \"value\" in descriptor) hint = descriptor.value\n } catch {\n // An uninspectable failure falls back to the policy delay.\n }\n }\n if (typeof hint !== \"number\" || !Number.isFinite(hint) || hint < 0) {\n return retryAfter(delay)\n }\n return retryAfter(Math.min(\n hint,\n policy.maxMs,\n policy.expirationMs !== undefined && options.elapsedMs !== undefined\n ? Math.max(0, policy.expirationMs - options.elapsedMs)\n : policy.maxMs\n ))\n }\n }\n )\n}\n\n/**\n * Effect form of {@link decide}, sampling the `Random` service for jitter.\n *\n * This is the engine-facing decision function: keep calls to it behind a\n * single decision point so a plugin hook dispatch can later be inserted in\n * front of it without touching call sites.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const decideEffect = (\n policy: RetryPolicy,\n options: {\n readonly attempt: number\n readonly error: unknown\n readonly elapsedMs?: number | undefined\n }\n): Effect.Effect<RetryDecision> =>\n policy.jitterRatio === undefined || policy.jitterRatio <= 0\n ? Effect.sync(() => decide(policy, options))\n : Effect.map(Random.next, (random) => decide(policy, { ...options, random }))\n"]}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * The system timer, as an ordinary declared action.
3
+ *
4
+ * `docs/concepts/flows-and-actions.md` names the timer primitive a
5
+ * gap and says how to close it: ship it over the existing `DurableClock`, so a
6
+ * wait is a visible, keyed plan node rather than a second execution mechanism.
7
+ * That is this module. {@link action} is a plain `Action.make` declaration —
8
+ * it appears in a catalog, `.call()` records a node, and `Graph.build` puts that
9
+ * node in the plan beside every other step — and {@link layer} is the
10
+ * implementation the hosts that can run a timer provide.
11
+ *
12
+ * The wait itself is `DurableClock`'s, not a new one. The implementation arms
13
+ * the durable clock and awaits its deferred, which is what parks the execution;
14
+ * the park is declared through the ordinary waiting vocabulary
15
+ * ({@link module:WaitingAnnotation.annotateWaiting}) under `timer`, with the
16
+ * deadline as `wakeAt`, so a durable driver records the same waiting row it
17
+ * records for a hand-written `DurableClock.sleep`. Replay is the deferred's:
18
+ * once the clock has fired, its result is persisted, so a re-driven round reads
19
+ * it and runs straight through instead of parking a second time.
20
+ *
21
+ * Which clock a wait arms is the dispatch's own, read from
22
+ * {@link module:Context.CurrentInvocationKey}: a keyed node already owns an
23
+ * identity that survives replay and separates two identical calls, so the timer
24
+ * inherits it rather than being addressed by the payload it was called with.
25
+ *
26
+ * @since 0.1.0
27
+ */
28
+ import type * as Crypto from "effect/Crypto";
29
+ import type * as Layer from "effect/Layer";
30
+ import * as Schema from "effect/Schema";
31
+ import * as Action from "./Action/index.ts";
32
+ import type { FlowRuntime } from "./FlowRuntime/FlowRuntime.ts";
33
+ declare const SleepRequestInvalid_base: Schema.Class<SleepRequestInvalid, Schema.TaggedStruct<"@smthrs/flow/SleepRequestInvalid", {
34
+ readonly code: Schema.Literals<readonly ["missing_deadline", "ambiguous_deadline", "invalid_deadline"]>;
35
+ readonly message: Schema.String;
36
+ }>, import("effect/Cause").YieldableError>;
37
+ /**
38
+ * A sleep whose payload does not name exactly one deadline.
39
+ *
40
+ * A payload carries a relative `millis` or an absolute `until`, and naming
41
+ * both, or neither, leaves no deadline to arm a clock with. It is a typed
42
+ * failure rather than a defect because the payload of a driven node is
43
+ * assembled from plan values, so an author's mistake is recoverable through
44
+ * `Node.catch` like any other declared failure.
45
+ *
46
+ * @category errors
47
+ * @since 0.1.0
48
+ */
49
+ export declare class SleepRequestInvalid extends SleepRequestInvalid_base {
50
+ }
51
+ /**
52
+ * The tag the sleep declaration is catalogued and resolved under.
53
+ *
54
+ * @category constructors
55
+ * @since 0.1.0
56
+ */
57
+ export declare const tag = "system/sleep";
58
+ /**
59
+ * The declared sleep action: `millis` from now, or an absolute `until`.
60
+ *
61
+ * **When to use**
62
+ *
63
+ * Use it in a body wherever a round has to wait for time to pass —
64
+ * `Sleep.action.call({ millis: 60_000 })` — rather than reaching for
65
+ * `DurableClock.sleep`, which is only callable from a handler and leaves
66
+ * nothing in the plan. A sleep node is keyed, inspectable, and skippable by a
67
+ * branch exactly like an action that does work.
68
+ *
69
+ * Two waits of the same length are two waits: `sleep(1h)` followed by
70
+ * `sleep(1h)` sleeps for two hours, because each call is its own node with its
71
+ * own identity, exactly as two calls of any other declaration are.
72
+ *
73
+ * @category constructors
74
+ * @since 0.1.0
75
+ */
76
+ export declare const action: Action.Declared<typeof tag, Schema.Struct<{
77
+ readonly millis: Schema.optional<Schema.Number>;
78
+ readonly until: Schema.optional<Schema.Number>;
79
+ }>, typeof Schema.Void, typeof SleepRequestInvalid, never>;
80
+ /**
81
+ * The sleep implementation: arm the durable clock, park under `timer`, wake.
82
+ *
83
+ * Provide it beside the other action implementation layers a body calls, over
84
+ * the {@link module:Implementations.layerImplementations} table they file
85
+ * themselves in:
86
+ *
87
+ * ```ts
88
+ * Layer.mergeAll(Sleep.layer, Interpreter.layer(Pipeline)).pipe(
89
+ * Layer.provideMerge(Action.layerImplementations)
90
+ * )
91
+ * ```
92
+ *
93
+ * @category layers
94
+ * @since 0.1.0
95
+ */
96
+ export declare const layer: Layer.Layer<never, never, Crypto.Crypto | FlowRuntime>;
97
+ export {};
98
+ //# sourceMappingURL=Sleep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sleep.d.ts","sourceRoot":"","sources":["../../src/Sleep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAG5C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;;;;;AAG/D;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAoB,SAAQ,wBAMxC;CAAG;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,GAAG,iBAAiB,CAAA;AAEjC;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,QAAQ,CAClC,OAAO,GAAG,EACV,MAAM,CAAC,MAAM,CAAC;IACZ,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;CAC/C,CAAC,EACF,OAAO,MAAM,CAAC,IAAI,EAClB,OAAO,mBAAmB,EAC1B,KAAK,CASL,CAAA;AA0IF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,WAAW,CAuCxE,CAAA"}