@tencentcloud/sdk-mcp 1.6.4 → 1.6.5

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 (299) hide show
  1. package/knowledge/build-index.js +1 -1
  2. package/knowledge/chunker.js +81 -52
  3. package/knowledge/path-meta.js +181 -21
  4. package/knowledge/search/exact-lookup.js +166 -0
  5. package/knowledge/search/filter-pool.js +73 -19
  6. package/knowledge/search/product-scope-intent.js +2 -2
  7. package/knowledge/search/requires-framework.js +1 -1
  8. package/knowledge/search/search-knowledge.js +234 -57
  9. package/package.json +1 -1
  10. package/resource/_schema/feature-aliases.yaml +1 -0
  11. package/resource/integration/callkit/preset/android/integration.md +3 -5
  12. package/resource/integration/callkit/preset/flutter/integration.md +2 -3
  13. package/resource/integration/callkit/preset/ios/integration.md +2 -5
  14. package/resource/integration/callkit/preset/react/integration.md +12 -26
  15. package/resource/integration/callkit/preset/vue/integration.md +17 -33
  16. package/resource/integration/chat/preset/android/integration.md +44 -14
  17. package/resource/integration/chat/preset/flutter/integration.md +54 -13
  18. package/resource/integration/chat/preset/ios/integration.md +42 -6
  19. package/resource/integration/chat/preset/react/integration.md +30 -28
  20. package/resource/integration/chat/preset/uni-app/integration.md +101 -40
  21. package/resource/integration/chat/preset/vue/integration.md +62 -28
  22. package/resource/integration/livekit/preset/live/android/live-audience-integration.md +133 -0
  23. package/resource/integration/livekit/preset/live/android/live-host-integration.md +225 -0
  24. package/resource/integration/livekit/preset/live/android/live-list-integration.md +278 -0
  25. package/resource/integration/livekit/preset/live/android/prepare-integration.md +271 -0
  26. package/resource/integration/livekit/preset/live/ios/live-audience-integration.md +207 -0
  27. package/resource/integration/livekit/preset/live/ios/live-host-integration.md +358 -0
  28. package/resource/integration/livekit/preset/live/ios/live-list-integration.md +246 -0
  29. package/resource/integration/livekit/preset/live/ios/prepare-integration.md +218 -0
  30. package/resource/integration/livekit/preset/live/vue/live-list-integration.md +4 -7
  31. package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +5 -12
  32. package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +4 -11
  33. package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +250 -482
  34. package/resource/integration/roomkit/preset/vue/integration.md +399 -106
  35. package/resource/knowledge/callkit/best-practice/web/callengine-invitation.md +80 -0
  36. package/resource/knowledge/callkit/best-practice/web/callengine-log-control.md +20 -0
  37. package/resource/knowledge/callkit/best-practice/web/callkit-call-vs-calls.md +116 -0
  38. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +11 -15
  39. package/resource/knowledge/callkit/core-sdk/android/make-call.md +10 -13
  40. package/resource/knowledge/callkit/core-sdk/android/offline-push.md +2 -4
  41. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +10 -17
  42. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +11 -17
  43. package/resource/knowledge/callkit/core-sdk/flutter/offline-push.md +11 -20
  44. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +10 -15
  45. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +9 -14
  46. package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +12 -18
  47. package/resource/knowledge/callkit/core-sdk/miniprogram/call-engine.md +390 -0
  48. package/resource/knowledge/callkit/core-sdk/miniprogram/call-event.md +317 -0
  49. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +16 -22
  50. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +17 -23
  51. package/resource/knowledge/callkit/core-sdk/web/call-engine.md +39 -0
  52. package/resource/knowledge/callkit/core-sdk/web/call-event.md +341 -0
  53. package/resource/knowledge/callkit/core-sdk/web/callengine-api-overview.md +39 -0
  54. package/resource/knowledge/callkit/faq/android.md +1 -5
  55. package/resource/knowledge/callkit/faq/common.md +10 -12
  56. package/resource/knowledge/callkit/faq/ios.md +5 -7
  57. package/resource/knowledge/callkit/faq/uniapp-app.md +7 -7
  58. package/resource/knowledge/callkit/faq/uniapp-miniprogram.md +9 -12
  59. package/resource/knowledge/callkit/faq/web.md +2 -12
  60. package/resource/knowledge/callkit/preset/android/api.md +5 -8
  61. package/resource/knowledge/callkit/preset/ios/api.md +4 -6
  62. package/resource/knowledge/callkit/preset/miniprogram/api.md +295 -0
  63. package/resource/knowledge/callkit/preset/react/api.md +622 -0
  64. package/resource/knowledge/callkit/preset/react/uikit-api-reference.md +475 -0
  65. package/resource/knowledge/callkit/preset/vue/api.md +622 -0
  66. package/resource/knowledge/callkit/preset/vue/uikit-api-reference.md +587 -0
  67. package/resource/knowledge/callkit/preset/web/api.md +1 -1
  68. package/resource/knowledge/chat/best-practice/web/image-message-url-handling.md +16 -0
  69. package/resource/knowledge/chat/preset/android/features/chat-setting.md +1 -1
  70. package/resource/knowledge/chat/preset/android/features/conversation-list.md +0 -1
  71. package/resource/knowledge/chat/preset/android/features/language.md +2 -4
  72. package/resource/knowledge/chat/preset/android/features/message-input.md +1 -1
  73. package/resource/knowledge/chat/preset/android/features/message-list.md +1 -2
  74. package/resource/knowledge/chat/preset/android/features/search.md +0 -1
  75. package/resource/knowledge/chat/preset/android/features/theme.md +1 -1
  76. package/resource/knowledge/chat/preset/android-view/integration.md +35 -10
  77. package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +0 -1
  78. package/resource/knowledge/chat/preset/flutter/features/language.md +1 -1
  79. package/resource/knowledge/chat/preset/flutter/features/message-list.md +0 -1
  80. package/resource/knowledge/chat/preset/flutter/features/search.md +4 -5
  81. package/resource/knowledge/chat/preset/flutter/features/theme.md +1 -1
  82. package/resource/knowledge/chat/preset/ios/features/chat-setting.md +1 -1
  83. package/resource/knowledge/chat/preset/ios/features/conversation-list.md +0 -1
  84. package/resource/knowledge/chat/preset/ios/features/language.md +2 -5
  85. package/resource/knowledge/chat/preset/ios/features/message-list.md +0 -1
  86. package/resource/knowledge/chat/preset/ios/features/search.md +0 -1
  87. package/resource/knowledge/chat/preset/ios/features/theme.md +1 -1
  88. package/resource/knowledge/chat/preset/ios-uikit/integration.md +57 -166
  89. package/resource/knowledge/chat/preset/react/features/chat-setting.md +0 -1
  90. package/resource/knowledge/chat/preset/react/features/conversation-actions.md +3 -3
  91. package/resource/knowledge/chat/preset/react/features/conversation-list.md +3 -3
  92. package/resource/knowledge/chat/preset/react/features/conversation-preview.md +1 -1
  93. package/resource/knowledge/chat/preset/react/features/message-input.md +2 -3
  94. package/resource/knowledge/chat/preset/react/features/search.md +0 -1
  95. package/resource/knowledge/chat/preset/vue/features/chat-header.md +1 -1
  96. package/resource/knowledge/chat/preset/vue/features/chat-setting.md +3 -4
  97. package/resource/knowledge/chat/preset/vue/features/conversation-list.md +4 -4
  98. package/resource/knowledge/chat/preset/vue/features/conversation-preview.md +1 -1
  99. package/resource/knowledge/chat/preset/vue/features/message-input.md +2 -2
  100. package/resource/knowledge/chat/preset/vue/features/message-list.md +2 -2
  101. package/resource/knowledge/chat/preset/vue/features/search.md +0 -1
  102. package/resource/knowledge/chat/preset/vue/features/theme.md +4 -4
  103. package/resource/knowledge/livekit/core-sdk/api-reference/android/AudioEffectStore.md +0 -7
  104. package/resource/knowledge/livekit/core-sdk/api-reference/android/BarrageStore.md +2 -5
  105. package/resource/knowledge/livekit/core-sdk/api-reference/android/BattleStore.md +12 -15
  106. package/resource/knowledge/livekit/core-sdk/api-reference/android/CameraView.md +0 -1
  107. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoGuestStore.md +0 -5
  108. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoHostStore.md +0 -3
  109. package/resource/knowledge/livekit/core-sdk/api-reference/android/DeviceStore.md +0 -2
  110. package/resource/knowledge/livekit/core-sdk/api-reference/android/GiftStore.md +2 -4
  111. package/resource/knowledge/livekit/core-sdk/api-reference/android/LikeStore.md +0 -2
  112. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveAudienceStore.md +0 -2
  113. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveCoreView.md +0 -1
  114. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveSeatStore.md +2 -4
  115. package/resource/knowledge/livekit/core-sdk/api-reference/android/LoginStore.md +1 -3
  116. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/AudioEffectStore.md +0 -7
  117. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BarrageStore.md +3 -6
  118. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BaseBeautyStore.md +0 -1
  119. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BattleStore.md +12 -15
  120. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoGuestStore.md +0 -5
  121. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoHostStore.md +0 -3
  122. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/DeviceStore.md +0 -2
  123. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/GiftStore.md +2 -4
  124. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LikeStore.md +0 -2
  125. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveAudienceStore.md +0 -2
  126. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveCoreView.md +0 -1
  127. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveSeatStore.md +2 -4
  128. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LoginStore.md +1 -3
  129. package/resource/knowledge/livekit/core-sdk/api-reference/ios/AudioEffectStore.md +0 -7
  130. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BarrageStore.md +2 -5
  131. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BaseBeautyStore.md +0 -1
  132. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BattleStore.md +3 -6
  133. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoGuestStore.md +0 -5
  134. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoHostStore.md +0 -3
  135. package/resource/knowledge/livekit/core-sdk/api-reference/ios/DeviceStore.md +0 -2
  136. package/resource/knowledge/livekit/core-sdk/api-reference/ios/GiftStore.md +2 -4
  137. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LikeStore.md +0 -2
  138. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveAudienceStore.md +0 -2
  139. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveCoreView.md +0 -1
  140. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveSeatStore.md +2 -4
  141. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LoginStore.md +1 -3
  142. package/resource/knowledge/livekit/core-sdk/api-reference/vue/capability-matrix.md +82 -0
  143. package/resource/knowledge/livekit/core-sdk/{voice/android/voice-audio-effect.md → features/android/audio-effect.md} +2 -4
  144. package/resource/knowledge/livekit/core-sdk/{live/android/live-barrage.md → features/android/barrage.md} +1 -1
  145. package/resource/knowledge/livekit/core-sdk/{live/android/live-base-beauty.md → features/android/base-beauty.md} +1 -1
  146. package/resource/knowledge/livekit/core-sdk/{voice/android/voice-gift.md → features/android/gift.md} +2 -3
  147. package/resource/knowledge/livekit/core-sdk/{live/android/live-live-list.md → features/android/live-list.md} +1 -1
  148. package/resource/knowledge/livekit/core-sdk/{live/flutter/live-audio-effect.md → features/flutter/audio-effect.md} +0 -2
  149. package/resource/knowledge/livekit/core-sdk/{voice/flutter/voice-barrage.md → features/flutter/barrage.md} +3 -3
  150. package/resource/knowledge/livekit/core-sdk/{voice/flutter/voice-gift.md → features/flutter/gift.md} +2 -2
  151. package/resource/knowledge/livekit/core-sdk/{voice/flutter/voice-room-list.md → features/flutter/live-list.md} +1 -1
  152. package/resource/knowledge/livekit/core-sdk/{voice/ios/voice-audience-list.md → features/ios/audience-list.md} +1 -1
  153. package/resource/knowledge/livekit/core-sdk/{voice/ios/voice-audio-effect.md → features/ios/audio-effect.md} +1 -3
  154. package/resource/knowledge/livekit/core-sdk/{voice/ios/voice-barrage.md → features/ios/barrage.md} +2 -2
  155. package/resource/knowledge/livekit/core-sdk/{live/ios/live-base-beauty.md → features/ios/base-beauty.md} +1 -1
  156. package/resource/knowledge/livekit/core-sdk/{live/ios/live-gift.md → features/ios/gift.md} +8 -9
  157. package/resource/knowledge/livekit/core-sdk/{live/ios/live-live-list.md → features/ios/live-list.md} +2 -2
  158. package/resource/knowledge/livekit/core-sdk/{voice/uni-app/voice-audio-effect.md → features/uni-app/audio-effect.md} +2 -3
  159. package/resource/knowledge/livekit/core-sdk/{voice/uni-app/voice-barrage.md → features/uni-app/barrage.md} +2 -2
  160. package/resource/knowledge/livekit/core-sdk/features/uni-app/base-beauty.md +145 -0
  161. package/resource/knowledge/livekit/core-sdk/{voice/uni-app/voice-gift.md → features/uni-app/gift.md} +6 -7
  162. package/resource/knowledge/livekit/core-sdk/{voice/uni-app/voice-room-list.md → features/uni-app/live-list.md} +1 -1
  163. package/resource/knowledge/livekit/core-sdk/live/android/{live-co-guest-interaction.md → co-guest-interaction.md} +2 -3
  164. package/resource/knowledge/livekit/core-sdk/live/android/{live-host-interaction.md → host-interaction.md} +2 -4
  165. package/resource/knowledge/livekit/core-sdk/live/android/{live-integration.md → integration.md} +6 -9
  166. package/resource/knowledge/livekit/core-sdk/live/flutter/{live-host-interaction.md → host-interaction.md} +1 -3
  167. package/resource/knowledge/livekit/core-sdk/live/flutter/{live-integration.md → integration.md} +1 -6
  168. package/resource/knowledge/livekit/core-sdk/live/ios/{live-co-guest-interaction.md → co-guest-interaction.md} +2 -3
  169. package/resource/knowledge/livekit/core-sdk/live/ios/{live-host-interaction.md → host-interaction.md} +3 -5
  170. package/resource/knowledge/livekit/core-sdk/live/ios/{live-integration.md → integration.md} +7 -10
  171. package/resource/knowledge/livekit/core-sdk/live/uni-app/co-guest-interaction.md +561 -0
  172. package/resource/knowledge/livekit/core-sdk/live/uni-app/host-interaction.md +323 -0
  173. package/resource/knowledge/livekit/core-sdk/live/uni-app/integration.md +312 -0
  174. package/resource/knowledge/livekit/core-sdk/voice/android/{voice-co-guest-interaction.md → co-guest-interaction.md} +3 -3
  175. package/resource/knowledge/livekit/core-sdk/voice/android/{voice-host-interaction.md → host-interaction.md} +2 -4
  176. package/resource/knowledge/livekit/core-sdk/voice/android/{voice-integration.md → integration.md} +11 -14
  177. package/resource/knowledge/livekit/core-sdk/voice/flutter/{voice-co-guest-interaction.md → co-guest-interaction.md} +0 -1
  178. package/resource/knowledge/livekit/core-sdk/voice/flutter/{voice-integration.md → integration.md} +1 -4
  179. package/resource/knowledge/livekit/core-sdk/voice/ios/{voice-co-guest-interaction.md → co-guest-interaction.md} +3 -3
  180. package/resource/knowledge/livekit/core-sdk/voice/ios/{voice-host-interaction.md → host-interaction.md} +2 -4
  181. package/resource/knowledge/livekit/core-sdk/voice/ios/{voice-integration.md → integration.md} +7 -10
  182. package/resource/knowledge/livekit/core-sdk/voice/uni-app/{voice-co-guest-interaction.md → co-guest-interaction.md} +6 -6
  183. package/resource/knowledge/livekit/core-sdk/voice/uni-app/{voice-integration.md → integration.md} +6 -7
  184. package/resource/knowledge/livekit/preset/live/vue/features/barrage.md +2 -3
  185. package/resource/knowledge/livekit/preset/live/vue/features/live-audience-list.md +1 -1
  186. package/resource/knowledge/livekit/preset/live/vue/features/live-view.md +1 -1
  187. package/resource/knowledge/push/api-reference/android.md +337 -0
  188. package/resource/knowledge/push/api-reference/donut.md +190 -0
  189. package/resource/knowledge/push/api-reference/flutter.md +176 -0
  190. package/resource/knowledge/push/api-reference/harmonyos.md +140 -0
  191. package/resource/knowledge/push/api-reference/ios.md +537 -0
  192. package/resource/knowledge/push/api-reference/react-native.md +154 -0
  193. package/resource/knowledge/push/api-reference/uni-app.md +148 -0
  194. package/resource/knowledge/push/api-reference/unity.md +119 -0
  195. package/resource/knowledge/push/api-reference/unreal-engine.md +123 -0
  196. package/resource/knowledge/push/config/android/fcm.md +1 -8
  197. package/resource/knowledge/push/config/android/honor.md +3 -7
  198. package/resource/knowledge/push/config/android/huawei.md +0 -5
  199. package/resource/knowledge/push/config/android/meizu.md +0 -5
  200. package/resource/knowledge/push/config/android/oppo.md +0 -4
  201. package/resource/knowledge/push/config/android/vivo.md +0 -4
  202. package/resource/knowledge/push/config/android/xiaomi.md +0 -2
  203. package/resource/knowledge/push/config/donut.md +33 -46
  204. package/resource/knowledge/push/config/harmonyos.md +6 -9
  205. package/resource/knowledge/push/config/ios.md +2 -9
  206. package/resource/knowledge/push/config/react-native.md +17 -25
  207. package/resource/knowledge/push/config/unity.md +16 -24
  208. package/resource/knowledge/push/config/unreal-engine.md +16 -24
  209. package/resource/knowledge/push/integration/android.md +21 -21
  210. package/resource/knowledge/push/integration/donut.md +24 -34
  211. package/resource/knowledge/push/integration/flutter.md +12 -1
  212. package/resource/knowledge/push/integration/harmonyos.md +2 -1
  213. package/resource/knowledge/push/integration/ios.md +16 -10
  214. package/resource/knowledge/push/integration/react-native.md +10 -14
  215. package/resource/knowledge/push/integration/uni-app.md +10 -6
  216. package/resource/knowledge/push/integration/unity.md +19 -22
  217. package/resource/knowledge/push/integration/unreal-engine.md +7 -9
  218. package/resource/knowledge/push/overview/prepare.md +2 -2
  219. package/resource/knowledge/roomkit/core-sdk/android/capability-matrix.md +46 -0
  220. package/resource/knowledge/roomkit/core-sdk/android/unsupported-features.md +82 -0
  221. package/resource/knowledge/roomkit/core-sdk/flutter/capability-matrix.md +46 -0
  222. package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +1 -1
  223. package/resource/knowledge/roomkit/core-sdk/flutter/unsupported-features.md +82 -0
  224. package/resource/knowledge/roomkit/core-sdk/ios/capability-matrix.md +46 -0
  225. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +1 -1
  226. package/resource/knowledge/roomkit/core-sdk/ios/unsupported-features.md +82 -0
  227. package/resource/knowledge/roomkit/core-sdk/vue/call-user-to-room.md +1 -1
  228. package/resource/knowledge/roomkit/core-sdk/vue/device-state.md +0 -4
  229. package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +2 -5
  230. package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +0 -3
  231. package/resource/knowledge/roomkit/core-sdk/vue/room-participant-state.md +0 -2
  232. package/resource/knowledge/roomkit/core-sdk/vue/room-state.md +2 -6
  233. package/resource/knowledge/roomkit/core-sdk/vue/room-view.md +0 -1
  234. package/resource/knowledge/roomkit/core-sdk/vue/schedule-room.md +1 -1
  235. package/resource/knowledge/roomkit/core-sdk/vue/screen-share.md +2 -4
  236. package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +2 -3
  237. package/resource/knowledge/roomkit/preset/android/integration.md +14 -16
  238. package/resource/knowledge/roomkit/preset/flutter/integration.md +9 -17
  239. package/resource/knowledge/roomkit/preset/ios/integration.md +9 -17
  240. package/resource/knowledge/roomkit/preset/react/integration.md +0 -4
  241. package/resource/knowledge/trtc/android/TRTCCloud.md +97 -180
  242. package/resource/knowledge/trtc/android/TRTCCloudDef.md +20 -20
  243. package/resource/knowledge/trtc/android/TRTCCloudListener.md +43 -77
  244. package/resource/knowledge/trtc/android/TRTCStatistics.md +1 -1
  245. package/resource/knowledge/trtc/android/TXAudioEffectManager.md +4 -24
  246. package/resource/knowledge/trtc/android/TXDeviceManager.md +2 -2
  247. package/resource/knowledge/trtc/android/TXLiteAVCode.md +1 -1
  248. package/resource/knowledge/trtc/c++/ITRTCCloud.md +96 -189
  249. package/resource/knowledge/trtc/c++/ITRTCStatistics.md +1 -1
  250. package/resource/knowledge/trtc/c++/ITXAudioEffectManager.md +1 -21
  251. package/resource/knowledge/trtc/c++/ITXDeviceManager.md +4 -6
  252. package/resource/knowledge/trtc/c++/TRTCCloudCallback.md +42 -76
  253. package/resource/knowledge/trtc/c++/TRTCTypeDef.md +18 -19
  254. package/resource/knowledge/trtc/c++/TXLiteAVCode.md +1 -1
  255. package/resource/knowledge/trtc/ios/TRTCCloud.md +95 -181
  256. package/resource/knowledge/trtc/ios/TRTCCloudDelegate.md +43 -78
  257. package/resource/knowledge/trtc/ios/TRTCStatistics.md +1 -1
  258. package/resource/knowledge/trtc/ios/TXAudioEffectManager.md +1 -20
  259. package/resource/knowledge/trtc/ios/TXDeviceManager.md +4 -6
  260. package/resource/knowledge/trtc/ios/TXLiteAVCode.md +1 -1
  261. package/resource/knowledge/trtc/ios/TXLiveSDKTypeDef.md +20 -20
  262. package/server.js +2 -2
  263. package/tools/common/finalize_answer.js +1 -1
  264. package/tools/common/present_framework_choice.js +2 -2
  265. package/tools/common/search_trtc_knowledge.js +3 -3
  266. package/tools/common/submit_feedback.js +1 -1
  267. package/tools/definitions/get_native_live_uikit_integration_def.js +60 -0
  268. package/tools/definitions/get_native_livekit_core_integration_def.js +1 -1
  269. package/tools/definitions/present_framework_choice_def.js +2 -2
  270. package/tools/definitions/search_trtc_knowledge_def.js +5 -5
  271. package/tools/index.js +2 -0
  272. package/tools/live/get_native_live_uikit_integration.js +69 -0
  273. package/tools/live/get_native_livekit_core_integration.js +6 -6
  274. package/utils/report-cls-client.js +1 -1
  275. package/utils/report-es-client.js +1 -1
  276. package/resource/index/component-slugs.json +0 -1
  277. package/resource/index/doc-source-urls.json +0 -1
  278. package/resource/index/manifest.json +0 -1
  279. package/resource/knowledge/livekit/core-sdk/live/android/live-audio-effect.md +0 -229
  280. package/resource/knowledge/livekit/core-sdk/live/android/live-gift.md +0 -459
  281. package/resource/knowledge/livekit/core-sdk/live/flutter/live-barrage.md +0 -506
  282. package/resource/knowledge/livekit/core-sdk/live/flutter/live-gift.md +0 -427
  283. package/resource/knowledge/livekit/core-sdk/live/flutter/live-live-list.md +0 -726
  284. package/resource/knowledge/livekit/core-sdk/live/ios/live-audience-list.md +0 -265
  285. package/resource/knowledge/livekit/core-sdk/live/ios/live-audio-effect.md +0 -214
  286. package/resource/knowledge/livekit/core-sdk/live/ios/live-barrage.md +0 -427
  287. package/resource/knowledge/livekit/core-sdk/voice/android/voice-audience-list.md +0 -272
  288. package/resource/knowledge/livekit/core-sdk/voice/android/voice-barrage.md +0 -486
  289. package/resource/knowledge/livekit/core-sdk/voice/android/voice-room-list.md +0 -523
  290. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audience-list.md +0 -262
  291. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audio-effect.md +0 -600
  292. package/resource/knowledge/livekit/core-sdk/voice/ios/voice-gift.md +0 -411
  293. package/resource/knowledge/livekit/core-sdk/voice/ios/voice-room-list.md +0 -404
  294. /package/resource/knowledge/livekit/core-sdk/api-reference/{web → vue}/index.md +0 -0
  295. /package/resource/knowledge/livekit/core-sdk/{live/android/live-audience-list.md → features/android/audience-list.md} +0 -0
  296. /package/resource/knowledge/livekit/core-sdk/{live/flutter/live-audience-list.md → features/flutter/audience-list.md} +0 -0
  297. /package/resource/knowledge/livekit/core-sdk/{live/flutter/live-base-beauty.md → features/flutter/base-beauty.md} +0 -0
  298. /package/resource/knowledge/livekit/core-sdk/{voice/uni-app/voice-audience-list.md → features/uni-app/audience-list.md} +0 -0
  299. /package/resource/knowledge/livekit/core-sdk/live/flutter/{live-co-guest-interaction.md → co-guest-interaction.md} +0 -0
@@ -5,7 +5,7 @@ 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
- const RESOURCE_ROOT = path.resolve(__dirname, '../resource');
8
+ const RESOURCE_ROOT = path.resolve(__dirname, '../../resource');
9
9
  function walkMarkdownFiles(dir, baseRel) {
10
10
  if (!fs.existsSync(dir))
11
11
  return [];
@@ -36,11 +36,83 @@ function splitByHeading(content, level) {
36
36
  return sections;
37
37
  }
38
38
  function isFaqLike(source, content) {
39
- return /faq|error-code|error_code|TXLiteAVCode/i.test(source) || (content.match(/^###\s+/gm) ?? []).length >= 3;
39
+ return /faq|error-code|error_code|TXLiteAVCode|unsupported-features/i.test(source)
40
+ || (content.match(/^###\s+/gm) ?? []).length >= 3;
41
+ }
42
+ function shouldForceSectionSplit(source, meta) {
43
+ return source.endsWith('unsupported-features.md') || meta.doc_kind === 'unsupported_summary';
40
44
  }
41
45
  function isChatUrlMapping(source) {
42
46
  return /knowledge\/chat\/urls\/.+\.md$/i.test(source.replace(/\\/g, '/'));
43
47
  }
48
+ function containsCodeBlock(body) {
49
+ return /```[\s\S]*?```/.test(body);
50
+ }
51
+ function extractApiNames(body) {
52
+ const names = new Set();
53
+ const upperNoise = new Set(['SDK', 'API', 'HTTP', 'HTTPS', 'JSON']);
54
+ for (const match of body.matchAll(/`([a-z][A-Za-z0-9_]{2,})`/g)) {
55
+ names.add(match[1]);
56
+ }
57
+ for (const match of body.matchAll(/\b([a-z]+[A-Z][A-Za-z0-9_]*)\b/g)) {
58
+ names.add(match[1]);
59
+ }
60
+ for (const match of body.matchAll(/\b([A-Z][A-Za-z0-9_]*\.[a-zA-Z_][A-Za-z0-9_]*)\b/g)) {
61
+ names.add(match[1]);
62
+ }
63
+ for (const match of body.matchAll(/\b(I[A-Z][A-Za-z0-9_]*)\b/g)) {
64
+ names.add(match[1]);
65
+ }
66
+ for (const match of body.matchAll(/\b([A-Z][A-Za-z0-9_]*\.[A-Z_][A-Z0-9_]*)\b/g)) {
67
+ names.add(match[1]);
68
+ }
69
+ for (const match of body.matchAll(/\b([A-Z_]{3,})\b/g)) {
70
+ const token = match[1];
71
+ if (!upperNoise.has(token))
72
+ names.add(token);
73
+ }
74
+ return [...names].slice(0, 90);
75
+ }
76
+ function extractKeyPhrases(title, body) {
77
+ const firstParagraph = body
78
+ .replace(/^#{1,6}\s+.+$/gm, '')
79
+ .split(/\n\s*\n/)
80
+ .map((p) => p.trim())
81
+ .find(Boolean) ?? '';
82
+ const phrases = [title, firstParagraph]
83
+ .flatMap((part) => part.split(/[,。;;\n]/))
84
+ .map((s) => s.trim())
85
+ .filter((s) => s.length >= 2)
86
+ .slice(0, 8);
87
+ return [...new Set(phrases)];
88
+ }
89
+ function buildChunk(meta, source, title, body, id, char_start, char_end) {
90
+ const api_names = extractApiNames(body);
91
+ const key_phrases = extractKeyPhrases(title, body);
92
+ return {
93
+ id,
94
+ corpus: meta.corpus,
95
+ product: meta.product,
96
+ framework: meta.framework,
97
+ types: meta.types,
98
+ scenario: meta.scenario,
99
+ variant: meta.variant,
100
+ scope: meta.scope,
101
+ doc_kind: meta.doc_kind,
102
+ capability_status: meta.capability_status,
103
+ retrievable_scope: meta.retrievable_scope,
104
+ title,
105
+ source,
106
+ content: body,
107
+ symbols: extractSymbols(body),
108
+ error_codes: extractErrorCodes(body),
109
+ ...(api_names.length ? { api_names } : {}),
110
+ ...(containsCodeBlock(body) ? { contains_code: true } : {}),
111
+ ...(key_phrases.length ? { key_phrases } : {}),
112
+ char_start,
113
+ char_end,
114
+ };
115
+ }
44
116
  function parseUrlMappingRows(content) {
45
117
  const lines = content.split('\n');
46
118
  let sectionTitle = '';
@@ -78,28 +150,12 @@ function chunkUrlMapping(source, content, meta) {
78
150
  return [];
79
151
  }
80
152
  const baseSlug = sourceSlug(source);
81
- const chunks = [];
82
- for (const row of rows) {
153
+ return rows.map((row) => {
83
154
  const sectionLine = row.sectionTitle ? `### ${row.sectionTitle}\n\n` : '';
84
155
  const body = `${sectionLine}| 子问题 | 目标文档 |\n|--------|---------|\n| ${row.label} | \`${row.url}\` |`;
85
156
  const headingSlug = slugify(row.label);
86
- chunks.push({
87
- id: `${baseSlug}#${headingSlug}`,
88
- corpus: meta.corpus,
89
- product: meta.product,
90
- framework: meta.framework,
91
- types: meta.types,
92
- scenario: meta.scenario,
93
- title: row.label,
94
- source,
95
- content: body,
96
- symbols: extractSymbols(body),
97
- error_codes: extractErrorCodes(body),
98
- char_start: row.lineStart,
99
- char_end: row.lineEnd,
100
- });
101
- }
102
- return chunks;
157
+ return buildChunk(meta, source, row.label, body, `${baseSlug}#${headingSlug}`, row.lineStart, row.lineEnd);
158
+ });
103
159
  }
104
160
  export function chunkMarkdown(source, content, meta) {
105
161
  const chunks = [];
@@ -110,49 +166,22 @@ export function chunkMarkdown(source, content, meta) {
110
166
  return urlChunks;
111
167
  }
112
168
  }
113
- if (content.length < 2048) {
169
+ const forceSectionSplit = shouldForceSectionSplit(source, meta);
170
+ if (content.length < 2048 && !forceSectionSplit) {
114
171
  const { body, char_start, char_end } = trimSliceOffsets(content, 0);
115
172
  if (!body)
116
173
  return chunks;
117
- chunks.push({
118
- id: `${baseSlug}#full`,
119
- corpus: meta.corpus,
120
- product: meta.product,
121
- framework: meta.framework,
122
- types: meta.types,
123
- scenario: meta.scenario,
124
- title: pathBasename(source),
125
- source,
126
- content: body,
127
- symbols: extractSymbols(body),
128
- error_codes: extractErrorCodes(body),
129
- char_start,
130
- char_end,
131
- });
174
+ chunks.push(buildChunk(meta, source, pathBasename(source), body, `${baseSlug}#full`, char_start, char_end));
132
175
  return chunks;
133
176
  }
134
- const level = isFaqLike(source, content) ? 3 : 2;
177
+ const level = forceSectionSplit ? 3 : (isFaqLike(source, content) ? 3 : 2);
135
178
  const sections = splitByHeading(content, level);
136
179
  for (const section of sections) {
137
180
  const { body, char_start, char_end } = trimSliceOffsets(section.raw, section.start);
138
181
  if (!body)
139
182
  continue;
140
183
  const headingSlug = slugify(section.title);
141
- chunks.push({
142
- id: `${baseSlug}#${headingSlug}`,
143
- corpus: meta.corpus,
144
- product: meta.product,
145
- framework: meta.framework,
146
- types: meta.types,
147
- scenario: meta.scenario,
148
- title: section.title,
149
- source,
150
- content: body,
151
- symbols: extractSymbols(body),
152
- error_codes: extractErrorCodes(body),
153
- char_start,
154
- char_end,
155
- });
184
+ chunks.push(buildChunk(meta, source, section.title, body, `${baseSlug}#${headingSlug}`, char_start, char_end));
156
185
  }
157
186
  return chunks.length > 0 ? chunks : chunkMarkdown(source, content.slice(0, 2048), meta);
158
187
  }
@@ -10,7 +10,10 @@ function inferTypesFromFilename(fileName, baseTypes) {
10
10
  types.push('api');
11
11
  if (lower === 'faq.md')
12
12
  types.push('faq');
13
- if (lower === 'integration.md' || lower.endsWith('-integration.md'))
13
+ // 文件名 = integration.md 不再默认 push integration(由上游 framework 分支显式声明 type)
14
+ // live 分支 core 文档的 filename = integration.md 应是 type=core,不是 type=integration
15
+ // chat/preset/integration.md 等仍由 preset 分支的 types.push('integration') 处理
16
+ if (lower.endsWith('-integration.md'))
14
17
  types.push('integration');
15
18
  if (/live-.*-interaction|voice-/.test(lower))
16
19
  types.push('feature');
@@ -26,6 +29,29 @@ const DIR_TO_FRAMEWORK = {
26
29
  function normalizeFrameworkDir(dir) {
27
30
  return DIR_TO_FRAMEWORK[dir] ?? dir;
28
31
  }
32
+ function inferDocMeta(fileName) {
33
+ const lower = fileName.toLowerCase();
34
+ if (lower === 'capability-matrix.md') {
35
+ return { doc_kind: 'capability_matrix' };
36
+ }
37
+ if (lower === 'unsupported-features.md') {
38
+ return { doc_kind: 'unsupported_summary', capability_status: 'unsupported' };
39
+ }
40
+ if (lower.endsWith('-unsupported.md')) {
41
+ return { doc_kind: 'negative_faq', capability_status: 'unsupported' };
42
+ }
43
+ return {};
44
+ }
45
+ function inferShareScope(fileName) {
46
+ const lower = fileName.toLowerCase();
47
+ if (lower === 'usersig.md') {
48
+ return [
49
+ 'usersig', 'sdkappid', 'secretkey', 'sdk 密钥', '鉴权', '签名',
50
+ 'gentestusersig', 'tls', 'hmac',
51
+ ];
52
+ }
53
+ return 'always';
54
+ }
29
55
  export function inferPathMeta(relativeSource) {
30
56
  const normalized = relativeSource.replace(/\\/g, '/');
31
57
  const parts = normalized.split('/');
@@ -35,7 +61,18 @@ export function inferPathMeta(relativeSource) {
35
61
  let framework = ['*'];
36
62
  let types = corpus === 'integration' ? ['integration'] : [];
37
63
  let scenario = null;
38
- if (normalized.startsWith('knowledge/chat/') || normalized.startsWith('integration/chat/')) {
64
+ let variant;
65
+ let doc_kind;
66
+ let capability_status;
67
+ let retrievable_scope;
68
+ if (normalized.startsWith('knowledge/share/')) {
69
+ // 通配语料(跨产品共享)显式建模,不再依赖默认兜底路径。
70
+ product = '*';
71
+ framework = ['*'];
72
+ types.push('faq', 'product');
73
+ retrievable_scope = inferShareScope(fileName);
74
+ }
75
+ else if (normalized.startsWith('knowledge/chat/') || normalized.startsWith('integration/chat/')) {
39
76
  product = 'chat';
40
77
  if (parts.includes('preset') && parts.length >= 4) {
41
78
  framework = [normalizeFrameworkDir(parts[parts.indexOf('preset') + 1])];
@@ -67,6 +104,22 @@ export function inferPathMeta(relativeSource) {
67
104
  }
68
105
  }
69
106
  }
107
+ // chat FAQ / best-practice 平台拆分:
108
+ // - 新结构:knowledge/chat/best-practice/{platform}/{topic}.md
109
+ // - 旧结构:knowledge/chat/faq/{platform}.md(保留兼容)
110
+ // 两者都统一标记为 types=['faq'],便于通过 types=faq 命中“经验类问答”。
111
+ if (parts[1] === 'chat' && parts[2] === 'best-practice' && parts.length >= 5) {
112
+ const fwSlug = normalizeFrameworkDir(parts[3]);
113
+ framework = [fwSlug];
114
+ types.push('faq');
115
+ }
116
+ if (parts[1] === 'chat' && parts[2] === 'faq' && parts.length >= 4) {
117
+ const fwSlug = fileName.replace(/\.mdx?$/, '');
118
+ if (fwSlug) {
119
+ framework = [fwSlug];
120
+ types.push('faq');
121
+ }
122
+ }
70
123
  if (fileName === 'faq.md')
71
124
  types.push('faq');
72
125
  }
@@ -74,10 +127,24 @@ export function inferPathMeta(relativeSource) {
74
127
  product = 'call';
75
128
  const presetIdx = parts.indexOf('preset');
76
129
  const coreIdx = parts.indexOf('core-sdk');
77
- if (presetIdx >= 0 && parts[presetIdx + 1])
130
+ if (presetIdx >= 0 && parts[presetIdx + 1]) {
78
131
  framework = [normalizeFrameworkDir(parts[presetIdx + 1])];
79
- if (coreIdx >= 0 && parts[coreIdx + 1])
132
+ variant = 'preset';
133
+ }
134
+ if (coreIdx >= 0 && parts[coreIdx + 1]) {
80
135
  framework = [normalizeFrameworkDir(parts[coreIdx + 1])];
136
+ variant = 'core-sdk';
137
+ }
138
+ // callkit 最佳实践目录:knowledge/callkit/best-practice/{platform}/{topic}.md
139
+ // 统一按 FAQ/经验类知识处理,支持 types=faq + frameworks={platform} 的精确检索。
140
+ if (parts[1] === 'callkit' && parts[2] === 'best-practice' && parts.length >= 5) {
141
+ framework = [normalizeFrameworkDir(parts[3])];
142
+ types.push('faq');
143
+ // calls 相关最佳实践既是 FAQ 也是 API 语义,避免 types=api 时被误过滤。
144
+ if (/(callengine-invitation|callkit-call-vs-calls)\.md$/i.test(fileName)) {
145
+ types.push('api');
146
+ }
147
+ }
81
148
  if (parts.includes('faq'))
82
149
  types.push('faq', 'error_code');
83
150
  if (fileName === 'api.md')
@@ -86,36 +153,114 @@ export function inferPathMeta(relativeSource) {
86
153
  types.push('api', 'feature');
87
154
  }
88
155
  else if (normalized.includes('/livekit/')) {
156
+ // livekit 目录结构:
157
+ // preset/{framework}/ → 旧结构(如 preset/vue)
158
+ // preset/{scenario}/{platform}/ → 新结构(如 preset/live/android)
159
+ // core-sdk/live/{platform}/*.md → 视频直播 core 文档(framework 标签: [live, platform],types=[core])
160
+ // core-sdk/voice/{platform}/*.md → 语聊房 core 文档(framework 标签: [voice, platform],types=[core])
161
+ // core-sdk/features/{platform}/*.md → 跨场景功能模块(framework 标签: [features, platform],types=[feature])
162
+ // core-sdk/api-reference/{platform}/*.md → 客户端 API(framework 标签: [platform],types=[api])
163
+ // 写写上"功能模块"是 video live / voice 共享节点,所以 features/ 下文档 type=feature 而非 core
89
164
  product = 'live';
90
165
  if (parts.includes('voice'))
91
166
  scenario = 'voice';
92
- if (parts.includes('/live/'))
167
+ if (parts.includes('live'))
93
168
  scenario = 'live';
94
- if (parts.includes('preset') && parts.includes('vue'))
95
- framework = ['vue'];
96
- if (parts.includes('core-sdk') && parts.length >= 4) {
97
- const fwIdx = parts.indexOf('core-sdk') + 2;
98
- if (parts[fwIdx] && !['live', 'voice'].includes(parts[fwIdx])) {
99
- framework = [normalizeFrameworkDir(parts[fwIdx])];
169
+ const presetIdx = parts.indexOf('preset');
170
+ const coreIdx = parts.indexOf('core-sdk');
171
+ if (presetIdx >= 0 && parts[presetIdx + 1]) {
172
+ const presetLevel1 = normalizeFrameworkDir(parts[presetIdx + 1]);
173
+ const presetLevel2 = parts[presetIdx + 2] ? normalizeFrameworkDir(parts[presetIdx + 2]) : undefined;
174
+ // 兼容两种 preset 目录:
175
+ // - preset/{framework}(旧)
176
+ // - preset/{scenario}/{platform}(新)
177
+ if ((presetLevel1 === 'live' || presetLevel1 === 'voice') && presetLevel2) {
178
+ scenario = presetLevel1;
179
+ framework = [presetLevel2];
180
+ }
181
+ else {
182
+ framework = [presetLevel1];
183
+ }
184
+ variant = 'preset';
185
+ types.push('feature');
186
+ }
187
+ if (coreIdx >= 0 && parts.length >= 4) {
188
+ // core-sdk 下的 4 个子目录(live/voice/features/api-reference),每个下挂 platform 子目录
189
+ const sub = parts[coreIdx + 1];
190
+ const platform = parts[coreIdx + 2];
191
+ if (sub === 'live' && platform) {
192
+ framework = ['live', normalizeFrameworkDir(platform)];
193
+ types.push('core');
194
+ if (fileName === 'integration.md') {
195
+ types.push('api', 'integration');
196
+ }
197
+ variant = 'core-sdk';
198
+ }
199
+ else if (sub === 'voice' && platform) {
200
+ framework = ['voice', normalizeFrameworkDir(platform)];
201
+ types.push('core');
202
+ if (fileName === 'integration.md') {
203
+ types.push('api', 'integration');
204
+ }
205
+ variant = 'core-sdk';
206
+ }
207
+ else if (sub === 'features' && platform) {
208
+ framework = ['features', normalizeFrameworkDir(platform)];
209
+ types.push('feature');
210
+ variant = 'core-sdk';
211
+ }
212
+ else if (sub === 'api-reference' && platform) {
213
+ // api-reference 沿用旧逻辑:framework = platform,types = api
214
+ framework = [normalizeFrameworkDir(platform)];
215
+ types.push('api');
216
+ variant = 'core-sdk';
217
+ }
218
+ else {
219
+ // 兜底(不在 4 个已知子目录下):framework = 子目录名
220
+ framework = [normalizeFrameworkDir(sub ?? '*')];
221
+ variant = 'core-sdk';
222
+ types.push('feature', 'api');
100
223
  }
101
224
  }
102
225
  if (parts.includes('components'))
103
226
  types.push('component');
104
- if (parts.includes('api-reference'))
105
- types.push('api');
106
- if (parts.includes('core-sdk'))
107
- types.push('feature', 'api');
108
227
  if (fileName === 'faq.md')
109
228
  types.push('faq');
229
+ // 与 roomkit 对齐:core-sdk 下 capability-matrix.md / unsupported-features.md
230
+ // 视为能力边界文档(doc_kind + capability_status),方便检索层按 doc_kind 过滤
231
+ const docMeta = inferDocMeta(fileName);
232
+ doc_kind = docMeta.doc_kind;
233
+ capability_status = docMeta.capability_status ?? capability_status;
234
+ if (doc_kind === 'capability_matrix' || doc_kind === 'unsupported_summary' || doc_kind === 'negative_faq') {
235
+ types.push('feature', 'faq');
236
+ }
110
237
  }
111
238
  else if (normalized.includes('/roomkit/')) {
112
239
  product = 'room';
113
- if (parts.includes('vue'))
114
- framework = ['vue'];
240
+ const presetIdx = parts.indexOf('preset');
241
+ const coreIdx = parts.indexOf('core-sdk');
242
+ if (presetIdx >= 0 && parts[presetIdx + 1]) {
243
+ framework = [normalizeFrameworkDir(parts[presetIdx + 1])];
244
+ variant = 'preset';
245
+ }
246
+ if (coreIdx >= 0 && parts[coreIdx + 1]) {
247
+ framework = [normalizeFrameworkDir(parts[coreIdx + 1])];
248
+ variant = 'core-sdk';
249
+ types.push('feature');
250
+ if (framework[0] === 'vue') {
251
+ capability_status = 'supported';
252
+ }
253
+ }
115
254
  if (parts.includes('features'))
116
255
  types.push('feature');
117
256
  if (parts.includes('faq'))
118
257
  types.push('faq', 'error_code');
258
+ const docMeta = inferDocMeta(fileName);
259
+ doc_kind = docMeta.doc_kind;
260
+ capability_status = docMeta.capability_status ?? capability_status;
261
+ if (doc_kind === 'capability_matrix' || doc_kind === 'unsupported_summary' || doc_kind === 'negative_faq') {
262
+ types.push('feature', 'faq');
263
+ }
119
264
  }
120
265
  else if (normalized.startsWith('knowledge/trtc/')) {
121
266
  product = 'native_trtc_sdk';
@@ -134,26 +279,32 @@ export function inferPathMeta(relativeSource) {
134
279
  // knowledge/push/overview/{topic}.md → 跨平台综述(接入前准备/流程/选型/计费等),framework=*,types=[product]
135
280
  // knowledge/push/integration/{platform}.md → framework=平台 slug,types=[integration]
136
281
  // knowledge/push/config/android/{vendor}.md → framework=android(vendor 厂商靠 BM25 命中),types=[integration]
282
+ // knowledge/push/api-reference/{platform}.md → framework=平台 slug,types=[api]
137
283
  product = 'push';
138
- const category = parts[2]; // overview | integration | config
284
+ const category = parts[2]; // overview | integration | config | api-reference
139
285
  if (category === 'overview') {
140
286
  framework = ['*'];
141
287
  types.push('product');
142
288
  }
143
289
  else if (category === 'integration') {
144
- const fwSlug = fileName.replace(/\.mdx?$/, ''); // android / ios / donut / ...
290
+ const fwSlug = fileName.replace(/\.mdx?$/, '');
145
291
  if (fwSlug) {
146
292
  framework = [fwSlug];
147
293
  }
148
294
  types.push('integration');
149
295
  }
150
296
  else if (category === 'config' && parts[3]) {
151
- // config/{platform}/{vendor}.md(Android 厂商)或 config/{platform}.md(非 Android 平台配置)
152
- // platform 决定 framework,vendor 靠 BM25 命中
153
297
  const platform = parts[3].replace(/\.mdx?$/, '');
154
298
  framework = [platform];
155
299
  types.push('integration');
156
300
  }
301
+ else if (category === 'api-reference') {
302
+ const fwSlug = fileName.replace(/\.mdx?$/, '');
303
+ if (fwSlug) {
304
+ framework = [fwSlug];
305
+ }
306
+ types.push('api');
307
+ }
157
308
  else {
158
309
  types.push('integration');
159
310
  }
@@ -167,11 +318,20 @@ export function inferPathMeta(relativeSource) {
167
318
  types = inferTypesFromFilename(fileName, types);
168
319
  if (types.length === 0)
169
320
  types = ['faq'];
321
+ const primaryFramework = framework[0];
322
+ const scope = product !== '*' && variant && primaryFramework && primaryFramework !== '*'
323
+ ? `${product}:${variant}:${primaryFramework}`
324
+ : undefined;
170
325
  return {
171
326
  product,
172
327
  framework,
173
328
  types: uniq(types),
174
329
  scenario,
175
330
  corpus,
331
+ variant,
332
+ scope,
333
+ doc_kind,
334
+ capability_status,
335
+ retrievable_scope,
176
336
  };
177
337
  }
@@ -94,6 +94,50 @@ function loadFeatureAliases() {
94
94
  }
95
95
  return result;
96
96
  }
97
+ const ROOM_CORE_SIGNAL = /atomicx\s*core|atomicxcore|atomicx|core\s*sdk|无\s*ui|自定义\s*ui|自实现|roomstore|store|useRoomState|useDeviceState|useLoginState/i;
98
+ const ROOM_PRESET_SIGNAL = /预制|preset|roommainview|roommainwidget|默认\s*ui|主页面|房间主页面/i;
99
+ const ROOM_FEATURE_SPECS = [
100
+ {
101
+ fileName: 'room-chat.md',
102
+ titlePattern: /room\s*chat|in-room\s*im\s*chat|会中聊天|聊天能力|IM\s*聊天/i,
103
+ promptPattern: /room\s*chat|会中聊天|in[- ]room\s*(im\s*)?chat|im\s*聊天|messagelist|messageinput|messagestore|聊天面板|房间聊天/i,
104
+ },
105
+ {
106
+ fileName: 'screen-share.md',
107
+ titlePattern: /screen\s*share|屏幕分享/i,
108
+ promptPattern: /screen\s*share|屏幕分享|共享屏幕|startScreenShare/i,
109
+ },
110
+ {
111
+ fileName: 'virtual-background.md',
112
+ titlePattern: /virtual\s*background|虚拟背景/i,
113
+ promptPattern: /virtual\s*background|虚拟背景|背景虚化|背景替换|initVirtualBackground/i,
114
+ },
115
+ {
116
+ fileName: 'room-view.md',
117
+ titlePattern: /roomview|room\s*view|房间主视图|视频布局/i,
118
+ promptPattern: /roomview|room\s*view|房间主视图|视频布局|画面布局|layoutTemplate/i,
119
+ },
120
+ {
121
+ fileName: 'device-detection.md',
122
+ titlePattern: /device\s*detection|设备检测|设备预览/i,
123
+ promptPattern: /device\s*detection|设备检测|设备预览|startCameraTest|startMicrophoneTest|startSpeakerTest/i,
124
+ },
125
+ {
126
+ fileName: 'device-state.md',
127
+ titlePattern: /device\s*state|设备状态|设备管理/i,
128
+ promptPattern: /device\s*state|设备状态|设备管理|摄像头|麦克风|扬声器|switchMirror|setCurrentCamera|networkInfo/i,
129
+ },
130
+ {
131
+ fileName: 'free-beauty-panel.md',
132
+ titlePattern: /free\s*beauty|美颜面板|基础美颜/i,
133
+ promptPattern: /free\s*beauty|美颜面板|基础美颜|beauty/i,
134
+ },
135
+ ];
136
+ function detectRoomFeatureHits(prompt) {
137
+ return ROOM_FEATURE_SPECS.filter((spec) => spec.promptPattern.test(prompt));
138
+ }
139
+ const LIVE_LIFECYCLE_PROMPT = /开播|创建直播|结束直播|停播|观看直播|退出直播|进房|离房|createLive|endLive|joinLive|leaveLive|host_streaming|audience_streaming/i;
140
+ const LIVE_LIFECYCLE_APIS = ['createLive', 'endLive', 'joinLive', 'leaveLive'];
97
141
  export function runExactLookup(prompt, pool, norm) {
98
142
  const boosts = {};
99
143
  const exactHits = [];
@@ -103,6 +147,9 @@ export function runExactLookup(prompt, pool, norm) {
103
147
  if (!exactHits.includes(label))
104
148
  exactHits.push(label);
105
149
  };
150
+ const addPenalty = (chunk, amount) => {
151
+ boosts[chunk.id] = (boosts[chunk.id] ?? 0) - Math.abs(amount);
152
+ };
106
153
  // E1: error codes
107
154
  const errorMatches = [
108
155
  ...prompt.matchAll(/\b(\d{5,7})\b/g),
@@ -326,5 +373,124 @@ export function runExactLookup(prompt, pool, norm) {
326
373
  addBoost(chunk, 120, `E8:integration-doc:${chunk.source}`);
327
374
  }
328
375
  }
376
+ // E9: chat faq——types=faq 时优先 knowledge 语料,避免 integration 文档内 FAQ 章节抢首位
377
+ if (norm.searchIntent?.includes('faq') && norm.product?.includes('chat')) {
378
+ const authPrompt = /auth|login|signature|usersig|鉴权|登录/i.test(prompt);
379
+ for (const chunk of pool) {
380
+ if (chunk.source.startsWith('knowledge/chat/')) {
381
+ const urlBoost = authPrompt && chunk.source.includes('/urls/') ? 180 : 100;
382
+ addBoost(chunk, urlBoost, 'E9:chat-faq:knowledge');
383
+ }
384
+ if (chunk.source.startsWith('integration/chat/')) {
385
+ addBoost(chunk, -120, 'E9:chat-faq:penalize-integration');
386
+ }
387
+ }
388
+ }
389
+ // E11: LiveKit 生命周期意图强召回(开播/停播/观看/退出)
390
+ if (norm.product?.includes('live') && LIVE_LIFECYCLE_PROMPT.test(prompt)) {
391
+ const queryApiHits = LIVE_LIFECYCLE_APIS.filter((api) => new RegExp(api, 'i').test(prompt));
392
+ for (const chunk of pool) {
393
+ const isLiveCoreIntegration = chunk.source.startsWith('knowledge/livekit/core-sdk/live/')
394
+ && chunk.source.endsWith('/integration.md');
395
+ const isVoiceCoreIntegration = chunk.source.startsWith('knowledge/livekit/core-sdk/voice/')
396
+ && chunk.source.endsWith('/integration.md');
397
+ if (!isLiveCoreIntegration && !isVoiceCoreIntegration)
398
+ continue;
399
+ if (norm.scenario === 'live' && !isLiveCoreIntegration)
400
+ continue;
401
+ if (norm.scenario === 'voice' && !isVoiceCoreIntegration)
402
+ continue;
403
+ addBoost(chunk, 140, 'E11:live-lifecycle-core-integration');
404
+ for (const api of queryApiHits) {
405
+ if (chunk.api_names?.some((name) => name.toLowerCase() === api.toLowerCase())) {
406
+ addBoost(chunk, 160, `E11:live-lifecycle-api:${api}`);
407
+ }
408
+ }
409
+ }
410
+ }
411
+ // E10: roomkit Core/Preset 消歧 + unsupported feature 强召回
412
+ if (norm.product?.includes('room') && norm.frameworks?.length) {
413
+ const platform = norm.frameworks.find((fw) => ['android', 'ios', 'flutter', 'vue'].includes(fw));
414
+ const featureHits = detectRoomFeatureHits(prompt);
415
+ const coreIntent = ROOM_CORE_SIGNAL.test(prompt) || !ROOM_PRESET_SIGNAL.test(prompt);
416
+ const presetIntent = ROOM_PRESET_SIGNAL.test(prompt) && !ROOM_CORE_SIGNAL.test(prompt);
417
+ if (platform) {
418
+ const coreScope = `room:core-sdk:${platform}`;
419
+ const presetScope = `room:preset:${platform}`;
420
+ for (const chunk of pool) {
421
+ if (chunk.product !== 'room')
422
+ continue;
423
+ if (chunk.scope === coreScope) {
424
+ addBoost(chunk, 40, `E10:room-core-scope:${platform}`);
425
+ if (platform !== 'vue' && chunk.doc_kind === 'capability_matrix') {
426
+ addBoost(chunk, 120, `E10:room-matrix:${platform}`);
427
+ }
428
+ }
429
+ if (coreIntent && chunk.scope === presetScope) {
430
+ addPenalty(chunk, 120);
431
+ }
432
+ if (presetIntent && chunk.scope === coreScope && chunk.capability_status === 'unsupported') {
433
+ addPenalty(chunk, 180);
434
+ }
435
+ }
436
+ for (const feature of featureHits) {
437
+ for (const chunk of pool) {
438
+ if (chunk.product !== 'room')
439
+ continue;
440
+ if (platform === 'vue' && chunk.scope === coreScope && chunk.source.endsWith(feature.fileName)) {
441
+ addBoost(chunk, 220, `E10:room-vue-feature:${feature.fileName}`);
442
+ }
443
+ if (platform !== 'vue' && chunk.scope === coreScope) {
444
+ if (chunk.source.endsWith('unsupported-features.md') && feature.titlePattern.test(chunk.title)) {
445
+ addBoost(chunk, 280, `E10:room-unsupported:${platform}:${feature.fileName}`);
446
+ }
447
+ if (chunk.doc_kind === 'capability_matrix') {
448
+ addBoost(chunk, 120, `E10:room-matrix:${platform}:${feature.fileName}`);
449
+ }
450
+ }
451
+ }
452
+ }
453
+ }
454
+ }
455
+ // E12: CallKit Vue 混合类型问题消歧(状态机 STATUS 与 Core Store 类型分层召回)
456
+ if (norm.product?.includes('call')) {
457
+ const isStatusIntent = /statuschanged|\bstatus\b|callmediatype|媒体类型|通话状态|状态回调/i.test(prompt);
458
+ const isStoreIntent = /callstatus|callrole|iuserinfo|storename\.?call|store|name\s*常量|枚举值|字段定义/i.test(prompt);
459
+ const isEngineInvitationIntent = /tuicallengine|on_call_received|call\s*invitation|incoming\s*call|accept\(|reject\(|inviteid|userData|邀请|来电|接听|拒接|信令/i.test(prompt);
460
+ const isCallkitDiffIntent = /\bcall\s*vs\s*calls\b|\bcalls?\b|groupcall|tuicallkitapi\.calls|tuicallkitserver\.call|tuicallkitserver\.groupcall|\bv4(\.x)?\b|useridlist|chatgroupid|发起(单人|多人)?通话|呼叫|拨打/i.test(prompt);
461
+ const isLogIntent = /setloglevel|log\s*level|disable\s*log|console\s*log|日志级别|关闭\s*log/i.test(prompt);
462
+ for (const chunk of pool) {
463
+ if (chunk.product !== 'call')
464
+ continue;
465
+ const source = chunk.source.toLowerCase();
466
+ if (isStatusIntent && source.includes('knowledge/callkit/preset/vue/uikit-api-reference.md')) {
467
+ addBoost(chunk, 180, 'E12:callkit-vue-status');
468
+ }
469
+ if (isStoreIntent && source.includes('knowledge/callkit/core-sdk/web/')) {
470
+ addBoost(chunk, 220, 'E12:callkit-core-store');
471
+ }
472
+ if (isStoreIntent && source.includes('knowledge/callkit/preset/vue/')) {
473
+ addPenalty(chunk, 80);
474
+ }
475
+ if (isEngineInvitationIntent && source.includes('knowledge/callkit/best-practice/web/callengine-invitation.md')) {
476
+ addBoost(chunk, 300, 'E13A:callengine-invitation');
477
+ }
478
+ if (isEngineInvitationIntent && source.includes('knowledge/callkit/best-practice/web/callkit-call-vs-calls.md')) {
479
+ addPenalty(chunk, 80);
480
+ }
481
+ if (isCallkitDiffIntent && source.includes('knowledge/callkit/best-practice/web/callkit-call-vs-calls.md')) {
482
+ addBoost(chunk, 300, 'E13B:callkit-call-vs-calls');
483
+ }
484
+ if (isCallkitDiffIntent && source.includes('knowledge/callkit/best-practice/web/callengine-invitation.md')) {
485
+ addPenalty(chunk, 80);
486
+ }
487
+ if (isCallkitDiffIntent && source.includes('knowledge/callkit/preset/vue/uikit-api-reference.md')) {
488
+ addPenalty(chunk, 40);
489
+ }
490
+ if (isLogIntent && source.includes('knowledge/callkit/best-practice/web/callengine-log-control.md')) {
491
+ addBoost(chunk, 260, 'E13:callengine-log-control');
492
+ }
493
+ }
494
+ }
329
495
  return { boosts, exactHits };
330
496
  }