chatlab-cli 0.28.1 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/{chat-command-ISJ2DC7R.mjs → chat-command-UZ23GKO7.mjs} +8 -5
  2. package/dist/{chat-command-ISJ2DC7R.mjs.map → chat-command-UZ23GKO7.mjs.map} +1 -1
  3. package/dist/{chunk-AB6TAXTQ.mjs → chunk-4IZ3WKYU.mjs} +591 -310
  4. package/dist/chunk-4IZ3WKYU.mjs.map +1 -0
  5. package/dist/{chunk-3QBVO4J7.mjs → chunk-5UBHNQFZ.mjs} +101 -41
  6. package/dist/chunk-5UBHNQFZ.mjs.map +1 -0
  7. package/dist/chunk-7BZLS2KW.mjs +8965 -0
  8. package/dist/chunk-7BZLS2KW.mjs.map +1 -0
  9. package/dist/{chunk-ZVDOFWL7.mjs → chunk-A2SANKG4.mjs} +4043 -10895
  10. package/dist/chunk-A2SANKG4.mjs.map +1 -0
  11. package/dist/chunk-CNSYXRJP.mjs +526 -0
  12. package/dist/chunk-CNSYXRJP.mjs.map +1 -0
  13. package/dist/{chunk-T7IETWHN.mjs → chunk-FCCL5Z4W.mjs} +5 -3
  14. package/dist/{chunk-T7IETWHN.mjs.map → chunk-FCCL5Z4W.mjs.map} +1 -1
  15. package/dist/chunk-M55KW2HA.mjs +2323 -0
  16. package/dist/chunk-M55KW2HA.mjs.map +1 -0
  17. package/dist/chunk-MUPILWAZ.mjs +1339 -0
  18. package/dist/chunk-MUPILWAZ.mjs.map +1 -0
  19. package/dist/{chunk-YBS3YQB6.mjs → chunk-P3ZOLTGS.mjs} +31 -57
  20. package/dist/chunk-P3ZOLTGS.mjs.map +1 -0
  21. package/dist/{chunk-NJB2NNB2.mjs → chunk-RDR6PS2R.mjs} +2 -2
  22. package/dist/{chunk-ERAAWLEF.mjs → chunk-ZFU2CHW3.mjs} +11 -8
  23. package/dist/{chunk-ERAAWLEF.mjs.map → chunk-ZFU2CHW3.mjs.map} +1 -1
  24. package/dist/cli.mjs +7 -4
  25. package/dist/contacts-worker.mjs +48 -0
  26. package/dist/contacts-worker.mjs.map +1 -0
  27. package/dist/{http-MBILV37U.mjs → http-UWRA5FLB.mjs} +11 -8
  28. package/dist/{import-EYV3GXHE.mjs → import-745KQL7N.mjs} +7 -4
  29. package/dist/index.mjs +11 -8
  30. package/dist/{mcp-H55AEXU5.mjs → mcp-UHN5JOHC.mjs} +8 -5
  31. package/dist/{mcp-H55AEXU5.mjs.map → mcp-UHN5JOHC.mjs.map} +1 -1
  32. package/dist/people-relationships-worker.mjs +48 -0
  33. package/dist/people-relationships-worker.mjs.map +1 -0
  34. package/dist/semantic-index-worker.mjs +1 -1
  35. package/dist/{src-36ZIR65K.mjs → src-Y7MDRXLJ.mjs} +68 -44
  36. package/dist/{stream-import-YZMZ56B5.mjs → stream-import-3JMXQD7P.mjs} +7 -4
  37. package/dist/{worker-runtime-YDYS2C6T.mjs → worker-runtime-63RYMGZI.mjs} +7 -3
  38. package/dist/{worker-runtime-YDYS2C6T.mjs.map → worker-runtime-63RYMGZI.mjs.map} +1 -1
  39. package/dist-web/assets/BufferResource-BVdJ_I5X.js +185 -0
  40. package/dist-web/assets/CanvasRenderer-BaRuT54R.js +1 -0
  41. package/dist-web/assets/DebugToolsPanel-D_lFIW6j.css +1 -0
  42. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-N5CoiJzN.js +110 -0
  43. package/dist-web/assets/{EChartWordcloud-B_YisOW5.js → EChartWordcloud-Clg60FMo.js} +1 -1
  44. package/dist-web/assets/Filter-B7cNFtuE.js +1 -0
  45. package/dist-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-D_dJuLWJ.js +1 -0
  46. package/dist-web/assets/MessageExportModal-B2Qm6VVj.js +1 -0
  47. package/dist-web/assets/PageHeader-Bbn87QZS.css +1 -0
  48. package/dist-web/assets/PageHeader-PjlWy9fC.js +1 -0
  49. package/dist-web/assets/RelationshipGalaxyCanvas-11MafciW.js +244 -0
  50. package/dist-web/assets/RelationshipGalaxyThreeCanvas-BluPHjCR.css +1 -0
  51. package/dist-web/assets/RelationshipGalaxyThreeCanvas-C1I4B8NX.js +4108 -0
  52. package/dist-web/assets/RenderTargetSystem-Chkz1WlI.js +184 -0
  53. package/dist-web/assets/WebGLRenderer-xK19ru58.js +156 -0
  54. package/dist-web/assets/WebGPURenderer-CL5ZaKsn.js +41 -0
  55. package/dist-web/assets/browserAll-CyyNzRD_.js +14 -0
  56. package/dist-web/assets/electron-MXaTKaMu.js +1 -0
  57. package/dist-web/assets/{fetch-29ZBtGV0.js → fetch-D1dDiFO4.js} +1 -1
  58. package/dist-web/assets/{fetch-TCeykOkO.js → fetch-DDnVXGte.js} +1 -1
  59. package/dist-web/assets/{fetch-Bh1fo3Df.js → fetch-DTwdRTXM.js} +1 -1
  60. package/dist-web/assets/{fetch-BcxrU2mr.js → fetch-DaaJwT-5.js} +1 -1
  61. package/dist-web/assets/{fetch-tIIVdXSv.js → fetch-DeA0ztwT.js} +1 -1
  62. package/dist-web/assets/fetch-DpnIGZSN.js +17 -0
  63. package/dist-web/assets/{fetch-C3yhWO2S.js → fetch-DsE-xcP2.js} +1 -1
  64. package/dist-web/assets/{fetch-BYczbT4C.js → fetch-DsTgYu_X.js} +1 -1
  65. package/dist-web/assets/fetch-hKE53UO4.js +1 -0
  66. package/dist-web/assets/fetch-u9GTMhMF.js +1 -0
  67. package/dist-web/assets/index---rXG1hZ.css +1 -0
  68. package/dist-web/assets/index-BVkE4qis.js +22 -0
  69. package/dist-web/assets/index-BcXLcFnV.css +1 -0
  70. package/dist-web/assets/index-BnHKyESZ.js +1 -0
  71. package/dist-web/assets/index-Btr5H7d-.js +2 -0
  72. package/dist-web/assets/{index-BX3tqfLz.css → index-C1p9CbmN.css} +1 -1
  73. package/dist-web/assets/index-COpza1A4.css +1 -0
  74. package/dist-web/assets/index-D04LWJop.js +173 -0
  75. package/dist-web/assets/index-DFCYmzGE.js +2 -0
  76. package/dist-web/assets/index-DosG7LmJ.css +1 -0
  77. package/dist-web/assets/index-DqXHRIhI.js +1 -0
  78. package/dist-web/assets/{index-fbWrQpgH.js → index-DqtXt3wl.js} +1 -1
  79. package/dist-web/assets/index-Dszv-QFp.js +64 -0
  80. package/dist-web/assets/index-DzLrWGXu.js +1 -0
  81. package/dist-web/assets/people-page-header-Mupn-U_b.js +1 -0
  82. package/dist-web/assets/relationship-galaxy-viewport-Cwfa51ER.js +1 -0
  83. package/dist-web/assets/{vendor-echarts-CITQeskI.js → vendor-echarts-hJVnODyU.js} +2 -2
  84. package/dist-web/assets/{vendor-echarts-wordcloud-B1kQMklB.js → vendor-echarts-wordcloud-k5ih2Jl4.js} +1 -1
  85. package/dist-web/assets/{vendor-nuxt-ui-Zy8txNdC.js → vendor-nuxt-ui-DaLxYaC4.js} +2 -2
  86. package/dist-web/assets/{vendor-reka-ui-mMvma1EP.js → vendor-reka-ui-CzM4kDQ7.js} +1 -1
  87. package/dist-web/assets/{vendor-zrender-DFl4U2Oe.js → vendor-zrender-5DcYjSZk.js} +1 -1
  88. package/dist-web/assets/{web-H3XLx159.js → web-DPVWfPS-.js} +1 -1
  89. package/dist-web/assets/webworkerAll-DF5QV_vN.js +83 -0
  90. package/dist-web/index.html +4 -4
  91. package/package.json +1 -1
  92. package/dist/chunk-3QBVO4J7.mjs.map +0 -1
  93. package/dist/chunk-AB6TAXTQ.mjs.map +0 -1
  94. package/dist/chunk-GHTGFM6O.mjs +0 -540
  95. package/dist/chunk-GHTGFM6O.mjs.map +0 -1
  96. package/dist/chunk-YBS3YQB6.mjs.map +0 -1
  97. package/dist/chunk-ZVDOFWL7.mjs.map +0 -1
  98. package/dist-web/assets/DebugToolsPanel-DFw6_G5V.css +0 -1
  99. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-Do3x4aL3.js +0 -110
  100. package/dist-web/assets/MessageExportModal-rijqUusq.js +0 -1
  101. package/dist-web/assets/electron-DWDCqx_d.js +0 -1
  102. package/dist-web/assets/fetch-BAxKmbKF.js +0 -1
  103. package/dist-web/assets/fetch-Da_TBxrX.js +0 -1
  104. package/dist-web/assets/fetch-DyD8wDhb.js +0 -17
  105. package/dist-web/assets/index-BzjLqlW_.js +0 -173
  106. package/dist-web/assets/index-C74qEDFh.js +0 -64
  107. package/dist-web/assets/index-CM6xNPFp.css +0 -1
  108. package/dist-web/assets/index-CgK2LLIF.js +0 -12
  109. package/dist-web/assets/index-CjkOvM3N.js +0 -2
  110. package/dist-web/assets/index-Dno7CADA.js +0 -1
  111. package/dist-web/assets/index-I3SWZjnW.css +0 -1
  112. /package/dist/{chunk-NJB2NNB2.mjs.map → chunk-RDR6PS2R.mjs.map} +0 -0
  113. /package/dist/{http-MBILV37U.mjs.map → http-UWRA5FLB.mjs.map} +0 -0
  114. /package/dist/{import-EYV3GXHE.mjs.map → import-745KQL7N.mjs.map} +0 -0
  115. /package/dist/{src-36ZIR65K.mjs.map → src-Y7MDRXLJ.mjs.map} +0 -0
  116. /package/dist/{stream-import-YZMZ56B5.mjs.map → stream-import-3JMXQD7P.mjs.map} +0 -0
@@ -6,6 +6,7 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  buildChartPayload,
9
+ computeResponseTimeStats,
9
10
  executeParameterizedSql,
10
11
  executeReadonlySql,
11
12
  getChatOverview,
@@ -18,15 +19,22 @@ import {
18
19
  getMembers,
19
20
  getMembersWithAliases,
20
21
  getMessageContext,
21
- getRecentMessages,
22
+ getMonthlyActivity,
22
23
  getSearchMessageContext,
23
24
  getSegmentMessages,
24
25
  getSegmentSummaries,
25
26
  getSessionMeta,
26
27
  getSessionOverview,
27
28
  getWeekdayActivity,
29
+ queryMessages,
28
30
  searchMessagesByKeywords
29
- } from "./chunk-ZVDOFWL7.mjs";
31
+ } from "./chunk-7BZLS2KW.mjs";
32
+
33
+ // ../../packages/tools/src/utils/limits.ts
34
+ function resolveMessageLimit(requestedLimit, defaultLimit, maxMessagesLimit) {
35
+ const requested = typeof requestedLimit === "number" && requestedLimit > 0 ? requestedLimit : defaultLimit;
36
+ return maxMessagesLimit && maxMessagesLimit > 0 ? Math.min(requested, maxMessagesLimit) : requested;
37
+ }
30
38
 
31
39
  // ../../packages/tools/src/definitions/sql-query.ts
32
40
  var inputSchema = {
@@ -34,15 +42,31 @@ var inputSchema = {
34
42
  properties: {
35
43
  sql: {
36
44
  type: "string",
37
- description: "\u8981\u6267\u884C\u7684 SELECT SQL \u67E5\u8BE2\u8BED\u53E5"
45
+ description: "\u8981\u6267\u884C\u7684 SELECT SQL \u67E5\u8BE2\u8BED\u53E5\u3002\u5EFA\u8BAE\u663E\u5F0F\u6DFB\u52A0 LIMIT\uFF0C\u5DE5\u5177\u8F93\u51FA\u4ECD\u4F1A\u88AB max_rows \u622A\u65AD\u3002"
46
+ },
47
+ max_rows: {
48
+ type: "number",
49
+ description: "\u6700\u591A\u8FD4\u56DE\u591A\u5C11\u884C\uFF0C\u9ED8\u8BA4 1000\uFF1B\u8FD8\u4F1A\u53D7\u8C03\u7528\u4E0A\u4E0B\u6587\u7684\u6D88\u606F\u4E0A\u9650\u9650\u5236\u3002"
38
50
  }
39
51
  },
40
52
  required: ["sql"]
41
53
  };
54
+ function clampSqlResultRows(result, maxRows) {
55
+ if (!result || typeof result !== "object" || maxRows <= 0) return result;
56
+ const resultLike = result;
57
+ if (!Array.isArray(resultLike.rows) || resultLike.rows.length <= maxRows) return result;
58
+ return {
59
+ ...resultLike,
60
+ rows: resultLike.rows.slice(0, maxRows),
61
+ rowCount: maxRows,
62
+ truncated: true
63
+ };
64
+ }
42
65
  async function handler(params, context) {
43
66
  const sql = params.sql;
67
+ const maxRows = resolveMessageLimit(params.max_rows, 1e3, context.maxMessagesLimit);
44
68
  try {
45
- const result = await context.dataProvider.executeSql(sql);
69
+ const result = clampSqlResultRows(await context.dataProvider.executeSql(sql, { maxRows }), maxRows);
46
70
  return {
47
71
  content: JSON.stringify(result),
48
72
  data: result
@@ -66,7 +90,7 @@ async function schemaHandler(_params, context) {
66
90
  }
67
91
  var sqlQueryTool = {
68
92
  name: "execute_sql",
69
- 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",
93
+ 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\u5EFA\u8BAE SQL \u663E\u5F0F\u6DFB\u52A0 LIMIT\uFF1B\u5DE5\u5177\u4F1A\u6309 max_rows \u622A\u65AD\u8F93\u51FA\uFF0C\u907F\u514D\u8FD4\u56DE\u8FC7\u5927\u7ED3\u679C\u96C6\u3002",
70
94
  inputSchema,
71
95
  handler,
72
96
  category: "analysis"
@@ -394,6 +418,32 @@ var timeParamProperties = {
394
418
  }
395
419
  };
396
420
 
421
+ // ../../packages/tools/src/definitions/search-context.ts
422
+ function trimMessagesPreservingHits(messages, hitIds, limit) {
423
+ if (limit <= 0) return [];
424
+ if (messages.length <= limit) return messages;
425
+ const requiredIds = new Set(hitIds);
426
+ if (requiredIds.size === 0) return messages.slice(0, limit);
427
+ const trimmed = messages.slice(0, limit);
428
+ const presentIds = new Set(trimmed.map((message) => message.id).filter((id) => id != null));
429
+ const missingHits = messages.filter(
430
+ (message) => message.id != null && requiredIds.has(message.id) && !presentIds.has(message.id)
431
+ );
432
+ for (const hit of missingHits) {
433
+ let replaceIndex = -1;
434
+ for (let i = trimmed.length - 1; i >= 0; i--) {
435
+ const id = trimmed[i].id;
436
+ if (id == null || !requiredIds.has(id)) {
437
+ replaceIndex = i;
438
+ break;
439
+ }
440
+ }
441
+ if (replaceIndex === -1) break;
442
+ trimmed[replaceIndex] = hit;
443
+ }
444
+ return trimmed.sort((a, b) => messages.indexOf(a) - messages.indexOf(b));
445
+ }
446
+
397
447
  // ../../packages/tools/src/definitions/search-messages.ts
398
448
  var inputSchema6 = {
399
449
  type: "object",
@@ -408,7 +458,7 @@ var inputSchema6 = {
408
458
  async function handler6(params, context) {
409
459
  const { locale, timeFilter: contextTimeFilter, maxMessagesLimit } = context;
410
460
  const keywords = params.keywords;
411
- const limit = Math.min(maxMessagesLimit || params.limit || 1e3, 5e4);
461
+ const limit = Math.min(resolveMessageLimit(params.limit, 1e3, maxMessagesLimit), 5e4);
412
462
  const effectiveTimeFilter = parseExtendedTimeParams(params, contextTimeFilter);
413
463
  const result = await context.dataProvider.searchMessages(keywords, {
414
464
  timeFilter: effectiveTimeFilter,
@@ -418,12 +468,13 @@ async function handler6(params, context) {
418
468
  const contextBefore = context.searchContextBefore ?? 2;
419
469
  const contextAfter = context.searchContextAfter ?? 2;
420
470
  let finalMessages = result.messages;
471
+ const hitIds = result.messages.map((m) => m.id).filter((id) => id != null);
421
472
  if ((contextBefore > 0 || contextAfter > 0) && result.messages.length > 0) {
422
- const hitIds = result.messages.map((m) => m.id).filter((id) => id != null);
423
473
  if (hitIds.length > 0) {
424
474
  finalMessages = await context.dataProvider.getSearchMessageContext(hitIds, contextBefore, contextAfter);
425
475
  }
426
476
  }
477
+ finalMessages = trimMessagesPreservingHits(finalMessages, hitIds, limit);
427
478
  const data = {
428
479
  total: result.total,
429
480
  returned: finalMessages.length,
@@ -455,7 +506,7 @@ var inputSchema7 = {
455
506
  async function handler7(params, context) {
456
507
  const { locale, timeFilter: contextTimeFilter, maxMessagesLimit } = context;
457
508
  const keywords = params.keywords;
458
- const limit = Math.min(maxMessagesLimit || params.limit || 1e3, 5e4);
509
+ const limit = Math.min(resolveMessageLimit(params.limit, 1e3, maxMessagesLimit), 5e4);
459
510
  const effectiveTimeFilter = parseExtendedTimeParams(params, contextTimeFilter);
460
511
  const result = await context.dataProvider.deepSearchMessages(keywords, {
461
512
  timeFilter: effectiveTimeFilter,
@@ -465,12 +516,13 @@ async function handler7(params, context) {
465
516
  const contextBefore = context.searchContextBefore ?? 2;
466
517
  const contextAfter = context.searchContextAfter ?? 2;
467
518
  let finalMessages = result.messages;
519
+ const hitIds = result.messages.map((m) => m.id).filter((id) => id != null);
468
520
  if ((contextBefore > 0 || contextAfter > 0) && result.messages.length > 0) {
469
- const hitIds = result.messages.map((m) => m.id).filter((id) => id != null);
470
521
  if (hitIds.length > 0) {
471
522
  finalMessages = await context.dataProvider.getSearchMessageContext(hitIds, contextBefore, contextAfter);
472
523
  }
473
524
  }
525
+ finalMessages = trimMessagesPreservingHits(finalMessages, hitIds, limit);
474
526
  const data = {
475
527
  total: result.total,
476
528
  returned: finalMessages.length,
@@ -499,8 +551,16 @@ var inputSchema8 = {
499
551
  };
500
552
  async function handler8(params, context) {
501
553
  const { locale } = context;
502
- const messageIds = params.message_ids;
503
- const contextSize = params.context_size || 20;
554
+ const maxMessagesLimit = context.maxMessagesLimit;
555
+ const requestedMessageIds = params.message_ids;
556
+ const messageIds = maxMessagesLimit && maxMessagesLimit > 0 ? requestedMessageIds.slice(0, maxMessagesLimit) : requestedMessageIds;
557
+ const requestedContextSize = params.context_size;
558
+ let contextSize = typeof requestedContextSize === "number" && Number.isFinite(requestedContextSize) ? Math.max(0, Math.floor(requestedContextSize)) : 20;
559
+ if (maxMessagesLimit && maxMessagesLimit > 0 && messageIds.length > 0) {
560
+ const maxMessagesPerId = Math.max(1, Math.floor(maxMessagesLimit / messageIds.length));
561
+ const maxContextSize = Math.max(0, Math.floor((maxMessagesPerId - 1) / 2));
562
+ contextSize = Math.min(contextSize, maxContextSize);
563
+ }
504
564
  const messages = await context.dataProvider.getMessageContext(messageIds, contextSize);
505
565
  if (messages.length === 0) {
506
566
  const data2 = {
@@ -537,7 +597,7 @@ var inputSchema9 = {
537
597
  };
538
598
  async function handler9(params, context) {
539
599
  const { locale, maxMessagesLimit } = context;
540
- const limit = maxMessagesLimit || params.limit || 1e3;
600
+ const limit = resolveMessageLimit(params.limit, 1e3, maxMessagesLimit);
541
601
  const result = await context.dataProvider.getSegmentMessages(params.segment_id, limit);
542
602
  if (!result) {
543
603
  const data2 = {
@@ -664,12 +724,14 @@ var inputSchema12 = {
664
724
  description: "\u7EDF\u8BA1\u7C7B\u578B\uFF1Ahourly\uFF08\u6309\u5C0F\u65F6\uFF09\u3001weekday\uFF08\u6309\u661F\u671F\uFF09\u3001daily\uFF08\u6309\u5929\uFF09",
665
725
  enum: ["hourly", "weekday", "daily"],
666
726
  default: "hourly"
667
- }
727
+ },
728
+ ...timeParamProperties
668
729
  }
669
730
  };
670
731
  async function handler12(params, context) {
671
732
  const type = params.type || "hourly";
672
- const data = await context.dataProvider.getTimeStats(type, { timeFilter: context.timeFilter });
733
+ const effectiveTimeFilter = parseExtendedTimeParams(params, context.timeFilter);
734
+ const data = await context.dataProvider.getTimeStats(type, { timeFilter: effectiveTimeFilter });
673
735
  return {
674
736
  content: JSON.stringify({ type, data }),
675
737
  data
@@ -697,7 +759,7 @@ var inputSchema13 = {
697
759
  };
698
760
  async function handler13(params, context) {
699
761
  const { locale, timeFilter: contextTimeFilter, maxMessagesLimit } = context;
700
- const limit = maxMessagesLimit || params.limit || 100;
762
+ const limit = resolveMessageLimit(params.limit, 100, maxMessagesLimit);
701
763
  const effectiveTimeFilter = parseExtendedTimeParams(params, contextTimeFilter);
702
764
  const result = await context.dataProvider.getRecentMessages({ timeFilter: effectiveTimeFilter, limit });
703
765
  const data = {
@@ -783,7 +845,7 @@ var inputSchema15 = {
783
845
  };
784
846
  async function handler15(params, context) {
785
847
  const { locale, timeFilter: contextTimeFilter, maxMessagesLimit } = context;
786
- const limit = maxMessagesLimit || params.limit || 100;
848
+ const limit = resolveMessageLimit(params.limit, 100, maxMessagesLimit);
787
849
  const effectiveTimeFilter = parseExtendedTimeParams(params, contextTimeFilter);
788
850
  const result = await context.dataProvider.getConversationBetween(
789
851
  params.member_id_1,
@@ -904,24 +966,10 @@ async function handler17(params, context) {
904
966
  const text = isZh ? "\u8BE5\u65F6\u95F4\u8303\u56F4\u5185\u6D88\u606F\u4E0D\u8DB3\uFF0C\u65E0\u6CD5\u5206\u6790\u54CD\u5E94\u65F6\u95F4" : "Not enough messages in this time range to analyze response time";
905
967
  return { content: text, data: null };
906
968
  }
907
- const responseTimes = /* @__PURE__ */ new Map();
908
- for (let i = 1; i < rows.length; i++) {
909
- const prev = rows[i - 1];
910
- const curr = rows[i];
911
- if (curr.sender_id === prev.sender_id) continue;
912
- const gap = curr.ts - prev.ts;
913
- if (gap < 5 || gap > 1800) continue;
914
- if (!responseTimes.has(curr.sender_id)) {
915
- responseTimes.set(curr.sender_id, { name: curr.name, times: [] });
916
- }
917
- responseTimes.get(curr.sender_id).times.push(gap);
918
- }
919
- const stats = [...responseTimes.entries()].map(([id, { name, times }]) => {
920
- times.sort((a, b) => a - b);
921
- const avg = Math.round(times.reduce((s, t2) => s + t2, 0) / times.length);
922
- const median = times[Math.floor(times.length / 2)];
923
- return { id, name, avgSeconds: avg, medianSeconds: median, responseCount: times.length };
924
- }).filter((s) => s.responseCount >= 3).sort((a, b) => a.medianSeconds - b.medianSeconds).slice(0, topN);
969
+ const stats = computeResponseTimeStats(
970
+ rows.map((r) => ({ senderId: r.sender_id, name: r.name, ts: r.ts })),
971
+ topN
972
+ );
925
973
  if (stats.length === 0) {
926
974
  const text = isZh ? "\u6CA1\u6709\u8DB3\u591F\u7684\u54CD\u5E94\u6570\u636E\u8FDB\u884C\u5206\u6790" : "Not enough response data for analysis";
927
975
  return { content: text, data: null };
@@ -1725,6 +1773,7 @@ var MCP_TOOL_REGISTRY = [
1725
1773
  ];
1726
1774
 
1727
1775
  // ../../packages/tools/src/providers/core-data-provider.ts
1776
+ var TOOL_MESSAGE_LIMIT_CAP = 5e4;
1728
1777
  var CoreDataProvider = class {
1729
1778
  constructor(db) {
1730
1779
  this.db = db;
@@ -1735,7 +1784,11 @@ var CoreDataProvider = class {
1735
1784
  startTs: options?.timeFilter?.startTs,
1736
1785
  endTs: options?.timeFilter?.endTs,
1737
1786
  senderId: options?.senderId,
1738
- limit: options?.limit ?? 50
1787
+ limit: options?.limit ?? 50,
1788
+ offset: options?.offset,
1789
+ matchMode: options?.matchMode,
1790
+ excludeKeywords: options?.excludeKeywords,
1791
+ sort: options?.sort
1739
1792
  });
1740
1793
  return {
1741
1794
  messages: result.messages.map((m) => ({
@@ -1756,9 +1809,14 @@ var CoreDataProvider = class {
1756
1809
  return getSearchMessageContext(this.db, messageIds, contextBefore, contextAfter);
1757
1810
  }
1758
1811
  async getRecentMessages(options) {
1759
- const messages = getRecentMessages(this.db, { limit: options?.limit ?? 50 });
1812
+ const result = queryMessages(this.db, {
1813
+ limit: options?.limit ?? 50,
1814
+ maxLimit: TOOL_MESSAGE_LIMIT_CAP,
1815
+ startTs: options?.timeFilter?.startTs,
1816
+ endTs: options?.timeFilter?.endTs
1817
+ });
1760
1818
  return {
1761
- messages: messages.map((m) => ({
1819
+ messages: result.messages.map((m) => ({
1762
1820
  id: m.id,
1763
1821
  senderId: m.senderId,
1764
1822
  senderName: m.senderName,
@@ -1766,7 +1824,7 @@ var CoreDataProvider = class {
1766
1824
  content: m.content,
1767
1825
  timestamp: m.timestamp
1768
1826
  })),
1769
- total: messages.length
1827
+ total: result.total
1770
1828
  };
1771
1829
  }
1772
1830
  async getMessageContext(messageIds, contextSize) {
@@ -1797,6 +1855,8 @@ var CoreDataProvider = class {
1797
1855
  return getWeekdayActivity(this.db, filter);
1798
1856
  case "daily":
1799
1857
  return getDailyActivity(this.db, filter);
1858
+ case "monthly":
1859
+ return getMonthlyActivity(this.db, filter);
1800
1860
  case "hourly":
1801
1861
  default:
1802
1862
  return getHourlyActivity(this.db, filter);
@@ -1811,8 +1871,8 @@ var CoreDataProvider = class {
1811
1871
  async getConversationBetween(memberId1, memberId2, timeFilter, limit) {
1812
1872
  return getConversationBetween(this.db, memberId1, memberId2, timeFilter, limit);
1813
1873
  }
1814
- async executeSql(sql) {
1815
- return executeReadonlySql(this.db, sql);
1874
+ async executeSql(sql, options) {
1875
+ return executeReadonlySql(this.db, sql, options?.maxRows);
1816
1876
  }
1817
1877
  async executeParameterizedSql(query, params) {
1818
1878
  return executeParameterizedSql(this.db, query, params);
@@ -1828,4 +1888,4 @@ export {
1828
1888
  MCP_TOOL_REGISTRY,
1829
1889
  CoreDataProvider
1830
1890
  };
1831
- //# sourceMappingURL=chunk-3QBVO4J7.mjs.map
1891
+ //# sourceMappingURL=chunk-5UBHNQFZ.mjs.map