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