@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,247 @@
1
+ ---
2
+ id: live/login-auth
3
+ platform: ios
4
+ ---
5
+
6
+ # 登录与鉴权 — iOS 实现
7
+
8
+ ## 前置条件
9
+
10
+ **依赖安装(Podfile)**
11
+ ```ruby
12
+ pod 'AtomicXCore', '~> 4.0'
13
+ ```
14
+
15
+ **Info.plist 权限声明**(推流场景必须配置,否则 iOS 14+ 设备调用设备接口时崩溃)
16
+ ```xml
17
+ <key>NSCameraUsageDescription</key>
18
+ <string>需要访问摄像头以进行视频直播</string>
19
+ <key>NSMicrophoneUsageDescription</key>
20
+ <string>需要访问麦克风以进行语音直播</string>
21
+ ```
22
+
23
+ **最低系统要求**:iOS 13.0+,Xcode 14.0+
24
+
25
+ ## API 调用(真实签名)
26
+
27
+ ```swift
28
+ // 登录
29
+ LoginStore.shared.login(
30
+ sdkAppID: Int32, // ⚠️ Int32,不是 Int
31
+ userID: String,
32
+ userSig: String,
33
+ completion: CompletionClosure? // (Result<Void, ErrorInfo>) -> Void
34
+ )
35
+
36
+ // 登出
37
+ LoginStore.shared.logout(completion: CompletionClosure?)
38
+
39
+ // 更新用户资料
40
+ LoginStore.shared.setSelfInfo(userProfile: UserProfile, completion: CompletionClosure?)
41
+
42
+ // 状态订阅(Combine)
43
+ LoginStore.shared.state // StatePublisher<LoginState>
44
+ // LoginState.loginStatus: LoginStatus
45
+ // LoginState.loginUserInfo: UserProfile?
46
+
47
+ // 被动事件订阅
48
+ LoginStore.shared.loginEventPublisher // PassthroughSubject<LoginEvent, Never>
49
+ // LoginEvent.kickedOffline — 被踢下线
50
+ // LoginEvent.loginExpired — 登录票据过期
51
+ ```
52
+
53
+ **通用类型**
54
+ ```swift
55
+ typealias CompletionClosure = (Result<Void, ErrorInfo>) -> Void
56
+
57
+ struct ErrorInfo {
58
+ var code: Int
59
+ var message: String
60
+ }
61
+
62
+ enum LoginEvent {
63
+ case kickedOffline
64
+ case loginExpired
65
+ }
66
+ ```
67
+
68
+ | 参数 | 类型 | 说明 |
69
+ |------|------|------|
70
+ | `sdkAppID` | `Int32` | 腾讯云控制台的应用 ID(**Int32**,注意不是 Int) |
71
+ | `userID` | `String` | 用户唯一标识,ASCII 字母/数字/`-`/`_`,≤ 32 字节 |
72
+ | `userSig` | `String` | 后端签发的鉴权票据 |
73
+ | `completion` | `CompletionClosure?` | 异步回调 `(Result<Void, ErrorInfo>) -> Void`,在主线程返回 |
74
+
75
+ ## 代码示例
76
+
77
+ ```swift
78
+ import AtomicXCore
79
+ import Combine
80
+
81
+ // MARK: - 登录
82
+
83
+ func login(sdkAppID: Int32, // ⚠️ Int32
84
+ userID: String,
85
+ userSig: String) {
86
+ LoginStore.shared.login(sdkAppID: sdkAppID,
87
+ userID: userID,
88
+ userSig: userSig) { result in
89
+ switch result {
90
+ case .success:
91
+ print("[Login] 登录成功")
92
+ // 登录成功后可操作设备 / 进入房间
93
+
94
+ case .failure(let errorInfo):
95
+ // errorInfo 是 ErrorInfo 结构体,不是 Swift Error
96
+ print("[Login] 登录失败, code: \(errorInfo.code), msg: \(errorInfo.message)")
97
+ handleLoginError(errorInfo)
98
+ }
99
+ }
100
+ }
101
+
102
+ // MARK: - 登出
103
+
104
+ func logout() {
105
+ LoginStore.shared.logout { result in
106
+ switch result {
107
+ case .success:
108
+ print("[Login] 登出成功")
109
+ case .failure(let errorInfo):
110
+ print("[Login] 登出失败, code: \(errorInfo.code)")
111
+ }
112
+ }
113
+ }
114
+
115
+ // MARK: - 错误分类处理
116
+
117
+ func handleLoginError(_ errorInfo: ErrorInfo) {
118
+ switch errorInfo.code {
119
+ case -1000:
120
+ print("SDKAppID 不合法,请检查控制台配置")
121
+ case -1001:
122
+ print("UserSig 已过期或参数不合法,请重新获取")
123
+ default:
124
+ print("未知登录错误:\(errorInfo.code) - \(errorInfo.message)")
125
+ }
126
+ }
127
+
128
+ // MARK: - 被动事件监听(踢下线 / 票据过期)
129
+
130
+ var cancellables = Set<AnyCancellable>()
131
+
132
+ func subscribeLoginEvents() {
133
+ LoginStore.shared.loginEventPublisher
134
+ .receive(on: DispatchQueue.main)
135
+ .sink { event in
136
+ switch event {
137
+ case .kickedOffline:
138
+ print("[Login] 被踢下线,需重新登录")
139
+ // 引导用户重新登录
140
+
141
+ case .loginExpired:
142
+ print("[Login] 登录票据已过期,需刷新 UserSig 后重新登录")
143
+ // 从业务后端刷新 UserSig 后重新调用 login
144
+ }
145
+ }
146
+ .store(in: &cancellables)
147
+ }
148
+
149
+ // MARK: - 状态查询(通过 state 订阅)
150
+
151
+ func observeLoginState() {
152
+ LoginStore.shared.state
153
+ .receive(on: DispatchQueue.main)
154
+ .sink { loginState in
155
+ print("[Login] 状态: \(loginState.loginStatus)")
156
+ if let profile = loginState.loginUserInfo {
157
+ print("[Login] 当前用户: \(profile.userID)")
158
+ }
159
+ }
160
+ .store(in: &cancellables)
161
+ }
162
+ ```
163
+
164
+ **典型调用流程(从业务后端获取 UserSig 后登录)**:
165
+ ```swift
166
+ // Step 1: 从业务后端获取 UserSig(伪代码)
167
+ YourAPI.fetchUserSig(userID: "user_001") { userSig in
168
+ guard let userSig = userSig else { return }
169
+
170
+ // Step 2: 登录 SDK
171
+ // ⚠️ sdkAppID 必须传 Int32 字面量或显式转换
172
+ LoginStore.shared.login(sdkAppID: 1400000001,
173
+ userID: "user_001",
174
+ userSig: userSig) { result in
175
+ switch result {
176
+ case .success:
177
+ // Step 3: 登录成功后才可操作设备 / 进入房间
178
+ setupDevices()
179
+ case .failure(let errorInfo):
180
+ showAlert(message: "登录失败: \(errorInfo.message)")
181
+ }
182
+ }
183
+ }
184
+ ```
185
+
186
+ ## 调用时序
187
+
188
+ ```
189
+ App 启动
190
+
191
+
192
+ 从业务后端获取 UserSig
193
+
194
+ ├─ 失败 ──→ 展示网络错误,引导重试
195
+
196
+
197
+ LoginStore.shared.login(sdkAppID: Int32, userID:, userSig:)
198
+
199
+ ├─ .failure(errorInfo)
200
+ │ ├─ code -1000 → 核查 SDKAppID(Int32)
201
+ │ ├─ code -1001 → 检查 UserSig 有效期 / UserID 格式
202
+ │ └─ 其他 → 上报日志,提示用户
203
+
204
+ └─ .success
205
+
206
+
207
+ 订阅 loginEventPublisher(监听踢下线/过期)
208
+
209
+
210
+ 进入主功能流程
211
+ (设备初始化 / 进入房间 / 开始推流)
212
+ ```
213
+
214
+ ## 平台特有注意事项
215
+
216
+ ### 1. sdkAppID 类型必须是 Int32
217
+ Swift 类型推断会将整数字面量视为 `Int`。传入 `login()` 时若将 `Int` 变量隐式传递给 `Int32` 参数,编译器会报错:
218
+ ```swift
219
+ let appID: Int = 1400000001 // ❌ 编译错误:不能将 Int 赋值给 Int32
220
+ let appID: Int32 = 1400000001 // ✅ 正确
221
+ // 或直接传字面量(Swift 自动推断 Int32):
222
+ LoginStore.shared.login(sdkAppID: 1400000001, ...) // ✅ 字面量可自动匹配 Int32
223
+ ```
224
+
225
+ ### 2. ErrorInfo 是结构体,不是 Error 协议
226
+ SDK 回调返回的是 `ErrorInfo` 结构体,**不是** `Swift.Error`。不可将其强转为 `Error` 或使用 `localizedDescription`:
227
+ ```swift
228
+ case .failure(let errorInfo):
229
+ let code = errorInfo.code // ✅ 直接访问 .code
230
+ let msg = errorInfo.message // ✅ 直接访问 .message
231
+ // errorInfo.localizedDescription // ❌ 不存在此属性
232
+ ```
233
+
234
+ ### 3. Info.plist 权限缺失导致崩溃
235
+ iOS 14+ 系统在首次访问相机/麦克风时,若未在 `Info.plist` 中声明 `NSCameraUsageDescription` 或 `NSMicrophoneUsageDescription`,App **直接崩溃**(不返回错误码)。务必在集成 SDK 时同步添加权限描述。
236
+
237
+ ### 4. 进入后台后网络断连
238
+ App 切入后台超过约 30 秒后,iOS 系统可能中断 TCP 长连接,导致登录态失效并触发 `loginEventPublisher` 的 `.loginExpired` 事件。建议:
239
+ - 订阅 `UIApplication.willEnterForegroundNotification`
240
+ - 前台恢复时通过 `LoginStore.shared.state` 检查 `loginStatus`
241
+ - 如已失效,刷新 UserSig 后重新调用 `login`
242
+
243
+ ### 5. UserSig 刷新策略
244
+ UserSig 有有效期(建议后端配置 7 天),客户端应:
245
+ - 在签发时记录过期时间戳(`exp` 字段)
246
+ - App 启动或前台恢复时检查是否在有效期内
247
+ - 距离过期 ≤ 1 小时时主动向后端刷新,避免直播中途 UserSig 失效中断推流
@@ -0,0 +1,82 @@
1
+ ---
2
+ id: live/live-list
3
+ name: 直播列表
4
+ product: live
5
+ tags: [list, fetch, category, slide-play, LiveListStore]
6
+ platforms: [ios, android, web, flutter]
7
+ related: [live/audience-watch, live/login-auth]
8
+ ---
9
+
10
+ # 直播列表
11
+
12
+ ## 功能说明
13
+
14
+ `LiveListStore` 是负责查询直播间列表的全局单例,观众端通过它拉取当前正在开播的直播列表、支持分页加载与分类筛选,并可根据 `seatLayoutTemplateID` 区分语聊房(1–199)与视频直播(200–999)。
15
+
16
+ 核心入口:调用 `LiveListStore` 的 `fetchLiveList` 方法,传入分页游标(cursor)和拉取数量(count),通过成功/失败回调获取结果。
17
+
18
+ 拉取到列表后,将 `liveID` 传给 `LiveCoreView` 实现滑动播放。**每个列表 Cell 必须持有独立的 `LiveCoreView` 实例**,严禁跨 Cell 复用同一实例。
19
+
20
+ ## 核心概念
21
+
22
+ | 概念 | 说明 |
23
+ |------|------|
24
+ | **LiveListStore** | 全局单例,负责列表拉取与直播状态监听 |
25
+ | **LiveListState** | 当前状态快照;`liveList` 保存已拉取的 `LiveInfo` 列表,`currentLive` 保存正在观看的直播信息 |
26
+ | **LiveListEvent** | 异步事件;`onLiveEnded` 表示直播结束,`onKickedOutOfLive` 表示被移出直播间 |
27
+ | **LiveInfo** | 单条直播数据;含 `liveID`、`categoryList`、`seatLayoutTemplateID`、`metaData` 等字段 |
28
+ | **cursor** | 分页游标字符串;首次请求传空字符串 `""`,后续传上一次返回值;返回空字符串表示已到末页 |
29
+ | **count** | 单次拉取数量,推荐值 20,不宜超过 50 |
30
+ | **categoryList** | 直播分类标签数组,用于客户端筛选,不参与服务端过滤 |
31
+ | **seatLayoutTemplateID** | 房间类型标识;1–199 为语聊房,200–999 为视频直播 |
32
+
33
+ ## 最佳实践
34
+
35
+ ### ✅ ALWAYS
36
+
37
+ 1. **使用 cursor 分页加载** — 首次传 `""`, 每次成功回调后保存返回的新 cursor;当返回 cursor 为空字符串时停止加载更多。
38
+ 2. **每个滑动列表 Cell 持有独立 LiveCoreView** — 在列表 Cell 初始化时创建 `LiveCoreView` 并添加到视图层级,Cell 间绝不共享实例。
39
+ 3. **在 Cell 可见/不可见时管理播放生命周期** — Cell 可见时调用 `setLiveID` + 预加载,Cell 不可见时立即停止播放并释放资源,防止内存堆积。
40
+ 4. **客户端按 seatLayoutTemplateID 或 liveID 前缀过滤** — 服务端不按类型过滤,需在回调中对 `liveList` 做本地筛选再渲染。
41
+ 5. **订阅 LiveListEvent.onLiveEnded** — 直播结束时及时从列表中移除对应条目并刷新 UI,避免用户点击已结束的直播间。
42
+
43
+ ### ❌ NEVER
44
+
45
+ 1. **一次性拉取全部列表** — 直播间数量可能很大,无分页地全量请求会导致超时与内存压力。
46
+ 2. **复用同一个 LiveCoreView 给多个 Cell** — 内部状态不可共享,复用会导致画面撕裂、音频冲突或崩溃。
47
+ 3. **在列表页同时播放多路流** — 滑动列表场景下同时解码多路视频会大幅消耗 CPU/GPU,应确保任意时刻只有当前可见 Cell 在播放。
48
+ 4. **忽略 onKickedOutOfLive 事件** — 用户被踢出后若不处理,UI 会停留在空播放状态且无任何提示。
49
+
50
+ ## 排障指南
51
+
52
+ ### 常见错误码
53
+
54
+ | 错误码 | 描述 | 处理建议 |
55
+ |--------|------|----------|
56
+ | `-1002` | 未登录 | 确保 `LoginStore` 的 `login` 成功后再调用 `fetchLiveList` |
57
+ | 列表返回空 | 正常情况:当前无开播直播 | 展示"暂无直播"空态 UI;检查 categoryList 筛选条件是否过严 |
58
+ | 列表卡顿/内存增长 | Cell 复用时 LiveCoreView 未释放 | 在 Cell 不可见时调用停播接口;确认每个 Cell 使用独立实例 |
59
+
60
+ ### 排障流程
61
+
62
+ ```
63
+ fetchLiveList 拉不到数据
64
+ ├── 是否已登录? → 否 → 先完成 LoginStore.login
65
+ ├── cursor 是否正确传递? → 检查首次是否传 ""
66
+ ├── 网络是否可用? → 检查连接与防火墙
67
+ └── 返回空列表(非错误)→ 当前确实无开播直播,展示空态
68
+
69
+ 列表显示后滑动卡顿
70
+ ├── 检查每个 Cell 是否独立持有 LiveCoreView
71
+ ├── 检查 Cell 不可见时是否停播
72
+ └── 检查是否在主线程刷新 UI
73
+
74
+ 收到 onLiveEnded / onKickedOutOfLive 后 UI 无变化
75
+ └── 确认已订阅 LiveListEvent 并在回调中刷新列表
76
+ ```
77
+
78
+ ## 关联知识
79
+
80
+ - **[live/audience-watch](live/audience-watch.md)** — 从列表选中直播间后进房观看
81
+ - **[live/login-auth](live/login-auth.md)** — fetchLiveList 需登录态,必须先完成鉴权
82
+ - **[live/error-codes](live/error-codes.md)** — 完整错误码参考
@@ -0,0 +1,78 @@
1
+ ---
2
+ id: live/login-auth
3
+ name: 登录与鉴权
4
+ product: live
5
+ tags: [login, auth, SDKAppID, UserID, UserSig, LoginStore]
6
+ platforms: [ios, android, web, flutter]
7
+ related: [live/device-control, live/anchor-preview, live/audience-watch]
8
+ ---
9
+
10
+ # 登录与鉴权
11
+
12
+ ## 功能说明
13
+
14
+ `LoginStore` 是所有 Live 功能的前置依赖,负责完成 TRTC SDK 的初始化与用户身份鉴权。所有主播推流、观众拉流、连麦等能力均需在登录成功后才可调用。
15
+
16
+ 核心入口:调用 LoginStore 的 `login` 方法,传入 SDKAppID、UserID、UserSig,通过回调获取登录结果。
17
+
18
+ 登录成功后 LoginStore 作为全局单例持有会话状态,其他 Store(DeviceStore、RoomStore 等)依赖其登录态运行。
19
+
20
+ ## 核心概念
21
+
22
+ | 概念 | 说明 |
23
+ |------|------|
24
+ | **SDKAppID** | 腾讯云控制台创建应用后分配的唯一数字 ID,用于区分不同应用的流量与计费 |
25
+ | **UserID** | 业务侧自定义的用户唯一标识,仅允许 ASCII 字母、数字、连字符 `-`、下划线 `_`,长度 ≤ 32 字节 |
26
+ | **UserSig** | 由业务后端使用 SecretKey 签发的鉴权票据,具有有效期(建议 7 天),过期后需重新签发 |
27
+ | **LoginStore** | SDK 全局单例,持有登录态;登录成功后其他 Store 方可使用 |
28
+
29
+ ## 最佳实践
30
+
31
+ ### ✅ ALWAYS
32
+
33
+ 1. **在业务后端生成 UserSig** — 将 SDKSecretKey 保管在服务器端,客户端通过接口获取 UserSig,禁止在客户端直接使用 SecretKey 签发。
34
+ 2. **登录成功后才调用其他 API** — 在 `login` 的成功回调中再初始化 DeviceStore、进入房间等操作,避免因登录未完成导致 `-1002` 错误。
35
+ 3. **声明系统权限** — 推流场景需在各平台声明相机与麦克风权限(各平台方式不同 → 见平台文件),否则调用设备接口时会被系统拒绝或崩溃。
36
+ 4. **监听登录状态变化** — 注册登录状态变更回调,处理后台断连、UserSig 过期等场景,及时触发重新登录或 UI 提示。
37
+
38
+ ### ❌ NEVER
39
+
40
+ 1. **客户端硬编码 SecretKey** — 一旦 App 包被逆向,SecretKey 泄露将导致所有用户的 UserSig 可被伪造,造成安全事故。
41
+ 2. **使用过期 UserSig** — 过期票据会导致登录失败(`-1001`),需在签发时记录有效期并在到期前刷新。
42
+ 3. **忽略登录回调错误** — 失败回调必须处理,至少向用户展示提示并上报错误日志,不可静默忽略导致后续所有功能异常。
43
+
44
+ ## 排障指南
45
+
46
+ ### 常见错误码
47
+
48
+ | 错误码 | 描述 | 处理建议 |
49
+ |--------|------|----------|
50
+ | `-1000` | SDKAppID 未找到 / 不合法 | 核对控制台 App 列表中的 SDKAppID,确认传入类型为 `Int` |
51
+ | `-1001` | 参数不合法(含 UserSig 过期/格式错误) | 检查 UserID 是否包含非法字符;重新从后端获取最新 UserSig |
52
+ | `-1002` | 未登录,调用了需要登录态的 API | 确保在 `login` 成功回调后再调用其他接口 |
53
+
54
+ ### 排障流程
55
+
56
+ ```
57
+ 登录失败
58
+ ├── 错误码 -1000
59
+ │ ├── 检查 SDKAppID 是否与控制台一致
60
+ │ └── 确认 SDKAppID 类型为 Int(非 String)
61
+ ├── 错误码 -1001
62
+ │ ├── UserSig 是否已过期?→ 重新签发
63
+ │ ├── UserID 是否含非 ASCII 字符或超过 32 字节?→ 修正
64
+ │ └── UserSig 是否由正确 SDKAppID 对应的 SecretKey 签发?→ 核对
65
+ ├── 错误码 -1002(其他接口返回)
66
+ │ ├── 是否在 login 完成前调用了其他接口?→ 移入登录成功回调中
67
+ │ └── 登录态是否已失效(后台断连/UserSig 过期)?→ 重新登录
68
+ └── 其他
69
+ ├── 检查网络连通性(是否能访问 trtc.io)
70
+ └── 抓取完整 error.code + error.message 上报
71
+ ```
72
+
73
+ ## 关联知识
74
+
75
+ - **[live/device-control](live/device-control.md)** — 登录成功后初始化摄像头与麦克风
76
+ - **[live/anchor-preview](live/anchor-preview.md)** — 主播预览需先完成登录
77
+ - **[live/audience-watch](live/audience-watch.md)** — 观众观看流同样依赖登录态
78
+ - **[live/error-codes](live/error-codes.md)** — 完整错误码参考
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@tencent-rtc/trtc-agent-skills",
3
+ "version": "0.1.0",
4
+ "description": "Installer for the TRTC Agent Skills suite (Chat, Call, RTC Engine, Live, Conference) + knowledge base, with one-command MCP setup for Claude Code / Cursor / CodeBuddy / Codex.",
5
+ "bin": {
6
+ "trtc-agent-skills": "bin/cli.js"
7
+ },
8
+ "files": [
9
+ "bin/",
10
+ "skills/",
11
+ "knowledge-base/",
12
+ "README.md"
13
+ ],
14
+ "engines": {
15
+ "node": ">=16"
16
+ },
17
+ "keywords": [
18
+ "trtc",
19
+ "real-time-communication",
20
+ "video-conference",
21
+ "live-streaming",
22
+ "chat",
23
+ "webrtc",
24
+ "sdk-integration",
25
+ "ai-skill",
26
+ "mcp"
27
+ ],
28
+ "author": {
29
+ "name": "Tencent TRTC Team"
30
+ },
31
+ "homepage": "https://trtc.io",
32
+ "repository": "https://git.woa.com/jackyixue/trtc-ai-integration",
33
+ "license": "MIT"
34
+ }