footprintjs 9.48.2 → 10.0.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 (326) hide show
  1. package/AGENTS.md +12 -10
  2. package/CLAUDE.md +21 -23
  3. package/README.md +1 -1
  4. package/dist/advanced.js +71 -128
  5. package/dist/esm/advanced.d.ts +24 -58
  6. package/dist/esm/advanced.js +13 -51
  7. package/dist/esm/index.d.ts +5 -8
  8. package/dist/esm/index.js +3 -3
  9. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
  10. package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
  11. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
  12. package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
  13. package/dist/esm/lib/capture/index.d.ts +0 -1
  14. package/dist/esm/lib/capture/index.js +1 -2
  15. package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
  16. package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  17. package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
  18. package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  19. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
  20. package/dist/esm/lib/engine/index.d.ts +1 -1
  21. package/dist/esm/lib/engine/index.js +1 -1
  22. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  24. package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
  25. package/dist/esm/lib/engine/narrative/index.js +1 -1
  26. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  27. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  28. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  29. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
  30. package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
  31. package/dist/esm/lib/engine/traversalContext.js +2 -2
  32. package/dist/esm/lib/engine/types.d.ts +2 -10
  33. package/dist/esm/lib/engine/types.js +1 -1
  34. package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
  35. package/dist/esm/lib/ids/reservedIds.js +2 -2
  36. package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
  37. package/dist/esm/lib/memory/StageContext.d.ts +2 -4
  38. package/dist/esm/lib/memory/StageContext.js +2 -2
  39. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  40. package/dist/esm/lib/memory/index.d.ts +6 -21
  41. package/dist/esm/lib/memory/index.js +4 -22
  42. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  43. package/dist/esm/lib/memory/redaction.js +2 -2
  44. package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
  45. package/dist/esm/lib/memory/runPolicy.js +1 -1
  46. package/dist/esm/lib/reactive/createTypedScope.js +2 -2
  47. package/dist/esm/lib/reactive/writeTraps.js +2 -2
  48. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
  49. package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
  50. package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
  51. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  52. package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
  53. package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
  54. package/dist/esm/lib/recorder/qualityTrace.js +2 -2
  55. package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
  56. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
  57. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
  58. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
  59. package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
  60. package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
  62. package/dist/esm/lib/runner/resume.js +2 -2
  63. package/dist/esm/lib/runner/snapshot.js +3 -2
  64. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  65. package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
  66. package/dist/esm/recorders.d.ts +2 -3
  67. package/dist/esm/recorders.js +1 -1
  68. package/dist/esm/trace.d.ts +11 -57
  69. package/dist/esm/trace.js +10 -68
  70. package/dist/index.js +3 -3
  71. package/dist/lib/builder/FlowChartBuilder.js +5 -5
  72. package/dist/lib/builder/structure/StructureRecorder.js +1 -1
  73. package/dist/lib/capture/index.js +2 -4
  74. package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
  75. package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
  77. package/dist/lib/engine/index.js +1 -1
  78. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  79. package/dist/lib/engine/narrative/index.js +1 -1
  80. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  81. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
  82. package/dist/lib/engine/traversalContext.js +4 -4
  83. package/dist/lib/engine/types.js +1 -1
  84. package/dist/lib/engine/walkSubflowSpec.js +3 -3
  85. package/dist/lib/ids/reservedIds.js +5 -5
  86. package/dist/lib/memory/DiagnosticCollector.js +3 -3
  87. package/dist/lib/memory/StageContext.js +3 -3
  88. package/dist/lib/memory/borrowedMutation.js +3 -3
  89. package/dist/lib/memory/index.js +7 -42
  90. package/dist/lib/memory/redaction.js +3 -3
  91. package/dist/lib/memory/runPolicy.js +1 -1
  92. package/dist/lib/reactive/createTypedScope.js +3 -3
  93. package/dist/lib/reactive/writeTraps.js +4 -4
  94. package/dist/lib/recorder/ControlDepRecorder.js +3 -2
  95. package/dist/lib/recorder/EmitRecorder.js +1 -1
  96. package/dist/lib/recorder/InOutRecorder.js +3 -3
  97. package/dist/lib/recorder/qualityTrace.js +4 -4
  98. package/dist/lib/runner/DeferredObserverTier.js +3 -3
  99. package/dist/lib/runner/ExecutionRuntime.js +6 -9
  100. package/dist/lib/runner/FlowChartExecutor.js +1 -1
  101. package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
  102. package/dist/lib/runner/resume.js +3 -3
  103. package/dist/lib/runner/snapshot.js +6 -5
  104. package/dist/lib/scope/ScopeFacade.js +3 -3
  105. package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
  106. package/dist/recorders.js +1 -1
  107. package/dist/trace.js +18 -120
  108. package/dist/types/advanced.d.ts +24 -58
  109. package/dist/types/index.d.ts +5 -8
  110. package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
  111. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
  112. package/dist/types/lib/capture/index.d.ts +0 -1
  113. package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  114. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  115. package/dist/types/lib/engine/index.d.ts +1 -1
  116. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  117. package/dist/types/lib/engine/narrative/index.d.ts +1 -1
  118. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  119. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  120. package/dist/types/lib/engine/traversalContext.d.ts +1 -1
  121. package/dist/types/lib/engine/types.d.ts +2 -10
  122. package/dist/types/lib/memory/StageContext.d.ts +2 -4
  123. package/dist/types/lib/memory/index.d.ts +6 -21
  124. package/dist/types/lib/memory/redaction.d.ts +1 -1
  125. package/dist/types/lib/memory/runPolicy.d.ts +3 -2
  126. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
  127. package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
  128. package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
  129. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
  130. package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
  131. package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  132. package/dist/types/recorders.d.ts +2 -3
  133. package/dist/types/trace.d.ts +11 -57
  134. package/package.json +6 -15
  135. package/dist/esm/lib/capture/freeze.d.ts +0 -91
  136. package/dist/esm/lib/capture/freeze.js +0 -314
  137. package/dist/esm/lib/capture/ownData.d.ts +0 -7
  138. package/dist/esm/lib/capture/ownData.js +0 -15
  139. package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
  140. package/dist/esm/lib/capture/valueKinds.js +0 -142
  141. package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
  142. package/dist/esm/lib/ids/runtimeStageId.js +0 -194
  143. package/dist/esm/lib/memory/EventLog.d.ts +0 -105
  144. package/dist/esm/lib/memory/EventLog.js +0 -148
  145. package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
  146. package/dist/esm/lib/memory/RecordFrame.js +0 -296
  147. package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
  148. package/dist/esm/lib/memory/SharedMemory.js +0 -88
  149. package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
  150. package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
  151. package/dist/esm/lib/memory/admission.d.ts +0 -81
  152. package/dist/esm/lib/memory/admission.js +0 -153
  153. package/dist/esm/lib/memory/backtrack.d.ts +0 -286
  154. package/dist/esm/lib/memory/backtrack.js +0 -457
  155. package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
  156. package/dist/esm/lib/memory/commitLogUtils.js +0 -384
  157. package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
  158. package/dist/esm/lib/memory/deltaEncoding.js +0 -122
  159. package/dist/esm/lib/memory/equality.d.ts +0 -93
  160. package/dist/esm/lib/memory/equality.js +0 -262
  161. package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
  162. package/dist/esm/lib/memory/eventPosition.js +0 -2
  163. package/dist/esm/lib/memory/honesty.d.ts +0 -93
  164. package/dist/esm/lib/memory/honesty.js +0 -92
  165. package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
  166. package/dist/esm/lib/memory/keyPaths.js +0 -227
  167. package/dist/esm/lib/memory/logModel.d.ts +0 -76
  168. package/dist/esm/lib/memory/logModel.js +0 -364
  169. package/dist/esm/lib/memory/merge.d.ts +0 -26
  170. package/dist/esm/lib/memory/merge.js +0 -60
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -115
  172. package/dist/esm/lib/memory/pathOps.js +0 -290
  173. package/dist/esm/lib/memory/paths.d.ts +0 -52
  174. package/dist/esm/lib/memory/paths.js +0 -57
  175. package/dist/esm/lib/memory/placeholders.d.ts +0 -39
  176. package/dist/esm/lib/memory/placeholders.js +0 -40
  177. package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
  178. package/dist/esm/lib/memory/recordCommit.js +0 -61
  179. package/dist/esm/lib/memory/scrub.d.ts +0 -53
  180. package/dist/esm/lib/memory/scrub.js +0 -74
  181. package/dist/esm/lib/memory/types.d.ts +0 -209
  182. package/dist/esm/lib/memory/types.js +0 -10
  183. package/dist/esm/lib/memory/utils.d.ts +0 -73
  184. package/dist/esm/lib/memory/utils.js +0 -159
  185. package/dist/esm/lib/memory/verbs.d.ts +0 -333
  186. package/dist/esm/lib/memory/verbs.js +0 -427
  187. package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
  188. package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
  189. package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
  190. package/dist/esm/lib/scope/detectCircular.js +0 -14
  191. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
  192. package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
  193. package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
  194. package/dist/esm/lib/slice/elementProvenance.js +0 -190
  195. package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
  196. package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
  197. package/dist/esm/lib/slice/index.d.ts +0 -25
  198. package/dist/esm/lib/slice/index.js +0 -25
  199. package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
  200. package/dist/esm/lib/slice/keyIndex.js +0 -293
  201. package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
  202. package/dist/esm/lib/slice/keyTimeline.js +0 -113
  203. package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
  204. package/dist/esm/lib/slice/keysReadSources.js +0 -95
  205. package/dist/esm/lib/slice/serialize.d.ts +0 -78
  206. package/dist/esm/lib/slice/serialize.js +0 -278
  207. package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
  208. package/dist/esm/lib/slice/sliceForKey.js +0 -88
  209. package/dist/esm/lib/slice/types.d.ts +0 -567
  210. package/dist/esm/lib/slice/types.js +0 -25
  211. package/dist/esm/lib/time-travel/axis.d.ts +0 -119
  212. package/dist/esm/lib/time-travel/axis.js +0 -179
  213. package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
  214. package/dist/esm/lib/time-travel/bundles.js +0 -136
  215. package/dist/esm/lib/time-travel/chain.d.ts +0 -93
  216. package/dist/esm/lib/time-travel/chain.js +0 -188
  217. package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
  218. package/dist/esm/lib/time-travel/commitStops.js +0 -202
  219. package/dist/esm/lib/time-travel/index.d.ts +0 -22
  220. package/dist/esm/lib/time-travel/index.js +0 -21
  221. package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
  222. package/dist/esm/lib/time-travel/stateAt.js +0 -153
  223. package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
  224. package/dist/esm/lib/time-travel/tagStops.js +0 -102
  225. package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
  226. package/dist/esm/lib/time-travel/timeTravel.js +0 -360
  227. package/dist/esm/lib/time-travel/types.d.ts +0 -470
  228. package/dist/esm/lib/time-travel/types.js +0 -23
  229. package/dist/esm/write.d.ts +0 -47
  230. package/dist/esm/write.js +0 -46
  231. package/dist/lib/capture/freeze.js +0 -320
  232. package/dist/lib/capture/ownData.js +0 -19
  233. package/dist/lib/capture/valueKinds.js +0 -146
  234. package/dist/lib/ids/runtimeStageId.js +0 -210
  235. package/dist/lib/memory/EventLog.js +0 -152
  236. package/dist/lib/memory/RecordFrame.js +0 -300
  237. package/dist/lib/memory/SharedMemory.js +0 -92
  238. package/dist/lib/memory/TransactionBuffer.js +0 -950
  239. package/dist/lib/memory/admission.js +0 -159
  240. package/dist/lib/memory/backtrack.js +0 -463
  241. package/dist/lib/memory/commitLogUtils.js +0 -399
  242. package/dist/lib/memory/deltaEncoding.js +0 -128
  243. package/dist/lib/memory/equality.js +0 -266
  244. package/dist/lib/memory/eventPosition.js +0 -3
  245. package/dist/lib/memory/honesty.js +0 -95
  246. package/dist/lib/memory/keyPaths.js +0 -243
  247. package/dist/lib/memory/logModel.js +0 -372
  248. package/dist/lib/memory/merge.js +0 -64
  249. package/dist/lib/memory/pathOps.js +0 -306
  250. package/dist/lib/memory/paths.js +0 -62
  251. package/dist/lib/memory/placeholders.js +0 -43
  252. package/dist/lib/memory/recordCommit.js +0 -65
  253. package/dist/lib/memory/scrub.js +0 -79
  254. package/dist/lib/memory/types.js +0 -11
  255. package/dist/lib/memory/utils.js +0 -178
  256. package/dist/lib/memory/verbs.js +0 -444
  257. package/dist/lib/recorder/CommitRangeIndex.js +0 -211
  258. package/dist/lib/scope/detectCircular.js +0 -21
  259. package/dist/lib/scope/recorders/summarizeValue.js +0 -10
  260. package/dist/lib/slice/elementProvenance.js +0 -195
  261. package/dist/lib/slice/forwardSliceForKey.js +0 -247
  262. package/dist/lib/slice/index.js +0 -42
  263. package/dist/lib/slice/keyIndex.js +0 -313
  264. package/dist/lib/slice/keyTimeline.js +0 -117
  265. package/dist/lib/slice/keysReadSources.js +0 -101
  266. package/dist/lib/slice/serialize.js +0 -286
  267. package/dist/lib/slice/sliceForKey.js +0 -93
  268. package/dist/lib/slice/types.js +0 -26
  269. package/dist/lib/time-travel/axis.js +0 -184
  270. package/dist/lib/time-travel/bundles.js +0 -144
  271. package/dist/lib/time-travel/chain.js +0 -193
  272. package/dist/lib/time-travel/commitStops.js +0 -206
  273. package/dist/lib/time-travel/index.js +0 -32
  274. package/dist/lib/time-travel/stateAt.js +0 -160
  275. package/dist/lib/time-travel/tagStops.js +0 -106
  276. package/dist/lib/time-travel/timeTravel.js +0 -364
  277. package/dist/lib/time-travel/types.js +0 -24
  278. package/dist/types/lib/capture/freeze.d.ts +0 -91
  279. package/dist/types/lib/capture/ownData.d.ts +0 -7
  280. package/dist/types/lib/capture/valueKinds.d.ts +0 -57
  281. package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
  282. package/dist/types/lib/memory/EventLog.d.ts +0 -105
  283. package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
  284. package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
  285. package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
  286. package/dist/types/lib/memory/admission.d.ts +0 -81
  287. package/dist/types/lib/memory/backtrack.d.ts +0 -286
  288. package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
  289. package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
  290. package/dist/types/lib/memory/equality.d.ts +0 -93
  291. package/dist/types/lib/memory/eventPosition.d.ts +0 -18
  292. package/dist/types/lib/memory/honesty.d.ts +0 -93
  293. package/dist/types/lib/memory/keyPaths.d.ts +0 -125
  294. package/dist/types/lib/memory/logModel.d.ts +0 -76
  295. package/dist/types/lib/memory/merge.d.ts +0 -26
  296. package/dist/types/lib/memory/pathOps.d.ts +0 -115
  297. package/dist/types/lib/memory/paths.d.ts +0 -52
  298. package/dist/types/lib/memory/placeholders.d.ts +0 -39
  299. package/dist/types/lib/memory/recordCommit.d.ts +0 -45
  300. package/dist/types/lib/memory/scrub.d.ts +0 -53
  301. package/dist/types/lib/memory/types.d.ts +0 -209
  302. package/dist/types/lib/memory/utils.d.ts +0 -73
  303. package/dist/types/lib/memory/verbs.d.ts +0 -333
  304. package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
  305. package/dist/types/lib/scope/detectCircular.d.ts +0 -13
  306. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
  307. package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
  308. package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
  309. package/dist/types/lib/slice/index.d.ts +0 -25
  310. package/dist/types/lib/slice/keyIndex.d.ts +0 -137
  311. package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
  312. package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
  313. package/dist/types/lib/slice/serialize.d.ts +0 -78
  314. package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
  315. package/dist/types/lib/slice/types.d.ts +0 -567
  316. package/dist/types/lib/time-travel/axis.d.ts +0 -119
  317. package/dist/types/lib/time-travel/bundles.d.ts +0 -77
  318. package/dist/types/lib/time-travel/chain.d.ts +0 -93
  319. package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
  320. package/dist/types/lib/time-travel/index.d.ts +0 -22
  321. package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
  322. package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
  323. package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
  324. package/dist/types/lib/time-travel/types.d.ts +0 -470
  325. package/dist/types/write.d.ts +0 -47
  326. package/dist/write.js +0 -52
@@ -1,202 +0,0 @@
1
- /**
2
- * commitStops — the one strategy footprintjs ships.
3
- *
4
- * One stop per executed stage, in execution order, plus `'start'` / `'end'`
5
- * bookends. It is the only stop grammar the substrate itself knows: the engine
6
- * stamps one `runtimeStageId` per executed stage, and an empty commit is a
7
- * deliberate cursor stop, not noise. Richer vocabularies (milestones, turns,
8
- * tool calls) belong to the consumer that owns them — they plug in through
9
- * `TimeTravelStrategy`, they do not go here.
10
- */
11
- import { isExecutionKey, isWithinSubflow, parseRuntimeStageId, stageIdOf } from '../ids/runtimeStageId.js';
12
- import { buildCommitIndex, inferLegacyPhases, recordsPhases } from '../memory/commitLogUtils.js';
13
- /**
14
- * Every `runtimeStageId` in the execution tree that the engine marked as a
15
- * subflow mount. Authoritative, as is a bundle's recorded `phase: 'exit'`
16
- * (9.39.0) — a mount with a merge-back records its exit as a continuation. A
17
- * mount without one has a single bundle, its own (no `phase`), so only the
18
- * tree names it. Only a log written before 9.39.0 AND handed over without its
19
- * tree falls back to the legacy inference (`inferLegacyPhases`).
20
- */
21
- function mountIdsFrom(tree) {
22
- const ids = new Set();
23
- if (!tree)
24
- return ids;
25
- const work = [tree];
26
- while (work.length > 0) {
27
- const node = work.pop();
28
- if (node.subflowId && node.runtimeStageId)
29
- ids.add(node.runtimeStageId);
30
- if (node.next)
31
- work.push(node.next);
32
- if (node.children)
33
- work.push(...node.children);
34
- }
35
- return ids;
36
- }
37
- /**
38
- * Derive one stop per executed stage from a recorded commit log.
39
- *
40
- * **One stop per `runtimeStageId`.** A stage can commit MORE than one bundle:
41
- * a subflow mount commits its output-mapping bundle and then its EXIT; a
42
- * parallel fork child is committed by the stage funnel and again by the
43
- * fan-out (its REPEAT), and siblings interleave. The writer names each
44
- * continuation on its bundle (`phase: 'exit' | 'repeat'`, 9.39.0), so the
45
- * grouping is read, never inferred: the axis shows the stage ONCE, at its
46
- * first commit ({@link buildCommitIndex}), which keeps `runtimeStageId → stop`
47
- * one-to-one — the property `jumpTo` and marks depend on. The FIRST bundle per
48
- * `runtimeStageId` is the stage's own and never carries a `phase`; a stage
49
- * whose bundles include an `'exit'` is a `'mount'`. A continuation is normally empty
50
- * (the first commit released the staging buffer); one that carries a write is
51
- * folded where it sits in the log, which is when it happened.
52
- *
53
- * **Stops PARTITION the log.** A stop's range runs from its own first commit
54
- * up to (and including) the last commit before the NEXT stop begins —
55
- * `lastCommitIdx`. Every bundle therefore belongs to exactly one stop, nothing
56
- * is orphaned, and `stateAt(stop)` is precisely the state that existed just
57
- * before the next stop's stage started. Folding through `commitIdx` instead
58
- * would silently drop a mount's output mapping.
59
- *
60
- * **Bookends.** `'start'` is the position before the first commit — the fold
61
- * base, which no commit index can otherwise address. `'end'` is "the run is
62
- * over"; it folds the whole log, the same as the last stage's stop, because
63
- * "after the last stage" and "the run finished" are the same state asked as
64
- * two different questions.
65
- *
66
- * An EMPTY log yields NO stops at all — not two bookends around nothing. A
67
- * cursor with nowhere to stand says so (`Move.reason === 'empty'`).
68
- *
69
- * **THE SHAPE IS A CONTRACT (9.18.0).** For a non-empty log the result is
70
- * `[start, …stages, end]` — `'start'` first, `'end'` last, one stop per
71
- * executed stage between them, in execution order — and for an empty log it
72
- * is `[]`. A strategy that COMPOSES this one (keep some stages, drop the rest)
73
- * rests on that shape; it is pinned by `test/lib/time-travel/`, and
74
- * {@link splitAxis} is the one guard that reads it — a composer calls that, or
75
- * {@link filterStops} which calls it, instead of writing its own.
76
- */
77
- export function commitStops(commitLog, executionTree, subflowResults) {
78
- if (commitLog.length === 0)
79
- return [];
80
- // No tree? The snapshot's `subflowResults` still keys every mount EXECUTION
81
- // by its runtimeStageId (9.39.0) — the mapper-less mounts whose one bundle
82
- // carries no `phase` (fork / selector children, lazy mounts, `parallelForEach`
83
- // branches) included.
84
- const mountIds = executionTree ? mountIdsFrom(executionTree) : mountKeysOf(subflowResults);
85
- const phases = phasesOf(commitLog, executionTree !== undefined);
86
- // First commit of each distinct runtimeStageId, in execution order — the
87
- // one index every reader shares (`buildCommitIndex`).
88
- // A subflow's `inputMapper` seed is not one of the subflow's stages: it is
89
- // the MOUNT's commit, made before any of them ran. It gets no stop of its
90
- // own; it belongs to the `'start'` bookend, which is where a reader looks
91
- // for "the input this chart began with" anyway. See {@link seedCommits}.
92
- const seeds = seedCommits(commitLog, executionTree);
93
- const firsts = [];
94
- for (const [id, i] of buildCommitIndex(commitLog))
95
- if (id && i >= seeds)
96
- firsts.push(i);
97
- const exits = new Set();
98
- for (let i = seeds; i < commitLog.length; i++)
99
- if (phases[i] === 'exit')
100
- exits.add(commitLog[i].runtimeStageId);
101
- const stops = [
102
- {
103
- step: 0,
104
- runtimeStageId: '',
105
- commitIdx: -1,
106
- // Covers the subflow input seed, when the log opens with one.
107
- lastCommitIdx: (firsts.length > 0 ? firsts[0] : commitLog.length) - 1,
108
- stageId: '',
109
- label: 'Run start',
110
- kind: 'start',
111
- },
112
- ];
113
- for (let g = 0; g < firsts.length; g++) {
114
- const first = firsts[g];
115
- const bundle = commitLog[first];
116
- // Partition boundary: everything up to the next stage's first commit.
117
- const last = g + 1 < firsts.length ? firsts[g + 1] - 1 : commitLog.length - 1;
118
- stops.push({
119
- step: stops.length,
120
- runtimeStageId: bundle.runtimeStageId,
121
- commitIdx: first,
122
- lastCommitIdx: last,
123
- stageId: bundle.stageId,
124
- subflowPath: parseRuntimeStageId(bundle.runtimeStageId).subflowPath,
125
- label: bundle.stage || bundle.stageId || bundle.runtimeStageId,
126
- kind: mountIds.has(bundle.runtimeStageId) || exits.has(bundle.runtimeStageId) ? 'mount' : 'commit',
127
- });
128
- }
129
- stops.push({
130
- step: stops.length,
131
- runtimeStageId: '',
132
- commitIdx: commitLog.length - 1,
133
- lastCommitIdx: commitLog.length - 1,
134
- stageId: '',
135
- label: 'Run end',
136
- kind: 'end',
137
- });
138
- return stops;
139
- }
140
- /** The per-execution mount keys of a snapshot's `subflowResults` (`'#'` keys; path keys skipped). */
141
- function mountKeysOf(subflowResults) {
142
- const ids = new Set();
143
- if (subflowResults === null || typeof subflowResults !== 'object')
144
- return ids;
145
- for (const key of Object.keys(subflowResults))
146
- if (isExecutionKey(key))
147
- ids.add(key);
148
- return ids;
149
- }
150
- /**
151
- * The phase of every bundle: as RECORDED when the log records any (9.39.0+).
152
- * A log that records none is either free of continuations (nothing to read)
153
- * or older than the field: with its execution tree the tree names the mounts,
154
- * so nothing is inferred; without it, the one legacy reader infers what
155
- * 9.38.0 inferred (`inferLegacyPhases`) — a stored recording keeps its axis.
156
- */
157
- function phasesOf(commitLog, haveTree) {
158
- if (recordsPhases(commitLog))
159
- return commitLog.map((bundle) => bundle.phase);
160
- return haveTree ? [] : inferLegacyPhases(commitLog);
161
- }
162
- /** `commitStops` as a {@link TimeTravelStrategy} — the default for `timeTravel`. */
163
- export const commitStopsStrategy = { stopsFor: commitStops };
164
- /**
165
- * How many commits at the head of a log are a subflow's input seed — 0 on a
166
- * run's own log. The seed is `history[0]` of the subflow's log, committed by
167
- * the MOUNT before any of the subflow's stages ran:
168
- *
169
- * - since R13 it carries the mount's runtimeStageId — and a mount's stage
170
- * address (the id before `#`) IS the subflow path of every stage in the
171
- * log it opens (`sub#2` opens `sub/in#3`; `outer/sub#5` opens
172
- * `outer/sub/in#6`), which no stage of that log can be;
173
- * - through 9.33.0 it carried `''`, which is still read the same way, so an
174
- * old recording keeps its axis.
175
- *
176
- * A log that holds ONLY the seed (the subflow committed no stage — it paused
177
- * or failed first) has no stage to compare with; the execution tree's root
178
- * stands in for it: a subflow's tree is rooted at one of its own stages,
179
- * whose id carries the same subflow path. Without a tree such a log reads as
180
- * one stop.
181
- */
182
- function seedCommits(commitLog, executionTree) {
183
- const head = commitLog[0]?.runtimeStageId;
184
- if (head === undefined)
185
- return 0;
186
- if (head === '') {
187
- let n = 0;
188
- while (n < commitLog.length && commitLog[n].runtimeStageId === '')
189
- n++;
190
- return n;
191
- }
192
- let next = 1;
193
- while (next < commitLog.length && commitLog[next].runtimeStageId === head)
194
- next++;
195
- const address = stageIdOf(head);
196
- if (next >= commitLog.length) {
197
- const rootId = executionTree?.id;
198
- return typeof rootId === 'string' && isWithinSubflow(rootId, address) ? next : 0;
199
- }
200
- return parseRuntimeStageId(commitLog[next].runtimeStageId).subflowPath === address ? next : 0;
201
- }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0U3RvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL2NvbW1pdFN0b3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUlqRzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBK0I7SUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3RCLE1BQU0sSUFBSSxHQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFHLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDeEUsSUFBSSxJQUFJLENBQUMsSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FB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QUFDLENBQUM7SUFDbkYsQ0FBQztJQUNELE9BQU8sbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGNvbW1pdFN0b3BzIOKAlCB0aGUgb25lIHN0cmF0ZWd5IGZvb3RwcmludGpzIHNoaXBzLlxuICpcbiAqIE9uZSBzdG9wIHBlciBleGVjdXRlZCBzdGFnZSwgaW4gZXhlY3V0aW9uIG9yZGVyLCBwbHVzIGAnc3RhcnQnYCAvIGAnZW5kJ2BcbiAqIGJvb2tlbmRzLiBJdCBpcyB0aGUgb25seSBzdG9wIGdyYW1tYXIgdGhlIHN1YnN0cmF0ZSBpdHNlbGYga25vd3M6IHRoZSBlbmdpbmVcbiAqIHN0YW1wcyBvbmUgYHJ1bnRpbWVTdGFnZUlkYCBwZXIgZXhlY3V0ZWQgc3RhZ2UsIGFuZCBhbiBlbXB0eSBjb21taXQgaXMgYVxuICogZGVsaWJlcmF0ZSBjdXJzb3Igc3RvcCwgbm90IG5vaXNlLiBSaWNoZXIgdm9jYWJ1bGFyaWVzIChtaWxlc3RvbmVzLCB0dXJucyxcbiAqIHRvb2wgY2FsbHMpIGJlbG9uZyB0byB0aGUgY29uc3VtZXIgdGhhdCBvd25zIHRoZW0g4oCUIHRoZXkgcGx1ZyBpbiB0aHJvdWdoXG4gKiBgVGltZVRyYXZlbFN0cmF0ZWd5YCwgdGhleSBkbyBub3QgZ28gaGVyZS5cbiAqL1xuXG5pbXBvcnQgeyBpc0V4ZWN1dGlvbktleSwgaXNXaXRoaW5TdWJmbG93LCBwYXJzZVJ1bnRpbWVTdGFnZUlkLCBzdGFnZUlkT2YgfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgYnVpbGRDb21taXRJbmRleCwgaW5mZXJMZWdhY3lQaGFzZXMsIHJlY29yZHNQaGFzZXMgfSBmcm9tICcuLi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIENvbW1pdFBoYXNlLCBFeGVjdXRpb25UcmVlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RvcCwgVGltZVRyYXZlbFN0cmF0ZWd5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogRXZlcnkgYHJ1bnRpbWVTdGFnZUlkYCBpbiB0aGUgZXhlY3V0aW9uIHRyZWUgdGhhdCB0aGUgZW5naW5lIG1hcmtlZCBhcyBhXG4gKiBzdWJmbG93IG1vdW50LiBBdXRob3JpdGF0aXZlLCBhcyBpcyBhIGJ1bmRsZSdzIHJlY29yZGVkIGBwaGFzZTogJ2V4aXQnYFxuICogKDkuMzkuMCkg4oCUIGEgbW91bnQgd2l0aCBhIG1lcmdlLWJhY2sgcmVjb3JkcyBpdHMgZXhpdCBhcyBhIGNvbnRpbnVhdGlvbi4gQVxuICogbW91bnQgd2l0aG91dCBvbmUgaGFzIGEgc2luZ2xlIGJ1bmRsZSwgaXRzIG93biAobm8gYHBoYXNlYCksIHNvIG9ubHkgdGhlXG4gKiB0cmVlIG5hbWVzIGl0LiBPbmx5IGEgbG9nIHdyaXR0ZW4gYmVmb3JlIDkuMzkuMCBBTkQgaGFuZGVkIG92ZXIgd2l0aG91dCBpdHNcbiAqIHRyZWUgZmFsbHMgYmFjayB0byB0aGUgbGVnYWN5IGluZmVyZW5jZSAoYGluZmVyTGVnYWN5UGhhc2VzYCkuXG4gKi9cbmZ1bmN0aW9uIG1vdW50SWRzRnJvbSh0cmVlOiBFeGVjdXRpb25UcmVlIHwgdW5kZWZpbmVkKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgaWYgKCF0cmVlKSByZXR1cm4gaWRzO1xuICBjb25zdCB3b3JrOiBFeGVjdXRpb25UcmVlW10gPSBbdHJlZV07XG4gIHdoaWxlICh3b3JrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gd29yay5wb3AoKSE7XG4gICAgaWYgKG5vZGUuc3ViZmxvd0lkICYmIG5vZGUucnVudGltZVN0YWdlSWQpIGlkcy5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgaWYgKG5vZGUubmV4dCkgd29yay5wdXNoKG5vZGUubmV4dCk7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHdvcmsucHVzaCguLi5ub2RlLmNoaWxkcmVuKTtcbiAgfVxuICByZXR1cm4gaWRzO1xufVxuXG4vKipcbiAqIERlcml2ZSBvbmUgc3RvcCBwZXIgZXhlY3V0ZWQgc3RhZ2UgZnJvbSBhIHJlY29yZGVkIGNvbW1pdCBsb2cuXG4gKlxuICogKipPbmUgc3RvcCBwZXIgYHJ1bnRpbWVTdGFnZUlkYC4qKiBBIHN0YWdlIGNhbiBjb21taXQgTU9SRSB0aGFuIG9uZSBidW5kbGU6XG4gKiBhIHN1YmZsb3cgbW91bnQgY29tbWl0cyBpdHMgb3V0cHV0LW1hcHBpbmcgYnVuZGxlIGFuZCB0aGVuIGl0cyBFWElUOyBhXG4gKiBwYXJhbGxlbCBmb3JrIGNoaWxkIGlzIGNvbW1pdHRlZCBieSB0aGUgc3RhZ2UgZnVubmVsIGFuZCBhZ2FpbiBieSB0aGVcbiAqIGZhbi1vdXQgKGl0cyBSRVBFQVQpLCBhbmQgc2libGluZ3MgaW50ZXJsZWF2ZS4gVGhlIHdyaXRlciBuYW1lcyBlYWNoXG4gKiBjb250aW51YXRpb24gb24gaXRzIGJ1bmRsZSAoYHBoYXNlOiAnZXhpdCcgfCAncmVwZWF0J2AsIDkuMzkuMCksIHNvIHRoZVxuICogZ3JvdXBpbmcgaXMgcmVhZCwgbmV2ZXIgaW5mZXJyZWQ6IHRoZSBheGlzIHNob3dzIHRoZSBzdGFnZSBPTkNFLCBhdCBpdHNcbiAqIGZpcnN0IGNvbW1pdCAoe0BsaW5rIGJ1aWxkQ29tbWl0SW5kZXh9KSwgd2hpY2gga2VlcHMgYHJ1bnRpbWVTdGFnZUlkIOKGkiBzdG9wYFxuICogb25lLXRvLW9uZSDigJQgdGhlIHByb3BlcnR5IGBqdW1wVG9gIGFuZCBtYXJrcyBkZXBlbmQgb24uIFRoZSBGSVJTVCBidW5kbGUgcGVyXG4gKiBgcnVudGltZVN0YWdlSWRgIGlzIHRoZSBzdGFnZSdzIG93biBhbmQgbmV2ZXIgY2FycmllcyBhIGBwaGFzZWA7IGEgc3RhZ2VcbiAqIHdob3NlIGJ1bmRsZXMgaW5jbHVkZSBhbiBgJ2V4aXQnYCBpcyBhIGAnbW91bnQnYC4gQSBjb250aW51YXRpb24gaXMgbm9ybWFsbHkgZW1wdHlcbiAqICh0aGUgZmlyc3QgY29tbWl0IHJlbGVhc2VkIHRoZSBzdGFnaW5nIGJ1ZmZlcik7IG9uZSB0aGF0IGNhcnJpZXMgYSB3cml0ZSBpc1xuICogZm9sZGVkIHdoZXJlIGl0IHNpdHMgaW4gdGhlIGxvZywgd2hpY2ggaXMgd2hlbiBpdCBoYXBwZW5lZC5cbiAqXG4gKiAqKlN0b3BzIFBBUlRJVElPTiB0aGUgbG9nLioqIEEgc3RvcCdzIHJhbmdlIHJ1bnMgZnJvbSBpdHMgb3duIGZpcnN0IGNvbW1pdFxuICogdXAgdG8gKGFuZCBpbmNsdWRpbmcpIHRoZSBsYXN0IGNvbW1pdCBiZWZvcmUgdGhlIE5FWFQgc3RvcCBiZWdpbnMg4oCUXG4gKiBgbGFzdENvbW1pdElkeGAuIEV2ZXJ5IGJ1bmRsZSB0aGVyZWZvcmUgYmVsb25ncyB0byBleGFjdGx5IG9uZSBzdG9wLCBub3RoaW5nXG4gKiBpcyBvcnBoYW5lZCwgYW5kIGBzdGF0ZUF0KHN0b3ApYCBpcyBwcmVjaXNlbHkgdGhlIHN0YXRlIHRoYXQgZXhpc3RlZCBqdXN0XG4gKiBiZWZvcmUgdGhlIG5leHQgc3RvcCdzIHN0YWdlIHN0YXJ0ZWQuIEZvbGRpbmcgdGhyb3VnaCBgY29tbWl0SWR4YCBpbnN0ZWFkXG4gKiB3b3VsZCBzaWxlbnRseSBkcm9wIGEgbW91bnQncyBvdXRwdXQgbWFwcGluZy5cbiAqXG4gKiAqKkJvb2tlbmRzLioqIGAnc3RhcnQnYCBpcyB0aGUgcG9zaXRpb24gYmVmb3JlIHRoZSBmaXJzdCBjb21taXQg4oCUIHRoZSBmb2xkXG4gKiBiYXNlLCB3aGljaCBubyBjb21taXQgaW5kZXggY2FuIG90aGVyd2lzZSBhZGRyZXNzLiBgJ2VuZCdgIGlzIFwidGhlIHJ1biBpc1xuICogb3ZlclwiOyBpdCBmb2xkcyB0aGUgd2hvbGUgbG9nLCB0aGUgc2FtZSBhcyB0aGUgbGFzdCBzdGFnZSdzIHN0b3AsIGJlY2F1c2VcbiAqIFwiYWZ0ZXIgdGhlIGxhc3Qgc3RhZ2VcIiBhbmQgXCJ0aGUgcnVuIGZpbmlzaGVkXCIgYXJlIHRoZSBzYW1lIHN0YXRlIGFza2VkIGFzXG4gKiB0d28gZGlmZmVyZW50IHF1ZXN0aW9ucy5cbiAqXG4gKiBBbiBFTVBUWSBsb2cgeWllbGRzIE5PIHN0b3BzIGF0IGFsbCDigJQgbm90IHR3byBib29rZW5kcyBhcm91bmQgbm90aGluZy4gQVxuICogY3Vyc29yIHdpdGggbm93aGVyZSB0byBzdGFuZCBzYXlzIHNvIChgTW92ZS5yZWFzb24gPT09ICdlbXB0eSdgKS5cbiAqXG4gKiAqKlRIRSBTSEFQRSBJUyBBIENPTlRSQUNUICg5LjE4LjApLioqIEZvciBhIG5vbi1lbXB0eSBsb2cgdGhlIHJlc3VsdCBpc1xuICogYFtzdGFydCwg4oCmc3RhZ2VzLCBlbmRdYCDigJQgYCdzdGFydCdgIGZpcnN0LCBgJ2VuZCdgIGxhc3QsIG9uZSBzdG9wIHBlclxuICogZXhlY3V0ZWQgc3RhZ2UgYmV0d2VlbiB0aGVtLCBpbiBleGVjdXRpb24gb3JkZXIg4oCUIGFuZCBmb3IgYW4gZW1wdHkgbG9nIGl0XG4gKiBpcyBgW11gLiBBIHN0cmF0ZWd5IHRoYXQgQ09NUE9TRVMgdGhpcyBvbmUgKGtlZXAgc29tZSBzdGFnZXMsIGRyb3AgdGhlIHJlc3QpXG4gKiByZXN0cyBvbiB0aGF0IHNoYXBlOyBpdCBpcyBwaW5uZWQgYnkgYHRlc3QvbGliL3RpbWUtdHJhdmVsL2AsIGFuZFxuICoge0BsaW5rIHNwbGl0QXhpc30gaXMgdGhlIG9uZSBndWFyZCB0aGF0IHJlYWRzIGl0IOKAlCBhIGNvbXBvc2VyIGNhbGxzIHRoYXQsIG9yXG4gKiB7QGxpbmsgZmlsdGVyU3RvcHN9IHdoaWNoIGNhbGxzIGl0LCBpbnN0ZWFkIG9mIHdyaXRpbmcgaXRzIG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdFN0b3BzKFxuICBjb21taXRMb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLFxuICBleGVjdXRpb25UcmVlPzogRXhlY3V0aW9uVHJlZSxcbiAgc3ViZmxvd1Jlc3VsdHM/OiB1bmtub3duLFxuKTogU3RvcFtdIHtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAvLyBObyB0cmVlPyBUaGUgc25hcHNob3QncyBgc3ViZmxvd1Jlc3VsdHNgIHN0aWxsIGtleXMgZXZlcnkgbW91bnQgRVhFQ1VUSU9OXG4gIC8vIGJ5IGl0cyBydW50aW1lU3RhZ2VJZCAoOS4zOS4wKSDigJQgdGhlIG1hcHBlci1sZXNzIG1vdW50cyB3aG9zZSBvbmUgYnVuZGxlXG4gIC8vIGNhcnJpZXMgbm8gYHBoYXNlYCAoZm9yayAvIHNlbGVjdG9yIGNoaWxkcmVuLCBsYXp5IG1vdW50cywgYHBhcmFsbGVsRm9yRWFjaGBcbiAgLy8gYnJhbmNoZXMpIGluY2x1ZGVkLlxuICBjb25zdCBtb3VudElkcyA9IGV4ZWN1dGlvblRyZWUgPyBtb3VudElkc0Zyb20oZXhlY3V0aW9uVHJlZSkgOiBtb3VudEtleXNPZihzdWJmbG93UmVzdWx0cyk7XG4gIGNvbnN0IHBoYXNlcyA9IHBoYXNlc09mKGNvbW1pdExvZywgZXhlY3V0aW9uVHJlZSAhPT0gdW5kZWZpbmVkKTtcblxuICAvLyBGaXJzdCBjb21taXQgb2YgZWFjaCBkaXN0aW5jdCBydW50aW1lU3RhZ2VJZCwgaW4gZXhlY3V0aW9uIG9yZGVyIOKAlCB0aGVcbiAgLy8gb25lIGluZGV4IGV2ZXJ5IHJlYWRlciBzaGFyZXMgKGBidWlsZENvbW1pdEluZGV4YCkuXG4gIC8vIEEgc3ViZmxvdydzIGBpbnB1dE1hcHBlcmAgc2VlZCBpcyBub3Qgb25lIG9mIHRoZSBzdWJmbG93J3Mgc3RhZ2VzOiBpdCBpc1xuICAvLyB0aGUgTU9VTlQncyBjb21taXQsIG1hZGUgYmVmb3JlIGFueSBvZiB0aGVtIHJhbi4gSXQgZ2V0cyBubyBzdG9wIG9mIGl0c1xuICAvLyBvd247IGl0IGJlbG9uZ3MgdG8gdGhlIGAnc3RhcnQnYCBib29rZW5kLCB3aGljaCBpcyB3aGVyZSBhIHJlYWRlciBsb29rc1xuICAvLyBmb3IgXCJ0aGUgaW5wdXQgdGhpcyBjaGFydCBiZWdhbiB3aXRoXCIgYW55d2F5LiBTZWUge0BsaW5rIHNlZWRDb21taXRzfS5cbiAgY29uc3Qgc2VlZHMgPSBzZWVkQ29tbWl0cyhjb21taXRMb2csIGV4ZWN1dGlvblRyZWUpO1xuICBjb25zdCBmaXJzdHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgW2lkLCBpXSBvZiBidWlsZENvbW1pdEluZGV4KGNvbW1pdExvZykpIGlmIChpZCAmJiBpID49IHNlZWRzKSBmaXJzdHMucHVzaChpKTtcbiAgY29uc3QgZXhpdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChsZXQgaSA9IHNlZWRzOyBpIDwgY29tbWl0TG9nLmxlbmd0aDsgaSsrKSBpZiAocGhhc2VzW2ldID09PSAnZXhpdCcpIGV4aXRzLmFkZChjb21taXRMb2dbaV0ucnVudGltZVN0YWdlSWQpO1xuXG4gIGNvbnN0IHN0b3BzOiBTdG9wW10gPSBbXG4gICAge1xuICAgICAgc3RlcDogMCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiAnJyxcbiAgICAgIGNvbW1pdElkeDogLTEsXG4gICAgICAvLyBDb3ZlcnMgdGhlIHN1YmZsb3cgaW5wdXQgc2VlZCwgd2hlbiB0aGUgbG9nIG9wZW5zIHdpdGggb25lLlxuICAgICAgbGFzdENvbW1pdElkeDogKGZpcnN0cy5sZW5ndGggPiAwID8gZmlyc3RzWzBdIDogY29tbWl0TG9nLmxlbmd0aCkgLSAxLFxuICAgICAgc3RhZ2VJZDogJycsXG4gICAgICBsYWJlbDogJ1J1biBzdGFydCcsXG4gICAgICBraW5kOiAnc3RhcnQnLFxuICAgIH0sXG4gIF07XG5cbiAgZm9yIChsZXQgZyA9IDA7IGcgPCBmaXJzdHMubGVuZ3RoOyBnKyspIHtcbiAgICBjb25zdCBmaXJzdCA9IGZpcnN0c1tnXTtcbiAgICBjb25zdCBidW5kbGUgPSBjb21taXRMb2dbZmlyc3RdO1xuICAgIC8vIFBhcnRpdGlvbiBib3VuZGFyeTogZXZlcnl0aGluZyB1cCB0byB0aGUgbmV4dCBzdGFnZSdzIGZpcnN0IGNvbW1pdC5cbiAgICBjb25zdCBsYXN0ID0gZyArIDEgPCBmaXJzdHMubGVuZ3RoID8gZmlyc3RzW2cgKyAxXSAtIDEgOiBjb21taXRMb2cubGVuZ3RoIC0gMTtcbiAgICBzdG9wcy5wdXNoKHtcbiAgICAgIHN0ZXA6IHN0b3BzLmxlbmd0aCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBidW5kbGUucnVudGltZVN0YWdlSWQsXG4gICAgICBjb21taXRJZHg6IGZpcnN0LFxuICAgICAgbGFzdENvbW1pdElkeDogbGFzdCxcbiAgICAgIHN0YWdlSWQ6IGJ1bmRsZS5zdGFnZUlkLFxuICAgICAgc3ViZmxvd1BhdGg6IHBhcnNlUnVudGltZVN0YWdlSWQoYnVuZGxlLnJ1bnRpbWVTdGFnZUlkKS5zdWJmbG93UGF0aCxcbiAgICAgIGxhYmVsOiBidW5kbGUuc3RhZ2UgfHwgYnVuZGxlLnN0YWdlSWQgfHwgYnVuZGxlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAga2luZDogbW91bnRJZHMuaGFzKGJ1bmRsZS5ydW50aW1lU3RhZ2VJZCkgfHwgZXhpdHMuaGFzKGJ1bmRsZS5ydW50aW1lU3RhZ2VJZCkgPyAnbW91bnQnIDogJ2NvbW1pdCcsXG4gICAgfSk7XG4gIH1cblxuICBzdG9wcy5wdXNoKHtcbiAgICBzdGVwOiBzdG9wcy5sZW5ndGgsXG4gICAgcnVudGltZVN0YWdlSWQ6ICcnLFxuICAgIGNvbW1pdElkeDogY29tbWl0TG9nLmxlbmd0aCAtIDEsXG4gICAgbGFzdENvbW1pdElkeDogY29tbWl0TG9nLmxlbmd0aCAtIDEsXG4gICAgc3RhZ2VJZDogJycsXG4gICAgbGFiZWw6ICdSdW4gZW5kJyxcbiAgICBraW5kOiAnZW5kJyxcbiAgfSk7XG5cbiAgcmV0dXJuIHN0b3BzO1xufVxuXG4vKiogVGhlIHBlci1leGVjdXRpb24gbW91bnQga2V5cyBvZiBhIHNuYXBzaG90J3MgYHN1YmZsb3dSZXN1bHRzYCAoYCcjJ2Aga2V5czsgcGF0aCBrZXlzIHNraXBwZWQpLiAqL1xuZnVuY3Rpb24gbW91bnRLZXlzT2Yoc3ViZmxvd1Jlc3VsdHM6IHVua25vd24pOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoc3ViZmxvd1Jlc3VsdHMgPT09IG51bGwgfHwgdHlwZW9mIHN1YmZsb3dSZXN1bHRzICE9PSAnb2JqZWN0JykgcmV0dXJuIGlkcztcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc3ViZmxvd1Jlc3VsdHMpKSBpZiAoaXNFeGVjdXRpb25LZXkoa2V5KSkgaWRzLmFkZChrZXkpO1xuICByZXR1cm4gaWRzO1xufVxuXG4vKipcbiAqIFRoZSBwaGFzZSBvZiBldmVyeSBidW5kbGU6IGFzIFJFQ09SREVEIHdoZW4gdGhlIGxvZyByZWNvcmRzIGFueSAoOS4zOS4wKykuXG4gKiBBIGxvZyB0aGF0IHJlY29yZHMgbm9uZSBpcyBlaXRoZXIgZnJlZSBvZiBjb250aW51YXRpb25zIChub3RoaW5nIHRvIHJlYWQpXG4gKiBvciBvbGRlciB0aGFuIHRoZSBmaWVsZDogd2l0aCBpdHMgZXhlY3V0aW9uIHRyZWUgdGhlIHRyZWUgbmFtZXMgdGhlIG1vdW50cyxcbiAqIHNvIG5vdGhpbmcgaXMgaW5mZXJyZWQ7IHdpdGhvdXQgaXQsIHRoZSBvbmUgbGVnYWN5IHJlYWRlciBpbmZlcnMgd2hhdFxuICogOS4zOC4wIGluZmVycmVkIChgaW5mZXJMZWdhY3lQaGFzZXNgKSDigJQgYSBzdG9yZWQgcmVjb3JkaW5nIGtlZXBzIGl0cyBheGlzLlxuICovXG5mdW5jdGlvbiBwaGFzZXNPZihjb21taXRMb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBoYXZlVHJlZTogYm9vbGVhbik6IHJlYWRvbmx5IChDb21taXRQaGFzZSB8IHVuZGVmaW5lZClbXSB7XG4gIGlmIChyZWNvcmRzUGhhc2VzKGNvbW1pdExvZykpIHJldHVybiBjb21taXRMb2cubWFwKChidW5kbGUpID0+IGJ1bmRsZS5waGFzZSk7XG4gIHJldHVybiBoYXZlVHJlZSA/IFtdIDogaW5mZXJMZWdhY3lQaGFzZXMoY29tbWl0TG9nKTtcbn1cblxuLyoqIGBjb21taXRTdG9wc2AgYXMgYSB7QGxpbmsgVGltZVRyYXZlbFN0cmF0ZWd5fSDigJQgdGhlIGRlZmF1bHQgZm9yIGB0aW1lVHJhdmVsYC4gKi9cbmV4cG9ydCBjb25zdCBjb21taXRTdG9wc1N0cmF0ZWd5OiBUaW1lVHJhdmVsU3RyYXRlZ3kgPSB7IHN0b3BzRm9yOiBjb21taXRTdG9wcyB9O1xuXG4vKipcbiAqIEhvdyBtYW55IGNvbW1pdHMgYXQgdGhlIGhlYWQgb2YgYSBsb2cgYXJlIGEgc3ViZmxvdydzIGlucHV0IHNlZWQg4oCUIDAgb24gYVxuICogcnVuJ3Mgb3duIGxvZy4gVGhlIHNlZWQgaXMgYGhpc3RvcnlbMF1gIG9mIHRoZSBzdWJmbG93J3MgbG9nLCBjb21taXR0ZWQgYnlcbiAqIHRoZSBNT1VOVCBiZWZvcmUgYW55IG9mIHRoZSBzdWJmbG93J3Mgc3RhZ2VzIHJhbjpcbiAqXG4gKiAtIHNpbmNlIFIxMyBpdCBjYXJyaWVzIHRoZSBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBhbmQgYSBtb3VudCdzIHN0YWdlXG4gKiAgIGFkZHJlc3MgKHRoZSBpZCBiZWZvcmUgYCNgKSBJUyB0aGUgc3ViZmxvdyBwYXRoIG9mIGV2ZXJ5IHN0YWdlIGluIHRoZVxuICogICBsb2cgaXQgb3BlbnMgKGBzdWIjMmAgb3BlbnMgYHN1Yi9pbiMzYDsgYG91dGVyL3N1YiM1YCBvcGVuc1xuICogICBgb3V0ZXIvc3ViL2luIzZgKSwgd2hpY2ggbm8gc3RhZ2Ugb2YgdGhhdCBsb2cgY2FuIGJlO1xuICogLSB0aHJvdWdoIDkuMzMuMCBpdCBjYXJyaWVkIGAnJ2AsIHdoaWNoIGlzIHN0aWxsIHJlYWQgdGhlIHNhbWUgd2F5LCBzbyBhblxuICogICBvbGQgcmVjb3JkaW5nIGtlZXBzIGl0cyBheGlzLlxuICpcbiAqIEEgbG9nIHRoYXQgaG9sZHMgT05MWSB0aGUgc2VlZCAodGhlIHN1YmZsb3cgY29tbWl0dGVkIG5vIHN0YWdlIOKAlCBpdCBwYXVzZWRcbiAqIG9yIGZhaWxlZCBmaXJzdCkgaGFzIG5vIHN0YWdlIHRvIGNvbXBhcmUgd2l0aDsgdGhlIGV4ZWN1dGlvbiB0cmVlJ3Mgcm9vdFxuICogc3RhbmRzIGluIGZvciBpdDogYSBzdWJmbG93J3MgdHJlZSBpcyByb290ZWQgYXQgb25lIG9mIGl0cyBvd24gc3RhZ2VzLFxuICogd2hvc2UgaWQgY2FycmllcyB0aGUgc2FtZSBzdWJmbG93IHBhdGguIFdpdGhvdXQgYSB0cmVlIHN1Y2ggYSBsb2cgcmVhZHMgYXNcbiAqIG9uZSBzdG9wLlxuICovXG5mdW5jdGlvbiBzZWVkQ29tbWl0cyhjb21taXRMb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBleGVjdXRpb25UcmVlPzogRXhlY3V0aW9uVHJlZSk6IG51bWJlciB7XG4gIGNvbnN0IGhlYWQgPSBjb21taXRMb2dbMF0/LnJ1bnRpbWVTdGFnZUlkO1xuICBpZiAoaGVhZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgaWYgKGhlYWQgPT09ICcnKSB7XG4gICAgbGV0IG4gPSAwO1xuICAgIHdoaWxlIChuIDwgY29tbWl0TG9nLmxlbmd0aCAmJiBjb21taXRMb2dbbl0ucnVudGltZVN0YWdlSWQgPT09ICcnKSBuKys7XG4gICAgcmV0dXJuIG47XG4gIH1cbiAgbGV0IG5leHQgPSAxO1xuICB3aGlsZSAobmV4dCA8IGNvbW1pdExvZy5sZW5ndGggJiYgY29tbWl0TG9nW25leHRdLnJ1bnRpbWVTdGFnZUlkID09PSBoZWFkKSBuZXh0Kys7XG4gIGNvbnN0IGFkZHJlc3MgPSBzdGFnZUlkT2YoaGVhZCk7XG4gIGlmIChuZXh0ID49IGNvbW1pdExvZy5sZW5ndGgpIHtcbiAgICBjb25zdCByb290SWQgPSBleGVjdXRpb25UcmVlPy5pZDtcbiAgICByZXR1cm4gdHlwZW9mIHJvb3RJZCA9PT0gJ3N0cmluZycgJiYgaXNXaXRoaW5TdWJmbG93KHJvb3RJZCwgYWRkcmVzcykgPyBuZXh0IDogMDtcbiAgfVxuICByZXR1cm4gcGFyc2VSdW50aW1lU3RhZ2VJZChjb21taXRMb2dbbmV4dF0ucnVudGltZVN0YWdlSWQpLnN1YmZsb3dQYXRoID09PSBhZGRyZXNzID8gbmV4dCA6IDA7XG59XG4iXX0=
@@ -1,22 +0,0 @@
1
- /**
2
- * time-travel/ — the reader's cursor over a finished trace.
3
- *
4
- * Time travel here is READ-TIME: a cursor over a Trace that has already
5
- * happened, with a Fold at each stop. It is not the Walker and never becomes a
6
- * second live cursor — nothing in this folder can move, re-run or mutate an
7
- * execution.
8
- *
9
- * See README.md for the five laws, the strategy seam, and a worked example of
10
- * every export.
11
- *
12
- * DAG position: memory ← time-travel (plus `ids/runtimeStageId`, the
13
- * zero-dependency id grammar).
14
- */
15
- export type { StopFilter } from './axis.js';
16
- export { filterStops, splitAxis } from './axis.js';
17
- export { isCommitBundle } from './bundles.js';
18
- export { commitStops, commitStopsStrategy } from './commitStops.js';
19
- export { stateAt } from './stateAt.js';
20
- export { tagStops } from './tagStops.js';
21
- export { timeTravel } from './timeTravel.js';
22
- export type { AxisRefusal, AxisSplit, BookendedAxis, FoldBasis, FoldedState, FoldSource, LogGap, Mark, Move, MoveRefusal, Stop, StopKind, TimeTravel, TimeTravelOptions, TimeTravelSource, TimeTravelStrategy, } from './types.js';
@@ -1,21 +0,0 @@
1
- /**
2
- * time-travel/ — the reader's cursor over a finished trace.
3
- *
4
- * Time travel here is READ-TIME: a cursor over a Trace that has already
5
- * happened, with a Fold at each stop. It is not the Walker and never becomes a
6
- * second live cursor — nothing in this folder can move, re-run or mutate an
7
- * execution.
8
- *
9
- * See README.md for the five laws, the strategy seam, and a worked example of
10
- * every export.
11
- *
12
- * DAG position: memory ← time-travel (plus `ids/runtimeStageId`, the
13
- * zero-dependency id grammar).
14
- */
15
- export { filterStops, splitAxis } from './axis.js';
16
- export { isCommitBundle } from './bundles.js';
17
- export { commitStops, commitStopsStrategy } from './commitStops.js';
18
- export { stateAt } from './stateAt.js';
19
- export { tagStops } from './tagStops.js';
20
- export { timeTravel } from './timeTravel.js';
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0aW1lLXRyYXZlbC8g4oCUIHRoZSByZWFkZXIncyBjdXJzb3Igb3ZlciBhIGZpbmlzaGVkIHRyYWNlLlxuICpcbiAqIFRpbWUgdHJhdmVsIGhlcmUgaXMgUkVBRC1USU1FOiBhIGN1cnNvciBvdmVyIGEgVHJhY2UgdGhhdCBoYXMgYWxyZWFkeVxuICogaGFwcGVuZWQsIHdpdGggYSBGb2xkIGF0IGVhY2ggc3RvcC4gSXQgaXMgbm90IHRoZSBXYWxrZXIgYW5kIG5ldmVyIGJlY29tZXMgYVxuICogc2Vjb25kIGxpdmUgY3Vyc29yIOKAlCBub3RoaW5nIGluIHRoaXMgZm9sZGVyIGNhbiBtb3ZlLCByZS1ydW4gb3IgbXV0YXRlIGFuXG4gKiBleGVjdXRpb24uXG4gKlxuICogU2VlIFJFQURNRS5tZCBmb3IgdGhlIGZpdmUgbGF3cywgdGhlIHN0cmF0ZWd5IHNlYW0sIGFuZCBhIHdvcmtlZCBleGFtcGxlIG9mXG4gKiBldmVyeSBleHBvcnQuXG4gKlxuICogREFHIHBvc2l0aW9uOiBtZW1vcnkg4oaQIHRpbWUtdHJhdmVsIChwbHVzIGBpZHMvcnVudGltZVN0YWdlSWRgLCB0aGVcbiAqIHplcm8tZGVwZW5kZW5jeSBpZCBncmFtbWFyKS5cbiAqL1xuXG5leHBvcnQgdHlwZSB7IFN0b3BGaWx0ZXIgfSBmcm9tICcuL2F4aXMuanMnO1xuZXhwb3J0IHsgZmlsdGVyU3RvcHMsIHNwbGl0QXhpcyB9IGZyb20gJy4vYXhpcy5qcyc7XG5leHBvcnQgeyBpc0NvbW1pdEJ1bmRsZSB9IGZyb20gJy4vYnVuZGxlcy5qcyc7XG5leHBvcnQgeyBjb21taXRTdG9wcywgY29tbWl0U3RvcHNTdHJhdGVneSB9IGZyb20gJy4vY29tbWl0U3RvcHMuanMnO1xuZXhwb3J0IHsgc3RhdGVBdCB9IGZyb20gJy4vc3RhdGVBdC5qcyc7XG5leHBvcnQgeyB0YWdTdG9wcyB9IGZyb20gJy4vdGFnU3RvcHMuanMnO1xuZXhwb3J0IHsgdGltZVRyYXZlbCB9IGZyb20gJy4vdGltZVRyYXZlbC5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEF4aXNSZWZ1c2FsLFxuICBBeGlzU3BsaXQsXG4gIEJvb2tlbmRlZEF4aXMsXG4gIEZvbGRCYXNpcyxcbiAgRm9sZGVkU3RhdGUsXG4gIEZvbGRTb3VyY2UsXG4gIExvZ0dhcCxcbiAgTWFyayxcbiAgTW92ZSxcbiAgTW92ZVJlZnVzYWwsXG4gIFN0b3AsXG4gIFN0b3BLaW5kLFxuICBUaW1lVHJhdmVsLFxuICBUaW1lVHJhdmVsT3B0aW9ucyxcbiAgVGltZVRyYXZlbFNvdXJjZSxcbiAgVGltZVRyYXZlbFN0cmF0ZWd5LFxufSBmcm9tICcuL3R5cGVzLmpzJztcbiJdfQ==
@@ -1,102 +0,0 @@
1
- /**
2
- * stateAt — the fold at a stop.
3
- *
4
- * The commit log stores DIFFS. Replaying them onto the run's fold base
5
- * reproduces the state as it stood after any commit — byte-for-byte the state
6
- * the next stage saw, in both `commitValues` encodings, because the replay
7
- * runs through `applySmartMergeInto`, the one verb law (`memory/verbs.ts`) the
8
- * live commit itself uses. There is deliberately no second implementation of
9
- * the verbs here.
10
- */
11
- import type { CommitBundle } from '../memory/types.js';
12
- import type { FoldedState, FoldSource, LogGap } from './types.js';
13
- /** One source, read: its log (gaps held in place) and its fold base. */
14
- export interface ReadSource {
15
- readonly log: readonly CommitBundle[];
16
- readonly gaps: readonly LogGap[];
17
- readonly base: Record<string, unknown> | undefined;
18
- }
19
- /**
20
- * Read whichever shape the caller handed us — `commitLog` (a run snapshot) or
21
- * `history` (a subflow's own log) — narrowing the rows to commit bundles as it
22
- * goes (see `bundles.ts`: a row that is not one becomes an index-holding gap).
23
- */
24
- export declare function readSource(source: FoldSource | undefined): ReadSource;
25
- /**
26
- * Fold one chain of legs: every leg BEFORE `legIdx` in full, then `legIdx`
27
- * through `through`.
28
- *
29
- * THE LEG RULE. A leg that carries its own `initialState` RESTARTS the
30
- * accumulation from it — on a pause/resume that base IS the state at the
31
- * pause, recorded by the engine, and is authoritative over anything the
32
- * previous leg's log rebuilt. A leg with no base (a pre-9.17 snapshot, a
33
- * hand-built log) CONTINUES from what the earlier legs folded, which is the
34
- * best honest answer available and is exactly what `basis` then reports.
35
- *
36
- * With a single leg this is the 9.17.0 fold, unchanged.
37
- */
38
- export declare function foldLegs(legs: readonly ReadSource[], legIdx: number, through: number): FoldedState;
39
- /**
40
- * What a fold leaves behind for the NEXT one (9.25.0): the private working
41
- * copy and the facts accumulated so far. A cursor stepping forward on the
42
- * same leg hands it back and only the bundles after `through` are applied —
43
- * one bundle per step instead of a replay from the base. Any other ask (an
44
- * earlier stop, another leg) folds from scratch; the memo is never a claim.
45
- */
46
- export interface FoldMemo {
47
- readonly legIdx: number;
48
- readonly through: number;
49
- readonly out: Record<string, unknown>;
50
- readonly based: boolean;
51
- readonly redactedPaths: ReadonlySet<string>;
52
- readonly skipped: readonly LogGap[] | undefined;
53
- }
54
- /**
55
- * The fold, resumable. ONE clone per fold: the base is cloned once (or `{}`
56
- * stands in), every bundle is applied INTO that copy, and the state handed
57
- * out is one more clone, frozen — so the working copy stays private and a
58
- * later step can continue from it. Same answer as the 9.17.0 fold, pinned by
59
- * test/lib/time-travel/fold-memo.test.ts against a fresh fold at every stop.
60
- */
61
- export declare function foldLegsFrom(legs: readonly ReadSource[], legIdx: number, through: number, memo?: FoldMemo): {
62
- readonly folded: FoldedState;
63
- readonly memo: FoldMemo;
64
- };
65
- /**
66
- * Fold `source`'s log from its base up to and including `commitIdx`.
67
- *
68
- * @param source A run snapshot (`commitLog` + `initialState`) or a subflow
69
- * subtree (`history` + `initialState`). Both spellings work,
70
- * and the rows may be unvalidated (`unknown[]`) — a row that
71
- * is not a commit bundle is skipped and REPORTED, by index,
72
- * in {@link FoldedState.skipped}, never crashed on.
73
- * @param commitIdx ARRAY INDEX of the last bundle to fold, inclusive. `-1`
74
- * (or any negative) folds nothing and returns the base —
75
- * the state before the run's first commit. Past the end
76
- * clamps to the end; the result's `throughCommitIdx` reports
77
- * where the fold actually stopped.
78
- *
79
- * @returns A detached, deeply frozen state plus how it was derived: `basis`
80
- * says whether the real fold base was available, `redacted` /
81
- * `redactedPaths` say where the log was scrubbed at write time, and
82
- * `skipped` says which rows could not be read. The engine redacts values as
83
- * it records them, so a replay of a redacted run yields `'REDACTED'` in
84
- * those places — correct, and said out loud rather than presented as the
85
- * real value.
86
- *
87
- * @example
88
- * ```typescript
89
- * const snapshot = executor.getSnapshot();
90
- * const { state, basis } = stateAt(snapshot, 3); // after the 4th commit
91
- * console.log(basis, state); // 'initial+log' { ... }
92
- *
93
- * // A subflow's own log folds identically:
94
- * const inner = getSubtreeSnapshot(snapshot, 'sf-payment')!;
95
- * stateAt(inner, 0).state; // after the subflow's first commit
96
- *
97
- * // A STORED recording needs no cast — its rows are `unknown[]`:
98
- * const stored = JSON.parse(await fs.readFile(path, 'utf8'));
99
- * stateAt(stored, 3).skipped; // undefined, or the bad rows
100
- * ```
101
- */
102
- export declare function stateAt(source: FoldSource | undefined, commitIdx: number): FoldedState;
@@ -1,153 +0,0 @@
1
- /**
2
- * stateAt — the fold at a stop.
3
- *
4
- * The commit log stores DIFFS. Replaying them onto the run's fold base
5
- * reproduces the state as it stood after any commit — byte-for-byte the state
6
- * the next stage saw, in both `commitValues` encodings, because the replay
7
- * runs through `applySmartMergeInto`, the one verb law (`memory/verbs.ts`) the
8
- * live commit itself uses. There is deliberately no second implementation of
9
- * the verbs here.
10
- */
11
- import { deepFreeze } from '../capture/freeze.js';
12
- import { applySmartMergeInto } from '../memory/utils.js';
13
- import { readLog } from './bundles.js';
14
- /**
15
- * Read whichever shape the caller handed us — `commitLog` (a run snapshot) or
16
- * `history` (a subflow's own log) — narrowing the rows to commit bundles as it
17
- * goes (see `bundles.ts`: a row that is not one becomes an index-holding gap).
18
- */
19
- export function readSource(source) {
20
- const base = source?.initialState;
21
- if (!source)
22
- return { log: [], gaps: [], base };
23
- const withLog = source;
24
- const raw = Array.isArray(withLog.commitLog)
25
- ? withLog.commitLog
26
- : Array.isArray(source.history)
27
- ? source.history
28
- : undefined;
29
- const { log, gaps } = readLog(raw);
30
- return { log, gaps, base };
31
- }
32
- /**
33
- * Fold one chain of legs: every leg BEFORE `legIdx` in full, then `legIdx`
34
- * through `through`.
35
- *
36
- * THE LEG RULE. A leg that carries its own `initialState` RESTARTS the
37
- * accumulation from it — on a pause/resume that base IS the state at the
38
- * pause, recorded by the engine, and is authoritative over anything the
39
- * previous leg's log rebuilt. A leg with no base (a pre-9.17 snapshot, a
40
- * hand-built log) CONTINUES from what the earlier legs folded, which is the
41
- * best honest answer available and is exactly what `basis` then reports.
42
- *
43
- * With a single leg this is the 9.17.0 fold, unchanged.
44
- */
45
- export function foldLegs(legs, legIdx, through) {
46
- return foldLegsFrom(legs, legIdx, through).folded;
47
- }
48
- /** Apply `log[from + 1 .. end]` of one leg into `out`, collecting the leg's facts. */
49
- function applyLeg(out, leg, from, end, redactedPaths, skipped) {
50
- for (const gap of leg.gaps) {
51
- if (gap.index > from && gap.index <= end)
52
- (skipped ??= []).push(gap);
53
- }
54
- for (let i = from + 1; i <= end; i++) {
55
- const bundle = leg.log[i];
56
- if (!bundle)
57
- continue;
58
- for (const path of bundle.redactedPaths ?? [])
59
- redactedPaths.add(path);
60
- applySmartMergeInto(out, bundle.updates, bundle.overwrite, bundle.trace);
61
- }
62
- return skipped;
63
- }
64
- /**
65
- * The fold, resumable. ONE clone per fold: the base is cloned once (or `{}`
66
- * stands in), every bundle is applied INTO that copy, and the state handed
67
- * out is one more clone, frozen — so the working copy stays private and a
68
- * later step can continue from it. Same answer as the 9.17.0 fold, pinned by
69
- * test/lib/time-travel/fold-memo.test.ts against a fresh fold at every stop.
70
- */
71
- export function foldLegsFrom(legs, legIdx, through, memo) {
72
- const last = legs[legIdx];
73
- const endOnLeg = last ? Math.min(through, last.log.length - 1) : -1;
74
- const lastThrough = endOnLeg < -1 ? -1 : endOnLeg;
75
- const resumable = memo !== undefined && memo.legIdx === legIdx && lastThrough >= memo.through;
76
- let based = resumable ? memo.based : false;
77
- let out = resumable ? memo.out : {};
78
- const redactedPaths = new Set(resumable ? memo.redactedPaths : []);
79
- let skipped = resumable && memo.skipped ? [...memo.skipped] : undefined;
80
- if (resumable) {
81
- if (last)
82
- skipped = applyLeg(out, last, memo.through, lastThrough, redactedPaths, skipped);
83
- }
84
- else {
85
- for (let leg = 0; leg <= legIdx && leg < legs.length; leg++) {
86
- const source = legs[leg];
87
- if (source.base && typeof source.base === 'object') {
88
- out = structuredClone(source.base);
89
- based = true;
90
- }
91
- const end = leg === legIdx ? lastThrough : source.log.length - 1;
92
- skipped = applyLeg(out, source, -1, end, redactedPaths, skipped);
93
- }
94
- }
95
- const basis = based ? 'initial+log' : 'log-only';
96
- const folded = {
97
- // The one freeze walk (`capture/freeze.ts`): a typed array in state is skipped, not thrown on.
98
- state: deepFreeze(structuredClone(out)),
99
- basis,
100
- redacted: redactedPaths.size > 0,
101
- redactedPaths: Object.freeze([...redactedPaths].sort()),
102
- throughCommitIdx: lastThrough,
103
- ...(skipped ? { skipped: Object.freeze(skipped) } : {}),
104
- };
105
- return { folded, memo: { legIdx, through: lastThrough, out, based, redactedPaths, skipped } };
106
- }
107
- /**
108
- * Fold `source`'s log from its base up to and including `commitIdx`.
109
- *
110
- * @param source A run snapshot (`commitLog` + `initialState`) or a subflow
111
- * subtree (`history` + `initialState`). Both spellings work,
112
- * and the rows may be unvalidated (`unknown[]`) — a row that
113
- * is not a commit bundle is skipped and REPORTED, by index,
114
- * in {@link FoldedState.skipped}, never crashed on.
115
- * @param commitIdx ARRAY INDEX of the last bundle to fold, inclusive. `-1`
116
- * (or any negative) folds nothing and returns the base —
117
- * the state before the run's first commit. Past the end
118
- * clamps to the end; the result's `throughCommitIdx` reports
119
- * where the fold actually stopped.
120
- *
121
- * @returns A detached, deeply frozen state plus how it was derived: `basis`
122
- * says whether the real fold base was available, `redacted` /
123
- * `redactedPaths` say where the log was scrubbed at write time, and
124
- * `skipped` says which rows could not be read. The engine redacts values as
125
- * it records them, so a replay of a redacted run yields `'REDACTED'` in
126
- * those places — correct, and said out loud rather than presented as the
127
- * real value.
128
- *
129
- * @example
130
- * ```typescript
131
- * const snapshot = executor.getSnapshot();
132
- * const { state, basis } = stateAt(snapshot, 3); // after the 4th commit
133
- * console.log(basis, state); // 'initial+log' { ... }
134
- *
135
- * // A subflow's own log folds identically:
136
- * const inner = getSubtreeSnapshot(snapshot, 'sf-payment')!;
137
- * stateAt(inner, 0).state; // after the subflow's first commit
138
- *
139
- * // A STORED recording needs no cast — its rows are `unknown[]`:
140
- * const stored = JSON.parse(await fs.readFile(path, 'utf8'));
141
- * stateAt(stored, 3).skipped; // undefined, or the bad rows
142
- * ```
143
- */
144
- export function stateAt(source, commitIdx) {
145
- // `NaN` is out of contract; treat it as "fold nothing" rather than letting
146
- // it flow through the arithmetic into `throughCommitIdx`, where it would
147
- // serialize as `null` and tell a consumer nothing about where the fold
148
- // stopped. (±Infinity needs no special case: it clamps like any index past
149
- // either end.)
150
- const asked = Number.isNaN(commitIdx) ? -1 : Math.floor(commitIdx);
151
- return foldLegs([readSource(source)], 0, asked);
152
- }
153
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVBdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdGltZS10cmF2ZWwvc3RhdGVBdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVV2Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUE4QjtJQUN2RCxNQUFNLElBQUksR0FBSSxNQUFpRSxFQUFFLFlBQVksQ0FBQztJQUM5RixJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBNEMsQ0FBQztJQUM3RCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDMUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTO1FBQ25CLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFFLE1BQTJDLENBQUMsT0FBTyxDQUFDO1lBQ3JFLENBQUMsQ0FBRSxNQUEwQyxDQUFDLE9BQU87WUFDckQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNkLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQTJCLEVBQUUsTUFBYyxFQUFFLE9BQWU7SUFDbkYsT0FB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QUFDO0tBQ3hELENBQUM7SUFDRixPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7QUFDaEcsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLE1BQThCLEVBQUUsU0FBaUI7SUFDdkUsMkVBQTJFO0lBQzNFLHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLGVBQWU7SUFDZixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRSxPQUFPLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNsRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzdGF0ZUF0IOKAlCB0aGUgZm9sZCBhdCBhIHN0b3AuXG4gKlxuICogVGhlIGNvbW1pdCBsb2cgc3RvcmVzIERJRkZTLiBSZXBsYXlpbmcgdGhlbSBvbnRvIHRoZSBydW4ncyBmb2xkIGJhc2VcbiAqIHJlcHJvZHVjZXMgdGhlIHN0YXRlIGFzIGl0IHN0b29kIGFmdGVyIGFueSBjb21taXQg4oCUIGJ5dGUtZm9yLWJ5dGUgdGhlIHN0YXRlXG4gKiB0aGUgbmV4dCBzdGFnZSBzYXcsIGluIGJvdGggYGNvbW1pdFZhbHVlc2AgZW5jb2RpbmdzLCBiZWNhdXNlIHRoZSByZXBsYXlcbiAqIHJ1bnMgdGhyb3VnaCBgYXBwbHlTbWFydE1lcmdlSW50b2AsIHRoZSBvbmUgdmVyYiBsYXcgKGBtZW1vcnkvdmVyYnMudHNgKSB0aGVcbiAqIGxpdmUgY29tbWl0IGl0c2VsZiB1c2VzLiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gc2Vjb25kIGltcGxlbWVudGF0aW9uIG9mXG4gKiB0aGUgdmVyYnMgaGVyZS5cbiAqL1xuXG5pbXBvcnQgeyBkZWVwRnJlZXplIH0gZnJvbSAnLi4vY2FwdHVyZS9mcmVlemUuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIE1lbW9yeVBhdGNoIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB7IGFwcGx5U21hcnRNZXJnZUludG8gfSBmcm9tICcuLi9tZW1vcnkvdXRpbHMuanMnO1xuaW1wb3J0IHsgcmVhZExvZyB9IGZyb20gJy4vYnVuZGxlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZvbGRCYXNpcywgRm9sZGVkU3RhdGUsIEZvbGRTb3VyY2UsIExvZ0dhcCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogT25lIHNvdXJjZSwgcmVhZDogaXRzIGxvZyAoZ2FwcyBoZWxkIGluIHBsYWNlKSBhbmQgaXRzIGZvbGQgYmFzZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFNvdXJjZSB7XG4gIHJlYWRvbmx5IGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW107XG4gIHJlYWRvbmx5IGdhcHM6IHJlYWRvbmx5IExvZ0dhcFtdO1xuICByZWFkb25seSBiYXNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWFkIHdoaWNoZXZlciBzaGFwZSB0aGUgY2FsbGVyIGhhbmRlZCB1cyDigJQgYGNvbW1pdExvZ2AgKGEgcnVuIHNuYXBzaG90KSBvclxuICogYGhpc3RvcnlgIChhIHN1YmZsb3cncyBvd24gbG9nKSDigJQgbmFycm93aW5nIHRoZSByb3dzIHRvIGNvbW1pdCBidW5kbGVzIGFzIGl0XG4gKiBnb2VzIChzZWUgYGJ1bmRsZXMudHNgOiBhIHJvdyB0aGF0IGlzIG5vdCBvbmUgYmVjb21lcyBhbiBpbmRleC1ob2xkaW5nIGdhcCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkU291cmNlKHNvdXJjZTogRm9sZFNvdXJjZSB8IHVuZGVmaW5lZCk6IFJlYWRTb3VyY2Uge1xuICBjb25zdCBiYXNlID0gKHNvdXJjZSBhcyB7IGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCB1bmRlZmluZWQpPy5pbml0aWFsU3RhdGU7XG4gIGlmICghc291cmNlKSByZXR1cm4geyBsb2c6IFtdLCBnYXBzOiBbXSwgYmFzZSB9O1xuICBjb25zdCB3aXRoTG9nID0gc291cmNlIGFzIHsgY29tbWl0TG9nPzogcmVhZG9ubHkgdW5rbm93bltdIH07XG4gIGNvbnN0IHJhdyA9IEFycmF5LmlzQXJyYXkod2l0aExvZy5jb21taXRMb2cpXG4gICAgPyB3aXRoTG9nLmNvbW1pdExvZ1xuICAgIDogQXJyYXkuaXNBcnJheSgoc291cmNlIGFzIHsgaGlzdG9yeT86IHJlYWRvbmx5IHVua25vd25bXSB9KS5oaXN0b3J5KVxuICAgID8gKHNvdXJjZSBhcyB7IGhpc3Rvcnk6IHJlYWRvbmx5IHVua25vd25bXSB9KS5oaXN0b3J5XG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgbG9nLCBnYXBzIH0gPSByZWFkTG9nKHJhdyk7XG4gIHJldHVybiB7IGxvZywgZ2FwcywgYmFzZSB9O1xufVxuXG4vKipcbiAqIEZvbGQgb25lIGNoYWluIG9mIGxlZ3M6IGV2ZXJ5IGxlZyBCRUZPUkUgYGxlZ0lkeGAgaW4gZnVsbCwgdGhlbiBgbGVnSWR4YFxuICogdGhyb3VnaCBgdGhyb3VnaGAuXG4gKlxuICogVEhFIExFRyBSVUxFLiBBIGxlZyB0aGF0IGNhcnJpZXMgaXRzIG93biBgaW5pdGlhbFN0YXRlYCBSRVNUQVJUUyB0aGVcbiAqIGFjY3VtdWxhdGlvbiBmcm9tIGl0IOKAlCBvbiBhIHBhdXNlL3Jlc3VtZSB0aGF0IGJhc2UgSVMgdGhlIHN0YXRlIGF0IHRoZVxuICogcGF1c2UsIHJlY29yZGVkIGJ5IHRoZSBlbmdpbmUsIGFuZCBpcyBhdXRob3JpdGF0aXZlIG92ZXIgYW55dGhpbmcgdGhlXG4gKiBwcmV2aW91cyBsZWcncyBsb2cgcmVidWlsdC4gQSBsZWcgd2l0aCBubyBiYXNlIChhIHByZS05LjE3IHNuYXBzaG90LCBhXG4gKiBoYW5kLWJ1aWx0IGxvZykgQ09OVElOVUVTIGZyb20gd2hhdCB0aGUgZWFybGllciBsZWdzIGZvbGRlZCwgd2hpY2ggaXMgdGhlXG4gKiBiZXN0IGhvbmVzdCBhbnN3ZXIgYXZhaWxhYmxlIGFuZCBpcyBleGFjdGx5IHdoYXQgYGJhc2lzYCB0aGVuIHJlcG9ydHMuXG4gKlxuICogV2l0aCBhIHNpbmdsZSBsZWcgdGhpcyBpcyB0aGUgOS4xNy4wIGZvbGQsIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvbGRMZWdzKGxlZ3M6IHJlYWRvbmx5IFJlYWRTb3VyY2VbXSwgbGVnSWR4OiBudW1iZXIsIHRocm91Z2g6IG51bWJlcik6IEZvbGRlZFN0YXRlIHtcbiAgcmV0dXJuIGZvbGRMZWdzRnJvbShsZWdzLCBsZWdJZHgsIHRocm91Z2gpLmZvbGRlZDtcbn1cblxuLyoqXG4gKiBXaGF0IGEgZm9sZCBsZWF2ZXMgYmVoaW5kIGZvciB0aGUgTkVYVCBvbmUgKDkuMjUuMCk6IHRoZSBwcml2YXRlIHdvcmtpbmdcbiAqIGNvcHkgYW5kIHRoZSBmYWN0cyBhY2N1bXVsYXRlZCBzbyBmYXIuIEEgY3Vyc29yIHN0ZXBwaW5nIGZvcndhcmQgb24gdGhlXG4gKiBzYW1lIGxlZyBoYW5kcyBpdCBiYWNrIGFuZCBvbmx5IHRoZSBidW5kbGVzIGFmdGVyIGB0aHJvdWdoYCBhcmUgYXBwbGllZCDigJRcbiAqIG9uZSBidW5kbGUgcGVyIHN0ZXAgaW5zdGVhZCBvZiBhIHJlcGxheSBmcm9tIHRoZSBiYXNlLiBBbnkgb3RoZXIgYXNrIChhblxuICogZWFybGllciBzdG9wLCBhbm90aGVyIGxlZykgZm9sZHMgZnJvbSBzY3JhdGNoOyB0aGUgbWVtbyBpcyBuZXZlciBhIGNsYWltLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvbGRNZW1vIHtcbiAgcmVhZG9ubHkgbGVnSWR4OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRocm91Z2g6IG51bWJlcjtcbiAgcmVhZG9ubHkgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgYmFzZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlZGFjdGVkUGF0aHM6IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IHNraXBwZWQ6IHJlYWRvbmx5IExvZ0dhcFtdIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogQXBwbHkgYGxvZ1tmcm9tICsgMSAuLiBlbmRdYCBvZiBvbmUgbGVnIGludG8gYG91dGAsIGNvbGxlY3RpbmcgdGhlIGxlZydzIGZhY3RzLiAqL1xuZnVuY3Rpb24gYXBwbHlMZWcoXG4gIG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGxlZzogUmVhZFNvdXJjZSxcbiAgZnJvbTogbnVtYmVyLFxuICBlbmQ6IG51bWJlcixcbiAgcmVkYWN0ZWRQYXRoczogU2V0PHN0cmluZz4sXG4gIHNraXBwZWQ6IExvZ0dhcFtdIHwgdW5kZWZpbmVkLFxuKTogTG9nR2FwW10gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGdhcCBvZiBsZWcuZ2Fwcykge1xuICAgIGlmIChnYXAuaW5kZXggPiBmcm9tICYmIGdhcC5pbmRleCA8PSBlbmQpIChza2lwcGVkID8/PSBbXSkucHVzaChnYXApO1xuICB9XG4gIGZvciAobGV0IGkgPSBmcm9tICsgMTsgaSA8PSBlbmQ7IGkrKykge1xuICAgIGNvbnN0IGJ1bmRsZSA9IGxlZy5sb2dbaV07XG4gICAgaWYgKCFidW5kbGUpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBidW5kbGUucmVkYWN0ZWRQYXRocyA/PyBbXSkgcmVkYWN0ZWRQYXRocy5hZGQocGF0aCk7XG4gICAgYXBwbHlTbWFydE1lcmdlSW50byhvdXQsIGJ1bmRsZS51cGRhdGVzIGFzIE1lbW9yeVBhdGNoLCBidW5kbGUub3ZlcndyaXRlIGFzIE1lbW9yeVBhdGNoLCBidW5kbGUudHJhY2UpO1xuICB9XG4gIHJldHVybiBza2lwcGVkO1xufVxuXG4vKipcbiAqIFRoZSBmb2xkLCByZXN1bWFibGUuIE9ORSBjbG9uZSBwZXIgZm9sZDogdGhlIGJhc2UgaXMgY2xvbmVkIG9uY2UgKG9yIGB7fWBcbiAqIHN0YW5kcyBpbiksIGV2ZXJ5IGJ1bmRsZSBpcyBhcHBsaWVkIElOVE8gdGhhdCBjb3B5LCBhbmQgdGhlIHN0YXRlIGhhbmRlZFxuICogb3V0IGlzIG9uZSBtb3JlIGNsb25lLCBmcm96ZW4g4oCUIHNvIHRoZSB3b3JraW5nIGNvcHkgc3RheXMgcHJpdmF0ZSBhbmQgYVxuICogbGF0ZXIgc3RlcCBjYW4gY29udGludWUgZnJvbSBpdC4gU2FtZSBhbnN3ZXIgYXMgdGhlIDkuMTcuMCBmb2xkLCBwaW5uZWQgYnlcbiAqIHRlc3QvbGliL3RpbWUtdHJhdmVsL2ZvbGQtbWVtby50ZXN0LnRzIGFnYWluc3QgYSBmcmVzaCBmb2xkIGF0IGV2ZXJ5IHN0b3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkTGVnc0Zyb20oXG4gIGxlZ3M6IHJlYWRvbmx5IFJlYWRTb3VyY2VbXSxcbiAgbGVnSWR4OiBudW1iZXIsXG4gIHRocm91Z2g6IG51bWJlcixcbiAgbWVtbz86IEZvbGRNZW1vLFxuKTogeyByZWFkb25seSBmb2xkZWQ6IEZvbGRlZFN0YXRlOyByZWFkb25seSBtZW1vOiBGb2xkTWVtbyB9IHtcbiAgY29uc3QgbGFzdCA9IGxlZ3NbbGVnSWR4XTtcbiAgY29uc3QgZW5kT25MZWcgPSBsYXN0ID8gTWF0aC5taW4odGhyb3VnaCwgbGFzdC5sb2cubGVuZ3RoIC0gMSkgOiAtMTtcbiAgY29uc3QgbGFzdFRocm91Z2ggPSBlbmRPbkxlZyA8IC0xID8gLTEgOiBlbmRPbkxlZztcbiAgY29uc3QgcmVzdW1hYmxlID0gbWVtbyAhPT0gdW5kZWZpbmVkICYmIG1lbW8ubGVnSWR4ID09PSBsZWdJZHggJiYgbGFzdFRocm91Z2ggPj0gbWVtby50aHJvdWdoO1xuXG4gIGxldCBiYXNlZCA9IHJlc3VtYWJsZSA/IG1lbW8uYmFzZWQgOiBmYWxzZTtcbiAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSByZXN1bWFibGUgPyBtZW1vLm91dCA6IHt9O1xuICBjb25zdCByZWRhY3RlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KHJlc3VtYWJsZSA/IG1lbW8ucmVkYWN0ZWRQYXRocyA6IFtdKTtcbiAgbGV0IHNraXBwZWQ6IExvZ0dhcFtdIHwgdW5kZWZpbmVkID0gcmVzdW1hYmxlICYmIG1lbW8uc2tpcHBlZCA/IFsuLi5tZW1vLnNraXBwZWRdIDogdW5kZWZpbmVkO1xuXG4gIGlmIChyZXN1bWFibGUpIHtcbiAgICBpZiAobGFzdCkgc2tpcHBlZCA9IGFwcGx5TGVnKG91dCwgbGFzdCwgbWVtby50aHJvdWdoLCBsYXN0VGhyb3VnaCwgcmVkYWN0ZWRQYXRocywgc2tpcHBlZCk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgbGVnID0gMDsgbGVnIDw9IGxlZ0lkeCAmJiBsZWcgPCBsZWdzLmxlbmd0aDsgbGVnKyspIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGxlZ3NbbGVnXTtcbiAgICAgIGlmIChzb3VyY2UuYmFzZSAmJiB0eXBlb2Ygc291cmNlLmJhc2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG91dCA9IHN0cnVjdHVyZWRDbG9uZShzb3VyY2UuYmFzZSk7XG4gICAgICAgIGJhc2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVuZCA9IGxlZyA9PT0gbGVnSWR4ID8gbGFzdFRocm91Z2ggOiBzb3VyY2UubG9nLmxlbmd0aCAtIDE7XG4gICAgICBza2lwcGVkID0gYXBwbHlMZWcob3V0LCBzb3VyY2UsIC0xLCBlbmQsIHJlZGFjdGVkUGF0aHMsIHNraXBwZWQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJhc2lzOiBGb2xkQmFzaXMgPSBiYXNlZCA/ICdpbml0aWFsK2xvZycgOiAnbG9nLW9ubHknO1xuICBjb25zdCBmb2xkZWQ6IEZvbGRlZFN0YXRlID0ge1xuICAgIC8vIFRoZSBvbmUgZnJlZXplIHdhbGsgKGBjYXB0dXJlL2ZyZWV6ZS50c2ApOiBhIHR5cGVkIGFycmF5IGluIHN0YXRlIGlzIHNraXBwZWQsIG5vdCB0aHJvd24gb24uXG4gICAgc3RhdGU6IGRlZXBGcmVlemUoc3RydWN0dXJlZENsb25lKG91dCkpLFxuICAgIGJhc2lzLFxuICAgIHJlZGFjdGVkOiByZWRhY3RlZFBhdGhzLnNpemUgPiAwLFxuICAgIHJlZGFjdGVkUGF0aHM6IE9iamVjdC5mcmVlemUoWy4uLnJlZGFjdGVkUGF0aHNdLnNvcnQoKSksXG4gICAgdGhyb3VnaENvbW1pdElkeDogbGFzdFRocm91Z2gsXG4gICAgLi4uKHNraXBwZWQgPyB7IHNraXBwZWQ6IE9iamVjdC5mcmVlemUoc2tpcHBlZCkgfSA6IHt9KSxcbiAgfTtcbiAgcmV0dXJuIHsgZm9sZGVkLCBtZW1vOiB7IGxlZ0lkeCwgdGhyb3VnaDogbGFzdFRocm91Z2gsIG91dCwgYmFzZWQsIHJlZGFjdGVkUGF0aHMsIHNraXBwZWQgfSB9O1xufVxuXG4vKipcbiAqIEZvbGQgYHNvdXJjZWAncyBsb2cgZnJvbSBpdHMgYmFzZSB1cCB0byBhbmQgaW5jbHVkaW5nIGBjb21taXRJZHhgLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgICAgQSBydW4gc25hcHNob3QgKGBjb21taXRMb2dgICsgYGluaXRpYWxTdGF0ZWApIG9yIGEgc3ViZmxvd1xuICogICAgICAgICAgICAgICAgICBzdWJ0cmVlIChgaGlzdG9yeWAgKyBgaW5pdGlhbFN0YXRlYCkuIEJvdGggc3BlbGxpbmdzIHdvcmssXG4gKiAgICAgICAgICAgICAgICAgIGFuZCB0aGUgcm93cyBtYXkgYmUgdW52YWxpZGF0ZWQgKGB1bmtub3duW11gKSDigJQgYSByb3cgdGhhdFxuICogICAgICAgICAgICAgICAgICBpcyBub3QgYSBjb21taXQgYnVuZGxlIGlzIHNraXBwZWQgYW5kIFJFUE9SVEVELCBieSBpbmRleCxcbiAqICAgICAgICAgICAgICAgICAgaW4ge0BsaW5rIEZvbGRlZFN0YXRlLnNraXBwZWR9LCBuZXZlciBjcmFzaGVkIG9uLlxuICogQHBhcmFtIGNvbW1pdElkeCBBUlJBWSBJTkRFWCBvZiB0aGUgbGFzdCBidW5kbGUgdG8gZm9sZCwgaW5jbHVzaXZlLiBgLTFgXG4gKiAgICAgICAgICAgICAgICAgIChvciBhbnkgbmVnYXRpdmUpIGZvbGRzIG5vdGhpbmcgYW5kIHJldHVybnMgdGhlIGJhc2Ug4oCUXG4gKiAgICAgICAgICAgICAgICAgIHRoZSBzdGF0ZSBiZWZvcmUgdGhlIHJ1bidzIGZpcnN0IGNvbW1pdC4gUGFzdCB0aGUgZW5kXG4gKiAgICAgICAgICAgICAgICAgIGNsYW1wcyB0byB0aGUgZW5kOyB0aGUgcmVzdWx0J3MgYHRocm91Z2hDb21taXRJZHhgIHJlcG9ydHNcbiAqICAgICAgICAgICAgICAgICAgd2hlcmUgdGhlIGZvbGQgYWN0dWFsbHkgc3RvcHBlZC5cbiAqXG4gKiBAcmV0dXJucyBBIGRldGFjaGVkLCBkZWVwbHkgZnJvemVuIHN0YXRlIHBsdXMgaG93IGl0IHdhcyBkZXJpdmVkOiBgYmFzaXNgXG4gKiAgIHNheXMgd2hldGhlciB0aGUgcmVhbCBmb2xkIGJhc2Ugd2FzIGF2YWlsYWJsZSwgYHJlZGFjdGVkYCAvXG4gKiAgIGByZWRhY3RlZFBhdGhzYCBzYXkgd2hlcmUgdGhlIGxvZyB3YXMgc2NydWJiZWQgYXQgd3JpdGUgdGltZSwgYW5kXG4gKiAgIGBza2lwcGVkYCBzYXlzIHdoaWNoIHJvd3MgY291bGQgbm90IGJlIHJlYWQuIFRoZSBlbmdpbmUgcmVkYWN0cyB2YWx1ZXMgYXNcbiAqICAgaXQgcmVjb3JkcyB0aGVtLCBzbyBhIHJlcGxheSBvZiBhIHJlZGFjdGVkIHJ1biB5aWVsZHMgYCdSRURBQ1RFRCdgIGluXG4gKiAgIHRob3NlIHBsYWNlcyDigJQgY29ycmVjdCwgYW5kIHNhaWQgb3V0IGxvdWQgcmF0aGVyIHRoYW4gcHJlc2VudGVkIGFzIHRoZVxuICogICByZWFsIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzbmFwc2hvdCA9IGV4ZWN1dG9yLmdldFNuYXBzaG90KCk7XG4gKiBjb25zdCB7IHN0YXRlLCBiYXNpcyB9ID0gc3RhdGVBdChzbmFwc2hvdCwgMyk7ICAgLy8gYWZ0ZXIgdGhlIDR0aCBjb21taXRcbiAqIGNvbnNvbGUubG9nKGJhc2lzLCBzdGF0ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2luaXRpYWwrbG9nJyB7IC4uLiB9XG4gKlxuICogLy8gQSBzdWJmbG93J3Mgb3duIGxvZyBmb2xkcyBpZGVudGljYWxseTpcbiAqIGNvbnN0IGlubmVyID0gZ2V0U3VidHJlZVNuYXBzaG90KHNuYXBzaG90LCAnc2YtcGF5bWVudCcpITtcbiAqIHN0YXRlQXQoaW5uZXIsIDApLnN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIHN1YmZsb3cncyBmaXJzdCBjb21taXRcbiAqXG4gKiAvLyBBIFNUT1JFRCByZWNvcmRpbmcgbmVlZHMgbm8gY2FzdCDigJQgaXRzIHJvd3MgYXJlIGB1bmtub3duW11gOlxuICogY29uc3Qgc3RvcmVkID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShwYXRoLCAndXRmOCcpKTtcbiAqIHN0YXRlQXQoc3RvcmVkLCAzKS5za2lwcGVkOyAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkLCBvciB0aGUgYmFkIHJvd3NcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhdGVBdChzb3VyY2U6IEZvbGRTb3VyY2UgfCB1bmRlZmluZWQsIGNvbW1pdElkeDogbnVtYmVyKTogRm9sZGVkU3RhdGUge1xuICAvLyBgTmFOYCBpcyBvdXQgb2YgY29udHJhY3Q7IHRyZWF0IGl0IGFzIFwiZm9sZCBub3RoaW5nXCIgcmF0aGVyIHRoYW4gbGV0dGluZ1xuICAvLyBpdCBmbG93IHRocm91Z2ggdGhlIGFyaXRobWV0aWMgaW50byBgdGhyb3VnaENvbW1pdElkeGAsIHdoZXJlIGl0IHdvdWxkXG4gIC8vIHNlcmlhbGl6ZSBhcyBgbnVsbGAgYW5kIHRlbGwgYSBjb25zdW1lciBub3RoaW5nIGFib3V0IHdoZXJlIHRoZSBmb2xkXG4gIC8vIHN0b3BwZWQuICjCsUluZmluaXR5IG5lZWRzIG5vIHNwZWNpYWwgY2FzZTogaXQgY2xhbXBzIGxpa2UgYW55IGluZGV4IHBhc3RcbiAgLy8gZWl0aGVyIGVuZC4pXG4gIGNvbnN0IGFza2VkID0gTnVtYmVyLmlzTmFOKGNvbW1pdElkeCkgPyAtMSA6IE1hdGguZmxvb3IoY29tbWl0SWR4KTtcbiAgcmV0dXJuIGZvbGRMZWdzKFtyZWFkU291cmNlKHNvdXJjZSldLCAwLCBhc2tlZCk7XG59XG4iXX0=