chatlab-cli 0.27.0 → 0.27.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 (65) hide show
  1. package/dist/{chat-command-SKGPS3PG.mjs → chat-command-B7POB3C3.mjs} +5 -4
  2. package/dist/{chat-command-SKGPS3PG.mjs.map → chat-command-B7POB3C3.mjs.map} +1 -1
  3. package/dist/{chunk-MJITS5CE.mjs → chunk-3FUF3PEY.mjs} +15 -13
  4. package/dist/{chunk-MJITS5CE.mjs.map → chunk-3FUF3PEY.mjs.map} +1 -1
  5. package/dist/{chunk-FHLPXRDL.mjs → chunk-3JNVGW62.mjs} +2 -2
  6. package/dist/{chunk-KCFVHVO4.mjs → chunk-I7BHOZPX.mjs} +11202 -17966
  7. package/dist/chunk-I7BHOZPX.mjs.map +1 -0
  8. package/dist/chunk-N3G43SCQ.mjs +7337 -0
  9. package/dist/chunk-N3G43SCQ.mjs.map +1 -0
  10. package/dist/{chunk-7LPVQR77.mjs → chunk-RJ4D4QWK.mjs} +4 -4
  11. package/dist/chunk-RJ4D4QWK.mjs.map +1 -0
  12. package/dist/{chunk-6FXGC6HE.mjs → chunk-SAE2H2LN.mjs} +7 -5
  13. package/dist/{chunk-6FXGC6HE.mjs.map → chunk-SAE2H2LN.mjs.map} +1 -1
  14. package/dist/{chunk-3HOTLLFC.mjs → chunk-SIVERPF5.mjs} +215 -130
  15. package/dist/chunk-SIVERPF5.mjs.map +1 -0
  16. package/dist/{chunk-M6ABWESL.mjs → chunk-WQMKKUSD.mjs} +5 -5
  17. package/dist/chunk-WQMKKUSD.mjs.map +1 -0
  18. package/dist/{chunk-UBJHT3BU.mjs → chunk-YUFYTDRH.mjs} +6 -4
  19. package/dist/{chunk-UBJHT3BU.mjs.map → chunk-YUFYTDRH.mjs.map} +1 -1
  20. package/dist/cli.mjs +4 -3
  21. package/dist/{http-CPFUTIUB.mjs → http-A54ZBBAY.mjs} +9 -8
  22. package/dist/{import-UJXKIKYN.mjs → import-EA3TB3S2.mjs} +5 -4
  23. package/dist/index.mjs +9 -8
  24. package/dist/{mcp-SW4DTCWJ.mjs → mcp-DJDOWHH3.mjs} +8 -6
  25. package/dist/{mcp-SW4DTCWJ.mjs.map → mcp-DJDOWHH3.mjs.map} +1 -1
  26. package/dist/semantic-index-worker.mjs +34 -0
  27. package/dist/semantic-index-worker.mjs.map +1 -0
  28. package/dist/{src-M3MO3LEL.mjs → src-EKPMJRG6.mjs} +57 -41
  29. package/dist/{stream-import-4VDJZHMY.mjs → stream-import-FQFNRQ2B.mjs} +4 -3
  30. package/dist/worker-runtime-UH2OBO3T.mjs +71 -0
  31. package/dist/worker-runtime-UH2OBO3T.mjs.map +1 -0
  32. package/dist-web/assets/{DebugToolsPanel-DzZmSzIU.css → DebugToolsPanel-DFw6_G5V.css} +1 -1
  33. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-NL1sTF6i.js +110 -0
  34. package/dist-web/assets/{MessageExportModal-DCB-mzf2.js → MessageExportModal-B60rvfCh.js} +1 -1
  35. package/dist-web/assets/{electron-DDUv0ohD.js → electron-BRUg9LnY.js} +1 -1
  36. package/dist-web/assets/{fetch-C1aC5Fd1.js → fetch-BIpjJHxj.js} +1 -1
  37. package/dist-web/assets/{fetch-D8Ng59an.js → fetch-BRsMdFcn.js} +1 -1
  38. package/dist-web/assets/{fetch-Ckang-F8.js → fetch-C-m3IysH.js} +1 -1
  39. package/dist-web/assets/{fetch-Ck4rGxkO.js → fetch-Cma-mZjd.js} +1 -1
  40. package/dist-web/assets/{fetch-Bry8iJpq.js → fetch-DE8gj5Ke.js} +1 -1
  41. package/dist-web/assets/{fetch-C69hj3wS.js → fetch-DLAp7h55.js} +1 -1
  42. package/dist-web/assets/{fetch-B9Oy0bcD.js → fetch-DNSaxRnL.js} +1 -1
  43. package/dist-web/assets/{fetch-B3gsbY_U.js → fetch-DOEbyLSD.js} +1 -1
  44. package/dist-web/assets/{fetch-CwHncc6x.js → fetch-DSN-QYZE.js} +1 -1
  45. package/dist-web/assets/{fetch-DOtBAxUS.js → fetch-woAa3H2L.js} +1 -1
  46. package/dist-web/assets/{index-C16V6EoP.js → index-B3mDjury.js} +9 -9
  47. package/dist-web/assets/{index-D-J8dY7w.js → index-B9I-Y3fR.js} +1 -1
  48. package/dist-web/assets/index-GAU7LI1r.js +173 -0
  49. package/dist-web/assets/{index-zAi37ZQ4.js → index-iwqJDVMJ.js} +2 -2
  50. package/dist-web/assets/{index-BfFj8Evo.js → index-o6veAyTB.js} +3 -3
  51. package/dist-web/assets/{index-Bd9j73nw.js → index-r_zHR2t9.js} +1 -1
  52. package/dist-web/assets/{web-DKFeBb_F.js → web-C2UtGskd.js} +1 -1
  53. package/dist-web/index.html +1 -1
  54. package/package.json +1 -1
  55. package/dist/chunk-3HOTLLFC.mjs.map +0 -1
  56. package/dist/chunk-7LPVQR77.mjs.map +0 -1
  57. package/dist/chunk-KCFVHVO4.mjs.map +0 -1
  58. package/dist/chunk-M6ABWESL.mjs.map +0 -1
  59. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-C8mwzxDa.js +0 -110
  60. package/dist-web/assets/index-B40SKtW8.js +0 -173
  61. /package/dist/{chunk-FHLPXRDL.mjs.map → chunk-3JNVGW62.mjs.map} +0 -0
  62. /package/dist/{http-CPFUTIUB.mjs.map → http-A54ZBBAY.mjs.map} +0 -0
  63. /package/dist/{import-UJXKIKYN.mjs.map → import-EA3TB3S2.mjs.map} +0 -0
  64. /package/dist/{src-M3MO3LEL.mjs.map → src-EKPMJRG6.mjs.map} +0 -0
  65. /package/dist/{stream-import-4VDJZHMY.mjs.map → stream-import-FQFNRQ2B.mjs.map} +0 -0
@@ -9,15 +9,16 @@ import {
9
9
  registerWebRoutes,
10
10
  startHttpServer,
11
11
  stopHttpServer
12
- } from "./chunk-3HOTLLFC.mjs";
13
- import "./chunk-7LPVQR77.mjs";
14
- import "./chunk-UBJHT3BU.mjs";
15
- import "./chunk-6FXGC6HE.mjs";
16
- import "./chunk-M6ABWESL.mjs";
17
- import "./chunk-FHLPXRDL.mjs";
12
+ } from "./chunk-SIVERPF5.mjs";
13
+ import "./chunk-RJ4D4QWK.mjs";
14
+ import "./chunk-WQMKKUSD.mjs";
15
+ import "./chunk-3JNVGW62.mjs";
18
16
  import "./chunk-5ADKYYNA.mjs";
19
17
  import "./chunk-FJ35V3TE.mjs";
20
- import "./chunk-KCFVHVO4.mjs";
18
+ import "./chunk-YUFYTDRH.mjs";
19
+ import "./chunk-SAE2H2LN.mjs";
20
+ import "./chunk-N3G43SCQ.mjs";
21
+ import "./chunk-I7BHOZPX.mjs";
21
22
  import "./chunk-GFHSSCCR.mjs";
22
23
  export {
23
24
  createServer,
@@ -25,4 +26,4 @@ export {
25
26
  startHttpServer,
26
27
  stopHttpServer
27
28
  };
28
- //# sourceMappingURL=http-CPFUTIUB.mjs.map
29
+ //# sourceMappingURL=http-A54ZBBAY.mjs.map
@@ -8,13 +8,13 @@ import {
8
8
  detectFormat as detectFormat2,
9
9
  importData,
10
10
  parseFile
11
- } from "./chunk-UBJHT3BU.mjs";
11
+ } from "./chunk-YUFYTDRH.mjs";
12
12
  import {
13
13
  analyzeIncrementalImport,
14
14
  analyzeNewImport,
15
15
  incrementalImport,
16
16
  streamImport
17
- } from "./chunk-6FXGC6HE.mjs";
17
+ } from "./chunk-SAE2H2LN.mjs";
18
18
  import {
19
19
  detectAllFormats,
20
20
  detectFormat,
@@ -22,7 +22,8 @@ import {
22
22
  getFormatFeatureById,
23
23
  getSupportedFormats,
24
24
  scanMultiChatFile
25
- } from "./chunk-KCFVHVO4.mjs";
25
+ } from "./chunk-N3G43SCQ.mjs";
26
+ import "./chunk-I7BHOZPX.mjs";
26
27
  import "./chunk-GFHSSCCR.mjs";
27
28
  export {
28
29
  analyzeIncrementalImport,
@@ -39,4 +40,4 @@ export {
39
40
  scanMultiChatFile,
40
41
  streamImport
41
42
  };
42
- //# sourceMappingURL=import-UJXKIKYN.mjs.map
43
+ //# sourceMappingURL=import-EA3TB3S2.mjs.map
package/dist/index.mjs CHANGED
@@ -7,18 +7,19 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  startHttpServer,
9
9
  stopHttpServer
10
- } from "./chunk-3HOTLLFC.mjs";
11
- import "./chunk-7LPVQR77.mjs";
10
+ } from "./chunk-SIVERPF5.mjs";
11
+ import "./chunk-RJ4D4QWK.mjs";
12
+ import "./chunk-WQMKKUSD.mjs";
12
13
  import {
13
14
  run
14
- } from "./chunk-MJITS5CE.mjs";
15
- import "./chunk-UBJHT3BU.mjs";
16
- import "./chunk-6FXGC6HE.mjs";
17
- import "./chunk-M6ABWESL.mjs";
18
- import "./chunk-FHLPXRDL.mjs";
15
+ } from "./chunk-3FUF3PEY.mjs";
16
+ import "./chunk-3JNVGW62.mjs";
19
17
  import "./chunk-5ADKYYNA.mjs";
20
18
  import "./chunk-FJ35V3TE.mjs";
21
- import "./chunk-KCFVHVO4.mjs";
19
+ import "./chunk-YUFYTDRH.mjs";
20
+ import "./chunk-SAE2H2LN.mjs";
21
+ import "./chunk-N3G43SCQ.mjs";
22
+ import "./chunk-I7BHOZPX.mjs";
22
23
  import "./chunk-GFHSSCCR.mjs";
23
24
  export {
24
25
  run,
@@ -7,10 +7,10 @@ const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  CoreDataProvider,
9
9
  MCP_TOOL_REGISTRY
10
- } from "./chunk-M6ABWESL.mjs";
10
+ } from "./chunk-WQMKKUSD.mjs";
11
11
  import {
12
12
  assertCliDataDirCompatible
13
- } from "./chunk-FHLPXRDL.mjs";
13
+ } from "./chunk-3JNVGW62.mjs";
14
14
  import {
15
15
  getVersion
16
16
  } from "./chunk-5ADKYYNA.mjs";
@@ -18,15 +18,17 @@ import {
18
18
  resolveCliPath
19
19
  } from "./chunk-FJ35V3TE.mjs";
20
20
  import {
21
- DatabaseManager,
22
21
  NodePathProvider,
22
+ hasPendingElectronDataWarning
23
+ } from "./chunk-N3G43SCQ.mjs";
24
+ import {
25
+ DatabaseManager,
23
26
  getDatabaseSchema,
24
27
  getSessionMeta,
25
28
  getSessionOverview,
26
- hasPendingElectronDataWarning,
27
29
  loadConfig,
28
30
  verifyCliDataPath
29
- } from "./chunk-KCFVHVO4.mjs";
31
+ } from "./chunk-I7BHOZPX.mjs";
30
32
  import "./chunk-GFHSSCCR.mjs";
31
33
 
32
34
  // src/mcp.ts
@@ -410,4 +412,4 @@ export {
410
412
  initMcpRuntime,
411
413
  startCliMcpServer
412
414
  };
413
- //# sourceMappingURL=mcp-SW4DTCWJ.mjs.map
415
+ //# sourceMappingURL=mcp-DJDOWHH3.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,34 @@
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
+
8
+ // ../../packages/node-runtime/src/semantic-index/worker-thread-entry.ts
9
+ import { parentPort, workerData } from "worker_threads";
10
+ var startup = workerData;
11
+ async function main() {
12
+ const { createSemanticIndexWorkerRuntime, createSemanticIndexWorkerServiceFactory } = await import("./worker-runtime-UH2OBO3T.mjs");
13
+ const runtime = createSemanticIndexWorkerRuntime({
14
+ serviceFactory: createSemanticIndexWorkerServiceFactory(startup)
15
+ });
16
+ parentPort?.on("message", async (message) => {
17
+ const payload = message;
18
+ try {
19
+ const result = await runtime.handleRequest(payload.method, payload.args ?? []);
20
+ parentPort?.postMessage({ id: payload.id, success: true, result });
21
+ } catch (error) {
22
+ parentPort?.postMessage({
23
+ id: payload.id,
24
+ success: false,
25
+ error: error instanceof Error ? error.message : String(error)
26
+ });
27
+ }
28
+ });
29
+ }
30
+ void main().catch((error) => {
31
+ console.error("[semantic-index] worker failed to start:", error instanceof Error ? error.message : String(error));
32
+ throw error;
33
+ });
34
+ //# sourceMappingURL=semantic-index-worker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/node-runtime/src/semantic-index/worker-thread-entry.ts"],"sourcesContent":["import { parentPort, workerData } from 'node:worker_threads'\nimport type { SemanticIndexWorkerStartupOptions } from './worker-runtime'\n\nconst startup = workerData as SemanticIndexWorkerStartupOptions\n\nasync function main(): Promise<void> {\n const { createSemanticIndexWorkerRuntime, createSemanticIndexWorkerServiceFactory } =\n (await import('./worker-runtime.js')) as typeof import('./worker-runtime')\n const runtime = createSemanticIndexWorkerRuntime({\n serviceFactory: createSemanticIndexWorkerServiceFactory(startup),\n })\n\n parentPort?.on('message', async (message) => {\n const payload = message as { id: string; method: string; args?: unknown[] }\n try {\n const result = await runtime.handleRequest(payload.method, payload.args ?? [])\n parentPort?.postMessage({ id: payload.id, success: true, result })\n } catch (error) {\n parentPort?.postMessage({\n id: payload.id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n })\n}\n\nvoid main().catch((error) => {\n console.error('[semantic-index] worker failed to start:', error instanceof Error ? error.message : String(error))\n throw error\n})\n"],"mappings":";;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AAGvC,IAAM,UAAU;AAEhB,eAAe,OAAsB;AACnC,QAAM,EAAE,kCAAkC,wCAAwC,IAC/E,MAAM,OAAO,+BAAqB;AACrC,QAAM,UAAU,iCAAiC;AAAA,IAC/C,gBAAgB,wCAAwC,OAAO;AAAA,EACjE,CAAC;AAED,cAAY,GAAG,WAAW,OAAO,YAAY;AAC3C,UAAM,UAAU;AAChB,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,cAAc,QAAQ,QAAQ,QAAQ,QAAQ,CAAC,CAAC;AAC7E,kBAAY,YAAY,EAAE,IAAI,QAAQ,IAAI,SAAS,MAAM,OAAO,CAAC;AAAA,IACnE,SAAS,OAAO;AACd,kBAAY,YAAY;AAAA,QACtB,IAAI,QAAQ;AAAA,QACZ,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,KAAK,KAAK,EAAE,MAAM,CAAC,UAAU;AAC3B,UAAQ,MAAM,4CAA4C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChH,QAAM;AACR,CAAC;","names":[]}
@@ -4,6 +4,47 @@ import { fileURLToPath as __fileURLToPath } from 'url';
4
4
  const require = __createRequire(import.meta.url);
5
5
  const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
+ import {
8
+ LogLevel,
9
+ NodePathProvider,
10
+ PreferencesManager,
11
+ analyzeIncrementalImport,
12
+ analyzeNewImport,
13
+ applyPendingNodeDataDirMigration,
14
+ applyPendingNodeDataDirMigrationIfNeeded,
15
+ buildMergedOutput,
16
+ checkConflictsFromSources,
17
+ clearPendingNodeDataDirMigration,
18
+ copyDirMerge,
19
+ createJiebaNlpProvider,
20
+ createNodeDataDirSwitch,
21
+ createPendingDataDirMigration,
22
+ createSemanticIndexWorkerRuntimeClient,
23
+ getCurrentLogFile,
24
+ getDbFileVersion,
25
+ getDefaultNodeUserDataDir,
26
+ getErrorCount,
27
+ getOrComputeAnalysisCache,
28
+ getPendingNodeDataDirMigration,
29
+ hasPendingElectronDataWarning,
30
+ incrementalImport,
31
+ initPerfLog,
32
+ isDirectoryEmptyOrMissing,
33
+ isExistingUserDataDir,
34
+ isUserDataDirSafeToUse,
35
+ logError,
36
+ logInfo,
37
+ logPerf,
38
+ logPerfDetail,
39
+ logSummary,
40
+ resetPerfLog,
41
+ runPendingDataDirMigration,
42
+ semantic_index_exports,
43
+ serializeChatLabToJsonl,
44
+ streamParseFileInfo,
45
+ streamingImport,
46
+ writeParseResultToDb
47
+ } from "./chunk-N3G43SCQ.mjs";
7
48
  import {
8
49
  AIChatManager,
9
50
  AgentEventHandler,
@@ -24,11 +65,10 @@ import {
24
65
  DataDirCompatibilityError,
25
66
  DatabaseManager,
26
67
  LLMConfigStore,
27
- LogLevel,
28
68
  MAX_CONFIG_COUNT,
29
69
  MergeSessionCache,
30
- NodePathProvider,
31
- PreferencesManager,
70
+ SEMANTIC_INDEX_CONFIG_FILE,
71
+ SemanticIndexConfigStore,
32
72
  SemanticIndexService,
33
73
  SkillManager,
34
74
  SkillManagerCore,
@@ -37,34 +77,26 @@ import {
37
77
  TempDbWriter,
38
78
  Type,
39
79
  aiLocales,
40
- analyzeIncrementalImport,
41
- analyzeNewImport,
42
80
  anonymizeMessageNames,
43
81
  applyDesensitizeRuleOverrides,
44
- applyPendingNodeDataDirMigration,
45
- applyPendingNodeDataDirMigrationIfNeeded,
46
82
  applyPreprocessingPipeline,
47
83
  assertDataDirCompatible,
48
84
  batchSegmentWithFrequency,
49
85
  buildFtsIndex,
50
- buildMergedOutput,
51
86
  buildPiModel,
52
87
  buildPlanGuidance,
53
88
  buildSemanticSearchGuidance,
54
89
  buildSkillMenuWithBuiltinChart,
55
90
  buildSystemPrompt,
56
91
  checkAndCompress,
57
- checkConflictsFromSources,
58
92
  checkSessionsCanGenerateSummary,
59
93
  cleanupTempDatabases,
60
94
  clearJiebaInstance,
61
- clearPendingNodeDataDirMigration,
62
95
  collectPosTagStats,
63
96
  completeSimple,
64
97
  computeAndSetMembersCache,
65
98
  computeAndSetOverviewCache,
66
99
  computeWordFrequency,
67
- copyDirMerge,
68
100
  countMessagesTokens,
69
101
  countTokens,
70
102
  createActivateSkillTool,
@@ -75,13 +107,11 @@ import {
75
107
  createDataSnapshotFromOverview,
76
108
  createDatabaseManagerAdapter,
77
109
  createFtsTable,
78
- createJiebaNlpProvider,
79
110
  createLlmRouteDecider,
80
- createNodeDataDirSwitch,
81
- createPendingDataDirMigration,
82
111
  createPlanContentBlock,
83
112
  createSemanticIndexService,
84
113
  decideRequestRoute,
114
+ defaultSemanticIndexConfig,
85
115
  deleteDict,
86
116
  deleteSessionCache,
87
117
  deleteTempDatabase,
@@ -110,41 +140,25 @@ import {
110
140
  getChartCapabilitySkill,
111
141
  getChartPlannerCapabilityForMessage,
112
142
  getChatDbMigrations,
113
- getCurrentLogFile,
114
- getDbFileVersion,
115
- getDefaultNodeUserDataDir,
116
143
  getDefaultRulesForLocale,
117
144
  getDictList,
118
- getErrorCount,
119
145
  getJieba,
120
146
  getNlpDir,
121
- getOrComputeAnalysisCache,
122
- getPendingNodeDataDirMigration,
123
147
  getPosTagDefinitions,
124
148
  getRuleGroupsForLocale,
125
149
  getSkillConfigWithBuiltinChart,
126
150
  getValidatedOverviewCache,
127
151
  hasFtsTable,
128
- hasPendingElectronDataWarning,
129
152
  i18nTexts,
130
- incrementalImport,
131
153
  initNlpDir,
132
- initPerfLog,
133
154
  initTokenizer,
134
155
  insertFtsEntries,
135
156
  invalidateCache,
136
157
  isChineseLocale,
137
158
  isDictDownloaded,
138
- isDirectoryEmptyOrMissing,
139
- isExistingUserDataDir,
140
- isUserDataDirSafeToUse,
159
+ isSemanticIndexConfigured,
141
160
  isValidMessage,
142
161
  loadDictBuffer,
143
- logError,
144
- logInfo,
145
- logPerf,
146
- logPerfDetail,
147
- logSummary,
148
162
  manualCompress,
149
163
  member_service_exports,
150
164
  mergeRulesForLocale,
@@ -155,31 +169,27 @@ import {
155
169
  owner_profile_service_exports,
156
170
  parseAssistantFile,
157
171
  parseSkillFile,
172
+ persistSemanticIndexConfig,
158
173
  preprocessMessages,
159
174
  raiseChatDbCompatibilityGate,
160
175
  raiseDataDirMinRuntimeVersion,
161
176
  readDataDirCompatibilityMeta,
162
177
  rebuildFtsIndex,
163
- resetPerfLog,
164
178
  resolveChartRuntimeForRequest,
179
+ resolveSemanticIndexApiKeySet,
165
180
  runAgentCore,
166
- runPendingDataDirMigration,
167
181
  runSimpleLlmStream,
168
182
  searchByFts,
169
183
  segment,
170
184
  segmentText,
171
- semantic_index_exports,
172
185
  serializeAssistant,
173
- serializeChatLabToJsonl,
174
186
  session_index_service_exports,
175
187
  session_service_exports,
176
188
  setCache,
177
189
  shouldOfferChartCapabilityForAnalyticalMessage,
178
190
  shouldUseChartCapabilityForMessage,
179
191
  splitIntoSegments,
180
- streamParseFileInfo,
181
192
  streamSimple,
182
- streamingImport,
183
193
  summary_service_exports,
184
194
  t,
185
195
  tokenizeForFts,
@@ -188,9 +198,8 @@ import {
188
198
  validateApiKey,
189
199
  verifyCliDataPath,
190
200
  wasElectronUsed,
191
- wrapWithChartSchemaGate,
192
- writeParseResultToDb
193
- } from "./chunk-KCFVHVO4.mjs";
201
+ wrapWithChartSchemaGate
202
+ } from "./chunk-I7BHOZPX.mjs";
194
203
  import "./chunk-GFHSSCCR.mjs";
195
204
  export {
196
205
  AIChatManager,
@@ -217,6 +226,8 @@ export {
217
226
  MergeSessionCache,
218
227
  NodePathProvider,
219
228
  PreferencesManager,
229
+ SEMANTIC_INDEX_CONFIG_FILE,
230
+ SemanticIndexConfigStore,
220
231
  SemanticIndexService,
221
232
  SkillManager,
222
233
  SkillManagerCore,
@@ -269,7 +280,9 @@ export {
269
280
  createPendingDataDirMigration,
270
281
  createPlanContentBlock,
271
282
  createSemanticIndexService,
283
+ createSemanticIndexWorkerRuntimeClient,
272
284
  decideRequestRoute,
285
+ defaultSemanticIndexConfig,
273
286
  deleteDict,
274
287
  deleteSessionCache,
275
288
  deleteTempDatabase,
@@ -326,6 +339,7 @@ export {
326
339
  isDictDownloaded,
327
340
  isDirectoryEmptyOrMissing,
328
341
  isExistingUserDataDir,
342
+ isSemanticIndexConfigured,
329
343
  isUserDataDirSafeToUse,
330
344
  isValidMessage,
331
345
  loadDictBuffer,
@@ -344,6 +358,7 @@ export {
344
358
  owner_profile_service_exports as ownerProfileService,
345
359
  parseAssistantFile,
346
360
  parseSkillFile,
361
+ persistSemanticIndexConfig,
347
362
  preprocessMessages,
348
363
  raiseChatDbCompatibilityGate,
349
364
  raiseDataDirMinRuntimeVersion,
@@ -351,6 +366,7 @@ export {
351
366
  rebuildFtsIndex,
352
367
  resetPerfLog,
353
368
  resolveChartRuntimeForRequest,
369
+ resolveSemanticIndexApiKeySet,
354
370
  runAgentCore,
355
371
  runPendingDataDirMigration,
356
372
  runSimpleLlmStream,
@@ -380,4 +396,4 @@ export {
380
396
  wrapWithChartSchemaGate,
381
397
  writeParseResultToDb
382
398
  };
383
- //# sourceMappingURL=src-M3MO3LEL.mjs.map
399
+ //# sourceMappingURL=src-EKPMJRG6.mjs.map
@@ -9,7 +9,7 @@ import {
9
9
  analyzeNewImport,
10
10
  incrementalImport,
11
11
  streamImport
12
- } from "./chunk-6FXGC6HE.mjs";
12
+ } from "./chunk-SAE2H2LN.mjs";
13
13
  import {
14
14
  detectAllFormats,
15
15
  detectFormat,
@@ -17,7 +17,8 @@ import {
17
17
  getFormatFeatureById,
18
18
  getSupportedFormats,
19
19
  scanMultiChatFile
20
- } from "./chunk-KCFVHVO4.mjs";
20
+ } from "./chunk-N3G43SCQ.mjs";
21
+ import "./chunk-I7BHOZPX.mjs";
21
22
  import "./chunk-GFHSSCCR.mjs";
22
23
  export {
23
24
  analyzeIncrementalImport,
@@ -31,4 +32,4 @@ export {
31
32
  scanMultiChatFile,
32
33
  streamImport
33
34
  };
34
- //# sourceMappingURL=stream-import-4VDJZHMY.mjs.map
35
+ //# sourceMappingURL=stream-import-FQFNRQ2B.mjs.map
@@ -0,0 +1,71 @@
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
+ DatabaseManager,
9
+ StaticPathProvider,
10
+ createDatabaseManagerAdapter,
11
+ createSemanticIndexService
12
+ } from "./chunk-I7BHOZPX.mjs";
13
+ import "./chunk-GFHSSCCR.mjs";
14
+
15
+ // ../../packages/node-runtime/src/semantic-index/worker-runtime.ts
16
+ var SemanticIndexWorkerRuntime = class {
17
+ service = null;
18
+ options;
19
+ constructor(options) {
20
+ this.options = options;
21
+ }
22
+ async handleRequest(method, args) {
23
+ if (method === "__close") {
24
+ await this.close();
25
+ return null;
26
+ }
27
+ const service = this.ensureService();
28
+ const target = service;
29
+ const fn = target[method];
30
+ if (typeof fn !== "function") throw new Error(`Unsupported semantic index worker method: ${method}`);
31
+ return await fn.apply(service, args);
32
+ }
33
+ async close() {
34
+ const service = this.service;
35
+ this.service = null;
36
+ await service?.close();
37
+ }
38
+ ensureService() {
39
+ if (!this.service) {
40
+ this.service = this.options.serviceFactory();
41
+ void this.service.recover();
42
+ }
43
+ return this.service;
44
+ }
45
+ };
46
+ function createSemanticIndexWorkerRuntime(options) {
47
+ return new SemanticIndexWorkerRuntime(options);
48
+ }
49
+ function createSemanticIndexWorkerServiceFactory(options) {
50
+ return () => {
51
+ const pathProvider = new StaticPathProvider(options.paths);
52
+ const dbManager = new DatabaseManager(pathProvider, {
53
+ nativeBinding: options.nativeBinding,
54
+ runtime: options.runtime
55
+ });
56
+ const sessionAdapter = createDatabaseManagerAdapter(dbManager);
57
+ const loadSqliteVec = options.sqliteVecLoadablePath ? (db) => db.loadExtension(options.sqliteVecLoadablePath) : void 0;
58
+ return createSemanticIndexService({
59
+ pathProvider,
60
+ sessionAdapter,
61
+ nativeBinding: options.nativeBinding,
62
+ loadSqliteVec
63
+ });
64
+ };
65
+ }
66
+ export {
67
+ SemanticIndexWorkerRuntime,
68
+ createSemanticIndexWorkerRuntime,
69
+ createSemanticIndexWorkerServiceFactory
70
+ };
71
+ //# sourceMappingURL=worker-runtime-UH2OBO3T.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/node-runtime/src/semantic-index/worker-runtime.ts"],"sourcesContent":["import type { RuntimeIdentity } from '../data-dir-compat'\nimport { DatabaseManager } from '../database-manager'\nimport { createDatabaseManagerAdapter } from '../services'\nimport { createSemanticIndexService } from './service'\nimport type { LoadSqliteVec } from './store'\nimport { StaticPathProvider, type StaticPathProviderSnapshot } from './static-path-provider'\nimport type { SemanticIndexRuntime } from './runtime'\n\nexport interface SemanticIndexWorkerStartupOptions {\n paths: StaticPathProviderSnapshot\n runtime: RuntimeIdentity\n nativeBinding?: string\n sqliteVecLoadablePath?: string\n}\n\nexport type SemanticIndexWorkerServiceFactory = () => SemanticIndexRuntime\n\nexport interface SemanticIndexWorkerRuntimeOptions {\n serviceFactory: SemanticIndexWorkerServiceFactory\n}\n\nexport class SemanticIndexWorkerRuntime {\n private service: SemanticIndexRuntime | null = null\n private readonly options: SemanticIndexWorkerRuntimeOptions\n\n constructor(options: SemanticIndexWorkerRuntimeOptions) {\n this.options = options\n }\n\n async handleRequest(method: string, args: unknown[]): Promise<unknown> {\n if (method === '__close') {\n await this.close()\n return null\n }\n const service = this.ensureService()\n const target = service as unknown as Record<string, (...args: unknown[]) => unknown>\n const fn = target[method]\n if (typeof fn !== 'function') throw new Error(`Unsupported semantic index worker method: ${method}`)\n return await fn.apply(service, args)\n }\n\n async close(): Promise<void> {\n const service = this.service\n this.service = null\n await service?.close()\n }\n\n private ensureService(): SemanticIndexRuntime {\n if (!this.service) {\n this.service = this.options.serviceFactory()\n void this.service.recover()\n }\n return this.service\n }\n}\n\nexport function createSemanticIndexWorkerRuntime(\n options: SemanticIndexWorkerRuntimeOptions\n): SemanticIndexWorkerRuntime {\n return new SemanticIndexWorkerRuntime(options)\n}\n\nexport function createSemanticIndexWorkerServiceFactory(\n options: SemanticIndexWorkerStartupOptions\n): SemanticIndexWorkerServiceFactory {\n return () => {\n const pathProvider = new StaticPathProvider(options.paths)\n const dbManager = new DatabaseManager(pathProvider, {\n nativeBinding: options.nativeBinding,\n runtime: options.runtime,\n })\n const sessionAdapter = createDatabaseManagerAdapter(dbManager)\n const loadSqliteVec: LoadSqliteVec | undefined = options.sqliteVecLoadablePath\n ? (db) => db.loadExtension(options.sqliteVecLoadablePath!)\n : undefined\n\n return createSemanticIndexService({\n pathProvider,\n sessionAdapter,\n nativeBinding: options.nativeBinding,\n loadSqliteVec,\n })\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAqBO,IAAM,6BAAN,MAAiC;AAAA,EAC9B,UAAuC;AAAA,EAC9B;AAAA,EAEjB,YAAY,SAA4C;AACtD,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,cAAc,QAAgB,MAAmC;AACrE,QAAI,WAAW,WAAW;AACxB,YAAM,KAAK,MAAM;AACjB,aAAO;AAAA,IACT;AACA,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,SAAS;AACf,UAAM,KAAK,OAAO,MAAM;AACxB,QAAI,OAAO,OAAO,WAAY,OAAM,IAAI,MAAM,6CAA6C,MAAM,EAAE;AACnG,WAAO,MAAM,GAAG,MAAM,SAAS,IAAI;AAAA,EACrC;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,UAAU,KAAK;AACrB,SAAK,UAAU;AACf,UAAM,SAAS,MAAM;AAAA,EACvB;AAAA,EAEQ,gBAAsC;AAC5C,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU,KAAK,QAAQ,eAAe;AAC3C,WAAK,KAAK,QAAQ,QAAQ;AAAA,IAC5B;AACA,WAAO,KAAK;AAAA,EACd;AACF;AAEO,SAAS,iCACd,SAC4B;AAC5B,SAAO,IAAI,2BAA2B,OAAO;AAC/C;AAEO,SAAS,wCACd,SACmC;AACnC,SAAO,MAAM;AACX,UAAM,eAAe,IAAI,mBAAmB,QAAQ,KAAK;AACzD,UAAM,YAAY,IAAI,gBAAgB,cAAc;AAAA,MAClD,eAAe,QAAQ;AAAA,MACvB,SAAS,QAAQ;AAAA,IACnB,CAAC;AACD,UAAM,iBAAiB,6BAA6B,SAAS;AAC7D,UAAM,gBAA2C,QAAQ,wBACrD,CAAC,OAAO,GAAG,cAAc,QAAQ,qBAAsB,IACvD;AAEJ,WAAO,2BAA2B;AAAA,MAChC;AAAA,MACA;AAAA,MACA,eAAe,QAAQ;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}