chatlab-cli 0.24.0 → 0.25.0

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 (68) hide show
  1. package/README.md +5 -2
  2. package/dist/{chunk-XJJXSOLO.mjs → chunk-4OMV4VNH.mjs} +738 -137
  3. package/dist/chunk-4OMV4VNH.mjs.map +1 -0
  4. package/dist/{chunk-A6JCL4PT.mjs → chunk-CIBTUWAE.mjs} +24 -10
  5. package/dist/chunk-CIBTUWAE.mjs.map +1 -0
  6. package/dist/{chunk-KCBIBRHL.mjs → chunk-E65ABM3C.mjs} +168 -72
  7. package/dist/chunk-E65ABM3C.mjs.map +1 -0
  8. package/dist/{chunk-NE4A6PND.mjs → chunk-FSHVDWI2.mjs} +126 -64
  9. package/dist/chunk-FSHVDWI2.mjs.map +1 -0
  10. package/dist/{chunk-36W2HWQN.mjs → chunk-GNT5G74Z.mjs} +2 -2
  11. package/dist/{chunk-RLCFXTTS.mjs → chunk-TCPXAX3F.mjs} +2 -2
  12. package/dist/cli.mjs +2 -2
  13. package/dist/{http-OPQ352FZ.mjs → http-PMNZ42EN.mjs} +6 -6
  14. package/dist/{import-GZMDLK2E.mjs → import-OP7R4CYY.mjs} +4 -4
  15. package/dist/index.mjs +6 -6
  16. package/dist/{mcp-SHZ2CVXY.mjs → mcp-ABXNFUJO.mjs} +3 -3
  17. package/dist/{stream-import-RDDB3N7B.mjs → stream-import-L6RJHH4L.mjs} +3 -3
  18. package/dist/{update-checker-JG5K67O2.mjs → update-checker-JIBA7T4U.mjs} +24 -21
  19. package/dist/update-checker-JIBA7T4U.mjs.map +1 -0
  20. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BUwpIerl.js +161 -0
  21. package/dist-web/assets/{EChartWordcloud-VpNJDurs.js → EChartWordcloud-CzhfrEF_.js} +1 -1
  22. package/dist-web/assets/MessageExportModal-BAJKWX4y.js +1 -0
  23. package/dist-web/assets/{electron-BIWBW8k_.js → electron-CZt36wW5.js} +1 -1
  24. package/dist-web/assets/electron-CwERrTWp.js +1 -0
  25. package/dist-web/assets/{fetch-ChECfwh7.js → fetch-BxFAkm7O.js} +1 -1
  26. package/dist-web/assets/{fetch-DwPB8NOH.js → fetch-CgBIWyAo.js} +1 -1
  27. package/dist-web/assets/{fetch-BhsrPRzn.js → fetch-D4p9vj1A.js} +1 -1
  28. package/dist-web/assets/{fetch-CvaXKzA-.js → fetch-DD1EGRKV.js} +1 -1
  29. package/dist-web/assets/{fetch-BOevuRK_.js → fetch-DO8lty7_.js} +1 -1
  30. package/dist-web/assets/{fetch-CnyupWWc.js → fetch-DXfZysDf.js} +2 -2
  31. package/dist-web/assets/{fetch-DKD1bKt2.js → fetch-GMkMBzBS.js} +1 -1
  32. package/dist-web/assets/{fetch-D1_jL6PO.js → fetch-JzVEwamn.js} +1 -1
  33. package/dist-web/assets/{fetch-DFWZ48Xw.js → fetch-qoGEVjNg.js} +1 -1
  34. package/dist-web/assets/{fetch-ClDGP9DK.js → fetch-yWwp067l.js} +1 -1
  35. package/dist-web/assets/{index-BVQsKKwg.js → index-BrS_VrIY.js} +1 -1
  36. package/dist-web/assets/index-C1t-kzfo.css +1 -0
  37. package/dist-web/assets/index-Cvlw0RLu.js +2 -0
  38. package/dist-web/assets/index-DABpUm3J.js +9 -0
  39. package/dist-web/assets/{index-D6ga3hbF.js → index-DvWI6Yqa.js} +4 -4
  40. package/dist-web/assets/{index-Bzg8BftZ.js → index-O0PG26_v.js} +1 -1
  41. package/dist-web/assets/index-OsjX5hXw.js +173 -0
  42. package/dist-web/assets/vendor-echarts-CITQeskI.js +11 -0
  43. package/dist-web/assets/{vendor-echarts-wordcloud-CZ9gsX8l.js → vendor-echarts-wordcloud-B1kQMklB.js} +1 -1
  44. package/dist-web/assets/{vendor-nuxt-ui-BLMzqeB8.js → vendor-nuxt-ui-C_8CsH6e.js} +2 -2
  45. package/dist-web/assets/{vendor-reka-ui-CnB0mMNX.js → vendor-reka-ui-CIMXwvEp.js} +1 -1
  46. package/dist-web/assets/{web-DtlveK3q.js → web-4rtrAcLu.js} +1 -1
  47. package/dist-web/index.html +4 -4
  48. package/package.json +1 -1
  49. package/dist/chunk-A6JCL4PT.mjs.map +0 -1
  50. package/dist/chunk-KCBIBRHL.mjs.map +0 -1
  51. package/dist/chunk-NE4A6PND.mjs.map +0 -1
  52. package/dist/chunk-XJJXSOLO.mjs.map +0 -1
  53. package/dist/update-checker-JG5K67O2.mjs.map +0 -1
  54. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-_gbTn1ha.js +0 -161
  55. package/dist-web/assets/MessageExportModal-n4JgNg_F.js +0 -1
  56. package/dist-web/assets/electron-Bt9dK4Sr.js +0 -1
  57. package/dist-web/assets/index-BN79SJSr.js +0 -173
  58. package/dist-web/assets/index-C-5bP7_E.js +0 -2
  59. package/dist-web/assets/index-ESCx9pRR.js +0 -8
  60. package/dist-web/assets/index-JbR9Q-bb.css +0 -1
  61. package/dist-web/assets/model-catalog-DUuKjIVU.js +0 -1
  62. package/dist-web/assets/vendor-echarts-C5u62NnM.js +0 -11
  63. /package/dist/{chunk-36W2HWQN.mjs.map → chunk-GNT5G74Z.mjs.map} +0 -0
  64. /package/dist/{chunk-RLCFXTTS.mjs.map → chunk-TCPXAX3F.mjs.map} +0 -0
  65. /package/dist/{http-OPQ352FZ.mjs.map → http-PMNZ42EN.mjs.map} +0 -0
  66. /package/dist/{import-GZMDLK2E.mjs.map → import-OP7R4CYY.mjs.map} +0 -0
  67. /package/dist/{mcp-SHZ2CVXY.mjs.map → mcp-ABXNFUJO.mjs.map} +0 -0
  68. /package/dist/{stream-import-RDDB3N7B.mjs.map → stream-import-L6RJHH4L.mjs.map} +0 -0
@@ -13,7 +13,7 @@ import {
13
13
  incrementalImport,
14
14
  openBetterSqliteDatabase,
15
15
  streamingImport
16
- } from "./chunk-XJJXSOLO.mjs";
16
+ } from "./chunk-4OMV4VNH.mjs";
17
17
 
18
18
  // src/import/stream-import.ts
19
19
  import * as fs from "fs";
@@ -141,4 +141,4 @@ export {
141
141
  analyzeIncrementalImport2 as analyzeIncrementalImport,
142
142
  analyzeNewImport2 as analyzeNewImport
143
143
  };
144
- //# sourceMappingURL=chunk-36W2HWQN.mjs.map
144
+ //# sourceMappingURL=chunk-GNT5G74Z.mjs.map
@@ -11,7 +11,7 @@ import {
11
11
  generateMessageKey,
12
12
  openBetterSqliteDatabase,
13
13
  writeParseResultToDb
14
- } from "./chunk-XJJXSOLO.mjs";
14
+ } from "./chunk-4OMV4VNH.mjs";
15
15
 
16
16
  // src/import/chatlab-reader.ts
17
17
  import * as fs from "fs";
@@ -392,4 +392,4 @@ export {
392
392
  parseFile,
393
393
  importData
394
394
  };
395
- //# sourceMappingURL=chunk-RLCFXTTS.mjs.map
395
+ //# sourceMappingURL=chunk-TCPXAX3F.mjs.map
package/dist/cli.mjs CHANGED
@@ -6,9 +6,9 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  run
9
- } from "./chunk-A6JCL4PT.mjs";
9
+ } from "./chunk-CIBTUWAE.mjs";
10
10
  import "./chunk-5ADKYYNA.mjs";
11
- import "./chunk-XJJXSOLO.mjs";
11
+ import "./chunk-4OMV4VNH.mjs";
12
12
  import "./chunk-FJ35V3TE.mjs";
13
13
  import "./chunk-VSOWNKPA.mjs";
14
14
  export {
@@ -9,12 +9,12 @@ import {
9
9
  registerWebRoutes,
10
10
  startHttpServer,
11
11
  stopHttpServer
12
- } from "./chunk-NE4A6PND.mjs";
13
- import "./chunk-RLCFXTTS.mjs";
14
- import "./chunk-36W2HWQN.mjs";
15
- import "./chunk-KCBIBRHL.mjs";
12
+ } from "./chunk-FSHVDWI2.mjs";
13
+ import "./chunk-TCPXAX3F.mjs";
14
+ import "./chunk-GNT5G74Z.mjs";
15
+ import "./chunk-E65ABM3C.mjs";
16
16
  import "./chunk-5ADKYYNA.mjs";
17
- import "./chunk-XJJXSOLO.mjs";
17
+ import "./chunk-4OMV4VNH.mjs";
18
18
  import "./chunk-FJ35V3TE.mjs";
19
19
  import "./chunk-VSOWNKPA.mjs";
20
20
  export {
@@ -23,4 +23,4 @@ export {
23
23
  startHttpServer,
24
24
  stopHttpServer
25
25
  };
26
- //# sourceMappingURL=http-OPQ352FZ.mjs.map
26
+ //# sourceMappingURL=http-PMNZ42EN.mjs.map
@@ -8,13 +8,13 @@ import {
8
8
  detectFormat as detectFormat2,
9
9
  importData,
10
10
  parseFile
11
- } from "./chunk-RLCFXTTS.mjs";
11
+ } from "./chunk-TCPXAX3F.mjs";
12
12
  import {
13
13
  analyzeIncrementalImport,
14
14
  analyzeNewImport,
15
15
  incrementalImport,
16
16
  streamImport
17
- } from "./chunk-36W2HWQN.mjs";
17
+ } from "./chunk-GNT5G74Z.mjs";
18
18
  import {
19
19
  detectAllFormats,
20
20
  detectFormat,
@@ -22,7 +22,7 @@ import {
22
22
  getFormatFeatureById,
23
23
  getSupportedFormats,
24
24
  scanMultiChatFile
25
- } from "./chunk-XJJXSOLO.mjs";
25
+ } from "./chunk-4OMV4VNH.mjs";
26
26
  import "./chunk-VSOWNKPA.mjs";
27
27
  export {
28
28
  analyzeIncrementalImport,
@@ -39,4 +39,4 @@ export {
39
39
  scanMultiChatFile,
40
40
  streamImport
41
41
  };
42
- //# sourceMappingURL=import-GZMDLK2E.mjs.map
42
+ //# sourceMappingURL=import-OP7R4CYY.mjs.map
package/dist/index.mjs CHANGED
@@ -6,16 +6,16 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  run
9
- } from "./chunk-A6JCL4PT.mjs";
9
+ } from "./chunk-CIBTUWAE.mjs";
10
10
  import {
11
11
  startHttpServer,
12
12
  stopHttpServer
13
- } from "./chunk-NE4A6PND.mjs";
14
- import "./chunk-RLCFXTTS.mjs";
15
- import "./chunk-36W2HWQN.mjs";
16
- import "./chunk-KCBIBRHL.mjs";
13
+ } from "./chunk-FSHVDWI2.mjs";
14
+ import "./chunk-TCPXAX3F.mjs";
15
+ import "./chunk-GNT5G74Z.mjs";
16
+ import "./chunk-E65ABM3C.mjs";
17
17
  import "./chunk-5ADKYYNA.mjs";
18
- import "./chunk-XJJXSOLO.mjs";
18
+ import "./chunk-4OMV4VNH.mjs";
19
19
  import "./chunk-FJ35V3TE.mjs";
20
20
  import "./chunk-VSOWNKPA.mjs";
21
21
  export {
@@ -7,7 +7,7 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  CoreDataProvider,
9
9
  MCP_TOOL_REGISTRY
10
- } from "./chunk-KCBIBRHL.mjs";
10
+ } from "./chunk-E65ABM3C.mjs";
11
11
  import {
12
12
  getVersion
13
13
  } from "./chunk-5ADKYYNA.mjs";
@@ -20,7 +20,7 @@ import {
20
20
  hasPendingElectronDataWarning,
21
21
  loadConfig,
22
22
  verifyCliDataPath
23
- } from "./chunk-XJJXSOLO.mjs";
23
+ } from "./chunk-4OMV4VNH.mjs";
24
24
  import {
25
25
  resolveCliPath
26
26
  } from "./chunk-FJ35V3TE.mjs";
@@ -405,4 +405,4 @@ async function startCliMcpServer() {
405
405
  export {
406
406
  startCliMcpServer
407
407
  };
408
- //# sourceMappingURL=mcp-SHZ2CVXY.mjs.map
408
+ //# sourceMappingURL=mcp-ABXNFUJO.mjs.map
@@ -9,7 +9,7 @@ import {
9
9
  analyzeNewImport,
10
10
  incrementalImport,
11
11
  streamImport
12
- } from "./chunk-36W2HWQN.mjs";
12
+ } from "./chunk-GNT5G74Z.mjs";
13
13
  import {
14
14
  detectAllFormats,
15
15
  detectFormat,
@@ -17,7 +17,7 @@ import {
17
17
  getFormatFeatureById,
18
18
  getSupportedFormats,
19
19
  scanMultiChatFile
20
- } from "./chunk-XJJXSOLO.mjs";
20
+ } from "./chunk-4OMV4VNH.mjs";
21
21
  import "./chunk-VSOWNKPA.mjs";
22
22
  export {
23
23
  analyzeIncrementalImport,
@@ -31,4 +31,4 @@ export {
31
31
  scanMultiChatFile,
32
32
  streamImport
33
33
  };
34
- //# sourceMappingURL=stream-import-RDDB3N7B.mjs.map
34
+ //# sourceMappingURL=stream-import-L6RJHH4L.mjs.map
@@ -101,29 +101,31 @@ function promptUser(question, choices) {
101
101
  process.stdin.on("data", onData);
102
102
  });
103
103
  }
104
- function runNpmUpdate() {
104
+ function runNpmUpdateCommand(command, args, write) {
105
105
  return new Promise((resolve) => {
106
- const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
107
- process.stderr.write(`
108
- Running: npm install -g ${PACKAGE_NAME}@latest
109
-
110
- `);
111
- const child = execFile(
112
- npmCmd,
113
- ["install", "-g", `${PACKAGE_NAME}@latest`],
114
- { timeout: 12e4 },
115
- (err, _stdout, stderr) => {
116
- if (err) {
117
- resolve({ success: false, error: stderr || err.message });
118
- } else {
119
- resolve({ success: true });
120
- }
106
+ const child = execFile(command, args, { timeout: 12e4 }, (err, _stdout, stderr) => {
107
+ if (err) {
108
+ resolve({ success: false, error: stderr || err.message });
109
+ } else {
110
+ resolve({ success: true });
121
111
  }
122
- );
123
- child.stdout?.pipe(process.stderr);
124
- child.stderr?.pipe(process.stderr);
112
+ });
113
+ child.stdout?.on("data", (chunk) => write(String(chunk)));
114
+ child.stderr?.on("data", (chunk) => write(String(chunk)));
125
115
  });
126
116
  }
117
+ function performCliSelfUpdate(options = {}) {
118
+ const platformName = options.platform ?? process.platform;
119
+ const npmCmd = platformName === "win32" ? "npm.cmd" : "npm";
120
+ const args = ["install", "-g", `${PACKAGE_NAME}@latest`];
121
+ const write = options.write ?? ((text) => process.stderr.write(text));
122
+ const runCommand = options.runCommand ?? ((command, commandArgs) => runNpmUpdateCommand(command, commandArgs, write));
123
+ write(`
124
+ Running: ${npmCmd} ${args.join(" ")}
125
+
126
+ `);
127
+ return runCommand(npmCmd, args);
128
+ }
127
129
  function isDevEnvironment() {
128
130
  if (process.env.CHATLAB_SKIP_UPDATE_CHECK) return true;
129
131
  if (process.env.NODE_ENV === "development") return true;
@@ -164,7 +166,7 @@ async function checkForUpdatesInteractive() {
164
166
  "Skip until next version"
165
167
  ]);
166
168
  if (choice === 1) {
167
- const result = await runNpmUpdate();
169
+ const result = await performCliSelfUpdate();
168
170
  if (result.success) {
169
171
  process.stderr.write(
170
172
  ` \x1B[32m\u{1F389} Updated successfully! Please restart chatlab to use the new version.\x1B[0m
@@ -187,6 +189,7 @@ async function checkForUpdatesInteractive() {
187
189
  }
188
190
  export {
189
191
  checkForUpdatesInteractive,
192
+ performCliSelfUpdate,
190
193
  startPeriodicUpdateCheck
191
194
  };
192
- //# sourceMappingURL=update-checker-JG5K67O2.mjs.map
195
+ //# sourceMappingURL=update-checker-JIBA7T4U.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/update-checker.ts"],"sourcesContent":["/**\n * CLI startup update checker — npm registry version comparison\n * with interactive prompt (Codex-style).\n *\n * Caches check results to avoid hitting npm on every invocation.\n * Respects user \"skip until next version\" preference.\n */\n\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\nimport { execFile } from 'child_process'\nimport { getVersion } from './version'\n\nconst PACKAGE_NAME = 'chatlab-cli'\nconst CACHE_STALE_MS = 6 * 60 * 60 * 1000 // 6h — startup cache TTL\nconst PERIODIC_CHECK_MS = 24 * 60 * 60 * 1000 // 24h — long-running service interval\nconst CACHE_FILE = path.join(os.homedir(), '.chatlab', 'update-check.json')\n\ninterface UpdateCache {\n lastCheckTime: number\n latestVersion: string | null\n skippedVersion?: string\n}\n\nexport interface UpdateCommandResult {\n success: boolean\n error?: string\n}\n\nexport interface PerformCliSelfUpdateOptions {\n runCommand?: (command: string, args: string[]) => Promise<UpdateCommandResult>\n write?: (text: string) => void\n platform?: NodeJS.Platform\n}\n\nfunction readCache(): UpdateCache | null {\n try {\n if (fs.existsSync(CACHE_FILE)) {\n return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8'))\n }\n } catch {\n // corrupted cache\n }\n return null\n}\n\nfunction writeCache(cache: UpdateCache): void {\n try {\n const dir = path.dirname(CACHE_FILE)\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n fs.writeFileSync(CACHE_FILE, JSON.stringify(cache), 'utf-8')\n } catch {\n // non-critical\n }\n}\n\nfunction isNewerVersion(latest: string, current: string): boolean {\n const parse = (v: string) => {\n const [core, pre] = v.split('-', 2)\n const parts = core.split('.').map(Number)\n return { major: parts[0] || 0, minor: parts[1] || 0, patch: parts[2] || 0, pre }\n }\n const l = parse(latest)\n const c = parse(current)\n if (l.major !== c.major) return l.major > c.major\n if (l.minor !== c.minor) return l.minor > c.minor\n if (l.patch !== c.patch) return l.patch > c.patch\n // Design note: prerelease users are not prompted for prerelease-to-prerelease updates.\n // Only a stable release with the same core version should supersede a prerelease build.\n if (c.pre && !l.pre) return true\n return false\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const resp = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(8_000),\n })\n if (!resp.ok) return null\n const data = (await resp.json()) as { version?: string }\n return data.version || null\n } catch {\n return null\n }\n}\n\nfunction promptUser(question: string, choices: string[]): Promise<number> {\n return new Promise((resolve) => {\n process.stderr.write(`${question}\\n\\n`)\n choices.forEach((c, i) => {\n process.stderr.write(i === 0 ? `› ${i + 1}. ${c}\\n` : ` ${i + 1}. ${c}\\n`)\n })\n process.stderr.write('\\n')\n\n if (!process.stdin.isTTY || !process.stdin.setRawMode) {\n resolve(2)\n return\n }\n\n process.stdin.setRawMode(true)\n process.stdin.resume()\n\n const onData = (data: Buffer) => {\n const key = data.toString()\n if (key === '\\x03') {\n process.stdin.setRawMode!(false)\n process.stdin.pause()\n process.exit(0)\n }\n // Only accept single-digit keys matching a valid choice;\n // ignore arrow keys (\\x1b[A/B/C/D), Enter, and other non-digit input.\n if (key.length === 1) {\n const num = parseInt(key)\n if (num >= 1 && num <= choices.length) {\n process.stdin.removeListener('data', onData)\n process.stdin.setRawMode!(false)\n process.stdin.pause()\n process.stderr.write('\\n')\n resolve(num)\n }\n }\n }\n process.stdin.on('data', onData)\n })\n}\n\nfunction runNpmUpdateCommand(\n command: string,\n args: string[],\n write: (text: string) => void\n): Promise<UpdateCommandResult> {\n return new Promise((resolve) => {\n const child = execFile(command, args, { timeout: 120_000 }, (err, _stdout, stderr) => {\n if (err) {\n resolve({ success: false, error: stderr || err.message })\n } else {\n resolve({ success: true })\n }\n })\n child.stdout?.on('data', (chunk) => write(String(chunk)))\n child.stderr?.on('data', (chunk) => write(String(chunk)))\n })\n}\n\nexport function performCliSelfUpdate(options: PerformCliSelfUpdateOptions = {}): Promise<UpdateCommandResult> {\n const platformName = options.platform ?? process.platform\n const npmCmd = platformName === 'win32' ? 'npm.cmd' : 'npm'\n const args = ['install', '-g', `${PACKAGE_NAME}@latest`]\n const write = options.write ?? ((text) => process.stderr.write(text))\n const runCommand = options.runCommand ?? ((command, commandArgs) => runNpmUpdateCommand(command, commandArgs, write))\n\n write(`\\n Running: ${npmCmd} ${args.join(' ')}\\n\\n`)\n return runCommand(npmCmd, args)\n}\n\nfunction isDevEnvironment(): boolean {\n if (process.env.CHATLAB_SKIP_UPDATE_CHECK) return true\n if (process.env.NODE_ENV === 'development') return true\n const entryFile = process.argv[1] || ''\n return entryFile.endsWith('.ts') || entryFile.endsWith('.mts')\n}\n\n/**\n * Fire-and-forget: fetch latest version from npm and update local cache.\n * Runs in background so CLI startup is never blocked by network IO.\n */\nfunction refreshCacheInBackground(existingCache: UpdateCache | null): void {\n fetchLatestVersion()\n .then((latestVersion) => {\n writeCache({\n lastCheckTime: Date.now(),\n latestVersion,\n skippedVersion: existingCache?.skippedVersion,\n })\n })\n .catch(() => {})\n}\n\n/**\n * Start a periodic background cache refresh for long-running services.\n * Immediately refreshes once on startup, then every 24h thereafter.\n * The update prompt will appear on the *next* CLI startup.\n * The timer is unref'd so it won't prevent process exit.\n */\nexport function startPeriodicUpdateCheck(): void {\n if (isDevEnvironment()) return\n refreshCacheInBackground(readCache())\n const timer = setInterval(() => {\n refreshCacheInBackground(readCache())\n }, PERIODIC_CHECK_MS)\n timer.unref()\n}\n\n/**\n * Check for updates and prompt user interactively.\n *\n * Strategy (Codex-style):\n * - Read local cache synchronously (instant, no network).\n * - If cache is stale, kick off a background fetch for *next* run.\n * - Prompt is only shown when cache already contains a newer version.\n * - This means the first run after a new release sees no prompt;\n * the second run (with fresh cache) shows it — zero startup delay.\n */\nexport async function checkForUpdatesInteractive(): Promise<void> {\n if (!process.stdin.isTTY || process.env.CI || isDevEnvironment()) return\n\n const currentVersion = getVersion()\n const cache = readCache()\n\n // Kick off background refresh if cache is missing or stale\n if (!cache || Date.now() - cache.lastCheckTime >= CACHE_STALE_MS) {\n refreshCacheInBackground(cache)\n }\n\n // Prompt is based on cached data only — no network wait\n const latestVersion = cache?.latestVersion\n if (!latestVersion || !isNewerVersion(latestVersion, currentVersion)) return\n if (cache?.skippedVersion === latestVersion) return\n\n const choice = await promptUser(` ✨ Update available! ${currentVersion} → ${latestVersion}`, [\n `Update now (runs \\`npm install -g ${PACKAGE_NAME}\\`)`,\n 'Skip',\n 'Skip until next version',\n ])\n\n if (choice === 1) {\n const result = await performCliSelfUpdate()\n if (result.success) {\n process.stderr.write(\n ` \\x1b[32m🎉 Updated successfully! Please restart chatlab to use the new version.\\x1b[0m\\n\\n`\n )\n process.exit(0)\n } else {\n process.stderr.write(` ❌ Update failed: ${result.error}\\n\\n`)\n }\n } else if (choice === 3) {\n writeCache({\n lastCheckTime: Date.now(),\n latestVersion,\n skippedVersion: latestVersion,\n })\n }\n}\n"],"mappings":"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","names":[]}