chatlab-cli 0.24.1 → 0.25.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 (60) hide show
  1. package/dist/{chunk-N5DGZQB4.mjs → chunk-4OMV4VNH.mjs} +567 -97
  2. package/dist/chunk-4OMV4VNH.mjs.map +1 -0
  3. package/dist/{chunk-CIIQ3S2X.mjs → chunk-CIBTUWAE.mjs} +7 -7
  4. package/dist/{chunk-43XWYC3M.mjs → chunk-E65ABM3C.mjs} +168 -72
  5. package/dist/chunk-E65ABM3C.mjs.map +1 -0
  6. package/dist/{chunk-ZL322NVL.mjs → chunk-FSHVDWI2.mjs} +109 -44
  7. package/dist/chunk-FSHVDWI2.mjs.map +1 -0
  8. package/dist/{chunk-QY6P2YS7.mjs → chunk-GNT5G74Z.mjs} +2 -2
  9. package/dist/{chunk-QJI6AOAT.mjs → chunk-TCPXAX3F.mjs} +2 -2
  10. package/dist/cli.mjs +2 -2
  11. package/dist/{http-TPX74BLK.mjs → http-PMNZ42EN.mjs} +6 -6
  12. package/dist/{import-B745DRHD.mjs → import-OP7R4CYY.mjs} +4 -4
  13. package/dist/index.mjs +6 -6
  14. package/dist/{mcp-YWAVG5XW.mjs → mcp-ABXNFUJO.mjs} +3 -3
  15. package/dist/{stream-import-OPALPVWF.mjs → stream-import-L6RJHH4L.mjs} +3 -3
  16. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BUwpIerl.js +161 -0
  17. package/dist-web/assets/{EChartWordcloud-VpNJDurs.js → EChartWordcloud-CzhfrEF_.js} +1 -1
  18. package/dist-web/assets/{MessageExportModal-CSfaY25B.js → MessageExportModal-BAJKWX4y.js} +1 -1
  19. package/dist-web/assets/{electron-BUeXfvxT.js → electron-CZt36wW5.js} +1 -1
  20. package/dist-web/assets/electron-CwERrTWp.js +1 -0
  21. package/dist-web/assets/{fetch-DzNuFdFM.js → fetch-BxFAkm7O.js} +1 -1
  22. package/dist-web/assets/{fetch-BohUj3CQ.js → fetch-CgBIWyAo.js} +1 -1
  23. package/dist-web/assets/{fetch-B2q6973s.js → fetch-D4p9vj1A.js} +1 -1
  24. package/dist-web/assets/{fetch-Ck3tjoLa.js → fetch-DD1EGRKV.js} +1 -1
  25. package/dist-web/assets/{fetch-BtHwWs8A.js → fetch-DO8lty7_.js} +1 -1
  26. package/dist-web/assets/{fetch-BGMRmQx0.js → fetch-DXfZysDf.js} +1 -1
  27. package/dist-web/assets/{fetch-DypPduyQ.js → fetch-GMkMBzBS.js} +1 -1
  28. package/dist-web/assets/{fetch-RDFt3hmp.js → fetch-JzVEwamn.js} +1 -1
  29. package/dist-web/assets/{fetch-CARsBVl0.js → fetch-qoGEVjNg.js} +1 -1
  30. package/dist-web/assets/{fetch-BneHn5qk.js → fetch-yWwp067l.js} +1 -1
  31. package/dist-web/assets/{index-Bvlj3dMn.js → index-BrS_VrIY.js} +1 -1
  32. package/dist-web/assets/index-C1t-kzfo.css +1 -0
  33. package/dist-web/assets/{index-DCWvD-4L.js → index-Cvlw0RLu.js} +2 -2
  34. package/dist-web/assets/index-DABpUm3J.js +9 -0
  35. package/dist-web/assets/{index-C5LrQG3N.js → index-DvWI6Yqa.js} +4 -4
  36. package/dist-web/assets/{index-BvaWRM6_.js → index-O0PG26_v.js} +1 -1
  37. package/dist-web/assets/index-OsjX5hXw.js +173 -0
  38. package/dist-web/assets/vendor-echarts-CITQeskI.js +11 -0
  39. package/dist-web/assets/{vendor-echarts-wordcloud-CZ9gsX8l.js → vendor-echarts-wordcloud-B1kQMklB.js} +1 -1
  40. package/dist-web/assets/{vendor-nuxt-ui-BYU7dz8t.js → vendor-nuxt-ui-C_8CsH6e.js} +1 -1
  41. package/dist-web/assets/{vendor-reka-ui-CnB0mMNX.js → vendor-reka-ui-CIMXwvEp.js} +1 -1
  42. package/dist-web/assets/{web-CXPkmhis.js → web-4rtrAcLu.js} +1 -1
  43. package/dist-web/index.html +4 -4
  44. package/package.json +1 -1
  45. package/dist/chunk-43XWYC3M.mjs.map +0 -1
  46. package/dist/chunk-N5DGZQB4.mjs.map +0 -1
  47. package/dist/chunk-ZL322NVL.mjs.map +0 -1
  48. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BBDrsJfe.js +0 -161
  49. package/dist-web/assets/electron-BynNUuEA.js +0 -1
  50. package/dist-web/assets/index-BRwEubUe.js +0 -173
  51. package/dist-web/assets/index-DB-iqXzV.css +0 -1
  52. package/dist-web/assets/index-DS1rzk1I.js +0 -8
  53. package/dist-web/assets/vendor-echarts-C5u62NnM.js +0 -11
  54. /package/dist/{chunk-CIIQ3S2X.mjs.map → chunk-CIBTUWAE.mjs.map} +0 -0
  55. /package/dist/{chunk-QY6P2YS7.mjs.map → chunk-GNT5G74Z.mjs.map} +0 -0
  56. /package/dist/{chunk-QJI6AOAT.mjs.map → chunk-TCPXAX3F.mjs.map} +0 -0
  57. /package/dist/{http-TPX74BLK.mjs.map → http-PMNZ42EN.mjs.map} +0 -0
  58. /package/dist/{import-B745DRHD.mjs.map → import-OP7R4CYY.mjs.map} +0 -0
  59. /package/dist/{mcp-YWAVG5XW.mjs.map → mcp-ABXNFUJO.mjs.map} +0 -0
  60. /package/dist/{stream-import-OPALPVWF.mjs.map → stream-import-L6RJHH4L.mjs.map} +0 -0
@@ -22,7 +22,7 @@ import {
22
22
  loadConfig,
23
23
  searchMessagesLike,
24
24
  verifyCliDataPath
25
- } from "./chunk-N5DGZQB4.mjs";
25
+ } from "./chunk-4OMV4VNH.mjs";
26
26
  import {
27
27
  resolveCliPath
28
28
  } from "./chunk-FJ35V3TE.mjs";
@@ -219,7 +219,7 @@ program.command("import <file>").description("Import a chat history file (14+ fo
219
219
  console.error(`File not found: ${file}`);
220
220
  process.exit(1);
221
221
  }
222
- const { streamImport, detectFormat } = await import("./import-B745DRHD.mjs");
222
+ const { streamImport, detectFormat } = await import("./import-OP7R4CYY.mjs");
223
223
  const { dbManager } = initRuntime();
224
224
  const nativeBinding = resolveNativeBinding();
225
225
  const format = detectFormat(file);
@@ -261,7 +261,7 @@ Import error: ${err instanceof Error ? err.message : err}`);
261
261
  }
262
262
  });
263
263
  program.command("formats").description("List all supported chat history formats").action(async () => {
264
- const { getSupportedFormats } = await import("./import-B745DRHD.mjs");
264
+ const { getSupportedFormats } = await import("./import-OP7R4CYY.mjs");
265
265
  const formats = getSupportedFormats();
266
266
  console.log(`${formats.length} supported format(s):
267
267
  `);
@@ -270,7 +270,7 @@ program.command("formats").description("List all supported chat history formats"
270
270
  }
271
271
  });
272
272
  program.command("mcp").description("Start MCP Server (stdio transport, for ClaudeCode / Cursor / AI agents)").action(async () => {
273
- const { startCliMcpServer } = await import("./mcp-YWAVG5XW.mjs");
273
+ const { startCliMcpServer } = await import("./mcp-ABXNFUJO.mjs");
274
274
  await startCliMcpServer();
275
275
  });
276
276
  program.command("start").description("Start ChatLab (HTTP API + Web UI)").option("--port <port>", "Server port", String(DEFAULT_API_PORT)).option("--host <host>", "Listen address", "127.0.0.1").option("--token <token>", "Custom Bearer Token (reads from config or auto-generates if omitted)").option("--headless", "API-only mode, do not serve the Web UI").option("--require-auth", "Require Bearer token for all routes including /_web/*").option("--no-open", "Do not auto-open the browser").option("--daemon", "Run as a resident system service (auto-start on login, macOS/Linux)").action(async (options) => {
@@ -285,7 +285,7 @@ program.command("start").description("Start ChatLab (HTTP API + Web UI)").option
285
285
  });
286
286
  return;
287
287
  }
288
- const { startHttpServer } = await import("./http-TPX74BLK.mjs");
288
+ const { startHttpServer } = await import("./http-PMNZ42EN.mjs");
289
289
  const port = parseInt(options.port, 10);
290
290
  let webRoot;
291
291
  if (!options.headless) {
@@ -332,7 +332,7 @@ Press Ctrl+C to stop.
332
332
  }
333
333
  const shutdown = async () => {
334
334
  console.log("\nShutting down...");
335
- const { stopHttpServer } = await import("./http-TPX74BLK.mjs");
335
+ const { stopHttpServer } = await import("./http-PMNZ42EN.mjs");
336
336
  await stopHttpServer();
337
337
  process.exit(0);
338
338
  };
@@ -475,4 +475,4 @@ if (isDirectRun) {
475
475
  export {
476
476
  run
477
477
  };
478
- //# sourceMappingURL=chunk-CIIQ3S2X.mjs.map
478
+ //# sourceMappingURL=chunk-CIBTUWAE.mjs.map
@@ -5,6 +5,7 @@ const require = __createRequire(import.meta.url);
5
5
  const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
+ buildChartPayload,
8
9
  executeParameterizedSql,
9
10
  executeReadonlySql,
10
11
  getChatOverview,
@@ -26,7 +27,7 @@ import {
26
27
  getWeekdayActivity,
27
28
  searchMessagesLike,
28
29
  searchSessions
29
- } from "./chunk-N5DGZQB4.mjs";
30
+ } from "./chunk-4OMV4VNH.mjs";
30
31
 
31
32
  // ../../packages/tools/src/definitions/sql-query.ts
32
33
  var inputSchema = {
@@ -68,7 +69,8 @@ var sqlQueryTool = {
68
69
  name: "execute_sql",
69
70
  description: "\u5BF9\u804A\u5929\u6570\u636E\u5E93\u6267\u884C\u53EA\u8BFB SELECT \u67E5\u8BE2\u3002\u4F7F\u7528\u524D\u53EF\u5148\u8C03\u7528 get_schema \u67E5\u770B\u8868\u7ED3\u6784\u3002",
70
71
  inputSchema,
71
- handler
72
+ handler,
73
+ category: "analysis"
72
74
  };
73
75
  var schemaTool = {
74
76
  name: "get_schema",
@@ -77,8 +79,101 @@ var schemaTool = {
77
79
  handler: schemaHandler
78
80
  };
79
81
 
80
- // ../../packages/tools/src/definitions/session-info.ts
82
+ // ../../packages/tools/src/definitions/render-chart.ts
83
+ var DEFAULT_MAX_ROWS = 1e3;
84
+ var RE_SECONDS_TIMESTAMP_DIVIDED_AS_MILLISECONDS = /\b(?:\w+\.)?ts\s*\/\s*1000\b/i;
81
85
  var inputSchema2 = {
86
+ type: "object",
87
+ properties: {
88
+ sql: {
89
+ type: "string",
90
+ description: "Read-only SELECT or WITH SELECT SQL used to produce chart rows."
91
+ },
92
+ params: {
93
+ type: "object",
94
+ description: "Named SQL parameters. Use an empty object when no parameters are needed.",
95
+ additionalProperties: true,
96
+ default: {}
97
+ },
98
+ chartSpec: {
99
+ type: "object",
100
+ description: "ChartSpec v1. Required fields: version, type, title, encoding. Supported types: bar, line, pie, heatmap.",
101
+ additionalProperties: true
102
+ },
103
+ maxRows: {
104
+ type: "number",
105
+ description: "Maximum rows to fetch before chart normalization.",
106
+ default: DEFAULT_MAX_ROWS,
107
+ minimum: 1,
108
+ maximum: 5e3
109
+ }
110
+ },
111
+ required: ["sql", "chartSpec"]
112
+ };
113
+ function normalizeSql(sql, maxRows) {
114
+ if (typeof sql !== "string" || sql.trim().length === 0) {
115
+ throw new Error("sql must be a non-empty string");
116
+ }
117
+ const trimmed = sql.trim().replace(/;+\s*$/, "");
118
+ if (trimmed.includes(";")) {
119
+ throw new Error("Only a single read-only SQL statement is allowed");
120
+ }
121
+ const statementStart = trimmed.replace(/^(\s|--[^\n]*(\n|$)|\/\*[\s\S]*?\*\/)*/, "");
122
+ if (!/^(SELECT|WITH)\b/i.test(statementStart)) {
123
+ throw new Error("render_chart only accepts SELECT or WITH SELECT SQL");
124
+ }
125
+ if (RE_SECONDS_TIMESTAMP_DIVIDED_AS_MILLISECONDS.test(trimmed)) {
126
+ throw new Error("message.ts is already a Unix timestamp in seconds; do not divide ts by 1000");
127
+ }
128
+ return `SELECT * FROM (
129
+ ${trimmed}
130
+ ) AS chart_query LIMIT ${maxRows + 1}`;
131
+ }
132
+ function normalizeParams(raw) {
133
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) return {};
134
+ return raw;
135
+ }
136
+ function normalizeMaxRows(raw) {
137
+ const value = typeof raw === "number" ? raw : DEFAULT_MAX_ROWS;
138
+ if (!Number.isFinite(value)) return DEFAULT_MAX_ROWS;
139
+ return Math.min(5e3, Math.max(1, Math.floor(value)));
140
+ }
141
+ function summarizeChart(type, title, rowCount, truncated, locale) {
142
+ if (locale?.startsWith("zh")) {
143
+ return `\u5DF2\u751F\u6210\u56FE\u8868\u300C${title}\u300D\uFF08${type}\uFF0C${rowCount} \u884C\u6570\u636E${truncated ? "\uFF0C\u5DF2\u622A\u65AD" : ""}\uFF09\u3002`;
144
+ }
145
+ return `Generated chart "${title}" (${type}, ${rowCount} rows${truncated ? ", truncated" : ""}).`;
146
+ }
147
+ async function handler2(params, context) {
148
+ if (!context.dataProvider) throw new Error("render_chart requires a data provider");
149
+ const maxRows = normalizeMaxRows(params.maxRows);
150
+ const sql = normalizeSql(params.sql, maxRows);
151
+ const sqlParams = normalizeParams(params.params);
152
+ const fetchedRows = await context.dataProvider.executeParameterizedSql(sql, sqlParams);
153
+ const truncated = fetchedRows.length > maxRows;
154
+ const rows = truncated ? fetchedRows.slice(0, maxRows) : fetchedRows;
155
+ const chart = buildChartPayload(rows, params.chartSpec, { truncated });
156
+ return {
157
+ content: summarizeChart(chart.spec.type, chart.spec.title, rows.length, truncated, context.locale),
158
+ data: {
159
+ rowCount: rows.length,
160
+ truncated,
161
+ chartType: chart.spec.type,
162
+ title: chart.spec.title
163
+ },
164
+ chart
165
+ };
166
+ }
167
+ var renderChartTool = {
168
+ name: "render_chart",
169
+ description: "Generate a native ChatLab chart from read-only SQL plus ChartSpec v1. Use this for flexible bar, line, pie, and heatmap charts. Never output HTML, JavaScript, SVG, ECharts options, or rendering code.",
170
+ inputSchema: inputSchema2,
171
+ handler: handler2,
172
+ category: "analysis"
173
+ };
174
+
175
+ // ../../packages/tools/src/definitions/session-info.ts
176
+ var inputSchema3 = {
82
177
  type: "object",
83
178
  properties: {
84
179
  include_members: {
@@ -88,7 +183,7 @@ var inputSchema2 = {
88
183
  }
89
184
  }
90
185
  };
91
- function handler2(params, context) {
186
+ function handler3(params, context) {
92
187
  const db = context.db;
93
188
  const meta = getSessionMeta(db);
94
189
  const overview = getSessionOverview(db);
@@ -105,12 +200,12 @@ function handler2(params, context) {
105
200
  var sessionInfoTool = {
106
201
  name: "get_session_info",
107
202
  description: "\u83B7\u53D6\u5F53\u524D\u4F1A\u8BDD\u7684\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u5305\u62EC\u540D\u79F0\u3001\u5E73\u53F0\u3001\u6D88\u606F\u603B\u6570\u3001\u6210\u5458\u6570\u3001\u65F6\u95F4\u8303\u56F4\u7B49",
108
- inputSchema: inputSchema2,
109
- handler: handler2
203
+ inputSchema: inputSchema3,
204
+ handler: handler3
110
205
  };
111
206
 
112
207
  // ../../packages/tools/src/definitions/sessions.ts
113
- var inputSchema3 = {
208
+ var inputSchema4 = {
114
209
  type: "object",
115
210
  properties: {
116
211
  keyword: {
@@ -119,7 +214,7 @@ var inputSchema3 = {
119
214
  }
120
215
  }
121
216
  };
122
- function handler3(_params, context) {
217
+ function handler4(_params, context) {
123
218
  const keyword = _params.keyword?.toLowerCase();
124
219
  const sessionIds = context.listSessionIds();
125
220
  const sessions = sessionIds.map((id) => {
@@ -139,8 +234,8 @@ function handler3(_params, context) {
139
234
  var sessionsListTool = {
140
235
  name: "list_sessions",
141
236
  description: "\u5217\u51FA\u6240\u6709\u53EF\u7528\u7684\u804A\u5929\u4F1A\u8BDD\uFF0C\u8FD4\u56DE\u4F1A\u8BDD\u540D\u79F0\u3001\u5E73\u53F0\u3001\u6D88\u606F\u6570\u7B49\u57FA\u672C\u4FE1\u606F",
142
- inputSchema: inputSchema3,
143
- handler: handler3
237
+ inputSchema: inputSchema4,
238
+ handler: handler4
144
239
  };
145
240
 
146
241
  // ../../packages/tools/src/utils/format.ts
@@ -184,13 +279,13 @@ function formatMessageCompact(msg, locale) {
184
279
  }
185
280
 
186
281
  // ../../packages/tools/src/definitions/chat-overview.ts
187
- var inputSchema4 = {
282
+ var inputSchema5 = {
188
283
  type: "object",
189
284
  properties: {
190
285
  top_n: { type: "number", description: "\u8FD4\u56DE\u6D3B\u8DC3\u5EA6\u6700\u9AD8\u7684\u524D N \u4E2A\u6210\u5458\uFF0C\u9ED8\u8BA4 10" }
191
286
  }
192
287
  };
193
- async function handler4(params, context) {
288
+ async function handler5(params, context) {
194
289
  const { locale } = context;
195
290
  const topN = params.top_n || 10;
196
291
  const result = await context.dataProvider.getChatOverview(topN);
@@ -224,8 +319,8 @@ async function handler4(params, context) {
224
319
  var chatOverviewTool = {
225
320
  name: "get_chat_overview",
226
321
  description: "\u83B7\u53D6\u804A\u5929\u6982\u89C8\u4FE1\u606F\uFF0C\u5305\u62EC\u804A\u5929\u540D\u79F0\u3001\u5E73\u53F0\u3001\u603B\u6D88\u606F\u6570\u3001\u603B\u6210\u5458\u6570\u3001\u65F6\u95F4\u8303\u56F4\u548C\u6D3B\u8DC3\u6210\u5458\u6392\u884C",
227
- inputSchema: inputSchema4,
228
- handler: handler4,
322
+ inputSchema: inputSchema5,
323
+ handler: handler5,
229
324
  category: "core"
230
325
  };
231
326
 
@@ -269,7 +364,7 @@ var timeParamProperties = {
269
364
  };
270
365
 
271
366
  // ../../packages/tools/src/definitions/search-messages.ts
272
- var inputSchema5 = {
367
+ var inputSchema6 = {
273
368
  type: "object",
274
369
  properties: {
275
370
  keywords: { type: "array", items: { type: "string" }, description: "\u641C\u7D22\u5173\u952E\u8BCD\u5217\u8868" },
@@ -279,7 +374,7 @@ var inputSchema5 = {
279
374
  },
280
375
  required: ["keywords"]
281
376
  };
282
- async function handler5(params, context) {
377
+ async function handler6(params, context) {
283
378
  const { locale, timeFilter: contextTimeFilter, maxMessagesLimit } = context;
284
379
  const keywords = params.keywords;
285
380
  const limit = Math.min(maxMessagesLimit || params.limit || 1e3, 5e4);
@@ -309,14 +404,14 @@ async function handler5(params, context) {
309
404
  var searchMessagesTool = {
310
405
  name: "search_messages",
311
406
  description: "\u6839\u636E\u5173\u952E\u8BCD\u641C\u7D22\u7FA4\u804A\u8BB0\u5F55\u3002\u9002\u7528\u4E8E\u7528\u6237\u60F3\u8981\u67E5\u627E\u7279\u5B9A\u8BDD\u9898\u3001\u5173\u952E\u8BCD\u76F8\u5173\u7684\u804A\u5929\u5185\u5BB9\u3002\u53EF\u4EE5\u6307\u5B9A\u65F6\u95F4\u8303\u56F4\u548C\u53D1\u9001\u8005\u6765\u7B5B\u9009\u6D88\u606F\u3002",
312
- inputSchema: inputSchema5,
313
- handler: handler5,
407
+ inputSchema: inputSchema6,
408
+ handler: handler6,
314
409
  category: "core",
315
410
  truncationStrategy: "keep_first"
316
411
  };
317
412
 
318
413
  // ../../packages/tools/src/definitions/deep-search-messages.ts
319
- var inputSchema6 = {
414
+ var inputSchema7 = {
320
415
  type: "object",
321
416
  properties: {
322
417
  keywords: { type: "array", items: { type: "string" }, description: "\u641C\u7D22\u5173\u952E\u8BCD\u5217\u8868" },
@@ -326,7 +421,7 @@ var inputSchema6 = {
326
421
  },
327
422
  required: ["keywords"]
328
423
  };
329
- async function handler6(params, context) {
424
+ async function handler7(params, context) {
330
425
  const { locale, timeFilter: contextTimeFilter, maxMessagesLimit } = context;
331
426
  const keywords = params.keywords;
332
427
  const limit = Math.min(maxMessagesLimit || params.limit || 1e3, 5e4);
@@ -356,14 +451,14 @@ async function handler6(params, context) {
356
451
  var deepSearchMessagesTool = {
357
452
  name: "deep_search_messages",
358
453
  description: "\u6DF1\u5EA6\u641C\u7D22\u6D88\u606F\uFF08LIKE \u5B50\u4E32\u5339\u914D\uFF0C\u901F\u5EA6\u8F83\u6162\u4F46\u4E0D\u4F1A\u9057\u6F0F\uFF09\uFF0C\u9002\u7528\u4E8E\u5168\u6587\u641C\u7D22\u7CBE\u786E\u5339\u914D\u6216 FTS \u641C\u7D22\u65E0\u7ED3\u679C\u65F6\u7684\u8865\u5145\u641C\u7D22\u3002",
359
- inputSchema: inputSchema6,
360
- handler: handler6,
454
+ inputSchema: inputSchema7,
455
+ handler: handler7,
361
456
  category: "core",
362
457
  truncationStrategy: "keep_first"
363
458
  };
364
459
 
365
460
  // ../../packages/tools/src/definitions/get-message-context.ts
366
- var inputSchema7 = {
461
+ var inputSchema8 = {
367
462
  type: "object",
368
463
  properties: {
369
464
  message_ids: { type: "array", items: { type: "number" }, description: "\u6D88\u606F ID \u5217\u8868" },
@@ -371,7 +466,7 @@ var inputSchema7 = {
371
466
  },
372
467
  required: ["message_ids"]
373
468
  };
374
- async function handler7(params, context) {
469
+ async function handler8(params, context) {
375
470
  const { locale } = context;
376
471
  const messageIds = params.message_ids;
377
472
  const contextSize = params.context_size || 20;
@@ -394,14 +489,14 @@ async function handler7(params, context) {
394
489
  var getMessageContextTool = {
395
490
  name: "get_message_context",
396
491
  description: "\u6839\u636E\u6D88\u606F ID \u83B7\u53D6\u524D\u540E\u7684\u4E0A\u4E0B\u6587\u6D88\u606F\u3002\u9002\u7528\u4E8E\u9700\u8981\u67E5\u770B\u67D0\u6761\u6D88\u606F\u524D\u540E\u804A\u5929\u5185\u5BB9\u7684\u573A\u666F\u3002",
397
- inputSchema: inputSchema7,
398
- handler: handler7,
492
+ inputSchema: inputSchema8,
493
+ handler: handler8,
399
494
  category: "core",
400
495
  truncationStrategy: "keep_last"
401
496
  };
402
497
 
403
498
  // ../../packages/tools/src/definitions/search-sessions.ts
404
- var inputSchema8 = {
499
+ var inputSchema9 = {
405
500
  type: "object",
406
501
  properties: {
407
502
  keywords: { type: "array", items: { type: "string" }, description: "\u641C\u7D22\u5173\u952E\u8BCD\u5217\u8868" },
@@ -409,7 +504,7 @@ var inputSchema8 = {
409
504
  ...timeParamProperties
410
505
  }
411
506
  };
412
- async function handler8(params, context) {
507
+ async function handler9(params, context) {
413
508
  const { locale, timeFilter: contextTimeFilter } = context;
414
509
  const limit = params.limit || 20;
415
510
  const effectiveTimeFilter = parseExtendedTimeParams(params, contextTimeFilter);
@@ -449,13 +544,13 @@ async function handler8(params, context) {
449
544
  var searchSessionsTool = {
450
545
  name: "search_sessions",
451
546
  description: "\u641C\u7D22\u804A\u5929\u4F1A\u8BDD\uFF08\u5BF9\u8BDD\u6BB5\u843D\uFF09\u3002\u4F1A\u8BDD\u662F\u6839\u636E\u6D88\u606F\u65F6\u95F4\u95F4\u9694\u81EA\u52A8\u5207\u5206\u7684\u5BF9\u8BDD\u5355\u5143\u3002\u8FD4\u56DE\u5339\u914D\u7684\u4F1A\u8BDD\u5217\u8868\u53CA\u6BCF\u4E2A\u4F1A\u8BDD\u7684\u524D5\u6761\u6D88\u606F\u9884\u89C8\u3002",
452
- inputSchema: inputSchema8,
453
- handler: handler8,
547
+ inputSchema: inputSchema9,
548
+ handler: handler9,
454
549
  category: "core"
455
550
  };
456
551
 
457
552
  // ../../packages/tools/src/definitions/get-session-messages.ts
458
- var inputSchema9 = {
553
+ var inputSchema10 = {
459
554
  type: "object",
460
555
  properties: {
461
556
  session_id: { type: "number", description: "\u4F1A\u8BDD ID\uFF08\u901A\u8FC7 search_sessions \u83B7\u53D6\uFF09" },
@@ -463,7 +558,7 @@ var inputSchema9 = {
463
558
  },
464
559
  required: ["session_id"]
465
560
  };
466
- async function handler9(params, context) {
561
+ async function handler10(params, context) {
467
562
  const { locale, maxMessagesLimit } = context;
468
563
  const limit = maxMessagesLimit || params.limit || 1e3;
469
564
  const result = await context.dataProvider.getSessionMessages(params.session_id, limit);
@@ -496,21 +591,21 @@ async function handler9(params, context) {
496
591
  var getSessionMessagesTool = {
497
592
  name: "get_session_messages",
498
593
  description: "\u83B7\u53D6\u6307\u5B9A\u4F1A\u8BDD\u7684\u5B8C\u6574\u6D88\u606F\u5217\u8868\u3002\u7528\u4E8E\u5728 search_sessions \u627E\u5230\u76F8\u5173\u4F1A\u8BDD\u540E\uFF0C\u83B7\u53D6\u8BE5\u4F1A\u8BDD\u7684\u5B8C\u6574\u4E0A\u4E0B\u6587\u3002",
499
- inputSchema: inputSchema9,
500
- handler: handler9,
594
+ inputSchema: inputSchema10,
595
+ handler: handler10,
501
596
  category: "core",
502
597
  truncationStrategy: "keep_last"
503
598
  };
504
599
 
505
600
  // ../../packages/tools/src/definitions/get-members.ts
506
- var inputSchema10 = {
601
+ var inputSchema11 = {
507
602
  type: "object",
508
603
  properties: {
509
604
  search: { type: "string", description: "\u6309\u540D\u79F0/\u522B\u540D/\u5E73\u53F0ID\u641C\u7D22\u8FC7\u6EE4" },
510
605
  limit: { type: "number", description: "\u6700\u5927\u8FD4\u56DE\u6570\u91CF" }
511
606
  }
512
607
  };
513
- async function handler10(params, context) {
608
+ async function handler11(params, context) {
514
609
  const { locale } = context;
515
610
  const members = await context.dataProvider.getMembers();
516
611
  let filteredMembers = members;
@@ -543,13 +638,13 @@ async function handler10(params, context) {
543
638
  var getMembersTool = {
544
639
  name: "get_members",
545
640
  description: '\u83B7\u53D6\u6210\u5458\u5217\u8868\uFF0C\u5305\u62EC\u6210\u5458\u7684\u57FA\u672C\u4FE1\u606F\u3001\u522B\u540D\u548C\u6D88\u606F\u7EDF\u8BA1\u3002\u9002\u7528\u4E8E\u67E5\u8BE2"\u6709\u54EA\u4E9B\u4EBA"\u3001"\u67D0\u4EBA\u7684\u522B\u540D\u662F\u4EC0\u4E48"\u7B49\u95EE\u9898\u3002',
546
- inputSchema: inputSchema10,
547
- handler: handler10,
641
+ inputSchema: inputSchema11,
642
+ handler: handler11,
548
643
  category: "core"
549
644
  };
550
645
 
551
646
  // ../../packages/tools/src/definitions/member-stats.ts
552
- var inputSchema11 = {
647
+ var inputSchema12 = {
553
648
  type: "object",
554
649
  properties: {
555
650
  top: {
@@ -559,7 +654,7 @@ var inputSchema11 = {
559
654
  }
560
655
  }
561
656
  };
562
- async function handler11(params, context) {
657
+ async function handler12(params, context) {
563
658
  const top = params.top || 20;
564
659
  const members = await context.dataProvider.getMemberStats({ timeFilter: context.timeFilter, top });
565
660
  const data = {
@@ -578,13 +673,13 @@ async function handler11(params, context) {
578
673
  var memberStatsTool = {
579
674
  name: "get_member_stats",
580
675
  description: "\u83B7\u53D6\u6210\u5458\u6D3B\u8DC3\u5EA6\u6392\u884C\uFF0C\u5305\u62EC\u6D88\u606F\u6570\u91CF\u548C\u5360\u6BD4",
581
- inputSchema: inputSchema11,
582
- handler: handler11,
676
+ inputSchema: inputSchema12,
677
+ handler: handler12,
583
678
  category: "core"
584
679
  };
585
680
 
586
681
  // ../../packages/tools/src/definitions/time-stats.ts
587
- var inputSchema12 = {
682
+ var inputSchema13 = {
588
683
  type: "object",
589
684
  properties: {
590
685
  type: {
@@ -595,7 +690,7 @@ var inputSchema12 = {
595
690
  }
596
691
  }
597
692
  };
598
- async function handler12(params, context) {
693
+ async function handler13(params, context) {
599
694
  const type = params.type || "hourly";
600
695
  const data = await context.dataProvider.getTimeStats(type, { timeFilter: context.timeFilter });
601
696
  return {
@@ -606,13 +701,13 @@ async function handler12(params, context) {
606
701
  var timeStatsTool = {
607
702
  name: "get_time_stats",
608
703
  description: "\u83B7\u53D6\u804A\u5929\u6D3B\u8DC3\u65F6\u6BB5\u5206\u5E03\uFF08\u6309\u5C0F\u65F6/\u661F\u671F/\u6BCF\u65E5\u8D8B\u52BF\uFF09",
609
- inputSchema: inputSchema12,
610
- handler: handler12,
704
+ inputSchema: inputSchema13,
705
+ handler: handler13,
611
706
  category: "core"
612
707
  };
613
708
 
614
709
  // ../../packages/tools/src/definitions/recent-messages.ts
615
- var inputSchema13 = {
710
+ var inputSchema14 = {
616
711
  type: "object",
617
712
  properties: {
618
713
  limit: {
@@ -623,7 +718,7 @@ var inputSchema13 = {
623
718
  ...timeParamProperties
624
719
  }
625
720
  };
626
- async function handler13(params, context) {
721
+ async function handler14(params, context) {
627
722
  const { locale, timeFilter: contextTimeFilter, maxMessagesLimit } = context;
628
723
  const limit = maxMessagesLimit || params.limit || 100;
629
724
  const effectiveTimeFilter = parseExtendedTimeParams(params, contextTimeFilter);
@@ -643,21 +738,21 @@ async function handler13(params, context) {
643
738
  var recentMessagesTool = {
644
739
  name: "get_recent_messages",
645
740
  description: '\u83B7\u53D6\u6307\u5B9A\u65F6\u95F4\u6BB5\u5185\u7684\u7FA4\u804A\u6D88\u606F\u3002\u9002\u7528\u4E8E\u56DE\u7B54"\u6700\u8FD1\u5927\u5BB6\u804A\u4E86\u4EC0\u4E48"\u7B49\u6982\u89C8\u6027\u95EE\u9898\u3002\u652F\u6301\u7CBE\u786E\u5230\u5206\u949F\u7EA7\u522B\u7684\u65F6\u95F4\u67E5\u8BE2\u3002',
646
- inputSchema: inputSchema13,
647
- handler: handler13,
741
+ inputSchema: inputSchema14,
742
+ handler: handler14,
648
743
  category: "core",
649
744
  truncationStrategy: "keep_last"
650
745
  };
651
746
 
652
747
  // ../../packages/tools/src/definitions/get-member-name-history.ts
653
- var inputSchema14 = {
748
+ var inputSchema15 = {
654
749
  type: "object",
655
750
  properties: {
656
751
  member_id: { type: "number", description: "\u6210\u5458 ID\uFF08\u901A\u8FC7 get_members \u83B7\u53D6\uFF09" }
657
752
  },
658
753
  required: ["member_id"]
659
754
  };
660
- async function handler14(params, context) {
755
+ async function handler15(params, context) {
661
756
  const { locale } = context;
662
757
  const memberId = params.member_id;
663
758
  const members = await context.dataProvider.getMembers();
@@ -693,13 +788,13 @@ async function handler14(params, context) {
693
788
  var getMemberNameHistoryTool = {
694
789
  name: "get_member_name_history",
695
790
  description: '\u83B7\u53D6\u6210\u5458\u7684\u6635\u79F0\u53D8\u66F4\u5386\u53F2\u8BB0\u5F55\u3002\u9002\u7528\u4E8E\u56DE\u7B54"\u67D0\u4EBA\u4EE5\u524D\u53EB\u4EC0\u4E48\u540D\u5B57"\u3001"\u67D0\u4EBA\u7684\u6635\u79F0\u53D8\u5316"\u7B49\u95EE\u9898\u3002',
696
- inputSchema: inputSchema14,
697
- handler: handler14,
791
+ inputSchema: inputSchema15,
792
+ handler: handler15,
698
793
  category: "analysis"
699
794
  };
700
795
 
701
796
  // ../../packages/tools/src/definitions/get-conversation-between.ts
702
- var inputSchema15 = {
797
+ var inputSchema16 = {
703
798
  type: "object",
704
799
  properties: {
705
800
  member_id_1: { type: "number", description: "\u7B2C\u4E00\u4E2A\u6210\u5458\u7684 ID\uFF08\u901A\u8FC7 get_members \u83B7\u53D6\uFF09" },
@@ -709,7 +804,7 @@ var inputSchema15 = {
709
804
  },
710
805
  required: ["member_id_1", "member_id_2"]
711
806
  };
712
- async function handler15(params, context) {
807
+ async function handler16(params, context) {
713
808
  const { locale, timeFilter: contextTimeFilter, maxMessagesLimit } = context;
714
809
  const limit = maxMessagesLimit || params.limit || 100;
715
810
  const effectiveTimeFilter = parseExtendedTimeParams(params, contextTimeFilter);
@@ -740,14 +835,14 @@ async function handler15(params, context) {
740
835
  var getConversationBetweenTool = {
741
836
  name: "get_conversation_between",
742
837
  description: '\u83B7\u53D6\u4E24\u4E2A\u7FA4\u6210\u5458\u4E4B\u95F4\u7684\u5BF9\u8BDD\u8BB0\u5F55\u3002\u9002\u7528\u4E8E\u56DE\u7B54"A\u548CB\u4E4B\u95F4\u804A\u4E86\u4EC0\u4E48"\u7B49\u95EE\u9898\u3002\u9700\u8981\u5148\u901A\u8FC7 get_members \u83B7\u53D6\u6210\u5458 ID\u3002',
743
- inputSchema: inputSchema15,
744
- handler: handler15,
838
+ inputSchema: inputSchema16,
839
+ handler: handler16,
745
840
  category: "analysis",
746
841
  truncationStrategy: "keep_last"
747
842
  };
748
843
 
749
844
  // ../../packages/tools/src/definitions/get-session-summaries.ts
750
- var inputSchema16 = {
845
+ var inputSchema17 = {
751
846
  type: "object",
752
847
  properties: {
753
848
  keywords: { type: "array", items: { type: "string" }, description: "\u6309\u5173\u952E\u8BCD\u8FC7\u6EE4\u6458\u8981\u5185\u5BB9" },
@@ -755,7 +850,7 @@ var inputSchema16 = {
755
850
  ...timeParamProperties
756
851
  }
757
852
  };
758
- async function handler16(params, context) {
853
+ async function handler17(params, context) {
759
854
  const { locale, timeFilter: contextTimeFilter } = context;
760
855
  const limit = params.limit || 20;
761
856
  const effectiveTimeFilter = parseExtendedTimeParams(params, contextTimeFilter);
@@ -801,20 +896,20 @@ async function handler16(params, context) {
801
896
  var getSessionSummariesTool = {
802
897
  name: "get_session_summaries",
803
898
  description: "\u83B7\u53D6\u4F1A\u8BDD\u6458\u8981\u5217\u8868\uFF0C\u5FEB\u901F\u4E86\u89E3\u7FA4\u804A\u5386\u53F2\u8BA8\u8BBA\u7684\u4E3B\u9898\u3002\u53EF\u4EE5\u6309\u5173\u952E\u8BCD\u641C\u7D22\u8BA8\u8BBA\u8FC7\u7684\u8BDD\u9898\u3002",
804
- inputSchema: inputSchema16,
805
- handler: handler16,
899
+ inputSchema: inputSchema17,
900
+ handler: handler17,
806
901
  category: "analysis"
807
902
  };
808
903
 
809
904
  // ../../packages/tools/src/definitions/response-time-analysis.ts
810
- var inputSchema17 = {
905
+ var inputSchema18 = {
811
906
  type: "object",
812
907
  properties: {
813
908
  days: { type: "number", description: "\u5206\u6790\u6700\u8FD1\u591A\u5C11\u5929\u7684\u6570\u636E\uFF0C\u9ED8\u8BA4 30" },
814
909
  top_n: { type: "number", description: "\u8FD4\u56DE\u524D\u591A\u5C11\u540D\uFF0C\u9ED8\u8BA4 10" }
815
910
  }
816
911
  };
817
- async function handler17(params, context) {
912
+ async function handler18(params, context) {
818
913
  const { locale } = context;
819
914
  const isZh = isChineseLocale(locale);
820
915
  const days = params.days || 30;
@@ -879,20 +974,20 @@ async function handler17(params, context) {
879
974
  var responseTimeAnalysisTool = {
880
975
  name: "response_time_analysis",
881
976
  description: "\u5206\u6790\u7FA4\u6210\u5458\u7684\u54CD\u5E94\u901F\u5EA6\u6392\u884C\uFF0C\u57FA\u4E8E\u56DE\u590D\u95F4\u9694\u7684\u4E2D\u4F4D\u6570\u548C\u5E73\u5747\u503C\u3002",
882
- inputSchema: inputSchema17,
883
- handler: handler17,
977
+ inputSchema: inputSchema18,
978
+ handler: handler18,
884
979
  category: "analysis"
885
980
  };
886
981
 
887
982
  // ../../packages/tools/src/definitions/keyword-frequency.ts
888
- var inputSchema18 = {
983
+ var inputSchema19 = {
889
984
  type: "object",
890
985
  properties: {
891
986
  days: { type: "number", description: "\u5206\u6790\u6700\u8FD1\u591A\u5C11\u5929\u7684\u6570\u636E\uFF0C\u9ED8\u8BA4 30" },
892
987
  top_n: { type: "number", description: "\u8FD4\u56DE\u524D\u591A\u5C11\u4E2A\u9AD8\u9891\u8BCD\uFF0C\u9ED8\u8BA4 50" }
893
988
  }
894
989
  };
895
- async function handler18(params, context) {
990
+ async function handler19(params, context) {
896
991
  const { locale, segmentText } = context;
897
992
  const isZh = isChineseLocale(locale);
898
993
  const days = params.days || 30;
@@ -940,8 +1035,8 @@ async function handler18(params, context) {
940
1035
  var keywordFrequencyTool = {
941
1036
  name: "keyword_frequency",
942
1037
  description: "\u7EDF\u8BA1\u7FA4\u804A\u4E2D\u7684\u9AD8\u9891\u5173\u952E\u8BCD\uFF0C\u901A\u8FC7 NLP \u5206\u8BCD\u5206\u6790\u6D88\u606F\u5185\u5BB9\u3002",
943
- inputSchema: inputSchema18,
944
- handler: handler18,
1038
+ inputSchema: inputSchema19,
1039
+ handler: handler19,
945
1040
  category: "analysis"
946
1041
  };
947
1042
 
@@ -1218,6 +1313,7 @@ var SHARED_TOOLS = [
1218
1313
  searchSessionsTool,
1219
1314
  getSessionMessagesTool,
1220
1315
  getMembersTool,
1316
+ schemaTool,
1221
1317
  // Analysis
1222
1318
  memberStatsTool,
1223
1319
  timeStatsTool,
@@ -1226,6 +1322,7 @@ var SHARED_TOOLS = [
1226
1322
  getSessionSummariesTool,
1227
1323
  responseTimeAnalysisTool,
1228
1324
  keywordFrequencyTool,
1325
+ renderChartTool,
1229
1326
  // Raw SQL
1230
1327
  sqlQueryTool
1231
1328
  ];
@@ -1234,7 +1331,6 @@ var MCP_TOOL_REGISTRY = [
1234
1331
  // MCP-specific: session discovery & schema
1235
1332
  sessionsListTool,
1236
1333
  sessionInfoTool,
1237
- schemaTool,
1238
1334
  // Shared core + analysis + raw SQL
1239
1335
  ...SHARED_TOOLS
1240
1336
  ];
@@ -1341,4 +1437,4 @@ export {
1341
1437
  MCP_TOOL_REGISTRY,
1342
1438
  CoreDataProvider
1343
1439
  };
1344
- //# sourceMappingURL=chunk-43XWYC3M.mjs.map
1440
+ //# sourceMappingURL=chunk-E65ABM3C.mjs.map