pcm-agents 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/LICENSE +21 -21
  2. package/dist/cjs/index-BFPEnLbS.js +195 -0
  3. package/dist/cjs/index-BFPEnLbS.js.map +1 -0
  4. package/dist/cjs/index.cjs.js +1 -1
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/my-component.cjs.entry.js +2 -2
  7. package/dist/cjs/my-component.cjs.entry.js.map +1 -1
  8. package/dist/cjs/my-component.entry.cjs.js.map +1 -1
  9. package/dist/cjs/pcm-agents.cjs.js +1 -1
  10. package/dist/cjs/pcm-app-chat-modal.pcm-chat-message.pcm-hr-chat-modal.pcm-jlpx-modal.pcm-mnms-modal.pcm-video-chat-modal.pcm-zygh-modal.entry.cjs.js.map +1 -0
  11. package/dist/cjs/pcm-app-chat-modal_7.cjs.entry.js +6560 -0
  12. package/dist/cjs/pcm-app-chat-modal_7.cjs.entry.js.map +1 -0
  13. package/dist/cjs/pcm-chat-modal.cjs.entry.js +17 -32
  14. package/dist/cjs/pcm-chat-modal.cjs.entry.js.map +1 -1
  15. package/dist/cjs/pcm-chat-modal.entry.cjs.js.map +1 -1
  16. package/dist/collection/collection-manifest.json +2 -0
  17. package/dist/collection/components/my-component/my-component.css +3 -3
  18. package/dist/collection/components/my-component/my-component.js +1 -1
  19. package/dist/collection/components/my-component/my-component.js.map +1 -1
  20. package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.css +2 -1
  21. package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.js +137 -159
  22. package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.js.map +1 -1
  23. package/dist/collection/components/pcm-chat-message/pcm-chat-message.css +66 -12
  24. package/dist/collection/components/pcm-chat-message/pcm-chat-message.js +106 -13
  25. package/dist/collection/components/pcm-chat-message/pcm-chat-message.js.map +1 -1
  26. package/dist/collection/components/pcm-chat-modal/pcm-chat-modal.js +39 -34
  27. package/dist/collection/components/pcm-chat-modal/pcm-chat-modal.js.map +1 -1
  28. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js +76 -105
  29. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js.map +1 -1
  30. package/dist/collection/components/pcm-jlpx-modal/pcm-jlpx-modal.css +162 -0
  31. package/dist/collection/components/pcm-jlpx-modal/pcm-jlpx-modal.js +616 -0
  32. package/dist/collection/components/pcm-jlpx-modal/pcm-jlpx-modal.js.map +1 -0
  33. package/dist/collection/components/pcm-mnms-modal/pcm-mnms-modal.css +0 -79
  34. package/dist/collection/components/pcm-mnms-modal/pcm-mnms-modal.js +133 -81
  35. package/dist/collection/components/pcm-mnms-modal/pcm-mnms-modal.js.map +1 -1
  36. package/dist/collection/components/pcm-video-chat-modal/pcm-video-chat-modal.js +77 -101
  37. package/dist/collection/components/pcm-video-chat-modal/pcm-video-chat-modal.js.map +1 -1
  38. package/dist/collection/components/pcm-zygh-modal/pcm-zygh-modal.css +273 -0
  39. package/dist/collection/components/pcm-zygh-modal/pcm-zygh-modal.js +613 -0
  40. package/dist/collection/components/pcm-zygh-modal/pcm-zygh-modal.js.map +1 -0
  41. package/dist/collection/global/global.css +324 -0
  42. package/dist/collection/index.js.map +1 -1
  43. package/dist/collection/interfaces/chat.js.map +1 -1
  44. package/dist/collection/utils/utils.js +54 -113
  45. package/dist/collection/utils/utils.js.map +1 -1
  46. package/dist/components/index.js +1298 -11280
  47. package/dist/components/index.js.map +1 -1
  48. package/dist/components/my-component.js +2 -3
  49. package/dist/components/my-component.js.map +1 -1
  50. package/dist/components/{p-C4l_DOnx.js → p-BctfuDvG.js} +106 -147
  51. package/dist/components/p-BctfuDvG.js.map +1 -0
  52. package/dist/components/{p-D0s1Q-3O.js → p-LkDC0SN2.js} +343 -16
  53. package/dist/components/p-LkDC0SN2.js.map +1 -0
  54. package/dist/components/pcm-app-chat-modal.js +1 -1
  55. package/dist/components/pcm-chat-message.js +1 -1
  56. package/dist/components/pcm-chat-modal.js +19 -34
  57. package/dist/components/pcm-chat-modal.js.map +1 -1
  58. package/dist/components/pcm-hr-chat-modal.js +70 -100
  59. package/dist/components/pcm-hr-chat-modal.js.map +1 -1
  60. package/dist/components/pcm-jlpx-modal.d.ts +11 -0
  61. package/dist/components/pcm-jlpx-modal.js +339 -0
  62. package/dist/components/pcm-jlpx-modal.js.map +1 -0
  63. package/dist/components/pcm-mnms-modal.js +109 -57
  64. package/dist/components/pcm-mnms-modal.js.map +1 -1
  65. package/dist/components/pcm-video-chat-modal.js +74 -99
  66. package/dist/components/pcm-video-chat-modal.js.map +1 -1
  67. package/dist/components/pcm-zygh-modal.d.ts +11 -0
  68. package/dist/components/pcm-zygh-modal.js +330 -0
  69. package/dist/components/pcm-zygh-modal.js.map +1 -0
  70. package/dist/esm/index-nVjZGfA8.js +189 -0
  71. package/dist/esm/index-nVjZGfA8.js.map +1 -0
  72. package/dist/esm/index.js +1 -1
  73. package/dist/esm/loader.js +1 -1
  74. package/dist/esm/my-component.entry.js +2 -2
  75. package/dist/esm/my-component.entry.js.map +1 -1
  76. package/dist/esm/pcm-agents.js +1 -1
  77. package/dist/esm/pcm-app-chat-modal.pcm-chat-message.pcm-hr-chat-modal.pcm-jlpx-modal.pcm-mnms-modal.pcm-video-chat-modal.pcm-zygh-modal.entry.js.map +1 -0
  78. package/dist/esm/pcm-app-chat-modal_7.entry.js +6552 -0
  79. package/dist/esm/pcm-app-chat-modal_7.entry.js.map +1 -0
  80. package/dist/esm/pcm-chat-modal.entry.js +17 -32
  81. package/dist/esm/pcm-chat-modal.entry.js.map +1 -1
  82. package/dist/pcm-agents/index.esm.js +1 -1
  83. package/dist/pcm-agents/my-component.entry.esm.js.map +1 -1
  84. package/dist/pcm-agents/p-55417392.entry.js +2 -0
  85. package/dist/pcm-agents/p-55417392.entry.js.map +1 -0
  86. package/dist/pcm-agents/p-a698b59f.entry.js +2 -0
  87. package/dist/pcm-agents/p-a698b59f.entry.js.map +1 -0
  88. package/dist/pcm-agents/p-f3ca99b4.entry.js +2 -0
  89. package/dist/pcm-agents/p-f3ca99b4.entry.js.map +1 -0
  90. package/dist/pcm-agents/p-nVjZGfA8.js +2 -0
  91. package/dist/pcm-agents/p-nVjZGfA8.js.map +1 -0
  92. package/dist/pcm-agents/pcm-agents.esm.js +1 -1
  93. package/dist/pcm-agents/pcm-app-chat-modal.pcm-chat-message.pcm-hr-chat-modal.pcm-jlpx-modal.pcm-mnms-modal.pcm-video-chat-modal.pcm-zygh-modal.entry.esm.js.map +1 -0
  94. package/dist/pcm-agents/pcm-chat-modal.entry.esm.js.map +1 -1
  95. package/dist/types/components/pcm-app-chat-modal/pcm-app-chat-modal.d.ts +13 -8
  96. package/dist/types/components/pcm-chat-message/pcm-chat-message.d.ts +5 -0
  97. package/dist/types/components/pcm-chat-modal/pcm-chat-modal.d.ts +8 -8
  98. package/dist/types/components/pcm-hr-chat-modal/pcm-hr-chat-modal.d.ts +6 -12
  99. package/dist/types/components/pcm-jlpx-modal/pcm-jlpx-modal.d.ts +113 -0
  100. package/dist/types/components/pcm-mnms-modal/pcm-mnms-modal.d.ts +19 -20
  101. package/dist/types/components/pcm-video-chat-modal/pcm-video-chat-modal.d.ts +4 -4
  102. package/dist/types/components/pcm-zygh-modal/pcm-zygh-modal.d.ts +117 -0
  103. package/dist/types/components.d.ts +429 -80
  104. package/dist/types/interfaces/chat.d.ts +0 -4
  105. package/dist/types/utils/utils.d.ts +29 -83
  106. package/package.json +61 -60
  107. package/readme.md +307 -307
  108. package/dist/cjs/index-DfIUl99H.js +0 -11413
  109. package/dist/cjs/index-DfIUl99H.js.map +0 -1
  110. package/dist/cjs/pcm-app-chat-modal.pcm-chat-message.pcm-mnms-modal.entry.cjs.js.map +0 -1
  111. package/dist/cjs/pcm-app-chat-modal_3.cjs.entry.js +0 -3734
  112. package/dist/cjs/pcm-app-chat-modal_3.cjs.entry.js.map +0 -1
  113. package/dist/cjs/pcm-hr-chat-modal.cjs.entry.js +0 -1078
  114. package/dist/cjs/pcm-hr-chat-modal.cjs.entry.js.map +0 -1
  115. package/dist/cjs/pcm-hr-chat-modal.entry.cjs.js.map +0 -1
  116. package/dist/cjs/pcm-video-chat-modal.cjs.entry.js +0 -927
  117. package/dist/cjs/pcm-video-chat-modal.cjs.entry.js.map +0 -1
  118. package/dist/cjs/pcm-video-chat-modal.entry.cjs.js.map +0 -1
  119. package/dist/components/p-C4l_DOnx.js.map +0 -1
  120. package/dist/components/p-CgDy4pJp.js +0 -1244
  121. package/dist/components/p-CgDy4pJp.js.map +0 -1
  122. package/dist/components/p-D0s1Q-3O.js.map +0 -1
  123. package/dist/esm/index-B2EtEi7v.js +0 -11409
  124. package/dist/esm/index-B2EtEi7v.js.map +0 -1
  125. package/dist/esm/pcm-app-chat-modal.pcm-chat-message.pcm-mnms-modal.entry.js.map +0 -1
  126. package/dist/esm/pcm-app-chat-modal_3.entry.js +0 -3730
  127. package/dist/esm/pcm-app-chat-modal_3.entry.js.map +0 -1
  128. package/dist/esm/pcm-hr-chat-modal.entry.js +0 -1076
  129. package/dist/esm/pcm-hr-chat-modal.entry.js.map +0 -1
  130. package/dist/esm/pcm-video-chat-modal.entry.js +0 -925
  131. package/dist/esm/pcm-video-chat-modal.entry.js.map +0 -1
  132. package/dist/pcm-agents/p-0ddd5c47.entry.js +0 -2
  133. package/dist/pcm-agents/p-0ddd5c47.entry.js.map +0 -1
  134. package/dist/pcm-agents/p-5f624943.entry.js +0 -2
  135. package/dist/pcm-agents/p-5f624943.entry.js.map +0 -1
  136. package/dist/pcm-agents/p-6c07f155.entry.js +0 -2
  137. package/dist/pcm-agents/p-6c07f155.entry.js.map +0 -1
  138. package/dist/pcm-agents/p-9a1fb6ca.entry.js +0 -2
  139. package/dist/pcm-agents/p-9a1fb6ca.entry.js.map +0 -1
  140. package/dist/pcm-agents/p-B2EtEi7v.js +0 -146
  141. package/dist/pcm-agents/p-B2EtEi7v.js.map +0 -1
  142. package/dist/pcm-agents/p-e21bc169.entry.js +0 -2
  143. package/dist/pcm-agents/p-e21bc169.entry.js.map +0 -1
  144. package/dist/pcm-agents/pcm-app-chat-modal.pcm-chat-message.pcm-mnms-modal.entry.esm.js.map +0 -1
  145. package/dist/pcm-agents/pcm-hr-chat-modal.entry.esm.js.map +0 -1
  146. package/dist/pcm-agents/pcm-video-chat-modal.entry.esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pcm-chat-modal.entry.esm.js","sources":["src/components/pcm-chat-modal/pcm-chat-modal.css?tag=pcm-chat-modal&encapsulation=shadow","src/components/pcm-chat-modal/pcm-chat-modal.tsx"],"sourcesContent":[":host {\r\n display: block;\r\n}\r\n\r\n.modal-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n overflow-y: auto;\r\n padding: 20px;\r\n z-index: 1000;\r\n}\r\n\r\n/* 全屏模式下取消 padding */\r\n.fullscreen-overlay {\r\n padding: 0;\r\n}\r\n\r\n.modal-container {\r\n background: white;\r\n border-radius: 8px;\r\n width: 100%;\r\n max-width: 800px;\r\n height: 80vh;\r\n min-height: 600px;\r\n display: flex;\r\n flex-direction: column;\r\n position: relative;\r\n margin: auto;\r\n}\r\n\r\n/* 全屏模式样式 */\r\n.modal-container.fullscreen {\r\n width: 100vw;\r\n max-width: none;\r\n height: 100vh;\r\n min-height: 100vh;\r\n border-radius: 0;\r\n margin: 0;\r\n}\r\n\r\n\r\n/* 响应式布局 */\r\n@media screen and (max-width: 768px) {\r\n .modal-overlay {\r\n padding: 0;\r\n }\r\n\r\n .modal-container {\r\n width: 95%;\r\n height: 70vh;\r\n min-height: 400px;\r\n }\r\n\r\n .chat-history {\r\n min-height: 200px;\r\n max-height: 50vh;\r\n }\r\n\r\n .modal-container.fullscreen {\r\n /* 支持 iOS Safari */\r\n height: -webkit-fill-available;\r\n max-height: -webkit-fill-available;\r\n /* 确保内容不会被顶部状态栏和底部工具栏遮挡 */\r\n padding: env(safe-area-inset-top) 0 env(safe-area-inset-bottom);\r\n }\r\n\r\n .modal-container.fullscreen .chat-history {\r\n max-height: unset;\r\n }\r\n\r\n .modal-container.fullscreen .modal-header {\r\n padding: 0px 16px;\r\n /* 确保头部不被状态栏遮挡 */\r\n padding-top: max(30px, env(safe-area-inset-top));\r\n }\r\n}\r\n\r\n.modal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 4px 16px;\r\n height: 50px;\r\n border-bottom: 1px solid #e8e8e8;\r\n}\r\n\r\n.header-left {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.header-icon {\r\n width: 24px;\r\n height: 24px;\r\n}\r\n\r\n.close-button {\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n padding: 8px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 4px;\r\n}\r\n\r\n.close-button:hover {\r\n background-color: rgba(0, 0, 0, 0.04);\r\n}\r\n\r\n.close-button span {\r\n font-size: 24px;\r\n line-height: 1;\r\n color: #999;\r\n}\r\n\r\n.close-button:hover span {\r\n color: #666;\r\n}\r\n\r\n.chat-history {\r\n position: relative;\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 16px;\r\n scroll-behavior: smooth;\r\n min-height: 400px; /* PC端默认高度 */\r\n}\r\n\r\n/* 移动端样式 */\r\n@media screen and (max-width: 480px) {\r\n .chat-history {\r\n min-height: 200px; /* 移动端更小的高度 */\r\n max-height: 50vh;\r\n }\r\n}\r\n\r\n.message-input {\r\n padding: 16px;\r\n border-top: 1px solid #eee;\r\n display: flex;\r\n gap: 8px;\r\n align-items: center;\r\n}\r\n\r\n.message-input input {\r\n flex: 1;\r\n padding: 8px 12px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n outline: none;\r\n transition: border-color 0.2s ease;\r\n}\r\n\r\n.message-input input:focus {\r\n border-color: #bbb;\r\n}\r\n\r\n/* 消息样式 */\r\n.message {\r\n margin-bottom: 16px;\r\n opacity: 1;\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.message-content {\r\n max-width: 70%;\r\n padding: 8px 12px;\r\n border-radius: 8px;\r\n word-break: break-word;\r\n}\r\n\r\n.message-content p {\r\n margin: 0;\r\n word-break: break-word;\r\n}\r\n\r\n.user-message {\r\n display: flex;\r\n justify-content: flex-end;\r\n}\r\n\r\n.agent-message {\r\n display: flex;\r\n justify-content: flex-start;\r\n}\r\n\r\n.user-message .message-content {\r\n background-color: #007bff;\r\n color: white;\r\n}\r\n\r\n.agent-message .message-content {\r\n background-color: #f1f1f1;\r\n}\r\n\r\n.message-time {\r\n font-size: 12px;\r\n color: #999;\r\n margin-top: 4px;\r\n display: block;\r\n}\r\n\r\n.send-button {\r\n background-color: #1890ff;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n padding: 8px 16px;\r\n cursor: pointer;\r\n font-weight: 500;\r\n}\r\n\r\n.send-button:disabled {\r\n background-color: #ccc;\r\n cursor: not-allowed;\r\n}\r\n\r\n.empty-state {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height: 100%;\r\n color: #999;\r\n text-align: center;\r\n}\r\n\r\n.loading-container {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n background-color: rgba(255, 255, 255, 0.98);\r\n z-index: 1;\r\n opacity: 1;\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.loading-container p {\r\n margin-top: 16px;\r\n color: #666;\r\n font-size: 14px;\r\n}\r\n\r\n.loading-spinner {\r\n width: 40px;\r\n height: 40px;\r\n border: 3px solid #f3f3f3;\r\n border-top: 3px solid #1890ff;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n}\r\n\r\n/* 修改 messages-wrapper 的样式 */\r\n.messages-wrapper {\r\n width: 100%;\r\n min-height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n /* 当内容少时,将内容放在底部 */\r\n justify-content: flex-end;\r\n}\r\n\r\n/* 当有很多消息时,取消固定在底部 */\r\n.messages-wrapper.has-overflow {\r\n justify-content: flex-start;\r\n}\r\n\r\n.suggested-questions {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n padding: 16px;\r\n}\r\n\r\n.suggested-question {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 8px 12px;\r\n background-color: #f3f4f6;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 14px;\r\n color: #374151;\r\n transition: background-color 0.2s;\r\n}\r\n\r\n.suggested-question:hover {\r\n background-color: #e5e7eb;\r\n}\r\n\r\n.arrow-right {\r\n margin-left: 8px;\r\n}\r\n\r\n.loading-suggestions {\r\n display: flex;\r\n justify-content: center;\r\n padding: 16px;\r\n}\r\n\r\n.loading-spinner-small {\r\n width: 20px;\r\n height: 20px;\r\n border: 2px solid #e5e7eb;\r\n border-top-color: #6b7280;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n/* 添加上传按钮样式 */\r\n.upload-button {\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n padding: 8px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: #666;\r\n border-radius: 4px;\r\n transition: background-color 0.2s;\r\n}\r\n\r\n.upload-button:hover {\r\n background-color: rgba(0, 0, 0, 0.04);\r\n}\r\n\r\n.upload-button svg {\r\n width: 20px;\r\n height: 20px;\r\n}\r\n\r\n/* 隐藏原生文件输入框 */\r\n.file-input {\r\n display: none;\r\n}\r\n\r\n/* 添加文件名显示区域样式 */\r\n.selected-file {\r\n font-size: 12px;\r\n color: #666;\r\n margin-left: 8px;\r\n max-width: 150px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.input-wrapper {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n padding: 0 4px;\r\n background: white;\r\n}\r\n\r\n.input-wrapper input {\r\n border: none;\r\n flex: 1;\r\n padding: 8px;\r\n outline: none;\r\n}\r\n\r\n.input-wrapper:focus-within {\r\n border-color: #bbb;\r\n}\r\n\r\n/* 文件预览区域样式 */\r\n.file-preview {\r\n padding: 8px 16px;\r\n border-top: 1px solid #eee;\r\n background-color: #f9f9f9;\r\n}\r\n\r\n.file-info {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 8px;\r\n background: white;\r\n border: 1px solid #e8e8e8;\r\n border-radius: 4px;\r\n}\r\n\r\n.file-name {\r\n font-size: 13px;\r\n color: #333;\r\n margin-right: 8px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n max-width: calc(100% - 30px);\r\n}\r\n\r\n.remove-file {\r\n background: transparent;\r\n border: none;\r\n color: #999;\r\n cursor: pointer;\r\n padding: 4px 8px;\r\n font-size: 16px;\r\n line-height: 1;\r\n border-radius: 4px;\r\n transition: all 0.2s;\r\n}\r\n\r\n.remove-file:hover {\r\n background-color: #f0f0f0;\r\n color: #666;\r\n}\r\n\r\n\r\n","import { Component, Prop, h, State, Event, EventEmitter, Element, Watch } from '@stencil/core';\r\nimport { convertWorkflowStreamNodeToMessageRound, UserInputMessageType, sendSSERequest, sendHttpRequest } from '../../utils/utils';\r\nimport { ChatMessage } from '../../interfaces/chat';\r\n\r\n@Component({\r\n tag: 'pcm-chat-modal',\r\n styleUrl: 'pcm-chat-modal.css',\r\n shadow: true,\r\n})\r\nexport class ChatModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: 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 @State() currentMessage: string = '';\r\n\r\n /**\r\n * 当发送消息时触发\r\n */\r\n @Event() messageSent: EventEmitter<string>;\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() zIndex?: number = 1000;\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 * 机器人ID\r\n */\r\n @Prop() botId: string;\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 */\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 private readonly SCROLL_THRESHOLD = 30;\r\n\r\n @State() isLoadingHistory: boolean = false;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n // 添加新的 Event\r\n @Event() streamComplete: EventEmitter<{\r\n conversation_id: string;\r\n event: string;\r\n message_id: string;\r\n id: string;\r\n }>;\r\n\r\n @State() suggestedQuestions: string[] = [];\r\n @State() suggestedQuestionsLoading: boolean = false;\r\n private stopSuggestedQuestionsRef: { current: boolean } = { current: false };\r\n\r\n @State() selectedFile: File | null = null;\r\n @State() isUploading: boolean = false;\r\n @State() uploadedFileInfo: { cos_key: string, filename: string, ext: string, presigned_url: string }[] = [];\r\n\r\n /**\r\n * 默认查询文本\r\n */\r\n @Prop() defaultQuery: string = '';\r\n\r\n /**\r\n * 是否以全屏模式打开\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n private handleClose = () => {\r\n this.modalClosed.emit();\r\n };\r\n\r\n private handleInputChange = (event: Event) => {\r\n const input = event.target as HTMLInputElement;\r\n this.currentMessage = input.value;\r\n };\r\n\r\n private async getSuggestedQuestions(messageId: string) {\r\n this.stopSuggestedQuestionsRef.current = false;\r\n this.suggestedQuestionsLoading = true;\r\n\r\n try {\r\n const response = await sendHttpRequest({\r\n url: `https://pcm_api.ylzhaopin.com/share/messages/${messageId}/suggested`,\r\n params: {\r\n bot_id: this.botId\r\n }\r\n });\r\n\r\n if (this.stopSuggestedQuestionsRef.current) return;\r\n\r\n if (response.isOk && response.data?.result === 'success') {\r\n this.suggestedQuestions = response.data?.data || [];\r\n }\r\n } catch (error) {\r\n console.error('获取问题建议失败:', error);\r\n } finally {\r\n this.suggestedQuestionsLoading = false;\r\n }\r\n }\r\n\r\n private handleStopSuggestedQuestions = () => {\r\n this.suggestedQuestions = [];\r\n this.stopSuggestedQuestionsRef.current = true;\r\n };\r\n\r\n private handleFileChange = async (event: Event) => {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this.selectedFile = input.files[0];\r\n \r\n // 文件选择后立即上传\r\n await this.uploadFile();\r\n }\r\n };\r\n\r\n private async uploadFile() {\r\n if (!this.selectedFile) return;\r\n \r\n this.isUploading = true;\r\n \r\n try {\r\n const formData = new FormData();\r\n formData.append('file', this.selectedFile);\r\n \r\n const response = await fetch('https://pcm_api.ylzhaopin.com/external/v1/files/upload', {\r\n method: 'POST',\r\n body: formData\r\n });\r\n \r\n \r\n const result = await response.json();\r\n console.log('result', result);\r\n if (result) {\r\n this.uploadedFileInfo.push({\r\n cos_key: result.cos_key,\r\n filename: result.filename,\r\n ext: result.ext,\r\n presigned_url: result.presigned_url\r\n });\r\n } \r\n } catch (error) {\r\n console.error('文件上传错误:', error);\r\n this.clearSelectedFile();\r\n alert('文件上传失败,请重试');\r\n } finally {\r\n this.isUploading = false;\r\n }\r\n }\r\n\r\n private handleUploadClick = () => {\r\n const fileInput = this.hostElement.shadowRoot?.querySelector('.file-input') as HTMLInputElement;\r\n fileInput?.click();\r\n };\r\n\r\n private clearSelectedFile = () => {\r\n this.selectedFile = null;\r\n this.uploadedFileInfo = [];\r\n const fileInput = this.hostElement.shadowRoot?.querySelector('.file-input') as HTMLInputElement;\r\n if (fileInput) {\r\n fileInput.value = '';\r\n }\r\n };\r\n\r\n\r\n private async sendMessageToAPI(message: string) {\r\n this.handleStopSuggestedQuestions();\r\n console.log('开始发送消息:', message);\r\n this.isLoading = true;\r\n let answer = '';\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() || (this.uploadedFileInfo.length > 0 ? '请分析这个文件' : '');\r\n\r\n // 创建新的消息对象时确保必填字段都有值\r\n const newMessage: ChatMessage = {\r\n id: `temp-${Date.now()}`, // 消息唯一标识\r\n time: time, // 消息时间\r\n query: queryText, // 用户输入的消息内容\r\n answer: '', // AI助手的回复内容\r\n bot_id: this.botId, // 机器人ID\r\n isStreaming: true, // 是否正在流式输出\r\n conversation_id: this.conversationId, // 会话ID\r\n inputs: {}, // 输入参数\r\n status: \"normal\", // 消息状态\r\n error: null // 错误信息\r\n };\r\n\r\n // 设置当前流式消息\r\n this.currentStreamingMessage = newMessage;\r\n\r\n this.shouldAutoScroll = true;\r\n // 滚动到底部\r\n this.scrollToBottom();\r\n\r\n // 准备请求数据\r\n const requestData: any = {\r\n bot_id: this.botId,\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: queryText,\r\n user: '1234567890'\r\n };\r\n // 如果有上传的文件,添加到inputs参数\r\n if (this.uploadedFileInfo.length > 0) {\r\n const fileUrls = this.uploadedFileInfo.map(fileInfo => fileInfo.cos_key).join(',');\r\n\r\n requestData.inputs = {\r\n ...requestData.inputs,\r\n input: fileUrls\r\n };\r\n }\r\n\r\n await sendSSERequest({\r\n url: `https://pcm_api.ylzhaopin.com/share/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.updateUrlWithConversationId(data.conversation_id);\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 const updatedMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n answer,\r\n isStreaming: true\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 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: () => {\r\n console.log('请求完成');\r\n this.isLoading = false;\r\n this.messages = [...this.messages, this.currentStreamingMessage];\r\n\r\n // 在消息完成后获取问题建议\r\n if (this.currentStreamingMessage) {\r\n this.getSuggestedQuestions(this.currentStreamingMessage.conversation_id);\r\n }\r\n\r\n this.currentStreamingMessage = null;\r\n }\r\n });\r\n }\r\n // 监听滚动事件,用于控制聊天历史记录的自动滚动行为。\r\n private handleScroll = () => {\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 private scrollToBottom() {\r\n if (!this.shouldAutoScroll) return;\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n console.log('chatHistory', chatHistory);\r\n if (chatHistory && this.isOpen) {\r\n // 强制浏览器重新计算布局\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n\r\n // 添加 componentDidRender 生命周期方法,用于在组件渲染后滚动到底部\r\n componentDidRender() {\r\n if (this.isLoadingHistory || (this.shouldAutoScroll && this.isOpen)) {\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory) {\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n }\r\n\r\n private updateUrlWithConversationId(conversationId: string) {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n if (!urlParams.get('conversation_id')) {\r\n const newUrl = new URL(window.location.href);\r\n newUrl.searchParams.set('conversation_id', conversationId);\r\n window.history.replaceState({}, '', newUrl);\r\n }\r\n }\r\n\r\n private handleSendMessage = () => {\r\n if ((!this.currentMessage.trim() && this.uploadedFileInfo.length === 0) || this.isLoading) return;\r\n\r\n // 触发消息发送事件\r\n this.messageSent.emit(this.currentMessage);\r\n\r\n // 发送消息到API\r\n this.sendMessageToAPI(this.currentMessage);\r\n\r\n // 清空输入框\r\n this.currentMessage = '';\r\n \r\n // 清除已选择的文件\r\n this.clearSelectedFile();\r\n\r\n // 保持输入框焦点\r\n const inputElement = this.hostElement.shadowRoot?.querySelector('input');\r\n inputElement?.focus();\r\n };\r\n\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.key === 'Enter' && !event.shiftKey) {\r\n event.preventDefault();\r\n this.handleSendMessage();\r\n }\r\n };\r\n\r\n // 修改 loadHistoryMessages 方法\r\n private async loadHistoryMessages() {\r\n if (!this.conversationId) return;\r\n\r\n this.isLoadingHistory = true;\r\n\r\n try {\r\n const response = await sendHttpRequest({\r\n url: `https://pcm_api.ylzhaopin.com/share/messages`,\r\n params: {\r\n conversation_id: this.conversationId,\r\n bot_id: this.botId,\r\n user: '1234567890',\r\n limit: 20\r\n }\r\n });\r\n\r\n if (!response.isOk || !response.data) {\r\n throw new Error('加载历史消息失败');\r\n }\r\n\r\n // 适配新的接口返回格式\r\n const historyData = response.data.data || [];\r\n\r\n // 清空现有消息,确保不会重复\r\n this.currentStreamingMessage = null;\r\n this.messages = [];\r\n\r\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\r\n const time = new Date(msg.created_at * 1000);\r\n const timeStr = `${time.getHours()}:${time.getMinutes().toString().padStart(2, '0')}`;\r\n\r\n return {\r\n ...msg,\r\n time: timeStr,\r\n bot_id: this.botId,\r\n isStreaming: false,\r\n status: msg.status === 'error' ? 'error' : 'normal' as const\r\n };\r\n });\r\n\r\n this.messages = formattedMessages;\r\n\r\n // 使用 requestAnimationFrame 确保在下一帧渲染后滚动\r\n requestAnimationFrame(() => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n });\r\n\r\n } catch (error) {\r\n console.error('加载历史消息失败:', error);\r\n } finally {\r\n this.isLoadingHistory = false;\r\n }\r\n }\r\n\r\n\r\n // 添加 isOpen 的 watch 方法\r\n @Watch('isOpen')\r\n async handleIsOpenChange(newValue: boolean) {\r\n if (newValue && this.conversationId) {\r\n await this.loadHistoryMessages();\r\n }\r\n }\r\n\r\n @Watch('defaultQuery')\r\n handleDefaultQueryChange(newValue: string) {\r\n if (newValue && !this.currentMessage) {\r\n this.currentMessage = newValue;\r\n }\r\n }\r\n\r\n componentWillLoad() {\r\n // 组件加载时设置默认查询\r\n if (this.defaultQuery) {\r\n this.currentMessage = this.defaultQuery;\r\n }\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 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 <h3>{this.modalTitle}</h3>\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-history\" onScroll={this.handleScroll}>\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 <>\r\n {this.messages.map((message) => (\r\n <div id={`message_${message.id}`} key={message.id}>\r\n <pcm-chat-message\r\n message={message}\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 message={this.currentStreamingMessage}\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 </>\r\n )}\r\n\r\n {this.suggestedQuestionsLoading ? (\r\n <div class=\"loading-suggestions\">\r\n <div class=\"loading-spinner-small\"></div>\r\n </div>\r\n ) : (\r\n this.suggestedQuestions.length > 0 && (\r\n <div class=\"suggested-questions\">\r\n {this.suggestedQuestions.map((question, index) => (\r\n <div\r\n key={index}\r\n class=\"suggested-question\"\r\n onClick={() => {\r\n this.currentMessage = question;\r\n this.handleSendMessage();\r\n }}\r\n >\r\n {question}\r\n <span class=\"arrow-right\">→</span>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n )}\r\n </div>\r\n\r\n {/* 添加文件预览区域 */}\r\n {this.selectedFile && (\r\n <div class=\"file-preview\">\r\n <div class=\"file-info\">\r\n <span class=\"file-name\" title={this.selectedFile.name}>\r\n {this.selectedFile.name}\r\n {this.isUploading && <span class=\"uploading-indicator\"> (上传中...)</span>}\r\n {this.uploadedFileInfo.length > 0 && <span class=\"upload-success\"> (已上传)</span>}\r\n </span>\r\n <button class=\"remove-file\" onClick={this.clearSelectedFile}>\r\n ×\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div class=\"message-input\">\r\n <input\r\n type=\"file\"\r\n class=\"file-input\"\r\n onChange={this.handleFileChange}\r\n accept=\"image/*,.pdf,.doc,.docx,.txt\"\r\n />\r\n <button\r\n class=\"upload-button\"\r\n onClick={this.handleUploadClick}\r\n title=\"上传文件\"\r\n disabled={this.isUploading}\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M12 4v16m0-16l-4 4m4-4l4 4\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <div class=\"input-wrapper\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"请输入消息...\"\r\n value={this.currentMessage}\r\n onInput={this.handleInputChange}\r\n onKeyDown={this.handleKeyDown}\r\n disabled={this.isLoading}\r\n />\r\n </div>\r\n\r\n <button\r\n class=\"send-button\"\r\n onClick={() => this.handleSendMessage()}\r\n disabled={(!this.currentMessage.trim() && this.uploadedFileInfo.length === 0) || this.isLoading || this.isUploading}\r\n >\r\n {this.isLoading ? '发送中...' : '发送'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n} "],"names":[],"mappings":";;;AAAA,MAAM,eAAe,GAAG,gwKAAgwK;;MCS3wK,SAAS,GAAA,MAAA;;;;;;;AACpB;;AAEG;IACK,UAAU,GAAW,MAAM;AAEnC;;AAEG;IACsB,MAAM,GAAY,KAAK;AAEhD;;AAEG;IACM,QAAQ,GAAkB,EAAE;AAErC;;AAEG;IACM,cAAc,GAAW,EAAE;AAEpC;;AAEG;AACM,IAAA,WAAW;AAEpB;;AAEG;AACM,IAAA,WAAW;AAEpB;;AAEG;AACK,IAAA,IAAI;AAEZ;;AAEG;IACK,MAAM,GAAY,IAAI;AAE9B;;AAEG;IACK,YAAY,GAAY,IAAI;AAEpC;;AAEG;IACK,WAAW,GAAY,IAAI;AAEnC;;AAEG;AACK,IAAA,KAAK;AAEb;;AAEG;AACsB,IAAA,cAAc;AAGvC;;AAEG;IACM,uBAAuB,GAAW,EAAE;AAE7C;;AAEG;IACM,SAAS,GAAY,KAAK;AAEnC;;AAEG;IACM,uBAAuB,GAAuB,IAAI;;IAGlD,gBAAgB,GAAY,IAAI;IACxB,gBAAgB,GAAG,EAAE;IAE7B,gBAAgB,GAAY,KAAK;;;AAMjC,IAAA,cAAc;IAOd,kBAAkB,GAAa,EAAE;IACjC,yBAAyB,GAAY,KAAK;AAC3C,IAAA,yBAAyB,GAAyB,EAAE,OAAO,EAAE,KAAK,EAAE;IAEnE,YAAY,GAAgB,IAAI;IAChC,WAAW,GAAY,KAAK;IAC5B,gBAAgB,GAAgF,EAAE;AAE3G;;AAEG;IACK,YAAY,GAAW,EAAE;AAEjC;;AAEG;IACK,UAAU,GAAY,KAAK;IAE3B,WAAW,GAAG,MAAK;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AACzB,KAAC;AAEO,IAAA,iBAAiB,GAAG,CAAC,KAAY,KAAI;AAC3C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK;AACnC,KAAC;IAEO,MAAM,qBAAqB,CAAC,SAAiB,EAAA;AACnD,QAAA,IAAI,CAAC,yBAAyB,CAAC,OAAO,GAAG,KAAK;AAC9C,QAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;AAErC,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;gBACrC,GAAG,EAAE,CAAgD,6CAAA,EAAA,SAAS,CAAY,UAAA,CAAA;AAC1E,gBAAA,MAAM,EAAE;oBACN,MAAM,EAAE,IAAI,CAAC;AACd;AACF,aAAA,CAAC;AAEF,YAAA,IAAI,IAAI,CAAC,yBAAyB,CAAC,OAAO;gBAAE;AAE5C,YAAA,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,EAAE;gBACxD,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE;;;QAErD,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;;gBACzB;AACR,YAAA,IAAI,CAAC,yBAAyB,GAAG,KAAK;;;IAIlC,4BAA4B,GAAG,MAAK;AAC1C,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;AAC5B,QAAA,IAAI,CAAC,yBAAyB,CAAC,OAAO,GAAG,IAAI;AAC/C,KAAC;AAEO,IAAA,gBAAgB,GAAG,OAAO,KAAY,KAAI;AAChD,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;AAGlC,YAAA,MAAM,IAAI,CAAC,UAAU,EAAE;;AAE3B,KAAC;AAEO,IAAA,MAAM,UAAU,GAAA;QACtB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AAExB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AAEvB,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;YAC/B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC;AAE1C,YAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,wDAAwD,EAAE;AACrF,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,IAAI,EAAE;AACP,aAAA,CAAC;AAGF,YAAA,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;AACpC,YAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;YAC7B,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;oBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,aAAa,EAAE,MAAM,CAAC;AACvB,iBAAA,CAAC;;;QAEJ,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC;YAC/B,IAAI,CAAC,iBAAiB,EAAE;YACxB,KAAK,CAAC,YAAY,CAAC;;gBACX;AACR,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;;;IAIpB,iBAAiB,GAAG,MAAK;AAC/B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,aAAa,CAAqB;QAC/F,SAAS,EAAE,KAAK,EAAE;AACpB,KAAC;IAEO,iBAAiB,GAAG,MAAK;AAC/B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,aAAa,CAAqB;QAC/F,IAAI,SAAS,EAAE;AACb,YAAA,SAAS,CAAC,KAAK,GAAG,EAAE;;AAExB,KAAC;IAGO,MAAM,gBAAgB,CAAC,OAAe,EAAA;QAC5C,IAAI,CAAC,4BAA4B,EAAE;AACnC,QAAA,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACrB,IAAI,MAAM,GAAG,EAAE;AAEf,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,IAAI,GAAG,CAAG,EAAA,GAAG,CAAC,QAAQ,EAAE,CAAI,CAAA,EAAA,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;;QAGhF,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,GAAG,EAAE,CAAC;;AAGvF,QAAA,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAA,CAAE;YACxB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,EAAE;AACV,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK;YAClB,WAAW,EAAE,IAAI;AACjB,YAAA,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,IAAI;SACZ;;AAGD,QAAA,IAAI,CAAC,uBAAuB,GAAG,UAAU;AAEzC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;;QAE5B,IAAI,CAAC,cAAc,EAAE;;AAGrB,QAAA,MAAM,WAAW,GAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,KAAK;AAClB,YAAA,aAAa,EAAE,WAAW;YAC1B,eAAe,EAAE,IAAI,CAAC,cAAc;AACpC,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,IAAI,EAAE;SACP;;QAED,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAElF,WAAW,CAAC,MAAM,GAAG;gBACnB,GAAG,WAAW,CAAC,MAAM;AACrB,gBAAA,KAAK,EAAE;aACR;;AAGH,QAAA,MAAM,cAAc,CAAC;AACnB,YAAA,GAAG,EAAE,CAAmD,iDAAA,CAAA;AACxD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,SAAS,EAAE,CAAC,IAAI,KAAI;AAClB,gBAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;gBAEhC,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAChD,oBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe;AAC1C,oBAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC;;AAGxD,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;AAI5B,oBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;AAC9D,wBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,4BAAA,MAAM,IAAI,IAAI,CAAC,MAAM;AACrB,4BAAA,MAAM,cAAc,GAAgB;gCAClC,GAAG,IAAI,CAAC,uBAAuB;gCAC/B,MAAM;AACN,gCAAA,WAAW,EAAE;6BACd;AACD,4BAAA,IAAI,CAAC,uBAAuB,GAAG,cAAc;4BAC7C,IAAI,CAAC,cAAc,EAAE;;;;AAI3B,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE;AAChC,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACvB,wBAAA,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,EAAE;wBAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;AACZ,qBAAA,CAAC;;aAEL;AACD,YAAA,OAAO,EAAE,CAAC,KAAK,KAAI;AACjB,gBAAA,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;gBAC7B,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;AACjC,wBAAA,GAAG,UAAU;AACb,wBAAA,MAAM,EAAE,iBAAiB;AACzB,wBAAA,KAAK,EAAE,KAAK;AACZ,wBAAA,WAAW,EAAE;AACd,qBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;AACnC,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;aACvB;YACD,UAAU,EAAE,MAAK;AACf,gBAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACnB,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,CAAC;;AAGhE,gBAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;oBAChC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC;;AAG1E,gBAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;;AAEtC,SAAA,CAAC;;;IAGI,YAAY,GAAG,MAAK;AAC1B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC;AAC/E,QAAA,IAAI,CAAC,WAAW;YAAE;QAElB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,WAAW;AAC7D,QAAA,MAAM,kBAAkB,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY;;QAGlE,IAAI,CAAC,gBAAgB,GAAG,kBAAkB,IAAI,IAAI,CAAC,gBAAgB;AACrE,KAAC;IAEO,cAAc,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE;AAC5B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC;AAC/E,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC;AACvC,QAAA,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE;;AAE9B,YAAA,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,YAAY;;;;IAKpD,kBAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;AACnE,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC;YAC/E,IAAI,WAAW,EAAE;AACf,gBAAA,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,YAAY;;;;AAK9C,IAAA,2BAA2B,CAAC,cAAsB,EAAA;QACxD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC5C,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC;;;IAIvC,iBAAiB,GAAG,MAAK;QAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS;YAAE;;QAG3F,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;;AAG1C,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC;;AAG1C,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;;QAGxB,IAAI,CAAC,iBAAiB,EAAE;;AAGxB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC;QACxE,YAAY,EAAE,KAAK,EAAE;AACvB,KAAC;AAEO,IAAA,aAAa,GAAG,CAAC,KAAoB,KAAI;QAC/C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC5C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,iBAAiB,EAAE;;AAE5B,KAAC;;AAGO,IAAA,MAAM,mBAAmB,GAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;AAE1B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAE5B,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;AACrC,gBAAA,GAAG,EAAE,CAA8C,4CAAA,CAAA;AACnD,gBAAA,MAAM,EAAE;oBACN,eAAe,EAAE,IAAI,CAAC,cAAc;oBACpC,MAAM,EAAE,IAAI,CAAC,KAAK;AAClB,oBAAA,IAAI,EAAE,YAAY;AAClB,oBAAA,KAAK,EAAE;AACR;AACF,aAAA,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpC,gBAAA,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;;;YAI7B,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;;AAG5C,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;AACnC,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;YAElB,MAAM,iBAAiB,GAAkB,WAAW,CAAC,GAAG,CAAC,GAAG,IAAG;gBAC7D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;gBAC5C,MAAM,OAAO,GAAG,CAAG,EAAA,IAAI,CAAC,QAAQ,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;gBAErF,OAAO;AACL,oBAAA,GAAG,GAAG;AACN,oBAAA,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,IAAI,CAAC,KAAK;AAClB,oBAAA,WAAW,EAAE,KAAK;AAClB,oBAAA,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,OAAO,GAAG,OAAO,GAAG;iBAC5C;AACH,aAAC,CAAC;AAEF,YAAA,IAAI,CAAC,QAAQ,GAAG,iBAAiB;;YAGjC,qBAAqB,CAAC,MAAK;AACzB,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;gBAC5B,IAAI,CAAC,cAAc,EAAE;AACvB,aAAC,CAAC;;QAEF,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;;gBACzB;AACR,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;;;;IAOjC,MAAM,kBAAkB,CAAC,QAAiB,EAAA;AACxC,QAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE;AACnC,YAAA,MAAM,IAAI,CAAC,mBAAmB,EAAE;;;AAKpC,IAAA,wBAAwB,CAAC,QAAgB,EAAA;AACvC,QAAA,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACpC,YAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;;;IAIlC,iBAAiB,GAAA;;AAEf,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY;;;IAI3C,MAAM,GAAA;QACJ,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AAE7B,QAAA,MAAM,UAAU,GAAG;AACjB,YAAA,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;SAC3B;AAED,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,IAAI,CAAC;SACpB;AAED,QAAA,MAAM,YAAY,GAAG;AACnB,YAAA,eAAe,EAAE,IAAI;YACrB,oBAAoB,EAAE,IAAI,CAAC;SAC5B;QAED,QACE,WAAK,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAA,EACzC,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,cAAc,EAAA,EACvB,IAAI,CAAC,YAAY,KAChB,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,cAAc,EAAA,EACvB,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,aAAa,EAAA,EACrB,IAAI,CAAC,IAAI,IAAI,CAAK,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAC,aAAa,EAAC,GAAG,EAAC,0BAAM,EAAG,CAAA,EACpE,CAAA,CAAA,IAAA,EAAA,IAAA,EAAK,IAAI,CAAC,UAAU,CAAM,CACtB,EACL,IAAI,CAAC,WAAW,KACf,CAAQ,CAAA,QAAA,EAAA,EAAA,KAAK,EAAC,cAAc,EAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAA,EACpD,CAAc,CAAA,MAAA,EAAA,IAAA,EAAA,QAAA,CAAA,CACP,CACV,CACG,CACP,EAED,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,cAAc,EAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAA,EAClD,IAAI,CAAC,gBAAgB,IACpB,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,mBAAmB,EAAA,EAC5B,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,iBAAiB,EAAO,CAAA,EACnC,CAAA,CAAA,GAAA,EAAA,IAAA,EAAA,+CAAA,CAAiB,CACb,KAEN,CAAA,CAAA,CAAA,CAAA,QAAA,EAAA,IAAA,EACG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,MACzB,CAAA,CAAA,KAAA,EAAA,EAAK,EAAE,EAAE,CAAW,QAAA,EAAA,OAAO,CAAC,EAAE,CAAE,CAAA,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAA,EAC/C,CACE,CAAA,kBAAA,EAAA,EAAA,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,CAAC,KAAK,KAAI;AACzB,gBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAC3C,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,CAC1D;AACD,gBAAA,IAAI,CAAC,QAAQ,GAAG,eAAe;AACjC,aAAC,EAAA,CACiB,CAChB,CACP,CAAC,EACD,IAAI,CAAC,uBAAuB,KAC3B,CAAK,CAAA,KAAA,EAAA,EAAA,EAAE,EAAE,CAAW,QAAA,EAAA,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAA,CAAE,EAAA,EACnD,CAAA,CAAA,kBAAA,EAAA,EACE,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAA,CACnB,CAChB,CACP,EACA,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,KAC1D,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,aAAa,EAAA,EACtB,CAAY,CAAA,GAAA,EAAA,IAAA,EAAA,gCAAA,CAAA,CACR,CACP,CACA,CACJ,EAEA,IAAI,CAAC,yBAAyB,IAC7B,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,qBAAqB,EAAA,EAC9B,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,uBAAuB,EAAA,CAAO,CACrC,KAEN,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,KAChC,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,qBAAqB,EAC7B,EAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,MAC3C,WACE,GAAG,EAAE,KAAK,EACV,KAAK,EAAC,oBAAoB,EAC1B,OAAO,EAAE,MAAK;AACZ,gBAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;gBAC9B,IAAI,CAAC,iBAAiB,EAAE;AAC1B,aAAC,EAAA,EAEA,QAAQ,EACT,CAAM,CAAA,MAAA,EAAA,EAAA,KAAK,EAAC,aAAa,EAAS,EAAA,QAAA,CAAA,CAC9B,CACP,CAAC,CACE,CACP,CACF,CACG,EAGL,IAAI,CAAC,YAAY,KAChB,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,cAAc,EAAA,EACvB,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,WAAW,EAAA,EACpB,CAAM,CAAA,MAAA,EAAA,EAAA,KAAK,EAAC,WAAW,EAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAA,EAClD,IAAI,CAAC,YAAY,CAAC,IAAI,EACtB,IAAI,CAAC,WAAW,IAAI,YAAM,KAAK,EAAC,qBAAqB,EAAiB,EAAA,0BAAA,CAAA,EACtE,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAC,gBAAgB,EAAA,EAAA,uBAAA,CAAc,CAC1E,EACP,CAAA,CAAA,QAAA,EAAA,EAAQ,KAAK,EAAC,aAAa,EAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAA,EAAA,QAAA,CAElD,CACL,CACF,CACP,EAED,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,eAAe,EAAA,EACxB,CAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAC,YAAY,EAClB,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAC/B,MAAM,EAAC,8BAA8B,EACrC,CAAA,EACF,CAAA,CAAA,QAAA,EAAA,EACE,KAAK,EAAC,eAAe,EACrB,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAC/B,KAAK,EAAC,0BAAM,EACZ,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAA,EAE1B,CAAK,CAAA,KAAA,EAAA,EAAA,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAA,EACxD,CACiB,CAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,OAAO,EACN,iBAAA,EAAA,OAAO,EACV,cAAA,EAAA,GAAG,EAChB,CAAC,EAAC,4BAA4B,EAC9B,CAAA,CACE,CACC,EAET,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,eAAe,EAAA,EACxB,CAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,mCAAU,EACtB,KAAK,EAAE,IAAI,CAAC,cAAc,EAC1B,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAC/B,SAAS,EAAE,IAAI,CAAC,aAAa,EAC7B,QAAQ,EAAE,IAAI,CAAC,SAAS,GACxB,CACE,EAEN,CACE,CAAA,QAAA,EAAA,EAAA,KAAK,EAAC,aAAa,EACnB,OAAO,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,EACvC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,EAAA,EAElH,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,IAAI,CAC1B,CACL,CACF,CACF;;;;;;;;;;;"}
1
+ {"version":3,"file":"pcm-chat-modal.entry.esm.js","sources":["src/components/pcm-chat-modal/pcm-chat-modal.css?tag=pcm-chat-modal&encapsulation=shadow","src/components/pcm-chat-modal/pcm-chat-modal.tsx"],"sourcesContent":[":host {\r\n display: block;\r\n}\r\n\r\n.modal-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n overflow-y: auto;\r\n padding: 20px;\r\n z-index: 1000;\r\n}\r\n\r\n/* 全屏模式下取消 padding */\r\n.fullscreen-overlay {\r\n padding: 0;\r\n}\r\n\r\n.modal-container {\r\n background: white;\r\n border-radius: 8px;\r\n width: 100%;\r\n max-width: 800px;\r\n height: 80vh;\r\n min-height: 600px;\r\n display: flex;\r\n flex-direction: column;\r\n position: relative;\r\n margin: auto;\r\n}\r\n\r\n/* 全屏模式样式 */\r\n.modal-container.fullscreen {\r\n width: 100vw;\r\n max-width: none;\r\n height: 100vh;\r\n min-height: 100vh;\r\n border-radius: 0;\r\n margin: 0;\r\n}\r\n\r\n\r\n/* 响应式布局 */\r\n@media screen and (max-width: 768px) {\r\n .modal-overlay {\r\n padding: 0;\r\n }\r\n\r\n .modal-container {\r\n width: 95%;\r\n height: 70vh;\r\n min-height: 400px;\r\n }\r\n\r\n .chat-history {\r\n min-height: 200px;\r\n max-height: 50vh;\r\n }\r\n\r\n .modal-container.fullscreen {\r\n /* 支持 iOS Safari */\r\n height: -webkit-fill-available;\r\n max-height: -webkit-fill-available;\r\n /* 确保内容不会被顶部状态栏和底部工具栏遮挡 */\r\n padding: env(safe-area-inset-top) 0 env(safe-area-inset-bottom);\r\n }\r\n\r\n .modal-container.fullscreen .chat-history {\r\n max-height: unset;\r\n }\r\n\r\n .modal-container.fullscreen .modal-header {\r\n padding: 0px 16px;\r\n /* 确保头部不被状态栏遮挡 */\r\n padding-top: max(30px, env(safe-area-inset-top));\r\n }\r\n}\r\n\r\n.modal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 4px 16px;\r\n height: 50px;\r\n border-bottom: 1px solid #e8e8e8;\r\n}\r\n\r\n.header-left {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.header-icon {\r\n width: 24px;\r\n height: 24px;\r\n}\r\n\r\n.close-button {\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n padding: 8px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 4px;\r\n}\r\n\r\n.close-button:hover {\r\n background-color: rgba(0, 0, 0, 0.04);\r\n}\r\n\r\n.close-button span {\r\n font-size: 24px;\r\n line-height: 1;\r\n color: #999;\r\n}\r\n\r\n.close-button:hover span {\r\n color: #666;\r\n}\r\n\r\n.chat-history {\r\n position: relative;\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 16px;\r\n scroll-behavior: smooth;\r\n min-height: 400px; /* PC端默认高度 */\r\n}\r\n\r\n/* 移动端样式 */\r\n@media screen and (max-width: 480px) {\r\n .chat-history {\r\n min-height: 200px; /* 移动端更小的高度 */\r\n max-height: 50vh;\r\n }\r\n}\r\n\r\n.message-input {\r\n padding: 16px;\r\n border-top: 1px solid #eee;\r\n display: flex;\r\n gap: 8px;\r\n align-items: center;\r\n}\r\n\r\n.message-input input {\r\n flex: 1;\r\n padding: 8px 12px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n outline: none;\r\n transition: border-color 0.2s ease;\r\n}\r\n\r\n.message-input input:focus {\r\n border-color: #bbb;\r\n}\r\n\r\n/* 消息样式 */\r\n.message {\r\n margin-bottom: 16px;\r\n opacity: 1;\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.message-content {\r\n max-width: 70%;\r\n padding: 8px 12px;\r\n border-radius: 8px;\r\n word-break: break-word;\r\n}\r\n\r\n.message-content p {\r\n margin: 0;\r\n word-break: break-word;\r\n}\r\n\r\n.user-message {\r\n display: flex;\r\n justify-content: flex-end;\r\n}\r\n\r\n.agent-message {\r\n display: flex;\r\n justify-content: flex-start;\r\n}\r\n\r\n.user-message .message-content {\r\n background-color: #007bff;\r\n color: white;\r\n}\r\n\r\n.agent-message .message-content {\r\n background-color: #f1f1f1;\r\n}\r\n\r\n.message-time {\r\n font-size: 12px;\r\n color: #999;\r\n margin-top: 4px;\r\n display: block;\r\n}\r\n\r\n.send-button {\r\n background-color: #1890ff;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n padding: 8px 16px;\r\n cursor: pointer;\r\n font-weight: 500;\r\n}\r\n\r\n.send-button:disabled {\r\n background-color: #ccc;\r\n cursor: not-allowed;\r\n}\r\n\r\n.empty-state {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height: 100%;\r\n color: #999;\r\n text-align: center;\r\n}\r\n\r\n.loading-container {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n background-color: rgba(255, 255, 255, 0.98);\r\n z-index: 1;\r\n opacity: 1;\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.loading-container p {\r\n margin-top: 16px;\r\n color: #666;\r\n font-size: 14px;\r\n}\r\n\r\n.loading-spinner {\r\n width: 40px;\r\n height: 40px;\r\n border: 3px solid #f3f3f3;\r\n border-top: 3px solid #1890ff;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n}\r\n\r\n/* 修改 messages-wrapper 的样式 */\r\n.messages-wrapper {\r\n width: 100%;\r\n min-height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n /* 当内容少时,将内容放在底部 */\r\n justify-content: flex-end;\r\n}\r\n\r\n/* 当有很多消息时,取消固定在底部 */\r\n.messages-wrapper.has-overflow {\r\n justify-content: flex-start;\r\n}\r\n\r\n.suggested-questions {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n padding: 16px;\r\n}\r\n\r\n.suggested-question {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 8px 12px;\r\n background-color: #f3f4f6;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 14px;\r\n color: #374151;\r\n transition: background-color 0.2s;\r\n}\r\n\r\n.suggested-question:hover {\r\n background-color: #e5e7eb;\r\n}\r\n\r\n.arrow-right {\r\n margin-left: 8px;\r\n}\r\n\r\n.loading-suggestions {\r\n display: flex;\r\n justify-content: center;\r\n padding: 16px;\r\n}\r\n\r\n.loading-spinner-small {\r\n width: 20px;\r\n height: 20px;\r\n border: 2px solid #e5e7eb;\r\n border-top-color: #6b7280;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n/* 添加上传按钮样式 */\r\n.upload-button {\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n padding: 8px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: #666;\r\n border-radius: 4px;\r\n transition: background-color 0.2s;\r\n}\r\n\r\n.upload-button:hover {\r\n background-color: rgba(0, 0, 0, 0.04);\r\n}\r\n\r\n.upload-button svg {\r\n width: 20px;\r\n height: 20px;\r\n}\r\n\r\n/* 隐藏原生文件输入框 */\r\n.file-input {\r\n display: none;\r\n}\r\n\r\n/* 添加文件名显示区域样式 */\r\n.selected-file {\r\n font-size: 12px;\r\n color: #666;\r\n margin-left: 8px;\r\n max-width: 150px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.input-wrapper {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n padding: 0 4px;\r\n background: white;\r\n}\r\n\r\n.input-wrapper input {\r\n border: none;\r\n flex: 1;\r\n padding: 8px;\r\n outline: none;\r\n}\r\n\r\n.input-wrapper:focus-within {\r\n border-color: #bbb;\r\n}\r\n\r\n/* 文件预览区域样式 */\r\n.file-preview {\r\n padding: 8px 16px;\r\n border-top: 1px solid #eee;\r\n background-color: #f9f9f9;\r\n}\r\n\r\n.file-info {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 8px;\r\n background: white;\r\n border: 1px solid #e8e8e8;\r\n border-radius: 4px;\r\n}\r\n\r\n.file-name {\r\n font-size: 13px;\r\n color: #333;\r\n margin-right: 8px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n max-width: calc(100% - 30px);\r\n}\r\n\r\n.remove-file {\r\n background: transparent;\r\n border: none;\r\n color: #999;\r\n cursor: pointer;\r\n padding: 4px 8px;\r\n font-size: 16px;\r\n line-height: 1;\r\n border-radius: 4px;\r\n transition: all 0.2s;\r\n}\r\n\r\n.remove-file:hover {\r\n background-color: #f0f0f0;\r\n color: #666;\r\n}\r\n\r\n\r\n","import { Component, Prop, h, State, Event, EventEmitter, Element, Watch } from '@stencil/core';\r\nimport { convertWorkflowStreamNodeToMessageRound, UserInputMessageType, sendSSERequest, sendHttpRequest, uploadFileToBackend, FileUploadResponse } from '../../utils/utils';\r\nimport { ChatMessage } from '../../interfaces/chat';\r\n\r\n@Component({\r\n tag: 'pcm-chat-modal',\r\n styleUrl: 'pcm-chat-modal.css',\r\n shadow: true,\r\n})\r\nexport class ChatModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '在线客服';\r\n\r\n /**\r\n * API鉴权密钥\r\n */\r\n @Prop({ attribute: 'api-key' }) apiKey: 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 @State() currentMessage: string = '';\r\n\r\n /**\r\n * 当发送消息时触发\r\n */\r\n @Event() messageSent: EventEmitter<string>;\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() zIndex?: number = 1000;\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 * 机器人ID\r\n */\r\n @Prop() botId: string;\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 */\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 private readonly SCROLL_THRESHOLD = 30;\r\n\r\n @State() isLoadingHistory: boolean = false;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n // 添加新的 Event\r\n @Event() streamComplete: EventEmitter<{\r\n conversation_id: string;\r\n event: string;\r\n message_id: string;\r\n id: string;\r\n }>;\r\n\r\n @State() suggestedQuestions: string[] = [];\r\n @State() suggestedQuestionsLoading: boolean = false;\r\n private stopSuggestedQuestionsRef: { current: boolean } = { current: false };\r\n\r\n @State() selectedFile: File | null = null;\r\n @State() isUploading: boolean = false;\r\n @State() uploadedFileInfo: FileUploadResponse[] = [];\r\n\r\n /**\r\n * 默认查询文本\r\n */\r\n @Prop() defaultQuery: string = '';\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n private handleClose = () => {\r\n this.modalClosed.emit();\r\n };\r\n\r\n private handleInputChange = (event: Event) => {\r\n const input = event.target as HTMLInputElement;\r\n this.currentMessage = input.value;\r\n };\r\n\r\n private async getSuggestedQuestions(messageId: string) {\r\n this.stopSuggestedQuestionsRef.current = false;\r\n this.suggestedQuestionsLoading = true;\r\n\r\n try {\r\n const response = await sendHttpRequest({\r\n url: `/share/messages/${messageId}/suggested`,\r\n });\r\n\r\n if (this.stopSuggestedQuestionsRef.current) return;\r\n\r\n if (response.success && response.data) {\r\n this.suggestedQuestions = response.data || [];\r\n }\r\n } catch (error) {\r\n console.error('获取问题建议失败:', error);\r\n } finally {\r\n this.suggestedQuestionsLoading = false;\r\n }\r\n }\r\n\r\n private handleStopSuggestedQuestions = () => {\r\n this.suggestedQuestions = [];\r\n this.stopSuggestedQuestionsRef.current = true;\r\n };\r\n\r\n private handleFileChange = async (event: Event) => {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this.selectedFile = input.files[0];\r\n \r\n // 文件选择后立即上传\r\n await this.uploadFile();\r\n }\r\n };\r\n\r\n private async uploadFile() {\r\n if (!this.selectedFile) return;\r\n \r\n this.isUploading = true;\r\n \r\n try {\r\n const result = await uploadFileToBackend(this.selectedFile, {\r\n 'authorization': 'Bearer ' + this.apiKey\r\n });\r\n \r\n this.uploadedFileInfo.push(result);\r\n } catch (error) {\r\n console.error('文件上传错误:', error);\r\n this.clearSelectedFile();\r\n alert('文件上传失败,请重试');\r\n } finally {\r\n this.isUploading = false;\r\n }\r\n }\r\n\r\n private handleUploadClick = () => {\r\n const fileInput = this.hostElement.shadowRoot?.querySelector('.file-input') as HTMLInputElement;\r\n fileInput?.click();\r\n };\r\n\r\n private clearSelectedFile = () => {\r\n this.selectedFile = null;\r\n this.uploadedFileInfo = [];\r\n const fileInput = this.hostElement.shadowRoot?.querySelector('.file-input') as HTMLInputElement;\r\n if (fileInput) {\r\n fileInput.value = '';\r\n }\r\n };\r\n\r\n\r\n private async sendMessageToAPI(message: string) {\r\n this.handleStopSuggestedQuestions();\r\n console.log('开始发送消息:', message);\r\n this.isLoading = true;\r\n let answer = '';\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() || (this.uploadedFileInfo.length > 0 ? '请分析这个文件' : '');\r\n\r\n // 创建新的消息对象时确保必填字段都有值\r\n const newMessage: ChatMessage = {\r\n id: `temp-${Date.now()}`, // 消息唯一标识\r\n time: time, // 消息时间\r\n query: queryText, // 用户输入的消息内容\r\n answer: '', // AI助手的回复内容\r\n isStreaming: true, // 是否正在流式输出\r\n conversation_id: this.conversationId, // 会话ID\r\n inputs: {}, // 输入参数\r\n status: \"normal\", // 消息状态\r\n error: null // 错误信息\r\n };\r\n\r\n // 设置当前流式消息\r\n this.currentStreamingMessage = newMessage;\r\n\r\n this.shouldAutoScroll = true;\r\n // 滚动到底部\r\n this.scrollToBottom();\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 user: '1234567890'\r\n };\r\n // 如果有上传的文件,添加到inputs参数\r\n if (this.uploadedFileInfo.length > 0) {\r\n const fileUrls = this.uploadedFileInfo.map(fileInfo => fileInfo.cos_key).join(',');\r\n\r\n requestData.inputs = {\r\n ...requestData.inputs,\r\n input: fileUrls\r\n };\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.updateUrlWithConversationId(data.conversation_id);\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 const updatedMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n answer,\r\n isStreaming: true\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 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: () => {\r\n console.log('请求完成');\r\n this.isLoading = false;\r\n this.messages = [...this.messages, this.currentStreamingMessage];\r\n\r\n // 在消息完成后获取问题建议\r\n if (this.currentStreamingMessage) {\r\n this.getSuggestedQuestions(this.currentStreamingMessage.conversation_id);\r\n }\r\n\r\n this.currentStreamingMessage = null;\r\n }\r\n });\r\n }\r\n // 监听滚动事件,用于控制聊天历史记录的自动滚动行为。\r\n private handleScroll = () => {\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 private scrollToBottom() {\r\n if (!this.shouldAutoScroll) return;\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n console.log('chatHistory', chatHistory);\r\n if (chatHistory && this.isOpen) {\r\n // 强制浏览器重新计算布局\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n\r\n // 添加 componentDidRender 生命周期方法,用于在组件渲染后滚动到底部\r\n componentDidRender() {\r\n if (this.isLoadingHistory || (this.shouldAutoScroll && this.isOpen)) {\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory) {\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n }\r\n\r\n private updateUrlWithConversationId(conversationId: string) {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n if (!urlParams.get('conversation_id')) {\r\n const newUrl = new URL(window.location.href);\r\n newUrl.searchParams.set('conversation_id', conversationId);\r\n window.history.replaceState({}, '', newUrl);\r\n }\r\n }\r\n\r\n private handleSendMessage = () => {\r\n if ((!this.currentMessage.trim() && this.uploadedFileInfo.length === 0) || this.isLoading) return;\r\n\r\n // 触发消息发送事件\r\n this.messageSent.emit(this.currentMessage);\r\n\r\n // 发送消息到API\r\n this.sendMessageToAPI(this.currentMessage);\r\n\r\n // 清空输入框\r\n this.currentMessage = '';\r\n \r\n // 清除已选择的文件\r\n this.clearSelectedFile();\r\n\r\n // 保持输入框焦点\r\n const inputElement = this.hostElement.shadowRoot?.querySelector('input');\r\n inputElement?.focus();\r\n };\r\n\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.key === 'Enter' && !event.shiftKey) {\r\n event.preventDefault();\r\n this.handleSendMessage();\r\n }\r\n };\r\n\r\n // 修改 loadHistoryMessages 方法\r\n private async loadHistoryMessages() {\r\n if (!this.conversationId) return;\r\n\r\n this.isLoadingHistory = true;\r\n\r\n try {\r\n const response = await sendHttpRequest({\r\n url: `/share/messages`,\r\n params: {\r\n conversation_id: this.conversationId,\r\n user: '1234567890',\r\n limit: 20\r\n }\r\n });\r\n\r\n if (!response.success || !response.data) {\r\n throw new Error('加载历史消息失败');\r\n }\r\n\r\n // 适配新的接口返回格式\r\n const historyData = response.data || [];\r\n\r\n // 清空现有消息,确保不会重复\r\n this.currentStreamingMessage = null;\r\n this.messages = [];\r\n\r\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\r\n const time = new Date(msg.created_at * 1000);\r\n const timeStr = `${time.getHours()}:${time.getMinutes().toString().padStart(2, '0')}`;\r\n\r\n return {\r\n ...msg,\r\n time: timeStr,\r\n isStreaming: false,\r\n status: msg.status === 'error' ? 'error' : 'normal' as const\r\n };\r\n });\r\n\r\n this.messages = formattedMessages;\r\n\r\n // 使用 requestAnimationFrame 确保在下一帧渲染后滚动\r\n requestAnimationFrame(() => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n });\r\n\r\n } catch (error) {\r\n console.error('加载历史消息失败:', error);\r\n } finally {\r\n this.isLoadingHistory = false;\r\n }\r\n }\r\n\r\n\r\n // 添加 isOpen 的 watch 方法\r\n @Watch('isOpen')\r\n async handleIsOpenChange(newValue: boolean) {\r\n if (newValue && this.conversationId) {\r\n await this.loadHistoryMessages();\r\n }\r\n }\r\n\r\n @Watch('defaultQuery')\r\n handleDefaultQueryChange(newValue: string) {\r\n if (newValue && !this.currentMessage) {\r\n this.currentMessage = newValue;\r\n }\r\n }\r\n\r\n componentWillLoad() {\r\n // 组件加载时设置默认查询\r\n if (this.defaultQuery) {\r\n this.currentMessage = this.defaultQuery;\r\n }\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 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 <h3>{this.modalTitle}</h3>\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-history\" onScroll={this.handleScroll}>\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 <>\r\n {this.messages.map((message) => (\r\n <div id={`message_${message.id}`} key={message.id}>\r\n <pcm-chat-message\r\n message={message}\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 message={this.currentStreamingMessage}\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 </>\r\n )}\r\n\r\n {this.suggestedQuestionsLoading ? (\r\n <div class=\"loading-suggestions\">\r\n <div class=\"loading-spinner-small\"></div>\r\n </div>\r\n ) : (\r\n this.suggestedQuestions.length > 0 && (\r\n <div class=\"suggested-questions\">\r\n {this.suggestedQuestions.map((question, index) => (\r\n <div\r\n key={index}\r\n class=\"suggested-question\"\r\n onClick={() => {\r\n this.currentMessage = question;\r\n this.handleSendMessage();\r\n }}\r\n >\r\n {question}\r\n <span class=\"arrow-right\">→</span>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n )}\r\n </div>\r\n\r\n {/* 添加文件预览区域 */}\r\n {this.selectedFile && (\r\n <div class=\"file-preview\">\r\n <div class=\"file-info\">\r\n <span class=\"file-name\" title={this.selectedFile.name}>\r\n {this.selectedFile.name}\r\n {this.isUploading && <span class=\"uploading-indicator\"> (上传中...)</span>}\r\n {this.uploadedFileInfo.length > 0 && <span class=\"upload-success\"> (已上传)</span>}\r\n </span>\r\n <button class=\"remove-file\" onClick={this.clearSelectedFile}>\r\n ×\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div class=\"message-input\">\r\n <input\r\n type=\"file\"\r\n class=\"file-input\"\r\n onChange={this.handleFileChange}\r\n accept=\"image/*,.pdf,.doc,.docx,.txt\"\r\n />\r\n <button\r\n class=\"upload-button\"\r\n onClick={this.handleUploadClick}\r\n title=\"上传文件\"\r\n disabled={this.isUploading}\r\n >\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\r\n <path\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M12 4v16m0-16l-4 4m4-4l4 4\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <div class=\"input-wrapper\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"请输入消息...\"\r\n value={this.currentMessage}\r\n onInput={this.handleInputChange}\r\n onKeyDown={this.handleKeyDown}\r\n disabled={this.isLoading}\r\n />\r\n </div>\r\n\r\n <button\r\n class=\"send-button\"\r\n onClick={() => this.handleSendMessage()}\r\n disabled={(!this.currentMessage.trim() && this.uploadedFileInfo.length === 0) || this.isLoading || this.isUploading}\r\n >\r\n {this.isLoading ? '发送中...' : '发送'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n} "],"names":[],"mappings":";;;AAAA,MAAM,eAAe,GAAG,gwKAAgwK;;MCS3wK,SAAS,GAAA,MAAA;;;;;;;AACpB;;AAEG;IACK,UAAU,GAAW,MAAM;AAEnC;;AAEG;IAC6B,MAAM,GAAW,EAAE;AAEnD;;AAEG;IACsB,MAAM,GAAY,KAAK;AAEhD;;AAEG;IACM,QAAQ,GAAkB,EAAE;AAErC;;AAEG;IACM,cAAc,GAAW,EAAE;AAEpC;;AAEG;AACM,IAAA,WAAW;AAEpB;;AAEG;AACM,IAAA,WAAW;AAEpB;;AAEG;AACK,IAAA,IAAI;AAEZ;;AAEG;IACK,MAAM,GAAY,IAAI;AAE9B;;AAEG;IACK,YAAY,GAAY,IAAI;AAEpC;;AAEG;IACK,WAAW,GAAY,IAAI;AAEnC;;AAEG;AACK,IAAA,KAAK;AAEb;;AAEG;AACsB,IAAA,cAAc;AAGvC;;AAEG;IACM,uBAAuB,GAAW,EAAE;AAE7C;;AAEG;IACM,SAAS,GAAY,KAAK;AAEnC;;AAEG;IACM,uBAAuB,GAAuB,IAAI;;IAGlD,gBAAgB,GAAY,IAAI;IACxB,gBAAgB,GAAG,EAAE;IAE7B,gBAAgB,GAAY,KAAK;;;AAMjC,IAAA,cAAc;IAOd,kBAAkB,GAAa,EAAE;IACjC,yBAAyB,GAAY,KAAK;AAC3C,IAAA,yBAAyB,GAAyB,EAAE,OAAO,EAAE,KAAK,EAAE;IAEnE,YAAY,GAAgB,IAAI;IAChC,WAAW,GAAY,KAAK;IAC5B,gBAAgB,GAAyB,EAAE;AAEpD;;AAEG;IACK,YAAY,GAAW,EAAE;AAEjC;;AAEG;IACK,UAAU,GAAY,KAAK;IAE3B,WAAW,GAAG,MAAK;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AACzB,KAAC;AAEO,IAAA,iBAAiB,GAAG,CAAC,KAAY,KAAI;AAC3C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK;AACnC,KAAC;IAEO,MAAM,qBAAqB,CAAC,SAAiB,EAAA;AACnD,QAAA,IAAI,CAAC,yBAAyB,CAAC,OAAO,GAAG,KAAK;AAC9C,QAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;AAErC,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;gBACrC,GAAG,EAAE,CAAmB,gBAAA,EAAA,SAAS,CAAY,UAAA,CAAA;AAC9C,aAAA,CAAC;AAEF,YAAA,IAAI,IAAI,CAAC,yBAAyB,CAAC,OAAO;gBAAE;YAE5C,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;gBACrC,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE;;;QAE/C,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;;gBACzB;AACR,YAAA,IAAI,CAAC,yBAAyB,GAAG,KAAK;;;IAIlC,4BAA4B,GAAG,MAAK;AAC1C,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;AAC5B,QAAA,IAAI,CAAC,yBAAyB,CAAC,OAAO,GAAG,IAAI;AAC/C,KAAC;AAEO,IAAA,gBAAgB,GAAG,OAAO,KAAY,KAAI;AAChD,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;AAGlC,YAAA,MAAM,IAAI,CAAC,UAAU,EAAE;;AAE3B,KAAC;AAEO,IAAA,MAAM,UAAU,GAAA;QACtB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AAExB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AAEvB,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,YAAY,EAAE;AAC1D,gBAAA,eAAe,EAAE,SAAS,GAAG,IAAI,CAAC;AACnC,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;;QAClC,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC;YAC/B,IAAI,CAAC,iBAAiB,EAAE;YACxB,KAAK,CAAC,YAAY,CAAC;;gBACX;AACR,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;;;IAIpB,iBAAiB,GAAG,MAAK;AAC/B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,aAAa,CAAqB;QAC/F,SAAS,EAAE,KAAK,EAAE;AACpB,KAAC;IAEO,iBAAiB,GAAG,MAAK;AAC/B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,aAAa,CAAqB;QAC/F,IAAI,SAAS,EAAE;AACb,YAAA,SAAS,CAAC,KAAK,GAAG,EAAE;;AAExB,KAAC;IAGO,MAAM,gBAAgB,CAAC,OAAe,EAAA;QAC5C,IAAI,CAAC,4BAA4B,EAAE;AACnC,QAAA,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACrB,IAAI,MAAM,GAAG,EAAE;AAEf,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,IAAI,GAAG,CAAG,EAAA,GAAG,CAAC,QAAQ,EAAE,CAAI,CAAA,EAAA,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;;QAGhF,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,GAAG,EAAE,CAAC;;AAGvF,QAAA,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAA,CAAE;YACxB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,IAAI;AACjB,YAAA,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,IAAI;SACZ;;AAGD,QAAA,IAAI,CAAC,uBAAuB,GAAG,UAAU;AAEzC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;;QAE5B,IAAI,CAAC,cAAc,EAAE;;AAGrB,QAAA,MAAM,WAAW,GAAQ;AACvB,YAAA,aAAa,EAAE,WAAW;YAC1B,eAAe,EAAE,IAAI,CAAC,cAAc;AACpC,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,IAAI,EAAE;SACP;;QAED,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAElF,WAAW,CAAC,MAAM,GAAG;gBACnB,GAAG,WAAW,CAAC,MAAM;AACrB,gBAAA,KAAK,EAAE;aACR;;AAGH,QAAA,MAAM,cAAc,CAAC;AACnB,YAAA,GAAG,EAAE,CAA4B,0BAAA,CAAA;AACjC,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,SAAS,EAAE,CAAC,IAAI,KAAI;AAClB,gBAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;gBAEhC,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAChD,oBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe;AAC1C,oBAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC;;AAGxD,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;AAI5B,oBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;AAC9D,wBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,4BAAA,MAAM,IAAI,IAAI,CAAC,MAAM;AACrB,4BAAA,MAAM,cAAc,GAAgB;gCAClC,GAAG,IAAI,CAAC,uBAAuB;gCAC/B,MAAM;AACN,gCAAA,WAAW,EAAE;6BACd;AACD,4BAAA,IAAI,CAAC,uBAAuB,GAAG,cAAc;4BAC7C,IAAI,CAAC,cAAc,EAAE;;;;AAI3B,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE;AAChC,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACvB,wBAAA,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,EAAE;wBAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;AACZ,qBAAA,CAAC;;aAEL;AACD,YAAA,OAAO,EAAE,CAAC,KAAK,KAAI;AACjB,gBAAA,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;gBAC7B,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;AACjC,wBAAA,GAAG,UAAU;AACb,wBAAA,MAAM,EAAE,iBAAiB;AACzB,wBAAA,KAAK,EAAE,KAAK;AACZ,wBAAA,WAAW,EAAE;AACd,qBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;AACnC,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;aACvB;YACD,UAAU,EAAE,MAAK;AACf,gBAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACnB,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,CAAC;;AAGhE,gBAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;oBAChC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC;;AAG1E,gBAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;;AAEtC,SAAA,CAAC;;;IAGI,YAAY,GAAG,MAAK;AAC1B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC;AAC/E,QAAA,IAAI,CAAC,WAAW;YAAE;QAElB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,WAAW;AAC7D,QAAA,MAAM,kBAAkB,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY;;QAGlE,IAAI,CAAC,gBAAgB,GAAG,kBAAkB,IAAI,IAAI,CAAC,gBAAgB;AACrE,KAAC;IAEO,cAAc,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE;AAC5B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC;AAC/E,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC;AACvC,QAAA,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE;;AAE9B,YAAA,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,YAAY;;;;IAKpD,kBAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;AACnE,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC;YAC/E,IAAI,WAAW,EAAE;AACf,gBAAA,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,YAAY;;;;AAK9C,IAAA,2BAA2B,CAAC,cAAsB,EAAA;QACxD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC5C,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC;;;IAIvC,iBAAiB,GAAG,MAAK;QAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS;YAAE;;QAG3F,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;;AAG1C,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC;;AAG1C,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;;QAGxB,IAAI,CAAC,iBAAiB,EAAE;;AAGxB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC;QACxE,YAAY,EAAE,KAAK,EAAE;AACvB,KAAC;AAEO,IAAA,aAAa,GAAG,CAAC,KAAoB,KAAI;QAC/C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC5C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,iBAAiB,EAAE;;AAE5B,KAAC;;AAGO,IAAA,MAAM,mBAAmB,GAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;AAE1B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAE5B,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;AACrC,gBAAA,GAAG,EAAE,CAAiB,eAAA,CAAA;AACtB,gBAAA,MAAM,EAAE;oBACN,eAAe,EAAE,IAAI,CAAC,cAAc;AACpC,oBAAA,IAAI,EAAE,YAAY;AAClB,oBAAA,KAAK,EAAE;AACR;AACF,aAAA,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACvC,gBAAA,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;;;AAI7B,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE;;AAGvC,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;AACnC,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;YAElB,MAAM,iBAAiB,GAAkB,WAAW,CAAC,GAAG,CAAC,GAAG,IAAG;gBAC7D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;gBAC5C,MAAM,OAAO,GAAG,CAAG,EAAA,IAAI,CAAC,QAAQ,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;gBAErF,OAAO;AACL,oBAAA,GAAG,GAAG;AACN,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,WAAW,EAAE,KAAK;AAClB,oBAAA,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,OAAO,GAAG,OAAO,GAAG;iBAC5C;AACH,aAAC,CAAC;AAEF,YAAA,IAAI,CAAC,QAAQ,GAAG,iBAAiB;;YAGjC,qBAAqB,CAAC,MAAK;AACzB,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;gBAC5B,IAAI,CAAC,cAAc,EAAE;AACvB,aAAC,CAAC;;QAEF,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;;gBACzB;AACR,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;;;;IAOjC,MAAM,kBAAkB,CAAC,QAAiB,EAAA;AACxC,QAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE;AACnC,YAAA,MAAM,IAAI,CAAC,mBAAmB,EAAE;;;AAKpC,IAAA,wBAAwB,CAAC,QAAgB,EAAA;AACvC,QAAA,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACpC,YAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;;;IAIlC,iBAAiB,GAAA;;AAEf,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY;;;IAI3C,MAAM,GAAA;QACJ,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AAE7B,QAAA,MAAM,UAAU,GAAG;AACjB,YAAA,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;SAC3B;AAED,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,IAAI,CAAC;SACpB;AAED,QAAA,MAAM,YAAY,GAAG;AACnB,YAAA,eAAe,EAAE,IAAI;YACrB,oBAAoB,EAAE,IAAI,CAAC;SAC5B;QAED,QACE,WAAK,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAA,EACzC,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,cAAc,EAAA,EACvB,IAAI,CAAC,YAAY,KAChB,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,cAAc,EAAA,EACvB,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,aAAa,EAAA,EACrB,IAAI,CAAC,IAAI,IAAI,CAAK,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAC,aAAa,EAAC,GAAG,EAAC,0BAAM,EAAG,CAAA,EACpE,CAAA,CAAA,IAAA,EAAA,IAAA,EAAK,IAAI,CAAC,UAAU,CAAM,CACtB,EACL,IAAI,CAAC,WAAW,KACf,CAAQ,CAAA,QAAA,EAAA,EAAA,KAAK,EAAC,cAAc,EAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAA,EACpD,CAAc,CAAA,MAAA,EAAA,IAAA,EAAA,QAAA,CAAA,CACP,CACV,CACG,CACP,EAED,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,cAAc,EAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAA,EAClD,IAAI,CAAC,gBAAgB,IACpB,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,mBAAmB,EAAA,EAC5B,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,iBAAiB,EAAO,CAAA,EACnC,CAAA,CAAA,GAAA,EAAA,IAAA,EAAA,+CAAA,CAAiB,CACb,KAEN,CAAA,CAAA,CAAA,CAAA,QAAA,EAAA,IAAA,EACG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,MACzB,CAAA,CAAA,KAAA,EAAA,EAAK,EAAE,EAAE,CAAW,QAAA,EAAA,OAAO,CAAC,EAAE,CAAE,CAAA,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAA,EAC/C,CACE,CAAA,kBAAA,EAAA,EAAA,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,CAAC,KAAK,KAAI;AACzB,gBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAC3C,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,CAC1D;AACD,gBAAA,IAAI,CAAC,QAAQ,GAAG,eAAe;AACjC,aAAC,EAAA,CACiB,CAChB,CACP,CAAC,EACD,IAAI,CAAC,uBAAuB,KAC3B,CAAK,CAAA,KAAA,EAAA,EAAA,EAAE,EAAE,CAAW,QAAA,EAAA,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAA,CAAE,EAAA,EACnD,CAAA,CAAA,kBAAA,EAAA,EACE,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAA,CACnB,CAChB,CACP,EACA,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,KAC1D,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,aAAa,EAAA,EACtB,CAAY,CAAA,GAAA,EAAA,IAAA,EAAA,gCAAA,CAAA,CACR,CACP,CACA,CACJ,EAEA,IAAI,CAAC,yBAAyB,IAC7B,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,qBAAqB,EAAA,EAC9B,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,uBAAuB,EAAA,CAAO,CACrC,KAEN,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,KAChC,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,qBAAqB,EAC7B,EAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,MAC3C,WACE,GAAG,EAAE,KAAK,EACV,KAAK,EAAC,oBAAoB,EAC1B,OAAO,EAAE,MAAK;AACZ,gBAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;gBAC9B,IAAI,CAAC,iBAAiB,EAAE;AAC1B,aAAC,EAAA,EAEA,QAAQ,EACT,CAAM,CAAA,MAAA,EAAA,EAAA,KAAK,EAAC,aAAa,EAAS,EAAA,QAAA,CAAA,CAC9B,CACP,CAAC,CACE,CACP,CACF,CACG,EAGL,IAAI,CAAC,YAAY,KAChB,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,cAAc,EAAA,EACvB,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,WAAW,EAAA,EACpB,CAAM,CAAA,MAAA,EAAA,EAAA,KAAK,EAAC,WAAW,EAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAA,EAClD,IAAI,CAAC,YAAY,CAAC,IAAI,EACtB,IAAI,CAAC,WAAW,IAAI,YAAM,KAAK,EAAC,qBAAqB,EAAiB,EAAA,0BAAA,CAAA,EACtE,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAC,gBAAgB,EAAA,EAAA,uBAAA,CAAc,CAC1E,EACP,CAAA,CAAA,QAAA,EAAA,EAAQ,KAAK,EAAC,aAAa,EAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAA,EAAA,QAAA,CAElD,CACL,CACF,CACP,EAED,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,eAAe,EAAA,EACxB,CAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAC,YAAY,EAClB,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAC/B,MAAM,EAAC,8BAA8B,EACrC,CAAA,EACF,CAAA,CAAA,QAAA,EAAA,EACE,KAAK,EAAC,eAAe,EACrB,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAC/B,KAAK,EAAC,0BAAM,EACZ,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAA,EAE1B,CAAK,CAAA,KAAA,EAAA,EAAA,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAA,EACxD,CACiB,CAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,OAAO,EACN,iBAAA,EAAA,OAAO,EACV,cAAA,EAAA,GAAG,EAChB,CAAC,EAAC,4BAA4B,EAC9B,CAAA,CACE,CACC,EAET,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,eAAe,EAAA,EACxB,CAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,mCAAU,EACtB,KAAK,EAAE,IAAI,CAAC,cAAc,EAC1B,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAC/B,SAAS,EAAE,IAAI,CAAC,aAAa,EAC7B,QAAQ,EAAE,IAAI,CAAC,SAAS,GACxB,CACE,EAEN,CACE,CAAA,QAAA,EAAA,EAAA,KAAK,EAAC,aAAa,EACnB,OAAO,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,EACvC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,EAAA,EAElH,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,IAAI,CAC1B,CACL,CACF,CACF;;;;;;;;;;;"}
@@ -8,7 +8,7 @@ export declare class ChatAPPModal {
8
8
  /**
9
9
  * API鉴权密钥
10
10
  */
11
- apiKey: string;
11
+ token: string;
12
12
  /**
13
13
  * 是否显示聊天模态框
14
14
  */
@@ -38,7 +38,7 @@ export declare class ChatAPPModal {
38
38
  */
39
39
  isNeedClose: boolean;
40
40
  /**
41
- * 会话ID
41
+ * 会话ID,传入继续对话,否则创建新会话
42
42
  */
43
43
  conversationId?: string;
44
44
  /**
@@ -127,7 +127,7 @@ export declare class ChatAPPModal {
127
127
  countdownWarningTime: number;
128
128
  showCountdownWarning: boolean;
129
129
  /**
130
- * 是否以全屏模式打开
130
+ * 是否以全屏模式打开,移动端建议设置为true
131
131
  */
132
132
  fullscreen: boolean;
133
133
  isUploadingVideo: boolean;
@@ -149,6 +149,12 @@ export declare class ChatAPPModal {
149
149
  status: 'started' | 'stopped' | 'paused' | 'resumed' | 'failed';
150
150
  details?: any;
151
151
  }>;
152
+ /**
153
+ * 是否启用语音播报功能
154
+ * true: 启用语音合成
155
+ * false: 禁用语音合成
156
+ */
157
+ enableTTS: boolean;
152
158
  /**
153
159
  * 是否自动播放语音问题
154
160
  */
@@ -159,10 +165,6 @@ export declare class ChatAPPModal {
159
165
  * 0: 不显示题干内容
160
166
  */
161
167
  displayContentStatus: string;
162
- /**
163
- * 用户ID
164
- */
165
- userId: string;
166
168
  /**
167
169
  * 面试模式
168
170
  * video: 视频面试模式
@@ -175,6 +177,10 @@ export declare class ChatAPPModal {
175
177
  * 自定义智能体inputs输入参数
176
178
  */
177
179
  customInputs: Record<string, any>;
180
+ /**
181
+ * 机器人ID
182
+ */
183
+ botId?: string;
178
184
  private handleClose;
179
185
  private sendMessageToAPI;
180
186
  private handleScroll;
@@ -190,7 +196,6 @@ export declare class ChatAPPModal {
190
196
  private stopRecording;
191
197
  private convertAudioToText;
192
198
  private uploadRecordedVideo;
193
- private saveVideoAnswer;
194
199
  /**
195
200
  * 发送面试完成请求
196
201
  */
@@ -14,6 +14,11 @@ export declare class ChatMessageComponent {
14
14
  private copyMessageContent;
15
15
  private renderUserMessage;
16
16
  private renderAssistantMessage;
17
+ private getFileIcon;
18
+ private getFileName;
19
+ private getCosPreviewUrl;
20
+ private handleFileClick;
21
+ private renderFileItem;
17
22
  private renderInputs;
18
23
  render(): any;
19
24
  }
@@ -1,10 +1,15 @@
1
1
  import { EventEmitter } from '../../stencil-public-runtime';
2
+ import { FileUploadResponse } from '../../utils/utils';
2
3
  import { ChatMessage } from '../../interfaces/chat';
3
4
  export declare class ChatModal {
4
5
  /**
5
6
  * 模态框标题
6
7
  */
7
8
  modalTitle: string;
9
+ /**
10
+ * API鉴权密钥
11
+ */
12
+ apiKey: string;
8
13
  /**
9
14
  * 是否显示聊天模态框
10
15
  */
@@ -46,7 +51,7 @@ export declare class ChatModal {
46
51
  */
47
52
  botId: string;
48
53
  /**
49
- * 会话ID
54
+ * 会话ID,传入继续对话,否则创建新会话
50
55
  */
51
56
  conversationId?: string;
52
57
  /**
@@ -76,18 +81,13 @@ export declare class ChatModal {
76
81
  private stopSuggestedQuestionsRef;
77
82
  selectedFile: File | null;
78
83
  isUploading: boolean;
79
- uploadedFileInfo: {
80
- cos_key: string;
81
- filename: string;
82
- ext: string;
83
- presigned_url: string;
84
- }[];
84
+ uploadedFileInfo: FileUploadResponse[];
85
85
  /**
86
86
  * 默认查询文本
87
87
  */
88
88
  defaultQuery: string;
89
89
  /**
90
- * 是否以全屏模式打开
90
+ * 是否以全屏模式打开,移动端建议设置为true
91
91
  */
92
92
  fullscreen: boolean;
93
93
  private handleClose;
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter } from '../../stencil-public-runtime';
2
+ import { FileUploadResponse } from '../../utils/utils';
2
3
  import { ChatMessage } from '../../interfaces/chat';
3
4
  export declare class ChatHRModal {
4
5
  /**
@@ -8,7 +9,7 @@ export declare class ChatHRModal {
8
9
  /**
9
10
  * API鉴权密钥
10
11
  */
11
- apiKey: string;
12
+ token: string;
12
13
  /**
13
14
  * 是否显示聊天模态框
14
15
  */
@@ -38,7 +39,7 @@ export declare class ChatHRModal {
38
39
  */
39
40
  isNeedClose: boolean;
40
41
  /**
41
- * 会话ID
42
+ * 会话ID,传入继续对话,否则创建新会话
42
43
  */
43
44
  conversationId?: string;
44
45
  /**
@@ -64,12 +65,7 @@ export declare class ChatHRModal {
64
65
  }>;
65
66
  selectedFile: File | null;
66
67
  isUploading: boolean;
67
- uploadedFileInfo: {
68
- cos_key: string;
69
- filename: string;
70
- ext: string;
71
- presigned_url: string;
72
- }[];
68
+ uploadedFileInfo: FileUploadResponse[];
73
69
  /**
74
70
  * 默认查询文本
75
71
  */
@@ -127,7 +123,7 @@ export declare class ChatHRModal {
127
123
  */
128
124
  toEmail: string;
129
125
  /**
130
- * 是否以全屏模式打开
126
+ * 是否以全屏模式打开,移动端建议设置为true
131
127
  */
132
128
  fullscreen: boolean;
133
129
  isUploadingVideo: boolean;
@@ -159,10 +155,8 @@ export declare class ChatHRModal {
159
155
  enableVoice: boolean;
160
156
  /**
161
157
  * 是否显示题干内容
162
- * 1: 显示题干内容
163
- * 0: 不显示题干内容
164
158
  */
165
- displayContentStatus: string;
159
+ displayContentStatus: boolean;
166
160
  /**
167
161
  * 用户ID
168
162
  */
@@ -0,0 +1,113 @@
1
+ import { EventEmitter } from '../../stencil-public-runtime';
2
+ import { FileUploadResponse } from '../../utils/utils';
3
+ export declare class JlpxModal {
4
+ /**
5
+ * 模态框标题
6
+ */
7
+ modalTitle: string;
8
+ /**
9
+ * API鉴权密钥
10
+ */
11
+ token: string;
12
+ /**
13
+ * 是否显示聊天模态框
14
+ */
15
+ isOpen: boolean;
16
+ /**
17
+ * 当点击模态框关闭时触发
18
+ */
19
+ modalClosed: EventEmitter<void>;
20
+ /**
21
+ * 应用图标URL
22
+ */
23
+ icon?: string;
24
+ /**
25
+ * 聊天框的页面层级
26
+ */
27
+ zIndex?: number;
28
+ /**
29
+ * 是否展示顶部标题栏
30
+ */
31
+ isShowHeader: boolean;
32
+ /**
33
+ * 是否展示右上角的关闭按钮
34
+ */
35
+ isNeedClose: boolean;
36
+ /**
37
+ * 会话ID,传入继续对话,否则创建新会话
38
+ */
39
+ conversationId?: string;
40
+ /**
41
+ * 默认查询文本
42
+ */
43
+ defaultQuery: string;
44
+ /**
45
+ * 是否以全屏模式打开,移动端建议设置为true
46
+ */
47
+ fullscreen: boolean;
48
+ /**
49
+ * 自定义输入参数,传入job_info时,会隐藏JD输入区域
50
+ */
51
+ customInputs: {
52
+ [key: string]: any;
53
+ };
54
+ /**
55
+ * 上传成功事件
56
+ */
57
+ uploadSuccess: EventEmitter<FileUploadResponse>;
58
+ /**
59
+ * 流式输出完成事件
60
+ */
61
+ streamComplete: EventEmitter<{
62
+ conversation_id: string;
63
+ event: string;
64
+ message_id: string;
65
+ id: string;
66
+ }>;
67
+ /**
68
+ * 新会话开始的回调,只会在一轮对话开始时触发一次
69
+ */
70
+ conversationStart: EventEmitter<{
71
+ conversation_id: string;
72
+ event: string;
73
+ message_id: string;
74
+ id: string;
75
+ }>;
76
+ /**
77
+ * 当聊天完成时触发
78
+ */
79
+ interviewComplete: EventEmitter<{
80
+ conversation_id: string;
81
+ total_questions: number;
82
+ }>;
83
+ /**
84
+ * API密钥验证失败事件
85
+ */
86
+ apiKeyInvalid: EventEmitter<void>;
87
+ selectedFile: File | null;
88
+ isUploading: boolean;
89
+ uploadedFileInfo: FileUploadResponse | null;
90
+ showChatModal: boolean;
91
+ jobDescription: string;
92
+ isSubmitting: boolean;
93
+ isTransitioning: boolean;
94
+ transitionTimer: any;
95
+ hostElement: HTMLElement;
96
+ private handleClose;
97
+ private handleFileChange;
98
+ private handleUploadClick;
99
+ private clearSelectedFile;
100
+ private handleJobDescriptionChange;
101
+ private uploadFile;
102
+ private handleStartAnalysis;
103
+ handleIsOpenChange(newValue: boolean): void;
104
+ /**
105
+ * 验证API密钥
106
+ */
107
+ private verifyApiKey;
108
+ componentWillLoad(): void;
109
+ private handleStreamComplete;
110
+ private handleConversationStart;
111
+ private handleInterviewComplete;
112
+ render(): any;
113
+ }
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter } from '../../stencil-public-runtime';
2
+ import { FileUploadResponse } from '../../utils/utils';
2
3
  export declare class MnmsModal {
3
4
  /**
4
5
  * 模态框标题
@@ -7,7 +8,7 @@ export declare class MnmsModal {
7
8
  /**
8
9
  * API鉴权密钥
9
10
  */
10
- apiKey: string;
11
+ token: string;
11
12
  /**
12
13
  * 是否显示聊天模态框
13
14
  */
@@ -33,7 +34,7 @@ export declare class MnmsModal {
33
34
  */
34
35
  isNeedClose: boolean;
35
36
  /**
36
- * 会话ID
37
+ * 会话ID,传入继续对话,否则创建新会话
37
38
  */
38
39
  conversationId?: string;
39
40
  /**
@@ -41,15 +42,11 @@ export declare class MnmsModal {
41
42
  */
42
43
  defaultQuery: string;
43
44
  /**
44
- * 是否以全屏模式打开
45
+ * 是否以全屏模式打开,移动端建议设置为true
45
46
  */
46
47
  fullscreen: boolean;
47
48
  /**
48
- * 是否为移动端布局
49
- */
50
- isMobile: boolean;
51
- /**
52
- * 自定义输入参数
49
+ * 自定义输入参数,传入job_info时,会隐藏JD输入区域
53
50
  */
54
51
  customInputs: {
55
52
  [key: string]: any;
@@ -57,12 +54,7 @@ export declare class MnmsModal {
57
54
  /**
58
55
  * 上传成功事件
59
56
  */
60
- uploadSuccess: EventEmitter<{
61
- cos_key: string;
62
- filename: string;
63
- ext: string;
64
- presigned_url: string;
65
- }>;
57
+ uploadSuccess: EventEmitter<FileUploadResponse>;
66
58
  /**
67
59
  * 流式输出完成事件
68
60
  */
@@ -88,27 +80,34 @@ export declare class MnmsModal {
88
80
  conversation_id: string;
89
81
  total_questions: number;
90
82
  }>;
83
+ /**
84
+ * API密钥验证失败事件
85
+ */
86
+ apiKeyInvalid: EventEmitter<void>;
91
87
  selectedFile: File | null;
92
88
  isUploading: boolean;
93
- uploadedFileInfo: {
94
- cos_key: string;
95
- filename: string;
96
- ext: string;
97
- presigned_url: string;
98
- } | null;
89
+ uploadedFileInfo: FileUploadResponse | null;
99
90
  showChatModal: boolean;
100
91
  isTransitioning: boolean;
101
92
  transitionTimer: any;
102
93
  hostElement: HTMLElement;
94
+ jobDescription: string;
95
+ isSubmitting: boolean;
103
96
  private handleClose;
104
97
  private handleFileChange;
105
98
  private handleUploadClick;
106
99
  private clearSelectedFile;
107
100
  private uploadFile;
101
+ private handleJobDescriptionChange;
108
102
  private handleStartInterview;
109
103
  handleIsOpenChange(newValue: boolean): void;
104
+ componentWillLoad(): void;
110
105
  private handleStreamComplete;
111
106
  private handleConversationStart;
112
107
  private handleInterviewComplete;
108
+ /**
109
+ * 验证API密钥
110
+ */
111
+ private verifyApiKey;
113
112
  render(): any;
114
113
  }
@@ -8,7 +8,7 @@ export declare class VideoChatModal {
8
8
  /**
9
9
  * API鉴权密钥
10
10
  */
11
- apiKey: string;
11
+ token: string;
12
12
  /**
13
13
  * 是否显示聊天模态框
14
14
  */
@@ -38,7 +38,7 @@ export declare class VideoChatModal {
38
38
  */
39
39
  isNeedClose: boolean;
40
40
  /**
41
- * 会话ID
41
+ * 会话ID,传入继续对话,否则创建新会话
42
42
  */
43
43
  conversationId?: string;
44
44
  /**
@@ -63,7 +63,7 @@ export declare class VideoChatModal {
63
63
  id: string;
64
64
  }>;
65
65
  /**
66
- * 默认查询文本
66
+ * 首次对话提问文本
67
67
  */
68
68
  defaultQuery: string;
69
69
  showInitialUpload: boolean;
@@ -111,7 +111,7 @@ export declare class VideoChatModal {
111
111
  countdownWarningTime: number;
112
112
  showCountdownWarning: boolean;
113
113
  /**
114
- * 是否以全屏模式打开
114
+ * 是否以全屏模式打开,移动端建议设置为true
115
115
  */
116
116
  fullscreen: boolean;
117
117
  isUploadingVideo: boolean;