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 +184 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
}
|