footprintjs 10.0.1 → 10.2.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 (368) hide show
  1. package/AGENTS.md +2 -1
  2. package/CLAUDE.md +61 -7
  3. package/README.md +136 -312
  4. package/dist/esm/index.d.ts +62 -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 +37 -0
  11. package/dist/esm/lib/attempt/category.js +131 -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 +157 -0
  37. package/dist/esm/lib/attempt/runner.js +523 -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 +199 -9
  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/ChildrenExecutor.js +36 -6
  61. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  62. package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
  63. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  64. package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
  65. package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
  66. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
  67. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  68. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  69. package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
  70. package/dist/esm/lib/engine/handlers/stageError.js +23 -1
  71. package/dist/esm/lib/engine/index.d.ts +2 -2
  72. package/dist/esm/lib/engine/index.js +1 -1
  73. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  74. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
  75. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  76. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  77. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  78. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
  79. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  80. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  81. package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  82. package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
  83. package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
  84. package/dist/esm/lib/engine/narrative/index.js +1 -1
  85. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  86. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  87. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  88. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  89. package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
  90. package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
  91. package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
  92. package/dist/esm/lib/engine/narrative/types.js +1 -1
  93. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  94. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
  95. package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
  96. package/dist/esm/lib/engine/traversalContext.js +6 -3
  97. package/dist/esm/lib/engine/types.d.ts +52 -57
  98. package/dist/esm/lib/engine/types.js +1 -1
  99. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  100. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  101. package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
  102. package/dist/esm/lib/filter/evaluator.js +135 -0
  103. package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
  104. package/dist/esm/lib/ids/idempotencyKey.js +24 -0
  105. package/dist/esm/lib/memory/StageContext.d.ts +123 -3
  106. package/dist/esm/lib/memory/StageContext.js +245 -4
  107. package/dist/esm/lib/memory/attention.d.ts +26 -0
  108. package/dist/esm/lib/memory/attention.js +171 -0
  109. package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
  110. package/dist/esm/lib/memory/borrowedMutation.js +14 -1
  111. package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
  112. package/dist/esm/lib/memory/frameTypes.js +3 -1
  113. package/dist/esm/lib/memory/redaction.d.ts +12 -0
  114. package/dist/esm/lib/memory/redaction.js +54 -5
  115. package/dist/esm/lib/pause/record.js +10 -1
  116. package/dist/esm/lib/pause/types.d.ts +19 -0
  117. package/dist/esm/lib/pause/types.js +17 -1
  118. package/dist/esm/lib/reactive/createTypedScope.js +3 -1
  119. package/dist/esm/lib/reactive/types.d.ts +36 -4
  120. package/dist/esm/lib/reactive/types.js +3 -1
  121. package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
  122. package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
  123. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
  124. package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
  125. package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
  126. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  127. package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
  128. package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
  129. package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
  130. package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
  131. package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
  132. package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
  133. package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
  134. package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
  135. package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
  136. package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
  137. package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  138. package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
  139. package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
  140. package/dist/esm/lib/recorder/attemptOTel.js +107 -0
  141. package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
  142. package/dist/esm/lib/recorder/attemptSeries.js +103 -0
  143. package/dist/esm/lib/recorder/hooks.d.ts +9 -0
  144. package/dist/esm/lib/recorder/hooks.js +4 -1
  145. package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
  146. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
  147. package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
  148. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
  149. package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
  150. package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
  151. package/dist/esm/lib/runner/RunnableChart.js +5 -1
  152. package/dist/esm/lib/runner/attach.d.ts +2 -1
  153. package/dist/esm/lib/runner/attach.js +8 -2
  154. package/dist/esm/lib/runner/checkpoint.js +3 -1
  155. package/dist/esm/lib/runner/deadline.d.ts +42 -0
  156. package/dist/esm/lib/runner/deadline.js +90 -0
  157. package/dist/esm/lib/runner/index.d.ts +3 -1
  158. package/dist/esm/lib/runner/index.js +2 -1
  159. package/dist/esm/lib/runner/options.d.ts +17 -0
  160. package/dist/esm/lib/runner/options.js +3 -1
  161. package/dist/esm/lib/runner/recordSink.d.ts +128 -0
  162. package/dist/esm/lib/runner/recordSink.js +296 -0
  163. package/dist/esm/lib/runner/resume.d.ts +3 -0
  164. package/dist/esm/lib/runner/resume.js +22 -2
  165. package/dist/esm/lib/runner/snapshot.d.ts +2 -2
  166. package/dist/esm/lib/runner/snapshot.js +6 -2
  167. package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
  168. package/dist/esm/lib/scope/ScopeFacade.js +304 -7
  169. package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  170. package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
  171. package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  172. package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
  173. package/dist/esm/lib/scope/runtime.d.ts +3 -0
  174. package/dist/esm/lib/scope/runtime.js +1 -1
  175. package/dist/esm/lib/scope/types.d.ts +6 -0
  176. package/dist/esm/lib/scope/types.js +1 -1
  177. package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
  178. package/dist/esm/lib/sinks/fileSink.js +387 -0
  179. package/dist/esm/recorders.d.ts +8 -2
  180. package/dist/esm/recorders.js +7 -1
  181. package/dist/esm/sinks.d.ts +23 -0
  182. package/dist/esm/sinks.js +23 -0
  183. package/dist/esm/trace.d.ts +2 -2
  184. package/dist/esm/trace.js +1 -1
  185. package/dist/index.js +77 -60
  186. package/dist/lib/attempt/anySignal.js +43 -0
  187. package/dist/lib/attempt/call.js +134 -0
  188. package/dist/lib/attempt/category.js +136 -0
  189. package/dist/lib/attempt/correlation.js +186 -0
  190. package/dist/lib/attempt/deadline.js +112 -0
  191. package/dist/lib/attempt/decision.js +139 -0
  192. package/dist/lib/attempt/effect.js +174 -0
  193. package/dist/lib/attempt/errors.js +49 -0
  194. package/dist/lib/attempt/index.js +26 -0
  195. package/dist/lib/attempt/name.js +48 -0
  196. package/dist/lib/attempt/observed.js +177 -0
  197. package/dist/lib/attempt/policy.js +92 -0
  198. package/dist/lib/attempt/record.js +29 -0
  199. package/dist/lib/attempt/retryLoopContext.js +31 -0
  200. package/dist/lib/attempt/retryLoopTypes.js +3 -0
  201. package/dist/lib/attempt/runner.js +530 -0
  202. package/dist/lib/attempt/standalone.js +130 -0
  203. package/dist/lib/attempt/types.js +17 -0
  204. package/dist/lib/budget/index.js +17 -0
  205. package/dist/lib/budget/timeBudget.js +674 -0
  206. package/dist/lib/builder/FlowChartBuilder.js +199 -9
  207. package/dist/lib/builder/retryLoop.js +287 -0
  208. package/dist/lib/builder/types.js +1 -1
  209. package/dist/lib/decide/decide.js +2 -2
  210. package/dist/lib/decide/index.js +2 -2
  211. package/dist/lib/decide/types.js +1 -8
  212. package/dist/lib/engine/graph/StageNode.js +1 -1
  213. package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
  214. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  215. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  216. package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
  217. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  218. package/dist/lib/engine/handlers/StageRunner.js +36 -9
  219. package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
  220. package/dist/lib/engine/handlers/commitStage.js +24 -5
  221. package/dist/lib/engine/handlers/stageError.js +26 -2
  222. package/dist/lib/engine/index.js +1 -1
  223. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
  224. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  225. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
  226. package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  227. package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
  228. package/dist/lib/engine/narrative/index.js +1 -1
  229. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  230. package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  231. package/dist/lib/engine/narrative/recorders/index.js +1 -1
  232. package/dist/lib/engine/narrative/types.js +1 -1
  233. package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
  234. package/dist/lib/engine/traversalContext.js +6 -3
  235. package/dist/lib/engine/types.js +1 -1
  236. package/dist/lib/errors/terminalFailure.js +64 -0
  237. package/dist/lib/filter/evaluator.js +139 -0
  238. package/dist/lib/ids/idempotencyKey.js +28 -0
  239. package/dist/lib/memory/StageContext.js +246 -5
  240. package/dist/lib/memory/attention.js +175 -0
  241. package/dist/lib/memory/borrowedMutation.js +16 -2
  242. package/dist/lib/memory/frameTypes.js +3 -1
  243. package/dist/lib/memory/redaction.js +54 -5
  244. package/dist/lib/pause/record.js +10 -1
  245. package/dist/lib/pause/types.js +17 -1
  246. package/dist/lib/reactive/createTypedScope.js +3 -1
  247. package/dist/lib/reactive/types.js +3 -1
  248. package/dist/lib/recorder/AttemptRecorder.js +417 -0
  249. package/dist/lib/recorder/ControlDepRecorder.js +50 -2
  250. package/dist/lib/recorder/EmitRecorder.js +1 -1
  251. package/dist/lib/recorder/InOutRecorder.js +75 -6
  252. package/dist/lib/recorder/QualityRecorder.js +87 -29
  253. package/dist/lib/recorder/TopologyRecorder.js +76 -2
  254. package/dist/lib/recorder/attemptMetricRows.js +209 -0
  255. package/dist/lib/recorder/attemptMetrics.js +174 -0
  256. package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
  257. package/dist/lib/recorder/attemptOTel.js +111 -0
  258. package/dist/lib/recorder/attemptSeries.js +113 -0
  259. package/dist/lib/recorder/hooks.js +4 -1
  260. package/dist/lib/runner/DeferredObserverTier.js +13 -1
  261. package/dist/lib/runner/ExecutionRuntime.js +57 -5
  262. package/dist/lib/runner/FlowChartExecutor.js +330 -101
  263. package/dist/lib/runner/RunnableChart.js +5 -1
  264. package/dist/lib/runner/attach.js +8 -2
  265. package/dist/lib/runner/checkpoint.js +3 -1
  266. package/dist/lib/runner/deadline.js +94 -0
  267. package/dist/lib/runner/index.js +4 -2
  268. package/dist/lib/runner/options.js +3 -1
  269. package/dist/lib/runner/recordSink.js +302 -0
  270. package/dist/lib/runner/resume.js +22 -2
  271. package/dist/lib/runner/snapshot.js +6 -2
  272. package/dist/lib/scope/ScopeFacade.js +303 -6
  273. package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
  274. package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
  275. package/dist/lib/scope/runtime.js +1 -1
  276. package/dist/lib/scope/types.js +1 -1
  277. package/dist/lib/sinks/fileSink.js +392 -0
  278. package/dist/recorders.js +10 -2
  279. package/dist/sinks.js +32 -0
  280. package/dist/trace.js +1 -1
  281. package/dist/types/index.d.ts +62 -2
  282. package/dist/types/lib/attempt/anySignal.d.ts +19 -0
  283. package/dist/types/lib/attempt/call.d.ts +88 -0
  284. package/dist/types/lib/attempt/category.d.ts +37 -0
  285. package/dist/types/lib/attempt/correlation.d.ts +95 -0
  286. package/dist/types/lib/attempt/deadline.d.ts +44 -0
  287. package/dist/types/lib/attempt/decision.d.ts +52 -0
  288. package/dist/types/lib/attempt/effect.d.ts +76 -0
  289. package/dist/types/lib/attempt/errors.d.ts +41 -0
  290. package/dist/types/lib/attempt/index.d.ts +18 -0
  291. package/dist/types/lib/attempt/name.d.ts +21 -0
  292. package/dist/types/lib/attempt/observed.d.ts +66 -0
  293. package/dist/types/lib/attempt/policy.d.ts +45 -0
  294. package/dist/types/lib/attempt/record.d.ts +11 -0
  295. package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
  296. package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
  297. package/dist/types/lib/attempt/runner.d.ts +157 -0
  298. package/dist/types/lib/attempt/standalone.d.ts +47 -0
  299. package/dist/types/lib/attempt/types.d.ts +453 -0
  300. package/dist/types/lib/budget/index.d.ts +9 -0
  301. package/dist/types/lib/budget/timeBudget.d.ts +136 -0
  302. package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
  303. package/dist/types/lib/builder/retryLoop.d.ts +56 -0
  304. package/dist/types/lib/builder/types.d.ts +35 -1
  305. package/dist/types/lib/decide/index.d.ts +1 -1
  306. package/dist/types/lib/decide/types.d.ts +3 -0
  307. package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
  308. package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
  309. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  310. package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
  311. package/dist/types/lib/engine/index.d.ts +2 -2
  312. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  313. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  314. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  315. package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  316. package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  317. package/dist/types/lib/engine/narrative/index.d.ts +2 -2
  318. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  319. package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  320. package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
  321. package/dist/types/lib/engine/narrative/types.d.ts +74 -5
  322. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  323. package/dist/types/lib/engine/traversalContext.d.ts +7 -2
  324. package/dist/types/lib/engine/types.d.ts +52 -57
  325. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  326. package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
  327. package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
  328. package/dist/types/lib/memory/StageContext.d.ts +123 -3
  329. package/dist/types/lib/memory/attention.d.ts +26 -0
  330. package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
  331. package/dist/types/lib/memory/frameTypes.d.ts +38 -0
  332. package/dist/types/lib/memory/redaction.d.ts +12 -0
  333. package/dist/types/lib/pause/types.d.ts +19 -0
  334. package/dist/types/lib/reactive/types.d.ts +36 -4
  335. package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
  336. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
  337. package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
  338. package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
  339. package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
  340. package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
  341. package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
  342. package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
  343. package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  344. package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
  345. package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
  346. package/dist/types/lib/recorder/hooks.d.ts +9 -0
  347. package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
  348. package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
  349. package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
  350. package/dist/types/lib/runner/attach.d.ts +2 -1
  351. package/dist/types/lib/runner/deadline.d.ts +42 -0
  352. package/dist/types/lib/runner/index.d.ts +3 -1
  353. package/dist/types/lib/runner/options.d.ts +17 -0
  354. package/dist/types/lib/runner/recordSink.d.ts +128 -0
  355. package/dist/types/lib/runner/resume.d.ts +3 -0
  356. package/dist/types/lib/runner/snapshot.d.ts +2 -2
  357. package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
  358. package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  359. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  360. package/dist/types/lib/scope/runtime.d.ts +3 -0
  361. package/dist/types/lib/scope/types.d.ts +6 -0
  362. package/dist/types/lib/sinks/fileSink.d.ts +135 -0
  363. package/dist/types/recorders.d.ts +8 -2
  364. package/dist/types/sinks.d.ts +23 -0
  365. package/dist/types/trace.d.ts +2 -2
  366. package/package.json +20 -6
  367. package/dist/esm/lib/decide/evaluator.js +0 -130
  368. package/dist/lib/decide/evaluator.js +0 -134
@@ -0,0 +1,412 @@
1
+ /** P7: one bounded, payload-free metric projection collected from traversal hooks. */
2
+ import { parseAttemptId } from 'foottrace';
3
+ import { matchesQuery, metricRow, metricWindow, ownDataRecord } from './attemptMetricRows.js';
4
+ import { aggregateAttempts, attemptRowKey, logicalKey, worst } from './attemptMetrics.js';
5
+ import { attemptOTel } from './attemptOTel.js';
6
+ import { KeyedStore } from './KeyedStore.js';
7
+ function option(value, fallback, max, name, zero = false) {
8
+ const n = value ?? fallback;
9
+ if (!Number.isSafeInteger(n) || n < (zero ? 0 : 1) || n > max)
10
+ throw new TypeError(`attempts: invalid ${name}`);
11
+ return n;
12
+ }
13
+ let nextRecorder = 0;
14
+ export class AttemptRecorder {
15
+ id = `attempts-${++nextRecorder}`;
16
+ rows = new KeyedStore();
17
+ logical = new Map();
18
+ starts = new Map();
19
+ reads = 0;
20
+ pending = new Set();
21
+ exemplars;
22
+ maxRows;
23
+ maxPending;
24
+ timeoutMs;
25
+ store;
26
+ failed = 0;
27
+ dropped = 0;
28
+ omittedRows = 0;
29
+ constructor(options = {}) {
30
+ this.exemplars = option(options.exemplars, 10, 100, 'exemplars');
31
+ this.maxRows = option(options.maxRows, 10000, 100000, 'maxRows');
32
+ this.maxPending = option(options.maxPending, 8, 64, 'maxPending');
33
+ this.timeoutMs = option(options.storeTimeoutMs, 1000, 60000, 'storeTimeoutMs');
34
+ this.store = options.store;
35
+ }
36
+ onRunStart(event) {
37
+ const runId = event.traversalContext?.runId;
38
+ if (runId) {
39
+ const startedAt = Date.now();
40
+ if (this.starts.size >= this.maxRows && !this.starts.has(runId)) {
41
+ const oldest = this.starts.keys().next().value;
42
+ if (oldest !== undefined) {
43
+ if (this.starts.get(oldest)?.outcome === 'running')
44
+ this.omittedRows++;
45
+ this.starts.delete(oldest);
46
+ }
47
+ }
48
+ this.starts.set(runId, { startedAt, outcome: 'running' });
49
+ this.collect({ kind: 'run', runId, startedAt, outcome: 'running' });
50
+ }
51
+ }
52
+ onRunEnd(event) {
53
+ this.end(event, 'ok');
54
+ }
55
+ onPause(event) {
56
+ this.end(event, 'paused');
57
+ }
58
+ onRunFailed(event) {
59
+ this.end(event, 'failed');
60
+ }
61
+ end(event, outcome) {
62
+ const runId = event.traversalContext?.runId;
63
+ if (!runId)
64
+ return;
65
+ const prior = this.rows.get(attemptRowKey({ kind: 'run', runId, startedAt: 0, outcome: 'running' }));
66
+ const active = this.starts.get(runId) ?? (prior?.kind === 'run' ? prior : undefined);
67
+ if (active === undefined) {
68
+ this.omittedRows++;
69
+ return;
70
+ }
71
+ // Parallel children can each report a pause in one leg. It is one lifecycle fact, not a lost row.
72
+ // Keep the start until a real terminal event, so a later failure can supersede a child's pause.
73
+ if (outcome === 'paused' && active.outcome !== 'running')
74
+ return;
75
+ if (outcome !== 'paused' && (active.outcome === 'ok' || active.outcome === 'failed'))
76
+ return;
77
+ const startedAt = active.startedAt;
78
+ if (outcome === 'paused')
79
+ this.starts.set(runId, { startedAt, outcome });
80
+ else
81
+ this.starts.delete(runId);
82
+ this.collect({
83
+ kind: 'run',
84
+ runId,
85
+ startedAt,
86
+ endedAt: Date.now(),
87
+ outcome,
88
+ });
89
+ // Other parallel children may still finish after one child pauses. Keep their bounded identity links
90
+ // until a real terminal event, rather than dropping their later native decisions.
91
+ if (outcome !== 'paused')
92
+ for (const [key, row] of this.logical)
93
+ if (row.runId === runId)
94
+ this.logical.delete(key);
95
+ }
96
+ onAttempt(event) {
97
+ const ctx = event.traversalContext;
98
+ const record = event.record;
99
+ if (!ctx?.runId) {
100
+ this.omittedRows++;
101
+ return;
102
+ }
103
+ const id = `${record.series}@${record.attempt}`;
104
+ if (id.length > 4096) {
105
+ this.omittedRows++;
106
+ return;
107
+ }
108
+ const parsed = parseAttemptId(id);
109
+ if (!parsed) {
110
+ this.omittedRows++;
111
+ return;
112
+ }
113
+ const row = metricRow({
114
+ kind: 'attempt',
115
+ id,
116
+ series: record.series,
117
+ runId: ctx.runId,
118
+ runtimeStageId: ctx.runtimeStageId,
119
+ target: record.target ?? event.stageId,
120
+ traceId: ctx.correlation?.traceId,
121
+ startedAt: record.startedAt,
122
+ durationMs: record.durationMs,
123
+ outcome: record.outcome,
124
+ category: record.category,
125
+ next: record.next,
126
+ reason: record.reason,
127
+ attemptKind: record.kind,
128
+ attempt: record.attempt,
129
+ of: record.of,
130
+ effect: record.effect,
131
+ retryLoop: record.retryLoop,
132
+ });
133
+ if (row?.kind !== 'attempt') {
134
+ this.omittedRows++;
135
+ return;
136
+ }
137
+ this.collect(row);
138
+ if (row.retryLoop?.phase === 'attempt') {
139
+ const key = logicalKey(row.runId, row.retryLoop.series, row.retryLoop.attempt);
140
+ if (!this.logical.has(key) && this.logical.size >= this.maxRows) {
141
+ const oldest = this.logical.keys().next().value;
142
+ if (oldest !== undefined)
143
+ this.logical.delete(oldest);
144
+ this.omittedRows++;
145
+ }
146
+ this.logical.set(key, row);
147
+ }
148
+ }
149
+ onDecision(event) {
150
+ const logical = event.evidence?.retryLoop;
151
+ const runId = event.traversalContext?.runId;
152
+ if (!logical || !runId)
153
+ return;
154
+ const key = logicalKey(runId, logical.series, logical.attempt);
155
+ const physical = this.logical.get(key);
156
+ this.logical.delete(key);
157
+ if (!physical) {
158
+ this.omittedRows++;
159
+ return;
160
+ }
161
+ const row = metricRow({
162
+ ...logical,
163
+ kind: 'decision',
164
+ runId,
165
+ target: physical.target,
166
+ runtimeStageId: event.traversalContext?.runtimeStageId,
167
+ attemptId: physical.id,
168
+ startedAt: physical.startedAt,
169
+ });
170
+ if (row?.kind === 'decision')
171
+ this.collect(row);
172
+ else
173
+ this.omittedRows++;
174
+ }
175
+ collect(row) {
176
+ const key = attemptRowKey(row);
177
+ if (!this.rows.has(key) && this.rows.size >= this.maxRows) {
178
+ const oldest = this.rows.getMap().keys().next().value;
179
+ if (oldest !== undefined)
180
+ this.rows.delete(oldest);
181
+ this.omittedRows++;
182
+ }
183
+ this.rows.set(key, row);
184
+ if (!this.store)
185
+ return;
186
+ if (this.pending.size + this.reads >= this.maxPending) {
187
+ this.dropped++;
188
+ return;
189
+ }
190
+ // Hooks cannot await. Own every rejection immediately, with a bounded pool and no hidden retry queue.
191
+ try {
192
+ const result = this.store.append([structuredClone(row)]);
193
+ if (result !== undefined) {
194
+ const task = Promise.resolve(result)
195
+ .then(() => undefined, () => {
196
+ this.failed++;
197
+ })
198
+ .then(() => {
199
+ this.pending.delete(task);
200
+ });
201
+ this.pending.add(task);
202
+ }
203
+ }
204
+ catch {
205
+ this.failed++;
206
+ }
207
+ }
208
+ storage() {
209
+ return {
210
+ pending: this.pending.size + this.reads,
211
+ failed: this.failed,
212
+ dropped: this.dropped,
213
+ omittedRows: this.omittedRows,
214
+ incomplete: this.pending.size + this.reads + this.failed + this.dropped + this.omittedRows > 0,
215
+ };
216
+ }
217
+ async flush() {
218
+ if (this.pending.size === 0)
219
+ return this.storage();
220
+ let timer;
221
+ try {
222
+ await Promise.race([
223
+ Promise.all([...this.pending]),
224
+ new Promise((resolve) => {
225
+ timer = setTimeout(resolve, this.timeoutMs);
226
+ }),
227
+ ]);
228
+ }
229
+ finally {
230
+ if (timer !== undefined)
231
+ clearTimeout(timer);
232
+ }
233
+ return this.storage();
234
+ }
235
+ byTarget() {
236
+ return aggregateAttempts(this.rows.values(), this.exemplars, this.storage()).byTarget;
237
+ }
238
+ byRun() {
239
+ return aggregateAttempts(this.rows.values(), this.exemplars, this.storage()).byRun;
240
+ }
241
+ slowest(target, limit = this.exemplars) {
242
+ const cap = option(limit, this.exemplars, 100, 'limit', true);
243
+ return worst(this.rows.values().filter((row) => row.kind === 'attempt' && row.target === target), cap);
244
+ }
245
+ series(series, runId) {
246
+ const held = this.rows.values().filter((row) => runId === undefined || row.runId === runId);
247
+ const linked = new Set();
248
+ for (const row of held)
249
+ if (row.kind === 'attempt' && row.series === series && row.retryLoop !== undefined)
250
+ linked.add(JSON.stringify([row.runId, row.retryLoop.series]));
251
+ const rows = held.filter((row) => row.kind !== 'run' &&
252
+ (row.series === series ||
253
+ (row.kind === 'attempt' && row.retryLoop?.series === series) ||
254
+ linked.has(JSON.stringify([row.runId, row.kind === 'attempt' ? row.retryLoop?.series : row.series]))));
255
+ return structuredClone({
256
+ attempts: rows.filter((row) => row.kind === 'attempt'),
257
+ decisions: rows.filter((row) => row.kind === 'decision'),
258
+ });
259
+ }
260
+ async aggregate(supplied = {}) {
261
+ const admitted = ownDataRecord(supplied);
262
+ if (admitted === undefined)
263
+ throw new TypeError('attempts: invalid query');
264
+ const { since, until, target, runId } = admitted;
265
+ if ((since !== undefined && (!Number.isFinite(since) || since < 0)) ||
266
+ (until !== undefined && (!Number.isFinite(until) || until < 0)) ||
267
+ (since !== undefined && until !== undefined && since > until) ||
268
+ (target !== undefined && (typeof target !== 'string' || target.length === 0)) ||
269
+ (runId !== undefined && (typeof runId !== 'string' || runId.length === 0)))
270
+ throw new TypeError('attempts: invalid query');
271
+ const query = Object.freeze({ since, until, target, runId });
272
+ await this.flush();
273
+ const raw = this.store === undefined ? this.rows.values() : await this.readStored(query);
274
+ const rows = [];
275
+ const window = metricWindow(raw, this.maxRows);
276
+ let invalid = window.omitted;
277
+ for (const value of window.values) {
278
+ const row = metricRow(value);
279
+ if (row && matchesQuery(row, query))
280
+ rows.push(row);
281
+ else if (row === undefined)
282
+ invalid++;
283
+ }
284
+ const storage = this.storage();
285
+ let storeOmitted = 0;
286
+ let accountingUnknown = false;
287
+ if (this.store?.stats !== undefined) {
288
+ try {
289
+ const stats = ownDataRecord(this.store.stats());
290
+ if (stats === undefined ||
291
+ typeof stats.omittedRows !== 'number' ||
292
+ !Number.isSafeInteger(stats.omittedRows) ||
293
+ stats.omittedRows < 0)
294
+ accountingUnknown = true;
295
+ else
296
+ storeOmitted = stats.omittedRows;
297
+ }
298
+ catch {
299
+ accountingUnknown = true;
300
+ }
301
+ }
302
+ return aggregateAttempts(rows, this.exemplars, {
303
+ ...storage,
304
+ omittedRows: storage.omittedRows + invalid + storeOmitted,
305
+ incomplete: storage.incomplete || invalid + storeOmitted > 0 || accountingUnknown,
306
+ });
307
+ }
308
+ async readStored(query) {
309
+ if (this.reads + this.pending.size >= this.maxPending)
310
+ throw new Error('attempts: store read capacity reached');
311
+ const store = this.store;
312
+ if (store === undefined)
313
+ return this.rows.values();
314
+ this.reads++;
315
+ let timer;
316
+ let released = false;
317
+ const release = () => {
318
+ if (!released) {
319
+ released = true;
320
+ this.reads--;
321
+ }
322
+ };
323
+ // A timed-out I/O still owns its slot until it settles: a caller cannot create an unbounded pool of stuck reads.
324
+ const work = Promise.resolve()
325
+ .then(() => store.read(query))
326
+ .then((rows) => {
327
+ release();
328
+ if (!Array.isArray(rows))
329
+ throw new Error('attempts: invalid store rows');
330
+ return rows;
331
+ }, () => {
332
+ release();
333
+ throw new Error('attempts: store read failed');
334
+ });
335
+ try {
336
+ return await Promise.race([
337
+ work,
338
+ new Promise((_resolve, reject) => {
339
+ timer = setTimeout(() => reject(new Error('attempts: store read timed out')), this.timeoutMs);
340
+ }),
341
+ ]);
342
+ }
343
+ finally {
344
+ if (timer !== undefined)
345
+ clearTimeout(timer);
346
+ }
347
+ }
348
+ toSnapshot() {
349
+ const stats = aggregateAttempts(this.rows.values(), this.exemplars, this.storage());
350
+ return {
351
+ name: 'Attempts',
352
+ data: { byTarget: stats.byTarget, byRun: stats.byRun },
353
+ meta: {
354
+ projection: 'per-target',
355
+ exemplars: this.exemplars,
356
+ rows: this.rows.size,
357
+ maxRows: this.maxRows,
358
+ storage: stats.storage,
359
+ workTime: 'sum-of-attempt-durations',
360
+ },
361
+ };
362
+ }
363
+ toOTel() {
364
+ return attemptOTel(this.rows.values().filter((row) => row.kind === 'attempt'), this.byTarget(), this.exemplars);
365
+ }
366
+ /** Clear completed local projections; active/paused evidence and bounded ownership survive executor auto-clear. */
367
+ clear() {
368
+ const kept = this.rows.values().filter((row) => this.starts.has(row.runId));
369
+ this.rows.clear();
370
+ for (const row of kept)
371
+ this.rows.set(attemptRowKey(row), row);
372
+ for (const [key, row] of this.logical)
373
+ if (!this.starts.has(row.runId))
374
+ this.logical.delete(key);
375
+ if (this.starts.size === 0)
376
+ this.omittedRows = 0;
377
+ }
378
+ }
379
+ /** Bounded reference adapter for tests/local use; apps supply their own database adapter. */
380
+ export function memoryStore(options = {}) {
381
+ const max = option(options.maxRows, 10000, 100000, 'maxRows');
382
+ const rows = new Map();
383
+ let omitted = 0;
384
+ let ordinal = 0;
385
+ return {
386
+ append(incoming) {
387
+ const window = metricWindow(incoming, max);
388
+ omitted += window.omitted;
389
+ for (const value of window.values) {
390
+ const row = metricRow(value);
391
+ if (!row) {
392
+ omitted++;
393
+ continue;
394
+ }
395
+ if (rows.size >= max) {
396
+ const oldest = rows.keys().next().value;
397
+ if (oldest !== undefined)
398
+ rows.delete(oldest);
399
+ omitted++;
400
+ }
401
+ rows.set(++ordinal, row);
402
+ }
403
+ },
404
+ async read(query) {
405
+ return [...rows.values()].filter((row) => matchesQuery(row, query)).map((row) => structuredClone(row));
406
+ },
407
+ stats() {
408
+ return { rows: rows.size, omittedRows: omitted };
409
+ },
410
+ };
411
+ }
412
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0ZW1wdFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9BdHRlbXB0UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0ZBQXNGO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFVM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBVzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsU0FBUyxNQUFNLENBQUMsS0FBeUIsRUFBRSxRQUFnQixFQUFFLEdBQVcsRUFBRSxJQUFZLEVBQUUsSUFBSSxHQUFHLEtBQUs7SUFDbEcsTUFBTSxDQUFDLEdBQUcsS0FBSyxJQUFJLFFBQVEsQ0FBQztJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hILE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUNyQixNQUFNLE9BQU8sZUFBZTtJQUNqQixFQUFFLEdBQUcsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO0lBQzFCLElBQUksR0FBRyxJQUFJLFVBQVUsRUFBYyxDQUFDO0lBQ3BD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Q0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ1QsT0FBTyxFQUFFLENBQUM7b0JBQ1YsU0FBUztnQkFDWCxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztvQkFDeEMsSUFBSSxNQUFNLEtBQUssU0FBUzt3QkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM5QyxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFDZCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7UUFDRCxLQUFLO1lBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuRCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUDc6IG9uZSBib3VuZGVkLCBwYXlsb2FkLWZyZWUgbWV0cmljIHByb2plY3Rpb24gY29sbGVjdGVkIGZyb20gdHJhdmVyc2FsIGhvb2tzLiAqL1xuaW1wb3J0IHsgcGFyc2VBdHRlbXB0SWQgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93UGF1c2VFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93UnVuRXZlbnQsXG4gIEZsb3dSdW5GYWlsZWRFdmVudCxcbn0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBtYXRjaGVzUXVlcnksIG1ldHJpY1JvdywgbWV0cmljV2luZG93LCBvd25EYXRhUmVjb3JkIH0gZnJvbSAnLi9hdHRlbXB0TWV0cmljUm93cy5qcyc7XG5pbXBvcnQgeyBhZ2dyZWdhdGVBdHRlbXB0cywgYXR0ZW1wdFJvd0tleSwgbG9naWNhbEtleSwgd29yc3QgfSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdEFnZ3JlZ2F0ZSxcbiAgQXR0ZW1wdERlY2lzaW9uUm93LFxuICBBdHRlbXB0UXVlcnksXG4gIEF0dGVtcHRSZWNvcmRlck9wdGlvbnMsXG4gIEF0dGVtcHRSb3csXG4gIEF0dGVtcHRTdG9yYWdlU3RhdHMsXG4gIEF0dGVtcHRTdG9yZSxcbiAgUGh5c2ljYWxBdHRlbXB0Um93LFxufSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzVHlwZXMuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdE9UZWwgfSBmcm9tICcuL2F0dGVtcHRPVGVsLmpzJztcbmltcG9ydCB7IEtleWVkU3RvcmUgfSBmcm9tICcuL0tleWVkU3RvcmUuanMnO1xuXG5mdW5jdGlvbiBvcHRpb24odmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbWF4OiBudW1iZXIsIG5hbWU6IHN0cmluZywgemVybyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IHZhbHVlID8/IGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKG4pIHx8IG4gPCAoemVybyA/IDAgOiAxKSB8fCBuID4gbWF4KSB0aHJvdyBuZXcgVHlwZUVycm9yKGBhdHRlbXB0czogaW52YWxpZCAke25hbWV9YCk7XG4gIHJldHVybiBuO1xufVxubGV0IG5leHRSZWNvcmRlciA9IDA7XG5leHBvcnQgY2xhc3MgQXR0ZW1wdFJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQgPSBgYXR0ZW1wdHMtJHsrK25leHRSZWNvcmRlcn1gO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvd3MgPSBuZXcgS2V5ZWRTdG9yZTxBdHRlbXB0Um93PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2ljYWwgPSBuZXcgTWFwPHN0cmluZywgUGh5c2ljYWxBdHRlbXB0Um93PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0cyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlYWRvbmx5IHN0YXJ0ZWRBdDogbnVtYmVyOyByZWFkb25seSBvdXRjb21lOiAncnVubmluZycgfCAncGF1c2VkJyB9PigpO1xuICBwcml2YXRlIHJlYWRzID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IFNldDxQcm9taXNlPHZvaWQ+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZW1wbGFyczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFJvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhQZW5kaW5nOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmU/OiBBdHRlbXB0U3RvcmU7XG4gIHByaXZhdGUgZmFpbGVkID0gMDtcbiAgcHJpdmF0ZSBkcm9wcGVkID0gMDtcbiAgcHJpdmF0ZSBvbWl0dGVkUm93cyA9IDA7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEF0dGVtcHRSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZXhlbXBsYXJzID0gb3B0aW9uKG9wdGlvbnMuZXhlbXBsYXJzLCAxMCwgMTAwLCAnZXhlbXBsYXJzJyk7XG4gICAgdGhpcy5tYXhSb3dzID0gb3B0aW9uKG9wdGlvbnMubWF4Um93cywgMTAwMDAsIDEwMDAwMCwgJ21heFJvd3MnKTtcbiAgICB0aGlzLm1heFBlbmRpbmcgPSBvcHRpb24ob3B0aW9ucy5tYXhQZW5kaW5nLCA4LCA2NCwgJ21heFBlbmRpbmcnKTtcbiAgICB0aGlzLnRpbWVvdXRNcyA9IG9wdGlvbihvcHRpb25zLnN0b3JlVGltZW91dE1zLCAxMDAwLCA2MDAwMCwgJ3N0b3JlVGltZW91dE1zJyk7XG4gICAgdGhpcy5zdG9yZSA9IG9wdGlvbnMuc3RvcmU7XG4gIH1cblxuICBvblJ1blN0YXJ0KGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBydW5JZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bklkO1xuICAgIGlmIChydW5JZCkge1xuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICh0aGlzLnN0YXJ0cy5zaXplID49IHRoaXMubWF4Um93cyAmJiAhdGhpcy5zdGFydHMuaGFzKHJ1bklkKSkge1xuICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLnN0YXJ0cy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGFydHMuZ2V0KG9sZGVzdCk/Lm91dGNvbWUgPT09ICdydW5uaW5nJykgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgICAgIHRoaXMuc3RhcnRzLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXJ0cy5zZXQocnVuSWQsIHsgc3RhcnRlZEF0LCBvdXRjb21lOiAncnVubmluZycgfSk7XG4gICAgICB0aGlzLmNvbGxlY3QoeyBraW5kOiAncnVuJywgcnVuSWQsIHN0YXJ0ZWRBdCwgb3V0Y29tZTogJ3J1bm5pbmcnIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUnVuRW5kKGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmVuZChldmVudCwgJ29rJyk7XG4gIH1cblxuICBvblBhdXNlKGV2ZW50OiBGbG93UGF1c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZW5kKGV2ZW50LCAncGF1c2VkJyk7XG4gIH1cblxuICBvblJ1bkZhaWxlZChldmVudDogRmxvd1J1bkZhaWxlZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5lbmQoZXZlbnQsICdmYWlsZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kKGV2ZW50OiBGbG93UnVuRXZlbnQgfCBGbG93UnVuRmFpbGVkRXZlbnQgfCBGbG93UGF1c2VFdmVudCwgb3V0Y29tZTogJ29rJyB8ICdmYWlsZWQnIHwgJ3BhdXNlZCcpOiB2b2lkIHtcbiAgICBjb25zdCBydW5JZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bklkO1xuICAgIGlmICghcnVuSWQpIHJldHVybjtcbiAgICBjb25zdCBwcmlvciA9IHRoaXMucm93cy5nZXQoYXR0ZW1wdFJvd0tleSh7IGtpbmQ6ICdydW4nLCBydW5JZCwgc3RhcnRlZEF0OiAwLCBvdXRjb21lOiAncnVubmluZycgfSkpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuc3RhcnRzLmdldChydW5JZCkgPz8gKHByaW9yPy5raW5kID09PSAncnVuJyA/IHByaW9yIDogdW5kZWZpbmVkKTtcbiAgICBpZiAoYWN0aXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUGFyYWxsZWwgY2hpbGRyZW4gY2FuIGVhY2ggcmVwb3J0IGEgcGF1c2UgaW4gb25lIGxlZy4gSXQgaXMgb25lIGxpZmVjeWNsZSBmYWN0LCBub3QgYSBsb3N0IHJvdy5cbiAgICAvLyBLZWVwIHRoZSBzdGFydCB1bnRpbCBhIHJlYWwgdGVybWluYWwgZXZlbnQsIHNvIGEgbGF0ZXIgZmFpbHVyZSBjYW4gc3VwZXJzZWRlIGEgY2hpbGQncyBwYXVzZS5cbiAgICBpZiAob3V0Y29tZSA9PT0gJ3BhdXNlZCcgJiYgYWN0aXZlLm91dGNvbWUgIT09ICdydW5uaW5nJykgcmV0dXJuO1xuICAgIGlmIChvdXRjb21lICE9PSAncGF1c2VkJyAmJiAoYWN0aXZlLm91dGNvbWUgPT09ICdvaycgfHwgYWN0aXZlLm91dGNvbWUgPT09ICdmYWlsZWQnKSkgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IGFjdGl2ZS5zdGFydGVkQXQ7XG4gICAgaWYgKG91dGNvbWUgPT09ICdwYXVzZWQnKSB0aGlzLnN0YXJ0cy5zZXQocnVuSWQsIHsgc3RhcnRlZEF0LCBvdXRjb21lIH0pO1xuICAgIGVsc2UgdGhpcy5zdGFydHMuZGVsZXRlKHJ1bklkKTtcbiAgICB0aGlzLmNvbGxlY3Qoe1xuICAgICAga2luZDogJ3J1bicsXG4gICAgICBydW5JZCxcbiAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgIGVuZGVkQXQ6IERhdGUubm93KCksXG4gICAgICBvdXRjb21lLFxuICAgIH0pO1xuICAgIC8vIE90aGVyIHBhcmFsbGVsIGNoaWxkcmVuIG1heSBzdGlsbCBmaW5pc2ggYWZ0ZXIgb25lIGNoaWxkIHBhdXNlcy4gS2VlcCB0aGVpciBib3VuZGVkIGlkZW50aXR5IGxpbmtzXG4gICAgLy8gdW50aWwgYSByZWFsIHRlcm1pbmFsIGV2ZW50LCByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGVpciBsYXRlciBuYXRpdmUgZGVjaXNpb25zLlxuICAgIGlmIChvdXRjb21lICE9PSAncGF1c2VkJykgZm9yIChjb25zdCBba2V5LCByb3ddIG9mIHRoaXMubG9naWNhbCkgaWYgKHJvdy5ydW5JZCA9PT0gcnVuSWQpIHRoaXMubG9naWNhbC5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIG9uQXR0ZW1wdChldmVudDogRmxvd0F0dGVtcHRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgIGlmICghY3R4Py5ydW5JZCkge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGAke3JlY29yZC5zZXJpZXN9QCR7cmVjb3JkLmF0dGVtcHR9YDtcbiAgICBpZiAoaWQubGVuZ3RoID4gNDA5Nikge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUF0dGVtcHRJZChpZCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHtcbiAgICAgIGtpbmQ6ICdhdHRlbXB0JyxcbiAgICAgIGlkLFxuICAgICAgc2VyaWVzOiByZWNvcmQuc2VyaWVzLFxuICAgICAgcnVuSWQ6IGN0eC5ydW5JZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjdHgucnVudGltZVN0YWdlSWQsXG4gICAgICB0YXJnZXQ6IHJlY29yZC50YXJnZXQgPz8gZXZlbnQuc3RhZ2VJZCxcbiAgICAgIHRyYWNlSWQ6IGN0eC5jb3JyZWxhdGlvbj8udHJhY2VJZCxcbiAgICAgIHN0YXJ0ZWRBdDogcmVjb3JkLnN0YXJ0ZWRBdCxcbiAgICAgIGR1cmF0aW9uTXM6IHJlY29yZC5kdXJhdGlvbk1zLFxuICAgICAgb3V0Y29tZTogcmVjb3JkLm91dGNvbWUsXG4gICAgICBjYXRlZ29yeTogcmVjb3JkLmNhdGVnb3J5LFxuICAgICAgbmV4dDogcmVjb3JkLm5leHQsXG4gICAgICByZWFzb246IHJlY29yZC5yZWFzb24sXG4gICAgICBhdHRlbXB0S2luZDogcmVjb3JkLmtpbmQsXG4gICAgICBhdHRlbXB0OiByZWNvcmQuYXR0ZW1wdCxcbiAgICAgIG9mOiByZWNvcmQub2YsXG4gICAgICBlZmZlY3Q6IHJlY29yZC5lZmZlY3QsXG4gICAgICByZXRyeUxvb3A6IHJlY29yZC5yZXRyeUxvb3AsXG4gICAgfSk7XG4gICAgaWYgKHJvdz8ua2luZCAhPT0gJ2F0dGVtcHQnKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29sbGVjdChyb3cpO1xuICAgIGlmIChyb3cucmV0cnlMb29wPy5waGFzZSA9PT0gJ2F0dGVtcHQnKSB7XG4gICAgICBjb25zdCBrZXkgPSBsb2dpY2FsS2V5KHJvdy5ydW5JZCwgcm93LnJldHJ5TG9vcC5zZXJpZXMsIHJvdy5yZXRyeUxvb3AuYXR0ZW1wdCk7XG4gICAgICBpZiAoIXRoaXMubG9naWNhbC5oYXMoa2V5KSAmJiB0aGlzLmxvZ2ljYWwuc2l6ZSA+PSB0aGlzLm1heFJvd3MpIHtcbiAgICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5sb2dpY2FsLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkgdGhpcy5sb2dpY2FsLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2ljYWwuc2V0KGtleSwgcm93KTtcbiAgICB9XG4gIH1cblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGxvZ2ljYWwgPSBldmVudC5ldmlkZW5jZT8ucmV0cnlMb29wO1xuICAgIGNvbnN0IHJ1bklkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVuSWQ7XG4gICAgaWYgKCFsb2dpY2FsIHx8ICFydW5JZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGxvZ2ljYWxLZXkocnVuSWQsIGxvZ2ljYWwuc2VyaWVzLCBsb2dpY2FsLmF0dGVtcHQpO1xuICAgIGNvbnN0IHBoeXNpY2FsID0gdGhpcy5sb2dpY2FsLmdldChrZXkpO1xuICAgIHRoaXMubG9naWNhbC5kZWxldGUoa2V5KTtcbiAgICBpZiAoIXBoeXNpY2FsKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdyA9IG1ldHJpY1Jvdyh7XG4gICAgICAuLi5sb2dpY2FsLFxuICAgICAga2luZDogJ2RlY2lzaW9uJyxcbiAgICAgIHJ1bklkLFxuICAgICAgdGFyZ2V0OiBwaHlzaWNhbC50YXJnZXQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBhdHRlbXB0SWQ6IHBoeXNpY2FsLmlkLFxuICAgICAgc3RhcnRlZEF0OiBwaHlzaWNhbC5zdGFydGVkQXQsXG4gICAgfSk7XG4gICAgaWYgKHJvdz8ua2luZCA9PT0gJ2RlY2lzaW9uJykgdGhpcy5jb2xsZWN0KHJvdyk7XG4gICAgZWxzZSB0aGlzLm9taXR0ZWRSb3dzKys7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3Qocm93OiBBdHRlbXB0Um93KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYXR0ZW1wdFJvd0tleShyb3cpO1xuICAgIGlmICghdGhpcy5yb3dzLmhhcyhrZXkpICYmIHRoaXMucm93cy5zaXplID49IHRoaXMubWF4Um93cykge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5yb3dzLmdldE1hcCgpLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHRoaXMucm93cy5kZWxldGUob2xkZXN0KTtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICB9XG4gICAgdGhpcy5yb3dzLnNldChrZXksIHJvdyk7XG4gICAgaWYgKCF0aGlzLnN0b3JlKSByZXR1cm47XG4gICAgaWYgKHRoaXMucGVuZGluZy5zaXplICsgdGhpcy5yZWFkcyA+PSB0aGlzLm1heFBlbmRpbmcpIHtcbiAgICAgIHRoaXMuZHJvcHBlZCsrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBIb29rcyBjYW5ub3QgYXdhaXQuIE93biBldmVyeSByZWplY3Rpb24gaW1tZWRpYXRlbHksIHdpdGggYSBib3VuZGVkIHBvb2wgYW5kIG5vIGhpZGRlbiByZXRyeSBxdWV1ZS5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdG9yZS5hcHBlbmQoW3N0cnVjdHVyZWRDbG9uZShyb3cpXSk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdGFzazogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHRhc2spO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBlbmRpbmcuYWRkKHRhc2spO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5mYWlsZWQrKztcbiAgICB9XG4gIH1cblxuICBzdG9yYWdlKCk6IEF0dGVtcHRTdG9yYWdlU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nOiB0aGlzLnBlbmRpbmcuc2l6ZSArIHRoaXMucmVhZHMsXG4gICAgICBmYWlsZWQ6IHRoaXMuZmFpbGVkLFxuICAgICAgZHJvcHBlZDogdGhpcy5kcm9wcGVkLFxuICAgICAgb21pdHRlZFJvd3M6IHRoaXMub21pdHRlZFJvd3MsXG4gICAgICBpbmNvbXBsZXRlOiB0aGlzLnBlbmRpbmcuc2l6ZSArIHRoaXMucmVhZHMgKyB0aGlzLmZhaWxlZCArIHRoaXMuZHJvcHBlZCArIHRoaXMub21pdHRlZFJvd3MgPiAwLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPEF0dGVtcHRTdG9yYWdlU3RhdHM+IHtcbiAgICBpZiAodGhpcy5wZW5kaW5nLnNpemUgPT09IDApIHJldHVybiB0aGlzLnN0b3JhZ2UoKTtcbiAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICBQcm9taXNlLmFsbChbLi4udGhpcy5wZW5kaW5nXSksXG4gICAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KHJlc29sdmUsIHRoaXMudGltZW91dE1zKTtcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UoKTtcbiAgfVxuXG4gIGJ5VGFyZ2V0KCk6IEF0dGVtcHRBZ2dyZWdhdGVbJ2J5VGFyZ2V0J10ge1xuICAgIHJldHVybiBhZ2dyZWdhdGVBdHRlbXB0cyh0aGlzLnJvd3MudmFsdWVzKCksIHRoaXMuZXhlbXBsYXJzLCB0aGlzLnN0b3JhZ2UoKSkuYnlUYXJnZXQ7XG4gIH1cblxuICBieVJ1bigpOiBBdHRlbXB0QWdncmVnYXRlWydieVJ1biddIHtcbiAgICByZXR1cm4gYWdncmVnYXRlQXR0ZW1wdHModGhpcy5yb3dzLnZhbHVlcygpLCB0aGlzLmV4ZW1wbGFycywgdGhpcy5zdG9yYWdlKCkpLmJ5UnVuO1xuICB9XG5cbiAgc2xvd2VzdCh0YXJnZXQ6IHN0cmluZywgbGltaXQgPSB0aGlzLmV4ZW1wbGFycykge1xuICAgIGNvbnN0IGNhcCA9IG9wdGlvbihsaW1pdCwgdGhpcy5leGVtcGxhcnMsIDEwMCwgJ2xpbWl0JywgdHJ1ZSk7XG4gICAgcmV0dXJuIHdvcnN0KFxuICAgICAgdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnICYmIHJvdy50YXJnZXQgPT09IHRhcmdldCksXG4gICAgICBjYXAsXG4gICAgKTtcbiAgfVxuXG4gIHNlcmllcyhzZXJpZXM6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiB7IGF0dGVtcHRzOiBQaHlzaWNhbEF0dGVtcHRSb3dbXTsgZGVjaXNpb25zOiBBdHRlbXB0RGVjaXNpb25Sb3dbXSB9IHtcbiAgICBjb25zdCBoZWxkID0gdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KSA9PiBydW5JZCA9PT0gdW5kZWZpbmVkIHx8IHJvdy5ydW5JZCA9PT0gcnVuSWQpO1xuICAgIGNvbnN0IGxpbmtlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGhlbGQpXG4gICAgICBpZiAocm93LmtpbmQgPT09ICdhdHRlbXB0JyAmJiByb3cuc2VyaWVzID09PSBzZXJpZXMgJiYgcm93LnJldHJ5TG9vcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBsaW5rZWQuYWRkKEpTT04uc3RyaW5naWZ5KFtyb3cucnVuSWQsIHJvdy5yZXRyeUxvb3Auc2VyaWVzXSkpO1xuICAgIGNvbnN0IHJvd3MgPSBoZWxkLmZpbHRlcihcbiAgICAgIChyb3cpID0+XG4gICAgICAgIHJvdy5raW5kICE9PSAncnVuJyAmJlxuICAgICAgICAocm93LnNlcmllcyA9PT0gc2VyaWVzIHx8XG4gICAgICAgICAgKHJvdy5raW5kID09PSAnYXR0ZW1wdCcgJiYgcm93LnJldHJ5TG9vcD8uc2VyaWVzID09PSBzZXJpZXMpIHx8XG4gICAgICAgICAgbGlua2VkLmhhcyhKU09OLnN0cmluZ2lmeShbcm93LnJ1bklkLCByb3cua2luZCA9PT0gJ2F0dGVtcHQnID8gcm93LnJldHJ5TG9vcD8uc2VyaWVzIDogcm93LnNlcmllc10pKSksXG4gICAgKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHtcbiAgICAgIGF0dGVtcHRzOiByb3dzLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnKSxcbiAgICAgIGRlY2lzaW9uczogcm93cy5maWx0ZXIoKHJvdyk6IHJvdyBpcyBBdHRlbXB0RGVjaXNpb25Sb3cgPT4gcm93LmtpbmQgPT09ICdkZWNpc2lvbicpLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYWdncmVnYXRlKHN1cHBsaWVkOiBBdHRlbXB0UXVlcnkgPSB7fSk6IFByb21pc2U8QXR0ZW1wdEFnZ3JlZ2F0ZT4ge1xuICAgIGNvbnN0IGFkbWl0dGVkID0gb3duRGF0YVJlY29yZChzdXBwbGllZCk7XG4gICAgaWYgKGFkbWl0dGVkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2F0dGVtcHRzOiBpbnZhbGlkIHF1ZXJ5Jyk7XG4gICAgY29uc3QgeyBzaW5jZSwgdW50aWwsIHRhcmdldCwgcnVuSWQgfSA9IGFkbWl0dGVkIGFzIEF0dGVtcHRRdWVyeTtcbiAgICBpZiAoXG4gICAgICAoc2luY2UgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0Zpbml0ZShzaW5jZSkgfHwgc2luY2UgPCAwKSkgfHxcbiAgICAgICh1bnRpbCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzRmluaXRlKHVudGlsKSB8fCB1bnRpbCA8IDApKSB8fFxuICAgICAgKHNpbmNlICE9PSB1bmRlZmluZWQgJiYgdW50aWwgIT09IHVuZGVmaW5lZCAmJiBzaW5jZSA+IHVudGlsKSB8fFxuICAgICAgKHRhcmdldCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgdGFyZ2V0ICE9PSAnc3RyaW5nJyB8fCB0YXJnZXQubGVuZ3RoID09PSAwKSkgfHxcbiAgICAgIChydW5JZCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnIHx8IHJ1bklkLmxlbmd0aCA9PT0gMCkpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXR0ZW1wdHM6IGludmFsaWQgcXVlcnknKTtcbiAgICBjb25zdCBxdWVyeSA9IE9iamVjdC5mcmVlemUoeyBzaW5jZSwgdW50aWwsIHRhcmdldCwgcnVuSWQgfSk7XG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuc3RvcmUgPT09IHVuZGVmaW5lZCA/IHRoaXMucm93cy52YWx1ZXMoKSA6IGF3YWl0IHRoaXMucmVhZFN0b3JlZChxdWVyeSk7XG4gICAgY29uc3Qgcm93czogQXR0ZW1wdFJvd1tdID0gW107XG4gICAgY29uc3Qgd2luZG93ID0gbWV0cmljV2luZG93KHJhdywgdGhpcy5tYXhSb3dzKTtcbiAgICBsZXQgaW52YWxpZCA9IHdpbmRvdy5vbWl0dGVkO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygd2luZG93LnZhbHVlcykge1xuICAgICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHZhbHVlKTtcbiAgICAgIGlmIChyb3cgJiYgbWF0Y2hlc1F1ZXJ5KHJvdywgcXVlcnkpKSByb3dzLnB1c2gocm93KTtcbiAgICAgIGVsc2UgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSBpbnZhbGlkKys7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLnN0b3JhZ2UoKTtcbiAgICBsZXQgc3RvcmVPbWl0dGVkID0gMDtcbiAgICBsZXQgYWNjb3VudGluZ1Vua25vd24gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5zdG9yZT8uc3RhdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBvd25EYXRhUmVjb3JkKHRoaXMuc3RvcmUuc3RhdHMoKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzdGF0cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgdHlwZW9mIHN0YXRzLm9taXR0ZWRSb3dzICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICFOdW1iZXIuaXNTYWZlSW50ZWdlcihzdGF0cy5vbWl0dGVkUm93cykgfHxcbiAgICAgICAgICBzdGF0cy5vbWl0dGVkUm93cyA8IDBcbiAgICAgICAgKVxuICAgICAgICAgIGFjY291bnRpbmdVbmtub3duID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBzdG9yZU9taXR0ZWQgPSBzdGF0cy5vbWl0dGVkUm93cztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhY2NvdW50aW5nVW5rbm93biA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZ2dyZWdhdGVBdHRlbXB0cyhyb3dzLCB0aGlzLmV4ZW1wbGFycywge1xuICAgICAgLi4uc3RvcmFnZSxcbiAgICAgIG9taXR0ZWRSb3dzOiBzdG9yYWdlLm9taXR0ZWRSb3dzICsgaW52YWxpZCArIHN0b3JlT21pdHRlZCxcbiAgICAgIGluY29tcGxldGU6IHN0b3JhZ2UuaW5jb21wbGV0ZSB8fCBpbnZhbGlkICsgc3RvcmVPbWl0dGVkID4gMCB8fCBhY2NvdW50aW5nVW5rbm93bixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZFN0b3JlZChxdWVyeTogQXR0ZW1wdFF1ZXJ5KTogUHJvbWlzZTxyZWFkb25seSBBdHRlbXB0Um93W10+IHtcbiAgICBpZiAodGhpcy5yZWFkcyArIHRoaXMucGVuZGluZy5zaXplID49IHRoaXMubWF4UGVuZGluZykgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0czogc3RvcmUgcmVhZCBjYXBhY2l0eSByZWFjaGVkJyk7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgIGlmIChzdG9yZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5yb3dzLnZhbHVlcygpO1xuICAgIHRoaXMucmVhZHMrKztcbiAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWxlYXNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXJlbGVhc2VkKSB7XG4gICAgICAgIHJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWFkcy0tO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8gQSB0aW1lZC1vdXQgSS9PIHN0aWxsIG93bnMgaXRzIHNsb3QgdW50aWwgaXQgc2V0dGxlczogYSBjYWxsZXIgY2Fubm90IGNyZWF0ZSBhbiB1bmJvdW5kZWQgcG9vbCBvZiBzdHVjayByZWFkcy5cbiAgICBjb25zdCB3b3JrID0gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIC50aGVuKCgpID0+IHN0b3JlLnJlYWQocXVlcnkpKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyb3dzKSA9PiB7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb3dzKSkgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0czogaW52YWxpZCBzdG9yZSByb3dzJyk7XG4gICAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdHRlbXB0czogc3RvcmUgcmVhZCBmYWlsZWQnKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICB3b3JrLFxuICAgICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF9yZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignYXR0ZW1wdHM6IHN0b3JlIHJlYWQgdGltZWQgb3V0JykpLCB0aGlzLnRpbWVvdXRNcyk7XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aW1lciAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgfVxuXG4gIHRvU25hcHNob3QoKSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhZ2dyZWdhdGVBdHRlbXB0cyh0aGlzLnJvd3MudmFsdWVzKCksIHRoaXMuZXhlbXBsYXJzLCB0aGlzLnN0b3JhZ2UoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdBdHRlbXB0cycsXG4gICAgICBkYXRhOiB7IGJ5VGFyZ2V0OiBzdGF0cy5ieVRhcmdldCwgYnlSdW46IHN0YXRzLmJ5UnVuIH0sXG4gICAgICBtZXRhOiB7XG4gICAgICAgIHByb2plY3Rpb246ICdwZXItdGFyZ2V0JyxcbiAgICAgICAgZXhlbXBsYXJzOiB0aGlzLmV4ZW1wbGFycyxcbiAgICAgICAgcm93czogdGhpcy5yb3dzLnNpemUsXG4gICAgICAgIG1heFJvd3M6IHRoaXMubWF4Um93cyxcbiAgICAgICAgc3RvcmFnZTogc3RhdHMuc3RvcmFnZSxcbiAgICAgICAgd29ya1RpbWU6ICdzdW0tb2YtYXR0ZW1wdC1kdXJhdGlvbnMnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgdG9PVGVsKCkge1xuICAgIHJldHVybiBhdHRlbXB0T1RlbChcbiAgICAgIHRoaXMucm93cy52YWx1ZXMoKS5maWx0ZXIoKHJvdyk6IHJvdyBpcyBQaHlzaWNhbEF0dGVtcHRSb3cgPT4gcm93LmtpbmQgPT09ICdhdHRlbXB0JyksXG4gICAgICB0aGlzLmJ5VGFyZ2V0KCksXG4gICAgICB0aGlzLmV4ZW1wbGFycyxcbiAgICApO1xuICB9XG5cbiAgLyoqIENsZWFyIGNvbXBsZXRlZCBsb2NhbCBwcm9qZWN0aW9uczsgYWN0aXZlL3BhdXNlZCBldmlkZW5jZSBhbmQgYm91bmRlZCBvd25lcnNoaXAgc3Vydml2ZSBleGVjdXRvciBhdXRvLWNsZWFyLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KSA9PiB0aGlzLnN0YXJ0cy5oYXMocm93LnJ1bklkKSk7XG4gICAgdGhpcy5yb3dzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Yga2VwdCkgdGhpcy5yb3dzLnNldChhdHRlbXB0Um93S2V5KHJvdyksIHJvdyk7XG4gICAgZm9yIChjb25zdCBba2V5LCByb3ddIG9mIHRoaXMubG9naWNhbCkgaWYgKCF0aGlzLnN0YXJ0cy5oYXMocm93LnJ1bklkKSkgdGhpcy5sb2dpY2FsLmRlbGV0ZShrZXkpO1xuICAgIGlmICh0aGlzLnN0YXJ0cy5zaXplID09PSAwKSB0aGlzLm9taXR0ZWRSb3dzID0gMDtcbiAgfVxufVxuXG4vKiogQm91bmRlZCByZWZlcmVuY2UgYWRhcHRlciBmb3IgdGVzdHMvbG9jYWwgdXNlOyBhcHBzIHN1cHBseSB0aGVpciBvd24gZGF0YWJhc2UgYWRhcHRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vcnlTdG9yZShcbiAgb3B0aW9uczogeyByZWFkb25seSBtYXhSb3dzPzogbnVtYmVyIH0gPSB7fSxcbik6IEF0dGVtcHRTdG9yZSAmIHsgc3RhdHMoKTogeyByb3dzOiBudW1iZXI7IG9taXR0ZWRSb3dzOiBudW1iZXIgfSB9IHtcbiAgY29uc3QgbWF4ID0gb3B0aW9uKG9wdGlvbnMubWF4Um93cywgMTAwMDAsIDEwMDAwMCwgJ21heFJvd3MnKTtcbiAgY29uc3Qgcm93cyA9IG5ldyBNYXA8bnVtYmVyLCBBdHRlbXB0Um93PigpO1xuICBsZXQgb21pdHRlZCA9IDA7XG4gIGxldCBvcmRpbmFsID0gMDtcbiAgcmV0dXJuIHtcbiAgICBhcHBlbmQoaW5jb21pbmcpIHtcbiAgICAgIGNvbnN0IHdpbmRvdyA9IG1ldHJpY1dpbmRvdyhpbmNvbWluZywgbWF4KTtcbiAgICAgIG9taXR0ZWQgKz0gd2luZG93Lm9taXR0ZWQ7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHdpbmRvdy52YWx1ZXMpIHtcbiAgICAgICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHZhbHVlKTtcbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICBvbWl0dGVkKys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvd3Muc2l6ZSA+PSBtYXgpIHtcbiAgICAgICAgICBjb25zdCBvbGRlc3QgPSByb3dzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSByb3dzLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICAgIG9taXR0ZWQrKztcbiAgICAgICAgfVxuICAgICAgICByb3dzLnNldCgrK29yZGluYWwsIHJvdyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyByZWFkKHF1ZXJ5KSB7XG4gICAgICByZXR1cm4gWy4uLnJvd3MudmFsdWVzKCldLmZpbHRlcigocm93KSA9PiBtYXRjaGVzUXVlcnkocm93LCBxdWVyeSkpLm1hcCgocm93KSA9PiBzdHJ1Y3R1cmVkQ2xvbmUocm93KSk7XG4gICAgfSxcbiAgICBzdGF0cygpIHtcbiAgICAgIHJldHVybiB7IHJvd3M6IHJvd3Muc2l6ZSwgb21pdHRlZFJvd3M6IG9taXR0ZWQgfTtcbiAgICB9LFxuICB9O1xufVxuIl19
@@ -27,6 +27,17 @@
27
27
  * completing consumes its slot via `onError`, so the post-fan-out
28
28
  * convergence stage is never misattributed as a branch entry.
29
29
  *
30
+ * 3. attempt stops (10.1) — `onAttempt`: a stage whose retry series STOPPED
31
+ * (it gave up, or a later attempt paused or was aborted; the shared
32
+ * predicate `recorder/attemptSeries.ts · isRetryEvidence`) made a decision of its
33
+ * own — the retry-or-stop decision, in the shape `decide()` produces. It
34
+ * is recorded beside the deciders as `kind: 'attempt-stop'`
35
+ * (`getDecisions()`, `getAttemptStop(id)`), `chosen: 'stop'`, the stop
36
+ * reason as its `ruleLabel`. It is NOT a branch entry: a control edge in
37
+ * `causalChain` links a stage to ANOTHER execution that governed it, and
38
+ * the stop governs the stage itself — so `lookup` is unchanged, and a
39
+ * reader walking a failed stage reads the stop off its decision record.
40
+ *
30
41
  * `lookup(runtimeStageId)` then walks the ancestor chain from the stage
31
42
  * upward; the first ancestor (or the stage itself) registered as a
32
43
  * branch entry yields its governing decider — the NEAREST decision.
@@ -55,9 +66,15 @@ import { causalChain } from 'foottrace';
55
66
  */
56
67
  import type { ControlDependency, ControlDepLookup } from 'foottrace';
57
68
  import type { DecisionEvidence, SelectionEvidence } from '../decide/types.js';
58
- import type { FlowDecisionEvent, FlowErrorEvent, FlowRecorder, FlowSelectedEvent, FlowStageEvent } from '../engine/narrative/types.js';
69
+ import type { FlowAttemptEvent, FlowDecisionEvent, FlowErrorEvent, FlowRecorder, FlowSelectedEvent, FlowStageEvent } from '../engine/narrative/types.js';
59
70
  /** One recorded decision/selection event (RFC-003 D5). */
60
71
  export interface ControlDecisionRecord {
72
+ /**
73
+ * `'attempt-stop'` for a stage's own retry-or-stop decision that STOPPED its series (10.1) — then
74
+ * `deciderRuntimeStageId` is the stage's execution, `chosen` is `'stop'`, `evidence` the attempt's decision and
75
+ * `ruleLabel` the stop reason. Absent for a decider / selector.
76
+ */
77
+ kind?: 'attempt-stop';
61
78
  /** runtimeStageId of the decider/selector execution step. */
62
79
  deciderRuntimeStageId: string;
63
80
  /** Chosen branch display name (decider) or selected names (selector). */
@@ -100,6 +117,7 @@ export declare class ControlDepRecorder implements FlowRecorder {
100
117
  private lastRunId?;
101
118
  constructor(options?: ControlDepRecorderOptions);
102
119
  onDecision(event: FlowDecisionEvent): void;
120
+ onAttempt(event: FlowAttemptEvent): void;
103
121
  onSelected(event: FlowSelectedEvent): void;
104
122
  onStageExecuted(event: FlowStageEvent): void;
105
123
  /**
@@ -118,8 +136,24 @@ export declare class ControlDepRecorder implements FlowRecorder {
118
136
  lookup(runtimeStageId: string): ControlDependency | undefined;
119
137
  /** The lookup as a bare function — plug into `causalChain(..., { controlDeps })`. */
120
138
  asLookup(): ControlDepLookup;
121
- /** All decisions recorded for the current run, in event order. */
139
+ /** The attempt-stop decision of a stage execution whose retry series stopped, if it did. */
140
+ getAttemptStop(runtimeStageId: string): ControlDecisionRecord | undefined;
141
+ /** All decisions recorded for the current run, in event order — deciders, selectors and attempt stops. */
122
142
  getDecisions(): ControlDecisionRecord[];
143
+ /**
144
+ * Current-run control evidence for the native snapshot. Project only the
145
+ * stage identities collected during traversal; never walk the execution tree.
146
+ * Parentless roots cannot have a governing control edge.
147
+ */
148
+ toSnapshot(): {
149
+ name: string;
150
+ data: {
151
+ decisions: ControlDecisionRecord[];
152
+ controlDeps: {
153
+ [k: string]: ControlDependency;
154
+ };
155
+ };
156
+ };
123
157
  /** Reset all state (also happens automatically on runId change). */
124
158
  clear(): void;
125
159
  /** Convention 4: a new runId means a new run — reset transient state. */