footprintjs 10.4.0 → 10.6.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 (122) hide show
  1. package/README.md +63 -25
  2. package/dist/esm/index.d.ts +1 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/capture/historyData.d.ts +6 -2
  5. package/dist/esm/lib/capture/historyData.js +18 -1
  6. package/dist/esm/lib/capture/historyNote.d.ts +2 -2
  7. package/dist/esm/lib/capture/historyNote.js +11 -6
  8. package/dist/esm/lib/capture/historyTypes.d.ts +1 -1
  9. package/dist/esm/lib/capture/historyTypes.js +1 -1
  10. package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
  11. package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
  12. package/dist/esm/lib/capture/readSources.d.ts +20 -3
  13. package/dist/esm/lib/capture/readSources.js +41 -12
  14. package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
  15. package/dist/esm/lib/capture/sinkSettlement.js +10 -0
  16. package/dist/esm/lib/capture/sourceOwnership.d.ts +21 -0
  17. package/dist/esm/lib/capture/sourceOwnership.js +133 -0
  18. package/dist/esm/lib/capture/sourceOwnershipFormat.d.ts +35 -0
  19. package/dist/esm/lib/capture/sourceOwnershipFormat.js +31 -0
  20. package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
  21. package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
  22. package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
  23. package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
  24. package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +7 -0
  25. package/dist/esm/lib/capture/storedReadSourceCounts.js +82 -0
  26. package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
  27. package/dist/esm/lib/capture/storedReadSources.js +120 -0
  28. package/dist/esm/lib/capture/storedSourceOwnership.d.ts +8 -0
  29. package/dist/esm/lib/capture/storedSourceOwnership.js +100 -0
  30. package/dist/esm/lib/engine/handlers/StageRunner.js +2 -1
  31. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +11 -2
  32. package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
  33. package/dist/esm/lib/engine/types.d.ts +2 -1
  34. package/dist/esm/lib/engine/types.js +1 -1
  35. package/dist/esm/lib/memory/StageContext.d.ts +4 -0
  36. package/dist/esm/lib/memory/StageContext.js +40 -7
  37. package/dist/esm/lib/memory/frameTypes.d.ts +5 -0
  38. package/dist/esm/lib/memory/frameTypes.js +1 -1
  39. package/dist/esm/lib/memory/logAddress.d.ts +3 -0
  40. package/dist/esm/lib/memory/logAddress.js +7 -0
  41. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -0
  42. package/dist/esm/lib/runner/ExecutionRuntime.js +65 -8
  43. package/dist/esm/lib/runner/FlowChartExecutor.js +4 -2
  44. package/dist/esm/lib/runner/captureHistory.js +16 -10
  45. package/dist/esm/lib/runner/readStoredCapture.d.ts +4 -2
  46. package/dist/esm/lib/runner/readStoredCapture.js +3 -3
  47. package/dist/esm/lib/runner/recordSink.js +2 -10
  48. package/dist/esm/lib/runner/storedCaptureAdmission.js +10 -8
  49. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  50. package/dist/esm/lib/sinks/indexedAdmission.d.ts +14 -0
  51. package/dist/esm/lib/sinks/indexedAdmission.js +77 -0
  52. package/dist/esm/lib/sinks/indexedIO.d.ts +14 -0
  53. package/dist/esm/lib/sinks/indexedIO.js +96 -0
  54. package/dist/esm/lib/sinks/indexedRecordFile.d.ts +3 -0
  55. package/dist/esm/lib/sinks/indexedRecordFile.js +120 -0
  56. package/dist/esm/lib/sinks/indexedScan.d.ts +6 -0
  57. package/dist/esm/lib/sinks/indexedScan.js +73 -0
  58. package/dist/esm/lib/sinks/indexedTypes.d.ts +60 -0
  59. package/dist/esm/lib/sinks/indexedTypes.js +2 -0
  60. package/dist/esm/sinks.d.ts +2 -0
  61. package/dist/esm/sinks.js +2 -1
  62. package/dist/index.js +1 -1
  63. package/dist/lib/capture/historyData.js +21 -2
  64. package/dist/lib/capture/historyNote.js +9 -4
  65. package/dist/lib/capture/historyTypes.js +1 -1
  66. package/dist/lib/capture/nativeSourceAddress.js +19 -0
  67. package/dist/lib/capture/readSources.js +44 -13
  68. package/dist/lib/capture/sinkSettlement.js +14 -0
  69. package/dist/lib/capture/sourceOwnership.js +138 -0
  70. package/dist/lib/capture/sourceOwnershipFormat.js +35 -0
  71. package/dist/lib/capture/sourceReadCounts.js +31 -0
  72. package/dist/lib/capture/sourceReferenceBudget.js +25 -0
  73. package/dist/lib/capture/storedReadSourceCounts.js +86 -0
  74. package/dist/lib/capture/storedReadSources.js +124 -0
  75. package/dist/lib/capture/storedSourceOwnership.js +104 -0
  76. package/dist/lib/engine/handlers/StageRunner.js +2 -1
  77. package/dist/lib/engine/handlers/SubflowExecutor.js +11 -2
  78. package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
  79. package/dist/lib/engine/types.js +1 -1
  80. package/dist/lib/memory/StageContext.js +40 -7
  81. package/dist/lib/memory/frameTypes.js +1 -1
  82. package/dist/lib/memory/logAddress.js +11 -0
  83. package/dist/lib/runner/ExecutionRuntime.js +65 -8
  84. package/dist/lib/runner/FlowChartExecutor.js +4 -2
  85. package/dist/lib/runner/captureHistory.js +15 -9
  86. package/dist/lib/runner/readStoredCapture.js +2 -2
  87. package/dist/lib/runner/recordSink.js +6 -14
  88. package/dist/lib/runner/storedCaptureAdmission.js +9 -7
  89. package/dist/lib/scope/ScopeFacade.js +2 -2
  90. package/dist/lib/sinks/indexedAdmission.js +85 -0
  91. package/dist/lib/sinks/indexedIO.js +106 -0
  92. package/dist/lib/sinks/indexedRecordFile.js +124 -0
  93. package/dist/lib/sinks/indexedScan.js +77 -0
  94. package/dist/lib/sinks/indexedTypes.js +3 -0
  95. package/dist/sinks.js +4 -2
  96. package/dist/types/index.d.ts +1 -0
  97. package/dist/types/lib/capture/historyData.d.ts +6 -2
  98. package/dist/types/lib/capture/historyNote.d.ts +2 -2
  99. package/dist/types/lib/capture/historyTypes.d.ts +1 -1
  100. package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
  101. package/dist/types/lib/capture/readSources.d.ts +20 -3
  102. package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
  103. package/dist/types/lib/capture/sourceOwnership.d.ts +21 -0
  104. package/dist/types/lib/capture/sourceOwnershipFormat.d.ts +35 -0
  105. package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
  106. package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
  107. package/dist/types/lib/capture/storedReadSourceCounts.d.ts +7 -0
  108. package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
  109. package/dist/types/lib/capture/storedSourceOwnership.d.ts +8 -0
  110. package/dist/types/lib/engine/types.d.ts +2 -1
  111. package/dist/types/lib/memory/StageContext.d.ts +4 -0
  112. package/dist/types/lib/memory/frameTypes.d.ts +5 -0
  113. package/dist/types/lib/memory/logAddress.d.ts +3 -0
  114. package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -0
  115. package/dist/types/lib/runner/readStoredCapture.d.ts +4 -2
  116. package/dist/types/lib/sinks/indexedAdmission.d.ts +14 -0
  117. package/dist/types/lib/sinks/indexedIO.d.ts +14 -0
  118. package/dist/types/lib/sinks/indexedRecordFile.d.ts +3 -0
  119. package/dist/types/lib/sinks/indexedScan.d.ts +6 -0
  120. package/dist/types/lib/sinks/indexedTypes.d.ts +60 -0
  121. package/dist/types/sinks.d.ts +2 -0
  122. package/package.json +1 -1
@@ -1,3 +1,4 @@
1
+ import { redactSourceOwnership, SourceOwnershipCollector } from './sourceOwnership.js';
1
2
  /** Engine coverage only. Source descriptors and their codec belong to foottrace/write. */
2
3
  export const SOURCE_LIMITATIONS = Object.freeze([
3
4
  'privacy-active',
@@ -5,6 +6,7 @@ export const SOURCE_LIMITATIONS = Object.freeze([
5
6
  'untracked-read',
6
7
  'custom-scope',
7
8
  'child-source-ownership',
9
+ 'source-address-unsupported',
8
10
  'resumed-source-ownership',
9
11
  'sink-source-unsupported',
10
12
  'source-history-not-included',
@@ -16,23 +18,31 @@ export class EngineReadSourceCapture {
16
18
  runId;
17
19
  book;
18
20
  from;
21
+ ownership;
19
22
  gaps = new Set();
20
23
  sealed;
24
+ retired = false;
21
25
  get observing() {
22
26
  return this.book !== undefined;
23
27
  }
28
+ get active() {
29
+ return this.observing && !this.retired;
30
+ }
24
31
  constructor(runId, book, gap, from = 0) {
25
32
  this.runId = runId;
26
33
  this.book = book;
27
34
  this.from = from;
28
35
  if (gap)
29
36
  this.gaps.add(gap);
37
+ if (book?.log.address)
38
+ this.ownership = new SourceOwnershipCollector(runId, book.log.address, from);
30
39
  }
31
40
  limit(gap) {
32
41
  if (!this.sealed)
33
42
  this.gaps.add(gap);
34
43
  }
35
44
  retire() {
45
+ this.retired = true;
36
46
  this.book?.retire();
37
47
  }
38
48
  seal(to) {
@@ -42,21 +52,17 @@ export class EngineReadSourceCapture {
42
52
  this.retire();
43
53
  }
44
54
  snapshot(to, redact = false) {
55
+ if (redact)
56
+ return redactReadSources(this.snapshot(to));
45
57
  if (this.sealed && !redact)
46
58
  return this.sealed;
47
59
  const gaps = new Set(this.gaps);
48
- if (redact)
49
- gaps.add('redacted-source-export');
50
- const record = redact ? undefined : this.book?.snapshot();
51
- const status = !record
52
- ? 'unknown'
53
- : record.status === 'failed'
54
- ? 'failed'
55
- : record.status !== 'captured' || gaps.size > 0
56
- ? 'partial'
57
- : 'captured';
60
+ const record = this.book?.snapshot();
61
+ const status = readSourceStatus(record, gaps.size);
58
62
  return Object.freeze({
59
- version: 1,
63
+ ...(record && this.ownership
64
+ ? { version: 2, ownership: this.ownership.snapshot(to, record.segment) }
65
+ : { version: 1 }),
60
66
  runId: this.runId,
61
67
  persistence: 'memory-only',
62
68
  commits: Object.freeze({ from: this.from, to }),
@@ -75,4 +81,27 @@ export function withReadSources(note, sources) {
75
81
  limitations: Object.freeze(note.limitations.filter((gap) => gap !== 'read-sources-not-collected')),
76
82
  });
77
83
  }
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZFNvdXJjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvcmVhZFNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsMEZBQTBGO0FBQzFGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUMsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLHdCQUF3QjtJQUN4QiwwQkFBMEI7SUFDMUIseUJBQXlCO0lBQ3pCLDZCQUE2QjtJQUM3Qix1QkFBdUI7SUFDdkIsd0JBQXdCO0NBQ2hCLENBQUMsQ0FBQztBQXdCWiw2R0FBNkc7QUFDN0csTUFBTSxPQUFPLHVCQUF1QjtJQVF2QjtJQUNRO0lBRVI7SUFWTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7SUFDNUMsTUFBTSxDQUFxQjtJQUNuQyxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxZQUNXLEtBQWEsRUFDTCxJQUF1QixFQUN4QyxHQUFzQixFQUNiLE9BQU8sQ0FBQztRQUhSLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDTCxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUUvQixTQUFJLEdBQUosSUFBSSxDQUFJO1FBRWpCLElBQUksR0FBRztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBcUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLENBQUMsRUFBVTtRQUNiLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELFFBQVEsQ0FBQyxFQUFVLEVBQUUsTUFBTSxHQUFHLEtBQUs7UUFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTTtZQUNwQixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7b0JBQy9DLENBQUMsQ0FBQyxTQUFTO29CQUNYLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDZixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUM7WUFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsV0FBVyxFQUFFLGFBQWE7WUFDMUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUMvQyxNQUFNO1lBQ04sV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRCw4RkFBOEY7QUFDOUYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUF1QixFQUFFLE9BQTBCO0lBQ2pGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQixHQUFHLElBQUk7UUFDUCxPQUFPLEVBQUUsQ0FBQztRQUNWLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyw0QkFBNEIsQ0FBQyxDQUFDO0tBQ25HLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlYWRTb3VyY2VSZWNvcmQsIFJlYWRTb3VyY2VTbmFwc2hvdCB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgQ2FwdHVyZUNoYW5uZWxTdGF0dXMsIE5hdGl2ZUNhcHR1cmVOb3RlIH0gZnJvbSAnLi9uYXRpdmVDb3ZlcmFnZS5qcyc7XG5cbi8qKiBFbmdpbmUgY292ZXJhZ2Ugb25seS4gU291cmNlIGRlc2NyaXB0b3JzIGFuZCB0aGVpciBjb2RlYyBiZWxvbmcgdG8gZm9vdHRyYWNlL3dyaXRlLiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9MSU1JVEFUSU9OUyA9IE9iamVjdC5mcmVlemUoW1xuICAncHJpdmFjeS1hY3RpdmUnLFxuICAnaWRlbnRpdHktdW5hdmFpbGFibGUnLFxuICAndW50cmFja2VkLXJlYWQnLFxuICAnY3VzdG9tLXNjb3BlJyxcbiAgJ2NoaWxkLXNvdXJjZS1vd25lcnNoaXAnLFxuICAncmVzdW1lZC1zb3VyY2Utb3duZXJzaGlwJyxcbiAgJ3Npbmstc291cmNlLXVuc3VwcG9ydGVkJyxcbiAgJ3NvdXJjZS1oaXN0b3J5LW5vdC1pbmNsdWRlZCcsXG4gICdzb3VyY2UtY2FwdHVyZS1mYWlsZWQnLFxuICAncmVkYWN0ZWQtc291cmNlLWV4cG9ydCcsXG5dIGFzIGNvbnN0KTtcbmV4cG9ydCB0eXBlIFNvdXJjZUxpbWl0YXRpb24gPSAodHlwZW9mIFNPVVJDRV9MSU1JVEFUSU9OUylbbnVtYmVyXTtcblxuLyoqIFBhY2tldCAzIGlzIGFuIGluLW1lbW9yeSBvYnNlcnZhdGlvbiwgbm90IGEgc3RvcmVkLWhpc3RvcnkgYWNrbm93bGVkZ2VtZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmdpbmVSZWFkU291cmNlcyB7XG4gIHJlYWRvbmx5IHZlcnNpb246IDE7XG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNpc3RlbmNlOiAnbWVtb3J5LW9ubHknO1xuICByZWFkb25seSBjb21taXRzOiB7IHJlYWRvbmx5IGZyb206IG51bWJlcjsgcmVhZG9ubHkgdG86IG51bWJlciB9O1xuICByZWFkb25seSBzdGF0dXM6IENhcHR1cmVDaGFubmVsU3RhdHVzO1xuICByZWFkb25seSBsaW1pdGF0aW9uczogcmVhZG9ubHkgU291cmNlTGltaXRhdGlvbltdO1xuICAvKiogQWJzZW50IG1lYW5zIHVua25vd24gb3duZXJzaGlwLCBuZXZlciBhbiBvYnNlcnZlZC1lbXB0eSBib29rLiAqL1xuICByZWFkb25seSByZWNvcmQ/OiBSZWFkU291cmNlU25hcHNob3Q7XG59XG5cbi8qKiBBIG5ldyBkaXNjcmltaW5hbnQgcHJldmVudHMgc3RyaWN0IHYxIHJlYWRlcnMgZnJvbSBhY2NlcHRpbmcgbmV3IGNvbXBsZXRlbmVzcyBjbGFpbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdGl2ZVJlYWRDYXB0dXJlTm90ZSBleHRlbmRzIE9taXQ8TmF0aXZlQ2FwdHVyZU5vdGUsICd2ZXJzaW9uJyB8ICdjaGFubmVscyc+IHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogMjtcbiAgcmVhZG9ubHkgY2hhbm5lbHM6IE9taXQ8TmF0aXZlQ2FwdHVyZU5vdGVbJ2NoYW5uZWxzJ10sICdyZWFkU291cmNlcyc+ICYge1xuICAgIHJlYWRvbmx5IHJlYWRTb3VyY2VzOiBDYXB0dXJlQ2hhbm5lbFN0YXR1cztcbiAgfTtcbn1cbmV4cG9ydCB0eXBlIE5hdGl2ZUNhcHR1cmVPYnNlcnZhdGlvbiA9IE5hdGl2ZUNhcHR1cmVOb3RlIHwgTmF0aXZlUmVhZENhcHR1cmVOb3RlO1xuXG4vKiogT25lIG93bmVyIHBlciBydW50aW1lL2xlZzsgcHJvcGFnYXRlZCBvbmx5IHRvIGZyYW1lcyBpbiB0aGF0IGxvZy4gTmV2ZXIgcmVhZHMgdmFsdWVzIG9yIHNjYW5zIGNvbW1pdHMuICovXG5leHBvcnQgY2xhc3MgRW5naW5lUmVhZFNvdXJjZUNhcHR1cmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGdhcHMgPSBuZXcgU2V0PFNvdXJjZUxpbWl0YXRpb24+KCk7XG4gIHByaXZhdGUgc2VhbGVkPzogRW5naW5lUmVhZFNvdXJjZXM7XG4gIGdldCBvYnNlcnZpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYm9vayAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2s/OiBSZWFkU291cmNlUmVjb3JkLFxuICAgIGdhcD86IFNvdXJjZUxpbWl0YXRpb24sXG4gICAgcmVhZG9ubHkgZnJvbSA9IDAsXG4gICkge1xuICAgIGlmIChnYXApIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIGxpbWl0KGdhcDogU291cmNlTGltaXRhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFsZWQpIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIHJldGlyZSgpOiB2b2lkIHtcbiAgICB0aGlzLmJvb2s/LnJldGlyZSgpO1xuICB9XG5cbiAgc2VhbCh0bzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhbGVkKSByZXR1cm47XG4gICAgdGhpcy5zZWFsZWQgPSB0aGlzLnNuYXBzaG90KHRvKTtcbiAgICB0aGlzLnJldGlyZSgpO1xuICB9XG5cbiAgc25hcHNob3QodG86IG51bWJlciwgcmVkYWN0ID0gZmFsc2UpOiBFbmdpbmVSZWFkU291cmNlcyB7XG4gICAgaWYgKHRoaXMuc2VhbGVkICYmICFyZWRhY3QpIHJldHVybiB0aGlzLnNlYWxlZDtcbiAgICBjb25zdCBnYXBzID0gbmV3IFNldCh0aGlzLmdhcHMpO1xuICAgIGlmIChyZWRhY3QpIGdhcHMuYWRkKCdyZWRhY3RlZC1zb3VyY2UtZXhwb3J0Jyk7XG4gICAgY29uc3QgcmVjb3JkID0gcmVkYWN0ID8gdW5kZWZpbmVkIDogdGhpcy5ib29rPy5zbmFwc2hvdCgpO1xuICAgIGNvbnN0IHN0YXR1cyA9ICFyZWNvcmRcbiAgICAgID8gJ3Vua25vd24nXG4gICAgICA6IHJlY29yZC5zdGF0dXMgPT09ICdmYWlsZWQnXG4gICAgICA/ICdmYWlsZWQnXG4gICAgICA6IHJlY29yZC5zdGF0dXMgIT09ICdjYXB0dXJlZCcgfHwgZ2Fwcy5zaXplID4gMFxuICAgICAgPyAncGFydGlhbCdcbiAgICAgIDogJ2NhcHR1cmVkJztcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBwZXJzaXN0ZW5jZTogJ21lbW9yeS1vbmx5JyxcbiAgICAgIGNvbW1pdHM6IE9iamVjdC5mcmVlemUoeyBmcm9tOiB0aGlzLmZyb20sIHRvIH0pLFxuICAgICAgc3RhdHVzLFxuICAgICAgbGltaXRhdGlvbnM6IE9iamVjdC5mcmVlemUoWy4uLmdhcHNdKSxcbiAgICAgIC4uLihyZWNvcmQgJiYgeyByZWNvcmQgfSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEtlZXAgdGhlIHYxIHByb2R1Y2VyIHVuY2hhbmdlZC4gT25seSBleHBsaWNpdGx5IGVuYWJsZWQgc291cmNlIG9ic2VydmF0aW9ucyBhY3F1aXJlIHYyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZWFkU291cmNlcyhub3RlOiBOYXRpdmVDYXB0dXJlTm90ZSwgc291cmNlczogRW5naW5lUmVhZFNvdXJjZXMpOiBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLi4ubm90ZSxcbiAgICB2ZXJzaW9uOiAyLFxuICAgIGNoYW5uZWxzOiBPYmplY3QuZnJlZXplKHsgLi4ubm90ZS5jaGFubmVscywgcmVhZFNvdXJjZXM6IHNvdXJjZXMuc3RhdHVzIH0pLFxuICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKG5vdGUubGltaXRhdGlvbnMuZmlsdGVyKChnYXApID0+IGdhcCAhPT0gJ3JlYWQtc291cmNlcy1ub3QtY29sbGVjdGVkJykpLFxuICB9KTtcbn1cbiJdfQ==
84
+ /** One status rule shared by native observations and stored admission; storage cannot upgrade coverage. */
85
+ export function readSourceStatus(record, limitations) {
86
+ return !record
87
+ ? 'unknown'
88
+ : record.status === 'failed'
89
+ ? 'failed'
90
+ : record.status !== 'captured' || limitations > 0
91
+ ? 'partial'
92
+ : 'captured';
93
+ }
94
+ /** Redacted exports withhold every reference, including those captured before a later privacy mark. */
95
+ export function redactReadSources(source) {
96
+ return Object.freeze({
97
+ ...(source.version === 2
98
+ ? { version: 2, ownership: redactSourceOwnership(source.ownership) }
99
+ : { version: 1 }),
100
+ runId: source.runId,
101
+ persistence: source.persistence,
102
+ commits: source.commits,
103
+ status: 'unknown',
104
+ limitations: Object.freeze([...new Set([...source.limitations, 'redacted-source-export'])]),
105
+ });
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZFNvdXJjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvcmVhZFNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHdkYsMEZBQTBGO0FBQzFGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUMsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLHdCQUF3QjtJQUN4Qiw0QkFBNEI7SUFDNUIsMEJBQTBCO0lBQzFCLHlCQUF5QjtJQUN6Qiw2QkFBNkI7SUFDN0IsdUJBQXVCO0lBQ3ZCLHdCQUF3QjtDQUNoQixDQUFDLENBQUM7QUE2QlosNkdBQTZHO0FBQzdHLE1BQU0sT0FBTyx1QkFBdUI7SUFjdkI7SUFDUTtJQUVSO0lBaEJGLFNBQVMsQ0FBNEI7SUFDN0IsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQzVDLE1BQU0sQ0FBcUI7SUFDM0IsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN4QixJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxZQUNXLEtBQWEsRUFDTCxJQUF1QixFQUN4QyxHQUFzQixFQUNiLE9BQU8sQ0FBQztRQUhSLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDTCxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUUvQixTQUFJLEdBQUosSUFBSSxDQUFJO1FBRWpCLElBQUksR0FBRztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxD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LFVBQVUsZ0JBQWdCLENBQUMsTUFBc0MsRUFBRSxXQUFtQjtJQUMxRixPQUFPLENBQUMsTUFBTTtRQUNaLENBQUMsQ0FBQyxTQUFTO1FBQ1gsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUTtZQUM1QixDQUFDLENBQUMsUUFBUTtZQUNWLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsSUFBSSxXQUFXLEdBQUcsQ0FBQztnQkFDakQsQ0FBQyxDQUFDLFNBQVM7Z0JBQ1gsQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUNqQixDQUFDO0FBRUQsdUdBQXVHO0FBQ3ZHLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxNQUF5QjtJQUN6RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbkIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssQ0FBQztZQUN0QixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBVSxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDN0UsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQVUsRUFBRSxDQUFDO1FBQzVCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNuQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7UUFDL0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSx3QkFBaUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyRyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWFkU291cmNlUmVjb3JkLCBSZWFkU291cmNlU25hcHNob3QgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IENhcHR1cmVDaGFubmVsU3RhdHVzLCBOYXRpdmVDYXB0dXJlTm90ZSB9IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHsgcmVkYWN0U291cmNlT3duZXJzaGlwLCBTb3VyY2VPd25lcnNoaXBDb2xsZWN0b3IgfSBmcm9tICcuL3NvdXJjZU93bmVyc2hpcC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZU93bmVyc2hpcFdpdG5lc3MgfSBmcm9tICcuL3NvdXJjZU93bmVyc2hpcEZvcm1hdC5qcyc7XG5cbi8qKiBFbmdpbmUgY292ZXJhZ2Ugb25seS4gU291cmNlIGRlc2NyaXB0b3JzIGFuZCB0aGVpciBjb2RlYyBiZWxvbmcgdG8gZm9vdHRyYWNlL3dyaXRlLiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9MSU1JVEFUSU9OUyA9IE9iamVjdC5mcmVlemUoW1xuICAncHJpdmFjeS1hY3RpdmUnLFxuICAnaWRlbnRpdHktdW5hdmFpbGFibGUnLFxuICAndW50cmFja2VkLXJlYWQnLFxuICAnY3VzdG9tLXNjb3BlJyxcbiAgJ2NoaWxkLXNvdXJjZS1vd25lcnNoaXAnLFxuICAnc291cmNlLWFkZHJlc3MtdW5zdXBwb3J0ZWQnLFxuICAncmVzdW1lZC1zb3VyY2Utb3duZXJzaGlwJyxcbiAgJ3Npbmstc291cmNlLXVuc3VwcG9ydGVkJyxcbiAgJ3NvdXJjZS1oaXN0b3J5LW5vdC1pbmNsdWRlZCcsXG4gICdzb3VyY2UtY2FwdHVyZS1mYWlsZWQnLFxuICAncmVkYWN0ZWQtc291cmNlLWV4cG9ydCcsXG5dIGFzIGNvbnN0KTtcbmV4cG9ydCB0eXBlIFNvdXJjZUxpbWl0YXRpb24gPSAodHlwZW9mIFNPVVJDRV9MSU1JVEFUSU9OUylbbnVtYmVyXTtcblxuLyoqIFBhY2tldCAzIGlzIGFuIGluLW1lbW9yeSBvYnNlcnZhdGlvbiwgbm90IGEgc3RvcmVkLWhpc3RvcnkgYWNrbm93bGVkZ2VtZW50LiAqL1xuaW50ZXJmYWNlIEVuZ2luZVJlYWRTb3VyY2VzQmFzZSB7XG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNpc3RlbmNlOiAnbWVtb3J5LW9ubHknO1xuICByZWFkb25seSBjb21taXRzOiB7IHJlYWRvbmx5IGZyb206IG51bWJlcjsgcmVhZG9ubHkgdG86IG51bWJlciB9O1xuICByZWFkb25seSBzdGF0dXM6IENhcHR1cmVDaGFubmVsU3RhdHVzO1xuICByZWFkb25seSBsaW1pdGF0aW9uczogcmVhZG9ubHkgU291cmNlTGltaXRhdGlvbltdO1xuICAvKiogQWJzZW50IG1lYW5zIHVua25vd24gb3duZXJzaGlwLCBuZXZlciBhbiBvYnNlcnZlZC1lbXB0eSBib29rLiAqL1xuICByZWFkb25seSByZWNvcmQ/OiBSZWFkU291cmNlU25hcHNob3Q7XG59XG4vKiogTGVnYWN5IG9ic2VydmF0aW9ucyByZW1haW4gcmVhZGFibGU7IG9ubHkgdjIgY29udGFpbnMgaW5kZXBlbmRlbnRseSBjb2xsZWN0ZWQgb3duZXJzaGlwLiAqL1xuZXhwb3J0IHR5cGUgRW5naW5lUmVhZFNvdXJjZXMgPSBFbmdpbmVSZWFkU291cmNlc0Jhc2UgJlxuICAoXG4gICAgfCB7IHJlYWRvbmx5IHZlcnNpb246IDE7IHJlYWRvbmx5IG93bmVyc2hpcD86IG5ldmVyIH1cbiAgICB8IHsgcmVhZG9ubHkgdmVyc2lvbjogMjsgcmVhZG9ubHkgb3duZXJzaGlwOiBTb3VyY2VPd25lcnNoaXBXaXRuZXNzIH1cbiAgKTtcblxuLyoqIEEgbmV3IGRpc2NyaW1pbmFudCBwcmV2ZW50cyBzdHJpY3QgdjEgcmVhZGVycyBmcm9tIGFjY2VwdGluZyBuZXcgY29tcGxldGVuZXNzIGNsYWltcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmF0aXZlUmVhZENhcHR1cmVOb3RlIGV4dGVuZHMgT21pdDxOYXRpdmVDYXB0dXJlTm90ZSwgJ3ZlcnNpb24nIHwgJ2NoYW5uZWxzJz4ge1xuICByZWFkb25seSB2ZXJzaW9uOiAyO1xuICByZWFkb25seSBjaGFubmVsczogT21pdDxOYXRpdmVDYXB0dXJlTm90ZVsnY2hhbm5lbHMnXSwgJ3JlYWRTb3VyY2VzJz4gJiB7XG4gICAgcmVhZG9ubHkgcmVhZFNvdXJjZXM6IENhcHR1cmVDaGFubmVsU3RhdHVzO1xuICB9O1xufVxuZXhwb3J0IHR5cGUgTmF0aXZlQ2FwdHVyZU9ic2VydmF0aW9uID0gTmF0aXZlQ2FwdHVyZU5vdGUgfCBOYXRpdmVSZWFkQ2FwdHVyZU5vdGU7XG5cbi8qKiBPbmUgb3duZXIgcGVyIHJ1bnRpbWUvbGVnOyBwcm9wYWdhdGVkIG9ubHkgdG8gZnJhbWVzIGluIHRoYXQgbG9nLiBOZXZlciByZWFkcyB2YWx1ZXMgb3Igc2NhbnMgY29tbWl0cy4gKi9cbmV4cG9ydCBjbGFzcyBFbmdpbmVSZWFkU291cmNlQ2FwdHVyZSB7XG4gIHJlYWRvbmx5IG93bmVyc2hpcD86IFNvdXJjZU93bmVyc2hpcENvbGxlY3RvcjtcbiAgcHJpdmF0ZSByZWFkb25seSBnYXBzID0gbmV3IFNldDxTb3VyY2VMaW1pdGF0aW9uPigpO1xuICBwcml2YXRlIHNlYWxlZD86IEVuZ2luZVJlYWRTb3VyY2VzO1xuICBwcml2YXRlIHJldGlyZWQgPSBmYWxzZTtcbiAgZ2V0IG9ic2VydmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ib29rICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmluZyAmJiAhdGhpcy5yZXRpcmVkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2s/OiBSZWFkU291cmNlUmVjb3JkLFxuICAgIGdhcD86IFNvdXJjZUxpbWl0YXRpb24sXG4gICAgcmVhZG9ubHkgZnJvbSA9IDAsXG4gICkge1xuICAgIGlmIChnYXApIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgICBpZiAoYm9vaz8ubG9nLmFkZHJlc3MpIHRoaXMub3duZXJzaGlwID0gbmV3IFNvdXJjZU93bmVyc2hpcENvbGxlY3RvcihydW5JZCwgYm9vay5sb2cuYWRkcmVzcywgZnJvbSk7XG4gIH1cblxuICBsaW1pdChnYXA6IFNvdXJjZUxpbWl0YXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhbGVkKSB0aGlzLmdhcHMuYWRkKGdhcCk7XG4gIH1cblxuICByZXRpcmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXRpcmVkID0gdHJ1ZTtcbiAgICB0aGlzLmJvb2s/LnJldGlyZSgpO1xuICB9XG5cbiAgc2VhbCh0bzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhbGVkKSByZXR1cm47XG4gICAgdGhpcy5zZWFsZWQgPSB0aGlzLnNuYXBzaG90KHRvKTtcbiAgICB0aGlzLnJldGlyZSgpO1xuICB9XG5cbiAgc25hcHNob3QodG86IG51bWJlciwgcmVkYWN0ID0gZmFsc2UpOiBFbmdpbmVSZWFkU291cmNlcyB7XG4gICAgaWYgKHJlZGFjdCkgcmV0dXJuIHJlZGFjdFJlYWRTb3VyY2VzKHRoaXMuc25hcHNob3QodG8pKTtcbiAgICBpZiAodGhpcy5zZWFsZWQgJiYgIXJlZGFjdCkgcmV0dXJuIHRoaXMuc2VhbGVkO1xuICAgIGNvbnN0IGdhcHMgPSBuZXcgU2V0KHRoaXMuZ2Fwcyk7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5ib29rPy5zbmFwc2hvdCgpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJlYWRTb3VyY2VTdGF0dXMocmVjb3JkLCBnYXBzLnNpemUpO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIC4uLihyZWNvcmQgJiYgdGhpcy5vd25lcnNoaXBcbiAgICAgICAgPyB7IHZlcnNpb246IDIgYXMgY29uc3QsIG93bmVyc2hpcDogdGhpcy5vd25lcnNoaXAuc25hcHNob3QodG8sIHJlY29yZC5zZWdtZW50KSB9XG4gICAgICAgIDogeyB2ZXJzaW9uOiAxIGFzIGNvbnN0IH0pLFxuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBwZXJzaXN0ZW5jZTogJ21lbW9yeS1vbmx5JyxcbiAgICAgIGNvbW1pdHM6IE9iamVjdC5mcmVlemUoeyBmcm9tOiB0aGlzLmZyb20sIHRvIH0pLFxuICAgICAgc3RhdHVzLFxuICAgICAgbGltaXRhdGlvbnM6IE9iamVjdC5mcmVlemUoWy4uLmdhcHNdKSxcbiAgICAgIC4uLihyZWNvcmQgJiYgeyByZWNvcmQgfSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEtlZXAgdGhlIHYxIHByb2R1Y2VyIHVuY2hhbmdlZC4gT25seSBleHBsaWNpdGx5IGVuYWJsZWQgc291cmNlIG9ic2VydmF0aW9ucyBhY3F1aXJlIHYyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZWFkU291cmNlcyhub3RlOiBOYXRpdmVDYXB0dXJlTm90ZSwgc291cmNlczogRW5naW5lUmVhZFNvdXJjZXMpOiBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLi4ubm90ZSxcbiAgICB2ZXJzaW9uOiAyLFxuICAgIGNoYW5uZWxzOiBPYmplY3QuZnJlZXplKHsgLi4ubm90ZS5jaGFubmVscywgcmVhZFNvdXJjZXM6IHNvdXJjZXMuc3RhdHVzIH0pLFxuICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKG5vdGUubGltaXRhdGlvbnMuZmlsdGVyKChnYXApID0+IGdhcCAhPT0gJ3JlYWQtc291cmNlcy1ub3QtY29sbGVjdGVkJykpLFxuICB9KTtcbn1cblxuLyoqIE9uZSBzdGF0dXMgcnVsZSBzaGFyZWQgYnkgbmF0aXZlIG9ic2VydmF0aW9ucyBhbmQgc3RvcmVkIGFkbWlzc2lvbjsgc3RvcmFnZSBjYW5ub3QgdXBncmFkZSBjb3ZlcmFnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkU291cmNlU3RhdHVzKHJlY29yZDogUmVhZFNvdXJjZVNuYXBzaG90IHwgdW5kZWZpbmVkLCBsaW1pdGF0aW9uczogbnVtYmVyKTogQ2FwdHVyZUNoYW5uZWxTdGF0dXMge1xuICByZXR1cm4gIXJlY29yZFxuICAgID8gJ3Vua25vd24nXG4gICAgOiByZWNvcmQuc3RhdHVzID09PSAnZmFpbGVkJ1xuICAgID8gJ2ZhaWxlZCdcbiAgICA6IHJlY29yZC5zdGF0dXMgIT09ICdjYXB0dXJlZCcgfHwgbGltaXRhdGlvbnMgPiAwXG4gICAgPyAncGFydGlhbCdcbiAgICA6ICdjYXB0dXJlZCc7XG59XG5cbi8qKiBSZWRhY3RlZCBleHBvcnRzIHdpdGhob2xkIGV2ZXJ5IHJlZmVyZW5jZSwgaW5jbHVkaW5nIHRob3NlIGNhcHR1cmVkIGJlZm9yZSBhIGxhdGVyIHByaXZhY3kgbWFyay4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWRhY3RSZWFkU291cmNlcyhzb3VyY2U6IEVuZ2luZVJlYWRTb3VyY2VzKTogRW5naW5lUmVhZFNvdXJjZXMge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLi4uKHNvdXJjZS52ZXJzaW9uID09PSAyXG4gICAgICA/IHsgdmVyc2lvbjogMiBhcyBjb25zdCwgb3duZXJzaGlwOiByZWRhY3RTb3VyY2VPd25lcnNoaXAoc291cmNlLm93bmVyc2hpcCkgfVxuICAgICAgOiB7IHZlcnNpb246IDEgYXMgY29uc3QgfSksXG4gICAgcnVuSWQ6IHNvdXJjZS5ydW5JZCxcbiAgICBwZXJzaXN0ZW5jZTogc291cmNlLnBlcnNpc3RlbmNlLFxuICAgIGNvbW1pdHM6IHNvdXJjZS5jb21taXRzLFxuICAgIHN0YXR1czogJ3Vua25vd24nLFxuICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKFsuLi5uZXcgU2V0KFsuLi5zb3VyY2UubGltaXRhdGlvbnMsICdyZWRhY3RlZC1zb3VyY2UtZXhwb3J0JyBhcyBjb25zdF0pXSksXG4gIH0pO1xufVxuIl19
@@ -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,21 @@
1
+ import type { LogAddress } from 'foottrace';
2
+ import type { SourceOwnershipGap, SourceOwnershipWitness } from './sourceOwnershipFormat.js';
3
+ /** Collect at the existing native funnels, independently of source rows and retained read values. */
4
+ export declare class SourceOwnershipCollector {
5
+ private readonly runId;
6
+ private readonly logAddress;
7
+ private readonly from;
8
+ private readonly executions;
9
+ private readonly gaps;
10
+ private attempts;
11
+ private bytes;
12
+ constructor(runId: string, logAddress: LogAddress, from: number);
13
+ limit(gap: SourceOwnershipGap): void;
14
+ begin(runId: string, runtimeStageId: string, stateAddress: readonly string[]): void;
15
+ attempt(runtimeStageId: string, attempt: number): string | undefined;
16
+ commit(runtimeStageId: string, index: number): void;
17
+ checkSelectedAddress(runtimeStageId: string, selected: readonly string[]): void;
18
+ snapshot(to: number, segment: number): SourceOwnershipWitness;
19
+ private charge;
20
+ }
21
+ export declare function redactSourceOwnership(witness: SourceOwnershipWitness): SourceOwnershipWitness;
@@ -0,0 +1,133 @@
1
+ import { buildAttemptId } from 'foottrace';
2
+ import { isNativeSourceExecution, SOURCE_OWNERSHIP_GAPS, SOURCE_OWNERSHIP_V1_LIMITS } from './sourceOwnershipFormat.js';
3
+ /** Collect at the existing native funnels, independently of source rows and retained read values. */
4
+ export class SourceOwnershipCollector {
5
+ runId;
6
+ logAddress;
7
+ from;
8
+ executions = new Map();
9
+ gaps = new Set();
10
+ attempts = 0;
11
+ bytes = 0;
12
+ constructor(runId, logAddress, from) {
13
+ this.runId = runId;
14
+ this.logAddress = logAddress;
15
+ this.from = from;
16
+ // Reserve the largest header before entries. Native identifiers may need JSON escapes.
17
+ this.bytes = encodedBytes({
18
+ version: 1,
19
+ runId,
20
+ logAddress,
21
+ segment: Number.MAX_SAFE_INTEGER,
22
+ commits: { from, to: Number.MAX_SAFE_INTEGER },
23
+ status: 'captured',
24
+ limitations: SOURCE_OWNERSHIP_GAPS,
25
+ executions: [],
26
+ });
27
+ if (this.bytes > SOURCE_OWNERSHIP_V1_LIMITS.bytes)
28
+ this.limit('bytes-limit');
29
+ }
30
+ limit(gap) {
31
+ this.gaps.add(gap);
32
+ }
33
+ begin(runId, runtimeStageId, stateAddress) {
34
+ if (runId !== this.runId ||
35
+ runtimeStageId.length > SOURCE_OWNERSHIP_V1_LIMITS.name ||
36
+ !isNativeSourceExecution(runtimeStageId)) {
37
+ this.limit('identity-unavailable');
38
+ return;
39
+ }
40
+ if (this.executions.has(runtimeStageId)) {
41
+ this.limit('identity-unavailable');
42
+ return;
43
+ }
44
+ if (this.executions.size >= SOURCE_OWNERSHIP_V1_LIMITS.executions) {
45
+ this.limit('execution-limit');
46
+ return;
47
+ }
48
+ if (stateAddress.length > SOURCE_OWNERSHIP_V1_LIMITS.depth ||
49
+ stateAddress.some((part) => typeof part !== 'string' || part.length > SOURCE_OWNERSHIP_V1_LIMITS.name)) {
50
+ this.limit('identity-unavailable');
51
+ return;
52
+ }
53
+ if (!this.charge(encodedBytes({ runtimeStageId, stateAddress, firstCommit: Number.MAX_SAFE_INTEGER, attemptIds: [] }) + 1))
54
+ return;
55
+ this.executions.set(runtimeStageId, {
56
+ runtimeStageId,
57
+ stateAddress: Object.freeze([...stateAddress]),
58
+ attemptIds: [],
59
+ });
60
+ }
61
+ attempt(runtimeStageId, attempt) {
62
+ const owner = this.executions.get(runtimeStageId);
63
+ if (!owner || !Number.isSafeInteger(attempt) || attempt < 1 || attempt !== owner.attemptIds.length + 1) {
64
+ this.limit('attempt-unavailable');
65
+ return undefined;
66
+ }
67
+ if (this.attempts >= SOURCE_OWNERSHIP_V1_LIMITS.attempts) {
68
+ this.limit('attempt-limit');
69
+ return undefined;
70
+ }
71
+ const id = buildAttemptId(runtimeStageId, attempt);
72
+ if (id.length > SOURCE_OWNERSHIP_V1_LIMITS.name) {
73
+ this.limit('attempt-unavailable');
74
+ return undefined;
75
+ }
76
+ if (!this.charge(encodedBytes(id) + 1))
77
+ return undefined;
78
+ owner.attemptIds.push(id);
79
+ this.attempts++;
80
+ return id;
81
+ }
82
+ commit(runtimeStageId, index) {
83
+ const owner = this.executions.get(runtimeStageId);
84
+ if (!owner || !Number.isSafeInteger(index) || index < this.from) {
85
+ this.limit('commit-unavailable');
86
+ return;
87
+ }
88
+ owner.firstCommit ??= index;
89
+ }
90
+ checkSelectedAddress(runtimeStageId, selected) {
91
+ const address = this.executions.get(runtimeStageId)?.stateAddress;
92
+ // A native fallback is real evidence, but it cannot authorize its own address.
93
+ if (address && (address.length !== selected.length || address.some((part, index) => part !== selected[index])))
94
+ this.limit('source-address-unproven');
95
+ }
96
+ snapshot(to, segment) {
97
+ return Object.freeze({
98
+ version: 1,
99
+ runId: this.runId,
100
+ logAddress: this.logAddress,
101
+ segment,
102
+ commits: Object.freeze({ from: this.from, to }),
103
+ status: this.gaps.size ? 'unknown' : 'captured',
104
+ limitations: Object.freeze([...this.gaps]),
105
+ executions: Object.freeze([...this.executions.values()].map((owner) => Object.freeze({
106
+ runtimeStageId: owner.runtimeStageId,
107
+ stateAddress: owner.stateAddress,
108
+ ...(owner.firstCommit !== undefined && { firstCommit: owner.firstCommit }),
109
+ attemptIds: Object.freeze([...owner.attemptIds]),
110
+ }))),
111
+ });
112
+ }
113
+ charge(bytes) {
114
+ if (bytes > SOURCE_OWNERSHIP_V1_LIMITS.bytes - this.bytes) {
115
+ this.limit('bytes-limit');
116
+ return false;
117
+ }
118
+ this.bytes += bytes;
119
+ return true;
120
+ }
121
+ }
122
+ function encodedBytes(value) {
123
+ return new TextEncoder().encode(JSON.stringify(value)).length;
124
+ }
125
+ export function redactSourceOwnership(witness) {
126
+ return Object.freeze({
127
+ ...witness,
128
+ status: 'unknown',
129
+ executions: Object.freeze([]),
130
+ limitations: Object.freeze(['redacted-export']),
131
+ });
132
+ }
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlT3duZXJzaGlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL3NvdXJjZU93bmVyc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBU3hILHFHQUFxRztBQUNyRyxNQUFNLE9BQU8sd0JBQXdCO0lBTU47SUFBZ0M7SUFBeUM7SUFMckYsVUFBVSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBQzdDLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUM5QyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVsQixZQUE2QixLQUFhLEVBQW1CLFVBQXNCLEVBQW1CLElBQVk7UUFBckYsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFtQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQW1CLFNBQUksR0FBSixJQUFJLENBQVE7UUFDaEgsdUZBQXVGO1FBQ3ZGLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxDQUFDO1lBQ1YsS0FBSztZQUNMLFVBQVU7WUFDVixPQUFPLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtZQUNoQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtZQUM5QyxNQUFNLEVBQUUsVUFBVTtZQUNsQixXQUFXLEVBQUUscUJBQXFCO1lBQ2xDLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLDBCQUEwQixDQUFDLEtBQUs7WUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lB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LENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFjO0lBQ2xDLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQStCO0lBQ25FLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQixHQUFHLE9BQU87UUFDVixNQUFNLEVBQUUsU0FBUztRQUNqQixVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDN0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxpQkFBMEIsQ0FBQyxDQUFDO0tBQ3pELENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgYnVpbGRBdHRlbXB0SWQgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7IFNvdXJjZU93bmVyc2hpcEdhcCwgU291cmNlT3duZXJzaGlwV2l0bmVzcyB9IGZyb20gJy4vc291cmNlT3duZXJzaGlwRm9ybWF0LmpzJztcbmltcG9ydCB7IGlzTmF0aXZlU291cmNlRXhlY3V0aW9uLCBTT1VSQ0VfT1dORVJTSElQX0dBUFMsIFNPVVJDRV9PV05FUlNISVBfVjFfTElNSVRTIH0gZnJvbSAnLi9zb3VyY2VPd25lcnNoaXBGb3JtYXQuanMnO1xuXG50eXBlIE11dGFibGVPd25lciA9IHtcbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgc3RhdGVBZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgZmlyc3RDb21taXQ/OiBudW1iZXI7XG4gIGF0dGVtcHRJZHM6IHN0cmluZ1tdO1xufTtcblxuLyoqIENvbGxlY3QgYXQgdGhlIGV4aXN0aW5nIG5hdGl2ZSBmdW5uZWxzLCBpbmRlcGVuZGVudGx5IG9mIHNvdXJjZSByb3dzIGFuZCByZXRhaW5lZCByZWFkIHZhbHVlcy4gKi9cbmV4cG9ydCBjbGFzcyBTb3VyY2VPd25lcnNoaXBDb2xsZWN0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGlvbnMgPSBuZXcgTWFwPHN0cmluZywgTXV0YWJsZU93bmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdhcHMgPSBuZXcgU2V0PFNvdXJjZU93bmVyc2hpcEdhcD4oKTtcbiAgcHJpdmF0ZSBhdHRlbXB0cyA9IDA7XG4gIHByaXZhdGUgYnl0ZXMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBsb2dBZGRyZXNzOiBMb2dBZGRyZXNzLCBwcml2YXRlIHJlYWRvbmx5IGZyb206IG51bWJlcikge1xuICAgIC8vIFJlc2VydmUgdGhlIGxhcmdlc3QgaGVhZGVyIGJlZm9yZSBlbnRyaWVzLiBOYXRpdmUgaWRlbnRpZmllcnMgbWF5IG5lZWQgSlNPTiBlc2NhcGVzLlxuICAgIHRoaXMuYnl0ZXMgPSBlbmNvZGVkQnl0ZXMoe1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIHJ1bklkLFxuICAgICAgbG9nQWRkcmVzcyxcbiAgICAgIHNlZ21lbnQ6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgY29tbWl0czogeyBmcm9tLCB0bzogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfSxcbiAgICAgIHN0YXR1czogJ2NhcHR1cmVkJyxcbiAgICAgIGxpbWl0YXRpb25zOiBTT1VSQ0VfT1dORVJTSElQX0dBUFMsXG4gICAgICBleGVjdXRpb25zOiBbXSxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5ieXRlcyA+IFNPVVJDRV9PV05FUlNISVBfVjFfTElNSVRTLmJ5dGVzKSB0aGlzLmxpbWl0KCdieXRlcy1saW1pdCcpO1xuICB9XG5cbiAgbGltaXQoZ2FwOiBTb3VyY2VPd25lcnNoaXBHYXApOiB2b2lkIHtcbiAgICB0aGlzLmdhcHMuYWRkKGdhcCk7XG4gIH1cblxuICBiZWdpbihydW5JZDogc3RyaW5nLCBydW50aW1lU3RhZ2VJZDogc3RyaW5nLCBzdGF0ZUFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgcnVuSWQgIT09IHRoaXMucnVuSWQgfHxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkLmxlbmd0aCA+IFNPVVJDRV9PV05FUlNISVBfVjFfTElNSVRTLm5hbWUgfHxcbiAgICAgICFpc05hdGl2ZVNvdXJjZUV4ZWN1dGlvbihydW50aW1lU3RhZ2VJZClcbiAgICApIHtcbiAgICAgIHRoaXMubGltaXQoJ2lkZW50aXR5LXVuYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmV4ZWN1dGlvbnMuaGFzKHJ1bnRpbWVTdGFnZUlkKSkge1xuICAgICAgdGhpcy5saW1pdCgnaWRlbnRpdHktdW5hdmFpbGFibGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZXhlY3V0aW9ucy5zaXplID49IFNPVVJDRV9PV05FUlNISVBfVjFfTElNSVRTLmV4ZWN1dGlvbnMpIHtcbiAgICAgIHRoaXMubGltaXQoJ2V4ZWN1dGlvbi1saW1pdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBzdGF0ZUFkZHJlc3MubGVuZ3RoID4gU09VUkNFX09XTkVSU0hJUF9WMV9MSU1JVFMuZGVwdGggfHxcbiAgICAgIHN0YXRlQWRkcmVzcy5zb21lKChwYXJ0KSA9PiB0eXBlb2YgcGFydCAhPT0gJ3N0cmluZycgfHwgcGFydC5sZW5ndGggPiBTT1VSQ0VfT1dORVJTSElQX1YxX0xJTUlUUy5uYW1lKVxuICAgICkge1xuICAgICAgdGhpcy5saW1pdCgnaWRlbnRpdHktdW5hdmFpbGFibGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMuY2hhcmdlKFxuICAgICAgICBlbmNvZGVkQnl0ZXMoeyBydW50aW1lU3RhZ2VJZCwgc3RhdGVBZGRyZXNzLCBmaXJzdENvbW1pdDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIGF0dGVtcHRJZHM6IFtdIH0pICsgMSxcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5leGVjdXRpb25zLnNldChydW50aW1lU3RhZ2VJZCwge1xuICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICBzdGF0ZUFkZHJlc3M6IE9iamVjdC5mcmVlemUoWy4uLnN0YXRlQWRkcmVzc10pLFxuICAgICAgYXR0ZW1wdElkczogW10sXG4gICAgfSk7XG4gIH1cblxuICBhdHRlbXB0KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIGF0dGVtcHQ6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb3duZXIgPSB0aGlzLmV4ZWN1dGlvbnMuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICBpZiAoIW93bmVyIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihhdHRlbXB0KSB8fCBhdHRlbXB0IDwgMSB8fCBhdHRlbXB0ICE9PSBvd25lci5hdHRlbXB0SWRzLmxlbmd0aCArIDEpIHtcbiAgICAgIHRoaXMubGltaXQoJ2F0dGVtcHQtdW5hdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmF0dGVtcHRzID49IFNPVVJDRV9PV05FUlNISVBfVjFfTElNSVRTLmF0dGVtcHRzKSB7XG4gICAgICB0aGlzLmxpbWl0KCdhdHRlbXB0LWxpbWl0Jyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGJ1aWxkQXR0ZW1wdElkKHJ1bnRpbWVTdGFnZUlkLCBhdHRlbXB0KTtcbiAgICBpZiAoaWQubGVuZ3RoID4gU09VUkNFX09XTkVSU0hJUF9WMV9MSU1JVFMubmFtZSkge1xuICAgICAgdGhpcy5saW1pdCgnYXR0ZW1wdC11bmF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNoYXJnZShlbmNvZGVkQnl0ZXMoaWQpICsgMSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgb3duZXIuYXR0ZW1wdElkcy5wdXNoKGlkKTtcbiAgICB0aGlzLmF0dGVtcHRzKys7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgY29tbWl0KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBvd25lciA9IHRoaXMuZXhlY3V0aW9ucy5nZXQocnVudGltZVN0YWdlSWQpO1xuICAgIGlmICghb3duZXIgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKGluZGV4KSB8fCBpbmRleCA8IHRoaXMuZnJvbSkge1xuICAgICAgdGhpcy5saW1pdCgnY29tbWl0LXVuYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG93bmVyLmZpcnN0Q29tbWl0ID8/PSBpbmRleDtcbiAgfVxuXG4gIGNoZWNrU2VsZWN0ZWRBZGRyZXNzKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIHNlbGVjdGVkOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLmV4ZWN1dGlvbnMuZ2V0KHJ1bnRpbWVTdGFnZUlkKT8uc3RhdGVBZGRyZXNzO1xuICAgIC8vIEEgbmF0aXZlIGZhbGxiYWNrIGlzIHJlYWwgZXZpZGVuY2UsIGJ1dCBpdCBjYW5ub3QgYXV0aG9yaXplIGl0cyBvd24gYWRkcmVzcy5cbiAgICBpZiAoYWRkcmVzcyAmJiAoYWRkcmVzcy5sZW5ndGggIT09IHNlbGVjdGVkLmxlbmd0aCB8fCBhZGRyZXNzLnNvbWUoKHBhcnQsIGluZGV4KSA9PiBwYXJ0ICE9PSBzZWxlY3RlZFtpbmRleF0pKSlcbiAgICAgIHRoaXMubGltaXQoJ3NvdXJjZS1hZGRyZXNzLXVucHJvdmVuJyk7XG4gIH1cblxuICBzbmFwc2hvdCh0bzogbnVtYmVyLCBzZWdtZW50OiBudW1iZXIpOiBTb3VyY2VPd25lcnNoaXBXaXRuZXNzIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBsb2dBZGRyZXNzOiB0aGlzLmxvZ0FkZHJlc3MsXG4gICAgICBzZWdtZW50LFxuICAgICAgY29tbWl0czogT2JqZWN0LmZyZWV6ZSh7IGZyb206IHRoaXMuZnJvbSwgdG8gfSksXG4gICAgICBzdGF0dXM6IHRoaXMuZ2Fwcy5zaXplID8gJ3Vua25vd24nIDogJ2NhcHR1cmVkJyxcbiAgICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKFsuLi50aGlzLmdhcHNdKSxcbiAgICAgIGV4ZWN1dGlvbnM6IE9iamVjdC5mcmVlemUoXG4gICAgICAgIFsuLi50aGlzLmV4ZWN1dGlvbnMudmFsdWVzKCldLm1hcCgob3duZXIpID0+XG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBydW50aW1lU3RhZ2VJZDogb3duZXIucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgICBzdGF0ZUFkZHJlc3M6IG93bmVyLnN0YXRlQWRkcmVzcyxcbiAgICAgICAgICAgIC4uLihvd25lci5maXJzdENvbW1pdCAhPT0gdW5kZWZpbmVkICYmIHsgZmlyc3RDb21taXQ6IG93bmVyLmZpcnN0Q29tbWl0IH0pLFxuICAgICAgICAgICAgYXR0ZW1wdElkczogT2JqZWN0LmZyZWV6ZShbLi4ub3duZXIuYXR0ZW1wdElkc10pLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hhcmdlKGJ5dGVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoYnl0ZXMgPiBTT1VSQ0VfT1dORVJTSElQX1YxX0xJTUlUUy5ieXRlcyAtIHRoaXMuYnl0ZXMpIHtcbiAgICAgIHRoaXMubGltaXQoJ2J5dGVzLWxpbWl0Jyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYnl0ZXMgKz0gYnl0ZXM7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlZEJ5dGVzKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHtcbiAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmxlbmd0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZGFjdFNvdXJjZU93bmVyc2hpcCh3aXRuZXNzOiBTb3VyY2VPd25lcnNoaXBXaXRuZXNzKTogU291cmNlT3duZXJzaGlwV2l0bmVzcyB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAuLi53aXRuZXNzLFxuICAgIHN0YXR1czogJ3Vua25vd24nLFxuICAgIGV4ZWN1dGlvbnM6IE9iamVjdC5mcmVlemUoW10pLFxuICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKFsncmVkYWN0ZWQtZXhwb3J0JyBhcyBjb25zdF0pLFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,35 @@
1
+ import type { LogAddress } from 'foottrace';
2
+ /** Immutable format-v1 ceilings, not writer tuning. Changing these requires another wire version. */
3
+ export declare const SOURCE_OWNERSHIP_V1_LIMITS: Readonly<{
4
+ executions: 4096;
5
+ attempts: 16384;
6
+ bytes: 524288;
7
+ depth: 64;
8
+ name: 2048;
9
+ }>;
10
+ export declare const SOURCE_OWNERSHIP_GAPS: readonly ["identity-unavailable", "namespace-changed", "execution-limit", "attempt-limit", "bytes-limit", "attempt-unavailable", "commit-unavailable", "source-address-unproven", "redacted-export"];
11
+ export type SourceOwnershipGap = (typeof SOURCE_OWNERSHIP_GAPS)[number];
12
+ /** Native execution identity and actual stage-function invocations. No values, timings or outcomes. */
13
+ export interface SourceExecutionOwnership {
14
+ readonly runtimeStageId: string;
15
+ readonly stateAddress: readonly string[];
16
+ /** First real commit of this execution; absent while it has not committed. */
17
+ readonly firstCommit?: number;
18
+ readonly attemptIds: readonly string[];
19
+ }
20
+ /** One native source-book segment. A storage receipt does not authenticate this observation. */
21
+ export interface SourceOwnershipWitness {
22
+ readonly version: 1;
23
+ readonly runId: string;
24
+ readonly logAddress: LogAddress;
25
+ readonly segment: number;
26
+ readonly commits: {
27
+ readonly from: number;
28
+ readonly to: number;
29
+ };
30
+ readonly status: 'captured' | 'unknown';
31
+ readonly limitations: readonly SourceOwnershipGap[];
32
+ readonly executions: readonly SourceExecutionOwnership[];
33
+ }
34
+ /** Compose the public codec; its permissive legacy parse alone does not prove a native execution. */
35
+ export declare function isNativeSourceExecution(id: string): boolean;
@@ -0,0 +1,31 @@
1
+ import { buildRuntimeStageId, isExecutionKey, parseRuntimeStageId } from 'foottrace';
2
+ /** Immutable format-v1 ceilings, not writer tuning. Changing these requires another wire version. */
3
+ export const SOURCE_OWNERSHIP_V1_LIMITS = Object.freeze({
4
+ executions: 4096,
5
+ attempts: 16384,
6
+ bytes: 524288,
7
+ depth: 64,
8
+ name: 2048,
9
+ });
10
+ export const SOURCE_OWNERSHIP_GAPS = Object.freeze([
11
+ 'identity-unavailable',
12
+ 'namespace-changed',
13
+ 'execution-limit',
14
+ 'attempt-limit',
15
+ 'bytes-limit',
16
+ 'attempt-unavailable',
17
+ 'commit-unavailable',
18
+ 'source-address-unproven',
19
+ 'redacted-export',
20
+ ]);
21
+ /** Compose the public codec; its permissive legacy parse alone does not prove a native execution. */
22
+ export function isNativeSourceExecution(id) {
23
+ if (!isExecutionKey(id))
24
+ return false;
25
+ const parsed = parseRuntimeStageId(id);
26
+ return (!!parsed.stageId &&
27
+ Number.isSafeInteger(parsed.executionIndex) &&
28
+ parsed.executionIndex >= 0 &&
29
+ buildRuntimeStageId(parsed.stageId, parsed.executionIndex, parsed.subflowPath) === id);
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlT3duZXJzaGlwRm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL3NvdXJjZU93bmVyc2hpcEZvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJGLHFHQUFxRztBQUNyRyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3RELFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFFBQVEsRUFBRSxLQUFLO0lBQ2YsS0FBSyxFQUFFLE1BQU07SUFDYixLQUFLLEVBQUUsRUFBRTtJQUNULElBQUksRUFBRSxJQUFJO0NBQ1gsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNqRCxzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsYUFBYTtJQUNiLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIseUJBQXlCO0lBQ3pCLGlCQUFpQjtDQUNULENBQUMsQ0FBQztBQXdCWixxR0FBcUc7QUFDckcsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEVBQVU7SUFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0QyxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QyxPQUFPLENBQ0wsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQ2hCLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUMzQyxNQUFNLENBQUMsY0FBYyxJQUFJLENBQUM7UUFDMUIsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQ3RGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMb2dBZGRyZXNzIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQsIGlzRXhlY3V0aW9uS2V5LCBwYXJzZVJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuLyoqIEltbXV0YWJsZSBmb3JtYXQtdjEgY2VpbGluZ3MsIG5vdCB3cml0ZXIgdHVuaW5nLiBDaGFuZ2luZyB0aGVzZSByZXF1aXJlcyBhbm90aGVyIHdpcmUgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBTT1VSQ0VfT1dORVJTSElQX1YxX0xJTUlUUyA9IE9iamVjdC5mcmVlemUoe1xuICBleGVjdXRpb25zOiA0MDk2LFxuICBhdHRlbXB0czogMTYzODQsXG4gIGJ5dGVzOiA1MjQyODgsXG4gIGRlcHRoOiA2NCxcbiAgbmFtZTogMjA0OCxcbn0pO1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9PV05FUlNISVBfR0FQUyA9IE9iamVjdC5mcmVlemUoW1xuICAnaWRlbnRpdHktdW5hdmFpbGFibGUnLFxuICAnbmFtZXNwYWNlLWNoYW5nZWQnLFxuICAnZXhlY3V0aW9uLWxpbWl0JyxcbiAgJ2F0dGVtcHQtbGltaXQnLFxuICAnYnl0ZXMtbGltaXQnLFxuICAnYXR0ZW1wdC11bmF2YWlsYWJsZScsXG4gICdjb21taXQtdW5hdmFpbGFibGUnLFxuICAnc291cmNlLWFkZHJlc3MtdW5wcm92ZW4nLFxuICAncmVkYWN0ZWQtZXhwb3J0Jyxcbl0gYXMgY29uc3QpO1xuZXhwb3J0IHR5cGUgU291cmNlT3duZXJzaGlwR2FwID0gKHR5cGVvZiBTT1VSQ0VfT1dORVJTSElQX0dBUFMpW251bWJlcl07XG5cbi8qKiBOYXRpdmUgZXhlY3V0aW9uIGlkZW50aXR5IGFuZCBhY3R1YWwgc3RhZ2UtZnVuY3Rpb24gaW52b2NhdGlvbnMuIE5vIHZhbHVlcywgdGltaW5ncyBvciBvdXRjb21lcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlRXhlY3V0aW9uT3duZXJzaGlwIHtcbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhdGVBZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIEZpcnN0IHJlYWwgY29tbWl0IG9mIHRoaXMgZXhlY3V0aW9uOyBhYnNlbnQgd2hpbGUgaXQgaGFzIG5vdCBjb21taXR0ZWQuICovXG4gIHJlYWRvbmx5IGZpcnN0Q29tbWl0PzogbnVtYmVyO1xuICByZWFkb25seSBhdHRlbXB0SWRzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIE9uZSBuYXRpdmUgc291cmNlLWJvb2sgc2VnbWVudC4gQSBzdG9yYWdlIHJlY2VpcHQgZG9lcyBub3QgYXV0aGVudGljYXRlIHRoaXMgb2JzZXJ2YXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZU93bmVyc2hpcFdpdG5lc3Mge1xuICByZWFkb25seSB2ZXJzaW9uOiAxO1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICByZWFkb25seSBsb2dBZGRyZXNzOiBMb2dBZGRyZXNzO1xuICByZWFkb25seSBzZWdtZW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvbW1pdHM6IHsgcmVhZG9ubHkgZnJvbTogbnVtYmVyOyByZWFkb25seSB0bzogbnVtYmVyIH07XG4gIHJlYWRvbmx5IHN0YXR1czogJ2NhcHR1cmVkJyB8ICd1bmtub3duJztcbiAgcmVhZG9ubHkgbGltaXRhdGlvbnM6IHJlYWRvbmx5IFNvdXJjZU93bmVyc2hpcEdhcFtdO1xuICByZWFkb25seSBleGVjdXRpb25zOiByZWFkb25seSBTb3VyY2VFeGVjdXRpb25Pd25lcnNoaXBbXTtcbn1cblxuLyoqIENvbXBvc2UgdGhlIHB1YmxpYyBjb2RlYzsgaXRzIHBlcm1pc3NpdmUgbGVnYWN5IHBhcnNlIGFsb25lIGRvZXMgbm90IHByb3ZlIGEgbmF0aXZlIGV4ZWN1dGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05hdGl2ZVNvdXJjZUV4ZWN1dGlvbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghaXNFeGVjdXRpb25LZXkoaWQpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlUnVudGltZVN0YWdlSWQoaWQpO1xuICByZXR1cm4gKFxuICAgICEhcGFyc2VkLnN0YWdlSWQgJiZcbiAgICBOdW1iZXIuaXNTYWZlSW50ZWdlcihwYXJzZWQuZXhlY3V0aW9uSW5kZXgpICYmXG4gICAgcGFyc2VkLmV4ZWN1dGlvbkluZGV4ID49IDAgJiZcbiAgICBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhcnNlZC5zdGFnZUlkLCBwYXJzZWQuZXhlY3V0aW9uSW5kZXgsIHBhcnNlZC5zdWJmbG93UGF0aCkgPT09IGlkXG4gICk7XG59XG4iXX0=
@@ -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,7 @@
1
+ import type { ReadSourceSnapshot } from 'foottrace/write';
2
+ import type { SourceReadCounts } from './sourceReadCounts.js';
3
+ export type StoredSourceCounts = SourceReadCounts & {
4
+ readonly invocations?: number;
5
+ };
6
+ /** Already inert, byte-bounded evidence. Check native counts; never reconstruct read occurrences. */
7
+ export declare function storedReadSourceCounts(record: ReadSourceSnapshot, executionTree: unknown, committedOwners: ReadonlyMap<string, number>): ReadonlyMap<string, StoredSourceCounts> | undefined;
@@ -0,0 +1,82 @@
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 undefined;
39
+ const value = pending.pop();
40
+ if (!value || typeof value !== 'object' || Array.isArray(value))
41
+ return undefined;
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 undefined;
48
+ if (typeof id !== 'string' || !id) {
49
+ if (counts.observed || counts.retained)
50
+ return undefined;
51
+ }
52
+ else {
53
+ if (owners.has(id))
54
+ return undefined;
55
+ const invocations = node.readSourceInvocations;
56
+ if (Object.hasOwn(node, 'readSourceInvocations') &&
57
+ (!Number.isSafeInteger(invocations) || invocations < 0))
58
+ return undefined;
59
+ owners.set(id, { ...counts, ...(invocations !== undefined && { invocations: invocations }) });
60
+ }
61
+ }
62
+ else if (typeof id === 'string' && committedOwners.has(id))
63
+ return undefined;
64
+ if (Object.hasOwn(node, 'next'))
65
+ pending.push(node.next);
66
+ if (Object.hasOwn(node, 'children')) {
67
+ if (!Array.isArray(node.children) || node.children.length > 100_000 - visited - pending.length)
68
+ return undefined;
69
+ for (const child of node.children)
70
+ pending.push(child);
71
+ }
72
+ }
73
+ const remaining = new Map([...owners].map(([id, counts]) => [id, { ...counts.kinds }]));
74
+ for (const row of record.occurrences) {
75
+ const counts = remaining.get(row.runtimeStageId);
76
+ if (!counts || counts[row.source.kind] === 0)
77
+ return undefined;
78
+ counts[row.source.kind]--;
79
+ }
80
+ return [...remaining.values()].every((counts) => KINDS.every((kind) => counts[kind] === 0)) ? owners : undefined;
81
+ }
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkUmVhZFNvdXJjZUNvdW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9zdG9yZWRSZWFkU291cmNlQ291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUF3QyxDQUFDO0FBR2pHLFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRixNQUFNLE1BQU0sR0FBRyxLQUF5QixDQUFDO0lBQ3pDLElBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUMvQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUM7UUFDbkIsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVE7UUFFakMsT0FBTyxTQUFTLENBQUM7SUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN2RyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFD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R0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNuSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWFkU291cmNlU25hcHNob3QgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IFNvdXJjZVJlYWRDb3VudHMgfSBmcm9tICcuL3NvdXJjZVJlYWRDb3VudHMuanMnO1xuaW1wb3J0IHsgRU1QVFlfU09VUkNFX1JFQURfQ09VTlRTIH0gZnJvbSAnLi9zb3VyY2VSZWFkQ291bnRzLmpzJztcblxuY29uc3QgS0lORFMgPSBPYmplY3Qua2V5cyhFTVBUWV9TT1VSQ0VfUkVBRF9DT1VOVFMua2luZHMpIGFzIChrZXlvZiBTb3VyY2VSZWFkQ291bnRzWydraW5kcyddKVtdO1xuZXhwb3J0IHR5cGUgU3RvcmVkU291cmNlQ291bnRzID0gU291cmNlUmVhZENvdW50cyAmIHsgcmVhZG9ubHkgaW52b2NhdGlvbnM/OiBudW1iZXIgfTtcblxuZnVuY3Rpb24gY291bnRzT2YodmFsdWU6IHVua25vd24pOiBTb3VyY2VSZWFkQ291bnRzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb3VudHMgPSB2YWx1ZSBhcyBTb3VyY2VSZWFkQ291bnRzO1xuICBpZiAoXG4gICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCAhPT0gMyB8fFxuICAgICFOdW1iZXIuaXNTYWZlSW50ZWdlcihjb3VudHMub2JzZXJ2ZWQpIHx8XG4gICAgIU51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50cy5yZXRhaW5lZCkgfHxcbiAgICBjb3VudHMub2JzZXJ2ZWQgPCAwIHx8XG4gICAgY291bnRzLnJldGFpbmVkIDwgMCB8fFxuICAgIGNvdW50cy5yZXRhaW5lZCA+IGNvdW50cy5vYnNlcnZlZFxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFjb3VudHMua2luZHMgfHwgdHlwZW9mIGNvdW50cy5raW5kcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShjb3VudHMua2luZHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoT2JqZWN0LmtleXMoY291bnRzLmtpbmRzKS5sZW5ndGggIT09IEtJTkRTLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAoY29uc3Qga2luZCBvZiBLSU5EUykge1xuICAgIGNvbnN0IGNvdW50ID0gY291bnRzLmtpbmRzW2tpbmRdO1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpIHx8IGNvdW50IDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdW0gKz0gY291bnQ7XG4gICAgaWYgKHN1bSA+IGNvdW50cy5yZXRhaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoc3VtICE9PSBjb3VudHMucmV0YWluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjb3VudHM7XG59XG5cbi8qKiBBbHJlYWR5IGluZXJ0LCBieXRlLWJvdW5kZWQgZXZpZGVuY2UuIENoZWNrIG5hdGl2ZSBjb3VudHM7IG5ldmVyIHJlY29uc3RydWN0IHJlYWQgb2NjdXJyZW5jZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVkUmVhZFNvdXJjZUNvdW50cyhcbiAgcmVjb3JkOiBSZWFkU291cmNlU25hcHNob3QsXG4gIGV4ZWN1dGlvblRyZWU6IHVua25vd24sXG4gIGNvbW1pdHRlZE93bmVyczogUmVhZG9ubHlNYXA8c3RyaW5nLCBudW1iZXI+LFxuKTogUmVhZG9ubHlNYXA8c3RyaW5nLCBTdG9yZWRTb3VyY2VDb3VudHM+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3duZXJzID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZFNvdXJjZUNvdW50cz4oKTtcbiAgY29uc3QgcGVuZGluZyA9IFtleGVjdXRpb25UcmVlXTtcbiAgbGV0IHZpc2l0ZWQgPSAwO1xuICB3aGlsZSAocGVuZGluZy5sZW5ndGgpIHtcbiAgICBpZiAoKyt2aXNpdGVkID4gMTAwXzAwMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWx1ZSA9IHBlbmRpbmcucG9wKCk7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG5vZGUgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBpZCA9IG5vZGUucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKE9iamVjdC5oYXNPd24obm9kZSwgJ3JlYWRTb3VyY2VDb3VudHMnKSkge1xuICAgICAgY29uc3QgY291bnRzID0gY291bnRzT2Yobm9kZS5yZWFkU291cmNlQ291bnRzKTtcbiAgICAgIGlmICghY291bnRzIHx8IChyZWNvcmQuc3RhdHVzID09PSAnY2FwdHVyZWQnICYmIGNvdW50cy5vYnNlcnZlZCAhPT0gY291bnRzLnJldGFpbmVkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnIHx8ICFpZCkge1xuICAgICAgICBpZiAoY291bnRzLm9ic2VydmVkIHx8IGNvdW50cy5yZXRhaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvd25lcnMuaGFzKGlkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgaW52b2NhdGlvbnMgPSBub2RlLnJlYWRTb3VyY2VJbnZvY2F0aW9ucztcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE9iamVjdC5oYXNPd24obm9kZSwgJ3JlYWRTb3VyY2VJbnZvY2F0aW9ucycpICYmXG4gICAgICAgICAgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihpbnZvY2F0aW9ucykgfHwgKGludm9jYXRpb25zIGFzIG51bWJlcikgPCAwKVxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgb3duZXJzLnNldChpZCwgeyAuLi5jb3VudHMsIC4uLihpbnZvY2F0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgaW52b2NhdGlvbnM6IGludm9jYXRpb25zIGFzIG51bWJlciB9KSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgY29tbWl0dGVkT3duZXJzLmhhcyhpZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKE9iamVjdC5oYXNPd24obm9kZSwgJ25leHQnKSkgcGVuZGluZy5wdXNoKG5vZGUubmV4dCk7XG4gICAgaWYgKE9iamVjdC5oYXNPd24obm9kZSwgJ2NoaWxkcmVuJykpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlLmNoaWxkcmVuKSB8fCBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDEwMF8wMDAgLSB2aXNpdGVkIC0gcGVuZGluZy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHBlbmRpbmcucHVzaChjaGlsZCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBNYXAoWy4uLm93bmVyc10ubWFwKChbaWQsIGNvdW50c10pID0+IFtpZCwgeyAuLi5jb3VudHMua2luZHMgfV0pKTtcbiAgZm9yIChjb25zdCByb3cgb2YgcmVjb3JkLm9jY3VycmVuY2VzKSB7XG4gICAgY29uc3QgY291bnRzID0gcmVtYWluaW5nLmdldChyb3cucnVudGltZVN0YWdlSWQpO1xuICAgIGlmICghY291bnRzIHx8IGNvdW50c1tyb3cuc291cmNlLmtpbmRdID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvdW50c1tyb3cuc291cmNlLmtpbmRdLS07XG4gIH1cbiAgcmV0dXJuIFsuLi5yZW1haW5pbmcudmFsdWVzKCldLmV2ZXJ5KChjb3VudHMpID0+IEtJTkRTLmV2ZXJ5KChraW5kKSA9PiBjb3VudHNba2luZF0gPT09IDApKSA/IG93bmVycyA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -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;