@indigoai-us/hq-cloud 6.14.22 → 6.14.23
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/dist/bin/sync-runner-company.d.ts.map +1 -1
- package/dist/bin/sync-runner-company.js +9 -0
- package/dist/bin/sync-runner-company.js.map +1 -1
- package/dist/bin/sync-runner-events.test.js +22 -0
- package/dist/bin/sync-runner-events.test.js.map +1 -1
- package/dist/bin/sync-runner.d.ts +27 -1
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js +14 -1
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/bin/sync-runner.test.js +51 -1
- package/dist/bin/sync-runner.test.js.map +1 -1
- package/dist/cli/share.test.js +1 -0
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/sync.d.ts +25 -0
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +83 -1
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +171 -0
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/lib/conflict-index.d.ts +7 -0
- package/dist/lib/conflict-index.d.ts.map +1 -1
- package/dist/lib/conflict-index.js +3 -0
- package/dist/lib/conflict-index.js.map +1 -1
- package/dist/lib/conflict.test.js +31 -0
- package/dist/lib/conflict.test.js.map +1 -1
- package/package.json +1 -1
- package/src/bin/sync-runner-company.ts +8 -0
- package/src/bin/sync-runner-events.test.ts +31 -0
- package/src/bin/sync-runner.test.ts +62 -1
- package/src/bin/sync-runner.ts +40 -1
- package/src/cli/share.test.ts +1 -0
- package/src/cli/sync.test.ts +192 -0
- package/src/cli/sync.ts +126 -1
- package/src/lib/conflict-index.ts +11 -0
- package/src/lib/conflict.test.ts +33 -0
|
@@ -73,6 +73,13 @@ export interface PruneConflictIndexResult {
|
|
|
73
73
|
removedMirrors: number;
|
|
74
74
|
/** Rows kept (genuine divergence, or unprovable — fail-safe retained). */
|
|
75
75
|
kept: number;
|
|
76
|
+
/**
|
|
77
|
+
* Up to 10 ORIGINAL (non-mirror) paths of the kept rows, for a
|
|
78
|
+
* post-sync reconcile surface (`conflicts-remaining`). Empty when
|
|
79
|
+
* `kept === 0`. Lets a caller name the preserved conflict variants a human
|
|
80
|
+
* still has to resolve without re-reading the index. feedback_d2082110.
|
|
81
|
+
*/
|
|
82
|
+
keptSamplePaths: string[];
|
|
76
83
|
}
|
|
77
84
|
/**
|
|
78
85
|
* Garbage-collect the conflict index so it self-heals instead of growing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict-index.d.ts","sourceRoot":"","sources":["../../src/lib/conflict-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKrE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAY/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,GACnB,IAAI,CAgBN;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,kBAAkB,GACxB,IAAI,CASN;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAKpE;AAED,mEAAmE;AACnE,MAAM,WAAW,wBAAwB;IACvC,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"conflict-index.d.ts","sourceRoot":"","sources":["../../src/lib/conflict-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKrE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAY/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,GACnB,IAAI,CAgBN;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,kBAAkB,GACxB,IAAI,CASN;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAKpE;AAED,mEAAmE;AACnE,MAAM,WAAW,wBAAwB;IACvC,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AA4BD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CAkF3E"}
|
|
@@ -165,6 +165,7 @@ export function pruneConflictIndex(hqRoot) {
|
|
|
165
165
|
prunedIdentical: 0,
|
|
166
166
|
removedMirrors: 0,
|
|
167
167
|
kept: 0,
|
|
168
|
+
keptSamplePaths: [],
|
|
168
169
|
};
|
|
169
170
|
const index = readConflictIndex(hqRoot);
|
|
170
171
|
if (index.conflicts.length === 0)
|
|
@@ -213,6 +214,8 @@ export function pruneConflictIndex(hqRoot) {
|
|
|
213
214
|
result.kept++;
|
|
214
215
|
}
|
|
215
216
|
}
|
|
217
|
+
// Name the preserved divergences for the post-sync reconcile surface.
|
|
218
|
+
result.keptSamplePaths = kept.slice(0, 10).map((e) => e.originalPath);
|
|
216
219
|
// No row dropped → leave the file (and its mtime) untouched.
|
|
217
220
|
if (kept.length === index.conflicts.length)
|
|
218
221
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict-index.js","sourceRoot":"","sources":["../../src/lib/conflict-index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"conflict-index.js","sourceRoot":"","sources":["../../src/lib/conflict-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -149,6 +149,7 @@ describe("pruneConflictIndex", () => {
|
|
|
149
149
|
prunedIdentical: 0,
|
|
150
150
|
removedMirrors: 0,
|
|
151
151
|
kept: 0,
|
|
152
|
+
keptSamplePaths: [],
|
|
152
153
|
});
|
|
153
154
|
expect(fs.existsSync(getConflictIndexPath(tmpHq))).toBe(false);
|
|
154
155
|
});
|
|
@@ -230,6 +231,7 @@ describe("pruneConflictIndex", () => {
|
|
|
230
231
|
prunedIdentical: 1,
|
|
231
232
|
removedMirrors: 1,
|
|
232
233
|
kept: 1,
|
|
234
|
+
keptSamplePaths: ["dir/real.md"],
|
|
233
235
|
});
|
|
234
236
|
expect(readConflictIndex(tmpHq).conflicts.map((c) => c.id)).toEqual(["real"]);
|
|
235
237
|
});
|
|
@@ -248,5 +250,34 @@ describe("pruneConflictIndex", () => {
|
|
|
248
250
|
pruneConflictIndex(tmpHq);
|
|
249
251
|
expect(fs.statSync(indexPath).mtimeMs).toBe(before);
|
|
250
252
|
});
|
|
253
|
+
it("names the preserved conflict variants (keptSamplePaths, capped at 10) for the reconcile surface (feedback_d2082110)", () => {
|
|
254
|
+
// Reporter feedback_d2082110 finished a full sync with "20 older preserved
|
|
255
|
+
// conflict entries" still on disk and NO signal they were there. The prune
|
|
256
|
+
// self-heals the ledger but conservatively KEEPS genuine divergences; those
|
|
257
|
+
// were silent. keptSamplePaths surfaces the original (non-mirror) paths so
|
|
258
|
+
// the runner can emit a `conflicts-remaining` reconcile line pointing the
|
|
259
|
+
// operator at `/resolve-conflicts`.
|
|
260
|
+
const rows = [];
|
|
261
|
+
for (let i = 0; i < 12; i++) {
|
|
262
|
+
const id = `real-${String(i).padStart(2, "0")}`;
|
|
263
|
+
const row = rowFor(id);
|
|
264
|
+
put(row.originalPath, `local-${i}`);
|
|
265
|
+
put(row.conflictPath, `remote-${i}`);
|
|
266
|
+
rows.push(row);
|
|
267
|
+
}
|
|
268
|
+
writeConflictIndex(tmpHq, { version: 1, conflicts: rows });
|
|
269
|
+
const res = pruneConflictIndex(tmpHq);
|
|
270
|
+
expect(res.kept).toBe(12);
|
|
271
|
+
// Capped at 10 samples, drawn from the kept (detectedAt-sorted) rows.
|
|
272
|
+
expect(res.keptSamplePaths).toHaveLength(10);
|
|
273
|
+
expect(res.keptSamplePaths.every((p) => p.startsWith("dir/real-"))).toBe(true);
|
|
274
|
+
// Orphaned/identical rows never contribute to the surfaced sample.
|
|
275
|
+
const orphan = rowFor("orphan");
|
|
276
|
+
put(orphan.originalPath, "x"); // mirror missing → dropped, not sampled
|
|
277
|
+
writeConflictIndex(tmpHq, { version: 1, conflicts: [orphan] });
|
|
278
|
+
const res2 = pruneConflictIndex(tmpHq);
|
|
279
|
+
expect(res2.kept).toBe(0);
|
|
280
|
+
expect(res2.keptSamplePaths).toEqual([]);
|
|
281
|
+
});
|
|
251
282
|
});
|
|
252
283
|
//# sourceMappingURL=conflict.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict.test.js","sourceRoot":"","sources":["../../src/lib/conflict.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conflict.test.js","sourceRoot":"","sources":["../../src/lib/conflict.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -154,6 +154,14 @@ export async function executeCompanyFanout(options: {
|
|
|
154
154
|
count: event.count,
|
|
155
155
|
samplePaths: event.samplePaths,
|
|
156
156
|
});
|
|
157
|
+
} else if (event.type === "scope-materialization-gap") {
|
|
158
|
+
options.emit({
|
|
159
|
+
type: "scope-materialization-gap",
|
|
160
|
+
company: companyLabel,
|
|
161
|
+
count: event.count,
|
|
162
|
+
samplePaths: event.samplePaths,
|
|
163
|
+
syncMode: event.syncMode,
|
|
164
|
+
});
|
|
157
165
|
} else if (event.type === "ignore-excluded") {
|
|
158
166
|
options.emit({
|
|
159
167
|
type: "ignore-excluded",
|
|
@@ -33,6 +33,37 @@ describe("routeEvents", () => {
|
|
|
33
33
|
expect(JSON.parse(stderr[1])).toMatchObject({ type: "auth-error" });
|
|
34
34
|
expect(JSON.parse(stdout[0])).toMatchObject({ type: "setup-needed" });
|
|
35
35
|
});
|
|
36
|
+
|
|
37
|
+
it("routes the feedback_d2082110 visibility events (materialization-gap, conflicts-remaining) to stdout", () => {
|
|
38
|
+
const { stdout, stderr, streams } = makeStreams();
|
|
39
|
+
|
|
40
|
+
routeEvents(
|
|
41
|
+
{
|
|
42
|
+
type: "scope-materialization-gap",
|
|
43
|
+
company: "dpp",
|
|
44
|
+
count: 13,
|
|
45
|
+
samplePaths: ["projects/secret.md"],
|
|
46
|
+
syncMode: "shared",
|
|
47
|
+
},
|
|
48
|
+
streams,
|
|
49
|
+
);
|
|
50
|
+
routeEvents(
|
|
51
|
+
{ type: "conflicts-remaining", count: 20, samplePaths: ["knowledge/notes.md"] },
|
|
52
|
+
streams,
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
expect(stderr).toHaveLength(0);
|
|
56
|
+
expect(stdout).toHaveLength(2);
|
|
57
|
+
expect(JSON.parse(stdout[0])).toMatchObject({
|
|
58
|
+
type: "scope-materialization-gap",
|
|
59
|
+
count: 13,
|
|
60
|
+
syncMode: "shared",
|
|
61
|
+
});
|
|
62
|
+
expect(JSON.parse(stdout[1])).toMatchObject({
|
|
63
|
+
type: "conflicts-remaining",
|
|
64
|
+
count: 20,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
36
67
|
});
|
|
37
68
|
|
|
38
69
|
describe("emitUncaughtRunnerError (HQ-SYNC-WEB-6)", () => {
|
|
@@ -2263,7 +2263,12 @@ describe("ndjson stream shape", () => {
|
|
|
2263
2263
|
}),
|
|
2264
2264
|
});
|
|
2265
2265
|
|
|
2266
|
-
|
|
2266
|
+
// Pin hqRoot at the hermetic per-test temp dir so the post-sync
|
|
2267
|
+
// conflict-ledger prune reads an EMPTY index (no residual `.hq-conflicts`),
|
|
2268
|
+
// keeping this exact-shape assertion independent of the developer's real
|
|
2269
|
+
// ~/hq conflict state — otherwise the new `conflicts-remaining` tail event
|
|
2270
|
+
// would fire whenever ~/hq has preserved conflicts. feedback_d2082110.
|
|
2271
|
+
await runRunner(["--companies", "--hq-root", __runnerTestStateDir!], deps);
|
|
2267
2272
|
const raw = deps.stdout.raw();
|
|
2268
2273
|
expect(raw.endsWith("\n")).toBe(true);
|
|
2269
2274
|
// Every line must parse as JSON
|
|
@@ -2281,6 +2286,62 @@ describe("ndjson stream shape", () => {
|
|
|
2281
2286
|
"all-complete",
|
|
2282
2287
|
]);
|
|
2283
2288
|
});
|
|
2289
|
+
|
|
2290
|
+
it("emits a `conflicts-remaining` reconcile event after all-complete when the ledger keeps a preserved variant (feedback_d2082110)", async () => {
|
|
2291
|
+
// Seed a genuine divergence in the conflict ledger at the runner's hqRoot:
|
|
2292
|
+
// the reporter finished a full sync with preserved conflict variants still
|
|
2293
|
+
// on disk and no signal. The post-sync prune self-heals the ledger but KEEPS
|
|
2294
|
+
// real divergences; the runner must now SURFACE the residual count so the
|
|
2295
|
+
// operator knows to run `/resolve-conflicts`.
|
|
2296
|
+
const hqRoot = __runnerTestStateDir!;
|
|
2297
|
+
const conflictsDir = path.join(hqRoot, ".hq-conflicts");
|
|
2298
|
+
fs.mkdirSync(path.join(hqRoot, "dir"), { recursive: true });
|
|
2299
|
+
fs.writeFileSync(path.join(hqRoot, "dir", "notes.md"), "local edit");
|
|
2300
|
+
const mirrorRel = "dir/notes.md.conflict-2026-04-27T22-05-14Z-abc123.md";
|
|
2301
|
+
fs.writeFileSync(path.join(hqRoot, mirrorRel), "remote edit");
|
|
2302
|
+
fs.mkdirSync(conflictsDir, { recursive: true });
|
|
2303
|
+
fs.writeFileSync(
|
|
2304
|
+
path.join(conflictsDir, "index.json"),
|
|
2305
|
+
JSON.stringify({
|
|
2306
|
+
version: 1,
|
|
2307
|
+
conflicts: [
|
|
2308
|
+
{
|
|
2309
|
+
id: "dir-notes-md-2026-04-27T22-05-14Z",
|
|
2310
|
+
originalPath: "dir/notes.md",
|
|
2311
|
+
conflictPath: mirrorRel,
|
|
2312
|
+
detectedAt: "2026-04-27T22:05:14Z",
|
|
2313
|
+
side: "pull",
|
|
2314
|
+
machineId: "abc123",
|
|
2315
|
+
localHash: "local",
|
|
2316
|
+
remoteHash: "remote",
|
|
2317
|
+
},
|
|
2318
|
+
],
|
|
2319
|
+
}),
|
|
2320
|
+
);
|
|
2321
|
+
|
|
2322
|
+
const deps = makeDeps({
|
|
2323
|
+
createVaultClient: () =>
|
|
2324
|
+
makeVaultStub({
|
|
2325
|
+
memberships: [{ companyUid: "cmp_a" }],
|
|
2326
|
+
entityGet: (uid: string) =>
|
|
2327
|
+
Promise.resolve({ uid, slug: "acme" } as unknown as EntityInfo),
|
|
2328
|
+
}),
|
|
2329
|
+
});
|
|
2330
|
+
|
|
2331
|
+
await runRunner(["--companies", "--hq-root", hqRoot], deps);
|
|
2332
|
+
|
|
2333
|
+
const remaining = deps.stdout
|
|
2334
|
+
.events()
|
|
2335
|
+
.find((e) => e.type === "conflicts-remaining") as
|
|
2336
|
+
| Extract<RunnerEvent, { type: "conflicts-remaining" }>
|
|
2337
|
+
| undefined;
|
|
2338
|
+
expect(remaining).toBeDefined();
|
|
2339
|
+
expect(remaining!.count).toBe(1);
|
|
2340
|
+
expect(remaining!.samplePaths).toEqual(["dir/notes.md"]);
|
|
2341
|
+
// The divergent pair is preserved — never destroyed by the reconcile surface.
|
|
2342
|
+
expect(fs.existsSync(path.join(hqRoot, "dir", "notes.md"))).toBe(true);
|
|
2343
|
+
expect(fs.existsSync(path.join(hqRoot, mirrorRel))).toBe(true);
|
|
2344
|
+
});
|
|
2284
2345
|
});
|
|
2285
2346
|
|
|
2286
2347
|
// ---------------------------------------------------------------------------
|
package/src/bin/sync-runner.ts
CHANGED
|
@@ -385,6 +385,10 @@ export type RunnerEvent =
|
|
|
385
385
|
| ({ type: "conflict"; company: string } & Omit<Extract<SyncProgressEvent, { type: "conflict" }>, "type">)
|
|
386
386
|
| { type: "new-files"; company: string; files: Array<{ path: string; bytes: number; addedBy: string | null }> }
|
|
387
387
|
| { type: "scope-excluded"; company: string; count: number; samplePaths: string[] }
|
|
388
|
+
| ({ type: "scope-materialization-gap"; company: string } & Omit<
|
|
389
|
+
Extract<SyncProgressEvent, { type: "scope-materialization-gap" }>,
|
|
390
|
+
"type"
|
|
391
|
+
>)
|
|
388
392
|
| { type: "ignore-excluded"; company: string; count: number; totalExcluded: number; samplePaths: string[] }
|
|
389
393
|
| ({ type: "skip-invalid-scoped-key"; company: string } & Omit<
|
|
390
394
|
Extract<SyncProgressEvent, { type: "skip-invalid-scoped-key" }>,
|
|
@@ -465,6 +469,28 @@ export type RunnerEvent =
|
|
|
465
469
|
filesUploaded: number;
|
|
466
470
|
bytesUploaded: number;
|
|
467
471
|
}>;
|
|
472
|
+
}
|
|
473
|
+
| {
|
|
474
|
+
/**
|
|
475
|
+
* Emitted at most ONCE per fanout, AFTER `all-complete`, when the
|
|
476
|
+
* post-sync conflict-ledger prune leaves one or more PRESERVED conflict
|
|
477
|
+
* variants that a human still has to resolve (`kept > 0`). The prune
|
|
478
|
+
* self-heals the ledger (drops orphaned + byte-identical false-positive
|
|
479
|
+
* rows), but genuine divergences are conservatively KEPT — and pre-fix
|
|
480
|
+
* that residual set was silent, so the reporter of feedback_d2082110
|
|
481
|
+
* finished a full sync with "20 older preserved conflict entries" still
|
|
482
|
+
* on disk and no signal they were there. This event reconciles and
|
|
483
|
+
* surfaces the remaining count so the operator knows to run
|
|
484
|
+
* `/resolve-conflicts`. Ledger-global (not per-company — the index lives
|
|
485
|
+
* at the HQ root). Not emitted when the ledger is clean (`kept === 0`).
|
|
486
|
+
*
|
|
487
|
+
* `count` is the number of preserved conflict rows still awaiting
|
|
488
|
+
* resolution; `samplePaths` carries up to 10 original (non-mirror) paths
|
|
489
|
+
* for display.
|
|
490
|
+
*/
|
|
491
|
+
type: "conflicts-remaining";
|
|
492
|
+
count: number;
|
|
493
|
+
samplePaths: string[];
|
|
468
494
|
};
|
|
469
495
|
|
|
470
496
|
/**
|
|
@@ -1784,7 +1810,20 @@ export async function runRunner(
|
|
|
1784
1810
|
// HQ_CONFLICT_PRUNE_ON_SYNC=0.
|
|
1785
1811
|
if (process.env.HQ_CONFLICT_PRUNE_ON_SYNC !== "0") {
|
|
1786
1812
|
try {
|
|
1787
|
-
pruneConflictIndex(parsed.hqRoot);
|
|
1813
|
+
const pruneResult = pruneConflictIndex(parsed.hqRoot);
|
|
1814
|
+
// Reconcile + surface the residual preserved conflict variants a human
|
|
1815
|
+
// still has to resolve. Pre-fix this set was silent — the reporter of
|
|
1816
|
+
// feedback_d2082110 finished a full sync with 20 preserved conflict
|
|
1817
|
+
// entries still on disk and no signal. Emitting after the prune means the
|
|
1818
|
+
// count reflects the self-healed (orphan/false-positive-dropped) ledger,
|
|
1819
|
+
// never the inflated raw one. Ledger-global; silent on a clean ledger.
|
|
1820
|
+
if (pruneResult.kept > 0) {
|
|
1821
|
+
emit({
|
|
1822
|
+
type: "conflicts-remaining",
|
|
1823
|
+
count: pruneResult.kept,
|
|
1824
|
+
samplePaths: pruneResult.keptSamplePaths,
|
|
1825
|
+
});
|
|
1826
|
+
}
|
|
1788
1827
|
} catch (err) {
|
|
1789
1828
|
reportDiagnostic({
|
|
1790
1829
|
component: "conflict-index",
|
package/src/cli/share.test.ts
CHANGED
|
@@ -1673,6 +1673,7 @@ describe("share", () => {
|
|
|
1673
1673
|
e.type === "new-files" ||
|
|
1674
1674
|
e.type === "personal-vault-out-of-policy" ||
|
|
1675
1675
|
e.type === "scope-excluded" ||
|
|
1676
|
+
e.type === "scope-materialization-gap" ||
|
|
1676
1677
|
e.type === "ignore-excluded" ||
|
|
1677
1678
|
e.type === "delete-refused-bulk-asymmetry"
|
|
1678
1679
|
) return;
|
package/src/cli/sync.test.ts
CHANGED
|
@@ -3783,6 +3783,198 @@ describe("sync", () => {
|
|
|
3783
3783
|
expect(errOutput).not.toContain("stale personal-overlay marker");
|
|
3784
3784
|
});
|
|
3785
3785
|
|
|
3786
|
+
it("directory-overlay marker whose children are already materialized: skips cleanly, no 'rm -rf' advice, children still pull (feedback_d2082110)", async () => {
|
|
3787
|
+
// Reporter feedback_d2082110 (cody@jonesroadbeauty.com): the DPP vault
|
|
3788
|
+
// stored a cloud symlink marker at `skills/cody-copywriter` while the local
|
|
3789
|
+
// path was a real directory holding that overlay's 13 materialized child
|
|
3790
|
+
// objects. The vault stores a directory overlay as a symlink RECORD at the
|
|
3791
|
+
// key itself AND the directory's contents as separate child objects beneath
|
|
3792
|
+
// it. Pre-fix, the pull planner hit the generic dir-vs-object collision
|
|
3793
|
+
// branch and emitted, on EVERY sync cycle, a "manual reconciliation required
|
|
3794
|
+
// (rm -rf the local directory to pull)" warning — advice that here would
|
|
3795
|
+
// DELETE the materialized (and possibly locally-authored) contents to install
|
|
3796
|
+
// an inert link. The marker "never resolved" and the noisy warning recurred.
|
|
3797
|
+
// Fix: recognize that the marker's key ALSO carries child objects in the same
|
|
3798
|
+
// LIST (a real directory never syncs as a single object at its own key), keep
|
|
3799
|
+
// the local directory, skip the marker quietly, and let the children pull via
|
|
3800
|
+
// their own plan items.
|
|
3801
|
+
const markerKey = "skills/cody-copywriter";
|
|
3802
|
+
const childKey = "skills/cody-copywriter/SKILL.md";
|
|
3803
|
+
const localDir = path.join(tmpDir, "companies", "acme", "skills", "cody-copywriter");
|
|
3804
|
+
fs.mkdirSync(localDir, { recursive: true });
|
|
3805
|
+
// A child that is already materialized on this device (stands in for the
|
|
3806
|
+
// reporter's 13 present child files) — it must survive untouched.
|
|
3807
|
+
fs.writeFileSync(path.join(localDir, "materialized.md"), "already here");
|
|
3808
|
+
|
|
3809
|
+
vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
|
|
3810
|
+
{ key: markerKey, size: 30, lastModified: new Date(), etag: '"overlay-marker"' },
|
|
3811
|
+
{ key: childKey, size: 18, lastModified: new Date(), etag: '"child-obj"' },
|
|
3812
|
+
]);
|
|
3813
|
+
// Deterministic child materialization, independent of the ambient default
|
|
3814
|
+
// downloadFile mock (which earlier tests in this suite may have replaced).
|
|
3815
|
+
// The marker is skipped by the planner, so this Once impl serves the single
|
|
3816
|
+
// child download.
|
|
3817
|
+
vi.mocked(s3Module.downloadFile).mockImplementationOnce(
|
|
3818
|
+
async (_ctx: unknown, _key: string, localPath: string) => {
|
|
3819
|
+
const dir = path.dirname(localPath);
|
|
3820
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
3821
|
+
fs.writeFileSync(localPath, "child content");
|
|
3822
|
+
return { metadata: {} };
|
|
3823
|
+
},
|
|
3824
|
+
);
|
|
3825
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
|
3826
|
+
|
|
3827
|
+
let crashed = false;
|
|
3828
|
+
let result;
|
|
3829
|
+
try {
|
|
3830
|
+
result = await sync({
|
|
3831
|
+
company: "acme",
|
|
3832
|
+
vaultConfig: mockConfig,
|
|
3833
|
+
hqRoot: tmpDir,
|
|
3834
|
+
});
|
|
3835
|
+
} catch {
|
|
3836
|
+
crashed = true;
|
|
3837
|
+
}
|
|
3838
|
+
const errOutput = errSpy.mock.calls.map((c) => c.join(" ")).join("\n");
|
|
3839
|
+
errSpy.mockRestore();
|
|
3840
|
+
|
|
3841
|
+
expect(crashed).toBe(false);
|
|
3842
|
+
expect(result).toBeDefined();
|
|
3843
|
+
// The marker is a benign skip; the child object still downloads.
|
|
3844
|
+
expect(result!.filesDownloaded).toBe(1);
|
|
3845
|
+
expect(result!.filesSkipped).toBeGreaterThanOrEqual(1);
|
|
3846
|
+
// Local directory and its already-materialized contents are untouched...
|
|
3847
|
+
expect(fs.readFileSync(path.join(localDir, "materialized.md"), "utf-8")).toBe(
|
|
3848
|
+
"already here",
|
|
3849
|
+
);
|
|
3850
|
+
// ...and the child materialized under the kept directory.
|
|
3851
|
+
expect(fs.existsSync(path.join(localDir, "SKILL.md"))).toBe(true);
|
|
3852
|
+
// The dangerous, recurring reconciliation advice is GONE...
|
|
3853
|
+
expect(errOutput).not.toContain("rm -rf");
|
|
3854
|
+
expect(errOutput).not.toContain("manual");
|
|
3855
|
+
// ...replaced by a calm, no-action-needed note naming the marker.
|
|
3856
|
+
expect(errOutput).toContain("directory-overlay marker");
|
|
3857
|
+
expect(errOutput).toContain(markerKey);
|
|
3858
|
+
});
|
|
3859
|
+
|
|
3860
|
+
it("company dir-vs-object collision with NO children in the LIST still warns to reconcile (boundary)", async () => {
|
|
3861
|
+
// Boundary guard for the feedback_d2082110 fix: the quiet overlay-marker
|
|
3862
|
+
// skip is scoped to a remote object whose key ALSO has child objects under
|
|
3863
|
+
// it (a directory overlay). A single remote object at a company key that is
|
|
3864
|
+
// locally a real directory but has NO children in the LIST is a genuine
|
|
3865
|
+
// file-vs-directory structural collision the operator must resolve, so the
|
|
3866
|
+
// original warning + skip-local-only classification must remain intact.
|
|
3867
|
+
const key = "skills/lonely-file";
|
|
3868
|
+
const localDir = path.join(tmpDir, "companies", "acme", "skills", "lonely-file");
|
|
3869
|
+
fs.mkdirSync(localDir, { recursive: true });
|
|
3870
|
+
fs.writeFileSync(path.join(localDir, "inside.md"), "local content");
|
|
3871
|
+
|
|
3872
|
+
vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
|
|
3873
|
+
{ key, size: 40, lastModified: new Date(), etag: '"single-obj"' },
|
|
3874
|
+
]);
|
|
3875
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
|
3876
|
+
|
|
3877
|
+
let crashed = false;
|
|
3878
|
+
let result;
|
|
3879
|
+
try {
|
|
3880
|
+
result = await sync({
|
|
3881
|
+
company: "acme",
|
|
3882
|
+
vaultConfig: mockConfig,
|
|
3883
|
+
hqRoot: tmpDir,
|
|
3884
|
+
});
|
|
3885
|
+
} catch {
|
|
3886
|
+
crashed = true;
|
|
3887
|
+
}
|
|
3888
|
+
const errOutput = errSpy.mock.calls.map((c) => c.join(" ")).join("\n");
|
|
3889
|
+
errSpy.mockRestore();
|
|
3890
|
+
|
|
3891
|
+
expect(crashed).toBe(false);
|
|
3892
|
+
expect(result!.filesDownloaded).toBe(0);
|
|
3893
|
+
expect(result!.filesSkipped).toBe(1);
|
|
3894
|
+
expect(fs.existsSync(path.join(localDir, "inside.md"))).toBe(true);
|
|
3895
|
+
// Generic collision path preserved: reconciliation warning still emitted,
|
|
3896
|
+
// NOT the overlay-marker note.
|
|
3897
|
+
expect(errOutput).toContain("manual");
|
|
3898
|
+
expect(errOutput).not.toContain("directory-overlay marker");
|
|
3899
|
+
});
|
|
3900
|
+
|
|
3901
|
+
it("shared-mode leg surfaces the materialization gap and names the shared→all lever (feedback_d2082110)", async () => {
|
|
3902
|
+
// Reporter feedback_d2082110 (cody@jonesroadbeauty.com): four memberships
|
|
3903
|
+
// were configured as `shared` rather than `all`, so not all vault content
|
|
3904
|
+
// materialized on the second device — a SILENT gap the reporter had to
|
|
3905
|
+
// notice and work around by flipping each membership to `all` by hand.
|
|
3906
|
+
// `SyncResult.filesOutOfScope` counted the skipped keys but nothing SURFACED
|
|
3907
|
+
// the gap or the lever. Fix: a `shared`/`custom` leg that skips one or more
|
|
3908
|
+
// keys as out-of-scope emits a single `scope-materialization-gap` event so
|
|
3909
|
+
// full materialization becomes a deliberate, visible choice.
|
|
3910
|
+
const events: Array<Record<string, unknown>> = [];
|
|
3911
|
+
vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
|
|
3912
|
+
{ key: "knowledge/present.md", size: 12, lastModified: new Date(), etag: '"in-scope"' },
|
|
3913
|
+
{ key: "projects/secret.md", size: 20, lastModified: new Date(), etag: '"out-of-scope"' },
|
|
3914
|
+
]);
|
|
3915
|
+
// Deterministic materialization of the single in-scope download, independent
|
|
3916
|
+
// of the ambient default downloadFile mock (earlier tests in this suite may
|
|
3917
|
+
// have replaced it — clearAllMocks resets call history, not implementations).
|
|
3918
|
+
vi.mocked(s3Module.downloadFile).mockImplementationOnce(
|
|
3919
|
+
async (_ctx: unknown, _key: string, localPath: string) => {
|
|
3920
|
+
const dir = path.dirname(localPath);
|
|
3921
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
3922
|
+
fs.writeFileSync(localPath, "in-scope content");
|
|
3923
|
+
return { metadata: {} };
|
|
3924
|
+
},
|
|
3925
|
+
);
|
|
3926
|
+
|
|
3927
|
+
const result = await sync({
|
|
3928
|
+
company: "acme",
|
|
3929
|
+
vaultConfig: mockConfig,
|
|
3930
|
+
hqRoot: tmpDir,
|
|
3931
|
+
syncMode: "shared",
|
|
3932
|
+
prefixSet: ["knowledge/"],
|
|
3933
|
+
onEvent: (e) => events.push(e as unknown as Record<string, unknown>),
|
|
3934
|
+
});
|
|
3935
|
+
|
|
3936
|
+
// The in-scope key pulled; the out-of-scope key was NOT materialized.
|
|
3937
|
+
expect(result.filesDownloaded).toBe(1);
|
|
3938
|
+
expect(result.filesOutOfScope).toBe(1);
|
|
3939
|
+
expect(
|
|
3940
|
+
fs.existsSync(path.join(tmpDir, "companies", "acme", "knowledge", "present.md")),
|
|
3941
|
+
).toBe(true);
|
|
3942
|
+
expect(
|
|
3943
|
+
fs.existsSync(path.join(tmpDir, "companies", "acme", "projects", "secret.md")),
|
|
3944
|
+
).toBe(false);
|
|
3945
|
+
|
|
3946
|
+
// The gap is now SURFACED with the count, the active mode, and the lever.
|
|
3947
|
+
const gap = events.find((e) => e.type === "scope-materialization-gap");
|
|
3948
|
+
expect(gap).toBeDefined();
|
|
3949
|
+
expect(gap!.count).toBe(1);
|
|
3950
|
+
expect(gap!.syncMode).toBe("shared");
|
|
3951
|
+
expect(gap!.samplePaths).toEqual(["projects/secret.md"]);
|
|
3952
|
+
});
|
|
3953
|
+
|
|
3954
|
+
it("all-mode leg (default) never emits a materialization gap — no scoping, no noise", async () => {
|
|
3955
|
+
// Boundary for the feedback_d2082110 gap surface: in `all` mode every key is
|
|
3956
|
+
// in scope, so the gap event must stay silent even when the LIST is fully
|
|
3957
|
+
// downloaded. Prevents the guidance from firing on the common full-access
|
|
3958
|
+
// path where there is nothing for the operator to act on.
|
|
3959
|
+
const events: Array<Record<string, unknown>> = [];
|
|
3960
|
+
vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
|
|
3961
|
+
{ key: "knowledge/a.md", size: 12, lastModified: new Date(), etag: '"a"' },
|
|
3962
|
+
{ key: "projects/b.md", size: 20, lastModified: new Date(), etag: '"b"' },
|
|
3963
|
+
]);
|
|
3964
|
+
|
|
3965
|
+
const result = await sync({
|
|
3966
|
+
company: "acme",
|
|
3967
|
+
vaultConfig: mockConfig,
|
|
3968
|
+
hqRoot: tmpDir,
|
|
3969
|
+
// syncMode omitted → defaults to "all".
|
|
3970
|
+
onEvent: (e) => events.push(e as unknown as Record<string, unknown>),
|
|
3971
|
+
});
|
|
3972
|
+
|
|
3973
|
+
expect(result.filesDownloaded).toBe(2);
|
|
3974
|
+
expect(result.filesOutOfScope).toBe(0);
|
|
3975
|
+
expect(events.find((e) => e.type === "scope-materialization-gap")).toBeUndefined();
|
|
3976
|
+
});
|
|
3977
|
+
|
|
3786
3978
|
it("pulls a remote symlink record under an .hqinclude dir-only allowlist pattern", async () => {
|
|
3787
3979
|
// Codex round-7 P1 follow-up: pre-fix, computePullPlan called
|
|
3788
3980
|
// shouldSync(localPath) with the default isDir=false. LIST gives
|