@tencent-rtc/mcp 1.4.7 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (553) hide show
  1. package/cursor-setting.png +0 -0
  2. package/index.js +0 -1
  3. package/knowledge/bm25-cache.js +73 -0
  4. package/knowledge/bm25.js +147 -0
  5. package/knowledge/build-index.js +69 -0
  6. package/knowledge/chunker.js +167 -0
  7. package/knowledge/content-loader.js +39 -0
  8. package/knowledge/doc-url-resolver.js +142 -0
  9. package/knowledge/extractors.js +25 -0
  10. package/knowledge/path-meta.js +184 -0
  11. package/knowledge/search/exact-lookup.js +497 -0
  12. package/knowledge/search/filter-pool.js +104 -0
  13. package/knowledge/search/product-scope-intent.js +40 -0
  14. package/knowledge/search/requires-framework.js +81 -0
  15. package/knowledge/search/search-knowledge.js +229 -0
  16. package/mcp-server-prompt.png +0 -0
  17. package/package.json +1 -1
  18. package/resource/_schema/feature-aliases.yaml +10 -0
  19. package/resource/_schema/goal-tags.yaml +72 -0
  20. package/resource/_schema/products.yaml +19 -0
  21. package/resource/_schema/trtc-intents.yaml +27 -0
  22. package/resource/_schema/types.yaml +43 -0
  23. package/resource/index/component-slugs.json +1 -0
  24. package/resource/index/doc-source-urls.json +1 -0
  25. package/resource/index/manifest.json +1 -0
  26. package/resource/{doc → integration}/callkit/preset/android/integration.md +34 -28
  27. package/resource/integration/callkit/preset/flutter/integration.md +346 -0
  28. package/resource/integration/callkit/preset/ios/integration.md +408 -0
  29. package/resource/integration/callkit/preset/react/integration.md +362 -0
  30. package/resource/integration/callkit/preset/vue/integration.md +356 -0
  31. package/resource/integration/chat/preset/android/integration.md +500 -0
  32. package/resource/integration/chat/preset/flutter/integration.md +370 -0
  33. package/resource/integration/chat/preset/ios/integration.md +566 -0
  34. package/resource/integration/chat/preset/react/integration.md +490 -0
  35. package/resource/integration/chat/preset/vue/integration.md +504 -0
  36. package/resource/{doc → integration}/livekit/preset/live/vue/live-list-integration.md +26 -22
  37. package/resource/{doc → integration}/livekit/preset/live/vue/live-player-desk-integration.md +22 -18
  38. package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +309 -0
  39. package/resource/{doc → integration}/livekit/preset/live/vue/live-pusher-integration.md +47 -39
  40. package/resource/integration/roomkit/preset/vue/integration.md +562 -0
  41. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +828 -0
  42. package/resource/knowledge/callkit/core-sdk/android/make-call.md +897 -0
  43. package/resource/knowledge/callkit/core-sdk/android/offline-push.md +363 -0
  44. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +1111 -0
  45. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +1132 -0
  46. package/resource/{doc → knowledge}/callkit/core-sdk/flutter/offline-push.md +174 -151
  47. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +1084 -0
  48. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +1252 -0
  49. package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +534 -0
  50. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +953 -0
  51. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +1061 -0
  52. package/resource/knowledge/callkit/faq/android.md +92 -0
  53. package/resource/{doc/callkit/faq/android-faq.md → knowledge/callkit/faq/common.md} +11 -12
  54. package/resource/knowledge/callkit/faq/error-code.md +67 -0
  55. package/resource/knowledge/callkit/faq/flutter.md +52 -0
  56. package/resource/knowledge/callkit/faq/ios.md +104 -0
  57. package/resource/knowledge/callkit/faq/web.md +74 -0
  58. package/resource/knowledge/callkit/preset/android/api.md +412 -0
  59. package/resource/knowledge/callkit/preset/flutter/api.md +22 -0
  60. package/resource/knowledge/callkit/preset/ios/api.md +234 -0
  61. package/resource/knowledge/callkit/preset/web/api.md +83 -0
  62. package/resource/knowledge/chat/preset/android/features/chat-setting.md +74 -0
  63. package/resource/knowledge/chat/preset/android/features/contact-list.md +43 -0
  64. package/resource/knowledge/chat/preset/android/features/conversation-list.md +117 -0
  65. package/resource/knowledge/chat/preset/android/features/language.md +136 -0
  66. package/resource/knowledge/chat/preset/android/features/message-input.md +57 -0
  67. package/resource/knowledge/chat/preset/android/features/message-list.md +142 -0
  68. package/resource/knowledge/chat/preset/android/features/search.md +64 -0
  69. package/resource/knowledge/chat/preset/android/features/theme.md +222 -0
  70. package/resource/knowledge/chat/preset/android-view/integration.md +300 -0
  71. package/resource/knowledge/chat/preset/flutter/features/chat-setting.md +64 -0
  72. package/resource/knowledge/chat/preset/flutter/features/contact-list.md +40 -0
  73. package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +129 -0
  74. package/resource/knowledge/chat/preset/flutter/features/language.md +104 -0
  75. package/resource/knowledge/chat/preset/flutter/features/message-input.md +54 -0
  76. package/resource/knowledge/chat/preset/flutter/features/message-list.md +158 -0
  77. package/resource/knowledge/chat/preset/flutter/features/search.md +59 -0
  78. package/resource/knowledge/chat/preset/flutter/features/theme.md +261 -0
  79. package/resource/knowledge/chat/preset/ios/features/chat-setting.md +94 -0
  80. package/resource/knowledge/chat/preset/ios/features/contact-list.md +119 -0
  81. package/resource/knowledge/chat/preset/ios/features/conversation-list.md +134 -0
  82. package/resource/knowledge/chat/preset/ios/features/language.md +125 -0
  83. package/resource/knowledge/chat/preset/ios/features/message-input.md +69 -0
  84. package/resource/knowledge/chat/preset/ios/features/message-list.md +162 -0
  85. package/resource/knowledge/chat/preset/ios/features/search.md +93 -0
  86. package/resource/knowledge/chat/preset/ios/features/theme.md +270 -0
  87. package/resource/{doc/chatkit/ios → knowledge/chat/preset/ios-uikit}/integration.md +160 -158
  88. package/resource/knowledge/chat/preset/react/features/chat-setting.md +101 -0
  89. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/contact-list.md +43 -41
  90. package/resource/knowledge/chat/preset/react/features/conversation-actions.md +215 -0
  91. package/resource/knowledge/chat/preset/react/features/conversation-list.md +339 -0
  92. package/resource/knowledge/chat/preset/react/features/conversation-preview.md +101 -0
  93. package/resource/knowledge/chat/preset/react/features/conversation-search.md +61 -0
  94. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/message-input.md +117 -156
  95. package/resource/knowledge/chat/preset/react/features/message-list.md +297 -0
  96. package/resource/{doc/chatkit/react/components → knowledge/chat/preset/react/features}/search.md +65 -59
  97. package/resource/knowledge/chat/preset/react/features/theme.md +93 -0
  98. package/resource/knowledge/chat/preset/vue/features/chat-header.md +331 -0
  99. package/resource/knowledge/chat/preset/vue/features/chat-setting.md +79 -0
  100. package/resource/knowledge/chat/preset/vue/features/contact-list.md +277 -0
  101. package/resource/knowledge/chat/preset/vue/features/conversation-actions.md +234 -0
  102. package/resource/knowledge/chat/preset/vue/features/conversation-list.md +331 -0
  103. package/resource/knowledge/chat/preset/vue/features/conversation-preview.md +216 -0
  104. package/resource/{doc/chatkit/vue/components → knowledge/chat/preset/vue/features}/conversation-search.md +13 -13
  105. package/resource/knowledge/chat/preset/vue/features/message-input.md +551 -0
  106. package/resource/knowledge/chat/preset/vue/features/message-list.md +350 -0
  107. package/resource/{doc/chatkit/vue/components → knowledge/chat/preset/vue/features}/search.md +79 -73
  108. package/resource/knowledge/chat/preset/vue/features/theme.md +136 -0
  109. package/resource/knowledge/chat/urls/error-code.md +17 -0
  110. package/resource/knowledge/chat/urls/product.md +43 -0
  111. package/resource/knowledge/chat/urls/restapi.md +204 -0
  112. package/resource/knowledge/chat/urls/sdk/android.md +80 -0
  113. package/resource/knowledge/chat/urls/sdk/flutter.md +71 -0
  114. package/resource/knowledge/chat/urls/sdk/ios.md +80 -0
  115. package/resource/knowledge/chat/urls/sdk/web.md +80 -0
  116. package/resource/knowledge/chat/urls/webhook.md +68 -0
  117. package/resource/knowledge/livekit/core-sdk/api-reference/android/AudioEffectStore.md +286 -0
  118. package/resource/knowledge/livekit/core-sdk/api-reference/android/BarrageStore.md +174 -0
  119. package/resource/knowledge/livekit/core-sdk/api-reference/android/BattleStore.md +329 -0
  120. package/resource/knowledge/livekit/core-sdk/api-reference/android/CameraView.md +55 -0
  121. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoGuestStore.md +434 -0
  122. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoHostStore.md +362 -0
  123. package/resource/knowledge/livekit/core-sdk/api-reference/android/DeviceStore.md +466 -0
  124. package/resource/knowledge/livekit/core-sdk/api-reference/android/GiftStore.md +173 -0
  125. package/resource/knowledge/livekit/core-sdk/api-reference/android/LikeStore.md +51 -0
  126. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveAudienceStore.md +291 -0
  127. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveCoreView.md +78 -0
  128. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveSeatStore.md +488 -0
  129. package/resource/knowledge/livekit/core-sdk/api-reference/android/LoginStore.md +219 -0
  130. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/AudioEffectStore.md +282 -0
  131. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BarrageStore.md +212 -0
  132. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BaseBeautyStore.md +153 -0
  133. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BattleStore.md +312 -0
  134. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoGuestStore.md +404 -0
  135. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoHostStore.md +334 -0
  136. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/DeviceStore.md +426 -0
  137. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/GiftStore.md +166 -0
  138. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LikeStore.md +52 -0
  139. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveAudienceStore.md +281 -0
  140. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveCoreView.md +150 -0
  141. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveSeatStore.md +438 -0
  142. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LoginStore.md +190 -0
  143. package/resource/knowledge/livekit/core-sdk/api-reference/ios/AudioEffectStore.md +291 -0
  144. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BarrageStore.md +192 -0
  145. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BaseBeautyStore.md +146 -0
  146. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BattleStore.md +309 -0
  147. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoGuestStore.md +370 -0
  148. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoHostStore.md +339 -0
  149. package/resource/knowledge/livekit/core-sdk/api-reference/ios/DeviceStore.md +503 -0
  150. package/resource/knowledge/livekit/core-sdk/api-reference/ios/GiftStore.md +188 -0
  151. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LikeStore.md +51 -0
  152. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveAudienceStore.md +289 -0
  153. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveCoreView.md +78 -0
  154. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveSeatStore.md +487 -0
  155. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LoginStore.md +183 -0
  156. package/resource/knowledge/livekit/core-sdk/api-reference/web/index.md +736 -0
  157. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-audience-list.md +53 -47
  158. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-audio-effect.md +28 -24
  159. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-barrage.md +22 -18
  160. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-base-beauty.md +17 -15
  161. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-co-guest-interaction.md +19 -18
  162. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-gift.md +102 -89
  163. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-host-interaction.md +41 -37
  164. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-integration.md +45 -43
  165. package/resource/{doc → knowledge}/livekit/core-sdk/live/android/live-live-list.md +23 -20
  166. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-audience-list.md +41 -41
  167. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-audio-effect.md +70 -69
  168. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-barrage.md +68 -71
  169. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-base-beauty.md +43 -47
  170. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-co-guest-interaction.md +59 -56
  171. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-gift.md +103 -105
  172. package/resource/knowledge/livekit/core-sdk/live/flutter/live-host-interaction.md +869 -0
  173. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-integration.md +84 -87
  174. package/resource/{doc → knowledge}/livekit/core-sdk/live/flutter/live-live-list.md +43 -40
  175. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-audience-list.md +11 -10
  176. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-audio-effect.md +28 -24
  177. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-barrage.md +22 -18
  178. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-base-beauty.md +15 -14
  179. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-co-guest-interaction.md +19 -18
  180. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-gift.md +54 -50
  181. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-host-interaction.md +41 -37
  182. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-integration.md +40 -40
  183. package/resource/{doc → knowledge}/livekit/core-sdk/live/ios/live-live-list.md +19 -18
  184. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-audience-list.md +53 -47
  185. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-audio-effect.md +28 -24
  186. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-barrage.md +22 -18
  187. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-co-guest-interaction.md +41 -33
  188. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-gift.md +94 -81
  189. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-host-interaction.md +35 -30
  190. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-integration.md +45 -42
  191. package/resource/{doc → knowledge}/livekit/core-sdk/voice/android/voice-room-list.md +23 -20
  192. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audience-list.md +260 -0
  193. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audio-effect.md +598 -0
  194. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-barrage.md +490 -0
  195. package/resource/{doc → knowledge}/livekit/core-sdk/voice/flutter/voice-co-guest-interaction.md +65 -59
  196. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-gift.md +424 -0
  197. package/resource/{doc → knowledge}/livekit/core-sdk/voice/flutter/voice-integration.md +69 -76
  198. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-room-list.md +726 -0
  199. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-audience-list.md +11 -10
  200. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-audio-effect.md +28 -24
  201. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-barrage.md +22 -18
  202. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-co-guest-interaction.md +41 -33
  203. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-gift.md +54 -50
  204. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-host-interaction.md +35 -30
  205. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-integration.md +49 -46
  206. package/resource/{doc → knowledge}/livekit/core-sdk/voice/ios/voice-room-list.md +19 -18
  207. package/resource/knowledge/livekit/faq/error-code.md +193 -0
  208. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/barrage.md +56 -53
  209. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/live-audience-list.md +22 -21
  210. package/resource/{doc/livekit/preset/live/vue/components → knowledge/livekit/preset/live/vue/features}/live-view.md +34 -32
  211. package/resource/knowledge/push/config/android.md +92 -0
  212. package/resource/knowledge/push/config/harmonyos.md +83 -0
  213. package/resource/knowledge/push/config/ios.md +254 -0
  214. package/resource/knowledge/push/config/react-native.md +254 -0
  215. package/resource/knowledge/push/config/unity.md +209 -0
  216. package/resource/knowledge/push/config/unreal-engine.md +194 -0
  217. package/resource/knowledge/push/integration/android.md +404 -0
  218. package/resource/knowledge/push/integration/flutter.md +465 -0
  219. package/resource/knowledge/push/integration/harmonyos.md +63 -0
  220. package/resource/knowledge/push/integration/ios.md +246 -0
  221. package/resource/knowledge/push/integration/react-native.md +366 -0
  222. package/resource/knowledge/push/integration/uni-app.md +208 -0
  223. package/resource/knowledge/push/integration/unity.md +389 -0
  224. package/resource/knowledge/push/integration/unreal-engine.md +390 -0
  225. package/resource/knowledge/push/overview/prepare.md +60 -0
  226. package/resource/knowledge/roomkit/core-sdk/android/call-user-to-room.md +241 -0
  227. package/resource/knowledge/roomkit/core-sdk/android/room-participant-state.md +588 -0
  228. package/resource/knowledge/roomkit/core-sdk/android/room-state.md +364 -0
  229. package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +340 -0
  230. package/resource/knowledge/roomkit/core-sdk/flutter/call-user-to-room.md +230 -0
  231. package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +797 -0
  232. package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +325 -0
  233. package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +325 -0
  234. package/resource/knowledge/roomkit/core-sdk/ios/call-user-to-room.md +233 -0
  235. package/resource/knowledge/roomkit/core-sdk/ios/room-participant-state.md +569 -0
  236. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +325 -0
  237. package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +322 -0
  238. package/resource/knowledge/roomkit/core-sdk/vue/call-user-to-room.md +221 -0
  239. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/device-detection.md +49 -48
  240. package/resource/knowledge/roomkit/core-sdk/vue/device-state.md +461 -0
  241. package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +216 -0
  242. package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +370 -0
  243. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/room-participant-state.md +61 -60
  244. package/resource/knowledge/roomkit/core-sdk/vue/room-state.md +280 -0
  245. package/resource/{doc/roomkit/vue/features → knowledge/roomkit/core-sdk/vue}/room-view.md +57 -56
  246. package/resource/knowledge/roomkit/core-sdk/vue/schedule-room.md +319 -0
  247. package/resource/knowledge/roomkit/core-sdk/vue/screen-share.md +267 -0
  248. package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +261 -0
  249. package/resource/knowledge/roomkit/preset/android/integration.md +396 -0
  250. package/resource/knowledge/roomkit/preset/flutter/integration.md +404 -0
  251. package/resource/knowledge/roomkit/preset/ios/integration.md +369 -0
  252. package/resource/knowledge/roomkit/preset/react/integration.md +576 -0
  253. package/resource/knowledge/rtcengine/web/how_to_run_web_sdk_demo.md +44 -0
  254. package/resource/{doc → knowledge}/rtcengine/web/plugin/21-advanced-auto-play-policy.md +8 -2
  255. package/resource/{doc → knowledge}/rtcengine/web/plugin/22-advanced-audio-mixer.md +19 -1
  256. package/resource/{doc → knowledge}/rtcengine/web/plugin/23-advanced-support-detection.md +1 -1
  257. package/resource/{doc → knowledge}/rtcengine/web/plugin/24-advanced-network-quality.md +8 -8
  258. package/resource/{doc → knowledge}/rtcengine/web/plugin/25-advanced-device-change.md +1 -1
  259. package/resource/{doc → knowledge}/rtcengine/web/plugin/26-advanced-publish-cdn-stream.md +6 -6
  260. package/resource/{doc → knowledge}/rtcengine/web/plugin/27-advanced-small-stream.md +3 -3
  261. package/resource/{doc → knowledge}/rtcengine/web/plugin/29-advanced-water-mark.md +18 -0
  262. package/resource/{doc → knowledge}/rtcengine/web/plugin/31-advanced-plugins-overview.md +1 -1
  263. package/resource/{doc → knowledge}/rtcengine/web/plugin/34-advanced-proxy.md +2 -2
  264. package/resource/{doc → knowledge}/rtcengine/web/plugin/35-advanced-ai-denoiser.md +1 -1
  265. package/resource/knowledge/trtc/android/TRTCCloud.md +1915 -0
  266. package/resource/knowledge/trtc/android/TRTCCloudDef.md +1029 -0
  267. package/resource/knowledge/trtc/android/TRTCCloudListener.md +1095 -0
  268. package/resource/knowledge/trtc/android/TRTCStatistics.md +68 -0
  269. package/resource/knowledge/trtc/android/TXAudioEffectManager.md +502 -0
  270. package/resource/knowledge/trtc/android/TXBeautyManager.md +415 -0
  271. package/resource/knowledge/trtc/android/TXDeviceManager.md +169 -0
  272. package/resource/knowledge/trtc/android/TXLiteAVCode.md +125 -0
  273. package/resource/knowledge/trtc/c++/ITRTCCloud.md +2069 -0
  274. package/resource/knowledge/trtc/c++/ITRTCStatistics.md +73 -0
  275. package/resource/knowledge/trtc/c++/ITXAudioEffectManager.md +502 -0
  276. package/resource/knowledge/trtc/c++/ITXDeviceManager.md +391 -0
  277. package/resource/knowledge/trtc/c++/TRTCCloudCallback.md +1191 -0
  278. package/resource/knowledge/trtc/c++/TRTCTypeDef.md +931 -0
  279. package/resource/knowledge/trtc/c++/TXLiteAVCode.md +127 -0
  280. package/resource/knowledge/trtc/ios/TRTCCloud.md +2118 -0
  281. package/resource/knowledge/trtc/ios/TRTCCloudDef.md +975 -0
  282. package/resource/knowledge/trtc/ios/TRTCCloudDelegate.md +1131 -0
  283. package/resource/knowledge/trtc/ios/TRTCStatistics.md +68 -0
  284. package/resource/knowledge/trtc/ios/TXAudioEffectManager.md +423 -0
  285. package/resource/knowledge/trtc/ios/TXBeautyManager.md +416 -0
  286. package/resource/knowledge/trtc/ios/TXDeviceManager.md +387 -0
  287. package/resource/knowledge/trtc/ios/TXLiteAVCode.md +127 -0
  288. package/server-config.js +0 -1
  289. package/server.js +35 -12
  290. package/streamable-http.js +0 -1
  291. package/tools/call/get_native_call_uikit_integration.js +2 -4
  292. package/tools/call/get_native_callkit_core_integration.js +2 -6
  293. package/tools/call/get_web_call_uikit_integration.js +2 -4
  294. package/tools/chat/get_native_chat_uikit_integration.js +2 -4
  295. package/tools/chat/get_web_chat_uikit_integration.js +2 -4
  296. package/tools/common/get_usersig.js +0 -1
  297. package/tools/common/present_framework_choice.js +19 -14
  298. package/tools/common/record_answer.js +19 -26
  299. package/tools/common/record_feedback.js +17 -31
  300. package/tools/common/search_trtc_knowledge.js +44 -0
  301. package/tools/definitions/get_native_call_uikit_integration_def.js +3 -2
  302. package/tools/definitions/get_native_callkit_core_integration_def.js +5 -4
  303. package/tools/definitions/get_native_chat_uikit_integration_def.js +5 -3
  304. package/tools/definitions/get_native_livekit_core_integration_def.js +6 -6
  305. package/tools/definitions/get_usersig_def.js +0 -1
  306. package/tools/definitions/get_web_call_uikit_integration_def.js +4 -3
  307. package/tools/definitions/get_web_chat_uikit_integration_def.js +2 -1
  308. package/tools/definitions/get_web_live_uikit_integration_def.js +5 -6
  309. package/tools/definitions/get_web_room_core_integration_def.js +49 -0
  310. package/tools/definitions/get_web_room_uikit_integration_def.js +5 -5
  311. package/tools/definitions/integration-boundary.js +5 -0
  312. package/tools/definitions/present_framework_choice_def.js +12 -11
  313. package/tools/definitions/record_answer_def.js +19 -18
  314. package/tools/definitions/record_feedback_def.js +14 -14
  315. package/tools/definitions/search_trtc_knowledge_def.js +39 -0
  316. package/tools/index.js +5 -37
  317. package/tools/live/get_native_livekit_core_integration.js +1 -4
  318. package/tools/live/get_web_live_uikit_integration.js +2 -5
  319. package/tools/room/get_web_room_core_integration.js +47 -0
  320. package/tools/room/get_web_room_uikit_integration.js +2 -4
  321. package/utils/generate-structured-result.js +24 -31
  322. package/utils/generate-usersig.js +0 -1
  323. package/utils/get-device-identifier.js +0 -1
  324. package/utils/get-doc-content.js +14 -9
  325. package/utils/http-get.js +0 -1
  326. package/utils/http-post.js +0 -1
  327. package/utils/report-cls-client.js +18 -21
  328. package/utils/report-es-client.js +1 -2
  329. package/index.js.map +0 -1
  330. package/resource/doc/callkit/core-sdk/.gitkeep +0 -0
  331. package/resource/doc/callkit/core-sdk/android/answer-call.md +0 -852
  332. package/resource/doc/callkit/core-sdk/android/make-call.md +0 -954
  333. package/resource/doc/callkit/core-sdk/android/offline-push.md +0 -361
  334. package/resource/doc/callkit/core-sdk/flutter/answer-call.md +0 -1160
  335. package/resource/doc/callkit/core-sdk/flutter/make-call.md +0 -1205
  336. package/resource/doc/callkit/core-sdk/ios/answer-call.md +0 -1090
  337. package/resource/doc/callkit/core-sdk/ios/make-call.md +0 -1248
  338. package/resource/doc/callkit/core-sdk/ios/offline-push.md +0 -485
  339. package/resource/doc/callkit/core-sdk/uni-app/answer-call.md +0 -950
  340. package/resource/doc/callkit/core-sdk/uni-app/make-call.md +0 -1052
  341. package/resource/doc/callkit/faq/common/error-code.md +0 -47
  342. package/resource/doc/callkit/faq/flutter-faq.md +0 -115
  343. package/resource/doc/callkit/faq/ios-faq.md +0 -115
  344. package/resource/doc/callkit/faq/web-faq.md +0 -36
  345. package/resource/doc/callkit/preset/android/api.md +0 -296
  346. package/resource/doc/callkit/preset/flutter/api.md +0 -410
  347. package/resource/doc/callkit/preset/flutter/integration.md +0 -164
  348. package/resource/doc/callkit/preset/ios/api.md +0 -80
  349. package/resource/doc/callkit/preset/ios/integration.md +0 -187
  350. package/resource/doc/callkit/preset/react/api.md +0 -501
  351. package/resource/doc/callkit/preset/react/integration.md +0 -86
  352. package/resource/doc/callkit/preset/vue/api.md +0 -501
  353. package/resource/doc/callkit/preset/vue/integration.md +0 -83
  354. package/resource/doc/chatkit/android/faq.md +0 -111
  355. package/resource/doc/chatkit/android/features/theme.md +0 -219
  356. package/resource/doc/chatkit/android/integration.md +0 -490
  357. package/resource/doc/chatkit/faq/android_sdk/client-api.md +0 -281
  358. package/resource/doc/chatkit/faq/common/product.md +0 -7
  359. package/resource/doc/chatkit/faq/common/server.md +0 -44
  360. package/resource/doc/chatkit/faq/common/server_error_code.md +0 -74
  361. package/resource/doc/chatkit/faq/flutter_sdk/client-api.md +0 -199
  362. package/resource/doc/chatkit/faq/flutter_sdk/faq.md +0 -53
  363. package/resource/doc/chatkit/faq/ios_sdk/client-api.md +0 -235
  364. package/resource/doc/chatkit/faq/web_sdk/error_code.md +0 -47
  365. package/resource/doc/chatkit/faq/web_sdk/faq.md +0 -287
  366. package/resource/doc/chatkit/flutter/faq.md +0 -23
  367. package/resource/doc/chatkit/flutter/features/theme.md +0 -235
  368. package/resource/doc/chatkit/flutter/integration.md +0 -344
  369. package/resource/doc/chatkit/ios/faq.md +0 -111
  370. package/resource/doc/chatkit/ios/features/theme.md +0 -267
  371. package/resource/doc/chatkit/react/components/avatar.md +0 -104
  372. package/resource/doc/chatkit/react/components/chat-header.md +0 -148
  373. package/resource/doc/chatkit/react/components/chat-setting.md +0 -57
  374. package/resource/doc/chatkit/react/components/chat.md +0 -38
  375. package/resource/doc/chatkit/react/components/component-list.md +0 -37
  376. package/resource/doc/chatkit/react/components/conversation-actions.md +0 -174
  377. package/resource/doc/chatkit/react/components/conversation-list.md +0 -333
  378. package/resource/doc/chatkit/react/components/conversation-preview.md +0 -118
  379. package/resource/doc/chatkit/react/components/conversation-search.md +0 -60
  380. package/resource/doc/chatkit/react/components/message-list.md +0 -293
  381. package/resource/doc/chatkit/react/components/tuikit.md +0 -34
  382. package/resource/doc/chatkit/react/faq.md +0 -26
  383. package/resource/doc/chatkit/react/integration.md +0 -416
  384. package/resource/doc/chatkit/vue/components/avatar.md +0 -104
  385. package/resource/doc/chatkit/vue/components/chat-header.md +0 -148
  386. package/resource/doc/chatkit/vue/components/chat-setting.md +0 -62
  387. package/resource/doc/chatkit/vue/components/chat.md +0 -45
  388. package/resource/doc/chatkit/vue/components/component-list.md +0 -87
  389. package/resource/doc/chatkit/vue/components/contact-list.md +0 -271
  390. package/resource/doc/chatkit/vue/components/conversation-actions.md +0 -228
  391. package/resource/doc/chatkit/vue/components/conversation-list.md +0 -320
  392. package/resource/doc/chatkit/vue/components/conversation-preview.md +0 -213
  393. package/resource/doc/chatkit/vue/components/message-input.md +0 -1054
  394. package/resource/doc/chatkit/vue/components/message-list.md +0 -433
  395. package/resource/doc/chatkit/vue/components/tuikit.md +0 -31
  396. package/resource/doc/chatkit/vue/components/userpicker.md +0 -256
  397. package/resource/doc/chatkit/vue/faq.md +0 -36
  398. package/resource/doc/chatkit/vue/integration.md +0 -428
  399. package/resource/doc/livekit/core-sdk/live/flutter/live-host-interaction.md +0 -866
  400. package/resource/doc/livekit/faq/common/error-code.md +0 -88
  401. package/resource/doc/livekit/preset/live/vue/api-reference/index.md +0 -780
  402. package/resource/doc/livekit/preset/live/vue/components/co-guest-panel.md +0 -91
  403. package/resource/doc/livekit/preset/live/vue/components/live-scene-panel.md +0 -112
  404. package/resource/doc/livekit/preset/live/vue/components/stream-mixer.md +0 -215
  405. package/resource/doc/livekit/preset/live/vue/live-player-h5-integration.md +0 -300
  406. package/resource/doc/roomkit/faq/common/error-code.md +0 -67
  407. package/resource/doc/roomkit/vue/features/call-user-to-room.md +0 -220
  408. package/resource/doc/roomkit/vue/features/device-state.md +0 -460
  409. package/resource/doc/roomkit/vue/features/free-beauty-panel.md +0 -215
  410. package/resource/doc/roomkit/vue/features/room-chat.md +0 -369
  411. package/resource/doc/roomkit/vue/features/room-state.md +0 -282
  412. package/resource/doc/roomkit/vue/features/schedule-room.md +0 -318
  413. package/resource/doc/roomkit/vue/features/screen-share.md +0 -265
  414. package/resource/doc/roomkit/vue/features/virtual-background.md +0 -271
  415. package/resource/doc/roomkit/vue/integration.md +0 -315
  416. package/resource/doc/rtcengine/faq/common/error_code.md +0 -1
  417. package/resource/doc/rtcengine/faq/web_sdk/.gitkeep +0 -0
  418. package/resource/doc/rtcengine/web/.gitkeep +0 -0
  419. package/resource/doc/rtcengine/web/how_to_run_web_sdk_demo.md +0 -59
  420. package/resource/doc/trtc/C++/ITRTCCloud.md +0 -1970
  421. package/resource/doc/trtc/C++/ITRTCStatistics.md +0 -70
  422. package/resource/doc/trtc/C++/ITXAudioEffectManager.md +0 -469
  423. package/resource/doc/trtc/C++/ITXDeviceManager.md +0 -387
  424. package/resource/doc/trtc/C++/TRTCCloudCallback.md +0 -1082
  425. package/resource/doc/trtc/C++/TRTCTypeDef.md +0 -925
  426. package/resource/doc/trtc/C++/TXLiteAVCode.md +0 -129
  427. package/resource/doc/trtc/android/TRTCCloud.md +0 -1815
  428. package/resource/doc/trtc/android/TRTCCloudDef.md +0 -992
  429. package/resource/doc/trtc/android/TRTCCloudListener.md +0 -1004
  430. package/resource/doc/trtc/android/TRTCStatistics.md +0 -65
  431. package/resource/doc/trtc/android/TXAudioEffectManager.md +0 -469
  432. package/resource/doc/trtc/android/TXBeautyManager.md +0 -402
  433. package/resource/doc/trtc/android/TXDeviceManager.md +0 -173
  434. package/resource/doc/trtc/android/TXLiteAVCode.md +0 -127
  435. package/resource/doc/trtc/iOS/TRTCCloud.md +0 -2028
  436. package/resource/doc/trtc/iOS/TRTCCloudDef.md +0 -958
  437. package/resource/doc/trtc/iOS/TRTCCloudDelegate.md +0 -1046
  438. package/resource/doc/trtc/iOS/TRTCStatistics.md +0 -65
  439. package/resource/doc/trtc/iOS/TXAudioEffectManager.md +0 -397
  440. package/resource/doc/trtc/iOS/TXBeautyManager.md +0 -403
  441. package/resource/doc/trtc/iOS/TXDeviceManager.md +0 -381
  442. package/resource/doc/trtc/iOS/TXLiteAVCode.md +0 -130
  443. package/server-config.js.map +0 -1
  444. package/server.js.map +0 -1
  445. package/streamable-http.js.map +0 -1
  446. package/tools/call/get_callkit_api.js +0 -33
  447. package/tools/call/get_callkit_api.js.map +0 -1
  448. package/tools/call/get_native_call_uikit_integration.js.map +0 -1
  449. package/tools/call/get_native_callkit_core_integration.js.map +0 -1
  450. package/tools/call/get_web_call_uikit_integration.js.map +0 -1
  451. package/tools/chat/get_native_chat_uikit_feature_detail.js +0 -35
  452. package/tools/chat/get_native_chat_uikit_feature_detail.js.map +0 -1
  453. package/tools/chat/get_native_chat_uikit_integration.js.map +0 -1
  454. package/tools/chat/get_web_chat_uikit_component_detail.js +0 -35
  455. package/tools/chat/get_web_chat_uikit_component_detail.js.map +0 -1
  456. package/tools/chat/get_web_chat_uikit_integration.js.map +0 -1
  457. package/tools/common/get_faq.js +0 -266
  458. package/tools/common/get_faq.js.map +0 -1
  459. package/tools/common/get_usersig.js.map +0 -1
  460. package/tools/common/present_framework_choice.js.map +0 -1
  461. package/tools/common/record_answer.js.map +0 -1
  462. package/tools/common/record_feedback.js.map +0 -1
  463. package/tools/common/record_skill_session.js +0 -69
  464. package/tools/common/record_skill_session.js.map +0 -1
  465. package/tools/definitions/get_callkit_api_def.js +0 -29
  466. package/tools/definitions/get_callkit_api_def.js.map +0 -1
  467. package/tools/definitions/get_faq_def.js +0 -47
  468. package/tools/definitions/get_faq_def.js.map +0 -1
  469. package/tools/definitions/get_native_call_uikit_integration_def.js.map +0 -1
  470. package/tools/definitions/get_native_callkit_core_integration_def.js.map +0 -1
  471. package/tools/definitions/get_native_chat_uikit_feature_detail_def.js +0 -31
  472. package/tools/definitions/get_native_chat_uikit_feature_detail_def.js.map +0 -1
  473. package/tools/definitions/get_native_chat_uikit_integration_def.js.map +0 -1
  474. package/tools/definitions/get_native_livekit_core_features_def.js +0 -34
  475. package/tools/definitions/get_native_livekit_core_features_def.js.map +0 -1
  476. package/tools/definitions/get_native_livekit_core_integration_def.js.map +0 -1
  477. package/tools/definitions/get_native_trtc_sdk_docs_def.js +0 -32
  478. package/tools/definitions/get_native_trtc_sdk_docs_def.js.map +0 -1
  479. package/tools/definitions/get_usersig_def.js.map +0 -1
  480. package/tools/definitions/get_web_call_uikit_integration_def.js.map +0 -1
  481. package/tools/definitions/get_web_chat_uikit_component_detail_def.js +0 -31
  482. package/tools/definitions/get_web_chat_uikit_component_detail_def.js.map +0 -1
  483. package/tools/definitions/get_web_chat_uikit_integration_def.js.map +0 -1
  484. package/tools/definitions/get_web_live_uikit_integration_def.js.map +0 -1
  485. package/tools/definitions/get_web_livekit_api_def.js +0 -30
  486. package/tools/definitions/get_web_livekit_api_def.js.map +0 -1
  487. package/tools/definitions/get_web_livekit_component_detail_def.js +0 -32
  488. package/tools/definitions/get_web_livekit_component_detail_def.js.map +0 -1
  489. package/tools/definitions/get_web_room_uikit_integration_def.js.map +0 -1
  490. package/tools/definitions/get_web_roomkit_feature_detail_def.js +0 -31
  491. package/tools/definitions/get_web_roomkit_feature_detail_def.js.map +0 -1
  492. package/tools/definitions/get_web_trtc_sdk_api_def.js +0 -27
  493. package/tools/definitions/get_web_trtc_sdk_api_def.js.map +0 -1
  494. package/tools/definitions/get_web_trtc_sdk_integration_def.js +0 -27
  495. package/tools/definitions/get_web_trtc_sdk_integration_def.js.map +0 -1
  496. package/tools/definitions/get_web_trtc_sdk_plugin_def.js +0 -27
  497. package/tools/definitions/get_web_trtc_sdk_plugin_def.js.map +0 -1
  498. package/tools/definitions/present_framework_choice_def.js.map +0 -1
  499. package/tools/definitions/record_answer_def.js.map +0 -1
  500. package/tools/definitions/record_feedback_def.js.map +0 -1
  501. package/tools/definitions/record_skill_session_def.js +0 -31
  502. package/tools/definitions/record_skill_session_def.js.map +0 -1
  503. package/tools/index.js.map +0 -1
  504. package/tools/live/get_native_livekit_core_features.js +0 -68
  505. package/tools/live/get_native_livekit_core_features.js.map +0 -1
  506. package/tools/live/get_native_livekit_core_integration.js.map +0 -1
  507. package/tools/live/get_web_live_uikit_integration.js.map +0 -1
  508. package/tools/live/get_web_livekit_api.js +0 -33
  509. package/tools/live/get_web_livekit_api.js.map +0 -1
  510. package/tools/live/get_web_livekit_component_detail.js +0 -35
  511. package/tools/live/get_web_livekit_component_detail.js.map +0 -1
  512. package/tools/room/get_web_room_uikit_integration.js.map +0 -1
  513. package/tools/room/get_web_roomkit_feature_detail.js +0 -69
  514. package/tools/room/get_web_roomkit_feature_detail.js.map +0 -1
  515. package/tools/rtcengine/get_web_trtc_sdk_api.js +0 -32
  516. package/tools/rtcengine/get_web_trtc_sdk_api.js.map +0 -1
  517. package/tools/rtcengine/get_web_trtc_sdk_integration.js +0 -32
  518. package/tools/rtcengine/get_web_trtc_sdk_integration.js.map +0 -1
  519. package/tools/rtcengine/get_web_trtc_sdk_plugin.js +0 -32
  520. package/tools/rtcengine/get_web_trtc_sdk_plugin.js.map +0 -1
  521. package/tools/trtc/get_native_trtc_sdk_docs.js +0 -74
  522. package/tools/trtc/get_native_trtc_sdk_docs.js.map +0 -1
  523. package/utils/build-session-directives.js +0 -120
  524. package/utils/build-session-directives.js.map +0 -1
  525. package/utils/generate-structured-result.js.map +0 -1
  526. package/utils/generate-usersig.js.map +0 -1
  527. package/utils/get-device-identifier.js.map +0 -1
  528. package/utils/get-doc-content.js.map +0 -1
  529. package/utils/handle-framework.js +0 -9
  530. package/utils/handle-framework.js.map +0 -1
  531. package/utils/handle-state-name.js +0 -29
  532. package/utils/handle-state-name.js.map +0 -1
  533. package/utils/http-get.js.map +0 -1
  534. package/utils/http-post.js.map +0 -1
  535. package/utils/report-cls-client.js.map +0 -1
  536. package/utils/report-es-client.js.map +0 -1
  537. package/utils/report-runtime-error-cls-client.js +0 -91
  538. package/utils/report-runtime-error-cls-client.js.map +0 -1
  539. /package/resource/{doc/livekit/preset/live/vue/faq.md → knowledge/push/config/donut.md} +0 -0
  540. /package/resource/{doc/roomkit/vue/faq.md → knowledge/push/integration/donut.md} +0 -0
  541. /package/resource/{doc → knowledge}/rtcengine/web/api.md +0 -0
  542. /package/resource/{doc/rtcengine/faq/web/web.md → knowledge/rtcengine/web/faq.md} +0 -0
  543. /package/resource/{doc → knowledge}/rtcengine/web/how_to_integrated_web_sdk.md +0 -0
  544. /package/resource/{doc → knowledge}/rtcengine/web/plugin/20-advanced-customized-capture-rendering.md +0 -0
  545. /package/resource/{doc → knowledge}/rtcengine/web/plugin/28-advanced-beauty.md +0 -0
  546. /package/resource/{doc → knowledge}/rtcengine/web/plugin/30-advanced-cross-room-link.md +0 -0
  547. /package/resource/{doc → knowledge}/rtcengine/web/plugin/36-advanced-virtual-background.md +0 -0
  548. /package/resource/{doc → knowledge}/rtcengine/web/plugin/37-advanced-voice-changer.md +0 -0
  549. /package/resource/{doc → knowledge}/rtcengine/web/plugin/39-advanced-video-decoder.md +0 -0
  550. /package/resource/{doc → knowledge}/rtcengine/web/plugin/40-advanced-video-mixer.md +0 -0
  551. /package/resource/{doc → knowledge}/rtcengine/web/plugin/41-advanced-small-stream-auto-switcher.md +0 -0
  552. /package/resource/{doc → knowledge}/rtcengine/web/plugin/42-advanced-realtime-transcriber.md +0 -0
  553. /package/resource/{doc → knowledge}/rtcengine/web/plugin/43-advanced-face-detection.md +0 -0
Binary file
package/index.js CHANGED
@@ -18,4 +18,3 @@ main().catch((error) => {
18
18
  console.error('Server error:', error);
19
19
  process.exit(1);
20
20
  });
21
- //# sourceMappingURL=index.js.map
@@ -0,0 +1,73 @@
1
+ import { attachPoolContent } from './content-loader.js';
2
+ import { buildBM25Index, chunkSearchText } from './bm25.js';
3
+ /**
4
+ * 按 product 维度 lazy 构建 BM25 索引并进程内缓存。
5
+ *
6
+ * 设计要点:
7
+ * - cache key = product(未指定时用 '*',对全 manifest 建索引)
8
+ * - 索引基于该 product 全部 chunks(含 integration corpus),子集 ranking 只看 filteredPool.map(id)
9
+ * - 首次按 product 触发,后续命中缓存零开销;约 8 个 product 自然分摊冷启动成本
10
+ * - 不落盘,纯进程常驻;体积粗估 8~12MB(postings + idf)
11
+ */
12
+ const indexCache = new Map();
13
+ const GLOBAL_KEY = '*';
14
+ function cacheKey(product) {
15
+ return product ?? GLOBAL_KEY;
16
+ }
17
+ function selectProductChunks(allChunks, product) {
18
+ if (!product)
19
+ return allChunks;
20
+ return allChunks.filter((chunk) => chunk.product === product || chunk.product === '*');
21
+ }
22
+ /**
23
+ * 获取 product 级 BM25 索引:缓存命中则零开销,否则按 product 切 chunks,
24
+ * attachPoolContent 拉正文后一次性建索引并入缓存。
25
+ *
26
+ * 性能特征:
27
+ * - 命中:O(1)
28
+ * - miss:O(P · avgDocLen) 仅一次,P 为该 product 的 chunk 数
29
+ */
30
+ export function getProductBM25Index(allChunks, product) {
31
+ const key = cacheKey(product);
32
+ const cached = indexCache.get(key);
33
+ if (cached)
34
+ return cached;
35
+ const productChunks = selectProductChunks(allChunks, product);
36
+ const withContent = attachPoolContent(productChunks);
37
+ const index = buildBM25Index(withContent.map((chunk) => ({
38
+ id: chunk.id,
39
+ text: chunkSearchText(chunk),
40
+ })));
41
+ indexCache.set(key, index);
42
+ return index;
43
+ }
44
+ /**
45
+ * 多 product BM25 索引:products 数组中有任一未缓存时,
46
+ * 合并所有指定 product 的 chunks 构建索引并缓存(key = 排序 join)。
47
+ */
48
+ export function getProductsBM25Index(allChunks, products) {
49
+ if (!products || products.length === 0)
50
+ return getProductBM25Index(allChunks, undefined);
51
+ if (products.length === 1)
52
+ return getProductBM25Index(allChunks, products[0]);
53
+ const key = [...products].sort().join('|');
54
+ const cached = indexCache.get(key);
55
+ if (cached)
56
+ return cached;
57
+ const productChunks = allChunks.filter((chunk) => products.includes(chunk.product) || chunk.product === '*');
58
+ const withContent = attachPoolContent(productChunks);
59
+ const index = buildBM25Index(withContent.map((chunk) => ({
60
+ id: chunk.id,
61
+ text: chunkSearchText(chunk),
62
+ })));
63
+ indexCache.set(key, index);
64
+ return index;
65
+ }
66
+ /** 测试用:清空缓存(生产代码不应调用) */
67
+ export function clearBM25Cache() {
68
+ indexCache.clear();
69
+ }
70
+ /** 调试用:返回当前缓存的 product 列表 */
71
+ export function listCachedProducts() {
72
+ return [...indexCache.keys()];
73
+ }
@@ -0,0 +1,147 @@
1
+ const K1 = 1.5;
2
+ const B = 0.75;
3
+ /**
4
+ * 中文停用词:高频功能词,参与 BM25 会稀释关键术语权重。
5
+ * 覆盖:疑问代词、助词、人称、连接词、模糊量词、敬辞。
6
+ */
7
+ const CN_STOPWORDS = new Set([
8
+ '怎么', '如何', '什么', '哪些', '哪个', '为何', '为啥', '是否',
9
+ '可以', '能够', '需要', '想要', '应该', '请问', '麻烦',
10
+ '一下', '一个', '这个', '那个', '这些', '那些', '里面', '外面',
11
+ '使用', '用法', '用于', '用来', '进行', '实现', '提供', '支持',
12
+ '问题', '情况', '场景', '方式', '方法', '功能', '能力',
13
+ '我们', '你们', '他们', '自己', '大家',
14
+ '以及', '或者', '还是', '但是', '然后', '所以', '因为', '如果',
15
+ '已经', '正在', '马上', '立即', '总是', '一直',
16
+ ]);
17
+ /** 英文停用词:限制在常见 query 噪声词,避免误删技术语义词(如 'use', 'set' 这种命名前缀保留) */
18
+ const EN_STOPWORDS = new Set([
19
+ 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
20
+ 'and', 'or', 'but', 'if', 'then', 'so', 'as', 'of', 'at', 'by', 'for', 'in', 'on', 'to',
21
+ 'do', 'does', 'did', 'have', 'has', 'had',
22
+ 'this', 'that', 'these', 'those',
23
+ 'how', 'what', 'why', 'when', 'where', 'which', 'who',
24
+ 'i', 'we', 'you', 'they', 'it', 'me', 'us', 'them',
25
+ 'pls', 'please', 'thanks',
26
+ ]);
27
+ function isStopwordCJK(token) {
28
+ return CN_STOPWORDS.has(token);
29
+ }
30
+ function isStopwordEN(token) {
31
+ return EN_STOPWORDS.has(token);
32
+ }
33
+ export function tokenize(text) {
34
+ const tokens = [];
35
+ const lower = text.toLowerCase();
36
+ // 英文/数字 token:跳过停用词;保留长度 ≥ 2 的(避免单字符 'i', 'a' 漏入)
37
+ for (const match of lower.matchAll(/[a-z0-9_]+/g)) {
38
+ const tok = match[0];
39
+ if (tok.length === 1)
40
+ continue;
41
+ if (isStopwordEN(tok))
42
+ continue;
43
+ tokens.push(tok);
44
+ }
45
+ // 中文 token:bigram + unigram 两级
46
+ // - bigram:跳过包含停用词单字的组合(如「怎么调用」的「怎么」)以及任一位是常见停用字
47
+ // - unigram:跳过纯停用单字(用一个收敛的单字停用集合)
48
+ const cjk = text.replace(/[^\u4e00-\u9fff]/g, '');
49
+ for (let i = 0; i < cjk.length - 1; i += 1) {
50
+ const bigram = cjk.slice(i, i + 2);
51
+ if (isStopwordCJK(bigram))
52
+ continue;
53
+ tokens.push(bigram);
54
+ }
55
+ // 单字仅保留有信息量的(中文单字普遍信息量低,全部塞入会拉低 IDF;
56
+ // 简化策略:只在 bigram 路径之外补充长度 ≥ 3 的连续单字组合的首尾,避免噪声爆炸)
57
+ // 实践上保留 unigram 但不参与停用词过滤——让 BM25 的 IDF 自然衰减它们的权重。
58
+ for (let i = 0; i < cjk.length; i += 1) {
59
+ tokens.push(cjk[i]);
60
+ }
61
+ return tokens;
62
+ }
63
+ export function buildBM25Index(documents) {
64
+ const postings = {};
65
+ const docLengths = {};
66
+ const docFreq = {};
67
+ let totalLength = 0;
68
+ for (const doc of documents) {
69
+ const tokens = tokenize(doc.text);
70
+ docLengths[doc.id] = tokens.length;
71
+ totalLength += tokens.length;
72
+ const termFreq = {};
73
+ for (const token of tokens) {
74
+ termFreq[token] = (termFreq[token] ?? 0) + 1;
75
+ }
76
+ for (const [term, freq] of Object.entries(termFreq)) {
77
+ if (!postings[term])
78
+ postings[term] = {};
79
+ postings[term][doc.id] = freq;
80
+ docFreq[term] = (docFreq[term] ?? 0) + 1;
81
+ }
82
+ }
83
+ const n = documents.length;
84
+ const avgDocLength = n > 0 ? totalLength / n : 0;
85
+ const idf = {};
86
+ for (const [term, df] of Object.entries(docFreq)) {
87
+ idf[term] = Math.log(1 + (n - df + 0.5) / (df + 0.5));
88
+ }
89
+ return {
90
+ version: 1,
91
+ avgDocLength,
92
+ docLengths,
93
+ idf,
94
+ postings,
95
+ };
96
+ }
97
+ export function scoreBM25(query, chunkId, index) {
98
+ const tokens = tokenize(query);
99
+ const docLength = index.docLengths[chunkId] ?? 0;
100
+ if (docLength === 0)
101
+ return 0;
102
+ let score = 0;
103
+ for (const term of tokens) {
104
+ const tf = index.postings[term]?.[chunkId] ?? 0;
105
+ if (tf === 0)
106
+ continue;
107
+ const idf = index.idf[term] ?? 0;
108
+ const numerator = tf * (K1 + 1);
109
+ const denominator = tf + K1 * (1 - B + B * (docLength / (index.avgDocLength || 1)));
110
+ score += idf * (numerator / denominator);
111
+ }
112
+ return score;
113
+ }
114
+ export function rankBM25(query, chunkIds, index, boosts = {}) {
115
+ return chunkIds
116
+ .map((id) => ({
117
+ id,
118
+ score: scoreBM25(query, id, index) + (boosts[id] ?? 0),
119
+ }))
120
+ .sort((a, b) => b.score - a.score);
121
+ }
122
+ /**
123
+ * BM25 检索文本:title 重复 3 次以提权(标题语义浓度远高于正文,按业界惯例 boost)。
124
+ * symbols / error_codes 同样保留以便精确名匹配;正文走原内容。
125
+ */
126
+ export function chunkSearchText(parts) {
127
+ const titleBoosted = [parts.title, parts.title, parts.title].filter(Boolean).join(' ');
128
+ return [titleBoosted, parts.content ?? '', ...parts.symbols, ...parts.error_codes].filter(Boolean).join(' ');
129
+ }
130
+ export function rankPoolBM25(query, pool, boosts = {}) {
131
+ if (pool.length === 0)
132
+ return [];
133
+ const index = buildBM25Index(pool.map((chunk) => ({
134
+ id: chunk.id,
135
+ text: chunkSearchText(chunk),
136
+ })));
137
+ return rankBM25(query, pool.map((chunk) => chunk.id), index, boosts);
138
+ }
139
+ /**
140
+ * 基于预构建的 BM25 索引对一个 chunk-id 子集打分,跳过 tokenize + IDF 重算。
141
+ * 调用方需保证 chunkIds ⊆ index 已收录的 id 集合,否则未收录的 id 会返回 score=0。
142
+ */
143
+ export function rankSubsetWithIndex(query, chunkIds, index, boosts = {}) {
144
+ if (chunkIds.length === 0)
145
+ return [];
146
+ return rankBM25(query, chunkIds, index, boosts);
147
+ }
@@ -0,0 +1,69 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { chunkMarkdown, toManifestChunk } from './chunker.js';
5
+ import { buildDocSourceUrlMap } from './doc-url-resolver.js';
6
+ import { inferPathMeta } from './path-meta.js';
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const RESOURCE_ROOT = path.resolve(__dirname, '../resource');
9
+ function walkMarkdownFiles(dir, baseRel) {
10
+ if (!fs.existsSync(dir))
11
+ return [];
12
+ const files = [];
13
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
14
+ const rel = `${baseRel}/${entry.name}`.replace(/\\/g, '/');
15
+ const abs = path.join(dir, entry.name);
16
+ if (entry.isDirectory()) {
17
+ if (entry.name === 'native_live')
18
+ continue;
19
+ files.push(...walkMarkdownFiles(abs, rel));
20
+ }
21
+ else if (entry.name.endsWith('.md') && entry.name !== 'workflow.md') {
22
+ files.push(rel);
23
+ }
24
+ }
25
+ return files;
26
+ }
27
+ function collectComponentSlugs(chunks) {
28
+ const slugs = {};
29
+ for (const chunk of chunks) {
30
+ const componentsMatch = chunk.source.match(/components\/([^/]+)\.md$/);
31
+ const chatFeaturesMatch = chunk.source.match(/^knowledge\/chat\/preset\/(vue|react)\/features\/([^/]+)\.md$/);
32
+ const slug = componentsMatch?.[1] ?? chatFeaturesMatch?.[2];
33
+ if (!slug)
34
+ continue;
35
+ slugs[slug] = [slug, slug.replace(/-/g, ''), slug.replace(/-/g, '_')];
36
+ }
37
+ return slugs;
38
+ }
39
+ export function buildKnowledgeIndex() {
40
+ const sources = [
41
+ ...walkMarkdownFiles(path.join(RESOURCE_ROOT, 'knowledge'), 'knowledge'),
42
+ ...walkMarkdownFiles(path.join(RESOURCE_ROOT, 'integration'), 'integration'),
43
+ ];
44
+ const chunks = [];
45
+ for (const source of sources) {
46
+ const abs = path.join(RESOURCE_ROOT, source);
47
+ const content = fs.readFileSync(abs, 'utf-8');
48
+ const meta = inferPathMeta(source);
49
+ chunks.push(...chunkMarkdown(source, content, meta).map(toManifestChunk));
50
+ }
51
+ const indexDir = path.join(RESOURCE_ROOT, 'index');
52
+ fs.mkdirSync(indexDir, { recursive: true });
53
+ const manifest = {
54
+ version: 1,
55
+ built_at: new Date().toISOString(),
56
+ chunks,
57
+ };
58
+ const componentSlugs = collectComponentSlugs(chunks);
59
+ fs.writeFileSync(path.join(indexDir, 'manifest.json'), JSON.stringify(manifest));
60
+ fs.writeFileSync(path.join(indexDir, 'component-slugs.json'), JSON.stringify(componentSlugs));
61
+ const syncManifestPath = path.resolve(__dirname, '../../sync/sync-manifest.json');
62
+ const docSourceUrls = buildDocSourceUrlMap(syncManifestPath);
63
+ fs.writeFileSync(path.join(indexDir, 'doc-source-urls.json'), JSON.stringify(docSourceUrls));
64
+ const staleSearchIndex = path.join(indexDir, 'search-index.json');
65
+ if (fs.existsSync(staleSearchIndex)) {
66
+ fs.unlinkSync(staleSearchIndex);
67
+ }
68
+ console.warn(`build-knowledge-index: ${chunks.length} chunks (manifest-lite) from ${sources.length} files`);
69
+ }
@@ -0,0 +1,167 @@
1
+ import { extractErrorCodes, extractSymbols } from './extractors.js';
2
+ function slugify(text) {
3
+ return text
4
+ .trim()
5
+ .toLowerCase()
6
+ .replace(/[^\w\u4e00-\u9fff]+/g, '-')
7
+ .replace(/^-+|-+$/g, '') || 'section';
8
+ }
9
+ function sourceSlug(source) {
10
+ return source.replace(/\.md$/, '').replace(/[/\\]/g, '-');
11
+ }
12
+ function trimSliceOffsets(raw, fileStart) {
13
+ const leading = raw.length - raw.trimStart().length;
14
+ const trailing = raw.length - raw.trimEnd().length;
15
+ const char_start = fileStart + leading;
16
+ const char_end = fileStart + raw.length - trailing;
17
+ return { body: raw.slice(leading, raw.length - trailing), char_start, char_end };
18
+ }
19
+ function splitByHeading(content, level) {
20
+ const regex = new RegExp(`^${'#'.repeat(level)}\\s+(.+)$`, 'gm');
21
+ const sections = [];
22
+ const matches = [...content.matchAll(regex)];
23
+ if (matches.length === 0) {
24
+ return [{ title: 'full', raw: content, start: 0 }];
25
+ }
26
+ for (let i = 0; i < matches.length; i += 1) {
27
+ const match = matches[i];
28
+ const start = match.index ?? 0;
29
+ const end = i + 1 < matches.length ? (matches[i + 1].index ?? content.length) : content.length;
30
+ sections.push({
31
+ title: match[1].trim(),
32
+ raw: content.slice(start, end),
33
+ start,
34
+ });
35
+ }
36
+ return sections;
37
+ }
38
+ function isFaqLike(source, content) {
39
+ return /faq|error-code|error_code|TXLiteAVCode/i.test(source) || (content.match(/^###\s+/gm) ?? []).length >= 3;
40
+ }
41
+ function isChatUrlMapping(source) {
42
+ return /knowledge\/chat\/urls\/.+\.md$/i.test(source.replace(/\\/g, '/'));
43
+ }
44
+ function parseUrlMappingRows(content) {
45
+ const lines = content.split('\n');
46
+ let sectionTitle = '';
47
+ let offset = 0;
48
+ const rows = [];
49
+ for (const line of lines) {
50
+ const lineStart = offset;
51
+ const lineEnd = offset + line.length;
52
+ const heading = line.match(/^#{2,3}\s+(.+)$/);
53
+ if (heading) {
54
+ sectionTitle = heading[1].trim();
55
+ offset = lineEnd + 1;
56
+ continue;
57
+ }
58
+ const rowMatch = line.match(/^\|\s*([^|]+?)\s*\|\s*`?(https?:\/\/[^|`\s]+)`?\s*\|/);
59
+ if (rowMatch) {
60
+ const label = rowMatch[1].trim();
61
+ if (label && label !== '子问题' && label !== 'Query' && label !== 'Topic' && !/^-+$/.test(label)) {
62
+ rows.push({
63
+ label,
64
+ url: rowMatch[2],
65
+ sectionTitle,
66
+ lineStart,
67
+ lineEnd,
68
+ });
69
+ }
70
+ }
71
+ offset = lineEnd + 1;
72
+ }
73
+ return rows;
74
+ }
75
+ function chunkUrlMapping(source, content, meta) {
76
+ const rows = parseUrlMappingRows(content);
77
+ if (rows.length === 0) {
78
+ return [];
79
+ }
80
+ const baseSlug = sourceSlug(source);
81
+ const chunks = [];
82
+ for (const row of rows) {
83
+ const sectionLine = row.sectionTitle ? `### ${row.sectionTitle}\n\n` : '';
84
+ const body = `${sectionLine}| Query | Documentation |\n|-------|---------------|\n| ${row.label} | \`${row.url}\` |`;
85
+ 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;
103
+ }
104
+ export function chunkMarkdown(source, content, meta) {
105
+ const chunks = [];
106
+ const baseSlug = sourceSlug(source);
107
+ if (isChatUrlMapping(source)) {
108
+ const urlChunks = chunkUrlMapping(source, content, meta);
109
+ if (urlChunks.length > 0) {
110
+ return urlChunks;
111
+ }
112
+ }
113
+ if (content.length < 2048) {
114
+ const { body, char_start, char_end } = trimSliceOffsets(content, 0);
115
+ if (!body)
116
+ 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
+ });
132
+ return chunks;
133
+ }
134
+ const level = isFaqLike(source, content) ? 3 : 2;
135
+ const sections = splitByHeading(content, level);
136
+ for (const section of sections) {
137
+ const { body, char_start, char_end } = trimSliceOffsets(section.raw, section.start);
138
+ if (!body)
139
+ continue;
140
+ 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
+ });
156
+ }
157
+ return chunks.length > 0 ? chunks : chunkMarkdown(source, content.slice(0, 2048), meta);
158
+ }
159
+ export function toManifestChunk(chunk) {
160
+ const { content: _content, ...manifestChunk } = chunk;
161
+ return manifestChunk;
162
+ }
163
+ function pathBasename(source) {
164
+ const parts = source.split('/');
165
+ const file = parts[parts.length - 1] ?? source;
166
+ return file.replace(/\.md$/, '');
167
+ }
@@ -0,0 +1,39 @@
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 fileCache = new Map();
6
+ function resolveResourceRoot() {
7
+ // npm: knowledge/ → ../resource/ 到包根;dev: dist/knowledge/ → ../resource/ 到 dist/resource/
8
+ return path.resolve(__dirname, '../resource');
9
+ }
10
+ function readSourceFile(source) {
11
+ const cached = fileCache.get(source);
12
+ if (cached !== undefined)
13
+ return cached;
14
+ const abs = path.join(resolveResourceRoot(), source);
15
+ const text = fs.readFileSync(abs, 'utf-8');
16
+ fileCache.set(source, text);
17
+ return text;
18
+ }
19
+ export function getSourceFileContent(source) {
20
+ return readSourceFile(source);
21
+ }
22
+ /** 按 build 时写入的 char 偏移从 md 源文件切片(方案 B:manifest 不存 content) */
23
+ export function getChunkContent(chunk) {
24
+ const full = readSourceFile(chunk.source);
25
+ return full.slice(chunk.char_start, chunk.char_end);
26
+ }
27
+ export function attachChunkContent(chunk) {
28
+ return { ...chunk, content: getChunkContent(chunk) };
29
+ }
30
+ /** 预读 pool 涉及的唯一 source,再批量挂载 content(供 BM25 与 fragments 使用) */
31
+ export function attachPoolContent(pool) {
32
+ for (const source of new Set(pool.map((chunk) => chunk.source))) {
33
+ readSourceFile(source);
34
+ }
35
+ return pool.map((chunk) => attachChunkContent(chunk));
36
+ }
37
+ export function clearContentCache() {
38
+ fileCache.clear();
39
+ }
@@ -0,0 +1,142 @@
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
+ /** 控制台/购买页等不适合作为「参考文档」的链接 */
6
+ const NOISE_URL_RE = /console\.cloud\.tencent|buy\.cloud\.tencent|account\.renewal|edu\/learning/i;
7
+ const PREFERRED_DOC_HOST_RE = /trtc\.io|cloud\.tencent\.com|web\.sdk\.qcloud\.com|github\.com\/Tencent(?:Cloud|RTC)/i;
8
+ const LOCALHOST_URL_RE = /^https?:\/\/(?:localhost|127\.0\.0\.1)(?::|\b)/i;
9
+ let cachedSourceUrlMap = null;
10
+ function loadSourceUrlMap() {
11
+ if (cachedSourceUrlMap)
12
+ return cachedSourceUrlMap;
13
+ const mapPath = path.resolve(__dirname, '../resource/index/doc-source-urls.json');
14
+ if (!fs.existsSync(mapPath)) {
15
+ cachedSourceUrlMap = {};
16
+ return cachedSourceUrlMap;
17
+ }
18
+ cachedSourceUrlMap = JSON.parse(fs.readFileSync(mapPath, 'utf-8'));
19
+ return cachedSourceUrlMap;
20
+ }
21
+ function normalizeUrl(raw) {
22
+ return raw.replace(/[.,;)\]]+$/, '').trim();
23
+ }
24
+ function isUsefulDocUrl(url) {
25
+ if (!/^https?:\/\//i.test(url))
26
+ return false;
27
+ if (NOISE_URL_RE.test(url))
28
+ return false;
29
+ if (LOCALHOST_URL_RE.test(url))
30
+ return false;
31
+ return true;
32
+ }
33
+ /** 从 markdown 正文中提取可参考的官网链接(优先 cloud.tencent / web.sdk.qcloud) */
34
+ export function extractUrlsFromContent(content, max = 3) {
35
+ const found = [];
36
+ const preferred = [];
37
+ for (const match of content.matchAll(/https?:\/\/[^\s`|)\]"'>]+/g)) {
38
+ const url = normalizeUrl(match[0]);
39
+ if (!isUsefulDocUrl(url))
40
+ continue;
41
+ if (PREFERRED_DOC_HOST_RE.test(url)) {
42
+ if (!preferred.includes(url))
43
+ preferred.push(url);
44
+ }
45
+ else if (!found.includes(url)) {
46
+ found.push(url);
47
+ }
48
+ }
49
+ const merged = [...preferred, ...found];
50
+ return merged.slice(0, max);
51
+ }
52
+ /** L1 URL 映射 chunk:表格行中的目标文档 URL */
53
+ export function extractUrlMappingPrimaryUrl(content) {
54
+ const row = content.match(/\|\s*[^|]+\s*\|\s*`?(https?:\/\/[^|`\s]+)`?\s*\|/);
55
+ return row?.[1] ? normalizeUrl(row[1]) : null;
56
+ }
57
+ function isUrlMappingSource(source) {
58
+ return /knowledge\/chat\/urls\/.+\.md$/i.test(source.replace(/\\/g, '/'));
59
+ }
60
+ /**
61
+ * 为检索 fragment 解析可参考的官网 URL(去重、按优先级)。
62
+ * 1. sync-manifest 落盘的 localPath → 官网 URL(rtcengine 等)
63
+ * 2. L1 URL 映射行内目标 URL
64
+ * 3. 本地文档正文中的官网链接
65
+ */
66
+ export function resolveFragmentDocUrls(source, content, fullSourceContent) {
67
+ const normalized = source.replace(/\\/g, '/');
68
+ const urls = [];
69
+ const canonical = loadSourceUrlMap()[normalized];
70
+ if (canonical)
71
+ urls.push(canonical);
72
+ if (isUrlMappingSource(normalized)) {
73
+ const primary = extractUrlMappingPrimaryUrl(content);
74
+ if (primary && !urls.includes(primary))
75
+ urls.push(primary);
76
+ return urls;
77
+ }
78
+ const collect = (text) => {
79
+ for (const url of extractUrlsFromContent(text)) {
80
+ if (!urls.includes(url))
81
+ urls.push(url);
82
+ }
83
+ };
84
+ collect(content);
85
+ if (urls.length === 0 && fullSourceContent && fullSourceContent !== content) {
86
+ collect(fullSourceContent);
87
+ }
88
+ return urls.slice(0, 3);
89
+ }
90
+ /** 从 fragments 汇总去重后的参考链接列表(按 fragment 相关度排序) */
91
+ export function buildReferences(fragments) {
92
+ const refs = [];
93
+ const seen = new Set();
94
+ for (const fragment of fragments) {
95
+ for (const url of fragment.doc_urls) {
96
+ if (seen.has(url))
97
+ continue;
98
+ seen.add(url);
99
+ refs.push({
100
+ rank: refs.length + 1,
101
+ title: fragment.title,
102
+ url,
103
+ source: fragment.source,
104
+ });
105
+ }
106
+ }
107
+ return refs;
108
+ }
109
+ function coerceHttpUrl(value) {
110
+ if (typeof value !== 'string')
111
+ return null;
112
+ const normalized = value.replace(/\\/g, '/').trim();
113
+ if (!normalized.startsWith('http'))
114
+ return null;
115
+ return normalized;
116
+ }
117
+ function resolveManifestDocUrl(entry) {
118
+ return coerceHttpUrl(entry.ref) ?? coerceHttpUrl(entry.nodeId);
119
+ }
120
+ /** build 时从 sync-manifest 生成 localPath → 官网 URL 映射 */
121
+ export function buildDocSourceUrlMap(syncManifestPath) {
122
+ if (!fs.existsSync(syncManifestPath))
123
+ return {};
124
+ const manifest = JSON.parse(fs.readFileSync(syncManifestPath, 'utf-8'));
125
+ const map = {};
126
+ const entries = manifest.entries ?? {};
127
+ for (const entry of Object.values(entries)) {
128
+ const url = resolveManifestDocUrl(entry);
129
+ if (url && entry.localPath) {
130
+ map[entry.localPath.replace(/\\/g, '/')] = url;
131
+ }
132
+ }
133
+ for (const [localPath, nodeId] of Object.entries(manifest.byLocalPath ?? {})) {
134
+ const normalized = localPath.replace(/\\/g, '/');
135
+ if (map[normalized])
136
+ continue;
137
+ const url = resolveManifestDocUrl(entries[nodeId] ?? { nodeId });
138
+ if (url)
139
+ map[normalized] = url;
140
+ }
141
+ return map;
142
+ }
@@ -0,0 +1,25 @@
1
+ export function extractSymbols(content) {
2
+ const symbols = new Set();
3
+ for (const match of content.matchAll(/`([A-Za-z_][\w.]*)`/g)) {
4
+ symbols.add(match[1]);
5
+ }
6
+ for (const match of content.matchAll(/\b(use[A-Z]\w*)\b/g)) {
7
+ symbols.add(match[1]);
8
+ }
9
+ for (const match of content.matchAll(/\b([A-Z][A-Za-z0-9_]{2,})\b/g)) {
10
+ if (/^(TRTC|TX|ITX|ITRTC|V2TX|Login|Device|Room|Live|Call|CoGuest|CoHost|Battle|Gift|Barrage|Like|Seat|Audience|Beauty|Audio)/.test(match[1])) {
11
+ symbols.add(match[1]);
12
+ }
13
+ }
14
+ return [...symbols].slice(0, 50);
15
+ }
16
+ export function extractErrorCodes(content) {
17
+ const codes = new Set();
18
+ for (const match of content.matchAll(/\b(\d{5,7})\b/g)) {
19
+ codes.add(match[1]);
20
+ }
21
+ for (const match of content.matchAll(/\b(ERR_[A-Z0-9_]+)\b/g)) {
22
+ codes.add(match[1]);
23
+ }
24
+ return [...codes];
25
+ }