chatlab-cli 0.28.1 → 0.30.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 (116) hide show
  1. package/dist/{chat-command-ISJ2DC7R.mjs → chat-command-UZ23GKO7.mjs} +8 -5
  2. package/dist/{chat-command-ISJ2DC7R.mjs.map → chat-command-UZ23GKO7.mjs.map} +1 -1
  3. package/dist/{chunk-AB6TAXTQ.mjs → chunk-4IZ3WKYU.mjs} +591 -310
  4. package/dist/chunk-4IZ3WKYU.mjs.map +1 -0
  5. package/dist/{chunk-3QBVO4J7.mjs → chunk-5UBHNQFZ.mjs} +101 -41
  6. package/dist/chunk-5UBHNQFZ.mjs.map +1 -0
  7. package/dist/chunk-7BZLS2KW.mjs +8965 -0
  8. package/dist/chunk-7BZLS2KW.mjs.map +1 -0
  9. package/dist/{chunk-ZVDOFWL7.mjs → chunk-A2SANKG4.mjs} +4043 -10895
  10. package/dist/chunk-A2SANKG4.mjs.map +1 -0
  11. package/dist/chunk-CNSYXRJP.mjs +526 -0
  12. package/dist/chunk-CNSYXRJP.mjs.map +1 -0
  13. package/dist/{chunk-T7IETWHN.mjs → chunk-FCCL5Z4W.mjs} +5 -3
  14. package/dist/{chunk-T7IETWHN.mjs.map → chunk-FCCL5Z4W.mjs.map} +1 -1
  15. package/dist/chunk-M55KW2HA.mjs +2323 -0
  16. package/dist/chunk-M55KW2HA.mjs.map +1 -0
  17. package/dist/chunk-MUPILWAZ.mjs +1339 -0
  18. package/dist/chunk-MUPILWAZ.mjs.map +1 -0
  19. package/dist/{chunk-YBS3YQB6.mjs → chunk-P3ZOLTGS.mjs} +31 -57
  20. package/dist/chunk-P3ZOLTGS.mjs.map +1 -0
  21. package/dist/{chunk-NJB2NNB2.mjs → chunk-RDR6PS2R.mjs} +2 -2
  22. package/dist/{chunk-ERAAWLEF.mjs → chunk-ZFU2CHW3.mjs} +11 -8
  23. package/dist/{chunk-ERAAWLEF.mjs.map → chunk-ZFU2CHW3.mjs.map} +1 -1
  24. package/dist/cli.mjs +7 -4
  25. package/dist/contacts-worker.mjs +48 -0
  26. package/dist/contacts-worker.mjs.map +1 -0
  27. package/dist/{http-MBILV37U.mjs → http-UWRA5FLB.mjs} +11 -8
  28. package/dist/{import-EYV3GXHE.mjs → import-745KQL7N.mjs} +7 -4
  29. package/dist/index.mjs +11 -8
  30. package/dist/{mcp-H55AEXU5.mjs → mcp-UHN5JOHC.mjs} +8 -5
  31. package/dist/{mcp-H55AEXU5.mjs.map → mcp-UHN5JOHC.mjs.map} +1 -1
  32. package/dist/people-relationships-worker.mjs +48 -0
  33. package/dist/people-relationships-worker.mjs.map +1 -0
  34. package/dist/semantic-index-worker.mjs +1 -1
  35. package/dist/{src-36ZIR65K.mjs → src-Y7MDRXLJ.mjs} +68 -44
  36. package/dist/{stream-import-YZMZ56B5.mjs → stream-import-3JMXQD7P.mjs} +7 -4
  37. package/dist/{worker-runtime-YDYS2C6T.mjs → worker-runtime-63RYMGZI.mjs} +7 -3
  38. package/dist/{worker-runtime-YDYS2C6T.mjs.map → worker-runtime-63RYMGZI.mjs.map} +1 -1
  39. package/dist-web/assets/BufferResource-BVdJ_I5X.js +185 -0
  40. package/dist-web/assets/CanvasRenderer-BaRuT54R.js +1 -0
  41. package/dist-web/assets/DebugToolsPanel-D_lFIW6j.css +1 -0
  42. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-N5CoiJzN.js +110 -0
  43. package/dist-web/assets/{EChartWordcloud-B_YisOW5.js → EChartWordcloud-Clg60FMo.js} +1 -1
  44. package/dist-web/assets/Filter-B7cNFtuE.js +1 -0
  45. package/dist-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-D_dJuLWJ.js +1 -0
  46. package/dist-web/assets/MessageExportModal-B2Qm6VVj.js +1 -0
  47. package/dist-web/assets/PageHeader-Bbn87QZS.css +1 -0
  48. package/dist-web/assets/PageHeader-PjlWy9fC.js +1 -0
  49. package/dist-web/assets/RelationshipGalaxyCanvas-11MafciW.js +244 -0
  50. package/dist-web/assets/RelationshipGalaxyThreeCanvas-BluPHjCR.css +1 -0
  51. package/dist-web/assets/RelationshipGalaxyThreeCanvas-C1I4B8NX.js +4108 -0
  52. package/dist-web/assets/RenderTargetSystem-Chkz1WlI.js +184 -0
  53. package/dist-web/assets/WebGLRenderer-xK19ru58.js +156 -0
  54. package/dist-web/assets/WebGPURenderer-CL5ZaKsn.js +41 -0
  55. package/dist-web/assets/browserAll-CyyNzRD_.js +14 -0
  56. package/dist-web/assets/electron-MXaTKaMu.js +1 -0
  57. package/dist-web/assets/{fetch-29ZBtGV0.js → fetch-D1dDiFO4.js} +1 -1
  58. package/dist-web/assets/{fetch-TCeykOkO.js → fetch-DDnVXGte.js} +1 -1
  59. package/dist-web/assets/{fetch-Bh1fo3Df.js → fetch-DTwdRTXM.js} +1 -1
  60. package/dist-web/assets/{fetch-BcxrU2mr.js → fetch-DaaJwT-5.js} +1 -1
  61. package/dist-web/assets/{fetch-tIIVdXSv.js → fetch-DeA0ztwT.js} +1 -1
  62. package/dist-web/assets/fetch-DpnIGZSN.js +17 -0
  63. package/dist-web/assets/{fetch-C3yhWO2S.js → fetch-DsE-xcP2.js} +1 -1
  64. package/dist-web/assets/{fetch-BYczbT4C.js → fetch-DsTgYu_X.js} +1 -1
  65. package/dist-web/assets/fetch-hKE53UO4.js +1 -0
  66. package/dist-web/assets/fetch-u9GTMhMF.js +1 -0
  67. package/dist-web/assets/index---rXG1hZ.css +1 -0
  68. package/dist-web/assets/index-BVkE4qis.js +22 -0
  69. package/dist-web/assets/index-BcXLcFnV.css +1 -0
  70. package/dist-web/assets/index-BnHKyESZ.js +1 -0
  71. package/dist-web/assets/index-Btr5H7d-.js +2 -0
  72. package/dist-web/assets/{index-BX3tqfLz.css → index-C1p9CbmN.css} +1 -1
  73. package/dist-web/assets/index-COpza1A4.css +1 -0
  74. package/dist-web/assets/index-D04LWJop.js +173 -0
  75. package/dist-web/assets/index-DFCYmzGE.js +2 -0
  76. package/dist-web/assets/index-DosG7LmJ.css +1 -0
  77. package/dist-web/assets/index-DqXHRIhI.js +1 -0
  78. package/dist-web/assets/{index-fbWrQpgH.js → index-DqtXt3wl.js} +1 -1
  79. package/dist-web/assets/index-Dszv-QFp.js +64 -0
  80. package/dist-web/assets/index-DzLrWGXu.js +1 -0
  81. package/dist-web/assets/people-page-header-Mupn-U_b.js +1 -0
  82. package/dist-web/assets/relationship-galaxy-viewport-Cwfa51ER.js +1 -0
  83. package/dist-web/assets/{vendor-echarts-CITQeskI.js → vendor-echarts-hJVnODyU.js} +2 -2
  84. package/dist-web/assets/{vendor-echarts-wordcloud-B1kQMklB.js → vendor-echarts-wordcloud-k5ih2Jl4.js} +1 -1
  85. package/dist-web/assets/{vendor-nuxt-ui-Zy8txNdC.js → vendor-nuxt-ui-DaLxYaC4.js} +2 -2
  86. package/dist-web/assets/{vendor-reka-ui-mMvma1EP.js → vendor-reka-ui-CzM4kDQ7.js} +1 -1
  87. package/dist-web/assets/{vendor-zrender-DFl4U2Oe.js → vendor-zrender-5DcYjSZk.js} +1 -1
  88. package/dist-web/assets/{web-H3XLx159.js → web-DPVWfPS-.js} +1 -1
  89. package/dist-web/assets/webworkerAll-DF5QV_vN.js +83 -0
  90. package/dist-web/index.html +4 -4
  91. package/package.json +1 -1
  92. package/dist/chunk-3QBVO4J7.mjs.map +0 -1
  93. package/dist/chunk-AB6TAXTQ.mjs.map +0 -1
  94. package/dist/chunk-GHTGFM6O.mjs +0 -540
  95. package/dist/chunk-GHTGFM6O.mjs.map +0 -1
  96. package/dist/chunk-YBS3YQB6.mjs.map +0 -1
  97. package/dist/chunk-ZVDOFWL7.mjs.map +0 -1
  98. package/dist-web/assets/DebugToolsPanel-DFw6_G5V.css +0 -1
  99. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-Do3x4aL3.js +0 -110
  100. package/dist-web/assets/MessageExportModal-rijqUusq.js +0 -1
  101. package/dist-web/assets/electron-DWDCqx_d.js +0 -1
  102. package/dist-web/assets/fetch-BAxKmbKF.js +0 -1
  103. package/dist-web/assets/fetch-Da_TBxrX.js +0 -1
  104. package/dist-web/assets/fetch-DyD8wDhb.js +0 -17
  105. package/dist-web/assets/index-BzjLqlW_.js +0 -173
  106. package/dist-web/assets/index-C74qEDFh.js +0 -64
  107. package/dist-web/assets/index-CM6xNPFp.css +0 -1
  108. package/dist-web/assets/index-CgK2LLIF.js +0 -12
  109. package/dist-web/assets/index-CjkOvM3N.js +0 -2
  110. package/dist-web/assets/index-Dno7CADA.js +0 -1
  111. package/dist-web/assets/index-I3SWZjnW.css +0 -1
  112. /package/dist/{chunk-NJB2NNB2.mjs.map → chunk-RDR6PS2R.mjs.map} +0 -0
  113. /package/dist/{http-MBILV37U.mjs.map → http-UWRA5FLB.mjs.map} +0 -0
  114. /package/dist/{import-EYV3GXHE.mjs.map → import-745KQL7N.mjs.map} +0 -0
  115. /package/dist/{src-36ZIR65K.mjs.map → src-Y7MDRXLJ.mjs.map} +0 -0
  116. /package/dist/{stream-import-YZMZ56B5.mjs.map → stream-import-3JMXQD7P.mjs.map} +0 -0
@@ -9,16 +9,19 @@ import {
9
9
  registerWebRoutes,
10
10
  startHttpServer,
11
11
  stopHttpServer
12
- } from "./chunk-AB6TAXTQ.mjs";
12
+ } from "./chunk-4IZ3WKYU.mjs";
13
13
  import "./chunk-5FGB42EQ.mjs";
14
- import "./chunk-ERAAWLEF.mjs";
15
- import "./chunk-3QBVO4J7.mjs";
16
- import "./chunk-NJB2NNB2.mjs";
14
+ import "./chunk-FCCL5Z4W.mjs";
15
+ import "./chunk-ZFU2CHW3.mjs";
16
+ import "./chunk-5UBHNQFZ.mjs";
17
+ import "./chunk-RDR6PS2R.mjs";
17
18
  import "./chunk-5ADKYYNA.mjs";
18
19
  import "./chunk-FJ35V3TE.mjs";
19
- import "./chunk-T7IETWHN.mjs";
20
- import "./chunk-YBS3YQB6.mjs";
21
- import "./chunk-ZVDOFWL7.mjs";
20
+ import "./chunk-P3ZOLTGS.mjs";
21
+ import "./chunk-A2SANKG4.mjs";
22
+ import "./chunk-CNSYXRJP.mjs";
23
+ import "./chunk-MUPILWAZ.mjs";
24
+ import "./chunk-7BZLS2KW.mjs";
22
25
  import "./chunk-GFHSSCCR.mjs";
23
26
  export {
24
27
  createServer,
@@ -26,4 +29,4 @@ export {
26
29
  startHttpServer,
27
30
  stopHttpServer
28
31
  };
29
- //# sourceMappingURL=http-MBILV37U.mjs.map
32
+ //# sourceMappingURL=http-UWRA5FLB.mjs.map
@@ -10,8 +10,8 @@ import {
10
10
  analyzeNewImport,
11
11
  incrementalImport,
12
12
  streamImport
13
- } from "./chunk-T7IETWHN.mjs";
14
- import "./chunk-YBS3YQB6.mjs";
13
+ } from "./chunk-FCCL5Z4W.mjs";
14
+ import "./chunk-P3ZOLTGS.mjs";
15
15
  import {
16
16
  detectAllFormats,
17
17
  detectFormat,
@@ -19,7 +19,10 @@ import {
19
19
  getFormatFeatureById,
20
20
  getSupportedFormats,
21
21
  scanMultiChatFile
22
- } from "./chunk-ZVDOFWL7.mjs";
22
+ } from "./chunk-A2SANKG4.mjs";
23
+ import "./chunk-CNSYXRJP.mjs";
24
+ import "./chunk-MUPILWAZ.mjs";
25
+ import "./chunk-7BZLS2KW.mjs";
23
26
  import "./chunk-GFHSSCCR.mjs";
24
27
  export {
25
28
  analyzeIncrementalImport,
@@ -33,4 +36,4 @@ export {
33
36
  scanMultiChatFile,
34
37
  streamImport
35
38
  };
36
- //# sourceMappingURL=import-EYV3GXHE.mjs.map
39
+ //# sourceMappingURL=import-745KQL7N.mjs.map
package/dist/index.mjs CHANGED
@@ -7,19 +7,22 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  startHttpServer,
9
9
  stopHttpServer
10
- } from "./chunk-AB6TAXTQ.mjs";
10
+ } from "./chunk-4IZ3WKYU.mjs";
11
11
  import "./chunk-5FGB42EQ.mjs";
12
- import "./chunk-ERAAWLEF.mjs";
13
- import "./chunk-3QBVO4J7.mjs";
12
+ import "./chunk-FCCL5Z4W.mjs";
13
+ import "./chunk-ZFU2CHW3.mjs";
14
+ import "./chunk-5UBHNQFZ.mjs";
14
15
  import {
15
16
  run
16
- } from "./chunk-GHTGFM6O.mjs";
17
- import "./chunk-NJB2NNB2.mjs";
17
+ } from "./chunk-M55KW2HA.mjs";
18
+ import "./chunk-RDR6PS2R.mjs";
18
19
  import "./chunk-5ADKYYNA.mjs";
19
20
  import "./chunk-FJ35V3TE.mjs";
20
- import "./chunk-T7IETWHN.mjs";
21
- import "./chunk-YBS3YQB6.mjs";
22
- import "./chunk-ZVDOFWL7.mjs";
21
+ import "./chunk-P3ZOLTGS.mjs";
22
+ import "./chunk-A2SANKG4.mjs";
23
+ import "./chunk-CNSYXRJP.mjs";
24
+ import "./chunk-MUPILWAZ.mjs";
25
+ import "./chunk-7BZLS2KW.mjs";
23
26
  import "./chunk-GFHSSCCR.mjs";
24
27
  export {
25
28
  run,
@@ -7,10 +7,10 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  CoreDataProvider,
9
9
  MCP_TOOL_REGISTRY
10
- } from "./chunk-3QBVO4J7.mjs";
10
+ } from "./chunk-5UBHNQFZ.mjs";
11
11
  import {
12
12
  assertCliDataDirCompatible
13
- } from "./chunk-NJB2NNB2.mjs";
13
+ } from "./chunk-RDR6PS2R.mjs";
14
14
  import {
15
15
  getVersion
16
16
  } from "./chunk-5ADKYYNA.mjs";
@@ -20,7 +20,10 @@ import {
20
20
  import {
21
21
  NodePathProvider,
22
22
  hasPendingElectronDataWarning
23
- } from "./chunk-YBS3YQB6.mjs";
23
+ } from "./chunk-P3ZOLTGS.mjs";
24
+ import "./chunk-A2SANKG4.mjs";
25
+ import "./chunk-CNSYXRJP.mjs";
26
+ import "./chunk-MUPILWAZ.mjs";
24
27
  import {
25
28
  DatabaseManager,
26
29
  getDatabaseSchema,
@@ -28,7 +31,7 @@ import {
28
31
  getSessionOverview,
29
32
  loadConfig,
30
33
  verifyCliDataPath
31
- } from "./chunk-ZVDOFWL7.mjs";
34
+ } from "./chunk-7BZLS2KW.mjs";
32
35
  import "./chunk-GFHSSCCR.mjs";
33
36
 
34
37
  // src/mcp.ts
@@ -412,4 +415,4 @@ export {
412
415
  initMcpRuntime,
413
416
  startCliMcpServer
414
417
  };
415
- //# sourceMappingURL=mcp-H55AEXU5.mjs.map
418
+ //# sourceMappingURL=mcp-UHN5JOHC.mjs.map
@@ -1 +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 { 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'\nimport { resolveCliPath } from './paths'\nimport { assertCliDataDirCompatible } from './runtime-compat'\n\nfunction resolveNativeBinding(): string | undefined {\n if (process.versions.electron) return undefined\n const nativePath = resolveCliPath('native/better_sqlite3.node')\n if (fs.existsSync(nativePath)) return nativePath\n return undefined\n}\n\nexport function 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 const runtime = assertCliDataDirCompatible(pathProvider, 'mcp')\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, runtime })\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"]}
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 { 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'\nimport { resolveCliPath } from './paths'\nimport { assertCliDataDirCompatible } from './runtime-compat'\n\nfunction resolveNativeBinding(): string | undefined {\n if (process.versions.electron) return undefined\n const nativePath = resolveCliPath('native/better_sqlite3.node')\n if (fs.existsSync(nativePath)) return nativePath\n return undefined\n}\n\nexport function 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 const runtime = assertCliDataDirCompatible(pathProvider, 'mcp')\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, runtime })\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"]}
@@ -0,0 +1,48 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { dirname as __pathDirname } from 'path';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import {
8
+ computePeopleRelationshipsSnapshot
9
+ } from "./chunk-MUPILWAZ.mjs";
10
+ import {
11
+ DatabaseManager,
12
+ StaticPathProvider,
13
+ createDatabaseManagerAdapter,
14
+ getPeopleRelationshipsFactsCacheDir,
15
+ initAppLogger
16
+ } from "./chunk-7BZLS2KW.mjs";
17
+ import "./chunk-GFHSSCCR.mjs";
18
+
19
+ // ../../packages/node-runtime/src/services/people/relationships/worker-entry.ts
20
+ import { parentPort, workerData } from "worker_threads";
21
+ async function main() {
22
+ if (!parentPort) throw new Error("people relationships worker requires parentPort");
23
+ const options = workerData;
24
+ initAppLogger(options.paths.logsDir);
25
+ const pathProvider = new StaticPathProvider(options.paths);
26
+ const dbManager = new DatabaseManager(pathProvider, {
27
+ nativeBinding: options.nativeBinding,
28
+ runtime: options.runtimeIdentity,
29
+ allowMissingRuntimeForTests: !options.runtimeIdentity
30
+ });
31
+ const adapter = createDatabaseManagerAdapter(dbManager);
32
+ const onProgress = (progress) => parentPort?.postMessage({ type: "progress", progress });
33
+ const snapshot = computePeopleRelationshipsSnapshot({
34
+ adapter,
35
+ signature: options.signature,
36
+ timeRangePreset: options.timeRangePreset,
37
+ factsCacheDir: getPeopleRelationshipsFactsCacheDir(pathProvider.getUserDataDir()),
38
+ onProgress
39
+ });
40
+ parentPort.postMessage({ type: "success", snapshot });
41
+ }
42
+ main().catch((error) => {
43
+ parentPort?.postMessage({
44
+ type: "error",
45
+ error: error instanceof Error ? error.message : String(error)
46
+ });
47
+ });
48
+ //# sourceMappingURL=people-relationships-worker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/node-runtime/src/services/people/relationships/worker-entry.ts"],"sourcesContent":["import { parentPort, workerData } from 'node:worker_threads'\nimport type { ContactsTimeRangePreset } from '@openchatlab/shared-types'\nimport { DatabaseManager } from '../../../database-manager'\nimport type { RuntimeIdentity } from '../../../data-dir-compat'\nimport { initAppLogger } from '../../../logging/app-logger'\nimport { StaticPathProvider, type StaticPathProviderSnapshot } from '../../../semantic-index/static-path-provider'\nimport { createDatabaseManagerAdapter } from '../../adapters'\nimport { computePeopleRelationshipsSnapshot, type PeopleRelationshipsComputeProgress } from './compute'\nimport { getPeopleRelationshipsFactsCacheDir } from './paths'\n\ninterface PeopleRelationshipsWorkerStartupOptions {\n paths: StaticPathProviderSnapshot\n runtimeIdentity?: RuntimeIdentity\n nativeBinding?: string\n signature: string\n timeRangePreset?: ContactsTimeRangePreset\n}\n\nasync function main(): Promise<void> {\n if (!parentPort) throw new Error('people relationships worker requires parentPort')\n const options = workerData as PeopleRelationshipsWorkerStartupOptions\n initAppLogger(options.paths.logsDir)\n const pathProvider = new StaticPathProvider(options.paths)\n const dbManager = new DatabaseManager(pathProvider, {\n nativeBinding: options.nativeBinding,\n runtime: options.runtimeIdentity,\n allowMissingRuntimeForTests: !options.runtimeIdentity,\n })\n const adapter = createDatabaseManagerAdapter(dbManager)\n const onProgress = (progress: PeopleRelationshipsComputeProgress) =>\n parentPort?.postMessage({ type: 'progress', progress })\n const snapshot = computePeopleRelationshipsSnapshot({\n adapter,\n signature: options.signature,\n timeRangePreset: options.timeRangePreset,\n factsCacheDir: getPeopleRelationshipsFactsCacheDir(pathProvider.getUserDataDir()),\n onProgress,\n })\n parentPort.postMessage({ type: 'success', snapshot })\n}\n\nmain().catch((error) => {\n parentPort?.postMessage({\n type: 'error',\n error: error instanceof Error ? error.message : String(error),\n })\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AAkBvC,eAAe,OAAsB;AACnC,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,iDAAiD;AAClF,QAAM,UAAU;AAChB,gBAAc,QAAQ,MAAM,OAAO;AACnC,QAAM,eAAe,IAAI,mBAAmB,QAAQ,KAAK;AACzD,QAAM,YAAY,IAAI,gBAAgB,cAAc;AAAA,IAClD,eAAe,QAAQ;AAAA,IACvB,SAAS,QAAQ;AAAA,IACjB,6BAA6B,CAAC,QAAQ;AAAA,EACxC,CAAC;AACD,QAAM,UAAU,6BAA6B,SAAS;AACtD,QAAM,aAAa,CAAC,aAClB,YAAY,YAAY,EAAE,MAAM,YAAY,SAAS,CAAC;AACxD,QAAM,WAAW,mCAAmC;AAAA,IAClD;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,iBAAiB,QAAQ;AAAA,IACzB,eAAe,oCAAoC,aAAa,eAAe,CAAC;AAAA,IAChF;AAAA,EACF,CAAC;AACD,aAAW,YAAY,EAAE,MAAM,WAAW,SAAS,CAAC;AACtD;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,cAAY,YAAY;AAAA,IACtB,MAAM;AAAA,IACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,EAC9D,CAAC;AACH,CAAC;","names":[]}
@@ -9,7 +9,7 @@ const __dirname = __pathDirname(__filename);
9
9
  import { parentPort, workerData } from "worker_threads";
10
10
  var startup = workerData;
11
11
  async function main() {
12
- const { createSemanticIndexWorkerRuntime, createSemanticIndexWorkerServiceFactory } = await import("./worker-runtime-YDYS2C6T.mjs");
12
+ const { createSemanticIndexWorkerRuntime, createSemanticIndexWorkerServiceFactory } = await import("./worker-runtime-63RYMGZI.mjs");
13
13
  const runtime = createSemanticIndexWorkerRuntime({
14
14
  serviceFactory: createSemanticIndexWorkerServiceFactory(startup)
15
15
  });
@@ -18,9 +18,7 @@ import {
18
18
  createNodeDataDirSwitch,
19
19
  createPendingDataDirMigration,
20
20
  createSemanticIndexWorkerRuntimeClient,
21
- getDbFileVersion,
22
21
  getDefaultNodeUserDataDir,
23
- getOrComputeAnalysisCache,
24
22
  getPendingNodeDataDirMigration,
25
23
  getSystemLogsDir,
26
24
  hasPendingElectronDataWarning,
@@ -30,28 +28,21 @@ import {
30
28
  runPendingDataDirMigration,
31
29
  semantic_index_exports,
32
30
  serializeChatLabToJsonl
33
- } from "./chunk-YBS3YQB6.mjs";
31
+ } from "./chunk-P3ZOLTGS.mjs";
34
32
  import {
35
33
  AIChatManager,
36
34
  AgentEventHandler,
37
- AiLogger,
38
35
  ArchiveImportError,
39
36
  ArchiveImportSourceManager,
40
37
  AssistantManager,
41
38
  BUILTIN_DESENSITIZE_RULES,
42
- BetterSqliteAdapter,
43
- CACHE_KEY_MEMBERS,
44
- CACHE_KEY_OVERVIEW,
45
39
  CHART_CAPABILITY_ANALYSIS_TOOLS,
46
40
  CHART_CAPABILITY_CORE_TOOLS,
47
- CHART_CAPABILITY_SKILL_ID,
48
41
  CHART_SCHEMA_REQUIRED_MESSAGE,
49
42
  CustomModelStore,
50
43
  CustomProviderStore,
51
44
  DEFAULT_MAX_TOOL_ROUNDS,
52
45
  DESENSITIZE_RULES_SCHEMA_VERSION,
53
- DataDirCompatibilityError,
54
- DatabaseManager,
55
46
  GoogleChatTakeoutResolver,
56
47
  LLMConfigStore,
57
48
  LogLevel,
@@ -71,11 +62,8 @@ import {
71
62
  analyzeIncrementalImport,
72
63
  analyzeNewImport,
73
64
  anonymizeMessageNames,
74
- appLogger,
75
65
  applyDesensitizeRuleOverrides,
76
66
  applyPreprocessingPipeline,
77
- assertDataDirCompatible,
78
- batchSegmentWithFrequency,
79
67
  buildFtsIndex,
80
68
  buildPiModel,
81
69
  buildPlanGuidance,
@@ -85,12 +73,9 @@ import {
85
73
  checkAndCompress,
86
74
  checkSessionsCanGenerateSummary,
87
75
  cleanupTempDatabases,
88
- clearJiebaInstance,
89
- collectPosTagStats,
90
76
  completeSimple,
91
- computeAndSetMembersCache,
92
- computeAndSetOverviewCache,
93
77
  computeWordFrequency,
78
+ contacts_exports,
94
79
  countMessagesTokens,
95
80
  countTokens,
96
81
  createActivateSkillTool,
@@ -98,17 +83,18 @@ import {
98
83
  createAnalysisPlanner,
99
84
  createChartSchemaGateState,
100
85
  createCompressionLlmAdapter,
86
+ createContactsService,
101
87
  createDataSnapshotFromOverview,
102
- createDatabaseManagerAdapter,
103
88
  createFtsTable,
104
89
  createLlmRouteDecider,
90
+ createPeopleRelationshipsService,
105
91
  createPlanContentBlock,
106
92
  createSemanticIndexService,
107
93
  decideRequestRoute,
108
94
  defaultSemanticIndexConfig,
109
95
  deleteDict,
110
- deleteSessionCache,
111
96
  deleteTempDatabase,
97
+ desensitizeText,
112
98
  downloadDict,
113
99
  ensureDefaultDict,
114
100
  estimateTokensFromText,
@@ -116,8 +102,6 @@ import {
116
102
  exportSessionToJson,
117
103
  exportWithFormat,
118
104
  export_service_exports,
119
- extractErrorInfo,
120
- extractErrorStack,
121
105
  extractSkillId,
122
106
  fetchRemoteModels,
123
107
  filterValidMessages,
@@ -128,31 +112,21 @@ import {
128
112
  generateSessionSummaries,
129
113
  generateSessionSummary,
130
114
  getAllowedBuiltinToolsForChartAutoSkill,
131
- getCache,
132
- getCachePath,
133
115
  getChartCapabilityAllowedBuiltinTools,
134
116
  getChartCapabilitySkill,
135
117
  getChartPlannerCapabilityForMessage,
136
- getChatDbMigrations,
137
118
  getCurrentLogFile,
138
119
  getDefaultRulesForLocale,
139
120
  getDictList,
140
121
  getErrorCount,
141
- getJieba,
142
- getNlpDir,
143
- getPosTagDefinitions,
144
122
  getRuleGroupsForLocale,
145
123
  getSkillConfigWithBuiltinChart,
146
- getValidatedOverviewCache,
147
124
  hasFtsTable,
148
125
  i18nTexts,
149
126
  incrementalImport,
150
- initAppLogger,
151
- initNlpDir,
152
127
  initPerfLog,
153
128
  initTokenizer,
154
129
  insertFtsEntries,
155
- invalidateCache,
156
130
  isChineseLocale,
157
131
  isDictDownloaded,
158
132
  isSemanticIndexConfigured,
@@ -164,34 +138,30 @@ import {
164
138
  logPerfDetail,
165
139
  logSummary,
166
140
  manualCompress,
141
+ matchesBlacklist,
167
142
  member_service_exports,
168
143
  mergeRulesForLocale,
169
- migrateFromElectronIfNeeded,
170
144
  normalizeAnthropicBaseUrl,
171
145
  normalizeOpenAICompatibleBaseUrl,
172
- openBetterSqliteDatabase,
173
146
  owner_profile_service_exports,
174
147
  parseAssistantFile,
175
148
  parseSkillFile,
176
149
  persistSemanticIndexConfig,
177
150
  preprocessMessages,
151
+ preprocessMessagesWithStats,
178
152
  pushImport,
179
- raiseChatDbCompatibilityGate,
180
- raiseDataDirMinRuntimeVersion,
181
- readDataDirCompatibilityMeta,
182
153
  rebuildFtsIndex,
154
+ relationships_exports,
183
155
  resetPerfLog,
184
156
  resolveChartRuntimeForRequest,
185
157
  resolveSemanticIndexApiKeySet,
186
158
  runAgentCore,
187
159
  runSimpleLlmStream,
188
160
  searchByFts,
189
- segment,
190
161
  segmentText,
191
162
  serializeAssistant,
192
163
  session_index_service_exports,
193
164
  session_service_exports,
194
- setCache,
195
165
  shouldOfferChartCapabilityForAnalyticalMessage,
196
166
  shouldUseChartCapabilityForMessage,
197
167
  splitIntoSegments,
@@ -200,16 +170,61 @@ import {
200
170
  streamingImport,
201
171
  summary_service_exports,
202
172
  t,
203
- tokenizeForFts,
204
- tokenizeQueryForFts,
205
173
  truncateFormattedMessages,
206
174
  validateApiKey,
207
175
  validateArchiveEntryName,
208
- verifyCliDataPath,
209
- wasElectronUsed,
210
176
  wrapWithChartSchemaGate,
211
177
  writeParseResultToDb
212
- } from "./chunk-ZVDOFWL7.mjs";
178
+ } from "./chunk-A2SANKG4.mjs";
179
+ import {
180
+ CONTACTS_ALGORITHM_VERSION
181
+ } from "./chunk-CNSYXRJP.mjs";
182
+ import {
183
+ PEOPLE_RELATIONSHIPS_ALGORITHM_VERSION
184
+ } from "./chunk-MUPILWAZ.mjs";
185
+ import {
186
+ AiLogger,
187
+ BetterSqliteAdapter,
188
+ CACHE_KEY_MEMBERS,
189
+ CACHE_KEY_OVERVIEW,
190
+ CHART_CAPABILITY_SKILL_ID,
191
+ DataDirCompatibilityError,
192
+ DatabaseManager,
193
+ appLogger,
194
+ assertDataDirCompatible,
195
+ batchSegmentWithFrequency,
196
+ clearJiebaInstance,
197
+ collectPosTagStats,
198
+ computeAndSetMembersCache,
199
+ computeAndSetOverviewCache,
200
+ createDatabaseManagerAdapter,
201
+ deleteSessionCache,
202
+ extractErrorInfo,
203
+ extractErrorStack,
204
+ getCache,
205
+ getCachePath,
206
+ getChatDbMigrations,
207
+ getDbFileVersion,
208
+ getJieba,
209
+ getNlpDir,
210
+ getOrComputeAnalysisCache,
211
+ getPosTagDefinitions,
212
+ getValidatedOverviewCache,
213
+ initAppLogger,
214
+ initNlpDir,
215
+ invalidateCache,
216
+ migrateFromElectronIfNeeded,
217
+ openBetterSqliteDatabase,
218
+ raiseChatDbCompatibilityGate,
219
+ raiseDataDirMinRuntimeVersion,
220
+ readDataDirCompatibilityMeta,
221
+ segment,
222
+ setCache,
223
+ tokenizeForFts,
224
+ tokenizeQueryForFts,
225
+ verifyCliDataPath,
226
+ wasElectronUsed
227
+ } from "./chunk-7BZLS2KW.mjs";
213
228
  import "./chunk-GFHSSCCR.mjs";
214
229
  export {
215
230
  AIChatManager,
@@ -227,6 +242,7 @@ export {
227
242
  CHART_CAPABILITY_CORE_TOOLS,
228
243
  CHART_CAPABILITY_SKILL_ID,
229
244
  CHART_SCHEMA_REQUIRED_MESSAGE,
245
+ CONTACTS_ALGORITHM_VERSION,
230
246
  CustomModelStore,
231
247
  CustomProviderStore,
232
248
  DEFAULT_MAX_TOOL_ROUNDS,
@@ -239,6 +255,7 @@ export {
239
255
  MAX_CONFIG_COUNT,
240
256
  MergeSessionCache,
241
257
  NodePathProvider,
258
+ PEOPLE_RELATIONSHIPS_ALGORITHM_VERSION,
242
259
  PreferencesManager,
243
260
  SEMANTIC_INDEX_CONFIG_FILE,
244
261
  SemanticIndexConfigStore,
@@ -279,6 +296,7 @@ export {
279
296
  computeAndSetMembersCache,
280
297
  computeAndSetOverviewCache,
281
298
  computeWordFrequency,
299
+ contacts_exports as contactsService,
282
300
  copyDirMerge as copyDataDirMerge,
283
301
  countMessagesTokens,
284
302
  countTokens,
@@ -287,6 +305,7 @@ export {
287
305
  createAnalysisPlanner,
288
306
  createChartSchemaGateState,
289
307
  createCompressionLlmAdapter,
308
+ createContactsService,
290
309
  createDataSnapshotFromOverview,
291
310
  createDatabaseManagerAdapter,
292
311
  createFtsTable,
@@ -294,6 +313,7 @@ export {
294
313
  createLlmRouteDecider,
295
314
  createNodeDataDirSwitch,
296
315
  createPendingDataDirMigration,
316
+ createPeopleRelationshipsService,
297
317
  createPlanContentBlock,
298
318
  createSemanticIndexService,
299
319
  createSemanticIndexWorkerRuntimeClient,
@@ -302,6 +322,7 @@ export {
302
322
  deleteDict,
303
323
  deleteSessionCache,
304
324
  deleteTempDatabase,
325
+ desensitizeText,
305
326
  downloadDict,
306
327
  ensureDefaultDict,
307
328
  estimateTokensFromText,
@@ -367,6 +388,7 @@ export {
367
388
  logPerfDetail,
368
389
  logSummary,
369
390
  manualCompress,
391
+ matchesBlacklist,
370
392
  member_service_exports as memberService,
371
393
  mergeRulesForLocale,
372
394
  migrateFromElectronIfNeeded,
@@ -376,8 +398,10 @@ export {
376
398
  owner_profile_service_exports as ownerProfileService,
377
399
  parseAssistantFile,
378
400
  parseSkillFile,
401
+ relationships_exports as peopleRelationshipsService,
379
402
  persistSemanticIndexConfig,
380
403
  preprocessMessages,
404
+ preprocessMessagesWithStats,
381
405
  pushImport,
382
406
  raiseChatDbCompatibilityGate,
383
407
  raiseDataDirMinRuntimeVersion,
@@ -416,4 +440,4 @@ export {
416
440
  wrapWithChartSchemaGate,
417
441
  writeParseResultToDb
418
442
  };
419
- //# sourceMappingURL=src-36ZIR65K.mjs.map
443
+ //# sourceMappingURL=src-Y7MDRXLJ.mjs.map
@@ -9,8 +9,8 @@ import {
9
9
  analyzeNewImport,
10
10
  incrementalImport,
11
11
  streamImport
12
- } from "./chunk-T7IETWHN.mjs";
13
- import "./chunk-YBS3YQB6.mjs";
12
+ } from "./chunk-FCCL5Z4W.mjs";
13
+ import "./chunk-P3ZOLTGS.mjs";
14
14
  import {
15
15
  detectAllFormats,
16
16
  detectFormat,
@@ -18,7 +18,10 @@ import {
18
18
  getFormatFeatureById,
19
19
  getSupportedFormats,
20
20
  scanMultiChatFile
21
- } from "./chunk-ZVDOFWL7.mjs";
21
+ } from "./chunk-A2SANKG4.mjs";
22
+ import "./chunk-CNSYXRJP.mjs";
23
+ import "./chunk-MUPILWAZ.mjs";
24
+ import "./chunk-7BZLS2KW.mjs";
22
25
  import "./chunk-GFHSSCCR.mjs";
23
26
  export {
24
27
  analyzeIncrementalImport,
@@ -32,4 +35,4 @@ export {
32
35
  scanMultiChatFile,
33
36
  streamImport
34
37
  };
35
- //# sourceMappingURL=stream-import-YZMZ56B5.mjs.map
38
+ //# sourceMappingURL=stream-import-3JMXQD7P.mjs.map