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.
- package/dist/chat-command-ZP4WJVWC.mjs +304 -0
- package/dist/chat-command-ZP4WJVWC.mjs.map +1 -0
- package/dist/{chunk-CIBTUWAE.mjs → chunk-6G7AIF7I.mjs} +38 -8
- package/dist/chunk-6G7AIF7I.mjs.map +1 -0
- package/dist/chunk-ILGSSXOG.mjs +549 -0
- package/dist/chunk-ILGSSXOG.mjs.map +1 -0
- package/dist/{chunk-E65ABM3C.mjs → chunk-IRZRIHIT.mjs} +100 -63
- package/dist/chunk-IRZRIHIT.mjs.map +1 -0
- package/dist/{chunk-4OMV4VNH.mjs → chunk-QY67NN65.mjs} +1900 -729
- package/dist/chunk-QY67NN65.mjs.map +1 -0
- package/dist/{chunk-FSHVDWI2.mjs → chunk-SJIOPSMM.mjs} +116 -569
- package/dist/chunk-SJIOPSMM.mjs.map +1 -0
- package/dist/{chunk-GNT5G74Z.mjs → chunk-TC74HESZ.mjs} +59 -33
- package/dist/chunk-TC74HESZ.mjs.map +1 -0
- package/dist/chunk-UB4XBM4R.mjs +40 -0
- package/dist/chunk-UB4XBM4R.mjs.map +1 -0
- package/dist/{chunk-TCPXAX3F.mjs → chunk-WXC6RZCX.mjs} +17 -25
- package/dist/chunk-WXC6RZCX.mjs.map +1 -0
- package/dist/cli.mjs +3 -2
- package/dist/{http-PMNZ42EN.mjs → http-J3IOFFIA.mjs} +8 -6
- package/dist/{import-OP7R4CYY.mjs → import-POYG5LOX.mjs} +4 -4
- package/dist/index.mjs +10 -8
- package/dist/{mcp-ABXNFUJO.mjs → mcp-7HH7UMXT.mjs} +11 -6
- package/dist/mcp-7HH7UMXT.mjs.map +1 -0
- package/dist/{stream-import-L6RJHH4L.mjs → stream-import-O3H3FGV2.mjs} +3 -3
- package/dist-web/assets/{DebugToolsPanel-DaSNc1o-.css → DebugToolsPanel-CrqULdXp.css} +1 -1
- package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BTJxEma5.js +182 -0
- package/dist-web/assets/{EChartWordcloud-CzhfrEF_.js → EChartWordcloud-B_YisOW5.js} +1 -1
- package/dist-web/assets/{MessageExportModal-BAJKWX4y.js → MessageExportModal-C7NgEL8T.js} +1 -1
- package/dist-web/assets/{electron-CZt36wW5.js → electron-B3DFm1cC.js} +1 -1
- package/dist-web/assets/electron-BMM4Nfty.js +1 -0
- package/dist-web/assets/{fetch-qoGEVjNg.js → fetch-ArMjdMcy.js} +1 -1
- package/dist-web/assets/fetch-BFtuJaa1.js +1 -0
- package/dist-web/assets/{fetch-yWwp067l.js → fetch-BGfaAqO9.js} +1 -1
- package/dist-web/assets/{fetch-DD1EGRKV.js → fetch-BaJDB31c.js} +1 -1
- package/dist-web/assets/{fetch-JzVEwamn.js → fetch-BjDJgdN0.js} +1 -1
- package/dist-web/assets/{fetch-GMkMBzBS.js → fetch-C5CLcpQW.js} +1 -1
- package/dist-web/assets/{fetch-DXfZysDf.js → fetch-DQZvdHnG.js} +1 -1
- package/dist-web/assets/{fetch-D4p9vj1A.js → fetch-Dhfbt1BQ.js} +3 -3
- package/dist-web/assets/fetch-DnEP0uyF.js +1 -0
- package/dist-web/assets/{fetch-CgBIWyAo.js → fetch-SYrb-sZe.js} +1 -1
- package/dist-web/assets/index-CWfkrx37.js +173 -0
- package/dist-web/assets/index-D3N4NDFx.css +1 -0
- package/dist-web/assets/{index-O0PG26_v.js → index-D7_ch4zf.js} +1 -1
- package/dist-web/assets/{index-BrS_VrIY.js → index-DK9LEEzT.js} +1 -1
- package/dist-web/assets/index-DqDa_on9.js +9 -0
- package/dist-web/assets/{index-Cvlw0RLu.js → index-DrN1G9bl.js} +2 -2
- package/dist-web/assets/{index-DvWI6Yqa.js → index-MdYeovYo.js} +4 -4
- package/dist-web/assets/{vendor-nuxt-ui-C_8CsH6e.js → vendor-nuxt-ui-Zy8txNdC.js} +1 -1
- package/dist-web/assets/{vendor-reka-ui-CIMXwvEp.js → vendor-reka-ui-mMvma1EP.js} +1 -1
- package/dist-web/assets/{web-4rtrAcLu.js → web-zEXsvoZW.js} +1 -1
- package/dist-web/index.html +4 -4
- package/package.json +1 -1
- package/dist/chunk-4OMV4VNH.mjs.map +0 -1
- package/dist/chunk-CIBTUWAE.mjs.map +0 -1
- package/dist/chunk-E65ABM3C.mjs.map +0 -1
- package/dist/chunk-FSHVDWI2.mjs.map +0 -1
- package/dist/chunk-GNT5G74Z.mjs.map +0 -1
- package/dist/chunk-TCPXAX3F.mjs.map +0 -1
- package/dist/mcp-ABXNFUJO.mjs.map +0 -1
- package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BUwpIerl.js +0 -161
- package/dist-web/assets/electron-CwERrTWp.js +0 -1
- package/dist-web/assets/fetch-BxFAkm7O.js +0 -1
- package/dist-web/assets/fetch-DO8lty7_.js +0 -1
- package/dist-web/assets/index-C1t-kzfo.css +0 -1
- package/dist-web/assets/index-DABpUm3J.js +0 -9
- package/dist-web/assets/index-OsjX5hXw.js +0 -173
- /package/dist/{http-PMNZ42EN.mjs.map → http-J3IOFFIA.mjs.map} +0 -0
- /package/dist/{import-OP7R4CYY.mjs.map → import-POYG5LOX.mjs.map} +0 -0
- /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
|
-
|
|
23
|
+
getSegmentMessages,
|
|
24
|
+
getSegmentSummaries,
|
|
24
25
|
getSessionMeta,
|
|
25
26
|
getSessionOverview,
|
|
26
|
-
getSessionSummaries,
|
|
27
27
|
getWeekdayActivity,
|
|
28
28
|
searchMessagesLike,
|
|
29
|
-
|
|
30
|
-
} from "./chunk-
|
|
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.
|
|
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: ["
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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:
|
|
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
|
|
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-
|
|
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\
|
|
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
|
|
548
|
+
const segments = await context.dataProvider.searchSegments(
|
|
512
549
|
params.keywords,
|
|
513
550
|
effectiveTimeFilter,
|
|
514
551
|
limit,
|
|
515
552
|
5
|
|
516
553
|
);
|
|
517
|
-
if (
|
|
554
|
+
if (segments.length === 0) {
|
|
518
555
|
const data2 = {
|
|
519
556
|
total: 0,
|
|
520
|
-
message: isChineseLocale(locale) ? "\u672A\u627E\u5230\u5339\u914D\u7684\
|
|
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\
|
|
563
|
+
const completeLabel = isChineseLocale(locale) ? "\u5B8C\u6574\u6BB5\u843D" : "complete";
|
|
527
564
|
const data = {
|
|
528
|
-
total:
|
|
565
|
+
total: segments.length,
|
|
529
566
|
timeRange: formatTimeRange(effectiveTimeFilter, locale),
|
|
530
|
-
|
|
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
|
-
|
|
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
|
|
545
|
-
name: "
|
|
546
|
-
description: "\u641C\u7D22\u804A\u5929\
|
|
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-
|
|
589
|
+
// ../../packages/tools/src/definitions/get-segment-messages.ts
|
|
553
590
|
var inputSchema10 = {
|
|
554
591
|
type: "object",
|
|
555
592
|
properties: {
|
|
556
|
-
|
|
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: ["
|
|
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.
|
|
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\
|
|
568
|
-
|
|
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
|
-
|
|
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
|
|
592
|
-
name: "
|
|
593
|
-
description: "\u83B7\u53D6\u6307\u5B9A\
|
|
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-
|
|
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\
|
|
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
|
|
894
|
+
const segments = await context.dataProvider.getSegmentSummaries({
|
|
858
895
|
limit: limit * 2,
|
|
859
896
|
timeFilter: effectiveTimeFilter
|
|
860
897
|
});
|
|
861
|
-
if (!
|
|
898
|
+
if (!segments || segments.length === 0) {
|
|
862
899
|
const data2 = {
|
|
863
|
-
message: isChineseLocale(locale) ? '\u672A\u627E\u5230\u5E26\u6458\u8981\u7684\
|
|
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
|
|
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
|
-
|
|
908
|
+
filteredSegments = segments.filter(
|
|
872
909
|
(s) => lowerKeywords.some((keyword) => s.summary?.toLowerCase().includes(keyword))
|
|
873
910
|
);
|
|
874
911
|
}
|
|
875
|
-
|
|
876
|
-
const
|
|
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:
|
|
880
|
-
returned:
|
|
916
|
+
total: filteredSegments.length,
|
|
917
|
+
returned: limitedSegments.length,
|
|
881
918
|
timeRange: formatTimeRange(effectiveTimeFilter, locale),
|
|
882
|
-
|
|
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
|
-
|
|
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
|
|
897
|
-
name: "
|
|
898
|
-
description: "\u83B7\u53D6\
|
|
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
|
|
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
|
-
|
|
1314
|
-
|
|
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
|
-
|
|
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
|
|
1413
|
-
return
|
|
1449
|
+
async searchSegments(keywords, timeFilter, limit, previewCount) {
|
|
1450
|
+
return searchSegments(this.db, keywords, timeFilter, limit, previewCount);
|
|
1414
1451
|
}
|
|
1415
|
-
async
|
|
1416
|
-
return
|
|
1452
|
+
async getSegmentMessages(segmentId, limit) {
|
|
1453
|
+
return getSegmentMessages(this.db, segmentId, limit);
|
|
1417
1454
|
}
|
|
1418
|
-
async
|
|
1419
|
-
return
|
|
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-
|
|
1477
|
+
//# sourceMappingURL=chunk-IRZRIHIT.mjs.map
|