@amalgm/shell 0.1.44 → 0.1.45

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 CHANGED
@@ -303,9 +303,11 @@ shell only assembles.
303
303
  unrelated coverage. The portable registry head remains one atomic graph.
304
304
 
305
305
  35. **Portable path grammar becomes a native path only at the host boundary.**
306
- Core and Live may describe paths with `/`; before Shell performs a
307
- filesystem effect it resolves that grammar with the host platform's path
308
- semantics. Durable records may never mix separators accidentally.
306
+ Core and Live describe path components with `/`; Shell performs portable
307
+ parent and name operations with that grammar, preserving `\\` as a literal
308
+ character, and only then resolves those components with the host platform's
309
+ path semantics for a filesystem effect. Durable records never rewrite or
310
+ mix separators accidentally.
309
311
 
310
312
  36. **Git materialization reproduces Card bytes independently of machine
311
313
  preferences.** A repository created by Add disables receiver-global line
@@ -340,7 +342,7 @@ shell only assembles.
340
342
 
341
343
  42. **Record commits evidence before Watch settles.** The host reconciles a
342
344
  Watch generation against one last-verified detection notebook, writes the
343
- exact portable Detect proposals into the existing cloud outbox, and
345
+ exact portable Detect proposals into the one mutation journal, and
344
346
  advances that notebook in the same SQLite transaction. The materialized
345
347
  `entities` table contains only ground present on this machine; the notebook
346
348
  may retain the UUID and last verified evidence for missing ground so an
@@ -354,19 +356,20 @@ shell only assembles.
354
356
  43. **One Detect job proves one finite Watch generation.** A scheduled pass or
355
357
  explicit flush observes and settles only the generations it froze before
356
358
  reading truth. A ring received during that read remains pending and owns a
357
- later debounced pass, even when its timer fires while the older generation
358
- is still scanning or uploading; no caller waits for the operating system
359
+ later bounded pass, even when its timer fires while the older generation
360
+ is still observing; no caller waits for the operating system
359
361
  to become globally silent. This keeps duplicate or continuous native
360
362
  callbacks from making an otherwise complete Record operation unbounded
361
363
  without dropping any suspicion.
362
364
 
363
- 44. **Detect indexes each observed graph once.** Repository ownership and
364
- identity reconciliation reuse one UUID index for the complete batch;
365
- planning a no-op generation is linear in the entity graph, never one full
366
- graph rebuild per entity. Record advances only notebook rows whose accepted
367
- evidence changed rather than rewriting the entire accepted graph. Large
368
- existing ground therefore cannot hold a small new Register behind
369
- quadratic planning or unrelated SQLite writes.
365
+ 44. **Named Detect is independent of workspace size.** Shell holds one
366
+ prepared SQLite owner for the live Detect runtime. A named path uses one
367
+ indexed row, its parent chain, one stat, changed bytes when required, and
368
+ one transaction. Structural work widens only to the affected subtree;
369
+ repository work widens only to its Card + Checkpoint territory. Nameless,
370
+ invalid, startup, and failed-coverage evidence alone may enter complete
371
+ reconciliation. No named Detect pass serializes a workspace snapshot or
372
+ enters Send; the exact journal row is its terminal output.
370
373
 
371
374
  ## Relationship to amalgm-engine
372
375
 
@@ -0,0 +1,3 @@
1
+ /** Byte-exact JSON codec for the one durable mutation journal. */
2
+ export declare const encodeMutationOperation: (value: unknown) => string;
3
+ export declare const decodeMutationOperation: (json: string) => unknown;
@@ -0,0 +1,34 @@
1
+ /** Byte-exact JSON codec for the one durable mutation journal. */
2
+ import { stableJson } from "@amalgm/live";
3
+ const BYTES = "$amalgmBytesBase64";
4
+ const encodeValue = (value) => {
5
+ if (value instanceof Uint8Array) {
6
+ return { [BYTES]: Buffer.from(value).toString("base64") };
7
+ }
8
+ if (Array.isArray(value))
9
+ return value.map(encodeValue);
10
+ if (value && typeof value === "object") {
11
+ return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, encodeValue(child)]));
12
+ }
13
+ return value;
14
+ };
15
+ const decodeValue = (value) => {
16
+ if (Array.isArray(value))
17
+ return value.map(decodeValue);
18
+ if (value && typeof value === "object") {
19
+ const object = value;
20
+ if (Object.keys(object).length === 1 && typeof object[BYTES] === "string") {
21
+ const encoded = object[BYTES];
22
+ const bytes = Buffer.from(encoded, "base64");
23
+ if (bytes.toString("base64") !== encoded) {
24
+ throw new Error("mutation journal contains invalid byte encoding");
25
+ }
26
+ return new Uint8Array(bytes);
27
+ }
28
+ return Object.fromEntries(Object.entries(object).map(([key, child]) => [key, decodeValue(child)]));
29
+ }
30
+ return value;
31
+ };
32
+ export const encodeMutationOperation = (value) => stableJson(encodeValue(value));
33
+ export const decodeMutationOperation = (json) => decodeValue(JSON.parse(json));
34
+ //# sourceMappingURL=journal-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-codec.js","sourceRoot":"","sources":["../../src/detection/journal-codec.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,KAAK,GAAG,oBAAoB,CAAC;AAEnC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE;IAC9C,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5D,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1E,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,OAAO,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;AAElG,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC"}
@@ -4,13 +4,31 @@
4
4
  * It only binds already-observed ground to durable UUIDs and asks Live to
5
5
  * plan the exact Watch generation that Record may accept.
6
6
  */
7
- import { type CloudEntityRecord, type DetectionBatchPlan, type EntityType, type ReplayInstruction, type SuspicionSnapshot } from "@amalgm/live";
7
+ import { type CloudEntityRecord, type DetectionBatchPlan, type EntityType, type ReplayInstruction, type SuspicionSnapshot, type TextReplay } from "@amalgm/live";
8
+ /**
9
+ * Choose an exact text replay from cache evidence. The notebook's base head
10
+ * is logical history; cached base bytes are only an optional delta input.
11
+ * Missing or mismatched base bytes therefore select a verified snapshot
12
+ * without rewriting the known base to null.
13
+ */
14
+ export declare function exactTextReplay(input: {
15
+ readonly entityId: string;
16
+ readonly basePayloadVersion: string | null;
17
+ readonly baseBytes: Uint8Array | null;
18
+ readonly resultPayloadVersion: string;
19
+ readonly resultBytes: Uint8Array;
20
+ readonly sha256Hex: (bytes: Uint8Array | string) => string;
21
+ }): TextReplay;
8
22
  export interface IdentityRow {
9
23
  readonly uuid: string;
10
24
  readonly type: EntityType;
11
25
  readonly relativePath: string;
12
26
  readonly deviceNumber: number;
13
27
  readonly inode: number;
28
+ /** False when the notebook retained missing evidence from an earlier batch.
29
+ * Such a row may still claim its exact address, but inode reuse cannot prove
30
+ * a new move from ground that was already absent before this observation. */
31
+ readonly physicalContinuity?: boolean;
14
32
  }
15
33
  export interface IdentityEntry {
16
34
  /** Stable only for this observation; never leaves the host. */
@@ -4,7 +4,35 @@
4
4
  * It only binds already-observed ground to durable UUIDs and asks Live to
5
5
  * plan the exact Watch generation that Record may accept.
6
6
  */
7
- import { CONTAINERS, detectionBatch, diffDirState, enclosedByRepositoryAncestor, matchByInode, planDetectionBatch, } from "@amalgm/live";
7
+ import { CONTAINERS, captureTextChange, detectionBatch, diffDirState, enclosedByRepositoryAncestor, matchByInode, planDetectionBatch, } from "@amalgm/live";
8
+ /**
9
+ * Choose an exact text replay from cache evidence. The notebook's base head
10
+ * is logical history; cached base bytes are only an optional delta input.
11
+ * Missing or mismatched base bytes therefore select a verified snapshot
12
+ * without rewriting the known base to null.
13
+ */
14
+ export function exactTextReplay(input) {
15
+ if (input.sha256Hex(input.resultBytes) !== input.resultPayloadVersion) {
16
+ throw new Error("text result cache does not match its declared content head");
17
+ }
18
+ const verifiedBase = input.basePayloadVersion !== null
19
+ && input.baseBytes !== null
20
+ && input.sha256Hex(input.baseBytes) === input.basePayloadVersion
21
+ ? input.baseBytes
22
+ : null;
23
+ if (input.basePayloadVersion === null || verifiedBase !== null) {
24
+ const captured = captureTextChange(input.entityId, verifiedBase, input.resultBytes, input.sha256Hex);
25
+ if (captured !== null)
26
+ return captured.replay;
27
+ }
28
+ return {
29
+ kind: "file.text",
30
+ mode: "snapshot",
31
+ basePayloadVersion: input.basePayloadVersion,
32
+ resultPayloadVersion: input.resultPayloadVersion,
33
+ delta: null,
34
+ };
35
+ }
8
36
  /**
9
37
  * Resolve one observation against the last notebook. Directories claim by
10
38
  * unique physical continuity first; files and links claim their address
@@ -28,7 +56,7 @@ export function reconcileGroundUUIDs(rows, entries) {
28
56
  }
29
57
  const availableRows = () => rows.filter((row) => !claimed.has(row.uuid));
30
58
  const availableEntries = () => entries.filter((entry) => !resolved.has(entry.key));
31
- const directoryRows = availableRows().filter((row) => CONTAINERS.has(row.type));
59
+ const directoryRows = availableRows().filter((row) => CONTAINERS.has(row.type) && row.physicalContinuity !== false);
32
60
  const directoryEntries = availableEntries().filter((entry) => CONTAINERS.has(entry.type));
33
61
  const directoryEntryByPath = new Map(directoryEntries.map((entry) => [entry.relativePath, entry]));
34
62
  const directories = diffDirState(directoryRows.map((row) => ({
@@ -54,7 +82,7 @@ export function reconcileGroundUUIDs(rows, entries) {
54
82
  if (row)
55
83
  claim(entry, row.uuid);
56
84
  }
57
- const physicalRows = availableRows().filter((row) => !CONTAINERS.has(row.type));
85
+ const physicalRows = availableRows().filter((row) => !CONTAINERS.has(row.type) && row.physicalContinuity !== false);
58
86
  const physicalEntries = availableEntries().filter((entry) => !CONTAINERS.has(entry.type));
59
87
  for (const match of matchByInode(physicalRows.map((row) => ({
60
88
  row,
@@ -121,4 +149,4 @@ export function planGroundDetection(input) {
121
149
  throw new Error(`Detect plan for ${input.rootId} failed (${candidates}${remainder}): ${message}`);
122
150
  }
123
151
  }
124
- //# sourceMappingURL=detection-host.js.map
152
+ //# sourceMappingURL=portable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable.js","sourceRoot":"","sources":["../../src/detection/portable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The named Detect lane.
3
+ *
4
+ * A watcher path that still names enrolled, non-repository ground does not
5
+ * justify a workspace walk. This runtime holds one SQLite connection,
6
+ * resolves indexed paths, widens only to a named new folder's subtree, and
7
+ * commits exact Live proposals plus local truth in one transaction. Evidence
8
+ * it cannot prove is declined before mutation and goes to reconciliation in
9
+ * the owning host.
10
+ */
11
+ import { type SuspicionSnapshot } from "@amalgm/live";
12
+ export interface NamedObservation {
13
+ readonly directory: string;
14
+ readonly suspicion: SuspicionSnapshot;
15
+ }
16
+ export interface NamedDetectEvidence {
17
+ readonly directory: string;
18
+ readonly paths: number;
19
+ readonly metadataReads: number;
20
+ readonly contentReads: number;
21
+ readonly plannedRows: number;
22
+ readonly records: number;
23
+ readonly journalBytes: number;
24
+ readonly durationMs: number;
25
+ }
26
+ export interface NamedDetectResult {
27
+ readonly handled: boolean;
28
+ readonly evidence: readonly NamedDetectEvidence[];
29
+ }
30
+ /** One persistent, prepared Detect store. It owns no Watch or Send behavior. */
31
+ export declare class NamedDetectRuntime {
32
+ private readonly database;
33
+ private readonly cacheDir;
34
+ private readonly userRoot;
35
+ private readonly rootAtDirectory;
36
+ private readonly rowAtPath;
37
+ private readonly rowAtUuid;
38
+ private readonly rowsAtPhysicalIdentity;
39
+ private readonly notebookChildren;
40
+ private readonly materializedByUuid;
41
+ private readonly materializedUnderPath;
42
+ private readonly writeEntity;
43
+ private readonly writeNotebook;
44
+ private readonly appendMutation;
45
+ private readonly removeEntity;
46
+ private userPolicy;
47
+ constructor(databaseFile: string, cacheDir: string, userRoot: string);
48
+ close(): void;
49
+ refreshEnrollmentPolicy(): void;
50
+ detect(observations: readonly NamedObservation[]): Promise<NamedDetectResult>;
51
+ private captureFile;
52
+ private captureDirectory;
53
+ private captureLink;
54
+ private enclosedByRepository;
55
+ private readUserPolicy;
56
+ private uniqueMovedBase;
57
+ private replayFor;
58
+ }