@tencent-rtc/mcp 1.6.7 → 1.6.8

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 (248) hide show
  1. package/knowledge/build-index.js +3 -0
  2. package/knowledge/content-loader.js +3 -1
  3. package/knowledge/search/filter-pool.js +12 -4
  4. package/knowledge/search/query-normalizer.js +76 -0
  5. package/knowledge/search/search-knowledge.js +104 -5
  6. package/package.json +1 -1
  7. package/resource/_schema/feature-aliases.yaml +1 -0
  8. package/resource/_schema/query-normalization.yaml +9 -0
  9. package/resource/index/manifest.json +1 -1
  10. package/resource/integration/callkit/preset/android/integration.md +3 -14
  11. package/resource/integration/callkit/preset/flutter/integration.md +1 -12
  12. package/resource/integration/callkit/preset/ios/integration.md +2 -12
  13. package/resource/integration/callkit/preset/react/integration.md +1 -14
  14. package/resource/integration/callkit/preset/vue/integration.md +1 -14
  15. package/resource/integration/chat/preset/android/integration.md +6 -13
  16. package/resource/integration/chat/preset/flutter/integration.md +1 -8
  17. package/resource/integration/chat/preset/ios/integration.md +4 -12
  18. package/resource/integration/chat/preset/react/integration.md +6 -16
  19. package/resource/integration/chat/preset/vue/integration.md +0 -9
  20. package/resource/integration/livekit/preset/live/android/live-audience-integration.md +2 -6
  21. package/resource/integration/livekit/preset/live/android/live-host-integration.md +1 -11
  22. package/resource/integration/livekit/preset/live/android/live-list-integration.md +2 -6
  23. package/resource/integration/livekit/preset/live/android/prepare-integration.md +2 -7
  24. package/resource/integration/livekit/preset/live/ios/live-audience-integration.md +2 -7
  25. package/resource/integration/livekit/preset/live/ios/live-host-integration.md +1 -13
  26. package/resource/integration/livekit/preset/live/ios/live-list-integration.md +2 -10
  27. package/resource/integration/livekit/preset/live/ios/prepare-integration.md +3 -8
  28. package/resource/integration/livekit/preset/live/vue/live-list-integration.md +0 -4
  29. package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +1 -5
  30. package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +2 -7
  31. package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +2 -8
  32. package/resource/integration/roomkit/preset/vue/integration.md +0 -11
  33. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +0 -7
  34. package/resource/knowledge/callkit/core-sdk/android/make-call.md +0 -8
  35. package/resource/knowledge/callkit/core-sdk/android/offline-push.md +1 -9
  36. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +2 -8
  37. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +2 -8
  38. package/resource/knowledge/callkit/core-sdk/flutter/offline-push.md +1 -16
  39. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +0 -8
  40. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +0 -8
  41. package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +0 -11
  42. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +178 -200
  43. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +195 -217
  44. package/resource/knowledge/callkit/faq/android.md +4 -14
  45. package/resource/knowledge/callkit/faq/common.md +0 -2
  46. package/resource/knowledge/callkit/faq/error-code.md +2 -4
  47. package/resource/knowledge/callkit/faq/ios.md +1 -4
  48. package/resource/knowledge/callkit/preset/android/api.md +0 -6
  49. package/resource/knowledge/callkit/preset/ios/api.md +0 -4
  50. package/resource/knowledge/callkit/preset/react/api.md +3 -4
  51. package/resource/knowledge/callkit/preset/react/uikit-api-reference.md +3 -4
  52. package/resource/knowledge/callkit/preset/vue/api.md +3 -4
  53. package/resource/knowledge/callkit/preset/vue/uikit-api-reference.md +3 -4
  54. package/resource/knowledge/chat/preset/android/features/chat-setting.md +0 -5
  55. package/resource/knowledge/chat/preset/android/features/contact-list.md +0 -7
  56. package/resource/knowledge/chat/preset/android/features/conversation-list.md +0 -6
  57. package/resource/knowledge/chat/preset/android/features/language.md +0 -8
  58. package/resource/knowledge/chat/preset/android/features/message-input.md +0 -6
  59. package/resource/knowledge/chat/preset/android/features/message-list.md +0 -8
  60. package/resource/knowledge/chat/preset/android/features/search.md +0 -7
  61. package/resource/knowledge/chat/preset/android/features/theme.md +0 -4
  62. package/resource/knowledge/chat/preset/android-view/integration.md +0 -6
  63. package/resource/knowledge/chat/preset/flutter/features/chat-setting.md +0 -4
  64. package/resource/knowledge/chat/preset/flutter/features/contact-list.md +0 -9
  65. package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +0 -7
  66. package/resource/knowledge/chat/preset/flutter/features/language.md +0 -5
  67. package/resource/knowledge/chat/preset/flutter/features/message-input.md +0 -6
  68. package/resource/knowledge/chat/preset/flutter/features/message-list.md +0 -8
  69. package/resource/knowledge/chat/preset/flutter/features/search.md +0 -5
  70. package/resource/knowledge/chat/preset/flutter/features/theme.md +0 -4
  71. package/resource/knowledge/chat/preset/ios/features/chat-setting.md +0 -5
  72. package/resource/knowledge/chat/preset/ios/features/contact-list.md +0 -5
  73. package/resource/knowledge/chat/preset/ios/features/conversation-list.md +0 -7
  74. package/resource/knowledge/chat/preset/ios/features/language.md +1 -8
  75. package/resource/knowledge/chat/preset/ios/features/message-input.md +0 -6
  76. package/resource/knowledge/chat/preset/ios/features/message-list.md +0 -8
  77. package/resource/knowledge/chat/preset/ios/features/search.md +0 -5
  78. package/resource/knowledge/chat/preset/ios/features/theme.md +0 -4
  79. package/resource/knowledge/chat/preset/ios-uikit/integration.md +0 -6
  80. package/resource/knowledge/chat/preset/react/features/contact-list.md +0 -23
  81. package/resource/knowledge/chat/preset/react/features/conversation-actions.md +2 -11
  82. package/resource/knowledge/chat/preset/react/features/conversation-list.md +4 -26
  83. package/resource/knowledge/chat/preset/react/features/conversation-preview.md +0 -6
  84. package/resource/knowledge/chat/preset/react/features/search.md +0 -1
  85. package/resource/knowledge/chat/preset/react/features/theme.md +0 -1
  86. package/resource/knowledge/chat/preset/vue/features/contact-list.md +3 -9
  87. package/resource/knowledge/chat/preset/vue/features/conversation-actions.md +0 -3
  88. package/resource/knowledge/chat/preset/vue/features/conversation-list.md +2 -13
  89. package/resource/knowledge/chat/preset/vue/features/conversation-preview.md +2 -3
  90. package/resource/knowledge/chat/preset/vue/features/conversation-search.md +1 -0
  91. package/resource/knowledge/chat/preset/vue/features/search.md +4 -3
  92. package/resource/knowledge/livekit/core-sdk/api-reference/android/AudioEffectStore.md +0 -7
  93. package/resource/knowledge/livekit/core-sdk/api-reference/android/BarrageStore.md +0 -3
  94. package/resource/knowledge/livekit/core-sdk/api-reference/android/BattleStore.md +0 -3
  95. package/resource/knowledge/livekit/core-sdk/api-reference/android/CameraView.md +0 -1
  96. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoGuestStore.md +0 -5
  97. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoHostStore.md +0 -3
  98. package/resource/knowledge/livekit/core-sdk/api-reference/android/DeviceStore.md +0 -2
  99. package/resource/knowledge/livekit/core-sdk/api-reference/android/GiftStore.md +0 -2
  100. package/resource/knowledge/livekit/core-sdk/api-reference/android/LikeStore.md +0 -2
  101. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveAudienceStore.md +0 -2
  102. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveCoreView.md +0 -1
  103. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveSeatStore.md +0 -2
  104. package/resource/knowledge/livekit/core-sdk/api-reference/android/LoginStore.md +0 -2
  105. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/AudioEffectStore.md +0 -7
  106. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BarrageStore.md +0 -3
  107. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BaseBeautyStore.md +0 -1
  108. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BattleStore.md +0 -3
  109. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoGuestStore.md +0 -5
  110. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoHostStore.md +0 -3
  111. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/DeviceStore.md +0 -2
  112. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/GiftStore.md +0 -2
  113. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LikeStore.md +0 -2
  114. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveAudienceStore.md +0 -2
  115. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveCoreView.md +0 -1
  116. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveSeatStore.md +0 -2
  117. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LoginStore.md +1 -3
  118. package/resource/knowledge/livekit/core-sdk/api-reference/ios/AudioEffectStore.md +0 -7
  119. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BarrageStore.md +0 -3
  120. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BaseBeautyStore.md +0 -1
  121. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BattleStore.md +0 -3
  122. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoGuestStore.md +0 -5
  123. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoHostStore.md +0 -3
  124. package/resource/knowledge/livekit/core-sdk/api-reference/ios/DeviceStore.md +0 -2
  125. package/resource/knowledge/livekit/core-sdk/api-reference/ios/GiftStore.md +0 -2
  126. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LikeStore.md +0 -2
  127. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveAudienceStore.md +0 -2
  128. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveCoreView.md +0 -1
  129. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveSeatStore.md +0 -2
  130. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LoginStore.md +0 -2
  131. package/resource/knowledge/livekit/core-sdk/features/android/audience-list.md +2 -2
  132. package/resource/knowledge/livekit/core-sdk/features/android/audio-effect.md +2 -3
  133. package/resource/knowledge/livekit/core-sdk/features/android/barrage.md +2 -2
  134. package/resource/knowledge/livekit/core-sdk/features/android/base-beauty.md +2 -2
  135. package/resource/knowledge/livekit/core-sdk/features/android/gift.md +2 -7
  136. package/resource/knowledge/livekit/core-sdk/features/android/live-list.md +3 -4
  137. package/resource/knowledge/livekit/core-sdk/features/flutter/audience-list.md +2 -2
  138. package/resource/knowledge/livekit/core-sdk/features/flutter/audio-effect.md +2 -4
  139. package/resource/knowledge/livekit/core-sdk/features/flutter/barrage.md +2 -2
  140. package/resource/knowledge/livekit/core-sdk/features/flutter/base-beauty.md +0 -2
  141. package/resource/knowledge/livekit/core-sdk/features/flutter/gift.md +2 -7
  142. package/resource/knowledge/livekit/core-sdk/features/flutter/live-list.md +3 -2
  143. package/resource/knowledge/livekit/core-sdk/features/ios/audience-list.md +2 -2
  144. package/resource/knowledge/livekit/core-sdk/features/ios/audio-effect.md +2 -4
  145. package/resource/knowledge/livekit/core-sdk/features/ios/barrage.md +2 -2
  146. package/resource/knowledge/livekit/core-sdk/features/ios/base-beauty.md +2 -2
  147. package/resource/knowledge/livekit/core-sdk/features/ios/gift.md +2 -7
  148. package/resource/knowledge/livekit/core-sdk/features/ios/live-list.md +3 -4
  149. package/resource/knowledge/livekit/core-sdk/live/android/co-guest-interaction.md +0 -3
  150. package/resource/knowledge/livekit/core-sdk/live/android/host-interaction.md +0 -4
  151. package/resource/knowledge/livekit/core-sdk/live/android/integration.md +1 -4
  152. package/resource/knowledge/livekit/core-sdk/live/flutter/co-guest-interaction.md +1 -3
  153. package/resource/knowledge/livekit/core-sdk/live/flutter/host-interaction.md +0 -1
  154. package/resource/knowledge/livekit/core-sdk/live/flutter/integration.md +1 -4
  155. package/resource/knowledge/livekit/core-sdk/live/ios/co-guest-interaction.md +0 -3
  156. package/resource/knowledge/livekit/core-sdk/live/ios/host-interaction.md +0 -3
  157. package/resource/knowledge/livekit/core-sdk/live/ios/integration.md +1 -4
  158. package/resource/knowledge/livekit/core-sdk/voice/android/co-guest-interaction.md +0 -2
  159. package/resource/knowledge/livekit/core-sdk/voice/android/host-interaction.md +0 -5
  160. package/resource/knowledge/livekit/core-sdk/voice/android/integration.md +1 -4
  161. package/resource/knowledge/livekit/core-sdk/voice/flutter/co-guest-interaction.md +1 -4
  162. package/resource/knowledge/livekit/core-sdk/voice/flutter/integration.md +3 -6
  163. package/resource/knowledge/livekit/core-sdk/voice/ios/co-guest-interaction.md +0 -2
  164. package/resource/knowledge/livekit/core-sdk/voice/ios/host-interaction.md +0 -4
  165. package/resource/knowledge/livekit/core-sdk/voice/ios/integration.md +1 -4
  166. package/resource/knowledge/livekit/faq/error-code.md +0 -1
  167. package/resource/knowledge/livekit/preset/live/vue/features/barrage.md +2 -3
  168. package/resource/knowledge/livekit/preset/live/vue/features/live-audience-list.md +3 -3
  169. package/resource/knowledge/livekit/preset/live/vue/features/live-view.md +3 -3
  170. package/resource/knowledge/push/api-reference/android.md +0 -1
  171. package/resource/knowledge/push/api-reference/harmonyos.md +0 -2
  172. package/resource/knowledge/push/api-reference/react-native.md +3 -5
  173. package/resource/knowledge/push/api-reference/uni-app.md +3 -5
  174. package/resource/knowledge/push/api-reference/unity.md +0 -1
  175. package/resource/knowledge/push/api-reference/unreal-engine.md +0 -1
  176. package/resource/knowledge/push/config/android.md +0 -24
  177. package/resource/knowledge/push/config/harmonyos.md +0 -1
  178. package/resource/knowledge/push/config/ios.md +0 -3
  179. package/resource/knowledge/push/config/react-native.md +0 -29
  180. package/resource/knowledge/push/config/unity.md +1 -24
  181. package/resource/knowledge/push/config/unreal-engine.md +1 -24
  182. package/resource/knowledge/push/integration/android.md +0 -14
  183. package/resource/knowledge/push/integration/flutter.md +0 -19
  184. package/resource/knowledge/push/integration/harmonyos.md +0 -2
  185. package/resource/knowledge/push/integration/ios.md +0 -3
  186. package/resource/knowledge/push/integration/react-native.md +0 -24
  187. package/resource/knowledge/push/integration/uni-app.md +1 -11
  188. package/resource/knowledge/push/integration/unity.md +0 -9
  189. package/resource/knowledge/push/integration/unreal-engine.md +1 -17
  190. package/resource/knowledge/roomkit/core-sdk/android/call-user-to-room.md +0 -4
  191. package/resource/knowledge/roomkit/core-sdk/android/room-participant-state.md +0 -4
  192. package/resource/knowledge/roomkit/core-sdk/android/room-state.md +0 -4
  193. package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +1 -5
  194. package/resource/knowledge/roomkit/core-sdk/ios/call-user-to-room.md +0 -4
  195. package/resource/knowledge/roomkit/core-sdk/ios/room-participant-state.md +0 -4
  196. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +0 -4
  197. package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +1 -5
  198. package/resource/knowledge/roomkit/core-sdk/vue/call-user-to-room.md +1 -1
  199. package/resource/knowledge/roomkit/core-sdk/vue/device-state.md +0 -6
  200. package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +0 -9
  201. package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +0 -11
  202. package/resource/knowledge/roomkit/core-sdk/vue/room-participant-state.md +1 -5
  203. package/resource/knowledge/roomkit/core-sdk/vue/room-state.md +1 -8
  204. package/resource/knowledge/roomkit/core-sdk/vue/room-view.md +0 -3
  205. package/resource/knowledge/roomkit/core-sdk/vue/screen-share.md +0 -3
  206. package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +0 -5
  207. package/resource/knowledge/roomkit/preset/android/integration.md +0 -4
  208. package/resource/knowledge/roomkit/preset/flutter/integration.md +1 -13
  209. package/resource/knowledge/roomkit/preset/ios/integration.md +0 -6
  210. package/resource/knowledge/roomkit/preset/react/integration.md +0 -16
  211. package/resource/knowledge/rtcengine/web/api.md +1 -8
  212. package/resource/knowledge/rtcengine/web/faq.md +3 -5
  213. package/resource/knowledge/rtcengine/web/how_to_integrated_web_sdk.md +0 -6
  214. package/resource/knowledge/rtcengine/web/plugin/20-advanced-customized-capture-rendering.md +1 -1
  215. package/resource/knowledge/rtcengine/web/plugin/21-advanced-auto-play-policy.md +1 -1
  216. package/resource/knowledge/rtcengine/web/plugin/26-advanced-publish-cdn-stream.md +1 -1
  217. package/resource/knowledge/rtcengine/web/plugin/27-advanced-small-stream.md +1 -1
  218. package/resource/knowledge/rtcengine/web/plugin/31-advanced-plugins-overview.md +1 -3
  219. package/resource/knowledge/rtcengine/web/plugin/34-advanced-proxy.md +2 -4
  220. package/resource/knowledge/rtcengine/web/plugin/36-advanced-virtual-background.md +0 -4
  221. package/resource/knowledge/rtcengine/web/plugin/39-advanced-video-decoder.md +0 -2
  222. package/resource/knowledge/trtc/android/TRTCCloud.md +8 -56
  223. package/resource/knowledge/trtc/android/TRTCCloudDef.md +6 -7
  224. package/resource/knowledge/trtc/android/TRTCCloudListener.md +1 -18
  225. package/resource/knowledge/trtc/android/TXAudioEffectManager.md +0 -14
  226. package/resource/knowledge/trtc/android/TXDeviceManager.md +0 -1
  227. package/resource/knowledge/trtc/android/TXLiteAVCode.md +1 -1
  228. package/resource/knowledge/trtc/c++/ITRTCCloud.md +7 -59
  229. package/resource/knowledge/trtc/c++/ITXAudioEffectManager.md +0 -14
  230. package/resource/knowledge/trtc/c++/ITXDeviceManager.md +0 -4
  231. package/resource/knowledge/trtc/c++/TRTCCloudCallback.md +1 -19
  232. package/resource/knowledge/trtc/c++/TRTCTypeDef.md +6 -7
  233. package/resource/knowledge/trtc/c++/TXLiteAVCode.md +1 -1
  234. package/resource/knowledge/trtc/ios/TRTCCloud.md +9 -60
  235. package/resource/knowledge/trtc/ios/TRTCCloudDef.md +6 -7
  236. package/resource/knowledge/trtc/ios/TRTCCloudDelegate.md +1 -19
  237. package/resource/knowledge/trtc/ios/TXAudioEffectManager.md +0 -13
  238. package/resource/knowledge/trtc/ios/TXDeviceManager.md +0 -4
  239. package/resource/knowledge/trtc/ios/TXLiteAVCode.md +1 -1
  240. package/server.js +1 -1
  241. package/tools/common/search_trtc_knowledge.js +2 -0
  242. package/tools/definitions/search_trtc_knowledge_def.js +1 -0
  243. package/utils/report-cls-client.js +3 -3
  244. package/utils/report-es-client.js +1 -1
  245. package/resource/knowledge/roomkit/core-sdk/flutter/call-user-to-room.md +0 -230
  246. package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +0 -797
  247. package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +0 -325
  248. package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +0 -325
@@ -5,6 +5,9 @@ import { chunkMarkdown, toManifestChunk } from './chunker.js';
5
5
  import { buildDocSourceUrlMap } from './doc-url-resolver.js';
6
6
  import { inferPathMeta } from './path-meta.js';
7
7
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ // Build-time: writes index into dist/resource/index/.
9
+ // dist/knowledge/ → ../resource/ → dist/resource/
10
+ // Must run AFTER scripts/copy-resource.js, otherwise the target dir does not exist.
8
11
  const RESOURCE_ROOT = path.resolve(__dirname, '../resource');
9
12
  function walkMarkdownFiles(dir, baseRel) {
10
13
  if (!fs.existsSync(dir))
@@ -4,7 +4,9 @@ import { fileURLToPath } from 'url';
4
4
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
5
  const fileCache = new Map();
6
6
  function resolveResourceRoot() {
7
- // npm: knowledge/ → ../resource/ 到包根;dev: dist/knowledge/ → ../resource/ 到 dist/resource/
7
+ // Runtime md source dir (sibling of knowledge/):
8
+ // npm package: <pkg>/knowledge/ → <pkg>/resource/
9
+ // local: dist/knowledge/ → dist/resource/ (populated by copy-resource.js at build time)
8
10
  return path.resolve(__dirname, '../resource');
9
11
  }
10
12
  function readSourceFile(source) {
@@ -1,4 +1,5 @@
1
1
  import { downgradeToProductType } from './product-scope-intent.js';
2
+ import { normalizeQueryPrompt } from './query-normalizer.js';
2
3
  /**
3
4
  * MCP framework enum → index 中对应的 framework 值列表。
4
5
  * path-meta.ts 已通过 normalizeFrameworkDir 把目录名归一到标准 framework,
@@ -70,15 +71,16 @@ function inferImplicitFramework(products, frameworks, prompt) {
70
71
  return undefined;
71
72
  }
72
73
  export function normalizeParams(params) {
74
+ const normalizedPrompt = normalizeQueryPrompt(params.prompt);
73
75
  const limit = Math.min(Math.max(params.limit ?? 8, 1), 16);
74
- const effectiveFramework = inferImplicitFramework(params.product, params.frameworks, params.prompt);
76
+ const effectiveFramework = inferImplicitFramework(params.product, params.frameworks, normalizedPrompt);
75
77
  const requestedFrameworks = params.frameworks?.length
76
78
  ? params.frameworks
77
79
  : effectiveFramework ? [effectiveFramework] : undefined;
78
80
  const frameworks = expandFrameworks(requestedFrameworks, params.product);
79
- const types = resolveTypes(params.product, params.types, params.prompt, requestedFrameworks);
81
+ const types = resolveTypes(params.product, params.types, normalizedPrompt, requestedFrameworks);
80
82
  return {
81
- prompt: params.prompt,
83
+ prompt: normalizedPrompt,
82
84
  product: params.product,
83
85
  framework: effectiveFramework,
84
86
  frameworks,
@@ -144,7 +146,13 @@ export function filterPool(chunks, norm) {
144
146
  && chunk.variant === 'core-sdk'
145
147
  && chunk.framework.includes('vue')
146
148
  && chunk.source.includes('/api-reference/'));
147
- if (!explicitMatch && !wildcardAllowed && !callCoreWebFallback && !liveWebVueFallback)
149
+ // Room special-case: Conference Web docs are under roomkit/core-sdk/vue.
150
+ const roomWebVueFallback = Boolean(norm.product?.includes('room')
151
+ && norm.framework === 'web'
152
+ && chunk.variant === 'core-sdk'
153
+ && chunk.framework.includes('vue')
154
+ && chunk.source.includes('knowledge/roomkit/core-sdk/vue/'));
155
+ if (!explicitMatch && !wildcardAllowed && !callCoreWebFallback && !liveWebVueFallback && !roomWebVueFallback)
148
156
  return false;
149
157
  }
150
158
  if (norm.scenario && chunk.scenario && chunk.scenario !== norm.scenario) {
@@ -0,0 +1,76 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
+ const SCHEMA_ROOT = path.resolve(__dirname, '../../resource/_schema');
6
+ const QUERY_NORMALIZATION_FILE = path.join(SCHEMA_ROOT, 'query-normalization.yaml');
7
+ const MAX_APPEND_TOKENS = 6;
8
+ let cachedConfig = null;
9
+ function unquote(input) {
10
+ return input.trim().replace(/^['"]|['"]$/g, '');
11
+ }
12
+ function loadQueryNormalizationConfig() {
13
+ if (cachedConfig)
14
+ return cachedConfig;
15
+ const config = { literal: {}, word: {} };
16
+ if (!fs.existsSync(QUERY_NORMALIZATION_FILE)) {
17
+ cachedConfig = config;
18
+ return config;
19
+ }
20
+ const text = fs.readFileSync(QUERY_NORMALIZATION_FILE, 'utf-8');
21
+ let currentSection = '';
22
+ for (const rawLine of text.split('\n')) {
23
+ const line = rawLine.trimEnd();
24
+ if (!line.trim() || line.trimStart().startsWith('#'))
25
+ continue;
26
+ const sectionMatch = line.match(/^(literal|word):\s*$/);
27
+ if (sectionMatch) {
28
+ currentSection = sectionMatch[1];
29
+ continue;
30
+ }
31
+ const entryMatch = line.match(/^\s{2}([^:#]+):\s*\[(.*)\]\s*$/);
32
+ if (!entryMatch || !currentSection)
33
+ continue;
34
+ const key = unquote(entryMatch[1]);
35
+ const values = entryMatch[2]
36
+ .split(',')
37
+ .map((token) => unquote(token))
38
+ .filter(Boolean);
39
+ if (!key || !values.length)
40
+ continue;
41
+ config[currentSection][key] = values;
42
+ }
43
+ cachedConfig = config;
44
+ return config;
45
+ }
46
+ function escapeRegExp(value) {
47
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
48
+ }
49
+ export function normalizeQueryPrompt(prompt) {
50
+ const config = loadQueryNormalizationConfig();
51
+ const terms = new Set(prompt.split(/\s+/).filter(Boolean));
52
+ const promptLower = prompt.toLowerCase();
53
+ let appendedCount = 0;
54
+ const tryAppend = (tokens) => {
55
+ for (const token of tokens) {
56
+ if (appendedCount >= MAX_APPEND_TOKENS)
57
+ return;
58
+ if (!terms.has(token)) {
59
+ terms.add(token);
60
+ appendedCount += 1;
61
+ }
62
+ }
63
+ };
64
+ for (const [needle, expansion] of Object.entries(config.literal)) {
65
+ if (!prompt.includes(needle))
66
+ continue;
67
+ tryAppend(expansion);
68
+ }
69
+ for (const [needle, expansion] of Object.entries(config.word)) {
70
+ const pattern = new RegExp(`\\b${escapeRegExp(needle.toLowerCase())}\\b`, 'i');
71
+ if (!pattern.test(promptLower))
72
+ continue;
73
+ tryAppend(expansion);
74
+ }
75
+ return [...terms].join(' ');
76
+ }
@@ -129,7 +129,16 @@ function hasBestPracticeFragment(fragments) {
129
129
  }
130
130
  function inferQueryApiTokens(prompt) {
131
131
  const tokens = new Set();
132
- const upperNoise = new Set(['SDK', 'API', 'HTTP', 'HTTPS', 'JSON', 'CALL', 'NAME', 'STATUS']);
132
+ // Keep API-shaped tokens only; exclude product/platform brand words to avoid false low-confidence downgrades.
133
+ const upperNoise = new Set([
134
+ 'SDK', 'API', 'HTTP', 'HTTPS', 'JSON', 'CALL', 'NAME', 'STATUS',
135
+ 'TRTC', 'TENCENT', 'WEB', 'VUE', 'REACT', 'ROOMKIT', 'LIVEKIT', 'CALLKIT',
136
+ ]);
137
+ const platformNoise = new Set([
138
+ 'ios', 'android', 'flutter', 'web', 'react', 'vue', 'miniprogram',
139
+ 'harmonyos', 'react-native', 'unity', 'unreal', 'unreal-engine', 'donut', 'uni-app',
140
+ 'pc', 'h5',
141
+ ]);
133
142
  for (const match of prompt.matchAll(/\b([a-z]+[A-Z][A-Za-z0-9_]*)\b/g)) {
134
143
  tokens.add(match[1]);
135
144
  }
@@ -150,7 +159,7 @@ function inferQueryApiTokens(prompt) {
150
159
  if (!upperNoise.has(token))
151
160
  tokens.add(token);
152
161
  }
153
- return [...tokens];
162
+ return [...tokens].filter((token) => !platformNoise.has(token.toLowerCase()));
154
163
  }
155
164
  function tokenInChunk(token, chunk) {
156
165
  if (chunk.api_names?.some((name) => name.toLowerCase() === token.toLowerCase()))
@@ -171,6 +180,21 @@ function computeMissingApiTokens(tokens, candidates) {
171
180
  return [];
172
181
  return tokens.filter((token) => !candidates.some((chunk) => tokenInChunk(token, chunk)));
173
182
  }
183
+ function hasProductScopeIntent(prompt) {
184
+ return /控制台|开通|开通服务|计费|套餐|价格|pricing|billing|plan|console|activate|activation|service/i.test(prompt);
185
+ }
186
+ function hasNativeTrtcApiSignal(prompt, queryApiTokens) {
187
+ if (/\bTRTCCloud\b|\bTRTCRenderParams\b|\bTXDeviceManager\b|setLocalRenderParams|startLocalPreview|stopLocalPreview/i.test(prompt)) {
188
+ return true;
189
+ }
190
+ return queryApiTokens.some((token) => /^(TRTC|TX)[A-Za-z0-9_]+$/.test(token)
191
+ || /^(set|get|start|stop|enable|disable)[A-Z][A-Za-z0-9_]+$/.test(token));
192
+ }
193
+ function hasNativeClientFramework(frameworks) {
194
+ if (!frameworks?.length)
195
+ return false;
196
+ return frameworks.some((fw) => ['android', 'ios', 'flutter', 'c++'].includes(fw));
197
+ }
174
198
  function applyRankMultipliers(ranked, chunksById, opts) {
175
199
  const adjusted = ranked.map((item) => {
176
200
  const chunk = chunksById.get(item.id);
@@ -193,7 +217,12 @@ function applyRankMultipliers(ranked, chunksById, opts) {
193
217
  && chunk.variant === 'core-sdk'
194
218
  && chunk.framework.includes('vue')
195
219
  && chunk.source.includes('/api-reference/'));
196
- if (!explicitMatch && !callCoreWebFallback && !liveWebVueFallback) {
220
+ const roomWebVueFallback = Boolean(opts.product?.includes('room')
221
+ && opts.framework === 'web'
222
+ && chunk.variant === 'core-sdk'
223
+ && chunk.framework.includes('vue')
224
+ && chunk.source.includes('knowledge/roomkit/core-sdk/vue/'));
225
+ if (!explicitMatch && !callCoreWebFallback && !liveWebVueFallback && !roomWebVueFallback) {
197
226
  multiplier *= 0.2;
198
227
  }
199
228
  }
@@ -360,7 +389,7 @@ export function searchKnowledge(params) {
360
389
  };
361
390
  };
362
391
  let pass = runSearchPass(norm);
363
- let retryReason;
392
+ const retryReasons = [];
364
393
  // B2: API token 覆盖不足时触发一次扩检(去掉 types 约束 + api/integration 轻提权)
365
394
  const missingRatio = queryApiTokens.length > 0
366
395
  ? Number((pass.missingApiTokens.length / queryApiTokens.length).toFixed(2))
@@ -374,9 +403,44 @@ export function searchKnowledge(params) {
374
403
  || retryMissingRatio < missingRatio
375
404
  || (pass.fragments.length === 0 && retryPass.fragments.length > 0)) {
376
405
  pass = retryPass;
377
- retryReason = `api_gap_retry:coverage=${pass.apiNameCoverage},missing_ratio=${retryMissingRatio}`;
406
+ retryReasons.push(`api_gap_retry:coverage=${pass.apiNameCoverage},missing_ratio=${retryMissingRatio}`);
407
+ }
408
+ }
409
+ // B3: Mixed “integration + product-scope” questions should include product docs, not just feature/integration.
410
+ if (norm.types?.length && !norm.types.includes('product') && hasProductScopeIntent(norm.prompt)) {
411
+ const widenedTypes = [...new Set([...norm.types, 'product'])];
412
+ const retryPass = runSearchPass({ ...norm, types: widenedTypes });
413
+ const baseHasProduct = pass.fragments.some((f) => f.types.includes('product'));
414
+ const retryHasProduct = retryPass.fragments.some((f) => f.types.includes('product'));
415
+ if ((retryHasProduct && !baseHasProduct)
416
+ || (pass.fragments.length === 0 && retryPass.fragments.length > 0)
417
+ || (retryPass.fragments[0]?.score ?? 0) > (pass.fragments[0]?.score ?? 0) * 1.08) {
418
+ pass = retryPass;
419
+ retryReasons.push('product_scope_retry:types+=product');
420
+ }
421
+ }
422
+ // B4: If query looks like Native TRTC APIs but routed to live/room/call, auto-append native_trtc_sdk and retry.
423
+ const shouldRetryNativeProduct = hasNativeClientFramework(norm.frameworks)
424
+ && hasNativeTrtcApiSignal(norm.prompt, queryApiTokens)
425
+ && norm.product?.some((p) => ['live', 'room', 'call'].includes(p))
426
+ && !norm.product?.includes('native_trtc_sdk')
427
+ && queryApiTokens.length > 0
428
+ && pass.apiNameCoverage < 0.5;
429
+ if (shouldRetryNativeProduct) {
430
+ const expandedProducts = [...new Set([...(norm.product ?? []), 'native_trtc_sdk'])];
431
+ const retryPass = runSearchPass({ ...norm, product: expandedProducts, types: undefined }, { apiRetry: true });
432
+ const retryMissingRatio = queryApiTokens.length > 0
433
+ ? Number((retryPass.missingApiTokens.length / queryApiTokens.length).toFixed(2))
434
+ : 0;
435
+ if (retryPass.apiNameCoverage > pass.apiNameCoverage
436
+ || retryPass.exactHits.length > pass.exactHits.length
437
+ || retryMissingRatio < missingRatio
438
+ || (pass.fragments.length === 0 && retryPass.fragments.length > 0)) {
439
+ pass = retryPass;
440
+ retryReasons.push(`native_product_retry:products=${expandedProducts.join('+')},coverage=${retryPass.apiNameCoverage}`);
378
441
  }
379
442
  }
443
+ const retryReason = retryReasons.length ? retryReasons.join(';') : undefined;
380
444
  const routeInconsistencyWarning = pass.fragments.length > 0
381
445
  ? pass.fragments.filter((f) => f.product === '*').length / pass.fragments.length > 0.3
382
446
  : false;
@@ -386,6 +450,40 @@ export function searchKnowledge(params) {
386
450
  const topScore = pass.fragments[0]?.score;
387
451
  const secondScore = pass.fragments[1]?.score;
388
452
  const answerContract = buildAnswerContract(status, confidence, { fabricationRisk });
453
+ const hasProductScope = hasProductScopeIntent(norm.prompt);
454
+ const hasNativeSignal = hasNativeTrtcApiSignal(norm.prompt, queryApiTokens);
455
+ const hasProductContent = pass.fragments.some((f) => f.types.includes('product') || /\/product\.md$/i.test(f.source));
456
+ const hasIntegrationContent = pass.fragments.some((f) => f.types.includes('integration') || /\/integration\.md$/i.test(f.source) || /\/preset\//i.test(f.source));
457
+ const hasApiQueryTokens = queryApiTokens.length > 0;
458
+ const apiGapDetected = hasApiQueryTokens && (pass.apiNameCoverage === 0 || missingRatio >= 0.3);
459
+ const retryApiGapApplied = retryReasons.some((r) => r.startsWith('api_gap_retry:'));
460
+ const retryProductScopeApplied = retryReasons.includes('product_scope_retry:types+=product');
461
+ const retryNativeProductApplied = retryReasons.some((r) => r.startsWith('native_product_retry:'));
462
+ const convergenceReached = status === 'success'
463
+ && (confidence === 'high' || confidence === 'medium')
464
+ && (!hasApiQueryTokens || pass.apiNameCoverage >= 0.5)
465
+ && (!hasProductScope || hasProductContent || hasIntegrationContent);
466
+ const retryAdvice = (() => {
467
+ if (status === 'needs_framework') {
468
+ return { stop_retry: true, next_action: 'ask_framework', reason: 'missing_framework' };
469
+ }
470
+ if (convergenceReached) {
471
+ return { stop_retry: true, next_action: 'answer', reason: 'converged' };
472
+ }
473
+ if (hasApiQueryTokens && apiGapDetected && !retryApiGapApplied) {
474
+ return { stop_retry: false, next_action: 'retry_widen_types', reason: 'api_coverage_gap' };
475
+ }
476
+ if (hasProductScope && !hasProductContent && !retryProductScopeApplied) {
477
+ return { stop_retry: false, next_action: 'retry_add_product_scope', reason: 'missing_product_scope_content' };
478
+ }
479
+ if (hasNativeSignal && hasNativeClientFramework(norm.frameworks) && !retryNativeProductApplied) {
480
+ return { stop_retry: false, next_action: 'retry_add_native_trtc_sdk', reason: 'possible_native_product_misroute' };
481
+ }
482
+ if (status === 'empty' || confidence === 'low') {
483
+ return { stop_retry: false, next_action: 'retry_or_clarify', reason: 'insufficient_retrieval_signal' };
484
+ }
485
+ return { stop_retry: true, next_action: 'answer', reason: 'default_stop' };
486
+ })();
389
487
  return {
390
488
  status,
391
489
  confidence,
@@ -408,6 +506,7 @@ export function searchKnowledge(params) {
408
506
  api_name_coverage: pass.apiNameCoverage,
409
507
  fabrication_risk: fabricationRisk,
410
508
  route_inconsistency_warning: routeInconsistencyWarning,
509
+ retry_advice: retryAdvice,
411
510
  },
412
511
  fragments: pass.fragments,
413
512
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tencent-rtc/mcp",
3
- "version": "1.6.7",
3
+ "version": "1.6.8",
4
4
  "description": "Tencent Cloud MCP Server for SDK",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -8,3 +8,4 @@ live:
8
8
  room:
9
9
  screen-share.md: ["screen sharing", "screen share", "startScreenShare"]
10
10
  virtual-background.md: ["virtual background"]
11
+ device-state.md: ["conference", "meeting", "turn on camera", "camera", "backend support", "server support", "会议", "开摄像头", "后端支持", "服务端支持"]
@@ -0,0 +1,9 @@
1
+ literal:
2
+ 摄影头: ["摄像头"]
3
+ 会议: ["roomkit", "conference"]
4
+ 会议室: ["roomkit", "conference"]
5
+ word:
6
+ conference: ["meeting", "roomkit", "conference"]
7
+ meeting: ["meeting", "roomkit", "conference"]
8
+ room: ["meeting", "roomkit", "conference"]
9
+ roomkit: ["meeting", "roomkit", "conference"]