@indigoai-us/hq-cloud 6.16.64 → 6.16.66

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 (142) hide show
  1. package/dist/bin/sync-runner-company.d.ts +14 -0
  2. package/dist/bin/sync-runner-company.d.ts.map +1 -1
  3. package/dist/bin/sync-runner-company.js +42 -8
  4. package/dist/bin/sync-runner-company.js.map +1 -1
  5. package/dist/bin/sync-runner-company.test.js +62 -7
  6. package/dist/bin/sync-runner-company.test.js.map +1 -1
  7. package/dist/bin/sync-runner-planning.d.ts +12 -3
  8. package/dist/bin/sync-runner-planning.d.ts.map +1 -1
  9. package/dist/bin/sync-runner-planning.js +65 -3
  10. package/dist/bin/sync-runner-planning.js.map +1 -1
  11. package/dist/bin/sync-runner-planning.test.js +172 -1
  12. package/dist/bin/sync-runner-planning.test.js.map +1 -1
  13. package/dist/bin/sync-runner-watch-loop.d.ts +52 -3
  14. package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
  15. package/dist/bin/sync-runner-watch-loop.js +443 -167
  16. package/dist/bin/sync-runner-watch-loop.js.map +1 -1
  17. package/dist/bin/sync-runner-watch-routes.d.ts +19 -2
  18. package/dist/bin/sync-runner-watch-routes.d.ts.map +1 -1
  19. package/dist/bin/sync-runner-watch-routes.js +40 -5
  20. package/dist/bin/sync-runner-watch-routes.js.map +1 -1
  21. package/dist/bin/sync-runner-watch-routes.test.js +47 -0
  22. package/dist/bin/sync-runner-watch-routes.test.js.map +1 -1
  23. package/dist/bin/sync-runner.d.ts +64 -6
  24. package/dist/bin/sync-runner.d.ts.map +1 -1
  25. package/dist/bin/sync-runner.js +48 -4
  26. package/dist/bin/sync-runner.js.map +1 -1
  27. package/dist/bin/sync-runner.test.js +1577 -169
  28. package/dist/bin/sync-runner.test.js.map +1 -1
  29. package/dist/cli/onepass-pull-planner-regressions.test.d.ts +2 -0
  30. package/dist/cli/onepass-pull-planner-regressions.test.d.ts.map +1 -0
  31. package/dist/cli/onepass-pull-planner-regressions.test.js +300 -0
  32. package/dist/cli/onepass-pull-planner-regressions.test.js.map +1 -0
  33. package/dist/cli/onepass-pull-planner.test.d.ts +2 -0
  34. package/dist/cli/onepass-pull-planner.test.d.ts.map +1 -0
  35. package/dist/cli/onepass-pull-planner.test.js +266 -0
  36. package/dist/cli/onepass-pull-planner.test.js.map +1 -0
  37. package/dist/cli/push-scan-exclusions.test.js +4 -4
  38. package/dist/cli/push-scan-exclusions.test.js.map +1 -1
  39. package/dist/cli/share.d.ts +31 -1
  40. package/dist/cli/share.d.ts.map +1 -1
  41. package/dist/cli/share.js +136 -6
  42. package/dist/cli/share.js.map +1 -1
  43. package/dist/cli/share.test.js +295 -5
  44. package/dist/cli/share.test.js.map +1 -1
  45. package/dist/cli/streaming-pull-planner.bench.test.d.ts +15 -0
  46. package/dist/cli/streaming-pull-planner.bench.test.d.ts.map +1 -0
  47. package/dist/cli/streaming-pull-planner.bench.test.js +273 -0
  48. package/dist/cli/streaming-pull-planner.bench.test.js.map +1 -0
  49. package/dist/cli/sync-scope.test.js +8 -0
  50. package/dist/cli/sync-scope.test.js.map +1 -1
  51. package/dist/cli/sync.d.ts +12 -0
  52. package/dist/cli/sync.d.ts.map +1 -1
  53. package/dist/cli/sync.js +302 -123
  54. package/dist/cli/sync.js.map +1 -1
  55. package/dist/cli/sync.test.js +255 -2
  56. package/dist/cli/sync.test.js.map +1 -1
  57. package/dist/hq-root-recovery.d.ts +30 -0
  58. package/dist/hq-root-recovery.d.ts.map +1 -0
  59. package/dist/hq-root-recovery.js +131 -0
  60. package/dist/hq-root-recovery.js.map +1 -0
  61. package/dist/hq-root-recovery.test.d.ts +2 -0
  62. package/dist/hq-root-recovery.test.d.ts.map +1 -0
  63. package/dist/hq-root-recovery.test.js +65 -0
  64. package/dist/hq-root-recovery.test.js.map +1 -0
  65. package/dist/journal-row-store.d.ts +40 -5
  66. package/dist/journal-row-store.d.ts.map +1 -1
  67. package/dist/journal-row-store.js +240 -21
  68. package/dist/journal-row-store.js.map +1 -1
  69. package/dist/journal-row-store.test.js +54 -0
  70. package/dist/journal-row-store.test.js.map +1 -1
  71. package/dist/journal-snapshot-v4.d.ts.map +1 -1
  72. package/dist/journal-snapshot-v4.js +11 -6
  73. package/dist/journal-snapshot-v4.js.map +1 -1
  74. package/dist/journal-store.test.js +324 -7
  75. package/dist/journal-store.test.js.map +1 -1
  76. package/dist/journal.d.ts +51 -16
  77. package/dist/journal.d.ts.map +1 -1
  78. package/dist/journal.js +303 -79
  79. package/dist/journal.js.map +1 -1
  80. package/dist/lib/exit-codes.d.ts +15 -0
  81. package/dist/lib/exit-codes.d.ts.map +1 -1
  82. package/dist/lib/exit-codes.js +15 -0
  83. package/dist/lib/exit-codes.js.map +1 -1
  84. package/dist/personal-vault.d.ts.map +1 -1
  85. package/dist/personal-vault.js +10 -3
  86. package/dist/personal-vault.js.map +1 -1
  87. package/dist/personal-vault.test.js +35 -0
  88. package/dist/personal-vault.test.js.map +1 -1
  89. package/dist/remote-pull.d.ts.map +1 -1
  90. package/dist/remote-pull.js +9 -2
  91. package/dist/remote-pull.js.map +1 -1
  92. package/dist/remote-pull.test.js +59 -2
  93. package/dist/remote-pull.test.js.map +1 -1
  94. package/dist/s3.d.ts +1 -0
  95. package/dist/s3.d.ts.map +1 -1
  96. package/dist/s3.js +20 -2
  97. package/dist/s3.js.map +1 -1
  98. package/dist/s3.list-cost.test.d.ts +2 -0
  99. package/dist/s3.list-cost.test.d.ts.map +1 -0
  100. package/dist/s3.list-cost.test.js +51 -0
  101. package/dist/s3.list-cost.test.js.map +1 -0
  102. package/dist/sync/area-ledger.d.ts +27 -3
  103. package/dist/sync/area-ledger.d.ts.map +1 -1
  104. package/dist/sync/area-ledger.js +149 -39
  105. package/dist/sync/area-ledger.js.map +1 -1
  106. package/dist/sync/area-ledger.test.js +192 -5
  107. package/dist/sync/area-ledger.test.js.map +1 -1
  108. package/dist/sync/parallel-sync-coordinator.test.js +29 -0
  109. package/dist/sync/parallel-sync-coordinator.test.js.map +1 -1
  110. package/dist/sync/realtime-telemetry.d.ts +1 -1
  111. package/dist/sync/realtime-telemetry.d.ts.map +1 -1
  112. package/dist/sync/realtime-telemetry.js +14 -6
  113. package/dist/sync/realtime-telemetry.js.map +1 -1
  114. package/dist/sync/realtime-telemetry.test.js +136 -16
  115. package/dist/sync/realtime-telemetry.test.js.map +1 -1
  116. package/dist/sync/remote-file-spool.d.ts +16 -0
  117. package/dist/sync/remote-file-spool.d.ts.map +1 -0
  118. package/dist/sync/remote-file-spool.js +91 -0
  119. package/dist/sync/remote-file-spool.js.map +1 -0
  120. package/dist/sync/remote-file-spool.test.d.ts +2 -0
  121. package/dist/sync/remote-file-spool.test.d.ts.map +1 -0
  122. package/dist/sync/remote-file-spool.test.js +77 -0
  123. package/dist/sync/remote-file-spool.test.js.map +1 -0
  124. package/dist/sync/state-store.d.ts +6 -0
  125. package/dist/sync/state-store.d.ts.map +1 -1
  126. package/dist/sync/state-store.js +14 -2
  127. package/dist/sync/state-store.js.map +1 -1
  128. package/dist/watch-coverage.d.ts +24 -0
  129. package/dist/watch-coverage.d.ts.map +1 -0
  130. package/dist/watch-coverage.js +46 -0
  131. package/dist/watch-coverage.js.map +1 -0
  132. package/dist/watch-coverage.test.d.ts +2 -0
  133. package/dist/watch-coverage.test.d.ts.map +1 -0
  134. package/dist/watch-coverage.test.js +56 -0
  135. package/dist/watch-coverage.test.js.map +1 -0
  136. package/dist/watcher.d.ts +31 -1
  137. package/dist/watcher.d.ts.map +1 -1
  138. package/dist/watcher.js +172 -0
  139. package/dist/watcher.js.map +1 -1
  140. package/dist/watcher.test.js +78 -0
  141. package/dist/watcher.test.js.map +1 -1
  142. package/package.json +2 -1
@@ -52,8 +52,8 @@ describe("push-scan personal-vault exclusions", () => {
52
52
  fs.rmSync(hqRoot, { recursive: true, force: true });
53
53
  });
54
54
  const buildFilter = () => wrapFilterWithPersonalVaultDefaults(createIgnoreFilter(hqRoot), hqRoot, () => { });
55
- it("excludes every excluded class from the plan and keeps legit content", () => {
56
- const collected = collectFiles(computePersonalVaultPaths(hqRoot, {}), hqRoot, hqRoot, buildFilter());
55
+ it("excludes every excluded class from the plan and keeps legit content", async () => {
56
+ const collected = await collectFiles(computePersonalVaultPaths(hqRoot, {}), hqRoot, hqRoot, buildFilter());
57
57
  const keys = collected.map((e) => e.relativePath);
58
58
  expect(keys).toContain("personal/keep.md");
59
59
  expect(keys).toContain("core/policies/p.md");
@@ -66,10 +66,10 @@ describe("push-scan personal-vault exclusions", () => {
66
66
  expect(k).not.toMatch(/(^|\/)\.conflict-/);
67
67
  }
68
68
  });
69
- it("prunes excluded directories during traversal (never reads inside them)", () => {
69
+ it("prunes excluded directories during traversal (never reads inside them)", async () => {
70
70
  const readdirSpy = vi.spyOn(fs, "readdirSync");
71
71
  try {
72
- collectFiles(computePersonalVaultPaths(hqRoot, {}), hqRoot, hqRoot, buildFilter());
72
+ await collectFiles(computePersonalVaultPaths(hqRoot, {}), hqRoot, hqRoot, buildFilter());
73
73
  }
74
74
  finally {
75
75
  // Capture the directories the walk enumerated, then restore.
@@ -1 +1 @@
1
- {"version":3,"file":"push-scan-exclusions.test.js","sourceRoot":"","sources":["../../src/cli/push-scan-exclusions.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push-scan-exclusions.test.js","sourceRoot":"","sources":["../../src/cli/push-scan-exclusions.test.ts"],"names":[],"mappings":"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"}
@@ -134,6 +134,12 @@ export declare function isEphemeralPath(p: string): boolean;
134
134
  * (skip-excluded-policy), symmetric with the ephemeral-mirror filter above.
135
135
  */
136
136
  export declare function isMalformedVaultKey(key: string): boolean;
137
+ declare function enableCooperativeRowVisits(): void;
138
+ declare function disableCooperativeRowVisits(): void;
139
+ declare function snapshotCooperativeRowVisits(): {
140
+ collect: Map<string, number>;
141
+ plan: Map<string, number>;
142
+ };
137
143
  /**
138
144
  * Test-only export. Kept under a `_testing` namespace so the module's public
139
145
  * surface stays focused on `share()` / `ShareOptions` / `ShareResult` while
@@ -151,6 +157,9 @@ export declare const _testing: {
151
157
  isWithinLexicalOrReal: typeof isWithinLexicalOrReal;
152
158
  defaultConsoleLogger: typeof defaultConsoleLogger;
153
159
  statMatchesJournal: typeof statMatchesJournal;
160
+ enableCooperativeRowVisits: typeof enableCooperativeRowVisits;
161
+ disableCooperativeRowVisits: typeof disableCooperativeRowVisits;
162
+ cooperativeRowVisits: typeof snapshotCooperativeRowVisits;
154
163
  };
155
164
  /**
156
165
  * Stage-1 classification for a single local file in a push run. Pre-HEAD —
@@ -278,6 +287,14 @@ export interface ShareOptions {
278
287
  * planning. The caller owns throttling; one-shot CLI callers omit it.
279
288
  */
280
289
  onHeartbeat?: () => void;
290
+ /**
291
+ * Cooperative root-lock hand-off for a watch-mode full push. It is called
292
+ * only after a bounded upload unit has completely settled and its journal
293
+ * updates are on disk. A `true` result means realtime work ran while this
294
+ * pass yielded, so the push is rebuilt from current local and journal state
295
+ * before it can plan another durable mutation.
296
+ */
297
+ cooperativeCheckpoint?: () => Promise<void | boolean>;
281
298
  /**
282
299
  * When true, files whose local hash matches the journal entry from the
283
300
  * last sync are skipped (no remote HEAD, no upload). This is the gate
@@ -641,6 +658,12 @@ export interface SharePathResult {
641
658
  export declare function wrapFilterWithIgnoreVisibility(underlying: (absPath: string, isDir?: boolean) => boolean, hqRoot: string, onIgnoreExcluded: (relPath: string) => void, onAnyExcluded?: () => void): (absPath: string, isDir?: boolean) => boolean;
642
659
  /**
643
660
  * Share local file(s) to the entity vault.
661
+ *
662
+ * A cooperative hand-off yields the root lock at a drained 500-row unit, then
663
+ * resumes the same collection, plan, and executor instead of restarting
664
+ * `share()`. Journal writes stay delta-only (absence-is-deletion is the delete
665
+ * plan, computed once from the completed walk), so a realtime writer's rows
666
+ * are not dropped when this pass finalizes.
644
667
  */
645
668
  export declare function share(options: ShareOptions): Promise<ShareResult>;
646
669
  type UploadPlanItem = Extract<PushPlanItem, {
@@ -656,6 +679,12 @@ type UploadPlanItem = Extract<PushPlanItem, {
656
679
  export declare function currentUploadBytes(item: UploadPlanItem): number;
657
680
  /** Read only the immutable identity field from the first YAML frontmatter. */
658
681
  export declare function parseRegisteredCompanySkillUid(content: string): string | undefined;
682
+ /**
683
+ * Maximum completed upload mutations between cooperative full-push hand-offs.
684
+ * The executor drains a unit before yielding, so realtime never overlaps an
685
+ * upload body or the push's mutable journal state.
686
+ */
687
+ export declare const FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE = 500;
659
688
  /**
660
689
  * Default human-readable share output. Preserves the exact format the CLI
661
690
  * emitted before `onEvent` was added — tty users see no change.
@@ -722,6 +751,7 @@ interface CollectHooks {
722
751
  onUnreachablePath?: (namedPath: string, reason: UnreachablePathReason) => void;
723
752
  onLinkedSubtree?: (rel: string) => void;
724
753
  onHeartbeat?: () => void;
754
+ cooperativeCheckpoint?: () => Promise<void | boolean>;
725
755
  }
726
756
  /**
727
757
  * Resolve a caller-supplied push path to an absolute path.
@@ -799,6 +829,6 @@ declare function isWithinLexicalOrReal(parent: string, child: string, hqRoot: st
799
829
  * Pre-fix, statSync followed the link and the target's bytes were uploaded
800
830
  * under the link's key — silently flattening the link topology.
801
831
  */
802
- declare function collectFiles(paths: string[], hqRoot: string, syncRoot: string, filter: (p: string, isDir?: boolean) => boolean, hooks?: CollectHooks): CollectedEntry[];
832
+ declare function collectFiles(paths: string[], hqRoot: string, syncRoot: string, filter: (p: string, isDir?: boolean) => boolean, hooks?: CollectHooks): Promise<CollectedEntry[]>;
803
833
  export {};
804
834
  //# sourceMappingURL=share.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/cli/share.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/cli/share.ts"],"names":[],"mappings":"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"}
package/dist/cli/share.js CHANGED
@@ -213,6 +213,33 @@ export function isEphemeralPath(p) {
213
213
  export function isMalformedVaultKey(key) {
214
214
  return key.includes("\\");
215
215
  }
216
+ const cooperativeRowVisits = {
217
+ enabled: false,
218
+ collect: new Map(),
219
+ plan: new Map(),
220
+ };
221
+ function noteCooperativeRowVisit(phase, relativePath) {
222
+ if (!cooperativeRowVisits.enabled)
223
+ return;
224
+ const bucket = cooperativeRowVisits[phase];
225
+ bucket.set(relativePath, (bucket.get(relativePath) ?? 0) + 1);
226
+ }
227
+ function enableCooperativeRowVisits() {
228
+ cooperativeRowVisits.enabled = true;
229
+ cooperativeRowVisits.collect = new Map();
230
+ cooperativeRowVisits.plan = new Map();
231
+ }
232
+ function disableCooperativeRowVisits() {
233
+ cooperativeRowVisits.enabled = false;
234
+ cooperativeRowVisits.collect = new Map();
235
+ cooperativeRowVisits.plan = new Map();
236
+ }
237
+ function snapshotCooperativeRowVisits() {
238
+ return {
239
+ collect: new Map(cooperativeRowVisits.collect),
240
+ plan: new Map(cooperativeRowVisits.plan),
241
+ };
242
+ }
216
243
  /**
217
244
  * Test-only export. Kept under a `_testing` namespace so the module's public
218
245
  * surface stays focused on `share()` / `ShareOptions` / `ShareResult` while
@@ -230,6 +257,9 @@ export const _testing = {
230
257
  isWithinLexicalOrReal,
231
258
  defaultConsoleLogger,
232
259
  statMatchesJournal,
260
+ enableCooperativeRowVisits,
261
+ disableCooperativeRowVisits,
262
+ cooperativeRowVisits: snapshotCooperativeRowVisits,
233
263
  };
234
264
  /** Snapshot of `absolutePath`, or null when it is missing or not a plain file. */
235
265
  function statSnapshot(absolutePath) {
@@ -287,6 +317,21 @@ function statMatchesJournal(absolutePath, entry) {
287
317
  // (journal.ts) so the pull planner applies the identical gate.
288
318
  return journalEntryMatchesStat(entry, lstat);
289
319
  }
320
+ /**
321
+ * Let watcher ingress run at a bounded row cadence, then hand the full-pass
322
+ * scheduler a mutation-free boundary when it has realtime work waiting. The
323
+ * caller resumes at the next 500-row unit; collection and planning keep the
324
+ * snapshot they already built instead of restarting `share()`.
325
+ */
326
+ async function yieldToCooperativeCheckpoint(work, cooperativeCheckpoint, force = false) {
327
+ work.rowsSinceYield += 1;
328
+ if (!force && work.rowsSinceYield < FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE)
329
+ return;
330
+ work.rowsSinceYield = 0;
331
+ await new Promise((resolve) => setImmediate(resolve));
332
+ if (cooperativeCheckpoint)
333
+ await cooperativeCheckpoint();
334
+ }
290
335
  function computePushPlan(filesToShare, journal, skipUnchanged, onHeartbeat) {
291
336
  const items = [];
292
337
  for (const entry of filesToShare) {
@@ -435,6 +480,31 @@ function computePushPlan(filesToShare, journal, skipUnchanged, onHeartbeat) {
435
480
  }
436
481
  return { items, filesToUpload, bytesToUpload, filesToSkip };
437
482
  }
483
+ /**
484
+ * Build a full-pass plan in bounded row batches. A scoped replan deliberately
485
+ * uses the synchronous single-row planner above, so it does not add an await
486
+ * boundary between upload admissions and collapse the transfer pool.
487
+ */
488
+ async function computePushPlanCooperatively(filesToShare, journal, skipUnchanged, onHeartbeat, cooperativeCheckpoint) {
489
+ const items = [];
490
+ let filesToUpload = 0;
491
+ let bytesToUpload = 0;
492
+ let filesToSkip = 0;
493
+ const cooperativeWork = { rowsSinceYield: 0 };
494
+ for (let start = 0; start < filesToShare.length; start += FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE) {
495
+ const slice = filesToShare.slice(start, start + FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE);
496
+ const plan = computePushPlan(slice, journal, skipUnchanged, onHeartbeat);
497
+ items.push(...plan.items);
498
+ filesToUpload += plan.filesToUpload;
499
+ bytesToUpload += plan.bytesToUpload;
500
+ filesToSkip += plan.filesToSkip;
501
+ for (const entry of slice) {
502
+ noteCooperativeRowVisit("plan", entry.relativePath);
503
+ }
504
+ await yieldToCooperativeCheckpoint(cooperativeWork, cooperativeCheckpoint, true);
505
+ }
506
+ return { items, filesToUpload, bytesToUpload, filesToSkip };
507
+ }
438
508
  /** Re-read one collected path at the execution seam. */
439
509
  function recollectPushEntry(item) {
440
510
  let lstat;
@@ -632,8 +702,17 @@ export function wrapFilterWithIgnoreVisibility(underlying, hqRoot, onIgnoreExclu
632
702
  }
633
703
  /**
634
704
  * Share local file(s) to the entity vault.
705
+ *
706
+ * A cooperative hand-off yields the root lock at a drained 500-row unit, then
707
+ * resumes the same collection, plan, and executor instead of restarting
708
+ * `share()`. Journal writes stay delta-only (absence-is-deletion is the delete
709
+ * plan, computed once from the completed walk), so a realtime writer's rows
710
+ * are not dropped when this pass finalizes.
635
711
  */
636
712
  export async function share(options) {
713
+ return shareOnce(options);
714
+ }
715
+ async function shareOnce(options) {
637
716
  const run = await createPushRunContext(options);
638
717
  const counters = createShareCounters();
639
718
  const filesRefusedStalePaths = [];
@@ -1465,7 +1544,7 @@ async function reconcileLandedCompanySkill(run, relativePath, content, absoluteP
1465
1544
  }
1466
1545
  }
1467
1546
  async function buildSharePlans(run) {
1468
- const collected = collectFiles(run.paths, run.hqRoot, run.syncRoot, run.shouldSync, {
1547
+ const collected = await collectFiles(run.paths, run.hqRoot, run.syncRoot, run.shouldSync, {
1469
1548
  onUnreachablePath: (namedPath, reason) => {
1470
1549
  // First reason wins: a path is named once, and re-adding would only
1471
1550
  // churn the map ordering the error message and event sample rely on.
@@ -1475,6 +1554,7 @@ async function buildSharePlans(run) {
1475
1554
  },
1476
1555
  onLinkedSubtree: (rel) => run.linkedSubtreeSet.add(rel),
1477
1556
  onHeartbeat: run.options.onHeartbeat,
1557
+ cooperativeCheckpoint: run.options.cooperativeCheckpoint,
1478
1558
  });
1479
1559
  // Ask #2 of feedback_a51cb63d: "error, not warn-skip, when the named file
1480
1560
  // exists locally but is unreachable by the resolver". This is the throw that
@@ -1557,7 +1637,7 @@ async function buildSharePlans(run) {
1557
1637
  const uploadableFiles = registrationSkipped.size > 0
1558
1638
  ? filesToShare.filter((entry) => !registrationSkipped.has(entry.relativePath))
1559
1639
  : filesToShare;
1560
- const pushPlan = computePushPlan(uploadableFiles, run.journal, run.skipUnchanged === true, run.options.onHeartbeat);
1640
+ const pushPlan = await computePushPlanCooperatively(uploadableFiles, run.journal, run.skipUnchanged === true, run.options.onHeartbeat, run.options.cooperativeCheckpoint);
1561
1641
  const deletePlan = run.propagateDeletes === true
1562
1642
  ? await computeDeletePlan(run.journal, run.syncRoot, deleteScopeRoots, run.shouldSync, run.propagateDeletePolicy, run.ctx, run.options.personalMode !== true)
1563
1643
  : { toDelete: [], toTombstone: [], refusedStale: [] };
@@ -2367,9 +2447,21 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
2367
2447
  // this flag only halts admission, so the refusal still surfaces via
2368
2448
  // throwUploadWorkerErrors below. In-flight legs still drain.
2369
2449
  let sessionAuthAborted = false;
2450
+ // Cooperative work is admitted in bounded units, then fully drained before
2451
+ // the root lock can change owners. A mostly unchanged personal vault can
2452
+ // contain more than a million skip rows, so those rows get an equally
2453
+ // bounded, mutation-free hand-off cadence instead of monopolizing the
2454
+ // scheduler until the full pass ends.
2455
+ let admittedSinceCooperativeCheckpoint = 0;
2456
+ let skippedSinceCooperativeCheckpoint = 0;
2370
2457
  while (queue.length > 0 || inFlight.size > 0) {
2371
2458
  while (!aborted &&
2372
2459
  !sessionAuthAborted &&
2460
+ (!run.options.cooperativeCheckpoint ||
2461
+ (admittedSinceCooperativeCheckpoint <
2462
+ FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE &&
2463
+ skippedSinceCooperativeCheckpoint <
2464
+ FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE)) &&
2373
2465
  inFlight.size < TRANSFER_CONCURRENCY &&
2374
2466
  queue.length > 0) {
2375
2467
  const previewItem = queue[0];
@@ -2377,15 +2469,18 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
2377
2469
  if (item === null) {
2378
2470
  queue.shift();
2379
2471
  counters.filesSkipped++;
2472
+ skippedSinceCooperativeCheckpoint++;
2380
2473
  continue;
2381
2474
  }
2382
2475
  if (item.action !== "upload") {
2383
2476
  queue.shift();
2384
2477
  settleFreshSkip(item);
2478
+ skippedSinceCooperativeCheckpoint++;
2385
2479
  continue;
2386
2480
  }
2387
2481
  if (suppressFreshTombstone(item)) {
2388
2482
  queue.shift();
2483
+ skippedSinceCooperativeCheckpoint++;
2389
2484
  continue;
2390
2485
  }
2391
2486
  // Reserve the file's CURRENT on-disk size, not the planned size: an
@@ -2396,6 +2491,7 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
2396
2491
  if (inFlight.size > 0 && inFlightBytes + nextBytes > byteBudget)
2397
2492
  break;
2398
2493
  queue.shift();
2494
+ admittedSinceCooperativeCheckpoint++;
2399
2495
  inFlightBytes += nextBytes;
2400
2496
  const upload = () => processUploadItem(item);
2401
2497
  const p = (run.options.transferSemaphore
@@ -2423,6 +2519,27 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
2423
2519
  if (inFlight.size > 0) {
2424
2520
  await Promise.race(Array.from(inFlight));
2425
2521
  }
2522
+ else if (run.options.cooperativeCheckpoint &&
2523
+ !aborted &&
2524
+ !sessionAuthAborted &&
2525
+ !hadUploadFailure &&
2526
+ (admittedSinceCooperativeCheckpoint > 0 || skippedSinceCooperativeCheckpoint > 0) &&
2527
+ (admittedSinceCooperativeCheckpoint >=
2528
+ FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE ||
2529
+ skippedSinceCooperativeCheckpoint >=
2530
+ FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE ||
2531
+ queue.length === 0)) {
2532
+ // Every admitted upload has settled, so `processUploadItem` has
2533
+ // finished its mutable journal updates. Persist that durable unit before
2534
+ // yielding. Skip-only units have no new durable state; resume the
2535
+ // remaining queue after realtime returns the lock.
2536
+ if (admittedSinceCooperativeCheckpoint > 0)
2537
+ flushShareJournal(run);
2538
+ admittedSinceCooperativeCheckpoint = 0;
2539
+ skippedSinceCooperativeCheckpoint = 0;
2540
+ await new Promise((resolve) => setImmediate(resolve));
2541
+ await run.options.cooperativeCheckpoint();
2542
+ }
2426
2543
  else {
2427
2544
  break;
2428
2545
  }
@@ -2955,6 +3072,12 @@ async function executeDeletes(run, deletePlan, decommissionPlan, counters, files
2955
3072
  */
2956
3073
  const CHECKPOINT_MIN_APPLIED = 250;
2957
3074
  const CHECKPOINT_MIN_INTERVAL_MS = 5_000;
3075
+ /**
3076
+ * Maximum completed upload mutations between cooperative full-push hand-offs.
3077
+ * The executor drains a unit before yielding, so realtime never overlaps an
3078
+ * upload body or the push's mutable journal state.
3079
+ */
3080
+ export const FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE = 500;
2958
3081
  /**
2959
3082
  * Fraction of the journal's current size that must be re-applied before another
2960
3083
  * checkpoint is worth its write. `writeJournal` publishes a whole compact
@@ -3649,14 +3772,16 @@ function reportLinkedSubtreeIfExternal(linkPath, syncRoot, relativePath, hooks)
3649
3772
  * Pre-fix, statSync followed the link and the target's bytes were uploaded
3650
3773
  * under the link's key — silently flattening the link topology.
3651
3774
  */
3652
- function collectFiles(paths, hqRoot, syncRoot, filter, hooks = {}) {
3775
+ async function collectFiles(paths, hqRoot, syncRoot, filter, hooks = {}) {
3653
3776
  const results = [];
3777
+ const cooperativeWork = { rowsSinceYield: 0 };
3654
3778
  // Scoped to THIS collect pass and discarded with it: a watcher batch can
3655
3779
  // name hundreds of paths, and rescanning the companies/ tree for each one
3656
3780
  // is wasted I/O. A cache that outlived the pass could fail open on a tenant
3657
3781
  // boundary, so it deliberately does not.
3658
3782
  const tenantRoots = new Map();
3659
3783
  for (const p of paths) {
3784
+ await yieldToCooperativeCheckpoint(cooperativeWork, hooks.cooperativeCheckpoint);
3660
3785
  hooks.onHeartbeat?.();
3661
3786
  const absolutePath = resolveNamedPath(p, hqRoot, syncRoot);
3662
3787
  // Ephemeral artifacts (conflict mirrors) — see EPHEMERAL_PATH_PATTERN doc.
@@ -3735,18 +3860,20 @@ function collectFiles(paths, hqRoot, syncRoot, filter, hooks = {}) {
3735
3860
  if (lstat.isDirectory()) {
3736
3861
  if (!filter(absolutePath, true))
3737
3862
  continue;
3738
- walkDir(absolutePath, syncRoot, filter, results, hooks);
3863
+ await walkDir(absolutePath, syncRoot, filter, results, hooks, cooperativeWork);
3739
3864
  }
3740
3865
  else if (lstat.isFile()) {
3741
3866
  const relativePath = vaultKeyForLocalPath(syncRoot, absolutePath);
3742
3867
  if (filter(absolutePath)) {
3868
+ noteCooperativeRowVisit("collect", relativePath);
3743
3869
  results.push({ kind: "file", absolutePath, relativePath });
3744
3870
  }
3745
3871
  }
3746
3872
  }
3873
+ await yieldToCooperativeCheckpoint(cooperativeWork, hooks.cooperativeCheckpoint, true);
3747
3874
  return results;
3748
3875
  }
3749
- function walkDir(dir, syncRoot, filter, results, hooks = {}) {
3876
+ async function walkDir(dir, syncRoot, filter, results, hooks = {}, cooperativeWork = { rowsSinceYield: 0 }) {
3750
3877
  // A frame per open directory preserves the recursive walk's depth-first
3751
3878
  // ordering without turning a completed subtree into one giant call argument
3752
3879
  // list. This matters for both operator-visible plan ordering and large trees.
@@ -3762,6 +3889,7 @@ function walkDir(dir, syncRoot, filter, results, hooks = {}) {
3762
3889
  };
3763
3890
  enterDirectory(dir);
3764
3891
  while (stack.length > 0) {
3892
+ await yieldToCooperativeCheckpoint(cooperativeWork, hooks.cooperativeCheckpoint);
3765
3893
  hooks.onHeartbeat?.();
3766
3894
  const frame = stack[stack.length - 1];
3767
3895
  if (frame.index >= frame.entries.length) {
@@ -3824,10 +3952,12 @@ function walkDir(dir, syncRoot, filter, results, hooks = {}) {
3824
3952
  enterDirectory(absolutePath);
3825
3953
  }
3826
3954
  else if (entry.isFile()) {
3955
+ const relativePath = vaultKeyForLocalPath(syncRoot, absolutePath);
3956
+ noteCooperativeRowVisit("collect", relativePath);
3827
3957
  results.push({
3828
3958
  kind: "file",
3829
3959
  absolutePath,
3830
- relativePath: vaultKeyForLocalPath(syncRoot, absolutePath),
3960
+ relativePath,
3831
3961
  });
3832
3962
  }
3833
3963
  }