@indigoai-us/hq-cloud 5.17.0 → 5.18.1
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/.github/workflows/ci.yml +19 -0
- package/.github/workflows/publish.yml +53 -0
- package/dist/cli/share.d.ts +7 -5
- package/dist/cli/share.d.ts.map +1 -1
- package/dist/cli/share.js +189 -18
- package/dist/cli/share.js.map +1 -1
- package/dist/cli/share.test.js +292 -2
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +98 -17
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +302 -0
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/journal.d.ts +26 -0
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +31 -0
- package/dist/journal.js.map +1 -1
- package/dist/s3.d.ts +91 -0
- package/dist/s3.d.ts.map +1 -1
- package/dist/s3.js +245 -0
- package/dist/s3.js.map +1 -1
- package/dist/s3.test.js +347 -1
- package/dist/s3.test.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/share.test.ts +365 -2
- package/src/cli/share.ts +241 -28
- package/src/cli/sync.test.ts +345 -0
- package/src/cli/sync.ts +133 -24
- package/src/journal.ts +33 -0
- package/src/s3.test.ts +415 -1
- package/src/s3.ts +271 -0
- package/tsconfig.json +12 -1
package/dist/cli/sync.js
CHANGED
|
@@ -8,7 +8,7 @@ import * as fs from "fs";
|
|
|
8
8
|
import * as path from "path";
|
|
9
9
|
import { resolveEntityContext, isExpiringSoon, refreshEntityContext } from "../context.js";
|
|
10
10
|
import { downloadFile, listRemoteFiles, headRemoteFile } from "../s3.js";
|
|
11
|
-
import { readJournal, writeJournal, hashFile, updateEntry, getEntry, normalizeEtag } from "../journal.js";
|
|
11
|
+
import { readJournal, writeJournal, hashFile, hashSymlinkTarget, updateEntry, getEntry, normalizeEtag, } from "../journal.js";
|
|
12
12
|
import { createIgnoreFilter } from "../ignore.js";
|
|
13
13
|
import { resolveConflict } from "./conflict.js";
|
|
14
14
|
import { buildConflictId, buildConflictPath, readShortMachineId, } from "../lib/conflict-file.js";
|
|
@@ -87,7 +87,10 @@ export async function sync(options) {
|
|
|
87
87
|
path: remoteFile.key,
|
|
88
88
|
localHash: item.localHash,
|
|
89
89
|
remoteModified: remoteFile.lastModified,
|
|
90
|
-
|
|
90
|
+
// Use the lstat-mtime captured by the planner — statSync
|
|
91
|
+
// here would follow a dangling symlink and throw ENOENT,
|
|
92
|
+
// aborting the pull before resolveConflict could prompt.
|
|
93
|
+
localModified: item.localMtime,
|
|
91
94
|
direction: "pull",
|
|
92
95
|
}, onConflict);
|
|
93
96
|
emit({
|
|
@@ -153,13 +156,13 @@ export async function sync(options) {
|
|
|
153
156
|
// the next sync "no change on either side" until something new
|
|
154
157
|
// diverges. Without this, both `localChanged` and `remoteChanged`
|
|
155
158
|
// stay true forever and the conflict is sticky.
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
159
|
+
// Stamp from planner-captured size (symlink-aware), NOT
|
|
160
|
+
// statSync — which would follow a dangling symlink and
|
|
161
|
+
// throw ENOENT, get swallowed, and leave the journal
|
|
162
|
+
// stale so this conflict would re-fire on every sync
|
|
163
|
+
// forever. localSize is sourced from the same lstat that
|
|
164
|
+
// computed localMtime + localHash above.
|
|
165
|
+
updateEntry(journal, remoteFile.key, item.localHash, item.localSize, "down", remoteFile.etag);
|
|
163
166
|
continue;
|
|
164
167
|
}
|
|
165
168
|
// "overwrite" falls through to download
|
|
@@ -167,11 +170,24 @@ export async function sync(options) {
|
|
|
167
170
|
// Download (action === "download" or conflict resolved to "overwrite")
|
|
168
171
|
try {
|
|
169
172
|
await downloadFile(ctx, remoteFile.key, localPath);
|
|
170
|
-
|
|
171
|
-
|
|
173
|
+
// Symlink records materialize as real symlinks on disk. lstat
|
|
174
|
+
// (does not follow) lets us detect that case so the journal stamp
|
|
175
|
+
// mirrors what the push side would emit on the next tick:
|
|
176
|
+
// hash = sha256(readlink target string)
|
|
177
|
+
// size = 0
|
|
178
|
+
// Without this check, hashFile would follow the link and stamp the
|
|
179
|
+
// target file's contents — a value the next push would never
|
|
180
|
+
// produce — which makes skipUnchanged perpetually re-upload every
|
|
181
|
+
// symlink, defeating the point of the gate.
|
|
182
|
+
const localLstat = fs.lstatSync(localPath);
|
|
183
|
+
const isLocalSymlink = localLstat.isSymbolicLink();
|
|
184
|
+
const hash = isLocalSymlink
|
|
185
|
+
? hashSymlinkTarget(fs.readlinkSync(localPath))
|
|
186
|
+
: hashFile(localPath);
|
|
187
|
+
const size = isLocalSymlink ? 0 : fs.statSync(localPath).size;
|
|
172
188
|
// Capture the listing's ETag so subsequent syncs can detect remote
|
|
173
189
|
// drift independently of mtime drift.
|
|
174
|
-
updateEntry(journal, remoteFile.key, hash,
|
|
190
|
+
updateEntry(journal, remoteFile.key, hash, size, "down", remoteFile.etag);
|
|
175
191
|
// Attach message from the prior journal entry if present (set by a
|
|
176
192
|
// previous `share` operation that included a --message).
|
|
177
193
|
const priorEntry = getEntry(journal, remoteFile.key);
|
|
@@ -179,11 +195,11 @@ export async function sync(options) {
|
|
|
179
195
|
emit({
|
|
180
196
|
type: "progress",
|
|
181
197
|
path: remoteFile.key,
|
|
182
|
-
bytes:
|
|
198
|
+
bytes: size,
|
|
183
199
|
...(remoteJournalMessage ? { message: remoteJournalMessage } : {}),
|
|
184
200
|
});
|
|
185
201
|
filesDownloaded++;
|
|
186
|
-
bytesDownloaded +=
|
|
202
|
+
bytesDownloaded += size;
|
|
187
203
|
}
|
|
188
204
|
catch (err) {
|
|
189
205
|
// STS session policy may deny access to some paths — this is expected
|
|
@@ -295,14 +311,67 @@ function computePullPlan(remoteFiles, journal, companyRoot, shouldSync, personal
|
|
|
295
311
|
items.push({ action: "skip-personal-mode", remoteFile, localPath });
|
|
296
312
|
continue;
|
|
297
313
|
}
|
|
298
|
-
|
|
314
|
+
// LIST gives us no kind signal for the remote object — we don't
|
|
315
|
+
// know whether this key is a regular file or a symlink record
|
|
316
|
+
// until we either HEAD it (expensive — N extra calls per pull) or
|
|
317
|
+
// download it. So probe the ignore filter with BOTH isDir hints
|
|
318
|
+
// and include the entry if either probe passes. Without this,
|
|
319
|
+
// a symlink record at a dir-only-allowlisted path (e.g. an
|
|
320
|
+
// .hqinclude of `companies/*/knowledge/`) would be classified
|
|
321
|
+
// skip-ignored and the symlinks freshly uploaded by the
|
|
322
|
+
// push-side fix would never propagate. Mirrors the dual-hint
|
|
323
|
+
// probe in walkDir/collectFiles. Pure path lookup, no I/O.
|
|
324
|
+
if (!shouldSync(localPath, false) && !shouldSync(localPath, true)) {
|
|
299
325
|
items.push({ action: "skip-ignored", remoteFile, localPath });
|
|
300
326
|
continue;
|
|
301
327
|
}
|
|
302
328
|
const journalEntry = getEntry(journal, remoteFile.key);
|
|
303
|
-
|
|
329
|
+
// lstat (not existsSync/statSync) handles three cases the legacy
|
|
330
|
+
// checks got wrong for symlinks:
|
|
331
|
+
// 1. A valid symlink at localPath: existsSync returns true and the
|
|
332
|
+
// planner falls through to hashFile, which follows the link and
|
|
333
|
+
// hashes the target file's bytes — never matching the journal's
|
|
334
|
+
// sha256(target string), so every pull would mis-classify a
|
|
335
|
+
// pristine symlink as locally changed.
|
|
336
|
+
// 2. A dangling symlink: existsSync returns false (existsSync
|
|
337
|
+
// follows links) so the planner treats the entry as missing and
|
|
338
|
+
// re-downloads, silently clobbering the user's intentional
|
|
339
|
+
// dangling link on every run.
|
|
340
|
+
// 3. A regular file: indistinguishable from current behaviour.
|
|
341
|
+
let localLstat = null;
|
|
342
|
+
try {
|
|
343
|
+
localLstat = fs.lstatSync(localPath);
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
// ENOENT means truly absent; other errors propagate.
|
|
347
|
+
if (err &&
|
|
348
|
+
typeof err === "object" &&
|
|
349
|
+
"code" in err &&
|
|
350
|
+
err.code !== "ENOENT") {
|
|
351
|
+
throw err;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
const localExists = localLstat !== null;
|
|
304
355
|
if (localExists) {
|
|
305
|
-
const
|
|
356
|
+
const isLocalSymlink = localLstat.isSymbolicLink();
|
|
357
|
+
// Kind-mismatch guard: a remote LIST entry is always a single
|
|
358
|
+
// S3 object (regular file or symlink record), but the local
|
|
359
|
+
// path may be a real directory if the user previously had a
|
|
360
|
+
// dir at this key. Hashing a directory throws EISDIR and
|
|
361
|
+
// aborts the whole pull. We don't auto-replace because that
|
|
362
|
+
// would `rm -rf` the user's directory; surface as a non-fatal
|
|
363
|
+
// skip and warn so the operator can reconcile manually
|
|
364
|
+
// (delete the local dir, or restructure the remote).
|
|
365
|
+
if (localLstat.isDirectory() && !isLocalSymlink) {
|
|
366
|
+
console.error(` Warning: ${remoteFile.key} exists locally as a directory; ` +
|
|
367
|
+
`cloud has a single object at this key. Skipping; manual ` +
|
|
368
|
+
`reconciliation required (rm -rf the local directory to pull).`);
|
|
369
|
+
items.push({ action: "skip-local-only", remoteFile, localPath });
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
const localHash = isLocalSymlink
|
|
373
|
+
? hashSymlinkTarget(fs.readlinkSync(localPath))
|
|
374
|
+
: hashFile(localPath);
|
|
306
375
|
const localChanged = !!journalEntry && journalEntry.hash !== localHash;
|
|
307
376
|
const remoteChanged = !!journalEntry && hasRemoteChanged(remoteFile, journalEntry);
|
|
308
377
|
// Mirror the original 3-way merge from the inline loop. Tested by
|
|
@@ -314,6 +383,18 @@ function computePullPlan(remoteFiles, journal, companyRoot, shouldSync, personal
|
|
|
314
383
|
remoteFile,
|
|
315
384
|
localPath,
|
|
316
385
|
localHash,
|
|
386
|
+
// localLstat is non-null inside this `if (localExists)`
|
|
387
|
+
// branch — the planner already lstat'd the path. Carry
|
|
388
|
+
// its mtime forward so the executor doesn't have to
|
|
389
|
+
// re-stat (which would follow links and crash on a
|
|
390
|
+
// dangling symlink). Same goes for size: the conflict
|
|
391
|
+
// executor's keep/skip branch needs to stamp the
|
|
392
|
+
// journal with a size, and statSync on a dangling
|
|
393
|
+
// symlink throws ENOENT (silently swallowed pre-fix),
|
|
394
|
+
// leaving the journal stale and re-firing the conflict
|
|
395
|
+
// every sync.
|
|
396
|
+
localMtime: localLstat.mtime,
|
|
397
|
+
localSize: isLocalSymlink ? 0 : localLstat.size,
|
|
317
398
|
});
|
|
318
399
|
continue;
|
|
319
400
|
}
|
package/dist/cli/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/sync.test.js
CHANGED
|
@@ -607,5 +607,307 @@ describe("sync", () => {
|
|
|
607
607
|
filesToSkip: 0,
|
|
608
608
|
});
|
|
609
609
|
});
|
|
610
|
+
it("stamps the journal with sha256(target) + size 0 when the downloaded entry is a symlink", async () => {
|
|
611
|
+
// Pre-fix, the post-download journal stamp called hashFile (which
|
|
612
|
+
// follows the link and reads the target file's bytes) and statSync
|
|
613
|
+
// (which follows the link and reports the target's size). The next
|
|
614
|
+
// push's skipUnchanged check would then compare its own
|
|
615
|
+
// sha256(target string) against the journal's "target file bytes"
|
|
616
|
+
// hash, never match, and re-upload every symlink on every tick. The
|
|
617
|
+
// fix: when localPath is a symlink after downloadFile, stamp the
|
|
618
|
+
// hash of readlink(localPath) and size 0 — exactly the values the
|
|
619
|
+
// push side would produce next.
|
|
620
|
+
const linkKey = "policies/personal-link.md";
|
|
621
|
+
const linkTarget = "../../personal/policies/real.md";
|
|
622
|
+
vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
|
|
623
|
+
{ key: linkKey, size: 0, lastModified: new Date(), etag: '"link-etag"' },
|
|
624
|
+
]);
|
|
625
|
+
vi.mocked(s3Module.downloadFile).mockImplementationOnce(async (_ctx, _key, localPath) => {
|
|
626
|
+
const dir = path.dirname(localPath);
|
|
627
|
+
if (!fs.existsSync(dir))
|
|
628
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
629
|
+
// Mirror real downloadFile's symlink branch.
|
|
630
|
+
fs.symlinkSync(linkTarget, localPath);
|
|
631
|
+
});
|
|
632
|
+
const result = await sync({
|
|
633
|
+
company: "acme",
|
|
634
|
+
vaultConfig: mockConfig,
|
|
635
|
+
hqRoot: tmpDir,
|
|
636
|
+
});
|
|
637
|
+
expect(result.filesDownloaded).toBe(1);
|
|
638
|
+
// Recompute the expected hash from the target string — same helper
|
|
639
|
+
// the push side uses in computePushPlan for kind: "symlink", so
|
|
640
|
+
// skip-unchanged works on the next tick.
|
|
641
|
+
const journalMod = await import("../journal.js");
|
|
642
|
+
const expectedHash = journalMod.hashSymlinkTarget(linkTarget);
|
|
643
|
+
const journal = JSON.parse(fs.readFileSync(journalPath, "utf-8"));
|
|
644
|
+
expect(journal.files[linkKey]).toMatchObject({
|
|
645
|
+
hash: expectedHash,
|
|
646
|
+
size: 0,
|
|
647
|
+
direction: "down",
|
|
648
|
+
});
|
|
649
|
+
});
|
|
650
|
+
it("does not crash when local is a real directory at a remote-key path (EISDIR guard)", async () => {
|
|
651
|
+
// Codex round-9 P2 follow-up: pre-fix, the pull planner's
|
|
652
|
+
// post-lstat branch always called hashFile (readFileSync) on a
|
|
653
|
+
// localPath whose lstat succeeded but wasn't a symlink. For a
|
|
654
|
+
// local *directory* at a remote-key path (e.g. user has
|
|
655
|
+
// `companies/acme/knowledge/` as a real dir, cloud has a single
|
|
656
|
+
// object at the same key), readFileSync threw EISDIR and the
|
|
657
|
+
// entire sync run aborted during planning. The fix surfaces it
|
|
658
|
+
// as a non-fatal skip-local-only with a warning so the operator
|
|
659
|
+
// can manually reconcile rather than crash the whole pull.
|
|
660
|
+
const localDirKey = "knowledge";
|
|
661
|
+
const localDir = path.join(tmpDir, "companies", "acme", localDirKey);
|
|
662
|
+
fs.mkdirSync(localDir, { recursive: true });
|
|
663
|
+
fs.writeFileSync(path.join(localDir, "inside.md"), "local-only content");
|
|
664
|
+
vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
|
|
665
|
+
{
|
|
666
|
+
key: localDirKey,
|
|
667
|
+
size: 100,
|
|
668
|
+
lastModified: new Date(),
|
|
669
|
+
etag: '"some-etag"',
|
|
670
|
+
},
|
|
671
|
+
]);
|
|
672
|
+
const warnSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
673
|
+
let crashed = false;
|
|
674
|
+
let result;
|
|
675
|
+
try {
|
|
676
|
+
result = await sync({
|
|
677
|
+
company: "acme",
|
|
678
|
+
vaultConfig: mockConfig,
|
|
679
|
+
hqRoot: tmpDir,
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
catch {
|
|
683
|
+
crashed = true;
|
|
684
|
+
}
|
|
685
|
+
warnSpy.mockRestore();
|
|
686
|
+
expect(crashed).toBe(false);
|
|
687
|
+
expect(result).toBeDefined();
|
|
688
|
+
// Skipped, not downloaded — destructive replacement of a local
|
|
689
|
+
// directory is a manual-reconciliation decision, not an automatic
|
|
690
|
+
// sync action.
|
|
691
|
+
expect(result.filesDownloaded).toBe(0);
|
|
692
|
+
expect(result.filesSkipped).toBe(1);
|
|
693
|
+
// Local directory still intact.
|
|
694
|
+
expect(fs.existsSync(path.join(localDir, "inside.md"))).toBe(true);
|
|
695
|
+
});
|
|
696
|
+
it("pulls a remote symlink record under an .hqinclude dir-only allowlist pattern", async () => {
|
|
697
|
+
// Codex round-7 P1 follow-up: pre-fix, computePullPlan called
|
|
698
|
+
// shouldSync(localPath) with the default isDir=false. LIST gives
|
|
699
|
+
// no file-vs-dir signal, so a remote symlink record at a path
|
|
700
|
+
// covered only by a dir-only .hqinclude pattern (e.g.
|
|
701
|
+
// `companies/*/knowledge/`) would be classified skip-ignored —
|
|
702
|
+
// the symlink record uploaded by the push-side fix would never
|
|
703
|
+
// propagate to peers. Symmetric to the walkDir/collectFiles
|
|
704
|
+
// dual-hint fix on the push side.
|
|
705
|
+
const linkKey = "knowledge";
|
|
706
|
+
const linkTarget = "../../repos/private/knowledge-acme";
|
|
707
|
+
// Allowlist with ONLY a dir-only pattern. The pre-fix bug was
|
|
708
|
+
// that the slashless probe didn't match this rule, so a bare
|
|
709
|
+
// `knowledge` alternative would mask the regression — keep the
|
|
710
|
+
// pattern strictly dir-only so the dual-hint probe is what
|
|
711
|
+
// actually has to make the test pass.
|
|
712
|
+
fs.writeFileSync(path.join(tmpDir, ".hqinclude"), "knowledge/\n");
|
|
713
|
+
vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
|
|
714
|
+
{ key: linkKey, size: 5, lastModified: new Date(), etag: '"link-etag-3"' },
|
|
715
|
+
]);
|
|
716
|
+
let downloadCalls = 0;
|
|
717
|
+
vi.mocked(s3Module.downloadFile).mockImplementationOnce(async (_ctx, _key, localPath) => {
|
|
718
|
+
downloadCalls++;
|
|
719
|
+
const dir = path.dirname(localPath);
|
|
720
|
+
if (!fs.existsSync(dir))
|
|
721
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
722
|
+
fs.symlinkSync(linkTarget, localPath);
|
|
723
|
+
});
|
|
724
|
+
const result = await sync({
|
|
725
|
+
company: "acme",
|
|
726
|
+
vaultConfig: mockConfig,
|
|
727
|
+
hqRoot: tmpDir,
|
|
728
|
+
});
|
|
729
|
+
// Pre-fix: filesDownloaded=0, filesSkipped=1 (skip-ignored).
|
|
730
|
+
// Post-fix: filesDownloaded=1.
|
|
731
|
+
expect(downloadCalls).toBe(1);
|
|
732
|
+
expect(result.filesDownloaded).toBe(1);
|
|
733
|
+
expect(fs
|
|
734
|
+
.lstatSync(path.join(tmpDir, "companies", "acme", linkKey))
|
|
735
|
+
.isSymbolicLink()).toBe(true);
|
|
736
|
+
});
|
|
737
|
+
it("does not flag a pristine local symlink as locally-changed in the pull planner", async () => {
|
|
738
|
+
// Codex P2 follow-up: pre-fix, computePullPlan called hashFile on
|
|
739
|
+
// localPath (which follows symlinks → hashes the target file's
|
|
740
|
+
// bytes) and compared that against the journal's
|
|
741
|
+
// sha256(target string). The hashes never matched, so a pristine
|
|
742
|
+
// symlink was always classified localChanged. Combined with a
|
|
743
|
+
// remote-side change from another machine, that mis-classified as a
|
|
744
|
+
// conflict and aborted overwrites; without remote change, it was
|
|
745
|
+
// only logged as skip-local-only. Either way the planner thought
|
|
746
|
+
// the local link was "edited" when it wasn't.
|
|
747
|
+
const linkKey = "policies/personal-link.md";
|
|
748
|
+
const linkTarget = "../../personal/policies/real.md";
|
|
749
|
+
// listRemoteFiles surfaces the raw S3 etag with literal quotes;
|
|
750
|
+
// the journal stamps the normalized (unquoted) form. Match the
|
|
751
|
+
// journal convention here so hasRemoteChanged returns false.
|
|
752
|
+
const remoteEtagWire = '"link-etag-2"';
|
|
753
|
+
const remoteEtagNormalized = "link-etag-2";
|
|
754
|
+
// Pre-create the link locally so the planner sees an existing
|
|
755
|
+
// symlink, and pre-stamp the journal with the SAME hash the push
|
|
756
|
+
// side would have written (hashSymlinkTarget of the target string).
|
|
757
|
+
const companyRoot = path.join(tmpDir, "companies", "acme");
|
|
758
|
+
const linkDir = path.dirname(path.join(companyRoot, linkKey));
|
|
759
|
+
fs.mkdirSync(linkDir, { recursive: true });
|
|
760
|
+
fs.symlinkSync(linkTarget, path.join(companyRoot, linkKey));
|
|
761
|
+
const journalMod = await import("../journal.js");
|
|
762
|
+
const matchingHash = journalMod.hashSymlinkTarget(linkTarget);
|
|
763
|
+
fs.writeFileSync(journalPath, JSON.stringify({
|
|
764
|
+
version: "1",
|
|
765
|
+
lastSync: new Date().toISOString(),
|
|
766
|
+
files: {
|
|
767
|
+
[linkKey]: {
|
|
768
|
+
hash: matchingHash,
|
|
769
|
+
size: 0,
|
|
770
|
+
syncedAt: new Date().toISOString(),
|
|
771
|
+
direction: "down",
|
|
772
|
+
remoteEtag: remoteEtagNormalized,
|
|
773
|
+
},
|
|
774
|
+
},
|
|
775
|
+
}));
|
|
776
|
+
vi.mocked(s3Module.listRemoteFiles).mockResolvedValue([
|
|
777
|
+
{ key: linkKey, size: 0, lastModified: new Date(), etag: remoteEtagWire },
|
|
778
|
+
]);
|
|
779
|
+
// downloadFile must NOT be called: the planner should skip
|
|
780
|
+
// (unchanged on both sides). Use a sentinel that throws if invoked.
|
|
781
|
+
vi.mocked(s3Module.downloadFile).mockImplementation(async () => {
|
|
782
|
+
throw new Error("download must not be called for unchanged symlink");
|
|
783
|
+
});
|
|
784
|
+
const result = await sync({
|
|
785
|
+
company: "acme",
|
|
786
|
+
vaultConfig: mockConfig,
|
|
787
|
+
hqRoot: tmpDir,
|
|
788
|
+
});
|
|
789
|
+
expect(result.filesDownloaded).toBe(0);
|
|
790
|
+
expect(result.filesSkipped).toBe(1);
|
|
791
|
+
expect(result.conflicts).toBe(0);
|
|
792
|
+
});
|
|
793
|
+
it("classifies a dangling-symlink + remote-change as a conflict without crashing on statSync", async () => {
|
|
794
|
+
// Codex round-11 P2 follow-up: pre-fix, the conflict executor
|
|
795
|
+
// built the resolveConflict prompt with `fs.statSync(localPath).
|
|
796
|
+
// mtime`, which follows symlinks. For a dangling symlink (target
|
|
797
|
+
// missing locally) that ALSO had a target rewrite (localChanged)
|
|
798
|
+
// and a remote change (remoteChanged), the planner classified it
|
|
799
|
+
// as a conflict, then statSync threw ENOENT trying to follow the
|
|
800
|
+
// dangling link to read mtime — aborting the entire pull before
|
|
801
|
+
// resolveConflict could run. Fix: carry the planner's lstat
|
|
802
|
+
// mtime forward through PullPlanItem.conflict.localMtime so the
|
|
803
|
+
// executor never re-stats the path.
|
|
804
|
+
const linkKey = "dangling-link.md";
|
|
805
|
+
// Old target — what the journal-recorded hash will reflect.
|
|
806
|
+
const oldTarget = "old-target.md";
|
|
807
|
+
// New (current) target — points to a path that doesn't exist
|
|
808
|
+
// locally → the link is dangling. The hash differs from the
|
|
809
|
+
// journal so localChanged = true.
|
|
810
|
+
const newTarget = "missing-target.md";
|
|
811
|
+
const companyRoot = path.join(tmpDir, "companies", "acme");
|
|
812
|
+
fs.mkdirSync(companyRoot, { recursive: true });
|
|
813
|
+
fs.symlinkSync(newTarget, path.join(companyRoot, linkKey));
|
|
814
|
+
// Pre-stamp the journal with the OLD target's symlink hash, plus a
|
|
815
|
+
// remoteEtag that won't match the LIST etag we mock (forcing
|
|
816
|
+
// remoteChanged = true on top of localChanged = true).
|
|
817
|
+
const journalMod = await import("../journal.js");
|
|
818
|
+
const oldHash = journalMod.hashSymlinkTarget(oldTarget);
|
|
819
|
+
fs.writeFileSync(journalPath, JSON.stringify({
|
|
820
|
+
version: "1",
|
|
821
|
+
lastSync: new Date().toISOString(),
|
|
822
|
+
files: {
|
|
823
|
+
[linkKey]: {
|
|
824
|
+
hash: oldHash,
|
|
825
|
+
size: 0,
|
|
826
|
+
syncedAt: new Date().toISOString(),
|
|
827
|
+
direction: "down",
|
|
828
|
+
remoteEtag: "old-remote-etag",
|
|
829
|
+
},
|
|
830
|
+
},
|
|
831
|
+
}));
|
|
832
|
+
vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
|
|
833
|
+
{
|
|
834
|
+
key: linkKey,
|
|
835
|
+
size: 30,
|
|
836
|
+
lastModified: new Date(),
|
|
837
|
+
etag: '"new-remote-etag"',
|
|
838
|
+
},
|
|
839
|
+
]);
|
|
840
|
+
// Auto-resolve the conflict by aborting. What we're really testing
|
|
841
|
+
// is that the executor *reaches* resolveConflict at all — pre-fix
|
|
842
|
+
// it crashed at fs.statSync before getting there.
|
|
843
|
+
const result = await sync({
|
|
844
|
+
company: "acme",
|
|
845
|
+
vaultConfig: mockConfig,
|
|
846
|
+
hqRoot: tmpDir,
|
|
847
|
+
onConflict: "abort",
|
|
848
|
+
});
|
|
849
|
+
expect(result.aborted).toBe(true);
|
|
850
|
+
expect(result.conflicts).toBe(1);
|
|
851
|
+
expect(result.conflictPaths).toContain(linkKey);
|
|
852
|
+
});
|
|
853
|
+
it("conflict resolution 'keep' on a dangling symlink stamps the journal so it doesn't re-fire next sync", async () => {
|
|
854
|
+
// Codex round-12 P2 follow-up: pre-fix, the keep/skip branch of
|
|
855
|
+
// the conflict executor called `fs.statSync(localPath).size` to
|
|
856
|
+
// populate the journal stamp. For a dangling symlink, statSync
|
|
857
|
+
// followed the link and threw ENOENT, the catch swallowed it,
|
|
858
|
+
// and the journal was never updated — so the next sync saw the
|
|
859
|
+
// same localChanged && remoteChanged combination and prompted
|
|
860
|
+
// for the SAME conflict forever, ignoring the user's keep
|
|
861
|
+
// choice. Fix: carry localSize (symlink-aware: 0 for symlinks)
|
|
862
|
+
// through the conflict item so the executor never re-stats.
|
|
863
|
+
const linkKey = "dangling-keep.md";
|
|
864
|
+
const oldTarget = "old-target.md";
|
|
865
|
+
const newTarget = "missing-target.md";
|
|
866
|
+
const newRemoteEtagWire = '"new-remote-etag-keep"';
|
|
867
|
+
const newRemoteEtagNormalized = "new-remote-etag-keep";
|
|
868
|
+
const companyRoot = path.join(tmpDir, "companies", "acme");
|
|
869
|
+
fs.mkdirSync(companyRoot, { recursive: true });
|
|
870
|
+
fs.symlinkSync(newTarget, path.join(companyRoot, linkKey));
|
|
871
|
+
const journalMod = await import("../journal.js");
|
|
872
|
+
const oldHash = journalMod.hashSymlinkTarget(oldTarget);
|
|
873
|
+
const expectedNewHash = journalMod.hashSymlinkTarget(newTarget);
|
|
874
|
+
fs.writeFileSync(journalPath, JSON.stringify({
|
|
875
|
+
version: "1",
|
|
876
|
+
lastSync: new Date().toISOString(),
|
|
877
|
+
files: {
|
|
878
|
+
[linkKey]: {
|
|
879
|
+
hash: oldHash,
|
|
880
|
+
size: 0,
|
|
881
|
+
syncedAt: new Date().toISOString(),
|
|
882
|
+
direction: "down",
|
|
883
|
+
remoteEtag: "old-remote-etag-keep",
|
|
884
|
+
},
|
|
885
|
+
},
|
|
886
|
+
}));
|
|
887
|
+
vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
|
|
888
|
+
{
|
|
889
|
+
key: linkKey,
|
|
890
|
+
size: 30,
|
|
891
|
+
lastModified: new Date(),
|
|
892
|
+
etag: newRemoteEtagWire,
|
|
893
|
+
},
|
|
894
|
+
]);
|
|
895
|
+
const result = await sync({
|
|
896
|
+
company: "acme",
|
|
897
|
+
vaultConfig: mockConfig,
|
|
898
|
+
hqRoot: tmpDir,
|
|
899
|
+
onConflict: "keep",
|
|
900
|
+
});
|
|
901
|
+
expect(result.aborted).toBe(false);
|
|
902
|
+
expect(result.conflicts).toBe(1);
|
|
903
|
+
// The journal MUST be updated to reflect the user's keep
|
|
904
|
+
// decision. Pre-fix: catch swallowed the ENOENT, journal stayed
|
|
905
|
+
// at oldHash + old etag, every subsequent sync re-fired.
|
|
906
|
+
const journal = JSON.parse(fs.readFileSync(journalPath, "utf-8"));
|
|
907
|
+
const entry = journal.files[linkKey];
|
|
908
|
+
expect(entry.hash).toBe(expectedNewHash);
|
|
909
|
+
expect(entry.size).toBe(0);
|
|
910
|
+
expect(entry.remoteEtag).toBe(newRemoteEtagNormalized);
|
|
911
|
+
});
|
|
610
912
|
});
|
|
611
913
|
//# sourceMappingURL=sync.test.js.map
|