billion-context 0.1.66 → 0.1.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/index.js CHANGED
@@ -61421,6 +61421,120 @@ function livePidHoldsOverlay(overlay) {
61421
61421
  }
61422
61422
  return pid;
61423
61423
  }
61424
+ function linkOverlayEntry(realHome, overlay, entry) {
61425
+ const target = path13.join(realHome, entry);
61426
+ const link = path13.join(overlay, entry);
61427
+ try {
61428
+ fs10.symlinkSync(target, link);
61429
+ return true;
61430
+ } catch (err2) {
61431
+ const code = err2.code;
61432
+ if (code !== "EPERM" && code !== "EACCES" && code !== "EINVAL") return false;
61433
+ }
61434
+ let st2;
61435
+ try {
61436
+ st2 = fs10.lstatSync(target);
61437
+ } catch {
61438
+ return false;
61439
+ }
61440
+ if (st2.isDirectory()) {
61441
+ try {
61442
+ fs10.symlinkSync(target, link, "junction");
61443
+ return true;
61444
+ } catch {
61445
+ return false;
61446
+ }
61447
+ }
61448
+ try {
61449
+ fs10.linkSync(target, link);
61450
+ return true;
61451
+ } catch {
61452
+ try {
61453
+ fs10.copyFileSync(target, link);
61454
+ return true;
61455
+ } catch {
61456
+ return false;
61457
+ }
61458
+ }
61459
+ }
61460
+ function isWriteThroughHardlink(overlayPath, realPath, st2) {
61461
+ if (st2.isDirectory() || st2.isSymbolicLink() || st2.nlink <= 1) return false;
61462
+ try {
61463
+ const realSt = fs10.lstatSync(realPath);
61464
+ return st2.dev === realSt.dev && st2.ino === realSt.ino;
61465
+ } catch {
61466
+ return false;
61467
+ }
61468
+ }
61469
+ function sqliteSetMembers(base) {
61470
+ return [base, `${base}-wal`, `${base}-shm`];
61471
+ }
61472
+ function mergeSqliteSet(overlay, realHome, base) {
61473
+ const members = sqliteSetMembers(base).filter((m2) => {
61474
+ try {
61475
+ return fs10.lstatSync(path13.join(overlay, m2)).isFile();
61476
+ } catch {
61477
+ return false;
61478
+ }
61479
+ });
61480
+ if (members.length === 0) return true;
61481
+ const undo = [];
61482
+ const rollback = () => {
61483
+ for (const step of undo.reverse()) {
61484
+ try {
61485
+ step();
61486
+ } catch {
61487
+ }
61488
+ }
61489
+ undo.length = 0;
61490
+ };
61491
+ try {
61492
+ for (const m2 of members) {
61493
+ const src = path13.join(overlay, m2);
61494
+ const dst = path13.join(realHome, m2);
61495
+ let dstStat;
61496
+ try {
61497
+ dstStat = fs10.lstatSync(dst);
61498
+ } catch {
61499
+ }
61500
+ if (dstStat && dstStat.isDirectory()) {
61501
+ rollback();
61502
+ return false;
61503
+ }
61504
+ const srcStat = fs10.lstatSync(src);
61505
+ if (dstStat && dstStat.mtimeMs >= srcStat.mtimeMs) {
61506
+ try {
61507
+ fs10.renameSync(src, `${dst}.bili-conflict`);
61508
+ } catch {
61509
+ rollback();
61510
+ return false;
61511
+ }
61512
+ undo.push(() => fs10.renameSync(`${dst}.bili-conflict`, src));
61513
+ continue;
61514
+ }
61515
+ if (dstStat) {
61516
+ try {
61517
+ fs10.renameSync(dst, `${dst}.bili-conflict`);
61518
+ } catch {
61519
+ rollback();
61520
+ return false;
61521
+ }
61522
+ undo.push(() => fs10.renameSync(`${dst}.bili-conflict`, dst));
61523
+ }
61524
+ try {
61525
+ fs10.renameSync(src, dst);
61526
+ } catch {
61527
+ rollback();
61528
+ return false;
61529
+ }
61530
+ undo.push(() => fs10.renameSync(dst, src));
61531
+ }
61532
+ return true;
61533
+ } catch {
61534
+ rollback();
61535
+ return false;
61536
+ }
61537
+ }
61424
61538
  function refreshOverlayHome(realHome, overlay, generatedFile) {
61425
61539
  try {
61426
61540
  fs10.mkdirSync(overlay, { recursive: true });
@@ -61444,7 +61558,32 @@ function refreshOverlayHome(realHome, overlay, generatedFile) {
61444
61558
  } catch {
61445
61559
  }
61446
61560
  try {
61447
- for (const entry of fs10.readdirSync(overlay)) {
61561
+ let overlayEntries;
61562
+ try {
61563
+ overlayEntries = fs10.readdirSync(overlay);
61564
+ } catch {
61565
+ overlayEntries = [];
61566
+ }
61567
+ const dbSets = [];
61568
+ for (const entry of overlayEntries) {
61569
+ if (!entry.endsWith(".db") || entry === generatedFile) continue;
61570
+ const members = sqliteSetMembers(entry);
61571
+ if (!members.some((m2) => m2 !== entry && overlayEntries.includes(m2))) continue;
61572
+ let mainSt;
61573
+ try {
61574
+ mainSt = fs10.lstatSync(path13.join(overlay, entry));
61575
+ } catch {
61576
+ }
61577
+ const keepSidecars = mainSt !== void 0 && isWriteThroughHardlink(path13.join(overlay, entry), path13.join(realHome, entry), mainSt);
61578
+ dbSets.push({ base: entry, keepSidecars });
61579
+ }
61580
+ const skipEntries = /* @__PURE__ */ new Set();
61581
+ for (const { base, keepSidecars } of dbSets) {
61582
+ for (const m2 of sqliteSetMembers(base)) {
61583
+ if (keepSidecars ? m2 !== base : true) skipEntries.add(m2);
61584
+ }
61585
+ }
61586
+ for (const entry of overlayEntries) {
61448
61587
  if (entry === generatedFile) continue;
61449
61588
  const overlayPath = path13.join(overlay, entry);
61450
61589
  if (entry.startsWith(`.${generatedFile}.`) && entry.endsWith(".tmp")) {
@@ -61454,6 +61593,7 @@ function refreshOverlayHome(realHome, overlay, generatedFile) {
61454
61593
  }
61455
61594
  continue;
61456
61595
  }
61596
+ if (skipEntries.has(entry)) continue;
61457
61597
  let st2;
61458
61598
  try {
61459
61599
  st2 = fs10.lstatSync(overlayPath);
@@ -61474,7 +61614,13 @@ function refreshOverlayHome(realHome, overlay, generatedFile) {
61474
61614
  }
61475
61615
  }
61476
61616
  } else if (realEntries.has(entry)) {
61477
- if (mergeOverlayEntry(overlayPath, path13.join(realHome, entry))) {
61617
+ const realPath = path13.join(realHome, entry);
61618
+ if (isWriteThroughHardlink(overlayPath, realPath, st2)) {
61619
+ try {
61620
+ fs10.unlinkSync(overlayPath);
61621
+ } catch {
61622
+ }
61623
+ } else if (mergeOverlayEntry(overlayPath, realPath)) {
61478
61624
  try {
61479
61625
  fs10.rmSync(overlayPath, { recursive: true, force: true });
61480
61626
  } catch {
@@ -61484,12 +61630,47 @@ function refreshOverlayHome(realHome, overlay, generatedFile) {
61484
61630
  }
61485
61631
  }
61486
61632
  }
61633
+ for (const { base, keepSidecars } of dbSets) {
61634
+ if (keepSidecars) continue;
61635
+ if (!mergeSqliteSet(overlay, realHome, base)) {
61636
+ console.error(
61637
+ `bili: could not merge the SQLite set ${base} / ${base}-wal / ${base}-shm into ${realHome} (the real db is likely open/locked) \u2014 kept in the overlay, retry on the next launch.`
61638
+ );
61639
+ }
61640
+ }
61641
+ let accessible = 0;
61642
+ let total = 0;
61643
+ const linkFailures = [];
61487
61644
  for (const entry of realEntries) {
61488
61645
  if (entry === generatedFile) continue;
61646
+ total += 1;
61647
+ const overlayPath = path13.join(overlay, entry);
61648
+ let present = false;
61489
61649
  try {
61490
- fs10.symlinkSync(path13.join(realHome, entry), path13.join(overlay, entry));
61650
+ fs10.lstatSync(overlayPath);
61651
+ present = true;
61491
61652
  } catch {
61492
61653
  }
61654
+ if (present) {
61655
+ accessible += 1;
61656
+ continue;
61657
+ }
61658
+ if (linkOverlayEntry(realHome, overlay, entry)) {
61659
+ accessible += 1;
61660
+ } else {
61661
+ linkFailures.push(entry);
61662
+ }
61663
+ }
61664
+ if (total > 0 && accessible === 0) {
61665
+ console.error(
61666
+ `bili: overlay ${overlay} is HOLLOW \u2014 none of ${total} real-home entries is reachable (on Windows, symlink creation is denied without Developer Mode and the junction/hardlink/copy fallbacks also failed). The client will start from its real home without the bili config rewrite.`
61667
+ );
61668
+ return false;
61669
+ }
61670
+ if (linkFailures.length > 0) {
61671
+ console.error(
61672
+ `bili: overlay ${overlay} \u2014 could not link ${linkFailures.length} entr${linkFailures.length === 1 ? "y" : "ies"}: ${linkFailures.join(", ")}. The client may miss those (on Windows, enable Developer Mode for full symlink support).`
61673
+ );
61493
61674
  }
61494
61675
  } catch {
61495
61676
  }