@indigoai-us/hq-cloud 5.3.0 → 5.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"sync.test.js","sourceRoot":"","sources":["../../src/cli/sync.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.test.js","sourceRoot":"","sources":["../../src/cli/sync.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indigoai-us/hq-cloud",
3
- "version": "5.3.0",
3
+ "version": "5.4.0",
4
4
  "description": "HQ by Indigo cloud sync engine — bidirectional S3 sync for mobile access",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -61,6 +61,7 @@ function defaultSyncResult(overrides: Partial<SyncResult> = {}): SyncResult {
61
61
  bytesDownloaded: 0,
62
62
  filesSkipped: 0,
63
63
  conflicts: 0,
64
+ conflictPaths: [],
64
65
  aborted: false,
65
66
  ...overrides,
66
67
  };
@@ -71,6 +72,7 @@ function defaultShareResult(overrides: Partial<ShareResult> = {}): ShareResult {
71
72
  filesUploaded: 0,
72
73
  bytesUploaded: 0,
73
74
  filesSkipped: 0,
75
+ conflictPaths: [],
74
76
  aborted: false,
75
77
  ...overrides,
76
78
  };
@@ -206,18 +208,20 @@ describe("argv parsing", () => {
206
208
  // ---------------------------------------------------------------------------
207
209
 
208
210
  describe("auth", () => {
209
- it("emits auth-error and returns 0 when token fetch fails", async () => {
211
+ it("emits auth-error on stderr and returns 0 when token fetch fails", async () => {
210
212
  const deps = makeDeps({
211
213
  getAccessToken: vi.fn().mockRejectedValue(new Error("no cached tokens")),
212
214
  });
213
215
  const code = await runRunner(["--companies"], deps);
214
216
  expect(code).toBe(0);
215
- expect(deps.stdout.events()).toEqual([
217
+ // auth-error is an error-class event → stderr, not stdout
218
+ expect(deps.stderr.events()).toEqual([
216
219
  { type: "auth-error", message: "no cached tokens" },
217
220
  ]);
221
+ expect(deps.stdout.events()).toEqual([]);
218
222
  });
219
223
 
220
- it("emits auth-error when VaultAuthError thrown during discovery", async () => {
224
+ it("emits auth-error on stderr when VaultAuthError thrown during discovery", async () => {
221
225
  const deps = makeDeps({
222
226
  createVaultClient: () => ({
223
227
  ...makeVaultStub(),
@@ -227,12 +231,13 @@ describe("auth", () => {
227
231
  });
228
232
  const code = await runRunner(["--companies"], deps);
229
233
  expect(code).toBe(0);
230
- expect(deps.stdout.events()).toEqual([
234
+ expect(deps.stderr.events()).toEqual([
231
235
  { type: "auth-error", message: "token expired" },
232
236
  ]);
237
+ expect(deps.stdout.events()).toEqual([]);
233
238
  });
234
239
 
235
- it("emits error event and returns 1 on non-auth discovery failure", async () => {
240
+ it("emits error event on stderr and returns 1 on non-auth discovery failure", async () => {
236
241
  const deps = makeDeps({
237
242
  createVaultClient: () => ({
238
243
  ...makeVaultStub(),
@@ -241,13 +246,15 @@ describe("auth", () => {
241
246
  });
242
247
  const code = await runRunner(["--companies"], deps);
243
248
  expect(code).toBe(1);
244
- const events = deps.stdout.events();
249
+ // error events go to stderr, not stdout
250
+ const events = deps.stderr.events();
245
251
  expect(events).toHaveLength(1);
246
252
  expect(events[0]).toMatchObject({
247
253
  type: "error",
248
254
  message: "network down",
249
255
  path: "(discovery)",
250
256
  });
257
+ expect(deps.stdout.events()).toEqual([]);
251
258
  });
252
259
  });
253
260
 
@@ -588,7 +595,8 @@ describe("per-company fanout", () => {
588
595
 
589
596
  const code = await runRunner(["--companies"], deps);
590
597
  expect(code).toBe(0);
591
- const errs = deps.stdout
598
+ // Per-file errors are routed to stderr (error-class events).
599
+ const errs = deps.stderr
592
600
  .events()
593
601
  .filter((e): e is Extract<RunnerEvent, { type: "error" }> =>
594
602
  e.type === "error",
@@ -634,12 +642,61 @@ describe("per-company fanout", () => {
634
642
  bytesDownloaded: result.bytesDownloaded,
635
643
  filesSkipped: result.filesSkipped,
636
644
  conflicts: result.conflicts,
645
+ conflictPaths: [],
637
646
  aborted: result.aborted,
638
647
  filesUploaded: 0,
639
648
  bytesUploaded: 0,
640
649
  });
641
650
  });
642
651
 
652
+ it("surfaces conflictPaths from both push and pull in per-company complete and aggregated all-complete", async () => {
653
+ // Non-aborting conflict on each side so the runner runs both phases:
654
+ // when push aborts, pull is skipped (separate `pull is skipped when push
655
+ // aborts` test covers that branch). Here we want to verify path merging
656
+ // when both phases produced paths.
657
+ const pullResult = defaultSyncResult({
658
+ conflicts: 1,
659
+ conflictPaths: ["docs/handoff.md"],
660
+ aborted: false,
661
+ });
662
+ const pushResult = defaultShareResult({
663
+ conflictPaths: ["notes/scratch.md"],
664
+ aborted: false,
665
+ });
666
+ const deps = makeDeps({
667
+ createVaultClient: () =>
668
+ makeVaultStub({
669
+ memberships: [{ companyUid: "cmp_a" }],
670
+ entityGet: (uid: string) =>
671
+ Promise.resolve({ uid, slug: "acme" } as unknown as EntityInfo),
672
+ }),
673
+ sync: vi.fn().mockResolvedValue(pullResult),
674
+ share: vi.fn().mockResolvedValue(pushResult),
675
+ });
676
+
677
+ const code = await runRunner(
678
+ ["--companies", "--direction", "both"],
679
+ deps,
680
+ );
681
+ expect(code).toBe(0);
682
+
683
+ const complete = deps.stdout
684
+ .events()
685
+ .find((e) => e.type === "complete") as Extract<RunnerEvent, { type: "complete" }>;
686
+ expect(complete.conflictPaths).toEqual([
687
+ "docs/handoff.md",
688
+ "notes/scratch.md",
689
+ ]);
690
+
691
+ const allComplete = deps.stdout
692
+ .events()
693
+ .find((e) => e.type === "all-complete") as Extract<RunnerEvent, { type: "all-complete" }>;
694
+ expect(allComplete.conflictPaths).toEqual([
695
+ { company: "acme", path: "docs/handoff.md", direction: "pull" },
696
+ { company: "acme", path: "notes/scratch.md", direction: "push" },
697
+ ]);
698
+ });
699
+
643
700
  it("passes --on-conflict and --hq-root through to sync()", async () => {
644
701
  const syncSpy = vi.fn().mockResolvedValue(defaultSyncResult());
645
702
  const deps = makeDeps({
@@ -691,23 +748,27 @@ describe("per-company fanout", () => {
691
748
  const code = await runRunner(["--companies"], deps);
692
749
  expect(code).toBe(0); // whole fanout still returns 0
693
750
 
694
- const events = deps.stdout.events();
695
751
  // Error event for acme (company-level) with path sentinel "(company)"
696
- const companyErr = events.find(
697
- (e): e is Extract<RunnerEvent, { type: "error" }> =>
698
- e.type === "error" && e.company === "acme",
699
- );
752
+ // error-class events route to stderr.
753
+ const companyErr = deps.stderr
754
+ .events()
755
+ .find(
756
+ (e): e is Extract<RunnerEvent, { type: "error" }> =>
757
+ e.type === "error" && e.company === "acme",
758
+ );
700
759
  expect(companyErr).toMatchObject({
701
760
  type: "error",
702
761
  company: "acme",
703
762
  path: "(company)",
704
763
  message: "acme blew up",
705
764
  });
706
- // But beta still completed
707
- const betaComplete = events.find(
708
- (e): e is Extract<RunnerEvent, { type: "complete" }> =>
709
- e.type === "complete" && e.company === "beta",
710
- );
765
+ // But beta still completed — non-error events stay on stdout.
766
+ const betaComplete = deps.stdout
767
+ .events()
768
+ .find(
769
+ (e): e is Extract<RunnerEvent, { type: "complete" }> =>
770
+ e.type === "complete" && e.company === "beta",
771
+ );
711
772
  expect(betaComplete).toBeDefined();
712
773
  expect(betaComplete?.filesDownloaded).toBe(1);
713
774
  });
@@ -749,6 +810,7 @@ describe("all-complete aggregate", () => {
749
810
  bytesDownloaded: 350,
750
811
  filesUploaded: 0,
751
812
  bytesUploaded: 0,
813
+ conflictPaths: [],
752
814
  errors: [],
753
815
  });
754
816
  });
@@ -1019,6 +1081,7 @@ describe("--direction", () => {
1019
1081
  bytesDownloaded: 350,
1020
1082
  filesUploaded: 3,
1021
1083
  bytesUploaded: 125,
1084
+ conflictPaths: [],
1022
1085
  errors: [],
1023
1086
  });
1024
1087
  });
@@ -4,10 +4,10 @@
4
4
  * (ADR-0001).
5
5
  *
6
6
  * The AppBar Sync menubar (Tauri + Rust) spawns this binary as a subprocess
7
- * and reads ndjson events from stdout. The protocol is intentionally narrow
8
- * and versioned-by-shape, not by tooling — no chalk, no colors, no human
9
- * prose. If you want to invoke sync as a human, use `hq sync` in
10
- * `@indigoai-us/hq-cli`.
7
+ * and reads ndjson events from BOTH stdout and stderr (see "Channels"
8
+ * below). The protocol is intentionally narrow and versioned-by-shape, not
9
+ * by tooling no chalk, no colors, no human prose. If you want to invoke
10
+ * sync as a human, use `hq sync` in `@indigoai-us/hq-cli`.
11
11
  *
12
12
  * Flags:
13
13
  * --companies Fan out across every membership the caller has
@@ -18,14 +18,23 @@
18
18
  * only output mode. Accepted for symmetry with the
19
19
  * AppBar's argv in case someone passes it.
20
20
  *
21
- * Event protocol (one JSON object per line on stdout):
22
- * setup-needed caller signed in but has no person entity yet
23
- * auth-error — no valid token available (interactive login disabled)
24
- * fanout-plan list of companies we're about to sync
25
- * progress per-file download
26
- * error — per-file or per-company error
27
- * complete — per-company summary
28
- * all-complete aggregate summary after fanout
21
+ * Channels (one JSON object per line):
22
+ * stdout protocol stream:
23
+ * setup-needed caller signed in but has no person entity yet
24
+ * fanout-plan list of companies we're about to sync
25
+ * progress per-file download
26
+ * complete per-company summary
27
+ * all-complete aggregate summary after fanout
28
+ * stderr diagnostic stream:
29
+ * error per-file or per-company error
30
+ * auth-error no valid token available (interactive login disabled)
31
+ *
32
+ * Why the split: error-class events go to stderr so the menubar's Sentry
33
+ * breadcrumb pipeline picks them up automatically (see hq-sync
34
+ * src-tauri/src/commands/sync.rs `ProcessEvent::Stderr` handler). The
35
+ * single Sentry capture at runner-exit then ships one #hq-alerts issue
36
+ * with the full per-file → company → exit error trail attached, instead
37
+ * of requiring per-event capture calls in the menubar.
29
38
  *
30
39
  * Exit code:
31
40
  * 0 — event stream describes the outcome (including setup-needed)
@@ -100,10 +109,14 @@ const DEFAULT_HQ_ROOT = path.join(os.homedir(), "hq");
100
109
  // ---------------------------------------------------------------------------
101
110
 
102
111
  /**
103
- * Every event emitted on stdout. The `company` field is present on every
104
- * event except `setup-needed` / `auth-error` / `fanout-plan` / `all-complete`
105
- * (which describe the whole run) consumers should treat its absence as
106
- * "meta-event, not tied to a specific company".
112
+ * Every event the runner emits. Channel routing (stdout vs stderr) is
113
+ * decided inside `runRunner`'s `emit` helper based on the event's `type`
114
+ * see the doc-block on the file header for the split.
115
+ *
116
+ * The `company` field is present on every event except `setup-needed` /
117
+ * `auth-error` / `fanout-plan` / `all-complete` (which describe the whole
118
+ * run) — consumers should treat its absence as "meta-event, not tied to a
119
+ * specific company".
107
120
  */
108
121
  export type RunnerEvent =
109
122
  | { type: "setup-needed" }
@@ -114,6 +127,7 @@ export type RunnerEvent =
114
127
  }
115
128
  | ({ type: "progress"; company: string } & Omit<Extract<SyncProgressEvent, { type: "progress" }>, "type">)
116
129
  | ({ type: "error"; company?: string } & Omit<Extract<SyncProgressEvent, { type: "error" }>, "type">)
130
+ | ({ type: "conflict"; company: string } & Omit<Extract<SyncProgressEvent, { type: "conflict" }>, "type">)
117
131
  | ({
118
132
  type: "complete";
119
133
  company: string;
@@ -135,6 +149,13 @@ export type RunnerEvent =
135
149
  /** Always emitted; 0 when no push phase ran. */
136
150
  filesUploaded: number;
137
151
  bytesUploaded: number;
152
+ /**
153
+ * Conflict file paths aggregated across every company in the run.
154
+ * Always emitted; empty array when no conflicts were detected. Lets
155
+ * the menubar UI render a flat list without re-walking per-company
156
+ * `complete` events.
157
+ */
158
+ conflictPaths: Array<{ company: string; path: string; direction: "pull" | "push" }>;
138
159
  errors: Array<{ company: string; message: string }>;
139
160
  };
140
161
 
@@ -347,8 +368,35 @@ export async function runRunner(
347
368
  const stdout = deps.stdout ?? process.stdout;
348
369
  const stderr = deps.stderr ?? process.stderr;
349
370
 
371
+ // ---- emit ---------------------------------------------------------------
372
+ // Error-class events go to stderr; everything else to stdout.
373
+ //
374
+ // Why split: the AppBar Sync menubar (Tauri + Rust) feeds runner stderr
375
+ // into Sentry as breadcrumbs and captures one Sentry event when the
376
+ // runner exits non-zero. Routing `error` / `auth-error` events through
377
+ // stderr makes them part of that breadcrumb trail automatically — the
378
+ // menubar doesn't need a per-event capture call, and operators get the
379
+ // full context (per-file errors → company error → exit) in a single
380
+ // Sentry issue alerted to #hq-alerts.
381
+ //
382
+ // Non-error events (progress, complete, fanout-plan, all-complete,
383
+ // setup-needed) stay on stdout. They're the protocol stream the menubar
384
+ // parses for UI updates; mixing them with error events on the same
385
+ // channel was the original design (single ndjson stream, simpler to
386
+ // tee), but error context belongs in the diagnostic channel.
387
+ //
388
+ // Backward compat: older menubar releases (pre-PR-#34) parse only
389
+ // stdout for ndjson; with this change they will NOT receive error
390
+ // events. The menubar's `HQ_CLOUD_VERSION` pin gates which runner
391
+ // they spawn, so old menubars stay on the previous runner version
392
+ // even after this one is published.
393
+ const ERROR_TYPES: ReadonlySet<RunnerEvent["type"]> = new Set([
394
+ "error",
395
+ "auth-error",
396
+ ]);
350
397
  const emit = (event: RunnerEvent): void => {
351
- stdout.write(`${JSON.stringify(event)}\n`);
398
+ const stream = ERROR_TYPES.has(event.type) ? stderr : stdout;
399
+ stream.write(`${JSON.stringify(event)}\n`);
352
400
  };
353
401
 
354
402
  // ---- argv -------------------------------------------------------------
@@ -479,6 +527,7 @@ export async function runRunner(
479
527
  let totalUploaded = 0;
480
528
  let totalUploadedBytes = 0;
481
529
  const errors: Array<{ company: string; message: string }> = [];
530
+ const allConflicts: Array<{ company: string; path: string; direction: "pull" | "push" }> = [];
482
531
 
483
532
  for (const target of plan) {
484
533
  const companyLabel = target.slug;
@@ -493,6 +542,14 @@ export async function runRunner(
493
542
  bytes: event.bytes,
494
543
  ...(event.message ? { message: event.message } : {}),
495
544
  });
545
+ } else if (event.type === "conflict") {
546
+ emit({
547
+ type: "conflict",
548
+ company: companyLabel,
549
+ path: event.path,
550
+ direction: event.direction,
551
+ resolution: event.resolution,
552
+ });
496
553
  } else {
497
554
  emit({
498
555
  type: "error",
@@ -508,6 +565,7 @@ export async function runRunner(
508
565
  filesUploaded: 0,
509
566
  bytesUploaded: 0,
510
567
  filesSkipped: 0,
568
+ conflictPaths: [],
511
569
  aborted: false,
512
570
  };
513
571
  let pullResult: SyncResult = {
@@ -515,6 +573,7 @@ export async function runRunner(
515
573
  bytesDownloaded: 0,
516
574
  filesSkipped: 0,
517
575
  conflicts: 0,
576
+ conflictPaths: [],
518
577
  aborted: false,
519
578
  };
520
579
 
@@ -549,6 +608,13 @@ export async function runRunner(
549
608
  });
550
609
  }
551
610
 
611
+ // Concat push + pull conflict paths into a single per-company list.
612
+ // Both arrays are always present (defaulted to []) so consumers can
613
+ // treat `conflictPaths` as authoritative without a falsy check.
614
+ const mergedConflictPaths = [
615
+ ...pullResult.conflictPaths,
616
+ ...pushResult.conflictPaths,
617
+ ];
552
618
  emit({
553
619
  type: "complete",
554
620
  company: companyLabel,
@@ -558,10 +624,17 @@ export async function runRunner(
558
624
  bytesUploaded: pushResult.bytesUploaded,
559
625
  filesSkipped: pullResult.filesSkipped + pushResult.filesSkipped,
560
626
  conflicts: pullResult.conflicts,
627
+ conflictPaths: mergedConflictPaths,
561
628
  // Either phase aborting marks the company aborted — the UI treats
562
629
  // `aborted: true` as "sync didn't complete cleanly for this company".
563
630
  aborted: pullResult.aborted || pushResult.aborted,
564
631
  });
632
+ for (const p of pullResult.conflictPaths) {
633
+ allConflicts.push({ company: companyLabel, path: p, direction: "pull" });
634
+ }
635
+ for (const p of pushResult.conflictPaths) {
636
+ allConflicts.push({ company: companyLabel, path: p, direction: "push" });
637
+ }
565
638
  totalDownloaded += pullResult.filesDownloaded;
566
639
  totalDownloadedBytes += pullResult.bytesDownloaded;
567
640
  totalUploaded += pushResult.filesUploaded;
@@ -586,6 +659,7 @@ export async function runRunner(
586
659
  bytesDownloaded: totalDownloadedBytes,
587
660
  filesUploaded: totalUploaded,
588
661
  bytesUploaded: totalUploadedBytes,
662
+ conflictPaths: allConflicts,
589
663
  errors,
590
664
  });
591
665
  return 0;
@@ -276,6 +276,62 @@ describe("share", () => {
276
276
  expect(uploadFile).toHaveBeenCalledWith(expect.anything(), testFile, "changed.md");
277
277
  });
278
278
 
279
+ it("populates conflictPaths and emits a conflict event when remote drifted from journal", async () => {
280
+ const companyRoot = path.join(tmpDir, "companies", "acme");
281
+ fs.mkdirSync(companyRoot, { recursive: true });
282
+ const testFile = path.join(companyRoot, "drifted.md");
283
+ fs.writeFileSync(testFile, "local edit");
284
+
285
+ // Journal has a stale hash → local diverged. headRemoteFile returning
286
+ // non-null tells share() the remote also exists; combined with the
287
+ // hash mismatch this trips the conflict branch.
288
+ vi.mocked(headRemoteFile).mockResolvedValueOnce({
289
+ lastModified: new Date(),
290
+ etag: '"remote-changed"',
291
+ size: 99,
292
+ });
293
+
294
+ const journalPath = path.join(stateDir, "sync-journal.acme.json");
295
+ fs.writeFileSync(
296
+ journalPath,
297
+ JSON.stringify({
298
+ version: "1",
299
+ lastSync: new Date().toISOString(),
300
+ files: {
301
+ "drifted.md": {
302
+ hash: "stale-hash",
303
+ size: 10,
304
+ syncedAt: new Date().toISOString(),
305
+ direction: "up",
306
+ },
307
+ },
308
+ }),
309
+ );
310
+
311
+ const events: unknown[] = [];
312
+ const result = await share({
313
+ paths: [testFile],
314
+ company: "acme",
315
+ vaultConfig: mockConfig,
316
+ hqRoot: tmpDir,
317
+ onConflict: "keep",
318
+ onEvent: (e) => events.push(e),
319
+ });
320
+
321
+ expect(result.conflictPaths).toEqual(["drifted.md"]);
322
+ const conflicts = events.filter(
323
+ (e): e is { type: "conflict"; path: string; direction: "push"; resolution: string } =>
324
+ typeof e === "object" && e !== null && (e as { type?: string }).type === "conflict",
325
+ );
326
+ expect(conflicts).toHaveLength(1);
327
+ expect(conflicts[0]).toMatchObject({
328
+ type: "conflict",
329
+ path: "drifted.md",
330
+ direction: "push",
331
+ resolution: "keep",
332
+ });
333
+ });
334
+
279
335
  it("skipUnchanged=false (default) uploads even when hash matches", async () => {
280
336
  const companyRoot = path.join(tmpDir, "companies", "acme");
281
337
  fs.mkdirSync(companyRoot, { recursive: true });
package/src/cli/share.ts CHANGED
@@ -52,6 +52,12 @@ export interface ShareResult {
52
52
  filesUploaded: number;
53
53
  bytesUploaded: number;
54
54
  filesSkipped: number;
55
+ /**
56
+ * Paths (company-relative) that were detected as push conflicts. Mirrors
57
+ * `SyncResult.conflictPaths` so push and pull surface conflicts the same
58
+ * way to runner/UI consumers.
59
+ */
60
+ conflictPaths: string[];
55
61
  aborted: boolean;
56
62
  }
57
63
 
@@ -83,6 +89,7 @@ export async function share(options: ShareOptions): Promise<ShareResult> {
83
89
  let filesUploaded = 0;
84
90
  let bytesUploaded = 0;
85
91
  let filesSkipped = 0;
92
+ const conflictPaths: string[] = [];
86
93
 
87
94
  // Collect all files to share
88
95
  const filesToShare = collectFiles(paths, hqRoot, syncRoot, shouldSync);
@@ -123,6 +130,8 @@ export async function share(options: ShareOptions): Promise<ShareResult> {
123
130
 
124
131
  // If remote has changed since our last sync, it's a conflict
125
132
  if (journalEntry && journalEntry.hash !== localHash) {
133
+ conflictPaths.push(relativePath);
134
+
126
135
  // Local has changes — check if remote also changed
127
136
  const resolution = await resolveConflict(
128
137
  {
@@ -134,8 +143,21 @@ export async function share(options: ShareOptions): Promise<ShareResult> {
134
143
  onConflict,
135
144
  );
136
145
 
146
+ emit({
147
+ type: "conflict",
148
+ path: relativePath,
149
+ direction: "push",
150
+ resolution,
151
+ });
152
+
137
153
  if (resolution === "abort") {
138
- return { filesUploaded, bytesUploaded, filesSkipped, aborted: true };
154
+ return {
155
+ filesUploaded,
156
+ bytesUploaded,
157
+ filesSkipped,
158
+ conflictPaths,
159
+ aborted: true,
160
+ };
139
161
  }
140
162
  if (resolution === "keep" || resolution === "skip") {
141
163
  filesSkipped++;
@@ -179,7 +201,13 @@ export async function share(options: ShareOptions): Promise<ShareResult> {
179
201
 
180
202
  writeJournal(ctx.slug, journal);
181
203
 
182
- return { filesUploaded, bytesUploaded, filesSkipped, aborted: false };
204
+ return {
205
+ filesUploaded,
206
+ bytesUploaded,
207
+ filesSkipped,
208
+ conflictPaths,
209
+ aborted: false,
210
+ };
183
211
  }
184
212
 
185
213
  /**
@@ -193,6 +221,10 @@ function defaultConsoleLogger(event: SyncProgressEvent): void {
193
221
  } else {
194
222
  console.log(` ✓ ${event.path}`);
195
223
  }
224
+ } else if (event.type === "conflict") {
225
+ console.error(
226
+ ` ⚠ conflict (${event.direction}): ${event.path} — ${event.resolution}`,
227
+ );
196
228
  } else {
197
229
  console.error(` ✗ ${event.path} — ${event.message}`);
198
230
  }
@@ -176,10 +176,54 @@ describe("sync", () => {
176
176
  });
177
177
 
178
178
  expect(result.conflicts).toBe(1);
179
+ expect(result.conflictPaths).toEqual(["docs/handoff.md"]);
179
180
  expect(result.filesSkipped).toBeGreaterThanOrEqual(1);
180
181
  expect(fs.readFileSync(path.join(companyDocs, "handoff.md"), "utf-8")).toBe("local version");
181
182
  });
182
183
 
184
+ it("emits a conflict event with path + resolution on hash mismatch", async () => {
185
+ const companyDocs = path.join(tmpDir, "companies", "acme", "docs");
186
+ fs.mkdirSync(companyDocs, { recursive: true });
187
+ fs.writeFileSync(path.join(companyDocs, "handoff.md"), "local version");
188
+
189
+ fs.writeFileSync(
190
+ journalPath,
191
+ JSON.stringify({
192
+ version: "1",
193
+ lastSync: new Date().toISOString(),
194
+ files: {
195
+ "docs/handoff.md": {
196
+ hash: "stale-hash",
197
+ size: 20,
198
+ syncedAt: new Date(Date.now() - 3600000).toISOString(),
199
+ direction: "down",
200
+ },
201
+ },
202
+ }),
203
+ );
204
+
205
+ const events: unknown[] = [];
206
+ await sync({
207
+ company: "acme",
208
+ onConflict: "keep",
209
+ vaultConfig: mockConfig,
210
+ hqRoot: tmpDir,
211
+ onEvent: (e) => events.push(e),
212
+ });
213
+
214
+ const conflicts = events.filter(
215
+ (e): e is { type: "conflict"; path: string; direction: "pull"; resolution: string } =>
216
+ typeof e === "object" && e !== null && (e as { type?: string }).type === "conflict",
217
+ );
218
+ expect(conflicts).toHaveLength(1);
219
+ expect(conflicts[0]).toMatchObject({
220
+ type: "conflict",
221
+ path: "docs/handoff.md",
222
+ direction: "pull",
223
+ resolution: "keep",
224
+ });
225
+ });
226
+
183
227
  it("aborts on --on-conflict abort", async () => {
184
228
  const companyDocs = path.join(tmpDir, "companies", "acme", "docs");
185
229
  fs.mkdirSync(companyDocs, { recursive: true });