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,112 @@
1
+ "use strict";
2
+ /**
3
+ * attempt/deadline.ts — what the run's deadline IS, to everything that reads time (design §3.1, law 3).
4
+ *
5
+ * The deadline is one number, epoch milliseconds (`env.deadline`); the executor arms the run's signal to abort when
6
+ * it passes (`runner/deadline.ts · armRun`). Reaching it is NOT a cancellation: an attempt the deadline cuts short
7
+ * timed out (it had no answer in the time it had — law 4), and the series stops `no-time-left`, not `aborted`. So
8
+ * the reason the run's signal aborts with at the deadline is BRANDED here, and the attempt runner tells the two
9
+ * apart by the brand — never by the message, never by the clock.
10
+ *
11
+ * The brand is a module-private WeakSet: an ordinary `Error` (same message, same name a run with `timeoutMs` always
12
+ * rejected with), recognisable only by identity.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.armDeadline = exports.isAbortSignal = exports.setLongTimeout = exports.readDeadline = exports.isCancelled = exports.isDeadlineReason = exports.markTimeLimit = exports.deadlineReason = void 0;
16
+ const anySignal_js_1 = require("./anySignal.js");
17
+ const DEADLINE_REASONS = new WeakSet();
18
+ /** The reason the run's signal aborts with when its deadline passes — an `Error`, branded as the deadline's. */
19
+ function deadlineReason(message) {
20
+ const reason = new Error(message);
21
+ DEADLINE_REASONS.add(reason);
22
+ return reason;
23
+ }
24
+ exports.deadlineReason = deadlineReason;
25
+ /**
26
+ * Brand `reason` as a time limit — what an attempt's own cap aborts with (P2). An attempt's cap is the deadline of
27
+ * every call made inside it (`attempt/call.ts`), so a call it cuts ran out of time: `'timeout'`, never `'aborted'`.
28
+ * The run's own signal never aborts with it, so a stage attempt reads nothing new.
29
+ */
30
+ function markTimeLimit(reason) {
31
+ DEADLINE_REASONS.add(reason);
32
+ return reason;
33
+ }
34
+ exports.markTimeLimit = markTimeLimit;
35
+ /** Whether `reason` is the run's deadline or an attempt's cap — a time limit, not a cancellation. */
36
+ function isDeadlineReason(reason) {
37
+ return typeof reason === 'object' && reason !== null && DEADLINE_REASONS.has(reason);
38
+ }
39
+ exports.isDeadlineReason = isDeadlineReason;
40
+ /** Whether the signal aborted for a reason OTHER than a time limit — a cancellation. */
41
+ function isCancelled(signal) {
42
+ return signal?.aborted === true && !isDeadlineReason(signal.reason);
43
+ }
44
+ exports.isCancelled = isCancelled;
45
+ /** A deadline as the engine reads one: a finite number (epoch ms), else none. */
46
+ function readDeadline(value) {
47
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
48
+ }
49
+ exports.readDeadline = readDeadline;
50
+ /** The longest delay a host timer honours (2^31 − 1 ms, ~24.8 days); a longer one fires at once. */
51
+ const MAX_TIMER_MS = 2_147_483_647;
52
+ /**
53
+ * `setTimeout` for any delay: a delay past the host's limit is waited in chunks, so a 30-day deadline does not fire
54
+ * in a millisecond. Returns the one call that cancels it.
55
+ */
56
+ function setLongTimeout(fn, ms) {
57
+ let timer;
58
+ let cancelled = false;
59
+ const arm = (left) => {
60
+ timer = setTimeout(() => {
61
+ if (cancelled)
62
+ return;
63
+ if (left > MAX_TIMER_MS)
64
+ arm(left - MAX_TIMER_MS);
65
+ else
66
+ fn();
67
+ }, Math.min(left, MAX_TIMER_MS));
68
+ };
69
+ arm(Math.max(0, ms));
70
+ return () => {
71
+ cancelled = true;
72
+ if (timer !== undefined)
73
+ clearTimeout(timer);
74
+ };
75
+ }
76
+ exports.setLongTimeout = setLongTimeout;
77
+ /** Whether `value` is an AbortSignal (structurally — a signal from another realm counts). */
78
+ function isAbortSignal(value) {
79
+ return (typeof value === 'object' &&
80
+ value !== null &&
81
+ typeof value.aborted === 'boolean' &&
82
+ typeof value.addEventListener === 'function' &&
83
+ typeof value.removeEventListener === 'function');
84
+ }
85
+ exports.isAbortSignal = isAbortSignal;
86
+ /**
87
+ * Compose `signal` with a timer that aborts at `deadline` (epoch ms) with a branded {@link deadlineReason} — so the
88
+ * attempt runner's reading holds: the signal it is handed aborts at the deadline, as the run's does (`armRun`). A
89
+ * deadline already past aborts at once; without a deadline the signal is handed back as it is.
90
+ */
91
+ function armDeadline(signal, deadline, message, now = Date.now) {
92
+ if (deadline === undefined)
93
+ return { signal, dispose: () => undefined };
94
+ const timer = new AbortController();
95
+ const composed = (0, anySignal_js_1.anySignal)([signal, timer.signal]);
96
+ const reason = deadlineReason(message);
97
+ const left = deadline - now();
98
+ let cancel = () => undefined;
99
+ if (left <= 0)
100
+ timer.abort(reason);
101
+ else
102
+ cancel = setLongTimeout(() => timer.abort(reason), left);
103
+ return {
104
+ signal: composed.signal,
105
+ dispose: () => {
106
+ cancel();
107
+ composed.dispose();
108
+ },
109
+ };
110
+ }
111
+ exports.armDeadline = armDeadline;
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhZGxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvZGVhZGxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7OztHQVdHOzs7QUFFSCxpREFBMkM7QUFFM0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0FBRS9DLGdIQUFnSDtBQUNoSCxTQUFnQixjQUFjLENBQUMsT0FBZTtJQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUpELHdDQUlDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FBbUIsTUFBUztJQUN2RCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUhELHNDQUdDO0FBRUQscUdBQXFHO0FBQ3JHLFNBQWdCLGdCQUFnQixDQUFDLE1BQWU7SUFDOUMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUZELDRDQUVDO0FBRUQsd0ZBQXdGO0FBQ3hGLFNBQWdCLFdBQVcsQ0FBQyxNQUErQjtJQUN6RCxPQUFPLE1BQU0sRUFBRSxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFGRCxrQ0FFQztBQUVELGlGQUFpRjtBQUNqRixTQUFnQixZQUFZLENBQUMsS0FBYztJQUN6QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNqRixDQUFDO0FBRkQsb0NBRUM7QUFFRCxvR0FBb0c7QUFDcEcsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDO0FBRW5DOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxFQUFjLEVBQUUsRUFBVTtJQUN2RCxJQUFJLEtBQWdELENBQUM7SUFDckQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7UUFDM0IsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsSUFBSSxTQUFTO2dCQUFFLE9BQU87WUFDdEIsSUFBSSxJQUFJLEdBQUcsWUFBWTtnQkFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDOztnQkFDN0MsRUFBRSxFQUFFLENBQUM7UUFDWixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUM7SUFDRixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixPQUFPLEdBQUcsRUFBRTtRQUNWLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBZkQsd0NBZUM7QUFFRCw2RkFBNkY7QUFDN0YsU0FBZ0IsYUFBYSxDQUFDLEtBQWM7SUFDMUMsT0FBTyxDQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsS0FBSyxLQUFLLElBQUk7UUFDZCxPQUFRLEtBQXFCLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFDbkQsT0FBUSxLQUFxQixDQUFDLGdCQUFnQixLQUFLLFVBQVU7UUFDN0QsT0FBUSxLQUFxQixDQUFDLG1CQUFtQixLQUFLLFVBQVUsQ0FDakUsQ0FBQztBQUNKLENBQUM7QUFSRCxzQ0FRQztBQVFEOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQ3pCLE1BQStCLEVBQy9CLFFBQTRCLEVBQzVCLE9BQWUsRUFDZixNQUFvQixJQUFJLENBQUMsR0FBRztJQUU1QixJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFBLHdCQUFTLEVBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUM5QixJQUFJLE1BQU0sR0FBZSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDekMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7O1FBQzlCLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxPQUFPO1FBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDWixNQUFNLEVBQUUsQ0FBQztZQUNULFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFyQkQsa0NBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhdHRlbXB0L2RlYWRsaW5lLnRzIOKAlCB3aGF0IHRoZSBydW4ncyBkZWFkbGluZSBJUywgdG8gZXZlcnl0aGluZyB0aGF0IHJlYWRzIHRpbWUgKGRlc2lnbiDCpzMuMSwgbGF3IDMpLlxuICpcbiAqIFRoZSBkZWFkbGluZSBpcyBvbmUgbnVtYmVyLCBlcG9jaCBtaWxsaXNlY29uZHMgKGBlbnYuZGVhZGxpbmVgKTsgdGhlIGV4ZWN1dG9yIGFybXMgdGhlIHJ1bidzIHNpZ25hbCB0byBhYm9ydCB3aGVuXG4gKiBpdCBwYXNzZXMgKGBydW5uZXIvZGVhZGxpbmUudHMgwrcgYXJtUnVuYCkuIFJlYWNoaW5nIGl0IGlzIE5PVCBhIGNhbmNlbGxhdGlvbjogYW4gYXR0ZW1wdCB0aGUgZGVhZGxpbmUgY3V0cyBzaG9ydFxuICogdGltZWQgb3V0IChpdCBoYWQgbm8gYW5zd2VyIGluIHRoZSB0aW1lIGl0IGhhZCDigJQgbGF3IDQpLCBhbmQgdGhlIHNlcmllcyBzdG9wcyBgbm8tdGltZS1sZWZ0YCwgbm90IGBhYm9ydGVkYC4gU29cbiAqIHRoZSByZWFzb24gdGhlIHJ1bidzIHNpZ25hbCBhYm9ydHMgd2l0aCBhdCB0aGUgZGVhZGxpbmUgaXMgQlJBTkRFRCBoZXJlLCBhbmQgdGhlIGF0dGVtcHQgcnVubmVyIHRlbGxzIHRoZSB0d29cbiAqIGFwYXJ0IGJ5IHRoZSBicmFuZCDigJQgbmV2ZXIgYnkgdGhlIG1lc3NhZ2UsIG5ldmVyIGJ5IHRoZSBjbG9jay5cbiAqXG4gKiBUaGUgYnJhbmQgaXMgYSBtb2R1bGUtcHJpdmF0ZSBXZWFrU2V0OiBhbiBvcmRpbmFyeSBgRXJyb3JgIChzYW1lIG1lc3NhZ2UsIHNhbWUgbmFtZSBhIHJ1biB3aXRoIGB0aW1lb3V0TXNgIGFsd2F5c1xuICogcmVqZWN0ZWQgd2l0aCksIHJlY29nbmlzYWJsZSBvbmx5IGJ5IGlkZW50aXR5LlxuICovXG5cbmltcG9ydCB7IGFueVNpZ25hbCB9IGZyb20gJy4vYW55U2lnbmFsLmpzJztcblxuY29uc3QgREVBRExJTkVfUkVBU09OUyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuLyoqIFRoZSByZWFzb24gdGhlIHJ1bidzIHNpZ25hbCBhYm9ydHMgd2l0aCB3aGVuIGl0cyBkZWFkbGluZSBwYXNzZXMg4oCUIGFuIGBFcnJvcmAsIGJyYW5kZWQgYXMgdGhlIGRlYWRsaW5lJ3MuICovXG5leHBvcnQgZnVuY3Rpb24gZGVhZGxpbmVSZWFzb24obWVzc2FnZTogc3RyaW5nKTogRXJyb3Ige1xuICBjb25zdCByZWFzb24gPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIERFQURMSU5FX1JFQVNPTlMuYWRkKHJlYXNvbik7XG4gIHJldHVybiByZWFzb247XG59XG5cbi8qKlxuICogQnJhbmQgYHJlYXNvbmAgYXMgYSB0aW1lIGxpbWl0IOKAlCB3aGF0IGFuIGF0dGVtcHQncyBvd24gY2FwIGFib3J0cyB3aXRoIChQMikuIEFuIGF0dGVtcHQncyBjYXAgaXMgdGhlIGRlYWRsaW5lIG9mXG4gKiBldmVyeSBjYWxsIG1hZGUgaW5zaWRlIGl0IChgYXR0ZW1wdC9jYWxsLnRzYCksIHNvIGEgY2FsbCBpdCBjdXRzIHJhbiBvdXQgb2YgdGltZTogYCd0aW1lb3V0J2AsIG5ldmVyIGAnYWJvcnRlZCdgLlxuICogVGhlIHJ1bidzIG93biBzaWduYWwgbmV2ZXIgYWJvcnRzIHdpdGggaXQsIHNvIGEgc3RhZ2UgYXR0ZW1wdCByZWFkcyBub3RoaW5nIG5ldy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtUaW1lTGltaXQ8VCBleHRlbmRzIG9iamVjdD4ocmVhc29uOiBUKTogVCB7XG4gIERFQURMSU5FX1JFQVNPTlMuYWRkKHJlYXNvbik7XG4gIHJldHVybiByZWFzb247XG59XG5cbi8qKiBXaGV0aGVyIGByZWFzb25gIGlzIHRoZSBydW4ncyBkZWFkbGluZSBvciBhbiBhdHRlbXB0J3MgY2FwIOKAlCBhIHRpbWUgbGltaXQsIG5vdCBhIGNhbmNlbGxhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlYWRsaW5lUmVhc29uKHJlYXNvbjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHJlYXNvbiA9PT0gJ29iamVjdCcgJiYgcmVhc29uICE9PSBudWxsICYmIERFQURMSU5FX1JFQVNPTlMuaGFzKHJlYXNvbik7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzaWduYWwgYWJvcnRlZCBmb3IgYSByZWFzb24gT1RIRVIgdGhhbiBhIHRpbWUgbGltaXQg4oCUIGEgY2FuY2VsbGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FuY2VsbGVkKHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hbD8uYWJvcnRlZCA9PT0gdHJ1ZSAmJiAhaXNEZWFkbGluZVJlYXNvbihzaWduYWwucmVhc29uKTtcbn1cblxuLyoqIEEgZGVhZGxpbmUgYXMgdGhlIGVuZ2luZSByZWFkcyBvbmU6IGEgZmluaXRlIG51bWJlciAoZXBvY2ggbXMpLCBlbHNlIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZERlYWRsaW5lKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVGhlIGxvbmdlc3QgZGVsYXkgYSBob3N0IHRpbWVyIGhvbm91cnMgKDJeMzEg4oiSIDEgbXMsIH4yNC44IGRheXMpOyBhIGxvbmdlciBvbmUgZmlyZXMgYXQgb25jZS4gKi9cbmNvbnN0IE1BWF9USU1FUl9NUyA9IDJfMTQ3XzQ4M182NDc7XG5cbi8qKlxuICogYHNldFRpbWVvdXRgIGZvciBhbnkgZGVsYXk6IGEgZGVsYXkgcGFzdCB0aGUgaG9zdCdzIGxpbWl0IGlzIHdhaXRlZCBpbiBjaHVua3MsIHNvIGEgMzAtZGF5IGRlYWRsaW5lIGRvZXMgbm90IGZpcmVcbiAqIGluIGEgbWlsbGlzZWNvbmQuIFJldHVybnMgdGhlIG9uZSBjYWxsIHRoYXQgY2FuY2VscyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvbmdUaW1lb3V0KGZuOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyKTogKCkgPT4gdm9pZCB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgYXJtID0gKGxlZnQ6IG51bWJlcikgPT4ge1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICBpZiAobGVmdCA+IE1BWF9USU1FUl9NUykgYXJtKGxlZnQgLSBNQVhfVElNRVJfTVMpO1xuICAgICAgZWxzZSBmbigpO1xuICAgIH0sIE1hdGgubWluKGxlZnQsIE1BWF9USU1FUl9NUykpO1xuICB9O1xuICBhcm0oTWF0aC5tYXgoMCwgbXMpKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgIGlmICh0aW1lciAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xufVxuXG4vKiogV2hldGhlciBgdmFsdWVgIGlzIGFuIEFib3J0U2lnbmFsIChzdHJ1Y3R1cmFsbHkg4oCUIGEgc2lnbmFsIGZyb20gYW5vdGhlciByZWFsbSBjb3VudHMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnRTaWduYWwodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBYm9ydFNpZ25hbCB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBBYm9ydFNpZ25hbCkuYWJvcnRlZCA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBBYm9ydFNpZ25hbCkuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgQWJvcnRTaWduYWwpLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cblxuLyoqIEEgc2lnbmFsIHRoYXQgYWJvcnRzIGF0IGEgZGVhZGxpbmUgKG9yIHdpdGggaXRzIGlucHV0KSwgYW5kIHRoZSBvbmUgY2FsbCB0aGF0IHJlbGVhc2VzIGJvdGguICovXG5leHBvcnQgaW50ZXJmYWNlIEFybWVkRGVhZGxpbmUge1xuICByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkO1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29tcG9zZSBgc2lnbmFsYCB3aXRoIGEgdGltZXIgdGhhdCBhYm9ydHMgYXQgYGRlYWRsaW5lYCAoZXBvY2ggbXMpIHdpdGggYSBicmFuZGVkIHtAbGluayBkZWFkbGluZVJlYXNvbn0g4oCUIHNvIHRoZVxuICogYXR0ZW1wdCBydW5uZXIncyByZWFkaW5nIGhvbGRzOiB0aGUgc2lnbmFsIGl0IGlzIGhhbmRlZCBhYm9ydHMgYXQgdGhlIGRlYWRsaW5lLCBhcyB0aGUgcnVuJ3MgZG9lcyAoYGFybVJ1bmApLiBBXG4gKiBkZWFkbGluZSBhbHJlYWR5IHBhc3QgYWJvcnRzIGF0IG9uY2U7IHdpdGhvdXQgYSBkZWFkbGluZSB0aGUgc2lnbmFsIGlzIGhhbmRlZCBiYWNrIGFzIGl0IGlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJtRGVhZGxpbmUoXG4gIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gIGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgbm93OiAoKSA9PiBudW1iZXIgPSBEYXRlLm5vdyxcbik6IEFybWVkRGVhZGxpbmUge1xuICBpZiAoZGVhZGxpbmUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgc2lnbmFsLCBkaXNwb3NlOiAoKSA9PiB1bmRlZmluZWQgfTtcbiAgY29uc3QgdGltZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNvbXBvc2VkID0gYW55U2lnbmFsKFtzaWduYWwsIHRpbWVyLnNpZ25hbF0pO1xuICBjb25zdCByZWFzb24gPSBkZWFkbGluZVJlYXNvbihtZXNzYWdlKTtcbiAgY29uc3QgbGVmdCA9IGRlYWRsaW5lIC0gbm93KCk7XG4gIGxldCBjYW5jZWw6ICgpID0+IHZvaWQgPSAoKSA9PiB1bmRlZmluZWQ7XG4gIGlmIChsZWZ0IDw9IDApIHRpbWVyLmFib3J0KHJlYXNvbik7XG4gIGVsc2UgY2FuY2VsID0gc2V0TG9uZ1RpbWVvdXQoKCkgPT4gdGltZXIuYWJvcnQocmVhc29uKSwgbGVmdCk7XG4gIHJldHVybiB7XG4gICAgc2lnbmFsOiBjb21wb3NlZC5zaWduYWwsXG4gICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgY2FuY2VsKCk7XG4gICAgICBjb21wb3NlZC5kaXNwb3NlKCk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * attempt/decision.ts — the ONE retry rule table and the runner's evidence builder (design §3.1, §3.8, law 9).
4
+ *
5
+ * `retryRules(policy)` is the retry-or-stop decision as ordinary `decide()` rules over `AttemptInputs`, first
6
+ * match wins, default `retry` ("retryable"):
7
+ *
8
+ * 1 outcome = ok → done succeeded
9
+ * 2 outcome = paused → stop paused
10
+ * 3 aborted = true → stop aborted (the run's signal — the attempt's outcome stays its own)
11
+ * 4 attempt ≥ of → stop exhausted
12
+ * 5 retryOn = false → stop declined (a function rule: it shows the verdict it saw)
13
+ * 6 timeLeftAfterWaitMs ≤ 0 → stop no-time-left
14
+ * default → retry retryable
15
+ *
16
+ * Each rule's `label` IS the reason it names, so `reason` is a projection of the evidence, never a second
17
+ * vocabulary. The ceiling is `attempt/policy.ts · attemptCeiling`, the one reading the engine and the runner
18
+ * share.
19
+ *
20
+ * `decideAttempt` evaluates that table WITHOUT a scope (the runner has none — `decide()` needs a registered
21
+ * one) and builds the evidence `decide()` would build: the filter rows come from `decide()`'s own evaluator
22
+ * (`filter/evaluator.ts · evaluateFilter`), the function rows and the first-match loop mirror
23
+ * `decide/decide.ts` field for field and key for key. A property test pins that both paths give equal evidence
24
+ * for equal inputs (test/lib/attempt/property).
25
+ *
26
+ * Inputs are READ, one key at a time, only when a rule reaches them — so the user's `retryOn` and `backoffMs`
27
+ * run exactly when a retry needs them, as they did before the record existed.
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.decideAttempt = exports.retryRules = exports.RETRY_DEFAULT = void 0;
31
+ const summarize_js_1 = require("../capture/summarize.js");
32
+ const evaluator_js_1 = require("../filter/evaluator.js");
33
+ const policy_js_1 = require("./policy.js");
34
+ /** The table's default: no rule stopped the series, so it retries. */
35
+ exports.RETRY_DEFAULT = Object.freeze({ branch: 'retry', label: 'retryable' });
36
+ /** `decide()`'s summary length for an evidence value (filter/evaluator.ts, decide/evidence.ts). */
37
+ const MAX_VALUE_LEN = 80;
38
+ /**
39
+ * The retry rule table for `policy` — six `decide()` rules, then {@link RETRY_DEFAULT}. The ceiling is the
40
+ * whole number of attempts the policy allows, never fewer than one (`attemptCeiling`): a ceiling of `NaN` or
41
+ * `Infinity` cannot make rule 4 unreachable.
42
+ */
43
+ function retryRules(policy) {
44
+ return [
45
+ { when: { outcome: { eq: 'ok' } }, then: 'done', label: 'succeeded' },
46
+ { when: { outcome: { eq: 'paused' } }, then: 'stop', label: 'paused' },
47
+ { when: { aborted: { eq: true } }, then: 'stop', label: 'aborted' },
48
+ { when: { attempt: { gte: (0, policy_js_1.attemptCeiling)(policy.attempts) } }, then: 'stop', label: 'exhausted' },
49
+ { when: (inputs) => inputs.retryOn === false, then: 'stop', label: 'declined' },
50
+ { when: { timeLeftAfterWaitMs: { lte: 0 } }, then: 'stop', label: 'no-time-left' },
51
+ ];
52
+ }
53
+ exports.retryRules = retryRules;
54
+ /**
55
+ * Evaluate `rules` (a `retryRules` table) over `read` — first match wins — and build the evidence `decide()`
56
+ * would record with the default {@link RETRY_DEFAULT}. `read(key)` returns one input; it is called only for the
57
+ * keys the evaluated rules touch, in rule order.
58
+ */
59
+ function decideAttempt(rules, read) {
60
+ const evaluated = [];
61
+ for (const [index, rule] of rules.entries()) {
62
+ const evidence = evaluateRule(rule, index, read);
63
+ evaluated.push(evidence);
64
+ if (evidence.matched)
65
+ return decided(evaluated, rule.then, rule.label);
66
+ }
67
+ return decided(evaluated, exports.RETRY_DEFAULT.branch, exports.RETRY_DEFAULT.label);
68
+ }
69
+ exports.decideAttempt = decideAttempt;
70
+ function decided(rules, chosen, label) {
71
+ // decide()'s key order: rules, chosen, default, defaultLabel.
72
+ const evidence = {
73
+ rules,
74
+ chosen,
75
+ default: exports.RETRY_DEFAULT.branch,
76
+ defaultLabel: exports.RETRY_DEFAULT.label,
77
+ };
78
+ return { evidence, next: chosen, reason: label };
79
+ }
80
+ /** One rule, as `decide/decide.ts · evaluateRule` evaluates it — minus the scope. */
81
+ function evaluateRule(rule, index, read) {
82
+ if (typeof rule.when === 'function') {
83
+ const inputs = [];
84
+ let matched;
85
+ let matchError;
86
+ try {
87
+ matched = rule.when(readingView(read, inputs));
88
+ }
89
+ catch (error) {
90
+ matched = false;
91
+ matchError = error instanceof Error ? error.message : String(error);
92
+ }
93
+ const evidence = {
94
+ type: 'function',
95
+ ruleIndex: index,
96
+ branch: rule.then,
97
+ matched,
98
+ label: rule.label,
99
+ inputs,
100
+ ...(matchError !== undefined && { matchError }),
101
+ };
102
+ return evidence;
103
+ }
104
+ let matched = false;
105
+ let conditions = [];
106
+ let matchError;
107
+ try {
108
+ ({ matched, conditions } = (0, evaluator_js_1.evaluateFilter)(read, () => false, rule.when));
109
+ }
110
+ catch (error) {
111
+ matchError = error instanceof Error ? error.message : String(error);
112
+ }
113
+ const evidence = {
114
+ type: 'filter',
115
+ ruleIndex: index,
116
+ branch: rule.then,
117
+ matched,
118
+ label: rule.label,
119
+ conditions,
120
+ ...(matchError !== undefined && { matchError }),
121
+ };
122
+ return evidence;
123
+ }
124
+ /**
125
+ * The inputs as a function rule sees them: each string-keyed read is recorded the way `decide()`'s evidence
126
+ * collector records a scope read (key, summary, not redacted — every input is a number, a name or a flag).
127
+ */
128
+ function readingView(read, inputs) {
129
+ return new Proxy({}, {
130
+ get(_target, key) {
131
+ if (typeof key !== 'string')
132
+ return undefined;
133
+ const value = read(key);
134
+ inputs.push({ key, valueSummary: (0, summarize_js_1.summarizeValue)(value, MAX_VALUE_LEN), redacted: false });
135
+ return value;
136
+ },
137
+ });
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaXNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvZGVjaXNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRzs7O0FBRUgsMERBQXlEO0FBVXpELHlEQUF3RDtBQUN4RCwyQ0FBNkM7QUFHN0Msc0VBQXNFO0FBQ3pELFFBQUEsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQVcsQ0FBQyxDQUFDO0FBRTdGLG1HQUFtRztBQUNuRyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFFekI7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxNQUFxQztJQUM5RCxPQUFPO1FBQ0wsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7UUFDckUsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7UUFDdEUsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDbkUsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBQSwwQkFBYyxFQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO1FBQ2pHLEVBQUUsSUFBSSxFQUFF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XG4gKiBhdHRlbXB0L2RlY2lzaW9uLnRzIOKAlCB0aGUgT05FIHJldHJ5IHJ1bGUgdGFibGUgYW5kIHRoZSBydW5uZXIncyBldmlkZW5jZSBidWlsZGVyIChkZXNpZ24gwqczLjEsIMKnMy44LCBsYXcgOSkuXG4gKlxuICogYHJldHJ5UnVsZXMocG9saWN5KWAgaXMgdGhlIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24gYXMgb3JkaW5hcnkgYGRlY2lkZSgpYCBydWxlcyBvdmVyIGBBdHRlbXB0SW5wdXRzYCwgZmlyc3RcbiAqIG1hdGNoIHdpbnMsIGRlZmF1bHQgYHJldHJ5YCAoXCJyZXRyeWFibGVcIik6XG4gKlxuICogICAxICBvdXRjb21lID0gb2sgICAgICAgICAgICAgICAgICAgIOKGkiBkb25lICBzdWNjZWVkZWRcbiAqICAgMiAgb3V0Y29tZSA9IHBhdXNlZCAgICAgICAgICAgICAgICDihpIgc3RvcCAgcGF1c2VkXG4gKiAgIDMgIGFib3J0ZWQgPSB0cnVlICAgICAgICAgICAgICAgICAg4oaSIHN0b3AgIGFib3J0ZWQgICAgICAgICh0aGUgcnVuJ3Mgc2lnbmFsIOKAlCB0aGUgYXR0ZW1wdCdzIG91dGNvbWUgc3RheXMgaXRzIG93bilcbiAqICAgNCAgYXR0ZW1wdCDiiaUgb2YgICAgICAgICAgICAgICAgICAgIOKGkiBzdG9wICBleGhhdXN0ZWRcbiAqICAgNSAgcmV0cnlPbiA9IGZhbHNlICAgICAgICAgICAgICAgICDihpIgc3RvcCAgZGVjbGluZWQgICAgICAgKGEgZnVuY3Rpb24gcnVsZTogaXQgc2hvd3MgdGhlIHZlcmRpY3QgaXQgc2F3KVxuICogICA2ICB0aW1lTGVmdEFmdGVyV2FpdE1zIOKJpCAwICAgICAgICAg4oaSIHN0b3AgIG5vLXRpbWUtbGVmdFxuICogICAgICBkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiByZXRyeSByZXRyeWFibGVcbiAqXG4gKiBFYWNoIHJ1bGUncyBgbGFiZWxgIElTIHRoZSByZWFzb24gaXQgbmFtZXMsIHNvIGByZWFzb25gIGlzIGEgcHJvamVjdGlvbiBvZiB0aGUgZXZpZGVuY2UsIG5ldmVyIGEgc2Vjb25kXG4gKiB2b2NhYnVsYXJ5LiBUaGUgY2VpbGluZyBpcyBgYXR0ZW1wdC9wb2xpY3kudHMgwrcgYXR0ZW1wdENlaWxpbmdgLCB0aGUgb25lIHJlYWRpbmcgdGhlIGVuZ2luZSBhbmQgdGhlIHJ1bm5lclxuICogc2hhcmUuXG4gKlxuICogYGRlY2lkZUF0dGVtcHRgIGV2YWx1YXRlcyB0aGF0IHRhYmxlIFdJVEhPVVQgYSBzY29wZSAodGhlIHJ1bm5lciBoYXMgbm9uZSDigJQgYGRlY2lkZSgpYCBuZWVkcyBhIHJlZ2lzdGVyZWRcbiAqIG9uZSkgYW5kIGJ1aWxkcyB0aGUgZXZpZGVuY2UgYGRlY2lkZSgpYCB3b3VsZCBidWlsZDogdGhlIGZpbHRlciByb3dzIGNvbWUgZnJvbSBgZGVjaWRlKClgJ3Mgb3duIGV2YWx1YXRvclxuICogKGBmaWx0ZXIvZXZhbHVhdG9yLnRzIMK3IGV2YWx1YXRlRmlsdGVyYCksIHRoZSBmdW5jdGlvbiByb3dzIGFuZCB0aGUgZmlyc3QtbWF0Y2ggbG9vcCBtaXJyb3JcbiAqIGBkZWNpZGUvZGVjaWRlLnRzYCBmaWVsZCBmb3IgZmllbGQgYW5kIGtleSBmb3Iga2V5LiBBIHByb3BlcnR5IHRlc3QgcGlucyB0aGF0IGJvdGggcGF0aHMgZ2l2ZSBlcXVhbCBldmlkZW5jZVxuICogZm9yIGVxdWFsIGlucHV0cyAodGVzdC9saWIvYXR0ZW1wdC9wcm9wZXJ0eSkuXG4gKlxuICogSW5wdXRzIGFyZSBSRUFELCBvbmUga2V5IGF0IGEgdGltZSwgb25seSB3aGVuIGEgcnVsZSByZWFjaGVzIHRoZW0g4oCUIHNvIHRoZSB1c2VyJ3MgYHJldHJ5T25gIGFuZCBgYmFja29mZk1zYFxuICogcnVuIGV4YWN0bHkgd2hlbiBhIHJldHJ5IG5lZWRzIHRoZW0sIGFzIHRoZXkgZGlkIGJlZm9yZSB0aGUgcmVjb3JkIGV4aXN0ZWQuXG4gKi9cblxuaW1wb3J0IHsgc3VtbWFyaXplVmFsdWUgfSBmcm9tICcuLi9jYXB0dXJlL3N1bW1hcml6ZS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIERlY2lkZVJ1bGUsXG4gIERlY2lzaW9uRXZpZGVuY2UsXG4gIEZpbHRlclJ1bGVFdmlkZW5jZSxcbiAgRnVuY3Rpb25SdWxlRXZpZGVuY2UsXG4gIFJlYWRJbnB1dCxcbiAgUnVsZUV2aWRlbmNlLFxuICBXaGVyZUZpbHRlcixcbn0gZnJvbSAnLi4vZGVjaWRlL3R5cGVzLmpzJztcbmltcG9ydCB7IGV2YWx1YXRlRmlsdGVyIH0gZnJvbSAnLi4vZmlsdGVyL2V2YWx1YXRvci5qcyc7XG5pbXBvcnQgeyBhdHRlbXB0Q2VpbGluZyB9IGZyb20gJy4vcG9saWN5LmpzJztcbmltcG9ydCB0eXBlIHsgQXR0ZW1wdElucHV0cywgQXR0ZW1wdE5leHQsIEF0dGVtcHRSZWFzb24sIFJldHJ5UG9saWN5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBUaGUgdGFibGUncyBkZWZhdWx0OiBubyBydWxlIHN0b3BwZWQgdGhlIHNlcmllcywgc28gaXQgcmV0cmllcy4gKi9cbmV4cG9ydCBjb25zdCBSRVRSWV9ERUZBVUxUID0gT2JqZWN0LmZyZWV6ZSh7IGJyYW5jaDogJ3JldHJ5JywgbGFiZWw6ICdyZXRyeWFibGUnIH0gYXMgY29uc3QpO1xuXG4vKiogYGRlY2lkZSgpYCdzIHN1bW1hcnkgbGVuZ3RoIGZvciBhbiBldmlkZW5jZSB2YWx1ZSAoZmlsdGVyL2V2YWx1YXRvci50cywgZGVjaWRlL2V2aWRlbmNlLnRzKS4gKi9cbmNvbnN0IE1BWF9WQUxVRV9MRU4gPSA4MDtcblxuLyoqXG4gKiBUaGUgcmV0cnkgcnVsZSB0YWJsZSBmb3IgYHBvbGljeWAg4oCUIHNpeCBgZGVjaWRlKClgIHJ1bGVzLCB0aGVuIHtAbGluayBSRVRSWV9ERUZBVUxUfS4gVGhlIGNlaWxpbmcgaXMgdGhlXG4gKiB3aG9sZSBudW1iZXIgb2YgYXR0ZW1wdHMgdGhlIHBvbGljeSBhbGxvd3MsIG5ldmVyIGZld2VyIHRoYW4gb25lIChgYXR0ZW1wdENlaWxpbmdgKTogYSBjZWlsaW5nIG9mIGBOYU5gIG9yXG4gKiBgSW5maW5pdHlgIGNhbm5vdCBtYWtlIHJ1bGUgNCB1bnJlYWNoYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldHJ5UnVsZXMocG9saWN5OiBQaWNrPFJldHJ5UG9saWN5LCAnYXR0ZW1wdHMnPik6IERlY2lkZVJ1bGU8QXR0ZW1wdElucHV0cz5bXSB7XG4gIHJldHVybiBbXG4gICAgeyB3aGVuOiB7IG91dGNvbWU6IHsgZXE6ICdvaycgfSB9LCB0aGVuOiAnZG9uZScsIGxhYmVsOiAnc3VjY2VlZGVkJyB9LFxuICAgIHsgd2hlbjogeyBvdXRjb21lOiB7IGVxOiAncGF1c2VkJyB9IH0sIHRoZW46ICdzdG9wJywgbGFiZWw6ICdwYXVzZWQnIH0sXG4gICAgeyB3aGVuOiB7IGFib3J0ZWQ6IHsgZXE6IHRydWUgfSB9LCB0aGVuOiAnc3RvcCcsIGxhYmVsOiAnYWJvcnRlZCcgfSxcbiAgICB7IHdoZW46IHsgYXR0ZW1wdDogeyBndGU6IGF0dGVtcHRDZWlsaW5nKHBvbGljeS5hdHRlbXB0cykgfSB9LCB0aGVuOiAnc3RvcCcsIGxhYmVsOiAnZXhoYXVzdGVkJyB9LFxuICAgIHsgd2hlbjogKGlucHV0cykgPT4gaW5wdXRzLnJldHJ5T24gPT09IGZhbHNlLCB0aGVuOiAnc3RvcCcsIGxhYmVsOiAnZGVjbGluZWQnIH0sXG4gICAgeyB3aGVuOiB7IHRpbWVMZWZ0QWZ0ZXJXYWl0TXM6IHsgbHRlOiAwIH0gfSwgdGhlbjogJ3N0b3AnLCBsYWJlbDogJ25vLXRpbWUtbGVmdCcgfSxcbiAgXTtcbn1cblxuLyoqIEEgZGVjaXNpb246IHRoZSBldmlkZW5jZSwgYW5kIGl0cyBjb21wYWN0IHByb2plY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHREZWNpc2lvbiB7XG4gIHJlYWRvbmx5IGV2aWRlbmNlOiBEZWNpc2lvbkV2aWRlbmNlO1xuICByZWFkb25seSBuZXh0OiBBdHRlbXB0TmV4dDtcbiAgcmVhZG9ubHkgcmVhc29uOiBBdHRlbXB0UmVhc29uO1xufVxuXG4vKipcbiAqIEV2YWx1YXRlIGBydWxlc2AgKGEgYHJldHJ5UnVsZXNgIHRhYmxlKSBvdmVyIGByZWFkYCDigJQgZmlyc3QgbWF0Y2ggd2lucyDigJQgYW5kIGJ1aWxkIHRoZSBldmlkZW5jZSBgZGVjaWRlKClgXG4gKiB3b3VsZCByZWNvcmQgd2l0aCB0aGUgZGVmYXVsdCB7QGxpbmsgUkVUUllfREVGQVVMVH0uIGByZWFkKGtleSlgIHJldHVybnMgb25lIGlucHV0OyBpdCBpcyBjYWxsZWQgb25seSBmb3IgdGhlXG4gKiBrZXlzIHRoZSBldmFsdWF0ZWQgcnVsZXMgdG91Y2gsIGluIHJ1bGUgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNpZGVBdHRlbXB0KFxuICBydWxlczogcmVhZG9ubHkgRGVjaWRlUnVsZTxBdHRlbXB0SW5wdXRzPltdLFxuICByZWFkOiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24sXG4pOiBBdHRlbXB0RGVjaXNpb24ge1xuICBjb25zdCBldmFsdWF0ZWQ6IFJ1bGVFdmlkZW5jZVtdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBydWxlXSBvZiBydWxlcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBldmlkZW5jZSA9IGV2YWx1YXRlUnVsZShydWxlLCBpbmRleCwgcmVhZCk7XG4gICAgZXZhbHVhdGVkLnB1c2goZXZpZGVuY2UpO1xuICAgIGlmIChldmlkZW5jZS5tYXRjaGVkKSByZXR1cm4gZGVjaWRlZChldmFsdWF0ZWQsIHJ1bGUudGhlbiwgcnVsZS5sYWJlbCk7XG4gIH1cbiAgcmV0dXJuIGRlY2lkZWQoZXZhbHVhdGVkLCBSRVRSWV9ERUZBVUxULmJyYW5jaCwgUkVUUllfREVGQVVMVC5sYWJlbCk7XG59XG5cbmZ1bmN0aW9uIGRlY2lkZWQocnVsZXM6IFJ1bGVFdmlkZW5jZVtdLCBjaG9zZW46IHN0cmluZywgbGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEF0dGVtcHREZWNpc2lvbiB7XG4gIC8vIGRlY2lkZSgpJ3Mga2V5IG9yZGVyOiBydWxlcywgY2hvc2VuLCBkZWZhdWx0LCBkZWZhdWx0TGFiZWwuXG4gIGNvbnN0IGV2aWRlbmNlOiBEZWNpc2lvbkV2aWRlbmNlID0ge1xuICAgIHJ1bGVzLFxuICAgIGNob3NlbixcbiAgICBkZWZhdWx0OiBSRVRSWV9ERUZBVUxULmJyYW5jaCxcbiAgICBkZWZhdWx0TGFiZWw6IFJFVFJZX0RFRkFVTFQubGFiZWwsXG4gIH07XG4gIHJldHVybiB7IGV2aWRlbmNlLCBuZXh0OiBjaG9zZW4gYXMgQXR0ZW1wdE5leHQsIHJlYXNvbjogbGFiZWwgYXMgQXR0ZW1wdFJlYXNvbiB9O1xufVxuXG4vKiogT25lIHJ1bGUsIGFzIGBkZWNpZGUvZGVjaWRlLnRzIMK3IGV2YWx1YXRlUnVsZWAgZXZhbHVhdGVzIGl0IOKAlCBtaW51cyB0aGUgc2NvcGUuICovXG5mdW5jdGlvbiBldmFsdWF0ZVJ1bGUocnVsZTogRGVjaWRlUnVsZTxBdHRlbXB0SW5wdXRzPiwgaW5kZXg6IG51bWJlciwgcmVhZDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duKTogUnVsZUV2aWRlbmNlIHtcbiAgaWYgKHR5cGVvZiBydWxlLndoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBpbnB1dHM6IFJlYWRJbnB1dFtdID0gW107XG4gICAgbGV0IG1hdGNoZWQ6IGJvb2xlYW47XG4gICAgbGV0IG1hdGNoRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgbWF0Y2hlZCA9IHJ1bGUud2hlbihyZWFkaW5nVmlldyhyZWFkLCBpbnB1dHMpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgbWF0Y2hFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB9XG4gICAgY29uc3QgZXZpZGVuY2U6IEZ1bmN0aW9uUnVsZUV2aWRlbmNlID0ge1xuICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgIHJ1bGVJbmRleDogaW5kZXgsXG4gICAgICBicmFuY2g6IHJ1bGUudGhlbixcbiAgICAgIG1hdGNoZWQsXG4gICAgICBsYWJlbDogcnVsZS5sYWJlbCxcbiAgICAgIGlucHV0cyxcbiAgICAgIC4uLihtYXRjaEVycm9yICE9PSB1bmRlZmluZWQgJiYgeyBtYXRjaEVycm9yIH0pLFxuICAgIH07XG4gICAgcmV0dXJuIGV2aWRlbmNlO1xuICB9XG4gIGxldCBtYXRjaGVkID0gZmFsc2U7XG4gIGxldCBjb25kaXRpb25zOiBGaWx0ZXJSdWxlRXZpZGVuY2VbJ2NvbmRpdGlvbnMnXSA9IFtdO1xuICBsZXQgbWF0Y2hFcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgICh7IG1hdGNoZWQsIGNvbmRpdGlvbnMgfSA9IGV2YWx1YXRlRmlsdGVyKHJlYWQsICgpID0+IGZhbHNlLCBydWxlLndoZW4gYXMgV2hlcmVGaWx0ZXI8QXR0ZW1wdElucHV0cz4pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBtYXRjaEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICB9XG4gIGNvbnN0IGV2aWRlbmNlOiBGaWx0ZXJSdWxlRXZpZGVuY2UgPSB7XG4gICAgdHlwZTogJ2ZpbHRlcicsXG4gICAgcnVsZUluZGV4OiBpbmRleCxcbiAgICBicmFuY2g6IHJ1bGUudGhlbixcbiAgICBtYXRjaGVkLFxuICAgIGxhYmVsOiBydWxlLmxhYmVsLFxuICAgIGNvbmRpdGlvbnMsXG4gICAgLi4uKG1hdGNoRXJyb3IgIT09IHVuZGVmaW5lZCAmJiB7IG1hdGNoRXJyb3IgfSksXG4gIH07XG4gIHJldHVybiBldmlkZW5jZTtcbn1cblxuLyoqXG4gKiBUaGUgaW5wdXRzIGFzIGEgZnVuY3Rpb24gcnVsZSBzZWVzIHRoZW06IGVhY2ggc3RyaW5nLWtleWVkIHJlYWQgaXMgcmVjb3JkZWQgdGhlIHdheSBgZGVjaWRlKClgJ3MgZXZpZGVuY2VcbiAqIGNvbGxlY3RvciByZWNvcmRzIGEgc2NvcGUgcmVhZCAoa2V5LCBzdW1tYXJ5LCBub3QgcmVkYWN0ZWQg4oCUIGV2ZXJ5IGlucHV0IGlzIGEgbnVtYmVyLCBhIG5hbWUgb3IgYSBmbGFnKS5cbiAqL1xuZnVuY3Rpb24gcmVhZGluZ1ZpZXcocmVhZDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duLCBpbnB1dHM6IFJlYWRJbnB1dFtdKTogQXR0ZW1wdElucHV0cyB7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgQXR0ZW1wdElucHV0cywge1xuICAgIGdldChfdGFyZ2V0LCBrZXkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHZhbHVlID0gcmVhZChrZXkpO1xuICAgICAgaW5wdXRzLnB1c2goeyBrZXksIHZhbHVlU3VtbWFyeTogc3VtbWFyaXplVmFsdWUodmFsdWUsIE1BWF9WQUxVRV9MRU4pLCByZWRhY3RlZDogZmFsc2UgfSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * attempt/effect.ts — side-effect safety (design §3.3, packet P3): the ONE reading of what an attempt did to an
4
+ * outside system, and the ONE rule for a touching target.
5
+ *
6
+ * - `touchesProblem` — the build law, asked at every door a touching declaration enters: the builder
7
+ * (`FlowChartBuilder · applyTouches` / `applyRetryPolicy`), the traverser for a StageNode a stage returns at run
8
+ * time (`FlowchartTraverser · admitDynamicNodes`), and the stage itself (`FlowchartTraverser · executeStage`, for
9
+ * a chart edited after `build()`). A touching target that may retry without an idempotency key is refused: a
10
+ * retry of a non-idempotent effect without one can apply it twice.
11
+ * - `callTouches` — the same law for `scope.$call(target, fn, policy, { touches, idempotencyKey })`.
12
+ * - `admitIdempotencyKey` — the key's format: 1–255 printable ASCII characters, no space. It travels in a request
13
+ * header (`Idempotency-Key`), so a control character could forge one; the refusal names the field, never the
14
+ * value.
15
+ * - `effectOf` — `ok → 'applied'`; a failure whose error declares `effect: 'none'` → `'none'`; anything else →
16
+ * `'unknown'`. A timeout is the absence of an answer (law 4), so it is never `'none'`.
17
+ * - `unknownEffectError` — what a series that ends without an answer after ANY attempt of unknown effect fails
18
+ * with, in place of the attempt's own error (its `cause`).
19
+ * - `interruptProblem` — a keyless touching stage may not be re-run by an `interrupt()` resume.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.isCarriedTouches = exports.carriedTouches = exports.interruptProblem = exports.refuseKeylessRetry = exports.recordedKeyOf = exports.unknownEffectError = exports.effectOf = exports.callTouches = exports.admitIdempotencyKey = exports.touchesProblem = exports.MAX_IDEMPOTENCY_KEY_LENGTH = void 0;
23
+ const idempotencyKey_js_1 = require("../ids/idempotencyKey.js");
24
+ const errors_js_1 = require("./errors.js");
25
+ const name_js_1 = require("./name.js");
26
+ const policy_js_1 = require("./policy.js");
27
+ var idempotencyKey_js_2 = require("../ids/idempotencyKey.js");
28
+ Object.defineProperty(exports, "MAX_IDEMPOTENCY_KEY_LENGTH", { enumerable: true, get: function () { return idempotencyKey_js_2.MAX_IDEMPOTENCY_KEY_LENGTH; } });
29
+ /** Why `retry` with `touches` breaks the law — the shared words of every door. */
30
+ function retriedWithoutKey(system, attempts) {
31
+ return (`touches "${system}" and may retry (attempts: ${attempts}) but declares no idempotencyKey — a retry of an ` +
32
+ 'outside effect without a key can apply it twice. Declare the key rule ' +
33
+ `(.touches('${system}', { idempotencyKey: ({ args }) => \`order-\${args.orderId}\` })), or retry once.`);
34
+ }
35
+ /**
36
+ * Why a touching declaration is refused, or `undefined` when it is admitted: `touches` must be `{ system,
37
+ * idempotencyKey? }` with `system` a name and the key rule a function; and a target that may retry (`retry`'s
38
+ * ceiling above 1) must declare the key rule.
39
+ */
40
+ function touchesProblem(touches, retry) {
41
+ if (touches === null || typeof touches !== 'object') {
42
+ return 'touches must be { system, idempotencyKey? } — the outside system and the key rule';
43
+ }
44
+ const { system, idempotencyKey } = touches;
45
+ const nameProblem = (0, name_js_1.attemptNameProblem)(system);
46
+ if (nameProblem !== undefined)
47
+ return `touches.system ${nameProblem} — it is a name from code, never a value`;
48
+ if (idempotencyKey !== undefined && typeof idempotencyKey !== 'function') {
49
+ return ('touches.idempotencyKey must be a function of the execution ((ctx) => string) — a constant key would make ' +
50
+ 'every run one operation');
51
+ }
52
+ const attempts = (0, policy_js_1.attemptCeiling)(retry?.attempts);
53
+ if (attempts > 1 && idempotencyKey === undefined)
54
+ return retriedWithoutKey(system, attempts);
55
+ return undefined;
56
+ }
57
+ exports.touchesProblem = touchesProblem;
58
+ /** `value` as an idempotency key (`ids/idempotencyKey.ts`, the one rule), or a `TypeError` that names `where`. */
59
+ function admitIdempotencyKey(where, value) {
60
+ const problem = (0, idempotencyKey_js_1.idempotencyKeyProblem)(value);
61
+ if (problem !== undefined) {
62
+ throw new TypeError(`${where}: idempotencyKey ${problem} (derive it from the input or the state, never from model output)`);
63
+ }
64
+ return value;
65
+ }
66
+ exports.admitIdempotencyKey = admitIdempotencyKey;
67
+ /**
68
+ * A `$call`'s side-effect declaration, admitted: `undefined` when it touches nothing; otherwise the system and the
69
+ * key, refused with a `TypeError` naming `where` when malformed, when a key comes without a system, or when the
70
+ * call may retry with no key — before anything is sent.
71
+ */
72
+ function callTouches(where, options, policy) {
73
+ if (options === undefined)
74
+ return undefined;
75
+ if (options === null || typeof options !== 'object') {
76
+ throw new TypeError(`${where}: options must be { touches?, idempotencyKey? }`);
77
+ }
78
+ const { touches, idempotencyKey } = options;
79
+ if (touches === undefined) {
80
+ if (idempotencyKey !== undefined) {
81
+ throw new TypeError(`${where}: an idempotencyKey names an effect — declare the system it touches (touches)`);
82
+ }
83
+ return undefined;
84
+ }
85
+ const nameProblem = (0, name_js_1.attemptNameProblem)(touches);
86
+ if (nameProblem !== undefined) {
87
+ throw new TypeError(`${where}: touches ${nameProblem} — it is a name from code, never a value`);
88
+ }
89
+ const key = idempotencyKey === undefined ? undefined : admitIdempotencyKey(where, idempotencyKey);
90
+ const attempts = (0, policy_js_1.attemptCeiling)(policy.attempts);
91
+ if (attempts > 1 && key === undefined)
92
+ throw new TypeError(`${where}: ${retriedWithoutKey(touches, attempts)}`);
93
+ return { system: touches, ...(key !== undefined && { idempotencyKey: key }) };
94
+ }
95
+ exports.callTouches = callTouches;
96
+ /** What an attempt that ended `outcome` (with `error`, when it failed) did to the outside system. */
97
+ function effectOf(outcome, error) {
98
+ if (outcome === 'ok')
99
+ return 'applied';
100
+ if (outcome === 'failed' && declaresNoEffect(error))
101
+ return 'none';
102
+ return 'unknown';
103
+ }
104
+ exports.effectOf = effectOf;
105
+ /** The error itself says nothing was sent — `effect: 'none'`, read once; a value that cannot be read says nothing. */
106
+ function declaresNoEffect(error) {
107
+ if (error === null || typeof error !== 'object')
108
+ return false;
109
+ try {
110
+ return error.effect === 'none';
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ }
116
+ /**
117
+ * What a touching series fails with when any of its attempts left the effect unknown — never the attempt's own error,
118
+ * which a caller would read as a failure and retry. The key is the RECORDED one: under a redaction rule that names
119
+ * it, the error carries the placeholder, as every record does.
120
+ */
121
+ function unknownEffectError(target, record, cause) {
122
+ return new errors_js_1.UnknownEffectError({
123
+ system: target.system,
124
+ ...(recordedKeyOf(target) !== undefined && { idempotencyKey: recordedKeyOf(target) }),
125
+ attempts: record.attempt,
126
+ cause,
127
+ });
128
+ }
129
+ exports.unknownEffectError = unknownEffectError;
130
+ /** The key as records carry it: the served form when the caller gave one, else the key itself. */
131
+ function recordedKeyOf(target) {
132
+ return target.recordedKey ?? target.idempotencyKey;
133
+ }
134
+ exports.recordedKeyOf = recordedKeyOf;
135
+ /** The runner's refusal of a touching series that may retry with no key — the law, at the last door. */
136
+ function refuseKeylessRetry(target, attempts) {
137
+ if (attempts > 1 && target.idempotencyKey === undefined) {
138
+ throw new TypeError(`[footprint] ${retriedWithoutKey(target.system, attempts)}`);
139
+ }
140
+ }
141
+ exports.refuseKeylessRetry = refuseKeylessRetry;
142
+ /**
143
+ * Why a touching stage may not be RE-RUN by an `interrupt()` resume, or `undefined` when it may (P3). A resume
144
+ * re-runs the stage's function from its top — a second attempt of its effect — so the law that refuses a keyless
145
+ * retry refuses a keyless re-run too. Asked when the stage interrupts (`StageRunner`) and when a checkpoint is
146
+ * resumed (`runner/resume.ts · planResume`, for a checkpoint made by another version of the chart).
147
+ */
148
+ function interruptProblem(touches) {
149
+ if (touches === undefined || touches.idempotencyKey !== undefined)
150
+ return undefined;
151
+ return (`touches "${touches.system}" with no idempotencyKey, and a resume after interrupt() re-runs the stage from its ` +
152
+ 'top — a second attempt of the effect without a key. Declare the key rule, or interrupt in a stage of its own.');
153
+ }
154
+ exports.interruptProblem = interruptProblem;
155
+ /** The touching declarations `resume()` builds around a key a checkpoint carried (`carriedTouches`). */
156
+ const CARRIED = new WeakSet();
157
+ /**
158
+ * The stand-in's declaration on a resume (P3): the paused stage's system, answering the key its checkpoint carried —
159
+ * the OPERATIONAL value, real (checkpoints are exempt from redaction by law). It is marked, so the run serves it
160
+ * like a key of unknown sources: under any state rule the records carry the placeholder (`isCarriedTouches`) — the
161
+ * resumed leg no longer holds the input the key was made of, so it cannot tell whether the key was masked.
162
+ */
163
+ function carriedTouches(system, key) {
164
+ const touches = Object.freeze({ system, idempotencyKey: () => key });
165
+ CARRIED.add(touches);
166
+ return touches;
167
+ }
168
+ exports.carriedTouches = carriedTouches;
169
+ /** The declaration answers a key a checkpoint carried ({@link carriedTouches}). */
170
+ function isCarriedTouches(touches) {
171
+ return typeof touches === 'object' && touches !== null && CARRIED.has(touches);
172
+ }
173
+ exports.isCarriedTouches = isCarriedTouches;
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L2VmZmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRzs7O0FBRUgsZ0VBQWlFO0FBQ2pFLDJDQUFpRDtBQUNqRCx1Q0FBK0M7QUFDL0MsMkNBQTZDO0FBRzdDLDhEQUFzRTtBQUE3RCwrSEFBQSwwQkFBMEIsT0FBQTtBQVluQyxrRkFBa0Y7QUFDbEYsU0FBUyxpQkFBaUIsQ0FBQyxNQUFjLEVBQUUsUUFBZ0I7SUFDekQsT0FBTyxDQUNMLFlBQVksTUFBTSw4QkFBOEIsUUFBUSxtREFBbUQ7UUFDM0csd0VBQXdFO1FBQ3hFLGNBQWMsTUFBTSxtRkFBbUYsQ0FDeEcsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLE9BQWdCLEVBQUUsS0FBZ0Q7SUFDL0YsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3BELE9BQU8sbUZBQW1GLENBQUM7SUFDN0YsQ0FBQztJQUNELE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsT0FBZ0MsQ0FBQztJQUNwRSxNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFrQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLElBQUksV0FBVyxLQUFLLFNBQVM7UUFBRSxPQUFPLGtCQUFrQixXQUFXLDBDQUEwQyxDQUFDO0lBQzlHLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxPQUFPLGNBQWMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN6RSxPQUFPLENBQ0wsMkdBQTJHO1lBQzNHLHlCQUF5QixDQUMxQixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLElBQUEsMEJBQWMsRUFBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakQsSUFBSSxRQUFRLEdB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LENBQUM7QUFDSixDQUFDO0FBTkQsNENBTUM7QUFFRCx3R0FBd0c7QUFDeEcsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztBQUV0Qzs7Ozs7R0FLRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxNQUFjLEVBQUUsR0FBVztJQUN4RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckIsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUpELHdDQUlDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQWdCLGdCQUFnQixDQUFDLE9BQWdCO0lBQy9DLE9BQU8sT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBRkQsNENBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGF0dGVtcHQvZWZmZWN0LnRzIOKAlCBzaWRlLWVmZmVjdCBzYWZldHkgKGRlc2lnbiDCpzMuMywgcGFja2V0IFAzKTogdGhlIE9ORSByZWFkaW5nIG9mIHdoYXQgYW4gYXR0ZW1wdCBkaWQgdG8gYW5cbiAqIG91dHNpZGUgc3lzdGVtLCBhbmQgdGhlIE9ORSBydWxlIGZvciBhIHRvdWNoaW5nIHRhcmdldC5cbiAqXG4gKiAgIC0gYHRvdWNoZXNQcm9ibGVtYCDigJQgdGhlIGJ1aWxkIGxhdywgYXNrZWQgYXQgZXZlcnkgZG9vciBhIHRvdWNoaW5nIGRlY2xhcmF0aW9uIGVudGVyczogdGhlIGJ1aWxkZXJcbiAqICAgICAoYEZsb3dDaGFydEJ1aWxkZXIgwrcgYXBwbHlUb3VjaGVzYCAvIGBhcHBseVJldHJ5UG9saWN5YCksIHRoZSB0cmF2ZXJzZXIgZm9yIGEgU3RhZ2VOb2RlIGEgc3RhZ2UgcmV0dXJucyBhdCBydW5cbiAqICAgICB0aW1lIChgRmxvd2NoYXJ0VHJhdmVyc2VyIMK3IGFkbWl0RHluYW1pY05vZGVzYCksIGFuZCB0aGUgc3RhZ2UgaXRzZWxmIChgRmxvd2NoYXJ0VHJhdmVyc2VyIMK3IGV4ZWN1dGVTdGFnZWAsIGZvclxuICogICAgIGEgY2hhcnQgZWRpdGVkIGFmdGVyIGBidWlsZCgpYCkuIEEgdG91Y2hpbmcgdGFyZ2V0IHRoYXQgbWF5IHJldHJ5IHdpdGhvdXQgYW4gaWRlbXBvdGVuY3kga2V5IGlzIHJlZnVzZWQ6IGFcbiAqICAgICByZXRyeSBvZiBhIG5vbi1pZGVtcG90ZW50IGVmZmVjdCB3aXRob3V0IG9uZSBjYW4gYXBwbHkgaXQgdHdpY2UuXG4gKiAgIC0gYGNhbGxUb3VjaGVzYCDigJQgdGhlIHNhbWUgbGF3IGZvciBgc2NvcGUuJGNhbGwodGFyZ2V0LCBmbiwgcG9saWN5LCB7IHRvdWNoZXMsIGlkZW1wb3RlbmN5S2V5IH0pYC5cbiAqICAgLSBgYWRtaXRJZGVtcG90ZW5jeUtleWAg4oCUIHRoZSBrZXkncyBmb3JtYXQ6IDHigJMyNTUgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMsIG5vIHNwYWNlLiBJdCB0cmF2ZWxzIGluIGEgcmVxdWVzdFxuICogICAgIGhlYWRlciAoYElkZW1wb3RlbmN5LUtleWApLCBzbyBhIGNvbnRyb2wgY2hhcmFjdGVyIGNvdWxkIGZvcmdlIG9uZTsgdGhlIHJlZnVzYWwgbmFtZXMgdGhlIGZpZWxkLCBuZXZlciB0aGVcbiAqICAgICB2YWx1ZS5cbiAqICAgLSBgZWZmZWN0T2ZgIOKAlCBgb2sg4oaSICdhcHBsaWVkJ2A7IGEgZmFpbHVyZSB3aG9zZSBlcnJvciBkZWNsYXJlcyBgZWZmZWN0OiAnbm9uZSdgIOKGkiBgJ25vbmUnYDsgYW55dGhpbmcgZWxzZSDihpJcbiAqICAgICBgJ3Vua25vd24nYC4gQSB0aW1lb3V0IGlzIHRoZSBhYnNlbmNlIG9mIGFuIGFuc3dlciAobGF3IDQpLCBzbyBpdCBpcyBuZXZlciBgJ25vbmUnYC5cbiAqICAgLSBgdW5rbm93bkVmZmVjdEVycm9yYCDigJQgd2hhdCBhIHNlcmllcyB0aGF0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIgYWZ0ZXIgQU5ZIGF0dGVtcHQgb2YgdW5rbm93biBlZmZlY3QgZmFpbHNcbiAqICAgICB3aXRoLCBpbiBwbGFjZSBvZiB0aGUgYXR0ZW1wdCdzIG93biBlcnJvciAoaXRzIGBjYXVzZWApLlxuICogICAtIGBpbnRlcnJ1cHRQcm9ibGVtYCDigJQgYSBrZXlsZXNzIHRvdWNoaW5nIHN0YWdlIG1heSBub3QgYmUgcmUtcnVuIGJ5IGFuIGBpbnRlcnJ1cHQoKWAgcmVzdW1lLlxuICovXG5cbmltcG9ydCB7IGlkZW1wb3RlbmN5S2V5UHJvYmxlbSB9IGZyb20gJy4uL2lkcy9pZGVtcG90ZW5jeUtleS5qcyc7XG5pbXBvcnQgeyBVbmtub3duRWZmZWN0RXJyb3IgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBhdHRlbXB0TmFtZVByb2JsZW0gfSBmcm9tICcuL25hbWUuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdENlaWxpbmcgfSBmcm9tICcuL3BvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRFZmZlY3QsIEF0dGVtcHRPdXRjb21lLCBBdHRlbXB0UmVjb3JkLCBDYWxsT3B0aW9ucywgUmV0cnlQb2xpY3ksIFN0YWdlVG91Y2hlcyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgeyBNQVhfSURFTVBPVEVOQ1lfS0VZX0xFTkdUSCB9IGZyb20gJy4uL2lkcy9pZGVtcG90ZW5jeUtleS5qcyc7XG5cbi8qKlxuICogV2hhdCBhIHRvdWNoaW5nIHJ1bm5lciBzZXJpZXMgaXMgdG9sZCAoYEF0dGVtcHRSdW5PcHRpb25zLmVmZmVjdGApOiB0aGUgc3lzdGVtLCB0aGUgUkVBTCBrZXkgdGhlIGF0dGVtcHRzIGFyZSBtYWRlXG4gKiB1bmRlciwgYW5kIHRoZSBrZXkgYXMgcmVjb3JkcyBjYXJyeSBpdCAodGhlIHJ1bidzIHNlcnZlZCBmb3JtOyB0aGUgcmVhbCBvbmUgd2hlbiBubyBydWxlIGFwcGxpZXMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVmZmVjdFRhcmdldCB7XG4gIHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nO1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbiAgcmVhZG9ubHkgcmVjb3JkZWRLZXk/OiBzdHJpbmc7XG59XG5cbi8qKiBXaHkgYHJldHJ5YCB3aXRoIGB0b3VjaGVzYCBicmVha3MgdGhlIGxhdyDigJQgdGhlIHNoYXJlZCB3b3JkcyBvZiBldmVyeSBkb29yLiAqL1xuZnVuY3Rpb24gcmV0cmllZFdpdGhvdXRLZXkoc3lzdGVtOiBzdHJpbmcsIGF0dGVtcHRzOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIGB0b3VjaGVzIFwiJHtzeXN0ZW19XCIgYW5kIG1heSByZXRyeSAoYXR0ZW1wdHM6ICR7YXR0ZW1wdHN9KSBidXQgZGVjbGFyZXMgbm8gaWRlbXBvdGVuY3lLZXkg4oCUIGEgcmV0cnkgb2YgYW4gYCArXG4gICAgJ291dHNpZGUgZWZmZWN0IHdpdGhvdXQgYSBrZXkgY2FuIGFwcGx5IGl0IHR3aWNlLiBEZWNsYXJlIHRoZSBrZXkgcnVsZSAnICtcbiAgICBgKC50b3VjaGVzKCcke3N5c3RlbX0nLCB7IGlkZW1wb3RlbmN5S2V5OiAoeyBhcmdzIH0pID0+IFxcYG9yZGVyLVxcJHthcmdzLm9yZGVySWR9XFxgIH0pKSwgb3IgcmV0cnkgb25jZS5gXG4gICk7XG59XG5cbi8qKlxuICogV2h5IGEgdG91Y2hpbmcgZGVjbGFyYXRpb24gaXMgcmVmdXNlZCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBhZG1pdHRlZDogYHRvdWNoZXNgIG11c3QgYmUgYHsgc3lzdGVtLFxuICogaWRlbXBvdGVuY3lLZXk/IH1gIHdpdGggYHN5c3RlbWAgYSBuYW1lIGFuZCB0aGUga2V5IHJ1bGUgYSBmdW5jdGlvbjsgYW5kIGEgdGFyZ2V0IHRoYXQgbWF5IHJldHJ5IChgcmV0cnlgJ3NcbiAqIGNlaWxpbmcgYWJvdmUgMSkgbXVzdCBkZWNsYXJlIHRoZSBrZXkgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoZXNQcm9ibGVtKHRvdWNoZXM6IHVua25vd24sIHJldHJ5OiBQaWNrPFJldHJ5UG9saWN5LCAnYXR0ZW1wdHMnPiB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0b3VjaGVzID09PSBudWxsIHx8IHR5cGVvZiB0b3VjaGVzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiAndG91Y2hlcyBtdXN0IGJlIHsgc3lzdGVtLCBpZGVtcG90ZW5jeUtleT8gfSDigJQgdGhlIG91dHNpZGUgc3lzdGVtIGFuZCB0aGUga2V5IHJ1bGUnO1xuICB9XG4gIGNvbnN0IHsgc3lzdGVtLCBpZGVtcG90ZW5jeUtleSB9ID0gdG91Y2hlcyBhcyBQYXJ0aWFsPFN0YWdlVG91Y2hlcz47XG4gIGNvbnN0IG5hbWVQcm9ibGVtID0gYXR0ZW1wdE5hbWVQcm9ibGVtKHN5c3RlbSk7XG4gIGlmIChuYW1lUHJvYmxlbSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYHRvdWNoZXMuc3lzdGVtICR7bmFtZVByb2JsZW19IOKAlCBpdCBpcyBhIG5hbWUgZnJvbSBjb2RlLCBuZXZlciBhIHZhbHVlYDtcbiAgaWYgKGlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGlkZW1wb3RlbmN5S2V5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICd0b3VjaGVzLmlkZW1wb3RlbmN5S2V5IG11c3QgYmUgYSBmdW5jdGlvbiBvZiB0aGUgZXhlY3V0aW9uICgoY3R4KSA9PiBzdHJpbmcpIOKAlCBhIGNvbnN0YW50IGtleSB3b3VsZCBtYWtlICcgK1xuICAgICAgJ2V2ZXJ5IHJ1biBvbmUgb3BlcmF0aW9uJ1xuICAgICk7XG4gIH1cbiAgY29uc3QgYXR0ZW1wdHMgPSBhdHRlbXB0Q2VpbGluZyhyZXRyeT8uYXR0ZW1wdHMpO1xuICBpZiAoYXR0ZW1wdHMgPiAxICYmIGlkZW1wb3RlbmN5S2V5ID09PSB1bmRlZmluZWQpIHJldHVybiByZXRyaWVkV2l0aG91dEtleShzeXN0ZW0gYXMgc3RyaW5nLCBhdHRlbXB0cyk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBgdmFsdWVgIGFzIGFuIGlkZW1wb3RlbmN5IGtleSAoYGlkcy9pZGVtcG90ZW5jeUtleS50c2AsIHRoZSBvbmUgcnVsZSksIG9yIGEgYFR5cGVFcnJvcmAgdGhhdCBuYW1lcyBgd2hlcmVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkbWl0SWRlbXBvdGVuY3lLZXkod2hlcmU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBwcm9ibGVtID0gaWRlbXBvdGVuY3lLZXlQcm9ibGVtKHZhbHVlKTtcbiAgaWYgKHByb2JsZW0gIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgJHt3aGVyZX06IGlkZW1wb3RlbmN5S2V5ICR7cHJvYmxlbX0gKGRlcml2ZSBpdCBmcm9tIHRoZSBpbnB1dCBvciB0aGUgc3RhdGUsIG5ldmVyIGZyb20gbW9kZWwgb3V0cHV0KWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgYXMgc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgYCRjYWxsYCdzIHNpZGUtZWZmZWN0IGRlY2xhcmF0aW9uLCBhZG1pdHRlZDogYHVuZGVmaW5lZGAgd2hlbiBpdCB0b3VjaGVzIG5vdGhpbmc7IG90aGVyd2lzZSB0aGUgc3lzdGVtIGFuZCB0aGVcbiAqIGtleSwgcmVmdXNlZCB3aXRoIGEgYFR5cGVFcnJvcmAgbmFtaW5nIGB3aGVyZWAgd2hlbiBtYWxmb3JtZWQsIHdoZW4gYSBrZXkgY29tZXMgd2l0aG91dCBhIHN5c3RlbSwgb3Igd2hlbiB0aGVcbiAqIGNhbGwgbWF5IHJldHJ5IHdpdGggbm8ga2V5IOKAlCBiZWZvcmUgYW55dGhpbmcgaXMgc2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGxUb3VjaGVzKFxuICB3aGVyZTogc3RyaW5nLFxuICBvcHRpb25zOiB1bmtub3duLFxuICBwb2xpY3k6IFBpY2s8UmV0cnlQb2xpY3ksICdhdHRlbXB0cyc+LFxuKTogeyByZWFkb25seSBzeXN0ZW06IHN0cmluZzsgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvcHRpb25zID09PSBudWxsIHx8IHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7d2hlcmV9OiBvcHRpb25zIG11c3QgYmUgeyB0b3VjaGVzPywgaWRlbXBvdGVuY3lLZXk/IH1gKTtcbiAgfVxuICBjb25zdCB7IHRvdWNoZXMsIGlkZW1wb3RlbmN5S2V5IH0gPSBvcHRpb25zIGFzIENhbGxPcHRpb25zO1xuICBpZiAodG91Y2hlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7d2hlcmV9OiBhbiBpZGVtcG90ZW5jeUtleSBuYW1lcyBhbiBlZmZlY3Qg4oCUIGRlY2xhcmUgdGhlIHN5c3RlbSBpdCB0b3VjaGVzICh0b3VjaGVzKWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG5hbWVQcm9ibGVtID0gYXR0ZW1wdE5hbWVQcm9ibGVtKHRvdWNoZXMpO1xuICBpZiAobmFtZVByb2JsZW0gIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7d2hlcmV9OiB0b3VjaGVzICR7bmFtZVByb2JsZW19IOKAlCBpdCBpcyBhIG5hbWUgZnJvbSBjb2RlLCBuZXZlciBhIHZhbHVlYCk7XG4gIH1cbiAgY29uc3Qga2V5ID0gaWRlbXBvdGVuY3lLZXkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGFkbWl0SWRlbXBvdGVuY3lLZXkod2hlcmUsIGlkZW1wb3RlbmN5S2V5KTtcbiAgY29uc3QgYXR0ZW1wdHMgPSBhdHRlbXB0Q2VpbGluZyhwb2xpY3kuYXR0ZW1wdHMpO1xuICBpZiAoYXR0ZW1wdHMgPiAxICYmIGtleSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3doZXJlfTogJHtyZXRyaWVkV2l0aG91dEtleSh0b3VjaGVzLCBhdHRlbXB0cyl9YCk7XG4gIHJldHVybiB7IHN5c3RlbTogdG91Y2hlcywgLi4uKGtleSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXk6IGtleSB9KSB9O1xufVxuXG4vKiogV2hhdCBhbiBhdHRlbXB0IHRoYXQgZW5kZWQgYG91dGNvbWVgICh3aXRoIGBlcnJvcmAsIHdoZW4gaXQgZmFpbGVkKSBkaWQgdG8gdGhlIG91dHNpZGUgc3lzdGVtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdE9mKG91dGNvbWU6IEF0dGVtcHRPdXRjb21lLCBlcnJvcjogdW5rbm93bik6IEF0dGVtcHRFZmZlY3Qge1xuICBpZiAob3V0Y29tZSA9PT0gJ29rJykgcmV0dXJuICdhcHBsaWVkJztcbiAgaWYgKG91dGNvbWUgPT09ICdmYWlsZWQnICYmIGRlY2xhcmVzTm9FZmZlY3QoZXJyb3IpKSByZXR1cm4gJ25vbmUnO1xuICByZXR1cm4gJ3Vua25vd24nO1xufVxuXG4vKiogVGhlIGVycm9yIGl0c2VsZiBzYXlzIG5vdGhpbmcgd2FzIHNlbnQg4oCUIGBlZmZlY3Q6ICdub25lJ2AsIHJlYWQgb25jZTsgYSB2YWx1ZSB0aGF0IGNhbm5vdCBiZSByZWFkIHNheXMgbm90aGluZy4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzTm9FZmZlY3QoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGVycm9yID09PSBudWxsIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGVycm9yIGFzIHsgZWZmZWN0PzogdW5rbm93biB9KS5lZmZlY3QgPT09ICdub25lJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogV2hhdCBhIHRvdWNoaW5nIHNlcmllcyBmYWlscyB3aXRoIHdoZW4gYW55IG9mIGl0cyBhdHRlbXB0cyBsZWZ0IHRoZSBlZmZlY3QgdW5rbm93biDigJQgbmV2ZXIgdGhlIGF0dGVtcHQncyBvd24gZXJyb3IsXG4gKiB3aGljaCBhIGNhbGxlciB3b3VsZCByZWFkIGFzIGEgZmFpbHVyZSBhbmQgcmV0cnkuIFRoZSBrZXkgaXMgdGhlIFJFQ09SREVEIG9uZTogdW5kZXIgYSByZWRhY3Rpb24gcnVsZSB0aGF0IG5hbWVzXG4gKiBpdCwgdGhlIGVycm9yIGNhcnJpZXMgdGhlIHBsYWNlaG9sZGVyLCBhcyBldmVyeSByZWNvcmQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVua25vd25FZmZlY3RFcnJvcih0YXJnZXQ6IEVmZmVjdFRhcmdldCwgcmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBjYXVzZTogdW5rbm93bik6IFVua25vd25FZmZlY3RFcnJvciB7XG4gIHJldHVybiBuZXcgVW5rbm93bkVmZmVjdEVycm9yKHtcbiAgICBzeXN0ZW06IHRhcmdldC5zeXN0ZW0sXG4gICAgLi4uKHJlY29yZGVkS2V5T2YodGFyZ2V0KSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXk6IHJlY29yZGVkS2V5T2YodGFyZ2V0KSB9KSxcbiAgICBhdHRlbXB0czogcmVjb3JkLmF0dGVtcHQsXG4gICAgY2F1c2UsXG4gIH0pO1xufVxuXG4vKiogVGhlIGtleSBhcyByZWNvcmRzIGNhcnJ5IGl0OiB0aGUgc2VydmVkIGZvcm0gd2hlbiB0aGUgY2FsbGVyIGdhdmUgb25lLCBlbHNlIHRoZSBrZXkgaXRzZWxmLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZGVkS2V5T2YodGFyZ2V0OiBFZmZlY3RUYXJnZXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGFyZ2V0LnJlY29yZGVkS2V5ID8/IHRhcmdldC5pZGVtcG90ZW5jeUtleTtcbn1cblxuLyoqIFRoZSBydW5uZXIncyByZWZ1c2FsIG9mIGEgdG91Y2hpbmcgc2VyaWVzIHRoYXQgbWF5IHJldHJ5IHdpdGggbm8ga2V5IOKAlCB0aGUgbGF3LCBhdCB0aGUgbGFzdCBkb29yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZnVzZUtleWxlc3NSZXRyeSh0YXJnZXQ6IEVmZmVjdFRhcmdldCwgYXR0ZW1wdHM6IG51bWJlcik6IHZvaWQge1xuICBpZiAoYXR0ZW1wdHMgPiAxICYmIHRhcmdldC5pZGVtcG90ZW5jeUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgW2Zvb3RwcmludF0gJHtyZXRyaWVkV2l0aG91dEtleSh0YXJnZXQuc3lzdGVtLCBhdHRlbXB0cyl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBXaHkgYSB0b3VjaGluZyBzdGFnZSBtYXkgbm90IGJlIFJFLVJVTiBieSBhbiBgaW50ZXJydXB0KClgIHJlc3VtZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBtYXkgKFAzKS4gQSByZXN1bWVcbiAqIHJlLXJ1bnMgdGhlIHN0YWdlJ3MgZnVuY3Rpb24gZnJvbSBpdHMgdG9wIOKAlCBhIHNlY29uZCBhdHRlbXB0IG9mIGl0cyBlZmZlY3Qg4oCUIHNvIHRoZSBsYXcgdGhhdCByZWZ1c2VzIGEga2V5bGVzc1xuICogcmV0cnkgcmVmdXNlcyBhIGtleWxlc3MgcmUtcnVuIHRvby4gQXNrZWQgd2hlbiB0aGUgc3RhZ2UgaW50ZXJydXB0cyAoYFN0YWdlUnVubmVyYCkgYW5kIHdoZW4gYSBjaGVja3BvaW50IGlzXG4gKiByZXN1bWVkIChgcnVubmVyL3Jlc3VtZS50cyDCtyBwbGFuUmVzdW1lYCwgZm9yIGEgY2hlY2twb2ludCBtYWRlIGJ5IGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgY2hhcnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJydXB0UHJvYmxlbSh0b3VjaGVzOiBTdGFnZVRvdWNoZXMgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodG91Y2hlcyA9PT0gdW5kZWZpbmVkIHx8IHRvdWNoZXMuaWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIChcbiAgICBgdG91Y2hlcyBcIiR7dG91Y2hlcy5zeXN0ZW19XCIgd2l0aCBubyBpZGVtcG90ZW5jeUtleSwgYW5kIGEgcmVzdW1lIGFmdGVyIGludGVycnVwdCgpIHJlLXJ1bnMgdGhlIHN0YWdlIGZyb20gaXRzIGAgK1xuICAgICd0b3Ag4oCUIGEgc2Vjb25kIGF0dGVtcHQgb2YgdGhlIGVmZmVjdCB3aXRob3V0IGEga2V5LiBEZWNsYXJlIHRoZSBrZXkgcnVsZSwgb3IgaW50ZXJydXB0IGluIGEgc3RhZ2Ugb2YgaXRzIG93bi4nXG4gICk7XG59XG5cbi8qKiBUaGUgdG91Y2hpbmcgZGVjbGFyYXRpb25zIGByZXN1bWUoKWAgYnVpbGRzIGFyb3VuZCBhIGtleSBhIGNoZWNrcG9pbnQgY2FycmllZCAoYGNhcnJpZWRUb3VjaGVzYCkuICovXG5jb25zdCBDQVJSSUVEID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4vKipcbiAqIFRoZSBzdGFuZC1pbidzIGRlY2xhcmF0aW9uIG9uIGEgcmVzdW1lIChQMyk6IHRoZSBwYXVzZWQgc3RhZ2UncyBzeXN0ZW0sIGFuc3dlcmluZyB0aGUga2V5IGl0cyBjaGVja3BvaW50IGNhcnJpZWQg4oCUXG4gKiB0aGUgT1BFUkFUSU9OQUwgdmFsdWUsIHJlYWwgKGNoZWNrcG9pbnRzIGFyZSBleGVtcHQgZnJvbSByZWRhY3Rpb24gYnkgbGF3KS4gSXQgaXMgbWFya2VkLCBzbyB0aGUgcnVuIHNlcnZlcyBpdFxuICogbGlrZSBhIGtleSBvZiB1bmtub3duIHNvdXJjZXM6IHVuZGVyIGFueSBzdGF0ZSBydWxlIHRoZSByZWNvcmRzIGNhcnJ5IHRoZSBwbGFjZWhvbGRlciAoYGlzQ2FycmllZFRvdWNoZXNgKSDigJQgdGhlXG4gKiByZXN1bWVkIGxlZyBubyBsb25nZXIgaG9sZHMgdGhlIGlucHV0IHRoZSBrZXkgd2FzIG1hZGUgb2YsIHNvIGl0IGNhbm5vdCB0ZWxsIHdoZXRoZXIgdGhlIGtleSB3YXMgbWFza2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FycmllZFRvdWNoZXMoc3lzdGVtOiBzdHJpbmcsIGtleTogc3RyaW5nKTogU3RhZ2VUb3VjaGVzIHtcbiAgY29uc3QgdG91Y2hlcyA9IE9iamVjdC5mcmVlemUoeyBzeXN0ZW0sIGlkZW1wb3RlbmN5S2V5OiAoKSA9PiBrZXkgfSk7XG4gIENBUlJJRUQuYWRkKHRvdWNoZXMpO1xuICByZXR1cm4gdG91Y2hlcztcbn1cblxuLyoqIFRoZSBkZWNsYXJhdGlvbiBhbnN3ZXJzIGEga2V5IGEgY2hlY2twb2ludCBjYXJyaWVkICh7QGxpbmsgY2FycmllZFRvdWNoZXN9KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhcnJpZWRUb3VjaGVzKHRvdWNoZXM6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB0b3VjaGVzID09PSAnb2JqZWN0JyAmJiB0b3VjaGVzICE9PSBudWxsICYmIENBUlJJRUQuaGFzKHRvdWNoZXMpO1xufVxuIl19
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * attempt/errors.ts — the errors the attempt contract throws (design §3.3).
4
+ *
5
+ * - `AttemptTimeoutError` — the attempt's OWN timer ended it (`RetryPolicy.timeoutMs` / the run's deadline). A
6
+ * timeout is the absence of an answer, not a failure of the outside system (law 4); `errorCategory` reads it
7
+ * as `'timeout'`.
8
+ * - `UnknownEffectError` — a side-effecting target's last attempt ended with no answer, so nobody knows whether
9
+ * the effect happened. "Reconcile, do not retry blindly" is on the error, not in prose.
10
+ *
11
+ * The idempotency key is a VALUE: it rides the error as a field (a redaction rule selects it by name) and is
12
+ * never spelled in a message.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.UnknownEffectError = exports.AttemptTimeoutError = void 0;
16
+ /** The attempt's own time cap ran out before it answered. */
17
+ class AttemptTimeoutError extends Error {
18
+ /** The attempt that ran out of time, 1-based. */
19
+ attempt;
20
+ /** The cap it ran under, in milliseconds. */
21
+ timeoutMs;
22
+ constructor(attempt, timeoutMs, options) {
23
+ super(`attempt ${attempt} ran out of its ${timeoutMs}ms before it answered`);
24
+ this.name = 'AttemptTimeoutError';
25
+ this.attempt = attempt;
26
+ this.timeoutMs = timeoutMs;
27
+ if (options && Object.prototype.hasOwnProperty.call(options, 'cause'))
28
+ this.cause = options.cause;
29
+ }
30
+ }
31
+ exports.AttemptTimeoutError = AttemptTimeoutError;
32
+ /** A side-effecting target's last attempt ended with no answer: whether the effect happened is unknown. */
33
+ class UnknownEffectError extends Error {
34
+ system;
35
+ attempts;
36
+ constructor(init) {
37
+ super(`"${init.system}": the effect of attempt ${init.attempts} is unknown — reconcile with the system ` +
38
+ '(look the operation up by its idempotency key) before trying again');
39
+ this.name = 'UnknownEffectError';
40
+ this.system = init.system;
41
+ if (init.idempotencyKey !== undefined)
42
+ this.idempotencyKey = init.idempotencyKey;
43
+ this.attempts = init.attempts;
44
+ if (Object.prototype.hasOwnProperty.call(init, 'cause'))
45
+ this.cause = init.cause;
46
+ }
47
+ }
48
+ exports.UnknownEffectError = UnknownEffectError;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7OztBQUVILDZEQUE2RDtBQUM3RCxNQUFhLG1CQUFvQixTQUFRLEtBQUs7SUFDNUMsaURBQWlEO0lBQ3hDLE9BQU8sQ0FBUztJQUN6Qiw2Q0FBNkM7SUFDcEMsU0FBUyxDQUFTO0lBRTNCLFlBQVksT0FBZSxFQUFFLFNBQWlCLEVBQUUsT0FBc0M7UUFDcEYsS0FBSyxDQUFDLFdBQVcsT0FBTyxtQkFBbUIsU0FBUyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxPQUFPLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7WUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDcEcsQ0FBQztDQUNGO0FBYkQsa0RBYUM7QUFjRCwyR0FBMkc7QUFDM0csTUFBYSxrQkFBbUIsU0FBUSxLQUFLO0lBQ2xDLE1BQU0sQ0FBUztJQUdmLFFBQVEsQ0FBUztJQUUxQixZQUFZLElBQXVCO1FBQ2pDLEtBQUssQ0FDSCxJQUFJLElBQUksQ0FBQyxNQUFNLDRCQUE0QixJQUFJLENBQUMsUUFBUSwwQ0FBMEM7WUFDaEcsb0VBQW9FLENBQ3ZFLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNqRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNuRixDQUFDO0NBQ0Y7QUFqQkQsZ0RBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhdHRlbXB0L2Vycm9ycy50cyDigJQgdGhlIGVycm9ycyB0aGUgYXR0ZW1wdCBjb250cmFjdCB0aHJvd3MgKGRlc2lnbiDCpzMuMykuXG4gKlxuICogLSBgQXR0ZW1wdFRpbWVvdXRFcnJvcmAg4oCUIHRoZSBhdHRlbXB0J3MgT1dOIHRpbWVyIGVuZGVkIGl0IChgUmV0cnlQb2xpY3kudGltZW91dE1zYCAvIHRoZSBydW4ncyBkZWFkbGluZSkuIEFcbiAqICAgdGltZW91dCBpcyB0aGUgYWJzZW5jZSBvZiBhbiBhbnN3ZXIsIG5vdCBhIGZhaWx1cmUgb2YgdGhlIG91dHNpZGUgc3lzdGVtIChsYXcgNCk7IGBlcnJvckNhdGVnb3J5YCByZWFkcyBpdFxuICogICBhcyBgJ3RpbWVvdXQnYC5cbiAqIC0gYFVua25vd25FZmZlY3RFcnJvcmAg4oCUIGEgc2lkZS1lZmZlY3RpbmcgdGFyZ2V0J3MgbGFzdCBhdHRlbXB0IGVuZGVkIHdpdGggbm8gYW5zd2VyLCBzbyBub2JvZHkga25vd3Mgd2hldGhlclxuICogICB0aGUgZWZmZWN0IGhhcHBlbmVkLiBcIlJlY29uY2lsZSwgZG8gbm90IHJldHJ5IGJsaW5kbHlcIiBpcyBvbiB0aGUgZXJyb3IsIG5vdCBpbiBwcm9zZS5cbiAqXG4gKiBUaGUgaWRlbXBvdGVuY3kga2V5IGlzIGEgVkFMVUU6IGl0IHJpZGVzIHRoZSBlcnJvciBhcyBhIGZpZWxkIChhIHJlZGFjdGlvbiBydWxlIHNlbGVjdHMgaXQgYnkgbmFtZSkgYW5kIGlzXG4gKiBuZXZlciBzcGVsbGVkIGluIGEgbWVzc2FnZS5cbiAqL1xuXG4vKiogVGhlIGF0dGVtcHQncyBvd24gdGltZSBjYXAgcmFuIG91dCBiZWZvcmUgaXQgYW5zd2VyZWQuICovXG5leHBvcnQgY2xhc3MgQXR0ZW1wdFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqIFRoZSBhdHRlbXB0IHRoYXQgcmFuIG91dCBvZiB0aW1lLCAxLWJhc2VkLiAqL1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG4gIC8qKiBUaGUgY2FwIGl0IHJhbiB1bmRlciwgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICByZWFkb25seSB0aW1lb3V0TXM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhdHRlbXB0OiBudW1iZXIsIHRpbWVvdXRNczogbnVtYmVyLCBvcHRpb25zPzogeyByZWFkb25seSBjYXVzZT86IHVua25vd24gfSkge1xuICAgIHN1cGVyKGBhdHRlbXB0ICR7YXR0ZW1wdH0gcmFuIG91dCBvZiBpdHMgJHt0aW1lb3V0TXN9bXMgYmVmb3JlIGl0IGFuc3dlcmVkYCk7XG4gICAgdGhpcy5uYW1lID0gJ0F0dGVtcHRUaW1lb3V0RXJyb3InO1xuICAgIHRoaXMuYXR0ZW1wdCA9IGF0dGVtcHQ7XG4gICAgdGhpcy50aW1lb3V0TXMgPSB0aW1lb3V0TXM7XG4gICAgaWYgKG9wdGlvbnMgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICdjYXVzZScpKSB0aGlzLmNhdXNlID0gb3B0aW9ucy5jYXVzZTtcbiAgfVxufVxuXG4vKiogV2hhdCBhbiBgVW5rbm93bkVmZmVjdEVycm9yYCBuYW1lcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5rbm93bkVmZmVjdEluaXQge1xuICAvKiogVGhlIG91dHNpZGUgc3lzdGVtIHRoZSBzdGFnZSB0b3VjaGVzIOKAlCBhIG5hbWUsIG5ldmVyIGEgdmFsdWUuICovXG4gIHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nO1xuICAvKiogVGhlIGtleSB0aGUgZWZmZWN0IHdhcyBhdHRlbXB0ZWQgdW5kZXIg4oCUIGEgdmFsdWUsIGtlcHQgYXMgYSBmaWVsZCBhbmQgbmV2ZXIgcHV0IGluIHRoZSBtZXNzYWdlLiAqL1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbiAgLyoqIEhvdyBtYW55IGF0dGVtcHRzIHJhbi4gKi9cbiAgcmVhZG9ubHkgYXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIFRoZSBsYXN0IGF0dGVtcHQncyBvd24gZXJyb3IuICovXG4gIHJlYWRvbmx5IGNhdXNlPzogdW5rbm93bjtcbn1cblxuLyoqIEEgc2lkZS1lZmZlY3RpbmcgdGFyZ2V0J3MgbGFzdCBhdHRlbXB0IGVuZGVkIHdpdGggbm8gYW5zd2VyOiB3aGV0aGVyIHRoZSBlZmZlY3QgaGFwcGVuZWQgaXMgdW5rbm93bi4gKi9cbmV4cG9ydCBjbGFzcyBVbmtub3duRWZmZWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nO1xuICAvKiogQWJzZW50IChub3QgYHVuZGVmaW5lZGApIHdoZW4gbm8ga2V5IHdhcyBnaXZlbiDigJQgYGRlY2xhcmVgLCBzbyBubyBjbGFzcyBmaWVsZCBpcyBlbWl0dGVkIGZvciBpdC4gKi9cbiAgZGVjbGFyZSByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbiAgcmVhZG9ubHkgYXR0ZW1wdHM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihpbml0OiBVbmtub3duRWZmZWN0SW5pdCkge1xuICAgIHN1cGVyKFxuICAgICAgYFwiJHtpbml0LnN5c3RlbX1cIjogdGhlIGVmZmVjdCBvZiBhdHRlbXB0ICR7aW5pdC5hdHRlbXB0c30gaXMgdW5rbm93biDigJQgcmVjb25jaWxlIHdpdGggdGhlIHN5c3RlbSBgICtcbiAgICAgICAgJyhsb29rIHRoZSBvcGVyYXRpb24gdXAgYnkgaXRzIGlkZW1wb3RlbmN5IGtleSkgYmVmb3JlIHRyeWluZyBhZ2FpbicsXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5rbm93bkVmZmVjdEVycm9yJztcbiAgICB0aGlzLnN5c3RlbSA9IGluaXQuc3lzdGVtO1xuICAgIGlmIChpbml0LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQpIHRoaXMuaWRlbXBvdGVuY3lLZXkgPSBpbml0LmlkZW1wb3RlbmN5S2V5O1xuICAgIHRoaXMuYXR0ZW1wdHMgPSBpbml0LmF0dGVtcHRzO1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaW5pdCwgJ2NhdXNlJykpIHRoaXMuY2F1c2UgPSBpbml0LmNhdXNlO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * attempt/ — one runner, one record: every attempt the library runs is an `AttemptRecord` with the
4
+ * retry-or-stop decision that followed it (design docs/design/2026-10-time-and-failure-evidence.md).
5
+ *
6
+ * Public: the record's vocabulary, the one failure classifier, the one rule table, the two errors, and `attempt()`
7
+ * — the runner for code that is not a stage (P2). The loop itself (`runAttempts`), `runCall`, the evidence builder
8
+ * and `anySignal` are the engine's. `RetryPolicy` is declared in
9
+ * `./types.ts` and published through the builder's barrel, where it always was.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.attempt = exports.UnknownEffectError = exports.AttemptTimeoutError = exports.retryRules = exports.TraceparentError = exports.parseTraceparent = exports.formatTraceparent = exports.errorCategory = void 0;
13
+ var category_js_1 = require("./category.js");
14
+ Object.defineProperty(exports, "errorCategory", { enumerable: true, get: function () { return category_js_1.errorCategory; } });
15
+ var correlation_js_1 = require("./correlation.js");
16
+ Object.defineProperty(exports, "formatTraceparent", { enumerable: true, get: function () { return correlation_js_1.formatTraceparent; } });
17
+ Object.defineProperty(exports, "parseTraceparent", { enumerable: true, get: function () { return correlation_js_1.parseTraceparent; } });
18
+ Object.defineProperty(exports, "TraceparentError", { enumerable: true, get: function () { return correlation_js_1.TraceparentError; } });
19
+ var decision_js_1 = require("./decision.js");
20
+ Object.defineProperty(exports, "retryRules", { enumerable: true, get: function () { return decision_js_1.retryRules; } });
21
+ var errors_js_1 = require("./errors.js");
22
+ Object.defineProperty(exports, "AttemptTimeoutError", { enumerable: true, get: function () { return errors_js_1.AttemptTimeoutError; } });
23
+ Object.defineProperty(exports, "UnknownEffectError", { enumerable: true, get: function () { return errors_js_1.UnknownEffectError; } });
24
+ var standalone_js_1 = require("./standalone.js");
25
+ Object.defineProperty(exports, "attempt", { enumerable: true, get: function () { return standalone_js_1.attempt; } });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCw2Q0FBOEM7QUFBckMsNEdBQUEsYUFBYSxPQUFBO0FBRXRCLG1EQUF5RjtBQUFoRixtSEFBQSxpQkFBaUIsT0FBQTtBQUFFLGtIQUFBLGdCQUFnQixPQUFBO0FBQUUsa0hBQUEsZ0JBQWdCLE9BQUE7QUFDOUQsNkNBQTJDO0FBQWxDLHlHQUFBLFVBQVUsT0FBQTtBQUVuQix5Q0FBc0U7QUFBN0QsZ0hBQUEsbUJBQW1CLE9BQUE7QUFBRSwrR0FBQSxrQkFBa0IsT0FBQTtBQUVoRCxpREFBMEM7QUFBakMsd0dBQUEsT0FBTyxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhdHRlbXB0LyDigJQgb25lIHJ1bm5lciwgb25lIHJlY29yZDogZXZlcnkgYXR0ZW1wdCB0aGUgbGlicmFyeSBydW5zIGlzIGFuIGBBdHRlbXB0UmVjb3JkYCB3aXRoIHRoZVxuICogcmV0cnktb3Itc3RvcCBkZWNpc2lvbiB0aGF0IGZvbGxvd2VkIGl0IChkZXNpZ24gZG9jcy9kZXNpZ24vMjAyNi0xMC10aW1lLWFuZC1mYWlsdXJlLWV2aWRlbmNlLm1kKS5cbiAqXG4gKiBQdWJsaWM6IHRoZSByZWNvcmQncyB2b2NhYnVsYXJ5LCB0aGUgb25lIGZhaWx1cmUgY2xhc3NpZmllciwgdGhlIG9uZSBydWxlIHRhYmxlLCB0aGUgdHdvIGVycm9ycywgYW5kIGBhdHRlbXB0KClgXG4gKiDigJQgdGhlIHJ1bm5lciBmb3IgY29kZSB0aGF0IGlzIG5vdCBhIHN0YWdlIChQMikuIFRoZSBsb29wIGl0c2VsZiAoYHJ1bkF0dGVtcHRzYCksIGBydW5DYWxsYCwgdGhlIGV2aWRlbmNlIGJ1aWxkZXJcbiAqIGFuZCBgYW55U2lnbmFsYCBhcmUgdGhlIGVuZ2luZSdzLiBgUmV0cnlQb2xpY3lgIGlzIGRlY2xhcmVkIGluXG4gKiBgLi90eXBlcy50c2AgYW5kIHB1Ymxpc2hlZCB0aHJvdWdoIHRoZSBidWlsZGVyJ3MgYmFycmVsLCB3aGVyZSBpdCBhbHdheXMgd2FzLlxuICovXG5cbmV4cG9ydCB7IGVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuL2NhdGVnb3J5LmpzJztcbmV4cG9ydCB0eXBlIHsgUGFyc2VkVHJhY2VwYXJlbnQsIFRyYWNlcGFyZW50RmllbGRzLCBUcmFjZXBhcmVudFJlZnVzYWwgfSBmcm9tICcuL2NvcnJlbGF0aW9uLmpzJztcbmV4cG9ydCB7IGZvcm1hdFRyYWNlcGFyZW50LCBwYXJzZVRyYWNlcGFyZW50LCBUcmFjZXBhcmVudEVycm9yIH0gZnJvbSAnLi9jb3JyZWxhdGlvbi5qcyc7XG5leHBvcnQgeyByZXRyeVJ1bGVzIH0gZnJvbSAnLi9kZWNpc2lvbi5qcyc7XG5leHBvcnQgdHlwZSB7IFVua25vd25FZmZlY3RJbml0IH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuZXhwb3J0IHsgQXR0ZW1wdFRpbWVvdXRFcnJvciwgVW5rbm93bkVmZmVjdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuZXhwb3J0IHR5cGUgeyBBdHRlbXB0T3B0aW9ucyB9IGZyb20gJy4vc3RhbmRhbG9uZS5qcyc7XG5leHBvcnQgeyBhdHRlbXB0IH0gZnJvbSAnLi9zdGFuZGFsb25lLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENhdGVnb3J5LFxuICBBdHRlbXB0Q29udGV4dCxcbiAgQXR0ZW1wdEVmZmVjdCxcbiAgQXR0ZW1wdEVycm9yLFxuICBBdHRlbXB0SW5wdXRzLFxuICBBdHRlbXB0S2luZCxcbiAgQXR0ZW1wdE5leHQsXG4gIEF0dGVtcHRPdXRjb21lLFxuICBBdHRlbXB0UmVhc29uLFxuICBBdHRlbXB0UmVjb3JkLFxuICBBdHRlbXB0U3VtbWFyeSxcbiAgQ2FsbE9wdGlvbnMsXG4gIElkZW1wb3RlbmN5S2V5Q29udGV4dCxcbiAgTGF0ZVdyaXRlLFxuICBPYnNlcnZlZEF0dGVtcHQsXG4gIFJ1bkNvcnJlbGF0aW9uLFxuICBTdGFnZVRvdWNoZXMsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuIl19