chatlab-cli 0.26.3 → 0.27.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 (80) hide show
  1. package/README.md +10 -4
  2. package/dist/{chat-command-D37MMEJ7.mjs → chat-command-SKGPS3PG.mjs} +5 -5
  3. package/dist/{chunk-QMXNJRTT.mjs → chunk-3HOTLLFC.mjs} +112 -21
  4. package/dist/chunk-3HOTLLFC.mjs.map +1 -0
  5. package/dist/{chunk-VCN64OD6.mjs → chunk-6FXGC6HE.mjs} +2 -2
  6. package/dist/{chunk-GNGZHBKM.mjs → chunk-7LPVQR77.mjs} +42 -7
  7. package/dist/chunk-7LPVQR77.mjs.map +1 -0
  8. package/dist/{chunk-742TAKEP.mjs → chunk-FHLPXRDL.mjs} +2 -2
  9. package/dist/{chunk-VSOWNKPA.mjs → chunk-GFHSSCCR.mjs} +11 -1
  10. package/dist/{chunk-YPTJVTVJ.mjs → chunk-KCFVHVO4.mjs} +5102 -4217
  11. package/dist/chunk-KCFVHVO4.mjs.map +1 -0
  12. package/dist/{chunk-RMITK4IC.mjs → chunk-M6ABWESL.mjs} +466 -116
  13. package/dist/chunk-M6ABWESL.mjs.map +1 -0
  14. package/dist/{chunk-K5SGXTVJ.mjs → chunk-MJITS5CE.mjs} +16 -16
  15. package/dist/{chunk-D5MWER7N.mjs → chunk-UBJHT3BU.mjs} +2 -2
  16. package/dist/cli.mjs +4 -4
  17. package/dist/{http-6F6TYWCI.mjs → http-CPFUTIUB.mjs} +9 -9
  18. package/dist/{import-VYPOMSSA.mjs → import-UJXKIKYN.mjs} +5 -5
  19. package/dist/index.mjs +9 -9
  20. package/dist/{mcp-AR7L5FA3.mjs → mcp-SW4DTCWJ.mjs} +8 -8
  21. package/dist/onnxruntime_binding-6Q6HXASN.node +0 -0
  22. package/dist/onnxruntime_binding-EKZT2NRK.node +0 -0
  23. package/dist/onnxruntime_binding-P6S7V3CI.node +0 -0
  24. package/dist/onnxruntime_binding-PJNNIIUO.node +0 -0
  25. package/dist/onnxruntime_binding-UN6SPTQK.node +0 -0
  26. package/dist/{service-KZTHBDQ5.mjs → service-KGL3RAIA.mjs} +2 -2
  27. package/dist/{src-6S7JPKHX.mjs → src-M3MO3LEL.mjs} +11 -71
  28. package/dist/{stream-import-KZFC3XT2.mjs → stream-import-4VDJZHMY.mjs} +4 -4
  29. package/dist/transformers.node-PUMHAODN.mjs +42889 -0
  30. package/dist/transformers.node-PUMHAODN.mjs.map +1 -0
  31. package/dist/{update-checker-3N7HQEP2.mjs → update-checker-LGMTEKMT.mjs} +2 -2
  32. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-C8mwzxDa.js +110 -0
  33. package/dist-web/assets/{MessageExportModal-CF6yaor7.js → MessageExportModal-DCB-mzf2.js} +1 -1
  34. package/dist-web/assets/{electron-DKVw61Ww.js → electron-DDUv0ohD.js} +1 -1
  35. package/dist-web/assets/{fetch-BC8jyJ_U.js → fetch-B3gsbY_U.js} +1 -1
  36. package/dist-web/assets/{fetch-BvVfWR-P.js → fetch-B9Oy0bcD.js} +1 -1
  37. package/dist-web/assets/{fetch-D2jNBqs8.js → fetch-Bry8iJpq.js} +1 -1
  38. package/dist-web/assets/{fetch-CUw-PUYP.js → fetch-C1aC5Fd1.js} +1 -1
  39. package/dist-web/assets/{fetch-DqEMAea3.js → fetch-C69hj3wS.js} +1 -1
  40. package/dist-web/assets/{fetch-CpYSD089.js → fetch-Ck4rGxkO.js} +1 -1
  41. package/dist-web/assets/{fetch-CPeSfqsU.js → fetch-Ckang-F8.js} +1 -1
  42. package/dist-web/assets/{fetch-BQlEQsqi.js → fetch-CwHncc6x.js} +1 -1
  43. package/dist-web/assets/{fetch-BMdgfBVS.js → fetch-D8Ng59an.js} +1 -1
  44. package/dist-web/assets/{fetch-Bh6HC-IR.js → fetch-DOtBAxUS.js} +1 -1
  45. package/dist-web/assets/index-B40SKtW8.js +173 -0
  46. package/dist-web/assets/{index-DqybGdJH.css → index-BX3tqfLz.css} +1 -1
  47. package/dist-web/assets/{index-BHQnAj6l.js → index-Bd9j73nw.js} +1 -1
  48. package/dist-web/assets/index-BfFj8Evo.js +64 -0
  49. package/dist-web/assets/index-C16V6EoP.js +11 -0
  50. package/dist-web/assets/{index-Qh0XLt3R.js → index-D-J8dY7w.js} +1 -1
  51. package/dist-web/assets/index-I3SWZjnW.css +1 -0
  52. package/dist-web/assets/index-YmzTgkb2.css +1 -0
  53. package/dist-web/assets/index-zAi37ZQ4.js +2 -0
  54. package/dist-web/assets/{web-Bx2TiHDk.js → web-DKFeBb_F.js} +1 -1
  55. package/dist-web/index.html +2 -2
  56. package/package.json +1 -1
  57. package/dist/chunk-GNGZHBKM.mjs.map +0 -1
  58. package/dist/chunk-QMXNJRTT.mjs.map +0 -1
  59. package/dist/chunk-RMITK4IC.mjs.map +0 -1
  60. package/dist/chunk-YPTJVTVJ.mjs.map +0 -1
  61. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BTdqmm0y.js +0 -107
  62. package/dist-web/assets/index-BwzuCu5R.js +0 -2
  63. package/dist-web/assets/index-CG746E15.js +0 -64
  64. package/dist-web/assets/index-CXoQ_U22.js +0 -173
  65. package/dist-web/assets/index-HgIuP1Td.css +0 -1
  66. package/dist-web/assets/index-R82N2_0b.css +0 -1
  67. package/dist-web/assets/index-wPAmuQZY.js +0 -11
  68. /package/dist/{chat-command-D37MMEJ7.mjs.map → chat-command-SKGPS3PG.mjs.map} +0 -0
  69. /package/dist/{chunk-VCN64OD6.mjs.map → chunk-6FXGC6HE.mjs.map} +0 -0
  70. /package/dist/{chunk-742TAKEP.mjs.map → chunk-FHLPXRDL.mjs.map} +0 -0
  71. /package/dist/{chunk-VSOWNKPA.mjs.map → chunk-GFHSSCCR.mjs.map} +0 -0
  72. /package/dist/{chunk-K5SGXTVJ.mjs.map → chunk-MJITS5CE.mjs.map} +0 -0
  73. /package/dist/{chunk-D5MWER7N.mjs.map → chunk-UBJHT3BU.mjs.map} +0 -0
  74. /package/dist/{http-6F6TYWCI.mjs.map → http-CPFUTIUB.mjs.map} +0 -0
  75. /package/dist/{import-VYPOMSSA.mjs.map → import-UJXKIKYN.mjs.map} +0 -0
  76. /package/dist/{mcp-AR7L5FA3.mjs.map → mcp-SW4DTCWJ.mjs.map} +0 -0
  77. /package/dist/{service-KZTHBDQ5.mjs.map → service-KGL3RAIA.mjs.map} +0 -0
  78. /package/dist/{src-6S7JPKHX.mjs.map → src-M3MO3LEL.mjs.map} +0 -0
  79. /package/dist/{stream-import-KZFC3XT2.mjs.map → stream-import-4VDJZHMY.mjs.map} +0 -0
  80. /package/dist/{update-checker-3N7HQEP2.mjs.map → update-checker-LGMTEKMT.mjs.map} +0 -0
package/README.md CHANGED
@@ -14,7 +14,7 @@ English | [简体中文](./README.zh-CN.md)
14
14
 
15
15
  ChatLab is an open-source desktop app for understanding your social conversations. It combines a flexible SQL engine with AI agents so you can explore patterns, ask better questions, and extract insights from chat data, all on your own machine.
16
16
 
17
- Currently supported: **WhatsApp, LINE, WeChat, QQ, Discord, Instagram, and Telegram**. Coming next: **iMessage, Messenger, and KakaoTalk**.
17
+ Currently supported: **WhatsApp, LINE, QQ, Discord, Instagram, Telegram, and iMessage**. Coming next: **Messenger and KakaoTalk**.
18
18
 
19
19
  > New install? Start here: [Getting started](https://docs.chatlab.fun/usage/quick-start)
20
20
 
@@ -105,11 +105,17 @@ For complete contributor instructions, see the [Development Guide](https://docs.
105
105
  # Install dependencies
106
106
  pnpm install
107
107
 
108
- # Run desktop app in dev mode
108
+ # Start dev mode — prompts you to choose which app to launch
109
109
  pnpm dev
110
+ ```
111
+
112
+ Or launch a specific target directly:
110
113
 
111
- # Run CLI in dev mode (apps/cli)
112
- cd apps/cli && pnpm dev
114
+ ```bash
115
+ pnpm dev:desktop # Electron desktop app
116
+ pnpm dev:web # Web frontend + local server
117
+ pnpm dev:serve # CLI server only
118
+ pnpm docs:dev # Docs site
113
119
  ```
114
120
 
115
121
  If Electron encounters exceptions during startup, you can try using `electron-fix`:
@@ -6,10 +6,10 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  createCliRunAgentStream
9
- } from "./chunk-GNGZHBKM.mjs";
10
- import "./chunk-RMITK4IC.mjs";
11
- import "./chunk-YPTJVTVJ.mjs";
12
- import "./chunk-VSOWNKPA.mjs";
9
+ } from "./chunk-7LPVQR77.mjs";
10
+ import "./chunk-M6ABWESL.mjs";
11
+ import "./chunk-KCFVHVO4.mjs";
12
+ import "./chunk-GFHSSCCR.mjs";
13
13
 
14
14
  // src/ai/chat-command.ts
15
15
  import { createInterface } from "readline/promises";
@@ -301,4 +301,4 @@ export {
301
301
  runChatCommand,
302
302
  runChatTurn
303
303
  };
304
- //# sourceMappingURL=chat-command-D37MMEJ7.mjs.map
304
+ //# sourceMappingURL=chat-command-SKGPS3PG.mjs.map
@@ -4,34 +4,34 @@ import { fileURLToPath as __fileURLToPath } from 'url';
4
4
  const require = __createRequire(import.meta.url);
5
5
  const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
+ import {
8
+ closeServerAiLogger,
9
+ createCliRunAgentStream,
10
+ initServerAiLogger
11
+ } from "./chunk-7LPVQR77.mjs";
7
12
  import {
8
13
  importData,
9
14
  parseFile
10
- } from "./chunk-D5MWER7N.mjs";
15
+ } from "./chunk-UBJHT3BU.mjs";
11
16
  import {
12
17
  analyzeIncrementalImport,
13
18
  analyzeNewImport,
14
19
  incrementalImport,
15
20
  streamImport
16
- } from "./chunk-VCN64OD6.mjs";
21
+ } from "./chunk-6FXGC6HE.mjs";
22
+ import {
23
+ AGENT_TOOL_REGISTRY,
24
+ CoreDataProvider
25
+ } from "./chunk-M6ABWESL.mjs";
17
26
  import {
18
27
  assertCliDataDirCompatible
19
- } from "./chunk-742TAKEP.mjs";
28
+ } from "./chunk-FHLPXRDL.mjs";
20
29
  import {
21
30
  getVersion
22
31
  } from "./chunk-5ADKYYNA.mjs";
23
32
  import {
24
33
  resolveCliPath
25
34
  } from "./chunk-FJ35V3TE.mjs";
26
- import {
27
- closeServerAiLogger,
28
- createCliRunAgentStream,
29
- initServerAiLogger
30
- } from "./chunk-GNGZHBKM.mjs";
31
- import {
32
- AGENT_TOOL_REGISTRY,
33
- CoreDataProvider
34
- } from "./chunk-RMITK4IC.mjs";
35
35
  import {
36
36
  AIChatManager,
37
37
  ALL_MIGRATIONS,
@@ -60,6 +60,7 @@ import {
60
60
  createDatabaseManagerAdapter,
61
61
  createJiebaNlpProvider,
62
62
  createNodeDataDirSwitch,
63
+ createSemanticIndexService,
63
64
  deleteDict,
64
65
  detectAllFormats,
65
66
  detectFormat,
@@ -135,7 +136,7 @@ import {
135
136
  verifyCliDataPath,
136
137
  writeAuthProfile,
137
138
  writeConfigField
138
- } from "./chunk-YPTJVTVJ.mjs";
139
+ } from "./chunk-KCFVHVO4.mjs";
139
140
 
140
141
  // src/http/index.ts
141
142
  import * as fs11 from "fs";
@@ -1401,17 +1402,21 @@ function registerAiToolRoutes(server2, ctx) {
1401
1402
  if (!entry) {
1402
1403
  return reply.code(404).send({ success: false, error: `Tool not found: ${toolName}` });
1403
1404
  }
1404
- const db = ctx.dbManager.open(sessionId);
1405
- if (!db) {
1406
- return reply.code(404).send({ success: false, error: `Session not found: ${sessionId}` });
1407
- }
1408
1405
  const abortController = new AbortController();
1409
1406
  activeToolTests.set(testId, abortController);
1410
1407
  try {
1408
+ if (ctx.executeAiTool) {
1409
+ return await ctx.executeAiTool({ testId, toolName, params, sessionId, abortSignal: abortController.signal });
1410
+ }
1411
+ const db = ctx.dbManager.open(sessionId);
1412
+ if (!db) {
1413
+ return reply.code(404).send({ success: false, error: `Session not found: ${sessionId}` });
1414
+ }
1411
1415
  const execCtx = {
1412
1416
  sessionId,
1413
1417
  db,
1414
- dataProvider: new CoreDataProvider(db)
1418
+ dataProvider: new CoreDataProvider(db),
1419
+ abortSignal: abortController.signal
1415
1420
  };
1416
1421
  const startTime = Date.now();
1417
1422
  const result = await entry.handler(params, execCtx);
@@ -1612,6 +1617,60 @@ function registerAiSummaryRoutes(server2, ctx) {
1612
1617
  });
1613
1618
  }
1614
1619
 
1620
+ // ../../packages/http-routes/src/routes/web/ai-semantic-index.ts
1621
+ function registerSemanticIndexRoutes(server2, ctx) {
1622
+ const service = ctx.semanticIndexService;
1623
+ if (!service) return;
1624
+ server2.get("/_web/ai/semantic-index/config", async () => {
1625
+ return { config: service.getConfig(), apiKeySet: service.hasApiKey(), configured: service.isConfigured() };
1626
+ });
1627
+ server2.put(
1628
+ "/_web/ai/semantic-index/config",
1629
+ async (request) => {
1630
+ const config = service.setConfig(request.body.config, { apiKey: request.body.apiKey });
1631
+ return { config, apiKeySet: service.hasApiKey(), configured: service.isConfigured() };
1632
+ }
1633
+ );
1634
+ server2.get("/_web/ai/semantic-index/enabled", async () => {
1635
+ return { sessions: service.listEnabledStatuses() };
1636
+ });
1637
+ server2.get("/_web/ai/semantic-index/status", async (request) => {
1638
+ return { status: service.status(request.query.sessionId) };
1639
+ });
1640
+ server2.post("/_web/ai/semantic-index/status", async (request) => {
1641
+ return { sessions: service.statusForSessions(request.body.sessionIds ?? []) };
1642
+ });
1643
+ const sessionAction = (path12, action) => {
1644
+ server2.post(path12, async (request, reply) => {
1645
+ const { sessionId } = request.body;
1646
+ if (!sessionId) return reply.code(400).send({ error: "sessionId is required" });
1647
+ await action(sessionId);
1648
+ return { status: service.status(sessionId) };
1649
+ });
1650
+ };
1651
+ sessionAction("/_web/ai/semantic-index/enable", (id) => service.enable(id));
1652
+ sessionAction("/_web/ai/semantic-index/disable", (id) => service.disable(id));
1653
+ sessionAction("/_web/ai/semantic-index/build", (id) => service.build(id));
1654
+ sessionAction("/_web/ai/semantic-index/pause", (id) => service.pause(id));
1655
+ sessionAction("/_web/ai/semantic-index/cancel", (id) => service.cancel(id));
1656
+ sessionAction("/_web/ai/semantic-index/rebuild", (id) => service.rebuild(id));
1657
+ server2.post("/_web/ai/semantic-index/build-pending", async () => {
1658
+ service.buildAllPending();
1659
+ return { sessions: service.listEnabledStatuses() };
1660
+ });
1661
+ server2.post("/_web/ai/semantic-index/cleanup", async () => {
1662
+ return service.cleanupUnused();
1663
+ });
1664
+ server2.post(
1665
+ "/_web/ai/semantic-index/search",
1666
+ async (request, reply) => {
1667
+ const { sessionId, query, finalTopK } = request.body;
1668
+ if (!sessionId || !query) return reply.code(400).send({ error: "sessionId and query are required" });
1669
+ return service.search(sessionId, query, { finalTopK });
1670
+ }
1671
+ );
1672
+ }
1673
+
1615
1674
  // ../../packages/http-routes/src/routes/web/merge.ts
1616
1675
  import * as fs3 from "fs";
1617
1676
  import * as os from "os";
@@ -2068,6 +2127,7 @@ function registerSharedRoutes(server2, ctx, options) {
2068
2127
  registerAiToolRoutes(server2, resolvedCtx);
2069
2128
  registerAiChatRoutes(server2, resolvedCtx);
2070
2129
  registerAiSummaryRoutes(server2, resolvedCtx);
2130
+ registerSemanticIndexRoutes(server2, resolvedCtx);
2071
2131
  registerMergeRoutes(server2, resolvedCtx);
2072
2132
  registerCacheRoutes(server2, resolvedCtx);
2073
2133
  }
@@ -2532,6 +2592,7 @@ function registerWebRoutes(server2, dbManager2, options) {
2532
2592
  getSystemDir: () => path8.join(os3.homedir(), ".chatlab"),
2533
2593
  getUserDataDir: () => path8.join(os3.homedir(), ".chatlab", "data"),
2534
2594
  getDatabaseDir: () => path8.join(os3.homedir(), ".chatlab", "data", "databases"),
2595
+ getVectorDir: () => path8.join(os3.homedir(), ".chatlab", "data", "vector"),
2535
2596
  getAiDataDir: () => path8.join(os3.homedir(), ".chatlab", "ai"),
2536
2597
  getSettingsDir: () => path8.join(os3.homedir(), ".chatlab", "settings"),
2537
2598
  getCacheDir: () => path8.join(os3.homedir(), ".chatlab", "cache"),
@@ -2542,13 +2603,28 @@ function registerWebRoutes(server2, dbManager2, options) {
2542
2603
  const resolvedPathProvider = options?.pathProvider ?? fallbackPathProvider;
2543
2604
  const ai = options?.aiContext;
2544
2605
  const cliStreamImport = async (dm, filePath) => {
2545
- const { streamImport: streamImport2 } = await import("./stream-import-KZFC3XT2.mjs");
2606
+ const { streamImport: streamImport2 } = await import("./stream-import-4VDJZHMY.mjs");
2546
2607
  const result = await streamImport2(dm, filePath);
2547
2608
  if (!result.sessionId) throw new Error("Import succeeded but no sessionId returned");
2548
2609
  return { sessionId: result.sessionId };
2549
2610
  };
2550
2611
  const defaultUserDataDir = getDefaultNodeUserDataDir();
2551
2612
  const isCustom = path8.resolve(resolvedPathProvider.getUserDataDir()) !== path8.resolve(defaultUserDataDir);
2613
+ let semanticIndexService = options?.semanticIndexService;
2614
+ if (!semanticIndexService) {
2615
+ try {
2616
+ semanticIndexService = createSemanticIndexService({
2617
+ pathProvider: resolvedPathProvider,
2618
+ sessionAdapter: adapter,
2619
+ nativeBinding: options?.nativeBinding
2620
+ });
2621
+ semanticIndexService.recover();
2622
+ server2.addHook("onClose", async () => semanticIndexService?.close());
2623
+ } catch (err) {
2624
+ console.warn("[semantic-index] service unavailable:", err instanceof Error ? err.message : String(err));
2625
+ semanticIndexService = void 0;
2626
+ }
2627
+ }
2552
2628
  registerSharedRoutes(
2553
2629
  server2,
2554
2630
  {
@@ -2557,6 +2633,7 @@ function registerWebRoutes(server2, dbManager2, options) {
2557
2633
  pathProvider: resolvedPathProvider,
2558
2634
  getVersion,
2559
2635
  nativeBinding: options?.nativeBinding,
2636
+ semanticIndexService,
2560
2637
  openDirectory: openDirectoryPath,
2561
2638
  showInFolder: showPathInFolder,
2562
2639
  downloadsDir: resolvedPathProvider.getDownloadsDir(),
@@ -3666,9 +3743,23 @@ async function startHttpServer(options) {
3666
3743
  limits: { fileSize: 1024 * 1024 * 1024 }
3667
3744
  // 1GB
3668
3745
  });
3746
+ let semanticIndexService;
3747
+ try {
3748
+ semanticIndexService = createSemanticIndexService({
3749
+ pathProvider,
3750
+ sessionAdapter: createDatabaseManagerAdapter(dbManager),
3751
+ nativeBinding
3752
+ });
3753
+ semanticIndexService.recover();
3754
+ server.addHook("onClose", async () => semanticIndexService?.close());
3755
+ } catch (err) {
3756
+ console.warn("[semantic-index] service unavailable:", err instanceof Error ? err.message : String(err));
3757
+ semanticIndexService = void 0;
3758
+ }
3669
3759
  registerWebRoutes(server, dbManager, {
3670
3760
  pathProvider,
3671
3761
  nativeBinding,
3762
+ semanticIndexService,
3672
3763
  aiContext: {
3673
3764
  aiDataDir,
3674
3765
  aiChatManager,
@@ -3677,7 +3768,7 @@ async function startHttpServer(options) {
3677
3768
  llmConfigStore,
3678
3769
  customProviderStore: new CustomProviderStore(createFileConfigStorage(aiDataDir)),
3679
3770
  customModelStore: new CustomModelStore(createFileConfigStorage(aiDataDir)),
3680
- runAgentStream: createCliRunAgentStream(dbManager, aiChatManager)
3771
+ runAgentStream: createCliRunAgentStream(dbManager, aiChatManager, semanticIndexService)
3681
3772
  }
3682
3773
  });
3683
3774
  initSync(server, dbManager, pathProvider, { port, host, token });
@@ -3722,4 +3813,4 @@ export {
3722
3813
  startHttpServer,
3723
3814
  stopHttpServer
3724
3815
  };
3725
- //# sourceMappingURL=chunk-QMXNJRTT.mjs.map
3816
+ //# sourceMappingURL=chunk-3HOTLLFC.mjs.map