@tencent-rtc/trtc-agent-skills 0.1.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 (205) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/README.zh.md +173 -0
  4. package/bin/cli.js +434 -0
  5. package/knowledge-base/index.yaml +454 -0
  6. package/knowledge-base/platform-slice-template.md +233 -0
  7. package/knowledge-base/scenario-spec.md +350 -0
  8. package/knowledge-base/scenarios/conference/base/general-conference.md +365 -0
  9. package/knowledge-base/scenarios/conference/base/webinar-conference.md +130 -0
  10. package/knowledge-base/scenarios/conference/medical/1v1-video-consultation.md +145 -0
  11. package/knowledge-base/scenarios/conference/medical/medical-multidoctor-consultation.md +113 -0
  12. package/knowledge-base/scenarios/live/entertainment-live-room.md +118 -0
  13. package/knowledge-base/slice-spec.md +546 -0
  14. package/knowledge-base/slices/conference/web/ai-tools.md +225 -0
  15. package/knowledge-base/slices/conference/web/beauty-effects.md +188 -0
  16. package/knowledge-base/slices/conference/web/device-control.md +338 -0
  17. package/knowledge-base/slices/conference/web/login-auth.md +261 -0
  18. package/knowledge-base/slices/conference/web/network-quality.md +190 -0
  19. package/knowledge-base/slices/conference/web/official-roomkit-api.md +298 -0
  20. package/knowledge-base/slices/conference/web/official-roomkit-login-ui.md +246 -0
  21. package/knowledge-base/slices/conference/web/participant-list.md +238 -0
  22. package/knowledge-base/slices/conference/web/participant-management.md +718 -0
  23. package/knowledge-base/slices/conference/web/prejoin-check.md +293 -0
  24. package/knowledge-base/slices/conference/web/room-call.md +213 -0
  25. package/knowledge-base/slices/conference/web/room-chat.md +426 -0
  26. package/knowledge-base/slices/conference/web/room-lifecycle.md +534 -0
  27. package/knowledge-base/slices/conference/web/room-schedule.md +281 -0
  28. package/knowledge-base/slices/conference/web/screen-share.md +211 -0
  29. package/knowledge-base/slices/conference/web/video-layout.md +675 -0
  30. package/knowledge-base/slices/conference/web/virtual-background.md +197 -0
  31. package/knowledge-base/slices/conference/web/webinar-interaction.md +206 -0
  32. package/knowledge-base/slices/live/anchor-lifecycle.md +122 -0
  33. package/knowledge-base/slices/live/anchor-preview.md +90 -0
  34. package/knowledge-base/slices/live/anchor-room-config.md +104 -0
  35. package/knowledge-base/slices/live/audience-list.md +86 -0
  36. package/knowledge-base/slices/live/audience-manage.md +92 -0
  37. package/knowledge-base/slices/live/audience-watch.md +85 -0
  38. package/knowledge-base/slices/live/audio.md +116 -0
  39. package/knowledge-base/slices/live/barrage.md +88 -0
  40. package/knowledge-base/slices/live/beauty.md +99 -0
  41. package/knowledge-base/slices/live/coguest-apply.md +105 -0
  42. package/knowledge-base/slices/live/device-control.md +91 -0
  43. package/knowledge-base/slices/live/error-codes.md +167 -0
  44. package/knowledge-base/slices/live/gift.md +84 -0
  45. package/knowledge-base/slices/live/ios/.gitkeep +0 -0
  46. package/knowledge-base/slices/live/ios/anchor-lifecycle.md +313 -0
  47. package/knowledge-base/slices/live/ios/anchor-preview.md +228 -0
  48. package/knowledge-base/slices/live/ios/anchor-room-config.md +257 -0
  49. package/knowledge-base/slices/live/ios/audience-list.md +353 -0
  50. package/knowledge-base/slices/live/ios/audience-manage.md +381 -0
  51. package/knowledge-base/slices/live/ios/audience-watch.md +286 -0
  52. package/knowledge-base/slices/live/ios/audio.md +373 -0
  53. package/knowledge-base/slices/live/ios/barrage.md +285 -0
  54. package/knowledge-base/slices/live/ios/beauty.md +323 -0
  55. package/knowledge-base/slices/live/ios/coguest-apply.md +506 -0
  56. package/knowledge-base/slices/live/ios/device-control.md +286 -0
  57. package/knowledge-base/slices/live/ios/error-codes.md +270 -0
  58. package/knowledge-base/slices/live/ios/gift.md +315 -0
  59. package/knowledge-base/slices/live/ios/live-list.md +269 -0
  60. package/knowledge-base/slices/live/ios/login-auth.md +247 -0
  61. package/knowledge-base/slices/live/live-list.md +82 -0
  62. package/knowledge-base/slices/live/login-auth.md +78 -0
  63. package/package.json +34 -0
  64. package/skills/trtc/SKILL.md +326 -0
  65. package/skills/trtc/room-builder/SKILL.md +138 -0
  66. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/README.md +108 -0
  67. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/docs/backend-contract.zh-CN.md +162 -0
  68. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/docs/integration.zh-CN.md +154 -0
  69. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/docs/theme.zh-CN.md +78 -0
  70. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/index.html +12 -0
  71. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/package.json +28 -0
  72. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/postcss.config.js +5 -0
  73. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/App.vue +25 -0
  74. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/ConsultationManagePanel.vue +838 -0
  75. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/LanguageSwitch.vue +102 -0
  76. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/LoadingSpinner.vue +6 -0
  77. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalAlert.vue +34 -0
  78. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalBusinessPanel.vue +148 -0
  79. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalButton.vue +49 -0
  80. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalConfirmDialog.vue +68 -0
  81. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalDataPanel.vue +196 -0
  82. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalRecordPanel.vue +270 -0
  83. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/PrescriptionPanel.vue +363 -0
  84. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/config/basic-info-config.ts +29 -0
  85. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/config/lib-generate-test-usersig-es.min.d.ts +4 -0
  86. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/config/lib-generate-test-usersig-es.min.js +2 -0
  87. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/config/runtime-config.ts +12 -0
  88. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/env.d.ts +32 -0
  89. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/ConsultationChatPanel.vue +123 -0
  90. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/ConsultationMembersPanel.vue +230 -0
  91. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/ConsultationTranscriptionPanel.vue +135 -0
  92. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/ConsultationVideoStage.vue +113 -0
  93. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/InviteDoctorDialog.vue +132 -0
  94. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/KickMemberConfirmDialog.vue +50 -0
  95. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/types.ts +77 -0
  96. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/useConsultationChat.ts +97 -0
  97. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/useConsultationDevices.ts +48 -0
  98. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/useConsultationParticipants.ts +121 -0
  99. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/useConsultationPermissions.ts +25 -0
  100. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/utils.ts +70 -0
  101. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/i18n/en-US/index.ts +553 -0
  102. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/i18n/index.ts +25 -0
  103. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/i18n/medicalTranslate.ts +85 -0
  104. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/i18n/state.ts +49 -0
  105. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/i18n/zh-CN/index.ts +463 -0
  106. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/main.ts +12 -0
  107. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/mock/appointments.ts +96 -0
  108. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/mock/users.ts +79 -0
  109. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/router/index.ts +63 -0
  110. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/index.ts +25 -0
  111. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/integration/appointmentService.ts +77 -0
  112. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/integration/authService.ts +38 -0
  113. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/integration/launchContext.ts +31 -0
  114. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/integration/userService.ts +35 -0
  115. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/mock/appointmentService.ts +43 -0
  116. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/mock/authService.ts +33 -0
  117. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/mock/userService.ts +43 -0
  118. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/types.ts +135 -0
  119. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/shared/icons.ts +53 -0
  120. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/styles/index.css +106 -0
  121. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/styles/tailwind.css +3 -0
  122. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/styles/theme.css +209 -0
  123. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/utils/auth.ts +50 -0
  124. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/utils/format.ts +24 -0
  125. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/utils/navigation.ts +12 -0
  126. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/utils/session.ts +28 -0
  127. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/DoctorConsultationView.vue +777 -0
  128. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/DoctorDashboardView.vue +678 -0
  129. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/LoginView.vue +441 -0
  130. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/PatientConsultationFinishedView.vue +185 -0
  131. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/PatientConsultationView.vue +1003 -0
  132. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/PatientSelectDoctorView.vue +317 -0
  133. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/PatientWaitingView.vue +454 -0
  134. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/tsconfig.json +21 -0
  135. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/tsconfig.node.json +8 -0
  136. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/vite.config.ts +17 -0
  137. package/skills/trtc/room-builder/templates/scenarios/medical-consultation//346/216/245/345/205/245/350/257/264/346/230/216.md +6 -0
  138. package/skills/trtc/room-builder/tools/render_ai_instructions.py +226 -0
  139. package/skills/trtc-apply/SKILL.md +97 -0
  140. package/skills/trtc-apply/guardrails/apply_lib/__init__.py +0 -0
  141. package/skills/trtc-apply/guardrails/apply_lib/__pycache__/__init__.cpython-313.pyc +0 -0
  142. package/skills/trtc-apply/guardrails/apply_lib/__pycache__/rule_parser.cpython-313.pyc +0 -0
  143. package/skills/trtc-apply/guardrails/apply_lib/rule_parser.py +268 -0
  144. package/skills/trtc-docs/SKILL.md +207 -0
  145. package/skills/trtc-onboarding/SKILL.md +839 -0
  146. package/skills/trtc-onboarding/reference/path-a1-demo.md +103 -0
  147. package/skills/trtc-onboarding/reference/path-a2-integrate.md +693 -0
  148. package/skills/trtc-onboarding/reference/path-b-troubleshoot.md +115 -0
  149. package/skills/trtc-onboarding/reference/path-c-expand.md +43 -0
  150. package/skills/trtc-onboarding/reference/reporting-protocol.md +174 -0
  151. package/skills/trtc-onboarding/reference/supported-matrix.md +100 -0
  152. package/skills/trtc-onboarding/reference/usersig-handling.md +140 -0
  153. package/skills/trtc-search/SKILL.md +221 -0
  154. package/skills/trtc-topic/SKILL.md +638 -0
  155. package/skills/trtc-topic/guardrails/__pycache__/gate_slice_read.cpython-313.pyc +0 -0
  156. package/skills/trtc-topic/guardrails/__pycache__/gate_slice_write.cpython-313.pyc +0 -0
  157. package/skills/trtc-topic/guardrails/__pycache__/stop_require_apply_evidence.cpython-313.pyc +0 -0
  158. package/skills/trtc-topic/guardrails/gate_slice_read.py +133 -0
  159. package/skills/trtc-topic/guardrails/gate_slice_write.py +169 -0
  160. package/skills/trtc-topic/guardrails/stop_require_apply_evidence.py +97 -0
  161. package/skills/trtc-topic/references/execution-units.yaml +58 -0
  162. package/skills/trtc-topic/runtime/README.md +50 -0
  163. package/skills/trtc-topic/runtime/RUNTIME.md +128 -0
  164. package/skills/trtc-topic/runtime/lib/__init__.py +0 -0
  165. package/skills/trtc-topic/runtime/lib/platforms.py +194 -0
  166. package/skills/trtc-topic/runtime/package-lock.json +1211 -0
  167. package/skills/trtc-topic/runtime/package.json +13 -0
  168. package/skills/trtc-topic/runtime/telemetry-bridge.mjs +339 -0
  169. package/skills/trtc-topic/runtime/telemetry_collector.py +293 -0
  170. package/skills/trtc-topic/scripts/STATE-MACHINE-GUIDE.md +186 -0
  171. package/skills/trtc-topic/scripts/__pycache__/apply.cpython-313.pyc +0 -0
  172. package/skills/trtc-topic/scripts/apply.py +581 -0
  173. package/skills/trtc-topic/scripts/finalize_session.py +113 -0
  174. package/skills/trtc-topic/scripts/init_slice_queue.py +96 -0
  175. package/skills/trtc-topic/scripts/lib/__pycache__/state_machine.cpython-313.pyc +0 -0
  176. package/skills/trtc-topic/scripts/lib/state_machine.py +328 -0
  177. package/skills/trtc-topic/scripts/next_slice.py +137 -0
  178. package/skills/trtc-topic/tests/README.md +70 -0
  179. package/skills/trtc-topic/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
  180. package/skills/trtc-topic/tests/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
  181. package/skills/trtc-topic/tests/__pycache__/test_apply_cli.cpython-313-pytest-9.0.2.pyc +0 -0
  182. package/skills/trtc-topic/tests/__pycache__/test_apply_cli.cpython-313-pytest-9.0.3.pyc +0 -0
  183. package/skills/trtc-topic/tests/__pycache__/test_end_to_end.cpython-313-pytest-9.0.2.pyc +0 -0
  184. package/skills/trtc-topic/tests/__pycache__/test_end_to_end.cpython-313-pytest-9.0.3.pyc +0 -0
  185. package/skills/trtc-topic/tests/__pycache__/test_finalize_session.cpython-313-pytest-9.0.2.pyc +0 -0
  186. package/skills/trtc-topic/tests/__pycache__/test_finalize_session.cpython-313-pytest-9.0.3.pyc +0 -0
  187. package/skills/trtc-topic/tests/__pycache__/test_gates.cpython-313-pytest-9.0.2.pyc +0 -0
  188. package/skills/trtc-topic/tests/__pycache__/test_gates.cpython-313-pytest-9.0.3.pyc +0 -0
  189. package/skills/trtc-topic/tests/__pycache__/test_session_resolver.cpython-313-pytest-9.0.2.pyc +0 -0
  190. package/skills/trtc-topic/tests/__pycache__/test_session_resolver.cpython-313-pytest-9.0.3.pyc +0 -0
  191. package/skills/trtc-topic/tests/__pycache__/test_state_machine.cpython-313-pytest-9.0.2.pyc +0 -0
  192. package/skills/trtc-topic/tests/__pycache__/test_state_machine.cpython-313-pytest-9.0.3.pyc +0 -0
  193. package/skills/trtc-topic/tests/__pycache__/test_stop_require_apply.cpython-313-pytest-9.0.2.pyc +0 -0
  194. package/skills/trtc-topic/tests/__pycache__/test_stop_require_apply.cpython-313-pytest-9.0.3.pyc +0 -0
  195. package/skills/trtc-topic/tests/__pycache__/test_topic_skill_invariants.cpython-313-pytest-9.0.2.pyc +0 -0
  196. package/skills/trtc-topic/tests/__pycache__/test_topic_skill_invariants.cpython-313-pytest-9.0.3.pyc +0 -0
  197. package/skills/trtc-topic/tests/conftest.py +72 -0
  198. package/skills/trtc-topic/tests/test_apply_cli.py +480 -0
  199. package/skills/trtc-topic/tests/test_end_to_end.py +305 -0
  200. package/skills/trtc-topic/tests/test_finalize_session.py +51 -0
  201. package/skills/trtc-topic/tests/test_gates.py +316 -0
  202. package/skills/trtc-topic/tests/test_session_resolver.py +260 -0
  203. package/skills/trtc-topic/tests/test_state_machine.py +414 -0
  204. package/skills/trtc-topic/tests/test_stop_require_apply.py +99 -0
  205. package/skills/trtc-topic/tests/test_topic_skill_invariants.py +130 -0
@@ -0,0 +1,293 @@
1
+ ---
2
+ id: conference/prejoin-check
3
+ name: 入会前设备检查
4
+ product: conference
5
+ platform: web
6
+ tags: [prejoin, camera-test, microphone-test, speaker-test, device-check]
7
+ platforms: [web]
8
+ related: [conference/login-auth, conference/device-control, conference/network-quality]
9
+ api_docs:
10
+ - title: 设备检测
11
+ url: https://cloud.tencent.com/document/product/647/126939
12
+ ---
13
+
14
+ # 入会前设备检查
15
+
16
+ ## 功能说明
17
+
18
+ 入会前设备检查负责用户真正加入会议前的本地自检流程,帮助确认摄像头、麦克风、扬声器是否可用,并让用户在入会前完成设备选择、权限确认和异常兜底。它解决的是“进房之前先把设备准备好”这条主流程。会中设置面板、工具栏或异常恢复场景下也可能出现局部设备检查、预览和测试,但那属于 `device-control` 的会中能力延伸,而不是当前 slice 关注的主流程。
19
+
20
+ ## 核心概念
21
+
22
+ ### 角色与操作
23
+
24
+ | 角色 | 关键操作 | 说明 |
25
+ |------|----------|------|
26
+ | 准备入会的用户 | 预览和测试设备 | 在不真正入房的前提下完成摄像头、麦克风、扬声器检查 |
27
+ | 浏览器 / 系统 | 授予测试权限 | 控制会前是否允许访问摄像头和麦克风 |
28
+ | 会前检测页 | 聚合测试流程 | 承载设备选择、音量反馈、测试音频播放和异常提示 |
29
+ | 入房主流程 | 消费测试结果 | 把用户在会前选好的设备延续到真实会议里 |
30
+
31
+ ### 事件流
32
+
33
+ | 阶段 | 参与方 | 关键动作 |
34
+ |------|--------|----------|
35
+ | 打开会前页 | 用户 | 进入会前检测流程 |
36
+ | 摄像头测试 | 浏览器 / 客户端 | 启动本地画面预览,确认摄像头工作正常 |
37
+ | 麦克风测试 | 浏览器 / 客户端 | 检测麦克风采集并反馈实时音量 |
38
+ | 扬声器测试 | 浏览器 / 客户端 | 播放测试音并确认输出设备是否正确 |
39
+ | 入会衔接 | 用户 / 客户端 | 结束测试,把当前设备选择带入真实入会流程 |
40
+
41
+ ### 状态与数据
42
+
43
+ | 数据 / 状态 | 说明 |
44
+ |-------------|------|
45
+ | 当前选择的摄像头 / 麦克风 / 扬声器 | 用户准备带入会议的设备偏好 |
46
+ | 摄像头预览状态 | 表示当前是否已经启动会前画面预览 |
47
+ | 麦克风测试电平 | 用于反馈当前麦克风是否正在采集声音 |
48
+ | 扬声器测试状态 | 用于判断测试音是否成功播放到目标设备 |
49
+ | 会前异常状态 | 包括权限拒绝、设备不可用、测试未启动等情况 |
50
+
51
+ ### 状态机
52
+
53
+ ```text
54
+ idle
55
+ → camera-testing
56
+ → microphone-testing
57
+ → speaker-testing
58
+ → confirmed
59
+ → entering-room
60
+
61
+ camera-testing / microphone-testing / speaker-testing
62
+ → blocked
63
+ → failed
64
+ → idle
65
+ ```
66
+
67
+ ## 前置条件
68
+ **通用依赖**:见 [login-auth 平台 slice](login-auth.md)。
69
+
70
+ **额外依赖**:
71
+ - 已安装 `tuikit-atomicx-vue3@latest`
72
+
73
+ **前置状态**:
74
+ - 已阅读 `conference/prejoin-check`,明确当前能力的产品边界。
75
+ - 已完成 `conference/login-auth`,确保当前页面具备稳定登录态。
76
+ - 已根据业务流程接入会议上下文;需要房间状态时,优先通过 `conference/room-lifecycle` 统一承接。
77
+ - 当前能力涉及媒体采集、渲染或浏览器权限时,请在 `HTTPS` 或 `localhost` 安全上下文下调试。
78
+
79
+ ## 最佳实践
80
+
81
+ ### ✅ ALWAYS
82
+
83
+ 1. **把入会前完整检查流程与真实入会控制拆成两段主链路** —— 用户先完成会前自检,再进入房间主链路;会中如需局部检查,应由会中设备能力单独承接。
84
+ 2. **把用户选定的设备延续到会中** —— 会前选好的摄像头、麦克风和扬声器应直接复用于会中控制。
85
+ 3. **在页面卸载或进入会议前停止测试** —— 避免会前测试与会中真实采集相互冲突。
86
+ 4. **把权限拒绝和设备缺失写成可执行提示** —— 告诉用户下一步该切浏览器权限、换设备,还是直接降级进入。
87
+
88
+ ### ❌ NEVER
89
+
90
+ 1. **不要把会前测试残留到会中流程里** —— 测试流和真实采集流应在入会时完成切换。
91
+ 2. **不要只测试摄像头而忽略麦克风和扬声器** —— 用户真实会议体验依赖完整的音视频链路。
92
+ 3. **不要在测试失败时静默继续入会** —— 如果关键设备不可用,应给出明确风险提示或修复建议。
93
+
94
+ ## 代码示例
95
+ ### 会前自检:摄像头、麦克风、扬声器测试
96
+
97
+ ```ts
98
+ import { ref } from 'vue';
99
+ import { useDeviceState } from 'tuikit-atomicx-vue3/room';
100
+
101
+ const {
102
+ startCameraTest,
103
+ stopCameraTest,
104
+ startMicrophoneTest,
105
+ startSpeakerTest,
106
+ currentMicVolume,
107
+ } = useDeviceState();
108
+
109
+ // ⚠️ 关键:会前测试 API(startCameraTest / startMicrophoneTest)运行在测试模式下,
110
+ // **不会** 改变 cameraStatus / microphoneStatus。
111
+ // 预检页的设备开关状态必须使用独立的本地 ref 管理。
112
+ const isCameraOn = ref(true);
113
+ const isMicrophoneOn = ref(true);
114
+
115
+ await startCameraTest({ view: document.getElementById('preview')! });
116
+ await startMicrophoneTest({ interval: 200 });
117
+ await startSpeakerTest({
118
+ filePath: 'https://web.sdk.qcloud.com/trtc/electron/download/resources/media/TestSpeaker.mp3',
119
+ // TODO: 上线前建议替换为客户自己维护的 HTTPS mp3 资源,避免外部测试资源变更或不可用。
120
+ });
121
+
122
+ // 切换摄像头预览:停止/重启测试,同时翻转本地状态
123
+ async function toggleCameraPreview(view: HTMLElement) {
124
+ if (isCameraOn.value) {
125
+ await stopCameraTest();
126
+ isCameraOn.value = false;
127
+ } else {
128
+ await startCameraTest({ view });
129
+ isCameraOn.value = true;
130
+ }
131
+ }
132
+
133
+ // 入会前停止测试释放设备资源
134
+ await stopCameraTest();
135
+ ```
136
+
137
+ ### 会前检测完整组件示例(Vue 3 Composition API)
138
+
139
+ ```ts
140
+ import { ref, onMounted, onUnmounted } from 'vue';
141
+ import { useDeviceState } from 'tuikit-atomicx-vue3/room';
142
+
143
+ // ⚠️ 如果业务层封装了统一的 composable(如 useConferenceDevice),
144
+ // 必须确保 useDeviceState() 在模块级缓存为单例(只调用一次),
145
+ // 否则不同组件拿到的 currentMicVolume 可能来自不同实例,导致音量数据不同步。
146
+ const {
147
+ startCameraTest,
148
+ stopCameraTest,
149
+ startMicrophoneTest,
150
+ currentMicVolume, // 由 startMicrophoneTest 按 interval 周期更新
151
+ } = useDeviceState();
152
+
153
+ // 本地状态:预检页 UI 开关(不依赖 cameraStatus / microphoneStatus)
154
+ const isCameraOn = ref(true);
155
+ const isMicrophoneOn = ref(true);
156
+ const previewRef = ref<HTMLElement | null>(null);
157
+
158
+ onMounted(async () => {
159
+ if (previewRef.value) {
160
+ await startCameraTest({ view: previewRef.value });
161
+ await startMicrophoneTest({ interval: 200 });
162
+ }
163
+ });
164
+
165
+ onUnmounted(async () => {
166
+ await stopCameraTest();
167
+ });
168
+
169
+ // 入会时将本地预设状态透传给会中逻辑
170
+ function getDevicePreset() {
171
+ return { camera: isCameraOn.value, microphone: isMicrophoneOn.value };
172
+ }
173
+ ```
174
+
175
+ ## 调用时序
176
+ ```
177
+ 完成 login-auth
178
+
179
+
180
+ 进入会前检测页
181
+
182
+ ├─ startCameraTest(view)
183
+ ├─ startMicrophoneTest(interval)
184
+ └─ startSpeakerTest(filePath)
185
+
186
+
187
+ 用户查看画面、音量与播放结果
188
+
189
+ ├─ 发现异常 → 引导切换设备或重新授权
190
+ └─ 检测通过 → 进入 joinRoom / createAndJoinRoom
191
+
192
+
193
+ 页面卸载时停止测试,释放本地采集资源
194
+ ```
195
+
196
+ ## 平台特有注意事项
197
+ ### 1. 会前检测页要负责释放测试资源
198
+ 测试页若未在离开时停止预览或音频测试,浏览器可能持续占用摄像头、麦克风或扬声器资源。
199
+
200
+ ### 2. 扬声器测试必须使用可访问的媒体资源
201
+ `startSpeakerTest()` 依赖业务侧提供可访问的音频文件;建议使用 `HTTPS` 资源,避免被浏览器拦截。
202
+ AI 生成实现时可先使用 `https://web.sdk.qcloud.com/trtc/electron/download/resources/media/TestSpeaker.mp3` 作为扬声器检测音频;但应显式保留 TODO,提醒客户上线前替换为自己维护的 mp3 资源,避免外部公共资源变更、失效或被访问策略影响。
203
+
204
+ ### 3. 会前检测不是设备控制的替代品
205
+ 检测页更适合做预览与授权确认;真正会中的开关、切换与异常兜底仍应交由 `conference/device-control` 统一承接。
206
+
207
+ ### 4. `startCameraTest` / `startMicrophoneTest` 不改变 `cameraStatus` / `microphoneStatus`
208
+ > ⚠️ **关键警告**:会前测试 API 运行在独立的"测试模式"下,调用后 SDK 内部的 `cameraStatus`、`microphoneStatus` **不会**变为 `DeviceStatus.On`。因此:
209
+ > - 预检页的 UI 开关状态**不能**从 `cameraStatus` / `microphoneStatus` 派生,必须使用组件本地 `ref` 管理。
210
+ > - 切换预检摄像头时,应调用 `stopCameraTest()` / `startCameraTest(view)` 来配对操作,而非 `openLocalCamera()` / `closeLocalCamera()`(后者是正式会中 API)。
211
+ > - 入会时需将本地 ref 状态(用户预设的设备开关偏好)显式传递给会中入会逻辑。
212
+
213
+ ### 5. `useDeviceState()` 在业务 composable 中必须保持单例
214
+ 如果项目封装了统一的设备 composable(如 `useConferenceDevice()`),内部的 `useDeviceState()` 必须在模块级缓存为单例。否则不同组件调用 composable 时会创建不同实例,导致 `currentMicVolume`、`cameraStatus` 等响应式引用断链——`startMicrophoneTest` 更新的值无法同步到消费方。
215
+
216
+ **正确做法:**
217
+ ```ts
218
+ // 模块级单例
219
+ let _deviceState: ReturnType<typeof useDeviceState> | null = null;
220
+ function getDeviceState() {
221
+ if (!_deviceState) _deviceState = useDeviceState();
222
+ return _deviceState;
223
+ }
224
+
225
+ export function useConferenceDevice() {
226
+ const { currentMicVolume, startCameraTest, ... } = getDeviceState();
227
+ // ...
228
+ }
229
+ ```
230
+
231
+ ## 代码生成约束
232
+ ### 编译必要条件
233
+ - **通用条件**:见 [login-auth 平台 slice](login-auth.md)。
234
+ - **额外导入**:至少需要从 `tuikit-atomicx-vue3/room` 导入 `useDeviceState`。
235
+ - **运行前提**:页面具备安全上下文,且预览容器 DOM 已挂载。
236
+
237
+ ### 生成规则
238
+ #### MUST(生成时必须包含)
239
+
240
+ 1. **在预览容器准备好后再调用 `startCameraTest()`** — 否则本地预览无法正常渲染。
241
+ **Verify**: 检查是否为 `view` 传入真实 DOM 节点。
242
+ 2. **在页面离开或流程结束时停止测试** — 否则设备资源会残留占用。
243
+ **Verify**: 检查是否存在 `stopCameraTest()` 或等价清理逻辑。
244
+
245
+ #### MUST NOT(生成时绝不能出现)
246
+
247
+ 1. **不要把会前检测页当成正式入会后的状态源** — 设备测试结果不能替代会中真实设备状态。
248
+ **Verify**: 检查是否仍通过 `conference/device-control` 承接会中控制。
249
+ 2. **不要使用不可访问或非安全协议的扬声器测试资源** — 会导致测试链路失效。
250
+ **Verify**: 检查 `filePath` 是否为业务可访问的地址。
251
+ 3. **不要在预检页用 `cameraStatus` / `microphoneStatus` 驱动设备开关 UI** — 会前测试 API 不会更新这些状态值,导致 UI 永远显示"关闭"。
252
+ **Verify**: 检查预检页组件中设备开关状态是否来自本地 `ref`,而非 `cameraStatus` / `microphoneStatus`。
253
+ 4. **不要在封装 composable 时多次调用 `useDeviceState()` 创建不同实例** — 会导致 `currentMicVolume` 等响应式数据在不同组件间断链。
254
+ **Verify**: 检查 composable 内部是否将 `useDeviceState()` 缓存为模块级单例。
255
+
256
+ ### 集成检查点
257
+ - 当前 slice 常与 `conference/device-control`、`conference/room-lifecycle` 连续使用。
258
+ - 集成侵入性低,通常新增一个会前检测页面或弹层即可。
259
+ - 若业务需要在会前页完成设备选择,建议把最终选择结果同步给正式入会流程。
260
+
261
+ ## 验证矩阵
262
+ | 层级 | 检查项 | 验证手段 | 预期结果 |
263
+ |------|--------|----------|---------|
264
+ | 1. 编译级 | 已导入 `useDeviceState` | 检查 `import` 语句 | 会前检测 Hook 可解析 |
265
+ | 2. 静态规则级 | 预览与测试都有显式启动 / 停止逻辑 | 搜索 `startCameraTest` / `stopCameraTest` / `startMicrophoneTest` | 形成完整自检链路 |
266
+ | 3. 运行时级 | 摄像头与麦克风测试可执行 | 打开会前检测页并授权设备 | 能看到预览或音量变化 |
267
+ | 4. 业务行为级 | 用户可在入会前完成自检 | 走完整个会前页流程 | 检测完成后可顺畅进入会议 |
268
+
269
+ ## 排障指南
270
+
271
+ ### 常见问题
272
+
273
+ | 问题 | 表现 | 处理建议 |
274
+ |------|------|----------|
275
+ | 摄像头预览黑屏 | 进入会前页后看不到本地画面 | 检查浏览器权限、设备是否被占用,以及测试是否真正启动 |
276
+ | 麦克风无音量反馈 | 说话时音量条不动 | 检查麦克风权限、当前选择的输入设备是否正确,以及采集是否已开始 |
277
+ | 入会后设备与会前选择不一致 | 会前选好了设备,但进房后仍用了默认设备 | 检查会前选择结果是否在进入真实会议时被正确复用 |
278
+
279
+ ### 排障流程
280
+
281
+ ```text
282
+ 发现 入会前设备检查 相关问题
283
+ ├── 第 1 步:确认问题属于会前自检,而不是会中设备控制或网络质量展示
284
+ ├── 第 2 步:检查摄像头、麦克风、扬声器三段测试是否都真正启动并有结果反馈
285
+ ├── 第 3 步:确认会前选定的设备是否在 entering-room 阶段正确带入真实会议
286
+ └── 第 4 步:若仍异常,再回查 login-auth / device-control / network-quality 的衔接是否正确
287
+ ```
288
+
289
+ ## 关联知识
290
+
291
+ - **[conference/login-auth](login-auth.md)** —— 会前检测通常建立在基础登录已完成的前提下。
292
+ - **[conference/device-control](device-control.md)** —— 入会前测试完成后,会中设备控制应复用同一套设备选择结果。
293
+ - **[conference/network-quality](network-quality.md)** —— 用户进入会议后的网络波动不属于会前检测本身,需要分开提示。
@@ -0,0 +1,213 @@
1
+ ---
2
+ id: conference/room-call
3
+ name: 会中呼叫
4
+ product: conference
5
+ platform: web
6
+ tags: [call, callUserToRoom, acceptCall, rejectCall, cancelCall]
7
+ platforms: [web]
8
+ related: [conference/room-lifecycle, conference/participant-management, conference/participant-list]
9
+ api_docs:
10
+ - title: 会中呼叫
11
+ url: https://cloud.tencent.com/document/product/647/126929
12
+ business_decisions:
13
+ - key: call_target
14
+ tier: blocking
15
+ question: "会中邀请他人加入时,需要支持批量操作吗?"
16
+ options:
17
+ - { label: "仅支持逐个邀请 —— 适合小规模场景", value: "single" }
18
+ - { label: "需要支持批量邀请 —— 适合大型会议或需要同时通知多人的场景(也能单个邀请)", value: "multi" }
19
+ - key: call_permission
20
+ tier: blocking
21
+ question: "谁可以在会议中邀请他人加入?"
22
+ options:
23
+ - { label: "所有参会者都可邀请 —— 开放式", value: "anyone" }
24
+ - { label: "仅主持人 / 管理员可邀请 —— 受控式", value: "admin-only" }
25
+ ---
26
+
27
+ # 会中呼叫
28
+
29
+ ## 功能说明
30
+
31
+ 会中呼叫负责房间内对房外用户发起入会呼叫的信令链路,解决呼叫发送、接收、接受、拒绝、取消、超时以及多设备收口问题。它的核心是"呼叫是否跑通",而不是"呼叫接受后是否已经真正进入房间"。
32
+
33
+ ## 核心概念
34
+
35
+ ### 角色与操作
36
+
37
+ | 角色 | 关键操作 | 说明 |
38
+ |------|----------|------|
39
+ | 呼叫发起方 | 发起入会呼叫、取消呼叫 | 通常是房主、管理员或具备权限的会议成员 |
40
+ | 被呼叫方 | 接受或拒绝呼叫 | 接受呼叫后,仍需继续进入真实入会流程 |
41
+ | 其他设备 | 收口重复处理 | 同一用户多设备在线时,呼叫结果需要统一收敛 |
42
+ | 房间生命周期模块 | 承接真实入会 | `acceptCall` 不是最终入会,仍需衔接 `joinRoom` |
43
+
44
+ ### 事件流
45
+
46
+ | 阶段 | 参与方 | 关键动作 |
47
+ |------|--------|----------|
48
+ | 发起呼叫 | 呼叫方 | 向指定用户发送入会呼叫 |
49
+ | 接收呼叫 | 被呼叫方 | 在常驻监听处收到会中呼叫通知 |
50
+ | 用户响应 | 被呼叫方 | 选择接受、拒绝,或等待超时 |
51
+ | 结果回传 | 双方 / 其他设备 | 呼叫成功、拒绝、超时、取消、其他设备已处理等状态回传 |
52
+ | 真正入会 | 被呼叫方 | 只有在接受呼叫后继续走入房链路,会议才算真正建立 |
53
+
54
+ ### 状态与数据
55
+
56
+ | 数据 / 状态 | 说明 |
57
+ |-------------|------|
58
+ | 被呼叫用户集合 | 当前呼叫要覆盖的目标用户 |
59
+ | 呼叫结果状态 | 接受、拒绝、超时、取消、其他设备已处理等结果 |
60
+ | 呼叫上下文 | 用于标识本次呼叫及其结果收口 |
61
+ | 房间标识 | 决定呼叫接受后要进入哪一场会议 |
62
+ | 当前用户权限 | 决定是否可以对外发起会中呼叫 |
63
+
64
+ ### 状态机
65
+
66
+ ```text
67
+ idle
68
+ → calling
69
+ → pending-response
70
+ → accepted
71
+ → joining-room
72
+ → in-room
73
+
74
+ pending-response
75
+ → rejected
76
+ → timeout
77
+ → cancelled
78
+ → handled-by-other-device
79
+ → idle
80
+ ```
81
+
82
+ ## 前置条件
83
+ **通用依赖**:见 [login-auth 平台 slice](login-auth.md)。
84
+
85
+ **额外依赖**:
86
+ - 已安装 `tuikit-atomicx-vue3@latest`
87
+
88
+ **前置状态**:
89
+ - 已阅读 `conference/room-call`,明确当前能力的产品边界。
90
+ - 已完成 `conference/login-auth`,确保当前页面具备稳定登录态。
91
+ - 已根据业务流程接入会议上下文;需要房间状态时,优先通过 `conference/room-lifecycle` 统一承接。
92
+
93
+ ## 最佳实践
94
+
95
+ ### ✅ ALWAYS
96
+
97
+ 1. **把呼叫确认与真正入会拆成两步** —— 呼叫被接受后,仍应显式进入房间生命周期。
98
+ 2. **在常驻组件中监听呼叫事件** —— 不要依赖某个临时页面在前台,避免呼叫到达时无人接收。
99
+ 3. **处理好多设备并发响应的收口** —— 同一用户一台设备接受后,其它设备应同步结束该次呼叫流程。
100
+ 4. **让呼叫权限与角色治理保持一致** —— 谁能发起呼叫,应和会议中的治理边界同步设计。
101
+
102
+ ### ❌ NEVER
103
+
104
+ 1. **不要把 `acceptCall` 直接当成已经入会成功** —— 不补 `joinRoom`,用户仍不在真实会议上下文中。
105
+ 2. **不要只处理单设备单用户的理想路径** —— 取消、超时、其他设备已处理同样是主流程。
106
+ 3. **不要绕过角色权限直接暴露呼叫能力** —— 呼叫权应受成员治理和产品规则约束。
107
+
108
+ ## 代码示例
109
+ ### 呼叫链路:发起呼叫、接听并进入会议
110
+
111
+ ```ts
112
+ import { useRoomState, RoomEvent } from 'tuikit-atomicx-vue3/room';
113
+
114
+ const { callUserToRoom, acceptCall, joinRoom, subscribeEvent } = useRoomState();
115
+
116
+ await callUserToRoom({ roomId: 'demo_room', userIdList: ['user_002'], timeout: 60 });
117
+
118
+ subscribeEvent(RoomEvent.onCallReceived, async ({ roomInfo }) => {
119
+ await acceptCall({ roomId: roomInfo.roomId });
120
+ await joinRoom({
121
+ roomId: roomInfo.roomId,
122
+ roomType: roomInfo.roomType,
123
+ password: roomInfo.password || undefined,
124
+ });
125
+ });
126
+
127
+ subscribeEvent(RoomEvent.onCallTimeout, ({ roomInfo }) => {
128
+ // 收口呼叫弹层或本地呼叫中状态;超时本身不需要再 rejectCall。
129
+ console.info('room call timeout', roomInfo.roomId);
130
+ });
131
+ ```
132
+
133
+ ## 调用时序
134
+ ```
135
+ 【呼叫端】
136
+ 在会议中调用 callUserToRoom({ roomId, userIdList, timeout })
137
+
138
+
139
+ 被呼叫人收到 RoomEvent.onCallReceived
140
+
141
+ ├─ 接受 → acceptCall({ roomId }) → 由当前回调或外层生命周期继续 joinRoom({ roomId, roomType, password })
142
+ ├─ 拒绝 → rejectCall({ roomId })
143
+ ├─ 超时 → onCallTimeout 收口 UI
144
+ └─ 其他设备已处理 → onCallHandledByOtherDevice 收口 UI
145
+ ```
146
+
147
+ ## 平台特有注意事项
148
+ ### 1. `acceptCall()` 不等于已经进入会议
149
+ 接受呼叫只是信令确认;真正进入房间仍需要继续调用 `joinRoom()`。业务可以在 `acceptCall({ roomId })` 后通过自定义回调把 `roomId`、`password`、`roomType` 交给外层入会流程,也可以在同一个事件回调里直接接续 `joinRoom()`。关键是不要把 `acceptCall()` 本身当作"已经进房"。
150
+
151
+ ### 2. 呼叫弹层应统一监听取消、超时与多设备收口
152
+ 如果只处理收到呼叫和接受,不处理 `onCallCancelled`、`onCallTimeout`、`onCallHandledByOtherDevice`,呼叫 UI 很容易残留。
153
+
154
+ ### 3. `extensionInfo` 适合透传业务字段
155
+ 呼叫原因、来源场景、优先级、会议主题摘要等字段建议统一放在 `extensionInfo` 或业务补充结构中,而不是在 UI 层硬编码。
156
+
157
+ ## 代码生成约束
158
+ ### 编译必要条件
159
+ - **通用条件**:见 [login-auth 平台 slice](login-auth.md)。
160
+ - **额外导入**:至少需要导入 `useRoomState`;如需事件监听,还需导入 `RoomEvent`。
161
+ - **运行前提**:当前用户已在会中,且被邀请方具备有效登录态。
162
+
163
+ ### 生成规则
164
+ #### MUST(生成时必须包含)
165
+
166
+ 1. **把呼叫确认与真正入会拆成两个阶段** — 才能正确覆盖呼叫确认与实际进房。两阶段可以在同一个回调内串联,也可以通过自定义回调 / 外层生命周期衔接。
167
+ **Verify**: 检查是否存在 `acceptCall(`,且接受后有继续触发 `joinRoom({ roomId, roomType, password })` 或等价入会流程。
168
+ 2. **在常驻层监听呼叫事件并收口状态** — 任何页面都应能响应呼叫。
169
+ **Verify**: 检查是否存在 `subscribeEvent(RoomEvent.onCallReceived, ...)` 或等价监听逻辑。
170
+
171
+ #### MUST NOT(生成时绝不能出现)
172
+
173
+ 1. **不要把 `acceptCall()` 当作最终进房动作** — 会造成"已接听但未进房"的悬空状态。
174
+ 2. **不要忽略取消、超时和多设备处理事件** — 呼叫弹窗容易残留。
175
+ **Verify**: 检查是否存在对应事件或兜底清理说明。
176
+
177
+ ### 集成检查点
178
+ - 当前 slice 常与 `conference/room-lifecycle`、`conference/participant-management` 联动。
179
+ - 集成通常表现为会中呼叫弹层和常驻呼叫监听组件。
180
+ - 若业务侧还有站内信或电话提醒,需要明确多种通知渠道之间的优先级和收口策略。
181
+
182
+ ## 验证矩阵
183
+ | 层级 | 检查项 | 验证手段 | 预期结果 |
184
+ |------|--------|----------|---------|
185
+ | 1. 编译级 | 已导入 `useRoomState` 与 `RoomEvent` | 检查 `import` 语句 | 呼叫相关 API 与事件可解析 |
186
+ | 2. 静态规则级 | 接受呼叫后继续进房 | 搜索 `acceptCall` 与 `joinRoom` 或外层入会回调 | 存在两阶段链路 |
187
+ | 3. 运行时级 | 收到呼叫后可接受并进入会议 | 双账号联调呼叫流程 | 接收端可成功进房 |
188
+ | 4. 业务行为级 | 取消 / 超时 / 多设备处理时 UI 正确收口 | 模拟各种呼叫结果 | 呼叫弹层不会残留 |
189
+
190
+ ## 排障指南
191
+
192
+ ### 常见问题
193
+
194
+ | 问题 | 表现 | 处理建议 |
195
+ |------|------|----------|
196
+ | 接受呼叫后未真正入会 | 用户点击接受,但页面没有进入会议 | 检查是否在接受呼叫后继续衔接 `joinRoom` 主链路 |
197
+ | 呼叫通知收不到 | 房外用户在线,但没有弹出呼叫提示 | 检查呼叫监听是否放在常驻位置,避免页面切换后监听被释放 |
198
+ | 多设备状态不一致 | 一台设备已接受,另一台仍显示待处理 | 检查是否处理了“其他设备已处理”这类收口事件 |
199
+
200
+ ### 排障流程
201
+
202
+ ```text
203
+ 发现 会中呼叫 相关问题
204
+ ├── 第 1 步:确认问题属于呼叫信令链路,而不是房间生命周期本身
205
+ ├── 第 2 步:检查呼叫监听是否常驻,并能接收接受、拒绝、超时、取消等结果
206
+ ├── 第 3 步:确认 acceptCall 之后是否继续触发 joinRoom,完成真实入会
207
+ └── 第 4 步:若仍异常,再回查 room-lifecycle / participant-management / participant-list 的衔接是否正确```
208
+
209
+ ## 关联知识
210
+
211
+ - **[conference/room-lifecycle](room-lifecycle.md)** —— 呼叫接受后,真正的入会仍由房间生命周期承接。
212
+ - **[conference/participant-management](participant-management.md)** —— 谁有权发起呼叫,通常受会议角色治理约束。
213
+ - **[conference/participant-list](participant-list.md)** —— 被呼叫人真正进房后,才会进入成员列表读模型。