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
@@ -0,0 +1,2 @@
1
+ import{r as e,c as t,g as s,h as i}from"./p-DaMwkrv5.js";import{s as n,u as o,a}from"./p-nVjZGfA8.js";const r=":host{display:block}.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0, 0, 0, 0.5);display:flex;justify-content:center;align-items:center;overflow-y:auto;padding:20px;z-index:1000}.fullscreen-overlay{padding:0}.modal-container{background:white;border-radius:8px;width:100%;max-width:800px;height:80vh;min-height:600px;display:flex;flex-direction:column;position:relative;margin:auto}.modal-container.fullscreen{width:100vw;max-width:none;height:100vh;min-height:100vh;border-radius:0;margin:0}@media screen and (max-width: 768px){.modal-overlay{padding:0}.modal-container{width:95%;height:70vh;min-height:400px}.chat-history{min-height:200px;max-height:50vh}.modal-container.fullscreen{height:-webkit-fill-available;max-height:-webkit-fill-available;padding:env(safe-area-inset-top) 0 env(safe-area-inset-bottom)}.modal-container.fullscreen .chat-history{max-height:unset}.modal-container.fullscreen .modal-header{padding:0px 16px;padding-top:max(30px, env(safe-area-inset-top))}}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:4px 16px;height:50px;border-bottom:1px solid #e8e8e8}.header-left{display:flex;align-items:center;gap:8px}.header-icon{width:24px;height:24px}.close-button{background:transparent;border:none;cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:4px}.close-button:hover{background-color:rgba(0, 0, 0, 0.04)}.close-button span{font-size:24px;line-height:1;color:#999}.close-button:hover span{color:#666}.chat-history{position:relative;flex:1;overflow-y:auto;padding:16px;scroll-behavior:smooth;min-height:400px;}@media screen and (max-width: 480px){.chat-history{min-height:200px;max-height:50vh}}.message-input{padding:16px;border-top:1px solid #eee;display:flex;gap:8px;align-items:center}.message-input input{flex:1;padding:8px 12px;border:1px solid #ddd;border-radius:4px;outline:none;transition:border-color 0.2s ease}.message-input input:focus{border-color:#bbb}.message{margin-bottom:16px;opacity:1;transition:opacity 0.3s ease}.message-content{max-width:70%;padding:8px 12px;border-radius:8px;word-break:break-word}.message-content p{margin:0;word-break:break-word}.user-message{display:flex;justify-content:flex-end}.agent-message{display:flex;justify-content:flex-start}.user-message .message-content{background-color:#007bff;color:white}.agent-message .message-content{background-color:#f1f1f1}.message-time{font-size:12px;color:#999;margin-top:4px;display:block}.send-button{background-color:#1890ff;color:white;border:none;border-radius:4px;padding:8px 16px;cursor:pointer;font-weight:500}.send-button:disabled{background-color:#ccc;cursor:not-allowed}.empty-state{display:flex;justify-content:center;align-items:center;height:100%;color:#999;text-align:center}.loading-container{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:rgba(255, 255, 255, 0.98);z-index:1;opacity:1;transition:opacity 0.3s ease}.loading-container p{margin-top:16px;color:#666;font-size:14px}.loading-spinner{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid #1890ff;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.messages-wrapper{width:100%;min-height:100%;display:flex;flex-direction:column;justify-content:flex-end}.messages-wrapper.has-overflow{justify-content:flex-start}.suggested-questions{display:flex;flex-direction:column;gap:8px;padding:16px}.suggested-question{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background-color:#f3f4f6;border-radius:4px;cursor:pointer;font-size:14px;color:#374151;transition:background-color 0.2s}.suggested-question:hover{background-color:#e5e7eb}.arrow-right{margin-left:8px}.loading-suggestions{display:flex;justify-content:center;padding:16px}.loading-spinner-small{width:20px;height:20px;border:2px solid #e5e7eb;border-top-color:#6b7280;border-radius:50%;animation:spin 1s linear infinite}.upload-button{background:transparent;border:none;cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;color:#666;border-radius:4px;transition:background-color 0.2s}.upload-button:hover{background-color:rgba(0, 0, 0, 0.04)}.upload-button svg{width:20px;height:20px}.file-input{display:none}.selected-file{font-size:12px;color:#666;margin-left:8px;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.input-wrapper{flex:1;display:flex;align-items:center;border:1px solid #ddd;border-radius:4px;padding:0 4px;background:white}.input-wrapper input{border:none;flex:1;padding:8px;outline:none}.input-wrapper:focus-within{border-color:#bbb}.file-preview{padding:8px 16px;border-top:1px solid #eee;background-color:#f9f9f9}.file-info{display:flex;align-items:center;justify-content:space-between;padding:8px;background:white;border:1px solid #e8e8e8;border-radius:4px}.file-name{font-size:13px;color:#333;margin-right:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:calc(100% - 30px)}.remove-file{background:transparent;border:none;color:#999;cursor:pointer;padding:4px 8px;font-size:16px;line-height:1;border-radius:4px;transition:all 0.2s}.remove-file:hover{background-color:#f0f0f0;color:#666}";const l=class{constructor(s){e(this,s);this.messageSent=t(this,"messageSent");this.modalClosed=t(this,"modalClosed");this.streamComplete=t(this,"streamComplete")}modalTitle="在线客服";apiKey="";isOpen=false;messages=[];currentMessage="";messageSent;modalClosed;icon;zIndex=1e3;isShowHeader=true;isNeedClose=true;botId;conversationId;currentAssistantMessage="";isLoading=false;currentStreamingMessage=null;shouldAutoScroll=true;SCROLL_THRESHOLD=30;isLoadingHistory=false;get hostElement(){return s(this)}streamComplete;suggestedQuestions=[];suggestedQuestionsLoading=false;stopSuggestedQuestionsRef={current:false};selectedFile=null;isUploading=false;uploadedFileInfo=[];defaultQuery="";fullscreen=false;handleClose=()=>{this.modalClosed.emit()};handleInputChange=e=>{const t=e.target;this.currentMessage=t.value};async getSuggestedQuestions(e){this.stopSuggestedQuestionsRef.current=false;this.suggestedQuestionsLoading=true;try{const t=await n({url:`/share/messages/${e}/suggested`});if(this.stopSuggestedQuestionsRef.current)return;if(t.success&&t.data){this.suggestedQuestions=t.data||[]}}catch(e){console.error("获取问题建议失败:",e)}finally{this.suggestedQuestionsLoading=false}}handleStopSuggestedQuestions=()=>{this.suggestedQuestions=[];this.stopSuggestedQuestionsRef.current=true};handleFileChange=async e=>{const t=e.target;if(t.files&&t.files.length>0){this.selectedFile=t.files[0];await this.uploadFile()}};async uploadFile(){if(!this.selectedFile)return;this.isUploading=true;try{const e=await o(this.selectedFile,{authorization:"Bearer "+this.apiKey});this.uploadedFileInfo.push(e)}catch(e){console.error("文件上传错误:",e);this.clearSelectedFile();alert("文件上传失败,请重试")}finally{this.isUploading=false}}handleUploadClick=()=>{const e=this.hostElement.shadowRoot?.querySelector(".file-input");e?.click()};clearSelectedFile=()=>{this.selectedFile=null;this.uploadedFileInfo=[];const e=this.hostElement.shadowRoot?.querySelector(".file-input");if(e){e.value=""}};async sendMessageToAPI(e){this.handleStopSuggestedQuestions();console.log("开始发送消息:",e);this.isLoading=true;let t="";const s=new Date;const i=`${s.getHours()}:${s.getMinutes().toString().padStart(2,"0")}`;const n=e.trim()||(this.uploadedFileInfo.length>0?"请分析这个文件":"");const o={id:`temp-${Date.now()}`,time:i,query:n,answer:"",isStreaming:true,conversation_id:this.conversationId,inputs:{},status:"normal",error:null};this.currentStreamingMessage=o;this.shouldAutoScroll=true;this.scrollToBottom();const r={response_mode:"streaming",conversation_id:this.conversationId,query:n,user:"1234567890"};if(this.uploadedFileInfo.length>0){const e=this.uploadedFileInfo.map((e=>e.cos_key)).join(",");r.inputs={...r.inputs,input:e}}await a({url:`/sdk/v1/chat/chat-messages`,method:"POST",data:r,onMessage:e=>{console.log("收到Stream数据:",e);if(e.conversation_id&&!this.conversationId){this.conversationId=e.conversation_id;this.updateUrlWithConversationId(e.conversation_id)}if(e.event==="message"){if(e.event==="agent_message"||e.event==="message"){if(e.answer){t+=e.answer;const s={...this.currentStreamingMessage,answer:t,isStreaming:true};this.currentStreamingMessage=s;this.scrollToBottom()}}}if(e.event==="message_end"){this.streamComplete.emit({conversation_id:e.conversation_id||"",event:e.event,message_id:e.message_id,id:e.id})}},onError:e=>{console.error("发生错误:",e);this.messages=[...this.messages,{...o,answer:"抱歉,发生了错误,请稍后再试。",error:e,isStreaming:false}];this.currentStreamingMessage=null;this.isLoading=false},onComplete:()=>{console.log("请求完成");this.isLoading=false;this.messages=[...this.messages,this.currentStreamingMessage];if(this.currentStreamingMessage){this.getSuggestedQuestions(this.currentStreamingMessage.conversation_id)}this.currentStreamingMessage=null}})}handleScroll=()=>{const e=this.hostElement.shadowRoot?.querySelector(".chat-history");if(!e)return;const{scrollTop:t,scrollHeight:s,clientHeight:i}=e;const n=s-t-i;this.shouldAutoScroll=n<=this.SCROLL_THRESHOLD};scrollToBottom(){if(!this.shouldAutoScroll)return;const e=this.hostElement.shadowRoot?.querySelector(".chat-history");console.log("chatHistory",e);if(e&&this.isOpen){e.scrollTop=e.scrollHeight}}componentDidRender(){if(this.isLoadingHistory||this.shouldAutoScroll&&this.isOpen){const e=this.hostElement.shadowRoot?.querySelector(".chat-history");if(e){e.scrollTop=e.scrollHeight}}}updateUrlWithConversationId(e){const t=new URLSearchParams(window.location.search);if(!t.get("conversation_id")){const t=new URL(window.location.href);t.searchParams.set("conversation_id",e);window.history.replaceState({},"",t)}}handleSendMessage=()=>{if(!this.currentMessage.trim()&&this.uploadedFileInfo.length===0||this.isLoading)return;this.messageSent.emit(this.currentMessage);this.sendMessageToAPI(this.currentMessage);this.currentMessage="";this.clearSelectedFile();const e=this.hostElement.shadowRoot?.querySelector("input");e?.focus()};handleKeyDown=e=>{if(e.key==="Enter"&&!e.shiftKey){e.preventDefault();this.handleSendMessage()}};async loadHistoryMessages(){if(!this.conversationId)return;this.isLoadingHistory=true;try{const e=await n({url:`/share/messages`,params:{conversation_id:this.conversationId,user:"1234567890",limit:20}});if(!e.success||!e.data){throw new Error("加载历史消息失败")}const t=e.data||[];this.currentStreamingMessage=null;this.messages=[];const s=t.map((e=>{const t=new Date(e.created_at*1e3);const s=`${t.getHours()}:${t.getMinutes().toString().padStart(2,"0")}`;return{...e,time:s,isStreaming:false,status:e.status==="error"?"error":"normal"}}));this.messages=s;requestAnimationFrame((()=>{this.shouldAutoScroll=true;this.scrollToBottom()}))}catch(e){console.error("加载历史消息失败:",e)}finally{this.isLoadingHistory=false}}async handleIsOpenChange(e){if(e&&this.conversationId){await this.loadHistoryMessages()}}handleDefaultQueryChange(e){if(e&&!this.currentMessage){this.currentMessage=e}}componentWillLoad(){if(this.defaultQuery){this.currentMessage=this.defaultQuery}}render(){if(!this.isOpen)return null;const e={zIndex:String(this.zIndex)};const t={"modal-container":true,fullscreen:this.fullscreen};const s={"modal-overlay":true,"fullscreen-overlay":this.fullscreen};return i("div",{class:s,style:e},i("div",{class:t},this.isShowHeader&&i("div",{class:"modal-header"},i("div",{class:"header-left"},this.icon&&i("img",{src:this.icon,class:"header-icon",alt:"应用图标"}),i("h3",null,this.modalTitle)),this.isNeedClose&&i("button",{class:"close-button",onClick:this.handleClose},i("span",null,"×"))),i("div",{class:"chat-history",onScroll:this.handleScroll},this.isLoadingHistory?i("div",{class:"loading-container"},i("div",{class:"loading-spinner"}),i("p",null,"加载历史消息中...")):i(i.Fragment,null,this.messages.map((e=>i("div",{id:`message_${e.id}`,key:e.id},i("pcm-chat-message",{message:e,onMessageChange:t=>{const s=this.messages.map((s=>s.id===e.id?{...s,...t.detail}:s));this.messages=s}})))),this.currentStreamingMessage&&i("div",{id:`message_${this.currentStreamingMessage.id}`},i("pcm-chat-message",{message:this.currentStreamingMessage})),this.messages.length===0&&!this.currentStreamingMessage&&i("div",{class:"empty-state"},i("p",null,"请输入消息"))),this.suggestedQuestionsLoading?i("div",{class:"loading-suggestions"},i("div",{class:"loading-spinner-small"})):this.suggestedQuestions.length>0&&i("div",{class:"suggested-questions"},this.suggestedQuestions.map(((e,t)=>i("div",{key:t,class:"suggested-question",onClick:()=>{this.currentMessage=e;this.handleSendMessage()}},e,i("span",{class:"arrow-right"},"→")))))),this.selectedFile&&i("div",{class:"file-preview"},i("div",{class:"file-info"},i("span",{class:"file-name",title:this.selectedFile.name},this.selectedFile.name,this.isUploading&&i("span",{class:"uploading-indicator"}," (上传中...)"),this.uploadedFileInfo.length>0&&i("span",{class:"upload-success"}," (已上传)")),i("button",{class:"remove-file",onClick:this.clearSelectedFile},"×"))),i("div",{class:"message-input"},i("input",{type:"file",class:"file-input",onChange:this.handleFileChange,accept:"image/*,.pdf,.doc,.docx,.txt"}),i("button",{class:"upload-button",onClick:this.handleUploadClick,title:"上传文件",disabled:this.isUploading},i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor"},i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m0-16l-4 4m4-4l4 4"}))),i("div",{class:"input-wrapper"},i("input",{type:"text",placeholder:"请输入消息...",value:this.currentMessage,onInput:this.handleInputChange,onKeyDown:this.handleKeyDown,disabled:this.isLoading})),i("button",{class:"send-button",onClick:()=>this.handleSendMessage(),disabled:!this.currentMessage.trim()&&this.uploadedFileInfo.length===0||this.isLoading||this.isUploading},this.isLoading?"发送中...":"发送"))))}static get watchers(){return{isOpen:["handleIsOpenChange"],defaultQuery:["handleDefaultQueryChange"]}}};l.style=r;export{l as pcm_chat_modal};
2
+ //# sourceMappingURL=p-f3ca99b4.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["pcmChatModalCss","ChatModal","modalTitle","apiKey","isOpen","messages","currentMessage","messageSent","modalClosed","icon","zIndex","isShowHeader","isNeedClose","botId","conversationId","currentAssistantMessage","isLoading","currentStreamingMessage","shouldAutoScroll","SCROLL_THRESHOLD","isLoadingHistory","streamComplete","suggestedQuestions","suggestedQuestionsLoading","stopSuggestedQuestionsRef","current","selectedFile","isUploading","uploadedFileInfo","defaultQuery","fullscreen","handleClose","this","emit","handleInputChange","event","input","target","value","getSuggestedQuestions","messageId","response","sendHttpRequest","url","success","data","error","console","handleStopSuggestedQuestions","handleFileChange","async","files","length","uploadFile","result","uploadFileToBackend","authorization","push","clearSelectedFile","alert","handleUploadClick","fileInput","hostElement","shadowRoot","querySelector","click","sendMessageToAPI","message","log","answer","now","Date","time","getHours","getMinutes","toString","padStart","queryText","trim","newMessage","id","query","isStreaming","conversation_id","inputs","status","scrollToBottom","requestData","response_mode","user","fileUrls","map","fileInfo","cos_key","join","sendSSERequest","method","onMessage","updateUrlWithConversationId","updatedMessage","message_id","onError","onComplete","handleScroll","chatHistory","scrollTop","scrollHeight","clientHeight","distanceFromBottom","componentDidRender","urlParams","URLSearchParams","window","location","search","get","newUrl","URL","href","searchParams","set","history","replaceState","handleSendMessage","inputElement","focus","handleKeyDown","key","shiftKey","preventDefault","loadHistoryMessages","params","limit","Error","historyData","formattedMessages","msg","created_at","timeStr","requestAnimationFrame","handleIsOpenChange","newValue","handleDefaultQueryChange","componentWillLoad","render","modalStyle","String","containerClass","overlayClass","h","class","style","src","alt","onClick","onScroll","Fragment","onMessageChange","updatedMessages","detail","question","index","title","name","type","onChange","accept","disabled","viewBox","fill","stroke","d","placeholder","onInput","onKeyDown"],"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} "],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ const e="https://pcm_api.ylzhaopin.com";function t(e,t,s){return(e||"")+(t?` ${t}`:"")+(s?` ${s}`:"")}const s=async t=>{const{url:s,method:o,headers:n={},data:a,onMessage:r,onError:c,onComplete:i}=t;try{const t=`${e}${s}`;const c=await fetch(t,{method:o,headers:{Accept:"text/event-stream","Content-Type":"application/json",...n},body:a?JSON.stringify(a):undefined});if(!c.ok){throw new Error(`HTTP error! status: ${c.status}`)}const f=c.body?.getReader();if(!f)throw new Error("No reader available");const l=new TextDecoder;let u="";while(true){const{value:e,done:t}=await f.read();if(t)break;u+=l.decode(e,{stream:true});const s=u.split("\n");u=s.pop()||"";for(const e of s){if(e.startsWith("data:")){try{const t=e.substring(5).trim();if(!t)continue;const s=JSON.parse(t);r?.(s)}catch(t){console.error("解析 SSE 数据错误:",t,"原始数据:",e)}}}}i?.()}catch(e){console.error("SSE 请求错误:",e);c?.(e)}};const o=async t=>{const{url:s,method:o="GET",headers:n={},params:a={},data:r,formData:c,onMessage:i}=t;try{const t=new URLSearchParams;Object.entries(a).forEach((([e,s])=>{if(s!==undefined&&s!==null){t.append(e,String(s))}}));let f=`${e}${s}${t.toString()?`?${t.toString()}`:""}`;const l={method:o,headers:c?{...n}:{"Content-Type":"application/json",...n}};if(c){l.body=c}else if(o!=="GET"&&o!=="HEAD"&&r){l.body=JSON.stringify(r)}if(o==="GET"&&r){const e=new URLSearchParams;Object.entries(r).forEach((([t,s])=>{if(s!==undefined&&s!==null){e.append(t,String(s))}}));f+=(t.toString()?"&":"?")+e.toString()}const u=await fetch(f,l);const d=await u.json();if(i){i(d)}if(!u.ok){console.error(`HTTP错误: ${u.status} ${u.statusText}`);return{success:false,message:d.message||`HTTP错误: ${u.status}`,error:d}}if(d.code!==0){console.error(`API错误: ${d.message}`);return{success:false,message:d.message,error:d}}return{success:true,data:d.data}}catch(e){console.error("HTTP请求错误:",e);if(t.onError){t.onError(e)}return{success:false,error:e,message:e instanceof Error?e.message:"未知错误"}}finally{if(t.onComplete){t.onComplete()}}};const n=async(e,t)=>{const s=new FormData;s.append("file",e);try{const e=await o({url:"/sdk/v1/files/upload",method:"POST",headers:{...t},formData:s});if(!e.success||!e.data){throw new Error(e.message||"文件上传失败")}return e.data}catch(e){console.error("文件上传错误:",e);throw e}};export{e as A,s as a,t as f,o as s,n as u};
2
+ //# sourceMappingURL=p-nVjZGfA8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"p-nVjZGfA8.js","sources":["src/utils/utils.ts"],"sourcesContent":["/**\r\n * API域名配置\r\n */\r\n// export const API_DOMAIN = 'http://192.168.17.194:8000';\r\nexport const API_DOMAIN = 'https://pcm_api.ylzhaopin.com';\r\n\r\n\r\nexport function format(first?: string, middle?: string, last?: string): string {\r\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\r\n}\r\n\r\n// 添加类型定义\r\nexport interface UserInputMessageType {\r\n message: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface WorkFlowNode {\r\n message_id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n event?: string;\r\n answer?: string;\r\n data?: {\r\n outputs?: {\r\n answer?: string;\r\n };\r\n status?: string;\r\n error?: any;\r\n };\r\n}\r\n\r\nexport interface MessageRound extends UserInputMessageType {\r\n id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n answer?: string;\r\n status?: string;\r\n error?: any;\r\n}\r\n\r\n/**\r\n * 将工作流节点转换为消息轮次\r\n * @param message_event 消息事件类型\r\n * @param inputMessage 用户输入消息\r\n * @param streamNode 工作流节点\r\n * @returns 消息轮次\r\n */\r\nexport const convertWorkflowStreamNodeToMessageRound = (\r\n message_event: string,\r\n inputMessage: UserInputMessageType,\r\n streamNode: WorkFlowNode,\r\n): MessageRound => {\r\n const messageRound: MessageRound = {\r\n ...inputMessage,\r\n };\r\n if (message_event === 'workflow_finished') messageRound.answer = streamNode.data?.outputs?.answer;\r\n if (message_event === 'agent_message' || message_event === 'message') messageRound.answer = streamNode?.answer;\r\n messageRound.id = streamNode.message_id;\r\n messageRound.conversation_id = streamNode.conversation_id;\r\n messageRound.created_at = streamNode.created_at;\r\n messageRound.status = streamNode.data?.status;\r\n messageRound.error = streamNode.data?.error;\r\n return messageRound;\r\n};\r\n\r\n/**\r\n * SSE 流式请求配置接口\r\n */\r\nexport interface SSERequestConfig {\r\n url: string;\r\n method: string;\r\n headers?: Record<string, string>;\r\n data?: any;\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 发送 SSE 流式请求\r\n * @param config 请求配置\r\n * @returns Promise<void>\r\n */\r\nexport const sendSSERequest = async (config: SSERequestConfig): Promise<void> => {\r\n const { url, method, headers = {}, data, onMessage, onError, onComplete } = config;\r\n \r\n try {\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n const requestUrl = `${API_DOMAIN}${url}`;\r\n \r\n const response = await fetch(requestUrl, {\r\n method,\r\n headers: {\r\n 'Accept': 'text/event-stream',\r\n 'Content-Type': 'application/json',\r\n ...headers\r\n },\r\n body: data ? JSON.stringify(data) : undefined\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n if (!reader) throw new Error('No reader available');\r\n \r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n // 处理缓冲区中的完整消息\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || ''; // 保留最后一个不完整的行\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data:')) {\r\n try {\r\n const jsonStr = line.substring(5).trim();\r\n if (!jsonStr) continue;\r\n \r\n const data = JSON.parse(jsonStr);\r\n onMessage?.(data);\r\n } catch (e) {\r\n console.error('解析 SSE 数据错误:', e, '原始数据:', line);\r\n }\r\n }\r\n }\r\n }\r\n \r\n onComplete?.();\r\n } catch (error) {\r\n console.error('SSE 请求错误:', error);\r\n onError?.(error);\r\n }\r\n};\r\n\r\n/**\r\n * HTTP请求配置接口\r\n */\r\nexport interface HttpRequestConfig {\r\n url: string;\r\n method?: string;\r\n headers?: Record<string, string>;\r\n params?: Record<string, any>;\r\n data?: any;\r\n formData?: FormData; // 添加FormData支持\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 统一的API响应接口\r\n */\r\nexport interface ApiResponse<T = any> {\r\n code: number;\r\n message: string;\r\n data?: T;\r\n}\r\n\r\n/**\r\n * HTTP响应接口\r\n */\r\nexport interface HttpResponse<T = any> {\r\n success: boolean;\r\n data?: T;\r\n error?: any;\r\n message?: string;\r\n}\r\n\r\n/**\r\n * 发送HTTP请求\r\n * @param config 请求配置\r\n * @returns Promise<HttpResponse>\r\n */\r\nexport const sendHttpRequest = async <T = any>(config: HttpRequestConfig): Promise<HttpResponse<T>> => {\r\n const { url, method = 'GET', headers = {}, params = {}, data, formData, onMessage } = config;\r\n \r\n try {\r\n // 构建URL和查询参数\r\n const queryParams = new URLSearchParams();\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n queryParams.append(key, String(value));\r\n }\r\n });\r\n \r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n let requestUrl = `${API_DOMAIN}${url}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;\r\n \r\n // 创建请求配置对象\r\n const requestConfig: RequestInit = {\r\n method,\r\n headers: formData ? { ...headers } : {\r\n 'Content-Type': 'application/json',\r\n ...headers\r\n }\r\n };\r\n\r\n // 处理请求体\r\n if (formData) {\r\n // 如果提供了FormData,直接使用\r\n requestConfig.body = formData;\r\n } else if (method !== 'GET' && method !== 'HEAD' && data) {\r\n // 否则,如果是非GET/HEAD请求且有data,将其JSON序列化\r\n requestConfig.body = JSON.stringify(data);\r\n }\r\n\r\n // 如果是 GET 方法且有 data,将其作为查询参数添加到 URL\r\n if (method === 'GET' && data) {\r\n const dataParams = new URLSearchParams();\r\n Object.entries(data).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n dataParams.append(key, String(value));\r\n }\r\n });\r\n requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();\r\n }\r\n\r\n const response = await fetch(requestUrl, requestConfig);\r\n const responseData: ApiResponse<T> = await response.json();\r\n \r\n // 调用 onMessage 回调\r\n if (onMessage) {\r\n onMessage(responseData);\r\n }\r\n \r\n // 检查响应状态\r\n if (!response.ok) {\r\n console.error(`HTTP错误: ${response.status} ${response.statusText}`);\r\n return {\r\n success: false,\r\n message: responseData.message || `HTTP错误: ${response.status}`,\r\n error: responseData\r\n };\r\n }\r\n \r\n // 检查业务状态码\r\n if (responseData.code !== 0) {\r\n console.error(`API错误: ${responseData.message}`);\r\n return {\r\n success: false,\r\n message: responseData.message,\r\n error: responseData\r\n };\r\n }\r\n \r\n // 直接返回data\r\n return {\r\n success: true,\r\n data: responseData.data\r\n };\r\n } catch (error) {\r\n console.error('HTTP请求错误:', error);\r\n if (config.onError) {\r\n config.onError(error);\r\n }\r\n return {\r\n success: false,\r\n error,\r\n message: error instanceof Error ? error.message : '未知错误'\r\n };\r\n } finally {\r\n if (config.onComplete) {\r\n config.onComplete();\r\n }\r\n }\r\n};\r\n\r\n\r\n\r\n/**\r\n * 文件上传响应数据接口\r\n */\r\nexport interface FileUploadResponse {\r\n /** 文件在对象存储中的唯一标识符 */\r\n cos_key: string;\r\n /** 文件名称 */\r\n file_name: string;\r\n /** 文件大小(带单位的字符串,如 \"1.5MB\") */\r\n file_size: string;\r\n /** 文件的预签名URL */\r\n presigned_url: string;\r\n /** 文件扩展名 */\r\n ext: string;\r\n}\r\n\r\n/**\r\n * 通过后端API上传文件\r\n * @param file 要上传的文件\r\n * @param headers 可选的请求头\r\n * @returns Promise 包含上传结果\r\n */\r\nexport const uploadFileToBackend = async (\r\n file: File,\r\n headers?: Record<string, string>\r\n): Promise<FileUploadResponse> => {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n \r\n try {\r\n const response = await sendHttpRequest<{cos_key: string, file_name: string, file_size: string,presigned_url: string, ext: string}>({\r\n url: '/sdk/v1/files/upload',\r\n method: 'POST',\r\n headers: {\r\n ...headers\r\n },\r\n formData\r\n });\r\n \r\n if (!response.success || !response.data) {\r\n throw new Error(response.message || '文件上传失败');\r\n }\r\n \r\n return response.data;\r\n } catch (error) {\r\n console.error('文件上传错误:', error);\r\n throw error;\r\n }\r\n};\r\n"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{p as e,b as i}from"./p-DaMwkrv5.js";export{s as setNonce}from"./p-DaMwkrv5.js";import{g as n}from"./p-DQuL1Twl.js";var o=()=>{const i=import.meta.url;const n={};if(i!==""){n.resourcesUrl=new URL(".",i).href}return e(n)};o().then((async e=>{await n();return i([["p-e21bc169",[[1,"pcm-mnms-modal",{modalTitle:[1,"modal-title"],apiKey:[1,"api-key"],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],fullscreen:[4],isMobile:[4,"is-mobile"],customInputs:[16],selectedFile:[32],isUploading:[32],uploadedFileInfo:[32],showChatModal:[32],isTransitioning:[32],transitionTimer:[32]},null,{isOpen:["handleIsOpenChange"]}],[1,"pcm-app-chat-modal",{modalTitle:[1,"modal-title"],apiKey:[1,"api-key"],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],totalQuestions:[2,"total-questions"],maxRecordingTime:[2,"max-recording-time"],countdownWarningTime:[2,"countdown-warning-time"],fullscreen:[4],enableVoice:[4,"enable-voice"],displayContentStatus:[1,"display-content-status"],userId:[1,"user-id"],interviewMode:[1,"interview-mode"],customInputs:[16],messages:[32],currentAssistantMessage:[32],isLoading:[32],currentStreamingMessage:[32],shouldAutoScroll:[32],isLoadingHistory:[32],selectedFile:[32],isUploading:[32],uploadedFileInfo:[32],showInitialUpload:[32],isRecording:[32],recordingStream:[32],recordedBlob:[32],mediaRecorder:[32],recordingTimeLeft:[32],showRecordingUI:[32],recordingTimer:[32],recordingStartTime:[32],recordingMaxTime:[32],waitingToRecord:[32],waitingTimer:[32],waitingTimeLeft:[32],currentQuestionNumber:[32],showCountdownWarning:[32],isUploadingVideo:[32],isPlayingAudio:[32],audioUrl:[32],textAnswer:[32],isSubmittingText:[32]}],[1,"pcm-chat-message",{message:[16]}]]],["p-6c07f155",[[1,"pcm-chat-modal",{modalTitle:[1,"modal-title"],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],botId:[1,"bot-id"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],fullscreen:[4],messages:[32],currentMessage:[32],currentAssistantMessage:[32],isLoading:[32],currentStreamingMessage:[32],shouldAutoScroll:[32],isLoadingHistory:[32],suggestedQuestions:[32],suggestedQuestionsLoading:[32],selectedFile:[32],isUploading:[32],uploadedFileInfo:[32]},null,{isOpen:["handleIsOpenChange"],defaultQuery:["handleDefaultQueryChange"]}]]],["p-9a1fb6ca",[[1,"pcm-hr-chat-modal",{modalTitle:[1,"modal-title"],apiKey:[1,"api-key"],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],totalQuestions:[2,"total-questions"],maxRecordingTime:[2,"max-recording-time"],countdownWarningTime:[2,"countdown-warning-time"],toEmail:[1,"to-email"],fullscreen:[4],requireResume:[4,"require-resume"],enableVoice:[4,"enable-voice"],displayContentStatus:[1,"display-content-status"],userId:[1,"user-id"],messages:[32],currentAssistantMessage:[32],isLoading:[32],currentStreamingMessage:[32],shouldAutoScroll:[32],isLoadingHistory:[32],selectedFile:[32],isUploading:[32],uploadedFileInfo:[32],showInitialUpload:[32],selectedJobCategory:[32],jobCategories:[32],dimensions:[32],selectedDimensions:[32],isRecording:[32],recordingStream:[32],recordedBlob:[32],mediaRecorder:[32],recordingTimeLeft:[32],showRecordingUI:[32],recordingTimer:[32],recordingStartTime:[32],recordingMaxTime:[32],waitingToRecord:[32],waitingTimer:[32],waitingTimeLeft:[32],currentQuestionNumber:[32],isInterviewComplete:[32],showCountdownWarning:[32],isUploadingVideo:[32],isPlayingAudio:[32],audioUrl:[32]},null,{isOpen:["handleIsOpenChange"]}]]],["p-5f624943",[[1,"pcm-video-chat-modal",{modalTitle:[1,"modal-title"],apiKey:[1,"api-key"],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],totalQuestions:[2,"total-questions"],maxRecordingTime:[2,"max-recording-time"],countdownWarningTime:[2,"countdown-warning-time"],fullscreen:[4],enableVoice:[4,"enable-voice"],displayContentStatus:[1,"display-content-status"],resumeId:[1,"resume-id"],messages:[32],currentAssistantMessage:[32],isLoading:[32],currentStreamingMessage:[32],shouldAutoScroll:[32],isLoadingHistory:[32],showInitialUpload:[32],isRecording:[32],recordingStream:[32],recordedBlob:[32],mediaRecorder:[32],recordingTimeLeft:[32],showRecordingUI:[32],recordingTimer:[32],recordingStartTime:[32],recordingMaxTime:[32],waitingToRecord:[32],waitingTimer:[32],waitingTimeLeft:[32],currentQuestionNumber:[32],isInterviewComplete:[32],showCountdownWarning:[32],isUploadingVideo:[32],isPlayingAudio:[32],audioUrl:[32]},null,{isOpen:["handleIsOpenChange"]}]]],["p-0ddd5c47",[[1,"my-component",{first:[1],middle:[1],last:[1]}]]]],e)}));
1
+ import{p as e,b as i}from"./p-DaMwkrv5.js";export{s as setNonce}from"./p-DaMwkrv5.js";import{g as n}from"./p-DQuL1Twl.js";var o=()=>{const i=import.meta.url;const n={};if(i!==""){n.resourcesUrl=new URL(".",i).href}return e(n)};o().then((async e=>{await n();return i([["p-a698b59f",[[1,"pcm-jlpx-modal",{modalTitle:[1,"modal-title"],token:[1],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],fullscreen:[4],customInputs:[16],selectedFile:[32],isUploading:[32],uploadedFileInfo:[32],showChatModal:[32],jobDescription:[32],isSubmitting:[32],isTransitioning:[32],transitionTimer:[32]},null,{isOpen:["handleIsOpenChange"]}],[1,"pcm-mnms-modal",{modalTitle:[1,"modal-title"],token:[1],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],fullscreen:[4],customInputs:[16],selectedFile:[32],isUploading:[32],uploadedFileInfo:[32],showChatModal:[32],isTransitioning:[32],transitionTimer:[32],jobDescription:[32],isSubmitting:[32]},null,{isOpen:["handleIsOpenChange"]}],[1,"pcm-zygh-modal",{modalTitle:[1,"modal-title"],token:[1],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],fullscreen:[4],customInputs:[16],selectedFile:[32],isUploading:[32],uploadedFileInfo:[32],showChatModal:[32],isSubmitting:[32],selectedPlanType:[32],isTransitioning:[32],transitionTimer:[32]},null,{isOpen:["handleIsOpenChange"]}],[1,"pcm-hr-chat-modal",{modalTitle:[1,"modal-title"],token:[1],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],totalQuestions:[2,"total-questions"],maxRecordingTime:[2,"max-recording-time"],countdownWarningTime:[2,"countdown-warning-time"],toEmail:[1,"to-email"],fullscreen:[4],requireResume:[4,"require-resume"],enableVoice:[4,"enable-voice"],displayContentStatus:[4,"display-content-status"],userId:[1,"user-id"],messages:[32],currentAssistantMessage:[32],isLoading:[32],currentStreamingMessage:[32],shouldAutoScroll:[32],isLoadingHistory:[32],selectedFile:[32],isUploading:[32],uploadedFileInfo:[32],showInitialUpload:[32],selectedJobCategory:[32],jobCategories:[32],dimensions:[32],selectedDimensions:[32],isRecording:[32],recordingStream:[32],recordedBlob:[32],mediaRecorder:[32],recordingTimeLeft:[32],showRecordingUI:[32],recordingTimer:[32],recordingStartTime:[32],recordingMaxTime:[32],waitingToRecord:[32],waitingTimer:[32],waitingTimeLeft:[32],currentQuestionNumber:[32],isInterviewComplete:[32],showCountdownWarning:[32],isUploadingVideo:[32],isPlayingAudio:[32],audioUrl:[32]},null,{isOpen:["handleIsOpenChange"]}],[1,"pcm-video-chat-modal",{modalTitle:[1,"modal-title"],token:[1],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],totalQuestions:[2,"total-questions"],maxRecordingTime:[2,"max-recording-time"],countdownWarningTime:[2,"countdown-warning-time"],fullscreen:[4],enableVoice:[4,"enable-voice"],displayContentStatus:[1,"display-content-status"],resumeId:[1,"resume-id"],messages:[32],currentAssistantMessage:[32],isLoading:[32],currentStreamingMessage:[32],shouldAutoScroll:[32],isLoadingHistory:[32],showInitialUpload:[32],isRecording:[32],recordingStream:[32],recordedBlob:[32],mediaRecorder:[32],recordingTimeLeft:[32],showRecordingUI:[32],recordingTimer:[32],recordingStartTime:[32],recordingMaxTime:[32],waitingToRecord:[32],waitingTimer:[32],waitingTimeLeft:[32],currentQuestionNumber:[32],isInterviewComplete:[32],showCountdownWarning:[32],isUploadingVideo:[32],isPlayingAudio:[32],audioUrl:[32]},null,{isOpen:["handleIsOpenChange"]}],[1,"pcm-app-chat-modal",{modalTitle:[1,"modal-title"],token:[1],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],totalQuestions:[2,"total-questions"],maxRecordingTime:[2,"max-recording-time"],countdownWarningTime:[2,"countdown-warning-time"],fullscreen:[4],enableTTS:[4,"enable-t-t-s"],enableVoice:[4,"enable-voice"],displayContentStatus:[1,"display-content-status"],interviewMode:[1,"interview-mode"],customInputs:[16],botId:[1,"bot-id"],messages:[32],currentAssistantMessage:[32],isLoading:[32],currentStreamingMessage:[32],shouldAutoScroll:[32],isLoadingHistory:[32],selectedFile:[32],isUploading:[32],uploadedFileInfo:[32],showInitialUpload:[32],isRecording:[32],recordingStream:[32],recordedBlob:[32],mediaRecorder:[32],recordingTimeLeft:[32],showRecordingUI:[32],recordingTimer:[32],recordingStartTime:[32],recordingMaxTime:[32],waitingToRecord:[32],waitingTimer:[32],waitingTimeLeft:[32],currentQuestionNumber:[32],showCountdownWarning:[32],isUploadingVideo:[32],isPlayingAudio:[32],audioUrl:[32],textAnswer:[32],isSubmittingText:[32]}],[1,"pcm-chat-message",{message:[16]}]]],["p-f3ca99b4",[[1,"pcm-chat-modal",{modalTitle:[1,"modal-title"],apiKey:[1,"api-key"],isOpen:[1028,"is-open"],icon:[1],zIndex:[2,"z-index"],isShowHeader:[4,"is-show-header"],isNeedClose:[4,"is-need-close"],botId:[1,"bot-id"],conversationId:[1025,"conversation-id"],defaultQuery:[1,"default-query"],fullscreen:[4],messages:[32],currentMessage:[32],currentAssistantMessage:[32],isLoading:[32],currentStreamingMessage:[32],shouldAutoScroll:[32],isLoadingHistory:[32],suggestedQuestions:[32],suggestedQuestionsLoading:[32],selectedFile:[32],isUploading:[32],uploadedFileInfo:[32]},null,{isOpen:["handleIsOpenChange"],defaultQuery:["handleDefaultQueryChange"]}]]],["p-55417392",[[1,"my-component",{first:[1],middle:[1],last:[1]}]]]],e)}));
2
2
  //# sourceMappingURL=pcm-agents.esm.js.map