@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.
- package/dist/bin/sync-runner-company.d.ts +14 -0
- package/dist/bin/sync-runner-company.d.ts.map +1 -1
- package/dist/bin/sync-runner-company.js +42 -8
- package/dist/bin/sync-runner-company.js.map +1 -1
- package/dist/bin/sync-runner-company.test.js +62 -7
- package/dist/bin/sync-runner-company.test.js.map +1 -1
- package/dist/bin/sync-runner-planning.d.ts +12 -3
- package/dist/bin/sync-runner-planning.d.ts.map +1 -1
- package/dist/bin/sync-runner-planning.js +65 -3
- package/dist/bin/sync-runner-planning.js.map +1 -1
- package/dist/bin/sync-runner-planning.test.js +172 -1
- package/dist/bin/sync-runner-planning.test.js.map +1 -1
- package/dist/bin/sync-runner-watch-loop.d.ts +51 -2
- package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
- package/dist/bin/sync-runner-watch-loop.js +409 -165
- package/dist/bin/sync-runner-watch-loop.js.map +1 -1
- package/dist/bin/sync-runner-watch-routes.d.ts +19 -2
- package/dist/bin/sync-runner-watch-routes.d.ts.map +1 -1
- package/dist/bin/sync-runner-watch-routes.js +40 -5
- package/dist/bin/sync-runner-watch-routes.js.map +1 -1
- package/dist/bin/sync-runner-watch-routes.test.js +47 -0
- package/dist/bin/sync-runner-watch-routes.test.js.map +1 -1
- package/dist/bin/sync-runner.d.ts +59 -5
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js +48 -4
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/bin/sync-runner.test.js +1553 -192
- package/dist/bin/sync-runner.test.js.map +1 -1
- package/dist/cli/onepass-pull-planner-regressions.test.d.ts +2 -0
- package/dist/cli/onepass-pull-planner-regressions.test.d.ts.map +1 -0
- package/dist/cli/onepass-pull-planner-regressions.test.js +300 -0
- package/dist/cli/onepass-pull-planner-regressions.test.js.map +1 -0
- package/dist/cli/onepass-pull-planner.test.d.ts +2 -0
- package/dist/cli/onepass-pull-planner.test.d.ts.map +1 -0
- package/dist/cli/onepass-pull-planner.test.js +266 -0
- package/dist/cli/onepass-pull-planner.test.js.map +1 -0
- package/dist/cli/push-scan-exclusions.test.js +4 -4
- package/dist/cli/push-scan-exclusions.test.js.map +1 -1
- package/dist/cli/share.d.ts +31 -1
- package/dist/cli/share.d.ts.map +1 -1
- package/dist/cli/share.js +143 -8
- package/dist/cli/share.js.map +1 -1
- package/dist/cli/share.test.js +350 -5
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/streaming-pull-planner.bench.test.d.ts +15 -0
- package/dist/cli/streaming-pull-planner.bench.test.d.ts.map +1 -0
- package/dist/cli/streaming-pull-planner.bench.test.js +273 -0
- package/dist/cli/streaming-pull-planner.bench.test.js.map +1 -0
- package/dist/cli/sync-scope.test.js +8 -0
- package/dist/cli/sync-scope.test.js.map +1 -1
- package/dist/cli/sync.d.ts +12 -0
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +297 -125
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +255 -2
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/journal-row-store.d.ts +40 -5
- package/dist/journal-row-store.d.ts.map +1 -1
- package/dist/journal-row-store.js +240 -21
- package/dist/journal-row-store.js.map +1 -1
- package/dist/journal-row-store.test.js +54 -0
- package/dist/journal-row-store.test.js.map +1 -1
- package/dist/journal-snapshot-v4.d.ts.map +1 -1
- package/dist/journal-snapshot-v4.js +11 -6
- package/dist/journal-snapshot-v4.js.map +1 -1
- package/dist/journal-store.test.js +324 -7
- package/dist/journal-store.test.js.map +1 -1
- package/dist/journal.d.ts +51 -16
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +303 -79
- package/dist/journal.js.map +1 -1
- package/dist/lib/exit-codes.d.ts +15 -0
- package/dist/lib/exit-codes.d.ts.map +1 -1
- package/dist/lib/exit-codes.js +15 -0
- package/dist/lib/exit-codes.js.map +1 -1
- package/dist/personal-vault.d.ts.map +1 -1
- package/dist/personal-vault.js +10 -3
- package/dist/personal-vault.js.map +1 -1
- package/dist/personal-vault.test.js +35 -0
- package/dist/personal-vault.test.js.map +1 -1
- package/dist/remote-pull.d.ts.map +1 -1
- package/dist/remote-pull.js +9 -2
- package/dist/remote-pull.js.map +1 -1
- package/dist/remote-pull.test.js +59 -2
- package/dist/remote-pull.test.js.map +1 -1
- package/dist/s3.d.ts +1 -0
- package/dist/s3.d.ts.map +1 -1
- package/dist/s3.js +20 -2
- package/dist/s3.js.map +1 -1
- package/dist/s3.list-cost.test.d.ts +2 -0
- package/dist/s3.list-cost.test.d.ts.map +1 -0
- package/dist/s3.list-cost.test.js +51 -0
- package/dist/s3.list-cost.test.js.map +1 -0
- package/dist/sync/area-ledger.d.ts +27 -3
- package/dist/sync/area-ledger.d.ts.map +1 -1
- package/dist/sync/area-ledger.js +149 -39
- package/dist/sync/area-ledger.js.map +1 -1
- package/dist/sync/area-ledger.test.js +192 -5
- package/dist/sync/area-ledger.test.js.map +1 -1
- package/dist/sync/parallel-sync-coordinator.test.js +29 -0
- package/dist/sync/parallel-sync-coordinator.test.js.map +1 -1
- package/dist/sync/realtime-telemetry.d.ts +1 -1
- package/dist/sync/realtime-telemetry.d.ts.map +1 -1
- package/dist/sync/realtime-telemetry.js +14 -6
- package/dist/sync/realtime-telemetry.js.map +1 -1
- package/dist/sync/realtime-telemetry.test.js +136 -16
- package/dist/sync/realtime-telemetry.test.js.map +1 -1
- package/dist/sync/remote-file-spool.d.ts +16 -0
- package/dist/sync/remote-file-spool.d.ts.map +1 -0
- package/dist/sync/remote-file-spool.js +91 -0
- package/dist/sync/remote-file-spool.js.map +1 -0
- package/dist/sync/remote-file-spool.test.d.ts +2 -0
- package/dist/sync/remote-file-spool.test.d.ts.map +1 -0
- package/dist/sync/remote-file-spool.test.js +77 -0
- package/dist/sync/remote-file-spool.test.js.map +1 -0
- package/dist/sync/state-store.d.ts +6 -0
- package/dist/sync/state-store.d.ts.map +1 -1
- package/dist/sync/state-store.js +14 -2
- package/dist/sync/state-store.js.map +1 -1
- package/dist/watcher.d.ts +12 -0
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +131 -0
- package/dist/watcher.js.map +1 -1
- package/dist/watcher.test.js +63 -0
- package/dist/watcher.test.js.map +1 -1
- 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":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,4EAA4E;AAC5E,2EAA2E;AAC3E,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACrC,MAAM,MAAM,GAAG,MAAM,cAAc,EAAuB,CAAC;IAC3D,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,mCAAmC,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC;AAElC,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,IAAI,MAAc,CAAC;IAEnB,MAAM,EAAE,GAAG,CAAC,GAAW,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACnC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QAC9D,gCAAgC;QAChC,EAAE,CAAC,kBAAkB,CAAC,CAAC;QACvB,EAAE,CAAC,oBAAoB,CAAC,CAAC;QACzB,EAAE,CAAC,6BAA6B,CAAC,CAAC;QAClC,8DAA8D;QAC9D,EAAE,CAAC,wCAAwC,CAAC,CAAC;QAC7C,EAAE,CAAC,wCAAwC,CAAC,CAAC;QAC7C,EAAE,CAAC,yCAAyC,CAAC,CAAC;QAC9C,EAAE,CAAC,8BAA8B,CAAC,CAAC;QACnC,EAAE,CAAC,mCAAmC,CAAC,CAAC;QACxC,wDAAwD;QACxD,EAAE,CAAC,4CAA4C,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,GAAG,EAAE,CACvB,mCAAmC,CACjC,kBAAkB,CAAC,MAAM,CAAC,EAC1B,MAAM,EACN,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;IAEJ,EAAE,CAAC,qEAAqE,EAAE,
|
|
1
|
+
{"version":3,"file":"push-scan-exclusions.test.js","sourceRoot":"","sources":["../../src/cli/push-scan-exclusions.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/share.d.ts
CHANGED
|
@@ -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
|
package/dist/cli/share.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/cli/share.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AAwBhG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
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 =
|
|
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
|
-
|
|
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
|
|
3965
|
+
relativePath,
|
|
3831
3966
|
});
|
|
3832
3967
|
}
|
|
3833
3968
|
}
|