@indigoai-us/hq-cloud 6.16.65 → 6.16.67

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 (126) 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 +51 -2
  14. package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
  15. package/dist/bin/sync-runner-watch-loop.js +409 -165
  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 +59 -5
  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 +1553 -192
  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 +143 -8
  42. package/dist/cli/share.js.map +1 -1
  43. package/dist/cli/share.test.js +350 -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 +297 -125
  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/journal-row-store.d.ts +40 -5
  58. package/dist/journal-row-store.d.ts.map +1 -1
  59. package/dist/journal-row-store.js +240 -21
  60. package/dist/journal-row-store.js.map +1 -1
  61. package/dist/journal-row-store.test.js +54 -0
  62. package/dist/journal-row-store.test.js.map +1 -1
  63. package/dist/journal-snapshot-v4.d.ts.map +1 -1
  64. package/dist/journal-snapshot-v4.js +11 -6
  65. package/dist/journal-snapshot-v4.js.map +1 -1
  66. package/dist/journal-store.test.js +324 -7
  67. package/dist/journal-store.test.js.map +1 -1
  68. package/dist/journal.d.ts +51 -16
  69. package/dist/journal.d.ts.map +1 -1
  70. package/dist/journal.js +303 -79
  71. package/dist/journal.js.map +1 -1
  72. package/dist/lib/exit-codes.d.ts +15 -0
  73. package/dist/lib/exit-codes.d.ts.map +1 -1
  74. package/dist/lib/exit-codes.js +15 -0
  75. package/dist/lib/exit-codes.js.map +1 -1
  76. package/dist/personal-vault.d.ts.map +1 -1
  77. package/dist/personal-vault.js +10 -3
  78. package/dist/personal-vault.js.map +1 -1
  79. package/dist/personal-vault.test.js +35 -0
  80. package/dist/personal-vault.test.js.map +1 -1
  81. package/dist/remote-pull.d.ts.map +1 -1
  82. package/dist/remote-pull.js +9 -2
  83. package/dist/remote-pull.js.map +1 -1
  84. package/dist/remote-pull.test.js +59 -2
  85. package/dist/remote-pull.test.js.map +1 -1
  86. package/dist/s3.d.ts +1 -0
  87. package/dist/s3.d.ts.map +1 -1
  88. package/dist/s3.js +20 -2
  89. package/dist/s3.js.map +1 -1
  90. package/dist/s3.list-cost.test.d.ts +2 -0
  91. package/dist/s3.list-cost.test.d.ts.map +1 -0
  92. package/dist/s3.list-cost.test.js +51 -0
  93. package/dist/s3.list-cost.test.js.map +1 -0
  94. package/dist/sync/area-ledger.d.ts +27 -3
  95. package/dist/sync/area-ledger.d.ts.map +1 -1
  96. package/dist/sync/area-ledger.js +149 -39
  97. package/dist/sync/area-ledger.js.map +1 -1
  98. package/dist/sync/area-ledger.test.js +192 -5
  99. package/dist/sync/area-ledger.test.js.map +1 -1
  100. package/dist/sync/parallel-sync-coordinator.test.js +29 -0
  101. package/dist/sync/parallel-sync-coordinator.test.js.map +1 -1
  102. package/dist/sync/realtime-telemetry.d.ts +1 -1
  103. package/dist/sync/realtime-telemetry.d.ts.map +1 -1
  104. package/dist/sync/realtime-telemetry.js +14 -6
  105. package/dist/sync/realtime-telemetry.js.map +1 -1
  106. package/dist/sync/realtime-telemetry.test.js +136 -16
  107. package/dist/sync/realtime-telemetry.test.js.map +1 -1
  108. package/dist/sync/remote-file-spool.d.ts +16 -0
  109. package/dist/sync/remote-file-spool.d.ts.map +1 -0
  110. package/dist/sync/remote-file-spool.js +91 -0
  111. package/dist/sync/remote-file-spool.js.map +1 -0
  112. package/dist/sync/remote-file-spool.test.d.ts +2 -0
  113. package/dist/sync/remote-file-spool.test.d.ts.map +1 -0
  114. package/dist/sync/remote-file-spool.test.js +77 -0
  115. package/dist/sync/remote-file-spool.test.js.map +1 -0
  116. package/dist/sync/state-store.d.ts +6 -0
  117. package/dist/sync/state-store.d.ts.map +1 -1
  118. package/dist/sync/state-store.js +14 -2
  119. package/dist/sync/state-store.js.map +1 -1
  120. package/dist/watcher.d.ts +12 -0
  121. package/dist/watcher.d.ts.map +1 -1
  122. package/dist/watcher.js +131 -0
  123. package/dist/watcher.js.map +1 -1
  124. package/dist/watcher.test.js +63 -0
  125. package/dist/watcher.test.js.map +1 -1
  126. 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
@@ -14,7 +14,7 @@ import { localPathForVaultKey, vaultKeyForLocalPath } from "../local-path-codec.
14
14
  import { uploadFile, uploadSymlink, toPosixKey, headRemoteFile, readVerifiedRemoteSymlinkTarget, deleteRemoteFile, downloadFile, primeObjectTransport, primeUploads, publishedContentHash, setUploadContentHash, WindowsSymlinkPrivilegeError, WINDOWS_SYMLINK_PRIVILEGE_REMEDY, WindowsRenameBlockedError, WINDOWS_RENAME_BLOCKED_REMEDY, renameOrRaiseWindowsBlocked, } from "../s3.js";
15
15
  import * as crypto from "crypto";
16
16
  import { RateLimitedError } from "../object-io.js";
17
- import { isUnderAnyRoot, readJournalForPass, readJournalScoped, writeJournal, hashFile, hashSymlinkTarget, journalRows, journalEntryMatchesStat, timestampsTooCoarseToTrust, updateEntry, removeEntry, isTombstone, normalizeEtag, PERSONAL_VAULT_JOURNAL_SLUG, migratePersonalVaultJournal, migrateToV2, } from "../journal.js";
17
+ import { isUnderAnyRoot, readJournalForPass, readJournalScoped, writeJournal, hashFile, hashSymlinkTarget, journalRows, journalEntryMatchesStat, timestampsTooCoarseToTrust, updateEntry, PrematureJournalEntryError, removeEntry, isTombstone, normalizeEtag, PERSONAL_VAULT_JOURNAL_SLUG, migratePersonalVaultJournal, migrateToV2, } from "../journal.js";
18
18
  import { createIgnoreFilter, hasControlCharacters, isExpectedIgnore, isWithinSizeLimit, } from "../ignore.js";
19
19
  import { wrapFilterWithPersonalVaultDefaults, } from "../personal-vault-exclusions.js";
20
20
  import { isGeneratedCoreMirrorKey, isPersonalVaultDeletionExcluded, isSessionLogDeletionKey, purgeExcludedPersonalVaultJournalEntries, } from "../personal-vault.js";
@@ -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: [] };
@@ -2329,7 +2409,12 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
2329
2409
  const transient = err instanceof RateLimitedError ||
2330
2410
  (err instanceof Error && err.name === "RateLimited") ||
2331
2411
  isTransientHttpStatusError(err);
2332
- if (transient) {
2412
+ // The file vanished between PUT and journal (ephemeral lock files
2413
+ // such as workers/*/data/run.lock). updateEntry already refused the
2414
+ // premature journal row; the next pass re-plans the key. The company
2415
+ // must not settle `errored` for a deferral that retries next sync.
2416
+ const vanished = err instanceof PrematureJournalEntryError;
2417
+ if (transient || vanished) {
2333
2418
  counters.filesSkipped++;
2334
2419
  run.emit({
2335
2420
  type: "error",
@@ -2367,9 +2452,21 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
2367
2452
  // this flag only halts admission, so the refusal still surfaces via
2368
2453
  // throwUploadWorkerErrors below. In-flight legs still drain.
2369
2454
  let sessionAuthAborted = false;
2455
+ // Cooperative work is admitted in bounded units, then fully drained before
2456
+ // the root lock can change owners. A mostly unchanged personal vault can
2457
+ // contain more than a million skip rows, so those rows get an equally
2458
+ // bounded, mutation-free hand-off cadence instead of monopolizing the
2459
+ // scheduler until the full pass ends.
2460
+ let admittedSinceCooperativeCheckpoint = 0;
2461
+ let skippedSinceCooperativeCheckpoint = 0;
2370
2462
  while (queue.length > 0 || inFlight.size > 0) {
2371
2463
  while (!aborted &&
2372
2464
  !sessionAuthAborted &&
2465
+ (!run.options.cooperativeCheckpoint ||
2466
+ (admittedSinceCooperativeCheckpoint <
2467
+ FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE &&
2468
+ skippedSinceCooperativeCheckpoint <
2469
+ FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE)) &&
2373
2470
  inFlight.size < TRANSFER_CONCURRENCY &&
2374
2471
  queue.length > 0) {
2375
2472
  const previewItem = queue[0];
@@ -2377,15 +2474,18 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
2377
2474
  if (item === null) {
2378
2475
  queue.shift();
2379
2476
  counters.filesSkipped++;
2477
+ skippedSinceCooperativeCheckpoint++;
2380
2478
  continue;
2381
2479
  }
2382
2480
  if (item.action !== "upload") {
2383
2481
  queue.shift();
2384
2482
  settleFreshSkip(item);
2483
+ skippedSinceCooperativeCheckpoint++;
2385
2484
  continue;
2386
2485
  }
2387
2486
  if (suppressFreshTombstone(item)) {
2388
2487
  queue.shift();
2488
+ skippedSinceCooperativeCheckpoint++;
2389
2489
  continue;
2390
2490
  }
2391
2491
  // Reserve the file's CURRENT on-disk size, not the planned size: an
@@ -2396,6 +2496,7 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
2396
2496
  if (inFlight.size > 0 && inFlightBytes + nextBytes > byteBudget)
2397
2497
  break;
2398
2498
  queue.shift();
2499
+ admittedSinceCooperativeCheckpoint++;
2399
2500
  inFlightBytes += nextBytes;
2400
2501
  const upload = () => processUploadItem(item);
2401
2502
  const p = (run.options.transferSemaphore
@@ -2423,6 +2524,27 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
2423
2524
  if (inFlight.size > 0) {
2424
2525
  await Promise.race(Array.from(inFlight));
2425
2526
  }
2527
+ else if (run.options.cooperativeCheckpoint &&
2528
+ !aborted &&
2529
+ !sessionAuthAborted &&
2530
+ !hadUploadFailure &&
2531
+ (admittedSinceCooperativeCheckpoint > 0 || skippedSinceCooperativeCheckpoint > 0) &&
2532
+ (admittedSinceCooperativeCheckpoint >=
2533
+ FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE ||
2534
+ skippedSinceCooperativeCheckpoint >=
2535
+ FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE ||
2536
+ queue.length === 0)) {
2537
+ // Every admitted upload has settled, so `processUploadItem` has
2538
+ // finished its mutable journal updates. Persist that durable unit before
2539
+ // yielding. Skip-only units have no new durable state; resume the
2540
+ // remaining queue after realtime returns the lock.
2541
+ if (admittedSinceCooperativeCheckpoint > 0)
2542
+ flushShareJournal(run);
2543
+ admittedSinceCooperativeCheckpoint = 0;
2544
+ skippedSinceCooperativeCheckpoint = 0;
2545
+ await new Promise((resolve) => setImmediate(resolve));
2546
+ await run.options.cooperativeCheckpoint();
2547
+ }
2426
2548
  else {
2427
2549
  break;
2428
2550
  }
@@ -2955,6 +3077,12 @@ async function executeDeletes(run, deletePlan, decommissionPlan, counters, files
2955
3077
  */
2956
3078
  const CHECKPOINT_MIN_APPLIED = 250;
2957
3079
  const CHECKPOINT_MIN_INTERVAL_MS = 5_000;
3080
+ /**
3081
+ * Maximum completed upload mutations between cooperative full-push hand-offs.
3082
+ * The executor drains a unit before yielding, so realtime never overlaps an
3083
+ * upload body or the push's mutable journal state.
3084
+ */
3085
+ export const FULL_PUSH_COOPERATIVE_CHECKPOINT_BATCH_SIZE = 500;
2958
3086
  /**
2959
3087
  * Fraction of the journal's current size that must be re-applied before another
2960
3088
  * checkpoint is worth its write. `writeJournal` publishes a whole compact
@@ -3649,14 +3777,16 @@ function reportLinkedSubtreeIfExternal(linkPath, syncRoot, relativePath, hooks)
3649
3777
  * Pre-fix, statSync followed the link and the target's bytes were uploaded
3650
3778
  * under the link's key — silently flattening the link topology.
3651
3779
  */
3652
- function collectFiles(paths, hqRoot, syncRoot, filter, hooks = {}) {
3780
+ async function collectFiles(paths, hqRoot, syncRoot, filter, hooks = {}) {
3653
3781
  const results = [];
3782
+ const cooperativeWork = { rowsSinceYield: 0 };
3654
3783
  // Scoped to THIS collect pass and discarded with it: a watcher batch can
3655
3784
  // name hundreds of paths, and rescanning the companies/ tree for each one
3656
3785
  // is wasted I/O. A cache that outlived the pass could fail open on a tenant
3657
3786
  // boundary, so it deliberately does not.
3658
3787
  const tenantRoots = new Map();
3659
3788
  for (const p of paths) {
3789
+ await yieldToCooperativeCheckpoint(cooperativeWork, hooks.cooperativeCheckpoint);
3660
3790
  hooks.onHeartbeat?.();
3661
3791
  const absolutePath = resolveNamedPath(p, hqRoot, syncRoot);
3662
3792
  // Ephemeral artifacts (conflict mirrors) — see EPHEMERAL_PATH_PATTERN doc.
@@ -3735,18 +3865,20 @@ function collectFiles(paths, hqRoot, syncRoot, filter, hooks = {}) {
3735
3865
  if (lstat.isDirectory()) {
3736
3866
  if (!filter(absolutePath, true))
3737
3867
  continue;
3738
- walkDir(absolutePath, syncRoot, filter, results, hooks);
3868
+ await walkDir(absolutePath, syncRoot, filter, results, hooks, cooperativeWork);
3739
3869
  }
3740
3870
  else if (lstat.isFile()) {
3741
3871
  const relativePath = vaultKeyForLocalPath(syncRoot, absolutePath);
3742
3872
  if (filter(absolutePath)) {
3873
+ noteCooperativeRowVisit("collect", relativePath);
3743
3874
  results.push({ kind: "file", absolutePath, relativePath });
3744
3875
  }
3745
3876
  }
3746
3877
  }
3878
+ await yieldToCooperativeCheckpoint(cooperativeWork, hooks.cooperativeCheckpoint, true);
3747
3879
  return results;
3748
3880
  }
3749
- function walkDir(dir, syncRoot, filter, results, hooks = {}) {
3881
+ async function walkDir(dir, syncRoot, filter, results, hooks = {}, cooperativeWork = { rowsSinceYield: 0 }) {
3750
3882
  // A frame per open directory preserves the recursive walk's depth-first
3751
3883
  // ordering without turning a completed subtree into one giant call argument
3752
3884
  // list. This matters for both operator-visible plan ordering and large trees.
@@ -3762,6 +3894,7 @@ function walkDir(dir, syncRoot, filter, results, hooks = {}) {
3762
3894
  };
3763
3895
  enterDirectory(dir);
3764
3896
  while (stack.length > 0) {
3897
+ await yieldToCooperativeCheckpoint(cooperativeWork, hooks.cooperativeCheckpoint);
3765
3898
  hooks.onHeartbeat?.();
3766
3899
  const frame = stack[stack.length - 1];
3767
3900
  if (frame.index >= frame.entries.length) {
@@ -3824,10 +3957,12 @@ function walkDir(dir, syncRoot, filter, results, hooks = {}) {
3824
3957
  enterDirectory(absolutePath);
3825
3958
  }
3826
3959
  else if (entry.isFile()) {
3960
+ const relativePath = vaultKeyForLocalPath(syncRoot, absolutePath);
3961
+ noteCooperativeRowVisit("collect", relativePath);
3827
3962
  results.push({
3828
3963
  kind: "file",
3829
3964
  absolutePath,
3830
- relativePath: vaultKeyForLocalPath(syncRoot, absolutePath),
3965
+ relativePath,
3831
3966
  });
3832
3967
  }
3833
3968
  }