squeezr-ai 1.16.2 → 1.16.3

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.
Files changed (2) hide show
  1. package/bin/squeezr.js +51 -0
  2. package/package.json +1 -1
package/bin/squeezr.js CHANGED
@@ -16,6 +16,55 @@ const pkg = require(path.join(ROOT, 'package.json'))
16
16
  const args = process.argv.slice(2)
17
17
  const command = args[0]
18
18
 
19
+ // ── update check (non-blocking) ───────────────────────────────────────────────
20
+
21
+ const UPDATE_CHECK_FILE = path.join(os.homedir(), '.squeezr', 'update-check.json')
22
+ const UPDATE_CHECK_INTERVAL = 4 * 60 * 60 * 1000 // 4 hours
23
+
24
+ // Fire and forget — runs in background, never blocks CLI
25
+ const updateCheckPromise = (async () => {
26
+ try {
27
+ // Read cached check
28
+ let cached = null
29
+ try { cached = JSON.parse(fs.readFileSync(UPDATE_CHECK_FILE, 'utf-8')) } catch {}
30
+ if (cached && Date.now() - cached.checkedAt < UPDATE_CHECK_INTERVAL) {
31
+ return cached.latest !== pkg.version ? cached.latest : null
32
+ }
33
+ // Fetch latest from npm (with timeout)
34
+ const { get } = await import('https')
35
+ const latest = await new Promise((resolve, reject) => {
36
+ const req = get('https://registry.npmjs.org/squeezr-ai/latest', { timeout: 3000 }, res => {
37
+ let data = ''
38
+ res.on('data', chunk => { data += chunk })
39
+ res.on('end', () => {
40
+ try { resolve(JSON.parse(data).version) } catch { resolve(null) }
41
+ })
42
+ })
43
+ req.on('error', () => resolve(null))
44
+ req.setTimeout(3000, () => { req.destroy(); resolve(null) })
45
+ })
46
+ if (!latest) return null
47
+ // Cache result
48
+ const dir = path.dirname(UPDATE_CHECK_FILE)
49
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })
50
+ fs.writeFileSync(UPDATE_CHECK_FILE, JSON.stringify({ latest, checkedAt: Date.now() }))
51
+ return latest !== pkg.version ? latest : null
52
+ } catch { return null }
53
+ })()
54
+
55
+ async function showUpdateBanner() {
56
+ try {
57
+ const latest = await Promise.race([updateCheckPromise, new Promise(r => setTimeout(() => r(null), 500))])
58
+ if (latest) {
59
+ console.log('')
60
+ console.log(` ╭─────────────────────────────────────────────────────────╮`)
61
+ console.log(` │ Update available: v${pkg.version} → v${latest}${' '.repeat(Math.max(0, 30 - pkg.version.length - latest.length))}│`)
62
+ console.log(` │ Run: npm install -g squeezr-ai │`)
63
+ console.log(` ╰─────────────────────────────────────────────────────────╯`)
64
+ }
65
+ } catch {}
66
+ }
67
+
19
68
  function getPortFromToml() {
20
69
  try {
21
70
  const toml = fs.readFileSync(path.join(ROOT, 'squeezr.toml'), 'utf-8')
@@ -947,3 +996,5 @@ switch (command) {
947
996
  console.log(HELP)
948
997
  process.exit(1)
949
998
  }
999
+
1000
+ await showUpdateBanner()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "squeezr-ai",
3
- "version": "1.16.2",
3
+ "version": "1.16.3",
4
4
  "description": "AI proxy that compresses Claude Code, Codex, Aider, Gemini CLI and Ollama context windows to save thousands of tokens per session",
5
5
  "keywords": [
6
6
  "claude",