@amalgm/live 0.2.30 → 0.2.32
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/PURPOSE.md +30 -1
- package/README.md +1 -0
- package/dist/apply/content-results.d.ts +26 -0
- package/dist/apply/content-results.d.ts.map +1 -0
- package/dist/apply/content-results.js +52 -0
- package/dist/apply/content-results.js.map +1 -0
- package/dist/apply/contracts.d.ts +191 -0
- package/dist/apply/contracts.d.ts.map +1 -0
- package/dist/apply/contracts.js +47 -0
- package/dist/apply/contracts.js.map +1 -0
- package/dist/apply/index.d.ts +10 -0
- package/dist/apply/index.d.ts.map +1 -0
- package/dist/apply/index.js +10 -0
- package/dist/apply/index.js.map +1 -0
- package/dist/apply/local-work.d.ts +10 -0
- package/dist/apply/local-work.d.ts.map +1 -0
- package/dist/apply/local-work.js +17 -0
- package/dist/apply/local-work.js.map +1 -0
- package/dist/apply/plans.d.ts +14 -0
- package/dist/apply/plans.d.ts.map +1 -0
- package/dist/apply/plans.js +183 -0
- package/dist/apply/plans.js.map +1 -0
- package/dist/apply/rail.d.ts +25 -0
- package/dist/apply/rail.d.ts.map +1 -0
- package/dist/apply/rail.js +304 -0
- package/dist/apply/rail.js.map +1 -0
- package/dist/apply/repository-result.d.ts +25 -0
- package/dist/apply/repository-result.d.ts.map +1 -0
- package/dist/apply/repository-result.js +83 -0
- package/dist/apply/repository-result.js.map +1 -0
- package/dist/apply/selection.d.ts +14 -0
- package/dist/apply/selection.d.ts.map +1 -0
- package/dist/apply/selection.js +63 -0
- package/dist/apply/selection.js.map +1 -0
- package/dist/apply/type-adapters.d.ts +13 -0
- package/dist/apply/type-adapters.d.ts.map +1 -0
- package/dist/apply/type-adapters.js +37 -0
- package/dist/apply/type-adapters.js.map +1 -0
- package/dist/detection/adapter-contract.d.ts +11 -8
- package/dist/detection/adapter-contract.d.ts.map +1 -1
- package/dist/detection/adapter-contract.js +5 -5
- package/dist/detection/adapter-contract.js.map +1 -1
- package/dist/detection/echo.d.ts +1 -1
- package/dist/detection/echo.d.ts.map +1 -1
- package/dist/detection/echo.js +8 -1
- package/dist/detection/echo.js.map +1 -1
- package/dist/detection/territory.d.ts +19 -0
- package/dist/detection/territory.d.ts.map +1 -1
- package/dist/detection/territory.js +50 -0
- package/dist/detection/territory.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/records/rail.d.ts +2 -0
- package/dist/records/rail.d.ts.map +1 -1
- package/dist/records/rail.js +6 -0
- package/dist/records/rail.js.map +1 -1
- package/dist-cjs/apply/content-results.js +57 -0
- package/dist-cjs/apply/content-results.js.map +1 -0
- package/dist-cjs/apply/contracts.js +53 -0
- package/dist-cjs/apply/contracts.js.map +1 -0
- package/dist-cjs/apply/index.js +28 -0
- package/dist-cjs/apply/index.js.map +1 -0
- package/dist-cjs/apply/local-work.js +20 -0
- package/dist-cjs/apply/local-work.js.map +1 -0
- package/dist-cjs/apply/plans.js +187 -0
- package/dist-cjs/apply/plans.js.map +1 -0
- package/dist-cjs/apply/rail.js +308 -0
- package/dist-cjs/apply/rail.js.map +1 -0
- package/dist-cjs/apply/repository-result.js +86 -0
- package/dist-cjs/apply/repository-result.js.map +1 -0
- package/dist-cjs/apply/selection.js +66 -0
- package/dist-cjs/apply/selection.js.map +1 -0
- package/dist-cjs/apply/type-adapters.js +41 -0
- package/dist-cjs/apply/type-adapters.js.map +1 -0
- package/dist-cjs/detection/adapter-contract.js +5 -5
- package/dist-cjs/detection/adapter-contract.js.map +1 -1
- package/dist-cjs/detection/echo.js +8 -1
- package/dist-cjs/detection/echo.js.map +1 -1
- package/dist-cjs/detection/territory.js +51 -0
- package/dist-cjs/detection/territory.js.map +1 -1
- package/dist-cjs/index.js +1 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/records/rail.js +6 -0
- package/dist-cjs/records/rail.js.map +1 -1
- package/package.json +7 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/** Portable proof of one incremental Git Card + Checkpoint transport chain. */
|
|
2
|
+
import { applyRepositoryIdentity, decodeRepositoryTransport, deriveCardId, deriveCheckpointId, deriveStateId, } from '../entities/repo-states.js';
|
|
3
|
+
const portableRepositoryPath = (path) => path.length > 0
|
|
4
|
+
&& !path.startsWith('/')
|
|
5
|
+
&& !path.includes('\0')
|
|
6
|
+
&& path.split('/').every((part) => part !== '' && part !== '.' && part !== '..');
|
|
7
|
+
function assertTransportTruth(state, sha256Hex) {
|
|
8
|
+
const cardId = deriveCardId(state.card, sha256Hex);
|
|
9
|
+
const checkpointId = deriveCheckpointId(state.checkpoint, sha256Hex);
|
|
10
|
+
const stateId = deriveStateId(cardId, checkpointId, sha256Hex);
|
|
11
|
+
if (state.cardId !== cardId || state.checkpointId !== checkpointId || state.stateId !== stateId) {
|
|
12
|
+
throw new Error('repository Apply transport IDs do not describe its Card + Checkpoint');
|
|
13
|
+
}
|
|
14
|
+
if (state.pack !== null && sha256Hex(state.pack.bytes) !== state.pack.sha256) {
|
|
15
|
+
throw new Error('repository Apply Git pack failed verification');
|
|
16
|
+
}
|
|
17
|
+
const paths = new Set();
|
|
18
|
+
for (const file of state.checkpoint.untracked) {
|
|
19
|
+
if (!portableRepositoryPath(file.path) || paths.has(file.path)
|
|
20
|
+
|| !['100644', '100755', '120000'].includes(file.mode)) {
|
|
21
|
+
throw new Error('repository Apply Checkpoint has an invalid untracked path or mode');
|
|
22
|
+
}
|
|
23
|
+
paths.add(file.path);
|
|
24
|
+
if (file.content !== null && sha256Hex(file.content) !== file.sha256) {
|
|
25
|
+
throw new Error(`repository Apply Checkpoint content failed verification for ${file.path}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
for (const entry of state.identityDelta.upsert) {
|
|
29
|
+
if (!portableRepositoryPath(entry.path)) {
|
|
30
|
+
throw new Error('repository Apply identity map has an unsafe path');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (state.identityDelta.remove.some((path) => !portableRepositoryPath(path))) {
|
|
34
|
+
throw new Error('repository Apply identity map has an unsafe removal path');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Verify a sealed transport suffix before a host invokes Git. With a null
|
|
39
|
+
* base the chain must be complete from its reset node. With a durable local
|
|
40
|
+
* base, the first incremental node must name that exact transport frontier.
|
|
41
|
+
*/
|
|
42
|
+
export function prepareRepositoryResult(plan, nodes, base, sha256Hex) {
|
|
43
|
+
if (nodes.length === 0)
|
|
44
|
+
throw new Error('repository Apply transport chain is empty');
|
|
45
|
+
let priorVersion = base.transportVersion;
|
|
46
|
+
let identity = base.identity;
|
|
47
|
+
if ((base.transportVersion === null) !== (base.identity === null)) {
|
|
48
|
+
throw new Error('repository Apply base frontier is incomplete');
|
|
49
|
+
}
|
|
50
|
+
const transports = [];
|
|
51
|
+
for (const node of nodes) {
|
|
52
|
+
if (sha256Hex(node.bytes) !== node.transportVersion) {
|
|
53
|
+
throw new Error('repository Apply transport failed its immutable hash');
|
|
54
|
+
}
|
|
55
|
+
const state = decodeRepositoryTransport(node.bytes);
|
|
56
|
+
if (state.parentTransportVersion !== priorVersion) {
|
|
57
|
+
throw new Error('repository Apply transport chain is discontinuous');
|
|
58
|
+
}
|
|
59
|
+
assertTransportTruth(state, sha256Hex);
|
|
60
|
+
identity = applyRepositoryIdentity(identity, state, sha256Hex);
|
|
61
|
+
transports.push(state);
|
|
62
|
+
priorVersion = node.transportVersion;
|
|
63
|
+
}
|
|
64
|
+
const latest = transports.at(-1);
|
|
65
|
+
if (priorVersion !== plan.transportVersion
|
|
66
|
+
|| latest.parentTransportVersion !== plan.parentTransportVersion
|
|
67
|
+
|| latest.stateId !== plan.stateId
|
|
68
|
+
|| latest.cardId !== plan.cardId
|
|
69
|
+
|| latest.checkpointId !== plan.checkpointId) {
|
|
70
|
+
throw new Error('repository Apply chain does not produce its accepted complete result');
|
|
71
|
+
}
|
|
72
|
+
const missingUntracked = latest.checkpoint.untracked.find((file) => file.content === null);
|
|
73
|
+
if (missingUntracked) {
|
|
74
|
+
throw new Error(`repository Apply Checkpoint omitted untracked content for ${missingUntracked.path}`);
|
|
75
|
+
}
|
|
76
|
+
return Object.freeze({
|
|
77
|
+
transports: Object.freeze(transports),
|
|
78
|
+
latest,
|
|
79
|
+
transportVersion: priorVersion,
|
|
80
|
+
identity: Object.freeze([...identity]),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=repository-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-result.js","sourceRoot":"","sources":["../../src/apply/repository-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Gap-free per-entity Apply selection and complete-result coalescing. */
|
|
2
|
+
import { type AcceptedEntityRecord } from '../records/contracts.js';
|
|
3
|
+
import { type EntityApplyWork } from './contracts.js';
|
|
4
|
+
export interface SelectedEntityApply {
|
|
5
|
+
readonly records: readonly AcceptedEntityRecord[];
|
|
6
|
+
readonly target: AcceptedEntityRecord;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Select the exact target named by a recovering intent, otherwise the newest
|
|
10
|
+
* contiguous complete result. The host may reveal only this target; every
|
|
11
|
+
* earlier selected row becomes resolved after target Verify succeeds.
|
|
12
|
+
*/
|
|
13
|
+
export declare function selectEntityApply(work: EntityApplyWork): SelectedEntityApply;
|
|
14
|
+
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/apply/selection.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAG1E,OAAO,EAA6B,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,mBAAmB,CAmD5E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** Gap-free per-entity Apply selection and complete-result coalescing. */
|
|
2
|
+
import { assertRecord } from '../entities/cloud.js';
|
|
3
|
+
import { checkAcceptedEntityRecord } from '../records/contracts.js';
|
|
4
|
+
import { assertApplyIntent } from './contracts.js';
|
|
5
|
+
/**
|
|
6
|
+
* Select the exact target named by a recovering intent, otherwise the newest
|
|
7
|
+
* contiguous complete result. The host may reveal only this target; every
|
|
8
|
+
* earlier selected row becomes resolved after target Verify succeeds.
|
|
9
|
+
*/
|
|
10
|
+
export function selectEntityApply(work) {
|
|
11
|
+
if (!work.authorityId || !work.entityId
|
|
12
|
+
|| !Number.isSafeInteger(work.resolvedThrough) || work.resolvedThrough < 0
|
|
13
|
+
|| work.records.length === 0) {
|
|
14
|
+
throw new Error('entity Apply work is invalid');
|
|
15
|
+
}
|
|
16
|
+
let expected = work.resolvedThrough + 1;
|
|
17
|
+
for (const record of work.records) {
|
|
18
|
+
const checked = checkAcceptedEntityRecord(record);
|
|
19
|
+
if (!checked.ok)
|
|
20
|
+
throw new Error(checked.error);
|
|
21
|
+
if (record.authorityId !== work.authorityId || record.entityId !== work.entityId) {
|
|
22
|
+
throw new Error('one entity Apply batch cannot cross authority or UUID channels');
|
|
23
|
+
}
|
|
24
|
+
if (record.globalSequence !== expected) {
|
|
25
|
+
throw new Error(`entity Apply work has a gap before sequence ${record.globalSequence}`);
|
|
26
|
+
}
|
|
27
|
+
expected += 1;
|
|
28
|
+
}
|
|
29
|
+
if (work.materialized !== null) {
|
|
30
|
+
const current = assertRecord(work.materialized.record);
|
|
31
|
+
if (current.uuid !== work.entityId
|
|
32
|
+
|| !Number.isSafeInteger(work.materialized.globalSequence)
|
|
33
|
+
|| work.materialized.globalSequence < 1
|
|
34
|
+
|| work.materialized.globalSequence > work.resolvedThrough) {
|
|
35
|
+
throw new Error('entity Apply materialization proof is invalid');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
let through = work.records.at(-1).globalSequence;
|
|
39
|
+
if (work.intent !== null) {
|
|
40
|
+
assertApplyIntent(work.intent);
|
|
41
|
+
if (work.intent.authorityId !== work.authorityId
|
|
42
|
+
|| work.intent.entityId !== work.entityId
|
|
43
|
+
|| work.intent.fromSequence !== work.resolvedThrough) {
|
|
44
|
+
throw new Error('entity Apply intent does not own this work range');
|
|
45
|
+
}
|
|
46
|
+
through = work.intent.throughSequence;
|
|
47
|
+
}
|
|
48
|
+
const index = through - work.resolvedThrough - 1;
|
|
49
|
+
const target = work.records[index];
|
|
50
|
+
if (!target)
|
|
51
|
+
throw new Error('entity Apply intent target is absent from Inbox work');
|
|
52
|
+
if (work.intent !== null
|
|
53
|
+
&& (target.mutationId !== work.intent.targetMutationId
|
|
54
|
+
|| target.resultState !== work.intent.targetState
|
|
55
|
+
|| target.change.result.type !== work.intent.targetType)) {
|
|
56
|
+
throw new Error('entity Apply intent target does not match its retained Inbox record');
|
|
57
|
+
}
|
|
58
|
+
return Object.freeze({
|
|
59
|
+
records: Object.freeze(work.records.slice(0, index + 1)),
|
|
60
|
+
target,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/apply/selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Bridge the canonical entity type registry to the Apply/Verify coordinator. */
|
|
2
|
+
import { type AdapterDescriptor } from '../detection/adapter-contract.js';
|
|
3
|
+
import type { EntityApplyEffectsPort } from './contracts.js';
|
|
4
|
+
export type CaptureLocalEffect = EntityApplyEffectsPort['captureLocal'];
|
|
5
|
+
/**
|
|
6
|
+
* Adapt the already-convicted one-type/one-adapter registry for Apply. The
|
|
7
|
+
* subsystem refuses partial support: every type selected at runtime must bind
|
|
8
|
+
* both complete sockets, never a generic fallback or a path-based guess.
|
|
9
|
+
*/
|
|
10
|
+
export declare function entityApplyEffects(byType: ReadonlyMap<string, AdapterDescriptor>, captureLocal: CaptureLocalEffect): EntityApplyEffectsPort;
|
|
11
|
+
/** Build the universal physical-type registry, refusing any missing type. */
|
|
12
|
+
export declare function buildEntityApplyEffects(adapters: Iterable<unknown>, captureLocal: CaptureLocalEffect): EntityApplyEffectsPort;
|
|
13
|
+
//# sourceMappingURL=type-adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-adapters.d.ts","sourceRoot":"","sources":["../../src/apply/type-adapters.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAExF,OAAO,KAAK,EACV,sBAAsB,EAIvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC9C,YAAY,EAAE,kBAAkB,GAC/B,sBAAsB,CA0BxB;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAC3B,YAAY,EAAE,kBAAkB,GAC/B,sBAAsB,CAExB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Bridge the canonical entity type registry to the Apply/Verify coordinator. */
|
|
2
|
+
import { buildTypeMap } from '../detection/adapter-contract.js';
|
|
3
|
+
import { ENTITY_TYPES, isEntityType } from '../entities/types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Adapt the already-convicted one-type/one-adapter registry for Apply. The
|
|
6
|
+
* subsystem refuses partial support: every type selected at runtime must bind
|
|
7
|
+
* both complete sockets, never a generic fallback or a path-based guess.
|
|
8
|
+
*/
|
|
9
|
+
export function entityApplyEffects(byType, captureLocal) {
|
|
10
|
+
const operational = new Map();
|
|
11
|
+
for (const [type, descriptor] of byType) {
|
|
12
|
+
if (!isEntityType(type)) {
|
|
13
|
+
throw new Error(`Apply adapter registry contains unknown entity type ${JSON.stringify(type)}`);
|
|
14
|
+
}
|
|
15
|
+
const { apply, verify } = descriptor.rails;
|
|
16
|
+
if (!apply || !verify) {
|
|
17
|
+
throw new Error(`adapter ${descriptor.name} cannot Apply ${type} until both Apply and Verify sockets are bound`);
|
|
18
|
+
}
|
|
19
|
+
operational.set(type, Object.freeze({ name: descriptor.name, apply, verify }));
|
|
20
|
+
}
|
|
21
|
+
return Object.freeze({
|
|
22
|
+
adapterFor(type) {
|
|
23
|
+
const adapter = operational.get(type);
|
|
24
|
+
if (!adapter)
|
|
25
|
+
throw new Error(`entity type ${type} has no operational Apply adapter`);
|
|
26
|
+
return adapter;
|
|
27
|
+
},
|
|
28
|
+
captureLocal(intent, plan, position) {
|
|
29
|
+
return captureLocal(intent, plan, position);
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/** Build the universal physical-type registry, refusing any missing type. */
|
|
34
|
+
export function buildEntityApplyEffects(adapters, captureLocal) {
|
|
35
|
+
return entityApplyEffects(buildTypeMap(adapters, ENTITY_TYPES), captureLocal);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=type-adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-adapters.js","sourceRoot":"","sources":["../../src/apply/type-adapters.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAE,YAAY,EAA0B,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AAUnF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA8C,EAC9C,YAAgC;IAEhC,MAAM,WAAW,GAAG,IAAI,GAAG,EAA6C,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,uDAAuD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC;QAC3C,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,CAAC,IAAI,iBAAiB,IAAI,gDAAgD,CAAC,CAAC;QACnH,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,CAAC,IAAgB;YACzB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,mCAAmC,CAAC,CAAC;YACtF,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,YAAY,CACV,MAAyB,EACzB,IAAqB,EACrB,QAA0C;YAE1C,OAAO,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CACrC,QAA2B,EAC3B,YAAgC;IAEhC,OAAO,kBAAkB,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
* rail earns a socket only when a real consumer proves that
|
|
33
33
|
* behavior differs by type — never for symmetry.
|
|
34
34
|
*/
|
|
35
|
+
import type { EntityApplySocket, EntityVerifySocket } from '../apply/contracts.js';
|
|
35
36
|
export type Rail = 'watch' | 'detect' | 'record' | 'send' | 'receive' | 'apply' | 'verify';
|
|
36
37
|
/** The seven rails, declared once, frozen, in journey order. */
|
|
37
38
|
export declare const RAILS: readonly Rail[];
|
|
@@ -49,6 +50,9 @@ export declare const RAILS: readonly Rail[];
|
|
|
49
50
|
export type TruthReading = {
|
|
50
51
|
readonly truth: 'present';
|
|
51
52
|
readonly version: string;
|
|
53
|
+
/** Repository identity transport is exact materialization truth even when
|
|
54
|
+
* Card + Checkpoint logical version is unchanged. */
|
|
55
|
+
readonly transportVersion?: string | null;
|
|
52
56
|
readonly state?: unknown;
|
|
53
57
|
} | {
|
|
54
58
|
readonly truth: 'absent';
|
|
@@ -56,18 +60,16 @@ export type TruthReading = {
|
|
|
56
60
|
readonly truth: 'unsettled';
|
|
57
61
|
readonly reason?: string | undefined;
|
|
58
62
|
};
|
|
59
|
-
/**
|
|
63
|
+
/** Detect's one ratified truth-read socket. */
|
|
60
64
|
export interface DetectSocket {
|
|
61
65
|
readonly truth: (path: string) => TruthReading;
|
|
62
66
|
}
|
|
63
67
|
/**
|
|
64
68
|
* The ratified sockets — for each rail that has one, the exact surfaces
|
|
65
69
|
* every binding adapter implements. Same names, same shapes, every
|
|
66
|
-
* type.
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* verify join only when the Send/Receive rails exist to derive their
|
|
70
|
-
* socket from. A socket is ratified from a real consumer or it is not
|
|
70
|
+
* type. Detect, Apply, and Verify are ratified from their real portable
|
|
71
|
+
* consumers. Watch, Record, Send, and Receive need no type-specific surface
|
|
72
|
+
* at this bar. A socket is ratified from a real consumer or it is not
|
|
71
73
|
* ratified at all.
|
|
72
74
|
*/
|
|
73
75
|
export declare const SOCKETS: Readonly<Partial<Record<Rail, readonly string[]>>>;
|
|
@@ -76,14 +78,15 @@ export declare const SOCKETS: Readonly<Partial<Record<Rail, readonly string[]>>>
|
|
|
76
78
|
*
|
|
77
79
|
* name — the adapter's one name
|
|
78
80
|
* types — { entityType: 'one-sentence source of truth', ... }
|
|
79
|
-
* rails — only rails whose ratified socket the adapter fully
|
|
80
|
-
* implements; detect is the only bindable rail today
|
|
81
|
+
* rails — only rails whose ratified socket the adapter fully implements
|
|
81
82
|
*/
|
|
82
83
|
export interface AdapterDescriptor {
|
|
83
84
|
readonly name: string;
|
|
84
85
|
readonly types: Readonly<Record<string, string>>;
|
|
85
86
|
readonly rails: {
|
|
86
87
|
readonly detect?: DetectSocket;
|
|
88
|
+
readonly apply?: EntityApplySocket;
|
|
89
|
+
readonly verify?: EntityVerifySocket;
|
|
87
90
|
};
|
|
88
91
|
}
|
|
89
92
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-contract.d.ts","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3F,gEAAgE;AAChE,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAE/B,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GACpB;
|
|
1
|
+
{"version":3,"file":"adapter-contract.d.ts","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEnF,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3F,gEAAgE;AAChE,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAE/B,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GACpB;IACA,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;yDACqD;IACrD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,GACC;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE1E,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;CAChD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAIrE,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;QAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;QACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;KACtC,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CA6CjE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAC3B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GACzB,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAsBhC;AAED,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,UAAU,KAChB;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAGpD,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,iBAM7B,CAAC"}
|
|
@@ -39,15 +39,15 @@ export const RAILS = Object.freeze([
|
|
|
39
39
|
/**
|
|
40
40
|
* The ratified sockets — for each rail that has one, the exact surfaces
|
|
41
41
|
* every binding adapter implements. Same names, same shapes, every
|
|
42
|
-
* type.
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* verify join only when the Send/Receive rails exist to derive their
|
|
46
|
-
* socket from. A socket is ratified from a real consumer or it is not
|
|
42
|
+
* type. Detect, Apply, and Verify are ratified from their real portable
|
|
43
|
+
* consumers. Watch, Record, Send, and Receive need no type-specific surface
|
|
44
|
+
* at this bar. A socket is ratified from a real consumer or it is not
|
|
47
45
|
* ratified at all.
|
|
48
46
|
*/
|
|
49
47
|
export const SOCKETS = Object.freeze({
|
|
50
48
|
detect: Object.freeze(['truth']),
|
|
49
|
+
apply: Object.freeze(['prepare', 'guard', 'reveal', 'discard']),
|
|
50
|
+
verify: Object.freeze(['verify']),
|
|
51
51
|
});
|
|
52
52
|
/**
|
|
53
53
|
* Convict a malformed adapter descriptor loudly; return it (typed)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-contract.js","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;
|
|
1
|
+
{"version":3,"file":"adapter-contract.js","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"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"}
|
package/dist/detection/echo.d.ts
CHANGED
|
@@ -16,5 +16,5 @@ export type EchoDecision = {
|
|
|
16
16
|
readonly kind: 'retry';
|
|
17
17
|
readonly reason?: string | undefined;
|
|
18
18
|
};
|
|
19
|
-
export declare function echoDecision(notebook: Pick<CloudEntityRecord, 'status' | 'version'>, observed: TruthReading): EchoDecision;
|
|
19
|
+
export declare function echoDecision(notebook: Pick<CloudEntityRecord, 'status' | 'version' | 'transportVersion'>, observed: TruthReading): EchoDecision;
|
|
20
20
|
//# sourceMappingURL=echo.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"echo.d.ts","sourceRoot":"","sources":["../../src/detection/echo.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAErE,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"echo.d.ts","sourceRoot":"","sources":["../../src/detection/echo.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAErE,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CAAC,EAC5E,QAAQ,EAAE,YAAY,GACrB,YAAY,CAmBd"}
|
package/dist/detection/echo.js
CHANGED
|
@@ -13,7 +13,14 @@ export function echoDecision(notebook, observed) {
|
|
|
13
13
|
: { kind: 'retry', reason: observed.reason };
|
|
14
14
|
}
|
|
15
15
|
if (notebook.status === 'active') {
|
|
16
|
-
|
|
16
|
+
const exactTransport = notebook.transportVersion === null
|
|
17
|
+
? observed.truth === 'present'
|
|
18
|
+
&& (observed.transportVersion === undefined || observed.transportVersion === null)
|
|
19
|
+
: observed.truth === 'present'
|
|
20
|
+
&& observed.transportVersion === notebook.transportVersion;
|
|
21
|
+
return observed.truth === 'present'
|
|
22
|
+
&& observed.version === notebook.version
|
|
23
|
+
&& exactTransport
|
|
17
24
|
? { kind: 'silence' }
|
|
18
25
|
: { kind: 'detect' };
|
|
19
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"echo.js","sourceRoot":"","sources":["../../src/detection/echo.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,UAAU,YAAY,CAC1B,
|
|
1
|
+
{"version":3,"file":"echo.js","sourceRoot":"","sources":["../../src/detection/echo.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,UAAU,YAAY,CAC1B,QAA4E,EAC5E,QAAsB;IAEtB,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,MAAM,KAAK,SAAS;YAClC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;YACnB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,gBAAgB,KAAK,IAAI;YACvD,CAAC,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS;mBACzB,CAAC,QAAQ,CAAC,gBAAgB,KAAK,SAAS,IAAI,QAAQ,CAAC,gBAAgB,KAAK,IAAI,CAAC;YACpF,CAAC,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS;mBACzB,QAAQ,CAAC,gBAAgB,KAAK,QAAQ,CAAC,gBAAgB,CAAC;QAC/D,OAAO,QAAQ,CAAC,KAAK,KAAK,SAAS;eAC9B,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;eACrC,cAAc;YACjB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;YACrB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAChF,CAAC"}
|
|
@@ -10,6 +10,25 @@ export interface RepositoryRecorderTarget {
|
|
|
10
10
|
readonly resourceId: string;
|
|
11
11
|
}
|
|
12
12
|
export type RecorderTarget = EntityRecorderTarget | RepositoryRecorderTarget;
|
|
13
|
+
export interface RepositoryTerritoryNode {
|
|
14
|
+
readonly uuid: string;
|
|
15
|
+
readonly type: CloudEntityRecord['type'];
|
|
16
|
+
readonly parentUUID: string | null;
|
|
17
|
+
}
|
|
18
|
+
export interface RepositoryTerritoryIndex<Node extends RepositoryTerritoryNode> {
|
|
19
|
+
/** The nearest repository strictly above this node; nested repositories win. */
|
|
20
|
+
ownerOf(node: Node): Node | null;
|
|
21
|
+
/** Every node whose nearest repository owner is this UUID. */
|
|
22
|
+
ownedBy(repositoryId: string): readonly Node[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Index nearest-repository territory once for a complete or boundary-trimmed
|
|
26
|
+
* graph. Hosts use this when one scan needs ownership for every row: repeated
|
|
27
|
+
* ancestor searches or path filters turn large repositories quadratic. A
|
|
28
|
+
* parent outside the supplied graph is the boundary and therefore has no
|
|
29
|
+
* owner in this index.
|
|
30
|
+
*/
|
|
31
|
+
export declare function indexRepositoryTerritory<Node extends RepositoryTerritoryNode>(nodes: readonly Node[]): RepositoryTerritoryIndex<Node>;
|
|
13
32
|
export interface RecorderTransition {
|
|
14
33
|
readonly base: Pick<CloudEntityRecord, 'uuid' | 'type' | 'parentUUID' | 'name' | 'status'> | null;
|
|
15
34
|
readonly result: Pick<CloudEntityRecord, 'uuid' | 'type' | 'parentUUID' | 'name' | 'status'>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"territory.d.ts","sourceRoot":"","sources":["../../src/detection/territory.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,wBAAwB,CAAC;AAE7E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;IAClG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;CAC9F;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAC/B,SAAS,GAAG,IAAI,CAYlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,kBAAkB,EAC9B,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAC/B,SAAS,cAAc,EAAE,CA+C3B"}
|
|
1
|
+
{"version":3,"file":"territory.d.ts","sourceRoot":"","sources":["../../src/detection/territory.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,wBAAwB,CAAC;AAE7E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB,CAAC,IAAI,SAAS,uBAAuB;IAC5E,gFAAgF;IAChF,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,8DAA8D;IAC9D,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,IAAI,EAAE,CAAC;CAChD;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,SAAS,uBAAuB,EAC3E,KAAK,EAAE,SAAS,IAAI,EAAE,GACrB,wBAAwB,CAAC,IAAI,CAAC,CAuChC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;IAClG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;CAC9F;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAC/B,SAAS,GAAG,IAAI,CAYlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,kBAAkB,EAC9B,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,GAC/B,SAAS,cAAc,EAAE,CA+C3B"}
|
|
@@ -1,4 +1,54 @@
|
|
|
1
1
|
/** Nearest-repository ownership for one detected entity transition. */
|
|
2
|
+
/**
|
|
3
|
+
* Index nearest-repository territory once for a complete or boundary-trimmed
|
|
4
|
+
* graph. Hosts use this when one scan needs ownership for every row: repeated
|
|
5
|
+
* ancestor searches or path filters turn large repositories quadratic. A
|
|
6
|
+
* parent outside the supplied graph is the boundary and therefore has no
|
|
7
|
+
* owner in this index.
|
|
8
|
+
*/
|
|
9
|
+
export function indexRepositoryTerritory(nodes) {
|
|
10
|
+
const byUuid = new Map();
|
|
11
|
+
for (const node of nodes) {
|
|
12
|
+
if (byUuid.has(node.uuid))
|
|
13
|
+
throw new Error(`repository territory has duplicate ${node.uuid}`);
|
|
14
|
+
byUuid.set(node.uuid, node);
|
|
15
|
+
}
|
|
16
|
+
const owners = new Map();
|
|
17
|
+
const resolving = new Set();
|
|
18
|
+
const resolve = (node) => {
|
|
19
|
+
if (owners.has(node.uuid))
|
|
20
|
+
return owners.get(node.uuid) ?? null;
|
|
21
|
+
if (resolving.has(node.uuid)) {
|
|
22
|
+
throw new Error(`repository territory has a parent cycle at ${node.uuid}`);
|
|
23
|
+
}
|
|
24
|
+
resolving.add(node.uuid);
|
|
25
|
+
const parent = node.parentUUID === null ? null : byUuid.get(node.parentUUID) ?? null;
|
|
26
|
+
const owner = parent === null
|
|
27
|
+
? null
|
|
28
|
+
: parent.type === 'repo.git' ? parent : resolve(parent);
|
|
29
|
+
resolving.delete(node.uuid);
|
|
30
|
+
owners.set(node.uuid, owner);
|
|
31
|
+
return owner;
|
|
32
|
+
};
|
|
33
|
+
const owned = new Map();
|
|
34
|
+
for (const node of nodes) {
|
|
35
|
+
const owner = resolve(node);
|
|
36
|
+
if (!owner)
|
|
37
|
+
continue;
|
|
38
|
+
const group = owned.get(owner.uuid) ?? [];
|
|
39
|
+
group.push(node);
|
|
40
|
+
owned.set(owner.uuid, group);
|
|
41
|
+
}
|
|
42
|
+
return Object.freeze({
|
|
43
|
+
ownerOf: (node) => {
|
|
44
|
+
if (byUuid.get(node.uuid) !== node) {
|
|
45
|
+
throw new Error(`repository territory does not contain ${node.uuid}`);
|
|
46
|
+
}
|
|
47
|
+
return owners.get(node.uuid) ?? null;
|
|
48
|
+
},
|
|
49
|
+
ownedBy: (repositoryId) => Object.freeze([...(owned.get(repositoryId) ?? [])]),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
2
52
|
/** The nearest repo at or above `uuid`; nested repositories win. */
|
|
3
53
|
export function nearestRepository(uuid, byUuid) {
|
|
4
54
|
const seen = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"territory.js","sourceRoot":"","sources":["../../src/detection/territory.ts"],"names":[],"mappings":"AAAA,uEAAuE;
|
|
1
|
+
{"version":3,"file":"territory.js","sourceRoot":"","sources":["../../src/detection/territory.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export * from './entities/index.js';
|
|
|
15
15
|
export * from './watching/index.js';
|
|
16
16
|
export * from './detection/index.js';
|
|
17
17
|
export * from './records/index.js';
|
|
18
|
+
export * from './apply/index.js';
|
|
18
19
|
export * from './registration/index.js';
|
|
19
20
|
export * from './files/index.js';
|
|
20
21
|
export * from './transfer/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,7 @@ export * from './entities/index.js';
|
|
|
15
15
|
export * from './watching/index.js';
|
|
16
16
|
export * from './detection/index.js';
|
|
17
17
|
export * from './records/index.js';
|
|
18
|
+
export * from './apply/index.js';
|
|
18
19
|
export * from './registration/index.js';
|
|
19
20
|
export * from './files/index.js';
|
|
20
21
|
export * from './transfer/index.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
package/dist/records/rail.d.ts
CHANGED
|
@@ -73,6 +73,8 @@ export interface EntityRecordRailOptions {
|
|
|
73
73
|
readonly cargo: EntityRecordCargoPort;
|
|
74
74
|
readonly authority: EntityRecordAuthorityPort;
|
|
75
75
|
readonly schedule: EntityRecordSchedulePort;
|
|
76
|
+
/** Payload-free local doorbell emitted only after Receive commits Inbox truth. */
|
|
77
|
+
readonly onInboxCommitted?: () => void;
|
|
76
78
|
readonly onBackgroundError?: (error: unknown) => void;
|
|
77
79
|
}
|
|
78
80
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rail.d.ts","sourceRoot":"","sources":["../../src/records/rail.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rail.d.ts","sourceRoot":"","sources":["../../src/records/rail.ts"],"names":[],"mappings":"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"}
|
package/dist/records/rail.js
CHANGED
|
@@ -13,6 +13,7 @@ export class EntityRecordRail {
|
|
|
13
13
|
#cargo;
|
|
14
14
|
#authority;
|
|
15
15
|
#schedule;
|
|
16
|
+
#onInboxCommitted;
|
|
16
17
|
#onBackgroundError;
|
|
17
18
|
#started = false;
|
|
18
19
|
#stopped = false;
|
|
@@ -32,6 +33,7 @@ export class EntityRecordRail {
|
|
|
32
33
|
this.#cargo = options.cargo;
|
|
33
34
|
this.#authority = options.authority;
|
|
34
35
|
this.#schedule = options.schedule;
|
|
36
|
+
this.#onInboxCommitted = options.onInboxCommitted ?? (() => undefined);
|
|
35
37
|
this.#onBackgroundError = options.onBackgroundError ?? (() => undefined);
|
|
36
38
|
}
|
|
37
39
|
/** Subscribe first, catch up from the durable cursor, then drain local work. */
|
|
@@ -171,6 +173,8 @@ export class EntityRecordRail {
|
|
|
171
173
|
deliveries,
|
|
172
174
|
advanceDeliveryCursor: true,
|
|
173
175
|
});
|
|
176
|
+
if (stored.kind === 'stored')
|
|
177
|
+
this.#onInboxCommitted();
|
|
174
178
|
if (stored.kind === 'gap') {
|
|
175
179
|
const missing = await this.#authority.backfill({
|
|
176
180
|
authorityId: this.#authorityId,
|
|
@@ -189,6 +193,7 @@ export class EntityRecordRail {
|
|
|
189
193
|
if (repaired.kind === 'gap') {
|
|
190
194
|
throw new Error(`entity ${repaired.gap.entityId} history remained gapped after backfill`);
|
|
191
195
|
}
|
|
196
|
+
this.#onInboxCommitted();
|
|
192
197
|
stored = await this.#store.receive({
|
|
193
198
|
authorityId: this.#authorityId,
|
|
194
199
|
deliveries,
|
|
@@ -197,6 +202,7 @@ export class EntityRecordRail {
|
|
|
197
202
|
if (stored.kind === 'gap') {
|
|
198
203
|
throw new Error(`entity ${stored.gap.entityId} history did not reach ${stored.gap.received}`);
|
|
199
204
|
}
|
|
205
|
+
this.#onInboxCommitted();
|
|
200
206
|
}
|
|
201
207
|
after = stored.deliveryCursor;
|
|
202
208
|
if (deliveries.length < ENTITY_RECORD_DELIVERY_LIMIT)
|