chatlab-cli 0.37.0 → 0.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/{chat-command-WBAJBKIE.mjs → chat-command-YAFRLHMQ.mjs} +8 -8
  2. package/dist/{chunk-N2WGG3MS.mjs → chunk-2PY4XCH3.mjs} +6 -3
  3. package/dist/chunk-2PY4XCH3.mjs.map +1 -0
  4. package/dist/{chunk-FM3GXNEO.mjs → chunk-73TJ2S7W.mjs} +2 -2
  5. package/dist/{chunk-MSMDLDPB.mjs → chunk-ARIBCH47.mjs} +4 -4
  6. package/dist/{chunk-CR2MU7LN.mjs → chunk-FPVRSXQ4.mjs} +12 -12
  7. package/dist/{chunk-DQR2YS3I.mjs → chunk-GKCIRKOH.mjs} +8 -6
  8. package/dist/{chunk-DQR2YS3I.mjs.map → chunk-GKCIRKOH.mjs.map} +1 -1
  9. package/dist/{chunk-5YOHLJFB.mjs → chunk-JWJREWVN.mjs} +24 -7
  10. package/dist/chunk-JWJREWVN.mjs.map +1 -0
  11. package/dist/{chunk-RXMSZIYD.mjs → chunk-MMTEGUQA.mjs} +3 -3
  12. package/dist/{chunk-EJBBVLUN.mjs → chunk-N4SB6QZV.mjs} +2 -2
  13. package/dist/{chunk-4J4MA3RC.mjs → chunk-OTYNMDDL.mjs} +83 -55
  14. package/dist/chunk-OTYNMDDL.mjs.map +1 -0
  15. package/dist/{chunk-SQWN4GTQ.mjs → chunk-PDQV4RUA.mjs} +2 -2
  16. package/dist/{chunk-DKIYHA3O.mjs → chunk-UP6JIV3S.mjs} +15 -22
  17. package/dist/chunk-UP6JIV3S.mjs.map +1 -0
  18. package/dist/{chunk-2TV7M4CC.mjs → chunk-WDLO7OLX.mjs} +2 -2
  19. package/dist/cli.mjs +9 -9
  20. package/dist/contacts-worker.mjs +2 -2
  21. package/dist/global-insight-worker.mjs +1 -1
  22. package/dist/{http-X6OEOOSH.mjs → http-LPFPVTBC.mjs} +12 -12
  23. package/dist/{import-WBJ6YIQ7.mjs → import-T4WX2ZJL.mjs} +7 -7
  24. package/dist/index.mjs +12 -12
  25. package/dist/{mcp-FR6OKWKL.mjs → mcp-SMF3NWIN.mjs} +8 -8
  26. package/dist/people-relationships-worker.mjs +2 -2
  27. package/dist/semantic-index-worker.mjs +1 -1
  28. package/dist/{src-WE5HNN2O.mjs → src-EGLLMTAU.mjs} +6 -6
  29. package/dist/{stream-import-YYQVZDGQ.mjs → stream-import-2BXJTTCE.mjs} +7 -7
  30. package/dist/{worker-runtime-YGB5ZDE4.mjs → worker-runtime-RDLSPXFT.mjs} +5 -5
  31. package/dist-cli-web/assets/{AISettingsTab-Co2sM1iY.js → AISettingsTab-CEhrXlYR.js} +1 -1
  32. package/dist-cli-web/assets/{AboutTab-DQ8r6mYE.js → AboutTab-Bbu0SsMM.js} +1 -1
  33. package/dist-cli-web/assets/{ActionToolsPanel-CmYpw8Mt.css → ActionToolsPanel-DDNXXH8v.css} +1 -1
  34. package/dist-cli-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang-IB1yZxCE.js +75 -0
  35. package/dist-cli-web/assets/{Alert-DU1tLAAg.js → Alert-510jTN3l.js} +1 -1
  36. package/dist-cli-web/assets/{ApiSettingsTab-D5g5b79L.js → ApiSettingsTab-Bi1GRMN4.js} +1 -1
  37. package/dist-cli-web/assets/{BatchManageTab-BFUyVaGU.js → BatchManageTab-DhnqMCSM.js} +1 -1
  38. package/dist-cli-web/assets/{BufferResource-C-RfYwQW.js → BufferResource-CKZxnACp.js} +1 -1
  39. package/dist-cli-web/assets/{CanvasRenderer-Dz7JAMrR.js → CanvasRenderer-BeK5POBy.js} +1 -1
  40. package/dist-cli-web/assets/{CardDecoration-D28DI1G9.js → CardDecoration-RuBA3N2j.js} +1 -1
  41. package/dist-cli-web/assets/{ChatRecordDrawer-Cph819yY.js → ChatRecordDrawer-BY_-lIEj.js} +1 -1
  42. package/dist-cli-web/assets/{ChatRecordWorkspace-BAfERdPc.js → ChatRecordWorkspace-7prKd-Tq.js} +1 -1
  43. package/dist-cli-web/assets/{Checkbox-B8uqt13j.js → Checkbox-_eH64bb0.js} +1 -1
  44. package/dist-cli-web/assets/{DataDirCleanupNotice-3sGBE5vU.js → DataDirCleanupNotice-BHaXwlfr.js} +1 -1
  45. package/dist-cli-web/assets/{DatePicker.vue_vue_type_script_setup_true_lang-CQuub8-f.js → DatePicker.vue_vue_type_script_setup_true_lang-D9Ul_GYz.js} +1 -1
  46. package/dist-cli-web/assets/{DebugToolsPanel-Cwkr0BOY.js → DebugToolsPanel-ByKItGrS.js} +1 -1
  47. package/dist-cli-web/assets/{EChart.vue_vue_type_script_setup_true_lang-BuLujQCF.js → EChart.vue_vue_type_script_setup_true_lang-DubnuUXI.js} +1 -1
  48. package/dist-cli-web/assets/{EChartBar.vue_vue_type_script_setup_true_lang-DuA5xbcC.js → EChartBar.vue_vue_type_script_setup_true_lang-DKNCZuFm.js} +1 -1
  49. package/dist-cli-web/assets/{EChartLine.vue_vue_type_script_setup_true_lang-CvmMEfYq.js → EChartLine.vue_vue_type_script_setup_true_lang-Fl7xAOSR.js} +1 -1
  50. package/dist-cli-web/assets/{EChartWordcloud-CHVtyPR7.js → EChartWordcloud-C6XM4KOX.js} +1 -1
  51. package/dist-cli-web/assets/{FileDropZone.vue_vue_type_script_setup_true_lang-BKPy9Qv-.js → FileDropZone.vue_vue_type_script_setup_true_lang-DYDdRSNE.js} +1 -1
  52. package/dist-cli-web/assets/{Filter-CMfRHIoK.js → Filter-CByj_rCR.js} +1 -1
  53. package/dist-cli-web/assets/{GlobalTaskBar-Jz6MASCu.js → GlobalTaskBar-BdELjzrs.js} +1 -1
  54. package/dist-cli-web/assets/{GroupRelationshipGalaxyView-Ch4obfEq.js → GroupRelationshipGalaxyView-CnzPEgUS.js} +1 -1
  55. package/dist-cli-web/assets/{Label-CuryuymO.js → Label-DCIcxkhU.js} +1 -1
  56. package/dist-cli-web/assets/{LoadingState.vue_vue_type_script_setup_true_lang-CoeQsaiL.js → LoadingState.vue_vue_type_script_setup_true_lang-BBcCt_Qm.js} +1 -1
  57. package/dist-cli-web/assets/{MessageExportModal-JqGZ-iLr.js → MessageExportModal-DNU16Bs8.js} +1 -1
  58. package/dist-cli-web/assets/{PageHeader-D4up77TB.js → PageHeader-CKeZjNNR.js} +1 -1
  59. package/dist-cli-web/assets/{PageTabs.vue_vue_type_script_setup_true_lang-DYQRFk9s.js → PageTabs.vue_vue_type_script_setup_true_lang-C8M3wNNH.js} +1 -1
  60. package/dist-cli-web/assets/{RelationshipGalaxyCanvas-Cn7Eta5U.js → RelationshipGalaxyCanvas-CDhljGyJ.js} +3 -3
  61. package/dist-cli-web/assets/{RelationshipGalaxyThreeCanvas-LlaX57z6.js → RelationshipGalaxyThreeCanvas-BP8fsvvf.js} +1 -1
  62. package/dist-cli-web/assets/{RenderTargetSystem-JhA2PUFi.js → RenderTargetSystem-D76QrDT_.js} +1 -1
  63. package/dist-cli-web/assets/{RovingFocusItem-DHaiTb4j.js → RovingFocusItem-BJMUQ5DJ.js} +1 -1
  64. package/dist-cli-web/assets/{ScreenCaptureModal-Bxhyt5g1.js → ScreenCaptureModal-DkX4z-M1.js} +1 -1
  65. package/dist-cli-web/assets/{SectionTabs.vue_vue_type_script_setup_true_lang-BlAje3Tf.js → SectionTabs.vue_vue_type_script_setup_true_lang-qFhJO5B0.js} +1 -1
  66. package/dist-cli-web/assets/{Select-Beeqv0wU.js → Select-B5oJc5y1.js} +1 -1
  67. package/dist-cli-web/assets/SettingsModal-BO-QKQ2h.js +2 -0
  68. package/dist-cli-web/assets/{StorageTab-B7GHadia.js → StorageTab-CPPXXaRm.js} +1 -1
  69. package/dist-cli-web/assets/{Switch-u4zlvUMa.js → Switch-CDk3LZ4_.js} +1 -1
  70. package/dist-cli-web/assets/{Tabs-RWKHwtfM.js → Tabs-BMq9wODW.js} +1 -1
  71. package/dist-cli-web/assets/{Tabs-B7-Koq3x.js → Tabs-DqWTBV8x.js} +1 -1
  72. package/dist-cli-web/assets/{ThemeCard.vue_vue_type_script_setup_true_lang-ndsa3-aT.js → ThemeCard.vue_vue_type_script_setup_true_lang-D2outEOV.js} +1 -1
  73. package/dist-cli-web/assets/{TimeSelect.vue_vue_type_script_setup_true_lang-DKa1flT-.js → TimeSelect.vue_vue_type_script_setup_true_lang-BcflxP_U.js} +1 -1
  74. package/dist-cli-web/assets/{VisuallyHiddenInput-DGDqcvUy.js → VisuallyHiddenInput-BAFpkxMI.js} +1 -1
  75. package/dist-cli-web/assets/{WebGLRenderer-ifvgA1fe.js → WebGLRenderer-DjCPvR_O.js} +1 -1
  76. package/dist-cli-web/assets/{WebGPURenderer-DwzmuWF0.js → WebGPURenderer-C2B_u03z.js} +1 -1
  77. package/dist-cli-web/assets/aiChat--CR4g2M7.js +8 -0
  78. package/dist-cli-web/assets/{base-BWDX-164.js → base-F6s0vTrr.js} +1 -1
  79. package/dist-cli-web/assets/{browserAll-CSIIETeE.js → browserAll-DiUAZg4L.js} +1 -1
  80. package/dist-cli-web/assets/{chatMessages--r0obAVw.css → chatMessages-BGRbSlvD.css} +1 -1
  81. package/dist-cli-web/assets/{chatMessages-Zywjea1n.js → chatMessages-Bd33SSXI.js} +20 -20
  82. package/dist-cli-web/assets/{cli-web-BRY49NWe.js → cli-web-DoibEdj2.js} +1 -1
  83. package/dist-cli-web/assets/{fetch-jx1VdM9j.js → fetch-4nh1LaVF.js} +1 -1
  84. package/dist-cli-web/assets/{fetch-qBaUXqFt.js → fetch-7lUvXbhU.js} +1 -1
  85. package/dist-cli-web/assets/{fetch-DNSDHSqQ.js → fetch-BEaW1j5H.js} +1 -1
  86. package/dist-cli-web/assets/{fetch-wzv71PYy.js → fetch-B_YFABxI.js} +1 -1
  87. package/dist-cli-web/assets/{fetch-D3nLtFBi.js → fetch-BeX69kpS.js} +1 -1
  88. package/dist-cli-web/assets/{fetch-Bf4cqeM3.js → fetch-CRocA-4C.js} +1 -1
  89. package/dist-cli-web/assets/{fetch-BiXab0IF.js → fetch-CXM-cjDS.js} +1 -1
  90. package/dist-cli-web/assets/{fetch-Co2vLmiE.js → fetch-CXqeAbnY.js} +1 -1
  91. package/dist-cli-web/assets/{fetch-r6mhEGrP.js → fetch-CxVcHNid.js} +1 -1
  92. package/dist-cli-web/assets/fetch-DBpDMy29.js +1 -0
  93. package/dist-cli-web/assets/{fetch-mYSeL4Ki.js → fetch-DKBBS9Op.js} +1 -1
  94. package/dist-cli-web/assets/{fetch-DeHqF6yL.js → fetch-epFXmPIQ.js} +1 -1
  95. package/dist-cli-web/assets/{host-jXJHyyOX.js → host-C4rU8pKA.js} +1 -1
  96. package/dist-cli-web/assets/{host-1emQf9_4.js → host-CtSqR_Zm.js} +1 -1
  97. package/dist-cli-web/assets/{index-Cw0IhKZ6.js → index-4DVZ2g0M.js} +1 -1
  98. package/dist-cli-web/assets/{index-DnpnIyle.js → index-B1oj9KDv.js} +33 -33
  99. package/dist-cli-web/assets/{index-slDUxib2.js → index-BFH1j_R9.js} +1 -1
  100. package/dist-cli-web/assets/{index-DOqbUvhA.js → index-BvMAw3Zd.js} +1 -1
  101. package/dist-cli-web/assets/{index-2dJCozDq.js → index-CaYtkONV.js} +4 -4
  102. package/dist-cli-web/assets/{index-B4mJkX_d.js → index-CuCQ1d9f.js} +1 -1
  103. package/dist-cli-web/assets/index-D3Hyjv4e.js +137 -0
  104. package/dist-cli-web/assets/{index-ClHMs0-a.js → index-D8cHMqV-.js} +2 -2
  105. package/dist-cli-web/assets/{index-BQ463TS7.js → index-DlHuILT_.js} +1 -1
  106. package/dist-cli-web/assets/{index-6ejRbH3h.js → index-R4LqAnx9.js} +2 -2
  107. package/dist-cli-web/assets/{index-LV9LfFNu.js → index-_m1mf1jm.js} +1 -1
  108. package/dist-cli-web/assets/{index-CYc_VLgK.js → index-ekvsNmfe.js} +1 -1
  109. package/dist-cli-web/assets/{index-B7biznha.js → index-mXe1LssU.js} +1 -1
  110. package/dist-cli-web/assets/{index-BOcFyPCa.js → index-mbLXPIyC.js} +1 -1
  111. package/dist-cli-web/assets/{people-page-header-Cx5r9Bk2.js → people-page-header-BbYSSpsO.js} +1 -1
  112. package/dist-cli-web/assets/{prompt-BggEDxxi.js → prompt-C-ofJ7t_.js} +1 -1
  113. package/dist-cli-web/assets/{semantic-index-config-builder-1sO0aEc1.js → semantic-index-config-builder-D3TYVYC-.js} +1 -1
  114. package/dist-cli-web/assets/service-BYOUkk7V.js +1 -0
  115. package/dist-cli-web/assets/{service-Bvq1fRkC.js → service-CppETV4a.js} +1 -1
  116. package/dist-cli-web/assets/service-tEx-5LUL.js +1 -0
  117. package/dist-cli-web/assets/useFormControl-CrWi_6Hn.js +1 -0
  118. package/dist-cli-web/assets/{useTable-DC7oxmBl.js → useTable-Clk7ecq-.js} +1 -1
  119. package/dist-cli-web/assets/{useToast-CCPBE-Sy.js → useToast-B5LaA6c-.js} +1 -1
  120. package/dist-cli-web/assets/{webworkerAll-FCJk6reG.js → webworkerAll-CyA4b4LT.js} +1 -1
  121. package/dist-cli-web/index.html +1 -1
  122. package/package.json +3 -3
  123. package/dist/chunk-4J4MA3RC.mjs.map +0 -1
  124. package/dist/chunk-5YOHLJFB.mjs.map +0 -1
  125. package/dist/chunk-DKIYHA3O.mjs.map +0 -1
  126. package/dist/chunk-N2WGG3MS.mjs.map +0 -1
  127. package/dist-cli-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang--RPlmfIu.js +0 -75
  128. package/dist-cli-web/assets/SettingsModal-DV8yDBJs.js +0 -2
  129. package/dist-cli-web/assets/aiChat-BY4C3UQe.js +0 -8
  130. package/dist-cli-web/assets/fetch-C8CcoTWY.js +0 -1
  131. package/dist-cli-web/assets/index-kePiJ3ca.js +0 -137
  132. package/dist-cli-web/assets/service-DkPheDt8.js +0 -1
  133. package/dist-cli-web/assets/service-DvI8O_7K.js +0 -1
  134. package/dist-cli-web/assets/useFormControl-B0aShtLp.js +0 -1
  135. /package/dist/{chat-command-WBAJBKIE.mjs.map → chat-command-YAFRLHMQ.mjs.map} +0 -0
  136. /package/dist/{chunk-FM3GXNEO.mjs.map → chunk-73TJ2S7W.mjs.map} +0 -0
  137. /package/dist/{chunk-MSMDLDPB.mjs.map → chunk-ARIBCH47.mjs.map} +0 -0
  138. /package/dist/{chunk-CR2MU7LN.mjs.map → chunk-FPVRSXQ4.mjs.map} +0 -0
  139. /package/dist/{chunk-RXMSZIYD.mjs.map → chunk-MMTEGUQA.mjs.map} +0 -0
  140. /package/dist/{chunk-EJBBVLUN.mjs.map → chunk-N4SB6QZV.mjs.map} +0 -0
  141. /package/dist/{chunk-SQWN4GTQ.mjs.map → chunk-PDQV4RUA.mjs.map} +0 -0
  142. /package/dist/{chunk-2TV7M4CC.mjs.map → chunk-WDLO7OLX.mjs.map} +0 -0
  143. /package/dist/{http-X6OEOOSH.mjs.map → http-LPFPVTBC.mjs.map} +0 -0
  144. /package/dist/{import-WBJ6YIQ7.mjs.map → import-T4WX2ZJL.mjs.map} +0 -0
  145. /package/dist/{mcp-FR6OKWKL.mjs.map → mcp-SMF3NWIN.mjs.map} +0 -0
  146. /package/dist/{src-WE5HNN2O.mjs.map → src-EGLLMTAU.mjs.map} +0 -0
  147. /package/dist/{stream-import-YYQVZDGQ.mjs.map → stream-import-2BXJTTCE.mjs.map} +0 -0
  148. /package/dist/{worker-runtime-YGB5ZDE4.mjs.map → worker-runtime-RDLSPXFT.mjs.map} +0 -0
@@ -3947,7 +3947,21 @@ var PUNCTUATION_REGEX = /[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~,。!?、;
3947
3947
  var URL_REGEX = /https?:\/\/[^\s]+/g;
3948
3948
  var MENTION_REGEX = /@[^\s@]+/g;
3949
3949
  var PURE_NUMBER_REGEX = /^\d+$/;
3950
- var SYSTEM_PLACEHOLDER_REGEX = /\[(?:图片|视频|语音|文件|动画表情|表情|链接|位置|名片|红包|转账|音乐|Image|Video|Voice|File|Sticker|Link)\]/gi;
3950
+ var MEDIA_PLACEHOLDER_NAME_PATTERN = "(?:\u56FE\u7247|\u89C6\u9891|\u8BED\u97F3|\u6587\u4EF6|\u52A8\u753B\u8868\u60C5|\u8868\u60C5|\u94FE\u63A5|\u4F4D\u7F6E|\u5730\u7406\u4F4D\u7F6E|\u540D\u7247|\u7EA2\u5305|\u8F6C\u8D26|\u97F3\u4E50|Image|Photo|Video|Voice|Audio|File|Sticker|Link|Location)";
3951
+ var MEDIA_PLACEHOLDER_DURATION_PATTERN = "(?:\\s+\\d+(?:\\.\\d+)?\\s*(?:\u79D2|s))?";
3952
+ var SYSTEM_PLACEHOLDER_REGEX = new RegExp(
3953
+ `\\[${MEDIA_PLACEHOLDER_NAME_PATTERN}${MEDIA_PLACEHOLDER_DURATION_PATTERN}\\]`,
3954
+ "gi"
3955
+ );
3956
+ var MEDIA_PLACEHOLDER_ONLY_REGEX = new RegExp(
3957
+ `^\\[${MEDIA_PLACEHOLDER_NAME_PATTERN}${MEDIA_PLACEHOLDER_DURATION_PATTERN}\\]$`,
3958
+ "i"
3959
+ );
3960
+ var VOICE_TRANSCRIPTION_PREFIX_REGEX = new RegExp(
3961
+ `^\\s*\\[(?:\u8BED\u97F3|Voice|Audio)${MEDIA_PLACEHOLDER_DURATION_PATTERN}\\]\\s*`,
3962
+ "i"
3963
+ );
3964
+ var SYSTEM_MESSAGE_PREFIX_REGEX = /^\s*(?:\[(?:系统(?:消息)?|分享内容|system(?:\s+message)?)\]|【(?:系统(?:消息)?|分享内容|system(?:\s+message)?)】)\s*/iu;
3951
3965
  var BRACKET_EMOJI_PLACEHOLDER_REGEX = /(?:\[|【)([\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Letter}\p{Number}_-]{1,16})(?:\]|】)/gu;
3952
3966
  var CJK_TEXT_REGEX = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]/u;
3953
3967
  var BRACKET_EMOJI_MAP = {
@@ -4040,6 +4054,18 @@ function cleanText(text) {
4040
4054
  return CJK_TEXT_REGEX.test(name) ? " " : match;
4041
4055
  }).replace(EMOJI_REGEX, " ").replace(EMOJI_VARIATION_SELECTOR_REGEX, " ").replace(PUNCTUATION_REGEX, " ").replace(/\s+/g, " ").trim();
4042
4056
  }
4057
+ function stripMediaPlaceholders(text) {
4058
+ return text.replace(SYSTEM_PLACEHOLDER_REGEX, " ");
4059
+ }
4060
+ function stripVoiceTranscriptionPrefix(text) {
4061
+ return text.replace(VOICE_TRANSCRIPTION_PREFIX_REGEX, "").trim();
4062
+ }
4063
+ function isSystemMessageContent(text) {
4064
+ return SYSTEM_MESSAGE_PREFIX_REGEX.test(text);
4065
+ }
4066
+ function isMediaPlaceholderContent(text) {
4067
+ return MEDIA_PLACEHOLDER_ONLY_REGEX.test(text.trim());
4068
+ }
4043
4069
  function isValidWord(word, locale, minLength, enableStopwords, isStopwordFn) {
4044
4070
  if (!word || word.trim().length === 0) return false;
4045
4071
  if (PURE_NUMBER_REGEX.test(word)) return false;
@@ -6819,17 +6845,27 @@ var SYSTEM_PLACEHOLDER_CONTENTS = /* @__PURE__ */ new Set([
6819
6845
  "[Location]"
6820
6846
  ]);
6821
6847
  function isSystemPlaceholderContent(content) {
6822
- return SYSTEM_PLACEHOLDER_CONTENTS.has(content.trim());
6848
+ const trimmed = content.trim();
6849
+ return SYSTEM_PLACEHOLDER_CONTENTS.has(trimmed) || isMediaPlaceholderContent(trimmed);
6823
6850
  }
6824
6851
 
6825
6852
  // ../../packages/core/src/query/advanced/repeat.ts
6853
+ var VOICE_TRANSCRIPTION_SQL = `
6854
+ TRIM(msg.content) LIKE '[\u8BED\u97F3] %' OR
6855
+ TRIM(msg.content) LIKE '[\u8BED\u97F3 %] %' OR
6856
+ TRIM(msg.content) LIKE '[Voice] %' OR
6857
+ TRIM(msg.content) LIKE '[Voice %] %' OR
6858
+ TRIM(msg.content) LIKE '[Audio] %' OR
6859
+ TRIM(msg.content) LIKE '[Audio %] %'
6860
+ `;
6861
+ var CATCHPHRASE_MESSAGE_TYPES = [0 /* TEXT */, 5 /* EMOJI */].join(", ");
6826
6862
  function getCatchphraseAnalysis(db, filter) {
6827
6863
  const { clause, params } = buildTimeFilter(filter);
6828
6864
  let whereClause = clause;
6829
6865
  if (whereClause.includes("WHERE")) {
6830
- whereClause += " AND COALESCE(m.account_name, '') != '\u7CFB\u7EDF\u6D88\u606F' AND msg.type = 0 AND msg.content IS NOT NULL AND LENGTH(TRIM(msg.content)) >= 2";
6866
+ whereClause += ` AND COALESCE(m.account_name, '') != '\u7CFB\u7EDF\u6D88\u606F' AND msg.type IN (${CATCHPHRASE_MESSAGE_TYPES}) AND msg.content IS NOT NULL AND LENGTH(TRIM(msg.content)) >= 2`;
6831
6867
  } else {
6832
- whereClause = " WHERE COALESCE(m.account_name, '') != '\u7CFB\u7EDF\u6D88\u606F' AND msg.type = 0 AND msg.content IS NOT NULL AND LENGTH(TRIM(msg.content)) >= 2";
6868
+ whereClause = ` WHERE COALESCE(m.account_name, '') != '\u7CFB\u7EDF\u6D88\u606F' AND msg.type IN (${CATCHPHRASE_MESSAGE_TYPES}) AND msg.content IS NOT NULL AND LENGTH(TRIM(msg.content)) >= 2`;
6833
6869
  }
6834
6870
  const rows = db.prepare(
6835
6871
  `
@@ -6843,13 +6879,15 @@ function getCatchphraseAnalysis(db, filter) {
6843
6879
  JOIN member m ON msg.sender_id = m.id
6844
6880
  ${whereClause}
6845
6881
  GROUP BY m.id, TRIM(msg.content)
6846
- HAVING COUNT(*) >= 2
6882
+ HAVING COUNT(*) >= 2 OR (${VOICE_TRANSCRIPTION_SQL})
6847
6883
  ORDER BY m.id, count DESC
6848
6884
  `
6849
6885
  ).all(...params);
6850
6886
  const memberMap = /* @__PURE__ */ new Map();
6887
+ const phraseMaps = /* @__PURE__ */ new Map();
6851
6888
  for (const row of rows) {
6852
- if (isSystemPlaceholderContent(row.content)) continue;
6889
+ const content = stripVoiceTranscriptionPrefix(row.content);
6890
+ if (!content || isSystemMessageContent(content) || isSystemPlaceholderContent(content)) continue;
6853
6891
  if (!memberMap.has(row.memberId)) {
6854
6892
  memberMap.set(row.memberId, {
6855
6893
  memberId: row.memberId,
@@ -6858,17 +6896,24 @@ function getCatchphraseAnalysis(db, filter) {
6858
6896
  catchphrases: []
6859
6897
  });
6860
6898
  }
6861
- const member = memberMap.get(row.memberId);
6862
- if (member.catchphrases.length < 100) {
6863
- member.catchphrases.push({ content: row.content, count: row.count });
6899
+ let phrases = phraseMaps.get(row.memberId);
6900
+ if (!phrases) {
6901
+ phrases = /* @__PURE__ */ new Map();
6902
+ phraseMaps.set(row.memberId, phrases);
6864
6903
  }
6904
+ const existing = phrases.get(content);
6905
+ if (existing) existing.count += Number(row.count);
6906
+ else phrases.set(content, { content, count: Number(row.count) });
6865
6907
  }
6866
6908
  const members = Array.from(memberMap.values());
6909
+ for (const member of members) {
6910
+ member.catchphrases = [...phraseMaps.get(member.memberId)?.values() ?? []].filter((item) => item.count >= 2).sort((a, b) => b.count - a.count || a.content.localeCompare(b.content)).slice(0, 100);
6911
+ }
6867
6912
  members.sort((a, b) => {
6868
6913
  const countDifference = (b.catchphrases[0]?.count ?? 0) - (a.catchphrases[0]?.count ?? 0);
6869
6914
  return countDifference || a.memberId - b.memberId;
6870
6915
  });
6871
- return { members };
6916
+ return { members: members.filter((member) => member.catchphrases.length > 0) };
6872
6917
  }
6873
6918
 
6874
6919
  // ../../packages/core/src/query/advanced/group-relationship-galaxy.ts
@@ -7759,8 +7804,9 @@ var RE_MENTION = /@[^\s@]+/g;
7759
7804
  var RE_EMOJI = /[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F1E0}-\u{1F1FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/gu;
7760
7805
  var RE_PUNCTUATION = /[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~,。!?、;:""''()【】《》…—~·\s]/g;
7761
7806
  var RE_PURE_NUMBER = /^\d+$/;
7807
+ var LANGUAGE_ANALYSIS_MESSAGE_TYPES = [0 /* TEXT */, 5 /* EMOJI */].join(", ");
7762
7808
  function cleanTextForNlp(text) {
7763
- return text.replace(RE_URL, " ").replace(RE_MENTION, " ").replace(RE_EMOJI, " ").replace(RE_PUNCTUATION, " ").replace(/\s+/g, " ").trim();
7809
+ return stripMediaPlaceholders(text).replace(RE_URL, " ").replace(RE_MENTION, " ").replace(RE_EMOJI, " ").replace(RE_PUNCTUATION, " ").replace(/\s+/g, " ").trim();
7764
7810
  }
7765
7811
  function countMatches(text, regex) {
7766
7812
  regex.lastIndex = 0;
@@ -7781,7 +7827,7 @@ function getLanguagePreferenceAnalysis(db, params) {
7781
7827
  const { locale, timeFilter, nlpProvider } = params;
7782
7828
  const { clause, params: filterParams } = buildTimeFilter(timeFilter);
7783
7829
  let whereClause = clause;
7784
- const textFilter = " COALESCE(m.account_name, '') != '\u7CFB\u7EDF\u6D88\u606F' AND msg.type = 0 AND msg.content IS NOT NULL AND LENGTH(TRIM(msg.content)) >= 2";
7830
+ const textFilter = ` COALESCE(m.account_name, '') != '\u7CFB\u7EDF\u6D88\u606F' AND msg.type IN (${LANGUAGE_ANALYSIS_MESSAGE_TYPES}) AND msg.content IS NOT NULL AND LENGTH(TRIM(msg.content)) >= 2`;
7785
7831
  if (whereClause.includes("WHERE")) {
7786
7832
  whereClause += " AND " + textFilter;
7787
7833
  } else {
@@ -7794,13 +7840,14 @@ function getLanguagePreferenceAnalysis(db, params) {
7794
7840
  if (rows.length === 0) return { members: [], sharedWords: [], similarityScore: 0 };
7795
7841
  const memberMessages = /* @__PURE__ */ new Map();
7796
7842
  for (const row of rows) {
7797
- if (isSystemPlaceholderContent(row.content)) continue;
7843
+ const content = stripVoiceTranscriptionPrefix(row.content);
7844
+ if (!content || isSystemMessageContent(content) || isSystemPlaceholderContent(content)) continue;
7798
7845
  let entry = memberMessages.get(row.memberId);
7799
7846
  if (!entry) {
7800
7847
  entry = { name: row.name, messages: [] };
7801
7848
  memberMessages.set(row.memberId, entry);
7802
7849
  }
7803
- entry.messages.push(row.content);
7850
+ entry.messages.push(content);
7804
7851
  }
7805
7852
  const isChinese2 = locale.startsWith("zh");
7806
7853
  const minWordLength = isChinese2 ? 2 : 3;
@@ -9818,31 +9865,10 @@ var AssistantManager = class {
9818
9865
  this.ensureInitialized();
9819
9866
  return this.cache.has(id);
9820
9867
  }
9821
- getBuiltinCatalog() {
9822
- this.ensureInitialized();
9823
- return [];
9824
- }
9825
9868
  isGeneralAssistant(id) {
9826
9869
  return this.generalIds.includes(id);
9827
9870
  }
9828
9871
  // ==================== Import ====================
9829
- importAssistant(builtinId) {
9830
- this.ensureInitialized();
9831
- const builtinConfig = this.getBuiltinConfig(builtinId);
9832
- if (!builtinConfig) return { success: false, error: `Builtin assistant not found: ${builtinId}` };
9833
- const existing = this.findByBuiltinId(builtinId);
9834
- if (existing) return { success: false, error: `Assistant already imported: ${builtinId}` };
9835
- return this.saveToDisk(this.withBuiltinTracking(builtinConfig));
9836
- }
9837
- reimportAssistant(id) {
9838
- this.ensureInitialized();
9839
- const existing = this.cache.get(id);
9840
- if (!existing) return { success: false, error: `Assistant not found: ${id}` };
9841
- if (!existing.builtinId) return { success: false, error: "Only imported builtin assistants can be reimported" };
9842
- const builtinConfig = this.getBuiltinConfig(existing.builtinId);
9843
- if (!builtinConfig) return { success: false, error: `Builtin template not found: ${existing.builtinId}` };
9844
- return this.saveToDisk(this.withBuiltinTracking(builtinConfig, existing.id));
9845
- }
9846
9872
  importAssistantFromMd(rawMd) {
9847
9873
  this.ensureInitialized();
9848
9874
  const config = parseAssistantFile(rawMd, "cloud_import.md");
@@ -9936,9 +9962,6 @@ var AssistantManager = class {
9936
9962
  return { success: true, backupId };
9937
9963
  }
9938
9964
  // ==================== Internal ====================
9939
- findByBuiltinId(builtinId) {
9940
- return Array.from(this.cache.values()).find((c) => c.builtinId === builtinId);
9941
- }
9942
9965
  saveToDisk(config) {
9943
9966
  try {
9944
9967
  const filePath = this.deps.fs.joinPath(this.deps.assistantsDir, `${config.id}.md`);
@@ -13433,7 +13456,8 @@ async function runAgentCore(options) {
13433
13456
  return clampThinkingLevel(piModel, level);
13434
13457
  })();
13435
13458
  const finalThinkingLevel = resolvedThinkingLevel ?? (piModel.reasoning ? void 0 : "off");
13436
- let hasReachedToolRoundLimit = false;
13459
+ let hasReachedToolRoundLimit = maxToolRounds <= 0;
13460
+ let hasCompletedFinalAnswerTurn = false;
13437
13461
  const thinkingFormat = piModel.compat?.thinkingFormat;
13438
13462
  const replayOptions = piModel.reasoning && thinkingFormat === "deepseek" ? {
13439
13463
  modelInfo: { api: piModel.api, provider: piModel.provider, id: piModel.id },
@@ -13456,10 +13480,11 @@ async function runAgentCore(options) {
13456
13480
  onConvertToLlm?.(filtered);
13457
13481
  return filtered;
13458
13482
  },
13459
- prepareNextTurn: () => hasReachedToolRoundLimit ? {
13483
+ afterToolCall: async ({ result }) => result.isError === true ? { isError: true } : void 0,
13484
+ shouldStopAfterTurn: async () => hasCompletedFinalAnswerTurn,
13485
+ prepareNextTurnWithContext: ({ context }) => hasReachedToolRoundLimit ? {
13460
13486
  context: {
13461
- systemPrompt,
13462
- messages: coreAgent.state.messages,
13487
+ ...context,
13463
13488
  tools: []
13464
13489
  }
13465
13490
  } : void 0,
@@ -13537,9 +13562,10 @@ async function runAgentCore(options) {
13537
13562
  });
13538
13563
  } else if (event.type === "turn_end") {
13539
13564
  const hadToolCalls = event.toolResults.length > 0;
13540
- if (hadToolCalls) {
13565
+ const isFinalAnswerTurn = hasReachedToolRoundLimit;
13566
+ if (hadToolCalls && !hasReachedToolRoundLimit) {
13541
13567
  toolRounds += 1;
13542
- if (!hasReachedToolRoundLimit && maxToolRounds > 0 && toolRounds >= maxToolRounds) {
13568
+ if (maxToolRounds > 0 && toolRounds >= maxToolRounds) {
13543
13569
  hasReachedToolRoundLimit = true;
13544
13570
  coreAgent.state.tools = [];
13545
13571
  coreAgent.steer({
@@ -13549,6 +13575,7 @@ async function runAgentCore(options) {
13549
13575
  });
13550
13576
  }
13551
13577
  }
13578
+ if (isFinalAnswerTurn) hasCompletedFinalAnswerTurn = true;
13552
13579
  onEvent({ type: "turn_end", round: toolRounds, hadToolCalls });
13553
13580
  } else if (event.type === "message_end") {
13554
13581
  if (event.message.role === "assistant") {
@@ -20797,9 +20824,20 @@ export {
20797
20824
  generateSessionIndex,
20798
20825
  generateIncrementalSessionIndex,
20799
20826
  getPrivateChatMemberAvatar,
20827
+ CHATLAB_FORMAT_VERSION,
20828
+ CHATLAB_SUPPORTED_FORMAT_VERSIONS,
20829
+ isSupportedChatLabFormatVersion,
20830
+ ANNUAL_SUMMARY_PLUGIN_ID,
20831
+ TIME_INVESTMENT_PLUGIN_ID,
20832
+ NAVIGATION_LAYOUT_SCHEMA_VERSION,
20833
+ MessageType,
20834
+ KNOWN_PLATFORMS,
20835
+ getDefaultGeneralAssistantId,
20836
+ CONTACTS_TIME_RANGE_PRESETS,
20800
20837
  POS_TAG_DEFINITIONS,
20801
20838
  MEANINGFUL_POS_TAGS,
20802
20839
  isStopword,
20840
+ isSystemMessageContent,
20803
20841
  buildExcludeKeywordsConditions,
20804
20842
  getMentionAnalysis,
20805
20843
  getLaughAnalysis,
@@ -20819,16 +20857,6 @@ export {
20819
20857
  shouldScopeContactToSession,
20820
20858
  buildContactKey,
20821
20859
  getCrossChatSessionActivityFacts,
20822
- CHATLAB_FORMAT_VERSION,
20823
- CHATLAB_SUPPORTED_FORMAT_VERSIONS,
20824
- isSupportedChatLabFormatVersion,
20825
- ANNUAL_SUMMARY_PLUGIN_ID,
20826
- TIME_INVESTMENT_PLUGIN_ID,
20827
- NAVIGATION_LAYOUT_SCHEMA_VERSION,
20828
- MessageType,
20829
- KNOWN_PLATFORMS,
20830
- getDefaultGeneralAssistantId,
20831
- CONTACTS_TIME_RANGE_PRESETS,
20832
20860
  getAnnualSummarySessionFacts,
20833
20861
  aggregateAnnualSummaryFacts,
20834
20862
  getTimeInvestmentSessionFacts,
@@ -21058,4 +21086,4 @@ export {
21058
21086
  StaticPathProvider,
21059
21087
  createDatabaseManagerAdapter
21060
21088
  };
21061
- //# sourceMappingURL=chunk-4J4MA3RC.mjs.map
21089
+ //# sourceMappingURL=chunk-OTYNMDDL.mjs.map