@amalgm/live 0.2.54 → 0.2.56
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 +6 -0
- package/dist/contracts/binding.d.ts +3 -2
- package/dist/contracts/binding.d.ts.map +1 -1
- package/dist/contracts/deployments.d.ts +39 -0
- package/dist/contracts/deployments.d.ts.map +1 -0
- package/dist/contracts/deployments.js +75 -0
- package/dist/contracts/deployments.js.map +1 -0
- package/dist/contracts/index.d.ts +1 -0
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +1 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/detection/adapter-contract.d.ts +0 -33
- package/dist/detection/adapter-contract.d.ts.map +1 -1
- package/dist/detection/adapter-contract.js +0 -32
- package/dist/detection/adapter-contract.js.map +1 -1
- package/dist/detection/diff.d.ts +5 -87
- package/dist/detection/diff.d.ts.map +1 -1
- package/dist/detection/diff.js +5 -111
- package/dist/detection/diff.js.map +1 -1
- package/dist/detection/enrollment.d.ts +8 -17
- package/dist/detection/enrollment.d.ts.map +1 -1
- package/dist/detection/enrollment.js +8 -73
- package/dist/detection/enrollment.js.map +1 -1
- package/dist/detection/index.d.ts +5 -8
- package/dist/detection/index.d.ts.map +1 -1
- package/dist/detection/index.js +5 -8
- package/dist/detection/index.js.map +1 -1
- package/dist/detection/territory.d.ts +1 -27
- package/dist/detection/territory.d.ts.map +1 -1
- package/dist/detection/territory.js +1 -77
- package/dist/detection/territory.js.map +1 -1
- package/dist/transfer/cargo.d.ts +46 -12
- package/dist/transfer/cargo.d.ts.map +1 -1
- package/dist/transfer/cargo.js +52 -18
- package/dist/transfer/cargo.js.map +1 -1
- package/dist/transfer/download.d.ts +8 -6
- package/dist/transfer/download.d.ts.map +1 -1
- package/dist/transfer/download.js +8 -6
- package/dist/transfer/download.js.map +1 -1
- package/dist/transfer/index.d.ts +2 -1
- package/dist/transfer/index.d.ts.map +1 -1
- package/dist/transfer/index.js +2 -1
- package/dist/transfer/index.js.map +1 -1
- package/dist/transfer/ranges.d.ts +43 -0
- package/dist/transfer/ranges.d.ts.map +1 -0
- package/dist/transfer/ranges.js +109 -0
- package/dist/transfer/ranges.js.map +1 -0
- package/dist/transfer/refs.d.ts +35 -0
- package/dist/transfer/refs.d.ts.map +1 -0
- package/dist/transfer/refs.js +45 -0
- package/dist/transfer/refs.js.map +1 -0
- package/dist-cjs/contracts/deployments.js +81 -0
- package/dist-cjs/contracts/deployments.js.map +1 -0
- package/dist-cjs/contracts/index.js +1 -0
- package/dist-cjs/contracts/index.js.map +1 -1
- package/dist-cjs/detection/adapter-contract.js +1 -34
- package/dist-cjs/detection/adapter-contract.js.map +1 -1
- package/dist-cjs/detection/diff.js +5 -113
- package/dist-cjs/detection/diff.js.map +1 -1
- package/dist-cjs/detection/enrollment.js +9 -75
- package/dist-cjs/detection/enrollment.js.map +1 -1
- package/dist-cjs/detection/index.js +5 -8
- package/dist-cjs/detection/index.js.map +1 -1
- package/dist-cjs/detection/territory.js +1 -79
- package/dist-cjs/detection/territory.js.map +1 -1
- package/dist-cjs/transfer/cargo.js +55 -20
- package/dist-cjs/transfer/cargo.js.map +1 -1
- package/dist-cjs/transfer/download.js +8 -6
- package/dist-cjs/transfer/download.js.map +1 -1
- package/dist-cjs/transfer/index.js +2 -1
- package/dist-cjs/transfer/index.js.map +1 -1
- package/dist-cjs/transfer/ranges.js +114 -0
- package/dist-cjs/transfer/ranges.js.map +1 -0
- package/dist-cjs/transfer/refs.js +49 -0
- package/dist-cjs/transfer/refs.js.map +1 -0
- package/package.json +2 -2
- package/dist/detection/continuity.d.ts +0 -54
- package/dist/detection/continuity.d.ts.map +0 -1
- package/dist/detection/continuity.js +0 -85
- package/dist/detection/continuity.js.map +0 -1
- package/dist/transfer/presign.d.ts +0 -26
- package/dist/transfer/presign.d.ts.map +0 -1
- package/dist/transfer/presign.js +0 -44
- package/dist/transfer/presign.js.map +0 -1
- package/dist-cjs/detection/continuity.js +0 -88
- package/dist-cjs/detection/continuity.js.map +0 -1
- package/dist-cjs/transfer/presign.js +0 -48
- package/dist-cjs/transfer/presign.js.map +0 -1
package/PURPOSE.md
CHANGED
|
@@ -282,6 +282,12 @@ its cutover.
|
|
|
282
282
|
verifies every replaced root from its pages and requires unchanged roots
|
|
283
283
|
to match the committed head exactly. A first head over a records-shaped
|
|
284
284
|
base pages every root because that base carries no page identities.
|
|
285
|
+
43. **Intentional product configuration travels as deployment activation.**
|
|
286
|
+
Products such as Tools and Apps synchronize one durable operation that
|
|
287
|
+
introduces an immutable deployment and advances that stable identity's
|
|
288
|
+
current pointer atomically. Retries never reactivate an older id, prior
|
|
289
|
+
deployments remain addressable, and SQLite rows, WAL pages, locks, and
|
|
290
|
+
offsets remain machine-local materializations rather than sync payloads.
|
|
285
291
|
|
|
286
292
|
## Five surfaces, one behavior
|
|
287
293
|
|
|
@@ -40,9 +40,10 @@ export interface SnapshotContext {
|
|
|
40
40
|
export interface LiveSurface<Snapshot, Operation, Presence = never> {
|
|
41
41
|
readonly contract: string;
|
|
42
42
|
observeEdits(emit: (operation: Operation) => void): () => void;
|
|
43
|
-
|
|
43
|
+
/** Durable surfaces may finish local materialization asynchronously. */
|
|
44
|
+
applyRemote(operation: Operation, context: ApplyContext): void | Promise<void>;
|
|
44
45
|
/** Initial hydration or recovery only — never the normal response to a remote edit. */
|
|
45
|
-
applySnapshot(snapshot: Snapshot, context: SnapshotContext): void
|
|
46
|
+
applySnapshot(snapshot: Snapshot, context: SnapshotContext): void | Promise<void>;
|
|
46
47
|
observePresence?(emit: (presence: Presence | null) => void): () => void;
|
|
47
48
|
applyPresence?(participantId: string, presence: Presence | null): void;
|
|
48
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/contracts/binding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,uHAAuH;AACvH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;AAE9D,uJAAuJ;AACvJ,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,gGAQjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CAAC;CAC3C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,GAAG,KAAK;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,YAAY,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC/D,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/
|
|
1
|
+
{"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/contracts/binding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,uHAAuH;AACvH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;AAE9D,uJAAuJ;AACvJ,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,gGAQjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CAAC;CAC3C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,GAAG,KAAK;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,YAAY,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC/D,wEAAwE;IACxE,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,uFAAuF;IACvF,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElF,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACxE,aAAa,CAAC,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;CACxE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Immutable product deployments over one durable Live channel.
|
|
3
|
+
*
|
|
4
|
+
* Products own the definition carried by a deployment. Live owns the shared
|
|
5
|
+
* envelope law: one activation introduces immutable bytes and advances the
|
|
6
|
+
* subject's head atomically. The previous id records lineage; official
|
|
7
|
+
* channel order, not a client-side compare-and-swap, decides the current head.
|
|
8
|
+
*/
|
|
9
|
+
import { type Checked } from './validate.js';
|
|
10
|
+
export declare const DEPLOYMENT_OPERATION: "deployment.activate";
|
|
11
|
+
export interface LiveDeployment<Definition> {
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly subjectId: string;
|
|
14
|
+
readonly previousDeploymentId: string | null;
|
|
15
|
+
readonly definition: Definition | null;
|
|
16
|
+
readonly createdAt: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DeploymentActivation<Definition> {
|
|
19
|
+
readonly type: typeof DEPLOYMENT_OPERATION;
|
|
20
|
+
readonly deployment: LiveDeployment<Definition>;
|
|
21
|
+
}
|
|
22
|
+
export interface DeploymentSnapshot<Definition> {
|
|
23
|
+
readonly version: 1;
|
|
24
|
+
readonly deployments: Readonly<Record<string, LiveDeployment<Definition>>>;
|
|
25
|
+
readonly heads: Readonly<Record<string, string>>;
|
|
26
|
+
}
|
|
27
|
+
/** Validate the shared envelope. The owning product validates `definition`. */
|
|
28
|
+
export declare function checkDeploymentActivation<Definition>(input: unknown): Checked<DeploymentActivation<Definition>>;
|
|
29
|
+
/**
|
|
30
|
+
* Apply one officially ordered activation.
|
|
31
|
+
*
|
|
32
|
+
* A retry of an already-known deployment is a no-op even if newer operations
|
|
33
|
+
* have since advanced the head. Rollback therefore mints a new deployment;
|
|
34
|
+
* it never reactivates an old id. Reusing an id for different bytes is always
|
|
35
|
+
* corruption and is refused.
|
|
36
|
+
*/
|
|
37
|
+
export declare function applyDeploymentActivation<Definition>(snapshot: DeploymentSnapshot<Definition>, activation: DeploymentActivation<Definition>): DeploymentSnapshot<Definition>;
|
|
38
|
+
export declare function emptyDeploymentSnapshot<Definition>(): DeploymentSnapshot<Definition>;
|
|
39
|
+
//# sourceMappingURL=deployments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../../src/contracts/deployments.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA+C,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAE1F,eAAO,MAAM,oBAAoB,EAAG,qBAA8B,CAAC;AAEnE,MAAM,WAAW,cAAc,CAAC,UAAU;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB,CAAC,UAAU;IAC9C,QAAQ,CAAC,IAAI,EAAE,OAAO,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,kBAAkB,CAAC,UAAU;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3E,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAClD;AAID,+EAA+E;AAC/E,wBAAgB,yBAAyB,CAAC,UAAU,EAClD,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAgB3C;AAcD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAClD,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,EACxC,UAAU,EAAE,oBAAoB,CAAC,UAAU,CAAC,GAC3C,kBAAkB,CAAC,UAAU,CAAC,CAgBhC;AAED,wBAAgB,uBAAuB,CAAC,UAAU,KAAK,kBAAkB,CAAC,UAAU,CAAC,CAMpF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Immutable product deployments over one durable Live channel.
|
|
3
|
+
*
|
|
4
|
+
* Products own the definition carried by a deployment. Live owns the shared
|
|
5
|
+
* envelope law: one activation introduces immutable bytes and advances the
|
|
6
|
+
* subject's head atomically. The previous id records lineage; official
|
|
7
|
+
* channel order, not a client-side compare-and-swap, decides the current head.
|
|
8
|
+
*/
|
|
9
|
+
import { failShape, isNonEmptyString, isRecord, pass } from './validate.js';
|
|
10
|
+
export const DEPLOYMENT_OPERATION = 'deployment.activate';
|
|
11
|
+
const EXAMPLE = '{ type: "deployment.activate", deployment: { id, subjectId, previousDeploymentId, definition, createdAt } }';
|
|
12
|
+
/** Validate the shared envelope. The owning product validates `definition`. */
|
|
13
|
+
export function checkDeploymentActivation(input) {
|
|
14
|
+
if (!isRecord(input) || input.type !== DEPLOYMENT_OPERATION || !isRecord(input.deployment)) {
|
|
15
|
+
return failShape(EXAMPLE, 'the activation envelope was malformed');
|
|
16
|
+
}
|
|
17
|
+
const deployment = input.deployment;
|
|
18
|
+
if (!isNonEmptyString(deployment.id) || !isNonEmptyString(deployment.subjectId)) {
|
|
19
|
+
return failShape(EXAMPLE, 'deployment id and subjectId must be non-empty strings');
|
|
20
|
+
}
|
|
21
|
+
if (deployment.previousDeploymentId !== null
|
|
22
|
+
&& !isNonEmptyString(deployment.previousDeploymentId)) {
|
|
23
|
+
return failShape(EXAMPLE, 'previousDeploymentId must be null or a non-empty string');
|
|
24
|
+
}
|
|
25
|
+
if (!isNonEmptyString(deployment.createdAt)) {
|
|
26
|
+
return failShape(EXAMPLE, 'createdAt must be a non-empty string');
|
|
27
|
+
}
|
|
28
|
+
return pass(input);
|
|
29
|
+
}
|
|
30
|
+
function canonical(value) {
|
|
31
|
+
if (Array.isArray(value))
|
|
32
|
+
return value.map(canonical);
|
|
33
|
+
if (!isRecord(value))
|
|
34
|
+
return value;
|
|
35
|
+
return Object.fromEntries(Object.entries(value)
|
|
36
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
37
|
+
.map(([key, item]) => [key, canonical(item)]));
|
|
38
|
+
}
|
|
39
|
+
function sameDeployment(left, right) {
|
|
40
|
+
return JSON.stringify(canonical(left)) === JSON.stringify(canonical(right));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Apply one officially ordered activation.
|
|
44
|
+
*
|
|
45
|
+
* A retry of an already-known deployment is a no-op even if newer operations
|
|
46
|
+
* have since advanced the head. Rollback therefore mints a new deployment;
|
|
47
|
+
* it never reactivates an old id. Reusing an id for different bytes is always
|
|
48
|
+
* corruption and is refused.
|
|
49
|
+
*/
|
|
50
|
+
export function applyDeploymentActivation(snapshot, activation) {
|
|
51
|
+
const checked = checkDeploymentActivation(activation);
|
|
52
|
+
if (!checked.ok)
|
|
53
|
+
throw new Error(checked.error);
|
|
54
|
+
const deployment = activation.deployment;
|
|
55
|
+
const existing = snapshot.deployments[deployment.id];
|
|
56
|
+
if (existing) {
|
|
57
|
+
if (!sameDeployment(existing, deployment)) {
|
|
58
|
+
throw new Error(`Deployment id is immutable: ${deployment.id}`);
|
|
59
|
+
}
|
|
60
|
+
return snapshot;
|
|
61
|
+
}
|
|
62
|
+
return Object.freeze({
|
|
63
|
+
version: 1,
|
|
64
|
+
deployments: Object.freeze({ ...snapshot.deployments, [deployment.id]: deployment }),
|
|
65
|
+
heads: Object.freeze({ ...snapshot.heads, [deployment.subjectId]: deployment.id }),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
export function emptyDeploymentSnapshot() {
|
|
69
|
+
return Object.freeze({
|
|
70
|
+
version: 1,
|
|
71
|
+
deployments: Object.freeze({}),
|
|
72
|
+
heads: Object.freeze({}),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=deployments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/contracts/deployments.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
|
package/dist/contracts/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
|
|
@@ -101,37 +101,4 @@ export declare function assertAdapter(adapter: unknown): AdapterDescriptor;
|
|
|
101
101
|
* Pure — callers own where the alphabet and adapters come from.
|
|
102
102
|
*/
|
|
103
103
|
export declare function buildTypeMap(adapters: Iterable<unknown>, alphabet: Iterable<string>): Map<string, AdapterDescriptor>;
|
|
104
|
-
/** A failed look at ground, as the host's filesystem reported it. */
|
|
105
|
-
export interface FailedLook {
|
|
106
|
-
readonly code?: string | undefined;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* The three-state vocabulary's one shared judgment: what a FAILED look
|
|
110
|
-
* at ground means. ENOENT and ENOTDIR are the filesystem itself saying
|
|
111
|
-
* "not there" — honest ABSENCE, a fact. Every other failure means the
|
|
112
|
-
* LOOK failed, not the ground — UNSETTLED: no conclusion, read again.
|
|
113
|
-
*
|
|
114
|
-
* Every truth reader classifies through this one function so no reader
|
|
115
|
-
* can invent its own idea of absence: mistaking "could not look" for
|
|
116
|
-
* "not there" is the exact lie axiom 4 forbids. Only present or absent
|
|
117
|
-
* may produce a conclusion.
|
|
118
|
-
*/
|
|
119
|
-
export declare const lookFailed: (error: FailedLook) => {
|
|
120
|
-
readonly truth: "absent";
|
|
121
|
-
} | {
|
|
122
|
-
readonly truth: "unsettled";
|
|
123
|
-
readonly reason: string | undefined;
|
|
124
|
-
};
|
|
125
|
-
/**
|
|
126
|
-
* The managed-reference adapter: Amalgm's OWN link kind, never
|
|
127
|
-
* conflated with a filesystem symlink. Its payload is the target
|
|
128
|
-
* entity's UUID — identity, not an address — and its local rendering as
|
|
129
|
-
* an ordinary symlink is DERIVED state (entity-model.md, symlink
|
|
130
|
-
* section). ASSIGNED, NOT YET OPERATIONAL — and that absence is the
|
|
131
|
-
* honest truth: no rail is bound because the projection lives inside
|
|
132
|
-
* the registration boundary today; its detect socket is ratified from
|
|
133
|
-
* that seam when the projection is extracted, never invented ahead of
|
|
134
|
-
* it.
|
|
135
|
-
*/
|
|
136
|
-
export declare const referenceAdapter: AdapterDescriptor;
|
|
137
104
|
//# sourceMappingURL=adapter-contract.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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
|
|
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"}
|
|
@@ -127,36 +127,4 @@ export function buildTypeMap(adapters, alphabet) {
|
|
|
127
127
|
}
|
|
128
128
|
return byType;
|
|
129
129
|
}
|
|
130
|
-
/**
|
|
131
|
-
* The three-state vocabulary's one shared judgment: what a FAILED look
|
|
132
|
-
* at ground means. ENOENT and ENOTDIR are the filesystem itself saying
|
|
133
|
-
* "not there" — honest ABSENCE, a fact. Every other failure means the
|
|
134
|
-
* LOOK failed, not the ground — UNSETTLED: no conclusion, read again.
|
|
135
|
-
*
|
|
136
|
-
* Every truth reader classifies through this one function so no reader
|
|
137
|
-
* can invent its own idea of absence: mistaking "could not look" for
|
|
138
|
-
* "not there" is the exact lie axiom 4 forbids. Only present or absent
|
|
139
|
-
* may produce a conclusion.
|
|
140
|
-
*/
|
|
141
|
-
export const lookFailed = (error) => error.code === 'ENOENT' || error.code === 'ENOTDIR'
|
|
142
|
-
? { truth: 'absent' }
|
|
143
|
-
: { truth: 'unsettled', reason: error.code };
|
|
144
|
-
/**
|
|
145
|
-
* The managed-reference adapter: Amalgm's OWN link kind, never
|
|
146
|
-
* conflated with a filesystem symlink. Its payload is the target
|
|
147
|
-
* entity's UUID — identity, not an address — and its local rendering as
|
|
148
|
-
* an ordinary symlink is DERIVED state (entity-model.md, symlink
|
|
149
|
-
* section). ASSIGNED, NOT YET OPERATIONAL — and that absence is the
|
|
150
|
-
* honest truth: no rail is bound because the projection lives inside
|
|
151
|
-
* the registration boundary today; its detect socket is ratified from
|
|
152
|
-
* that seam when the projection is extracted, never invented ahead of
|
|
153
|
-
* it.
|
|
154
|
-
*/
|
|
155
|
-
export const referenceAdapter = Object.freeze({
|
|
156
|
-
name: 'reference',
|
|
157
|
-
types: Object.freeze({
|
|
158
|
-
reference: "its target entity's UUID — identity, not an address; the rendered symlink is derived state",
|
|
159
|
-
}),
|
|
160
|
-
rails: Object.freeze({}),
|
|
161
|
-
});
|
|
162
130
|
//# sourceMappingURL=adapter-contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-contract.js","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"adapter-contract.js","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"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"}
|
package/dist/detection/diff.d.ts
CHANGED
|
@@ -5,16 +5,10 @@
|
|
|
5
5
|
* verdicts live here. Ratified by entity-model.md ("Address and
|
|
6
6
|
* physical continuity are the two identity witnesses, never content").
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* absorb that churn.
|
|
13
|
-
* - Directories: physical continuity claims first; the address claims
|
|
14
|
-
* what no inode claims. Nothing replaces a directory's inode in
|
|
15
|
-
* place, so a known inode at a new address IS the directory, moved.
|
|
16
|
-
* - Links: the FILE rules, for the file reason — retarget is unlink +
|
|
17
|
-
* recreate, so the inode churns exactly like an atomic save.
|
|
8
|
+
* Directories order the two witnesses opposite to files: physical
|
|
9
|
+
* continuity claims first and the address claims what no inode claims,
|
|
10
|
+
* because nothing replaces a directory's inode in place. So a known inode
|
|
11
|
+
* at a new address IS the directory, moved.
|
|
18
12
|
*/
|
|
19
13
|
/** One piece of ground's physical identity: device:inode. */
|
|
20
14
|
export interface PhysicalIdentity {
|
|
@@ -26,20 +20,6 @@ export interface Match<Row, Entry> {
|
|
|
26
20
|
readonly row: Row;
|
|
27
21
|
readonly entry: Entry;
|
|
28
22
|
}
|
|
29
|
-
/** Disk truth for one file, as the walk reported it. */
|
|
30
|
-
export interface FileEntry extends PhysicalIdentity {
|
|
31
|
-
readonly relPath: string;
|
|
32
|
-
readonly size: number;
|
|
33
|
-
readonly mtimeMs: number;
|
|
34
|
-
}
|
|
35
|
-
/** Store memory for one file channel. `hashedAtMs` is the instant the bytes were last read. */
|
|
36
|
-
export interface FileRow extends PhysicalIdentity {
|
|
37
|
-
readonly fileId: string;
|
|
38
|
-
readonly relPath: string;
|
|
39
|
-
readonly size: number;
|
|
40
|
-
readonly mtimeMs: number;
|
|
41
|
-
readonly hashedAtMs?: number | null;
|
|
42
|
-
}
|
|
43
23
|
export interface DirEntry extends PhysicalIdentity {
|
|
44
24
|
readonly relPath: string;
|
|
45
25
|
}
|
|
@@ -47,21 +27,11 @@ export interface DirRow extends PhysicalIdentity {
|
|
|
47
27
|
readonly dirId: string;
|
|
48
28
|
readonly relPath: string;
|
|
49
29
|
}
|
|
50
|
-
/** Disk truth for one symlink: the written target text, read at walk time, never followed. */
|
|
51
|
-
export interface LinkEntry extends PhysicalIdentity {
|
|
52
|
-
readonly relPath: string;
|
|
53
|
-
readonly target: string;
|
|
54
|
-
}
|
|
55
|
-
export interface LinkRow extends PhysicalIdentity {
|
|
56
|
-
readonly linkId: string;
|
|
57
|
-
readonly relPath: string;
|
|
58
|
-
readonly target: string;
|
|
59
|
-
}
|
|
60
30
|
/**
|
|
61
31
|
* Physical continuity, shared by every compare function: a row and an
|
|
62
32
|
* entry sharing one device:inode, exactly one match on both sides → the
|
|
63
33
|
* same physical thing. Anything else is never guessed. For files this
|
|
64
|
-
* rescues path-orphans
|
|
34
|
+
* rescues path-orphans; for directories it is the first rule.
|
|
65
35
|
*/
|
|
66
36
|
export declare function matchByInode<Row extends PhysicalIdentity, Entry extends PhysicalIdentity>(rows: readonly Row[], entries: readonly Entry[]): Array<Match<Row, Entry>>;
|
|
67
37
|
export interface DirDiff {
|
|
@@ -89,56 +59,4 @@ export interface DirDiff {
|
|
|
89
59
|
* there is nothing to hash or check.
|
|
90
60
|
*/
|
|
91
61
|
export declare function diffDirState(rows: readonly DirRow[], entries: readonly DirEntry[]): DirDiff;
|
|
92
|
-
export interface LinkDiff {
|
|
93
|
-
readonly changes: Array<Match<LinkRow, LinkEntry>>;
|
|
94
|
-
readonly retags: Array<Match<LinkRow, LinkEntry>>;
|
|
95
|
-
readonly renames: Array<Match<LinkRow, LinkEntry>>;
|
|
96
|
-
readonly creates: LinkEntry[];
|
|
97
|
-
readonly deletes: LinkRow[];
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* The compare function for link channels — the FILE identity rules, for
|
|
101
|
-
* the file reason: a symlink cannot be retargeted in place (retarget is
|
|
102
|
-
* unlink + recreate, so the inode churns exactly like an atomic save),
|
|
103
|
-
* so the path absorbs that churn and claims first; the inode rescues
|
|
104
|
-
* path-orphans (`mv` preserves a symlink's inode). The payload is the
|
|
105
|
-
* target string, already read at walk time. A consequence worth naming:
|
|
106
|
-
* two links exchanging names read as two retargets (path-first),
|
|
107
|
-
* because a link's meaning IS its written address.
|
|
108
|
-
* 1. Path claims the channel: same target = continued (a new inode
|
|
109
|
-
* under an old name with an old target is silent recreation),
|
|
110
|
-
* different target = changed.
|
|
111
|
-
* 2. Inode rescues path-orphans: renames.
|
|
112
|
-
* 3. Leftover entries are creates; leftover rows are deletes.
|
|
113
|
-
*/
|
|
114
|
-
export declare function diffLinkState(rows: readonly LinkRow[], entries: readonly LinkEntry[]): LinkDiff;
|
|
115
|
-
export interface RootDiff {
|
|
116
|
-
/** Files whose content must be read before an event may be claimed. */
|
|
117
|
-
readonly checks: Array<Match<FileRow, FileEntry>>;
|
|
118
|
-
readonly renames: Array<Match<FileRow, FileEntry>>;
|
|
119
|
-
readonly creates: FileEntry[];
|
|
120
|
-
readonly deletes: FileRow[];
|
|
121
|
-
readonly unchanged: number;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* The compare function for file channels — doorbells and rescans both
|
|
125
|
-
* end here. Hashing is deferred — `checks` name the files whose content
|
|
126
|
-
* must be read before an event may be claimed.
|
|
127
|
-
*
|
|
128
|
-
* Identity rules, in order:
|
|
129
|
-
* 1. Path claims the channel. Same rel_path = same file_id, even when
|
|
130
|
-
* the inode changed (atomic saves replace the inode on every
|
|
131
|
-
* write).
|
|
132
|
-
* 2. Inode rescues path-orphans (matchByInode above).
|
|
133
|
-
* 3. Leftover entries are creates; leftover rows are deletes.
|
|
134
|
-
*
|
|
135
|
-
* The single stat-shortcut this layer allows itself: a (size, mtime,
|
|
136
|
-
* inode) triple identical to the stored one is skipped as unchanged —
|
|
137
|
-
* but only when the mtime is strictly older than the moment we last
|
|
138
|
-
* read the bytes (git's "racily clean" rule), and only when nothing
|
|
139
|
-
* pointed at the file. A path named in `mustCheck` (the doorbell said
|
|
140
|
-
* so) is always hashed: timestamps can lie, a delivered watcher event
|
|
141
|
-
* cannot be un-delivered.
|
|
142
|
-
*/
|
|
143
|
-
export declare function diffRootState(rows: readonly FileRow[], entries: readonly FileEntry[], mustCheck?: ReadonlySet<string> | null): RootDiff;
|
|
144
62
|
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/detection/diff.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/detection/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,+DAA+D;AAC/D,MAAM,WAAW,KAAK,CAAC,GAAG,EAAE,KAAK;IAC/B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED,MAAM,WAAW,QAAS,SAAQ,gBAAgB;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,MAAO,SAAQ,gBAAgB;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,SAAS,gBAAgB,EAAE,KAAK,SAAS,gBAAgB,EACvF,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,OAAO,EAAE,SAAS,KAAK,EAAE,GACxB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAc1B;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAwB3F"}
|
package/dist/detection/diff.js
CHANGED
|
@@ -5,22 +5,16 @@
|
|
|
5
5
|
* verdicts live here. Ratified by entity-model.md ("Address and
|
|
6
6
|
* physical continuity are the two identity witnesses, never content").
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* absorb that churn.
|
|
13
|
-
* - Directories: physical continuity claims first; the address claims
|
|
14
|
-
* what no inode claims. Nothing replaces a directory's inode in
|
|
15
|
-
* place, so a known inode at a new address IS the directory, moved.
|
|
16
|
-
* - Links: the FILE rules, for the file reason — retarget is unlink +
|
|
17
|
-
* recreate, so the inode churns exactly like an atomic save.
|
|
8
|
+
* Directories order the two witnesses opposite to files: physical
|
|
9
|
+
* continuity claims first and the address claims what no inode claims,
|
|
10
|
+
* because nothing replaces a directory's inode in place. So a known inode
|
|
11
|
+
* at a new address IS the directory, moved.
|
|
18
12
|
*/
|
|
19
13
|
/**
|
|
20
14
|
* Physical continuity, shared by every compare function: a row and an
|
|
21
15
|
* entry sharing one device:inode, exactly one match on both sides → the
|
|
22
16
|
* same physical thing. Anything else is never guessed. For files this
|
|
23
|
-
* rescues path-orphans
|
|
17
|
+
* rescues path-orphans; for directories it is the first rule.
|
|
24
18
|
*/
|
|
25
19
|
export function matchByInode(rows, entries) {
|
|
26
20
|
const one = (map, key, value) => map.set(key, map.has(key) ? 'many' : value);
|
|
@@ -84,104 +78,4 @@ export function diffDirState(rows, entries) {
|
|
|
84
78
|
deletes: [...rowsByPath.values()],
|
|
85
79
|
};
|
|
86
80
|
}
|
|
87
|
-
/**
|
|
88
|
-
* The compare function for link channels — the FILE identity rules, for
|
|
89
|
-
* the file reason: a symlink cannot be retargeted in place (retarget is
|
|
90
|
-
* unlink + recreate, so the inode churns exactly like an atomic save),
|
|
91
|
-
* so the path absorbs that churn and claims first; the inode rescues
|
|
92
|
-
* path-orphans (`mv` preserves a symlink's inode). The payload is the
|
|
93
|
-
* target string, already read at walk time. A consequence worth naming:
|
|
94
|
-
* two links exchanging names read as two retargets (path-first),
|
|
95
|
-
* because a link's meaning IS its written address.
|
|
96
|
-
* 1. Path claims the channel: same target = continued (a new inode
|
|
97
|
-
* under an old name with an old target is silent recreation),
|
|
98
|
-
* different target = changed.
|
|
99
|
-
* 2. Inode rescues path-orphans: renames.
|
|
100
|
-
* 3. Leftover entries are creates; leftover rows are deletes.
|
|
101
|
-
*/
|
|
102
|
-
export function diffLinkState(rows, entries) {
|
|
103
|
-
const changes = [];
|
|
104
|
-
const retags = [];
|
|
105
|
-
const rowsByPath = new Map(rows.map((row) => [row.relPath, row]));
|
|
106
|
-
const claimedRowIds = new Set();
|
|
107
|
-
const orphanEntries = [];
|
|
108
|
-
for (const entry of entries) {
|
|
109
|
-
const row = rowsByPath.get(entry.relPath);
|
|
110
|
-
if (!row) {
|
|
111
|
-
orphanEntries.push(entry);
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
claimedRowIds.add(row.linkId);
|
|
115
|
-
if (row.target !== entry.target)
|
|
116
|
-
changes.push({ row, entry });
|
|
117
|
-
else if (row.device !== entry.device || row.inode !== entry.inode)
|
|
118
|
-
retags.push({ row, entry });
|
|
119
|
-
}
|
|
120
|
-
const orphanRows = rows.filter((row) => !claimedRowIds.has(row.linkId));
|
|
121
|
-
const renames = matchByInode(orphanRows, orphanEntries);
|
|
122
|
-
const renamedRowIds = new Set(renames.map((pair) => pair.row.linkId));
|
|
123
|
-
const renamedEntries = new Set(renames.map((pair) => pair.entry));
|
|
124
|
-
return {
|
|
125
|
-
changes,
|
|
126
|
-
retags,
|
|
127
|
-
renames,
|
|
128
|
-
creates: orphanEntries.filter((entry) => !renamedEntries.has(entry)),
|
|
129
|
-
deletes: orphanRows.filter((row) => !renamedRowIds.has(row.linkId)),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* The compare function for file channels — doorbells and rescans both
|
|
134
|
-
* end here. Hashing is deferred — `checks` name the files whose content
|
|
135
|
-
* must be read before an event may be claimed.
|
|
136
|
-
*
|
|
137
|
-
* Identity rules, in order:
|
|
138
|
-
* 1. Path claims the channel. Same rel_path = same file_id, even when
|
|
139
|
-
* the inode changed (atomic saves replace the inode on every
|
|
140
|
-
* write).
|
|
141
|
-
* 2. Inode rescues path-orphans (matchByInode above).
|
|
142
|
-
* 3. Leftover entries are creates; leftover rows are deletes.
|
|
143
|
-
*
|
|
144
|
-
* The single stat-shortcut this layer allows itself: a (size, mtime,
|
|
145
|
-
* inode) triple identical to the stored one is skipped as unchanged —
|
|
146
|
-
* but only when the mtime is strictly older than the moment we last
|
|
147
|
-
* read the bytes (git's "racily clean" rule), and only when nothing
|
|
148
|
-
* pointed at the file. A path named in `mustCheck` (the doorbell said
|
|
149
|
-
* so) is always hashed: timestamps can lie, a delivered watcher event
|
|
150
|
-
* cannot be un-delivered.
|
|
151
|
-
*/
|
|
152
|
-
export function diffRootState(rows, entries, mustCheck = null) {
|
|
153
|
-
const checks = [];
|
|
154
|
-
let unchanged = 0;
|
|
155
|
-
const rowsByPath = new Map(rows.map((row) => [row.relPath, row]));
|
|
156
|
-
const claimedRowIds = new Set();
|
|
157
|
-
const orphanEntries = [];
|
|
158
|
-
for (const entry of entries) {
|
|
159
|
-
const row = rowsByPath.get(entry.relPath);
|
|
160
|
-
if (!row) {
|
|
161
|
-
orphanEntries.push(entry);
|
|
162
|
-
continue;
|
|
163
|
-
}
|
|
164
|
-
claimedRowIds.add(row.fileId);
|
|
165
|
-
const statsMatch = row.size === entry.size && row.mtimeMs === entry.mtimeMs && row.inode === entry.inode;
|
|
166
|
-
const provablyBeforeLastRead = typeof row.hashedAtMs === 'number' && entry.mtimeMs < row.hashedAtMs;
|
|
167
|
-
const named = mustCheck !== null && mustCheck.has(entry.relPath);
|
|
168
|
-
if (statsMatch && provablyBeforeLastRead && !named) {
|
|
169
|
-
unchanged += 1;
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
checks.push({ row, entry });
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
const orphanRows = rows.filter((row) => !claimedRowIds.has(row.fileId));
|
|
176
|
-
const renames = matchByInode(orphanRows, orphanEntries);
|
|
177
|
-
const renamedRowIds = new Set(renames.map((pair) => pair.row.fileId));
|
|
178
|
-
const renamedEntries = new Set(renames.map((pair) => pair.entry));
|
|
179
|
-
return {
|
|
180
|
-
checks,
|
|
181
|
-
renames,
|
|
182
|
-
creates: orphanEntries.filter((entry) => !renamedEntries.has(entry)),
|
|
183
|
-
deletes: orphanRows.filter((row) => !renamedRowIds.has(row.fileId)),
|
|
184
|
-
unchanged,
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
81
|
//# sourceMappingURL=diff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/detection/diff.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/detection/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Detection enrollment
|
|
2
|
+
* Detection enrollment policy.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
4
|
+
* User ground enrolls everything except structural local state and paths
|
|
5
|
+
* excluded by its tracked `.amalgmignore`; `.gitignore` never decides Amalgm
|
|
6
|
+
* enrollment, and there are no implicit dependency, dotfile, cache, or secret
|
|
7
|
+
* exclusions. Portable paths already use `/`; a host converts its native
|
|
8
|
+
* separator at the boundary. A literal `\\` is therefore preserved as part of
|
|
9
|
+
* a POSIX filename. The policy is pure strings-in/verdict-out and never
|
|
10
|
+
* inspects disk itself.
|
|
11
11
|
*/
|
|
12
12
|
/** The injected policy shape: relative path in, verdict out. */
|
|
13
13
|
export type EnrollmentPolicy = (relPath: string) => boolean;
|
|
@@ -17,15 +17,6 @@ export type EnrollmentPolicy = (relPath: string) => boolean;
|
|
|
17
17
|
export declare const AMALGM_CONTROL_DIRECTORY = ".amalgm";
|
|
18
18
|
export declare const AMALGM_IGNORE_FILE = ".amalgmignore";
|
|
19
19
|
export declare const DEFAULT_AMALGM_IGNORE = "/.amalgm/\n";
|
|
20
|
-
/**
|
|
21
|
-
* Legacy explicit-registration policy retained for additive API compatibility.
|
|
22
|
-
* Current user-ground Detect must use {@link createUserGroundEnrollmentPolicy};
|
|
23
|
-
* there are no implicit dependency, dotfile, cache, or secret exclusions.
|
|
24
|
-
* Both separators are path separators; '' never enrolls.
|
|
25
|
-
*
|
|
26
|
-
* @deprecated Use `createUserGroundEnrollmentPolicy` for current user ground.
|
|
27
|
-
*/
|
|
28
|
-
export declare const defaultShouldEnroll: EnrollmentPolicy;
|
|
29
20
|
/**
|
|
30
21
|
* One normalized spelling for portable enrollment and ignore matching.
|
|
31
22
|
* Portable relative paths use `/`. Do not reinterpret `\\`: it is a valid,
|