pcm-agents 0.6.11 → 0.6.13
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.
- package/dist/cjs/error-event-J_ZWIqWF.js +33 -0
- package/dist/cjs/error-event-J_ZWIqWF.js.map +1 -0
- package/dist/cjs/{index-CvEfNyEj.js → index-CRlt8Nv6.js} +53 -3
- package/dist/cjs/index-CRlt8Nv6.js.map +1 -0
- package/dist/cjs/index-WNdOTXnX.js +11068 -0
- package/dist/cjs/index-WNdOTXnX.js.map +1 -0
- package/dist/cjs/index.cjs.js +2 -2
- package/dist/cjs/loader.cjs.js +3 -5
- package/dist/cjs/loader.cjs.js.map +1 -1
- package/dist/cjs/message.service-DGUsA-FY.js +135 -0
- package/dist/cjs/message.service-DGUsA-FY.js.map +1 -0
- package/dist/cjs/{pcm-1zhanshi-mnms-modal_17.cjs.entry.js → pcm-1zhanshi-mnms-modal_21.cjs.entry.js} +3276 -216
- package/dist/cjs/pcm-1zhanshi-mnms-modal_21.cjs.entry.js.map +1 -0
- package/dist/cjs/pcm-agents.cjs.js +4 -6
- package/dist/cjs/pcm-agents.cjs.js.map +1 -1
- package/dist/cjs/pcm-message.cjs.entry.js +3 -3
- package/dist/cjs/pcm-message.cjs.entry.js.map +1 -1
- package/dist/cjs/pcm-message.entry.cjs.js.map +1 -1
- package/dist/cjs/pcm-mnms-video-modal.cjs.entry.js +8 -8
- package/dist/cjs/pcm-mnms-video-modal.cjs.entry.js.map +1 -1
- package/dist/cjs/pcm-mnms-video-modal.entry.cjs.js.map +1 -1
- package/dist/cjs/pcm-mnms-zp-modal.cjs.entry.js +29 -86
- package/dist/cjs/pcm-mnms-zp-modal.cjs.entry.js.map +1 -1
- package/dist/cjs/pcm-mnms-zp-modal.entry.cjs.js.map +1 -1
- package/dist/cjs/{sentry-reporter-BWFtw_aT.js → sentry-reporter-tpI4WdkE.js} +12 -40
- package/dist/cjs/sentry-reporter-tpI4WdkE.js.map +1 -0
- package/dist/collection/collection-manifest.json +5 -1
- package/dist/collection/components/pcm-1zhanshi-mnms-modal/pcm-1zhanshi-mnms-modal.js.map +1 -1
- package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.css +986 -986
- package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.js +7 -9
- package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.js.map +1 -1
- package/dist/collection/components/pcm-button/pcm-button.css +199 -199
- package/dist/collection/components/pcm-button/pcm-button.js +6 -6
- package/dist/collection/components/pcm-button/pcm-button.js.map +1 -1
- package/dist/collection/components/pcm-card/pcm-card.css +259 -259
- package/dist/collection/components/pcm-card/pcm-card.js +1 -1
- package/dist/collection/components/pcm-card/pcm-card.js.map +1 -1
- package/dist/collection/components/pcm-chat-message/pcm-chat-message.css +554 -554
- package/dist/collection/components/pcm-chat-message/pcm-chat-message.js +3 -3
- package/dist/collection/components/pcm-chat-message/pcm-chat-message.js.map +1 -1
- package/dist/collection/components/pcm-drawer/pcm-drawer.css +102 -102
- package/dist/collection/components/pcm-drawer/pcm-drawer.js +1 -1
- package/dist/collection/components/pcm-drawer/pcm-drawer.js.map +1 -1
- package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.css +854 -854
- package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js +5 -7
- package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js.map +1 -1
- package/dist/collection/components/pcm-htws-modal/pcm-htws-modal.css +95 -95
- package/dist/collection/components/pcm-htws-modal/pcm-htws-modal.js +1 -1
- package/dist/collection/components/pcm-htws-modal/pcm-htws-modal.js.map +1 -1
- package/dist/collection/components/pcm-hyzj-modal/pcm-hyzj-modal.js +2 -2
- package/dist/collection/components/pcm-hyzj-modal/pcm-hyzj-modal.js.map +1 -1
- package/dist/collection/components/pcm-jd-modal/pcm-jd-modal.css +312 -312
- package/dist/collection/components/pcm-jd-modal/pcm-jd-modal.js +1 -1
- package/dist/collection/components/pcm-jd-modal/pcm-jd-modal.js.map +1 -1
- package/dist/collection/components/pcm-jlpp-modal/pcm-jlpp-modal.js +2 -2
- package/dist/collection/components/pcm-jlpp-modal/pcm-jlpp-modal.js.map +1 -1
- package/dist/collection/components/pcm-message/pcm-message.css +64 -64
- package/dist/collection/components/pcm-message/pcm-message.js +2 -2
- package/dist/collection/components/pcm-message/pcm-message.js.map +1 -1
- package/dist/collection/components/pcm-mnct-modal/pcm-mnct-modal.css +1 -1
- package/dist/collection/components/pcm-mnct-modal/pcm-mnct-modal.js +2 -2
- package/dist/collection/components/pcm-mnct-modal/pcm-mnct-modal.js.map +1 -1
- package/dist/collection/components/pcm-mnms-modal/pcm-mnms-modal.js +67 -84
- package/dist/collection/components/pcm-mnms-modal/pcm-mnms-modal.js.map +1 -1
- package/dist/collection/components/pcm-mnms-video-modal/pcm-mnms-video-modal.js +2 -2
- package/dist/collection/components/pcm-mnms-video-modal/pcm-mnms-video-modal.js.map +1 -1
- package/dist/collection/components/pcm-mnms-zp-modal/pcm-mnms-zp-modal.js +67 -84
- package/dist/collection/components/pcm-mnms-zp-modal/pcm-mnms-zp-modal.js.map +1 -1
- package/dist/collection/components/pcm-mobile-input-btn/pcm-mobile-input-btn.css +140 -0
- package/dist/collection/components/pcm-mobile-input-btn/pcm-mobile-input-btn.js +307 -0
- package/dist/collection/components/pcm-mobile-input-btn/pcm-mobile-input-btn.js.map +1 -0
- package/dist/collection/components/pcm-mobile-input-btn/uploadNumberSDK.js +25 -0
- package/dist/collection/components/pcm-mobile-input-btn/uploadNumberSDK.js.map +1 -0
- package/dist/collection/components/pcm-mobile-upload-btn/pcm-mobile-upload-btn.css +127 -0
- package/dist/collection/components/pcm-mobile-upload-btn/pcm-mobile-upload-btn.js +350 -0
- package/dist/collection/components/pcm-mobile-upload-btn/pcm-mobile-upload-btn.js.map +1 -0
- package/dist/collection/components/pcm-mobile-upload-btn/uploadNumberSDK.js +25 -0
- package/dist/collection/components/pcm-mobile-upload-btn/uploadNumberSDK.js.map +1 -0
- package/dist/collection/components/pcm-msbg-modal/pcm-msbg-modal.js +2 -2
- package/dist/collection/components/pcm-msbg-modal/pcm-msbg-modal.js.map +1 -1
- package/dist/collection/components/pcm-qgqjl-modal/pcm-qgqjl-modal.css +1 -1
- package/dist/collection/components/pcm-qgqjl-modal/pcm-qgqjl-modal.js +2 -2
- package/dist/collection/components/pcm-qgqjl-modal/pcm-qgqjl-modal.js.map +1 -1
- package/dist/collection/components/pcm-time-count-down/pcm-time-count-down.css +0 -0
- package/dist/collection/components/pcm-time-count-down/pcm-time-count-down.js +106 -0
- package/dist/collection/components/pcm-time-count-down/pcm-time-count-down.js.map +1 -0
- package/dist/collection/components/pcm-upload/pcm-upload.css +0 -0
- package/dist/collection/components/pcm-upload/pcm-upload.js +408 -0
- package/dist/collection/components/pcm-upload/pcm-upload.js.map +1 -0
- package/dist/collection/components/pcm-zsk-chat-modal/pcm-zsk-chat-modal.css +969 -969
- package/dist/collection/components/pcm-zsk-chat-modal/pcm-zsk-chat-modal.js +3 -5
- package/dist/collection/components/pcm-zsk-chat-modal/pcm-zsk-chat-modal.js.map +1 -1
- package/dist/collection/components/pcm-zygh-modal/pcm-zygh-modal.css +68 -68
- package/dist/collection/components/pcm-zygh-modal/pcm-zygh-modal.js +4 -4
- package/dist/collection/components/pcm-zygh-modal/pcm-zygh-modal.js.map +1 -1
- package/dist/collection/global/global.css +401 -398
- package/dist/collection/global/markdown.css +1233 -1233
- package/dist/collection/global/message.js.map +1 -1
- package/dist/collection/index.js.map +1 -1
- package/dist/collection/interfaces/chat.js.map +1 -1
- package/dist/collection/interfaces/events.js.map +1 -1
- package/dist/collection/services/message.service.js.map +1 -1
- package/dist/collection/utils/env.js +3 -0
- package/dist/collection/utils/env.js.map +1 -1
- package/dist/collection/utils/error-event.js.map +1 -1
- package/dist/collection/utils/init.js.map +1 -1
- package/dist/collection/utils/sentry-reporter.js.map +1 -1
- package/dist/collection/utils/utils.js +48 -24
- package/dist/collection/utils/utils.js.map +1 -1
- package/dist/components/index.js +3 -5482
- package/dist/components/index.js.map +1 -1
- package/dist/components/{p-AYWZDCn8.js → p-B0WOTw9J.js} +51 -4
- package/dist/components/p-B0WOTw9J.js.map +1 -0
- package/dist/components/{p-DUQ46MUh.js → p-BGXbWUJg.js} +3 -3
- package/dist/components/{p-DUQ46MUh.js.map → p-BGXbWUJg.js.map} +1 -1
- package/dist/{esm/sentry-reporter-BFBS363a.js → components/p-BW3r6Lrf.js} +5 -32
- package/dist/components/p-BW3r6Lrf.js.map +1 -0
- package/dist/{esm/app-globals-Chti62re.js → components/p-BdiUKin5.js} +9619 -4296
- package/dist/components/p-BdiUKin5.js.map +1 -0
- package/dist/components/{p-FjtoYPVY.js → p-BywzltXy.js} +10 -9
- package/dist/components/p-BywzltXy.js.map +1 -0
- package/dist/components/p-C2OsjtRx.js +208 -0
- package/dist/components/p-C2OsjtRx.js.map +1 -0
- package/dist/components/{p-D2Z8casl.js → p-CuIvbaWY.js} +5 -5
- package/dist/components/p-CuIvbaWY.js.map +1 -0
- package/dist/components/p-D0ZMoyH8.js +251 -0
- package/dist/components/p-D0ZMoyH8.js.map +1 -0
- package/dist/components/{p-CjbFHLT7.js → p-De3VHEUn.js} +7 -71
- package/dist/components/p-De3VHEUn.js.map +1 -0
- package/dist/components/p-Dv8qvK0w.js +2646 -0
- package/dist/components/p-Dv8qvK0w.js.map +1 -0
- package/dist/components/p-RD3mwuBX.js +226 -0
- package/dist/components/p-RD3mwuBX.js.map +1 -0
- package/dist/components/p-njngFX_n.js +80 -0
- package/dist/components/p-njngFX_n.js.map +1 -0
- package/dist/components/pcm-1zhanshi-mnms-modal.js +7 -7
- package/dist/components/pcm-1zhanshi-mnms-modal.js.map +1 -1
- package/dist/components/pcm-app-chat-modal.js +1 -1
- package/dist/components/pcm-button.js +2 -2
- package/dist/components/pcm-button.js.map +1 -1
- package/dist/components/pcm-card.js +3 -3
- package/dist/components/pcm-card.js.map +1 -1
- package/dist/components/pcm-chat-message.js +1 -1
- package/dist/components/pcm-drawer.js +1 -1
- package/dist/components/pcm-hr-chat-modal.js +5 -4
- package/dist/components/pcm-hr-chat-modal.js.map +1 -1
- package/dist/components/pcm-htws-modal.js +8 -7
- package/dist/components/pcm-htws-modal.js.map +1 -1
- package/dist/components/pcm-hyzj-modal.js +8 -7
- package/dist/components/pcm-hyzj-modal.js.map +1 -1
- package/dist/components/pcm-jd-modal.js +8 -7
- package/dist/components/pcm-jd-modal.js.map +1 -1
- package/dist/components/pcm-jlpp-modal.js +8 -7
- package/dist/components/pcm-jlpp-modal.js.map +1 -1
- package/dist/components/pcm-message.js +3 -3
- package/dist/components/pcm-message.js.map +1 -1
- package/dist/components/pcm-mnct-modal.js +8 -7
- package/dist/components/pcm-mnct-modal.js.map +1 -1
- package/dist/components/pcm-mnms-modal.js +60 -90
- package/dist/components/pcm-mnms-modal.js.map +1 -1
- package/dist/components/pcm-mnms-video-modal.js +8 -7
- package/dist/components/pcm-mnms-video-modal.js.map +1 -1
- package/dist/components/pcm-mnms-zp-modal.js +60 -90
- package/dist/components/pcm-mnms-zp-modal.js.map +1 -1
- package/dist/components/pcm-mobile-input-btn.d.ts +11 -0
- package/dist/components/pcm-mobile-input-btn.js +9 -0
- package/dist/components/pcm-mobile-input-btn.js.map +1 -0
- package/dist/components/pcm-mobile-upload-btn.d.ts +11 -0
- package/dist/components/pcm-mobile-upload-btn.js +9 -0
- package/dist/components/pcm-mobile-upload-btn.js.map +1 -0
- package/dist/components/pcm-msbg-modal.js +8 -7
- package/dist/components/pcm-msbg-modal.js.map +1 -1
- package/dist/components/pcm-qgqjl-modal.js +8 -7
- package/dist/components/pcm-qgqjl-modal.js.map +1 -1
- package/dist/components/pcm-time-count-down.d.ts +11 -0
- package/dist/components/pcm-time-count-down.js +9 -0
- package/dist/components/pcm-time-count-down.js.map +1 -0
- package/dist/components/pcm-upload.d.ts +11 -0
- package/dist/components/pcm-upload.js +9 -0
- package/dist/components/pcm-upload.js.map +1 -0
- package/dist/components/pcm-zsk-chat-modal.js +4 -4
- package/dist/components/pcm-zsk-chat-modal.js.map +1 -1
- package/dist/components/pcm-zygh-modal.js +8 -7
- package/dist/components/pcm-zygh-modal.js.map +1 -1
- package/dist/esm/error-event-C0FYX2-Z.js +31 -0
- package/dist/esm/error-event-C0FYX2-Z.js.map +1 -0
- package/dist/esm/{index-GyOE8SlD.js → index-BnNqOUZf.js} +51 -4
- package/dist/esm/index-BnNqOUZf.js.map +1 -0
- package/dist/esm/index-BuVfV0zo.js +11035 -0
- package/dist/esm/index-BuVfV0zo.js.map +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/loader.js +3 -5
- package/dist/esm/loader.js.map +1 -1
- package/dist/esm/message.service-DXVhHj6-.js +133 -0
- package/dist/esm/message.service-DXVhHj6-.js.map +1 -0
- package/dist/esm/{pcm-1zhanshi-mnms-modal_17.entry.js → pcm-1zhanshi-mnms-modal_21.entry.js} +3225 -169
- package/dist/esm/pcm-1zhanshi-mnms-modal_21.entry.js.map +1 -0
- package/dist/esm/pcm-agents.js +4 -6
- package/dist/esm/pcm-agents.js.map +1 -1
- package/dist/esm/pcm-message.entry.js +3 -3
- package/dist/esm/pcm-message.entry.js.map +1 -1
- package/dist/esm/pcm-mnms-video-modal.entry.js +5 -5
- package/dist/esm/pcm-mnms-video-modal.entry.js.map +1 -1
- package/dist/esm/pcm-mnms-zp-modal.entry.js +28 -85
- package/dist/esm/pcm-mnms-zp-modal.entry.js.map +1 -1
- package/dist/esm/sentry-reporter-CYzy4_8O.js +70 -0
- package/dist/esm/sentry-reporter-CYzy4_8O.js.map +1 -0
- package/dist/pcm-agents/index.esm.js +1 -1
- package/dist/pcm-agents/loader.esm.js.map +1 -1
- package/dist/pcm-agents/p-18a06873.entry.js +2 -0
- package/dist/pcm-agents/p-18a06873.entry.js.map +1 -0
- package/dist/pcm-agents/p-47e2e1d0.entry.js +2 -0
- package/dist/pcm-agents/p-47e2e1d0.entry.js.map +1 -0
- package/dist/pcm-agents/{p-3608c0c6.entry.js → p-7a582f00.entry.js} +2 -2
- package/dist/pcm-agents/p-7a582f00.entry.js.map +1 -0
- package/dist/pcm-agents/p-BhFnI70g.js +2 -0
- package/dist/pcm-agents/p-BhFnI70g.js.map +1 -0
- package/dist/pcm-agents/p-BuVfV0zo.js +3 -0
- package/dist/pcm-agents/p-BuVfV0zo.js.map +1 -0
- package/dist/pcm-agents/p-C0FYX2-Z.js +2 -0
- package/dist/pcm-agents/p-C0FYX2-Z.js.map +1 -0
- package/dist/pcm-agents/p-DXVhHj6-.js +2 -0
- package/dist/pcm-agents/p-DXVhHj6-.js.map +1 -0
- package/dist/pcm-agents/p-DkeaAFic.js +2 -0
- package/dist/pcm-agents/p-DkeaAFic.js.map +1 -0
- package/dist/pcm-agents/p-f5f96853.entry.js +245 -0
- package/dist/pcm-agents/p-f5f96853.entry.js.map +1 -0
- package/dist/pcm-agents/pcm-agents.esm.js +1 -1
- package/dist/pcm-agents/pcm-agents.esm.js.map +1 -1
- package/dist/pcm-agents/pcm-message.entry.esm.js.map +1 -1
- package/dist/pcm-agents/pcm-mnms-video-modal.entry.esm.js.map +1 -1
- package/dist/pcm-agents/pcm-mnms-zp-modal.entry.esm.js.map +1 -1
- package/dist/store/auth.store.js.map +1 -1
- package/dist/store/config.store.js.map +1 -1
- package/dist/types/components/pcm-mnms-modal/pcm-mnms-modal.d.ts +9 -4
- package/dist/types/components/pcm-mnms-zp-modal/pcm-mnms-zp-modal.d.ts +9 -4
- package/dist/types/components/pcm-mobile-input-btn/pcm-mobile-input-btn.d.ts +36 -0
- package/dist/types/components/pcm-mobile-input-btn/uploadNumberSDK.d.ts +9 -0
- package/dist/types/components/pcm-mobile-upload-btn/pcm-mobile-upload-btn.d.ts +44 -0
- package/dist/types/components/pcm-mobile-upload-btn/uploadNumberSDK.d.ts +9 -0
- package/dist/types/components/pcm-time-count-down/pcm-time-count-down.d.ts +15 -0
- package/dist/types/components/pcm-upload/pcm-upload.d.ts +54 -0
- package/dist/types/components/pcm-upload/type.d.ts +4 -0
- package/dist/types/components.d.ts +798 -30
- package/dist/types/stencil-public-runtime.d.ts +1 -1
- package/dist/types/utils/env.d.ts +2 -0
- package/dist/types/utils/utils.d.ts +30 -12
- package/package.json +70 -69
- package/dist/cjs/app-globals-BIO4q6tX.js +0 -5487
- package/dist/cjs/app-globals-BIO4q6tX.js.map +0 -1
- package/dist/cjs/exports-Dc-pQh4A.js +0 -4087
- package/dist/cjs/exports-Dc-pQh4A.js.map +0 -1
- package/dist/cjs/index-C_qhED9Z.js +0 -1538
- package/dist/cjs/index-C_qhED9Z.js.map +0 -1
- package/dist/cjs/index-CvEfNyEj.js.map +0 -1
- package/dist/cjs/pcm-1zhanshi-mnms-modal_17.cjs.entry.js.map +0 -1
- package/dist/cjs/sentry-reporter-BWFtw_aT.js.map +0 -1
- package/dist/components/p-75J0r72D.js +0 -4017
- package/dist/components/p-75J0r72D.js.map +0 -1
- package/dist/components/p-AYWZDCn8.js.map +0 -1
- package/dist/components/p-CR7WLzmM.js +0 -1303
- package/dist/components/p-CR7WLzmM.js.map +0 -1
- package/dist/components/p-CjbFHLT7.js.map +0 -1
- package/dist/components/p-D2Z8casl.js.map +0 -1
- package/dist/components/p-FjtoYPVY.js.map +0 -1
- package/dist/esm/app-globals-Chti62re.js.map +0 -1
- package/dist/esm/exports-Bs-zO1WZ.js +0 -4017
- package/dist/esm/exports-Bs-zO1WZ.js.map +0 -1
- package/dist/esm/index-Bq0K-WqZ.js +0 -1528
- package/dist/esm/index-Bq0K-WqZ.js.map +0 -1
- package/dist/esm/index-GyOE8SlD.js.map +0 -1
- package/dist/esm/pcm-1zhanshi-mnms-modal_17.entry.js.map +0 -1
- package/dist/esm/sentry-reporter-BFBS363a.js.map +0 -1
- package/dist/pcm-agents/p-2Gpw8rvH.js +0 -2
- package/dist/pcm-agents/p-2Gpw8rvH.js.map +0 -1
- package/dist/pcm-agents/p-3608c0c6.entry.js.map +0 -1
- package/dist/pcm-agents/p-60d7a0b0.entry.js +0 -2
- package/dist/pcm-agents/p-60d7a0b0.entry.js.map +0 -1
- package/dist/pcm-agents/p-9e6efc2d.entry.js +0 -2
- package/dist/pcm-agents/p-9e6efc2d.entry.js.map +0 -1
- package/dist/pcm-agents/p-BUV0S8Cc.js +0 -2
- package/dist/pcm-agents/p-BUV0S8Cc.js.map +0 -1
- package/dist/pcm-agents/p-Bq0K-WqZ.js +0 -3
- package/dist/pcm-agents/p-Bq0K-WqZ.js.map +0 -1
- package/dist/pcm-agents/p-Bs-zO1WZ.js +0 -2
- package/dist/pcm-agents/p-Bs-zO1WZ.js.map +0 -1
- package/dist/pcm-agents/p-CeRTfvY9.js +0 -2
- package/dist/pcm-agents/p-CeRTfvY9.js.map +0 -1
- package/dist/pcm-agents/p-e6c87a78.entry.js +0 -2
- package/dist/pcm-agents/p-e6c87a78.entry.js.map +0 -1
- /package/dist/types/{code/agents-sdk → Users/debugksir/Documents/pcm/sdk}/packages/pcm-agents/.stencil/store/auth.store.d.ts +0 -0
- /package/dist/types/{code/agents-sdk → Users/debugksir/Documents/pcm/sdk}/packages/pcm-agents/.stencil/store/config.store.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pcm-app-chat-modal.js","sourceRoot":"","sources":["../../../../src/components/pcm-app-chat-modal/pcm-app-chat-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, h, State, Event, EventEmitter, Element, Watch } from '@stencil/core';\r\nimport { convertWorkflowStreamNodeToMessageRound, UserInputMessageType, sendSSERequest, sendHttpRequest, uploadFileToBackend, fetchAgentInfo, synthesizeAudio } from '../../utils/utils';\r\nimport { ChatMessage, ConversationItem } from '../../interfaces/chat';\r\nimport {\r\n StreamCompleteEventData,\r\n ConversationStartEventData,\r\n InterviewCompleteEventData,\r\n RecordingErrorEventData,\r\n RecordingStatusChangeEventData\r\n} from '../../interfaces/events';\r\nimport { marked } from 'marked';\r\nimport { ErrorEventBus } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store'; // 导入 authStore\r\nimport { configStore } from '../../../store/config.store';\r\nimport { SentryReporter } from '../../utils/sentry-reporter';\r\n\r\n@Component({\r\n tag: 'pcm-app-chat-modal',\r\n styleUrls: ['pcm-app-chat-modal.css', '../../global/markdown.css',],\r\n shadow: true,\r\n})\r\nexport class ChatAPPModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '在线客服';\r\n\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token?: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 聊天消息历史\r\n */\r\n @State() messages: ChatMessage[] = [];\r\n\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop({ mutable: true }) zIndex?: number;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n\r\n /**\r\n * 会话ID,传入继续对话,否则创建新会话\r\n */\r\n @Prop({ mutable: true }) conversationId?: string;\r\n\r\n /**\r\n * 当前助手回复的消息\r\n */\r\n @State() currentAssistantMessage: string = '';\r\n\r\n /**\r\n * 是否正在加载回复\r\n */\r\n @State() isLoading: boolean = false;\r\n\r\n /**\r\n * 当前正在流式输出的消息\r\n */\r\n @State() currentStreamingMessage: ChatMessage | null = null;\r\n\r\n // 添加新的状态控制\r\n @State() shouldAutoScroll: boolean = true;\r\n\r\n @State() isLoadingHistory: boolean = false;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n /**\r\n * 一轮对话结束时的回调\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n @State() isUploading: boolean = false;\r\n\r\n /**\r\n * 默认发送文本\r\n */\r\n @Prop() defaultQuery: string = '你好!聘才猫';\r\n\r\n\r\n /**\r\n * 视频录制最大时长(秒)\r\n */\r\n @Prop() maxRecordingTime: number = 120;\r\n\r\n /**\r\n * 录制倒计时提醒时间(秒)\r\n * 当剩余时间小于此值时,显示倒计时警告\r\n */\r\n @Prop() countdownWarningTime: number = 30;\r\n\r\n // 添加视频录制相关状态\r\n @State() isRecording: boolean = false;\r\n @State() recordingStream: MediaStream | null = null;\r\n @State() recordedBlob: Blob | null = null;\r\n @State() mediaRecorder: MediaRecorder | null = null;\r\n @State() recordingTimeLeft: number = 0;\r\n @State() showRecordingUI: boolean = false;\r\n @State() recordingTimer: any = null;\r\n @State() recordingStartTime: number = 0;\r\n @State() waitingToRecord: boolean = false;\r\n @State() waitingTimer: any = null;\r\n @State() waitingTimeLeft: number = 10; // 等待时间(秒)\r\n\r\n // 添加一个新的私有属性来存储视频元素的引用\r\n private videoRef: HTMLVideoElement | null = null;\r\n\r\n\r\n /**\r\n * 当前轮数\r\n */\r\n @State() currentQuestionNumber: number = 0;\r\n\r\n\r\n /**\r\n * 当聊天完成时触发\r\n */\r\n @Event() interviewComplete: EventEmitter<InterviewCompleteEventData>;\r\n\r\n private readonly SCROLL_THRESHOLD = 20;\r\n\r\n\r\n\r\n @State() showCountdownWarning: boolean = false;\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n // 添加新的状态来跟踪视频上传\r\n @State() isUploadingVideo: boolean = false;\r\n\r\n // 添加新的状态和属性\r\n @State() isPlayingAudio: boolean = false;\r\n @State() audioUrl: string | null = null;\r\n private audioElement: HTMLAudioElement | null = null;\r\n\r\n /**\r\n * 录制错误事件\r\n */\r\n @Event() recordingError: EventEmitter<RecordingErrorEventData>;\r\n\r\n /**\r\n * 录制状态变化事件\r\n */\r\n @Event() recordingStatusChange: EventEmitter<RecordingStatusChangeEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 是否启用语音播报功能\r\n * true: 启用语音合成\r\n * false: 禁用语音合成\r\n */\r\n @Prop() enableTTS: boolean = false;\r\n\r\n /**\r\n * 是否自动播放语音问题\r\n */\r\n @Prop() enableVoice: boolean = false;\r\n\r\n /**\r\n * 面试模式\r\n * video: 视频面试模式\r\n * text: 文字面试模式\r\n */\r\n @Prop() interviewMode: 'video' | 'text' = 'video';\r\n\r\n // 添加文字输入相关状态\r\n @State() textAnswer: string = '';\r\n @State() isSubmittingText: boolean = false;\r\n\r\n /**\r\n * 自定义智能体inputs输入参数\r\n */\r\n @Prop() customInputs: Record<string, string> = {};\r\n\r\n /**\r\n * 机器人ID\r\n */\r\n @Prop() botId?: string;\r\n\r\n // 添加语音输入相关状态\r\n @State() isRecordingAudio: boolean = false;\r\n @State() audioRecorder: MediaRecorder | null = null;\r\n @State() audioChunks: BlobPart[] = [];\r\n @State() isConvertingAudio: boolean = false;\r\n @State() audioRecordingTimeLeft: number = 60; // 最大录音时间(秒)\r\n @State() audioRecordingTimer: any = null;\r\n @State() audioRecordingStartTime: number = 0;\r\n\r\n /**\r\n * 语音录制最大时长(秒)\r\n */\r\n @Prop() maxAudioRecordingTime: number = 60;\r\n\r\n /**\r\n * 用户头像URL\r\n */\r\n @Prop() userAvatar?: string = \"https://pub.pincaimao.com/static/common/i_pcm_logo.png\";\r\n\r\n /**\r\n * 助手头像URL\r\n */\r\n @Prop() assistantAvatar?: string;\r\n\r\n /**\r\n * 智能体头像URL(从后端获取)\r\n */\r\n @State() agentLogo: string = '';\r\n\r\n\r\n // 添加新的状态属性来跟踪任务是否已完成\r\n @State() isTaskCompleted: boolean = false;\r\n\r\n private tokenInvalidListener: () => void;\r\n\r\n /**\r\n * 是否显示复制按钮\r\n */\r\n @Prop() showCopyButton: boolean = true;\r\n\r\n /**\r\n * 是否显示点赞点踩按钮\r\n */\r\n @Prop() showFeedbackButtons: boolean = true;\r\n\r\n /**\r\n * 附件预览模式\r\n * 'drawer': 在右侧抽屉中预览\r\n * 'window': 在新窗口中打开\r\n */\r\n @Prop() filePreviewMode: 'drawer' | 'window' = 'window';\r\n\r\n /**\r\n * 是否显示工作区历史会话按钮\r\n */\r\n @Prop() showWorkspaceHistory: boolean = false;\r\n\r\n // 添加新的状态来管理抽屉\r\n @State() isDrawerOpen: boolean = false;\r\n @State() previewUrl: string = '';\r\n @State() previewFileName: string = '';\r\n\r\n // 添加内容类型状态\r\n @State() previewContentType: 'file' | 'markdown' | 'text' = 'file';\r\n @State() previewContent: string = '';\r\n\r\n // 添加新的状态来追踪用户交互\r\n @State() isUserScrolling: boolean = false;\r\n\r\n @State() deviceError: string | null = null;\r\n\r\n // 添加历史会话相关状态\r\n @State() isHistoryDrawerOpen: boolean = false;\r\n @State() historyConversations: ConversationItem[] = [];\r\n @State() isLoadingConversations: boolean = false;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n constructor() {\r\n // 配置 marked 选项\r\n marked.setOptions({\r\n breaks: true,\r\n gfm: true\r\n });\r\n }\r\n\r\n componentWillLoad() {\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n } else {\r\n // 如果没有提供 zIndex,尝试从缓存中读取\r\n const cachedZIndex = configStore.getItem<number>('modal-zIndex');\r\n if (cachedZIndex) {\r\n this.zIndex = cachedZIndex;\r\n } else {\r\n this.zIndex = 1000;\r\n configStore.setItem('modal-zIndex', 1000);\r\n }\r\n }\r\n\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n\r\n // 确保 customInputs 是一个对象\r\n if (!this.customInputs) {\r\n this.customInputs = {};\r\n }\r\n\r\n // 如果没有设置助手头像,尝试获取智能体头像\r\n if (!this.assistantAvatar && this.botId) {\r\n\r\n this.fetchAgentLogo();\r\n }\r\n\r\n // 如果组件加载时已经是打开状态,则直接开始对话\r\n if (this.isOpen) {\r\n if (this.conversationId) {\r\n // 在下一个事件循环中加载历史消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.loadHistoryMessages(), 0);\r\n } else {\r\n // 在下一个事件循环中发送初始消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => {\r\n this.sendMessageToAPI(this.defaultQuery);\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private handleClose = () => {\r\n this.stopRecording();\r\n this.modalClosed.emit();\r\n };\r\n\r\n // 添加获取智能体信息的方法\r\n private async fetchAgentLogo() {\r\n if (!this.botId) return;\r\n\r\n try {\r\n const agentInfo = await fetchAgentInfo(this.botId);\r\n\r\n if (agentInfo && agentInfo.logo) {\r\n this.agentLogo = agentInfo.logo;\r\n }\r\n } catch (error) {\r\n SentryReporter.captureError(error, {\r\n action: 'fetchAgentLogo',\r\n component: 'pcm-app-chat-modal',\r\n title: '获取智能体信息失败'\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '获取智能体信息失败'\r\n });\r\n }\r\n }\r\n\r\n private async sendMessageToAPI(message: string, videoUrl?: string) {\r\n this.isLoading = true;\r\n let answer = '';\r\n let llmText = '';\r\n\r\n const now = new Date();\r\n const time = `${now.getHours()}:${now.getMinutes().toString().padStart(2, '0')}`;\r\n\r\n // 修改消息处理逻辑,移除文件上传相关代码\r\n const queryText = message.trim() || '请开始';\r\n\r\n // 如果有视频URL,添加到customInputs中\r\n if (videoUrl) {\r\n this.customInputs = {\r\n ...this.customInputs,\r\n video_url: videoUrl\r\n };\r\n }\r\n\r\n // 创建新的消息对象\r\n const newMessage: ChatMessage = {\r\n id: `temp-${Date.now()}`, // 临时ID,将被服务器返回的ID替换\r\n conversation_id: this.conversationId, // 会话ID\r\n parent_message_id: \"00000000-0000-0000-0000-000000000000\", // 默认父消息ID\r\n inputs: this.customInputs || {}, // 输入参数\r\n query: queryText, // 用户输入的消息内容\r\n answer: '', // 初始为空\r\n message_files: [], // 消息附件\r\n feedback: {}, // 反馈\r\n retriever_resources: [], // 检索资源\r\n created_at: Math.floor(Date.now() / 1000).toString(), // 创建时间\r\n agent_thoughts: [], // 代理思考过程\r\n status: \"normal\", // 消息状态\r\n error: null, // 错误信息\r\n // 添加组件内部使用的字段\r\n time: time, // 消息时间(显示用)\r\n isStreaming: true // 是否正在流式输出\r\n };\r\n\r\n // 设置当前流式消息\r\n this.currentStreamingMessage = newMessage;\r\n\r\n // 滚动到底部\r\n setTimeout(() => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n }, 200);\r\n\r\n // 准备请求数据\r\n const requestData: any = {\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: queryText,\r\n bot_id: this.botId // 添加 botId 到请求数据中\r\n };\r\n\r\n // 合并基本输入参数和自定义输入参数\r\n requestData.inputs = {\r\n // 合并自定义输入参数\r\n ...this.customInputs\r\n };\r\n\r\n await sendSSERequest({\r\n url: '/sdk/v1/chat/chat-messages',\r\n method: 'POST',\r\n data: requestData,\r\n onMessage: (data) => {\r\n console.log('收到Stream数据:', data);\r\n\r\n if (data.conversation_id && !this.conversationId) {\r\n this.conversationId = data.conversation_id;\r\n this.conversationStart.emit({\r\n conversation_id: data.conversation_id,\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n\r\n // 检查是否有 node_finished 事件和 LLMText\r\n if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {\r\n llmText = data.data.inputs.LLMText;\r\n }\r\n\r\n // 添加对任务结束的判断\r\n if (data.event === 'node_finished' && data.data.title && data.data.title.includes('聘才猫任务结束')) {\r\n console.log('检测到任务结束事件:', data);\r\n\r\n // 设置标志,表示任务已结束\r\n this.isTaskCompleted = true;\r\n\r\n // 获取当前AI回复内容,优先使用LLMText,否则使用answer\r\n const aiResponse = llmText || answer || (this.currentStreamingMessage?.answer) || '';\r\n\r\n // 触发面试完成事件\r\n this.interviewComplete.emit({\r\n conversation_id: this.conversationId,\r\n current_question_number: this.currentQuestionNumber,\r\n ai_response: aiResponse, // 添加AI回复内容\r\n });\r\n }\r\n\r\n if (data.event === 'message') {\r\n const inputMessage: UserInputMessageType = { message: message };\r\n convertWorkflowStreamNodeToMessageRound('message', inputMessage, data);\r\n\r\n if (data.event === 'agent_message' || data.event === 'message') {\r\n if (data.answer) {\r\n answer += data.answer;\r\n // 更新消息时保持完整的消息结构\r\n const updatedMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n answer,\r\n id: data.message_id || this.currentStreamingMessage.id,\r\n isStreaming: true,\r\n // 如果服务器返回了其他字段,也更新它们\r\n parent_message_id: data.parent_message_id || this.currentStreamingMessage.parent_message_id,\r\n retriever_resources: data.retriever_resources || this.currentStreamingMessage.retriever_resources,\r\n agent_thoughts: data.agent_thoughts || this.currentStreamingMessage.agent_thoughts\r\n };\r\n this.currentStreamingMessage = updatedMessage;\r\n this.scrollToBottom();\r\n }\r\n }\r\n }\r\n if (data.event === \"message_end\") {\r\n this.streamComplete.emit({\r\n conversation_id: data.conversation_id || '',\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n },\r\n onError: (error) => {\r\n console.error('发生错误:', error);\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '消息发送失败,请稍后再试'\r\n });\r\n SentryReporter.captureError(error, {\r\n action: 'sendMessageToAPI',\r\n component: 'pcm-app-chat-modal',\r\n title: '消息发送失败'\r\n });\r\n\r\n this.messages = [...this.messages, {\r\n ...newMessage,\r\n answer: '抱歉,发生了错误,请稍后再试。',\r\n error: error,\r\n isStreaming: false\r\n }];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n },\r\n onComplete: async () => {\r\n this.isLoading = false;\r\n // 发送第一条消息后,清空 customInputs\r\n // setTimeout(() => {\r\n // if (this.customInputs) {\r\n // Object.keys(this.customInputs).forEach(key => {\r\n // delete this.customInputs[key];\r\n // });\r\n // }\r\n // }, 1000); // 给一些时间让第一条消息处理完成\r\n\r\n // 获取最新的AI回复内容\r\n const latestAIMessage = this.currentStreamingMessage;\r\n latestAIMessage.isStreaming = false;\r\n this.currentStreamingMessage = null;\r\n\r\n // 更新消息列表\r\n this.messages = [...this.messages, latestAIMessage];\r\n\r\n\r\n // 增加题目计数\r\n this.currentQuestionNumber++;\r\n\r\n if (this.isTaskCompleted) {\r\n return;\r\n }\r\n\r\n if (latestAIMessage && latestAIMessage.answer) {\r\n // 优先使用 LLMText,如果没有则使用 answer\r\n const textForSynthesis = llmText || latestAIMessage.answer;\r\n\r\n if (textForSynthesis && this.enableTTS) {\r\n // 使用工具函数合成语音\r\n const audioUrl = await synthesizeAudio(textForSynthesis);\r\n\r\n if (this.enableVoice) {\r\n // 自动播放语音\r\n await this.playAudio(audioUrl);\r\n // 自动播放模式下,只在视频模式时开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n } else {\r\n // 只保存音频URL,不自动播放\r\n this.audioUrl = audioUrl;\r\n }\r\n } else if (this.interviewMode === 'video') {\r\n // 如果禁用了语音合成,只在视频模式时开始等待录制\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n // 修改滚动处理函数\r\n private handleScroll = () => {\r\n // 只有当用户正在滚动时才更新自动滚动状态\r\n if (this.isUserScrolling) {\r\n\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (!chatHistory) return;\r\n\r\n const { scrollTop, scrollHeight, clientHeight } = chatHistory;\r\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\r\n\r\n // 更新是否应该自动滚动的状态\r\n this.shouldAutoScroll = distanceFromBottom <= this.SCROLL_THRESHOLD;\r\n\r\n }\r\n };\r\n\r\n // 添加触摸开始事件处理\r\n private handleTouchStart = () => {\r\n this.isUserScrolling = true;\r\n };\r\n\r\n // 添加触摸结束事件处理\r\n private handleTouchEnd = () => {\r\n setTimeout(() => {\r\n this.isUserScrolling = false;\r\n }, 100); // 添加小延迟以确保滚动事件处理完成\r\n };\r\n\r\n private _wheelTimer: any = null;\r\n\r\n // 添加鼠标滚轮事件处理\r\n private handleWheel = () => {\r\n this.isUserScrolling = true;\r\n\r\n // 清除之前的定时器(如果存在)\r\n if (this._wheelTimer) {\r\n clearTimeout(this._wheelTimer);\r\n }\r\n\r\n // 设置新的定时器\r\n this._wheelTimer = setTimeout(() => {\r\n this.isUserScrolling = false;\r\n }, 150); // 滚轮停止后的延迟时间\r\n };\r\n\r\n private scrollToBottom() {\r\n if (!this.shouldAutoScroll) return;\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory && this.isOpen) {\r\n // 强制浏览器重新计算布局\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n\r\n\r\n // 修改加载历史消息的方法\r\n private async loadHistoryMessages() {\r\n if (!this.conversationId) return;\r\n\r\n this.isLoadingHistory = true;\r\n console.log('加载历史消息...');\r\n let conversationStatus = false;\r\n\r\n try {\r\n // 首先获取会话状态\r\n const conversationStatusResponse = await sendHttpRequest({\r\n url: `/sdk/v1/chat/conversation`,\r\n method: 'GET',\r\n data: {\r\n conversation_id: this.conversationId\r\n }\r\n });\r\n // 处理会话状态\r\n if (conversationStatusResponse.success && conversationStatusResponse.data && conversationStatusResponse.data.run_status == '结束') {\r\n conversationStatus = true;\r\n }\r\n\r\n // 获取历史消息\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/messages',\r\n method: 'GET',\r\n data: {\r\n conversation_id: this.conversationId,\r\n bot_id: this.botId,\r\n limit: 20\r\n }\r\n });\r\n\r\n if (result.success && result.data) {\r\n const historyData = result.data.data || [];\r\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\r\n const time = new Date(parseInt(msg.created_at) * 1000);\r\n const hours = time.getHours().toString().padStart(2, '0');\r\n const minutes = time.getMinutes().toString().padStart(2, '0');\r\n const timeStr = `${hours}:${minutes}`;\r\n\r\n // 创建完整的消息对象,保持统一结构\r\n return {\r\n id: msg.id,\r\n conversation_id: msg.conversation_id,\r\n parent_message_id: msg.parent_message_id || \"00000000-0000-0000-0000-000000000000\",\r\n inputs: msg.inputs || {},\r\n query: msg.query || \"\",\r\n answer: msg.answer || \"\",\r\n message_files: msg.message_files || [],\r\n feedback: msg.feedback || {},\r\n retriever_resources: msg.retriever_resources || [],\r\n created_at: msg.created_at,\r\n agent_thoughts: msg.agent_thoughts || [],\r\n status: msg.status || \"normal\",\r\n error: msg.error,\r\n // 组件内部使用的字段\r\n time: timeStr,\r\n isStreaming: false\r\n };\r\n });\r\n\r\n this.messages = formattedMessages;\r\n }\r\n } catch (error) {\r\n console.error('加载历史消息或会话状态失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'loadHistoryMessages',\r\n component: 'pcm-app-chat-modal',\r\n title: '加载历史消息失败'\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '加载历史消息失败,请刷新重试'\r\n });\r\n } finally {\r\n this.isLoadingHistory = false;\r\n setTimeout(async () => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n\r\n // 如果有会话ID且有历史消息,且会话未结束,处理继续对话的逻辑\r\n if (this.conversationId && this.messages.length > 0 && !conversationStatus) {\r\n const lastAIMessage = this.messages[this.messages.length - 1];\r\n\r\n // 如果有AI消息且启用了语音合成功能\r\n if (lastAIMessage && lastAIMessage.answer && this.enableTTS) {\r\n // 合成语音\r\n const audioUrl = await synthesizeAudio(lastAIMessage.answer);\r\n\r\n if (this.enableVoice) {\r\n // 自动播放语音\r\n await this.playAudio(audioUrl);\r\n // 播放完成后,只在视频模式时开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n } else {\r\n // 只保存音频URL,不自动播放\r\n this.audioUrl = audioUrl;\r\n // 非自动播放模式下,不立即开始等待录制\r\n }\r\n } else if (!this.enableTTS && this.interviewMode === 'video') {\r\n // 如果禁用了语音合成功能,且是视频模式,直接开始等待录制\r\n this.startWaitingToRecord();\r\n }\r\n } else if (conversationStatus) {\r\n // 如果会话已结束,设置任务完成状态\r\n this.isTaskCompleted = true;\r\n\r\n }\r\n }, 200);\r\n }\r\n }\r\n\r\n // 开始等待录制\r\n private startWaitingToRecord() {\r\n // 如果不是视频模式,直接返回\r\n if (this.interviewMode !== 'video') {\r\n return;\r\n }\r\n\r\n // 清除可能存在的计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n }\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n }\r\n\r\n this.waitingToRecord = true;\r\n this.waitingTimeLeft = 10;\r\n\r\n this.waitingTimer = setInterval(() => {\r\n this.waitingTimeLeft--;\r\n if (this.waitingTimeLeft <= 0) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n this.waitingToRecord = false;\r\n this.startRecording();\r\n }\r\n }, 1000);\r\n }\r\n\r\n // 开始录制视频\r\n private async startRecording() {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: true,\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 }\r\n }\r\n });\r\n\r\n // 如果成功获取到媒体流,清除之前的设备错误\r\n this.deviceError = null;\r\n\r\n this.recordingStream = stream;\r\n this.showRecordingUI = true;\r\n this.showCountdownWarning = false;\r\n\r\n // 重置视频引用\r\n this.videoRef = null;\r\n\r\n // 确保视频元素获取到流\r\n this.setupVideoPreview(stream);\r\n\r\n // 检测浏览器支持的MIME类型\r\n const mimeType = this.getSupportedMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let mediaRecorder;\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n videoBitsPerSecond: 800000, // 800kbps 视频比特率限制\r\n audioBitsPerSecond: 64000 // 64kbps 音频比特率限制\r\n });\r\n } catch (e) {\r\n // 如果指定MIME类型失败,尝试使用默认设置\r\n console.warn('指定的MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n videoBitsPerSecond: 800000, // 即使降级也保持比特率限制\r\n audioBitsPerSecond: 64000\r\n });\r\n } catch (recorderError) {\r\n // 最后的降级选项,不设置任何参数\r\n try {\r\n mediaRecorder = new MediaRecorder(stream);\r\n } catch (finalError) {\r\n // 通知父组件录制器创建失败\r\n this.recordingError.emit({\r\n type: 'recorder_creation_failed',\r\n message: '无法创建媒体录制器,您的浏览器可能不支持此功能',\r\n details: finalError\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.mediaRecorder = mediaRecorder;\r\n\r\n const chunks: BlobPart[] = [];\r\n\r\n mediaRecorder.ondataavailable = (event) => {\r\n if (event.data.size > 0) {\r\n chunks.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onerror = (event) => {\r\n // 通知父组件录制过程中发生错误\r\n this.recordingError.emit({\r\n type: 'recording_error',\r\n message: '录制过程中发生错误',\r\n details: event\r\n });\r\n this.stopRecording();\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n try {\r\n // 根据实际使用的MIME类型创建Blob\r\n const blobType = mimeType || 'video/mp4';\r\n const blob = new Blob(chunks, { type: blobType });\r\n\r\n if (blob.size === 0) {\r\n // 通知父组件录制的视频为空\r\n this.recordingError.emit({\r\n type: 'empty_recording',\r\n message: '录制的视频为空'\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n this.recordedBlob = blob;\r\n\r\n // 通知父组件录制已完成\r\n this.recordingStatusChange.emit({\r\n status: 'stopped',\r\n details: {\r\n duration: Math.floor((Date.now() - this.recordingStartTime) / 1000),\r\n size: blob.size,\r\n type: blob.type\r\n }\r\n });\r\n\r\n this.uploadRecordedVideo();\r\n } catch (error) {\r\n // 通知父组件处理录制视频时出错\r\n this.recordingError.emit({\r\n type: 'processing_error',\r\n message: '处理录制视频时出错',\r\n details: error\r\n });\r\n this.showRecordingUI = false;\r\n SentryReporter.captureError(error, {\r\n action: 'uploadRecordedVideo',\r\n component: 'pcm-hr-chat-modal',\r\n title: '处理录制视频时出错'\r\n });\r\n }\r\n };\r\n\r\n // 开始录制\r\n try {\r\n mediaRecorder.start();\r\n this.isRecording = true;\r\n this.recordingStartTime = Date.now();\r\n this.recordingTimeLeft = this.maxRecordingTime;\r\n\r\n // 通知父组件录制已开始\r\n this.recordingStatusChange.emit({\r\n status: 'started',\r\n details: {\r\n maxDuration: this.maxRecordingTime,\r\n mimeType: mediaRecorder.mimeType\r\n }\r\n });\r\n } catch (startError) {\r\n // 通知父组件开始录制失败\r\n this.recordingError.emit({\r\n type: 'start_failed',\r\n message: '开始录制失败,请检查您的设备权限',\r\n details: startError\r\n });\r\n this.showRecordingUI = false;\r\n SentryReporter.captureError(startError, {\r\n action: 'startRecording',\r\n component: 'pcm-hr-chat-modal',\r\n title: '开始录制失败'\r\n });\r\n return;\r\n }\r\n\r\n // 设置录制计时器\r\n this.recordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.recordingStartTime) / 1000);\r\n this.recordingTimeLeft = Math.max(0, this.maxRecordingTime - elapsedTime);\r\n\r\n // 检查是否需要显示倒计时警告\r\n if (this.recordingTimeLeft <= this.countdownWarningTime && !this.showCountdownWarning) {\r\n this.showCountdownWarning = true;\r\n }\r\n\r\n // 时间到自动停止录制\r\n if (this.recordingTimeLeft <= 0) {\r\n this.stopRecording();\r\n }\r\n }, 1000);\r\n\r\n } catch (error) {\r\n console.error('无法访问摄像头或麦克风:', error);\r\n\r\n // 设置设备错误状态\r\n let errorMessage = '设备访问失败';\r\n\r\n if (error.name === 'NotAllowedError') {\r\n errorMessage = '请允许访问摄像头和麦克风权限';\r\n } else if (error.name === 'NotFoundError') {\r\n errorMessage = '未检测到摄像头或麦克风设备';\r\n } else if (error.name === 'NotReadableError') {\r\n errorMessage = '设备正在被其他应用程序使用';\r\n } else if (error.name === 'OverconstrainedError') {\r\n errorMessage = '摄像头不支持指定的配置';\r\n } else {\r\n errorMessage = '无法访问摄像头或麦克风,请检查设备连接';\r\n }\r\n\r\n this.deviceError = errorMessage;\r\n this.showRecordingUI = false;\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: errorMessage\r\n });\r\n\r\n SentryReporter.captureError(error, {\r\n action: 'startRecording',\r\n component: 'pcm-app-chat-modal',\r\n title: errorMessage\r\n });\r\n\r\n }\r\n }\r\n\r\n // 添加新方法来设置视频预览\r\n private setupVideoPreview(stream: MediaStream) {\r\n // 延迟执行以确保DOM已更新\r\n setTimeout(() => {\r\n const videoElement = this.hostElement.shadowRoot?.querySelector('video') as HTMLVideoElement;\r\n if (videoElement && stream) {\r\n // 先尝试使用标准方法\r\n try {\r\n videoElement.srcObject = stream;\r\n videoElement.play().catch(err => {\r\n console.error('视频播放失败:', err);\r\n SentryReporter.captureError(err, {\r\n action: 'setupVideoPreview',\r\n component: 'pcm-app-chat-modal',\r\n title: '视频播放失败'\r\n });\r\n ErrorEventBus.emitError({\r\n error: err,\r\n message: '视频播放失败'\r\n });\r\n });\r\n } catch (e) {\r\n console.warn('设置srcObject失败,尝试替代方法:', e);\r\n\r\n // 对于不支持srcObject的旧浏览器,使用URL.createObjectURL\r\n try {\r\n // 使用类型断言解决TypeScript错误\r\n const objectUrl = URL.createObjectURL(stream as unknown as MediaSource);\r\n videoElement.src = objectUrl;\r\n\r\n // 确保在视频元素不再使用时释放URL\r\n videoElement.onended = () => {\r\n URL.revokeObjectURL(objectUrl);\r\n };\r\n } catch (urlError) {\r\n console.error('创建对象URL失败:', urlError);\r\n SentryReporter.captureError(urlError, {\r\n action: 'setupVideoPreview',\r\n component: 'pcm-app-chat-modal',\r\n title: '创建对象URL失败'\r\n });\r\n ErrorEventBus.emitError({\r\n error: urlError,\r\n message: '创建对象URL失败'\r\n });\r\n }\r\n }\r\n } else {\r\n console.warn('未找到视频元素或媒体流无效');\r\n }\r\n }, 100);\r\n }\r\n\r\n // 添加一个新方法来检测浏览器支持的MIME类型\r\n private getSupportedMimeType(): string {\r\n // 按优先级排列的MIME类型列表\r\n const mimeTypes = [\r\n 'video/webm;codecs=vp8,opus',\r\n 'video/webm;codecs=vp9,opus',\r\n 'video/webm',\r\n 'video/mp4',\r\n 'video/mp4;codecs=h264,aac',\r\n '' // 空字符串表示使用浏览器默认值\r\n ];\r\n\r\n // 检查MediaRecorder是否可用\r\n if (!window.MediaRecorder) {\r\n console.warn('MediaRecorder API不可用');\r\n return '';\r\n }\r\n\r\n // 检查每种MIME类型是否受支持\r\n for (const type of mimeTypes) {\r\n if (!type) return ''; // 如果是空字符串,直接返回\r\n\r\n try {\r\n if (MediaRecorder.isTypeSupported(type)) {\r\n return type;\r\n }\r\n } catch (e) {\r\n console.warn(`检查MIME类型支持时出错 ${type}:`, e);\r\n }\r\n }\r\n\r\n // 如果没有找到支持的类型,返回空字符串\r\n console.warn('没有找到支持的MIME类型,将使用浏览器默认值');\r\n return '';\r\n }\r\n\r\n // 停止录制\r\n private stopRecording() {\r\n if (this.mediaRecorder && this.isRecording) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n\r\n // 清理计时器\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止并释放媒体流\r\n if (this.recordingStream) {\r\n this.recordingStream.getTracks().forEach(track => track.stop());\r\n this.recordingStream = null;\r\n }\r\n\r\n // 清理视频引用\r\n this.videoRef = null;\r\n }\r\n }\r\n\r\n // 修改音频转文字方法\r\n private async convertAudioToText(cosKey: string): Promise<string | null> {\r\n try {\r\n const result = await sendHttpRequest<{ text: string }>({\r\n url: '/sdk/v1/tts/audio_to_text',\r\n method: 'POST',\r\n data: {\r\n cos_key: cosKey\r\n }\r\n });\r\n\r\n if (result.success && result.data && result.data.text) {\r\n return result.data.text;\r\n } else {\r\n console.warn('音频转文字返回结果格式不正确');\r\n return null;\r\n }\r\n } catch (error) {\r\n console.error('音频转文字错误:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'convertAudioToText',\r\n component: 'pcm-app-chat-modal',\r\n title: '音频转文字错误'\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '音频转文字错误'\r\n });\r\n return null;\r\n }\r\n }\r\n\r\n // 上传录制的视频\r\n private async uploadRecordedVideo() {\r\n if (!this.recordedBlob) return;\r\n\r\n try {\r\n this.isUploadingVideo = true; // 开始上传时设置状态\r\n this.showRecordingUI = false; // 隐藏视频预览\r\n\r\n // 根据Blob类型确定文件扩展名\r\n const fileExtension = this.recordedBlob.type.includes('webm') ? 'webm' : 'mp4';\r\n const fileName = `answer.${fileExtension}`;\r\n\r\n // 创建File对象\r\n const file = new File([this.recordedBlob], fileName, { type: this.recordedBlob.type });\r\n\r\n // 使用uploadFileToBackend上传文件\r\n const fileInfo = await uploadFileToBackend(file, {\r\n\r\n }, {\r\n 'tags': ['other']\r\n });\r\n // 使用 cos_key 作为视频标识符\r\n // 调用音频转文字API\r\n const transcriptionText = await this.convertAudioToText(fileInfo.cos_key);\r\n\r\n // 发送\"下一题\"请求,可以附带转录文本\r\n this.sendMessageToAPI(transcriptionText || \"下一题\", fileInfo.cos_key);\r\n\r\n } catch (error) {\r\n console.error('视频上传或处理错误:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'uploadRecordedVideo',\r\n component: 'pcm-app-chat-modal',\r\n title: '视频上传或处理失败'\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '视频上传或处理失败'\r\n });\r\n } finally {\r\n this.isUploadingVideo = false; // 上传完成后重置状态\r\n this.showRecordingUI = false;\r\n this.recordedBlob = null;\r\n }\r\n }\r\n\r\n\r\n // 播放音频的方法\r\n private playAudio(audioUrl: string): Promise<void> {\r\n return new Promise((resolve) => {\r\n this.isPlayingAudio = true;\r\n this.audioUrl = audioUrl;\r\n\r\n // 创建音频元素\r\n if (!this.audioElement) {\r\n this.audioElement = new Audio();\r\n }\r\n\r\n this.audioElement.src = audioUrl;\r\n this.audioElement.onended = () => {\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n resolve();\r\n };\r\n\r\n this.audioElement.onerror = () => {\r\n console.error('音频播放错误');\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n ErrorEventBus.emitError({\r\n error: '音频播放错误',\r\n message: '音频播放错误'\r\n });\r\n SentryReporter.captureMessage('音频播放错误', {\r\n action: 'playAudio',\r\n component: 'pcm-hr-chat-modal',\r\n title: '音频播放错误'\r\n });\r\n resolve();\r\n };\r\n\r\n this.audioElement.play().catch(error => {\r\n console.error('音频播放失败:', error);\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '音频播放失败'\r\n });\r\n SentryReporter.captureError(error, {\r\n title: '音频播放失败',\r\n action: 'playAudio',\r\n component: 'pcm-hr-chat-modal',\r\n });\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n // 确保组件卸载时释放资源\r\n disconnectedCallback() {\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n\r\n // 释放音频资源\r\n if (this.audioElement) {\r\n this.audioElement.pause();\r\n this.audioElement.src = '';\r\n this.audioElement = null;\r\n }\r\n\r\n // 释放 Blob URL\r\n if (this.audioUrl) {\r\n URL.revokeObjectURL(this.audioUrl);\r\n this.audioUrl = null;\r\n }\r\n\r\n // 清理其他计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 清理音频录制计时器\r\n if (this.audioRecordingTimer) {\r\n clearInterval(this.audioRecordingTimer);\r\n this.audioRecordingTimer = null;\r\n }\r\n\r\n // 停止录制\r\n this.stopRecording();\r\n\r\n // 停止音频录制\r\n this.stopAudioRecording();\r\n }\r\n\r\n // 修改手动播放音频的方法\r\n private handlePlayAudio = async () => {\r\n if (this.audioUrl) {\r\n await this.playAudio(this.audioUrl);\r\n // 手动播放完成后只在视频模式时开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n };\r\n\r\n // 处理文本输入变化\r\n private handleTextInputChange = (event: Event) => {\r\n const input = event.target as HTMLTextAreaElement;\r\n this.textAnswer = input.value;\r\n };\r\n\r\n // 添加处理键盘事件的方法\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n // 如果按下的是回车键\r\n if (event.key === 'Enter') {\r\n // 如果同时按下了Ctrl键,允许换行\r\n if (event.ctrlKey) {\r\n // 获取当前光标位置\r\n const textarea = event.target as HTMLTextAreaElement;\r\n const cursorPosition = textarea.selectionStart;\r\n\r\n // 在光标位置插入换行符\r\n const beforeCursor = this.textAnswer.substring(0, cursorPosition);\r\n const afterCursor = this.textAnswer.substring(cursorPosition);\r\n this.textAnswer = beforeCursor + '\\n' + afterCursor;\r\n\r\n // 阻止默认行为\r\n event.preventDefault();\r\n\r\n // 在下一个事件循环中设置光标位置\r\n setTimeout(() => {\r\n const newPosition = cursorPosition + 1;\r\n textarea.setSelectionRange(newPosition, newPosition);\r\n }, 0);\r\n\r\n return;\r\n } else {\r\n // 阻止默认的换行行为\r\n event.preventDefault();\r\n // 如果文本框不为空且不处于禁用状态,则发送消息\r\n if (this.textAnswer.trim() && !this.isSubmittingText && !this.isLoading &&\r\n !this.currentStreamingMessage && !this.waitingToRecord && !this.isPlayingAudio) {\r\n this.submitTextAnswer();\r\n }\r\n }\r\n }\r\n };\r\n\r\n // 修改提交文本回答的方法\r\n private submitTextAnswer = async () => {\r\n if (!this.textAnswer.trim() || this.isSubmittingText) {\r\n return;\r\n }\r\n\r\n this.isSubmittingText = true;\r\n\r\n try {\r\n // 保存当前输入内容\r\n const textToSend = this.textAnswer;\r\n\r\n // 立即清空文本输入\r\n this.textAnswer = '';\r\n\r\n // 发送用户输入的文本作为查询\r\n await this.sendMessageToAPI(textToSend);\r\n } catch (error) {\r\n console.error('提交文本回答失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'submitTextAnswer',\r\n component: 'pcm-app-chat-modal',\r\n title: '提交文本回答失败'\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '提交文本回答失败'\r\n });\r\n } finally {\r\n this.isSubmittingText = false;\r\n }\r\n };\r\n\r\n // 处理语音输入按钮点击\r\n private handleVoiceInputClick = () => {\r\n if (this.isRecordingAudio) {\r\n this.stopAudioRecording();\r\n } else {\r\n // 直接在用户交互事件处理程序中请求权限\r\n // 不使用 async/await,而是使用 Promise 链\r\n navigator.mediaDevices.getUserMedia({ audio: true })\r\n .then(stream => {\r\n // 权限已获取,开始录音\r\n this.startRecordingWithStream(stream);\r\n })\r\n .catch(error => {\r\n console.error('麦克风权限请求失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'handleVoiceInputClick',\r\n component: 'pcm-app-chat-modal',\r\n title: '麦克风权限请求失败'\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '麦克风权限请求失败'\r\n });\r\n });\r\n }\r\n };\r\n\r\n // 新方法:使用已获取的媒体流开始录音\r\n private startRecordingWithStream(stream: MediaStream) {\r\n try {\r\n // 检测浏览器支持的音频MIME类型\r\n const mimeType = this.getSupportedAudioMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let audioRecorder;\r\n try {\r\n audioRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType\r\n });\r\n } catch (e) {\r\n console.warn('指定的音频MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n audioRecorder = new MediaRecorder(stream);\r\n } catch (recorderError) {\r\n // 停止并释放媒体流\r\n stream.getTracks().forEach(track => track.stop());\r\n console.error('无法创建音频录制器:', recorderError);\r\n SentryReporter.captureError(recorderError, {\r\n action: 'startRecordingWithStream',\r\n component: 'pcm-app-chat-modal',\r\n title: '无法创建音频录制器'\r\n });\r\n ErrorEventBus.emitError({\r\n error: recorderError,\r\n message: '无法创建音频录制器'\r\n });\r\n return;\r\n }\r\n }\r\n\r\n this.audioRecorder = audioRecorder;\r\n this.audioChunks = [];\r\n this.isRecordingAudio = true;\r\n this.audioRecordingStartTime = Date.now();\r\n this.audioRecordingTimeLeft = this.maxAudioRecordingTime;\r\n\r\n // 设置数据可用事件处理\r\n audioRecorder.ondataavailable = (event) => {\r\n if (event.data.size > 0) {\r\n this.audioChunks.push(event.data);\r\n }\r\n };\r\n\r\n // 设置录制停止事件处理\r\n audioRecorder.onstop = () => {\r\n // 停止并释放媒体流\r\n stream.getTracks().forEach(track => track.stop());\r\n\r\n // 处理录制的音频\r\n this.processAudioRecording();\r\n };\r\n\r\n // 开始录制\r\n audioRecorder.start(100); // 每100毫秒获取一次数据\r\n\r\n // 设置录制计时器\r\n this.audioRecordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.audioRecordingStartTime) / 1000);\r\n this.audioRecordingTimeLeft = Math.max(0, this.maxAudioRecordingTime - elapsedTime);\r\n\r\n // 时间到自动停止录制\r\n if (this.audioRecordingTimeLeft <= 0) {\r\n this.stopAudioRecording();\r\n }\r\n }, 1000);\r\n\r\n } catch (error) {\r\n // 停止并释放媒体流\r\n stream.getTracks().forEach(track => track.stop());\r\n console.error('开始录音失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'startRecordingWithStream',\r\n component: 'pcm-app-chat-modal',\r\n title: '开始录音失败'\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '开始录音失败,请确保麦克风设备正常工作'\r\n });\r\n }\r\n }\r\n\r\n // 处理录制的音频\r\n private async processAudioRecording() {\r\n if (this.audioChunks.length === 0) {\r\n console.warn('没有录制到音频数据');\r\n return;\r\n }\r\n\r\n try {\r\n this.isConvertingAudio = true;\r\n\r\n // 创建音频Blob\r\n const audioType = this.getSupportedAudioMimeType() || 'audio/webm';\r\n const audioBlob = new Blob(this.audioChunks, { type: audioType });\r\n\r\n if (audioBlob.size === 0) {\r\n console.warn('录制的音频为空');\r\n this.isConvertingAudio = false;\r\n return;\r\n }\r\n\r\n // 创建File对象\r\n const fileExtension = audioType.includes('webm') ? 'webm' : 'mp3';\r\n const fileName = `audio_input.${fileExtension}`;\r\n const audioFile = new File([audioBlob], fileName, { type: audioType });\r\n\r\n // 上传音频文件\r\n const fileInfo = await uploadFileToBackend(audioFile, {\r\n\r\n }, {\r\n 'tags': ['audio']\r\n });\r\n\r\n // 调用音频转文字API\r\n const transcriptionText = await this.convertAudioToText(fileInfo.cos_key);\r\n\r\n // 将转录文本追加到文本框,而不是替换\r\n if (transcriptionText) {\r\n // 保存当前光标位置\r\n const textArea = this.hostElement.shadowRoot?.querySelector('.text-answer-input') as HTMLTextAreaElement;\r\n const cursorPosition = textArea?.selectionStart || this.textAnswer.length;\r\n\r\n // 在光标位置插入识别的文本\r\n const beforeCursor = this.textAnswer.substring(0, cursorPosition);\r\n const afterCursor = this.textAnswer.substring(cursorPosition);\r\n\r\n // 如果当前文本不为空且不以空格结尾,添加一个空格\r\n const spacer = (beforeCursor.length > 0 && !beforeCursor.endsWith(' ')) ? ' ' : '';\r\n\r\n // 更新文本\r\n this.textAnswer = beforeCursor + spacer + transcriptionText + afterCursor;\r\n\r\n // 设置新的光标位置\r\n setTimeout(() => {\r\n if (textArea) {\r\n const newPosition = cursorPosition + spacer.length + transcriptionText.length;\r\n textArea.focus();\r\n textArea.setSelectionRange(newPosition, newPosition);\r\n }\r\n }, 0);\r\n } else {\r\n console.warn('未能识别语音内容');\r\n alert('未能识别语音内容,请重试或直接输入文字');\r\n }\r\n } catch (error) {\r\n console.error('处理音频录制失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'processAudioRecording',\r\n component: 'pcm-app-chat-modal',\r\n title: '处理音频录制失败'\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '语音识别失败,请重试'\r\n });\r\n } finally {\r\n this.isConvertingAudio = false;\r\n this.audioChunks = [];\r\n }\r\n }\r\n\r\n // 获取支持的音频MIME类型\r\n private getSupportedAudioMimeType(): string {\r\n // 按优先级排列的音频MIME类型列表\r\n const mimeTypes = [\r\n 'audio/webm;codecs=opus',\r\n 'audio/webm',\r\n 'audio/mp4',\r\n 'audio/ogg;codecs=opus',\r\n 'audio/ogg',\r\n '' // 空字符串表示使用浏览器默认值\r\n ];\r\n\r\n // 检查MediaRecorder是否可用\r\n if (!window.MediaRecorder) {\r\n console.warn('MediaRecorder API不可用');\r\n return '';\r\n }\r\n\r\n // 检查每种MIME类型是否受支持\r\n for (const type of mimeTypes) {\r\n if (!type) return ''; // 如果是空字符串,直接返回\r\n\r\n try {\r\n if (MediaRecorder.isTypeSupported(type)) {\r\n return type;\r\n }\r\n } catch (e) {\r\n console.warn(`检查音频MIME类型支持时出错 ${type}:`, e);\r\n }\r\n }\r\n\r\n // 如果没有找到支持的类型,返回空字符串\r\n console.warn('没有找到支持的音频MIME类型,将使用浏览器默认值');\r\n return '';\r\n }\r\n\r\n // 停止录制音频\r\n private stopAudioRecording() {\r\n if (this.audioRecorder && this.isRecordingAudio) {\r\n this.audioRecorder.stop();\r\n this.isRecordingAudio = false;\r\n\r\n // 清理计时器\r\n if (this.audioRecordingTimer) {\r\n clearInterval(this.audioRecordingTimer);\r\n this.audioRecordingTimer = null;\r\n }\r\n }\r\n }\r\n\r\n // 处理历史会话按钮点击\r\n private handleHistoryClick = () => {\r\n console.log('点击历史会话按钮');\r\n this.isHistoryDrawerOpen = true;\r\n this.loadHistoryConversations();\r\n };\r\n\r\n // 获取历史会话列表\r\n private async loadHistoryConversations() {\r\n if (!this.botId) {\r\n console.warn('没有提供botId,无法获取历史会话');\r\n return;\r\n }\r\n\r\n this.isLoadingConversations = true;\r\n \r\n try {\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/conversations',\r\n method: 'GET',\r\n data: {\r\n bot_id: this.botId,\r\n limit: 50, // 获取最近50个会话\r\n page: 1\r\n }\r\n });\r\n\r\n if (result.success && result.data) {\r\n const conversations = result.data.data || [];\r\n \r\n // 格式化会话数据\r\n this.historyConversations = conversations.map((conv: any) => {\r\n // 处理时间戳,确保它是有效的数字\r\n let createdTime: Date;\r\n let timeDisplay = '未知时间';\r\n \r\n try {\r\n // 确保 created_at 是一个有效的时间戳\r\n const timestamp = typeof conv.created_at === 'string' ? parseInt(conv.created_at) : conv.created_at;\r\n \r\n if (isNaN(timestamp) || timestamp <= 0) {\r\n console.warn('无效的时间戳:', conv.created_at);\r\n createdTime = new Date();\r\n } else {\r\n // Unix时间戳转换为JavaScript Date对象(乘以1000转换为毫秒)\r\n createdTime = new Date(timestamp * 1000);\r\n }\r\n \r\n // 验证日期是否有效\r\n if (isNaN(createdTime.getTime())) {\r\n console.warn('无效的日期对象:', conv.created_at);\r\n createdTime = new Date();\r\n }\r\n \r\n const now = new Date();\r\n const diffTime = now.getTime() - createdTime.getTime();\r\n const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));\r\n \r\n // 格式化时间显示\r\n if (diffDays === 0) {\r\n // 今天\r\n timeDisplay = `今天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays === 1) {\r\n // 昨天\r\n timeDisplay = `昨天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays > 0 && diffDays < 7) {\r\n // 一周内\r\n const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];\r\n timeDisplay = `${weekdays[createdTime.getDay()]} ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays < 0) {\r\n // 未来时间(可能是时区问题或系统时间不准确)\r\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else {\r\n // 超过一周\r\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n }\r\n } catch (error) {\r\n console.error('时间格式化错误:', error, conv.created_at);\r\n timeDisplay = '时间解析失败';\r\n }\r\n\r\n return {\r\n id: conv.id,\r\n name: conv.name || '新会话',\r\n created_at: conv.created_at,\r\n updated_at: conv.updated_at,\r\n status: conv.status,\r\n message_count: conv.message_count || 0,\r\n timeDisplay\r\n } as ConversationItem;\r\n });\r\n }\r\n } catch (error) {\r\n console.error('获取历史会话失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'loadHistoryConversations',\r\n component: 'pcm-app-chat-modal',\r\n title: '获取历史会话失败'\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '获取历史会话失败'\r\n });\r\n } finally {\r\n this.isLoadingConversations = false;\r\n }\r\n }\r\n\r\n // 切换到指定会话\r\n private handleSwitchConversation = (conversationId: string) => {\r\n if (conversationId === this.conversationId) {\r\n // 如果点击的是当前会话,直接关闭抽屉\r\n this.isHistoryDrawerOpen = false;\r\n return;\r\n }\r\n\r\n // 切换到新会话\r\n this.conversationId = conversationId;\r\n this.messages = [];\r\n this.currentStreamingMessage = null;\r\n this.isTaskCompleted = false;\r\n this.currentQuestionNumber = 0;\r\n \r\n // 关闭抽屉\r\n this.isHistoryDrawerOpen = false;\r\n \r\n // 加载新会话的历史消息\r\n this.loadHistoryMessages();\r\n };\r\n\r\n\r\n // 修改事件处理方法\r\n private handleFilePreviewRequest = (event: CustomEvent<{\r\n url?: string,\r\n fileName: string,\r\n content?: string,\r\n contentType: 'file' | 'markdown' | 'text'\r\n }>) => {\r\n const { url, fileName, content, contentType } = event.detail;\r\n\r\n this.previewFileName = fileName || '内容预览';\r\n this.previewContentType = contentType;\r\n this.previewUrl = url;\r\n this.previewContent = content || '';\r\n this.isDrawerOpen = true;\r\n };\r\n\r\n render() {\r\n if (!this.isOpen) return null;\r\n\r\n const modalStyle = {\r\n zIndex: String(this.zIndex)\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen\r\n };\r\n\r\n const renderVideoPreview = () => (\r\n <div class=\"video-preview\">\r\n <video\r\n autoPlay\r\n playsInline\r\n muted\r\n style={{ transform: 'scaleX(-1)' }}\r\n ref={(el) => {\r\n if (el && this.recordingStream && !this.videoRef) {\r\n this.videoRef = el;\r\n // 不在这里设置srcObject,而是使用setupVideoPreview方法\r\n }\r\n }}\r\n ></video>\r\n <div class={{\r\n 'recording-status': true,\r\n 'warning': this.showCountdownWarning\r\n }}>\r\n <span class=\"recording-dot\"></span>\r\n <span>\r\n 录制中 {Math.floor(this.recordingTimeLeft / 60)}:{(this.recordingTimeLeft % 60).toString().padStart(2, '0')}\r\n {this.showCountdownWarning && ` (即将自动完成)`}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n\r\n // 渲染占位符状态信息\r\n const renderPlaceholderStatus = () => {\r\n // 设备错误状态 - 优先显示\r\n if (this.deviceError) {\r\n return (\r\n <div class=\"placeholder-status error-status\">\r\n\r\n <p>{this.deviceError}</p>\r\n <div class=\"error-suggestions\">\r\n <p>请尝试以下解决方案:</p>\r\n <ul>\r\n <li>更换有摄像头和麦克风的设备</li>\r\n <li>确保已允许浏览器访问摄像头和麦克风</li>\r\n <li>关闭其他正在使用摄像头/麦克风的应用</li>\r\n </ul>\r\n </div>\r\n\r\n </div>\r\n );\r\n }\r\n\r\n // 任务已完成\r\n if (this.isTaskCompleted) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>面试已完成,感谢您的参与!</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在播放音频\r\n if (this.isPlayingAudio) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>正在播放问题,请听完后准备回答...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在上传视频\r\n if (this.isUploadingVideo) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>正在上传视频,请稍候...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在加载或等待AI回复\r\n if (this.isLoading || this.currentStreamingMessage) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>请等待题目...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 等待开始录制\r\n if (this.waitingToRecord) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>请准备好,{this.waitingTimeLeft}秒后将开始录制您的回答...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 添加默认状态\r\n return (\r\n <div class=\"placeholder-status default-status\">\r\n <p>准备中...</p>\r\n </div>\r\n );\r\n };\r\n\r\n // 修改文本输入区域渲染函数\r\n const renderTextInputArea = () => (\r\n <div class=\"text-input-area\">\r\n <textarea\r\n class=\"text-answer-input\"\r\n placeholder={this.isTaskCompleted ? \"会话已结束\" : \"发消息\"}\r\n value={this.textAnswer}\r\n onInput={this.handleTextInputChange}\r\n onKeyDown={this.handleKeyDown}\r\n disabled={this.isTaskCompleted || this.isRecordingAudio || this.isConvertingAudio}\r\n ></textarea>\r\n <div class=\"input-toolbar\">\r\n <div class=\"toolbar-actions\">\r\n <button\r\n class={{\r\n 'toolbar-button': true,\r\n 'recording': this.isRecordingAudio,\r\n 'converting': this.isConvertingAudio\r\n }}\r\n title={this.isRecordingAudio ? '点击停止录音' : this.isConvertingAudio ? '正在识别语音...' : '语音输入'}\r\n onClick={this.handleVoiceInputClick}\r\n disabled={this.isTaskCompleted || this.isConvertingAudio || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio}\r\n >\r\n {this.isRecordingAudio ? (\r\n <div>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3z\" />\r\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\" />\r\n <circle cx=\"12\" cy=\"11\" r=\"4\" fill=\"red\" />\r\n </svg>\r\n {/* <span class=\"recording-time\">{this.audioRecordingTimeLeft}s</span> */}\r\n </div>\r\n ) : this.isConvertingAudio ? (\r\n <div class=\"converting-indicator\">\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\" />\r\n </svg>\r\n </div>\r\n ) : (\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3z\" />\r\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\" />\r\n </svg>\r\n )}\r\n </button>\r\n </div>\r\n <div\r\n class={{\r\n 'send-button': true,\r\n 'disabled': this.isTaskCompleted || !this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio || this.isRecordingAudio || this.isConvertingAudio\r\n }}\r\n onClick={() => {\r\n if (this.isTaskCompleted || !this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio || this.isRecordingAudio || this.isConvertingAudio) {\r\n return;\r\n }\r\n this.submitTextAnswer();\r\n }}\r\n >\r\n <img src=\"https://pcm-pub-1351162788.cos.ap-guangzhou.myqcloud.com/sdk/image/i_send.png\" alt=\"发送\" />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n\r\n // 确定要使用的助手头像\r\n const effectiveAssistantAvatar = this.assistantAvatar || this.agentLogo;\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div class=\"chat-container\">\r\n <div class=\"chat-history\"\r\n onScroll={this.handleScroll}\r\n onTouchStart={this.handleTouchStart}\r\n onTouchEnd={this.handleTouchEnd}\r\n onWheel={this.handleWheel}\r\n >\r\n {this.isLoadingHistory ? (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p>加载历史消息中...</p>\r\n </div>\r\n ) : (\r\n <div>\r\n {this.messages.map((message) => (\r\n <div id={`message_${message.id}`} key={message.id}>\r\n <pcm-chat-message\r\n botId={this.botId}\r\n message={message}\r\n userAvatar={this.userAvatar}\r\n assistantAvatar={effectiveAssistantAvatar}\r\n showCopyButton={this.showCopyButton}\r\n showFeedbackButtons={this.showFeedbackButtons}\r\n filePreviewMode={this.filePreviewMode}\r\n onFilePreviewRequest={this.handleFilePreviewRequest}\r\n onMessageChange={(event) => {\r\n const updatedMessages = this.messages.map(msg =>\r\n msg.id === message.id ? { ...msg, ...event.detail } : msg\r\n );\r\n this.messages = updatedMessages;\r\n }}\r\n ></pcm-chat-message>\r\n </div>\r\n ))}\r\n {this.currentStreamingMessage && (\r\n <div id={`message_${this.currentStreamingMessage.id}`}>\r\n <pcm-chat-message\r\n botId={this.botId}\r\n message={this.currentStreamingMessage}\r\n userAvatar={this.userAvatar}\r\n assistantAvatar={effectiveAssistantAvatar}\r\n showCopyButton={this.showCopyButton}\r\n showFeedbackButtons={this.showFeedbackButtons}\r\n filePreviewMode={this.filePreviewMode}\r\n onFilePreviewRequest={this.handleFilePreviewRequest}\r\n ></pcm-chat-message>\r\n </div>\r\n )}\r\n {this.messages.length === 0 && !this.currentStreamingMessage && (\r\n <div class=\"empty-state\">\r\n <p>正在准备面试...</p>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div class=\"recording-section\">\r\n <div class=\"recording-container\">\r\n {/* 工作区 */}\r\n {this.showWorkspaceHistory && (\r\n <div class=\"workspace-section\">\r\n <div class=\"workspace-toolbar\">\r\n <button class=\"workspace-button history-button\" onClick={() => this.handleHistoryClick()}>\r\n <span>历史会话</span>\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n {\r\n this.interviewMode === 'text' && (\r\n renderTextInputArea()\r\n )\r\n }\r\n {this.interviewMode === 'video' && (\r\n <div class=\"video-container\">\r\n <div class=\"video-area\">\r\n {this.showRecordingUI ? (\r\n renderVideoPreview()\r\n ) : (\r\n <div class=\"video-preview placeholder\">\r\n {renderPlaceholderStatus()}\r\n </div>\r\n )}\r\n\r\n </div>\r\n <div class=\"recording-controls\">\r\n {this.showRecordingUI ? (\r\n <button\r\n class=\"stop-recording-button\"\r\n onClick={() => this.stopRecording()}\r\n >\r\n 完成本题回答\r\n </button>\r\n ) : (\r\n <div class=\"waiting-message\">\r\n {(() => {\r\n // 显示播放按钮(当不自动播放且有音频URL时)\r\n if (!this.enableVoice && this.audioUrl && !this.isPlayingAudio) {\r\n return (\r\n <div class=\"play-audio-container\" onClick={this.handlePlayAudio}>\r\n <p>\r\n <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"currentColor\" style={{ verticalAlign: 'middle', marginRight: '8px' }}>\r\n <path d=\"M8 5v14l11-7z\" />\r\n </svg>\r\n <span style={{ verticalAlign: 'middle' }}>播放题目</span>\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // 其他状态下显示禁用的\"完成回答\"按钮\r\n return (\r\n <button class=\"stop-recording-button disabled\" disabled>\r\n 完成回答\r\n </button>\r\n );\r\n })()}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n {/* 添加预览抽屉 */}\r\n <pcm-drawer\r\n isOpen={this.isDrawerOpen}\r\n drawerTitle={this.previewFileName}\r\n width=\"80%\"\r\n onClosed={() => {\r\n this.isDrawerOpen = false;\r\n this.previewUrl = '';\r\n this.previewContent = '';\r\n }}\r\n >\r\n {this.previewContentType === 'file' && this.previewUrl && (\r\n <div class=\"file-preview-container\">\r\n <iframe\r\n src={this.previewUrl}\r\n frameborder=\"0\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n style={{ border: 'none', height: 'calc(100vh - 120px)' }}\r\n ></iframe>\r\n </div>\r\n )}\r\n\r\n {this.previewContentType === 'markdown' && this.previewContent && (\r\n <div class=\"markdown-preview-container markdown-body\" innerHTML={marked(this.previewContent)}></div>\r\n )}\r\n\r\n {this.previewContentType === 'text' && this.previewContent && (\r\n <div class=\"text-preview-container\">\r\n <pre>{this.previewContent}</pre>\r\n </div>\r\n )}\r\n </pcm-drawer>\r\n\r\n {/* 历史会话抽屉 */}\r\n <pcm-drawer\r\n isOpen={this.isHistoryDrawerOpen}\r\n drawerTitle=\"历史会话\"\r\n width=\"400px\"\r\n onClosed={() => {\r\n this.isHistoryDrawerOpen = false;\r\n }}\r\n >\r\n <div class=\"history-drawer-content\">\r\n\r\n {/* 会话列表 */}\r\n <div class=\"conversation-list\">\r\n {this.isLoadingConversations ? (\r\n <div class=\"loading-conversations\">\r\n <div class=\"loading-spinner-small\"></div>\r\n <p>加载中...</p>\r\n </div>\r\n ) : this.historyConversations.length === 0 ? (\r\n <div class=\"empty-conversations\">\r\n <p>暂无历史会话</p>\r\n </div>\r\n ) : (\r\n this.historyConversations.map((conversation) => (\r\n <div \r\n key={conversation.id}\r\n class={{\r\n 'conversation-item': true,\r\n 'active': conversation.id === this.conversationId\r\n }}\r\n onClick={() => this.handleSwitchConversation(conversation.id)}\r\n >\r\n <div class=\"conversation-info\">\r\n <div class=\"conversation-title\">{conversation.name}</div>\r\n <div class=\"conversation-meta\">\r\n <span class=\"conversation-time\">{conversation.timeDisplay}</span>\r\n {conversation.message_count > 0 && (\r\n <span class=\"message-count\">{conversation.message_count}条消息</span>\r\n )}\r\n {conversation.status && (\r\n <span class={{\r\n 'conversation-status': true,\r\n 'completed': conversation.status === '结束',\r\n 'running': conversation.status === '进行中'\r\n }}>\r\n {conversation.status}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n {conversation.id === this.conversationId && (\r\n <div class=\"current-indicator\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/>\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n </pcm-drawer>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"pcm-app-chat-modal.js","sourceRoot":"","sources":["../../../../src/components/pcm-app-chat-modal/pcm-app-chat-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, h, State, Event, EventEmitter, Element, Watch } from '@stencil/core';\nimport { sendSSERequest, sendHttpRequest, uploadFileToBackend, fetchAgentInfo, synthesizeAudio } from '../../utils/utils';\nimport { ChatMessage, ConversationItem } from '../../interfaces/chat';\nimport {\n StreamCompleteEventData,\n ConversationStartEventData,\n InterviewCompleteEventData,\n RecordingErrorEventData,\n RecordingStatusChangeEventData\n} from '../../interfaces/events';\nimport { marked } from 'marked';\nimport { ErrorEventBus } from '../../utils/error-event';\nimport { authStore } from '../../../store/auth.store'; // 导入 authStore\nimport { configStore } from '../../../store/config.store';\nimport { SentryReporter } from '../../utils/sentry-reporter';\n\n@Component({\n tag: 'pcm-app-chat-modal',\n styleUrls: ['pcm-app-chat-modal.css', '../../global/markdown.css',],\n shadow: true,\n})\nexport class ChatAPPModal {\n /**\n * 模态框标题\n */\n @Prop() modalTitle: string = '在线客服';\n\n /**\n * SDK鉴权密钥\n */\n @Prop({ attribute: 'token' }) token?: string;\n\n /**\n * 是否显示聊天模态框\n */\n @Prop({ mutable: true }) isOpen: boolean = false;\n\n /**\n * 聊天消息历史\n */\n @State() messages: ChatMessage[] = [];\n\n\n /**\n * 当点击模态框关闭时触发\n */\n @Event() modalClosed: EventEmitter<void>;\n\n /**\n * 应用图标URL\n */\n @Prop() icon?: string;\n\n /**\n * 聊天框的页面层级\n */\n @Prop({ mutable: true }) zIndex?: number;\n\n /**\n * 是否展示顶部标题栏\n */\n @Prop() isShowHeader: boolean = true;\n\n /**\n * 是否展示右上角的关闭按钮\n */\n @Prop() isNeedClose: boolean = true;\n\n\n /**\n * 会话ID,传入继续对话,否则创建新会话\n */\n @Prop({ mutable: true }) conversationId?: string;\n\n /**\n * 当前助手回复的消息\n */\n @State() currentAssistantMessage: string = '';\n\n /**\n * 是否正在加载回复\n */\n @State() isLoading: boolean = false;\n\n /**\n * 当前正在流式输出的消息\n */\n @State() currentStreamingMessage: ChatMessage | null = null;\n\n // 添加新的状态控制\n @State() shouldAutoScroll: boolean = true;\n\n @State() isLoadingHistory: boolean = false;\n\n // 使用 @Element 装饰器获取组件的 host 元素\n @Element() hostElement: HTMLElement;\n\n /**\n * 一轮对话结束时的回调\n */\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\n\n /**\n * 新会话开始的回调,只会在一轮对话开始时触发一次\n */\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\n\n @State() isUploading: boolean = false;\n\n /**\n * 默认发送文本\n */\n @Prop() defaultQuery: string = '你好!聘才猫';\n\n\n /**\n * 视频录制最大时长(秒)\n */\n @Prop() maxRecordingTime: number = 120;\n\n /**\n * 录制倒计时提醒时间(秒)\n * 当剩余时间小于此值时,显示倒计时警告\n */\n @Prop() countdownWarningTime: number = 30;\n\n // 添加视频录制相关状态\n @State() isRecording: boolean = false;\n @State() recordingStream: MediaStream | null = null;\n @State() recordedBlob: Blob | null = null;\n @State() mediaRecorder: MediaRecorder | null = null;\n @State() recordingTimeLeft: number = 0;\n @State() showRecordingUI: boolean = false;\n @State() recordingTimer: any = null;\n @State() recordingStartTime: number = 0;\n @State() waitingToRecord: boolean = false;\n @State() waitingTimer: any = null;\n @State() waitingTimeLeft: number = 10; // 等待时间(秒)\n\n // 添加一个新的私有属性来存储视频元素的引用\n private videoRef: HTMLVideoElement | null = null;\n\n\n /**\n * 当前轮数\n */\n @State() currentQuestionNumber: number = 0;\n\n\n /**\n * 当聊天完成时触发\n */\n @Event() interviewComplete: EventEmitter<InterviewCompleteEventData>;\n\n private readonly SCROLL_THRESHOLD = 20;\n\n\n\n @State() showCountdownWarning: boolean = false;\n\n /**\n * 是否以全屏模式打开,移动端建议设置为true\n */\n @Prop() fullscreen: boolean = false;\n\n // 添加新的状态来跟踪视频上传\n @State() isUploadingVideo: boolean = false;\n\n // 添加新的状态和属性\n @State() isPlayingAudio: boolean = false;\n @State() audioUrl: string | null = null;\n private audioElement: HTMLAudioElement | null = null;\n\n /**\n * 录制错误事件\n */\n @Event() recordingError: EventEmitter<RecordingErrorEventData>;\n\n /**\n * 录制状态变化事件\n */\n @Event() recordingStatusChange: EventEmitter<RecordingStatusChangeEventData>;\n\n /**\n * SDK密钥验证失败事件\n */\n @Event() tokenInvalid: EventEmitter<void>;\n\n /**\n * 是否启用语音播报功能\n * true: 启用语音合成\n * false: 禁用语音合成\n */\n @Prop() enableTTS: boolean = false;\n\n /**\n * 是否自动播放语音问题\n */\n @Prop() enableVoice: boolean = false;\n\n /**\n * 面试模式\n * video: 视频面试模式\n * text: 文字面试模式\n */\n @Prop() interviewMode: 'video' | 'text' = 'video';\n\n // 添加文字输入相关状态\n @State() textAnswer: string = '';\n @State() isSubmittingText: boolean = false;\n\n /**\n * 自定义智能体inputs输入参数\n */\n @Prop() customInputs: Record<string, string> = {};\n\n /**\n * 机器人ID\n */\n @Prop() botId?: string;\n\n // 添加语音输入相关状态\n @State() isRecordingAudio: boolean = false;\n @State() audioRecorder: MediaRecorder | null = null;\n @State() audioChunks: BlobPart[] = [];\n @State() isConvertingAudio: boolean = false;\n @State() audioRecordingTimeLeft: number = 60; // 最大录音时间(秒)\n @State() audioRecordingTimer: any = null;\n @State() audioRecordingStartTime: number = 0;\n\n /**\n * 语音录制最大时长(秒)\n */\n @Prop() maxAudioRecordingTime: number = 60;\n\n /**\n * 用户头像URL\n */\n @Prop() userAvatar?: string = \"https://pub.pincaimao.com/static/common/i_pcm_logo.png\";\n\n /**\n * 助手头像URL\n */\n @Prop() assistantAvatar?: string;\n\n /**\n * 智能体头像URL(从后端获取)\n */\n @State() agentLogo: string = '';\n\n\n // 添加新的状态属性来跟踪任务是否已完成\n @State() isTaskCompleted: boolean = false;\n\n private tokenInvalidListener: () => void;\n\n /**\n * 是否显示复制按钮\n */\n @Prop() showCopyButton: boolean = true;\n\n /**\n * 是否显示点赞点踩按钮\n */\n @Prop() showFeedbackButtons: boolean = true;\n\n /**\n * 附件预览模式\n * 'drawer': 在右侧抽屉中预览\n * 'window': 在新窗口中打开\n */\n @Prop() filePreviewMode: 'drawer' | 'window' = 'window';\n\n /**\n * 是否显示工作区历史会话按钮\n */\n @Prop() showWorkspaceHistory: boolean = false;\n\n // 添加新的状态来管理抽屉\n @State() isDrawerOpen: boolean = false;\n @State() previewUrl: string = '';\n @State() previewFileName: string = '';\n\n // 添加内容类型状态\n @State() previewContentType: 'file' | 'markdown' | 'text' = 'file';\n @State() previewContent: string = '';\n\n // 添加新的状态来追踪用户交互\n @State() isUserScrolling: boolean = false;\n\n @State() deviceError: string | null = null;\n\n // 添加历史会话相关状态\n @State() isHistoryDrawerOpen: boolean = false;\n @State() historyConversations: ConversationItem[] = [];\n @State() isLoadingConversations: boolean = false;\n\n @Watch('token')\n handleTokenChange(newToken: string) {\n // 当传入的 token 变化时,更新 authStore 中的 token\n if (newToken && newToken !== authStore.getToken()) {\n authStore.setToken(newToken);\n }\n }\n\n constructor() {\n // 配置 marked 选项\n marked.setOptions({\n breaks: true,\n gfm: true\n });\n }\n\n componentWillLoad() {\n // 将 zIndex 存入配置缓存\n if (this.zIndex) {\n configStore.setItem('modal-zIndex', this.zIndex);\n } else {\n // 如果没有提供 zIndex,尝试从缓存中读取\n const cachedZIndex = configStore.getItem<number>('modal-zIndex');\n if (cachedZIndex) {\n this.zIndex = cachedZIndex;\n } else {\n this.zIndex = 1000;\n configStore.setItem('modal-zIndex', 1000);\n }\n }\n\n if (this.token) {\n authStore.setToken(this.token);\n }\n\n // 添加全局token无效事件监听器\n this.tokenInvalidListener = () => {\n this.tokenInvalid.emit();\n };\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\n\n // 确保 customInputs 是一个对象\n if (!this.customInputs) {\n this.customInputs = {};\n }\n\n // 如果没有设置助手头像,尝试获取智能体头像\n if (!this.assistantAvatar && this.botId) {\n\n this.fetchAgentLogo();\n }\n\n // 如果组件加载时已经是打开状态,则直接开始对话\n if (this.isOpen) {\n if (this.conversationId) {\n // 在下一个事件循环中加载历史消息,避免在componentWillLoad中进行异步操作\n setTimeout(() => this.loadHistoryMessages(), 0);\n } else {\n // 在下一个事件循环中发送初始消息,避免在componentWillLoad中进行异步操作\n setTimeout(() => {\n this.sendMessageToAPI(this.defaultQuery);\n }, 0);\n }\n }\n }\n\n private handleClose = () => {\n this.stopRecording();\n this.modalClosed.emit();\n };\n\n // 添加获取智能体信息的方法\n private async fetchAgentLogo() {\n if (!this.botId) return;\n\n try {\n const agentInfo = await fetchAgentInfo(this.botId);\n\n if (agentInfo && agentInfo.logo) {\n this.agentLogo = agentInfo.logo;\n }\n } catch (error) {\n SentryReporter.captureError(error, {\n action: 'fetchAgentLogo',\n component: 'pcm-app-chat-modal',\n title: '获取智能体信息失败'\n });\n ErrorEventBus.emitError({\n error: error,\n message: '获取智能体信息失败'\n });\n }\n }\n\n private async sendMessageToAPI(message: string, videoUrl?: string) {\n this.isLoading = true;\n let answer = '';\n let llmText = '';\n\n const now = new Date();\n const time = `${now.getHours()}:${now.getMinutes().toString().padStart(2, '0')}`;\n\n // 修改消息处理逻辑,移除文件上传相关代码\n const queryText = message.trim() || '请开始';\n\n // 如果有视频URL,添加到customInputs中\n if (videoUrl) {\n this.customInputs = {\n ...this.customInputs,\n video_url: videoUrl\n };\n }\n\n // 创建新的消息对象\n const newMessage: ChatMessage = {\n id: `temp-${Date.now()}`, // 临时ID,将被服务器返回的ID替换\n conversation_id: this.conversationId, // 会话ID\n parent_message_id: \"00000000-0000-0000-0000-000000000000\", // 默认父消息ID\n inputs: this.customInputs || {}, // 输入参数\n query: queryText, // 用户输入的消息内容\n answer: '', // 初始为空\n message_files: [], // 消息附件\n feedback: {}, // 反馈\n retriever_resources: [], // 检索资源\n created_at: Math.floor(Date.now() / 1000).toString(), // 创建时间\n agent_thoughts: [], // 代理思考过程\n status: \"normal\", // 消息状态\n error: null, // 错误信息\n // 添加组件内部使用的字段\n time: time, // 消息时间(显示用)\n isStreaming: true // 是否正在流式输出\n };\n\n // 设置当前流式消息\n this.currentStreamingMessage = newMessage;\n\n // 滚动到底部\n setTimeout(() => {\n this.shouldAutoScroll = true;\n this.scrollToBottom();\n }, 200);\n\n // 准备请求数据\n const requestData: any = {\n response_mode: 'streaming',\n conversation_id: this.conversationId,\n query: queryText,\n bot_id: this.botId // 添加 botId 到请求数据中\n };\n\n // 合并基本输入参数和自定义输入参数\n requestData.inputs = {\n // 合并自定义输入参数\n ...this.customInputs\n };\n\n await sendSSERequest({\n url: '/sdk/v1/chat/chat-messages',\n method: 'POST',\n data: requestData,\n onMessage: (data) => {\n console.log('收到Stream数据:', data);\n\n if (data.conversation_id && !this.conversationId) {\n this.conversationId = data.conversation_id;\n this.conversationStart.emit({\n conversation_id: data.conversation_id,\n event: data.event,\n message_id: data.message_id,\n id: data.id,\n });\n }\n\n // 检查是否有 node_finished 事件和 LLMText\n if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {\n llmText = data.data.inputs.LLMText;\n }\n\n // 添加对任务结束的判断\n if (data.event === 'node_finished' && data.data.title && data.data.title.includes('聘才猫任务结束')) {\n console.log('检测到任务结束事件:', data);\n\n // 设置标志,表示任务已结束\n this.isTaskCompleted = true;\n\n // 获取当前AI回复内容,优先使用LLMText,否则使用answer\n const aiResponse = llmText || answer || (this.currentStreamingMessage?.answer) || '';\n\n // 触发面试完成事件\n this.interviewComplete.emit({\n conversation_id: this.conversationId,\n current_question_number: this.currentQuestionNumber,\n ai_response: aiResponse, // 添加AI回复内容\n });\n }\n\n if (data.event === 'message') {\n if (data.event === 'agent_message' || data.event === 'message') {\n if (data.answer) {\n answer += data.answer;\n // 更新消息时保持完整的消息结构\n const updatedMessage: ChatMessage = {\n ...this.currentStreamingMessage,\n answer,\n id: data.message_id || this.currentStreamingMessage.id,\n isStreaming: true,\n // 如果服务器返回了其他字段,也更新它们\n parent_message_id: data.parent_message_id || this.currentStreamingMessage.parent_message_id,\n retriever_resources: data.retriever_resources || this.currentStreamingMessage.retriever_resources,\n agent_thoughts: data.agent_thoughts || this.currentStreamingMessage.agent_thoughts\n };\n this.currentStreamingMessage = updatedMessage;\n this.scrollToBottom();\n }\n }\n }\n if (data.event === \"message_end\") {\n this.streamComplete.emit({\n conversation_id: data.conversation_id || '',\n event: data.event,\n message_id: data.message_id,\n id: data.id,\n });\n }\n },\n onError: (error) => {\n console.error('发生错误:', error);\n ErrorEventBus.emitError({\n error: error,\n message: '消息发送失败,请稍后再试'\n });\n SentryReporter.captureError(error, {\n action: 'sendMessageToAPI',\n component: 'pcm-app-chat-modal',\n title: '消息发送失败'\n });\n\n this.messages = [...this.messages, {\n ...newMessage,\n answer: '抱歉,发生了错误,请稍后再试。',\n error: error,\n isStreaming: false\n }];\n this.currentStreamingMessage = null;\n this.isLoading = false;\n },\n onComplete: async () => {\n this.isLoading = false;\n // 发送第一条消息后,清空 customInputs\n // setTimeout(() => {\n // if (this.customInputs) {\n // Object.keys(this.customInputs).forEach(key => {\n // delete this.customInputs[key];\n // });\n // }\n // }, 1000); // 给一些时间让第一条消息处理完成\n\n // 获取最新的AI回复内容\n const latestAIMessage = this.currentStreamingMessage;\n latestAIMessage.isStreaming = false;\n this.currentStreamingMessage = null;\n\n // 更新消息列表\n this.messages = [...this.messages, latestAIMessage];\n\n\n // 增加题目计数\n this.currentQuestionNumber++;\n\n if (this.isTaskCompleted) {\n return;\n }\n\n if (latestAIMessage && latestAIMessage.answer) {\n // 优先使用 LLMText,如果没有则使用 answer\n const textForSynthesis = llmText || latestAIMessage.answer;\n\n if (textForSynthesis && this.enableTTS) {\n // 使用工具函数合成语音\n const audioUrl = await synthesizeAudio(textForSynthesis);\n\n if (this.enableVoice) {\n // 自动播放语音\n await this.playAudio(audioUrl);\n // 自动播放模式下,只在视频模式时开始等待录制\n if (this.interviewMode === 'video') {\n this.startWaitingToRecord();\n }\n } else {\n // 只保存音频URL,不自动播放\n this.audioUrl = audioUrl;\n }\n } else if (this.interviewMode === 'video') {\n // 如果禁用了语音合成,只在视频模式时开始等待录制\n this.startWaitingToRecord();\n }\n }\n }\n });\n }\n\n\n // 修改滚动处理函数\n private handleScroll = () => {\n // 只有当用户正在滚动时才更新自动滚动状态\n if (this.isUserScrolling) {\n\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\n if (!chatHistory) return;\n\n const { scrollTop, scrollHeight, clientHeight } = chatHistory;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\n // 更新是否应该自动滚动的状态\n this.shouldAutoScroll = distanceFromBottom <= this.SCROLL_THRESHOLD;\n\n }\n };\n\n // 添加触摸开始事件处理\n private handleTouchStart = () => {\n this.isUserScrolling = true;\n };\n\n // 添加触摸结束事件处理\n private handleTouchEnd = () => {\n setTimeout(() => {\n this.isUserScrolling = false;\n }, 100); // 添加小延迟以确保滚动事件处理完成\n };\n\n private _wheelTimer: any = null;\n\n // 添加鼠标滚轮事件处理\n private handleWheel = () => {\n this.isUserScrolling = true;\n\n // 清除之前的定时器(如果存在)\n if (this._wheelTimer) {\n clearTimeout(this._wheelTimer);\n }\n\n // 设置新的定时器\n this._wheelTimer = setTimeout(() => {\n this.isUserScrolling = false;\n }, 150); // 滚轮停止后的延迟时间\n };\n\n private scrollToBottom() {\n if (!this.shouldAutoScroll) return;\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\n if (chatHistory && this.isOpen) {\n // 强制浏览器重新计算布局\n chatHistory.scrollTop = chatHistory.scrollHeight;\n }\n }\n\n\n // 修改加载历史消息的方法\n private async loadHistoryMessages() {\n if (!this.conversationId) return;\n\n this.isLoadingHistory = true;\n console.log('加载历史消息...');\n let conversationStatus = false;\n\n try {\n // 首先获取会话状态\n const conversationStatusResponse = await sendHttpRequest({\n url: `/sdk/v1/chat/conversation`,\n method: 'GET',\n data: {\n conversation_id: this.conversationId\n }\n });\n // 处理会话状态\n if (conversationStatusResponse.success && conversationStatusResponse.data && conversationStatusResponse.data.run_status == '结束') {\n conversationStatus = true;\n }\n\n // 获取历史消息\n const result = await sendHttpRequest({\n url: '/sdk/v1/chat/messages',\n method: 'GET',\n data: {\n conversation_id: this.conversationId,\n bot_id: this.botId,\n limit: 20\n }\n });\n\n if (result.success && result.data) {\n const historyData = result.data.data || [];\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\n const time = new Date(parseInt(msg.created_at) * 1000);\n const hours = time.getHours().toString().padStart(2, '0');\n const minutes = time.getMinutes().toString().padStart(2, '0');\n const timeStr = `${hours}:${minutes}`;\n\n // 创建完整的消息对象,保持统一结构\n return {\n id: msg.id,\n conversation_id: msg.conversation_id,\n parent_message_id: msg.parent_message_id || \"00000000-0000-0000-0000-000000000000\",\n inputs: msg.inputs || {},\n query: msg.query || \"\",\n answer: msg.answer || \"\",\n message_files: msg.message_files || [],\n feedback: msg.feedback || {},\n retriever_resources: msg.retriever_resources || [],\n created_at: msg.created_at,\n agent_thoughts: msg.agent_thoughts || [],\n status: msg.status || \"normal\",\n error: msg.error,\n // 组件内部使用的字段\n time: timeStr,\n isStreaming: false\n };\n });\n\n this.messages = formattedMessages;\n }\n } catch (error) {\n console.error('加载历史消息或会话状态失败:', error);\n SentryReporter.captureError(error, {\n action: 'loadHistoryMessages',\n component: 'pcm-app-chat-modal',\n title: '加载历史消息失败'\n });\n ErrorEventBus.emitError({\n error: error,\n message: '加载历史消息失败,请刷新重试'\n });\n } finally {\n this.isLoadingHistory = false;\n setTimeout(async () => {\n this.shouldAutoScroll = true;\n this.scrollToBottom();\n\n // 如果有会话ID且有历史消息,且会话未结束,处理继续对话的逻辑\n if (this.conversationId && this.messages.length > 0 && !conversationStatus) {\n const lastAIMessage = this.messages[this.messages.length - 1];\n\n // 如果有AI消息且启用了语音合成功能\n if (lastAIMessage && lastAIMessage.answer && this.enableTTS) {\n // 合成语音\n const audioUrl = await synthesizeAudio(lastAIMessage.answer);\n\n if (this.enableVoice) {\n // 自动播放语音\n await this.playAudio(audioUrl);\n // 播放完成后,只在视频模式时开始等待录制\n if (this.interviewMode === 'video') {\n this.startWaitingToRecord();\n }\n } else {\n // 只保存音频URL,不自动播放\n this.audioUrl = audioUrl;\n // 非自动播放模式下,不立即开始等待录制\n }\n } else if (!this.enableTTS && this.interviewMode === 'video') {\n // 如果禁用了语音合成功能,且是视频模式,直接开始等待录制\n this.startWaitingToRecord();\n }\n } else if (conversationStatus) {\n // 如果会话已结束,设置任务完成状态\n this.isTaskCompleted = true;\n\n }\n }, 200);\n }\n }\n\n // 开始等待录制\n private startWaitingToRecord() {\n // 如果不是视频模式,直接返回\n if (this.interviewMode !== 'video') {\n return;\n }\n\n // 清除可能存在的计时器\n if (this.waitingTimer) {\n clearInterval(this.waitingTimer);\n }\n if (this.recordingTimer) {\n clearInterval(this.recordingTimer);\n }\n\n this.waitingToRecord = true;\n this.waitingTimeLeft = 10;\n\n this.waitingTimer = setInterval(() => {\n this.waitingTimeLeft--;\n if (this.waitingTimeLeft <= 0) {\n clearInterval(this.waitingTimer);\n this.waitingTimer = null;\n this.waitingToRecord = false;\n this.startRecording();\n }\n }, 1000);\n }\n\n // 开始录制视频\n private async startRecording() {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n video: {\n width: { ideal: 1280 },\n height: { ideal: 720 },\n frameRate: { ideal: 30 }\n }\n });\n\n // 如果成功获取到媒体流,清除之前的设备错误\n this.deviceError = null;\n\n this.recordingStream = stream;\n this.showRecordingUI = true;\n this.showCountdownWarning = false;\n\n // 重置视频引用\n this.videoRef = null;\n\n // 确保视频元素获取到流\n this.setupVideoPreview(stream);\n\n // 检测浏览器支持的MIME类型\n const mimeType = this.getSupportedMimeType();\n\n // 创建MediaRecorder实例\n let mediaRecorder;\n try {\n mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n videoBitsPerSecond: 800000, // 800kbps 视频比特率限制\n audioBitsPerSecond: 64000 // 64kbps 音频比特率限制\n });\n } catch (e) {\n // 如果指定MIME类型失败,尝试使用默认设置\n console.warn('指定的MIME类型不受支持,使用默认设置:', e);\n try {\n mediaRecorder = new MediaRecorder(stream, {\n videoBitsPerSecond: 800000, // 即使降级也保持比特率限制\n audioBitsPerSecond: 64000\n });\n } catch (recorderError) {\n // 最后的降级选项,不设置任何参数\n try {\n mediaRecorder = new MediaRecorder(stream);\n } catch (finalError) {\n // 通知父组件录制器创建失败\n this.recordingError.emit({\n type: 'recorder_creation_failed',\n message: '无法创建媒体录制器,您的浏览器可能不支持此功能',\n details: finalError\n });\n this.showRecordingUI = false;\n return;\n }\n }\n }\n\n this.mediaRecorder = mediaRecorder;\n\n const chunks: BlobPart[] = [];\n\n mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n chunks.push(event.data);\n }\n };\n\n mediaRecorder.onerror = (event) => {\n // 通知父组件录制过程中发生错误\n this.recordingError.emit({\n type: 'recording_error',\n message: '录制过程中发生错误',\n details: event\n });\n this.stopRecording();\n };\n\n mediaRecorder.onstop = () => {\n try {\n // 根据实际使用的MIME类型创建Blob\n const blobType = mimeType || 'video/mp4';\n const blob = new Blob(chunks, { type: blobType });\n\n if (blob.size === 0) {\n // 通知父组件录制的视频为空\n this.recordingError.emit({\n type: 'empty_recording',\n message: '录制的视频为空'\n });\n this.showRecordingUI = false;\n return;\n }\n\n this.recordedBlob = blob;\n\n // 通知父组件录制已完成\n this.recordingStatusChange.emit({\n status: 'stopped',\n details: {\n duration: Math.floor((Date.now() - this.recordingStartTime) / 1000),\n size: blob.size,\n type: blob.type\n }\n });\n\n this.uploadRecordedVideo();\n } catch (error) {\n // 通知父组件处理录制视频时出错\n this.recordingError.emit({\n type: 'processing_error',\n message: '处理录制视频时出错',\n details: error\n });\n this.showRecordingUI = false;\n SentryReporter.captureError(error, {\n action: 'uploadRecordedVideo',\n component: 'pcm-hr-chat-modal',\n title: '处理录制视频时出错'\n });\n }\n };\n\n // 开始录制\n try {\n mediaRecorder.start();\n this.isRecording = true;\n this.recordingStartTime = Date.now();\n this.recordingTimeLeft = this.maxRecordingTime;\n\n // 通知父组件录制已开始\n this.recordingStatusChange.emit({\n status: 'started',\n details: {\n maxDuration: this.maxRecordingTime,\n mimeType: mediaRecorder.mimeType\n }\n });\n } catch (startError) {\n // 通知父组件开始录制失败\n this.recordingError.emit({\n type: 'start_failed',\n message: '开始录制失败,请检查您的设备权限',\n details: startError\n });\n this.showRecordingUI = false;\n SentryReporter.captureError(startError, {\n action: 'startRecording',\n component: 'pcm-hr-chat-modal',\n title: '开始录制失败'\n });\n return;\n }\n\n // 设置录制计时器\n this.recordingTimer = setInterval(() => {\n const elapsedTime = Math.floor((Date.now() - this.recordingStartTime) / 1000);\n this.recordingTimeLeft = Math.max(0, this.maxRecordingTime - elapsedTime);\n\n // 检查是否需要显示倒计时警告\n if (this.recordingTimeLeft <= this.countdownWarningTime && !this.showCountdownWarning) {\n this.showCountdownWarning = true;\n }\n\n // 时间到自动停止录制\n if (this.recordingTimeLeft <= 0) {\n this.stopRecording();\n }\n }, 1000);\n\n } catch (error) {\n console.error('无法访问摄像头或麦克风:', error);\n\n // 设置设备错误状态\n let errorMessage = '设备访问失败';\n\n if (error.name === 'NotAllowedError') {\n errorMessage = '请允许访问摄像头和麦克风权限';\n } else if (error.name === 'NotFoundError') {\n errorMessage = '未检测到摄像头或麦克风设备';\n } else if (error.name === 'NotReadableError') {\n errorMessage = '设备正在被其他应用程序使用';\n } else if (error.name === 'OverconstrainedError') {\n errorMessage = '摄像头不支持指定的配置';\n } else {\n errorMessage = '无法访问摄像头或麦克风,请检查设备连接';\n }\n\n this.deviceError = errorMessage;\n this.showRecordingUI = false;\n ErrorEventBus.emitError({\n error: error,\n message: errorMessage\n });\n\n SentryReporter.captureError(error, {\n action: 'startRecording',\n component: 'pcm-app-chat-modal',\n title: errorMessage\n });\n\n }\n }\n\n // 添加新方法来设置视频预览\n private setupVideoPreview(stream: MediaStream) {\n // 延迟执行以确保DOM已更新\n setTimeout(() => {\n const videoElement = this.hostElement.shadowRoot?.querySelector('video') as HTMLVideoElement;\n if (videoElement && stream) {\n // 先尝试使用标准方法\n try {\n videoElement.srcObject = stream;\n videoElement.play().catch(err => {\n console.error('视频播放失败:', err);\n SentryReporter.captureError(err, {\n action: 'setupVideoPreview',\n component: 'pcm-app-chat-modal',\n title: '视频播放失败'\n });\n ErrorEventBus.emitError({\n error: err,\n message: '视频播放失败'\n });\n });\n } catch (e) {\n console.warn('设置srcObject失败,尝试替代方法:', e);\n\n // 对于不支持srcObject的旧浏览器,使用URL.createObjectURL\n try {\n // 使用类型断言解决TypeScript错误\n const objectUrl = URL.createObjectURL(stream as unknown as MediaSource);\n videoElement.src = objectUrl;\n\n // 确保在视频元素不再使用时释放URL\n videoElement.onended = () => {\n URL.revokeObjectURL(objectUrl);\n };\n } catch (urlError) {\n console.error('创建对象URL失败:', urlError);\n SentryReporter.captureError(urlError, {\n action: 'setupVideoPreview',\n component: 'pcm-app-chat-modal',\n title: '创建对象URL失败'\n });\n ErrorEventBus.emitError({\n error: urlError,\n message: '创建对象URL失败'\n });\n }\n }\n } else {\n console.warn('未找到视频元素或媒体流无效');\n }\n }, 100);\n }\n\n // 添加一个新方法来检测浏览器支持的MIME类型\n private getSupportedMimeType(): string {\n // 按优先级排列的MIME类型列表\n const mimeTypes = [\n 'video/webm;codecs=vp8,opus',\n 'video/webm;codecs=vp9,opus',\n 'video/webm',\n 'video/mp4',\n 'video/mp4;codecs=h264,aac',\n '' // 空字符串表示使用浏览器默认值\n ];\n\n // 检查MediaRecorder是否可用\n if (!window.MediaRecorder) {\n console.warn('MediaRecorder API不可用');\n return '';\n }\n\n // 检查每种MIME类型是否受支持\n for (const type of mimeTypes) {\n if (!type) return ''; // 如果是空字符串,直接返回\n\n try {\n if (MediaRecorder.isTypeSupported(type)) {\n return type;\n }\n } catch (e) {\n console.warn(`检查MIME类型支持时出错 ${type}:`, e);\n }\n }\n\n // 如果没有找到支持的类型,返回空字符串\n console.warn('没有找到支持的MIME类型,将使用浏览器默认值');\n return '';\n }\n\n // 停止录制\n private stopRecording() {\n if (this.mediaRecorder && this.isRecording) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n\n // 清理计时器\n if (this.recordingTimer) {\n clearInterval(this.recordingTimer);\n this.recordingTimer = null;\n }\n\n // 停止并释放媒体流\n if (this.recordingStream) {\n this.recordingStream.getTracks().forEach(track => track.stop());\n this.recordingStream = null;\n }\n\n // 清理视频引用\n this.videoRef = null;\n }\n }\n\n // 修改音视频转文字方法\n private async convertAudioToText(cosKey: string): Promise<string | null> {\n try {\n const result = await sendHttpRequest<{ text: string }>({\n url: '/sdk/v1/tts/audio_to_text',\n method: 'POST',\n data: {\n cos_key: cosKey\n }\n });\n\n if (result.success && result.data && result.data.text) {\n return result.data.text;\n } else {\n console.warn('音频转文字返回结果格式不正确');\n return null;\n }\n } catch (error) {\n console.error('音频转文字错误:', error);\n SentryReporter.captureError(error, {\n action: 'convertAudioToText',\n component: 'pcm-app-chat-modal',\n title: '音频转文字错误'\n });\n ErrorEventBus.emitError({\n error: error,\n message: '音频转文字错误'\n });\n return null;\n }\n }\n\n // 上传录制的视频\n private async uploadRecordedVideo() {\n if (!this.recordedBlob) return;\n\n try {\n this.isUploadingVideo = true; // 开始上传时设置状态\n this.showRecordingUI = false; // 隐藏视频预览\n\n // 根据Blob类型确定文件扩展名\n const fileExtension = this.recordedBlob.type.includes('webm') ? 'webm' : 'mp4';\n const fileName = `answer.${fileExtension}`;\n\n // 创建File对象\n const file = new File([this.recordedBlob], fileName, { type: this.recordedBlob.type });\n\n // 使用uploadFileToBackend上传文件\n const fileInfo = await uploadFileToBackend(file, {\n\n }, {\n 'tags': ['other']\n });\n // 使用 cos_key 作为视频标识符\n // 调用音频转文字API\n const transcriptionText = await this.convertAudioToText(fileInfo.cos_key);\n\n // 发送\"下一题\"请求,可以附带转录文本\n this.sendMessageToAPI(transcriptionText || \"下一题\", fileInfo.cos_key);\n\n } catch (error) {\n console.error('视频上传或处理错误:', error);\n SentryReporter.captureError(error, {\n action: 'uploadRecordedVideo',\n component: 'pcm-app-chat-modal',\n title: '视频上传或处理失败'\n });\n ErrorEventBus.emitError({\n error: error,\n message: '视频上传或处理失败'\n });\n } finally {\n this.isUploadingVideo = false; // 上传完成后重置状态\n this.showRecordingUI = false;\n this.recordedBlob = null;\n }\n }\n\n\n // 播放音频的方法\n private playAudio(audioUrl: string): Promise<void> {\n return new Promise((resolve) => {\n this.isPlayingAudio = true;\n this.audioUrl = audioUrl;\n\n // 创建音频元素\n if (!this.audioElement) {\n this.audioElement = new Audio();\n }\n\n this.audioElement.src = audioUrl;\n this.audioElement.onended = () => {\n this.isPlayingAudio = false;\n this.audioUrl = null;\n resolve();\n };\n\n this.audioElement.onerror = () => {\n console.error('音频播放错误');\n this.isPlayingAudio = false;\n this.audioUrl = null;\n ErrorEventBus.emitError({\n error: '音频播放错误',\n message: '音频播放错误'\n });\n SentryReporter.captureMessage('音频播放错误', {\n action: 'playAudio',\n component: 'pcm-hr-chat-modal',\n title: '音频播放错误'\n });\n resolve();\n };\n\n this.audioElement.play().catch(error => {\n console.error('音频播放失败:', error);\n this.isPlayingAudio = false;\n this.audioUrl = null;\n ErrorEventBus.emitError({\n error: error,\n message: '音频播放失败'\n });\n SentryReporter.captureError(error, {\n title: '音频播放失败',\n action: 'playAudio',\n component: 'pcm-hr-chat-modal',\n });\n resolve();\n });\n });\n }\n\n // 确保组件卸载时释放资源\n disconnectedCallback() {\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\n\n // 释放音频资源\n if (this.audioElement) {\n this.audioElement.pause();\n this.audioElement.src = '';\n this.audioElement = null;\n }\n\n // 释放 Blob URL\n if (this.audioUrl) {\n URL.revokeObjectURL(this.audioUrl);\n this.audioUrl = null;\n }\n\n // 清理其他计时器\n if (this.waitingTimer) {\n clearInterval(this.waitingTimer);\n this.waitingTimer = null;\n }\n\n if (this.recordingTimer) {\n clearInterval(this.recordingTimer);\n this.recordingTimer = null;\n }\n\n // 清理音频录制计时器\n if (this.audioRecordingTimer) {\n clearInterval(this.audioRecordingTimer);\n this.audioRecordingTimer = null;\n }\n\n // 停止录制\n this.stopRecording();\n\n // 停止音频录制\n this.stopAudioRecording();\n }\n\n // 修改手动播放音频的方法\n private handlePlayAudio = async () => {\n if (this.audioUrl) {\n await this.playAudio(this.audioUrl);\n // 手动播放完成后只在视频模式时开始等待录制\n if (this.interviewMode === 'video') {\n this.startWaitingToRecord();\n }\n }\n };\n\n // 处理文本输入变化\n private handleTextInputChange = (event: Event) => {\n const input = event.target as HTMLTextAreaElement;\n this.textAnswer = input.value;\n };\n\n // 添加处理键盘事件的方法\n private handleKeyDown = (event: KeyboardEvent) => {\n // 如果按下的是回车键\n if (event.key === 'Enter') {\n // 如果同时按下了Ctrl键,允许换行\n if (event.ctrlKey) {\n // 获取当前光标位置\n const textarea = event.target as HTMLTextAreaElement;\n const cursorPosition = textarea.selectionStart;\n\n // 在光标位置插入换行符\n const beforeCursor = this.textAnswer.substring(0, cursorPosition);\n const afterCursor = this.textAnswer.substring(cursorPosition);\n this.textAnswer = beforeCursor + '\\n' + afterCursor;\n\n // 阻止默认行为\n event.preventDefault();\n\n // 在下一个事件循环中设置光标位置\n setTimeout(() => {\n const newPosition = cursorPosition + 1;\n textarea.setSelectionRange(newPosition, newPosition);\n }, 0);\n\n return;\n } else {\n // 阻止默认的换行行为\n event.preventDefault();\n // 如果文本框不为空且不处于禁用状态,则发送消息\n if (this.textAnswer.trim() && !this.isSubmittingText && !this.isLoading &&\n !this.currentStreamingMessage && !this.waitingToRecord && !this.isPlayingAudio) {\n this.submitTextAnswer();\n }\n }\n }\n };\n\n // 修改提交文本回答的方法\n private submitTextAnswer = async () => {\n if (!this.textAnswer.trim() || this.isSubmittingText) {\n return;\n }\n\n this.isSubmittingText = true;\n\n try {\n // 保存当前输入内容\n const textToSend = this.textAnswer;\n\n // 立即清空文本输入\n this.textAnswer = '';\n\n // 发送用户输入的文本作为查询\n await this.sendMessageToAPI(textToSend);\n } catch (error) {\n console.error('提交文本回答失败:', error);\n SentryReporter.captureError(error, {\n action: 'submitTextAnswer',\n component: 'pcm-app-chat-modal',\n title: '提交文本回答失败'\n });\n ErrorEventBus.emitError({\n error: error,\n message: '提交文本回答失败'\n });\n } finally {\n this.isSubmittingText = false;\n }\n };\n\n // 处理语音输入按钮点击\n private handleVoiceInputClick = () => {\n if (this.isRecordingAudio) {\n this.stopAudioRecording();\n } else {\n // 直接在用户交互事件处理程序中请求权限\n // 不使用 async/await,而是使用 Promise 链\n navigator.mediaDevices.getUserMedia({ audio: true })\n .then(stream => {\n // 权限已获取,开始录音\n this.startRecordingWithStream(stream);\n })\n .catch(error => {\n console.error('麦克风权限请求失败:', error);\n SentryReporter.captureError(error, {\n action: 'handleVoiceInputClick',\n component: 'pcm-app-chat-modal',\n title: '麦克风权限请求失败'\n });\n ErrorEventBus.emitError({\n error: error,\n message: '麦克风权限请求失败'\n });\n });\n }\n };\n\n // 新方法:使用已获取的媒体流开始录音\n private startRecordingWithStream(stream: MediaStream) {\n try {\n // 检测浏览器支持的音频MIME类型\n const mimeType = this.getSupportedAudioMimeType();\n\n // 创建MediaRecorder实例\n let audioRecorder;\n try {\n audioRecorder = new MediaRecorder(stream, {\n mimeType: mimeType\n });\n } catch (e) {\n console.warn('指定的音频MIME类型不受支持,使用默认设置:', e);\n try {\n audioRecorder = new MediaRecorder(stream);\n } catch (recorderError) {\n // 停止并释放媒体流\n stream.getTracks().forEach(track => track.stop());\n console.error('无法创建音频录制器:', recorderError);\n SentryReporter.captureError(recorderError, {\n action: 'startRecordingWithStream',\n component: 'pcm-app-chat-modal',\n title: '无法创建音频录制器'\n });\n ErrorEventBus.emitError({\n error: recorderError,\n message: '无法创建音频录制器'\n });\n return;\n }\n }\n\n this.audioRecorder = audioRecorder;\n this.audioChunks = [];\n this.isRecordingAudio = true;\n this.audioRecordingStartTime = Date.now();\n this.audioRecordingTimeLeft = this.maxAudioRecordingTime;\n\n // 设置数据可用事件处理\n audioRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n this.audioChunks.push(event.data);\n }\n };\n\n // 设置录制停止事件处理\n audioRecorder.onstop = () => {\n // 停止并释放媒体流\n stream.getTracks().forEach(track => track.stop());\n\n // 处理录制的音频\n this.processAudioRecording();\n };\n\n // 开始录制\n audioRecorder.start(100); // 每100毫秒获取一次数据\n\n // 设置录制计时器\n this.audioRecordingTimer = setInterval(() => {\n const elapsedTime = Math.floor((Date.now() - this.audioRecordingStartTime) / 1000);\n this.audioRecordingTimeLeft = Math.max(0, this.maxAudioRecordingTime - elapsedTime);\n\n // 时间到自动停止录制\n if (this.audioRecordingTimeLeft <= 0) {\n this.stopAudioRecording();\n }\n }, 1000);\n\n } catch (error) {\n // 停止并释放媒体流\n stream.getTracks().forEach(track => track.stop());\n console.error('开始录音失败:', error);\n SentryReporter.captureError(error, {\n action: 'startRecordingWithStream',\n component: 'pcm-app-chat-modal',\n title: '开始录音失败'\n });\n ErrorEventBus.emitError({\n error: error,\n message: '开始录音失败,请确保麦克风设备正常工作'\n });\n }\n }\n\n // 处理录制的音频\n private async processAudioRecording() {\n if (this.audioChunks.length === 0) {\n console.warn('没有录制到音频数据');\n return;\n }\n\n try {\n this.isConvertingAudio = true;\n\n // 创建音频Blob\n const audioType = this.getSupportedAudioMimeType() || 'audio/webm';\n const audioBlob = new Blob(this.audioChunks, { type: audioType });\n\n if (audioBlob.size === 0) {\n console.warn('录制的音频为空');\n this.isConvertingAudio = false;\n return;\n }\n\n // 创建File对象\n const fileExtension = audioType.includes('webm') ? 'webm' : 'mp3';\n const fileName = `audio_input.${fileExtension}`;\n const audioFile = new File([audioBlob], fileName, { type: audioType });\n\n // 上传音频文件\n const fileInfo = await uploadFileToBackend(audioFile, {\n\n }, {\n 'tags': ['audio']\n });\n\n // 调用音频转文字API\n const transcriptionText = await this.convertAudioToText(fileInfo.cos_key);\n\n // 将转录文本追加到文本框,而不是替换\n if (transcriptionText) {\n // 保存当前光标位置\n const textArea = this.hostElement.shadowRoot?.querySelector('.text-answer-input') as HTMLTextAreaElement;\n const cursorPosition = textArea?.selectionStart || this.textAnswer.length;\n\n // 在光标位置插入识别的文本\n const beforeCursor = this.textAnswer.substring(0, cursorPosition);\n const afterCursor = this.textAnswer.substring(cursorPosition);\n\n // 如果当前文本不为空且不以空格结尾,添加一个空格\n const spacer = (beforeCursor.length > 0 && !beforeCursor.endsWith(' ')) ? ' ' : '';\n\n // 更新文本\n this.textAnswer = beforeCursor + spacer + transcriptionText + afterCursor;\n\n // 设置新的光标位置\n setTimeout(() => {\n if (textArea) {\n const newPosition = cursorPosition + spacer.length + transcriptionText.length;\n textArea.focus();\n textArea.setSelectionRange(newPosition, newPosition);\n }\n }, 0);\n } else {\n console.warn('未能识别语音内容');\n alert('未能识别语音内容,请重试或直接输入文字');\n }\n } catch (error) {\n console.error('处理音频录制失败:', error);\n SentryReporter.captureError(error, {\n action: 'processAudioRecording',\n component: 'pcm-app-chat-modal',\n title: '处理音频录制失败'\n });\n ErrorEventBus.emitError({\n error: error,\n message: '语音识别失败,请重试'\n });\n } finally {\n this.isConvertingAudio = false;\n this.audioChunks = [];\n }\n }\n\n // 获取支持的音频MIME类型\n private getSupportedAudioMimeType(): string {\n // 按优先级排列的音频MIME类型列表\n const mimeTypes = [\n 'audio/webm;codecs=opus',\n 'audio/webm',\n 'audio/mp4',\n 'audio/ogg;codecs=opus',\n 'audio/ogg',\n '' // 空字符串表示使用浏览器默认值\n ];\n\n // 检查MediaRecorder是否可用\n if (!window.MediaRecorder) {\n console.warn('MediaRecorder API不可用');\n return '';\n }\n\n // 检查每种MIME类型是否受支持\n for (const type of mimeTypes) {\n if (!type) return ''; // 如果是空字符串,直接返回\n\n try {\n if (MediaRecorder.isTypeSupported(type)) {\n return type;\n }\n } catch (e) {\n console.warn(`检查音频MIME类型支持时出错 ${type}:`, e);\n }\n }\n\n // 如果没有找到支持的类型,返回空字符串\n console.warn('没有找到支持的音频MIME类型,将使用浏览器默认值');\n return '';\n }\n\n // 停止录制音频\n private stopAudioRecording() {\n if (this.audioRecorder && this.isRecordingAudio) {\n this.audioRecorder.stop();\n this.isRecordingAudio = false;\n\n // 清理计时器\n if (this.audioRecordingTimer) {\n clearInterval(this.audioRecordingTimer);\n this.audioRecordingTimer = null;\n }\n }\n }\n\n // 处理历史会话按钮点击\n private handleHistoryClick = () => {\n console.log('点击历史会话按钮');\n this.isHistoryDrawerOpen = true;\n this.loadHistoryConversations();\n };\n\n // 获取历史会话列表\n private async loadHistoryConversations() {\n if (!this.botId) {\n console.warn('没有提供botId,无法获取历史会话');\n return;\n }\n\n this.isLoadingConversations = true;\n \n try {\n const result = await sendHttpRequest({\n url: '/sdk/v1/chat/conversations',\n method: 'GET',\n data: {\n bot_id: this.botId,\n limit: 50, // 获取最近50个会话\n page: 1\n }\n });\n\n if (result.success && result.data) {\n const conversations = result.data.data || [];\n \n // 格式化会话数据\n this.historyConversations = conversations.map((conv: any) => {\n // 处理时间戳,确保它是有效的数字\n let createdTime: Date;\n let timeDisplay = '未知时间';\n \n try {\n // 确保 created_at 是一个有效的时间戳\n const timestamp = typeof conv.created_at === 'string' ? parseInt(conv.created_at) : conv.created_at;\n \n if (isNaN(timestamp) || timestamp <= 0) {\n console.warn('无效的时间戳:', conv.created_at);\n createdTime = new Date();\n } else {\n // Unix时间戳转换为JavaScript Date对象(乘以1000转换为毫秒)\n createdTime = new Date(timestamp * 1000);\n }\n \n // 验证日期是否有效\n if (isNaN(createdTime.getTime())) {\n console.warn('无效的日期对象:', conv.created_at);\n createdTime = new Date();\n }\n \n const now = new Date();\n const diffTime = now.getTime() - createdTime.getTime();\n const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));\n \n // 格式化时间显示\n if (diffDays === 0) {\n // 今天\n timeDisplay = `今天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\n } else if (diffDays === 1) {\n // 昨天\n timeDisplay = `昨天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\n } else if (diffDays > 0 && diffDays < 7) {\n // 一周内\n const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];\n timeDisplay = `${weekdays[createdTime.getDay()]} ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\n } else if (diffDays < 0) {\n // 未来时间(可能是时区问题或系统时间不准确)\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\n } else {\n // 超过一周\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\n }\n } catch (error) {\n console.error('时间格式化错误:', error, conv.created_at);\n timeDisplay = '时间解析失败';\n }\n\n return {\n id: conv.id,\n name: conv.name || '新会话',\n created_at: conv.created_at,\n updated_at: conv.updated_at,\n status: conv.status,\n message_count: conv.message_count || 0,\n timeDisplay\n } as ConversationItem;\n });\n }\n } catch (error) {\n console.error('获取历史会话失败:', error);\n SentryReporter.captureError(error, {\n action: 'loadHistoryConversations',\n component: 'pcm-app-chat-modal',\n title: '获取历史会话失败'\n });\n ErrorEventBus.emitError({\n error: error,\n message: '获取历史会话失败'\n });\n } finally {\n this.isLoadingConversations = false;\n }\n }\n\n // 切换到指定会话\n private handleSwitchConversation = (conversationId: string) => {\n if (conversationId === this.conversationId) {\n // 如果点击的是当前会话,直接关闭抽屉\n this.isHistoryDrawerOpen = false;\n return;\n }\n\n // 切换到新会话\n this.conversationId = conversationId;\n this.messages = [];\n this.currentStreamingMessage = null;\n this.isTaskCompleted = false;\n this.currentQuestionNumber = 0;\n \n // 关闭抽屉\n this.isHistoryDrawerOpen = false;\n \n // 加载新会话的历史消息\n this.loadHistoryMessages();\n };\n\n\n // 修改事件处理方法\n private handleFilePreviewRequest = (event: CustomEvent<{\n url?: string,\n fileName: string,\n content?: string,\n contentType: 'file' | 'markdown' | 'text'\n }>) => {\n const { url, fileName, content, contentType } = event.detail;\n\n this.previewFileName = fileName || '内容预览';\n this.previewContentType = contentType;\n this.previewUrl = url;\n this.previewContent = content || '';\n this.isDrawerOpen = true;\n };\n\n render() {\n if (!this.isOpen) return null;\n\n const modalStyle = {\n zIndex: String(this.zIndex)\n };\n\n const containerClass = {\n 'modal-container': true,\n 'fullscreen': this.fullscreen\n };\n\n const overlayClass = {\n 'modal-overlay': true,\n 'fullscreen-overlay': this.fullscreen\n };\n\n const renderVideoPreview = () => (\n <div class=\"video-preview\">\n <video\n autoPlay\n playsInline\n muted\n style={{ transform: 'scaleX(-1)' }}\n ref={(el) => {\n if (el && this.recordingStream && !this.videoRef) {\n this.videoRef = el;\n // 不在这里设置srcObject,而是使用setupVideoPreview方法\n }\n }}\n ></video>\n <div class={{\n 'recording-status': true,\n 'warning': this.showCountdownWarning\n }}>\n <span class=\"recording-dot\"></span>\n <span>\n 录制中 {Math.floor(this.recordingTimeLeft / 60)}:{(this.recordingTimeLeft % 60).toString().padStart(2, '0')}\n {this.showCountdownWarning && ` (即将自动完成)`}\n </span>\n </div>\n </div>\n );\n\n // 渲染占位符状态信息\n const renderPlaceholderStatus = () => {\n // 设备错误状态 - 优先显示\n if (this.deviceError) {\n return (\n <div class=\"placeholder-status error-status\">\n\n <p>{this.deviceError}</p>\n <div class=\"error-suggestions\">\n <p>请尝试以下解决方案:</p>\n <ul>\n <li>更换有摄像头和麦克风的设备</li>\n <li>确保已允许浏览器访问摄像头和麦克风</li>\n <li>关闭其他正在使用摄像头/麦克风的应用</li>\n </ul>\n </div>\n\n </div>\n );\n }\n\n // 任务已完成\n if (this.isTaskCompleted) {\n return (\n <div class=\"placeholder-status\">\n <p>面试已完成,感谢您的参与!</p>\n </div>\n );\n }\n\n // 正在播放音频\n if (this.isPlayingAudio) {\n return (\n <div class=\"placeholder-status\">\n <p>正在播放问题,请听完后准备回答...</p>\n </div>\n );\n }\n\n // 正在上传视频\n if (this.isUploadingVideo) {\n return (\n <div class=\"placeholder-status\">\n <p>正在上传视频,请稍候...</p>\n </div>\n );\n }\n\n // 正在加载或等待AI回复\n if (this.isLoading || this.currentStreamingMessage) {\n return (\n <div class=\"placeholder-status\">\n <p>请等待题目...</p>\n </div>\n );\n }\n\n // 等待开始录制\n if (this.waitingToRecord) {\n return (\n <div class=\"placeholder-status\">\n <p>请准备好,{this.waitingTimeLeft}秒后将开始录制您的回答...</p>\n </div>\n );\n }\n\n // 添加默认状态\n return (\n <div class=\"placeholder-status default-status\">\n <p>准备中...</p>\n </div>\n );\n };\n\n // 修改文本输入区域渲染函数\n const renderTextInputArea = () => (\n <div class=\"text-input-area\">\n <textarea\n class=\"text-answer-input\"\n placeholder={this.isTaskCompleted ? \"会话已结束\" : \"发消息\"}\n value={this.textAnswer}\n onInput={this.handleTextInputChange}\n onKeyDown={this.handleKeyDown}\n disabled={this.isTaskCompleted || this.isRecordingAudio || this.isConvertingAudio}\n ></textarea>\n <div class=\"input-toolbar\">\n <div class=\"toolbar-actions\">\n <button\n class={{\n 'toolbar-button': true,\n 'recording': this.isRecordingAudio,\n 'converting': this.isConvertingAudio\n }}\n title={this.isRecordingAudio ? '点击停止录音' : this.isConvertingAudio ? '正在识别语音...' : '语音输入'}\n onClick={this.handleVoiceInputClick}\n disabled={this.isTaskCompleted || this.isConvertingAudio || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio}\n >\n {this.isRecordingAudio ? (\n <div>\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3z\" />\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\" />\n <circle cx=\"12\" cy=\"11\" r=\"4\" fill=\"red\" />\n </svg>\n {/* <span class=\"recording-time\">{this.audioRecordingTimeLeft}s</span> */}\n </div>\n ) : this.isConvertingAudio ? (\n <div class=\"converting-indicator\">\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\" />\n </svg>\n </div>\n ) : (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3z\" />\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\" />\n </svg>\n )}\n </button>\n </div>\n <div\n class={{\n 'send-button': true,\n 'disabled': this.isTaskCompleted || !this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio || this.isRecordingAudio || this.isConvertingAudio\n }}\n onClick={() => {\n if (this.isTaskCompleted || !this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio || this.isRecordingAudio || this.isConvertingAudio) {\n return;\n }\n this.submitTextAnswer();\n }}\n >\n <img src=\"https://pcm-pub-1351162788.cos.ap-guangzhou.myqcloud.com/sdk/image/i_send.png\" alt=\"发送\" />\n </div>\n </div>\n </div>\n );\n\n\n // 确定要使用的助手头像\n const effectiveAssistantAvatar = this.assistantAvatar || this.agentLogo;\n\n return (\n <div class={overlayClass} style={modalStyle}>\n <div class={containerClass}>\n {this.isShowHeader && (\n <div class=\"modal-header\">\n <div class=\"header-left\">\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\n <div>{this.modalTitle}</div>\n </div>\n {this.isNeedClose && (\n <button class=\"close-button\" onClick={this.handleClose}>\n <span>×</span>\n </button>\n )}\n </div>\n )}\n\n <div class=\"chat-container\">\n <div class=\"chat-history\"\n onScroll={this.handleScroll}\n onTouchStart={this.handleTouchStart}\n onTouchEnd={this.handleTouchEnd}\n onWheel={this.handleWheel}\n >\n {this.isLoadingHistory ? (\n <div class=\"loading-container\">\n <div class=\"loading-spinner\"></div>\n <p>加载历史消息中...</p>\n </div>\n ) : (\n <div>\n {this.messages.map((message) => (\n <div id={`message_${message.id}`} key={message.id}>\n <pcm-chat-message\n botId={this.botId}\n message={message}\n userAvatar={this.userAvatar}\n assistantAvatar={effectiveAssistantAvatar}\n showCopyButton={this.showCopyButton}\n showFeedbackButtons={this.showFeedbackButtons}\n filePreviewMode={this.filePreviewMode}\n onFilePreviewRequest={this.handleFilePreviewRequest}\n onMessageChange={(event) => {\n const updatedMessages = this.messages.map(msg =>\n msg.id === message.id ? { ...msg, ...event.detail } : msg\n );\n this.messages = updatedMessages;\n }}\n ></pcm-chat-message>\n </div>\n ))}\n {this.currentStreamingMessage && (\n <div id={`message_${this.currentStreamingMessage.id}`}>\n <pcm-chat-message\n botId={this.botId}\n message={this.currentStreamingMessage}\n userAvatar={this.userAvatar}\n assistantAvatar={effectiveAssistantAvatar}\n showCopyButton={this.showCopyButton}\n showFeedbackButtons={this.showFeedbackButtons}\n filePreviewMode={this.filePreviewMode}\n onFilePreviewRequest={this.handleFilePreviewRequest}\n ></pcm-chat-message>\n </div>\n )}\n {this.messages.length === 0 && !this.currentStreamingMessage && (\n <div class=\"empty-state\">\n <p>正在准备面试...</p>\n </div>\n )}\n </div>\n )}\n </div>\n\n <div class=\"recording-section\">\n <div class=\"recording-container\">\n {/* 工作区 */}\n {this.showWorkspaceHistory && (\n <div class=\"workspace-section\">\n <div class=\"workspace-toolbar\">\n <button class=\"workspace-button history-button\" onClick={() => this.handleHistoryClick()}>\n <span>历史会话</span>\n </button>\n </div>\n </div>\n )}\n {\n this.interviewMode === 'text' && (\n renderTextInputArea()\n )\n }\n {this.interviewMode === 'video' && (\n <div class=\"video-container\">\n <div class=\"video-area\">\n {this.showRecordingUI ? (\n renderVideoPreview()\n ) : (\n <div class=\"video-preview placeholder\">\n {renderPlaceholderStatus()}\n </div>\n )}\n\n </div>\n <div class=\"recording-controls\">\n {this.showRecordingUI ? (\n <button\n class=\"stop-recording-button\"\n onClick={() => this.stopRecording()}\n >\n 完成本题回答\n </button>\n ) : (\n <div class=\"waiting-message\">\n {(() => {\n // 显示播放按钮(当不自动播放且有音频URL时)\n if (!this.enableVoice && this.audioUrl && !this.isPlayingAudio) {\n return (\n <div class=\"play-audio-container\" onClick={this.handlePlayAudio}>\n <p>\n <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"currentColor\" style={{ verticalAlign: 'middle', marginRight: '8px' }}>\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n <span style={{ verticalAlign: 'middle' }}>播放题目</span>\n </p>\n </div>\n );\n }\n\n // 其他状态下显示禁用的\"完成回答\"按钮\n return (\n <button class=\"stop-recording-button disabled\" disabled>\n 完成回答\n </button>\n );\n })()}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n\n </div>\n </div>\n\n {/* 添加预览抽屉 */}\n <pcm-drawer\n isOpen={this.isDrawerOpen}\n drawerTitle={this.previewFileName}\n width=\"80%\"\n onClosed={() => {\n this.isDrawerOpen = false;\n this.previewUrl = '';\n this.previewContent = '';\n }}\n >\n {this.previewContentType === 'file' && this.previewUrl && (\n <div class=\"file-preview-container\">\n <iframe\n src={this.previewUrl}\n frameborder=\"0\"\n width=\"100%\"\n height=\"100%\"\n style={{ border: 'none', height: 'calc(100vh - 120px)' }}\n ></iframe>\n </div>\n )}\n\n {this.previewContentType === 'markdown' && this.previewContent && (\n <div class=\"markdown-preview-container markdown-body\" innerHTML={marked(this.previewContent)}></div>\n )}\n\n {this.previewContentType === 'text' && this.previewContent && (\n <div class=\"text-preview-container\">\n <pre style={{ whiteSpace: 'pre-wrap', wordWrap: 'break-word' }}>{this.previewContent}</pre>\n </div>\n )}\n </pcm-drawer>\n\n {/* 历史会话抽屉 */}\n <pcm-drawer\n isOpen={this.isHistoryDrawerOpen}\n drawerTitle=\"历史会话\"\n width=\"400px\"\n onClosed={() => {\n this.isHistoryDrawerOpen = false;\n }}\n >\n <div class=\"history-drawer-content\">\n\n {/* 会话列表 */}\n <div class=\"conversation-list\">\n {this.isLoadingConversations ? (\n <div class=\"loading-conversations\">\n <div class=\"loading-spinner-small\"></div>\n <p>加载中...</p>\n </div>\n ) : this.historyConversations.length === 0 ? (\n <div class=\"empty-conversations\">\n <p>暂无历史会话</p>\n </div>\n ) : (\n this.historyConversations.map((conversation) => (\n <div \n key={conversation.id}\n class={{\n 'conversation-item': true,\n 'active': conversation.id === this.conversationId\n }}\n onClick={() => this.handleSwitchConversation(conversation.id)}\n >\n <div class=\"conversation-info\">\n <div class=\"conversation-title\">{conversation.name}</div>\n <div class=\"conversation-meta\">\n <span class=\"conversation-time\">{conversation.timeDisplay}</span>\n {conversation.message_count > 0 && (\n <span class=\"message-count\">{conversation.message_count}条消息</span>\n )}\n {conversation.status && (\n <span class={{\n 'conversation-status': true,\n 'completed': conversation.status === '结束',\n 'running': conversation.status === '进行中'\n }}>\n {conversation.status}\n </span>\n )}\n </div>\n </div>\n {conversation.id === this.conversationId && (\n <div class=\"current-indicator\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/>\n </svg>\n </div>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n </pcm-drawer>\n </div>\n </div>\n );\n }\n}"]}
|