@indigoai-us/hq-cloud 5.17.0 → 5.19.0

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.
Files changed (53) hide show
  1. package/.github/workflows/ci.yml +19 -0
  2. package/.github/workflows/publish.yml +53 -0
  3. package/dist/cli/invite.js +4 -1
  4. package/dist/cli/invite.js.map +1 -1
  5. package/dist/cli/invite.test.js +3 -0
  6. package/dist/cli/invite.test.js.map +1 -1
  7. package/dist/cli/promote.js +3 -0
  8. package/dist/cli/promote.js.map +1 -1
  9. package/dist/cli/share.d.ts +7 -5
  10. package/dist/cli/share.d.ts.map +1 -1
  11. package/dist/cli/share.js +189 -18
  12. package/dist/cli/share.js.map +1 -1
  13. package/dist/cli/share.test.js +304 -3
  14. package/dist/cli/share.test.js.map +1 -1
  15. package/dist/cli/sync.d.ts.map +1 -1
  16. package/dist/cli/sync.js +98 -17
  17. package/dist/cli/sync.js.map +1 -1
  18. package/dist/cli/sync.test.js +314 -0
  19. package/dist/cli/sync.test.js.map +1 -1
  20. package/dist/context.d.ts.map +1 -1
  21. package/dist/context.js +107 -18
  22. package/dist/context.js.map +1 -1
  23. package/dist/context.test.js +63 -14
  24. package/dist/context.test.js.map +1 -1
  25. package/dist/journal.d.ts +26 -0
  26. package/dist/journal.d.ts.map +1 -1
  27. package/dist/journal.js +31 -0
  28. package/dist/journal.js.map +1 -1
  29. package/dist/s3.d.ts +91 -0
  30. package/dist/s3.d.ts.map +1 -1
  31. package/dist/s3.js +245 -0
  32. package/dist/s3.js.map +1 -1
  33. package/dist/s3.test.js +347 -1
  34. package/dist/s3.test.js.map +1 -1
  35. package/dist/vault-client.d.ts +24 -0
  36. package/dist/vault-client.d.ts.map +1 -1
  37. package/dist/vault-client.js +29 -0
  38. package/dist/vault-client.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/cli/invite.test.ts +3 -0
  41. package/src/cli/invite.ts +4 -1
  42. package/src/cli/promote.ts +3 -0
  43. package/src/cli/share.test.ts +377 -3
  44. package/src/cli/share.ts +241 -28
  45. package/src/cli/sync.test.ts +357 -0
  46. package/src/cli/sync.ts +133 -24
  47. package/src/context.test.ts +73 -14
  48. package/src/context.ts +116 -20
  49. package/src/journal.ts +33 -0
  50. package/src/s3.test.ts +415 -1
  51. package/src/s3.ts +271 -0
  52. package/src/vault-client.ts +37 -0
  53. 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
- localModified: fs.statSync(localPath).mtime,
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
- try {
157
- const stat = fs.statSync(localPath);
158
- updateEntry(journal, remoteFile.key, item.localHash, stat.size, "down", remoteFile.etag);
159
- }
160
- catch {
161
- // best-effort sync continues even if stat fails
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
- const hash = hashFile(localPath);
171
- const stat = fs.statSync(localPath);
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, stat.size, "down", remoteFile.etag);
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: stat.size,
198
+ bytes: size,
183
199
  ...(remoteJournalMessage ? { message: remoteJournalMessage } : {}),
184
200
  });
185
201
  filesDownloaded++;
186
- bytesDownloaded += stat.size;
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
- if (!shouldSync(localPath)) {
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
- const localExists = fs.existsSync(localPath);
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 localHash = hashFile(localPath);
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
  }
@@ -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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"}
@@ -53,6 +53,18 @@ const mockVendResponse = {
53
53
  function setupFetchMock() {
54
54
  const fetchMock = vi.fn().mockImplementation(async (url) => {
55
55
  const urlStr = String(url);
56
+ // New per-user-namespace slug resolver (hq-pro PR 67). Returns the
57
+ // mockEntity's uid as the in-namespace match; the caller then
58
+ // re-fetches it via `/entity/{uid}`, which is matched by the
59
+ // `/entity/cmp_/` branch below.
60
+ if (urlStr.includes("/entity/check-slug/me")) {
61
+ return {
62
+ ok: true,
63
+ status: 200,
64
+ json: async () => ({ available: false, conflictingCompanyUid: mockEntity.uid }),
65
+ text: async () => "",
66
+ };
67
+ }
56
68
  if (urlStr.includes("/entity/by-slug/") || /\/entity\/cmp_/.test(urlStr)) {
57
69
  return { ok: true, status: 200, json: async () => ({ entity: mockEntity }), text: async () => "" };
58
70
  }
@@ -607,5 +619,307 @@ describe("sync", () => {
607
619
  filesToSkip: 0,
608
620
  });
609
621
  });
622
+ it("stamps the journal with sha256(target) + size 0 when the downloaded entry is a symlink", async () => {
623
+ // Pre-fix, the post-download journal stamp called hashFile (which
624
+ // follows the link and reads the target file's bytes) and statSync
625
+ // (which follows the link and reports the target's size). The next
626
+ // push's skipUnchanged check would then compare its own
627
+ // sha256(target string) against the journal's "target file bytes"
628
+ // hash, never match, and re-upload every symlink on every tick. The
629
+ // fix: when localPath is a symlink after downloadFile, stamp the
630
+ // hash of readlink(localPath) and size 0 — exactly the values the
631
+ // push side would produce next.
632
+ const linkKey = "policies/personal-link.md";
633
+ const linkTarget = "../../personal/policies/real.md";
634
+ vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
635
+ { key: linkKey, size: 0, lastModified: new Date(), etag: '"link-etag"' },
636
+ ]);
637
+ vi.mocked(s3Module.downloadFile).mockImplementationOnce(async (_ctx, _key, localPath) => {
638
+ const dir = path.dirname(localPath);
639
+ if (!fs.existsSync(dir))
640
+ fs.mkdirSync(dir, { recursive: true });
641
+ // Mirror real downloadFile's symlink branch.
642
+ fs.symlinkSync(linkTarget, localPath);
643
+ });
644
+ const result = await sync({
645
+ company: "acme",
646
+ vaultConfig: mockConfig,
647
+ hqRoot: tmpDir,
648
+ });
649
+ expect(result.filesDownloaded).toBe(1);
650
+ // Recompute the expected hash from the target string — same helper
651
+ // the push side uses in computePushPlan for kind: "symlink", so
652
+ // skip-unchanged works on the next tick.
653
+ const journalMod = await import("../journal.js");
654
+ const expectedHash = journalMod.hashSymlinkTarget(linkTarget);
655
+ const journal = JSON.parse(fs.readFileSync(journalPath, "utf-8"));
656
+ expect(journal.files[linkKey]).toMatchObject({
657
+ hash: expectedHash,
658
+ size: 0,
659
+ direction: "down",
660
+ });
661
+ });
662
+ it("does not crash when local is a real directory at a remote-key path (EISDIR guard)", async () => {
663
+ // Codex round-9 P2 follow-up: pre-fix, the pull planner's
664
+ // post-lstat branch always called hashFile (readFileSync) on a
665
+ // localPath whose lstat succeeded but wasn't a symlink. For a
666
+ // local *directory* at a remote-key path (e.g. user has
667
+ // `companies/acme/knowledge/` as a real dir, cloud has a single
668
+ // object at the same key), readFileSync threw EISDIR and the
669
+ // entire sync run aborted during planning. The fix surfaces it
670
+ // as a non-fatal skip-local-only with a warning so the operator
671
+ // can manually reconcile rather than crash the whole pull.
672
+ const localDirKey = "knowledge";
673
+ const localDir = path.join(tmpDir, "companies", "acme", localDirKey);
674
+ fs.mkdirSync(localDir, { recursive: true });
675
+ fs.writeFileSync(path.join(localDir, "inside.md"), "local-only content");
676
+ vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
677
+ {
678
+ key: localDirKey,
679
+ size: 100,
680
+ lastModified: new Date(),
681
+ etag: '"some-etag"',
682
+ },
683
+ ]);
684
+ const warnSpy = vi.spyOn(console, "error").mockImplementation(() => { });
685
+ let crashed = false;
686
+ let result;
687
+ try {
688
+ result = await sync({
689
+ company: "acme",
690
+ vaultConfig: mockConfig,
691
+ hqRoot: tmpDir,
692
+ });
693
+ }
694
+ catch {
695
+ crashed = true;
696
+ }
697
+ warnSpy.mockRestore();
698
+ expect(crashed).toBe(false);
699
+ expect(result).toBeDefined();
700
+ // Skipped, not downloaded — destructive replacement of a local
701
+ // directory is a manual-reconciliation decision, not an automatic
702
+ // sync action.
703
+ expect(result.filesDownloaded).toBe(0);
704
+ expect(result.filesSkipped).toBe(1);
705
+ // Local directory still intact.
706
+ expect(fs.existsSync(path.join(localDir, "inside.md"))).toBe(true);
707
+ });
708
+ it("pulls a remote symlink record under an .hqinclude dir-only allowlist pattern", async () => {
709
+ // Codex round-7 P1 follow-up: pre-fix, computePullPlan called
710
+ // shouldSync(localPath) with the default isDir=false. LIST gives
711
+ // no file-vs-dir signal, so a remote symlink record at a path
712
+ // covered only by a dir-only .hqinclude pattern (e.g.
713
+ // `companies/*/knowledge/`) would be classified skip-ignored —
714
+ // the symlink record uploaded by the push-side fix would never
715
+ // propagate to peers. Symmetric to the walkDir/collectFiles
716
+ // dual-hint fix on the push side.
717
+ const linkKey = "knowledge";
718
+ const linkTarget = "../../repos/private/knowledge-acme";
719
+ // Allowlist with ONLY a dir-only pattern. The pre-fix bug was
720
+ // that the slashless probe didn't match this rule, so a bare
721
+ // `knowledge` alternative would mask the regression — keep the
722
+ // pattern strictly dir-only so the dual-hint probe is what
723
+ // actually has to make the test pass.
724
+ fs.writeFileSync(path.join(tmpDir, ".hqinclude"), "knowledge/\n");
725
+ vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
726
+ { key: linkKey, size: 5, lastModified: new Date(), etag: '"link-etag-3"' },
727
+ ]);
728
+ let downloadCalls = 0;
729
+ vi.mocked(s3Module.downloadFile).mockImplementationOnce(async (_ctx, _key, localPath) => {
730
+ downloadCalls++;
731
+ const dir = path.dirname(localPath);
732
+ if (!fs.existsSync(dir))
733
+ fs.mkdirSync(dir, { recursive: true });
734
+ fs.symlinkSync(linkTarget, localPath);
735
+ });
736
+ const result = await sync({
737
+ company: "acme",
738
+ vaultConfig: mockConfig,
739
+ hqRoot: tmpDir,
740
+ });
741
+ // Pre-fix: filesDownloaded=0, filesSkipped=1 (skip-ignored).
742
+ // Post-fix: filesDownloaded=1.
743
+ expect(downloadCalls).toBe(1);
744
+ expect(result.filesDownloaded).toBe(1);
745
+ expect(fs
746
+ .lstatSync(path.join(tmpDir, "companies", "acme", linkKey))
747
+ .isSymbolicLink()).toBe(true);
748
+ });
749
+ it("does not flag a pristine local symlink as locally-changed in the pull planner", async () => {
750
+ // Codex P2 follow-up: pre-fix, computePullPlan called hashFile on
751
+ // localPath (which follows symlinks → hashes the target file's
752
+ // bytes) and compared that against the journal's
753
+ // sha256(target string). The hashes never matched, so a pristine
754
+ // symlink was always classified localChanged. Combined with a
755
+ // remote-side change from another machine, that mis-classified as a
756
+ // conflict and aborted overwrites; without remote change, it was
757
+ // only logged as skip-local-only. Either way the planner thought
758
+ // the local link was "edited" when it wasn't.
759
+ const linkKey = "policies/personal-link.md";
760
+ const linkTarget = "../../personal/policies/real.md";
761
+ // listRemoteFiles surfaces the raw S3 etag with literal quotes;
762
+ // the journal stamps the normalized (unquoted) form. Match the
763
+ // journal convention here so hasRemoteChanged returns false.
764
+ const remoteEtagWire = '"link-etag-2"';
765
+ const remoteEtagNormalized = "link-etag-2";
766
+ // Pre-create the link locally so the planner sees an existing
767
+ // symlink, and pre-stamp the journal with the SAME hash the push
768
+ // side would have written (hashSymlinkTarget of the target string).
769
+ const companyRoot = path.join(tmpDir, "companies", "acme");
770
+ const linkDir = path.dirname(path.join(companyRoot, linkKey));
771
+ fs.mkdirSync(linkDir, { recursive: true });
772
+ fs.symlinkSync(linkTarget, path.join(companyRoot, linkKey));
773
+ const journalMod = await import("../journal.js");
774
+ const matchingHash = journalMod.hashSymlinkTarget(linkTarget);
775
+ fs.writeFileSync(journalPath, JSON.stringify({
776
+ version: "1",
777
+ lastSync: new Date().toISOString(),
778
+ files: {
779
+ [linkKey]: {
780
+ hash: matchingHash,
781
+ size: 0,
782
+ syncedAt: new Date().toISOString(),
783
+ direction: "down",
784
+ remoteEtag: remoteEtagNormalized,
785
+ },
786
+ },
787
+ }));
788
+ vi.mocked(s3Module.listRemoteFiles).mockResolvedValue([
789
+ { key: linkKey, size: 0, lastModified: new Date(), etag: remoteEtagWire },
790
+ ]);
791
+ // downloadFile must NOT be called: the planner should skip
792
+ // (unchanged on both sides). Use a sentinel that throws if invoked.
793
+ vi.mocked(s3Module.downloadFile).mockImplementation(async () => {
794
+ throw new Error("download must not be called for unchanged symlink");
795
+ });
796
+ const result = await sync({
797
+ company: "acme",
798
+ vaultConfig: mockConfig,
799
+ hqRoot: tmpDir,
800
+ });
801
+ expect(result.filesDownloaded).toBe(0);
802
+ expect(result.filesSkipped).toBe(1);
803
+ expect(result.conflicts).toBe(0);
804
+ });
805
+ it("classifies a dangling-symlink + remote-change as a conflict without crashing on statSync", async () => {
806
+ // Codex round-11 P2 follow-up: pre-fix, the conflict executor
807
+ // built the resolveConflict prompt with `fs.statSync(localPath).
808
+ // mtime`, which follows symlinks. For a dangling symlink (target
809
+ // missing locally) that ALSO had a target rewrite (localChanged)
810
+ // and a remote change (remoteChanged), the planner classified it
811
+ // as a conflict, then statSync threw ENOENT trying to follow the
812
+ // dangling link to read mtime — aborting the entire pull before
813
+ // resolveConflict could run. Fix: carry the planner's lstat
814
+ // mtime forward through PullPlanItem.conflict.localMtime so the
815
+ // executor never re-stats the path.
816
+ const linkKey = "dangling-link.md";
817
+ // Old target — what the journal-recorded hash will reflect.
818
+ const oldTarget = "old-target.md";
819
+ // New (current) target — points to a path that doesn't exist
820
+ // locally → the link is dangling. The hash differs from the
821
+ // journal so localChanged = true.
822
+ const newTarget = "missing-target.md";
823
+ const companyRoot = path.join(tmpDir, "companies", "acme");
824
+ fs.mkdirSync(companyRoot, { recursive: true });
825
+ fs.symlinkSync(newTarget, path.join(companyRoot, linkKey));
826
+ // Pre-stamp the journal with the OLD target's symlink hash, plus a
827
+ // remoteEtag that won't match the LIST etag we mock (forcing
828
+ // remoteChanged = true on top of localChanged = true).
829
+ const journalMod = await import("../journal.js");
830
+ const oldHash = journalMod.hashSymlinkTarget(oldTarget);
831
+ fs.writeFileSync(journalPath, JSON.stringify({
832
+ version: "1",
833
+ lastSync: new Date().toISOString(),
834
+ files: {
835
+ [linkKey]: {
836
+ hash: oldHash,
837
+ size: 0,
838
+ syncedAt: new Date().toISOString(),
839
+ direction: "down",
840
+ remoteEtag: "old-remote-etag",
841
+ },
842
+ },
843
+ }));
844
+ vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
845
+ {
846
+ key: linkKey,
847
+ size: 30,
848
+ lastModified: new Date(),
849
+ etag: '"new-remote-etag"',
850
+ },
851
+ ]);
852
+ // Auto-resolve the conflict by aborting. What we're really testing
853
+ // is that the executor *reaches* resolveConflict at all — pre-fix
854
+ // it crashed at fs.statSync before getting there.
855
+ const result = await sync({
856
+ company: "acme",
857
+ vaultConfig: mockConfig,
858
+ hqRoot: tmpDir,
859
+ onConflict: "abort",
860
+ });
861
+ expect(result.aborted).toBe(true);
862
+ expect(result.conflicts).toBe(1);
863
+ expect(result.conflictPaths).toContain(linkKey);
864
+ });
865
+ it("conflict resolution 'keep' on a dangling symlink stamps the journal so it doesn't re-fire next sync", async () => {
866
+ // Codex round-12 P2 follow-up: pre-fix, the keep/skip branch of
867
+ // the conflict executor called `fs.statSync(localPath).size` to
868
+ // populate the journal stamp. For a dangling symlink, statSync
869
+ // followed the link and threw ENOENT, the catch swallowed it,
870
+ // and the journal was never updated — so the next sync saw the
871
+ // same localChanged && remoteChanged combination and prompted
872
+ // for the SAME conflict forever, ignoring the user's keep
873
+ // choice. Fix: carry localSize (symlink-aware: 0 for symlinks)
874
+ // through the conflict item so the executor never re-stats.
875
+ const linkKey = "dangling-keep.md";
876
+ const oldTarget = "old-target.md";
877
+ const newTarget = "missing-target.md";
878
+ const newRemoteEtagWire = '"new-remote-etag-keep"';
879
+ const newRemoteEtagNormalized = "new-remote-etag-keep";
880
+ const companyRoot = path.join(tmpDir, "companies", "acme");
881
+ fs.mkdirSync(companyRoot, { recursive: true });
882
+ fs.symlinkSync(newTarget, path.join(companyRoot, linkKey));
883
+ const journalMod = await import("../journal.js");
884
+ const oldHash = journalMod.hashSymlinkTarget(oldTarget);
885
+ const expectedNewHash = journalMod.hashSymlinkTarget(newTarget);
886
+ fs.writeFileSync(journalPath, JSON.stringify({
887
+ version: "1",
888
+ lastSync: new Date().toISOString(),
889
+ files: {
890
+ [linkKey]: {
891
+ hash: oldHash,
892
+ size: 0,
893
+ syncedAt: new Date().toISOString(),
894
+ direction: "down",
895
+ remoteEtag: "old-remote-etag-keep",
896
+ },
897
+ },
898
+ }));
899
+ vi.mocked(s3Module.listRemoteFiles).mockResolvedValueOnce([
900
+ {
901
+ key: linkKey,
902
+ size: 30,
903
+ lastModified: new Date(),
904
+ etag: newRemoteEtagWire,
905
+ },
906
+ ]);
907
+ const result = await sync({
908
+ company: "acme",
909
+ vaultConfig: mockConfig,
910
+ hqRoot: tmpDir,
911
+ onConflict: "keep",
912
+ });
913
+ expect(result.aborted).toBe(false);
914
+ expect(result.conflicts).toBe(1);
915
+ // The journal MUST be updated to reflect the user's keep
916
+ // decision. Pre-fix: catch swallowed the ENOENT, journal stayed
917
+ // at oldHash + old etag, every subsequent sync re-fired.
918
+ const journal = JSON.parse(fs.readFileSync(journalPath, "utf-8"));
919
+ const entry = journal.files[linkKey];
920
+ expect(entry.hash).toBe(expectedNewHash);
921
+ expect(entry.size).toBe(0);
922
+ expect(entry.remoteEtag).toBe(newRemoteEtagNormalized);
923
+ });
610
924
  });
611
925
  //# sourceMappingURL=sync.test.js.map