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.
- package/README.md +63 -25
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/capture/historyData.d.ts +6 -2
- package/dist/esm/lib/capture/historyData.js +18 -1
- package/dist/esm/lib/capture/historyNote.d.ts +2 -2
- package/dist/esm/lib/capture/historyNote.js +11 -6
- package/dist/esm/lib/capture/historyTypes.d.ts +1 -1
- package/dist/esm/lib/capture/historyTypes.js +1 -1
- package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
- package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
- package/dist/esm/lib/capture/readSources.d.ts +20 -3
- package/dist/esm/lib/capture/readSources.js +41 -12
- package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
- package/dist/esm/lib/capture/sinkSettlement.js +10 -0
- package/dist/esm/lib/capture/sourceOwnership.d.ts +21 -0
- package/dist/esm/lib/capture/sourceOwnership.js +133 -0
- package/dist/esm/lib/capture/sourceOwnershipFormat.d.ts +35 -0
- package/dist/esm/lib/capture/sourceOwnershipFormat.js +31 -0
- package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
- package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
- package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
- package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
- package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +7 -0
- package/dist/esm/lib/capture/storedReadSourceCounts.js +82 -0
- package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
- package/dist/esm/lib/capture/storedReadSources.js +120 -0
- package/dist/esm/lib/capture/storedSourceOwnership.d.ts +8 -0
- package/dist/esm/lib/capture/storedSourceOwnership.js +100 -0
- package/dist/esm/lib/engine/handlers/StageRunner.js +2 -1
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +11 -2
- package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
- package/dist/esm/lib/engine/types.d.ts +2 -1
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.d.ts +4 -0
- package/dist/esm/lib/memory/StageContext.js +40 -7
- package/dist/esm/lib/memory/frameTypes.d.ts +5 -0
- package/dist/esm/lib/memory/frameTypes.js +1 -1
- package/dist/esm/lib/memory/logAddress.d.ts +3 -0
- package/dist/esm/lib/memory/logAddress.js +7 -0
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -0
- package/dist/esm/lib/runner/ExecutionRuntime.js +65 -8
- package/dist/esm/lib/runner/FlowChartExecutor.js +4 -2
- package/dist/esm/lib/runner/captureHistory.js +16 -10
- package/dist/esm/lib/runner/readStoredCapture.d.ts +4 -2
- package/dist/esm/lib/runner/readStoredCapture.js +3 -3
- package/dist/esm/lib/runner/recordSink.js +2 -10
- package/dist/esm/lib/runner/storedCaptureAdmission.js +10 -8
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/sinks/indexedAdmission.d.ts +14 -0
- package/dist/esm/lib/sinks/indexedAdmission.js +77 -0
- package/dist/esm/lib/sinks/indexedIO.d.ts +14 -0
- package/dist/esm/lib/sinks/indexedIO.js +96 -0
- package/dist/esm/lib/sinks/indexedRecordFile.d.ts +3 -0
- package/dist/esm/lib/sinks/indexedRecordFile.js +120 -0
- package/dist/esm/lib/sinks/indexedScan.d.ts +6 -0
- package/dist/esm/lib/sinks/indexedScan.js +73 -0
- package/dist/esm/lib/sinks/indexedTypes.d.ts +60 -0
- package/dist/esm/lib/sinks/indexedTypes.js +2 -0
- package/dist/esm/sinks.d.ts +2 -0
- package/dist/esm/sinks.js +2 -1
- package/dist/index.js +1 -1
- package/dist/lib/capture/historyData.js +21 -2
- package/dist/lib/capture/historyNote.js +9 -4
- package/dist/lib/capture/historyTypes.js +1 -1
- package/dist/lib/capture/nativeSourceAddress.js +19 -0
- package/dist/lib/capture/readSources.js +44 -13
- package/dist/lib/capture/sinkSettlement.js +14 -0
- package/dist/lib/capture/sourceOwnership.js +138 -0
- package/dist/lib/capture/sourceOwnershipFormat.js +35 -0
- package/dist/lib/capture/sourceReadCounts.js +31 -0
- package/dist/lib/capture/sourceReferenceBudget.js +25 -0
- package/dist/lib/capture/storedReadSourceCounts.js +86 -0
- package/dist/lib/capture/storedReadSources.js +124 -0
- package/dist/lib/capture/storedSourceOwnership.js +104 -0
- package/dist/lib/engine/handlers/StageRunner.js +2 -1
- package/dist/lib/engine/handlers/SubflowExecutor.js +11 -2
- package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +40 -7
- package/dist/lib/memory/frameTypes.js +1 -1
- package/dist/lib/memory/logAddress.js +11 -0
- package/dist/lib/runner/ExecutionRuntime.js +65 -8
- package/dist/lib/runner/FlowChartExecutor.js +4 -2
- package/dist/lib/runner/captureHistory.js +15 -9
- package/dist/lib/runner/readStoredCapture.js +2 -2
- package/dist/lib/runner/recordSink.js +6 -14
- package/dist/lib/runner/storedCaptureAdmission.js +9 -7
- package/dist/lib/scope/ScopeFacade.js +2 -2
- package/dist/lib/sinks/indexedAdmission.js +85 -0
- package/dist/lib/sinks/indexedIO.js +106 -0
- package/dist/lib/sinks/indexedRecordFile.js +124 -0
- package/dist/lib/sinks/indexedScan.js +77 -0
- package/dist/lib/sinks/indexedTypes.js +3 -0
- package/dist/sinks.js +4 -2
- package/dist/types/index.d.ts +1 -0
- package/dist/types/lib/capture/historyData.d.ts +6 -2
- package/dist/types/lib/capture/historyNote.d.ts +2 -2
- package/dist/types/lib/capture/historyTypes.d.ts +1 -1
- package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
- package/dist/types/lib/capture/readSources.d.ts +20 -3
- package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
- package/dist/types/lib/capture/sourceOwnership.d.ts +21 -0
- package/dist/types/lib/capture/sourceOwnershipFormat.d.ts +35 -0
- package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
- package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
- package/dist/types/lib/capture/storedReadSourceCounts.d.ts +7 -0
- package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
- package/dist/types/lib/capture/storedSourceOwnership.d.ts +8 -0
- package/dist/types/lib/engine/types.d.ts +2 -1
- package/dist/types/lib/memory/StageContext.d.ts +4 -0
- package/dist/types/lib/memory/frameTypes.d.ts +5 -0
- package/dist/types/lib/memory/logAddress.d.ts +3 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -0
- package/dist/types/lib/runner/readStoredCapture.d.ts +4 -2
- package/dist/types/lib/sinks/indexedAdmission.d.ts +14 -0
- package/dist/types/lib/sinks/indexedIO.d.ts +14 -0
- package/dist/types/lib/sinks/indexedRecordFile.d.ts +3 -0
- package/dist/types/lib/sinks/indexedScan.d.ts +6 -0
- package/dist/types/lib/sinks/indexedTypes.d.ts +60 -0
- package/dist/types/sinks.d.ts +2 -0
- 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
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlT3duZXJzaGlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL3NvdXJjZU93bmVyc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBU3hILHFHQUFxRztBQUNyRyxNQUFNLE9BQU8sd0JBQXdCO0lBTU47SUFBZ0M7SUFBeUM7SUFMckYsVUFBVSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBQzdDLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUM5QyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVsQixZQUE2QixLQUFhLEVBQW1CLFVBQXNCLEVBQW1CLElBQVk7UUFBckYsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFtQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQW1CLFNBQUksR0FBSixJQUFJLENBQVE7UUFDaEgsdUZBQXVGO1FBQ3ZGLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxDQUFDO1lBQ1YsS0FBSztZQUNMLFVBQVU7WUFDVixPQUFPLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtZQUNoQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtZQUM5QyxNQUFNLEVBQUUsVUFBVTtZQUNsQixXQUFXLEVBQUUscUJBQXFCO1lBQ2xDLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLDBCQUEwQixDQUFDLEtBQUs7WUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBdUI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFhLEVBQUUsY0FBc0IsRUFBRSxZQUErQjtRQUMxRSxJQUNFLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSztZQUNwQixjQUFjLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDLElBQUk7WUFDdkQsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsRUFDeEMsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDbkMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM5QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQ0UsWUFBWSxDQUFDLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxLQUFLO1lBQ3RELFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxFQUN0RyxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFDRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQ1YsWUFBWSxDQUFDLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FDekc7WUFFRCxPQUFPO1FBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFO1lBQ2xDLGNBQWM7WUFDZCxZQUFZLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7WUFDOUMsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLGNBQXNCLEVBQUUsT0FBZTtRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2RyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbEMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbEMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6RCxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQXNCLEVBQUUsS0FBYTtRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNqQyxPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxjQUFzQixFQUFFLFFBQTJCO1FBQ3RFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQztRQUNsRSwrRUFBK0U7UUFDL0UsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM1RyxJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELFFBQVEsQ0FBQyxFQUFVLEVBQUUsT0FBZTtRQUNsQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUM7WUFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLE9BQU87WUFDUCxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQy9DLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVO1lBQy9DLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQ3ZCLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDMUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDWixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7Z0JBQ3BDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDMUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNqRCxDQUFDLENBQ0gsQ0FDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsS0FBYTtRQUMxQixJQUFJLEtBQUssR0FBRywwQkFBMEIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFjO0lBQ2xDLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQStCO0lBQ25FLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQixHQUFHLE9BQU87UUFDVixNQUFNLEVBQUUsU0FBUztRQUNqQixVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDN0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxpQkFBMEIsQ0FBQyxDQUFDO0tBQ3pELENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgYnVpbGRBdHRlbXB0SWQgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7IFNvdXJjZU93bmVyc2hpcEdhcCwgU291cmNlT3duZXJzaGlwV2l0bmVzcyB9IGZyb20gJy4vc291cmNlT3duZXJzaGlwRm9ybWF0LmpzJztcbmltcG9ydCB7IGlzTmF0aXZlU291cmNlRXhlY3V0aW9uLCBTT1VSQ0VfT1dORVJTSElQX0dBUFMsIFNPVVJDRV9PV05FUlNISVBfVjFfTElNSVRTIH0gZnJvbSAnLi9zb3VyY2VPd25lcnNoaXBGb3JtYXQuanMnO1xuXG50eXBlIE11dGFibGVPd25lciA9IHtcbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgc3RhdGVBZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgZmlyc3RDb21taXQ/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;
|