@lapxo/bound 0.2.4 → 0.2.6
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 +1 -1
- package/README.md +20 -3
- package/TARGET.bound +85 -47
- package/dist/cli/accept.js +61 -590
- 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 +22 -321
- package/dist/cli/place.js +6 -282
- package/dist/cli/release-result.js +3 -80
- package/dist/cli/retained-judgment.js +1 -25
- package/dist/cli/standing-result.js +4 -19
- package/dist/cli/takes.js +10 -112
- package/dist/cli/verb.d.ts +1 -2
- package/dist/cli/verb.js +85 -684
- 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 -117
- 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 -132
- package/dist/fold/closed.js +24 -235
- 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 +28 -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 -35
- package/dist/host/archive.js +1 -152
- package/dist/host/call-context.js +1 -14
- package/dist/host/capsule-process.js +2 -62
- package/dist/host/capsule.js +9 -171
- package/dist/host/cell-receipts.js +12 -128
- package/dist/host/command-server.js +4 -0
- package/dist/host/commit-result.js +1 -5
- package/dist/host/content-needed.js +1 -8
- package/dist/host/content-store.js +1 -31
- package/dist/host/contextual-place.js +2 -72
- package/dist/host/digest.js +2 -15
- package/dist/host/hash.js +1 -9
- package/dist/host/host-controls.js +1 -19
- package/dist/host/in-process-act.js +3 -84
- package/dist/host/in-process-context.js +3 -91
- package/dist/host/in-process-root.js +6 -84
- package/dist/host/in-process.js +4 -55
- package/dist/host/index.d.ts +1 -15
- package/dist/host/index.js +1 -7
- 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/authority-card-view.js +5 -0
- package/dist/host/native/authority-card.js +1 -0
- 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/installed-package.d.ts +1 -0
- package/dist/host/native/installed-package.js +5 -0
- 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-inventory.js +2 -0
- 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/probes.js +1 -0
- package/dist/host/native/reading-witness-admission.js +5 -0
- 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-place-state.js +1 -0
- package/dist/host/native-reader-context.js +1 -8
- package/dist/host/native-receiver.js +1 -25
- package/dist/host/objects.js +1 -38
- package/dist/host/order.js +1 -2
- package/dist/host/persistent-host.js +1 -0
- package/dist/host/physical-lines.d.ts +1 -0
- package/dist/host/physical-lines.js +1 -0
- package/dist/host/place-act-transaction.js +4 -78
- 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 -183
- package/dist/host/ports/place-act.js +1 -134
- 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/profile-composition.d.ts +1 -0
- package/dist/host/profile-composition.js +2 -0
- 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 -307
- package/dist/host/selected-capsules.js +1 -50
- package/dist/host/selected-topos.js +1 -80
- package/dist/host/signature-era.js +1 -12
- package/dist/host/signing.js +2 -48
- package/dist/host/source-content.js +2 -111
- package/dist/host/standing-carrier.js +1 -18
- package/dist/host/standing-projection.js +1 -50
- package/dist/host/timing.js +1 -7
- package/dist/host/walk.js +20 -193
- package/dist/host/work-trace.js +1 -0
- 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 -336
- 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 +6 -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 +1 -41
- package/dist/observe/runner.js +4 -101
- package/dist/public-types.d.ts +2019 -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/receipt-projection.js +1 -0
- 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/bundle.json +1 -0
- package/dist/vendor/library14.js +1 -0
- package/dist/vendor/object-provider.js +42 -0
- package/dist/vendor/runtime.js +61 -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/authenticated-reference.publication.json +1 -1
- package/docs/contracts/authority-preflight.md +17 -0
- package/docs/contracts/authority-preflight.publication.json +25 -0
- 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/installed-package.md +21 -0
- package/docs/contracts/installed-package.publication.json +25 -0
- package/docs/contracts/materialized-leaf-sequence.md +15 -0
- package/docs/contracts/materialized-leaf-sequence.publication.json +25 -0
- package/docs/contracts/module-inventory.md +15 -0
- package/docs/contracts/module-inventory.publication.json +25 -0
- package/docs/contracts/native-host.md +29 -1
- package/docs/contracts/native-host.publication.json +4 -4
- package/docs/contracts/native-probes.md +13 -0
- package/docs/contracts/native-probes.publication.json +25 -0
- package/docs/contracts/native-publication.inventory.json +10 -1
- package/docs/contracts/native-view-batch.md +17 -0
- package/docs/contracts/native-view-batch.publication.json +25 -0
- package/docs/contracts/optional-wasm-adapter.publication.json +1 -1
- package/docs/contracts/physical-lines.md +19 -0
- package/docs/contracts/physical-lines.publication.json +25 -0
- package/docs/contracts/profile-composition.md +17 -0
- package/docs/contracts/profile-composition.publication.json +25 -0
- package/docs/contracts/profile-preparation-native-meaning.md +9 -0
- package/docs/contracts/publication.md +12 -0
- package/docs/contracts/reading-identity.md +61 -0
- package/docs/contracts/reading-identity.publication.json +25 -0
- package/docs/contracts/reading-witness-admission.md +49 -0
- package/docs/contracts/readme.publication.json +1 -1
- package/docs/contracts/reference-port.md +11 -0
- package/docs/contracts/reference-port.publication.json +1 -1
- package/docs/contracts/refusals.bound +346 -94
- package/docs/contracts/refusals.md +119 -39
- package/docs/contracts/refusals.publication.json +2 -2
- package/docs/contracts/views.md +8 -0
- package/docs/reference.md +9 -0
- package/licenses/wasm/{fast-text-encoding.txt → NOTICE.txt} +111 -0
- package/package.json +84 -34
- package/receipts.bound +12952 -10449
- package/samples/authority-preflight/no.json +6 -0
- package/samples/authority-preflight/yes.json +30 -0
- package/samples/engine-alphabet/reader.js +3 -1457
- package/samples/engine-alphabet/receipts.bound +7 -7
- package/samples/engine-interval/reader.js +3 -1457
- package/samples/engine-interval/receipts.bound +7 -7
- package/samples/installed-package/consumer.mjs +29 -0
- package/samples/installed-package/fixture.json +48 -0
- package/samples/installed-package/no.json +10 -0
- package/samples/installed-package/yes.json +52 -0
- package/samples/materialized-leaf-sequence/no.json +11 -0
- package/samples/materialized-leaf-sequence/yes.json +10 -0
- package/samples/module-inventory/yes.json +28 -0
- package/samples/native/physical-line-reader.mjs +1 -0
- package/samples/native/physical-line-reader.source.mjs +13 -0
- package/samples/native-host/no.json +6 -1
- package/samples/native-host/yes.json +18 -1
- package/samples/native-probes/inputs/inspection.json +28 -0
- package/samples/native-probes/no.json +7 -0
- package/samples/native-probes/yes.json +28 -0
- package/samples/native-view-batch/no.json +14 -0
- package/samples/native-view-batch/yes.json +10 -0
- package/samples/no/engine-order/reader.js +3 -1457
- package/samples/no/module-inventory/no.json +10 -0
- package/samples/physical-lines/no.json +5 -0
- package/samples/physical-lines/yes.json +9 -0
- package/samples/profile-composition/no.json +6 -0
- package/samples/profile-composition/yes.json +14 -0
- package/samples/reading-identity/no.json +26 -0
- package/samples/reading-identity/yes.json +69 -0
- package/vectors/native/authority-preflight.vector.json +55 -0
- package/vectors/native/installed-package.vector.json +31 -0
- package/vectors/native/materialized-leaf-sequence.vector.json +31 -0
- package/vectors/native/module-inventory.vector.json +56 -0
- package/vectors/native/native-host.vector.json +214 -0
- package/vectors/native/native-probes.vector.json +31 -0
- package/vectors/native/native-view-batch.vector.json +31 -0
- package/vectors/native/physical-lines.vector.json +105 -0
- package/vectors/native/profile-composition.vector.json +53 -0
- package/vectors/native/reading-identity.vector.json +139 -0
- package/vectors/native/refusals.vector.json +138 -0
- package/vendor/syntax/LICENSE.md +7 -0
- package/vendor/syntax/parser.js +1 -0
- package/.github/workflows/release.yml +0 -67
- package/.github/workflows/test.yml +0 -35
- package/dist/engine/object.d.ts +0 -17
- package/dist/engine/ports.d.ts +0 -37
- package/dist/fold/claims.d.ts +0 -29
- package/dist/host/call-context.d.ts +0 -20
- package/dist/host/commit-result.d.ts +0 -6
- package/dist/host/in-process-act.d.ts +0 -82
- package/dist/host/in-process-context.d.ts +0 -46
- package/dist/host/in-process-root.d.ts +0 -117
- package/dist/host/in-process.d.ts +0 -41
- package/dist/host/native/module-closure.d.ts +0 -35
- package/dist/host/native-receiver.d.ts +0 -19
- package/dist/host/place-act-transaction.d.ts +0 -24
- package/dist/host/place-clock-selection.d.ts +0 -55
- package/dist/host/ports/local-act.d.ts +0 -44
- package/dist/host/ports/place-act.d.ts +0 -49
- package/dist/host/ports/publication.d.ts +0 -10
- 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/host/root-clock-source.d.ts +0 -86
- package/licenses/wasm/jitl-quickjs-ffi-types.txt +0 -21
- package/licenses/wasm/jitl-quickjs-wasmfile-release-sync.txt +0 -47
- package/licenses/wasm/quickjs-emscripten-core.txt +0 -21
- package/licenses/wasm/topos.txt +0 -21
- /package/{licenses/wasm/bound.txt → dist/vendor/28cba430228db1c04f446c93f81b09a2705d6bf3e222d35adbe5a4cee4061884.LICENSE} +0 -0
- /package/{licenses/wasm/obligations.txt → dist/vendor/7aca161279d14bc0e054dcc281cd110aeb95be2e026b42fdf527a260e58b2aae.LICENSE} +0 -0
package/dist/fold/observed.js
CHANGED
|
@@ -1,534 +1,28 @@
|
|
|
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
|
-
|
|
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 kn=Object.defineProperty;var c=(t,n)=>kn(t,"name",{value:n,configurable:!0});import{hostOutput as ee}from"../host/call-context.js";import{authenticatedStanding as En}from"../host/admitted-place.js";import{actCosts as Sn}from"../host/act-cost.js";import{readingClosures as On}from"../host/reading-closures.js";import{prepareReadingIdentities as Rn}from"../host/reading-preparation.js";import{BoundRefusal as ne}from"../host/refusals.js";import{readingExecution as Mn,readingProfile as xn}from"../host/reading-context.js";import{withNativeReaderRoute as Xe}from"../host/native-reader-context.js";import{prepareNativeReaderRoute as jn,assertNativeRouteCurrent as Fn,materializeNativeRoute as Dn}from"../host/native/route.js";import{verifiedContent as Un}from"../host/content-store.js";import{ownLock as Te,ownRoot as _e,ownStore as Nn}from"../observe/runner.js";import{library14_readerLifetime as An,library14_readerAllowsEmpty as Ze,library14_assertReaderInputs as Ln,library14_parse as ve}from"../vendor/runtime.js";import{readOnly as Bn}from"../host/read-only.js";import{basename as Cn,dirname as Je,relative as Tn,existsSync as qe,mkdirSync as en,resolve as te,rmSync as _n,spawn as Jn,statSync as nn,writeFileSync as tn}from"../host/io.js";import{bundleOf as qn,processOf as ke}from"../observe/runner.js";import{library14_canonical as Ee,library14_parse as sn,library14_PROTOCOL as In}from"../vendor/runtime.js";import{bytesDigest as H,memoized as Wn,instrumentCoordinates as on}from"./digests.js";import{land as Pn,landMemo as zn,landShard as G,memoAt as Vn,shardLines as Ie,storeAt as We}from"../land/ledger.js";import{fieldOf as r,isWire as Se}from"./claims.js";import{rolesOf as Hn}from"./roles.js";import{keyFor as Pe,lockStanding as ze}from"./keys.js";import{spoken as Gn}from"./places.js";import{capsuleAt as Yn,childFlags as an}from"../host/capsule.js";import{wordOf as rn}from"./wire.js";import{observeFile as Kn,observeText as Y}from"../observe/files.js";import{identityOf as Qn,vectorsOf as Xn}from"../observe/identity.js";import{capsuleReadersOf as ln,handedAt as cn,lookOf as Zn,offersOf as et}from"./readers.js";import{runReader as nt,runs as tt}from"../observe/run.js";import{LEVEL as st,OBSERVED as ae,keepObservation as Oe,keyOf as Re,legacyOf as it,observation as dn,observed as ot,opened as at,pointer as Me,readerOf as J,regionIn as xe,setAside as rt,sha as se,trimmed as me}from"./shards.js";import{saidDigest as un}from"./kept.js";import{carriedIn as fn,carriedFrom as lt}from"./resolved.js";const ct=c(t=>/^(?:vector|sample)\//.test(t),"cased");function Kt(t){const n=sn(t);return n.kind==="fact"&&n.value.fields.measure==="reader"}c(Kt,"isReaderLock");function Qt(t){return je(t).map(n=>n.module)}c(Qt,"readerModules");function je(t){const n=ze(t),i=`${rn(n,"families","reader")}/`,m=Gn(Je(t)).map(a=>a.line).filter(a=>r(a,"scope").startsWith(i)),g=new Set(m.map(a=>r(a,"scope")));return[...m,...n.filter(a=>!g.has(r(a,"scope")))].map(a=>sn(a)).flatMap(a=>a.kind==="fact"?[a.value.fields]:[]).filter(a=>(a.scope??"").startsWith(i)&&a.measure==="reader"&&a.value!=="withdraw").flatMap(a=>{const B=a.kind||((a.shape??"").split("|").includes(rn(n,"shapes","run"))?"process":"js");return tt(B)?[{id:(a.scope??"").slice(i.length),shape:(a.shape??"").split("|").filter(Boolean),where:(a.needs??"").split("|").filter(Boolean),module:a.value??"",kind:B}]:[]}).filter(a=>a.id!==""&&a.shape.length>0&&a.where.length>0&&a.module!=="")}c(je,"readersOf");function dt(t,n,i,m){const g=t.bound.kind==="interval";return Ee({scope:t.scope,role:t.role,form:g?"interval":"alphabet",measure:t.measure,value:g?`${t.bound.lo??0}..${t.bound.hi??0}`:(t.bound.values??[]).join("|"),by:`${m}:${i}`,at:`place:${n}`})}c(dt,"lineOf");const pn=new WeakMap;function ut(t){const n=pn.get(t);if(n!==void 0)return n;const i=ft(t);return pn.set(t,i),i}c(ut,"placedReadings");function Xt(t){return new Set(ut(t).filter(n=>n.measure==="pass"&&n.value==="pass"&&ct(n.question)).map(n=>n.question)).size}c(Xt,"casesHeld");function ft(t){const n=new Map;for(const i of t){if(!ae.test(i))continue;const m=`${J(i)??""} ${r(i,"at")}`;n.set(m,(n.get(m)??new Set).add(r(i,"scope")))}return t.flatMap(i=>{if(ae.test(i))return[];const m={question:r(i,"scope"),measure:r(i,"measure"),value:r(i,"value"),by:r(i,"by"),at:r(i,"at")};return[...n.get(`${J(i)??""} ${r(i,"at")}`)??[]].map(g=>({...m,place:g}))})}c(ft,"takeReadings");const Ve=[],Zt=c(()=>Ve,"readersBehind"),q=[],es=c(()=>q,"readerRefusals"),pt=c(t=>{try{return process.kill(t,0)}catch{return!1}},"alive");function mt(t,n){for(const i of fn(t)){const m=Y(i);if(m===void 0)continue;const g=We(t,"cas","travelled",se(m));if(qe(g))continue;const a=new Map;for(const O of m.split(`
|
|
2
|
+
`).filter(Se)){const R=O.replace(/ sig="[^"]*"/,"");(!a.has(R)||/ sig=/.test(O))&&a.set(R,O)}const B=new Map;for(const O of a.values()){const R=(r(O,"by").split(":")[0]??"").trim();R&&B.set(R,[...B.get(R)??[],O])}for(const[O,R]of B){if(O!==n){Pn(t,O,R);continue}const A=new Map;for(const F of R.filter(u=>!ae.test(u)))A.set(`${J(F)??""} ${r(F,"at")}`,[...A.get(`${J(F)??""} ${r(F,"at")}`)??[],F]);const re=new Map;for(const F of R.filter(u=>ae.test(u))){const u=`${J(F)??""}\0`;re.set(u,[...re.get(u)??[],F])}for(const[F,u]of re){const[K="",le=""]=F.split("\0");G(t,n,le,u);const ie=u.map(C=>`${r(C,"scope")} ${r(C,"at")}`);Oe(t,Re(K,le,ie,"receipt"),[...new Set(u.map(C=>r(C,"at")))].flatMap(C=>A.get(`${K} ${C}`)??[]))}}en(Je(g),{recursive:!0}),tn(g,`${Cn(i)}
|
|
3
|
+
`)}}c(mt,"travelled");function gt(t){const n=(()=>{try{return Pe(t,"read")}catch{return}})();return mt(t,n??""),fn(t).flatMap(i=>(Y(i)??"").split(`
|
|
4
|
+
`)).filter(i=>Se(i)&&n!==void 0&&r(i,"by").split(":")[0]===n)}c(gt,"carried");const Fe=c(t=>t.capsule?.selected?.selection===void 0?void 0:"sha256:"+se(JSON.stringify([t.capsule.selected.selection,t.capsule.region,t.module,t.where,[...t.capsule.globs]])),"readerSelection"),He=c(t=>t.capsule?.selected?.selection===void 0?`reader/${t.module}`:`reader/${t.module}/${se(`${t.capsule.selected.selection}
|
|
5
|
+
${t.capsule.region}`)}`,"readerScope"),ht=c((t,n,i,m)=>new Set(i.flatMap(g=>Ie(t,n,xe(m,g.module)).filter(a=>r(a,"scope")===He(g)&&/(?:^|\s)measure=(?:identity|extension)\s/.test(a)).map(a=>r(a,"value")))),"lineagesOf");function ns(t){const n=je(t),i=[...new Set(n.flatMap(g=>g.where.map(me)))],m=Pe(t,"read");return[...new Set(n.map(g=>xe(i,g.module)))].flatMap(g=>Ie(t,m,g).filter(a=>st.test(a)))}c(ns,"readerLines");const ts=c((t,n)=>(i=>!i.length&&!ln(t,n,ze(n),i).length)(je(n)),"carriesOnly");function mn(t,n){if(t===void 0)return!0;const i=c(m=>t.map(me).some(g=>g===""||m===g||m.startsWith(`${g}/`)||g.startsWith(`${m}/`)),"reached");return n.some(m=>i(me(m)))}c(mn,"readerReaches");function $t(t,n,i={}){q.length=0;const m=[];if(Bn()){const e=(Y(te(t,"receipts.bound"))??"").split(`
|
|
6
|
+
`).filter(Se),l=lt(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,a=ze(n),B=je(n),O=[...B,...ln(t,n,a,B)];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(O.filter(e=>e.module===i.only&&Fe(e)===i.selected).length!==1)throw Error("REFUSE\xB7reader internal background selector is not uniquely adopted")}if(i.preparation&&i.only!==void 0&&!O.some(e=>e.module===i.only))throw new ne("reading-identity/selection","REFUSE\xB7reading preparation selector is not adopted");if(!O.length)return i.preparation?[]:gt(n);const R=xn(a,r),A=R?on(n,ke("verb"),[],_e(),Te(),!0):void 0;if(A)for(const e of[ke("host"),ke("lifetime","host")])for(const[l,f]of on(n,e,[],_e(),Te(),!0))A.set(l,f);const re=A?H(n,new TextEncoder().encode([...A.values()].sort().join(`
|
|
7
|
+
`))):void 0,F=A?[...A].map(([e,l])=>[Tn(_e(),e),l]):[];if(R)for(const e of Te().filter(l=>r(l,"scope").startsWith("dep/")&&r(l,"role")==="reads"&&r(l,"value")!=="withdraw")){const l=r(e,"value");Un(l,n,Nn()),F.push([r(e,"scope"),l])}const u=Pe(n,"read"),K=[...new Set(O.flatMap(e=>e.where.map(me)))],le=i.only===void 0&&i.reach===void 0,ie=le&&!i.preparation?it(n,u,K):void 0,C=c(e=>mn(i.reach,[e]),"reached"),Ge=new Map,gn=ht(n,u,O,K),Ye=c(e=>Ge.get(e)??Ge.set(e,at(n,u,e,gn)).get(e),"open"),De=new Map,ge=c(e=>{if(e!==void 0){if(!De.has(e)){const l=dn(n,e),f=new Map;for(const w of l??[])f.set(r(w,"at"),[...f.get(r(w,"at"))??[],w]);De.set(e,l===void 0?void 0:f)}return De.get(e)}},"byAt"),he=c((e,l,f)=>{if(e.keys.has(l))return ge(e.keys.get(l));const w=f.flatMap(L=>e.places.get(`${l} ${L}`)??[]);if(!w.length)return;const M=w.map(L=>`${r(L.line,"scope")} ${L.at}`);if(ie===void 0)return ge(Re(l,e.region,M,"receipt"));const I=Re(l,e.region,M);return Oe(n,I,[...new Set(w.map(L=>L.at))].flatMap(L=>ie.get(`${l} ${L}`)??[])),G(n,u,e.region,[Me(u,l,e.region,I,M)]),e.keys.set(l,I),ge(I)},"lastOf"),Ue=c((e,l,f,w)=>{const M=e.places.get(`${l} ${f}`);return M===void 0?[]:[M.line,...w?.get(M.at)??[]]},"servedAt"),U=[],ce=i.answered,hn=c(e=>Object.entries(JSON.parse(Wn(n,`said ${e}`,()=>{const l=new Map;for(const f of dn(n,e)??[])l.set(r(f,"at"),[...l.get(r(f,"at"))??[],f]);return JSON.stringify(Object.fromEntries([...l].map(([f,w])=>[f,un(n,w)])))}))),"digestsAt"),$n=c(e=>{const l=new Map;for(const f of e)ae.test(f)||l.set(`${J(f)??""} ${r(f,"at")}`,[...l.get(`${J(f)??""} ${r(f,"at")}`)??[],f]);for(const f of e)ae.test(f)&&ce?.set(`${J(f)??""} ${r(f,"at")}`,un(n,l.get(`${J(f)??""} ${r(f,"at")}`)??[]))},"heard"),wn=Date.now();let Ne=0,de=0,Ae=0;const $e=Hn(n),Le=Zn(t,$e);Ve.length=0;const we=[];for(const e of O){if(i.only!==void 0&&e.module!==i.only||i.selected!==void 0&&Fe(e)!==i.selected||!mn(i.reach,e.where))continue;const l=Date.now(),f=U.length;!yn(e,l)&&ce!==void 0&&$n(U.slice(f))}function yn(e,l){const f=te(t,e.module),w=An(a.flatMap(E=>{const W=ve(E);return W.kind==="fact"?[W.value.fields]:[]}),{id:e.id,module:e.module}),M=e.capsule===void 0?void 0:e.capsule.selected??Yn(e.capsule.digest,e.capsule.entry),I=e.capsule===void 0?[]:(M?.lines??[]).filter(E=>r(E,"scope")===`region/${e.capsule.region}`&&r(E,"measure")==="input-projection"&&r(E,"value")!=="withdraw");if(I.length){if(I.length!==1||!M)throw Error("REFUSE\xB7input projection is ambiguous "+e.module);const E=[...new Set(e.where.flatMap(h=>cn(t,e,$e,Le,h)))].sort();if(i.preparation){const{limits:h,used:k}=i.preparation;if(h.signal?.aborted)throw new ne("host/cancelled","REFUSE\xB7host/cancelled");if(E.length>h.files-k.files||E.reduce((fe,X)=>fe+(qe(te(t,X))?nn(te(t,X)).size:0),0)>h.bytes-k.bytes||k.probes>=h.probes)throw new ne("host/budget","REFUSE\xB7host/budget")}const W=E.map(h=>({place:h,text:Y(te(t,h))??""})),Q=c(h=>H(n,Buffer.from(h)),"hash"),ue=Ze(a.flatMap(h=>{const k=ve(h);return k.kind==="fact"?[k.value.fields]:[]}),e.module),x=jn(n,{id:e.id,module:e.module});if(x&&!R)throw Error("REFUSE\xB7native reader requires complete reading identity "+e.module);if(x&&M.digest!==x.profile.selection.archive)throw Error("REFUSE\xB7native reader implementation differs "+e.module);const P=x?Dn(x):void 0,oe=R?Mn({instrument:re,implementation:M.digest,policy:Q(JSON.stringify([e.id,e.module,e.kind,e.shape,e.where,w??null,ue])),inputs:[...F,...x?.inputs??[],...P?[["native/mount",P.mountIdentity]]:[]]},Q,{env:process.env,cwd:P?.cwd??t,flags:x?[]:an()}):void 0,ye={root:t,store:n,...oe?{context:oe.context,execution:oe}:{},reader:e.module,speaker:u,digest:c(h=>H(n,Buffer.from(h)),"digest"),capsule:M,...x?{assertCurrent:c(()=>Fn(x),"assertCurrent")}:{},region:e.capsule.region,projection:r(I[0],"value"),livePlace:c(()=>En(t),"livePlace"),readerReference:{id:e.id,module:e.module},lifetime:w,allowsEmpty:ue,files:W,emit:c(h=>ee("error",h+`
|
|
8
|
+
`),"emit")};if(i.preparation){const{limits:h,used:k,results:fe}=i.preparation,X={...h,bytes:h.bytes-k.bytes,files:h.files-k.files,readings:h.readings-k.readings,probes:h.probes-k.probes},p=Xe(x,()=>Rn({...ye,preparationLimits:X}));if(fe.push(p),p.kind==="fact"&&(k.bytes+=p.verifiedBytes,k.files+=W.length,k.readings+=p.readings.length,k.probes+=p.probes),p.kind==="refuse")throw new ne(p.code,p.diagnostic);return!1}const T=Xe(x,()=>On(ye));return U.push(...T.lines),Ne+=T.executed,de+=T.read-T.opened,!1}if(i.preparation)throw new ne("reading-identity/projection","REFUSE\xB7reading identity requires a declared input projection "+e.module);if(R)throw Error("REFUSE\xB7reader "+e.module+" complete reading identity requires a declared input projection");const L=Sn.begin();try{const E=e.capsule===void 0?Kn(f):M===void 0?void 0:new Uint8Array,W=E&&e.capsule===void 0?qn(f)??H(n,E):"none",Q=et(t,n,e,$e,Le,s=>C(me(s)));Ln(a.flatMap(s=>{const d=ve(s);return d.kind==="fact"?[d.value.fields]:[]}),e.module,Q.length);const ue=e.capsule===void 0?Y(te(t,Xn(e.module,a))):void 0,x=e.capsule?.selected?.selection===void 0?void 0:se(`${e.capsule.selected.selection}
|
|
9
|
+
${e.capsule.region}${w===void 0?"":`
|
|
10
|
+
`+JSON.stringify(w)}`),P=le&&ie===void 0&&ce===void 0&&E?se([u,e.module,JSON.stringify(w),e.kind,e.shape.join("|"),e.where.join("|"),W,ue===void 0?"no vectors":se(ue),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(" ")}`,...x===void 0?[]:[x],...Q.map(s=>`${s.place} ${s.digest?.()??H(n,s.bytes())}`)].join(`
|
|
11
|
+
`)):void 0,oe=P===void 0?void 0:Y(Vn(n,`observed/${P}`));if(oe!==void 0)return U.push(...oe.split(`
|
|
12
|
+
`).filter(Se)),de+=Q.length,Ae+=1,!1;const ye=U.length,T=xe(K,e.module),h=Ie(n,u,T).filter(s=>r(s,"scope")===He(e)),k=h.filter(s=>r(s,"measure")==="identity").map(s=>r(s,"value")).filter(s=>x===void 0||/^[a-f0-9]{64}$/.test(s)),fe=E&&e.capsule===void 0?H(n,new TextEncoder().encode(`${e.module} ${W}${w===void 0?"":`
|
|
13
|
+
`+JSON.stringify(w)}`)).replace(/^sha256:/,"").slice(0,12):"none",X=e.capsule!==void 0?{by:E?x??se(`${e.capsule.digest}
|
|
14
|
+
${e.capsule.region}${w===void 0?"":`
|
|
15
|
+
`+JSON.stringify(w)}`).slice(0,12):"none",lines:[]}:E?Qn({store:n,root:t,speaker:u,module:e.module,kind:e.kind,code:fe,lineage:k,lifetime:w,kept:h.filter(s=>/(?:^|\s)measure=(?:extension|emits)\s/.test(s))}):{by:"none",lines:[]},p=X.by,z=[...X.lines],Ke=Date.now(),bn=[...k,p],pe=[...k].reverse().find(s=>s!==p),Be=new Map;for(const s of Q){const d=xe(K,s.place);C(d)&&Be.set(d,[...Be.get(d)??[],s])}const Ce=[...Be].map(([s,d])=>{const S=Ye(s),y=d.map($=>$.place),j=[],o=[],b=[],_=[];for(const $ of d){const v=S.places.get(`${p} ${$.place}`);if(v&&r(v.line,"value")===$.seen){j.push(`${$.place} ${v.at}`),o.push(v.line),_.push({...$,digest:v.at.slice(6)}),de+=1;continue}const Z=$.digest?void 0:$.bytes(),V=$.digest?.()??H(n,Z);j.push(`${$.place} place:${V}`),o.push(Ee({scope:$.place,role:"writes",form:"alphabet",measure:"observed",value:$.seen,by:`${u}:${p}`,at:`place:${V}`})),_.push({...$,digest:V,bytes:c(()=>Z??$.bytes(),"bytes")}),v?.at===`place:${V}`?de+=1:b.push({place:$.place,seen:$.seen,digest:V,bytes:Z??$.bytes()})}return{region:s,shard:S,places:y,pairs:j,kept:o,moved:b,all:_,key:Re(p,s,j)}});if(ce!==void 0&&Ce.every(s=>!s.moved.length&&ot(n,s.key))){for(const s of Ce){for(const[d,S]of hn(s.key))ce.set(`${p} ${d}`,S);(s.shard.keys.get(p)!==s.key||s.kept.some(d=>s.shard.places.get(`${p} ${r(d,"scope")}`)?.line!==d))&&G(n,u,s.region,[...s.kept,Me(u,p,s.region,s.key,s.pairs)]),U.push(...s.kept)}return z.length&&G(n,u,T,z),!0}const be=Ce.map(({region:s,shard:d,places:S,pairs:y,kept:j,moved:o,all:b,key:_})=>{const $=he(d,p,S);pe!==void 0&&he(d,pe,S);const v=[...new Set(y.map(N=>N.slice(N.indexOf(" ")+1)))],Z=ge(_),V=Z!==void 0?v.flatMap(N=>Z.get(N)??[]):o.length||$===void 0?void 0:v.flatMap(N=>$.get(N)??[]),vn=V===void 0&&!o.length?b.map(N=>({place:N.place,seen:N.seen,digest:N.digest,bytes:N.bytes()})):o;return{region:s,shard:d,places:S,pairs:y,kept:j,due:vn,key:_,said:V,prior:$,found:Z!==void 0}}),D=be.flatMap(s=>s.said===void 0?s.due.map(d=>({...d,region:s.region})):[]),Qe=c((s,d)=>{for(const S of[...bn].reverse()){const y=Ye(d),j=Ue(y,S,s,he(y,S,[s])).slice(1);if(j.length)return j.map(o=>[r(o,"scope"),r(o,"value")])}return[]},"heldOf");if(D.length&&!E)return q.push(`REFUSE\xB7reader ${e.module} unavailable \xB7 ${D.length} readings remain due`),!1;if(D.length&&!g){for(const y of be){if(y.said!==void 0){U.push(...y.kept,...y.said);continue}for(const j of y.places){const o=Ue(y.shard,p,j,y.prior);U.push(...o.length||pe===void 0?o:Ue(y.shard,pe,j,he(y.shard,pe,y.places)))}}const s=We(n,"pending",p),d=Number((Y(s)??"").split(`
|
|
16
|
+
`)[1]),S=qe(s)&&Date.now()-nn(s).mtimeMs<1800*1e3&&Number.isInteger(d)&&d>0&&pt(d);if(!S){en(Je(s),{recursive:!0});const y=Jn(process.execPath,[...an(),ke("observe"),t,e.module,...Fe(e)===void 0?[]:[Fe(e)]],{cwd:t,detached:!0,stdio:"ignore"});y.unref(),tn(s,`${e.module}
|
|
17
|
+
${y.pid??""}
|
|
18
|
+
`)}return Ve.push({module:e.module,places:D.length}),ee("error",`GREY reading: ${e.module} \xB7 ${D.length} places \xB7 runs behind${S?", already running":""}
|
|
19
|
+
`),z.length&&G(n,u,T,z),Date.now()-l>250&&we.push(`${e.module.split("/").pop()} behind ${Date.now()-l}`),!1}if(D.length){const s=Date.now();let d;try{d=e.capsule!==void 0&&M!==void 0?M.ask(D.map(o=>({protocol:In,verb:"read",rootScope:o.place,region:e.capsule.region,held:Qe(o.place,o.region),files:(e.capsule.reads.some(b=>b.includes("@"))?cn(t,e,$e,Le,o.place):[o.place]).map(b=>({place:b,text:Y(te(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??[]}):nt(f,t,D.map(o=>({place:o.place,...e.kind==="js"?{text:new TextDecoder().decode(o.bytes)}:{},held:Qe(o.place,o.region)})),w)}catch(o){const b=`REFUSE\xB7reader ${e.module} \xB7 ${o instanceof Error?o.message:String(o)}`;return q.push(b),o instanceof ne&&m.push(o),ee("error",`${b}
|
|
20
|
+
`),!1}if(d.every(o=>!o.length)&&!Ze(a.flatMap(o=>{const b=ve(o);return b.kind==="fact"?[b.value.fields]:[]}),e.module)){const o=`REFUSE\xB7reader ${e.module} \xB7 answered none of ${D.length} places \xB7 nothing landed, they stay due`;return q.push(o),ee("error",`${o}
|
|
21
|
+
`),!1}Ne+=D.length,ee("error",`READER ${e.module} \xB7 ${D.length} run \xB7 ${Date.now()-s} ms
|
|
22
|
+
`);const S=new Map;D.forEach((o,b)=>S.set(o.place,(d[b]??[]).map(_=>dt(_,o.digest,p,u))));for(const o of be.filter(b=>b.said===void 0)){const b=new Set(o.due.map(v=>v.place)),$=[...[...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=>S.get(v)??[])];Oe(n,o.key,$),G(n,u,o.region,[...o.kept,Me(u,p,o.region,o.key,o.pairs)]),U.push(...o.kept,...$)}const y=Date.now()-s,j=H(n,new TextEncoder().encode(D.map(o=>o.digest).sort().join(`
|
|
23
|
+
`))).replace(/^sha256:/,"");z.push(Ee({scope:`cost/reader/${e.module}`,role:"writes",form:"interval",measure:"ms",value:`${y}..${y}`,by:`${u}:${p}`,at:`place:${j}`})),k.at(-1)!==p&&z.push(Ee({scope:He(e),role:"writes",form:"alphabet",measure:"identity",value:p,by:`${u}:${p}`,at:`place:${p}`})),_n(We(n,"pending",p),{force:!0})}for(const s of be.filter(d=>d.said!==void 0))s.found||Oe(n,s.key,s.said),(s.shard.keys.get(p)!==s.key||s.kept.some(d=>s.shard.places.get(`${p} ${r(d,"scope")}`)?.line!==d))&&G(n,u,s.region,[...s.kept,Me(u,p,s.region,s.key,s.pairs)]),U.push(...s.kept,...s.said);return z.length&&G(n,u,T,z),Date.now()-l>250&&we.push(`${e.module.split("/").pop()} ${Ke-l}+${Date.now()-Ke}`),P!==void 0&&zn(n,`observed/${P}`,new TextEncoder().encode(U.slice(ye).join(`
|
|
24
|
+
`))),!1}finally{L()}}if(c(yn,"observeOne"),i.preparation)return[];if(we.length&&ee("error",`SPENT observe ${we.join(" \xB7 ")} ms
|
|
25
|
+
`),ie&&rt(n,u),ee("error",`OBSERVE ${Ne} run \xB7 ${de} read by key${Ae?` \xB7 ${Ae} readers kept whole`:""} \xB7 ${Date.now()-wn} ms
|
|
26
|
+
`),g&&q.length){const e=new Set(m.map(l=>l.code));throw m.length===q.length&&e.size===1?new ne(m[0].code,q.join(`
|
|
27
|
+
`)):new Error(q.join(`
|
|
28
|
+
`))}return[...new Set(U)].sort()}c($t,"observedClaims");function ss(t,n,i,m){const g=[];return $t(t,n,{...m?{only:m}:{},preparation:{limits:i,results:g,used:{bytes:0,files:0,readings:0,probes:0}}}),g}c(ss,"prepareObservedReadings");export{ts as carriesOnly,ct as cased,Xt as casesHeld,Kt as isReaderLock,$t as observedClaims,ut as placedReadings,ss as prepareObservedReadings,ns as readerLines,Qt as readerModules,mn as readerReaches,es as readerRefusals,Zt as readersBehind};
|