@lapxo/bound 0.2.3 → 0.2.5
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/CITATION.cff +19 -0
- package/TARGET.bound +95 -39
- package/dist/cli/accept.js +72 -558
- package/dist/cli/act-result.js +3 -103
- package/dist/cli/args.js +3 -44
- package/dist/cli/custodian.js +2 -29
- package/dist/cli/host.js +4 -32
- package/dist/cli/names.js +1 -12
- package/dist/cli/native-descendant.js +1 -19
- package/dist/cli/native.js +3 -60
- package/dist/cli/observe.js +1 -13
- package/dist/cli/owner.js +3 -139
- package/dist/cli/pass.js +21 -321
- package/dist/cli/place.js +6 -281
- package/dist/cli/release-result.js +3 -80
- package/dist/cli/retained-judgment.js +1 -25
- package/dist/cli/standing-result.js +4 -21
- package/dist/cli/takes.js +10 -111
- package/dist/cli/verb.d.ts +1 -2
- package/dist/cli/verb.js +83 -683
- package/dist/engine/computation.js +2 -0
- package/dist/engine/conformance.js +4 -0
- package/dist/engine/encoding.js +1 -2
- package/dist/engine/index.d.ts +1 -13
- package/dist/engine/index.js +2 -11
- package/dist/engine/object.js +1 -38
- package/dist/engine/ports.js +2 -103
- package/dist/fold/admission-history.js +1 -17
- package/dist/fold/bootstrap-anchor.js +1 -28
- package/dist/fold/ceilings.js +1 -142
- package/dist/fold/claims.js +2 -131
- package/dist/fold/closed.js +24 -234
- package/dist/fold/configures.js +1 -25
- package/dist/fold/digests.js +10 -226
- package/dist/fold/evidence.js +1 -22
- package/dist/fold/fold-worker.js +1 -13
- package/dist/fold/kept.js +12 -173
- package/dist/fold/keys.js +3 -91
- package/dist/fold/laid.js +3 -90
- package/dist/fold/nos.js +1 -48
- package/dist/fold/object.js +1 -2
- package/dist/fold/observed.js +27 -534
- package/dist/fold/opened.js +1 -33
- package/dist/fold/own.js +3 -217
- package/dist/fold/paid.js +1 -92
- package/dist/fold/place-inputs.js +1 -70
- package/dist/fold/places.js +3 -100
- package/dist/fold/rank.js +1 -9
- package/dist/fold/reach.js +1 -83
- package/dist/fold/readers.js +6 -142
- package/dist/fold/receipts.js +1 -47
- package/dist/fold/region-declarations.js +1 -13
- package/dist/fold/region.js +8 -286
- package/dist/fold/release-policy.js +1 -101
- package/dist/fold/resolved.js +6 -145
- package/dist/fold/roles.js +2 -59
- package/dist/fold/second.js +4 -71
- package/dist/fold/shards.js +12 -100
- package/dist/fold/signed.js +3 -81
- package/dist/fold/signers.js +1 -54
- package/dist/fold/stranger.js +6 -24
- package/dist/fold/views.js +1 -66
- package/dist/fold/wire.js +1 -46
- package/dist/fold/zoom.js +3 -81
- package/dist/host/act-cost.js +1 -25
- package/dist/host/adapters/keys/ed25519.js +1 -30
- package/dist/host/adapters/modules/javascript.js +1 -50
- package/dist/host/adapters/transport/http.js +1 -28
- package/dist/host/admitted-place.js +1 -63
- package/dist/host/archive.js +1 -152
- package/dist/host/call-context.js +1 -0
- package/dist/host/capsule-process.js +2 -61
- package/dist/host/capsule.js +9 -168
- package/dist/host/cell-receipts.js +12 -128
- package/dist/host/commit-result.js +1 -0
- package/dist/host/content-needed.js +1 -8
- package/dist/host/content-store.js +1 -31
- package/dist/host/contextual-place.js +2 -77
- package/dist/host/digest.js +2 -15
- package/dist/host/hash.js +1 -9
- package/dist/host/host-controls.js +1 -0
- package/dist/host/in-process-act.js +3 -0
- package/dist/host/in-process-context.js +3 -0
- package/dist/host/in-process-root.js +6 -0
- package/dist/host/in-process.js +4 -0
- package/dist/host/index.d.ts +1 -0
- package/dist/host/index.js +1 -0
- package/dist/host/io.js +1 -11
- package/dist/host/lifetime.js +1 -79
- package/dist/host/located.js +6 -105
- package/dist/host/native/bounded-file.js +1 -32
- package/dist/host/native/command.js +1 -91
- package/dist/host/native/control-bridge-worker.js +2 -88
- package/dist/host/native/control-bridge.js +1 -110
- package/dist/host/native/control-selection.js +1 -32
- package/dist/host/native/custody.js +1 -91
- package/dist/host/native/deadline.js +1 -28
- package/dist/host/native/descendants.js +1 -528
- package/dist/host/native/generated-custodian.js +5 -267
- package/dist/host/native/generated.js +1 -379
- package/dist/host/native/image.js +1 -45
- package/dist/host/native/jobs.js +2 -148
- package/dist/host/native/loader.js +1 -269
- package/dist/host/native/materialize.js +1 -175
- package/dist/host/native/module-closure.js +1 -130
- package/dist/host/native/module-delivery.d.ts +1 -62
- package/dist/host/native/module-delivery.js +1 -151
- package/dist/host/native/module-syntax.js +1 -69
- package/dist/host/native/native-binary.js +1 -115
- package/dist/host/native/native-program.js +1 -72
- package/dist/host/native/node-jobs.js +3 -187
- package/dist/host/native/node-launch.js +1 -159
- package/dist/host/native/preload.js +1 -45
- package/dist/host/native/reading.js +1 -249
- package/dist/host/native/receipt-environment.js +1 -41
- package/dist/host/native/references.js +1 -30
- package/dist/host/native/root.js +1 -37
- package/dist/host/native/route.js +1 -216
- package/dist/host/native/runtime.js +1 -9
- package/dist/host/native-reader-context.js +1 -8
- package/dist/host/native-receiver.js +1 -0
- package/dist/host/objects.js +1 -38
- package/dist/host/order.js +1 -2
- package/dist/host/place-act-transaction.js +4 -0
- package/dist/host/place-clock-selection.js +5 -124
- package/dist/host/ports/ingress.js +2 -57
- package/dist/host/ports/local-act.js +5 -172
- package/dist/host/ports/place-act.js +1 -169
- package/dist/host/ports/publication.js +1 -56
- package/dist/host/ports/signing.js +1 -74
- package/dist/host/ports/store.js +1 -18
- package/dist/host/ports/transport.js +1 -48
- package/dist/host/process-lifetime.js +1 -17
- package/dist/host/provide.js +1 -183
- package/dist/host/read-only.js +1 -9
- package/dist/host/reading-closures.js +7 -227
- package/dist/host/reading-context.js +1 -53
- package/dist/host/reading-identity-types.js +0 -0
- package/dist/host/reading-identity.js +3 -0
- package/dist/host/reading-preparation.js +6 -0
- package/dist/host/reference-authenticated.d.ts +1 -40
- package/dist/host/reference-authenticated.js +3 -100
- package/dist/host/reference-contracts.js +1 -6
- package/dist/host/reference-export.js +6 -81
- package/dist/host/reference-native-api.d.ts +1 -3
- package/dist/host/reference-native-api.js +1 -3
- package/dist/host/reference-native.js +1 -74
- package/dist/host/reference-profile.js +1 -63
- package/dist/host/reference-standing.js +2 -18
- package/dist/host/reference.js +1 -24
- package/dist/host/refusals.js +2 -43
- package/dist/host/release.js +4 -256
- package/dist/host/root-clock-source.js +1 -305
- package/dist/host/selected-capsules.js +1 -50
- package/dist/host/selected-topos.js +1 -80
- package/dist/host/signature-era.js +1 -0
- package/dist/host/signing.js +2 -48
- package/dist/host/source-content.js +2 -110
- package/dist/host/standing-carrier.js +1 -0
- package/dist/host/standing-projection.js +1 -0
- package/dist/host/timing.js +1 -7
- package/dist/host/walk.js +20 -193
- package/dist/judge/late.js +1 -33
- package/dist/judge/take.js +2 -75
- package/dist/judge/widening.js +1 -25
- package/dist/land/act.js +8 -302
- package/dist/land/alias.js +1 -41
- package/dist/land/held.js +1 -23
- package/dist/land/inert.js +1 -33
- package/dist/land/leaving.js +1 -55
- package/dist/land/ledger.js +7 -188
- package/dist/land/owned.js +4 -66
- package/dist/land/sign.js +1 -53
- package/dist/land/standing-pin.js +1 -49
- package/dist/land/vouched.js +1 -112
- package/dist/land/withdraw.js +1 -24
- package/dist/observe/files.js +1 -88
- package/dist/observe/identity.js +1 -61
- package/dist/observe/match.js +1 -8
- package/dist/observe/regions.js +7 -306
- package/dist/observe/run.js +2 -40
- package/dist/observe/runner.js +4 -93
- package/dist/public-types.d.ts +1114 -0
- package/dist/render/capsule.js +1 -30
- package/dist/render/field.js +1 -40
- package/dist/render/names.js +1 -4
- package/dist/render/open.js +1 -61
- package/dist/render/page.js +1 -7
- package/dist/render/receipts.js +1 -47
- package/dist/render/shape.js +1 -74
- package/dist/render/target.js +4 -52
- package/dist/render/view.js +7 -197
- package/dist/vendor/50086958553b9376d600583f7dff354196bfeb41170fc6d1482ca7bea7c493e2.LICENSE +21 -0
- package/dist/vendor/b3e938d28f88a1851af303a40c749e12ebd5a686daac4f0b343b5cdd2e040419.LICENSE +21 -0
- package/dist/vendor/bundle.json +1 -0
- package/dist/vendor/library11.js +1 -0
- package/dist/vendor/object-provider.js +42 -0
- package/dist/vendor/runtime.js +38 -0
- package/dist/vendor/sources.json +1 -0
- package/dist/wasm/adapter.d.ts +1 -51
- package/dist/wasm/adapter.js +1 -180
- package/dist/wasm/node-worker.js +1 -13
- package/dist/wasm/object.js +1 -76
- package/dist/wasm/worker.js +1 -7
- package/docs/contracts/closure-delivery.md +1 -1
- package/docs/contracts/closure-delivery.publication.json +1 -1
- package/docs/contracts/conformance.json +142 -0
- package/docs/contracts/determinism.bound +9 -0
- package/docs/contracts/engine-object-projection.publication.json +1 -1
- package/docs/contracts/engine.md +21 -1
- package/docs/contracts/native-host.md +21 -0
- package/docs/contracts/native-host.publication.json +25 -0
- package/docs/contracts/native-publication.inventory.json +3 -1
- package/docs/contracts/optional-wasm-adapter.publication.json +1 -1
- package/docs/contracts/publication.inventory.json +29 -0
- package/docs/contracts/reading-identity.md +37 -0
- package/docs/contracts/reading-identity.publication.json +25 -0
- package/docs/contracts/refusals.bound +51 -0
- package/docs/contracts/refusals.md +18 -3
- package/docs/contracts/refusals.publication.json +2 -2
- package/docs/contracts/views.md +8 -0
- package/docs/guide.md +10 -0
- package/docs/reference.md +40 -0
- package/docs/why.md +109 -0
- package/package.json +37 -18
- package/receipts.bound +11675 -9725
- package/samples/native-host/no.json +10 -0
- package/samples/native-host/yes.json +20 -0
- package/samples/reading-identity/no.json +20 -0
- package/samples/reading-identity/yes.json +46 -0
- package/vectors/native/native-host.vector.json +62 -0
- package/vectors/native/reading-identity.vector.json +101 -0
- package/vectors/native/refusals.vector.json +104 -0
- package/vendor/syntax/LICENSE.md +7 -0
- package/vendor/syntax/parser.js +1 -0
- package/dist/engine/object.d.ts +0 -17
- package/dist/engine/ports.d.ts +0 -32
- package/dist/host/native/module-closure.d.ts +0 -35
- package/dist/host/reference-export.d.ts +0 -33
- package/dist/host/reference-native.d.ts +0 -30
- package/dist/host/reference-profile.d.ts +0 -23
- package/dist/host/refusals.d.ts +0 -14
package/dist/fold/observed.js
CHANGED
|
@@ -1,534 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
import { carriedIn, carriedFrom } from "./resolved.js";
|
|
29
|
-
export const cased = (question) => /^(?:vector|sample)\//.test(question);
|
|
30
|
-
export function isReaderLock(line) {
|
|
31
|
-
const got = parse(line);
|
|
32
|
-
return got.kind === 'fact' && got.value.fields['measure'] === 'reader';
|
|
33
|
-
}
|
|
34
|
-
export function readerModules(store) {
|
|
35
|
-
return readersOf(store).map((reader) => reader.module);
|
|
36
|
-
}
|
|
37
|
-
/** The readers of a tree: those a place's own lock names for what it holds, and those the lock names that no place's lock rules. */
|
|
38
|
-
function readersOf(store) {
|
|
39
|
-
const standing = lockStanding(store);
|
|
40
|
-
const family = `${wordOf(standing, 'families', 'reader')}/`;
|
|
41
|
-
const own = spoken(dirname(store)).map((one) => one.line).filter((line) => fieldOf(line, 'scope').startsWith(family));
|
|
42
|
-
const ruled = new Set(own.map((line) => fieldOf(line, 'scope')));
|
|
43
|
-
return [...own, ...standing.filter((line) => !ruled.has(fieldOf(line, 'scope')))]
|
|
44
|
-
.map((line) => parse(line))
|
|
45
|
-
.flatMap((got) => (got.kind === 'fact' ? [got.value.fields] : []))
|
|
46
|
-
.filter((f) => (f['scope'] ?? '').startsWith(family) && f['measure'] === 'reader' && f['value'] !== 'withdraw')
|
|
47
|
-
.flatMap((f) => {
|
|
48
|
-
const kind = f['kind'] || ((f['shape'] ?? '').split('|').includes(wordOf(standing, 'shapes', 'run')) ? 'process' : 'js');
|
|
49
|
-
return runs(kind) ? [{
|
|
50
|
-
id: (f['scope'] ?? '').slice(family.length),
|
|
51
|
-
shape: (f['shape'] ?? '').split('|').filter(Boolean),
|
|
52
|
-
where: (f['needs'] ?? '').split('|').filter(Boolean),
|
|
53
|
-
module: f['value'] ?? '',
|
|
54
|
-
kind,
|
|
55
|
-
}] : [];
|
|
56
|
-
})
|
|
57
|
-
.filter((reader) => reader.id !== '' && reader.shape.length > 0 && reader.where.length > 0 && reader.module !== '');
|
|
58
|
-
}
|
|
59
|
-
function lineOf(seen, digest, by, reader) {
|
|
60
|
-
const interval = seen.bound.kind === 'interval';
|
|
61
|
-
return canonical({
|
|
62
|
-
scope: seen.scope,
|
|
63
|
-
role: seen.role,
|
|
64
|
-
form: interval ? 'interval' : 'alphabet',
|
|
65
|
-
measure: seen.measure,
|
|
66
|
-
value: interval ? `${seen.bound.lo ?? 0}..${seen.bound.hi ?? 0}` : (seen.bound.values ?? []).join('|'),
|
|
67
|
-
by: `${reader}:${by}`,
|
|
68
|
-
at: `place:${digest}`,
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
const placed = new WeakMap();
|
|
72
|
-
export function placedReadings(observed) {
|
|
73
|
-
const already = placed.get(observed);
|
|
74
|
-
if (already !== undefined)
|
|
75
|
-
return already;
|
|
76
|
-
const taken = takeReadings(observed);
|
|
77
|
-
placed.set(observed, taken);
|
|
78
|
-
return taken;
|
|
79
|
-
}
|
|
80
|
-
export function casesHeld(observed) {
|
|
81
|
-
return new Set(placedReadings(observed).filter((r) => r.measure === 'pass' && r.value === 'pass' && cased(r.question)).map((r) => r.question)).size;
|
|
82
|
-
}
|
|
83
|
-
function takeReadings(observed) {
|
|
84
|
-
const placesOf = new Map();
|
|
85
|
-
for (const line of observed) {
|
|
86
|
-
if (!OBSERVED.test(line))
|
|
87
|
-
continue;
|
|
88
|
-
const key = `${readerOf(line) ?? ''} ${fieldOf(line, 'at')}`;
|
|
89
|
-
placesOf.set(key, (placesOf.get(key) ?? new Set()).add(fieldOf(line, 'scope')));
|
|
90
|
-
}
|
|
91
|
-
return observed.flatMap((line) => {
|
|
92
|
-
if (OBSERVED.test(line))
|
|
93
|
-
return [];
|
|
94
|
-
const reading = { question: fieldOf(line, 'scope'), measure: fieldOf(line, 'measure'), value: fieldOf(line, 'value'), by: fieldOf(line, 'by'), at: fieldOf(line, 'at') };
|
|
95
|
-
return [...(placesOf.get(`${readerOf(line) ?? ''} ${fieldOf(line, 'at')}`) ?? [])].map((place) => ({ ...reading, place }));
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
const behind = [];
|
|
99
|
-
export const readersBehind = () => behind;
|
|
100
|
-
const refused = [];
|
|
101
|
-
export const readerRefusals = () => refused;
|
|
102
|
-
const alive = (pid) => { try {
|
|
103
|
-
return process.kill(pid, 0);
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
return false;
|
|
107
|
-
} };
|
|
108
|
-
function travelled(store, speaker) {
|
|
109
|
-
for (const file of carriedIn(store)) {
|
|
110
|
-
const text = observeText(file);
|
|
111
|
-
if (text === undefined)
|
|
112
|
-
continue;
|
|
113
|
-
const marker = storeAt(store, 'cas', 'travelled', sha(text));
|
|
114
|
-
if (existsSync(marker))
|
|
115
|
-
continue;
|
|
116
|
-
const whole = new Map();
|
|
117
|
-
for (const line of text.split('\n').filter(isWire)) {
|
|
118
|
-
const bare = line.replace(/ sig="[^"]*"/, '');
|
|
119
|
-
if (!whole.has(bare) || / sig=/.test(line))
|
|
120
|
-
whole.set(bare, line);
|
|
121
|
-
}
|
|
122
|
-
const byHead = new Map();
|
|
123
|
-
for (const line of whole.values()) {
|
|
124
|
-
const head = (fieldOf(line, 'by').split(':')[0] ?? '').trim();
|
|
125
|
-
if (head)
|
|
126
|
-
byHead.set(head, [...(byHead.get(head) ?? []), line]);
|
|
127
|
-
}
|
|
128
|
-
for (const [head, lines] of byHead) {
|
|
129
|
-
if (head !== speaker) {
|
|
130
|
-
land(store, head, lines);
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
const at = new Map();
|
|
134
|
-
for (const line of lines.filter((one) => !OBSERVED.test(one)))
|
|
135
|
-
at.set(`${readerOf(line) ?? ''} ${fieldOf(line, 'at')}`, [...(at.get(`${readerOf(line) ?? ''} ${fieldOf(line, 'at')}`) ?? []), line]);
|
|
136
|
-
const groups = new Map();
|
|
137
|
-
for (const line of lines.filter((one) => OBSERVED.test(one))) {
|
|
138
|
-
const group = `${readerOf(line) ?? ''}\u0000`;
|
|
139
|
-
groups.set(group, [...(groups.get(group) ?? []), line]);
|
|
140
|
-
}
|
|
141
|
-
for (const [group, observed] of groups) {
|
|
142
|
-
const [by = '', region = ''] = group.split('\u0000');
|
|
143
|
-
landShard(store, speaker, region, observed);
|
|
144
|
-
const pairs = observed.map((line) => `${fieldOf(line, 'scope')} ${fieldOf(line, 'at')}`);
|
|
145
|
-
keepObservation(store, keyOf(by, region, pairs, 'receipt'), [...new Set(observed.map((line) => fieldOf(line, 'at')))].flatMap((one) => at.get(`${by} ${one}`) ?? []));
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
mkdirSync(dirname(marker), { recursive: true });
|
|
149
|
-
writeFileSync(marker, `${basename(file)}\n`);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
function carried(store) {
|
|
153
|
-
const speaker = (() => { try {
|
|
154
|
-
return keyFor(store, 'read');
|
|
155
|
-
}
|
|
156
|
-
catch {
|
|
157
|
-
return undefined;
|
|
158
|
-
} })();
|
|
159
|
-
travelled(store, speaker ?? '');
|
|
160
|
-
return carriedIn(store).flatMap((file) => (observeText(file) ?? '').split('\n'))
|
|
161
|
-
.filter((line) => isWire(line) && speaker !== undefined && fieldOf(line, 'by').split(':')[0] === speaker);
|
|
162
|
-
}
|
|
163
|
-
const readerSelection = (reader) => reader.capsule?.selected?.selection === undefined ? undefined : 'sha256:' + sha(JSON.stringify([reader.capsule.selected.selection, reader.capsule.region, reader.module, reader.where, [...reader.capsule.globs]]));
|
|
164
|
-
const readerScope = (reader) => reader.capsule?.selected?.selection === undefined ? `reader/${reader.module}` : `reader/${reader.module}/${sha(`${reader.capsule.selected.selection}\n${reader.capsule.region}`)}`;
|
|
165
|
-
const lineagesOf = (store, speaker, readers, regions) => new Set(readers.flatMap((reader) => shardLines(store, speaker, regionIn(regions, reader.module))
|
|
166
|
-
.filter((line) => fieldOf(line, 'scope') === readerScope(reader) && /(?:^|\s)measure=(?:identity|extension)\s/.test(line)).map((line) => fieldOf(line, 'value'))));
|
|
167
|
-
export function readerLines(store) {
|
|
168
|
-
const readers = readersOf(store);
|
|
169
|
-
const regions = [...new Set(readers.flatMap((reader) => reader.where.map(trimmed)))];
|
|
170
|
-
const speaker = keyFor(store, 'read');
|
|
171
|
-
return [...new Set(readers.map((reader) => regionIn(regions, reader.module)))].flatMap((region) => shardLines(store, speaker, region).filter((line) => LEVEL.test(line)));
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* A reader never blocks a fold that did not ask to wait: what it read before is served at once, and a reader whose
|
|
175
|
-
* identity is new, or whose places moved, is grey by name and runs behind the fold. A fold that judges waits. A fold
|
|
176
|
-
* that reaches only some regions observes only those, and a place with no reader reads what it carries.
|
|
177
|
-
*/
|
|
178
|
-
export const carriesOnly = (root, store) => ((lines) => !lines.length && !capsuleReadersOf(root, store, lockStanding(store), lines).length)(readersOf(store));
|
|
179
|
-
/** A reader whose `needs` meet the reach runs, wherever its module lives. The module path is not the region it reads. */
|
|
180
|
-
export function readerReaches(reach, where) {
|
|
181
|
-
if (reach === undefined)
|
|
182
|
-
return true;
|
|
183
|
-
const reached = (region) => reach.map(trimmed).some((one) => one === '' || region === one || region.startsWith(`${one}/`) || one.startsWith(`${region}/`));
|
|
184
|
-
return where.some((one) => reached(trimmed(one)));
|
|
185
|
-
}
|
|
186
|
-
export function observedClaims(root, store, options = {}) {
|
|
187
|
-
refused.length = 0;
|
|
188
|
-
if (readOnly()) {
|
|
189
|
-
const carried = (observeText(resolve(root, 'receipts.bound')) ?? '').split('\n').filter(isWire);
|
|
190
|
-
const evidence = carriedFrom(store, carried);
|
|
191
|
-
if (evidence === undefined)
|
|
192
|
-
throw Error('REFUSE·preview native receipt bytes unavailable; fold the declared inputs first');
|
|
193
|
-
return evidence;
|
|
194
|
-
}
|
|
195
|
-
const wait = options.wait ?? true;
|
|
196
|
-
const standing = lockStanding(store);
|
|
197
|
-
const lines = readersOf(store);
|
|
198
|
-
const readers = [...lines, ...capsuleReadersOf(root, store, standing, lines)];
|
|
199
|
-
if (options.selected !== undefined) {
|
|
200
|
-
if (!/^sha256:[a-f0-9]{64}$/.test(options.selected) || options.only === undefined)
|
|
201
|
-
throw Error('REFUSE·reader invalid internal background selector');
|
|
202
|
-
if (readers.filter(reader => reader.module === options.only && readerSelection(reader) === options.selected).length !== 1)
|
|
203
|
-
throw Error('REFUSE·reader internal background selector is not uniquely adopted');
|
|
204
|
-
}
|
|
205
|
-
if (!readers.length)
|
|
206
|
-
return carried(store);
|
|
207
|
-
const modern = readingProfile(standing, fieldOf);
|
|
208
|
-
const implementation = modern ? instrumentCoordinates(store, processOf('verb'), [], ownRoot(), ownLock(), true) : undefined;
|
|
209
|
-
if (implementation)
|
|
210
|
-
for (const module of [processOf('host'), processOf('lifetime', 'host')])
|
|
211
|
-
for (const [coordinate, digest] of instrumentCoordinates(store, module, [], ownRoot(), ownLock(), true))
|
|
212
|
-
implementation.set(coordinate, digest);
|
|
213
|
-
const code = implementation ? bytesDigest(store, new TextEncoder().encode([...implementation.values()].sort().join('\n'))) : undefined;
|
|
214
|
-
const transitive = implementation ? [...implementation].map(([coordinate, digest]) => [relative(ownRoot(), coordinate), digest]) : [];
|
|
215
|
-
if (modern)
|
|
216
|
-
for (const line of ownLock().filter(line => fieldOf(line, 'scope').startsWith('dep/') && fieldOf(line, 'role') === 'reads' && fieldOf(line, 'value') !== 'withdraw')) {
|
|
217
|
-
const digest = fieldOf(line, 'value');
|
|
218
|
-
verifiedContent(digest, store, ownStore());
|
|
219
|
-
transitive.push([fieldOf(line, 'scope'), digest]);
|
|
220
|
-
}
|
|
221
|
-
const speaker = keyFor(store, 'read');
|
|
222
|
-
const regions = [...new Set(readers.flatMap((reader) => reader.where.map(trimmed)))];
|
|
223
|
-
const whole = options.only === undefined && options.reach === undefined;
|
|
224
|
-
const legacy = whole ? legacyOf(store, speaker, regions) : undefined;
|
|
225
|
-
const reached = (region) => readerReaches(options.reach, [region]);
|
|
226
|
-
const shards = new Map();
|
|
227
|
-
const lineages = lineagesOf(store, speaker, readers, regions);
|
|
228
|
-
const open = (region) => shards.get(region) ?? shards.set(region, opened(store, speaker, region, lineages)).get(region);
|
|
229
|
-
const read_ = new Map();
|
|
230
|
-
const byAt = (key) => {
|
|
231
|
-
if (key === undefined)
|
|
232
|
-
return undefined;
|
|
233
|
-
if (!read_.has(key)) {
|
|
234
|
-
const lines = observation(store, key);
|
|
235
|
-
const at = new Map();
|
|
236
|
-
for (const line of lines ?? [])
|
|
237
|
-
at.set(fieldOf(line, 'at'), [...(at.get(fieldOf(line, 'at')) ?? []), line]);
|
|
238
|
-
read_.set(key, lines === undefined ? undefined : at);
|
|
239
|
-
}
|
|
240
|
-
return read_.get(key);
|
|
241
|
-
};
|
|
242
|
-
const lastOf = (shard, one, places) => {
|
|
243
|
-
if (shard.keys.has(one))
|
|
244
|
-
return byAt(shard.keys.get(one));
|
|
245
|
-
const known = places.flatMap((place) => shard.places.get(`${one} ${place}`) ?? []);
|
|
246
|
-
if (!known.length)
|
|
247
|
-
return undefined;
|
|
248
|
-
const pairs = known.map((held) => `${fieldOf(held.line, 'scope')} ${held.at}`);
|
|
249
|
-
if (legacy === undefined)
|
|
250
|
-
return byAt(keyOf(one, shard.region, pairs, 'receipt'));
|
|
251
|
-
const key = keyOf(one, shard.region, pairs);
|
|
252
|
-
keepObservation(store, key, [...new Set(known.map((held) => held.at))].flatMap((at) => legacy.get(`${one} ${at}`) ?? []));
|
|
253
|
-
landShard(store, speaker, shard.region, [pointer(speaker, one, shard.region, key, pairs)]);
|
|
254
|
-
shard.keys.set(one, key);
|
|
255
|
-
return byAt(key);
|
|
256
|
-
};
|
|
257
|
-
const servedAt = (shard, one, place, held) => {
|
|
258
|
-
const known = shard.places.get(`${one} ${place}`);
|
|
259
|
-
return known === undefined ? [] : [known.line, ...(held?.get(known.at) ?? [])];
|
|
260
|
-
};
|
|
261
|
-
const out = [];
|
|
262
|
-
const answered = options.answered;
|
|
263
|
-
const digestsAt = (key) => Object.entries(JSON.parse(memoized(store, `said ${key}`, () => {
|
|
264
|
-
const at = new Map();
|
|
265
|
-
for (const line of observation(store, key) ?? [])
|
|
266
|
-
at.set(fieldOf(line, 'at'), [...(at.get(fieldOf(line, 'at')) ?? []), line]);
|
|
267
|
-
return JSON.stringify(Object.fromEntries([...at].map(([one, lines]) => [one, saidDigest(store, lines)])));
|
|
268
|
-
})));
|
|
269
|
-
const heard = (lines) => {
|
|
270
|
-
const at = new Map();
|
|
271
|
-
for (const line of lines)
|
|
272
|
-
if (!OBSERVED.test(line))
|
|
273
|
-
at.set(`${readerOf(line) ?? ''} ${fieldOf(line, 'at')}`, [...(at.get(`${readerOf(line) ?? ''} ${fieldOf(line, 'at')}`) ?? []), line]);
|
|
274
|
-
for (const line of lines)
|
|
275
|
-
if (OBSERVED.test(line))
|
|
276
|
-
answered?.set(`${readerOf(line) ?? ''} ${fieldOf(line, 'at')}`, saidDigest(store, at.get(`${readerOf(line) ?? ''} ${fieldOf(line, 'at')}`) ?? []));
|
|
277
|
-
};
|
|
278
|
-
const began = Date.now();
|
|
279
|
-
let ran = 0;
|
|
280
|
-
let read = 0;
|
|
281
|
-
let whole_ = 0;
|
|
282
|
-
const roleOf = rolesOf(store);
|
|
283
|
-
const look = lookOf(root, roleOf);
|
|
284
|
-
behind.length = 0;
|
|
285
|
-
const spent = [];
|
|
286
|
-
for (const reader of readers) {
|
|
287
|
-
if (options.only !== undefined && reader.module !== options.only)
|
|
288
|
-
continue;
|
|
289
|
-
if (options.selected !== undefined && readerSelection(reader) !== options.selected)
|
|
290
|
-
continue;
|
|
291
|
-
if (!readerReaches(options.reach, reader.where))
|
|
292
|
-
continue;
|
|
293
|
-
const started = Date.now();
|
|
294
|
-
const mark = out.length;
|
|
295
|
-
if (!observeOne(reader, started) && answered !== undefined)
|
|
296
|
-
heard(out.slice(mark));
|
|
297
|
-
}
|
|
298
|
-
function observeOne(reader, started) {
|
|
299
|
-
const module = resolve(root, reader.module);
|
|
300
|
-
const lifetime = readerLifetime(standing.flatMap(line => { const p = parseLifetime(line); return p.kind === 'fact' ? [p.value.fields] : []; }), { id: reader.id, module: reader.module });
|
|
301
|
-
const asked = reader.capsule === undefined ? undefined : reader.capsule.selected ?? capsuleAt(reader.capsule.digest, reader.capsule.entry);
|
|
302
|
-
const projection = reader.capsule === undefined ? [] : (asked?.lines ?? []).filter(line => fieldOf(line, 'scope') === `region/${reader.capsule.region}` && fieldOf(line, 'measure') === 'input-projection' && fieldOf(line, 'value') !== 'withdraw');
|
|
303
|
-
if (projection.length) {
|
|
304
|
-
if (projection.length !== 1 || !asked)
|
|
305
|
-
throw Error('REFUSE·input projection is ambiguous ' + reader.module);
|
|
306
|
-
const files = [...new Set(reader.where.flatMap(where => handedAt(root, reader, roleOf, look, where)))].sort().map(place => ({ place, text: observeText(resolve(root, place)) ?? '' }));
|
|
307
|
-
const hash = (text) => bytesDigest(store, Buffer.from(text));
|
|
308
|
-
const allowsEmpty = readerAllowsEmpty(standing.flatMap(line => { const p = parseLifetime(line); return p.kind === 'fact' ? [p.value.fields] : []; }), reader.module);
|
|
309
|
-
const native = prepareNativeReaderRoute(store, { id: reader.id, module: reader.module });
|
|
310
|
-
if (native && !modern)
|
|
311
|
-
throw Error('REFUSE·native reader requires complete reading identity ' + reader.module);
|
|
312
|
-
if (native && asked.digest !== native.profile.selection.archive)
|
|
313
|
-
throw Error('REFUSE·native reader implementation differs ' + reader.module);
|
|
314
|
-
const image = native ? materializeNativeRoute(native) : undefined;
|
|
315
|
-
const execution = modern ? readingExecution({ instrument: code, implementation: asked.digest, policy: hash(JSON.stringify([reader.id, reader.module, reader.kind, reader.shape, reader.where, lifetime ?? null, allowsEmpty])), inputs: [...transitive, ...(native?.inputs ?? []), ...(image ? [['native/mount', image.mountIdentity]] : [])] }, hash, { env: process.env, cwd: image?.cwd ?? root, flags: native ? [] : childFlags() }) : undefined;
|
|
316
|
-
const result = withNativeReaderRoute(native, () => readingClosures({ root, store, ...(execution ? { context: execution.context, execution } : {}), reader: reader.module, speaker, digest: text => bytesDigest(store, Buffer.from(text)), capsule: asked, ...(native ? { assertCurrent: () => assertNativeRouteCurrent(native) } : {}), region: reader.capsule.region, projection: fieldOf(projection[0], 'value'), livePlace: () => authenticatedStanding(root), readerReference: { id: reader.id, module: reader.module }, lifetime, allowsEmpty, files, emit: line => process.stderr.write(line + '\n') }));
|
|
317
|
-
out.push(...result.lines);
|
|
318
|
-
ran += result.executed;
|
|
319
|
-
read += result.read - result.opened;
|
|
320
|
-
return false;
|
|
321
|
-
}
|
|
322
|
-
if (modern)
|
|
323
|
-
throw Error('REFUSE·reader ' + reader.module + ' complete reading identity requires a declared input projection');
|
|
324
|
-
const endAct = actCosts.begin();
|
|
325
|
-
try {
|
|
326
|
-
const source = reader.capsule === undefined ? observeFile(module) : asked === undefined ? undefined : new Uint8Array();
|
|
327
|
-
const bundle = source && reader.capsule === undefined ? bundleOf(module) ?? bytesDigest(store, source) : 'none';
|
|
328
|
-
const offered = offersOf(root, store, reader, roleOf, look, (where) => reached(trimmed(where)));
|
|
329
|
-
assertReaderInputs(standing.flatMap(line => { const p = parseLifetime(line); return p.kind === 'fact' ? [p.value.fields] : []; }), reader.module, offered.length);
|
|
330
|
-
const vectors = reader.capsule === undefined ? observeText(resolve(root, vectorsOf(reader.module, standing))) : undefined;
|
|
331
|
-
const selectedBy = reader.capsule?.selected?.selection === undefined ? undefined : sha(`${reader.capsule.selected.selection}\n${reader.capsule.region}${lifetime === undefined ? "" : "\n" + JSON.stringify(lifetime)}`);
|
|
332
|
-
const kept = whole && legacy === undefined && answered === undefined && source ? sha([
|
|
333
|
-
speaker, reader.module, JSON.stringify(lifetime), reader.kind, reader.shape.join('|'), reader.where.join('|'), bundle, vectors === undefined ? 'no vectors' : sha(vectors),
|
|
334
|
-
reader.capsule === undefined ? '' : `${reader.capsule.selected?.selection ?? reader.capsule.digest} ${reader.capsule.region} ${reader.capsule.reads.join('|')} ${[...reader.capsule.globs].map(([place, globs]) => `${place}${globs.join('|')}`).join(' ')}`,
|
|
335
|
-
...(selectedBy === undefined ? [] : [selectedBy]),
|
|
336
|
-
...offered.map((offer) => `${offer.place} ${offer.digest?.() ?? bytesDigest(store, offer.bytes())}`),
|
|
337
|
-
].join('\n')) : undefined;
|
|
338
|
-
const stored = kept === undefined ? undefined : observeText(memoAt(store, `observed/${kept}`));
|
|
339
|
-
if (stored !== undefined) {
|
|
340
|
-
out.push(...stored.split('\n').filter(isWire));
|
|
341
|
-
read += offered.length;
|
|
342
|
-
whole_ += 1;
|
|
343
|
-
return false;
|
|
344
|
-
}
|
|
345
|
-
const mark = out.length;
|
|
346
|
-
const home = regionIn(regions, reader.module);
|
|
347
|
-
const own = shardLines(store, speaker, home).filter((line) => fieldOf(line, 'scope') === readerScope(reader));
|
|
348
|
-
// Short selected-origin identities remain stored history; they cannot name
|
|
349
|
-
// an unambiguous current origin or supply its held observations.
|
|
350
|
-
const lineage = own.filter((line) => fieldOf(line, 'measure') === 'identity').map((line) => fieldOf(line, 'value')).filter(value => selectedBy === undefined || /^[a-f0-9]{64}$/.test(value));
|
|
351
|
-
const sum = source && reader.capsule === undefined ? bytesDigest(store, new TextEncoder().encode(`${reader.module} ${bundle}${lifetime === undefined ? "" : "\n" + JSON.stringify(lifetime)}`)).replace(/^sha256:/, '').slice(0, 12) : 'none';
|
|
352
|
-
const measured = reader.capsule !== undefined ? { by: source ? selectedBy ?? sha(`${reader.capsule.digest}\n${reader.capsule.region}${lifetime === undefined ? "" : "\n" + JSON.stringify(lifetime)}`).slice(0, 12) : 'none', lines: [] }
|
|
353
|
-
: source ? identityOf({ store, root, speaker, module: reader.module, kind: reader.kind, code: sum, lineage, lifetime, kept: own.filter((line) => /(?:^|\s)measure=(?:extension|emits)\s/.test(line)) })
|
|
354
|
-
: { by: 'none', lines: [] };
|
|
355
|
-
const by = measured.by;
|
|
356
|
-
const level = [...measured.lines];
|
|
357
|
-
const identified = Date.now();
|
|
358
|
-
const lines = [...lineage, by];
|
|
359
|
-
const before = [...lineage].reverse().find((one) => one !== by);
|
|
360
|
-
const regionsOf = new Map();
|
|
361
|
-
for (const offer of offered) {
|
|
362
|
-
const region = regionIn(regions, offer.place);
|
|
363
|
-
if (reached(region))
|
|
364
|
-
regionsOf.set(region, [...(regionsOf.get(region) ?? []), offer]);
|
|
365
|
-
}
|
|
366
|
-
const planned = [...regionsOf].map(([region, offers]) => {
|
|
367
|
-
const shard = open(region);
|
|
368
|
-
const places = offers.map((offer) => offer.place);
|
|
369
|
-
const pairs = [];
|
|
370
|
-
const kept = [];
|
|
371
|
-
const moved = [];
|
|
372
|
-
const all = [];
|
|
373
|
-
for (const offer of offers) {
|
|
374
|
-
const known = shard.places.get(`${by} ${offer.place}`);
|
|
375
|
-
if (known && fieldOf(known.line, 'value') === offer.seen) {
|
|
376
|
-
pairs.push(`${offer.place} ${known.at}`);
|
|
377
|
-
kept.push(known.line);
|
|
378
|
-
all.push({ ...offer, digest: known.at.slice('place:'.length) });
|
|
379
|
-
read += 1;
|
|
380
|
-
continue;
|
|
381
|
-
}
|
|
382
|
-
const bytes = offer.digest ? undefined : offer.bytes();
|
|
383
|
-
const digest = offer.digest?.() ?? bytesDigest(store, bytes);
|
|
384
|
-
pairs.push(`${offer.place} place:${digest}`);
|
|
385
|
-
kept.push(canonical({ scope: offer.place, role: 'writes', form: 'alphabet', measure: 'observed', value: offer.seen, by: `${speaker}:${by}`, at: `place:${digest}` }));
|
|
386
|
-
all.push({ ...offer, digest, bytes: () => bytes ?? offer.bytes() });
|
|
387
|
-
if (known?.at === `place:${digest}`)
|
|
388
|
-
read += 1;
|
|
389
|
-
else
|
|
390
|
-
moved.push({ place: offer.place, seen: offer.seen, digest, bytes: bytes ?? offer.bytes() });
|
|
391
|
-
}
|
|
392
|
-
return { region, shard, places, pairs, kept, moved, all, key: keyOf(by, region, pairs) };
|
|
393
|
-
});
|
|
394
|
-
if (answered !== undefined && planned.every((plan) => !plan.moved.length && observedAt(store, plan.key))) {
|
|
395
|
-
for (const plan of planned) {
|
|
396
|
-
for (const [at, digest] of digestsAt(plan.key))
|
|
397
|
-
answered.set(`${by} ${at}`, digest);
|
|
398
|
-
if (plan.shard.keys.get(by) !== plan.key || plan.kept.some((line) => plan.shard.places.get(`${by} ${fieldOf(line, 'scope')}`)?.line !== line)) {
|
|
399
|
-
landShard(store, speaker, plan.region, [...plan.kept, pointer(speaker, by, plan.region, plan.key, plan.pairs)]);
|
|
400
|
-
}
|
|
401
|
-
out.push(...plan.kept);
|
|
402
|
-
}
|
|
403
|
-
if (level.length)
|
|
404
|
-
landShard(store, speaker, home, level);
|
|
405
|
-
return true;
|
|
406
|
-
}
|
|
407
|
-
const plans = planned.map(({ region, shard, places, pairs, kept, moved, all, key }) => {
|
|
408
|
-
const prior = lastOf(shard, by, places);
|
|
409
|
-
if (before !== undefined)
|
|
410
|
-
lastOf(shard, before, places);
|
|
411
|
-
const ats = [...new Set(pairs.map((pair) => pair.slice(pair.indexOf(' ') + 1)))];
|
|
412
|
-
const found = byAt(key);
|
|
413
|
-
const said = found !== undefined ? ats.flatMap((at) => found.get(at) ?? [])
|
|
414
|
-
: moved.length || prior === undefined ? undefined : ats.flatMap((at) => prior.get(at) ?? []);
|
|
415
|
-
const due = said === undefined && !moved.length ? all.map((one) => ({ place: one.place, seen: one.seen, digest: one.digest, bytes: one.bytes() })) : moved;
|
|
416
|
-
return { region, shard, places, pairs, kept, due, key, said, prior, found: found !== undefined };
|
|
417
|
-
});
|
|
418
|
-
const due = plans.flatMap((plan) => (plan.said === undefined ? plan.due.map((one) => ({ ...one, region: plan.region })) : []));
|
|
419
|
-
const heldOf = (place, region) => {
|
|
420
|
-
for (const one of [...lines].reverse()) {
|
|
421
|
-
const shard = open(region);
|
|
422
|
-
const mine = servedAt(shard, one, place, lastOf(shard, one, [place])).slice(1);
|
|
423
|
-
if (mine.length)
|
|
424
|
-
return mine.map((line) => [fieldOf(line, 'scope'), fieldOf(line, 'value')]);
|
|
425
|
-
}
|
|
426
|
-
return [];
|
|
427
|
-
};
|
|
428
|
-
if (due.length && !source) {
|
|
429
|
-
refused.push(`REFUSE·reader ${reader.module} unavailable · ${due.length} readings remain due`);
|
|
430
|
-
return false;
|
|
431
|
-
}
|
|
432
|
-
if (due.length && !wait) {
|
|
433
|
-
for (const plan of plans) {
|
|
434
|
-
if (plan.said !== undefined) {
|
|
435
|
-
out.push(...plan.kept, ...plan.said);
|
|
436
|
-
continue;
|
|
437
|
-
}
|
|
438
|
-
for (const place of plan.places) {
|
|
439
|
-
const mine = servedAt(plan.shard, by, place, plan.prior);
|
|
440
|
-
out.push(...(mine.length || before === undefined ? mine : servedAt(plan.shard, before, place, lastOf(plan.shard, before, plan.places))));
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
const marker = storeAt(store, 'pending', by);
|
|
444
|
-
const pid = Number((observeText(marker) ?? '').split('\n')[1]);
|
|
445
|
-
const running = existsSync(marker) && Date.now() - statSync(marker).mtimeMs < 30 * 60 * 1000 && Number.isInteger(pid) && pid > 0 && alive(pid);
|
|
446
|
-
if (!running) {
|
|
447
|
-
mkdirSync(dirname(marker), { recursive: true });
|
|
448
|
-
const child = spawn(process.execPath, [...childFlags(), processOf('observe'), root, reader.module, ...(readerSelection(reader) === undefined ? [] : [readerSelection(reader)])], { cwd: root, detached: true, stdio: 'ignore' });
|
|
449
|
-
child.unref();
|
|
450
|
-
writeFileSync(marker, `${reader.module}\n${child.pid ?? ''}\n`);
|
|
451
|
-
}
|
|
452
|
-
behind.push({ module: reader.module, places: due.length });
|
|
453
|
-
process.stderr.write(`GREY reading: ${reader.module} · ${due.length} places · runs behind${running ? ', already running' : ''}\n`);
|
|
454
|
-
if (level.length)
|
|
455
|
-
landShard(store, speaker, home, level);
|
|
456
|
-
if (Date.now() - started > 250)
|
|
457
|
-
spent.push(`${reader.module.split('/').pop()} behind ${Date.now() - started}`);
|
|
458
|
-
return false;
|
|
459
|
-
}
|
|
460
|
-
if (due.length) {
|
|
461
|
-
const at = Date.now();
|
|
462
|
-
let rows;
|
|
463
|
-
try {
|
|
464
|
-
rows = reader.capsule !== undefined && asked !== undefined
|
|
465
|
-
? asked.ask(due.map((d) => ({
|
|
466
|
-
protocol: PROTOCOL, verb: 'read', rootScope: d.place, region: reader.capsule.region, held: heldOf(d.place, d.region),
|
|
467
|
-
files: (reader.capsule.reads.some((read) => read.includes('@')) ? handedAt(root, reader, roleOf, look, d.place) : [d.place]).map((coordinate) => ({ place: coordinate, text: observeText(resolve(root, coordinate)) ?? '' })),
|
|
468
|
-
})), { id: reader.id, module: reader.module }).map((answer) => {
|
|
469
|
-
if (answer?.kind !== 'fact')
|
|
470
|
-
throw new Error(`REFUSE·reader ${reader.module} · ${answer?.why ?? 'no capsule answer'}`);
|
|
471
|
-
return (answer.claims ?? []);
|
|
472
|
-
})
|
|
473
|
-
: runReader(module, root, due.map((d) => ({ place: d.place, ...(reader.kind === 'js' ? { text: new TextDecoder().decode(d.bytes) } : {}), held: heldOf(d.place, d.region) })), lifetime);
|
|
474
|
-
}
|
|
475
|
-
catch (error) {
|
|
476
|
-
const why = `REFUSE·reader ${reader.module} · ${error instanceof Error ? error.message : String(error)}`;
|
|
477
|
-
refused.push(why);
|
|
478
|
-
process.stderr.write(`${why}\n`);
|
|
479
|
-
return false;
|
|
480
|
-
}
|
|
481
|
-
if (rows.every((mine) => !mine.length) && !readerAllowsEmpty(standing.flatMap(line => { const p = parseLifetime(line); return p.kind === 'fact' ? [p.value.fields] : []; }), reader.module)) {
|
|
482
|
-
const why = `REFUSE·reader ${reader.module} · answered none of ${due.length} places · nothing landed, they stay due`;
|
|
483
|
-
refused.push(why);
|
|
484
|
-
process.stderr.write(`${why}\n`);
|
|
485
|
-
return false;
|
|
486
|
-
}
|
|
487
|
-
ran += due.length;
|
|
488
|
-
process.stderr.write(`READER ${reader.module} · ${due.length} run · ${Date.now() - at} ms\n`);
|
|
489
|
-
const fresh = new Map();
|
|
490
|
-
due.forEach((d, i) => fresh.set(d.place, (rows[i] ?? []).map((row) => lineOf(row, d.digest, by, speaker))));
|
|
491
|
-
for (const plan of plans.filter((one) => one.said === undefined)) {
|
|
492
|
-
const mine = new Set(plan.due.map((d) => d.place));
|
|
493
|
-
const stay = [...new Set(plan.pairs.filter((pair) => !mine.has(pair.slice(0, pair.indexOf(' ')))).map((pair) => pair.slice(pair.indexOf(' ') + 1)))];
|
|
494
|
-
const said = [...stay.flatMap((one) => plan.prior?.get(one) ?? []), ...[...mine].flatMap((place) => fresh.get(place) ?? [])];
|
|
495
|
-
keepObservation(store, plan.key, said);
|
|
496
|
-
landShard(store, speaker, plan.region, [...plan.kept, pointer(speaker, by, plan.region, plan.key, plan.pairs)]);
|
|
497
|
-
out.push(...plan.kept, ...said);
|
|
498
|
-
}
|
|
499
|
-
const spent = Date.now() - at;
|
|
500
|
-
const over = bytesDigest(store, new TextEncoder().encode(due.map((d) => d.digest).sort().join('\n'))).replace(/^sha256:/, '');
|
|
501
|
-
level.push(canonical({ scope: `cost/reader/${reader.module}`, role: 'writes', form: 'interval', measure: 'ms', value: `${spent}..${spent}`, by: `${speaker}:${by}`, at: `place:${over}` }));
|
|
502
|
-
if (lineage.at(-1) !== by)
|
|
503
|
-
level.push(canonical({ scope: readerScope(reader), role: 'writes', form: 'alphabet', measure: 'identity', value: by, by: `${speaker}:${by}`, at: `place:${by}` }));
|
|
504
|
-
rmSync(storeAt(store, 'pending', by), { force: true });
|
|
505
|
-
}
|
|
506
|
-
for (const plan of plans.filter((one) => one.said !== undefined)) {
|
|
507
|
-
if (!plan.found)
|
|
508
|
-
keepObservation(store, plan.key, plan.said);
|
|
509
|
-
if (plan.shard.keys.get(by) !== plan.key || plan.kept.some((line) => plan.shard.places.get(`${by} ${fieldOf(line, 'scope')}`)?.line !== line)) {
|
|
510
|
-
landShard(store, speaker, plan.region, [...plan.kept, pointer(speaker, by, plan.region, plan.key, plan.pairs)]);
|
|
511
|
-
}
|
|
512
|
-
out.push(...plan.kept, ...plan.said);
|
|
513
|
-
}
|
|
514
|
-
if (level.length)
|
|
515
|
-
landShard(store, speaker, home, level);
|
|
516
|
-
if (Date.now() - started > 250)
|
|
517
|
-
spent.push(`${reader.module.split('/').pop()} ${identified - started}+${Date.now() - identified}`);
|
|
518
|
-
if (kept !== undefined)
|
|
519
|
-
landMemo(store, `observed/${kept}`, new TextEncoder().encode(out.slice(mark).join('\n')));
|
|
520
|
-
return false;
|
|
521
|
-
}
|
|
522
|
-
finally {
|
|
523
|
-
endAct();
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
if (spent.length)
|
|
527
|
-
process.stderr.write(`SPENT observe ${spent.join(' · ')} ms\n`);
|
|
528
|
-
if (legacy)
|
|
529
|
-
setAside(store, speaker);
|
|
530
|
-
process.stderr.write(`OBSERVE ${ran} run · ${read} read by key${whole_ ? ` · ${whole_} readers kept whole` : ''} · ${Date.now() - began} ms\n`);
|
|
531
|
-
if (wait && refused.length)
|
|
532
|
-
throw new Error(refused.join('\n'));
|
|
533
|
-
return [...new Set(out)].sort();
|
|
534
|
-
}
|
|
1
|
+
var bn=Object.defineProperty;var c=(t,n)=>bn(t,"name",{value:n,configurable:!0});import{authenticatedStanding as vn}from"../host/admitted-place.js";import{actCosts as kn}from"../host/act-cost.js";import{readingClosures as En}from"../host/reading-closures.js";import{prepareReadingIdentities as Sn}from"../host/reading-preparation.js";import{BoundRefusal as ue}from"../host/refusals.js";import{readingExecution as On,readingProfile as Rn}from"../host/reading-context.js";import{withNativeReaderRoute as Ke}from"../host/native-reader-context.js";import{prepareNativeReaderRoute as Mn,assertNativeRouteCurrent as xn,materializeNativeRoute as jn}from"../host/native/route.js";import{verifiedContent as Fn}from"../host/content-store.js";import{ownLock as Ce,ownRoot as Te,ownStore as Dn}from"../observe/runner.js";import{library11_readerLifetime as Un,library11_readerAllowsEmpty as Qe,library11_assertReaderInputs as Nn,library11_parse as be}from"../vendor/runtime.js";import{readOnly as An}from"../host/read-only.js";import{basename as Ln,dirname as _e,relative as Bn,existsSync as Je,mkdirSync as Xe,resolve as X,rmSync as Cn,spawn as Tn,statSync as Ze,writeFileSync as en}from"../host/io.js";import{bundleOf as _n,processOf as ve}from"../observe/runner.js";import{library11_canonical as ke,library11_parse as nn,library11_PROTOCOL as Jn}from"../vendor/runtime.js";import{bytesDigest as z,memoized as qn,instrumentCoordinates as tn}from"./digests.js";import{land as In,landMemo as Wn,landShard as V,memoAt as Pn,shardLines as qe,storeAt as Ie}from"../land/ledger.js";import{fieldOf as a,isWire as Ee}from"./claims.js";import{rolesOf as zn}from"./roles.js";import{keyFor as We,lockStanding as Pe}from"./keys.js";import{spoken as Vn}from"./places.js";import{capsuleAt as Hn,childFlags as sn}from"../host/capsule.js";import{wordOf as on}from"./wire.js";import{observeFile as Gn,observeText as H}from"../observe/files.js";import{identityOf as Yn,vectorsOf as Kn}from"../observe/identity.js";import{capsuleReadersOf as an,handedAt as rn,lookOf as Qn,offersOf as Xn}from"./readers.js";import{runReader as Zn,runs as et}from"../observe/run.js";import{LEVEL as nt,OBSERVED as se,keepObservation as Se,keyOf as Oe,legacyOf as tt,observation as ln,observed as st,opened as it,pointer as Re,readerOf as _,regionIn as Me,setAside as ot,sha as Z,trimmed as fe}from"./shards.js";import{saidDigest as cn}from"./kept.js";import{carriedIn as dn,carriedFrom as at}from"./resolved.js";const rt=c(t=>/^(?:vector|sample)\//.test(t),"cased");function Ht(t){const n=nn(t);return n.kind==="fact"&&n.value.fields.measure==="reader"}c(Ht,"isReaderLock");function Gt(t){return xe(t).map(n=>n.module)}c(Gt,"readerModules");function xe(t){const n=Pe(t),i=`${on(n,"families","reader")}/`,g=Vn(_e(t)).map(r=>r.line).filter(r=>a(r,"scope").startsWith(i)),u=new Set(g.map(r=>a(r,"scope")));return[...g,...n.filter(r=>!u.has(a(r,"scope")))].map(r=>nn(r)).flatMap(r=>r.kind==="fact"?[r.value.fields]:[]).filter(r=>(r.scope??"").startsWith(i)&&r.measure==="reader"&&r.value!=="withdraw").flatMap(r=>{const D=r.kind||((r.shape??"").split("|").includes(on(n,"shapes","run"))?"process":"js");return et(D)?[{id:(r.scope??"").slice(i.length),shape:(r.shape??"").split("|").filter(Boolean),where:(r.needs??"").split("|").filter(Boolean),module:r.value??"",kind:D}]:[]}).filter(r=>r.id!==""&&r.shape.length>0&&r.where.length>0&&r.module!=="")}c(xe,"readersOf");function lt(t,n,i,g){const u=t.bound.kind==="interval";return ke({scope:t.scope,role:t.role,form:u?"interval":"alphabet",measure:t.measure,value:u?`${t.bound.lo??0}..${t.bound.hi??0}`:(t.bound.values??[]).join("|"),by:`${g}:${i}`,at:`place:${n}`})}c(lt,"lineOf");const un=new WeakMap;function ct(t){const n=un.get(t);if(n!==void 0)return n;const i=dt(t);return un.set(t,i),i}c(ct,"placedReadings");function Yt(t){return new Set(ct(t).filter(n=>n.measure==="pass"&&n.value==="pass"&&rt(n.question)).map(n=>n.question)).size}c(Yt,"casesHeld");function dt(t){const n=new Map;for(const i of t){if(!se.test(i))continue;const g=`${_(i)??""} ${a(i,"at")}`;n.set(g,(n.get(g)??new Set).add(a(i,"scope")))}return t.flatMap(i=>{if(se.test(i))return[];const g={question:a(i,"scope"),measure:a(i,"measure"),value:a(i,"value"),by:a(i,"by"),at:a(i,"at")};return[...n.get(`${_(i)??""} ${a(i,"at")}`)??[]].map(u=>({...g,place:u}))})}c(dt,"takeReadings");const ze=[],Kt=c(()=>ze,"readersBehind"),ee=[],Qt=c(()=>ee,"readerRefusals"),ut=c(t=>{try{return process.kill(t,0)}catch{return!1}},"alive");function ft(t,n){for(const i of dn(t)){const g=H(i);if(g===void 0)continue;const u=Ie(t,"cas","travelled",Z(g));if(Je(u))continue;const r=new Map;for(const x of g.split(`
|
|
2
|
+
`).filter(Ee)){const E=x.replace(/ sig="[^"]*"/,"");(!r.has(E)||/ sig=/.test(x))&&r.set(E,x)}const D=new Map;for(const x of r.values()){const E=(a(x,"by").split(":")[0]??"").trim();E&&D.set(E,[...D.get(E)??[],x])}for(const[x,E]of D){if(x!==n){In(t,x,E);continue}const ie=new Map;for(const f of E.filter(j=>!se.test(j)))ie.set(`${_(f)??""} ${a(f,"at")}`,[...ie.get(`${_(f)??""} ${a(f,"at")}`)??[],f]);const ne=new Map;for(const f of E.filter(j=>se.test(j))){const j=`${_(f)??""}\0`;ne.set(j,[...ne.get(j)??[],f])}for(const[f,j]of ne){const[oe="",G=""]=f.split("\0");V(t,n,G,j);const pe=j.map(B=>`${a(B,"scope")} ${a(B,"at")}`);Se(t,Oe(oe,G,pe,"receipt"),[...new Set(j.map(B=>a(B,"at")))].flatMap(B=>ie.get(`${oe} ${B}`)??[]))}}Xe(_e(u),{recursive:!0}),en(u,`${Ln(i)}
|
|
3
|
+
`)}}c(ft,"travelled");function pt(t){const n=(()=>{try{return We(t,"read")}catch{return}})();return ft(t,n??""),dn(t).flatMap(i=>(H(i)??"").split(`
|
|
4
|
+
`)).filter(i=>Ee(i)&&n!==void 0&&a(i,"by").split(":")[0]===n)}c(pt,"carried");const je=c(t=>t.capsule?.selected?.selection===void 0?void 0:"sha256:"+Z(JSON.stringify([t.capsule.selected.selection,t.capsule.region,t.module,t.where,[...t.capsule.globs]])),"readerSelection"),Ve=c(t=>t.capsule?.selected?.selection===void 0?`reader/${t.module}`:`reader/${t.module}/${Z(`${t.capsule.selected.selection}
|
|
5
|
+
${t.capsule.region}`)}`,"readerScope"),mt=c((t,n,i,g)=>new Set(i.flatMap(u=>qe(t,n,Me(g,u.module)).filter(r=>a(r,"scope")===Ve(u)&&/(?:^|\s)measure=(?:identity|extension)\s/.test(r)).map(r=>a(r,"value")))),"lineagesOf");function Xt(t){const n=xe(t),i=[...new Set(n.flatMap(u=>u.where.map(fe)))],g=We(t,"read");return[...new Set(n.map(u=>Me(i,u.module)))].flatMap(u=>qe(t,g,u).filter(r=>nt.test(r)))}c(Xt,"readerLines");const Zt=c((t,n)=>(i=>!i.length&&!an(t,n,Pe(n),i).length)(xe(n)),"carriesOnly");function fn(t,n){if(t===void 0)return!0;const i=c(g=>t.map(fe).some(u=>u===""||g===u||g.startsWith(`${u}/`)||u.startsWith(`${g}/`)),"reached");return n.some(g=>i(fe(g)))}c(fn,"readerReaches");function gt(t,n,i={}){if(ee.length=0,An()){const e=(H(X(t,"receipts.bound"))??"").split(`
|
|
6
|
+
`).filter(Ee),l=at(n,e);if(l===void 0)throw Error("REFUSE\xB7preview native receipt bytes unavailable; fold the declared inputs first");return l}const g=i.wait??!0,u=Pe(n),r=xe(n),D=[...r,...an(t,n,u,r)];if(i.selected!==void 0){if(!/^sha256:[a-f0-9]{64}$/.test(i.selected)||i.only===void 0)throw Error("REFUSE\xB7reader invalid internal background selector");if(D.filter(e=>e.module===i.only&&je(e)===i.selected).length!==1)throw Error("REFUSE\xB7reader internal background selector is not uniquely adopted")}if(i.preparation&&i.only!==void 0&&!D.some(e=>e.module===i.only))throw new ue("reading-identity/selection","REFUSE\xB7reading preparation selector is not adopted");if(!D.length)return i.preparation?[]:pt(n);const x=Rn(u,a),E=x?tn(n,ve("verb"),[],Te(),Ce(),!0):void 0;if(E)for(const e of[ve("host"),ve("lifetime","host")])for(const[l,p]of tn(n,e,[],Te(),Ce(),!0))E.set(l,p);const ie=E?z(n,new TextEncoder().encode([...E.values()].sort().join(`
|
|
7
|
+
`))):void 0,ne=E?[...E].map(([e,l])=>[Bn(Te(),e),l]):[];if(x)for(const e of Ce().filter(l=>a(l,"scope").startsWith("dep/")&&a(l,"role")==="reads"&&a(l,"value")!=="withdraw")){const l=a(e,"value");Fn(l,n,Dn()),ne.push([a(e,"scope"),l])}const f=We(n,"read"),j=[...new Set(D.flatMap(e=>e.where.map(fe)))],oe=i.only===void 0&&i.reach===void 0,G=oe&&!i.preparation?tt(n,f,j):void 0,pe=c(e=>fn(i.reach,[e]),"reached"),B=new Map,pn=mt(n,f,D,j),He=c(e=>B.get(e)??B.set(e,it(n,f,e,pn)).get(e),"open"),Fe=new Map,me=c(e=>{if(e!==void 0){if(!Fe.has(e)){const l=ln(n,e),p=new Map;for(const $ of l??[])p.set(a($,"at"),[...p.get(a($,"at"))??[],$]);Fe.set(e,l===void 0?void 0:p)}return Fe.get(e)}},"byAt"),ge=c((e,l,p)=>{if(e.keys.has(l))return me(e.keys.get(l));const $=p.flatMap(L=>e.places.get(`${l} ${L}`)??[]);if(!$.length)return;const R=$.map(L=>`${a(L.line,"scope")} ${L.at}`);if(G===void 0)return me(Oe(l,e.region,R,"receipt"));const J=Oe(l,e.region,R);return Se(n,J,[...new Set($.map(L=>L.at))].flatMap(L=>G.get(`${l} ${L}`)??[])),V(n,f,e.region,[Re(f,l,e.region,J,R)]),e.keys.set(l,J),me(J)},"lastOf"),De=c((e,l,p,$)=>{const R=e.places.get(`${l} ${p}`);return R===void 0?[]:[R.line,...$?.get(R.at)??[]]},"servedAt"),N=[],ae=i.answered,mn=c(e=>Object.entries(JSON.parse(qn(n,`said ${e}`,()=>{const l=new Map;for(const p of ln(n,e)??[])l.set(a(p,"at"),[...l.get(a(p,"at"))??[],p]);return JSON.stringify(Object.fromEntries([...l].map(([p,$])=>[p,cn(n,$)])))}))),"digestsAt"),gn=c(e=>{const l=new Map;for(const p of e)se.test(p)||l.set(`${_(p)??""} ${a(p,"at")}`,[...l.get(`${_(p)??""} ${a(p,"at")}`)??[],p]);for(const p of e)se.test(p)&&ae?.set(`${_(p)??""} ${a(p,"at")}`,cn(n,l.get(`${_(p)??""} ${a(p,"at")}`)??[]))},"heard"),hn=Date.now();let Ue=0,re=0,Ne=0;const he=zn(n),Ae=Qn(t,he);ze.length=0;const we=[];for(const e of D){if(i.only!==void 0&&e.module!==i.only||i.selected!==void 0&&je(e)!==i.selected||!fn(i.reach,e.where))continue;const l=Date.now(),p=N.length;!wn(e,l)&&ae!==void 0&&gn(N.slice(p))}function wn(e,l){const p=X(t,e.module),$=Un(u.flatMap(S=>{const q=be(S);return q.kind==="fact"?[q.value.fields]:[]}),{id:e.id,module:e.module}),R=e.capsule===void 0?void 0:e.capsule.selected??Hn(e.capsule.digest,e.capsule.entry),J=e.capsule===void 0?[]:(R?.lines??[]).filter(S=>a(S,"scope")===`region/${e.capsule.region}`&&a(S,"measure")==="input-projection"&&a(S,"value")!=="withdraw");if(J.length){if(J.length!==1||!R)throw Error("REFUSE\xB7input projection is ambiguous "+e.module);const S=[...new Set(e.where.flatMap(h=>rn(t,e,he,Ae,h)))].sort();if(i.preparation){const{limits:h,used:k}=i.preparation;if(h.signal?.aborted)throw new ue("host/cancelled","REFUSE\xB7host/cancelled");if(S.length>h.files-k.files||S.reduce((ce,K)=>ce+(Je(X(t,K))?Ze(X(t,K)).size:0),0)>h.bytes-k.bytes||k.probes>=h.probes)throw new ue("host/budget","REFUSE\xB7host/budget")}const q=S.map(h=>({place:h,text:H(X(t,h))??""})),Y=c(h=>z(n,Buffer.from(h)),"hash"),le=Qe(u.flatMap(h=>{const k=be(h);return k.kind==="fact"?[k.value.fields]:[]}),e.module),M=Mn(n,{id:e.id,module:e.module});if(M&&!x)throw Error("REFUSE\xB7native reader requires complete reading identity "+e.module);if(M&&R.digest!==M.profile.selection.archive)throw Error("REFUSE\xB7native reader implementation differs "+e.module);const I=M?jn(M):void 0,te=x?On({instrument:ie,implementation:R.digest,policy:Y(JSON.stringify([e.id,e.module,e.kind,e.shape,e.where,$??null,le])),inputs:[...ne,...M?.inputs??[],...I?[["native/mount",I.mountIdentity]]:[]]},Y,{env:process.env,cwd:I?.cwd??t,flags:M?[]:sn()}):void 0,$e={root:t,store:n,...te?{context:te.context,execution:te}:{},reader:e.module,speaker:f,digest:c(h=>z(n,Buffer.from(h)),"digest"),capsule:R,...M?{assertCurrent:c(()=>xn(M),"assertCurrent")}:{},region:e.capsule.region,projection:a(J[0],"value"),livePlace:c(()=>vn(t),"livePlace"),readerReference:{id:e.id,module:e.module},lifetime:$,allowsEmpty:le,files:q,emit:c(h=>process.stderr.write(h+`
|
|
8
|
+
`),"emit")};if(i.preparation){const{limits:h,used:k,results:ce}=i.preparation,K={...h,bytes:h.bytes-k.bytes,files:h.files-k.files,readings:h.readings-k.readings,probes:h.probes-k.probes},m=Ke(M,()=>Sn({...$e,preparationLimits:K}));if(ce.push(m),m.kind==="fact"&&(k.bytes+=m.verifiedBytes,k.files+=q.length,k.readings+=m.readings.length,k.probes+=m.probes),m.kind==="refuse")throw new ue(m.code,m.diagnostic);return!1}const C=Ke(M,()=>En($e));return N.push(...C.lines),Ue+=C.executed,re+=C.read-C.opened,!1}if(i.preparation)throw new ue("reading-identity/projection","REFUSE\xB7reading identity requires a declared input projection "+e.module);if(x)throw Error("REFUSE\xB7reader "+e.module+" complete reading identity requires a declared input projection");const L=kn.begin();try{const S=e.capsule===void 0?Gn(p):R===void 0?void 0:new Uint8Array,q=S&&e.capsule===void 0?_n(p)??z(n,S):"none",Y=Xn(t,n,e,he,Ae,s=>pe(fe(s)));Nn(u.flatMap(s=>{const d=be(s);return d.kind==="fact"?[d.value.fields]:[]}),e.module,Y.length);const le=e.capsule===void 0?H(X(t,Kn(e.module,u))):void 0,M=e.capsule?.selected?.selection===void 0?void 0:Z(`${e.capsule.selected.selection}
|
|
9
|
+
${e.capsule.region}${$===void 0?"":`
|
|
10
|
+
`+JSON.stringify($)}`),I=oe&&G===void 0&&ae===void 0&&S?Z([f,e.module,JSON.stringify($),e.kind,e.shape.join("|"),e.where.join("|"),q,le===void 0?"no vectors":Z(le),e.capsule===void 0?"":`${e.capsule.selected?.selection??e.capsule.digest} ${e.capsule.region} ${e.capsule.reads.join("|")} ${[...e.capsule.globs].map(([s,d])=>`${s}${d.join("|")}`).join(" ")}`,...M===void 0?[]:[M],...Y.map(s=>`${s.place} ${s.digest?.()??z(n,s.bytes())}`)].join(`
|
|
11
|
+
`)):void 0,te=I===void 0?void 0:H(Pn(n,`observed/${I}`));if(te!==void 0)return N.push(...te.split(`
|
|
12
|
+
`).filter(Ee)),re+=Y.length,Ne+=1,!1;const $e=N.length,C=Me(j,e.module),h=qe(n,f,C).filter(s=>a(s,"scope")===Ve(e)),k=h.filter(s=>a(s,"measure")==="identity").map(s=>a(s,"value")).filter(s=>M===void 0||/^[a-f0-9]{64}$/.test(s)),ce=S&&e.capsule===void 0?z(n,new TextEncoder().encode(`${e.module} ${q}${$===void 0?"":`
|
|
13
|
+
`+JSON.stringify($)}`)).replace(/^sha256:/,"").slice(0,12):"none",K=e.capsule!==void 0?{by:S?M??Z(`${e.capsule.digest}
|
|
14
|
+
${e.capsule.region}${$===void 0?"":`
|
|
15
|
+
`+JSON.stringify($)}`).slice(0,12):"none",lines:[]}:S?Yn({store:n,root:t,speaker:f,module:e.module,kind:e.kind,code:ce,lineage:k,lifetime:$,kept:h.filter(s=>/(?:^|\s)measure=(?:extension|emits)\s/.test(s))}):{by:"none",lines:[]},m=K.by,W=[...K.lines],Ge=Date.now(),$n=[...k,m],de=[...k].reverse().find(s=>s!==m),Le=new Map;for(const s of Y){const d=Me(j,s.place);pe(d)&&Le.set(d,[...Le.get(d)??[],s])}const Be=[...Le].map(([s,d])=>{const O=He(s),y=d.map(w=>w.place),F=[],o=[],b=[],T=[];for(const w of d){const v=O.places.get(`${m} ${w.place}`);if(v&&a(v.line,"value")===w.seen){F.push(`${w.place} ${v.at}`),o.push(v.line),T.push({...w,digest:v.at.slice(6)}),re+=1;continue}const Q=w.digest?void 0:w.bytes(),P=w.digest?.()??z(n,Q);F.push(`${w.place} place:${P}`),o.push(ke({scope:w.place,role:"writes",form:"alphabet",measure:"observed",value:w.seen,by:`${f}:${m}`,at:`place:${P}`})),T.push({...w,digest:P,bytes:c(()=>Q??w.bytes(),"bytes")}),v?.at===`place:${P}`?re+=1:b.push({place:w.place,seen:w.seen,digest:P,bytes:Q??w.bytes()})}return{region:s,shard:O,places:y,pairs:F,kept:o,moved:b,all:T,key:Oe(m,s,F)}});if(ae!==void 0&&Be.every(s=>!s.moved.length&&st(n,s.key))){for(const s of Be){for(const[d,O]of mn(s.key))ae.set(`${m} ${d}`,O);(s.shard.keys.get(m)!==s.key||s.kept.some(d=>s.shard.places.get(`${m} ${a(d,"scope")}`)?.line!==d))&&V(n,f,s.region,[...s.kept,Re(f,m,s.region,s.key,s.pairs)]),N.push(...s.kept)}return W.length&&V(n,f,C,W),!0}const ye=Be.map(({region:s,shard:d,places:O,pairs:y,kept:F,moved:o,all:b,key:T})=>{const w=ge(d,m,O);de!==void 0&&ge(d,de,O);const v=[...new Set(y.map(A=>A.slice(A.indexOf(" ")+1)))],Q=me(T),P=Q!==void 0?v.flatMap(A=>Q.get(A)??[]):o.length||w===void 0?void 0:v.flatMap(A=>w.get(A)??[]),yn=P===void 0&&!o.length?b.map(A=>({place:A.place,seen:A.seen,digest:A.digest,bytes:A.bytes()})):o;return{region:s,shard:d,places:O,pairs:y,kept:F,due:yn,key:T,said:P,prior:w,found:Q!==void 0}}),U=ye.flatMap(s=>s.said===void 0?s.due.map(d=>({...d,region:s.region})):[]),Ye=c((s,d)=>{for(const O of[...$n].reverse()){const y=He(d),F=De(y,O,s,ge(y,O,[s])).slice(1);if(F.length)return F.map(o=>[a(o,"scope"),a(o,"value")])}return[]},"heldOf");if(U.length&&!S)return ee.push(`REFUSE\xB7reader ${e.module} unavailable \xB7 ${U.length} readings remain due`),!1;if(U.length&&!g){for(const y of ye){if(y.said!==void 0){N.push(...y.kept,...y.said);continue}for(const F of y.places){const o=De(y.shard,m,F,y.prior);N.push(...o.length||de===void 0?o:De(y.shard,de,F,ge(y.shard,de,y.places)))}}const s=Ie(n,"pending",m),d=Number((H(s)??"").split(`
|
|
16
|
+
`)[1]),O=Je(s)&&Date.now()-Ze(s).mtimeMs<1800*1e3&&Number.isInteger(d)&&d>0&&ut(d);if(!O){Xe(_e(s),{recursive:!0});const y=Tn(process.execPath,[...sn(),ve("observe"),t,e.module,...je(e)===void 0?[]:[je(e)]],{cwd:t,detached:!0,stdio:"ignore"});y.unref(),en(s,`${e.module}
|
|
17
|
+
${y.pid??""}
|
|
18
|
+
`)}return ze.push({module:e.module,places:U.length}),process.stderr.write(`GREY reading: ${e.module} \xB7 ${U.length} places \xB7 runs behind${O?", already running":""}
|
|
19
|
+
`),W.length&&V(n,f,C,W),Date.now()-l>250&&we.push(`${e.module.split("/").pop()} behind ${Date.now()-l}`),!1}if(U.length){const s=Date.now();let d;try{d=e.capsule!==void 0&&R!==void 0?R.ask(U.map(o=>({protocol:Jn,verb:"read",rootScope:o.place,region:e.capsule.region,held:Ye(o.place,o.region),files:(e.capsule.reads.some(b=>b.includes("@"))?rn(t,e,he,Ae,o.place):[o.place]).map(b=>({place:b,text:H(X(t,b))??""}))})),{id:e.id,module:e.module}).map(o=>{if(o?.kind!=="fact")throw new Error(`REFUSE\xB7reader ${e.module} \xB7 ${o?.why??"no capsule answer"}`);return o.claims??[]}):Zn(p,t,U.map(o=>({place:o.place,...e.kind==="js"?{text:new TextDecoder().decode(o.bytes)}:{},held:Ye(o.place,o.region)})),$)}catch(o){const b=`REFUSE\xB7reader ${e.module} \xB7 ${o instanceof Error?o.message:String(o)}`;return ee.push(b),process.stderr.write(`${b}
|
|
20
|
+
`),!1}if(d.every(o=>!o.length)&&!Qe(u.flatMap(o=>{const b=be(o);return b.kind==="fact"?[b.value.fields]:[]}),e.module)){const o=`REFUSE\xB7reader ${e.module} \xB7 answered none of ${U.length} places \xB7 nothing landed, they stay due`;return ee.push(o),process.stderr.write(`${o}
|
|
21
|
+
`),!1}Ue+=U.length,process.stderr.write(`READER ${e.module} \xB7 ${U.length} run \xB7 ${Date.now()-s} ms
|
|
22
|
+
`);const O=new Map;U.forEach((o,b)=>O.set(o.place,(d[b]??[]).map(T=>lt(T,o.digest,m,f))));for(const o of ye.filter(b=>b.said===void 0)){const b=new Set(o.due.map(v=>v.place)),w=[...[...new Set(o.pairs.filter(v=>!b.has(v.slice(0,v.indexOf(" ")))).map(v=>v.slice(v.indexOf(" ")+1)))].flatMap(v=>o.prior?.get(v)??[]),...[...b].flatMap(v=>O.get(v)??[])];Se(n,o.key,w),V(n,f,o.region,[...o.kept,Re(f,m,o.region,o.key,o.pairs)]),N.push(...o.kept,...w)}const y=Date.now()-s,F=z(n,new TextEncoder().encode(U.map(o=>o.digest).sort().join(`
|
|
23
|
+
`))).replace(/^sha256:/,"");W.push(ke({scope:`cost/reader/${e.module}`,role:"writes",form:"interval",measure:"ms",value:`${y}..${y}`,by:`${f}:${m}`,at:`place:${F}`})),k.at(-1)!==m&&W.push(ke({scope:Ve(e),role:"writes",form:"alphabet",measure:"identity",value:m,by:`${f}:${m}`,at:`place:${m}`})),Cn(Ie(n,"pending",m),{force:!0})}for(const s of ye.filter(d=>d.said!==void 0))s.found||Se(n,s.key,s.said),(s.shard.keys.get(m)!==s.key||s.kept.some(d=>s.shard.places.get(`${m} ${a(d,"scope")}`)?.line!==d))&&V(n,f,s.region,[...s.kept,Re(f,m,s.region,s.key,s.pairs)]),N.push(...s.kept,...s.said);return W.length&&V(n,f,C,W),Date.now()-l>250&&we.push(`${e.module.split("/").pop()} ${Ge-l}+${Date.now()-Ge}`),I!==void 0&&Wn(n,`observed/${I}`,new TextEncoder().encode(N.slice($e).join(`
|
|
24
|
+
`))),!1}finally{L()}}if(c(wn,"observeOne"),i.preparation)return[];if(we.length&&process.stderr.write(`SPENT observe ${we.join(" \xB7 ")} ms
|
|
25
|
+
`),G&&ot(n,f),process.stderr.write(`OBSERVE ${Ue} run \xB7 ${re} read by key${Ne?` \xB7 ${Ne} readers kept whole`:""} \xB7 ${Date.now()-hn} ms
|
|
26
|
+
`),g&&ee.length)throw new Error(ee.join(`
|
|
27
|
+
`));return[...new Set(N)].sort()}c(gt,"observedClaims");function es(t,n,i,g){const u=[];return gt(t,n,{...g?{only:g}:{},preparation:{limits:i,results:u,used:{bytes:0,files:0,readings:0,probes:0}}}),u}c(es,"prepareObservedReadings");export{Zt as carriesOnly,rt as cased,Yt as casesHeld,Ht as isReaderLock,gt as observedClaims,ct as placedReadings,es as prepareObservedReadings,Xt as readerLines,Gt as readerModules,fn as readerReaches,Qt as readerRefusals,Kt as readersBehind};
|