footprintjs 10.0.0 → 10.1.0

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 (354) hide show
  1. package/AGENTS.md +2 -1
  2. package/CLAUDE.md +43 -7
  3. package/README.md +136 -312
  4. package/dist/esm/index.d.ts +60 -2
  5. package/dist/esm/index.js +13 -6
  6. package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
  7. package/dist/esm/lib/attempt/anySignal.js +39 -0
  8. package/dist/esm/lib/attempt/call.d.ts +88 -0
  9. package/dist/esm/lib/attempt/call.js +129 -0
  10. package/dist/esm/lib/attempt/category.d.ts +31 -0
  11. package/dist/esm/lib/attempt/category.js +107 -0
  12. package/dist/esm/lib/attempt/correlation.d.ts +95 -0
  13. package/dist/esm/lib/attempt/correlation.js +178 -0
  14. package/dist/esm/lib/attempt/deadline.d.ts +44 -0
  15. package/dist/esm/lib/attempt/deadline.js +101 -0
  16. package/dist/esm/lib/attempt/decision.d.ts +52 -0
  17. package/dist/esm/lib/attempt/decision.js +134 -0
  18. package/dist/esm/lib/attempt/effect.d.ts +76 -0
  19. package/dist/esm/lib/attempt/effect.js +160 -0
  20. package/dist/esm/lib/attempt/errors.d.ts +41 -0
  21. package/dist/esm/lib/attempt/errors.js +44 -0
  22. package/dist/esm/lib/attempt/index.d.ts +18 -0
  23. package/dist/esm/lib/attempt/index.js +15 -0
  24. package/dist/esm/lib/attempt/name.d.ts +21 -0
  25. package/dist/esm/lib/attempt/name.js +43 -0
  26. package/dist/esm/lib/attempt/observed.d.ts +66 -0
  27. package/dist/esm/lib/attempt/observed.js +171 -0
  28. package/dist/esm/lib/attempt/policy.d.ts +45 -0
  29. package/dist/esm/lib/attempt/policy.js +83 -0
  30. package/dist/esm/lib/attempt/record.d.ts +11 -0
  31. package/dist/esm/lib/attempt/record.js +24 -0
  32. package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
  33. package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
  34. package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
  35. package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
  36. package/dist/esm/lib/attempt/runner.d.ts +155 -0
  37. package/dist/esm/lib/attempt/runner.js +503 -0
  38. package/dist/esm/lib/attempt/standalone.d.ts +47 -0
  39. package/dist/esm/lib/attempt/standalone.js +126 -0
  40. package/dist/esm/lib/attempt/types.d.ts +453 -0
  41. package/dist/esm/lib/attempt/types.js +16 -0
  42. package/dist/esm/lib/budget/index.d.ts +9 -0
  43. package/dist/esm/lib/budget/index.js +9 -0
  44. package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
  45. package/dist/esm/lib/budget/timeBudget.js +666 -0
  46. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
  47. package/dist/esm/lib/builder/FlowChartBuilder.js +224 -16
  48. package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
  49. package/dist/esm/lib/builder/retryLoop.js +283 -0
  50. package/dist/esm/lib/builder/types.d.ts +35 -1
  51. package/dist/esm/lib/builder/types.js +1 -1
  52. package/dist/esm/lib/decide/decide.js +2 -2
  53. package/dist/esm/lib/decide/index.d.ts +1 -1
  54. package/dist/esm/lib/decide/index.js +2 -2
  55. package/dist/esm/lib/decide/types.d.ts +3 -0
  56. package/dist/esm/lib/decide/types.js +1 -8
  57. package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
  58. package/dist/esm/lib/engine/graph/StageNode.js +1 -1
  59. package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
  60. package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
  61. package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
  62. package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
  63. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +20 -4
  64. package/dist/esm/lib/engine/handlers/stageError.d.ts +7 -0
  65. package/dist/esm/lib/engine/handlers/stageError.js +11 -1
  66. package/dist/esm/lib/engine/index.d.ts +2 -2
  67. package/dist/esm/lib/engine/index.js +1 -1
  68. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  69. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
  70. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -0
  71. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +14 -1
  72. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  73. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
  74. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  75. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  76. package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  77. package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
  78. package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
  79. package/dist/esm/lib/engine/narrative/index.js +1 -1
  80. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  81. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  82. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  83. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  84. package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
  85. package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
  86. package/dist/esm/lib/engine/narrative/types.d.ts +70 -4
  87. package/dist/esm/lib/engine/narrative/types.js +1 -1
  88. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  89. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +182 -114
  90. package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
  91. package/dist/esm/lib/engine/traversalContext.js +6 -3
  92. package/dist/esm/lib/engine/types.d.ts +52 -57
  93. package/dist/esm/lib/engine/types.js +1 -1
  94. package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
  95. package/dist/esm/lib/filter/evaluator.js +135 -0
  96. package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
  97. package/dist/esm/lib/ids/idempotencyKey.js +24 -0
  98. package/dist/esm/lib/memory/StageContext.d.ts +109 -3
  99. package/dist/esm/lib/memory/StageContext.js +214 -4
  100. package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
  101. package/dist/esm/lib/memory/borrowedMutation.js +14 -1
  102. package/dist/esm/lib/memory/frameTypes.d.ts +30 -0
  103. package/dist/esm/lib/memory/frameTypes.js +3 -1
  104. package/dist/esm/lib/memory/redaction.d.ts +12 -0
  105. package/dist/esm/lib/memory/redaction.js +54 -5
  106. package/dist/esm/lib/pause/record.js +10 -1
  107. package/dist/esm/lib/pause/types.d.ts +19 -0
  108. package/dist/esm/lib/pause/types.js +17 -1
  109. package/dist/esm/lib/reactive/createTypedScope.js +3 -1
  110. package/dist/esm/lib/reactive/types.d.ts +36 -4
  111. package/dist/esm/lib/reactive/types.js +3 -1
  112. package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
  113. package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
  114. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +22 -2
  115. package/dist/esm/lib/recorder/ControlDepRecorder.js +33 -2
  116. package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
  117. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  118. package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
  119. package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
  120. package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
  121. package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
  122. package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
  123. package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
  124. package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
  125. package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
  126. package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
  127. package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
  128. package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  129. package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
  130. package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
  131. package/dist/esm/lib/recorder/attemptOTel.js +107 -0
  132. package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
  133. package/dist/esm/lib/recorder/attemptSeries.js +103 -0
  134. package/dist/esm/lib/recorder/hooks.d.ts +9 -0
  135. package/dist/esm/lib/recorder/hooks.js +4 -1
  136. package/dist/esm/lib/recorder/qualityTrace.d.ts +4 -1
  137. package/dist/esm/lib/recorder/qualityTrace.js +14 -6
  138. package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
  139. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
  140. package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
  141. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +42 -2
  142. package/dist/esm/lib/runner/FlowChartExecutor.js +238 -45
  143. package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
  144. package/dist/esm/lib/runner/RunnableChart.js +5 -1
  145. package/dist/esm/lib/runner/attach.d.ts +2 -1
  146. package/dist/esm/lib/runner/attach.js +8 -2
  147. package/dist/esm/lib/runner/checkpoint.js +3 -1
  148. package/dist/esm/lib/runner/deadline.d.ts +42 -0
  149. package/dist/esm/lib/runner/deadline.js +90 -0
  150. package/dist/esm/lib/runner/index.d.ts +3 -1
  151. package/dist/esm/lib/runner/index.js +2 -1
  152. package/dist/esm/lib/runner/options.d.ts +17 -0
  153. package/dist/esm/lib/runner/options.js +3 -1
  154. package/dist/esm/lib/runner/recordSink.d.ts +128 -0
  155. package/dist/esm/lib/runner/recordSink.js +296 -0
  156. package/dist/esm/lib/runner/resume.d.ts +3 -0
  157. package/dist/esm/lib/runner/resume.js +22 -2
  158. package/dist/esm/lib/runner/snapshot.d.ts +2 -2
  159. package/dist/esm/lib/runner/snapshot.js +6 -2
  160. package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
  161. package/dist/esm/lib/scope/ScopeFacade.js +304 -7
  162. package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  163. package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
  164. package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  165. package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
  166. package/dist/esm/lib/scope/runtime.d.ts +3 -0
  167. package/dist/esm/lib/scope/runtime.js +1 -1
  168. package/dist/esm/lib/scope/types.d.ts +6 -0
  169. package/dist/esm/lib/scope/types.js +1 -1
  170. package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
  171. package/dist/esm/lib/sinks/fileSink.js +387 -0
  172. package/dist/esm/recorders.d.ts +8 -2
  173. package/dist/esm/recorders.js +7 -1
  174. package/dist/esm/sinks.d.ts +23 -0
  175. package/dist/esm/sinks.js +23 -0
  176. package/dist/esm/trace.d.ts +2 -2
  177. package/dist/esm/trace.js +1 -1
  178. package/dist/index.js +77 -60
  179. package/dist/lib/attempt/anySignal.js +43 -0
  180. package/dist/lib/attempt/call.js +134 -0
  181. package/dist/lib/attempt/category.js +111 -0
  182. package/dist/lib/attempt/correlation.js +186 -0
  183. package/dist/lib/attempt/deadline.js +112 -0
  184. package/dist/lib/attempt/decision.js +139 -0
  185. package/dist/lib/attempt/effect.js +174 -0
  186. package/dist/lib/attempt/errors.js +49 -0
  187. package/dist/lib/attempt/index.js +26 -0
  188. package/dist/lib/attempt/name.js +48 -0
  189. package/dist/lib/attempt/observed.js +177 -0
  190. package/dist/lib/attempt/policy.js +92 -0
  191. package/dist/lib/attempt/record.js +29 -0
  192. package/dist/lib/attempt/retryLoopContext.js +31 -0
  193. package/dist/lib/attempt/retryLoopTypes.js +3 -0
  194. package/dist/lib/attempt/runner.js +510 -0
  195. package/dist/lib/attempt/standalone.js +130 -0
  196. package/dist/lib/attempt/types.js +17 -0
  197. package/dist/lib/budget/index.js +17 -0
  198. package/dist/lib/budget/timeBudget.js +674 -0
  199. package/dist/lib/builder/FlowChartBuilder.js +224 -16
  200. package/dist/lib/builder/retryLoop.js +287 -0
  201. package/dist/lib/builder/types.js +1 -1
  202. package/dist/lib/decide/decide.js +2 -2
  203. package/dist/lib/decide/index.js +2 -2
  204. package/dist/lib/decide/types.js +1 -8
  205. package/dist/lib/engine/graph/StageNode.js +1 -1
  206. package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
  207. package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
  208. package/dist/lib/engine/handlers/StageRunner.js +36 -9
  209. package/dist/lib/engine/handlers/SubflowExecutor.js +20 -4
  210. package/dist/lib/engine/handlers/stageError.js +13 -2
  211. package/dist/lib/engine/index.js +1 -1
  212. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
  213. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +14 -1
  214. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
  215. package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  216. package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
  217. package/dist/lib/engine/narrative/index.js +1 -1
  218. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  219. package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  220. package/dist/lib/engine/narrative/recorders/index.js +1 -1
  221. package/dist/lib/engine/narrative/types.js +1 -1
  222. package/dist/lib/engine/traversal/FlowchartTraverser.js +181 -113
  223. package/dist/lib/engine/traversalContext.js +6 -3
  224. package/dist/lib/engine/types.js +1 -1
  225. package/dist/lib/filter/evaluator.js +139 -0
  226. package/dist/lib/ids/idempotencyKey.js +28 -0
  227. package/dist/lib/memory/StageContext.js +215 -5
  228. package/dist/lib/memory/borrowedMutation.js +16 -2
  229. package/dist/lib/memory/frameTypes.js +3 -1
  230. package/dist/lib/memory/redaction.js +54 -5
  231. package/dist/lib/pause/record.js +10 -1
  232. package/dist/lib/pause/types.js +17 -1
  233. package/dist/lib/reactive/createTypedScope.js +3 -1
  234. package/dist/lib/reactive/types.js +3 -1
  235. package/dist/lib/recorder/AttemptRecorder.js +417 -0
  236. package/dist/lib/recorder/ControlDepRecorder.js +33 -2
  237. package/dist/lib/recorder/EmitRecorder.js +1 -1
  238. package/dist/lib/recorder/InOutRecorder.js +75 -6
  239. package/dist/lib/recorder/QualityRecorder.js +87 -29
  240. package/dist/lib/recorder/TopologyRecorder.js +76 -2
  241. package/dist/lib/recorder/attemptMetricRows.js +209 -0
  242. package/dist/lib/recorder/attemptMetrics.js +174 -0
  243. package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
  244. package/dist/lib/recorder/attemptOTel.js +111 -0
  245. package/dist/lib/recorder/attemptSeries.js +113 -0
  246. package/dist/lib/recorder/hooks.js +4 -1
  247. package/dist/lib/recorder/qualityTrace.js +14 -6
  248. package/dist/lib/runner/DeferredObserverTier.js +13 -1
  249. package/dist/lib/runner/ExecutionRuntime.js +57 -5
  250. package/dist/lib/runner/FlowChartExecutor.js +238 -45
  251. package/dist/lib/runner/RunnableChart.js +5 -1
  252. package/dist/lib/runner/attach.js +8 -2
  253. package/dist/lib/runner/checkpoint.js +3 -1
  254. package/dist/lib/runner/deadline.js +94 -0
  255. package/dist/lib/runner/index.js +4 -2
  256. package/dist/lib/runner/options.js +3 -1
  257. package/dist/lib/runner/recordSink.js +302 -0
  258. package/dist/lib/runner/resume.js +22 -2
  259. package/dist/lib/runner/snapshot.js +6 -2
  260. package/dist/lib/scope/ScopeFacade.js +303 -6
  261. package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
  262. package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
  263. package/dist/lib/scope/runtime.js +1 -1
  264. package/dist/lib/scope/types.js +1 -1
  265. package/dist/lib/sinks/fileSink.js +392 -0
  266. package/dist/recorders.js +10 -2
  267. package/dist/sinks.js +32 -0
  268. package/dist/trace.js +1 -1
  269. package/dist/types/index.d.ts +60 -2
  270. package/dist/types/lib/attempt/anySignal.d.ts +19 -0
  271. package/dist/types/lib/attempt/call.d.ts +88 -0
  272. package/dist/types/lib/attempt/category.d.ts +31 -0
  273. package/dist/types/lib/attempt/correlation.d.ts +95 -0
  274. package/dist/types/lib/attempt/deadline.d.ts +44 -0
  275. package/dist/types/lib/attempt/decision.d.ts +52 -0
  276. package/dist/types/lib/attempt/effect.d.ts +76 -0
  277. package/dist/types/lib/attempt/errors.d.ts +41 -0
  278. package/dist/types/lib/attempt/index.d.ts +18 -0
  279. package/dist/types/lib/attempt/name.d.ts +21 -0
  280. package/dist/types/lib/attempt/observed.d.ts +66 -0
  281. package/dist/types/lib/attempt/policy.d.ts +45 -0
  282. package/dist/types/lib/attempt/record.d.ts +11 -0
  283. package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
  284. package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
  285. package/dist/types/lib/attempt/runner.d.ts +155 -0
  286. package/dist/types/lib/attempt/standalone.d.ts +47 -0
  287. package/dist/types/lib/attempt/types.d.ts +453 -0
  288. package/dist/types/lib/budget/index.d.ts +9 -0
  289. package/dist/types/lib/budget/timeBudget.d.ts +136 -0
  290. package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
  291. package/dist/types/lib/builder/retryLoop.d.ts +56 -0
  292. package/dist/types/lib/builder/types.d.ts +35 -1
  293. package/dist/types/lib/decide/index.d.ts +1 -1
  294. package/dist/types/lib/decide/types.d.ts +3 -0
  295. package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
  296. package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
  297. package/dist/types/lib/engine/handlers/stageError.d.ts +7 -0
  298. package/dist/types/lib/engine/index.d.ts +2 -2
  299. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  300. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -0
  301. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  302. package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  303. package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  304. package/dist/types/lib/engine/narrative/index.d.ts +2 -2
  305. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  306. package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  307. package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
  308. package/dist/types/lib/engine/narrative/types.d.ts +70 -4
  309. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  310. package/dist/types/lib/engine/traversalContext.d.ts +7 -2
  311. package/dist/types/lib/engine/types.d.ts +52 -57
  312. package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
  313. package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
  314. package/dist/types/lib/memory/StageContext.d.ts +109 -3
  315. package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
  316. package/dist/types/lib/memory/frameTypes.d.ts +30 -0
  317. package/dist/types/lib/memory/redaction.d.ts +12 -0
  318. package/dist/types/lib/pause/types.d.ts +19 -0
  319. package/dist/types/lib/reactive/types.d.ts +36 -4
  320. package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
  321. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +22 -2
  322. package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
  323. package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
  324. package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
  325. package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
  326. package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
  327. package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
  328. package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  329. package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
  330. package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
  331. package/dist/types/lib/recorder/hooks.d.ts +9 -0
  332. package/dist/types/lib/recorder/qualityTrace.d.ts +4 -1
  333. package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
  334. package/dist/types/lib/runner/FlowChartExecutor.d.ts +42 -2
  335. package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
  336. package/dist/types/lib/runner/attach.d.ts +2 -1
  337. package/dist/types/lib/runner/deadline.d.ts +42 -0
  338. package/dist/types/lib/runner/index.d.ts +3 -1
  339. package/dist/types/lib/runner/options.d.ts +17 -0
  340. package/dist/types/lib/runner/recordSink.d.ts +128 -0
  341. package/dist/types/lib/runner/resume.d.ts +3 -0
  342. package/dist/types/lib/runner/snapshot.d.ts +2 -2
  343. package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
  344. package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  345. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  346. package/dist/types/lib/scope/runtime.d.ts +3 -0
  347. package/dist/types/lib/scope/types.d.ts +6 -0
  348. package/dist/types/lib/sinks/fileSink.d.ts +135 -0
  349. package/dist/types/recorders.d.ts +8 -2
  350. package/dist/types/sinks.d.ts +23 -0
  351. package/dist/types/trace.d.ts +2 -2
  352. package/package.json +17 -3
  353. package/dist/esm/lib/decide/evaluator.js +0 -130
  354. package/dist/lib/decide/evaluator.js +0 -134
@@ -0,0 +1,155 @@
1
+ /**
2
+ * attempt/runner.ts — `runAttempts`, THE retry loop (design §3.1, law 1: one runner, one record).
3
+ *
4
+ * Runs a function under a policy and records every try: one frozen `AttemptRecord` per attempt, carrying its
5
+ * timing, outcome, failure category and the retry-or-stop decision (`attempt/decision.ts`), and one
6
+ * `AttemptSummary` when the series ends. The engine's stage retry (`FlowchartTraverser · executeStage`) runs on
7
+ * it; later packets run in-stage calls and standalone `attempt()` on it too.
8
+ *
9
+ * The loop, per attempt n — for a failed attempt, the 9.15 loop's order, step for step:
10
+ *
11
+ * start → run(n) → outcome (ok | failed | aborted [it threw the run's abort reason] | paused [a PauseSignal])
12
+ * → decide over the inputs, first match wins (`retryRules`) — retryOn is asked here (rule 5)
13
+ * → the run's signal aborted inside retryOn? decide again: rule 3 stops the series here, before the
14
+ * discard and before backoffMs, as the 9.15 abort check did
15
+ * → retry: between(n) — the discard — and THEN backoffMs(n), the wait's length
16
+ * → the error's served form and category, read after retryOn and backoffMs ran → the record
17
+ * → onEnd(summary) only when the series ends here
18
+ * → onAttempt(record, served error)
19
+ * → done: return the value · stop: rethrow the attempt's OWN error
20
+ * → retry: onRetry(n, of, delay, served error) → wait (cut short by the signal) → aborted? stop
21
+ *
22
+ * WHAT IT PRESERVES (the 9.15 loop's behaviour, moved here unchanged): the function runs the same number of
23
+ * times; `retryOn` is asked only for a failed, non-final attempt; `backoffMs` only when a retry follows, after
24
+ * the discard; a throwing predicate is "do not retry", a throwing or non-finite backoff is "no wait"; a pause is
25
+ * never retried; the attempt's own error is rethrown, never a wrapper; and a failed attempt's order —
26
+ * `retryOn` → the abort check → the discard (`between`) → `backoffMs` → the served error → the retry event →
27
+ * the wait → the abort check. So an abort inside `retryOn` stops before the discard and never asks `backoffMs`;
28
+ * an abort inside `backoffMs` comes after the discard, still fires the retry event, then ends at the wait; and
29
+ * the served error shows what `retryOn` did to the thrown value. The one difference: when the run's signal has
30
+ * ALREADY aborted as the attempt fails, the series stops without asking `retryOn` (the abort decides first —
31
+ * rule 3 before rule 5).
32
+ *
33
+ * WHAT IT ADDS: the record and the summary. A record is frozen to its leaves and holds only clone-safe data —
34
+ * the error as the run SERVES it (`serve`, the redaction rule's form) without `raw`. The hook gets the served
35
+ * `StructuredErrorInfo` whole, `raw` included, as `onStageRetry` always has. A record never rewrites what the
36
+ * attempt did: an attempt that threw its own error is `failed`, with its category, even when the run aborted
37
+ * around it — the abort is the series' stop reason (`reason: 'aborted'`); a throwing `retryOn` is `declined`
38
+ * with `retryOnThrew: true`, apart from a real `false`.
39
+ *
40
+ * TIME (P1b). Each attempt runs under `min(policy.timeoutMs, time left before options.deadline)` and gets an
41
+ * `AttemptContext` — its signal, composed from the run's and its own cap's timer (`LiveAttempt`). The cap's timer
42
+ * aborts with an `AttemptTimeoutError`; the run's deadline aborts the run's signal with a branded reason
43
+ * (`attempt/deadline.ts`). Either way the attempt is `'timeout'`, never `'aborted'`: the deadline is not a
44
+ * cancellation, so rule 3 does not match and rule 6 (`timeLeftAfterWaitMs ≤ 0`) stops a series whose next wait
45
+ * would outlast it. Under a deadline rule 6 needs the wait's length, so `backoffMs(n, error)` is asked DURING the
46
+ * decision — before the discard; without one the 9.15 order above holds unchanged. No attempt starts at or past
47
+ * the deadline: a wait the deadline cut ends the series `no-time-left`, recording no further attempt.
48
+ *
49
+ * THE FENCE. The moment an attempt ends without an answer — its signal aborts (synchronously, before any listener
50
+ * the function added) or it throws — `onAbandon(n)` fires once, and the engine closes that attempt's scope: the
51
+ * function may still be running, and nothing it does afterwards may land beside a later attempt.
52
+ *
53
+ * ONE async frame with ONE await per attempt: the engine relies on that to keep a retried stage's microtask
54
+ * shape, so parallel siblings settle in the order they always did. The engine races the attempt's signal itself,
55
+ * at the stage boundary (`raced: true`); any other caller gets the race here, so the series never waits on an
56
+ * attempt past its cap.
57
+ *
58
+ * CALLS (P2). The same loop runs a call a stage makes (`attempt/call.ts · runCall`, kind `'call'`, its `target` on
59
+ * every record) and the standalone `attempt()`. An attempt's cap is the DEADLINE of every call made inside it, so
60
+ * the cap's reason is branded a time limit (`attempt/deadline.ts · markTimeLimit`): a call cut by its stage
61
+ * attempt's cap timed out, it was not cancelled. `attemptEndsAt` says when an attempt must end; an `interrupt()`
62
+ * thrown inside a call is a pause, like a `PauseSignal` — never retried.
63
+ */
64
+ import type { StructuredErrorInfo } from '../errors/errorInfo.js';
65
+ import type { EffectTarget } from './effect.js';
66
+ import type { AttemptContext, AttemptKind, AttemptRecord, AttemptSummary, ObservedAttempt, RetryPolicy } from './types.js';
67
+ /** What a series reports, and the engine's between-attempt step. Every member is optional. */
68
+ export interface AttemptRunOptions {
69
+ /** The series every record names — for a stage attempt, its execution's `runtimeStageId`. */
70
+ readonly series: string;
71
+ /** Default `'stage'`. */
72
+ readonly kind?: AttemptKind;
73
+ /** The outside target every record names — a call's (`$call`, `attempt()`); absent for a stage attempt. */
74
+ readonly target?: string;
75
+ /**
76
+ * The run's signal. Once it has aborted (other than at the deadline), rule 3 stops the series
77
+ * (`reason: 'aborted'`); it cuts a wait short. An attempt that threw its reason is recorded `'aborted'` — or
78
+ * `'timeout'` when the reason is the deadline's (`attempt/deadline.ts`).
79
+ */
80
+ readonly signal?: AbortSignal;
81
+ /**
82
+ * The run's deadline, epoch milliseconds. Every attempt is capped by the time left; rule 6 stops a series whose
83
+ * next wait would outlast it (`no-time-left`). Absent (or not finite) = no deadline: the time left is `Infinity`.
84
+ */
85
+ readonly deadline?: number;
86
+ /** The clock, epoch milliseconds. Default `Date.now`. */
87
+ readonly now?: () => number;
88
+ /** The served form of a failed attempt's error. Default `extractErrorInfo` (no redaction rule). */
89
+ readonly serve?: (error: unknown) => StructuredErrorInfo;
90
+ /** Between a failed attempt and the next, before `backoffMs`: the engine discards the attempt's staged writes. */
91
+ readonly between?: (attempt: number) => void;
92
+ /** Every attempt, at its end, with its served error (`undefined` for `'ok'` and `'paused'`). */
93
+ readonly onAttempt?: (record: AttemptRecord, structuredError: StructuredErrorInfo | undefined) => void;
94
+ /** A failed attempt that WILL be retried — after `between` and `onAttempt`, before the wait. */
95
+ readonly onRetry?: (attempt: number, of: number, delayMs: number, structuredError: StructuredErrorInfo) => void;
96
+ /** The series ended: called once, before the last `onAttempt` (or after a wait the run's signal cut). */
97
+ readonly onEnd?: (summary: AttemptSummary) => void;
98
+ /** `retryOn` threw — the attempt is treated as declined; the engine logs the throw here. */
99
+ readonly onRetryOnThrew?: (thrown: unknown) => void;
100
+ /**
101
+ * The attempt ended without an answer — called SYNCHRONOUSLY the moment its signal aborts (its cap, the deadline,
102
+ * a cancellation), else as soon as it failed. Whatever the abandoned function does afterwards is not this
103
+ * series': the engine fences its scope here. Once per attempt; never for `'ok'` or `'paused'` — except an attempt
104
+ * that STARTED under an already-aborted signal, fenced once its synchronous part has run (nobody waits for it).
105
+ */
106
+ readonly onAbandon?: (attempt: number) => void;
107
+ /**
108
+ * The caller races `run`'s promise against the attempt's signal itself — the engine does, at the stage boundary
109
+ * (`StageRunner`), so a stage keeps its one await per attempt. Otherwise the runner races it: the series never
110
+ * waits on an attempt past its cap.
111
+ */
112
+ readonly raced?: boolean;
113
+ /**
114
+ * What an attempt's `observed(report)` does (P2) — the owner of the attempt records the report: `runCall` hands
115
+ * a call's reports to the scope, `attempt()` keeps its own. `ended` says the attempt had already ended when the
116
+ * report came (the owner drops it). Absent — a stage attempt's context, whose `observed` the scope's
117
+ * `$attempt()` replaces — `observed` is refused with a `TypeError`.
118
+ */
119
+ readonly observe?: (report: ObservedAttempt, at: {
120
+ readonly attempt: number;
121
+ readonly ended: boolean;
122
+ }) => void;
123
+ /**
124
+ * The outside system the target touches (P3, design §3.3). Every record then says what its attempt did to it
125
+ * (`effect`) and names the system and the RECORDED key; every attempt's context carries the REAL key. A series
126
+ * that ends without an answer after any attempt of unknown effect fails with `UnknownEffectError` (its `cause` the attempt's own error) —
127
+ * except a pause, which stays a pause. A touching series that may retry without a key is refused before anything
128
+ * runs: the law's last door.
129
+ */
130
+ readonly effect?: EffectTarget;
131
+ }
132
+ /**
133
+ * When the attempt behind `context` must end, epoch milliseconds — its start plus its cap (`min(timeoutMs, time
134
+ * left)`, so never past the run's deadline) — or `undefined` for an uncapped attempt. A call made inside the
135
+ * attempt runs under it as its deadline (`attempt/call.ts`). Only the runner's own contexts are known.
136
+ */
137
+ export declare function attemptEndsAt(context: AttemptContext | undefined): number | undefined;
138
+ /**
139
+ * Run `run` until it succeeds or the policy stops it; resolve with its value or reject with the LAST attempt's
140
+ * own error. `run(n)` is called with the attempt number, 1-based.
141
+ */
142
+ export declare function runAttempts<T>(run: (attempt: number, context: AttemptContext) => Promise<T> | T, policy: RetryPolicy, options: AttemptRunOptions): Promise<T>;
143
+ /**
144
+ * Resolve a policy's `backoffMs` for the attempt that just failed (1-based) and its error. Anything that is not a finite,
145
+ * positive number — a missing dial, a negative value, a `NaN` from a consumer's arithmetic, or a throwing
146
+ * function — becomes `0`, i.e. retry immediately. A backoff dial must never be able to crash a run or park it
147
+ * forever.
148
+ */
149
+ export declare function resolveBackoffMs(backoffMs: RetryPolicy['backoffMs'], attempt: number, error?: unknown): number;
150
+ /**
151
+ * Await `ms`, cut short by an abort. Resolves either way — the caller re-checks `signal.aborted` and rethrows
152
+ * the attempt's own error, so a cancelled run never sits out a long backoff and never loses the failure that
153
+ * caused it. The timer and the listener are always cleaned up.
154
+ */
155
+ export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;