chatlab-cli 0.1.0 → 0.21.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.
Files changed (66) hide show
  1. package/dist/{chunk-YAOFJ73U.mjs → chunk-4GI2UPCS.mjs} +80 -129
  2. package/dist/chunk-4GI2UPCS.mjs.map +1 -0
  3. package/dist/{chunk-JMRDNHIR.mjs → chunk-7HQWGLX6.mjs} +829 -280
  4. package/dist/chunk-7HQWGLX6.mjs.map +1 -0
  5. package/dist/{chunk-DL3BFEAH.mjs → chunk-AIR7EAF4.mjs} +2 -2
  6. package/dist/chunk-AIR7EAF4.mjs.map +1 -0
  7. package/dist/{chunk-PF4QFHC6.mjs → chunk-LI4X52E7.mjs} +1050 -864
  8. package/dist/chunk-LI4X52E7.mjs.map +1 -0
  9. package/dist/{chunk-OC73KSMV.mjs → chunk-OQVKZTVD.mjs} +2 -2
  10. package/dist/{chunk-P4N5GEFF.mjs → chunk-OZWXLRJL.mjs} +9 -9
  11. package/dist/cli.mjs +2 -2
  12. package/dist/{http-PQEOFGJK.mjs → http-DHQI4G5J.mjs} +6 -6
  13. package/dist/{import-UR2IE2O7.mjs → import-CQWGIMZQ.mjs} +6 -4
  14. package/dist/index.mjs +6 -6
  15. package/dist/{mcp-4XCDZ5PU.mjs → mcp-7Q3FEI3Z.mjs} +5 -6
  16. package/dist/mcp-7Q3FEI3Z.mjs.map +1 -0
  17. package/dist/{src-ZELOFE7P.mjs → src-QBT5SYW5.mjs} +14 -2
  18. package/dist/{stream-import-RP3XB6NM.mjs → stream-import-VG7RP6KJ.mjs} +5 -3
  19. package/dist-web/assets/{DebugToolsPanel-dUV6pVqD.css → DebugToolsPanel-CoBtqb--.css} +1 -1
  20. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-CpFGhsl5.js +147 -0
  21. package/dist-web/assets/{EChartWordcloud-DcC12j9S.js → EChartWordcloud-BYLFxPAX.js} +1 -1
  22. package/dist-web/assets/{MessageExportModal-CUS9nnwi.js → MessageExportModal-DTgxz1eQ.js} +1 -1
  23. package/dist-web/assets/electron-2m4Vdk2z.js +1 -0
  24. package/dist-web/assets/electron-H65bUnhW.js +1 -0
  25. package/dist-web/assets/{fetch-DvfIZxuz.js → fetch-C2vUkdnA.js} +1 -1
  26. package/dist-web/assets/fetch-CTZXLLcn.js +1 -0
  27. package/dist-web/assets/fetch-o5NJ2uWE.js +3 -0
  28. package/dist-web/assets/index-B8867dX7.css +1 -0
  29. package/dist-web/assets/{index-CmU6x-uJ.css → index-BE64tUWq.css} +1 -1
  30. package/dist-web/assets/{index-D3siJhmm.js → index-C4B0hv6C.js} +4 -4
  31. package/dist-web/assets/index-CbQMfheg.css +1 -0
  32. package/dist-web/assets/index-DUXf21MT.js +173 -0
  33. package/dist-web/assets/index-DZiH2cC1.js +7 -0
  34. package/dist-web/assets/index-DeG0EHOT.js +24 -0
  35. package/dist-web/assets/index-DuhN8jAf.js +2 -0
  36. package/dist-web/assets/{vendor-echarts-BXkS9r5W.js → vendor-echarts-C13vDgZW.js} +5 -5
  37. package/dist-web/assets/{vendor-echarts-wordcloud-CmDVLUv0.js → vendor-echarts-wordcloud-uVdwYsYa.js} +1 -1
  38. package/dist-web/assets/{vendor-nuxt-ui-D1aReMtR.js → vendor-nuxt-ui-CYMNNdeD.js} +2 -2
  39. package/dist-web/assets/{vendor-zrender-B6SpLIkk.js → vendor-zrender-5DcYjSZk.js} +2 -2
  40. package/dist-web/assets/{web-DOZKbBMQ.js → web-DImo6Kjz.js} +1 -1
  41. package/dist-web/index.html +3 -3
  42. package/package.json +1 -8
  43. package/CHANGELOG.md +0 -51
  44. package/LICENSE +0 -661
  45. package/dist/chunk-DL3BFEAH.mjs.map +0 -1
  46. package/dist/chunk-JMRDNHIR.mjs.map +0 -1
  47. package/dist/chunk-PF4QFHC6.mjs.map +0 -1
  48. package/dist/chunk-YAOFJ73U.mjs.map +0 -1
  49. package/dist/mcp-4XCDZ5PU.mjs.map +0 -1
  50. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BuOhHrGp.js +0 -155
  51. package/dist-web/assets/electron-BHjOx6B6.js +0 -1
  52. package/dist-web/assets/electron-DvcSSc-D.js +0 -1
  53. package/dist-web/assets/fetch-CJ8Q4qM2.js +0 -1
  54. package/dist-web/assets/fetch-DgQkWW73.js +0 -3
  55. package/dist-web/assets/index-68UnLyFT.js +0 -173
  56. package/dist-web/assets/index-CCE1zef2.js +0 -2
  57. package/dist-web/assets/index-CLGv8Den.css +0 -1
  58. package/dist-web/assets/index-CUTe0Sc3.js +0 -16
  59. package/dist-web/assets/index-CzR1sElx.css +0 -1
  60. package/dist-web/assets/index-n2XUUgti.js +0 -7
  61. /package/dist/{chunk-OC73KSMV.mjs.map → chunk-OQVKZTVD.mjs.map} +0 -0
  62. /package/dist/{chunk-P4N5GEFF.mjs.map → chunk-OZWXLRJL.mjs.map} +0 -0
  63. /package/dist/{http-PQEOFGJK.mjs.map → http-DHQI4G5J.mjs.map} +0 -0
  64. /package/dist/{import-UR2IE2O7.mjs.map → import-CQWGIMZQ.mjs.map} +0 -0
  65. /package/dist/{src-ZELOFE7P.mjs.map → src-QBT5SYW5.mjs.map} +0 -0
  66. /package/dist/{stream-import-RP3XB6NM.mjs.map → stream-import-VG7RP6KJ.mjs.map} +0 -0
@@ -11,7 +11,7 @@ import {
11
11
  generateMessageKey,
12
12
  openBetterSqliteDatabase,
13
13
  writeParseResultToDb
14
- } from "./chunk-JMRDNHIR.mjs";
14
+ } from "./chunk-7HQWGLX6.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-OC73KSMV.mjs.map
395
+ //# sourceMappingURL=chunk-OQVKZTVD.mjs.map
@@ -21,7 +21,7 @@ import {
21
21
  loadConfig,
22
22
  searchMessagesLike,
23
23
  verifyCliDataPath
24
- } from "./chunk-JMRDNHIR.mjs";
24
+ } from "./chunk-7HQWGLX6.mjs";
25
25
 
26
26
  // src/cli.ts
27
27
  import * as fs from "fs";
@@ -168,7 +168,7 @@ program.command("import <file>").description("Import a chat history file (14+ fo
168
168
  console.error(`File not found: ${file}`);
169
169
  process.exit(1);
170
170
  }
171
- const { streamImport, detectFormat } = await import("./import-UR2IE2O7.mjs");
171
+ const { streamImport, detectFormat } = await import("./import-CQWGIMZQ.mjs");
172
172
  const { dbManager } = initRuntime();
173
173
  const nativeBinding = resolveNativeBinding();
174
174
  const format = detectFormat(file);
@@ -210,7 +210,7 @@ Import error: ${err instanceof Error ? err.message : err}`);
210
210
  }
211
211
  });
212
212
  program.command("formats").description("List all supported chat history formats").action(async () => {
213
- const { getSupportedFormats } = await import("./import-UR2IE2O7.mjs");
213
+ const { getSupportedFormats } = await import("./import-CQWGIMZQ.mjs");
214
214
  const formats = getSupportedFormats();
215
215
  console.log(`${formats.length} supported format(s):
216
216
  `);
@@ -219,11 +219,11 @@ program.command("formats").description("List all supported chat history formats"
219
219
  }
220
220
  });
221
221
  program.command("mcp").description("Start MCP Server (stdio transport, for ClaudeCode / Cursor / AI agents)").action(async () => {
222
- const { startCliMcpServer } = await import("./mcp-4XCDZ5PU.mjs");
222
+ const { startCliMcpServer } = await import("./mcp-7Q3FEI3Z.mjs");
223
223
  await startCliMcpServer();
224
224
  });
225
225
  program.command("serve").description("Start the HTTP API server").option("--port <port>", "Server port", String(DEFAULT_API_PORT)).option("--host <host>", "Listen address", "127.0.0.1").option("--token <token>", "Custom Bearer Token (reads from config or auto-generates if omitted)").option("--web [dir]", "Serve Web frontend static assets (defaults to dist-web/)").action(async (options) => {
226
- const { startHttpServer } = await import("./http-PQEOFGJK.mjs");
226
+ const { startHttpServer } = await import("./http-DHQI4G5J.mjs");
227
227
  const port = parseInt(options.port, 10);
228
228
  let webRoot;
229
229
  if (options.web !== void 0) {
@@ -256,7 +256,7 @@ Press Ctrl+C to stop.
256
256
  `);
257
257
  const shutdown = async () => {
258
258
  console.log("\nShutting down...");
259
- const { stopHttpServer } = await import("./http-PQEOFGJK.mjs");
259
+ const { stopHttpServer } = await import("./http-DHQI4G5J.mjs");
260
260
  await stopHttpServer();
261
261
  process.exit(0);
262
262
  };
@@ -273,7 +273,7 @@ Press Ctrl+C to stop.
273
273
  }
274
274
  });
275
275
  program.command("web").description("Launch Web UI with one click (HTTP API + browser auto-open)").option("--port <port>", "Server port", String(DEFAULT_API_PORT)).option("--host <host>", "Listen address", "127.0.0.1").option("--no-open", "Do not auto-open browser").action(async (options) => {
276
- const { startHttpServer } = await import("./http-PQEOFGJK.mjs");
276
+ const { startHttpServer } = await import("./http-DHQI4G5J.mjs");
277
277
  const port = parseInt(options.port, 10);
278
278
  const webDir = path.resolve(__dirname, "../dist-web");
279
279
  let webRoot;
@@ -299,7 +299,7 @@ Press Ctrl+C to stop.`);
299
299
  }
300
300
  const shutdown = async () => {
301
301
  console.log("\nShutting down...");
302
- const { stopHttpServer } = await import("./http-PQEOFGJK.mjs");
302
+ const { stopHttpServer } = await import("./http-DHQI4G5J.mjs");
303
303
  await stopHttpServer();
304
304
  process.exit(0);
305
305
  };
@@ -408,4 +408,4 @@ if (isDirectRun) {
408
408
  export {
409
409
  run
410
410
  };
411
- //# sourceMappingURL=chunk-P4N5GEFF.mjs.map
411
+ //# sourceMappingURL=chunk-OZWXLRJL.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-P4N5GEFF.mjs";
9
+ } from "./chunk-OZWXLRJL.mjs";
10
10
  import "./chunk-2AIOU3PW.mjs";
11
- import "./chunk-JMRDNHIR.mjs";
11
+ import "./chunk-7HQWGLX6.mjs";
12
12
  export {
13
13
  run
14
14
  };
@@ -13,12 +13,12 @@ import {
13
13
  registerWebRoutes,
14
14
  startHttpServer,
15
15
  stopHttpServer
16
- } from "./chunk-PF4QFHC6.mjs";
17
- import "./chunk-OC73KSMV.mjs";
18
- import "./chunk-DL3BFEAH.mjs";
19
- import "./chunk-YAOFJ73U.mjs";
16
+ } from "./chunk-LI4X52E7.mjs";
17
+ import "./chunk-OQVKZTVD.mjs";
18
+ import "./chunk-AIR7EAF4.mjs";
19
+ import "./chunk-4GI2UPCS.mjs";
20
20
  import "./chunk-2AIOU3PW.mjs";
21
- import "./chunk-JMRDNHIR.mjs";
21
+ import "./chunk-7HQWGLX6.mjs";
22
22
  export {
23
23
  createServer,
24
24
  registerAiRoutes,
@@ -29,4 +29,4 @@ export {
29
29
  startHttpServer,
30
30
  stopHttpServer
31
31
  };
32
- //# sourceMappingURL=http-PQEOFGJK.mjs.map
32
+ //# sourceMappingURL=http-DHQI4G5J.mjs.map
@@ -8,26 +8,28 @@ import {
8
8
  detectFormat as detectFormat2,
9
9
  importData,
10
10
  parseFile
11
- } from "./chunk-OC73KSMV.mjs";
11
+ } from "./chunk-OQVKZTVD.mjs";
12
12
  import {
13
13
  analyzeIncrementalImport,
14
14
  analyzeNewImport,
15
15
  incrementalImport,
16
16
  streamImport
17
- } from "./chunk-DL3BFEAH.mjs";
17
+ } from "./chunk-AIR7EAF4.mjs";
18
18
  import {
19
19
  detectAllFormats,
20
20
  detectFormat,
21
+ findEntryFileInDirectory,
21
22
  getFormatFeatureById,
22
23
  getSupportedFormats,
23
24
  scanMultiChatFile
24
- } from "./chunk-JMRDNHIR.mjs";
25
+ } from "./chunk-7HQWGLX6.mjs";
25
26
  export {
26
27
  analyzeIncrementalImport,
27
28
  analyzeNewImport,
28
29
  detectAllFormats,
29
30
  detectFormat2 as detectChatLabFormat,
30
31
  detectFormat,
32
+ findEntryFileInDirectory,
31
33
  getFormatFeatureById,
32
34
  getSupportedFormats,
33
35
  importData,
@@ -36,4 +38,4 @@ export {
36
38
  scanMultiChatFile,
37
39
  streamImport
38
40
  };
39
- //# sourceMappingURL=import-UR2IE2O7.mjs.map
41
+ //# sourceMappingURL=import-CQWGIMZQ.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-P4N5GEFF.mjs";
9
+ } from "./chunk-OZWXLRJL.mjs";
10
10
  import {
11
11
  startHttpServer,
12
12
  stopHttpServer
13
- } from "./chunk-PF4QFHC6.mjs";
14
- import "./chunk-OC73KSMV.mjs";
15
- import "./chunk-DL3BFEAH.mjs";
16
- import "./chunk-YAOFJ73U.mjs";
13
+ } from "./chunk-LI4X52E7.mjs";
14
+ import "./chunk-OQVKZTVD.mjs";
15
+ import "./chunk-AIR7EAF4.mjs";
16
+ import "./chunk-4GI2UPCS.mjs";
17
17
  import "./chunk-2AIOU3PW.mjs";
18
- import "./chunk-JMRDNHIR.mjs";
18
+ import "./chunk-7HQWGLX6.mjs";
19
19
  export {
20
20
  run,
21
21
  startHttpServer,
@@ -7,7 +7,7 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  CoreDataProvider,
9
9
  MCP_TOOL_REGISTRY
10
- } from "./chunk-YAOFJ73U.mjs";
10
+ } from "./chunk-4GI2UPCS.mjs";
11
11
  import {
12
12
  getVersion
13
13
  } from "./chunk-2AIOU3PW.mjs";
@@ -20,7 +20,7 @@ import {
20
20
  hasPendingElectronDataWarning,
21
21
  loadConfig,
22
22
  verifyCliDataPath
23
- } from "./chunk-JMRDNHIR.mjs";
23
+ } from "./chunk-7HQWGLX6.mjs";
24
24
 
25
25
  // src/mcp.ts
26
26
  import fs from "fs";
@@ -244,7 +244,7 @@ function formatSessionsList(obj) {
244
244
 
245
245
  // ../../packages/mcp-server/src/server.ts
246
246
  var MCP_TOOL_PREFIX = "chatlab_";
247
- var FORMAT_PARAM = z2.enum(["text", "json"]).optional().describe('Output format: "text" for token-efficient plain text (default), "json" for structured JSON');
247
+ var FORMAT_PARAM = z2.enum(["text", "json"]).optional().describe("text (default) or json");
248
248
  var JSON_DEFAULT_TOOLS = /* @__PURE__ */ new Set(["execute_sql", "get_schema"]);
249
249
  function applyFormat(content, format, toolName) {
250
250
  const effectiveFormat = format ?? (JSON_DEFAULT_TOOLS.has(toolName) ? "json" : "text");
@@ -276,9 +276,8 @@ function registerTools(server, dbManager) {
276
276
  });
277
277
  continue;
278
278
  }
279
- const sessionsToolMcpName = `${MCP_TOOL_PREFIX}list_sessions`;
280
279
  const zodShape = {
281
- session_id: z2.string().describe(`Session ID (use ${sessionsToolMcpName} to get available sessions)`),
280
+ session_id: z2.string().describe("Session ID"),
282
281
  ...jsonSchemaToZod(tool.inputSchema.properties, tool.inputSchema.required),
283
282
  format: FORMAT_PARAM
284
283
  };
@@ -403,4 +402,4 @@ async function startCliMcpServer() {
403
402
  export {
404
403
  startCliMcpServer
405
404
  };
406
- //# sourceMappingURL=mcp-4XCDZ5PU.mjs.map
405
+ //# sourceMappingURL=mcp-7Q3FEI3Z.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp.ts","../../../packages/mcp-server/src/server.ts","../../../packages/mcp-server/src/schema.ts","../../../packages/mcp-server/src/format.ts"],"sourcesContent":["/**\n * CLI MCP Server entry point\n *\n * Thin wrapper: initializes Node.js runtime, then delegates to chatlab-mcp.\n */\n\nimport fs from 'fs'\nimport path from 'path'\nimport { loadConfig } from '@openchatlab/config'\nimport {\n NodePathProvider,\n DatabaseManager,\n hasPendingElectronDataWarning,\n verifyCliDataPath,\n} from '@openchatlab/node-runtime'\nimport { startMcpServer } from 'chatlab-mcp'\nimport { getVersion } from './version'\n\nfunction resolveNativeBinding(): string | undefined {\n if (process.versions.electron) return undefined\n const nativePath = path.resolve(__dirname, '../native/better_sqlite3.node')\n if (fs.existsSync(nativePath)) return nativePath\n return undefined\n}\n\nfunction initMcpRuntime(): DatabaseManager {\n const config = loadConfig()\n const userDataDir = config.data.user_data_dir || undefined\n const pathProvider = new NodePathProvider(userDataDir)\n pathProvider.ensureAllDirs()\n\n if (hasPendingElectronDataWarning() || !verifyCliDataPath(pathProvider.getDatabaseDir())) {\n console.error('[MCP] Electron desktop data detected but databases not found.')\n console.error('[MCP] Set CHATLAB_DATA_DIR or edit ~/.chatlab/config.toml to point to your data directory.')\n process.exit(1)\n }\n\n const nativeBinding = resolveNativeBinding()\n return new DatabaseManager(pathProvider, { nativeBinding })\n}\n\nexport async function startCliMcpServer(): Promise<void> {\n const dbManager = initMcpRuntime()\n await startMcpServer({ version: getVersion(), dbManager })\n}\n","/**\n * ChatLab MCP Server core\n *\n * Registers @openchatlab/tools as MCP tools and exposes session data as MCP resources.\n * Communicates with AI agents (ClaudeCode, Cursor, etc.) via stdio transport.\n */\n\nimport { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { getSessionMeta, getSessionOverview, getDatabaseSchema } from '@openchatlab/core'\nimport { MCP_TOOL_REGISTRY, CoreDataProvider } from '@openchatlab/tools'\nimport type { SessionListContext } from '@openchatlab/tools/src/definitions/sessions'\nimport type { McpDatabaseManager, McpServerOptions } from './types'\nimport { jsonSchemaToZod } from './schema'\nimport { formatToolResultAsText } from './format'\n\nconst MCP_TOOL_PREFIX = 'chatlab_'\n\nconst FORMAT_PARAM = z.enum(['text', 'json']).optional().describe('text (default) or json')\n\n/** Tools where JSON is a better default (raw SQL results, schema) */\nconst JSON_DEFAULT_TOOLS = new Set(['execute_sql', 'get_schema'])\n\nfunction applyFormat(content: string, format: string | undefined, toolName: string): string {\n const effectiveFormat = format ?? (JSON_DEFAULT_TOOLS.has(toolName) ? 'json' : 'text')\n if (effectiveFormat === 'json') return content\n\n const textResult = formatToolResultAsText(content)\n return textResult ?? content\n}\n\nfunction registerTools(server: McpServer, dbManager: McpDatabaseManager): void {\n for (const tool of MCP_TOOL_REGISTRY) {\n const mcpName = `${MCP_TOOL_PREFIX}${tool.name}`\n\n if (tool.name === 'list_sessions') {\n const zodShape = {\n ...jsonSchemaToZod(tool.inputSchema.properties, tool.inputSchema.required),\n format: FORMAT_PARAM,\n }\n\n server.tool(mcpName, tool.description, zodShape, async (params) => {\n const format = params.format as string | undefined\n const context: SessionListContext = {\n db: null as any,\n sessionId: '',\n listSessionIds: () => dbManager.listSessionIds(),\n openDb: (id) => dbManager.open(id),\n }\n const toolParams = { ...params } as Record<string, unknown>\n delete toolParams.format\n const result = await tool.handler(toolParams, context)\n const text = applyFormat(result.content, format, tool.name)\n return { content: [{ type: 'text' as const, text }] }\n })\n continue\n }\n\n const zodShape = {\n session_id: z.string().describe('Session ID'),\n ...jsonSchemaToZod(tool.inputSchema.properties, tool.inputSchema.required),\n format: FORMAT_PARAM,\n }\n\n server.tool(mcpName, tool.description, zodShape, async (params) => {\n const sessionId = params.session_id as string\n const format = params.format as string | undefined\n const db = dbManager.open(sessionId)\n if (!db) {\n return {\n content: [{ type: 'text' as const, text: `Session not found: ${sessionId}` }],\n isError: true,\n }\n }\n\n const toolParams = { ...params } as Record<string, unknown>\n delete toolParams.session_id\n delete toolParams.format\n\n const result = await tool.handler(toolParams, { db, sessionId, dataProvider: new CoreDataProvider(db) })\n const text = applyFormat(result.content, format, tool.name)\n return { content: [{ type: 'text' as const, text }] }\n })\n }\n}\n\nfunction registerResources(server: McpServer, dbManager: McpDatabaseManager): void {\n server.resource('sessions-list', 'chatlab://sessions', { description: '所有已导入的聊天会话列表' }, async () => {\n const sessionIds = dbManager.listSessionIds()\n const sessions = sessionIds\n .map((id) => {\n const db = dbManager.open(id)\n if (!db) return null\n const meta = getSessionMeta(db)\n if (!meta) return null\n return { id, name: meta.name, platform: meta.platform, type: meta.type }\n })\n .filter(Boolean)\n\n return {\n contents: [\n {\n uri: 'chatlab://sessions',\n text: JSON.stringify(sessions, null, 2),\n mimeType: 'application/json',\n },\n ],\n }\n })\n\n server.resource(\n 'session-meta',\n new ResourceTemplate('chatlab://sessions/{sessionId}/meta', { list: undefined }),\n { description: '会话元信息(名称、平台、消息数等)' },\n async (uri, params) => {\n const sessionId = params.sessionId as string\n const db = dbManager.open(sessionId)\n if (!db) {\n return { contents: [{ uri: uri.href, text: '{\"error\": \"Session not found\"}', mimeType: 'application/json' }] }\n }\n\n const meta = getSessionMeta(db)\n const overview = getSessionOverview(db)\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify({ ...meta, ...overview }, null, 2),\n mimeType: 'application/json',\n },\n ],\n }\n }\n )\n\n server.resource(\n 'session-schema',\n new ResourceTemplate('chatlab://sessions/{sessionId}/schema', { list: undefined }),\n { description: '会话数据库的表结构' },\n async (uri, params) => {\n const sessionId = params.sessionId as string\n const db = dbManager.open(sessionId)\n if (!db) {\n return { contents: [{ uri: uri.href, text: '{\"error\": \"Session not found\"}', mimeType: 'application/json' }] }\n }\n\n const schema = getDatabaseSchema(db)\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(schema, null, 2),\n mimeType: 'application/json',\n },\n ],\n }\n }\n )\n}\n\nexport async function startMcpServer(options: McpServerOptions): Promise<void> {\n const { version, name = 'chatlab', dbManager } = options\n\n const server = new McpServer({ name, version })\n\n registerTools(server, dbManager)\n registerResources(server, dbManager)\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n","/**\n * JSON Schema → Zod conversion for MCP tool registration\n */\n\nimport { z } from 'zod'\n\n/**\n * Convert simple JSON Schema properties to a Zod shape object.\n * Supports string / number / boolean / enum types.\n */\nexport function jsonSchemaToZod(\n properties: Record<string, { type: string; description?: string; default?: unknown; enum?: unknown[] }>,\n required?: string[]\n): Record<string, z.ZodTypeAny> {\n const shape: Record<string, z.ZodTypeAny> = {}\n const requiredSet = new Set(required ?? [])\n\n for (const [key, prop] of Object.entries(properties)) {\n let zodType: z.ZodTypeAny\n\n switch (prop.type) {\n case 'number':\n zodType = z.number().describe(prop.description ?? '')\n break\n case 'boolean':\n zodType = z.boolean().describe(prop.description ?? '')\n break\n case 'string':\n default:\n if (prop.enum) {\n zodType = z.enum(prop.enum as [string, ...string[]]).describe(prop.description ?? '')\n } else {\n zodType = z.string().describe(prop.description ?? '')\n }\n break\n }\n\n if (!requiredSet.has(key)) {\n zodType = zodType.optional()\n }\n\n shape[key] = zodType\n }\n\n return shape\n}\n","/**\n * MCP output formatting for token-efficient LLM consumption\n *\n * Provides message filtering, merging, truncation, and compact text output.\n * Inspired by community chatlab-mcp-server's format.ts.\n */\n\nconst MAX_CONTENT_LENGTH = 200\nconst MAX_MERGED_CONTENT_LENGTH = 400\n\nconst PLACEHOLDER_CONTENTS = new Set([\n '[图片]',\n '[语音]',\n '[视频]',\n '[文件]',\n '[表情]',\n '[动画表情]',\n '[位置]',\n '[名片]',\n '[红包]',\n '[转账]',\n '[撤回消息]',\n '[分享]',\n '[image]',\n '[voice]',\n '[video]',\n '[file]',\n '[sticker]',\n '[animated sticker]',\n '[location]',\n '[contact]',\n '[red packet]',\n '[transfer]',\n '[recalled message]',\n '[photo]',\n '[audio]',\n '[gif]',\n '[share]',\n])\n\nconst MEANINGLESS_SHORT_EN = new Set([\n 'ok',\n 'k',\n 'yes',\n 'no',\n 'ya',\n 'yep',\n 'nope',\n 'lol',\n 'haha',\n 'hehe',\n 'hmm',\n 'ah',\n 'oh',\n 'wow',\n 'thx',\n 'ty',\n 'np',\n 'gg',\n 'brb',\n 'idk',\n])\n\nconst MEANINGFUL_SHORT_ZH = new Set(['好的', '不是', '是的', '可以', '不行', '好吧', '明白', '知道', '同意'])\n\nconst SYSTEM_PATTERNS_ZH = [/^.*邀请.*加入了群聊$/, /^.*退出了群聊$/, /^.*撤回了一条消息$/, /^你撤回了一条消息$/]\n\nconst SYSTEM_PATTERNS_EN = [\n /^.*invited.*to the group$/i,\n /^.*left the group$/i,\n /^.*recalled a message$/i,\n /^.*joined the group$/i,\n /^.*has been removed$/i,\n]\n\nconst EMOJI_ONLY = /^[\\p{Emoji}\\s[\\]()()]+$/u\n\ninterface FormattableMessage {\n senderName: string\n content: string | null\n timestamp: number\n}\n\n/**\n * Check if message content is meaningful (not noise).\n */\nexport function isValidMessage(content: string): boolean {\n const trimmed = content.trim()\n if (!trimmed) return false\n\n if (trimmed.length <= 2 && !MEANINGFUL_SHORT_ZH.has(trimmed)) return false\n if (MEANINGLESS_SHORT_EN.has(trimmed.toLowerCase())) return false\n if (EMOJI_ONLY.test(trimmed)) return false\n if (PLACEHOLDER_CONTENTS.has(trimmed.toLowerCase())) return false\n if (SYSTEM_PATTERNS_ZH.some((p) => p.test(trimmed))) return false\n if (SYSTEM_PATTERNS_EN.some((p) => p.test(trimmed))) return false\n\n return true\n}\n\nfunction truncate(text: string, maxLen: number): string {\n return text.length <= maxLen ? text : text.slice(0, maxLen) + '...'\n}\n\nfunction formatTimestamp(ts: number): string {\n const d = new Date(ts * 1000)\n const M = d.getMonth() + 1\n const D = d.getDate()\n const h = String(d.getHours()).padStart(2, '0')\n const m = String(d.getMinutes()).padStart(2, '0')\n return `${M}/${D} ${h}:${m}`\n}\n\n/**\n * Format messages as compact plain text with consecutive-sender merging.\n * Filters out noise messages, merges same-sender runs, truncates long content.\n */\nexport function formatMessagesCompact(messages: FormattableMessage[]): string {\n if (messages.length === 0) return ''\n\n const valid = messages.filter((m) => m.content && isValidMessage(m.content))\n if (valid.length === 0) return ''\n\n const lines: string[] = []\n let prevSender = ''\n let pendingContents: string[] = []\n let pendingTs = 0\n\n const flush = () => {\n if (pendingContents.length === 0) return\n const combined = pendingContents.join('; ')\n const maxLen = pendingContents.length > 1 ? MAX_MERGED_CONTENT_LENGTH : MAX_CONTENT_LENGTH\n lines.push(`${formatTimestamp(pendingTs)} ${prevSender}: ${truncate(combined, maxLen)}`)\n }\n\n for (const msg of valid) {\n const content = msg.content!.trim()\n if (msg.senderName === prevSender) {\n pendingContents.push(content)\n } else {\n flush()\n prevSender = msg.senderName\n pendingContents = [content]\n pendingTs = msg.timestamp\n }\n }\n flush()\n\n return lines.join('\\n')\n}\n\n/**\n * Try to parse a tool result's JSON content and convert to compact text.\n * Returns null if the content is not suitable for text formatting.\n */\nexport function formatToolResultAsText(content: string): string | null {\n let parsed: unknown\n try {\n parsed = JSON.parse(content)\n } catch {\n return null\n }\n\n if (!parsed || typeof parsed !== 'object') return null\n const obj = parsed as Record<string, unknown>\n\n // If there's a messages array with senderName/content/timestamp, format it\n if (Array.isArray(obj.messages) && obj.messages.length > 0) {\n const msgs = obj.messages as FormattableMessage[]\n if (msgs[0] && 'senderName' in msgs[0] && 'timestamp' in msgs[0]) {\n return formatObjectWithMessages(obj, msgs)\n }\n }\n\n // If there are ranking/keywords arrays, format as numbered list\n if (Array.isArray(obj.ranking) || Array.isArray(obj.keywords)) {\n return formatArrayResult(obj)\n }\n\n // If there are sessions, format them compactly\n if (Array.isArray(obj.sessions)) {\n return formatSessionsList(obj)\n }\n\n return null\n}\n\nfunction formatObjectWithMessages(obj: Record<string, unknown>, msgs: FormattableMessage[]): string {\n const lines: string[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'messages') continue\n if (value === undefined || value === null) continue\n if (typeof value === 'object' && !Array.isArray(value)) continue\n if (Array.isArray(value)) continue\n lines.push(`${key}: ${value}`)\n }\n\n const formatted = formatMessagesCompact(msgs)\n if (formatted) {\n if (lines.length > 0) lines.push('')\n lines.push(formatted)\n }\n\n return lines.join('\\n')\n}\n\nfunction formatArrayResult(obj: Record<string, unknown>): string {\n const lines: string[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'string') {\n if (lines.length > 0) lines.push('')\n lines.push(...value)\n } else if (!Array.isArray(value) && value !== undefined && value !== null) {\n lines.push(`${key}: ${value}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nfunction formatSessionsList(obj: Record<string, unknown>): string {\n const sessions = obj.sessions as Array<Record<string, unknown>>\n const total = obj.total ?? sessions.length\n const lines: string[] = [`${total} sessions:`]\n\n for (const s of sessions) {\n const name = s.name ?? s.id\n const platform = s.platform ? ` (${s.platform})` : ''\n const msgCount = s.totalMessages ?? s.messageCount ?? ''\n const members = s.totalMembers ?? s.memberCount ?? ''\n const stats = msgCount ? ` — ${msgCount} msgs, ${members} members` : ''\n lines.push(`- ${name}${platform}${stats} [${s.id}]`)\n }\n\n return lines.join('\\n')\n}\n"],"mappings":"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","names":["z","z","zodShape"]}
@@ -57,6 +57,7 @@ import {
57
57
  createActivateSkillTool,
58
58
  createAiTranslate,
59
59
  createCompressionLlmAdapter,
60
+ createDatabaseManagerAdapter,
60
61
  createFtsTable,
61
62
  createJiebaNlpProvider,
62
63
  deleteDict,
@@ -69,6 +70,7 @@ import {
69
70
  executeSemanticPipeline,
70
71
  exportFilterResultToMarkdown,
71
72
  exportSessionToJson,
73
+ export_service_exports,
72
74
  extractErrorInfo,
73
75
  extractErrorStack,
74
76
  extractSkillId,
@@ -124,6 +126,7 @@ import {
124
126
  logPerfDetail,
125
127
  logSummary,
126
128
  manualCompress,
129
+ member_service_exports,
127
130
  mergeRulesForLocale,
128
131
  migrateFromElectronIfNeeded,
129
132
  normalizeAnthropicBaseUrl,
@@ -146,12 +149,15 @@ import {
146
149
  segmentText,
147
150
  serializeAssistant,
148
151
  serializeChatLabToJsonl,
152
+ session_index_service_exports,
153
+ session_service_exports,
149
154
  setActiveEmbeddingConfig,
150
155
  setCache,
151
156
  splitIntoSegments,
152
157
  streamParseFileInfo,
153
158
  streamSimple,
154
159
  streamingImport,
160
+ summary_service_exports,
155
161
  t,
156
162
  tokenizeForFts,
157
163
  tokenizeQueryForFts,
@@ -163,7 +169,7 @@ import {
163
169
  verifyCliDataPath,
164
170
  wasElectronUsed,
165
171
  writeParseResultToDb
166
- } from "./chunk-JMRDNHIR.mjs";
172
+ } from "./chunk-7HQWGLX6.mjs";
167
173
  export {
168
174
  AIConversationManager,
169
175
  AgentEventHandler,
@@ -217,6 +223,7 @@ export {
217
223
  createActivateSkillTool,
218
224
  createAiTranslate,
219
225
  createCompressionLlmAdapter,
226
+ createDatabaseManagerAdapter,
220
227
  createFtsTable,
221
228
  createJiebaNlpProvider,
222
229
  deleteDict,
@@ -228,6 +235,7 @@ export {
228
235
  estimateTokensFromText,
229
236
  executeSemanticPipeline,
230
237
  exportFilterResultToMarkdown,
238
+ export_service_exports as exportService,
231
239
  exportSessionToJson,
232
240
  extractErrorInfo,
233
241
  extractErrorStack,
@@ -284,6 +292,7 @@ export {
284
292
  logPerfDetail,
285
293
  logSummary,
286
294
  manualCompress,
295
+ member_service_exports as memberService,
287
296
  mergeRulesForLocale,
288
297
  migrateFromElectronIfNeeded,
289
298
  normalizeAnthropicBaseUrl,
@@ -306,12 +315,15 @@ export {
306
315
  segmentText,
307
316
  serializeAssistant,
308
317
  serializeChatLabToJsonl,
318
+ session_index_service_exports as sessionIndexService,
319
+ session_service_exports as sessionService,
309
320
  setActiveEmbeddingConfig,
310
321
  setCache,
311
322
  splitIntoSegments,
312
323
  streamParseFileInfo,
313
324
  streamSimple,
314
325
  streamingImport,
326
+ summary_service_exports as summaryService,
315
327
  t,
316
328
  tokenizeForFts,
317
329
  tokenizeQueryForFts,
@@ -324,4 +336,4 @@ export {
324
336
  wasElectronUsed,
325
337
  writeParseResultToDb
326
338
  };
327
- //# sourceMappingURL=src-ZELOFE7P.mjs.map
339
+ //# sourceMappingURL=src-QBT5SYW5.mjs.map
@@ -9,23 +9,25 @@ import {
9
9
  analyzeNewImport,
10
10
  incrementalImport,
11
11
  streamImport
12
- } from "./chunk-DL3BFEAH.mjs";
12
+ } from "./chunk-AIR7EAF4.mjs";
13
13
  import {
14
14
  detectAllFormats,
15
15
  detectFormat,
16
+ findEntryFileInDirectory,
16
17
  getFormatFeatureById,
17
18
  getSupportedFormats,
18
19
  scanMultiChatFile
19
- } from "./chunk-JMRDNHIR.mjs";
20
+ } from "./chunk-7HQWGLX6.mjs";
20
21
  export {
21
22
  analyzeIncrementalImport,
22
23
  analyzeNewImport,
23
24
  detectAllFormats,
24
25
  detectFormat,
26
+ findEntryFileInDirectory,
25
27
  getFormatFeatureById,
26
28
  getSupportedFormats,
27
29
  incrementalImport,
28
30
  scanMultiChatFile,
29
31
  streamImport
30
32
  };
31
- //# sourceMappingURL=stream-import-RP3XB6NM.mjs.map
33
+ //# sourceMappingURL=stream-import-VG7RP6KJ.mjs.map
@@ -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-4776dd3d]::-webkit-scrollbar{width:4px}.custom-scrollbar[data-v-4776dd3d]::-webkit-scrollbar-track{background:transparent}.custom-scrollbar[data-v-4776dd3d]::-webkit-scrollbar-thumb{border-radius:4px;background-color:#9ca3af4d}.dark .custom-scrollbar[data-v-4776dd3d]::-webkit-scrollbar-thumb{background-color:#9ca3af26}.slide-fade-enter-active[data-v-02cce763],.slide-fade-leave-active[data-v-02cce763]{transition:all .3s ease-out}.slide-fade-enter-from[data-v-02cce763],.slide-fade-leave-to[data-v-02cce763]{transform:translate(20px);opacity:0}.slide-up-enter-active[data-v-02cce763],.slide-up-leave-active[data-v-02cce763]{transition:all .3s ease-out}.slide-up-enter-from[data-v-02cce763],.slide-up-leave-to[data-v-02cce763]{transform:translateY(10px);opacity:0}.fade-up-enter-active[data-v-02cce763],.fade-up-leave-active[data-v-02cce763]{transition:opacity .2s ease-out}.fade-up-enter-from[data-v-02cce763],.fade-up-leave-to[data-v-02cce763]{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-b3d2cc85]{position:absolute;left:0;right:0;z-index:50;top:calc(-1 * var(--titlebar-area-height));height:calc(var(--titlebar-area-height) + 1rem);-webkit-app-region: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-4776dd3d]::-webkit-scrollbar{width:4px}.custom-scrollbar[data-v-4776dd3d]::-webkit-scrollbar-track{background:transparent}.custom-scrollbar[data-v-4776dd3d]::-webkit-scrollbar-thumb{border-radius:4px;background-color:#9ca3af4d}.dark .custom-scrollbar[data-v-4776dd3d]::-webkit-scrollbar-thumb{background-color:#9ca3af26}.slide-fade-enter-active[data-v-04240f9d],.slide-fade-leave-active[data-v-04240f9d]{transition:all .3s ease-out}.slide-fade-enter-from[data-v-04240f9d],.slide-fade-leave-to[data-v-04240f9d]{transform:translate(20px);opacity:0}.slide-up-enter-active[data-v-04240f9d],.slide-up-leave-active[data-v-04240f9d]{transition:all .3s ease-out}.slide-up-enter-from[data-v-04240f9d],.slide-up-leave-to[data-v-04240f9d]{transform:translateY(10px);opacity:0}.fade-up-enter-active[data-v-04240f9d],.fade-up-leave-active[data-v-04240f9d]{transition:opacity .2s ease-out}.fade-up-enter-from[data-v-04240f9d],.fade-up-leave-to[data-v-04240f9d]{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-b3d2cc85]{position:absolute;left:0;right:0;z-index:50;top:calc(-1 * var(--titlebar-area-height));height:calc(var(--titlebar-area-height) + 1rem);-webkit-app-region:drag}