chatlab-cli 0.25.0 → 0.26.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 (70) hide show
  1. package/dist/chat-command-ZP4WJVWC.mjs +304 -0
  2. package/dist/chat-command-ZP4WJVWC.mjs.map +1 -0
  3. package/dist/{chunk-CIBTUWAE.mjs → chunk-6G7AIF7I.mjs} +38 -8
  4. package/dist/chunk-6G7AIF7I.mjs.map +1 -0
  5. package/dist/chunk-ILGSSXOG.mjs +549 -0
  6. package/dist/chunk-ILGSSXOG.mjs.map +1 -0
  7. package/dist/{chunk-E65ABM3C.mjs → chunk-IRZRIHIT.mjs} +100 -63
  8. package/dist/chunk-IRZRIHIT.mjs.map +1 -0
  9. package/dist/{chunk-4OMV4VNH.mjs → chunk-QY67NN65.mjs} +1900 -729
  10. package/dist/chunk-QY67NN65.mjs.map +1 -0
  11. package/dist/{chunk-FSHVDWI2.mjs → chunk-SJIOPSMM.mjs} +116 -569
  12. package/dist/chunk-SJIOPSMM.mjs.map +1 -0
  13. package/dist/{chunk-GNT5G74Z.mjs → chunk-TC74HESZ.mjs} +59 -33
  14. package/dist/chunk-TC74HESZ.mjs.map +1 -0
  15. package/dist/chunk-UB4XBM4R.mjs +40 -0
  16. package/dist/chunk-UB4XBM4R.mjs.map +1 -0
  17. package/dist/{chunk-TCPXAX3F.mjs → chunk-WXC6RZCX.mjs} +17 -25
  18. package/dist/chunk-WXC6RZCX.mjs.map +1 -0
  19. package/dist/cli.mjs +3 -2
  20. package/dist/{http-PMNZ42EN.mjs → http-J3IOFFIA.mjs} +8 -6
  21. package/dist/{import-OP7R4CYY.mjs → import-POYG5LOX.mjs} +4 -4
  22. package/dist/index.mjs +10 -8
  23. package/dist/{mcp-ABXNFUJO.mjs → mcp-7HH7UMXT.mjs} +11 -6
  24. package/dist/mcp-7HH7UMXT.mjs.map +1 -0
  25. package/dist/{stream-import-L6RJHH4L.mjs → stream-import-O3H3FGV2.mjs} +3 -3
  26. package/dist-web/assets/{DebugToolsPanel-DaSNc1o-.css → DebugToolsPanel-CrqULdXp.css} +1 -1
  27. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BTJxEma5.js +182 -0
  28. package/dist-web/assets/{EChartWordcloud-CzhfrEF_.js → EChartWordcloud-B_YisOW5.js} +1 -1
  29. package/dist-web/assets/{MessageExportModal-BAJKWX4y.js → MessageExportModal-C7NgEL8T.js} +1 -1
  30. package/dist-web/assets/{electron-CZt36wW5.js → electron-B3DFm1cC.js} +1 -1
  31. package/dist-web/assets/electron-BMM4Nfty.js +1 -0
  32. package/dist-web/assets/{fetch-qoGEVjNg.js → fetch-ArMjdMcy.js} +1 -1
  33. package/dist-web/assets/fetch-BFtuJaa1.js +1 -0
  34. package/dist-web/assets/{fetch-yWwp067l.js → fetch-BGfaAqO9.js} +1 -1
  35. package/dist-web/assets/{fetch-DD1EGRKV.js → fetch-BaJDB31c.js} +1 -1
  36. package/dist-web/assets/{fetch-JzVEwamn.js → fetch-BjDJgdN0.js} +1 -1
  37. package/dist-web/assets/{fetch-GMkMBzBS.js → fetch-C5CLcpQW.js} +1 -1
  38. package/dist-web/assets/{fetch-DXfZysDf.js → fetch-DQZvdHnG.js} +1 -1
  39. package/dist-web/assets/{fetch-D4p9vj1A.js → fetch-Dhfbt1BQ.js} +3 -3
  40. package/dist-web/assets/fetch-DnEP0uyF.js +1 -0
  41. package/dist-web/assets/{fetch-CgBIWyAo.js → fetch-SYrb-sZe.js} +1 -1
  42. package/dist-web/assets/index-CWfkrx37.js +173 -0
  43. package/dist-web/assets/index-D3N4NDFx.css +1 -0
  44. package/dist-web/assets/{index-O0PG26_v.js → index-D7_ch4zf.js} +1 -1
  45. package/dist-web/assets/{index-BrS_VrIY.js → index-DK9LEEzT.js} +1 -1
  46. package/dist-web/assets/index-DqDa_on9.js +9 -0
  47. package/dist-web/assets/{index-Cvlw0RLu.js → index-DrN1G9bl.js} +2 -2
  48. package/dist-web/assets/{index-DvWI6Yqa.js → index-MdYeovYo.js} +4 -4
  49. package/dist-web/assets/{vendor-nuxt-ui-C_8CsH6e.js → vendor-nuxt-ui-Zy8txNdC.js} +1 -1
  50. package/dist-web/assets/{vendor-reka-ui-CIMXwvEp.js → vendor-reka-ui-mMvma1EP.js} +1 -1
  51. package/dist-web/assets/{web-4rtrAcLu.js → web-zEXsvoZW.js} +1 -1
  52. package/dist-web/index.html +4 -4
  53. package/package.json +1 -1
  54. package/dist/chunk-4OMV4VNH.mjs.map +0 -1
  55. package/dist/chunk-CIBTUWAE.mjs.map +0 -1
  56. package/dist/chunk-E65ABM3C.mjs.map +0 -1
  57. package/dist/chunk-FSHVDWI2.mjs.map +0 -1
  58. package/dist/chunk-GNT5G74Z.mjs.map +0 -1
  59. package/dist/chunk-TCPXAX3F.mjs.map +0 -1
  60. package/dist/mcp-ABXNFUJO.mjs.map +0 -1
  61. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BUwpIerl.js +0 -161
  62. package/dist-web/assets/electron-CwERrTWp.js +0 -1
  63. package/dist-web/assets/fetch-BxFAkm7O.js +0 -1
  64. package/dist-web/assets/fetch-DO8lty7_.js +0 -1
  65. package/dist-web/assets/index-C1t-kzfo.css +0 -1
  66. package/dist-web/assets/index-DABpUm3J.js +0 -9
  67. package/dist-web/assets/index-OsjX5hXw.js +0 -173
  68. /package/dist/{http-PMNZ42EN.mjs.map → http-J3IOFFIA.mjs.map} +0 -0
  69. /package/dist/{import-OP7R4CYY.mjs.map → import-POYG5LOX.mjs.map} +0 -0
  70. /package/dist/{stream-import-L6RJHH4L.mjs.map → stream-import-O3H3FGV2.mjs.map} +0 -0
@@ -20,14 +20,14 @@ import {
20
20
  getMessageContext,
21
21
  getRecentMessages,
22
22
  getSearchMessageContext,
23
- getSessionMessages,
23
+ getSegmentMessages,
24
+ getSegmentSummaries,
24
25
  getSessionMeta,
25
26
  getSessionOverview,
26
- getSessionSummaries,
27
27
  getWeekdayActivity,
28
28
  searchMessagesLike,
29
- searchSessions
30
- } from "./chunk-4OMV4VNH.mjs";
29
+ searchSegments
30
+ } from "./chunk-QY67NN65.mjs";
31
31
 
32
32
  // ../../packages/tools/src/definitions/sql-query.ts
33
33
  var inputSchema = {
@@ -81,17 +81,23 @@ var schemaTool = {
81
81
 
82
82
  // ../../packages/tools/src/definitions/render-chart.ts
83
83
  var DEFAULT_MAX_ROWS = 1e3;
84
+ var DEFAULT_PREVIEW_ROWS = 20;
84
85
  var RE_SECONDS_TIMESTAMP_DIVIDED_AS_MILLISECONDS = /\b(?:\w+\.)?ts\s*\/\s*1000\b/i;
85
86
  var inputSchema2 = {
86
87
  type: "object",
87
88
  properties: {
89
+ rows: {
90
+ type: "array",
91
+ description: "Pre-fetched data rows to render directly, skipping SQL execution. Pass the data array from a high-level tool result (e.g. the `data` field from get_time_stats, or member activity rows). Prefer this over sql when data is already available. Mutually exclusive with sql.",
92
+ items: { type: "object" }
93
+ },
88
94
  sql: {
89
95
  type: "string",
90
- description: "Read-only SELECT or WITH SELECT SQL used to produce chart rows."
96
+ description: "Read-only SELECT or WITH SELECT SQL used to produce chart rows. Use only when pre-fetched data is unavailable or custom aggregation is required."
91
97
  },
92
98
  params: {
93
99
  type: "object",
94
- description: "Named SQL parameters. Use an empty object when no parameters are needed.",
100
+ description: "Named SQL parameters. Only used when sql is provided.",
95
101
  additionalProperties: true,
96
102
  default: {}
97
103
  },
@@ -108,7 +114,7 @@ var inputSchema2 = {
108
114
  maximum: 5e3
109
115
  }
110
116
  },
111
- required: ["sql", "chartSpec"]
117
+ required: ["chartSpec"]
112
118
  };
113
119
  function normalizeSql(sql, maxRows) {
114
120
  if (typeof sql !== "string" || sql.trim().length === 0) {
@@ -133,6 +139,14 @@ function normalizeParams(raw) {
133
139
  if (!raw || typeof raw !== "object" || Array.isArray(raw)) return {};
134
140
  return raw;
135
141
  }
142
+ function normalizeRows(raw, maxRows) {
143
+ if (!Array.isArray(raw)) throw new Error("rows must be an array");
144
+ const items = raw.filter(
145
+ (item) => typeof item === "object" && item !== null && !Array.isArray(item)
146
+ );
147
+ const truncated = items.length > maxRows;
148
+ return { rows: truncated ? items.slice(0, maxRows) : items, truncated };
149
+ }
136
150
  function normalizeMaxRows(raw) {
137
151
  const value = typeof raw === "number" ? raw : DEFAULT_MAX_ROWS;
138
152
  if (!Number.isFinite(value)) return DEFAULT_MAX_ROWS;
@@ -144,17 +158,40 @@ function summarizeChart(type, title, rowCount, truncated, locale) {
144
158
  }
145
159
  return `Generated chart "${title}" (${type}, ${rowCount} rows${truncated ? ", truncated" : ""}).`;
146
160
  }
161
+ function summarizeChartForModel(type, title, rows, truncated, locale) {
162
+ const summary = summarizeChart(type, title, rows.length, truncated, locale);
163
+ const previewRows = rows.slice(0, DEFAULT_PREVIEW_ROWS);
164
+ if (previewRows.length === 0) return summary;
165
+ const preview = JSON.stringify(previewRows);
166
+ if (locale?.startsWith("zh")) {
167
+ return `${summary}
168
+ \u6570\u636E\u9884\u89C8\uFF08\u524D ${previewRows.length} \u884C\uFF0C\u7528\u4E8E\u5206\u6790\u5CF0\u503C\u3001\u4F4E\u8C37\u548C\u5DEE\u5F02\uFF09\uFF1A${preview}`;
169
+ }
170
+ return `${summary}
171
+ Data preview (first ${previewRows.length} rows; use this to identify peaks, lows, and differences): ${preview}`;
172
+ }
147
173
  async function handler2(params, context) {
148
174
  if (!context.dataProvider) throw new Error("render_chart requires a data provider");
175
+ const hasSql = typeof params.sql === "string" && params.sql.trim().length > 0;
176
+ const hasRows = Array.isArray(params.rows);
177
+ if (!hasSql && !hasRows) throw new Error("render_chart requires either sql or rows");
149
178
  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;
179
+ let rows;
180
+ let truncated;
181
+ if (hasRows) {
182
+ const normalized = normalizeRows(params.rows, maxRows);
183
+ rows = normalized.rows;
184
+ truncated = normalized.truncated;
185
+ } else {
186
+ const sql = normalizeSql(params.sql, maxRows);
187
+ const sqlParams = normalizeParams(params.params);
188
+ const fetchedRows = await context.dataProvider.executeParameterizedSql(sql, sqlParams);
189
+ truncated = fetchedRows.length > maxRows;
190
+ rows = truncated ? fetchedRows.slice(0, maxRows) : fetchedRows;
191
+ }
155
192
  const chart = buildChartPayload(rows, params.chartSpec, { truncated });
156
193
  return {
157
- content: summarizeChart(chart.spec.type, chart.spec.title, rows.length, truncated, context.locale),
194
+ content: summarizeChartForModel(chart.spec.type, chart.spec.title, rows, truncated, context.locale),
158
195
  data: {
159
196
  rowCount: rows.length,
160
197
  truncated,
@@ -166,7 +203,7 @@ async function handler2(params, context) {
166
203
  }
167
204
  var renderChartTool = {
168
205
  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.",
206
+ description: "Generate a native ChatLab chart from ChartSpec v1. Provide either `rows` (pre-fetched data array from a tool result such as get_time_stats or member_stats) or `sql` (read-only SELECT). Prefer `rows` when data is already available \u2014 pass the tool's data array directly. Use `sql` only for custom aggregations not covered by existing tools. Never output HTML, JavaScript, SVG, ECharts options, or rendering code.",
170
207
  inputSchema: inputSchema2,
171
208
  handler: handler2,
172
209
  category: "analysis"
@@ -495,12 +532,12 @@ var getMessageContextTool = {
495
532
  truncationStrategy: "keep_last"
496
533
  };
497
534
 
498
- // ../../packages/tools/src/definitions/search-sessions.ts
535
+ // ../../packages/tools/src/definitions/search-segments.ts
499
536
  var inputSchema9 = {
500
537
  type: "object",
501
538
  properties: {
502
539
  keywords: { type: "array", items: { type: "string" }, description: "\u641C\u7D22\u5173\u952E\u8BCD\u5217\u8868" },
503
- limit: { type: "number", description: "\u8FD4\u56DE\u7684\u6700\u5927\u4F1A\u8BDD\u6570\uFF0C\u9ED8\u8BA4 20" },
540
+ limit: { type: "number", description: "\u8FD4\u56DE\u7684\u6700\u5927\u6BB5\u843D\u6570\uFF0C\u9ED8\u8BA4 20" },
504
541
  ...timeParamProperties
505
542
  }
506
543
  };
@@ -508,31 +545,31 @@ async function handler9(params, context) {
508
545
  const { locale, timeFilter: contextTimeFilter } = context;
509
546
  const limit = params.limit || 20;
510
547
  const effectiveTimeFilter = parseExtendedTimeParams(params, contextTimeFilter);
511
- const sessions = await context.dataProvider.searchSessions(
548
+ const segments = await context.dataProvider.searchSegments(
512
549
  params.keywords,
513
550
  effectiveTimeFilter,
514
551
  limit,
515
552
  5
516
553
  );
517
- if (sessions.length === 0) {
554
+ if (segments.length === 0) {
518
555
  const data2 = {
519
556
  total: 0,
520
- message: isChineseLocale(locale) ? "\u672A\u627E\u5230\u5339\u914D\u7684\u4F1A\u8BDD" : "No matching sessions found"
557
+ message: isChineseLocale(locale) ? "\u672A\u627E\u5230\u5339\u914D\u7684\u6BB5\u843D" : "No matching segments found"
521
558
  };
522
559
  return { content: JSON.stringify(data2), data: data2 };
523
560
  }
524
561
  const localeStr = isChineseLocale(locale) ? "zh-CN" : "en-US";
525
562
  const msgSuffix = isChineseLocale(locale) ? "\u6761\u6D88\u606F" : " messages";
526
- const completeLabel = isChineseLocale(locale) ? "\u5B8C\u6574\u4F1A\u8BDD" : "complete";
563
+ const completeLabel = isChineseLocale(locale) ? "\u5B8C\u6574\u6BB5\u843D" : "complete";
527
564
  const data = {
528
- total: sessions.length,
565
+ total: segments.length,
529
566
  timeRange: formatTimeRange(effectiveTimeFilter, locale),
530
- sessions: sessions.map((s) => {
567
+ segments: segments.map((s) => {
531
568
  const startTime = new Date(s.startTs * 1e3).toLocaleString(localeStr);
532
569
  const endTime = new Date(s.endTs * 1e3).toLocaleString(localeStr);
533
570
  const completeTag = s.isComplete ? ` [${completeLabel}]` : "";
534
571
  return {
535
- sessionId: s.id,
572
+ segmentId: s.id,
536
573
  time: `${startTime} ~ ${endTime}`,
537
574
  messageCount: `${s.messageCount}${msgSuffix}${completeTag}`,
538
575
  preview: s.previewMessages.map((m) => formatMessageCompact(m, locale))
@@ -541,31 +578,31 @@ async function handler9(params, context) {
541
578
  };
542
579
  return { content: JSON.stringify(data), data };
543
580
  }
544
- var searchSessionsTool = {
545
- name: "search_sessions",
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",
581
+ var searchSegmentsTool = {
582
+ name: "search_segments",
583
+ description: "\u641C\u7D22\u804A\u5929\u6BB5\u843D\uFF08\u5BF9\u8BDD\u6BB5\u843D\uFF09\u3002\u6BB5\u843D\u662F\u6839\u636E\u6D88\u606F\u65F6\u95F4\u95F4\u9694\u81EA\u52A8\u5207\u5206\u7684\u5BF9\u8BDD\u5355\u5143\u3002\u8FD4\u56DE\u5339\u914D\u7684\u6BB5\u843D\u5217\u8868\u53CA\u6BCF\u4E2A\u6BB5\u843D\u7684\u524D5\u6761\u6D88\u606F\u9884\u89C8\u3002",
547
584
  inputSchema: inputSchema9,
548
585
  handler: handler9,
549
586
  category: "core"
550
587
  };
551
588
 
552
- // ../../packages/tools/src/definitions/get-session-messages.ts
589
+ // ../../packages/tools/src/definitions/get-segment-messages.ts
553
590
  var inputSchema10 = {
554
591
  type: "object",
555
592
  properties: {
556
- session_id: { type: "number", description: "\u4F1A\u8BDD ID\uFF08\u901A\u8FC7 search_sessions \u83B7\u53D6\uFF09" },
593
+ segment_id: { type: "number", description: "\u6BB5\u843D ID\uFF08\u901A\u8FC7 search_segments \u83B7\u53D6\uFF09" },
557
594
  limit: { type: "number", description: "\u8FD4\u56DE\u7684\u6700\u5927\u6D88\u606F\u6761\u6570" }
558
595
  },
559
- required: ["session_id"]
596
+ required: ["segment_id"]
560
597
  };
561
598
  async function handler10(params, context) {
562
599
  const { locale, maxMessagesLimit } = context;
563
600
  const limit = maxMessagesLimit || params.limit || 1e3;
564
- const result = await context.dataProvider.getSessionMessages(params.session_id, limit);
601
+ const result = await context.dataProvider.getSegmentMessages(params.segment_id, limit);
565
602
  if (!result) {
566
603
  const data2 = {
567
- error: isChineseLocale(locale) ? "\u672A\u627E\u5230\u6307\u5B9A\u7684\u4F1A\u8BDD" : "Session not found",
568
- sessionId: params.session_id
604
+ error: isChineseLocale(locale) ? "\u672A\u627E\u5230\u6307\u5B9A\u7684\u6BB5\u843D" : "Segment not found",
605
+ segmentId: params.segment_id
569
606
  };
570
607
  return { content: JSON.stringify(data2), data: data2 };
571
608
  }
@@ -579,7 +616,7 @@ async function handler10(params, context) {
579
616
  timestamp: m.timestamp
580
617
  }));
581
618
  const data = {
582
- sessionId: result.sessionId,
619
+ segmentId: result.segmentId,
583
620
  time: `${startTime} ~ ${endTime}`,
584
621
  messageCount: result.messageCount,
585
622
  returnedCount: result.returnedCount,
@@ -588,9 +625,9 @@ async function handler10(params, context) {
588
625
  };
589
626
  return { content: JSON.stringify(data), data, rawMessages };
590
627
  }
591
- var getSessionMessagesTool = {
592
- name: "get_session_messages",
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",
628
+ var getSegmentMessagesTool = {
629
+ name: "get_segment_messages",
630
+ description: "\u83B7\u53D6\u6307\u5B9A\u6BB5\u843D\u7684\u5B8C\u6574\u6D88\u606F\u5217\u8868\u3002\u7528\u4E8E\u5728 search_segments \u627E\u5230\u76F8\u5173\u6BB5\u843D\u540E\uFF0C\u83B7\u53D6\u8BE5\u6BB5\u843D\u7684\u5B8C\u6574\u4E0A\u4E0B\u6587\u3002",
594
631
  inputSchema: inputSchema10,
595
632
  handler: handler10,
596
633
  category: "core",
@@ -841,12 +878,12 @@ var getConversationBetweenTool = {
841
878
  truncationStrategy: "keep_last"
842
879
  };
843
880
 
844
- // ../../packages/tools/src/definitions/get-session-summaries.ts
881
+ // ../../packages/tools/src/definitions/get-segment-summaries.ts
845
882
  var inputSchema17 = {
846
883
  type: "object",
847
884
  properties: {
848
885
  keywords: { type: "array", items: { type: "string" }, description: "\u6309\u5173\u952E\u8BCD\u8FC7\u6EE4\u6458\u8981\u5185\u5BB9" },
849
- limit: { type: "number", description: "\u8FD4\u56DE\u7684\u6700\u5927\u4F1A\u8BDD\u6570\uFF0C\u9ED8\u8BA4 20" },
886
+ limit: { type: "number", description: "\u8FD4\u56DE\u7684\u6700\u5927\u6BB5\u843D\u6570\uFF0C\u9ED8\u8BA4 20" },
850
887
  ...timeParamProperties
851
888
  }
852
889
  };
@@ -854,36 +891,36 @@ async function handler17(params, context) {
854
891
  const { locale, timeFilter: contextTimeFilter } = context;
855
892
  const limit = params.limit || 20;
856
893
  const effectiveTimeFilter = parseExtendedTimeParams(params, contextTimeFilter);
857
- const sessions = await context.dataProvider.getSessionSummaries({
894
+ const segments = await context.dataProvider.getSegmentSummaries({
858
895
  limit: limit * 2,
859
896
  timeFilter: effectiveTimeFilter
860
897
  });
861
- if (!sessions || sessions.length === 0) {
898
+ if (!segments || segments.length === 0) {
862
899
  const data2 = {
863
- message: isChineseLocale(locale) ? '\u672A\u627E\u5230\u5E26\u6458\u8981\u7684\u4F1A\u8BDD\u3002\u53EF\u80FD\u8FD8\u6CA1\u6709\u751F\u6210\u6458\u8981\uFF0C\u8BF7\u5728\u4F1A\u8BDD\u65F6\u95F4\u7EBF\u4E2D\u70B9\u51FB"\u6279\u91CF\u751F\u6210"\u6309\u94AE\u3002' : "No sessions with summaries found. Summaries may not have been generated yet."
900
+ message: isChineseLocale(locale) ? '\u672A\u627E\u5230\u5E26\u6458\u8981\u7684\u6BB5\u843D\u3002\u53EF\u80FD\u8FD8\u6CA1\u6709\u751F\u6210\u6458\u8981\uFF0C\u8BF7\u5728\u6BB5\u843D\u65F6\u95F4\u7EBF\u4E2D\u70B9\u51FB"\u6279\u91CF\u751F\u6210"\u6309\u94AE\u3002' : "No segments with summaries found. Summaries may not have been generated yet."
864
901
  };
865
902
  return { content: JSON.stringify(data2), data: data2 };
866
903
  }
867
- let filteredSessions = sessions;
904
+ let filteredSegments = segments;
868
905
  const keywords = params.keywords;
869
906
  if (keywords && keywords.length > 0) {
870
907
  const lowerKeywords = keywords.map((k) => k.toLowerCase());
871
- filteredSessions = sessions.filter(
908
+ filteredSegments = segments.filter(
872
909
  (s) => lowerKeywords.some((keyword) => s.summary?.toLowerCase().includes(keyword))
873
910
  );
874
911
  }
875
- filteredSessions = filteredSessions.filter((s) => s.summary);
876
- const limitedSessions = filteredSessions.slice(0, limit);
912
+ filteredSegments = filteredSegments.filter((s) => s.summary);
913
+ const limitedSegments = filteredSegments.slice(0, limit);
877
914
  const localeStr = isChineseLocale(locale) ? "zh-CN" : "en-US";
878
915
  const data = {
879
- total: filteredSessions.length,
880
- returned: limitedSessions.length,
916
+ total: filteredSegments.length,
917
+ returned: limitedSegments.length,
881
918
  timeRange: formatTimeRange(effectiveTimeFilter, locale),
882
- sessions: limitedSessions.map((s) => {
919
+ segments: limitedSegments.map((s) => {
883
920
  const startTime = new Date(s.startTs * 1e3).toLocaleString(localeStr);
884
921
  const endTime = new Date(s.endTs * 1e3).toLocaleString(localeStr);
885
922
  return {
886
- sessionId: s.id,
923
+ segmentId: s.id,
887
924
  time: `${startTime} ~ ${endTime}`,
888
925
  messageCount: s.messageCount,
889
926
  participants: s.participants,
@@ -893,9 +930,9 @@ async function handler17(params, context) {
893
930
  };
894
931
  return { content: JSON.stringify(data), data };
895
932
  }
896
- var getSessionSummariesTool = {
897
- name: "get_session_summaries",
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",
933
+ var getSegmentSummariesTool = {
934
+ name: "get_segment_summaries",
935
+ description: "\u83B7\u53D6\u6BB5\u843D\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",
899
936
  inputSchema: inputSchema17,
900
937
  handler: handler17,
901
938
  category: "analysis"
@@ -1208,7 +1245,7 @@ var SQL_TOOL_DEFS = [
1208
1245
  },
1209
1246
  execution: {
1210
1247
  type: "sqlite",
1211
- query: "SELECT COALESCE(m.group_nickname, m.account_name) AS name, COUNT(*) AS initiated_count FROM chat_session cs JOIN message_context mc ON mc.session_id = cs.id JOIN message msg ON msg.id = mc.message_id JOIN member m ON msg.sender_id = m.id WHERE msg.ts = cs.start_ts AND cs.start_ts > unixepoch('now', '-' || @days || ' days') GROUP BY msg.sender_id ORDER BY initiated_count DESC LIMIT @limit",
1248
+ query: "SELECT COALESCE(m.group_nickname, m.account_name) AS name, COUNT(*) AS initiated_count FROM segment cs JOIN message_context mc ON mc.segment_id = cs.id JOIN message msg ON msg.id = mc.message_id JOIN member m ON msg.sender_id = m.id WHERE msg.ts = cs.start_ts AND cs.start_ts > unixepoch('now', '-' || @days || ' days') GROUP BY msg.sender_id ORDER BY initiated_count DESC LIMIT @limit",
1212
1249
  rowTemplate: "{name}\uFF1A\u53D1\u8D77 {initiated_count} \u6B21\u8BDD\u9898",
1213
1250
  summaryTemplate: "\u8BDD\u9898\u53D1\u8D77\u8005 Top {rowCount}\uFF1A",
1214
1251
  fallback: "\u8BE5\u65F6\u95F4\u8303\u56F4\u5185\u6CA1\u6709\u4F1A\u8BDD\u8BB0\u5F55\uFF0C\u53EF\u80FD\u9700\u8981\u5148\u751F\u6210\u4F1A\u8BDD\u7D22\u5F15"
@@ -1310,8 +1347,8 @@ var SHARED_TOOLS = [
1310
1347
  deepSearchMessagesTool,
1311
1348
  recentMessagesTool,
1312
1349
  getMessageContextTool,
1313
- searchSessionsTool,
1314
- getSessionMessagesTool,
1350
+ searchSegmentsTool,
1351
+ getSegmentMessagesTool,
1315
1352
  getMembersTool,
1316
1353
  schemaTool,
1317
1354
  // Analysis
@@ -1319,7 +1356,7 @@ var SHARED_TOOLS = [
1319
1356
  timeStatsTool,
1320
1357
  getMemberNameHistoryTool,
1321
1358
  getConversationBetweenTool,
1322
- getSessionSummariesTool,
1359
+ getSegmentSummariesTool,
1323
1360
  responseTimeAnalysisTool,
1324
1361
  keywordFrequencyTool,
1325
1362
  renderChartTool,
@@ -1409,14 +1446,14 @@ var CoreDataProvider = class {
1409
1446
  return getHourlyActivity(this.db, filter);
1410
1447
  }
1411
1448
  }
1412
- async searchSessions(keywords, timeFilter, limit, previewCount) {
1413
- return searchSessions(this.db, keywords, timeFilter, limit, previewCount);
1449
+ async searchSegments(keywords, timeFilter, limit, previewCount) {
1450
+ return searchSegments(this.db, keywords, timeFilter, limit, previewCount);
1414
1451
  }
1415
- async getSessionMessages(chatSessionId, limit) {
1416
- return getSessionMessages(this.db, chatSessionId, limit);
1452
+ async getSegmentMessages(segmentId, limit) {
1453
+ return getSegmentMessages(this.db, segmentId, limit);
1417
1454
  }
1418
- async getSessionSummaries(options) {
1419
- return getSessionSummaries(this.db, options);
1455
+ async getSegmentSummaries(options) {
1456
+ return getSegmentSummaries(this.db, options);
1420
1457
  }
1421
1458
  async getConversationBetween(memberId1, memberId2, timeFilter, limit) {
1422
1459
  return getConversationBetween(this.db, memberId1, memberId2, timeFilter, limit);
@@ -1437,4 +1474,4 @@ export {
1437
1474
  MCP_TOOL_REGISTRY,
1438
1475
  CoreDataProvider
1439
1476
  };
1440
- //# sourceMappingURL=chunk-E65ABM3C.mjs.map
1477
+ //# sourceMappingURL=chunk-IRZRIHIT.mjs.map