chatlab-cli 0.26.2 → 0.26.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 (70) hide show
  1. package/dist/{chat-command-BVIG2LCO.mjs → chat-command-D37MMEJ7.mjs} +4 -4
  2. package/dist/{chunk-6AOEMUCM.mjs → chunk-742TAKEP.mjs} +2 -2
  3. package/dist/{chunk-3XFHIQIW.mjs → chunk-D5MWER7N.mjs} +2 -2
  4. package/dist/{chunk-JFSTXSX2.mjs → chunk-GNGZHBKM.mjs} +3 -3
  5. package/dist/{chunk-GTXX72AQ.mjs → chunk-K5SGXTVJ.mjs} +13 -13
  6. package/dist/{chunk-GBQQJJKK.mjs → chunk-QMXNJRTT.mjs} +372 -173
  7. package/dist/chunk-QMXNJRTT.mjs.map +1 -0
  8. package/dist/{chunk-SCE4YL3M.mjs → chunk-RMITK4IC.mjs} +2 -2
  9. package/dist/{chunk-QKQRV7RV.mjs → chunk-VCN64OD6.mjs} +2 -2
  10. package/dist/{chunk-TMZC3SNX.mjs → chunk-YPTJVTVJ.mjs} +1037 -49
  11. package/dist/chunk-YPTJVTVJ.mjs.map +1 -0
  12. package/dist/cli.mjs +3 -3
  13. package/dist/{http-NLFLQDI7.mjs → http-6F6TYWCI.mjs} +8 -8
  14. package/dist/{import-ILK6MGYR.mjs → import-VYPOMSSA.mjs} +4 -4
  15. package/dist/index.mjs +8 -8
  16. package/dist/{mcp-FOLR5XJL.mjs → mcp-AR7L5FA3.mjs} +4 -4
  17. package/dist/{src-OQN3VE73.mjs → src-6S7JPKHX.mjs} +6 -2
  18. package/dist/{stream-import-F5QI2HTO.mjs → stream-import-KZFC3XT2.mjs} +3 -3
  19. package/dist/{update-checker-JIBA7T4U.mjs → update-checker-3N7HQEP2.mjs} +36 -12
  20. package/dist/update-checker-3N7HQEP2.mjs.map +1 -0
  21. package/dist-web/assets/{DebugToolsPanel-CrqULdXp.css → DebugToolsPanel-DzZmSzIU.css} +1 -1
  22. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BTdqmm0y.js +107 -0
  23. package/dist-web/assets/{MessageExportModal-ttP_JPqO.js → MessageExportModal-CF6yaor7.js} +1 -1
  24. package/dist-web/assets/{electron-BeJHY587.js → electron-DKVw61Ww.js} +1 -1
  25. package/dist-web/assets/{fetch-H4B1CK_T.js → fetch-BC8jyJ_U.js} +1 -1
  26. package/dist-web/assets/{fetch-4s20GRbb.js → fetch-BMdgfBVS.js} +1 -1
  27. package/dist-web/assets/fetch-BQlEQsqi.js +5 -0
  28. package/dist-web/assets/{fetch-DtXUkazy.js → fetch-Bh6HC-IR.js} +1 -1
  29. package/dist-web/assets/{fetch-DBJ7Xkjt.js → fetch-BvVfWR-P.js} +1 -1
  30. package/dist-web/assets/{fetch-DW8r_JmP.js → fetch-CPeSfqsU.js} +1 -1
  31. package/dist-web/assets/fetch-CUw-PUYP.js +1 -0
  32. package/dist-web/assets/{fetch-B7USXx9R.js → fetch-CpYSD089.js} +1 -1
  33. package/dist-web/assets/{fetch-rtQEc8Bu.js → fetch-D2jNBqs8.js} +1 -1
  34. package/dist-web/assets/{fetch-BETFYYe1.js → fetch-DqEMAea3.js} +1 -1
  35. package/dist-web/assets/{index-Dov-rTKE.js → index-BHQnAj6l.js} +1 -1
  36. package/dist-web/assets/{index-CsxrXMkt.js → index-BwzuCu5R.js} +2 -2
  37. package/dist-web/assets/index-CG746E15.js +64 -0
  38. package/dist-web/assets/index-CXoQ_U22.js +173 -0
  39. package/dist-web/assets/index-DqybGdJH.css +1 -0
  40. package/dist-web/assets/{index-CjnMyejM.css → index-HgIuP1Td.css} +1 -1
  41. package/dist-web/assets/{index-CYMTvtEI.js → index-Qh0XLt3R.js} +1 -1
  42. package/dist-web/assets/{index-Dtm2oajn.css → index-R82N2_0b.css} +1 -1
  43. package/dist-web/assets/index-wPAmuQZY.js +11 -0
  44. package/dist-web/assets/{web-1-WNRDnP.js → web-Bx2TiHDk.js} +1 -1
  45. package/dist-web/favicon.ico +0 -0
  46. package/dist-web/index.html +3 -3
  47. package/package.json +1 -1
  48. package/dist/chunk-GBQQJJKK.mjs.map +0 -1
  49. package/dist/chunk-TMZC3SNX.mjs.map +0 -1
  50. package/dist/update-checker-JIBA7T4U.mjs.map +0 -1
  51. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-D9mCNaYM.js +0 -182
  52. package/dist-web/assets/electron-Dbml-SPN.js +0 -1
  53. package/dist-web/assets/fetch-DcEBAz_3.js +0 -1
  54. package/dist-web/assets/fetch-DsCNr_M0.js +0 -1
  55. package/dist-web/assets/index-C2ts-hTr.js +0 -173
  56. package/dist-web/assets/index-DkownpUj.js +0 -163
  57. package/dist-web/assets/index-LCedyGl2.css +0 -1
  58. package/dist-web/assets/index-m7v4PP7r.js +0 -11
  59. /package/dist/{chat-command-BVIG2LCO.mjs.map → chat-command-D37MMEJ7.mjs.map} +0 -0
  60. /package/dist/{chunk-6AOEMUCM.mjs.map → chunk-742TAKEP.mjs.map} +0 -0
  61. /package/dist/{chunk-3XFHIQIW.mjs.map → chunk-D5MWER7N.mjs.map} +0 -0
  62. /package/dist/{chunk-JFSTXSX2.mjs.map → chunk-GNGZHBKM.mjs.map} +0 -0
  63. /package/dist/{chunk-GTXX72AQ.mjs.map → chunk-K5SGXTVJ.mjs.map} +0 -0
  64. /package/dist/{chunk-SCE4YL3M.mjs.map → chunk-RMITK4IC.mjs.map} +0 -0
  65. /package/dist/{chunk-QKQRV7RV.mjs.map → chunk-VCN64OD6.mjs.map} +0 -0
  66. /package/dist/{http-NLFLQDI7.mjs.map → http-6F6TYWCI.mjs.map} +0 -0
  67. /package/dist/{import-ILK6MGYR.mjs.map → import-VYPOMSSA.mjs.map} +0 -0
  68. /package/dist/{mcp-FOLR5XJL.mjs.map → mcp-AR7L5FA3.mjs.map} +0 -0
  69. /package/dist/{src-OQN3VE73.mjs.map → src-6S7JPKHX.mjs.map} +0 -0
  70. /package/dist/{stream-import-F5QI2HTO.mjs.map → stream-import-KZFC3XT2.mjs.map} +0 -0
package/dist/cli.mjs CHANGED
@@ -6,11 +6,11 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  run
9
- } from "./chunk-GTXX72AQ.mjs";
10
- import "./chunk-6AOEMUCM.mjs";
9
+ } from "./chunk-K5SGXTVJ.mjs";
10
+ import "./chunk-742TAKEP.mjs";
11
11
  import "./chunk-5ADKYYNA.mjs";
12
12
  import "./chunk-FJ35V3TE.mjs";
13
- import "./chunk-TMZC3SNX.mjs";
13
+ import "./chunk-YPTJVTVJ.mjs";
14
14
  import "./chunk-VSOWNKPA.mjs";
15
15
  export {
16
16
  run
@@ -9,15 +9,15 @@ import {
9
9
  registerWebRoutes,
10
10
  startHttpServer,
11
11
  stopHttpServer
12
- } from "./chunk-GBQQJJKK.mjs";
13
- import "./chunk-3XFHIQIW.mjs";
14
- import "./chunk-QKQRV7RV.mjs";
15
- import "./chunk-6AOEMUCM.mjs";
12
+ } from "./chunk-QMXNJRTT.mjs";
13
+ import "./chunk-D5MWER7N.mjs";
14
+ import "./chunk-VCN64OD6.mjs";
15
+ import "./chunk-742TAKEP.mjs";
16
16
  import "./chunk-5ADKYYNA.mjs";
17
17
  import "./chunk-FJ35V3TE.mjs";
18
- import "./chunk-JFSTXSX2.mjs";
19
- import "./chunk-SCE4YL3M.mjs";
20
- import "./chunk-TMZC3SNX.mjs";
18
+ import "./chunk-GNGZHBKM.mjs";
19
+ import "./chunk-RMITK4IC.mjs";
20
+ import "./chunk-YPTJVTVJ.mjs";
21
21
  import "./chunk-VSOWNKPA.mjs";
22
22
  export {
23
23
  createServer,
@@ -25,4 +25,4 @@ export {
25
25
  startHttpServer,
26
26
  stopHttpServer
27
27
  };
28
- //# sourceMappingURL=http-NLFLQDI7.mjs.map
28
+ //# sourceMappingURL=http-6F6TYWCI.mjs.map
@@ -8,13 +8,13 @@ import {
8
8
  detectFormat as detectFormat2,
9
9
  importData,
10
10
  parseFile
11
- } from "./chunk-3XFHIQIW.mjs";
11
+ } from "./chunk-D5MWER7N.mjs";
12
12
  import {
13
13
  analyzeIncrementalImport,
14
14
  analyzeNewImport,
15
15
  incrementalImport,
16
16
  streamImport
17
- } from "./chunk-QKQRV7RV.mjs";
17
+ } from "./chunk-VCN64OD6.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-TMZC3SNX.mjs";
25
+ } from "./chunk-YPTJVTVJ.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-ILK6MGYR.mjs.map
42
+ //# sourceMappingURL=import-VYPOMSSA.mjs.map
package/dist/index.mjs CHANGED
@@ -7,18 +7,18 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  startHttpServer,
9
9
  stopHttpServer
10
- } from "./chunk-GBQQJJKK.mjs";
10
+ } from "./chunk-QMXNJRTT.mjs";
11
11
  import {
12
12
  run
13
- } from "./chunk-GTXX72AQ.mjs";
14
- import "./chunk-3XFHIQIW.mjs";
15
- import "./chunk-QKQRV7RV.mjs";
16
- import "./chunk-6AOEMUCM.mjs";
13
+ } from "./chunk-K5SGXTVJ.mjs";
14
+ import "./chunk-D5MWER7N.mjs";
15
+ import "./chunk-VCN64OD6.mjs";
16
+ import "./chunk-742TAKEP.mjs";
17
17
  import "./chunk-5ADKYYNA.mjs";
18
18
  import "./chunk-FJ35V3TE.mjs";
19
- import "./chunk-JFSTXSX2.mjs";
20
- import "./chunk-SCE4YL3M.mjs";
21
- import "./chunk-TMZC3SNX.mjs";
19
+ import "./chunk-GNGZHBKM.mjs";
20
+ import "./chunk-RMITK4IC.mjs";
21
+ import "./chunk-YPTJVTVJ.mjs";
22
22
  import "./chunk-VSOWNKPA.mjs";
23
23
  export {
24
24
  run,
@@ -6,7 +6,7 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  assertCliDataDirCompatible
9
- } from "./chunk-6AOEMUCM.mjs";
9
+ } from "./chunk-742TAKEP.mjs";
10
10
  import {
11
11
  getVersion
12
12
  } from "./chunk-5ADKYYNA.mjs";
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  CoreDataProvider,
18
18
  MCP_TOOL_REGISTRY
19
- } from "./chunk-SCE4YL3M.mjs";
19
+ } from "./chunk-RMITK4IC.mjs";
20
20
  import {
21
21
  DatabaseManager,
22
22
  NodePathProvider,
@@ -26,7 +26,7 @@ import {
26
26
  hasPendingElectronDataWarning,
27
27
  loadConfig,
28
28
  verifyCliDataPath
29
- } from "./chunk-TMZC3SNX.mjs";
29
+ } from "./chunk-YPTJVTVJ.mjs";
30
30
  import "./chunk-VSOWNKPA.mjs";
31
31
 
32
32
  // src/mcp.ts
@@ -410,4 +410,4 @@ export {
410
410
  initMcpRuntime,
411
411
  startCliMcpServer
412
412
  };
413
- //# sourceMappingURL=mcp-FOLR5XJL.mjs.map
413
+ //# sourceMappingURL=mcp-AR7L5FA3.mjs.map
@@ -121,6 +121,7 @@ import {
121
121
  getChartPlannerCapabilityForMessage,
122
122
  getChatDbMigrations,
123
123
  getCurrentLogFile,
124
+ getDbFileVersion,
124
125
  getDefaultNodeUserDataDir,
125
126
  getDefaultRulesForLocale,
126
127
  getDictList,
@@ -129,6 +130,7 @@ import {
129
130
  getErrorCount,
130
131
  getJieba,
131
132
  getNlpDir,
133
+ getOrComputeAnalysisCache,
132
134
  getPendingNodeDataDirMigration,
133
135
  getPosTagDefinitions,
134
136
  getRuleGroupsForLocale,
@@ -218,7 +220,7 @@ import {
218
220
  wasElectronUsed,
219
221
  wrapWithChartSchemaGate,
220
222
  writeParseResultToDb
221
- } from "./chunk-TMZC3SNX.mjs";
223
+ } from "./chunk-YPTJVTVJ.mjs";
222
224
  import "./chunk-VSOWNKPA.mjs";
223
225
  export {
224
226
  AIChatManager,
@@ -338,6 +340,7 @@ export {
338
340
  getChartPlannerCapabilityForMessage,
339
341
  getChatDbMigrations,
340
342
  getCurrentLogFile,
343
+ getDbFileVersion,
341
344
  getDefaultNodeUserDataDir,
342
345
  getDefaultRulesForLocale,
343
346
  getDictList,
@@ -346,6 +349,7 @@ export {
346
349
  getErrorCount,
347
350
  getJieba,
348
351
  getNlpDir,
352
+ getOrComputeAnalysisCache,
349
353
  getPendingNodeDataDirMigration,
350
354
  getPosTagDefinitions,
351
355
  getRuleGroupsForLocale,
@@ -436,4 +440,4 @@ export {
436
440
  wrapWithChartSchemaGate,
437
441
  writeParseResultToDb
438
442
  };
439
- //# sourceMappingURL=src-OQN3VE73.mjs.map
443
+ //# sourceMappingURL=src-6S7JPKHX.mjs.map
@@ -9,7 +9,7 @@ import {
9
9
  analyzeNewImport,
10
10
  incrementalImport,
11
11
  streamImport
12
- } from "./chunk-QKQRV7RV.mjs";
12
+ } from "./chunk-VCN64OD6.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-TMZC3SNX.mjs";
20
+ } from "./chunk-YPTJVTVJ.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-F5QI2HTO.mjs.map
34
+ //# sourceMappingURL=stream-import-KZFC3XT2.mjs.map
@@ -65,34 +65,58 @@ async function fetchLatestVersion() {
65
65
  }
66
66
  function promptUser(question, choices) {
67
67
  return new Promise((resolve) => {
68
+ let selected = 0;
69
+ const render = () => {
70
+ if (rendered) process.stderr.write(`\x1B[${choices.length}A`);
71
+ choices.forEach((c, i) => {
72
+ process.stderr.write(`\x1B[2K${i === selected ? "\u203A " : " "}${i + 1}. ${c}
73
+ `);
74
+ });
75
+ };
68
76
  process.stderr.write(`${question}
69
77
 
70
78
  `);
71
- choices.forEach((c, i) => {
72
- process.stderr.write(i === 0 ? `\u203A ${i + 1}. ${c}
73
- ` : ` ${i + 1}. ${c}
74
- `);
75
- });
76
- process.stderr.write("\n");
77
79
  if (!process.stdin.isTTY || !process.stdin.setRawMode) {
78
80
  resolve(2);
79
81
  return;
80
82
  }
83
+ let rendered = false;
84
+ render();
85
+ rendered = true;
86
+ process.stderr.write("\n");
81
87
  process.stdin.setRawMode(true);
82
88
  process.stdin.resume();
89
+ const cleanup = () => {
90
+ process.stdin.removeListener("data", onData);
91
+ process.stdin.setRawMode(false);
92
+ process.stdin.pause();
93
+ };
83
94
  const onData = (data) => {
84
95
  const key = data.toString();
85
96
  if (key === "") {
86
- process.stdin.setRawMode(false);
87
- process.stdin.pause();
97
+ cleanup();
88
98
  process.exit(0);
89
99
  }
100
+ if (key === "\x1B[A" || key === "k") {
101
+ selected = (selected - 1 + choices.length) % choices.length;
102
+ render();
103
+ return;
104
+ }
105
+ if (key === "\x1B[B" || key === "j") {
106
+ selected = (selected + 1) % choices.length;
107
+ render();
108
+ return;
109
+ }
110
+ if (key === "\r" || key === "\n") {
111
+ cleanup();
112
+ process.stderr.write("\n");
113
+ resolve(selected + 1);
114
+ return;
115
+ }
90
116
  if (key.length === 1) {
91
117
  const num = parseInt(key);
92
118
  if (num >= 1 && num <= choices.length) {
93
- process.stdin.removeListener("data", onData);
94
- process.stdin.setRawMode(false);
95
- process.stdin.pause();
119
+ cleanup();
96
120
  process.stderr.write("\n");
97
121
  resolve(num);
98
122
  }
@@ -192,4 +216,4 @@ export {
192
216
  performCliSelfUpdate,
193
217
  startPeriodicUpdateCheck
194
218
  };
195
- //# sourceMappingURL=update-checker-JIBA7T4U.mjs.map
219
+ //# sourceMappingURL=update-checker-3N7HQEP2.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 let selected = 0\n\n const render = () => {\n // Move cursor up to rewrite choices (skip on first draw)\n if (rendered) process.stderr.write(`\\x1b[${choices.length}A`)\n choices.forEach((c, i) => {\n process.stderr.write(`\\x1b[2K${i === selected ? '› ' : ' '}${i + 1}. ${c}\\n`)\n })\n }\n\n process.stderr.write(`${question}\\n\\n`)\n\n if (!process.stdin.isTTY || !process.stdin.setRawMode) {\n resolve(2)\n return\n }\n\n let rendered = false\n render()\n rendered = true\n process.stderr.write('\\n')\n\n process.stdin.setRawMode(true)\n process.stdin.resume()\n\n const cleanup = () => {\n process.stdin.removeListener('data', onData)\n process.stdin.setRawMode!(false)\n process.stdin.pause()\n }\n\n const onData = (data: Buffer) => {\n const key = data.toString()\n if (key === '\\x03') {\n cleanup()\n process.exit(0)\n }\n // Arrow up / k\n if (key === '\\x1b[A' || key === 'k') {\n selected = (selected - 1 + choices.length) % choices.length\n render()\n return\n }\n // Arrow down / j\n if (key === '\\x1b[B' || key === 'j') {\n selected = (selected + 1) % choices.length\n render()\n return\n }\n // Enter — confirm current selection\n if (key === '\\r' || key === '\\n') {\n cleanup()\n process.stderr.write('\\n')\n resolve(selected + 1)\n return\n }\n // Digit key — direct choice\n if (key.length === 1) {\n const num = parseInt(key)\n if (num >= 1 && num <= choices.length) {\n cleanup()\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":[]}
@@ -1 +1 @@
1
- .writing-vertical[data-v-19a25590]{writing-mode:vertical-rl;text-orientation:mixed}.data-flow-bg[data-v-19a25590]{background:repeating-linear-gradient(0deg,transparent,transparent 20px,currentColor 20px,currentColor 21px);animation:dataFlow-19a25590 20s linear infinite}@keyframes dataFlow-19a25590{0%{transform:translateY(0)}to{transform:translateY(-100px)}}.mention-menu-enter-active[data-v-0262c6da],.mention-menu-leave-active[data-v-0262c6da]{transition:opacity .16s ease,transform .16s ease}.mention-menu-enter-from[data-v-0262c6da],.mention-menu-leave-to[data-v-0262c6da]{transform:translateY(8px);opacity:0}.slash-menu-enter-active[data-v-0853b251],.slash-menu-leave-active[data-v-0853b251]{transition:opacity .16s ease,transform .16s ease}.slash-menu-enter-from[data-v-0853b251],.slash-menu-leave-to[data-v-0853b251]{transform:translateY(8px);opacity:0}.custom-scrollbar[data-v-94ffe515]::-webkit-scrollbar{width:4px}.custom-scrollbar[data-v-94ffe515]::-webkit-scrollbar-track{background:transparent}.custom-scrollbar[data-v-94ffe515]::-webkit-scrollbar-thumb{border-radius:4px;background-color:#9ca3af4d}.dark .custom-scrollbar[data-v-94ffe515]::-webkit-scrollbar-thumb{background-color:#9ca3af26}.slide-fade-enter-active[data-v-33c0c9d6],.slide-fade-leave-active[data-v-33c0c9d6]{transition:all .3s ease-out}.slide-fade-enter-from[data-v-33c0c9d6],.slide-fade-leave-to[data-v-33c0c9d6]{transform:translate(20px);opacity:0}.slide-up-enter-active[data-v-33c0c9d6],.slide-up-leave-active[data-v-33c0c9d6]{transition:all .3s ease-out}.slide-up-enter-from[data-v-33c0c9d6],.slide-up-leave-to[data-v-33c0c9d6]{transform:translateY(10px);opacity:0}.fade-up-enter-active[data-v-33c0c9d6],.fade-up-leave-active[data-v-33c0c9d6]{transition:opacity .2s ease-out}.fade-up-enter-from[data-v-33c0c9d6],.fade-up-leave-to[data-v-33c0c9d6]{opacity:0}.fade-enter-active[data-v-0df46b7b],.fade-leave-active[data-v-0df46b7b]{transition:opacity .15s ease}.fade-enter-from[data-v-0df46b7b],.fade-leave-to[data-v-0df46b7b]{opacity:0}.fade-enter-active[data-v-d712cb76],.fade-leave-active[data-v-d712cb76]{transition:opacity .15s ease}.fade-enter-from[data-v-d712cb76],.fade-leave-to[data-v-d712cb76]{opacity:0}.titlebar-drag-cover[data-v-b3e18446]{position:absolute;left:0;right:0;z-index:30;top:calc(-1 * var(--titlebar-area-height));height:calc(var(--titlebar-area-height) + 1rem);-webkit-app-region:drag}.header-actions[data-v-b3e18446]{-webkit-app-region:drag}.header-actions[data-v-b3e18446] button,.header-actions[data-v-b3e18446] button *,.header-actions[data-v-b3e18446] a,.header-actions[data-v-b3e18446] a *,.header-actions[data-v-b3e18446] [role=button],.header-actions[data-v-b3e18446] [role=button] *{-webkit-app-region:no-drag}
1
+ .writing-vertical[data-v-19a25590]{writing-mode:vertical-rl;text-orientation:mixed}.data-flow-bg[data-v-19a25590]{background:repeating-linear-gradient(0deg,transparent,transparent 20px,currentColor 20px,currentColor 21px);animation:dataFlow-19a25590 20s linear infinite}@keyframes dataFlow-19a25590{0%{transform:translateY(0)}to{transform:translateY(-100px)}}.mention-menu-enter-active[data-v-0262c6da],.mention-menu-leave-active[data-v-0262c6da]{transition:opacity .16s ease,transform .16s ease}.mention-menu-enter-from[data-v-0262c6da],.mention-menu-leave-to[data-v-0262c6da]{transform:translateY(8px);opacity:0}.slash-menu-enter-active[data-v-0853b251],.slash-menu-leave-active[data-v-0853b251]{transition:opacity .16s ease,transform .16s ease}.slash-menu-enter-from[data-v-0853b251],.slash-menu-leave-to[data-v-0853b251]{transform:translateY(8px);opacity:0}.custom-scrollbar[data-v-94ffe515]::-webkit-scrollbar{width:4px}.custom-scrollbar[data-v-94ffe515]::-webkit-scrollbar-track{background:transparent}.custom-scrollbar[data-v-94ffe515]::-webkit-scrollbar-thumb{border-radius:4px;background-color:#9ca3af4d}.dark .custom-scrollbar[data-v-94ffe515]::-webkit-scrollbar-thumb{background-color:#9ca3af26}.slide-fade-enter-active[data-v-9798e70f],.slide-fade-leave-active[data-v-9798e70f]{transition:all .3s ease-out}.slide-fade-enter-from[data-v-9798e70f],.slide-fade-leave-to[data-v-9798e70f]{transform:translate(20px);opacity:0}.slide-up-enter-active[data-v-9798e70f],.slide-up-leave-active[data-v-9798e70f]{transition:all .3s ease-out}.slide-up-enter-from[data-v-9798e70f],.slide-up-leave-to[data-v-9798e70f]{transform:translateY(10px);opacity:0}.fade-up-enter-active[data-v-9798e70f],.fade-up-leave-active[data-v-9798e70f]{transition:opacity .2s ease-out}.fade-up-enter-from[data-v-9798e70f],.fade-up-leave-to[data-v-9798e70f]{opacity:0}.fade-enter-active[data-v-0df46b7b],.fade-leave-active[data-v-0df46b7b]{transition:opacity .15s ease}.fade-enter-from[data-v-0df46b7b],.fade-leave-to[data-v-0df46b7b]{opacity:0}.fade-enter-active[data-v-d712cb76],.fade-leave-active[data-v-d712cb76]{transition:opacity .15s ease}.fade-enter-from[data-v-d712cb76],.fade-leave-to[data-v-d712cb76]{opacity:0}.titlebar-drag-cover[data-v-b3e18446]{position:absolute;left:0;right:0;z-index:30;top:calc(-1 * var(--titlebar-area-height));height:calc(var(--titlebar-area-height) + 1rem);-webkit-app-region:drag}.header-actions[data-v-b3e18446]{-webkit-app-region:drag}.header-actions[data-v-b3e18446] button,.header-actions[data-v-b3e18446] button *,.header-actions[data-v-b3e18446] a,.header-actions[data-v-b3e18446] a *,.header-actions[data-v-b3e18446] [role=button],.header-actions[data-v-b3e18446] [role=button] *{-webkit-app-region:no-drag}