footprintjs 10.3.0 → 10.5.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 (146) hide show
  1. package/README.md +63 -25
  2. package/dist/esm/index.d.ts +2 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
  5. package/dist/esm/lib/capture/absentEntries.js +81 -0
  6. package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
  7. package/dist/esm/lib/capture/checkpointCapture.js +104 -0
  8. package/dist/esm/lib/capture/historyData.d.ts +13 -0
  9. package/dist/esm/lib/capture/historyData.js +96 -0
  10. package/dist/esm/lib/capture/historyNote.d.ts +4 -0
  11. package/dist/esm/lib/capture/historyNote.js +57 -0
  12. package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
  13. package/dist/esm/lib/capture/historyTarget.js +35 -0
  14. package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
  15. package/dist/esm/lib/capture/historyTypes.js +4 -0
  16. package/dist/esm/lib/capture/nativeCoverage.d.ts +20 -7
  17. package/dist/esm/lib/capture/nativeCoverage.js +50 -12
  18. package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
  19. package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
  20. package/dist/esm/lib/capture/noteShape.d.ts +10 -0
  21. package/dist/esm/lib/capture/noteShape.js +93 -0
  22. package/dist/esm/lib/capture/readSources.d.ts +49 -0
  23. package/dist/esm/lib/capture/readSources.js +99 -0
  24. package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
  25. package/dist/esm/lib/capture/sinkSettlement.js +10 -0
  26. package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
  27. package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
  28. package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
  29. package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
  30. package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +3 -0
  31. package/dist/esm/lib/capture/storedReadSourceCounts.js +78 -0
  32. package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
  33. package/dist/esm/lib/capture/storedReadSources.js +104 -0
  34. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +14 -2
  35. package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
  36. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  37. package/dist/esm/lib/engine/types.d.ts +4 -0
  38. package/dist/esm/lib/engine/types.js +1 -1
  39. package/dist/esm/lib/memory/StageContext.d.ts +9 -0
  40. package/dist/esm/lib/memory/StageContext.js +96 -9
  41. package/dist/esm/lib/memory/frameTypes.d.ts +3 -0
  42. package/dist/esm/lib/memory/frameTypes.js +1 -1
  43. package/dist/esm/lib/memory/logAddress.d.ts +3 -0
  44. package/dist/esm/lib/memory/logAddress.js +7 -0
  45. package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
  46. package/dist/esm/lib/memory/runPolicy.js +2 -1
  47. package/dist/esm/lib/pause/record.js +8 -2
  48. package/dist/esm/lib/pause/types.d.ts +2 -0
  49. package/dist/esm/lib/pause/types.js +1 -1
  50. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +19 -3
  51. package/dist/esm/lib/runner/ExecutionRuntime.js +92 -6
  52. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +3 -0
  53. package/dist/esm/lib/runner/FlowChartExecutor.js +50 -10
  54. package/dist/esm/lib/runner/attach.js +3 -1
  55. package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
  56. package/dist/esm/lib/runner/captureHistory.js +112 -0
  57. package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
  58. package/dist/esm/lib/runner/checkpoint.js +3 -1
  59. package/dist/esm/lib/runner/index.d.ts +1 -0
  60. package/dist/esm/lib/runner/index.js +1 -1
  61. package/dist/esm/lib/runner/options.js +42 -3
  62. package/dist/esm/lib/runner/readStoredCapture.d.ts +41 -0
  63. package/dist/esm/lib/runner/readStoredCapture.js +36 -0
  64. package/dist/esm/lib/runner/recordSink.d.ts +11 -0
  65. package/dist/esm/lib/runner/recordSink.js +48 -13
  66. package/dist/esm/lib/runner/snapshot.js +2 -2
  67. package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
  68. package/dist/esm/lib/runner/storedCaptureAdmission.js +99 -0
  69. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  70. package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
  71. package/dist/esm/lib/sinks/fileSink.js +8 -2
  72. package/dist/esm/trace.d.ts +2 -0
  73. package/dist/esm/trace.js +2 -1
  74. package/dist/index.js +1 -1
  75. package/dist/lib/capture/absentEntries.js +86 -0
  76. package/dist/lib/capture/checkpointCapture.js +110 -0
  77. package/dist/lib/capture/historyData.js +104 -0
  78. package/dist/lib/capture/historyNote.js +61 -0
  79. package/dist/lib/capture/historyTarget.js +40 -0
  80. package/dist/lib/capture/historyTypes.js +7 -0
  81. package/dist/lib/capture/nativeCoverage.js +52 -13
  82. package/dist/lib/capture/nativeSourceAddress.js +19 -0
  83. package/dist/lib/capture/noteShape.js +103 -0
  84. package/dist/lib/capture/readSources.js +106 -0
  85. package/dist/lib/capture/sinkSettlement.js +14 -0
  86. package/dist/lib/capture/sourceReadCounts.js +31 -0
  87. package/dist/lib/capture/sourceReferenceBudget.js +25 -0
  88. package/dist/lib/capture/storedReadSourceCounts.js +82 -0
  89. package/dist/lib/capture/storedReadSources.js +108 -0
  90. package/dist/lib/engine/handlers/SubflowExecutor.js +14 -2
  91. package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
  92. package/dist/lib/engine/types.js +1 -1
  93. package/dist/lib/memory/StageContext.js +96 -9
  94. package/dist/lib/memory/frameTypes.js +1 -1
  95. package/dist/lib/memory/logAddress.js +11 -0
  96. package/dist/lib/memory/runPolicy.js +2 -1
  97. package/dist/lib/pause/record.js +8 -2
  98. package/dist/lib/pause/types.js +1 -1
  99. package/dist/lib/runner/ExecutionRuntime.js +91 -5
  100. package/dist/lib/runner/FlowChartExecutor.js +50 -10
  101. package/dist/lib/runner/attach.js +3 -1
  102. package/dist/lib/runner/captureHistory.js +116 -0
  103. package/dist/lib/runner/checkpoint.js +3 -1
  104. package/dist/lib/runner/index.js +1 -1
  105. package/dist/lib/runner/options.js +42 -3
  106. package/dist/lib/runner/readStoredCapture.js +40 -0
  107. package/dist/lib/runner/recordSink.js +50 -15
  108. package/dist/lib/runner/snapshot.js +2 -2
  109. package/dist/lib/runner/storedCaptureAdmission.js +103 -0
  110. package/dist/lib/scope/ScopeFacade.js +2 -2
  111. package/dist/lib/sinks/fileSink.js +8 -2
  112. package/dist/trace.js +4 -2
  113. package/dist/types/index.d.ts +2 -0
  114. package/dist/types/lib/capture/absentEntries.d.ts +7 -0
  115. package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
  116. package/dist/types/lib/capture/historyData.d.ts +13 -0
  117. package/dist/types/lib/capture/historyNote.d.ts +4 -0
  118. package/dist/types/lib/capture/historyTarget.d.ts +5 -0
  119. package/dist/types/lib/capture/historyTypes.d.ts +39 -0
  120. package/dist/types/lib/capture/nativeCoverage.d.ts +20 -7
  121. package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
  122. package/dist/types/lib/capture/noteShape.d.ts +10 -0
  123. package/dist/types/lib/capture/readSources.d.ts +49 -0
  124. package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
  125. package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
  126. package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
  127. package/dist/types/lib/capture/storedReadSourceCounts.d.ts +3 -0
  128. package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
  129. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  130. package/dist/types/lib/engine/types.d.ts +4 -0
  131. package/dist/types/lib/memory/StageContext.d.ts +9 -0
  132. package/dist/types/lib/memory/frameTypes.d.ts +3 -0
  133. package/dist/types/lib/memory/logAddress.d.ts +3 -0
  134. package/dist/types/lib/memory/runPolicy.d.ts +5 -1
  135. package/dist/types/lib/pause/types.d.ts +2 -0
  136. package/dist/types/lib/runner/ExecutionRuntime.d.ts +19 -3
  137. package/dist/types/lib/runner/FlowChartExecutor.d.ts +3 -0
  138. package/dist/types/lib/runner/captureHistory.d.ts +8 -0
  139. package/dist/types/lib/runner/checkpoint.d.ts +2 -0
  140. package/dist/types/lib/runner/index.d.ts +1 -0
  141. package/dist/types/lib/runner/readStoredCapture.d.ts +41 -0
  142. package/dist/types/lib/runner/recordSink.d.ts +11 -0
  143. package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
  144. package/dist/types/lib/sinks/fileSink.d.ts +2 -1
  145. package/dist/types/trace.d.ts +2 -0
  146. package/package.json +2 -2
@@ -0,0 +1,93 @@
1
+ import { CAPTURE_CHANNEL_STATUSES, CAPTURE_COMMIT_VALUE_MODES, CAPTURE_LIMITATIONS, CAPTURE_PROVENANCE_MODES, CAPTURE_RETENTION_MODES, isCaptureValue, } from './nativeCoverage.js';
2
+ /** @internal One inert-data boundary for checkpoint and history capture codecs. */
3
+ export function ownData(record, key) {
4
+ if (!record || typeof record !== 'object' || Object.getPrototypeOf(record) !== Object.prototype)
5
+ return undefined;
6
+ return Object.getOwnPropertyDescriptor(record, key)?.value;
7
+ }
8
+ export function captureIdentifier(value) {
9
+ return typeof value === 'string' && value.length > 0 && value.length <= 2048;
10
+ }
11
+ function count(value) {
12
+ return Number.isSafeInteger(value) && value >= 0;
13
+ }
14
+ /** Exact history shapes refuse extras; checkpoints deliberately project known fields. */
15
+ function shapeKeys(value, fields, exact) {
16
+ return !exact || (!!value && typeof value === 'object' && Object.keys(value).length === fields.length);
17
+ }
18
+ export function copyIdentity(value, exact = false, version = 1) {
19
+ const runId = ownData(value, 'runId');
20
+ const address = ownData(value, 'logAddress');
21
+ const logRunId = ownData(address, 'logRunId');
22
+ const drill = ownData(address, 'drillPath');
23
+ const commits = ownData(value, 'commits');
24
+ const from = ownData(commits, 'from');
25
+ const to = ownData(commits, 'to');
26
+ if (ownData(value, 'version') !== version ||
27
+ !captureIdentifier(runId) ||
28
+ !captureIdentifier(logRunId) ||
29
+ !Array.isArray(drill) ||
30
+ Object.getPrototypeOf(drill) !== Array.prototype ||
31
+ Object.getOwnPropertyDescriptor(drill, 'length')?.value !== 0 ||
32
+ !count(from) ||
33
+ !count(to) ||
34
+ from > to ||
35
+ !shapeKeys(address, ['logRunId', 'drillPath'], exact) ||
36
+ !shapeKeys(commits, ['from', 'to'], exact))
37
+ return undefined;
38
+ return {
39
+ runId,
40
+ logAddress: Object.freeze({ logRunId, drillPath: Object.freeze([]) }),
41
+ commits: Object.freeze({ from, to }),
42
+ };
43
+ }
44
+ export function copyModes(value, exact = false) {
45
+ const readTracking = ownData(value, 'readTracking');
46
+ const writeTracking = ownData(value, 'writeTracking');
47
+ const commitValues = ownData(value, 'commitValues');
48
+ const writeProvenance = ownData(value, 'writeProvenance');
49
+ if (!isCaptureValue(readTracking, CAPTURE_RETENTION_MODES) ||
50
+ !isCaptureValue(writeTracking, CAPTURE_RETENTION_MODES) ||
51
+ !isCaptureValue(commitValues, CAPTURE_COMMIT_VALUE_MODES) ||
52
+ !isCaptureValue(writeProvenance, CAPTURE_PROVENANCE_MODES) ||
53
+ !shapeKeys(value, ['readTracking', 'writeTracking', 'commitValues', 'writeProvenance'], exact))
54
+ return undefined;
55
+ return Object.freeze({ readTracking, writeTracking, commitValues, writeProvenance });
56
+ }
57
+ export function copyChannels(value, exact = false) {
58
+ const observed = copyObservedChannels(value);
59
+ if (!observed ||
60
+ ownData(value, 'readSources') !== 'not-collected' ||
61
+ !shapeKeys(value, ['reads', 'writes', 'attention', 'control', 'readSources'], exact))
62
+ return undefined;
63
+ return Object.freeze({ ...observed, readSources: 'not-collected' });
64
+ }
65
+ /** Shared native statuses; source version admission remains explicit at each codec boundary. */
66
+ export function copyObservedChannels(value) {
67
+ const reads = ownData(value, 'reads');
68
+ const writes = ownData(value, 'writes');
69
+ const attention = ownData(value, 'attention');
70
+ const control = ownData(value, 'control');
71
+ if (!isCaptureValue(reads, CAPTURE_CHANNEL_STATUSES) ||
72
+ !isCaptureValue(writes, CAPTURE_CHANNEL_STATUSES) ||
73
+ !isCaptureValue(attention, CAPTURE_CHANNEL_STATUSES) ||
74
+ !isCaptureValue(control, CAPTURE_CHANNEL_STATUSES))
75
+ return undefined;
76
+ return Object.freeze({ reads, writes, attention, control });
77
+ }
78
+ export function copyLimitations(value) {
79
+ if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype)
80
+ return undefined;
81
+ const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
82
+ if (!count(length) || length > 32)
83
+ return undefined;
84
+ const limitations = [];
85
+ for (let index = 0; index < length; index++) {
86
+ const entry = Object.getOwnPropertyDescriptor(value, String(index))?.value;
87
+ if (!isCaptureValue(entry, CAPTURE_LIMITATIONS))
88
+ return undefined;
89
+ limitations.push(entry);
90
+ }
91
+ return Object.freeze(limitations);
92
+ }
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZVNoYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL25vdGVTaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLDBCQUEwQixFQUMxQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2QixjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLE9BQU8sQ0FBQyxNQUFlLEVBQUUsR0FBVztJQUNsRCxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEgsT0FBTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztBQUM3RCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7QUFDL0UsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLEtBQWM7SUFDM0IsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFLLEtBQWdCLElBQUksQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCx5RkFBeUY7QUFDekYsU0FBUyxTQUFTLENBQUMsS0FBYyxFQUFFLE1BQXlCLEVBQUUsS0FBYztJQUMxRSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FB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LENBQUMsT0FBTyxFQUFFLHdCQUF3QixDQUFDO1FBRWxELE9BQU8sU0FBUyxDQUFDO0lBQ25CLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYztJQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDaEcsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7SUFDdkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3BELE1BQU0sV0FBVyxHQUF3QixFQUFFLENBQUM7SUFDNUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQzNFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDbEUsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhcHR1cmVMaW1pdGF0aW9uLCBOYXRpdmVDYXB0dXJlTm90ZSB9IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQ0FQVFVSRV9DSEFOTkVMX1NUQVRVU0VTLFxuICBDQVBUVVJFX0NPTU1JVF9WQUxVRV9NT0RFUyxcbiAgQ0FQVFVSRV9MSU1JVEFUSU9OUyxcbiAgQ0FQVFVSRV9QUk9WRU5BTkNFX01PREVTLFxuICBDQVBUVVJFX1JFVEVOVElPTl9NT0RFUyxcbiAgaXNDYXB0dXJlVmFsdWUsXG59IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuXG4vKiogQGludGVybmFsIE9uZSBpbmVydC1kYXRhIGJvdW5kYXJ5IGZvciBjaGVja3BvaW50IGFuZCBoaXN0b3J5IGNhcHR1cmUgY29kZWNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bkRhdGEocmVjb3JkOiB1bmtub3duLCBrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIXJlY29yZCB8fCB0eXBlb2YgcmVjb3JkICE9PSAnb2JqZWN0JyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocmVjb3JkKSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVjb3JkLCBrZXkpPy52YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVJZGVudGlmaWVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPD0gMjA0ODtcbn1cblxuZnVuY3Rpb24gY291bnQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpICYmICh2YWx1ZSBhcyBudW1iZXIpID49IDA7XG59XG5cbi8qKiBFeGFjdCBoaXN0b3J5IHNoYXBlcyByZWZ1c2UgZXh0cmFzOyBjaGVja3BvaW50cyBkZWxpYmVyYXRlbHkgcHJvamVjdCBrbm93biBmaWVsZHMuICovXG5mdW5jdGlvbiBzaGFwZUtleXModmFsdWU6IHVua25vd24sIGZpZWxkczogcmVhZG9ubHkgc3RyaW5nW10sIGV4YWN0OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhZXhhY3QgfHwgKCEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSBmaWVsZHMubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlJZGVudGl0eShcbiAgdmFsdWU6IHVua25vd24sXG4gIGV4YWN0ID0gZmFsc2UsXG4gIHZlcnNpb246IDEgfCAyID0gMSxcbik6IFBpY2s8TmF0aXZlQ2FwdHVyZU5vdGUsICdydW5JZCcgfCAnbG9nQWRkcmVzcycgfCAnY29tbWl0cyc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcnVuSWQgPSBvd25EYXRhKHZhbHVlLCAncnVuSWQnKTtcbiAgY29uc3QgYWRkcmVzcyA9IG93bkRhdGEodmFsdWUsICdsb2dBZGRyZXNzJyk7XG4gIGNvbnN0IGxvZ1J1bklkID0gb3duRGF0YShhZGRyZXNzLCAnbG9nUnVuSWQnKTtcbiAgY29uc3QgZHJpbGwgPSBvd25EYXRhKGFkZHJlc3MsICdkcmlsbFBhdGgnKTtcbiAgY29uc3QgY29tbWl0cyA9IG93bkRhdGEodmFsdWUsICdjb21taXRzJyk7XG4gIGNvbnN0IGZyb20gPSBvd25EYXRhKGNvbW1pdHMsICdmcm9tJyk7XG4gIGNvbnN0IHRvID0gb3duRGF0YShjb21taXRzLCAndG8nKTtcbiAgaWYgKFxuICAgIG93bkRhdGEodmFsdWUsICd2ZXJzaW9uJykgIT09IHZlcnNpb24gfHxcbiAgICAhY2FwdHVyZUlkZW50aWZpZXIocnVuSWQpIHx8XG4gICAgIWNhcHR1cmVJZGVudGlmaWVyKGxvZ1J1bklkKSB8fFxuICAgICFBcnJheS5pc0FycmF5KGRyaWxsKSB8fFxuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihkcmlsbCkgIT09IEFycmF5LnByb3RvdHlwZSB8fFxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZHJpbGwsICdsZW5ndGgnKT8udmFsdWUgIT09IDAgfHxcbiAgICAhY291bnQoZnJvbSkgfHxcbiAgICAhY291bnQodG8pIHx8XG4gICAgZnJvbSA+IHRvIHx8XG4gICAgIXNoYXBlS2V5cyhhZGRyZXNzLCBbJ2xvZ1J1bklkJywgJ2RyaWxsUGF0aCddLCBleGFjdCkgfHxcbiAgICAhc2hhcGVLZXlzKGNvbW1pdHMsIFsnZnJvbScsICd0byddLCBleGFjdClcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgcnVuSWQsXG4gICAgbG9nQWRkcmVzczogT2JqZWN0LmZyZWV6ZSh7IGxvZ1J1bklkLCBkcmlsbFBhdGg6IE9iamVjdC5mcmVlemUoW10pIH0pLFxuICAgIGNvbW1pdHM6IE9iamVjdC5mcmVlemUoeyBmcm9tLCB0byB9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlNb2Rlcyh2YWx1ZTogdW5rbm93biwgZXhhY3QgPSBmYWxzZSk6IE5hdGl2ZUNhcHR1cmVOb3RlWydtb2RlcyddIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVhZFRyYWNraW5nID0gb3duRGF0YSh2YWx1ZSwgJ3JlYWRUcmFja2luZycpO1xuICBjb25zdCB3cml0ZVRyYWNraW5nID0gb3duRGF0YSh2YWx1ZSwgJ3dyaXRlVHJhY2tpbmcnKTtcbiAgY29uc3QgY29tbWl0VmFsdWVzID0gb3duRGF0YSh2YWx1ZSwgJ2NvbW1pdFZhbHVlcycpO1xuICBjb25zdCB3cml0ZVByb3ZlbmFuY2UgPSBvd25EYXRhKHZhbHVlLCAnd3JpdGVQcm92ZW5hbmNlJyk7XG4gIGlmIChcbiAgICAhaXNDYXB0dXJlVmFsdWUocmVhZFRyYWNraW5nLCBDQVBUVVJFX1JFVEVOVElPTl9NT0RFUykgfHxcbiAgICAhaXNDYXB0dXJlVmFsdWUod3JpdGVUcmFja2luZywgQ0FQVFVSRV9SRVRFTlRJT05fTU9ERVMpIHx8XG4gICAgIWlzQ2FwdHVyZVZhbHVlKGNvbW1pdFZhbHVlcywgQ0FQVFVSRV9DT01NSVRfVkFMVUVfTU9ERVMpIHx8XG4gICAgIWlzQ2FwdHVyZVZhbHVlKHdyaXRlUHJvdmVuYW5jZSwgQ0FQVFVSRV9QUk9WRU5BTkNFX01PREVTKSB8fFxuICAgICFzaGFwZUtleXModmFsdWUsIFsncmVhZFRyYWNraW5nJywgJ3dyaXRlVHJhY2tpbmcnLCAnY29tbWl0VmFsdWVzJywgJ3dyaXRlUHJvdmVuYW5jZSddLCBleGFjdClcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHsgcmVhZFRyYWNraW5nLCB3cml0ZVRyYWNraW5nLCBjb21taXRWYWx1ZXMsIHdyaXRlUHJvdmVuYW5jZSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlDaGFubmVscyh2YWx1ZTogdW5rbm93biwgZXhhY3QgPSBmYWxzZSk6IE5hdGl2ZUNhcHR1cmVOb3RlWydjaGFubmVscyddIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb2JzZXJ2ZWQgPSBjb3B5T2JzZXJ2ZWRDaGFubmVscyh2YWx1ZSk7XG4gIGlmIChcbiAgICAhb2JzZXJ2ZWQgfHxcbiAgICBvd25EYXRhKHZhbHVlLCAncmVhZFNvdXJjZXMnKSAhPT0gJ25vdC1jb2xsZWN0ZWQnIHx8XG4gICAgIXNoYXBlS2V5cyh2YWx1ZSwgWydyZWFkcycsICd3cml0ZXMnLCAnYXR0ZW50aW9uJywgJ2NvbnRyb2wnLCAncmVhZFNvdXJjZXMnXSwgZXhhY3QpXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IC4uLm9ic2VydmVkLCByZWFkU291cmNlczogJ25vdC1jb2xsZWN0ZWQnIH0pO1xufVxuXG4vKiogU2hhcmVkIG5hdGl2ZSBzdGF0dXNlczsgc291cmNlIHZlcnNpb24gYWRtaXNzaW9uIHJlbWFpbnMgZXhwbGljaXQgYXQgZWFjaCBjb2RlYyBib3VuZGFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5T2JzZXJ2ZWRDaGFubmVscyh2YWx1ZTogdW5rbm93bik6IE9taXQ8TmF0aXZlQ2FwdHVyZU5vdGVbJ2NoYW5uZWxzJ10sICdyZWFkU291cmNlcyc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVhZHMgPSBvd25EYXRhKHZhbHVlLCAncmVhZHMnKTtcbiAgY29uc3Qgd3JpdGVzID0gb3duRGF0YSh2YWx1ZSwgJ3dyaXRlcycpO1xuICBjb25zdCBhdHRlbnRpb24gPSBvd25EYXRhKHZhbHVlLCAnYXR0ZW50aW9uJyk7XG4gIGNvbnN0IGNvbnRyb2wgPSBvd25EYXRhKHZhbHVlLCAnY29udHJvbCcpO1xuICBpZiAoXG4gICAgIWlzQ2FwdHVyZVZhbHVlKHJlYWRzLCBDQVBUVVJFX0NIQU5ORUxfU1RBVFVTRVMpIHx8XG4gICAgIWlzQ2FwdHVyZVZhbHVlKHdyaXRlcywgQ0FQVFVSRV9DSEFOTkVMX1NUQVRVU0VTKSB8fFxuICAgICFpc0NhcHR1cmVWYWx1ZShhdHRlbnRpb24sIENBUFRVUkVfQ0hBTk5FTF9TVEFUVVNFUykgfHxcbiAgICAhaXNDYXB0dXJlVmFsdWUoY29udHJvbCwgQ0FQVFVSRV9DSEFOTkVMX1NUQVRVU0VTKVxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoeyByZWFkcywgd3JpdGVzLCBhdHRlbnRpb24sIGNvbnRyb2wgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5TGltaXRhdGlvbnModmFsdWU6IHVua25vd24pOiByZWFkb25seSBDYXB0dXJlTGltaXRhdGlvbltdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpICE9PSBBcnJheS5wcm90b3R5cGUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGxlbmd0aCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdsZW5ndGgnKT8udmFsdWU7XG4gIGlmICghY291bnQobGVuZ3RoKSB8fCBsZW5ndGggPiAzMikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbGltaXRhdGlvbnM6IENhcHR1cmVMaW1pdGF0aW9uW10gPSBbXTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwgU3RyaW5nKGluZGV4KSk/LnZhbHVlO1xuICAgIGlmICghaXNDYXB0dXJlVmFsdWUoZW50cnksIENBUFRVUkVfTElNSVRBVElPTlMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGxpbWl0YXRpb25zLnB1c2goZW50cnkpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKGxpbWl0YXRpb25zKTtcbn1cbiJdfQ==
@@ -0,0 +1,49 @@
1
+ import type { ReadSourceRecord, ReadSourceSnapshot } from 'foottrace/write';
2
+ import type { CaptureChannelStatus, NativeCaptureNote } from './nativeCoverage.js';
3
+ /** Engine coverage only. Source descriptors and their codec belong to foottrace/write. */
4
+ export declare const SOURCE_LIMITATIONS: readonly ["privacy-active", "identity-unavailable", "untracked-read", "custom-scope", "child-source-ownership", "source-address-unsupported", "resumed-source-ownership", "sink-source-unsupported", "source-history-not-included", "source-capture-failed", "redacted-source-export"];
5
+ export type SourceLimitation = (typeof SOURCE_LIMITATIONS)[number];
6
+ /** Packet 3 is an in-memory observation, not a stored-history acknowledgement. */
7
+ export interface EngineReadSources {
8
+ readonly version: 1;
9
+ readonly runId: string;
10
+ readonly persistence: 'memory-only';
11
+ readonly commits: {
12
+ readonly from: number;
13
+ readonly to: number;
14
+ };
15
+ readonly status: CaptureChannelStatus;
16
+ readonly limitations: readonly SourceLimitation[];
17
+ /** Absent means unknown ownership, never an observed-empty book. */
18
+ readonly record?: ReadSourceSnapshot;
19
+ }
20
+ /** A new discriminant prevents strict v1 readers from accepting new completeness claims. */
21
+ export interface NativeReadCaptureNote extends Omit<NativeCaptureNote, 'version' | 'channels'> {
22
+ readonly version: 2;
23
+ readonly channels: Omit<NativeCaptureNote['channels'], 'readSources'> & {
24
+ readonly readSources: CaptureChannelStatus;
25
+ };
26
+ }
27
+ export type NativeCaptureObservation = NativeCaptureNote | NativeReadCaptureNote;
28
+ /** One owner per runtime/leg; propagated only to frames in that log. Never reads values or scans commits. */
29
+ export declare class EngineReadSourceCapture {
30
+ readonly runId: string;
31
+ private readonly book?;
32
+ readonly from: number;
33
+ private readonly gaps;
34
+ private sealed?;
35
+ private retired;
36
+ get observing(): boolean;
37
+ get active(): boolean;
38
+ constructor(runId: string, book?: ReadSourceRecord | undefined, gap?: SourceLimitation, from?: number);
39
+ limit(gap: SourceLimitation): void;
40
+ retire(): void;
41
+ seal(to: number): void;
42
+ snapshot(to: number, redact?: boolean): EngineReadSources;
43
+ }
44
+ /** Keep the v1 producer unchanged. Only explicitly enabled source observations acquire v2. */
45
+ export declare function withReadSources(note: NativeCaptureNote, sources: EngineReadSources): NativeReadCaptureNote;
46
+ /** One status rule shared by native observations and stored admission; storage cannot upgrade coverage. */
47
+ export declare function readSourceStatus(record: ReadSourceSnapshot | undefined, limitations: number): CaptureChannelStatus;
48
+ /** Redacted exports withhold every reference, including those captured before a later privacy mark. */
49
+ export declare function redactReadSources(source: EngineReadSources): EngineReadSources;
@@ -0,0 +1,99 @@
1
+ /** Engine coverage only. Source descriptors and their codec belong to foottrace/write. */
2
+ export const SOURCE_LIMITATIONS = Object.freeze([
3
+ 'privacy-active',
4
+ 'identity-unavailable',
5
+ 'untracked-read',
6
+ 'custom-scope',
7
+ 'child-source-ownership',
8
+ 'source-address-unsupported',
9
+ 'resumed-source-ownership',
10
+ 'sink-source-unsupported',
11
+ 'source-history-not-included',
12
+ 'source-capture-failed',
13
+ 'redacted-source-export',
14
+ ]);
15
+ /** One owner per runtime/leg; propagated only to frames in that log. Never reads values or scans commits. */
16
+ export class EngineReadSourceCapture {
17
+ runId;
18
+ book;
19
+ from;
20
+ gaps = new Set();
21
+ sealed;
22
+ retired = false;
23
+ get observing() {
24
+ return this.book !== undefined;
25
+ }
26
+ get active() {
27
+ return this.observing && !this.retired;
28
+ }
29
+ constructor(runId, book, gap, from = 0) {
30
+ this.runId = runId;
31
+ this.book = book;
32
+ this.from = from;
33
+ if (gap)
34
+ this.gaps.add(gap);
35
+ }
36
+ limit(gap) {
37
+ if (!this.sealed)
38
+ this.gaps.add(gap);
39
+ }
40
+ retire() {
41
+ this.retired = true;
42
+ this.book?.retire();
43
+ }
44
+ seal(to) {
45
+ if (this.sealed)
46
+ return;
47
+ this.sealed = this.snapshot(to);
48
+ this.retire();
49
+ }
50
+ snapshot(to, redact = false) {
51
+ if (redact)
52
+ return redactReadSources(this.snapshot(to));
53
+ if (this.sealed && !redact)
54
+ return this.sealed;
55
+ const gaps = new Set(this.gaps);
56
+ const record = this.book?.snapshot();
57
+ const status = readSourceStatus(record, gaps.size);
58
+ return Object.freeze({
59
+ version: 1,
60
+ runId: this.runId,
61
+ persistence: 'memory-only',
62
+ commits: Object.freeze({ from: this.from, to }),
63
+ status,
64
+ limitations: Object.freeze([...gaps]),
65
+ ...(record && { record }),
66
+ });
67
+ }
68
+ }
69
+ /** Keep the v1 producer unchanged. Only explicitly enabled source observations acquire v2. */
70
+ export function withReadSources(note, sources) {
71
+ return Object.freeze({
72
+ ...note,
73
+ version: 2,
74
+ channels: Object.freeze({ ...note.channels, readSources: sources.status }),
75
+ limitations: Object.freeze(note.limitations.filter((gap) => gap !== 'read-sources-not-collected')),
76
+ });
77
+ }
78
+ /** One status rule shared by native observations and stored admission; storage cannot upgrade coverage. */
79
+ export function readSourceStatus(record, limitations) {
80
+ return !record
81
+ ? 'unknown'
82
+ : record.status === 'failed'
83
+ ? 'failed'
84
+ : record.status !== 'captured' || limitations > 0
85
+ ? 'partial'
86
+ : 'captured';
87
+ }
88
+ /** Redacted exports withhold every reference, including those captured before a later privacy mark. */
89
+ export function redactReadSources(source) {
90
+ return Object.freeze({
91
+ version: source.version,
92
+ runId: source.runId,
93
+ persistence: source.persistence,
94
+ commits: source.commits,
95
+ status: 'unknown',
96
+ limitations: Object.freeze([...new Set([...source.limitations, 'redacted-source-export'])]),
97
+ });
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZFNvdXJjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvcmVhZFNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsMEZBQTBGO0FBQzFGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUMsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLHdCQUF3QjtJQUN4Qiw0QkFBNEI7SUFDNUIsMEJBQTBCO0lBQzFCLHlCQUF5QjtJQUN6Qiw2QkFBNkI7SUFDN0IsdUJBQXVCO0lBQ3ZCLHdCQUF3QjtDQUNoQixDQUFDLENBQUM7QUF3QlosNkdBQTZHO0FBQzdHLE1BQU0sT0FBTyx1QkFBdUI7SUFhdkI7SUFDUTtJQUVSO0lBZk0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQzVDLE1BQU0sQ0FBcUI7SUFDM0IsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN4QixJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxZQUNXLEtBQWEsRUFDTCxJQUF1QixFQUN4QyxHQUFzQixFQUNiLE9BQU8sQ0FBQztRQUhSLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDTCxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUUvQixTQUFJLEdBQUosSUFBSSxDQUFJO1FBRWpCLElBQUksR0FBRztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBcUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFB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SztRQUNuQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7UUFDL0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSx3QkFBaUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyRyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWFkU291cmNlUmVjb3JkLCBSZWFkU291cmNlU25hcHNob3QgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IENhcHR1cmVDaGFubmVsU3RhdHVzLCBOYXRpdmVDYXB0dXJlTm90ZSB9IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuXG4vKiogRW5naW5lIGNvdmVyYWdlIG9ubHkuIFNvdXJjZSBkZXNjcmlwdG9ycyBhbmQgdGhlaXIgY29kZWMgYmVsb25nIHRvIGZvb3R0cmFjZS93cml0ZS4gKi9cbmV4cG9ydCBjb25zdCBTT1VSQ0VfTElNSVRBVElPTlMgPSBPYmplY3QuZnJlZXplKFtcbiAgJ3ByaXZhY3ktYWN0aXZlJyxcbiAgJ2lkZW50aXR5LXVuYXZhaWxhYmxlJyxcbiAgJ3VudHJhY2tlZC1yZWFkJyxcbiAgJ2N1c3RvbS1zY29wZScsXG4gICdjaGlsZC1zb3VyY2Utb3duZXJzaGlwJyxcbiAgJ3NvdXJjZS1hZGRyZXNzLXVuc3VwcG9ydGVkJyxcbiAgJ3Jlc3VtZWQtc291cmNlLW93bmVyc2hpcCcsXG4gICdzaW5rLXNvdXJjZS11bnN1cHBvcnRlZCcsXG4gICdzb3VyY2UtaGlzdG9yeS1ub3QtaW5jbHVkZWQnLFxuICAnc291cmNlLWNhcHR1cmUtZmFpbGVkJyxcbiAgJ3JlZGFjdGVkLXNvdXJjZS1leHBvcnQnLFxuXSBhcyBjb25zdCk7XG5leHBvcnQgdHlwZSBTb3VyY2VMaW1pdGF0aW9uID0gKHR5cGVvZiBTT1VSQ0VfTElNSVRBVElPTlMpW251bWJlcl07XG5cbi8qKiBQYWNrZXQgMyBpcyBhbiBpbi1tZW1vcnkgb2JzZXJ2YXRpb24sIG5vdCBhIHN0b3JlZC1oaXN0b3J5IGFja25vd2xlZGdlbWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5naW5lUmVhZFNvdXJjZXMge1xuICByZWFkb25seSB2ZXJzaW9uOiAxO1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwZXJzaXN0ZW5jZTogJ21lbW9yeS1vbmx5JztcbiAgcmVhZG9ubHkgY29tbWl0czogeyByZWFkb25seSBmcm9tOiBudW1iZXI7IHJlYWRvbmx5IHRvOiBudW1iZXIgfTtcbiAgcmVhZG9ubHkgc3RhdHVzOiBDYXB0dXJlQ2hhbm5lbFN0YXR1cztcbiAgcmVhZG9ubHkgbGltaXRhdGlvbnM6IHJlYWRvbmx5IFNvdXJjZUxpbWl0YXRpb25bXTtcbiAgLyoqIEFic2VudCBtZWFucyB1bmtub3duIG93bmVyc2hpcCwgbmV2ZXIgYW4gb2JzZXJ2ZWQtZW1wdHkgYm9vay4gKi9cbiAgcmVhZG9ubHkgcmVjb3JkPzogUmVhZFNvdXJjZVNuYXBzaG90O1xufVxuXG4vKiogQSBuZXcgZGlzY3JpbWluYW50IHByZXZlbnRzIHN0cmljdCB2MSByZWFkZXJzIGZyb20gYWNjZXB0aW5nIG5ldyBjb21wbGV0ZW5lc3MgY2xhaW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUgZXh0ZW5kcyBPbWl0PE5hdGl2ZUNhcHR1cmVOb3RlLCAndmVyc2lvbicgfCAnY2hhbm5lbHMnPiB7XG4gIHJlYWRvbmx5IHZlcnNpb246IDI7XG4gIHJlYWRvbmx5IGNoYW5uZWxzOiBPbWl0PE5hdGl2ZUNhcHR1cmVOb3RlWydjaGFubmVscyddLCAncmVhZFNvdXJjZXMnPiAmIHtcbiAgICByZWFkb25seSByZWFkU291cmNlczogQ2FwdHVyZUNoYW5uZWxTdGF0dXM7XG4gIH07XG59XG5leHBvcnQgdHlwZSBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb24gPSBOYXRpdmVDYXB0dXJlTm90ZSB8IE5hdGl2ZVJlYWRDYXB0dXJlTm90ZTtcblxuLyoqIE9uZSBvd25lciBwZXIgcnVudGltZS9sZWc7IHByb3BhZ2F0ZWQgb25seSB0byBmcmFtZXMgaW4gdGhhdCBsb2cuIE5ldmVyIHJlYWRzIHZhbHVlcyBvciBzY2FucyBjb21taXRzLiAqL1xuZXhwb3J0IGNsYXNzIEVuZ2luZVJlYWRTb3VyY2VDYXB0dXJlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnYXBzID0gbmV3IFNldDxTb3VyY2VMaW1pdGF0aW9uPigpO1xuICBwcml2YXRlIHNlYWxlZD86IEVuZ2luZVJlYWRTb3VyY2VzO1xuICBwcml2YXRlIHJldGlyZWQgPSBmYWxzZTtcbiAgZ2V0IG9ic2VydmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ib29rICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmluZyAmJiAhdGhpcy5yZXRpcmVkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2s/OiBSZWFkU291cmNlUmVjb3JkLFxuICAgIGdhcD86IFNvdXJjZUxpbWl0YXRpb24sXG4gICAgcmVhZG9ubHkgZnJvbSA9IDAsXG4gICkge1xuICAgIGlmIChnYXApIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIGxpbWl0KGdhcDogU291cmNlTGltaXRhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFsZWQpIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIHJldGlyZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJldGlyZWQgPSB0cnVlO1xuICAgIHRoaXMuYm9vaz8ucmV0aXJlKCk7XG4gIH1cblxuICBzZWFsKHRvOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWFsZWQpIHJldHVybjtcbiAgICB0aGlzLnNlYWxlZCA9IHRoaXMuc25hcHNob3QodG8pO1xuICAgIHRoaXMucmV0aXJlKCk7XG4gIH1cblxuICBzbmFwc2hvdCh0bzogbnVtYmVyLCByZWRhY3QgPSBmYWxzZSk6IEVuZ2luZVJlYWRTb3VyY2VzIHtcbiAgICBpZiAocmVkYWN0KSByZXR1cm4gcmVkYWN0UmVhZFNvdXJjZXModGhpcy5zbmFwc2hvdCh0bykpO1xuICAgIGlmICh0aGlzLnNlYWxlZCAmJiAhcmVkYWN0KSByZXR1cm4gdGhpcy5zZWFsZWQ7XG4gICAgY29uc3QgZ2FwcyA9IG5ldyBTZXQodGhpcy5nYXBzKTtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmJvb2s/LnNuYXBzaG90KCk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmVhZFNvdXJjZVN0YXR1cyhyZWNvcmQsIGdhcHMuc2l6ZSk7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgcGVyc2lzdGVuY2U6ICdtZW1vcnktb25seScsXG4gICAgICBjb21taXRzOiBPYmplY3QuZnJlZXplKHsgZnJvbTogdGhpcy5mcm9tLCB0byB9KSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKFsuLi5nYXBzXSksXG4gICAgICAuLi4ocmVjb3JkICYmIHsgcmVjb3JkIH0pLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBLZWVwIHRoZSB2MSBwcm9kdWNlciB1bmNoYW5nZWQuIE9ubHkgZXhwbGljaXRseSBlbmFibGVkIHNvdXJjZSBvYnNlcnZhdGlvbnMgYWNxdWlyZSB2Mi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVhZFNvdXJjZXMobm90ZTogTmF0aXZlQ2FwdHVyZU5vdGUsIHNvdXJjZXM6IEVuZ2luZVJlYWRTb3VyY2VzKTogTmF0aXZlUmVhZENhcHR1cmVOb3RlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIC4uLm5vdGUsXG4gICAgdmVyc2lvbjogMixcbiAgICBjaGFubmVsczogT2JqZWN0LmZyZWV6ZSh7IC4uLm5vdGUuY2hhbm5lbHMsIHJlYWRTb3VyY2VzOiBzb3VyY2VzLnN0YXR1cyB9KSxcbiAgICBsaW1pdGF0aW9uczogT2JqZWN0LmZyZWV6ZShub3RlLmxpbWl0YXRpb25zLmZpbHRlcigoZ2FwKSA9PiBnYXAgIT09ICdyZWFkLXNvdXJjZXMtbm90LWNvbGxlY3RlZCcpKSxcbiAgfSk7XG59XG5cbi8qKiBPbmUgc3RhdHVzIHJ1bGUgc2hhcmVkIGJ5IG5hdGl2ZSBvYnNlcnZhdGlvbnMgYW5kIHN0b3JlZCBhZG1pc3Npb247IHN0b3JhZ2UgY2Fubm90IHVwZ3JhZGUgY292ZXJhZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNvdXJjZVN0YXR1cyhyZWNvcmQ6IFJlYWRTb3VyY2VTbmFwc2hvdCB8IHVuZGVmaW5lZCwgbGltaXRhdGlvbnM6IG51bWJlcik6IENhcHR1cmVDaGFubmVsU3RhdHVzIHtcbiAgcmV0dXJuICFyZWNvcmRcbiAgICA/ICd1bmtub3duJ1xuICAgIDogcmVjb3JkLnN0YXR1cyA9PT0gJ2ZhaWxlZCdcbiAgICA/ICdmYWlsZWQnXG4gICAgOiByZWNvcmQuc3RhdHVzICE9PSAnY2FwdHVyZWQnIHx8IGxpbWl0YXRpb25zID4gMFxuICAgID8gJ3BhcnRpYWwnXG4gICAgOiAnY2FwdHVyZWQnO1xufVxuXG4vKiogUmVkYWN0ZWQgZXhwb3J0cyB3aXRoaG9sZCBldmVyeSByZWZlcmVuY2UsIGluY2x1ZGluZyB0aG9zZSBjYXB0dXJlZCBiZWZvcmUgYSBsYXRlciBwcml2YWN5IG1hcmsuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0UmVhZFNvdXJjZXMoc291cmNlOiBFbmdpbmVSZWFkU291cmNlcyk6IEVuZ2luZVJlYWRTb3VyY2VzIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIHZlcnNpb246IHNvdXJjZS52ZXJzaW9uLFxuICAgIHJ1bklkOiBzb3VyY2UucnVuSWQsXG4gICAgcGVyc2lzdGVuY2U6IHNvdXJjZS5wZXJzaXN0ZW5jZSxcbiAgICBjb21taXRzOiBzb3VyY2UuY29tbWl0cyxcbiAgICBzdGF0dXM6ICd1bmtub3duJyxcbiAgICBsaW1pdGF0aW9uczogT2JqZWN0LmZyZWV6ZShbLi4ubmV3IFNldChbLi4uc291cmNlLmxpbWl0YXRpb25zLCAncmVkYWN0ZWQtc291cmNlLWV4cG9ydCcgYXMgY29uc3RdKV0pLFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `value`, settled ONCE into `onValue` / `onError` — never through the value's own `then`: a native promise is
3
+ * watched through the real `Promise.prototype.then` (an own `then` on it is not trusted, so its rejection is always
4
+ * handled), any other thenable adopted into a fresh promise. A plain value is a fulfilment.
5
+ */
6
+ export declare function settleOnce<T>(value: unknown, onValue: () => T, onError: (error: unknown) => T): Promise<T>;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `value`, settled ONCE into `onValue` / `onError` — never through the value's own `then`: a native promise is
3
+ * watched through the real `Promise.prototype.then` (an own `then` on it is not trusted, so its rejection is always
4
+ * handled), any other thenable adopted into a fresh promise. A plain value is a fulfilment.
5
+ */
6
+ export function settleOnce(value, onValue, onError) {
7
+ const adopted = value instanceof Promise ? value : new Promise((resolve) => resolve(value));
8
+ return Promise.prototype.then.call(adopted, onValue, onError);
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lua1NldHRsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvc2lua1NldHRsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUksS0FBYyxFQUFFLE9BQWdCLEVBQUUsT0FBOEI7SUFDNUYsTUFBTSxPQUFPLEdBQXFCLEtBQUssWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlHLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFlLENBQUM7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYHZhbHVlYCwgc2V0dGxlZCBPTkNFIGludG8gYG9uVmFsdWVgIC8gYG9uRXJyb3JgIOKAlCBuZXZlciB0aHJvdWdoIHRoZSB2YWx1ZSdzIG93biBgdGhlbmA6IGEgbmF0aXZlIHByb21pc2UgaXNcbiAqIHdhdGNoZWQgdGhyb3VnaCB0aGUgcmVhbCBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgKGFuIG93biBgdGhlbmAgb24gaXQgaXMgbm90IHRydXN0ZWQsIHNvIGl0cyByZWplY3Rpb24gaXMgYWx3YXlzXG4gKiBoYW5kbGVkKSwgYW55IG90aGVyIHRoZW5hYmxlIGFkb3B0ZWQgaW50byBhIGZyZXNoIHByb21pc2UuIEEgcGxhaW4gdmFsdWUgaXMgYSBmdWxmaWxtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dGxlT25jZTxUPih2YWx1ZTogdW5rbm93biwgb25WYWx1ZTogKCkgPT4gVCwgb25FcnJvcjogKGVycm9yOiB1bmtub3duKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGFkb3B0ZWQ6IFByb21pc2U8dW5rbm93bj4gPSB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgPyB2YWx1ZSA6IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHZhbHVlKSk7XG4gIHJldHVybiBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwoYWRvcHRlZCwgb25WYWx1ZSwgb25FcnJvcikgYXMgUHJvbWlzZTxUPjtcbn1cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ import type { ReadSource } from 'foottrace/write';
2
+ /** Native per-execution totals, independent of last-value retention and the bounded source book. */
3
+ export interface SourceReadCounts {
4
+ readonly observed: number;
5
+ readonly retained: number;
6
+ /** Counts the native writer's returned kinds, never classifies values or chooses sources. */
7
+ readonly kinds: Readonly<Record<ReadSource['kind'], number>>;
8
+ }
9
+ export declare const EMPTY_SOURCE_READ_COUNTS: SourceReadCounts;
10
+ /** Fixed scalar counters only; discarded attempts remain part of this execution's history. */
11
+ export declare class SourceReadCounter {
12
+ private observed;
13
+ private retained;
14
+ private kinds;
15
+ observe(): boolean;
16
+ retain(kind: ReadSource['kind']): void;
17
+ snapshot(): SourceReadCounts;
18
+ }
@@ -0,0 +1,27 @@
1
+ export const EMPTY_SOURCE_READ_COUNTS = Object.freeze({
2
+ observed: 0,
3
+ retained: 0,
4
+ kinds: Object.freeze({ base: 0, committed: 0, staged: 0, unavailable: 0 }),
5
+ });
6
+ /** Fixed scalar counters only; discarded attempts remain part of this execution's history. */
7
+ export class SourceReadCounter {
8
+ observed = 0;
9
+ retained = 0;
10
+ kinds = { ...EMPTY_SOURCE_READ_COUNTS.kinds };
11
+ observe() {
12
+ if (this.observed === Number.MAX_SAFE_INTEGER)
13
+ return false;
14
+ this.observed++;
15
+ return true;
16
+ }
17
+ retain(kind) {
18
+ if (this.retained < this.observed) {
19
+ this.retained++;
20
+ this.kinds[kind]++;
21
+ }
22
+ }
23
+ snapshot() {
24
+ return Object.freeze({ observed: this.observed, retained: this.retained, kinds: Object.freeze({ ...this.kinds }) });
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlUmVhZENvdW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9zb3VyY2VSZWFkQ291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFxQixNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3RFLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzRSxDQUFDLENBQUM7QUFFSCw4RkFBOEY7QUFDOUYsTUFBTSxPQUFPLGlCQUFpQjtJQUNwQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNiLEtBQUssR0FBRyxFQUFFLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFdEQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsZ0JBQWdCO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUF3QjtRQUM3QixJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0SCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlYWRTb3VyY2UgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG4vKiogTmF0aXZlIHBlci1leGVjdXRpb24gdG90YWxzLCBpbmRlcGVuZGVudCBvZiBsYXN0LXZhbHVlIHJldGVudGlvbiBhbmQgdGhlIGJvdW5kZWQgc291cmNlIGJvb2suICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZVJlYWRDb3VudHMge1xuICByZWFkb25seSBvYnNlcnZlZDogbnVtYmVyO1xuICByZWFkb25seSByZXRhaW5lZDogbnVtYmVyO1xuICAvKiogQ291bnRzIHRoZSBuYXRpdmUgd3JpdGVyJ3MgcmV0dXJuZWQga2luZHMsIG5ldmVyIGNsYXNzaWZpZXMgdmFsdWVzIG9yIGNob29zZXMgc291cmNlcy4gKi9cbiAgcmVhZG9ubHkga2luZHM6IFJlYWRvbmx5PFJlY29yZDxSZWFkU291cmNlWydraW5kJ10sIG51bWJlcj4+O1xufVxuXG5leHBvcnQgY29uc3QgRU1QVFlfU09VUkNFX1JFQURfQ09VTlRTOiBTb3VyY2VSZWFkQ291bnRzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG9ic2VydmVkOiAwLFxuICByZXRhaW5lZDogMCxcbiAga2luZHM6IE9iamVjdC5mcmVlemUoeyBiYXNlOiAwLCBjb21taXR0ZWQ6IDAsIHN0YWdlZDogMCwgdW5hdmFpbGFibGU6IDAgfSksXG59KTtcblxuLyoqIEZpeGVkIHNjYWxhciBjb3VudGVycyBvbmx5OyBkaXNjYXJkZWQgYXR0ZW1wdHMgcmVtYWluIHBhcnQgb2YgdGhpcyBleGVjdXRpb24ncyBoaXN0b3J5LiAqL1xuZXhwb3J0IGNsYXNzIFNvdXJjZVJlYWRDb3VudGVyIHtcbiAgcHJpdmF0ZSBvYnNlcnZlZCA9IDA7XG4gIHByaXZhdGUgcmV0YWluZWQgPSAwO1xuICBwcml2YXRlIGtpbmRzID0geyAuLi5FTVBUWV9TT1VSQ0VfUkVBRF9DT1VOVFMua2luZHMgfTtcblxuICBvYnNlcnZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm9ic2VydmVkID09PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMub2JzZXJ2ZWQrKztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldGFpbihraW5kOiBSZWFkU291cmNlWydraW5kJ10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXRhaW5lZCA8IHRoaXMub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMucmV0YWluZWQrKztcbiAgICAgIHRoaXMua2luZHNba2luZF0rKztcbiAgICB9XG4gIH1cblxuICBzbmFwc2hvdCgpOiBTb3VyY2VSZWFkQ291bnRzIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IG9ic2VydmVkOiB0aGlzLm9ic2VydmVkLCByZXRhaW5lZDogdGhpcy5yZXRhaW5lZCwga2luZHM6IE9iamVjdC5mcmVlemUoeyAuLi50aGlzLmtpbmRzIH0pIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,10 @@
1
+ import type { CommitBundle } from 'foottrace';
2
+ /** Conservative work cap before each distinct public value query, including shared-root replay/cloning. */
3
+ export declare class SourceReferenceBudget {
4
+ private rows;
5
+ private bytes;
6
+ private readonly queryRows;
7
+ private readonly queryBytes;
8
+ constructor(commitLog: readonly CommitBundle[], initialState?: Record<string, unknown>);
9
+ spend(): void;
10
+ }
@@ -0,0 +1,21 @@
1
+ import { HistoryDataError } from './historyData.js';
2
+ /** Conservative work cap before each distinct public value query, including shared-root replay/cloning. */
3
+ export class SourceReferenceBudget {
4
+ rows = 0;
5
+ bytes = 0;
6
+ queryRows;
7
+ queryBytes;
8
+ constructor(commitLog, initialState) {
9
+ this.queryRows = 1 + commitLog.length + commitLog.reduce((count, bundle) => count + bundle.trace.length, 0);
10
+ this.queryBytes = new TextEncoder().encode(JSON.stringify({ commitLog, initialState })).length;
11
+ }
12
+ spend() {
13
+ // The entire admitted basis is an upper estimate for each query; repeat (commit,key) hits spend nothing.
14
+ // Refuse before calling the reader, never after doing unaccounted work or silently cutting evidence.
15
+ if (this.queryRows > 1_000_000 - this.rows || this.queryBytes > 64 * 1024 * 1024 - this.bytes)
16
+ throw new HistoryDataError('source-validation-limit');
17
+ this.rows += this.queryRows;
18
+ this.bytes += this.queryBytes;
19
+ }
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlUmVmZXJlbmNlQnVkZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL3NvdXJjZVJlZmVyZW5jZUJ1ZGdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRCwyR0FBMkc7QUFDM0csTUFBTSxPQUFPLHFCQUFxQjtJQUN4QixJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNELFNBQVMsQ0FBUztJQUNsQixVQUFVLENBQVM7SUFFcEMsWUFBWSxTQUFrQyxFQUFFLFlBQXNDO1FBQ3BGLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqRyxDQUFDO0lBRUQsS0FBSztRQUNILHlHQUF5RztRQUN6RyxxR0FBcUc7UUFDckcsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUs7WUFDM0YsTUFBTSxJQUFJLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IEhpc3RvcnlEYXRhRXJyb3IgfSBmcm9tICcuL2hpc3RvcnlEYXRhLmpzJztcblxuLyoqIENvbnNlcnZhdGl2ZSB3b3JrIGNhcCBiZWZvcmUgZWFjaCBkaXN0aW5jdCBwdWJsaWMgdmFsdWUgcXVlcnksIGluY2x1ZGluZyBzaGFyZWQtcm9vdCByZXBsYXkvY2xvbmluZy4gKi9cbmV4cG9ydCBjbGFzcyBTb3VyY2VSZWZlcmVuY2VCdWRnZXQge1xuICBwcml2YXRlIHJvd3MgPSAwO1xuICBwcml2YXRlIGJ5dGVzID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWVyeVJvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWVyeUJ5dGVzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSwgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICB0aGlzLnF1ZXJ5Um93cyA9IDEgKyBjb21taXRMb2cubGVuZ3RoICsgY29tbWl0TG9nLnJlZHVjZSgoY291bnQsIGJ1bmRsZSkgPT4gY291bnQgKyBidW5kbGUudHJhY2UubGVuZ3RoLCAwKTtcbiAgICB0aGlzLnF1ZXJ5Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoeyBjb21taXRMb2csIGluaXRpYWxTdGF0ZSB9KSkubGVuZ3RoO1xuICB9XG5cbiAgc3BlbmQoKTogdm9pZCB7XG4gICAgLy8gVGhlIGVudGlyZSBhZG1pdHRlZCBiYXNpcyBpcyBhbiB1cHBlciBlc3RpbWF0ZSBmb3IgZWFjaCBxdWVyeTsgcmVwZWF0IChjb21taXQsa2V5KSBoaXRzIHNwZW5kIG5vdGhpbmcuXG4gICAgLy8gUmVmdXNlIGJlZm9yZSBjYWxsaW5nIHRoZSByZWFkZXIsIG5ldmVyIGFmdGVyIGRvaW5nIHVuYWNjb3VudGVkIHdvcmsgb3Igc2lsZW50bHkgY3V0dGluZyBldmlkZW5jZS5cbiAgICBpZiAodGhpcy5xdWVyeVJvd3MgPiAxXzAwMF8wMDAgLSB0aGlzLnJvd3MgfHwgdGhpcy5xdWVyeUJ5dGVzID4gNjQgKiAxMDI0ICogMTAyNCAtIHRoaXMuYnl0ZXMpXG4gICAgICB0aHJvdyBuZXcgSGlzdG9yeURhdGFFcnJvcignc291cmNlLXZhbGlkYXRpb24tbGltaXQnKTtcbiAgICB0aGlzLnJvd3MgKz0gdGhpcy5xdWVyeVJvd3M7XG4gICAgdGhpcy5ieXRlcyArPSB0aGlzLnF1ZXJ5Qnl0ZXM7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import type { ReadSourceSnapshot } from 'foottrace/write';
2
+ /** Already inert, byte-bounded evidence. Check native counts; never reconstruct read occurrences. */
3
+ export declare function storedReadSourceCounts(record: ReadSourceSnapshot, executionTree: unknown, committedOwners: ReadonlyMap<string, number>): boolean;
@@ -0,0 +1,78 @@
1
+ import { EMPTY_SOURCE_READ_COUNTS } from './sourceReadCounts.js';
2
+ const KINDS = Object.keys(EMPTY_SOURCE_READ_COUNTS.kinds);
3
+ function countsOf(value) {
4
+ if (!value || typeof value !== 'object' || Array.isArray(value))
5
+ return undefined;
6
+ const counts = value;
7
+ if (Object.keys(value).length !== 3 ||
8
+ !Number.isSafeInteger(counts.observed) ||
9
+ !Number.isSafeInteger(counts.retained) ||
10
+ counts.observed < 0 ||
11
+ counts.retained < 0 ||
12
+ counts.retained > counts.observed)
13
+ return undefined;
14
+ if (!counts.kinds || typeof counts.kinds !== 'object' || Array.isArray(counts.kinds))
15
+ return undefined;
16
+ if (Object.keys(counts.kinds).length !== KINDS.length)
17
+ return undefined;
18
+ let sum = 0;
19
+ for (const kind of KINDS) {
20
+ const count = counts.kinds[kind];
21
+ if (!Number.isSafeInteger(count) || count < 0)
22
+ return undefined;
23
+ sum += count;
24
+ if (sum > counts.retained)
25
+ return undefined;
26
+ }
27
+ if (sum !== counts.retained)
28
+ return undefined;
29
+ return counts;
30
+ }
31
+ /** Already inert, byte-bounded evidence. Check native counts; never reconstruct read occurrences. */
32
+ export function storedReadSourceCounts(record, executionTree, committedOwners) {
33
+ const owners = new Map();
34
+ const pending = [executionTree];
35
+ let visited = 0;
36
+ while (pending.length) {
37
+ if (++visited > 100_000)
38
+ return false;
39
+ const value = pending.pop();
40
+ if (!value || typeof value !== 'object' || Array.isArray(value))
41
+ return false;
42
+ const node = value;
43
+ const id = node.runtimeStageId;
44
+ if (Object.hasOwn(node, 'readSourceCounts')) {
45
+ const counts = countsOf(node.readSourceCounts);
46
+ if (!counts || (record.status === 'captured' && counts.observed !== counts.retained))
47
+ return false;
48
+ if (typeof id !== 'string' || !id) {
49
+ if (counts.observed || counts.retained)
50
+ return false;
51
+ }
52
+ else {
53
+ if (owners.has(id))
54
+ return false;
55
+ owners.set(id, counts);
56
+ }
57
+ }
58
+ else if (typeof id === 'string' && committedOwners.has(id))
59
+ return false;
60
+ if (Object.hasOwn(node, 'next'))
61
+ pending.push(node.next);
62
+ if (Object.hasOwn(node, 'children')) {
63
+ if (!Array.isArray(node.children) || node.children.length > 100_000 - visited - pending.length)
64
+ return false;
65
+ for (const child of node.children)
66
+ pending.push(child);
67
+ }
68
+ }
69
+ const remaining = new Map([...owners].map(([id, counts]) => [id, { ...counts.kinds }]));
70
+ for (const row of record.occurrences) {
71
+ const counts = remaining.get(row.runtimeStageId);
72
+ if (!counts || counts[row.source.kind] === 0)
73
+ return false;
74
+ counts[row.source.kind]--;
75
+ }
76
+ return [...remaining.values()].every((counts) => KINDS.every((kind) => counts[kind] === 0));
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkUmVhZFNvdXJjZUNvdW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9zdG9yZWRSZWFkU291cmNlQ291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUF3QyxDQUFDO0FBRWpHLFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRixNQUFNLE1BQU0sR0FBRyxLQUF5QixDQUFDO0lBQ3pDLElBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUMvQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUM7UUFDbkIsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVE7UUFFakMsT0FBTyxTQUFTLENBQUM7SUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN2RyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFD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RyxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU07Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0csS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVhZFNvdXJjZVNuYXBzaG90IH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHR5cGUgeyBTb3VyY2VSZWFkQ291bnRzIH0gZnJvbSAnLi9zb3VyY2VSZWFkQ291bnRzLmpzJztcbmltcG9ydCB7IEVNUFRZX1NPVVJDRV9SRUFEX0NPVU5UUyB9IGZyb20gJy4vc291cmNlUmVhZENvdW50cy5qcyc7XG5cbmNvbnN0IEtJTkRTID0gT2JqZWN0LmtleXMoRU1QVFlfU09VUkNFX1JFQURfQ09VTlRTLmtpbmRzKSBhcyAoa2V5b2YgU291cmNlUmVhZENvdW50c1sna2luZHMnXSlbXTtcblxuZnVuY3Rpb24gY291bnRzT2YodmFsdWU6IHVua25vd24pOiBTb3VyY2VSZWFkQ291bnRzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb3VudHMgPSB2YWx1ZSBhcyBTb3VyY2VSZWFkQ291bnRzO1xuICBpZiAoXG4gICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCAhPT0gMyB8fFxuICAgICFOdW1iZXIuaXNTYWZlSW50ZWdlcihjb3VudHMub2JzZXJ2ZWQpIHx8XG4gICAgIU51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50cy5yZXRhaW5lZCkgfHxcbiAgICBjb3VudHMub2JzZXJ2ZWQgPCAwIHx8XG4gICAgY291bnRzLnJldGFpbmVkIDwgMCB8fFxuICAgIGNvdW50cy5yZXRhaW5lZCA+IGNvdW50cy5vYnNlcnZlZFxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFjb3VudHMua2luZHMgfHwgdHlwZW9mIGNvdW50cy5raW5kcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShjb3VudHMua2luZHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoT2JqZWN0LmtleXMoY291bnRzLmtpbmRzKS5sZW5ndGggIT09IEtJTkRTLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAoY29uc3Qga2luZCBvZiBLSU5EUykge1xuICAgIGNvbnN0IGNvdW50ID0gY291bnRzLmtpbmRzW2tpbmRdO1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpIHx8IGNvdW50IDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdW0gKz0gY291bnQ7XG4gICAgaWYgKHN1bSA+IGNvdW50cy5yZXRhaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoc3VtICE9PSBjb3VudHMucmV0YWluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjb3VudHM7XG59XG5cbi8qKiBBbHJlYWR5IGluZXJ0LCBieXRlLWJvdW5kZWQgZXZpZGVuY2UuIENoZWNrIG5hdGl2ZSBjb3VudHM7IG5ldmVyIHJlY29uc3RydWN0IHJlYWQgb2NjdXJyZW5jZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVkUmVhZFNvdXJjZUNvdW50cyhcbiAgcmVjb3JkOiBSZWFkU291cmNlU25hcHNob3QsXG4gIGV4ZWN1dGlvblRyZWU6IHVua25vd24sXG4gIGNvbW1pdHRlZE93bmVyczogUmVhZG9ubHlNYXA8c3RyaW5nLCBudW1iZXI+LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG93bmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VSZWFkQ291bnRzPigpO1xuICBjb25zdCBwZW5kaW5nID0gW2V4ZWN1dGlvblRyZWVdO1xuICBsZXQgdmlzaXRlZCA9IDA7XG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCkge1xuICAgIGlmICgrK3Zpc2l0ZWQgPiAxMDBfMDAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdmFsdWUgPSBwZW5kaW5nLnBvcCgpO1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG5vZGUgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBpZCA9IG5vZGUucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKE9iamVjdC5oYXNPd24obm9kZSwgJ3JlYWRTb3VyY2VDb3VudHMnKSkge1xuICAgICAgY29uc3QgY291bnRzID0gY291bnRzT2Yobm9kZS5yZWFkU291cmNlQ291bnRzKTtcbiAgICAgIGlmICghY291bnRzIHx8IChyZWNvcmQuc3RhdHVzID09PSAnY2FwdHVyZWQnICYmIGNvdW50cy5vYnNlcnZlZCAhPT0gY291bnRzLnJldGFpbmVkKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycgfHwgIWlkKSB7XG4gICAgICAgIGlmIChjb3VudHMub2JzZXJ2ZWQgfHwgY291bnRzLnJldGFpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3duZXJzLmhhcyhpZCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgb3duZXJzLnNldChpZCwgY291bnRzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgY29tbWl0dGVkT3duZXJzLmhhcyhpZCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihub2RlLCAnbmV4dCcpKSBwZW5kaW5nLnB1c2gobm9kZS5uZXh0KTtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihub2RlLCAnY2hpbGRyZW4nKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUuY2hpbGRyZW4pIHx8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMTAwXzAwMCAtIHZpc2l0ZWQgLSBwZW5kaW5nLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSBwZW5kaW5nLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuICBjb25zdCByZW1haW5pbmcgPSBuZXcgTWFwKFsuLi5vd25lcnNdLm1hcCgoW2lkLCBjb3VudHNdKSA9PiBbaWQsIHsgLi4uY291bnRzLmtpbmRzIH1dKSk7XG4gIGZvciAoY29uc3Qgcm93IG9mIHJlY29yZC5vY2N1cnJlbmNlcykge1xuICAgIGNvbnN0IGNvdW50cyA9IHJlbWFpbmluZy5nZXQocm93LnJ1bnRpbWVTdGFnZUlkKTtcbiAgICBpZiAoIWNvdW50cyB8fCBjb3VudHNbcm93LnNvdXJjZS5raW5kXSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvdW50c1tyb3cuc291cmNlLmtpbmRdLS07XG4gIH1cbiAgcmV0dXJuIFsuLi5yZW1haW5pbmcudmFsdWVzKCldLmV2ZXJ5KChjb3VudHMpID0+IEtJTkRTLmV2ZXJ5KChraW5kKSA9PiBjb3VudHNba2luZF0gPT09IDApKTtcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import type { CommitBundle } from 'foottrace';
2
+ import type { EngineReadSources, NativeReadCaptureNote } from './readSources.js';
3
+ /** After inert JSON admission: the record's codec owns descriptors; the engine binds its root observation. */
4
+ export declare function storedReadSources(value: unknown, capture: NativeReadCaptureNote, commitLog: readonly CommitBundle[], initialState?: Record<string, unknown>, executionTree?: unknown): EngineReadSources | undefined;