@indigoai-us/hq-cloud 6.11.10 → 6.11.12

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 (173) hide show
  1. package/dist/bin/sync-runner.d.ts +2 -0
  2. package/dist/bin/sync-runner.d.ts.map +1 -1
  3. package/dist/bin/sync-runner.js +231 -52
  4. package/dist/bin/sync-runner.js.map +1 -1
  5. package/dist/bin/sync-runner.test.js +330 -11
  6. package/dist/bin/sync-runner.test.js.map +1 -1
  7. package/dist/cli/reindex.d.ts.map +1 -1
  8. package/dist/cli/reindex.js +16 -1
  9. package/dist/cli/reindex.js.map +1 -1
  10. package/dist/cli/reindex.test.js +39 -1
  11. package/dist/cli/reindex.test.js.map +1 -1
  12. package/dist/cli/rescue-classify-ordering.test.js +58 -0
  13. package/dist/cli/rescue-classify-ordering.test.js.map +1 -1
  14. package/dist/cli/rescue-core.js +229 -15
  15. package/dist/cli/rescue-core.js.map +1 -1
  16. package/dist/cli/rescue-exec-bit-preserve.test.d.ts +2 -0
  17. package/dist/cli/rescue-exec-bit-preserve.test.d.ts.map +1 -0
  18. package/dist/cli/rescue-exec-bit-preserve.test.js +169 -0
  19. package/dist/cli/rescue-exec-bit-preserve.test.js.map +1 -0
  20. package/dist/cli/share.d.ts +2 -1
  21. package/dist/cli/share.d.ts.map +1 -1
  22. package/dist/cli/share.js +100 -32
  23. package/dist/cli/share.js.map +1 -1
  24. package/dist/cli/share.test.js +30 -0
  25. package/dist/cli/share.test.js.map +1 -1
  26. package/dist/cli/sync.d.ts +28 -1
  27. package/dist/cli/sync.d.ts.map +1 -1
  28. package/dist/cli/sync.js +188 -59
  29. package/dist/cli/sync.js.map +1 -1
  30. package/dist/cli/sync.test.js +487 -1
  31. package/dist/cli/sync.test.js.map +1 -1
  32. package/dist/cognito-auth.d.ts.map +1 -1
  33. package/dist/cognito-auth.js +55 -10
  34. package/dist/cognito-auth.js.map +1 -1
  35. package/dist/cognito-auth.test.js +61 -0
  36. package/dist/cognito-auth.test.js.map +1 -1
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/journal.d.ts.map +1 -1
  42. package/dist/journal.js +93 -6
  43. package/dist/journal.js.map +1 -1
  44. package/dist/journal.test.js +59 -0
  45. package/dist/journal.test.js.map +1 -1
  46. package/dist/machine-auth.test.js +60 -2
  47. package/dist/machine-auth.test.js.map +1 -1
  48. package/dist/object-io.d.ts +37 -1
  49. package/dist/object-io.d.ts.map +1 -1
  50. package/dist/object-io.js +148 -29
  51. package/dist/object-io.js.map +1 -1
  52. package/dist/object-io.test.js +121 -0
  53. package/dist/object-io.test.js.map +1 -1
  54. package/dist/operation-lock.d.ts +8 -8
  55. package/dist/operation-lock.d.ts.map +1 -1
  56. package/dist/operation-lock.js +99 -32
  57. package/dist/operation-lock.js.map +1 -1
  58. package/dist/operation-lock.test.js +51 -4
  59. package/dist/operation-lock.test.js.map +1 -1
  60. package/dist/personal-vault.d.ts +8 -0
  61. package/dist/personal-vault.d.ts.map +1 -1
  62. package/dist/personal-vault.js +17 -3
  63. package/dist/personal-vault.js.map +1 -1
  64. package/dist/personal-vault.test.js +34 -0
  65. package/dist/personal-vault.test.js.map +1 -1
  66. package/dist/prefix-coalesce.d.ts +20 -9
  67. package/dist/prefix-coalesce.d.ts.map +1 -1
  68. package/dist/prefix-coalesce.js +124 -28
  69. package/dist/prefix-coalesce.js.map +1 -1
  70. package/dist/prefix-coalesce.test.js +57 -2
  71. package/dist/prefix-coalesce.test.js.map +1 -1
  72. package/dist/remote-pull.d.ts +6 -1
  73. package/dist/remote-pull.d.ts.map +1 -1
  74. package/dist/remote-pull.js +62 -13
  75. package/dist/remote-pull.js.map +1 -1
  76. package/dist/remote-pull.test.js +189 -0
  77. package/dist/remote-pull.test.js.map +1 -1
  78. package/dist/s3.d.ts +2 -0
  79. package/dist/s3.d.ts.map +1 -1
  80. package/dist/s3.js +197 -116
  81. package/dist/s3.js.map +1 -1
  82. package/dist/s3.test.js +109 -0
  83. package/dist/s3.test.js.map +1 -1
  84. package/dist/scope-shrink.d.ts +3 -2
  85. package/dist/scope-shrink.d.ts.map +1 -1
  86. package/dist/scope-shrink.js +1 -1
  87. package/dist/scope-shrink.js.map +1 -1
  88. package/dist/skill-telemetry.d.ts +1 -1
  89. package/dist/skill-telemetry.d.ts.map +1 -1
  90. package/dist/skill-telemetry.js +69 -9
  91. package/dist/skill-telemetry.js.map +1 -1
  92. package/dist/skill-telemetry.test.js +86 -0
  93. package/dist/skill-telemetry.test.js.map +1 -1
  94. package/dist/sync/event-sync.d.ts +6 -0
  95. package/dist/sync/event-sync.d.ts.map +1 -1
  96. package/dist/sync/event-sync.js +34 -1
  97. package/dist/sync/event-sync.js.map +1 -1
  98. package/dist/sync/event-sync.test.js +73 -0
  99. package/dist/sync/event-sync.test.js.map +1 -1
  100. package/dist/sync/metrics.d.ts +17 -1
  101. package/dist/sync/metrics.d.ts.map +1 -1
  102. package/dist/sync/metrics.js +32 -1
  103. package/dist/sync/metrics.js.map +1 -1
  104. package/dist/sync/metrics.test.js +74 -1
  105. package/dist/sync/metrics.test.js.map +1 -1
  106. package/dist/sync/pull-scope.d.ts.map +1 -1
  107. package/dist/sync/pull-scope.js +15 -7
  108. package/dist/sync/pull-scope.js.map +1 -1
  109. package/dist/sync/push-receiver.d.ts +6 -5
  110. package/dist/sync/push-receiver.d.ts.map +1 -1
  111. package/dist/sync/push-receiver.js +13 -15
  112. package/dist/sync/push-receiver.js.map +1 -1
  113. package/dist/sync/push-receiver.test.js +36 -1
  114. package/dist/sync/push-receiver.test.js.map +1 -1
  115. package/dist/telemetry.d.ts +1 -1
  116. package/dist/telemetry.d.ts.map +1 -1
  117. package/dist/telemetry.js +59 -6
  118. package/dist/telemetry.js.map +1 -1
  119. package/dist/telemetry.test.js +74 -0
  120. package/dist/telemetry.test.js.map +1 -1
  121. package/dist/types.d.ts +8 -0
  122. package/dist/types.d.ts.map +1 -1
  123. package/dist/watcher.d.ts +36 -0
  124. package/dist/watcher.d.ts.map +1 -1
  125. package/dist/watcher.js +152 -30
  126. package/dist/watcher.js.map +1 -1
  127. package/dist/watcher.test.js +103 -0
  128. package/dist/watcher.test.js.map +1 -1
  129. package/package.json +1 -1
  130. package/src/bin/sync-runner.test.ts +396 -11
  131. package/src/bin/sync-runner.ts +254 -52
  132. package/src/cli/reindex.test.ts +47 -1
  133. package/src/cli/reindex.ts +17 -1
  134. package/src/cli/rescue-classify-ordering.test.ts +61 -0
  135. package/src/cli/rescue-core.ts +261 -15
  136. package/src/cli/rescue-exec-bit-preserve.test.ts +187 -0
  137. package/src/cli/share.test.ts +38 -0
  138. package/src/cli/share.ts +103 -34
  139. package/src/cli/sync.test.ts +594 -1
  140. package/src/cli/sync.ts +229 -65
  141. package/src/cognito-auth.test.ts +77 -0
  142. package/src/cognito-auth.ts +73 -11
  143. package/src/index.ts +8 -0
  144. package/src/journal.test.ts +72 -0
  145. package/src/journal.ts +95 -8
  146. package/src/machine-auth.test.ts +64 -2
  147. package/src/object-io.test.ts +142 -0
  148. package/src/object-io.ts +182 -30
  149. package/src/operation-lock.test.ts +63 -4
  150. package/src/operation-lock.ts +99 -31
  151. package/src/personal-vault.test.ts +42 -0
  152. package/src/personal-vault.ts +18 -3
  153. package/src/prefix-coalesce.test.ts +71 -1
  154. package/src/prefix-coalesce.ts +155 -30
  155. package/src/remote-pull.test.ts +205 -0
  156. package/src/remote-pull.ts +77 -14
  157. package/src/s3.test.ts +126 -0
  158. package/src/s3.ts +237 -122
  159. package/src/scope-shrink.ts +6 -3
  160. package/src/skill-telemetry.test.ts +109 -0
  161. package/src/skill-telemetry.ts +82 -14
  162. package/src/sync/event-sync.test.ts +75 -0
  163. package/src/sync/event-sync.ts +54 -1
  164. package/src/sync/metrics.test.ts +81 -0
  165. package/src/sync/metrics.ts +59 -4
  166. package/src/sync/pull-scope.ts +23 -7
  167. package/src/sync/push-receiver.test.ts +38 -1
  168. package/src/sync/push-receiver.ts +15 -18
  169. package/src/telemetry.test.ts +85 -0
  170. package/src/telemetry.ts +69 -6
  171. package/src/types.ts +8 -0
  172. package/src/watcher.test.ts +117 -0
  173. package/src/watcher.ts +209 -33
@@ -346,6 +346,8 @@ export interface RunnerDeps {
346
346
  createVaultClient?: (config: VaultServiceConfig) => VaultClientSurface;
347
347
  /** Sync function. Defaults to `cli/sync.sync`. */
348
348
  sync?: (options: SyncOptions) => Promise<SyncResult>;
349
+ /** Internal: set when runRunner is invoked under the per-root operation lock. */
350
+ operationLockAlreadyHeld?: boolean;
349
351
  /** Share function (push phase). Defaults to `cli/share.share`. */
350
352
  share?: (options: ShareOptions) => Promise<ShareResult>;
351
353
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sync-runner.d.ts","sourceRoot":"","sources":["../../src/bin/sync-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-runner.d.ts","sourceRoot":"","sources":["../../src/bin/sync-runner.ts"],"names":[],"mappings":"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"}
@@ -71,7 +71,7 @@ import { collectAndSendTelemetry } from "../telemetry.js";
71
71
  import { collectAndSendSkillTelemetry } from "../skill-telemetry.js";
72
72
  import { reindexAfterSync } from "../qmd-reindex.js";
73
73
  import { pruneConflictIndex } from "../lib/conflict-index.js";
74
- import { withOperationLock, OperationLockedError, OPERATION_LOCKED_EXIT, } from "../operation-lock.js";
74
+ import { acquireOperationLock, withOperationLock, OperationLockedError, OPERATION_LOCKED_EXIT, } from "../operation-lock.js";
75
75
  import { describeError } from "../lib/describe-error.js";
76
76
  import { getOrCreateMachineId } from "../lib/machine-id.js";
77
77
  import { TreeWatcher, WatchPushDriver, systemClock, } from "../watcher.js";
@@ -763,6 +763,7 @@ export async function runRunner(argv, deps = {}) {
763
763
  // rows land on the right company regardless of which phase emitted them.
764
764
  // Also updates `state` for `progress` events so the rollup has accurate
765
765
  // partial counts even if the sync function throws before returning.
766
+ let companyHadTransferError = false;
766
767
  const tagAndEmit = (event) => {
767
768
  if (event.type === "plan") {
768
769
  emit({
@@ -810,6 +811,11 @@ export async function runRunner(argv, deps = {}) {
810
811
  });
811
812
  }
812
813
  else if (event.type === "error") {
814
+ companyHadTransferError = true;
815
+ errors.push({
816
+ company: companyLabel,
817
+ message: event.path ? `${event.path}: ${event.message}` : event.message,
818
+ });
813
819
  emit({
814
820
  type: "error",
815
821
  company: companyLabel,
@@ -1026,6 +1032,9 @@ export async function runRunner(argv, deps = {}) {
1026
1032
  teamSyncedSlugs,
1027
1033
  }
1028
1034
  : {}),
1035
+ ...(deps.operationLockAlreadyHeld
1036
+ ? { operationLockAlreadyHeld: true }
1037
+ : {}),
1029
1038
  onEvent: tagAndEmit,
1030
1039
  });
1031
1040
  }
@@ -1059,7 +1068,11 @@ export async function runRunner(argv, deps = {}) {
1059
1068
  state.bytesDownloaded = pullResult.bytesDownloaded;
1060
1069
  state.filesUploaded = pushResult.filesUploaded;
1061
1070
  state.bytesUploaded = pushResult.bytesUploaded;
1062
- state.status = aborted ? "aborted" : "complete";
1071
+ state.status = companyHadTransferError
1072
+ ? "errored"
1073
+ : aborted
1074
+ ? "aborted"
1075
+ : "complete";
1063
1076
  emit({
1064
1077
  type: "complete",
1065
1078
  company: companyLabel,
@@ -1335,6 +1348,22 @@ export function buildTargetedPushArgv(route, baseArgv) {
1335
1348
  }
1336
1349
  return ["--companies", "--direction", "push", ...carried];
1337
1350
  }
1351
+ function routeKey(route) {
1352
+ return route.kind === "company" ? `company:${route.slug}` : "personal";
1353
+ }
1354
+ function routesForBatch(batch) {
1355
+ const routes = new Map();
1356
+ for (const relPath of batch.paths.values()) {
1357
+ const route = routeChangeToTarget(relPath);
1358
+ if (!route)
1359
+ continue;
1360
+ routes.set(routeKey(route), route);
1361
+ }
1362
+ return routes;
1363
+ }
1364
+ function buildFullFanoutPushArgv(baseArgv) {
1365
+ return ["--companies", "--direction", "push", ...carriedFlags(baseArgv)];
1366
+ }
1338
1367
  /**
1339
1368
  * Build the argv for a targeted PULL pass from a routed change (US-009 — the
1340
1369
  * receiver's pull-on-event path). Mirrors {@link buildTargetedPushArgv} but
@@ -1354,14 +1383,12 @@ export function buildTargetedPullArgv(route, baseArgv) {
1354
1383
  return ["--companies", "--direction", "pull", ...carried];
1355
1384
  }
1356
1385
  export async function runRunnerWithLoop(argv, deps = {}) {
1386
+ const parsed = parseArgs(argv);
1357
1387
  if (!argv.includes("--watch")) {
1358
1388
  // One-shot cloud sync — take the per-root operation lock so it is mutually
1359
- // exclusive with rescue/reindex. The `--watch` path below is the push
1360
- // watcher and is intentionally EXEMPT (it neither takes nor is blocked by
1361
- // the lock; its in-process targeted passes call `runRunner` directly, not
1362
- // through here). If args don't parse, fall through to `runRunner` so it
1363
- // surfaces the parse error rather than us masking it with a lock failure.
1364
- const parsed = parseArgs(argv);
1389
+ // exclusive with rescue/reindex. If args don't parse, fall through to
1390
+ // `runRunner` so it surfaces the parse error rather than us masking it
1391
+ // with a lock failure.
1365
1392
  if ("error" in parsed)
1366
1393
  return runRunner(argv);
1367
1394
  // The actual sync pass — same seam the watch loop uses (deps.runPass),
@@ -1371,7 +1398,8 @@ export async function runRunnerWithLoop(argv, deps = {}) {
1371
1398
  // (feedback_28a1833f): instant-sync one-shots used to exit 17 and die on
1372
1399
  // a lock conflict with the ~1-min reindex hook; they now WAIT (default)
1373
1400
  // and proceed once the short holder releases.
1374
- const runOnce = deps.runPass ?? ((passArgv) => runRunner(passArgv));
1401
+ const runOnce = deps.runPass ??
1402
+ ((passArgv) => runRunner(passArgv, { operationLockAlreadyHeld: true }));
1375
1403
  try {
1376
1404
  return await withOperationLock(parsed.hqRoot, "sync", () => runOnce(argv), {
1377
1405
  timeoutSec: parsed.lockTimeoutSec,
@@ -1392,9 +1420,12 @@ export async function runRunnerWithLoop(argv, deps = {}) {
1392
1420
  throw err;
1393
1421
  }
1394
1422
  }
1423
+ if ("error" in parsed)
1424
+ return runRunner(argv);
1395
1425
  const sleep = deps.sleep ??
1396
1426
  ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
1397
- const runPass = deps.runPass ?? ((passArgv) => runRunner(passArgv));
1427
+ const runPass = deps.runPass ??
1428
+ ((passArgv) => runRunner(passArgv, { operationLockAlreadyHeld: true }));
1398
1429
  const pollIdx = argv.indexOf("--poll-remote-ms");
1399
1430
  const pollMs = pollIdx >= 0 && argv[pollIdx + 1] ? Number(argv[pollIdx + 1]) : 600_000;
1400
1431
  const eventPush = argv.includes("--event-push");
@@ -1407,8 +1438,7 @@ export async function runRunnerWithLoop(argv, deps = {}) {
1407
1438
  // watch filter correctly in companies mode. personalMode is only for a
1408
1439
  // personal-vault-as-root run, where companies/ et al. genuinely aren't synced.
1409
1440
  const companiesMode = argv.includes("--companies");
1410
- const hqIdx = argv.indexOf("--hq-root");
1411
- const hqRoot = hqIdx >= 0 && argv[hqIdx + 1] ? argv[hqIdx + 1] : DEFAULT_HQ_ROOT;
1441
+ const hqRoot = parsed.hqRoot;
1412
1442
  // Strip the loop-only flags before delegating: the parser inside runRunner
1413
1443
  // accepts --watch/--poll-remote-ms/--event-push, but we don't want a per-
1414
1444
  // iteration pass to think it's re-entering watch mode.
@@ -1423,30 +1453,166 @@ export async function runRunnerWithLoop(argv, deps = {}) {
1423
1453
  return false;
1424
1454
  return true;
1425
1455
  });
1426
- // ---- shared in-flight guard ------------------------------------------
1427
- // The poll loop AND watcher-triggered targeted pushes funnel through this
1428
- // mutex so a watcher push never overlaps an in-flight pass (PRD AC). A
1429
- // trigger that arrives while a pass runs is collapsed by WatchPushDriver's
1430
- // own pending-while-pushing logic, then re-armed after the pass settles.
1431
- let inFlight = false;
1432
- let stopped = false;
1433
- const runGuarded = async (pass) => {
1434
- if (inFlight)
1435
- return "skipped";
1436
- inFlight = true;
1456
+ if (parsed.lockTimeoutSec === 0) {
1457
+ try {
1458
+ const handle = acquireOperationLock(hqRoot, "sync", {
1459
+ timeoutSec: 0,
1460
+ onWaitStart: () => undefined,
1461
+ });
1462
+ handle.release();
1463
+ }
1464
+ catch (err) {
1465
+ if (err instanceof OperationLockedError) {
1466
+ process.stderr.write(err.message + "\n");
1467
+ return OPERATION_LOCKED_EXIT;
1468
+ }
1469
+ throw err;
1470
+ }
1471
+ }
1472
+ const runPassWithLock = async (passArgvForRun) => {
1437
1473
  try {
1438
- return await pass();
1474
+ const handle = acquireOperationLock(hqRoot, "sync", {
1475
+ timeoutSec: 0,
1476
+ onWaitStart: () => undefined,
1477
+ });
1478
+ try {
1479
+ return await runPass(passArgvForRun);
1480
+ }
1481
+ finally {
1482
+ handle.release();
1483
+ }
1439
1484
  }
1440
- finally {
1441
- inFlight = false;
1485
+ catch (err) {
1486
+ if (!(err instanceof OperationLockedError))
1487
+ throw err;
1488
+ if (parsed.lockTimeoutSec === 0) {
1489
+ process.stderr.write(err.message + "\n");
1490
+ return OPERATION_LOCKED_EXIT;
1491
+ }
1492
+ }
1493
+ try {
1494
+ return await withOperationLock(hqRoot, "sync", () => runPass(passArgvForRun), { timeoutSec: parsed.lockTimeoutSec });
1495
+ }
1496
+ catch (err) {
1497
+ if (err instanceof OperationLockedError) {
1498
+ process.stderr.write(err.message + "\n");
1499
+ return OPERATION_LOCKED_EXIT;
1500
+ }
1501
+ throw err;
1442
1502
  }
1443
1503
  };
1504
+ // ---- shared pass queue -----------------------------------------------
1505
+ // The poll loop, pull-on-event receiver, and watcher-triggered pushes all
1506
+ // funnel through this queue so local/remote triggers never overlap, and a
1507
+ // trigger arriving during an active pass runs immediately after it instead
1508
+ // of being dropped.
1509
+ let stopped = false;
1510
+ let activePass = null;
1511
+ const pendingPasses = [];
1512
+ const resolveStoppedQueue = () => {
1513
+ while (pendingPasses.length > 0) {
1514
+ pendingPasses.shift()?.resolve(0);
1515
+ }
1516
+ };
1517
+ const drainQueuedPasses = () => {
1518
+ if (activePass !== null)
1519
+ return;
1520
+ if (stopped) {
1521
+ resolveStoppedQueue();
1522
+ return;
1523
+ }
1524
+ const next = pendingPasses.shift();
1525
+ if (!next)
1526
+ return;
1527
+ const current = startGuardedPass(next.argv);
1528
+ void current.then(next.resolve, next.reject);
1529
+ };
1530
+ const startGuardedPass = (passArgvForRun) => {
1531
+ const current = stopped
1532
+ ? Promise.resolve(0)
1533
+ : runPassWithLock(passArgvForRun);
1534
+ activePass = current;
1535
+ void current
1536
+ .finally(() => {
1537
+ if (activePass === current) {
1538
+ activePass = null;
1539
+ drainQueuedPasses();
1540
+ }
1541
+ })
1542
+ .catch(() => undefined);
1543
+ return current;
1544
+ };
1545
+ const runGuarded = (passArgvForRun) => {
1546
+ if (activePass === null && pendingPasses.length === 0) {
1547
+ return startGuardedPass(passArgvForRun);
1548
+ }
1549
+ return new Promise((resolve, reject) => {
1550
+ pendingPasses.push({ argv: passArgvForRun, resolve, reject });
1551
+ drainQueuedPasses();
1552
+ });
1553
+ };
1444
1554
  // ---- event-push wiring (Phase 1) -------------------------------------
1445
1555
  let watcher = null;
1446
1556
  let driver = null;
1447
1557
  let detachSignal = null;
1448
- let lastChangedRel = null;
1449
- let lastBatch = null;
1558
+ const pendingWatcherPaths = new Map();
1559
+ let pendingWatcherOriginalBatch = null;
1560
+ let pendingWatcherBareChange = false;
1561
+ let pendingWatcherOverflowed = false;
1562
+ let pendingWatcherDroppedPaths = 0;
1563
+ let pendingWatcherDroppedBytes = 0;
1564
+ const addPendingWatcherChange = (changedRelPath, batch) => {
1565
+ if (batch) {
1566
+ pendingWatcherOriginalBatch =
1567
+ pendingWatcherPaths.size === 0 &&
1568
+ !pendingWatcherBareChange &&
1569
+ !pendingWatcherOverflowed &&
1570
+ !batch.overflowed
1571
+ ? batch
1572
+ : null;
1573
+ for (const [absolutePath, relativePath] of batch.paths.entries()) {
1574
+ pendingWatcherPaths.set(absolutePath, relativePath);
1575
+ }
1576
+ if (batch.overflowed) {
1577
+ pendingWatcherOverflowed = true;
1578
+ pendingWatcherDroppedPaths += batch.droppedPaths ?? 0;
1579
+ pendingWatcherDroppedBytes += batch.droppedBytes ?? 0;
1580
+ }
1581
+ return;
1582
+ }
1583
+ if (changedRelPath) {
1584
+ pendingWatcherOriginalBatch = null;
1585
+ pendingWatcherPaths.set(path.join(hqRoot, changedRelPath), changedRelPath);
1586
+ return;
1587
+ }
1588
+ pendingWatcherOriginalBatch = null;
1589
+ pendingWatcherBareChange = true;
1590
+ };
1591
+ const takePendingWatcherChange = () => {
1592
+ const batch = pendingWatcherOriginalBatch !== null && !pendingWatcherOverflowed
1593
+ ? pendingWatcherOriginalBatch
1594
+ : pendingWatcherPaths.size > 0 || pendingWatcherOverflowed
1595
+ ? {
1596
+ paths: new Map(pendingWatcherPaths),
1597
+ ...(pendingWatcherOverflowed
1598
+ ? {
1599
+ overflowed: true,
1600
+ droppedPaths: pendingWatcherDroppedPaths,
1601
+ droppedBytes: pendingWatcherDroppedBytes,
1602
+ }
1603
+ : {}),
1604
+ }
1605
+ : null;
1606
+ const rel = [...pendingWatcherPaths.values()][0] ?? null;
1607
+ const fallbackRel = rel ?? (pendingWatcherBareChange ? null : null);
1608
+ pendingWatcherPaths.clear();
1609
+ pendingWatcherOriginalBatch = null;
1610
+ pendingWatcherBareChange = false;
1611
+ pendingWatcherOverflowed = false;
1612
+ pendingWatcherDroppedPaths = 0;
1613
+ pendingWatcherDroppedBytes = 0;
1614
+ return { rel: fallbackRel, batch };
1615
+ };
1450
1616
  // ---- pull-on-event receiver (Phase 2, US-009) ------------------------
1451
1617
  // Started after the watcher, disposed before the watcher (mirror of the
1452
1618
  // PushTransport ordering). Dormant by default: the default factory returns
@@ -1480,25 +1646,37 @@ export async function runRunnerWithLoop(argv, deps = {}) {
1480
1646
  push: async () => {
1481
1647
  if (stopped)
1482
1648
  return;
1483
- const rel = lastChangedRel;
1484
- // Snapshot the settled batch BEFORE the await: a change landing
1485
- // mid-pass overwrites lastBatch for the NEXT pass, and this pass
1486
- // must only announce what it actually pushed.
1487
- const batchForPublish = lastBatch;
1488
- lastBatch = null;
1489
- const route = rel
1490
- ? routeChangeToTarget(rel)
1491
- : { kind: "personal" };
1492
- if (!route)
1493
- return;
1494
- const targetedArgv = buildTargetedPushArgv(route, passArgv);
1495
- const result = await runGuarded(() => runPass(targetedArgv));
1649
+ // Snapshot accumulated watcher work BEFORE the await. Changes landing
1650
+ // mid-pass are accumulated for the NEXT pass instead of overwriting
1651
+ // this pass's publish target.
1652
+ const { rel, batch: batchForPublish } = takePendingWatcherChange();
1653
+ const batchRoutes = batchForPublish
1654
+ ? routesForBatch(batchForPublish)
1655
+ : new Map();
1656
+ let targetedArgv;
1657
+ if (batchForPublish?.overflowed || batchRoutes.size > 1) {
1658
+ targetedArgv = buildFullFanoutPushArgv(passArgv);
1659
+ }
1660
+ else {
1661
+ const route = batchRoutes.size === 1
1662
+ ? [...batchRoutes.values()][0]
1663
+ : rel
1664
+ ? routeChangeToTarget(rel)
1665
+ : { kind: "personal" };
1666
+ if (!route)
1667
+ return;
1668
+ targetedArgv = buildTargetedPushArgv(route, passArgv);
1669
+ }
1670
+ const result = await runGuarded(targetedArgv);
1496
1671
  // Phase 3 (US-017): publish PushEvents only AFTER the targeted push
1497
1672
  // pass succeeded — an event must never announce bytes that are not
1498
- // in S3 yet. A skipped pass (guard held) or a failed pass publishes
1499
- // nothing; the cadence poll covers the miss. Fall back to a
1500
- // single-path batch when the watcher emitted a bare path signal.
1501
- if (result === 0 && eventSync) {
1673
+ // in S3 yet. A failed pass publishes nothing; queued passes run after
1674
+ // the active pass instead of dropping the watcher-triggered push. Fall
1675
+ // back to a single-path batch when the watcher emitted a bare path
1676
+ // signal. Overflowed batches deliberately publish nothing because the
1677
+ // exact path set was dropped; the full fanout push plus cadence poll is
1678
+ // the resync signal.
1679
+ if (result === 0 && !stopped && eventSync && !batchForPublish?.overflowed) {
1502
1680
  const batch = batchForPublish ??
1503
1681
  (rel ? { paths: new Map([[path.join(hqRoot, rel), rel]]) } : null);
1504
1682
  if (batch)
@@ -1514,8 +1692,7 @@ export async function runRunnerWithLoop(argv, deps = {}) {
1514
1692
  watcher.onChange((changedRelPath, batch) => {
1515
1693
  if (stopped)
1516
1694
  return;
1517
- lastChangedRel = changedRelPath ?? null;
1518
- lastBatch = batch ?? null;
1695
+ addPendingWatcherChange(changedRelPath, batch);
1519
1696
  driver?.notifyChange();
1520
1697
  });
1521
1698
  watcher.start();
@@ -1533,7 +1710,10 @@ export async function runRunnerWithLoop(argv, deps = {}) {
1533
1710
  if (!route)
1534
1711
  return;
1535
1712
  const targetedArgv = buildTargetedPullArgv(route, passArgv);
1536
- await runGuarded(() => runPass(targetedArgv));
1713
+ const result = await runGuarded(targetedArgv);
1714
+ if (result !== 0) {
1715
+ throw new Error(`targeted pull failed with exit code ${result}`);
1716
+ }
1537
1717
  };
1538
1718
  const createReceiver = deps.createReceiver ?? (() => new NoopPushReceiver());
1539
1719
  receiver = createReceiver({ syncFn: receiverSyncFn, hqRoot });
@@ -1608,6 +1788,7 @@ export async function runRunnerWithLoop(argv, deps = {}) {
1608
1788
  if (stopped)
1609
1789
  return;
1610
1790
  stopped = true;
1791
+ resolveStoppedQueue();
1611
1792
  // Dispose the receiver FIRST (mirror of the PushTransport ordering:
1612
1793
  // inbound subscription torn down before the watcher) so no new
1613
1794
  // pull-on-event fires mid-teardown. dispose() is async (it drains the
@@ -1656,10 +1837,8 @@ export async function runRunnerWithLoop(argv, deps = {}) {
1656
1837
  detachSignal = onShutdownSignal(shutdown);
1657
1838
  try {
1658
1839
  while (!stopped) {
1659
- const result = await runGuarded(() => runPass(passArgv));
1660
- // A poll pass that was skipped because a watcher push held the guard is
1661
- // benign — the next iteration retries after the poll interval.
1662
- if (typeof result === "number" && result !== 0) {
1840
+ const result = await runGuarded(passArgv);
1841
+ if (result !== 0) {
1663
1842
  return result;
1664
1843
  }
1665
1844
  // Sleep the poll interval, but wake early on shutdown so SIGTERM stops