@prestyj/core 5.25.0 → 5.25.1

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.
@@ -222,7 +222,7 @@ async function refreshKimiToken(refreshToken) {
222
222
 
223
223
  // src/auth-storage.ts
224
224
  import fs4 from "fs/promises";
225
- import { readFileSync as readFileSync2 } from "fs";
225
+ import { readFileSync as readFileSync3 } from "fs";
226
226
  import crypto5 from "crypto";
227
227
 
228
228
  // src/oauth/anthropic.ts
@@ -248,6 +248,7 @@ async function generatePKCE() {
248
248
 
249
249
  // src/claude-code-version.ts
250
250
  import fs2 from "fs/promises";
251
+ import { mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "fs";
251
252
  import path3 from "path";
252
253
 
253
254
  // src/logger.ts
@@ -375,19 +376,41 @@ function closeLogger(opts) {
375
376
 
376
377
  // src/claude-code-version.ts
377
378
  var NPM_LATEST_URL = "https://registry.npmjs.org/@anthropic-ai/claude-code/latest";
378
- var CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
379
+ var CACHE_FRESH_MS = 60 * 60 * 1e3;
380
+ var CACHE_HARD_MS = 24 * 60 * 60 * 1e3;
379
381
  var FETCH_TIMEOUT_MS = 3e3;
380
- var FALLBACK_VERSION = "2.1.88";
382
+ var FALLBACK_VERSION = "2.1.280";
381
383
  var memoryCache = null;
382
384
  var inflight = null;
385
+ var backgroundRefresh = null;
386
+ var versionFloor = null;
383
387
  function cachePath() {
384
388
  return path3.join(getAppPaths().agentDir, "claude-code-version.json");
385
389
  }
390
+ function compareClaudeCodeVersions(a, b) {
391
+ const parse = (v) => v.split(".").map((part) => Number.parseInt(part, 10)).map((n) => Number.isFinite(n) ? n : 0);
392
+ const left = parse(a);
393
+ const right = parse(b);
394
+ for (let i = 0; i < Math.max(left.length, right.length); i += 1) {
395
+ const diff = (left[i] ?? 0) - (right[i] ?? 0);
396
+ if (diff !== 0) return diff;
397
+ }
398
+ return 0;
399
+ }
400
+ function applyFloor(version) {
401
+ if (!versionFloor) return version;
402
+ return compareClaudeCodeVersions(versionFloor, version) > 0 ? versionFloor : version;
403
+ }
386
404
  async function readDiskCache() {
387
405
  try {
388
406
  const raw = await fs2.readFile(cachePath(), "utf-8");
389
407
  const parsed = JSON.parse(raw);
390
408
  if (typeof parsed.version === "string" && typeof parsed.fetchedAt === "number") {
409
+ if (typeof parsed.minVersion === "string") {
410
+ if (!versionFloor || compareClaudeCodeVersions(parsed.minVersion, versionFloor) > 0) {
411
+ versionFloor = parsed.minVersion;
412
+ }
413
+ }
391
414
  return parsed;
392
415
  }
393
416
  return null;
@@ -398,7 +421,11 @@ async function readDiskCache() {
398
421
  async function writeDiskCache(data) {
399
422
  try {
400
423
  await fs2.mkdir(getAppPaths().agentDir, { recursive: true, mode: 448 });
401
- await fs2.writeFile(cachePath(), JSON.stringify(data), { mode: 384 });
424
+ await fs2.writeFile(
425
+ cachePath(),
426
+ JSON.stringify({ ...data, ...versionFloor ? { minVersion: versionFloor } : {} }),
427
+ { mode: 384 }
428
+ );
402
429
  } catch (err) {
403
430
  log(
404
431
  "WARN",
@@ -424,6 +451,19 @@ async function fetchLatest() {
424
451
  clearTimeout(timer);
425
452
  }
426
453
  }
454
+ function refreshInBackground() {
455
+ if (backgroundRefresh) return;
456
+ backgroundRefresh = (async () => {
457
+ const fetched = await fetchLatest();
458
+ if (fetched) {
459
+ await writeDiskCache({ version: fetched, fetchedAt: Date.now() });
460
+ memoryCache = { version: applyFloor(fetched), expiresAt: Date.now() + CACHE_FRESH_MS };
461
+ }
462
+ })().catch(() => {
463
+ }).finally(() => {
464
+ backgroundRefresh = null;
465
+ });
466
+ }
427
467
  async function getClaudeCodeVersion() {
428
468
  if (memoryCache && Date.now() < memoryCache.expiresAt) {
429
469
  return memoryCache.version;
@@ -431,18 +471,26 @@ async function getClaudeCodeVersion() {
431
471
  if (inflight) return inflight;
432
472
  inflight = (async () => {
433
473
  const disk = await readDiskCache();
434
- const diskFresh = disk && Date.now() - disk.fetchedAt < CACHE_TTL_MS;
435
- if (disk && diskFresh) {
436
- memoryCache = { version: disk.version, expiresAt: Date.now() + CACHE_TTL_MS };
437
- return disk.version;
474
+ const age = disk ? Date.now() - disk.fetchedAt : Infinity;
475
+ if (disk && age < CACHE_FRESH_MS) {
476
+ const version = applyFloor(disk.version);
477
+ memoryCache = { version, expiresAt: Date.now() + CACHE_FRESH_MS };
478
+ return version;
479
+ }
480
+ if (disk && age < CACHE_HARD_MS) {
481
+ const version = applyFloor(disk.version);
482
+ memoryCache = { version, expiresAt: Date.now() + 5 * 60 * 1e3 };
483
+ refreshInBackground();
484
+ return version;
438
485
  }
439
486
  const fetched = await fetchLatest();
440
487
  if (fetched) {
441
488
  await writeDiskCache({ version: fetched, fetchedAt: Date.now() });
442
- memoryCache = { version: fetched, expiresAt: Date.now() + CACHE_TTL_MS };
443
- return fetched;
489
+ const version = applyFloor(fetched);
490
+ memoryCache = { version, expiresAt: Date.now() + CACHE_FRESH_MS };
491
+ return version;
444
492
  }
445
- const resolved = disk?.version ?? FALLBACK_VERSION;
493
+ const resolved = applyFloor(disk?.version ?? FALLBACK_VERSION);
446
494
  memoryCache = { version: resolved, expiresAt: Date.now() + 5 * 60 * 1e3 };
447
495
  log(
448
496
  "WARN",
@@ -457,6 +505,44 @@ async function getClaudeCodeVersion() {
457
505
  inflight = null;
458
506
  }
459
507
  }
508
+ var REQUIRED_VERSION_PATTERN = /version\s+(\d+(?:\.\d+)+)\s+or\s+newer\s+is\s+required/i;
509
+ function recordRequiredClaudeCodeVersion(message) {
510
+ const required = REQUIRED_VERSION_PATTERN.exec(message ?? "")?.[1];
511
+ if (!required) return null;
512
+ if (versionFloor && compareClaudeCodeVersions(required, versionFloor) <= 0) return versionFloor;
513
+ versionFloor = required;
514
+ memoryCache = null;
515
+ log(
516
+ "WARN",
517
+ "claude-code-version",
518
+ `Provider requires Claude Code >= ${required}; pinning User-Agent floor`
519
+ );
520
+ try {
521
+ const dir = getAppPaths().agentDir;
522
+ mkdirSync2(dir, { recursive: true, mode: 448 });
523
+ let existing = {};
524
+ try {
525
+ existing = JSON.parse(readFileSync2(cachePath(), "utf-8"));
526
+ } catch {
527
+ }
528
+ writeFileSync2(
529
+ cachePath(),
530
+ JSON.stringify({
531
+ version: existing.version ?? required,
532
+ fetchedAt: existing.fetchedAt ?? 0,
533
+ minVersion: required
534
+ }),
535
+ { mode: 384 }
536
+ );
537
+ } catch (err) {
538
+ log(
539
+ "WARN",
540
+ "claude-code-version",
541
+ `Failed to persist required version: ${err instanceof Error ? err.message : String(err)}`
542
+ );
543
+ }
544
+ return required;
545
+ }
460
546
  async function getClaudeCliUserAgent() {
461
547
  const version = await getClaudeCodeVersion();
462
548
  return `claude-cli/${version} (external, cli)`;
@@ -1444,7 +1530,7 @@ function activeBaseUrlEntry(data, provider) {
1444
1530
  }
1445
1531
  function readStoredBaseUrlSync(authFile, provider) {
1446
1532
  try {
1447
- const data = JSON.parse(readFileSync2(authFile, "utf-8"));
1533
+ const data = JSON.parse(readFileSync3(authFile, "utf-8"));
1448
1534
  return activeBaseUrlEntry(data, provider)?.baseUrl;
1449
1535
  } catch {
1450
1536
  return void 0;
@@ -2613,7 +2699,9 @@ export {
2613
2699
  log,
2614
2700
  registerLogCleanup,
2615
2701
  closeLogger,
2702
+ compareClaudeCodeVersions,
2616
2703
  getClaudeCodeVersion,
2704
+ recordRequiredClaudeCodeVersion,
2617
2705
  getClaudeCliUserAgent,
2618
2706
  loginAnthropic,
2619
2707
  refreshAnthropicToken,
@@ -2657,4 +2745,4 @@ export {
2657
2745
  getSummaryModel,
2658
2746
  getFastModel
2659
2747
  };
2660
- //# sourceMappingURL=chunk-GDM5Q7SA.js.map
2748
+ //# sourceMappingURL=chunk-THUBQC6I.js.map