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,147 +0,0 @@
1
- /**
2
- * CommitRangeIndex<TLabel> — interval index over commit indices.
3
- *
4
- * Built incrementally during traversal: `open(label, startIdx)` when a
5
- * boundary begins, `close(token, endIdx)` when it ends. Query at any
6
- * commit position with `enclosing(idx)` (returns ranges containing
7
- * that index, ordered outer→inner) or `overlapping(start, end)`
8
- * (returns ranges intersecting a slice).
9
- *
10
- * See `docs/design/commit-range-index.md` for the full contract. In
11
- * one paragraph: this is a generic interval data structure for
12
- * commit-range queries. footprintjs owns ZERO knowledge of what
13
- * labels mean — consumers (agentfootprint, lens, OTel exporters)
14
- * pick their own `TLabel` type. Open ranges (mid-run, no end yet)
15
- * are first-class — query results carry `endIdx: undefined` for them.
16
- *
17
- * Pattern: incremental builder + interval query. Same "collect during
18
- * traversal, never post-process" rule footprintjs's CLAUDE.md
19
- * requires of every observer.
20
- * Role: structural primitive for time-travel UIs and per-boundary
21
- * aggregation.
22
- * Channel: consumer-driven (no engine subscription).
23
- *
24
- * @example
25
- * ```typescript
26
- * import { CommitRangeIndex } from 'footprintjs/trace';
27
- *
28
- * const idx = new CommitRangeIndex<string>();
29
- * const t = idx.open('LLMCall', executor.getCommitCount());
30
- * // ... LLM call runs, scope writes happen ...
31
- * idx.close(t, executor.getCommitCount());
32
- *
33
- * idx.enclosing(50); // → ranges containing commit 50, outer→inner
34
- * idx.overlapping(40, 60); // → ranges sharing the slice [40,60]
35
- * idx.clear(); // wipe (e.g., on new run)
36
- * ```
37
- *
38
- * REDACTION NOTE: labels are stored verbatim and returned verbatim in
39
- * query results — the index does NOT redact `TLabel` content. If a
40
- * consumer attaches a label containing PII (user email, scope reads
41
- * with sensitive keys, etc.) and then serializes the index for
42
- * logging or telemetry, that data leaves the trust boundary. Use
43
- * `RedactionPolicy` (or your own scrubbing) on the consumer side
44
- * BEFORE attaching labels. The index follows the same contract as
45
- * other footprintjs storage primitives (SequenceStore, KeyedStore):
46
- * storage is verbatim; redaction is the caller's responsibility.
47
- */
48
- /** Opaque token identifying an open range. Hold onto it; pass to `close()`.
49
- * Index-scoped — using a token from one CommitRangeIndex on another is
50
- * a silent no-op (verified by the per-index `_owner` symbol).
51
- *
52
- * SECURITY NOTE: the `_owner` symbol is enumerable on the token object
53
- * via `Object.getOwnPropertySymbols(token)`. This means tokens are NOT
54
- * adversary-safe — a malicious caller with access to ANY token from
55
- * this index can recover the owner symbol and forge new tokens. The
56
- * index is designed for in-process trust boundaries (cooperative
57
- * recorders sharing one runner), not for hostile-input scenarios.
58
- * If adversary-safety becomes a requirement, switch to a WeakMap-
59
- * scoped token model (see security panel review Y2). */
60
- export interface RangeToken {
61
- /** Per-index sequential id. Opaque to consumers — they shouldn't read it. */
62
- readonly _id: number;
63
- /** Per-index identity — prevents accidental cross-index token misuse. */
64
- readonly _owner: symbol;
65
- }
66
- /** A single range as returned by query methods. Frozen-shape — readonly fields. */
67
- export interface RangeEntry<TLabel> {
68
- readonly label: TLabel;
69
- readonly startIdx: number;
70
- /** Undefined while the range is still open (mid-run boundary). */
71
- readonly endIdx?: number;
72
- }
73
- export declare class CommitRangeIndex<TLabel> {
74
- private entries;
75
- private byId;
76
- private nextId;
77
- /** Identity for token scoping — each index gets a fresh symbol so
78
- * tokens from one index can't accidentally close ranges in another.
79
- * ROTATED on `clear()` to invalidate stale tokens that survived a
80
- * run reset (would otherwise hit a recycled id and silently mutate
81
- * a different range — see DS+logic panel review RED #1). */
82
- private owner;
83
- /**
84
- * Open a new range. Returns a token the caller MUST hold and pass
85
- * to `close()` later. Each `open()` gets a fresh token; tokens
86
- * cannot be reused or shared across indices (silent no-op if
87
- * misused — see Law 2 in the design doc). Tokens from BEFORE
88
- * the most recent `clear()` are also invalid (owner symbol
89
- * rotates on clear).
90
- */
91
- open(label: TLabel, startIdx: number): RangeToken;
92
- /**
93
- * Close an open range at `endIdx` (inclusive). After close, the
94
- * range is queryable with both bounds. Closing an already-closed
95
- * token is a no-op. Closing an unknown token (from another index,
96
- * or fabricated) is a no-op.
97
- */
98
- close(token: RangeToken, endIdx: number): void;
99
- /**
100
- * Returns ALL ranges enclosing `commitIdx`, ordered outer→inner.
101
- * Includes both closed and open ranges. For a closed range to
102
- * enclose: `startIdx <= commitIdx <= endIdx`. For an open range:
103
- * `startIdx <= commitIdx` (no upper bound check).
104
- *
105
- * Ordering rule: ascending by `startIdx`, with TIES BROKEN BY
106
- * descending `endIdx` (wider range = outer). Open ranges (endIdx
107
- * undefined) are treated as `+Infinity` for tie-break — they
108
- * always sort outer of any closed range starting at the same idx.
109
- * This is the only deterministic outer→inner ordering when two
110
- * boundaries open at the same commit (e.g., Parallel root +
111
- * its first branch).
112
- *
113
- * Returns a SHALLOW IMMUTABLE COPY — caller mutations don't affect
114
- * internal state.
115
- */
116
- enclosing(commitIdx: number): readonly RangeEntry<TLabel>[];
117
- /**
118
- * Returns all ranges OVERLAPPING the slice `[startIdx, endIdx]`. A
119
- * range overlaps if it shares at least one commit position with the
120
- * slice. Use for parallel-branch detection, time-window queries,
121
- * or "what boundaries fired during this slice."
122
- *
123
- * Sorted by the SAME outer→inner comparator as `enclosing()`:
124
- * ascending by `startIdx`, ties broken by descending `endIdx`
125
- * (wider = outer; open ranges treated as +Infinity).
126
- *
127
- * Returns a SHALLOW IMMUTABLE COPY.
128
- */
129
- overlapping(startIdx: number, endIdx: number): readonly RangeEntry<TLabel>[];
130
- /** Total range count (open + closed). */
131
- get size(): number;
132
- /**
133
- * Wipe all ranges + reset the token counter AND rotate the owner
134
- * symbol so any token from before this clear becomes invalid.
135
- * Critical: without rotating the owner, a stale token whose `_id`
136
- * happens to match a recycled id after clear would silently mutate
137
- * the wrong entry. Owner rotation makes stale-token close a no-op
138
- * via the `_owner !== this.owner` guard.
139
- *
140
- * Call from a consumer's runId guard when a new run starts (e.g.,
141
- * agentfootprint's `observeRunId(onNewRun)` from Phase 2).
142
- */
143
- clear(): void;
144
- /** O(1) lookup by token id. Always returns the entry that the token
145
- * references (or undefined if the id was never opened in this index). */
146
- private findById;
147
- }
@@ -1,207 +0,0 @@
1
- /**
2
- * CommitRangeIndex<TLabel> — interval index over commit indices.
3
- *
4
- * Built incrementally during traversal: `open(label, startIdx)` when a
5
- * boundary begins, `close(token, endIdx)` when it ends. Query at any
6
- * commit position with `enclosing(idx)` (returns ranges containing
7
- * that index, ordered outer→inner) or `overlapping(start, end)`
8
- * (returns ranges intersecting a slice).
9
- *
10
- * See `docs/design/commit-range-index.md` for the full contract. In
11
- * one paragraph: this is a generic interval data structure for
12
- * commit-range queries. footprintjs owns ZERO knowledge of what
13
- * labels mean — consumers (agentfootprint, lens, OTel exporters)
14
- * pick their own `TLabel` type. Open ranges (mid-run, no end yet)
15
- * are first-class — query results carry `endIdx: undefined` for them.
16
- *
17
- * Pattern: incremental builder + interval query. Same "collect during
18
- * traversal, never post-process" rule footprintjs's CLAUDE.md
19
- * requires of every observer.
20
- * Role: structural primitive for time-travel UIs and per-boundary
21
- * aggregation.
22
- * Channel: consumer-driven (no engine subscription).
23
- *
24
- * @example
25
- * ```typescript
26
- * import { CommitRangeIndex } from 'footprintjs/trace';
27
- *
28
- * const idx = new CommitRangeIndex<string>();
29
- * const t = idx.open('LLMCall', executor.getCommitCount());
30
- * // ... LLM call runs, scope writes happen ...
31
- * idx.close(t, executor.getCommitCount());
32
- *
33
- * idx.enclosing(50); // → ranges containing commit 50, outer→inner
34
- * idx.overlapping(40, 60); // → ranges sharing the slice [40,60]
35
- * idx.clear(); // wipe (e.g., on new run)
36
- * ```
37
- *
38
- * REDACTION NOTE: labels are stored verbatim and returned verbatim in
39
- * query results — the index does NOT redact `TLabel` content. If a
40
- * consumer attaches a label containing PII (user email, scope reads
41
- * with sensitive keys, etc.) and then serializes the index for
42
- * logging or telemetry, that data leaves the trust boundary. Use
43
- * `RedactionPolicy` (or your own scrubbing) on the consumer side
44
- * BEFORE attaching labels. The index follows the same contract as
45
- * other footprintjs storage primitives (SequenceStore, KeyedStore):
46
- * storage is verbatim; redaction is the caller's responsibility.
47
- */
48
- export class CommitRangeIndex {
49
- entries = [];
50
- byId = new Map();
51
- nextId = 0;
52
- /** Identity for token scoping — each index gets a fresh symbol so
53
- * tokens from one index can't accidentally close ranges in another.
54
- * ROTATED on `clear()` to invalidate stale tokens that survived a
55
- * run reset (would otherwise hit a recycled id and silently mutate
56
- * a different range — see DS+logic panel review RED #1). */
57
- owner = Symbol('CommitRangeIndex');
58
- /**
59
- * Open a new range. Returns a token the caller MUST hold and pass
60
- * to `close()` later. Each `open()` gets a fresh token; tokens
61
- * cannot be reused or shared across indices (silent no-op if
62
- * misused — see Law 2 in the design doc). Tokens from BEFORE
63
- * the most recent `clear()` are also invalid (owner symbol
64
- * rotates on clear).
65
- */
66
- open(label, startIdx) {
67
- const id = this.nextId++;
68
- const entry = {
69
- label,
70
- startIdx,
71
- endIdx: undefined,
72
- id,
73
- closed: false,
74
- };
75
- this.entries.push(entry);
76
- this.byId.set(id, entry);
77
- return { _id: id, _owner: this.owner };
78
- }
79
- /**
80
- * Close an open range at `endIdx` (inclusive). After close, the
81
- * range is queryable with both bounds. Closing an already-closed
82
- * token is a no-op. Closing an unknown token (from another index,
83
- * or fabricated) is a no-op.
84
- */
85
- close(token, endIdx) {
86
- if (token._owner !== this.owner)
87
- return; // cross-index misuse — silent no-op
88
- const entry = this.findById(token._id);
89
- if (!entry || entry.closed)
90
- return;
91
- entry.endIdx = endIdx;
92
- entry.closed = true;
93
- }
94
- /**
95
- * Returns ALL ranges enclosing `commitIdx`, ordered outer→inner.
96
- * Includes both closed and open ranges. For a closed range to
97
- * enclose: `startIdx <= commitIdx <= endIdx`. For an open range:
98
- * `startIdx <= commitIdx` (no upper bound check).
99
- *
100
- * Ordering rule: ascending by `startIdx`, with TIES BROKEN BY
101
- * descending `endIdx` (wider range = outer). Open ranges (endIdx
102
- * undefined) are treated as `+Infinity` for tie-break — they
103
- * always sort outer of any closed range starting at the same idx.
104
- * This is the only deterministic outer→inner ordering when two
105
- * boundaries open at the same commit (e.g., Parallel root +
106
- * its first branch).
107
- *
108
- * Returns a SHALLOW IMMUTABLE COPY — caller mutations don't affect
109
- * internal state.
110
- */
111
- enclosing(commitIdx) {
112
- const matches = [];
113
- for (const e of this.entries) {
114
- if (e.startIdx > commitIdx)
115
- continue;
116
- if (e.endIdx === undefined || e.endIdx >= commitIdx) {
117
- matches.push(toEntry(e));
118
- }
119
- }
120
- matches.sort(outerToInnerComparator);
121
- return matches;
122
- }
123
- /**
124
- * Returns all ranges OVERLAPPING the slice `[startIdx, endIdx]`. A
125
- * range overlaps if it shares at least one commit position with the
126
- * slice. Use for parallel-branch detection, time-window queries,
127
- * or "what boundaries fired during this slice."
128
- *
129
- * Sorted by the SAME outer→inner comparator as `enclosing()`:
130
- * ascending by `startIdx`, ties broken by descending `endIdx`
131
- * (wider = outer; open ranges treated as +Infinity).
132
- *
133
- * Returns a SHALLOW IMMUTABLE COPY.
134
- */
135
- overlapping(startIdx, endIdx) {
136
- const matches = [];
137
- for (const e of this.entries) {
138
- // Overlap test:
139
- // range starts after slice ends → no overlap
140
- // range ends (closed) before slice starts → no overlap
141
- // otherwise → overlap (open ranges always overlap if they start <= endIdx)
142
- if (e.startIdx > endIdx)
143
- continue;
144
- if (e.endIdx !== undefined && e.endIdx < startIdx)
145
- continue;
146
- matches.push(toEntry(e));
147
- }
148
- matches.sort(outerToInnerComparator);
149
- return matches;
150
- }
151
- /** Total range count (open + closed). */
152
- get size() {
153
- return this.entries.length;
154
- }
155
- /**
156
- * Wipe all ranges + reset the token counter AND rotate the owner
157
- * symbol so any token from before this clear becomes invalid.
158
- * Critical: without rotating the owner, a stale token whose `_id`
159
- * happens to match a recycled id after clear would silently mutate
160
- * the wrong entry. Owner rotation makes stale-token close a no-op
161
- * via the `_owner !== this.owner` guard.
162
- *
163
- * Call from a consumer's runId guard when a new run starts (e.g.,
164
- * agentfootprint's `observeRunId(onNewRun)` from Phase 2).
165
- */
166
- clear() {
167
- this.entries.length = 0;
168
- this.byId.clear();
169
- this.nextId = 0;
170
- this.owner = Symbol('CommitRangeIndex');
171
- }
172
- // ─── Internals ────────────────────────────────────────────────────
173
- /** O(1) lookup by token id. Always returns the entry that the token
174
- * references (or undefined if the id was never opened in this index). */
175
- findById(id) {
176
- return this.byId.get(id);
177
- }
178
- }
179
- /** Project the internal mutable shape into the public readonly entry.
180
- * The OUTER object is a fresh allocation per query (so caller array
181
- * mutations don't leak). The `label` field is a REFERENCE COPY —
182
- * if `TLabel` is an object, mutating its fields will affect the
183
- * internal entry too. Consumers MUST treat labels as immutable
184
- * (or pass primitives). Documented in the class JSDoc as the
185
- * "labels are stored verbatim" contract. */
186
- function toEntry(e) {
187
- return e.endIdx === undefined
188
- ? { label: e.label, startIdx: e.startIdx }
189
- : { label: e.label, startIdx: e.startIdx, endIdx: e.endIdx };
190
- }
191
- /**
192
- * Shared outer→inner comparator for both `enclosing()` and
193
- * `overlapping()`. Primary key: `startIdx` ascending. Tie-break:
194
- * `endIdx` descending (wider range is outer). Open ranges (undefined
195
- * `endIdx`) sort as +Infinity → outermost when tied. Deterministic
196
- * ordering required so consumers (Lens breadcrumb, time-travel UIs)
197
- * never see flicker on equal-start boundaries (e.g., a Parallel
198
- * root and its first branch opening at the same commit).
199
- */
200
- function outerToInnerComparator(a, b) {
201
- if (a.startIdx !== b.startIdx)
202
- return a.startIdx - b.startIdx;
203
- const ae = a.endIdx ?? Number.POSITIVE_INFINITY;
204
- const be = b.endIdx ?? Number.POSITIVE_INFINITY;
205
- return be - ae;
206
- }
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWl0UmFuZ2VJbmRleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tbWl0UmFuZ2VJbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThDRztBQTRDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLE9BQU8sR0FBNEIsRUFBRSxDQUFDO0lBQ3RDLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQUNoRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ25COzs7O2lFQUk2RDtJQUNyRCxLQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFM0M7Ozs7Ozs7T0FPRztJQUNILElBQUksQ0FBQyxLQUFhLEVBQUUsUUFBZ0I7UUFDbEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUEwQjtZQUNuQyxLQUFLO1lBQ0wsUUFBUTtZQUNSLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLEVBQUU7WUFDRixNQUFNLEVBQUUsS0FBSztTQUNkLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsS0FBaUIsRUFBRSxNQUFjO1FBQ3JDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sQ0FBQyxvQ0FBb0M7UUFDN0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDbkMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDdEIsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsU0FBUyxDQUFDLFNBQWlCO1FBQ3pCLE1BQU0sT0FBTyxHQUF5QixFQUFFLENBQUM7UUFDekMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLFNBQVM7Z0JBQUUsU0FBUztZQUNyQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ3BELE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDckMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsV0FBVyxDQUFDLFFBQWdCLEVBQUUsTUFBYztRQUMxQyxNQUFNLE9BQU8sR0FBeUIsRUFBRSxDQUFDO1FBQ3pDLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLGdCQUFnQjtZQUNoQiwrQ0FBK0M7WUFDL0MseURBQXlEO1lBQ3pELDZFQUE2RTtZQUM3RSxJQUFJLENBQUMsQ0FBQyxRQUFRLEdBQUcsTUFBTTtnQkFBRSxTQUFTO1lBQ2xDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxRQUFRO2dCQUFFLFNBQVM7WUFDNUQsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxxRUFBcUU7SUFFckU7OEVBQzBFO0lBQ2xFLFFBQVEsQ0FBQyxFQUFVO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs2Q0FNNkM7QUFDN0MsU0FBUyxPQUFPLENBQVMsQ0FBd0I7SUFDL0MsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVM7UUFDM0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDMUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNqRSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLHNCQUFzQixDQUFTLENBQXFCLEVBQUUsQ0FBcUI7SUFDbEYsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRO1FBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDOUQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDaEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDaEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1pdFJhbmdlSW5kZXg8VExhYmVsPiDigJQgaW50ZXJ2YWwgaW5kZXggb3ZlciBjb21taXQgaW5kaWNlcy5cbiAqXG4gKiBCdWlsdCBpbmNyZW1lbnRhbGx5IGR1cmluZyB0cmF2ZXJzYWw6IGBvcGVuKGxhYmVsLCBzdGFydElkeClgIHdoZW4gYVxuICogYm91bmRhcnkgYmVnaW5zLCBgY2xvc2UodG9rZW4sIGVuZElkeClgIHdoZW4gaXQgZW5kcy4gUXVlcnkgYXQgYW55XG4gKiBjb21taXQgcG9zaXRpb24gd2l0aCBgZW5jbG9zaW5nKGlkeClgIChyZXR1cm5zIHJhbmdlcyBjb250YWluaW5nXG4gKiB0aGF0IGluZGV4LCBvcmRlcmVkIG91dGVy4oaSaW5uZXIpIG9yIGBvdmVybGFwcGluZyhzdGFydCwgZW5kKWBcbiAqIChyZXR1cm5zIHJhbmdlcyBpbnRlcnNlY3RpbmcgYSBzbGljZSkuXG4gKlxuICogU2VlIGBkb2NzL2Rlc2lnbi9jb21taXQtcmFuZ2UtaW5kZXgubWRgIGZvciB0aGUgZnVsbCBjb250cmFjdC4gSW5cbiAqIG9uZSBwYXJhZ3JhcGg6IHRoaXMgaXMgYSBnZW5lcmljIGludGVydmFsIGRhdGEgc3RydWN0dXJlIGZvclxuICogY29tbWl0LXJhbmdlIHF1ZXJpZXMuIGZvb3RwcmludGpzIG93bnMgWkVSTyBrbm93bGVkZ2Ugb2Ygd2hhdFxuICogbGFiZWxzIG1lYW4g4oCUIGNvbnN1bWVycyAoYWdlbnRmb290cHJpbnQsIGxlbnMsIE9UZWwgZXhwb3J0ZXJzKVxuICogcGljayB0aGVpciBvd24gYFRMYWJlbGAgdHlwZS4gT3BlbiByYW5nZXMgKG1pZC1ydW4sIG5vIGVuZCB5ZXQpXG4gKiBhcmUgZmlyc3QtY2xhc3Mg4oCUIHF1ZXJ5IHJlc3VsdHMgY2FycnkgYGVuZElkeDogdW5kZWZpbmVkYCBmb3IgdGhlbS5cbiAqXG4gKiBQYXR0ZXJuOiBpbmNyZW1lbnRhbCBidWlsZGVyICsgaW50ZXJ2YWwgcXVlcnkuIFNhbWUgXCJjb2xsZWN0IGR1cmluZ1xuICogICAgICAgICAgdHJhdmVyc2FsLCBuZXZlciBwb3N0LXByb2Nlc3NcIiBydWxlIGZvb3RwcmludGpzJ3MgQ0xBVURFLm1kXG4gKiAgICAgICAgICByZXF1aXJlcyBvZiBldmVyeSBvYnNlcnZlci5cbiAqIFJvbGU6ICAgIHN0cnVjdHVyYWwgcHJpbWl0aXZlIGZvciB0aW1lLXRyYXZlbCBVSXMgYW5kIHBlci1ib3VuZGFyeVxuICogICAgICAgICAgYWdncmVnYXRpb24uXG4gKiBDaGFubmVsOiBjb25zdW1lci1kcml2ZW4gKG5vIGVuZ2luZSBzdWJzY3JpcHRpb24pLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDb21taXRSYW5nZUluZGV4IH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGNvbnN0IGlkeCA9IG5ldyBDb21taXRSYW5nZUluZGV4PHN0cmluZz4oKTtcbiAqIGNvbnN0IHQgPSBpZHgub3BlbignTExNQ2FsbCcsIGV4ZWN1dG9yLmdldENvbW1pdENvdW50KCkpO1xuICogLy8gLi4uIExMTSBjYWxsIHJ1bnMsIHNjb3BlIHdyaXRlcyBoYXBwZW4gLi4uXG4gKiBpZHguY2xvc2UodCwgZXhlY3V0b3IuZ2V0Q29tbWl0Q291bnQoKSk7XG4gKlxuICogaWR4LmVuY2xvc2luZyg1MCk7ICAvLyDihpIgcmFuZ2VzIGNvbnRhaW5pbmcgY29tbWl0IDUwLCBvdXRlcuKGkmlubmVyXG4gKiBpZHgub3ZlcmxhcHBpbmcoNDAsIDYwKTsgIC8vIOKGkiByYW5nZXMgc2hhcmluZyB0aGUgc2xpY2UgWzQwLDYwXVxuICogaWR4LmNsZWFyKCk7ICAgICAgICAvLyB3aXBlIChlLmcuLCBvbiBuZXcgcnVuKVxuICogYGBgXG4gKlxuICogUkVEQUNUSU9OIE5PVEU6IGxhYmVscyBhcmUgc3RvcmVkIHZlcmJhdGltIGFuZCByZXR1cm5lZCB2ZXJiYXRpbSBpblxuICogcXVlcnkgcmVzdWx0cyDigJQgdGhlIGluZGV4IGRvZXMgTk9UIHJlZGFjdCBgVExhYmVsYCBjb250ZW50LiBJZiBhXG4gKiBjb25zdW1lciBhdHRhY2hlcyBhIGxhYmVsIGNvbnRhaW5pbmcgUElJICh1c2VyIGVtYWlsLCBzY29wZSByZWFkc1xuICogd2l0aCBzZW5zaXRpdmUga2V5cywgZXRjLikgYW5kIHRoZW4gc2VyaWFsaXplcyB0aGUgaW5kZXggZm9yXG4gKiBsb2dnaW5nIG9yIHRlbGVtZXRyeSwgdGhhdCBkYXRhIGxlYXZlcyB0aGUgdHJ1c3QgYm91bmRhcnkuIFVzZVxuICogYFJlZGFjdGlvblBvbGljeWAgKG9yIHlvdXIgb3duIHNjcnViYmluZykgb24gdGhlIGNvbnN1bWVyIHNpZGVcbiAqIEJFRk9SRSBhdHRhY2hpbmcgbGFiZWxzLiBUaGUgaW5kZXggZm9sbG93cyB0aGUgc2FtZSBjb250cmFjdCBhc1xuICogb3RoZXIgZm9vdHByaW50anMgc3RvcmFnZSBwcmltaXRpdmVzIChTZXF1ZW5jZVN0b3JlLCBLZXllZFN0b3JlKTpcbiAqIHN0b3JhZ2UgaXMgdmVyYmF0aW07IHJlZGFjdGlvbiBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuXG4gKi9cblxuLyoqIE9wYXF1ZSB0b2tlbiBpZGVudGlmeWluZyBhbiBvcGVuIHJhbmdlLiBIb2xkIG9udG8gaXQ7IHBhc3MgdG8gYGNsb3NlKClgLlxuICogIEluZGV4LXNjb3BlZCDigJQgdXNpbmcgYSB0b2tlbiBmcm9tIG9uZSBDb21taXRSYW5nZUluZGV4IG9uIGFub3RoZXIgaXNcbiAqICBhIHNpbGVudCBuby1vcCAodmVyaWZpZWQgYnkgdGhlIHBlci1pbmRleCBgX293bmVyYCBzeW1ib2wpLlxuICpcbiAqICBTRUNVUklUWSBOT1RFOiB0aGUgYF9vd25lcmAgc3ltYm9sIGlzIGVudW1lcmFibGUgb24gdGhlIHRva2VuIG9iamVjdFxuICogIHZpYSBgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0b2tlbilgLiBUaGlzIG1lYW5zIHRva2VucyBhcmUgTk9UXG4gKiAgYWR2ZXJzYXJ5LXNhZmUg4oCUIGEgbWFsaWNpb3VzIGNhbGxlciB3aXRoIGFjY2VzcyB0byBBTlkgdG9rZW4gZnJvbVxuICogIHRoaXMgaW5kZXggY2FuIHJlY292ZXIgdGhlIG93bmVyIHN5bWJvbCBhbmQgZm9yZ2UgbmV3IHRva2Vucy4gVGhlXG4gKiAgaW5kZXggaXMgZGVzaWduZWQgZm9yIGluLXByb2Nlc3MgdHJ1c3QgYm91bmRhcmllcyAoY29vcGVyYXRpdmVcbiAqICByZWNvcmRlcnMgc2hhcmluZyBvbmUgcnVubmVyKSwgbm90IGZvciBob3N0aWxlLWlucHV0IHNjZW5hcmlvcy5cbiAqICBJZiBhZHZlcnNhcnktc2FmZXR5IGJlY29tZXMgYSByZXF1aXJlbWVudCwgc3dpdGNoIHRvIGEgV2Vha01hcC1cbiAqICBzY29wZWQgdG9rZW4gbW9kZWwgKHNlZSBzZWN1cml0eSBwYW5lbCByZXZpZXcgWTIpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVRva2VuIHtcbiAgLyoqIFBlci1pbmRleCBzZXF1ZW50aWFsIGlkLiBPcGFxdWUgdG8gY29uc3VtZXJzIOKAlCB0aGV5IHNob3VsZG4ndCByZWFkIGl0LiAqL1xuICByZWFkb25seSBfaWQ6IG51bWJlcjtcbiAgLyoqIFBlci1pbmRleCBpZGVudGl0eSDigJQgcHJldmVudHMgYWNjaWRlbnRhbCBjcm9zcy1pbmRleCB0b2tlbiBtaXN1c2UuICovXG4gIHJlYWRvbmx5IF9vd25lcjogc3ltYm9sO1xufVxuXG4vKiogQSBzaW5nbGUgcmFuZ2UgYXMgcmV0dXJuZWQgYnkgcXVlcnkgbWV0aG9kcy4gRnJvemVuLXNoYXBlIOKAlCByZWFkb25seSBmaWVsZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlRW50cnk8VExhYmVsPiB7XG4gIHJlYWRvbmx5IGxhYmVsOiBUTGFiZWw7XG4gIHJlYWRvbmx5IHN0YXJ0SWR4OiBudW1iZXI7XG4gIC8qKiBVbmRlZmluZWQgd2hpbGUgdGhlIHJhbmdlIGlzIHN0aWxsIG9wZW4gKG1pZC1ydW4gYm91bmRhcnkpLiAqL1xuICByZWFkb25seSBlbmRJZHg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgc3RvcmFnZSBzaGFwZS4gTXV0YWJsZSB3aGlsZSB0aGUgcmFuZ2UgaXMgb3Blbjsgb25jZVxuICogY2xvc2VkLCBgZW5kSWR4YCBpcyBzZXQgYW5kIG5ldmVyIGNoYW5nZXMuIFRva2VucyByZWZlcmVuY2UgdGhlc2VcbiAqIGJ5IHRoZWlyIHBvc2l0aW9uIGluIHRoZSBgZW50cmllc2AgYXJyYXkgKHRoZSBgX2lkYCkuXG4gKi9cbmludGVyZmFjZSBJbnRlcm5hbEVudHJ5PFRMYWJlbD4ge1xuICBsYWJlbDogVExhYmVsO1xuICBzdGFydElkeDogbnVtYmVyO1xuICBlbmRJZHg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIEludGVybmFsIGN1cnNvciDigJQgYXNzaWduZWQgb24gYG9wZW4oKWAsIHVzZWQgdG8gaWRlbnRpZnkgYnkgdG9rZW4uICovXG4gIGlkOiBudW1iZXI7XG4gIC8qKiBUcnVlIGFmdGVyIGBjbG9zZSgpYCBydW5zLiBQcmV2ZW50cyBkb3VibGUtY2xvc2UgbXV0YXRpb24uICovXG4gIGNsb3NlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbW1pdFJhbmdlSW5kZXg8VExhYmVsPiB7XG4gIHByaXZhdGUgZW50cmllczogSW50ZXJuYWxFbnRyeTxUTGFiZWw+W10gPSBbXTtcbiAgcHJpdmF0ZSBieUlkID0gbmV3IE1hcDxudW1iZXIsIEludGVybmFsRW50cnk8VExhYmVsPj4oKTtcbiAgcHJpdmF0ZSBuZXh0SWQgPSAwO1xuICAvKiogSWRlbnRpdHkgZm9yIHRva2VuIHNjb3Bpbmcg4oCUIGVhY2ggaW5kZXggZ2V0cyBhIGZyZXNoIHN5bWJvbCBzb1xuICAgKiAgdG9rZW5zIGZyb20gb25lIGluZGV4IGNhbid0IGFjY2lkZW50YWxseSBjbG9zZSByYW5nZXMgaW4gYW5vdGhlci5cbiAgICogIFJPVEFURUQgb24gYGNsZWFyKClgIHRvIGludmFsaWRhdGUgc3RhbGUgdG9rZW5zIHRoYXQgc3Vydml2ZWQgYVxuICAgKiAgcnVuIHJlc2V0ICh3b3VsZCBvdGhlcndpc2UgaGl0IGEgcmVjeWNsZWQgaWQgYW5kIHNpbGVudGx5IG11dGF0ZVxuICAgKiAgYSBkaWZmZXJlbnQgcmFuZ2Ug4oCUIHNlZSBEUytsb2dpYyBwYW5lbCByZXZpZXcgUkVEICMxKS4gKi9cbiAgcHJpdmF0ZSBvd25lciA9IFN5bWJvbCgnQ29tbWl0UmFuZ2VJbmRleCcpO1xuXG4gIC8qKlxuICAgKiBPcGVuIGEgbmV3IHJhbmdlLiBSZXR1cm5zIGEgdG9rZW4gdGhlIGNhbGxlciBNVVNUIGhvbGQgYW5kIHBhc3NcbiAgICogdG8gYGNsb3NlKClgIGxhdGVyLiBFYWNoIGBvcGVuKClgIGdldHMgYSBmcmVzaCB0b2tlbjsgdG9rZW5zXG4gICAqIGNhbm5vdCBiZSByZXVzZWQgb3Igc2hhcmVkIGFjcm9zcyBpbmRpY2VzIChzaWxlbnQgbm8tb3AgaWZcbiAgICogbWlzdXNlZCDigJQgc2VlIExhdyAyIGluIHRoZSBkZXNpZ24gZG9jKS4gVG9rZW5zIGZyb20gQkVGT1JFXG4gICAqIHRoZSBtb3N0IHJlY2VudCBgY2xlYXIoKWAgYXJlIGFsc28gaW52YWxpZCAob3duZXIgc3ltYm9sXG4gICAqIHJvdGF0ZXMgb24gY2xlYXIpLlxuICAgKi9cbiAgb3BlbihsYWJlbDogVExhYmVsLCBzdGFydElkeDogbnVtYmVyKTogUmFuZ2VUb2tlbiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLm5leHRJZCsrO1xuICAgIGNvbnN0IGVudHJ5OiBJbnRlcm5hbEVudHJ5PFRMYWJlbD4gPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIHN0YXJ0SWR4LFxuICAgICAgZW5kSWR4OiB1bmRlZmluZWQsXG4gICAgICBpZCxcbiAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgdGhpcy5ieUlkLnNldChpZCwgZW50cnkpO1xuICAgIHJldHVybiB7IF9pZDogaWQsIF9vd25lcjogdGhpcy5vd25lciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGFuIG9wZW4gcmFuZ2UgYXQgYGVuZElkeGAgKGluY2x1c2l2ZSkuIEFmdGVyIGNsb3NlLCB0aGVcbiAgICogcmFuZ2UgaXMgcXVlcnlhYmxlIHdpdGggYm90aCBib3VuZHMuIENsb3NpbmcgYW4gYWxyZWFkeS1jbG9zZWRcbiAgICogdG9rZW4gaXMgYSBuby1vcC4gQ2xvc2luZyBhbiB1bmtub3duIHRva2VuIChmcm9tIGFub3RoZXIgaW5kZXgsXG4gICAqIG9yIGZhYnJpY2F0ZWQpIGlzIGEgbm8tb3AuXG4gICAqL1xuICBjbG9zZSh0b2tlbjogUmFuZ2VUb2tlbiwgZW5kSWR4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodG9rZW4uX293bmVyICE9PSB0aGlzLm93bmVyKSByZXR1cm47IC8vIGNyb3NzLWluZGV4IG1pc3VzZSDigJQgc2lsZW50IG5vLW9wXG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmZpbmRCeUlkKHRva2VuLl9pZCk7XG4gICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5jbG9zZWQpIHJldHVybjtcbiAgICBlbnRyeS5lbmRJZHggPSBlbmRJZHg7XG4gICAgZW50cnkuY2xvc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIEFMTCByYW5nZXMgZW5jbG9zaW5nIGBjb21taXRJZHhgLCBvcmRlcmVkIG91dGVy4oaSaW5uZXIuXG4gICAqIEluY2x1ZGVzIGJvdGggY2xvc2VkIGFuZCBvcGVuIHJhbmdlcy4gRm9yIGEgY2xvc2VkIHJhbmdlIHRvXG4gICAqIGVuY2xvc2U6IGBzdGFydElkeCA8PSBjb21taXRJZHggPD0gZW5kSWR4YC4gRm9yIGFuIG9wZW4gcmFuZ2U6XG4gICAqIGBzdGFydElkeCA8PSBjb21taXRJZHhgIChubyB1cHBlciBib3VuZCBjaGVjaykuXG4gICAqXG4gICAqIE9yZGVyaW5nIHJ1bGU6IGFzY2VuZGluZyBieSBgc3RhcnRJZHhgLCB3aXRoIFRJRVMgQlJPS0VOIEJZXG4gICAqIGRlc2NlbmRpbmcgYGVuZElkeGAgKHdpZGVyIHJhbmdlID0gb3V0ZXIpLiBPcGVuIHJhbmdlcyAoZW5kSWR4XG4gICAqIHVuZGVmaW5lZCkgYXJlIHRyZWF0ZWQgYXMgYCtJbmZpbml0eWAgZm9yIHRpZS1icmVhayDigJQgdGhleVxuICAgKiBhbHdheXMgc29ydCBvdXRlciBvZiBhbnkgY2xvc2VkIHJhbmdlIHN0YXJ0aW5nIGF0IHRoZSBzYW1lIGlkeC5cbiAgICogVGhpcyBpcyB0aGUgb25seSBkZXRlcm1pbmlzdGljIG91dGVy4oaSaW5uZXIgb3JkZXJpbmcgd2hlbiB0d29cbiAgICogYm91bmRhcmllcyBvcGVuIGF0IHRoZSBzYW1lIGNvbW1pdCAoZS5nLiwgUGFyYWxsZWwgcm9vdCArXG4gICAqIGl0cyBmaXJzdCBicmFuY2gpLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgU0hBTExPVyBJTU1VVEFCTEUgQ09QWSDigJQgY2FsbGVyIG11dGF0aW9ucyBkb24ndCBhZmZlY3RcbiAgICogaW50ZXJuYWwgc3RhdGUuXG4gICAqL1xuICBlbmNsb3NpbmcoY29tbWl0SWR4OiBudW1iZXIpOiByZWFkb25seSBSYW5nZUVudHJ5PFRMYWJlbD5bXSB7XG4gICAgY29uc3QgbWF0Y2hlczogUmFuZ2VFbnRyeTxUTGFiZWw+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICBpZiAoZS5zdGFydElkeCA+IGNvbW1pdElkeCkgY29udGludWU7XG4gICAgICBpZiAoZS5lbmRJZHggPT09IHVuZGVmaW5lZCB8fCBlLmVuZElkeCA+PSBjb21taXRJZHgpIHtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKHRvRW50cnkoZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBtYXRjaGVzLnNvcnQob3V0ZXJUb0lubmVyQ29tcGFyYXRvcik7XG4gICAgcmV0dXJuIG1hdGNoZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgcmFuZ2VzIE9WRVJMQVBQSU5HIHRoZSBzbGljZSBgW3N0YXJ0SWR4LCBlbmRJZHhdYC4gQVxuICAgKiByYW5nZSBvdmVybGFwcyBpZiBpdCBzaGFyZXMgYXQgbGVhc3Qgb25lIGNvbW1pdCBwb3NpdGlvbiB3aXRoIHRoZVxuICAgKiBzbGljZS4gVXNlIGZvciBwYXJhbGxlbC1icmFuY2ggZGV0ZWN0aW9uLCB0aW1lLXdpbmRvdyBxdWVyaWVzLFxuICAgKiBvciBcIndoYXQgYm91bmRhcmllcyBmaXJlZCBkdXJpbmcgdGhpcyBzbGljZS5cIlxuICAgKlxuICAgKiBTb3J0ZWQgYnkgdGhlIFNBTUUgb3V0ZXLihpJpbm5lciBjb21wYXJhdG9yIGFzIGBlbmNsb3NpbmcoKWA6XG4gICAqIGFzY2VuZGluZyBieSBgc3RhcnRJZHhgLCB0aWVzIGJyb2tlbiBieSBkZXNjZW5kaW5nIGBlbmRJZHhgXG4gICAqICh3aWRlciA9IG91dGVyOyBvcGVuIHJhbmdlcyB0cmVhdGVkIGFzICtJbmZpbml0eSkuXG4gICAqXG4gICAqIFJldHVybnMgYSBTSEFMTE9XIElNTVVUQUJMRSBDT1BZLlxuICAgKi9cbiAgb3ZlcmxhcHBpbmcoc3RhcnRJZHg6IG51bWJlciwgZW5kSWR4OiBudW1iZXIpOiByZWFkb25seSBSYW5nZUVudHJ5PFRMYWJlbD5bXSB7XG4gICAgY29uc3QgbWF0Y2hlczogUmFuZ2VFbnRyeTxUTGFiZWw+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICAvLyBPdmVybGFwIHRlc3Q6XG4gICAgICAvLyAgIHJhbmdlIHN0YXJ0cyBhZnRlciBzbGljZSBlbmRzIOKGkiBubyBvdmVybGFwXG4gICAgICAvLyAgIHJhbmdlIGVuZHMgKGNsb3NlZCkgYmVmb3JlIHNsaWNlIHN0YXJ0cyDihpIgbm8gb3ZlcmxhcFxuICAgICAgLy8gICBvdGhlcndpc2Ug4oaSIG92ZXJsYXAgKG9wZW4gcmFuZ2VzIGFsd2F5cyBvdmVybGFwIGlmIHRoZXkgc3RhcnQgPD0gZW5kSWR4KVxuICAgICAgaWYgKGUuc3RhcnRJZHggPiBlbmRJZHgpIGNvbnRpbnVlO1xuICAgICAgaWYgKGUuZW5kSWR4ICE9PSB1bmRlZmluZWQgJiYgZS5lbmRJZHggPCBzdGFydElkeCkgY29udGludWU7XG4gICAgICBtYXRjaGVzLnB1c2godG9FbnRyeShlKSk7XG4gICAgfVxuICAgIG1hdGNoZXMuc29ydChvdXRlclRvSW5uZXJDb21wYXJhdG9yKTtcbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxuXG4gIC8qKiBUb3RhbCByYW5nZSBjb3VudCAob3BlbiArIGNsb3NlZCkuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogV2lwZSBhbGwgcmFuZ2VzICsgcmVzZXQgdGhlIHRva2VuIGNvdW50ZXIgQU5EIHJvdGF0ZSB0aGUgb3duZXJcbiAgICogc3ltYm9sIHNvIGFueSB0b2tlbiBmcm9tIGJlZm9yZSB0aGlzIGNsZWFyIGJlY29tZXMgaW52YWxpZC5cbiAgICogQ3JpdGljYWw6IHdpdGhvdXQgcm90YXRpbmcgdGhlIG93bmVyLCBhIHN0YWxlIHRva2VuIHdob3NlIGBfaWRgXG4gICAqIGhhcHBlbnMgdG8gbWF0Y2ggYSByZWN5Y2xlZCBpZCBhZnRlciBjbGVhciB3b3VsZCBzaWxlbnRseSBtdXRhdGVcbiAgICogdGhlIHdyb25nIGVudHJ5LiBPd25lciByb3RhdGlvbiBtYWtlcyBzdGFsZS10b2tlbiBjbG9zZSBhIG5vLW9wXG4gICAqIHZpYSB0aGUgYF9vd25lciAhPT0gdGhpcy5vd25lcmAgZ3VhcmQuXG4gICAqXG4gICAqIENhbGwgZnJvbSBhIGNvbnN1bWVyJ3MgcnVuSWQgZ3VhcmQgd2hlbiBhIG5ldyBydW4gc3RhcnRzIChlLmcuLFxuICAgKiBhZ2VudGZvb3RwcmludCdzIGBvYnNlcnZlUnVuSWQob25OZXdSdW4pYCBmcm9tIFBoYXNlIDIpLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5ieUlkLmNsZWFyKCk7XG4gICAgdGhpcy5uZXh0SWQgPSAwO1xuICAgIHRoaXMub3duZXIgPSBTeW1ib2woJ0NvbW1pdFJhbmdlSW5kZXgnKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRlcm5hbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIE8oMSkgbG9va3VwIGJ5IHRva2VuIGlkLiBBbHdheXMgcmV0dXJucyB0aGUgZW50cnkgdGhhdCB0aGUgdG9rZW5cbiAgICogIHJlZmVyZW5jZXMgKG9yIHVuZGVmaW5lZCBpZiB0aGUgaWQgd2FzIG5ldmVyIG9wZW5lZCBpbiB0aGlzIGluZGV4KS4gKi9cbiAgcHJpdmF0ZSBmaW5kQnlJZChpZDogbnVtYmVyKTogSW50ZXJuYWxFbnRyeTxUTGFiZWw+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ieUlkLmdldChpZCk7XG4gIH1cbn1cblxuLyoqIFByb2plY3QgdGhlIGludGVybmFsIG11dGFibGUgc2hhcGUgaW50byB0aGUgcHVibGljIHJlYWRvbmx5IGVudHJ5LlxuICogIFRoZSBPVVRFUiBvYmplY3QgaXMgYSBmcmVzaCBhbGxvY2F0aW9uIHBlciBxdWVyeSAoc28gY2FsbGVyIGFycmF5XG4gKiAgbXV0YXRpb25zIGRvbid0IGxlYWspLiBUaGUgYGxhYmVsYCBmaWVsZCBpcyBhIFJFRkVSRU5DRSBDT1BZIOKAlFxuICogIGlmIGBUTGFiZWxgIGlzIGFuIG9iamVjdCwgbXV0YXRpbmcgaXRzIGZpZWxkcyB3aWxsIGFmZmVjdCB0aGVcbiAqICBpbnRlcm5hbCBlbnRyeSB0b28uIENvbnN1bWVycyBNVVNUIHRyZWF0IGxhYmVscyBhcyBpbW11dGFibGVcbiAqICAob3IgcGFzcyBwcmltaXRpdmVzKS4gRG9jdW1lbnRlZCBpbiB0aGUgY2xhc3MgSlNEb2MgYXMgdGhlXG4gKiAgXCJsYWJlbHMgYXJlIHN0b3JlZCB2ZXJiYXRpbVwiIGNvbnRyYWN0LiAqL1xuZnVuY3Rpb24gdG9FbnRyeTxUTGFiZWw+KGU6IEludGVybmFsRW50cnk8VExhYmVsPik6IFJhbmdlRW50cnk8VExhYmVsPiB7XG4gIHJldHVybiBlLmVuZElkeCA9PT0gdW5kZWZpbmVkXG4gICAgPyB7IGxhYmVsOiBlLmxhYmVsLCBzdGFydElkeDogZS5zdGFydElkeCB9XG4gICAgOiB7IGxhYmVsOiBlLmxhYmVsLCBzdGFydElkeDogZS5zdGFydElkeCwgZW5kSWR4OiBlLmVuZElkeCB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBvdXRlcuKGkmlubmVyIGNvbXBhcmF0b3IgZm9yIGJvdGggYGVuY2xvc2luZygpYCBhbmRcbiAqIGBvdmVybGFwcGluZygpYC4gUHJpbWFyeSBrZXk6IGBzdGFydElkeGAgYXNjZW5kaW5nLiBUaWUtYnJlYWs6XG4gKiBgZW5kSWR4YCBkZXNjZW5kaW5nICh3aWRlciByYW5nZSBpcyBvdXRlcikuIE9wZW4gcmFuZ2VzICh1bmRlZmluZWRcbiAqIGBlbmRJZHhgKSBzb3J0IGFzICtJbmZpbml0eSDihpIgb3V0ZXJtb3N0IHdoZW4gdGllZC4gRGV0ZXJtaW5pc3RpY1xuICogb3JkZXJpbmcgcmVxdWlyZWQgc28gY29uc3VtZXJzIChMZW5zIGJyZWFkY3J1bWIsIHRpbWUtdHJhdmVsIFVJcylcbiAqIG5ldmVyIHNlZSBmbGlja2VyIG9uIGVxdWFsLXN0YXJ0IGJvdW5kYXJpZXMgKGUuZy4sIGEgUGFyYWxsZWxcbiAqIHJvb3QgYW5kIGl0cyBmaXJzdCBicmFuY2ggb3BlbmluZyBhdCB0aGUgc2FtZSBjb21taXQpLlxuICovXG5mdW5jdGlvbiBvdXRlclRvSW5uZXJDb21wYXJhdG9yPFRMYWJlbD4oYTogUmFuZ2VFbnRyeTxUTGFiZWw+LCBiOiBSYW5nZUVudHJ5PFRMYWJlbD4pOiBudW1iZXIge1xuICBpZiAoYS5zdGFydElkeCAhPT0gYi5zdGFydElkeCkgcmV0dXJuIGEuc3RhcnRJZHggLSBiLnN0YXJ0SWR4O1xuICBjb25zdCBhZSA9IGEuZW5kSWR4ID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgY29uc3QgYmUgPSBiLmVuZElkeCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIHJldHVybiBiZSAtIGFlO1xufVxuIl19
@@ -1,13 +0,0 @@
1
- /**
2
- * @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
3
- * and then goes away; import from the new homes:
4
- *
5
- * - `enableDevMode` / `disableDevMode` / `isDevMode` → `lib/devMode.ts`
6
- * - `hasCircularReference` → `lib/capture/circular.ts`
7
- *
8
- * Both are leaves that imported nothing but sat inside `scope/`, which made `memory/`,
9
- * `recorder/`, `decide/`, `engine/` and `runner/` import upward for them. Same functions,
10
- * same module state — the flag lives in `devMode.ts` and is shared, never copied.
11
- */
12
- export { hasCircularReference } from '../capture/circular.js';
13
- export { disableDevMode, enableDevMode, isDevMode } from '../devMode.js';
@@ -1,14 +0,0 @@
1
- /**
2
- * @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
3
- * and then goes away; import from the new homes:
4
- *
5
- * - `enableDevMode` / `disableDevMode` / `isDevMode` → `lib/devMode.ts`
6
- * - `hasCircularReference` → `lib/capture/circular.ts`
7
- *
8
- * Both are leaves that imported nothing but sat inside `scope/`, which made `memory/`,
9
- * `recorder/`, `decide/`, `engine/` and `runner/` import upward for them. Same functions,
10
- * same module state — the flag lives in `devMode.ts` and is shared, never copied.
11
- */
12
- export { hasCircularReference } from '../capture/circular.js';
13
- export { disableDevMode, enableDevMode, isDevMode } from '../devMode.js';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0Q2lyY3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL2RldGVjdENpcmN1bGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXByZWNhdGVkIE1vdmVkIChGMCwgdGhlIGZlbmNlIGFuZCB0aGUgbGVhdmVzKS4gVGhpcyBwYXRoIHJlLWV4cG9ydHMgZm9yIG9uZSBtaW5vclxuICogYW5kIHRoZW4gZ29lcyBhd2F5OyBpbXBvcnQgZnJvbSB0aGUgbmV3IGhvbWVzOlxuICpcbiAqICAgLSBgZW5hYmxlRGV2TW9kZWAgLyBgZGlzYWJsZURldk1vZGVgIC8gYGlzRGV2TW9kZWAgIOKGkiAgYGxpYi9kZXZNb2RlLnRzYFxuICogICAtIGBoYXNDaXJjdWxhclJlZmVyZW5jZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSICBgbGliL2NhcHR1cmUvY2lyY3VsYXIudHNgXG4gKlxuICogQm90aCBhcmUgbGVhdmVzIHRoYXQgaW1wb3J0ZWQgbm90aGluZyBidXQgc2F0IGluc2lkZSBgc2NvcGUvYCwgd2hpY2ggbWFkZSBgbWVtb3J5L2AsXG4gKiBgcmVjb3JkZXIvYCwgYGRlY2lkZS9gLCBgZW5naW5lL2AgYW5kIGBydW5uZXIvYCBpbXBvcnQgdXB3YXJkIGZvciB0aGVtLiBTYW1lIGZ1bmN0aW9ucyxcbiAqIHNhbWUgbW9kdWxlIHN0YXRlIOKAlCB0aGUgZmxhZyBsaXZlcyBpbiBgZGV2TW9kZS50c2AgYW5kIGlzIHNoYXJlZCwgbmV2ZXIgY29waWVkLlxuICovXG5leHBvcnQgeyBoYXNDaXJjdWxhclJlZmVyZW5jZSB9IGZyb20gJy4uL2NhcHR1cmUvY2lyY3VsYXIuanMnO1xuZXhwb3J0IHsgZGlzYWJsZURldk1vZGUsIGVuYWJsZURldk1vZGUsIGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuIl19
@@ -1,5 +0,0 @@
1
- /**
2
- * @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
3
- * and then goes away; import `summarizeValue` from `lib/capture/summarize.ts`.
4
- */
5
- export { summarizeValue } from '../../capture/summarize.js';
@@ -1,6 +0,0 @@
1
- /**
2
- * @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
3
- * and then goes away; import `summarizeValue` from `lib/capture/summarize.ts`.
4
- */
5
- export { summarizeValue } from '../../capture/summarize.js';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtbWFyaXplVmFsdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL3JlY29yZGVycy9zdW1tYXJpemVWYWx1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXByZWNhdGVkIE1vdmVkIChGMCwgdGhlIGZlbmNlIGFuZCB0aGUgbGVhdmVzKS4gVGhpcyBwYXRoIHJlLWV4cG9ydHMgZm9yIG9uZSBtaW5vclxuICogYW5kIHRoZW4gZ29lcyBhd2F5OyBpbXBvcnQgYHN1bW1hcml6ZVZhbHVlYCBmcm9tIGBsaWIvY2FwdHVyZS9zdW1tYXJpemUudHNgLlxuICovXG5leHBvcnQgeyBzdW1tYXJpemVWYWx1ZSB9IGZyb20gJy4uLy4uL2NhcHR1cmUvc3VtbWFyaXplLmpzJztcbiJdfQ==
@@ -1,81 +0,0 @@
1
- /**
2
- * slice/elementProvenance.ts — APPEND-FOLD PROVENANCE.
3
- *
4
- * THE PROBLEM (why this file exists): in agent charts, almost all dataflow
5
- * funnels through ONE array key (`history`). A key-level slice on it
6
- * degenerates to "everything depends on history" — true and useless. The
7
- * question that actually triages an agent run is element-level:
8
- * "which stage produced history[7]?".
9
- *
10
- * THE INSIGHT: the commit log already contains the answer. Under
11
- * `commitValues: 'delta'` every array growth is recorded as an `append` verb
12
- * whose `overwrite[key]` holds exactly the new tail — each element has an
13
- * explicit birth record. Under `'full'` mode, push-style growth appears as
14
- * consecutive `set`s where the previous array is a strict prefix of the next
15
- * — the tail is attributable by inference. No new capture is needed; this is
16
- * a pure post-hoc query.
17
- *
18
- * THE ALGORITHM (append-fold): WATCH the per-key verb fold — the SAME fold
19
- * `commitValueAt` runs (`memory/verbs.ts` · `foldKey`: one step, `applyVerb`,
20
- * for every verb; this file has no verb switch of its own) — while carrying a
21
- * births array kept index-aligned with the value. The observer is told, after
22
- * each row on, inside or around the key, the value at the key before it and
23
- * after it, and keeps the births — for the commits that WROTE the key under
24
- * the writer rule (`commitLogUtils · writersOf`; since 9.33.0 a write inside
25
- * the key or around it counts, as it does for every key query): a row that
26
- * records only its tail (`append`) earns an exact attribution; every other row
27
- * is a whole-value transition attributed by inference. One difference from
28
- * `commitValueAt`: that helper ANCHORS at the latest `set`/`delete` as a skip
29
- * optimization (earlier commits cannot change the final VALUE). Provenance
30
- * must fold from the FIRST touch, because full-mode growth is a chain of
31
- * `set`s and the anchor would erase every birth but the last. The final value
32
- * is identical either way (the fold is deterministic left-to-right) — a
33
- * property test pins this equivalence.
34
- *
35
- * INVARIANT (maintained on every branch): when the folded value is an array,
36
- * `births.length === value.length` and `births[i]` describes `value[i]`.
37
- *
38
- * HONESTY: every birth is labeled with how it was determined
39
- * ({@link AttributionBasis}) — `'append-verb'` is engine-recorded truth,
40
- * `'prefix-inference'` is a heuristic (a wholesale replacement that happens
41
- * to share the old prefix is indistinguishable from an append), and
42
- * `'whole-value'` is an explicit reset. Absence is honest too: a missing
43
- * provenance carries a {@link MissingProvenanceReason}, mirroring
44
- * `VariableSlice.missing` — one absence pattern module-wide.
45
- *
46
- * COMPLEXITY: delta-mode logs need no equality checks — O(total elements).
47
- * Full-mode logs pay a strict-prefix check (deepEqual per element) per
48
- * full-value touch: O(touches × length) element comparisons worst case.
49
- * Post-hoc query, off the hot path — acceptable; measured in the perf tests.
50
- */
51
- import type { CommitBundle } from '../memory/types.js';
52
- import type { ArrayProvenance, ElementBirth, StateKey } from './types.js';
53
- /**
54
- * Element-level provenance for one array-valued key: fold the key's commits
55
- * and return index-aligned birth records for every element.
56
- *
57
- * @param key A {@link StateKey}: the top-level key string, or a path array
58
- * for nested keys (normalised internally — no engine delimiters needed).
59
- * @param options.atIdx Inclusive commit array index to fold to (default: the
60
- * whole log). NOT the executionIndex from a runtimeStageId.
61
- * @returns Always an {@link ArrayProvenance}; on failure `missing` says why
62
- * (`'not-an-array'` for scalar/deleted/degraded keys — those are
63
- * `sliceForKey` territory). Blind spot shared with the whole commit-log
64
- * family: elements present in the run's INITIAL state (seeded, never
65
- * re-set in range) are invisible here.
66
- */
67
- export declare function arrayProvenance(commitLog: CommitBundle[], key: StateKey, options?: {
68
- atIdx?: number;
69
- }): ArrayProvenance;
70
- /**
71
- * Convenience over {@link arrayProvenance}: the birth of ONE element.
72
- * Returns `undefined` when the key has no array provenance (any
73
- * {@link MissingProvenanceReason}) or `index` is out of range at `atIdx` —
74
- * Map.get-like semantics; use {@link arrayProvenance} directly when you need
75
- * the missing reason.
76
- *
77
- * @see ElementBirth
78
- */
79
- export declare function elementProvenance(commitLog: CommitBundle[], key: StateKey, index: number, options?: {
80
- atIdx?: number;
81
- }): ElementBirth | undefined;