@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,270 @@
1
+ <template>
2
+ <div class="h-full flex flex-col bg-white">
3
+ <div class="p-6 border-b border-gray-100 shrink-0">
4
+ <div class="flex items-center justify-between mb-4">
5
+ <div>
6
+ <h3 class="font-semibold text-gray-900 flex items-center gap-2">
7
+ <FileText :size="20" class="text-[#0D9488]" />
8
+ {{ t('Medical.Business.RecordTab') }}
9
+ </h3>
10
+ <p class="text-xs text-gray-500 mt-1">
11
+ {{ t('Medical.Record.ReplaceDesc') }}
12
+ </p>
13
+ </div>
14
+ <span
15
+ class="px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-700"
16
+ >
17
+ {{ t('Medical.Record.SlotExample') }}
18
+ </span>
19
+ </div>
20
+
21
+ <div class="bg-[#F1F5F9] rounded-xl p-3 text-sm">
22
+ <div class="flex items-center justify-between">
23
+ <span class="text-gray-600">
24
+ {{ t('Medical.Record.PatientLabel') }}
25
+ <span class="font-medium text-gray-900 ml-1">
26
+ {{ patientInfo.name }} ·
27
+ {{ t('Medical.Consultation.PatientAge', { gender: patientInfo.gender, age: patientInfo.age }) }}
28
+ </span>
29
+ </span>
30
+ </div>
31
+ </div>
32
+ </div>
33
+
34
+ <div class="flex-1 overflow-y-auto px-6 py-6 space-y-6 custom-scrollbar">
35
+ <div>
36
+ <label class="block text-sm font-medium text-gray-700 mb-2">
37
+ {{ t('Medical.Consultation.ChiefComplaint') }} <span class="text-red-500">*</span>
38
+ </label>
39
+ <textarea
40
+ v-model="formData.chiefComplaint"
41
+ :placeholder="t('Medical.Record.ChiefComplaintPlaceholder')"
42
+ rows="3"
43
+ class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none focus:ring-2 focus:ring-[#0D9488]/20 resize-none"
44
+ ></textarea>
45
+ </div>
46
+
47
+ <div>
48
+ <label class="block text-sm font-medium text-gray-700 mb-2">
49
+ {{ t('Medical.Record.PresentIllness') }} <span class="text-red-500">*</span>
50
+ </label>
51
+ <textarea
52
+ v-model="formData.presentIllness"
53
+ :placeholder="t('Medical.Record.PresentIllnessPlaceholder')"
54
+ rows="4"
55
+ class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none focus:ring-2 focus:ring-[#0D9488]/20 resize-none"
56
+ ></textarea>
57
+ </div>
58
+
59
+ <div>
60
+ <label class="block text-sm font-medium text-gray-700 mb-2">{{ t('Medical.Record.PastHistory') }}</label>
61
+ <textarea
62
+ v-model="formData.pastHistory"
63
+ :placeholder="t('Medical.Record.PastHistoryPlaceholder')"
64
+ rows="2"
65
+ class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none focus:ring-2 focus:ring-[#0D9488]/20 resize-none"
66
+ ></textarea>
67
+ </div>
68
+
69
+ <div>
70
+ <label class="block text-sm font-medium text-gray-700 mb-2">
71
+ {{ t('Medical.Consultation.AllergyHistory') }} <span class="text-red-500">*</span>
72
+ </label>
73
+ <input
74
+ v-model="formData.allergyHistory"
75
+ type="text"
76
+ :placeholder="t('Medical.Record.AllergyPlaceholder')"
77
+ class="w-full h-11 px-4 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none focus:ring-2 focus:ring-[#0D9488]/20"
78
+ />
79
+ </div>
80
+
81
+ <div>
82
+ <label class="block text-sm font-medium text-gray-700 mb-2">{{ t('Medical.Record.PhysicalExam') }}</label>
83
+ <div class="grid grid-cols-2 gap-3">
84
+ <div>
85
+ <label class="text-xs text-gray-600 mb-1 block">{{ t('Medical.Record.Temperature') }}</label>
86
+ <input
87
+ v-model="formData.temperature"
88
+ type="text"
89
+ placeholder="36.5"
90
+ class="w-full h-9 px-3 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none text-sm"
91
+ />
92
+ </div>
93
+ <div>
94
+ <label class="text-xs text-gray-600 mb-1 block">{{ t('Medical.Record.Pulse') }}</label>
95
+ <input
96
+ v-model="formData.pulse"
97
+ type="text"
98
+ placeholder="75"
99
+ class="w-full h-9 px-3 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none text-sm"
100
+ />
101
+ </div>
102
+ <div>
103
+ <label class="text-xs text-gray-600 mb-1 block">{{ t('Medical.Record.BloodPressure') }}</label>
104
+ <input
105
+ v-model="formData.bloodPressure"
106
+ type="text"
107
+ placeholder="120/80"
108
+ class="w-full h-9 px-3 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none text-sm"
109
+ />
110
+ </div>
111
+ <div>
112
+ <label class="text-xs text-gray-600 mb-1 block">{{ t('Medical.Record.Respiration') }}</label>
113
+ <input
114
+ v-model="formData.respiration"
115
+ type="text"
116
+ placeholder="18"
117
+ class="w-full h-9 px-3 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none text-sm"
118
+ />
119
+ </div>
120
+ </div>
121
+ </div>
122
+
123
+ <div>
124
+ <label class="block text-sm font-medium text-gray-700 mb-2">{{ t('Medical.Record.AuxiliaryExam') }}</label>
125
+ <textarea
126
+ v-model="formData.auxiliaryExam"
127
+ :placeholder="t('Medical.Record.AuxiliaryExamPlaceholder')"
128
+ rows="3"
129
+ class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none focus:ring-2 focus:ring-[#0D9488]/20 resize-none"
130
+ ></textarea>
131
+ </div>
132
+
133
+ <div>
134
+ <label class="block text-sm font-medium text-gray-700 mb-2">
135
+ {{ t('Medical.Record.InitialDiagnosis') }} <span class="text-red-500">*</span>
136
+ </label>
137
+ <div class="space-y-2">
138
+ <input
139
+ v-model="formData.diagnosis"
140
+ type="text"
141
+ :placeholder="t('Medical.Record.DiagnosisPlaceholder')"
142
+ class="w-full h-11 px-4 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none focus:ring-2 focus:ring-[#0D9488]/20"
143
+ />
144
+ <button
145
+ class="text-sm text-[#0D9488] hover:text-[#0F766E] flex items-center gap-1"
146
+ >
147
+ <Search :size="14" />
148
+ {{ t('Medical.Record.ICD10') }}
149
+ </button>
150
+ </div>
151
+ </div>
152
+
153
+ <div>
154
+ <label class="block text-sm font-medium text-gray-700 mb-2">
155
+ {{ t('Medical.Record.Treatment') }} <span class="text-red-500">*</span>
156
+ </label>
157
+ <textarea
158
+ v-model="formData.treatment"
159
+ :placeholder="t('Medical.Record.TreatmentPlaceholder')"
160
+ rows="3"
161
+ class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-[#0D9488] focus:outline-none focus:ring-2 focus:ring-[#0D9488]/20 resize-none"
162
+ ></textarea>
163
+ </div>
164
+
165
+ <div>
166
+ <label class="block text-sm font-medium text-gray-700 mb-2">{{ t('Medical.Record.FollowUp') }}</label>
167
+ <div class="grid grid-cols-2 gap-3">
168
+ <button
169
+ v-for="option in followUpOptions"
170
+ :key="option"
171
+ @click="formData.followUp = option"
172
+ :class="[
173
+ 'px-4 py-2.5 rounded-xl border text-sm font-medium transition-all',
174
+ formData.followUp === option
175
+ ? 'border-[#0D9488] bg-[#0D9488]/5 text-[#0D9488]'
176
+ : 'border-gray-200 text-gray-700 hover:border-gray-300',
177
+ ]"
178
+ >
179
+ {{ option }}
180
+ </button>
181
+ </div>
182
+ </div>
183
+ </div>
184
+
185
+ <div class="p-6 border-t border-gray-100 shrink-0 bg-gray-50">
186
+ <div class="flex gap-3 mb-3">
187
+ <button
188
+ @click="handleSave"
189
+ class="flex-1 bg-[#0D9488] hover:bg-[#0F766E] text-white rounded-xl h-11 font-medium flex items-center justify-center gap-2 transition-colors"
190
+ >
191
+ <Save :size="16" />
192
+ {{ t('Medical.Record.SubmitDemo') }}
193
+ </button>
194
+ <button
195
+ class="px-4 py-2.5 border border-gray-200 rounded-xl hover:bg-gray-50 transition-colors"
196
+ >
197
+ {{ t('Medical.Record.Preview') }}
198
+ </button>
199
+ </div>
200
+ <div class="flex items-start gap-2 text-xs text-gray-500">
201
+ <CheckCircle2 :size="12" class="mt-0.5 shrink-0" />
202
+ <p>{{ t('Medical.Record.FooterTip') }}</p>
203
+ </div>
204
+ </div>
205
+ </div>
206
+ </template>
207
+
208
+ <script setup lang="ts">
209
+ import { ref } from 'vue';
210
+ import { useUIKit } from '@tencentcloud/uikit-base-component-vue3';
211
+ import { FileText, Search, Save, CheckCircle2 } from '@/shared/icons';
212
+
213
+ interface PatientInfo {
214
+ name: string;
215
+ age: number;
216
+ gender: string;
217
+ allergy_history?: string;
218
+ }
219
+
220
+ interface MedicalRecordPayload {
221
+ chiefComplaint: string;
222
+ presentIllness: string;
223
+ pastHistory: string;
224
+ allergyHistory: string;
225
+ temperature: string;
226
+ pulse: string;
227
+ bloodPressure: string;
228
+ respiration: string;
229
+ auxiliaryExam: string;
230
+ diagnosis: string;
231
+ treatment: string;
232
+ followUp: string;
233
+ }
234
+
235
+ defineProps<{
236
+ patientInfo: PatientInfo;
237
+ }>();
238
+ const { t } = useUIKit();
239
+
240
+ const emit = defineEmits<{
241
+ save: [payload: MedicalRecordPayload];
242
+ }>();
243
+
244
+ const formData = ref<MedicalRecordPayload>({
245
+ chiefComplaint: '',
246
+ presentIllness: '',
247
+ pastHistory: '',
248
+ allergyHistory: '',
249
+ temperature: '',
250
+ pulse: '',
251
+ bloodPressure: '',
252
+ respiration: '',
253
+ auxiliaryExam: '',
254
+ diagnosis: '',
255
+ treatment: '',
256
+ followUp: '',
257
+ });
258
+
259
+ const followUpOptions = [
260
+ t('Medical.Record.Option3Days'),
261
+ t('Medical.Record.Option1Week'),
262
+ t('Medical.Record.Option2Weeks'),
263
+ t('Medical.Record.Option1Month'),
264
+ ];
265
+
266
+ const handleSave = () => {
267
+ emit('save', { ...formData.value });
268
+ window.alert(t('Medical.Record.SaveAlert'));
269
+ };
270
+ </script>
@@ -0,0 +1,363 @@
1
+ <template>
2
+ <div class="h-full flex flex-col bg-white">
3
+ <div class="p-6 border-b border-gray-100 shrink-0">
4
+ <div class="flex items-center justify-between mb-4">
5
+ <div>
6
+ <h3 class="font-semibold text-gray-900 flex items-center gap-2">
7
+ <Pill :size="20" class="text-[#0D9488]" />
8
+ {{ t('Medical.Prescription.Title') }}
9
+ </h3>
10
+ <p class="text-xs text-gray-500 mt-1">
11
+ {{ t('Medical.Prescription.Description') }}
12
+ </p>
13
+ </div>
14
+ <span
15
+ class="px-3 py-1 rounded-full text-xs font-medium bg-blue-100 text-blue-700"
16
+ >
17
+ {{ t('Medical.Record.SlotExample') }}
18
+ </span>
19
+ </div>
20
+
21
+ <div class="bg-[#F1F5F9] rounded-xl p-3 text-sm">
22
+ <div class="flex items-center justify-between">
23
+ <span class="text-gray-600">
24
+ {{ t('Medical.Record.PatientLabel') }}
25
+ <span class="font-medium text-gray-900 ml-1">
26
+ {{ patientInfo.name }} ·
27
+ {{ t('Medical.DoctorDashboard.PatientAge', {
28
+ gender: patientInfo.gender,
29
+ age: patientInfo.age,
30
+ }) }}
31
+ </span>
32
+ </span>
33
+ </div>
34
+ </div>
35
+
36
+ <div
37
+ v-if="patientInfo.allergy_history"
38
+ class="mt-3 bg-red-50 border border-red-200 rounded-xl p-3 flex items-start gap-2"
39
+ >
40
+ <ShieldAlert :size="16" class="text-red-600 mt-0.5 shrink-0" />
41
+ <div>
42
+ <p class="text-xs font-medium text-red-900">
43
+ {{ t('Medical.Prescription.AllergyWarning') }}
44
+ </p>
45
+ <p class="text-xs text-red-700 mt-0.5">
46
+ {{ patientInfo.allergy_history }}
47
+ </p>
48
+ </div>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="px-6 py-4 border-b border-gray-100 bg-gray-50 shrink-0">
53
+ <label class="text-gray-700 text-xs mb-2 block font-medium">
54
+ {{ t('Medical.Prescription.Diagnosis') }}
55
+ </label>
56
+ <div class="flex gap-2">
57
+ <input
58
+ v-model="diagnosisCode"
59
+ :placeholder="t('Medical.Prescription.DiagnosisPlaceholder')"
60
+ class="flex-1 rounded-xl border border-gray-200 text-sm h-10 px-4 focus:border-[#0D9488] focus:outline-none focus:ring-2 focus:ring-[#0D9488]/20"
61
+ />
62
+ <button
63
+ class="px-4 py-2 border border-gray-200 rounded-xl text-sm hover:bg-gray-100 transition-colors shrink-0"
64
+ >
65
+ ICD-10
66
+ </button>
67
+ </div>
68
+ </div>
69
+
70
+ <div class="flex-1 overflow-y-auto custom-scrollbar">
71
+ <div class="p-6 space-y-4">
72
+ <div
73
+ v-for="(medicine, index) in medicines"
74
+ :key="medicine.id"
75
+ class="p-5 border border-gray-200 rounded-2xl shadow-sm hover:shadow-lg hover:border-[#0D9488]/30 transition-all duration-200 bg-white group"
76
+ >
77
+ <div class="flex items-start justify-between mb-4">
78
+ <span
79
+ class="text-xs bg-gradient-to-r from-[#0D9488]/10 to-[#0F766E]/10 text-[#0D9488] border border-[#0D9488]/20 px-3 py-1 rounded-full"
80
+ >
81
+ {{ t('Medical.Prescription.MedicineIndex', { index: index + 1 }) }}
82
+ </span>
83
+ <button
84
+ @click="removeMedicine(medicine.id)"
85
+ class="h-8 w-8 rounded-lg text-gray-400 hover:text-red-600 hover:bg-red-50 transition-all opacity-0 group-hover:opacity-100 flex items-center justify-center"
86
+ >
87
+ <Trash2 :size="16" />
88
+ </button>
89
+ </div>
90
+
91
+ <div class="space-y-3">
92
+ <div>
93
+ <label class="text-xs text-gray-600 mb-1 block">
94
+ {{ t('Medical.Prescription.MedicineName') }}
95
+ </label>
96
+ <input
97
+ v-model="medicine.name"
98
+ :placeholder="t('Medical.Prescription.MedicineNamePlaceholder')"
99
+ class="w-full rounded-xl border border-gray-200 text-sm h-9 px-3 focus:border-[#0D9488] focus:outline-none"
100
+ />
101
+ </div>
102
+
103
+ <div>
104
+ <label class="text-xs text-gray-600 mb-1 block">
105
+ {{ t('Medical.Prescription.Spec') }}
106
+ </label>
107
+ <input
108
+ v-model="medicine.spec"
109
+ :placeholder="t('Medical.Prescription.SpecPlaceholder')"
110
+ class="w-full rounded-xl border border-gray-200 text-sm h-9 px-3 focus:border-[#0D9488] focus:outline-none"
111
+ />
112
+ </div>
113
+
114
+ <div class="grid grid-cols-2 gap-2">
115
+ <div>
116
+ <label class="text-xs text-gray-600 mb-1 block">
117
+ {{ t('Medical.Prescription.Dosage') }}
118
+ </label>
119
+ <input
120
+ v-model="medicine.dosage"
121
+ :placeholder="t('Medical.Prescription.DosagePlaceholder')"
122
+ class="w-full rounded-xl border border-gray-200 text-sm h-9 px-3 focus:border-[#0D9488] focus:outline-none"
123
+ />
124
+ </div>
125
+ <div>
126
+ <label class="text-xs text-gray-600 mb-1 block">
127
+ {{ t('Medical.Prescription.Frequency') }}
128
+ </label>
129
+ <select
130
+ v-model="medicine.frequency"
131
+ class="w-full rounded-xl border border-gray-200 text-sm h-9 px-3 focus:border-[#0D9488] focus:outline-none"
132
+ >
133
+ <option value="qd">{{ t('Medical.Prescription.QD') }}</option>
134
+ <option value="bid">{{ t('Medical.Prescription.BID') }}</option>
135
+ <option value="tid">{{ t('Medical.Prescription.TID') }}</option>
136
+ <option value="qid">{{ t('Medical.Prescription.QID') }}</option>
137
+ <option value="qn">{{ t('Medical.Prescription.QN') }}</option>
138
+ </select>
139
+ </div>
140
+ </div>
141
+
142
+ <div class="grid grid-cols-2 gap-2">
143
+ <div>
144
+ <label class="text-xs text-gray-600 mb-1 block">
145
+ {{ t('Medical.Prescription.DurationDays') }}
146
+ </label>
147
+ <input
148
+ v-model="medicine.duration"
149
+ type="number"
150
+ :placeholder="t('Medical.Prescription.DayPlaceholder')"
151
+ class="w-full rounded-xl border border-gray-200 text-sm h-9 px-3 focus:border-[#0D9488] focus:outline-none"
152
+ />
153
+ </div>
154
+ <div>
155
+ <label class="text-xs text-gray-600 mb-1 block">
156
+ {{ t('Medical.Prescription.Quantity') }}
157
+ </label>
158
+ <input
159
+ v-model="medicine.quantity"
160
+ :placeholder="t('Medical.Prescription.AutoCalculate')"
161
+ class="w-full rounded-xl border border-gray-200 text-sm h-9 px-3 focus:border-[#0D9488] focus:outline-none"
162
+ />
163
+ </div>
164
+ </div>
165
+
166
+ <div>
167
+ <label class="text-xs text-gray-600 mb-1 block">
168
+ {{ t('Medical.Prescription.Usage') }}
169
+ </label>
170
+ <select
171
+ v-model="medicine.usage"
172
+ class="w-full rounded-xl border border-gray-200 text-sm h-9 px-3 focus:border-[#0D9488] focus:outline-none"
173
+ >
174
+ <option value="oral">{{ t('Medical.Prescription.Oral') }}</option>
175
+ <option value="external">{{ t('Medical.Prescription.External') }}</option>
176
+ <option value="injection">{{ t('Medical.Prescription.Injection') }}</option>
177
+ <option value="nebulization">{{ t('Medical.Prescription.Nebulization') }}</option>
178
+ </select>
179
+ </div>
180
+ </div>
181
+ </div>
182
+
183
+ <button
184
+ @click="addMedicine"
185
+ class="w-full rounded-xl border-dashed border-2 border-gray-300 h-12 gap-2 hover:border-[#0D9488] hover:text-[#0D9488] transition-colors flex items-center justify-center font-medium text-sm text-gray-600"
186
+ >
187
+ <Plus :size="16" />
188
+ {{ t('Medical.Prescription.AddMedicine') }}
189
+ </button>
190
+
191
+ <div v-if="medicines.length === 0" class="mt-6">
192
+ <label class="text-gray-700 text-sm mb-3 block font-medium">
193
+ {{ t('Medical.Prescription.CommonMedicines') }}
194
+ </label>
195
+ <div class="grid grid-cols-1 gap-2">
196
+ <button
197
+ v-for="(med, index) in commonMedicines"
198
+ :key="index"
199
+ @click="addCommonMedicine(med)"
200
+ class="justify-start rounded-xl h-auto py-3 px-4 border border-gray-200 hover:border-[#0D9488] hover:bg-[#0D9488]/5 transition-all text-left"
201
+ >
202
+ <p class="text-sm font-medium">{{ med.name }}</p>
203
+ <p class="text-xs text-gray-500">
204
+ {{ med.spec }} · {{ med.category }}
205
+ </p>
206
+ </button>
207
+ </div>
208
+ </div>
209
+
210
+ <div
211
+ v-if="medicines.length > 0"
212
+ class="p-4 bg-blue-50 border border-blue-200 rounded-2xl"
213
+ >
214
+ <h4
215
+ class="font-medium text-blue-900 mb-2 text-sm flex items-center gap-2"
216
+ >
217
+ <AlertCircle :size="16" />
218
+ {{ t('Medical.Prescription.Guidance') }}
219
+ </h4>
220
+ <ul class="text-xs text-blue-800 space-y-1">
221
+ <li>• {{ t('Medical.Prescription.Guidance1') }}</li>
222
+ <li>• {{ t('Medical.Prescription.Guidance2') }}</li>
223
+ <li>• {{ t('Medical.Prescription.Guidance3') }}</li>
224
+ </ul>
225
+ </div>
226
+ </div>
227
+ </div>
228
+
229
+ <div class="p-6 border-t border-gray-100 shrink-0 bg-gray-50">
230
+ <div class="flex gap-3 mb-3">
231
+ <button
232
+ @click="handleIssuePrescription"
233
+ :disabled="medicines.length === 0 || !diagnosisCode"
234
+ class="flex-1 bg-[#0D9488] hover:bg-[#0F766E] text-white rounded-xl h-11 gap-2 disabled:opacity-50 disabled:cursor-not-allowed font-medium flex items-center justify-center transition-colors"
235
+ >
236
+ <FileText :size="16" />
237
+ {{ t('Medical.Record.SubmitDemo') }}
238
+ </button>
239
+ <button
240
+ class="px-4 py-2.5 border border-gray-200 rounded-xl hover:bg-gray-50 transition-colors"
241
+ >
242
+ {{ t('Medical.Record.Preview') }}
243
+ </button>
244
+ </div>
245
+ <div class="flex items-start gap-2 text-xs text-gray-500">
246
+ <CheckCircle2 :size="12" class="mt-0.5 shrink-0" />
247
+ <p>{{ t('Medical.Prescription.FooterTip') }}</p>
248
+ </div>
249
+ </div>
250
+ </div>
251
+ </template>
252
+
253
+ <script setup lang="ts">
254
+ import { computed, ref } from 'vue';
255
+ import { useUIKit } from '@tencentcloud/uikit-base-component-vue3';
256
+ import {
257
+ Pill,
258
+ ShieldAlert,
259
+ Plus,
260
+ Trash2,
261
+ AlertCircle,
262
+ FileText,
263
+ CheckCircle2,
264
+ } from '@/shared/icons';
265
+
266
+ interface PatientInfo {
267
+ name: string;
268
+ age: number;
269
+ gender: string;
270
+ allergy_history?: string;
271
+ }
272
+
273
+ interface Medicine {
274
+ id: string;
275
+ name: string;
276
+ spec: string;
277
+ dosage: string;
278
+ frequency: string;
279
+ duration: string;
280
+ quantity: string;
281
+ usage: string;
282
+ }
283
+
284
+ defineProps<{
285
+ patientInfo: PatientInfo;
286
+ }>();
287
+ const { t } = useUIKit();
288
+
289
+ const emit = defineEmits<{
290
+ submit: [
291
+ payload: {
292
+ diagnosisCode: string;
293
+ medicines: Medicine[];
294
+ },
295
+ ];
296
+ }>();
297
+
298
+ const medicines = ref<Medicine[]>([]);
299
+ const diagnosisCode = ref('');
300
+
301
+ const commonMedicines = computed(() => [
302
+ {
303
+ name: t('Medical.Prescription.Amoxicillin'),
304
+ spec: t('Medical.Prescription.AmoxicillinSpec'),
305
+ category: t('Medical.Prescription.Antibiotic'),
306
+ },
307
+ {
308
+ name: t('Medical.Prescription.Ibuprofen'),
309
+ spec: t('Medical.Prescription.IbuprofenSpec'),
310
+ category: t('Medical.Prescription.Antipyretic'),
311
+ },
312
+ {
313
+ name: t('Medical.Prescription.Ambroxol'),
314
+ spec: t('Medical.Prescription.AmbroxolSpec'),
315
+ category: t('Medical.Prescription.Expectorant'),
316
+ },
317
+ {
318
+ name: t('Medical.Prescription.Montmorillonite'),
319
+ spec: t('Medical.Prescription.MontmorilloniteSpec'),
320
+ category: t('Medical.Prescription.Antidiarrheal'),
321
+ },
322
+ ]);
323
+
324
+ const addMedicine = () => {
325
+ const newMedicine: Medicine = {
326
+ id: Date.now().toString(),
327
+ name: '',
328
+ spec: '',
329
+ dosage: '',
330
+ frequency: 'tid',
331
+ duration: '7',
332
+ quantity: '',
333
+ usage: 'oral',
334
+ };
335
+ medicines.value.push(newMedicine);
336
+ };
337
+
338
+ const addCommonMedicine = (med: (typeof commonMedicines.value)[number]) => {
339
+ const newMedicine: Medicine = {
340
+ id: Date.now().toString(),
341
+ name: med.name,
342
+ spec: med.spec,
343
+ dosage: t('Medical.Prescription.DosageOneCapsule'),
344
+ frequency: 'tid',
345
+ duration: '7',
346
+ quantity: t('Medical.Prescription.Quantity21'),
347
+ usage: 'oral',
348
+ };
349
+ medicines.value.push(newMedicine);
350
+ };
351
+
352
+ const removeMedicine = (id: string) => {
353
+ medicines.value = medicines.value.filter(item => item.id !== id);
354
+ };
355
+
356
+ const handleIssuePrescription = () => {
357
+ emit('submit', {
358
+ diagnosisCode: diagnosisCode.value,
359
+ medicines: medicines.value.map(item => ({ ...item })),
360
+ });
361
+ window.alert(t('Medical.Prescription.SubmitAlert'));
362
+ };
363
+ </script>
@@ -0,0 +1,29 @@
1
+ import { medicalT } from '@/i18n/medicalTranslate';
2
+ import LibGenerateTestUserSig from './lib-generate-test-usersig-es.min';
3
+
4
+ export const SDKAPPID = 0;
5
+ export const SDKSECRETKEY = '';
6
+ export const EXPIRETIME = 604800;
7
+
8
+ export function assertBasicInfoConfigured() {
9
+ if (!Number(SDKAPPID) || !String(SDKSECRETKEY).trim()) {
10
+ throw new Error(
11
+ medicalT('Medical.Config.SDKConfigErrorWithUserSig')
12
+ );
13
+ }
14
+ }
15
+
16
+ export function getBasicInfo(userId: string) {
17
+ assertBasicInfoConfigured();
18
+ const generator = new LibGenerateTestUserSig(
19
+ SDKAPPID,
20
+ SDKSECRETKEY,
21
+ EXPIRETIME
22
+ );
23
+ return {
24
+ sdkAppId: SDKAPPID,
25
+ userId,
26
+ userSig: generator.genTestUserSig(userId),
27
+ scene: 5001,
28
+ };
29
+ }
@@ -0,0 +1,4 @@
1
+ export default class LibGenerateTestUserSig {
2
+ constructor(sdkAppId: number, secretKey: string, expireTime: number);
3
+ genTestUserSig(userId: string): string;
4
+ }