@indigoai-us/hq-cloud 6.18.44-alpha.2 → 6.18.44-alpha.21

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.
@@ -10396,6 +10396,92 @@ describe("runRunnerWithLoop — U58 realtime scheduler guard", () => {
10396
10396
  });
10397
10397
  });
10398
10398
  describe("CooperativePassScheduler", () => {
10399
+ function heldCapYield() {
10400
+ let releaseSleep = () => { };
10401
+ const sleep = new Promise((resolve) => { releaseSleep = resolve; });
10402
+ let markSleepEntered = () => { };
10403
+ const sleepEntered = new Promise((resolve) => { markSleepEntered = resolve; });
10404
+ const caps = {
10405
+ beginChore: () => { },
10406
+ endChore: () => { },
10407
+ suspendForHandoff: () => { },
10408
+ resumeAfterHandoff: () => { },
10409
+ applyAtCheckpoint: async (handoff) => {
10410
+ markSleepEntered();
10411
+ await sleep;
10412
+ await handoff();
10413
+ },
10414
+ };
10415
+ return { caps, sleepEntered, releaseSleep: () => releaseSleep() };
10416
+ }
10417
+ it("reports a hand-off when realtime work starts during a cap throttle sleep", async () => {
10418
+ const yieldState = heldCapYield();
10419
+ const scheduler = new CooperativePassScheduler(() => 0, CHORE_STARVATION_CAP_MS, {
10420
+ caps: yieldState.caps,
10421
+ });
10422
+ let handedOff;
10423
+ const chore = scheduler.submit(async ({ checkpoint }) => {
10424
+ handedOff = await checkpoint();
10425
+ return 0;
10426
+ }, "chore");
10427
+ await yieldState.sleepEntered;
10428
+ let realtimeRan = false;
10429
+ await scheduler.submit(async () => {
10430
+ realtimeRan = true;
10431
+ return 0;
10432
+ }, "realtime", "slow", false, undefined, false, true);
10433
+ expect(realtimeRan).toBe(true);
10434
+ yieldState.releaseSleep();
10435
+ await chore;
10436
+ // The pull continuation overlays journal deltas only when checkpoint()
10437
+ // reports a hand-off, so work admitted during the sleep must count.
10438
+ expect(handedOff).toBe(true);
10439
+ });
10440
+ it("keeps one un-fenced backlog pass at a time across cap sleep slices", async () => {
10441
+ const yieldState = heldCapYield();
10442
+ const scheduler = new CooperativePassScheduler(() => 0, CHORE_STARVATION_CAP_MS, {
10443
+ caps: yieldState.caps,
10444
+ });
10445
+ const chore = scheduler.submit(async ({ checkpoint }) => {
10446
+ await checkpoint();
10447
+ return 0;
10448
+ }, "chore");
10449
+ await yieldState.sleepEntered;
10450
+ let releaseFirst = () => { };
10451
+ const firstGate = new Promise((resolve) => { releaseFirst = resolve; });
10452
+ let markFirstStarted = () => { };
10453
+ const firstStarted = new Promise((resolve) => { markFirstStarted = resolve; });
10454
+ let running = 0;
10455
+ let maxRunning = 0;
10456
+ let secondStarted = false;
10457
+ const first = scheduler.submit(async () => {
10458
+ running += 1;
10459
+ maxRunning = Math.max(maxRunning, running);
10460
+ markFirstStarted();
10461
+ await firstGate;
10462
+ running -= 1;
10463
+ return 0;
10464
+ }, "realtime");
10465
+ await firstStarted;
10466
+ const second = scheduler.submit(async () => {
10467
+ running += 1;
10468
+ maxRunning = Math.max(maxRunning, running);
10469
+ secondStarted = true;
10470
+ running -= 1;
10471
+ return 0;
10472
+ }, "realtime");
10473
+ // The next sleep slice re-enters the hand-off while the first un-fenced
10474
+ // pass still runs; it must not free that pass's reservation.
10475
+ yieldState.releaseSleep();
10476
+ for (let i = 0; i < 20; i++)
10477
+ await Promise.resolve();
10478
+ await new Promise((resolve) => setTimeout(resolve, 5));
10479
+ expect(secondStarted).toBe(false);
10480
+ releaseFirst();
10481
+ await Promise.all([first, second, chore]);
10482
+ expect(secondStarted).toBe(true);
10483
+ expect(maxRunning).toBe(1);
10484
+ });
10399
10485
  it("admits a second realtime watcher op during a full-pass transfer only when the HQ flag is on", async () => {
10400
10486
  let releaseTransfer = () => { };
10401
10487
  const transferGate = new Promise((resolve) => { releaseTransfer = resolve; });