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 +0,0 @@
1
- {"version":3,"names":["pcmAppChatModalCss","ChatAPPModal","modalTitle","apiKey","isOpen","messages","modalClosed","icon","zIndex","isShowHeader","isNeedClose","conversationId","currentAssistantMessage","isLoading","currentStreamingMessage","shouldAutoScroll","isLoadingHistory","streamComplete","conversationStart","selectedFile","isUploading","uploadedFileInfo","defaultQuery","showInitialUpload","isRecording","recordingStream","recordedBlob","mediaRecorder","recordingTimeLeft","showRecordingUI","recordingTimer","recordingStartTime","recordingMaxTime","waitingToRecord","waitingTimer","waitingTimeLeft","videoRef","totalQuestions","currentQuestionNumber","interviewComplete","SCROLL_THRESHOLD","maxRecordingTime","countdownWarningTime","showCountdownWarning","fullscreen","isUploadingVideo","isPlayingAudio","audioUrl","audioElement","recordingError","recordingStatusChange","enableVoice","displayContentStatus","userId","interviewMode","textAnswer","isSubmittingText","customInputs","handleClose","this","stopRecording","emit","sendMessageToAPI","message","videoUrl","answer","llmText","now","Date","time","getHours","getMinutes","toString","padStart","queryText","trim","isLastQuestion","newMessage","id","query","isStreaming","conversation_id","inputs","status","error","scrollToBottom","completeInterview","total_questions","requestData","response_mode","user","video_url","sendSSERequest","url","method","headers","authorization","data","onMessage","console","log","event","message_id","LLMText","updatedMessage","onError","alert","Error","onComplete","async","latestAIMessage","textForSynthesis","synthesizeAudio","playAudio","startWaitingToRecord","handleScroll","chatHistory","hostElement","shadowRoot","querySelector","scrollTop","scrollHeight","clientHeight","distanceFromBottom","componentDidRender","loadHistoryMessages","sendHttpRequest","limit","historyData","formattedMessages","map","msg","created_at","hours","minutes","timeStr","msgWithoutInputs","requestAnimationFrame","componentDidLoad","addEventListener","componentWillLoad","setTimeout","clearInterval","setInterval","startRecording","stream","navigator","mediaDevices","getUserMedia","audio","video","width","ideal","height","frameRate","setupVideoPreview","mimeType","getSupportedMimeType","MediaRecorder","e","warn","recorderError","type","details","chunks","ondataavailable","size","push","onerror","onstop","blobType","blob","Blob","duration","Math","floor","uploadRecordedVideo","start","maxDuration","startError","elapsedTime","max","videoElement","srcObject","play","catch","err","objectUrl","URL","createObjectURL","src","onended","revokeObjectURL","urlError","mimeTypes","window","isTypeSupported","stop","getTracks","forEach","track","convertAudioToText","cosKey","Promise","resolve","reject","cos_key","text","fileExtension","includes","fileName","formData","FormData","append","response","fetch","body","result","json","transcriptionText","saveVideoAnswer","lastAIMessage","length","question","file_url","JSON","stringify","ok","audioBlob","Audio","disconnectedCallback","removeEventListener","pause","handlePlayAudio","handleTextInputChange","input","target","value","handleKeyDown","key","ctrlKey","preventDefault","submitTextAnswer","textToSend","render","modalStyle","String","containerClass","overlayClass","renderVideoPreview","h","class","autoPlay","playsInline","muted","style","transform","ref","el","warning","renderPlaceholderStatus","renderTextInputArea","placeholder","onInput","onKeyDown","disabled","onClick","alt","onScroll","onMessageChange","updatedMessages","detail","display","flexWrap","justifyContent","viewBox","fill","verticalAlign","marginRight","d","_getDefaults","breaks","extensions","gfm","hooks","pedantic","renderer","silent","tokenizer","walkTokens","_defaults","changeDefaults","newDefaults","escapeTest","escapeReplace","RegExp","source","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","ch","escape","html","encode","test","replace","unescapeTest","unescape","_","n","toLowerCase","charAt","fromCharCode","parseInt","substring","caret","edit","regex","opt","obj","name","val","getRegex","cleanUrl","href","encodeURI","noopTest","exec","splitCells","tableRow","count","row","match","offset","str","escaped","curr","cells","split","i","shift","pop","splice","rtrim","c","invert","l","suffLen","currChar","slice","findClosingBracket","b","indexOf","level","outputLink","cap","link","raw","lexer","title","state","inLink","token","tokens","inlineTokens","indentCodeCompensation","matchIndentToCode","indentToCode","node","matchIndentInNode","indentInNode","join","_Tokenizer","options","rules","constructor","space","block","newline","code","codeBlockStyle","fences","lang","inline","_escapes","heading","trimmed","depth","hr","blockquote","top","blockTokens","list","bull","isordered","ordered","loose","items","itemRegex","itemContents","endsWithBlankLine","endEarly","line","t","repeat","nextLine","indent","trimStart","search","blankLine","nextBulletRegex","min","hrRegex","fencesBeginRegex","headingBeginRegex","rawLine","istask","ischecked","task","checked","trimEnd","spacers","filter","hasMultipleLineBreaks","some","pre","def","tag","table","item","header","align","rows","j","k","lheading","paragraph","inRawBlock","trimmedUrl","rtrimSlash","lastParenIndex","linkLen","reflink","links","nolink","emStrong","maskedSrc","prevChar","lDelim","nextChar","punctuation","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","rDelimAst","rDelimUnd","lastIndex","lastCharLength","index","codespan","hasNonSpaceChars","hasSpaceCharsOnBothEnds","br","del","autolink","prevCapZero","_backpedal","inlineText","_paragraph","_label","_title","bullet","listItemStart","_tag","_comment","normal","reflinkSearch","_punctuation","blockSkip","anyPunctuation","_scheme","_email","_attribute","_href","strong","middle","endAst","endUnd","em","_extended_email","_Lexer","inlineQueue","Object","create","lex","lexInline","next","leading","tabs","lastToken","cutSrc","lastParagraphClipped","extTokenizer","call","startBlock","startIndex","Infinity","tempSrc","tempStart","getStartIndex","errMsg","charCodeAt","keepPrevChar","keys","lastIndexOf","startInline","_Renderer","infostring","quote","startatt","listitem","checkbox","tablerow","content","tablecell","flags","cleanHref","out","image","_TextRenderer","_Parser","textRenderer","parse","parser","parseInline","renderers","genericToken","ret","headingToken","codeToken","tableToken","cell","blockquoteToken","listToken","itemBody","unshift","htmlToken","paragraphToken","textToken","escapeToken","tagToken","linkToken","imageToken","strongToken","emToken","codespanToken","delToken","_Hooks","static","Set","preprocess","markdown","postprocess","Marked","defaults","setOptions","parseMarkdown","Parser","Renderer","TextRenderer","Lexer","Tokenizer","Hooks","args","use","callback","values","concat","childTokens","pack","opts","ext","prevRenderer","apply","extLevel","prop","rendererFunc","rendererKey","tokenizerFunc","tokenizerKey","prevTokenizer","hooksFunc","hooksKey","prevHook","passThroughHooks","has","arg","then","packWalktokens","origOpt","throwError","prototype","all","markedInstance","marked","getDefaults","pcmChatMessageCss","ChatMessageComponent","messageChange","hostRef","copyMessageContent","clipboard","writeText","renderUserMessage","renderInputs","renderAssistantMessage","showLoading","htmlContent","innerHTML","xmlns","stroke","x","y","rx","ry","startsWith","fileList","fileUrl","fileIndex","pcmMnmsModalCss","MnmsModal","isMobile","uploadSuccess","showChatModal","isTransitioning","transitionTimer","handleFileChange","files","handleUploadClick","fileInput","click","clearSelectedFile","uploadFile","filename","presigned_url","handleStartInterview","handleIsOpenChange","newValue","clearTimeout","handleStreamComplete","handleConversationStart","handleInterviewComplete","stopPropagation","onChange","accept","undefined","onModalClosed","onStreamComplete","onConversationStart","onInterviewComplete"],"sources":["src/components/pcm-app-chat-modal/pcm-app-chat-modal.css?tag=pcm-app-chat-modal&encapsulation=shadow","src/components/pcm-app-chat-modal/pcm-app-chat-modal.tsx","node_modules/.pnpm/marked@9.1.6/node_modules/marked/lib/marked.esm.js","src/components/pcm-chat-message/pcm-chat-message.css?tag=pcm-chat-message&encapsulation=shadow","src/components/pcm-chat-message/pcm-chat-message.tsx","src/components/pcm-mnms-modal/pcm-mnms-modal.css?tag=pcm-mnms-modal&encapsulation=shadow","src/components/pcm-mnms-modal/pcm-mnms-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: 900px;\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: 100%;\r\n border-radius: 0;\r\n margin: 0;\r\n display: flex;\r\n flex-direction: column;\r\n height: 100vh;\r\n max-height: 100vh;\r\n}\r\n\r\n/* 确保内容区域也使用 flex 布局并占满剩余空间 */\r\n.modal-container.fullscreen > div:not(.modal-header):not(.initial-upload) {\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1;\r\n overflow: hidden; /* 防止内容溢出 */\r\n height: 100%;\r\n}\r\n\r\n/* PC端布局 */\r\n.pc-layout {\r\n width: 80%;\r\n max-width: 800px;\r\n /* height: 80vh; */\r\n /* max-height: 700px; */\r\n min-width: 320px;\r\n min-height: 400px;\r\n}\r\n\r\n/* 移动端布局 */\r\n.mobile-layout {\r\n width: 100%;\r\n height: 100%;\r\n border-radius: 0;\r\n}\r\n\r\n\r\n.video-preview.placeholder {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: #EAEAEA;\r\n}\r\n\r\n.placeholder-status {\r\n color: #00000066;\r\n}\r\n\r\n.waiting-message p {\r\n margin: 0;\r\n font-size: 16px;\r\n color: white;\r\n font-weight: 500;\r\n}\r\n\r\n.recording-container {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\n\r\n\r\n.video-area {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\n.stop-recording-button {\r\n width: 100%;\r\n height: 100%;\r\n font-size: 16px;\r\n background: #f44336;\r\n border-radius: 6px;\r\n color: white;\r\n border: none;\r\n cursor: pointer;\r\n}\r\n\r\n.stop-recording-button:hover {\r\n background: #d32f2f;\r\n}\r\n\r\n.play-audio-container {\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\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 flex-shrink: 0; /* 防止头部被压缩 */\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: 20px;\r\n scroll-behavior: smooth;\r\n min-height: 400px;\r\n background: url(https://pcm-resource-1312611446.cos.ap-guangzhou.myqcloud.com/web/sdk/chat_bg.png);\r\n background-size: 100%;\r\n}\r\n\r\n/* 添加全屏模式下的样式 */\r\n.fullscreen .chat-history {\r\n height: auto;\r\n flex: 1 1 auto;\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% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\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\r\n.recording-section {\r\n border-top: 1px solid #eee;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n padding: 20px;\r\n border-radius: 14px 14px 0 0;\r\n flex: 0 0 auto;\r\n}\r\n\r\n.recording-section .video-preview {\r\n width: 100%;\r\n height: 200px;\r\n max-width: 400px;\r\n position: relative;\r\n margin-bottom: 10px;\r\n border: 1px solid #ddd;\r\n border-radius: 12px;\r\n overflow: hidden;\r\n}\r\n\r\n.recording-section video {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n}\r\n\r\n/* 修改 recording-status 样式 */\r\n.recording-status {\r\n position: absolute;\r\n top: 10px;\r\n left: 10px;\r\n background-color: rgba(0, 0, 0, 0.6);\r\n color: white;\r\n padding: 4px 8px;\r\n border-radius: 4px;\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n font-size: 0.8rem;\r\n z-index: 2;\r\n}\r\n\r\n.recording-status .recording-dot {\r\n display: inline-block;\r\n width: 10px;\r\n height: 10px;\r\n background-color: red;\r\n border-radius: 50%;\r\n margin-right: 5px;\r\n animation: blink 1s infinite;\r\n}\r\n\r\n.recording-status.warning {\r\n color: #ff4d4f;\r\n animation: blink 1s infinite;\r\n}\r\n\r\n@keyframes blink {\r\n 0% {\r\n opacity: 1;\r\n }\r\n\r\n 50% {\r\n opacity: 0.5;\r\n }\r\n\r\n 100% {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n.recording-section .stop-recording-button {\r\n background-color: #f44336;\r\n color: white;\r\n border: none;\r\n cursor: pointer;\r\n font-weight: bold;\r\n}\r\n\r\n.recording-section .stop-recording-button:hover {\r\n background-color: #d32f2f;\r\n}\r\n\r\n.fullscreen {\r\n width: 100vw;\r\n border-radius: 0;\r\n height: 100vh;\r\n display: flex;\r\n flex-direction: column;\r\n overflow-y: auto;\r\n}\r\n\r\n.recording-controls {\r\n margin-top: 10px;\r\n height: 53px;\r\n width: 100%;\r\n max-width: 400px;\r\n display: flex;\r\n justify-content: center;\r\n}\r\n\r\n.recording-controls .waiting-message {\r\n text-align: center;\r\n color: white;\r\n font-size: 1rem;\r\n background-image: linear-gradient(100deg, #4A9FFF 0%, #1058FF 100%);\r\n border-radius: 6px;\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\r\n width: 95%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n cursor: pointer;\r\n}\r\n\r\n.recording-controls .waiting-message.loading {\r\n background: #faad14;\r\n}\r\n\r\n.recording-controls .waiting-message p {\r\n margin: 0;\r\n font-size: 16px;\r\n color: white;\r\n font-weight: 500;\r\n}\r\n\r\n.recording-controls .stop-recording-button {\r\n background-color: #dc3545;\r\n color: white;\r\n border: none;\r\n cursor: pointer;\r\n font-size: 1rem;\r\n}\r\n\r\n.recording-controls .stop-recording-button:hover {\r\n background-color: #c82333;\r\n}\r\n\r\n/* 添加禁用状态的样式 */\r\n.recording-controls .stop-recording-button.disabled {\r\n background: #ccc;\r\n cursor: not-allowed;\r\n}\r\n\r\n.recording-controls .stop-recording-button.disabled:hover {\r\n background: #ccc;\r\n}\r\n\r\n/* 添加进度条和数字进度的样式 */\r\n.progress-container {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n width: 100%;\r\n max-width: 400px;\r\n margin-top: 10px;\r\n padding: 0 5px;\r\n}\r\n\r\n.progress-bar-container {\r\n height: 4px;\r\n background-color: #E5E5E5;\r\n border-radius: 2px;\r\n overflow: hidden;\r\n margin-right: 10px;\r\n width: 75px;\r\n}\r\n\r\n.progress-bar {\r\n height: 100%;\r\n background-image: linear-gradient(111deg, #4A9FFF 0%, #1058FF 100%);\r\n border-radius: 2px;\r\n transition: width 0.3s ease;\r\n}\r\n\r\n.progress-text {\r\n font-size: 14px;\r\n color: #666;\r\n white-space: nowrap;\r\n}\r\n\r\n/* 重新设计文本输入区域样式 */\r\n.text-input-area {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 100%;\r\n padding: 16px;\r\n border-radius: 8px;\r\n border: none; /* 确保容器本身没有边框 */\r\n}\r\n\r\n/* 修改文本输入框样式 */\r\n.text-answer-input {\r\n flex: 1;\r\n min-height: 80px;\r\n padding: 12px 12px 0px 12px;\r\n border: 1px solid #ddd;\r\n border-radius: 8px 8px 0 0;\r\n resize: none;\r\n font-size: 16px;\r\n background-color: #fff;\r\n border-bottom: none;\r\n outline: none; /* 移除默认的焦点轮廓 */\r\n}\r\n\r\n/* 修改工具栏样式 */\r\n.input-toolbar {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n background-color: #fff;\r\n border: 1px solid #ddd;\r\n border-top: none;\r\n border-radius: 0 0 8px 8px;\r\n}\r\n\r\n/* 当输入框获得焦点时,修改边框颜色 */\r\n.text-answer-input:focus {\r\n border-color: rgb(74, 144, 226);\r\n border-bottom: none;\r\n}\r\n\r\n.text-answer-input:focus + .input-toolbar {\r\n border-color: rgb(74, 144, 226);\r\n border-top: none;\r\n}\r\n\r\n/* 左侧工具按钮区域 */\r\n.toolbar-actions {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.toolbar-button {\r\n background: transparent;\r\n border: none;\r\n color: #666;\r\n padding: 4px;\r\n cursor: pointer;\r\n border-radius: 4px;\r\n}\r\n\r\n.toolbar-button:hover {\r\n background-color: #f0f0f0;\r\n}\r\n\r\n/* 发送按钮样式 */\r\n.submit-text-button {\r\n padding: 6px 16px;\r\n background-color: #4a90e2;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: background-color 0.2s;\r\n}\r\n\r\n.submit-text-button:hover:not(.disabled) {\r\n background-color: #3a7bc8;\r\n}\r\n\r\n.submit-text-button.disabled {\r\n background-color: #b3b3b3;\r\n cursor: not-allowed;\r\n}\r\n\r\n\r\n/* 响应式布局 */\r\n@media screen and (max-width: 768px) {\r\n .pc-layout {\r\n width: 95%;\r\n /* height: 90vh; */\r\n }\r\n\r\n .modal-overlay {\r\n padding: 0;\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\r\n .modal-container.mobile-layout {\r\n width: 100%;\r\n height: 100vh;\r\n max-height: 100vh;\r\n min-height: 100vh;\r\n border-radius: 0;\r\n margin: 0;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .chat-history {\r\n min-height: 200px;\r\n }\r\n}\r\n\r\n","import { Component, Prop, h, State, Event, EventEmitter, Element } 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-app-chat-modal',\r\n styleUrl: 'pcm-app-chat-modal.css',\r\n shadow: true,\r\n})\r\nexport class ChatAPPModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '在线客服';\r\n\r\n /**\r\n * 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 */\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 /**\r\n * 会话ID\r\n */\r\n @Prop({ mutable: true }) conversationId?: string;\r\n\r\n /**\r\n * 当前助手回复的消息\r\n */\r\n @State() currentAssistantMessage: string = '';\r\n\r\n /**\r\n * 是否正在加载回复\r\n */\r\n @State() isLoading: boolean = false;\r\n\r\n /**\r\n * 当前正在流式输出的消息\r\n */\r\n @State() currentStreamingMessage: ChatMessage | null = null;\r\n\r\n // 添加新的状态控制\r\n @State() shouldAutoScroll: boolean = true;\r\n\r\n @State() isLoadingHistory: boolean = false;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n /**\r\n * 一轮对话结束时的回调\r\n */\r\n @Event() streamComplete: EventEmitter<{\r\n conversation_id: string;\r\n event: string;\r\n message_id: string;\r\n id: string;\r\n }>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: 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() 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 @State() showInitialUpload: boolean = false;\r\n\r\n\r\n // 添加视频录制相关状态\r\n @State() isRecording: boolean = false;\r\n @State() recordingStream: MediaStream | null = null;\r\n @State() recordedBlob: Blob | null = null;\r\n @State() mediaRecorder: MediaRecorder | null = null;\r\n @State() recordingTimeLeft: number = 0;\r\n @State() showRecordingUI: boolean = false;\r\n @State() recordingTimer: any = null;\r\n @State() recordingStartTime: number = 0;\r\n @State() recordingMaxTime: number = 120; // 最大录制时间(秒)\r\n @State() waitingToRecord: boolean = false;\r\n @State() waitingTimer: any = null;\r\n @State() waitingTimeLeft: number = 10; // 等待时间(秒)\r\n\r\n // 添加一个新的私有属性来存储视频元素的引用\r\n private videoRef: HTMLVideoElement | null = null;\r\n\r\n /**\r\n * 控制对话轮数\r\n */\r\n @Prop() totalQuestions: number = 2;\r\n\r\n /**\r\n * 当前轮数\r\n */\r\n @State() currentQuestionNumber: number = 0;\r\n\r\n\r\n /**\r\n * 当聊天完成时触发\r\n */\r\n @Event() interviewComplete: EventEmitter<{\r\n conversation_id: string;\r\n total_questions: number;\r\n }>;\r\n\r\n private readonly SCROLL_THRESHOLD = 30;\r\n\r\n /**\r\n * 视频录制最大时长(秒)\r\n */\r\n @Prop() maxRecordingTime: number = 120;\r\n\r\n /**\r\n * 录制倒计时提醒时间(秒)\r\n * 当剩余时间小于此值时,显示倒计时警告\r\n */\r\n @Prop() countdownWarningTime: number = 30;\r\n\r\n @State() showCountdownWarning: boolean = false;\r\n\r\n /**\r\n * 是否以全屏模式打开\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n // 添加新的状态来跟踪视频上传\r\n @State() isUploadingVideo: boolean = false;\r\n\r\n // 添加新的状态和属性\r\n @State() isPlayingAudio: boolean = false;\r\n @State() audioUrl: string | null = null;\r\n private audioElement: HTMLAudioElement | null = null;\r\n\r\n /**\r\n * 录制错误事件\r\n */\r\n @Event() recordingError: EventEmitter<{\r\n type: string;\r\n message: string;\r\n details?: any;\r\n }>;\r\n\r\n /**\r\n * 录制状态变化事件\r\n */\r\n @Event() recordingStatusChange: EventEmitter<{\r\n status: 'started' | 'stopped' | 'paused' | 'resumed' | 'failed';\r\n details?: any;\r\n }>;\r\n\r\n /**\r\n * 是否自动播放语音问题\r\n */\r\n @Prop() enableVoice: boolean = true;\r\n\r\n /**\r\n * 是否显示题干内容\r\n * 1: 显示题干内容\r\n * 0: 不显示题干内容\r\n */\r\n @Prop() displayContentStatus: string = \"1\";\r\n\r\n /**\r\n * 用户ID\r\n */\r\n @Prop() userId: string = '';\r\n\r\n /**\r\n * 面试模式\r\n * video: 视频面试模式\r\n * text: 文字面试模式\r\n */\r\n @Prop() interviewMode: 'video' | 'text' = 'video';\r\n\r\n // 添加文字输入相关状态\r\n @State() textAnswer: string = '';\r\n @State() isSubmittingText: boolean = false;\r\n\r\n /**\r\n * 自定义智能体inputs输入参数\r\n */\r\n @Prop() customInputs: Record<string, any> = {};\r\n\r\n\r\n private handleClose = () => {\r\n this.stopRecording();\r\n this.modalClosed.emit();\r\n };\r\n\r\n\r\n private async sendMessageToAPI(message: string, videoUrl?: string) {\r\n this.isLoading = true;\r\n let answer = '';\r\n let llmText = ''; // 添加变量存储 LLMText\r\n\r\n const now = new Date();\r\n const time = `${now.getHours()}:${now.getMinutes().toString().padStart(2, '0')}`;\r\n\r\n // 修改消息处理逻辑,移除文件上传相关代码\r\n const queryText = message.trim() || '请开始';\r\n\r\n // 检查是否是最后一题\r\n const isLastQuestion = this.currentQuestionNumber >= this.totalQuestions;\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: '',\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 if (isLastQuestion) {\r\n this.messages = [...this.messages, newMessage];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n await this.completeInterview();\r\n this.interviewComplete.emit({\r\n conversation_id: this.conversationId,\r\n total_questions: this.totalQuestions\r\n });\r\n return;\r\n }\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: this.userId // 使用传入的 userId\r\n };\r\n\r\n // 合并基本输入参数和自定义输入参数\r\n requestData.inputs = {\r\n // 合并自定义输入参数\r\n ...this.customInputs\r\n };\r\n\r\n // 如果有视频URL,添加到inputs中\r\n if (videoUrl) {\r\n requestData.inputs.video_url = videoUrl;\r\n }\r\n\r\n await sendSSERequest({\r\n url: `https://pcm_api.ylzhaopin.com/external/v1/chat/chat-messages`,\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.apiKey\r\n },\r\n data: requestData,\r\n onMessage: (data) => {\r\n console.log('收到Stream数据:', data);\r\n\r\n if (data.conversation_id && !this.conversationId) {\r\n this.conversationId = data.conversation_id;\r\n this.conversationStart.emit({\r\n conversation_id: data.conversation_id,\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n\r\n // 检查是否有 node_finished 事件和 LLMText\r\n if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {\r\n llmText = data.data.inputs.LLMText;\r\n console.log('获取到 LLMText:', llmText);\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 alert(error instanceof Error ? error.message : '消息发送失败,请稍后再试');\r\n this.messages = [...this.messages, {\r\n ...newMessage,\r\n answer: '抱歉,发生了错误,请稍后再试。',\r\n error: error,\r\n isStreaming: false\r\n }];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n },\r\n onComplete: async () => {\r\n this.isLoading = false;\r\n\r\n // 获取最新的AI回复内容\r\n const latestAIMessage = this.currentStreamingMessage;\r\n\r\n // 更新消息列表\r\n this.messages = [...this.messages, this.currentStreamingMessage];\r\n this.currentStreamingMessage = null;\r\n\r\n // 如果是初始消息或\"下一题\"消息,增加题目计数\r\n if (message === \"下一题\" || this.currentQuestionNumber === 0) {\r\n this.currentQuestionNumber++;\r\n }\r\n\r\n if (latestAIMessage && latestAIMessage.answer) {\r\n // 优先使用 LLMText,如果没有则使用 answer\r\n const textForSynthesis = llmText || latestAIMessage.answer;\r\n\r\n if (textForSynthesis) {\r\n // 合成语音\r\n const audioUrl = await this.synthesizeAudio(textForSynthesis);\r\n\r\n if (this.enableVoice) {\r\n // 自动播放语音\r\n await this.playAudio(audioUrl);\r\n // 自动播放模式下,播放完成后立即开始等待录制\r\n this.startWaitingToRecord();\r\n } else {\r\n // 只保存音频URL,不自动播放\r\n this.audioUrl = audioUrl;\r\n // 非自动播放模式下,不立即开始等待录制\r\n }\r\n }\r\n }\r\n }\r\n });\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 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\r\n // 修改 loadHistoryMessages 方法\r\n private async loadHistoryMessages() {\r\n if (!this.conversationId) return;\r\n\r\n this.isLoadingHistory = true;\r\n console.log('加载历史消息...');\r\n\r\n try {\r\n await sendHttpRequest({\r\n url: `https://pcm_api.ylzhaopin.com/external/v1/chat/messages`,\r\n method: 'GET',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.apiKey\r\n },\r\n data: {\r\n conversation_id: this.conversationId,\r\n limit: 20\r\n },\r\n onMessage: (data) => {\r\n if (data.data) {\r\n const historyData = data.data || [];\r\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\r\n const time = new Date(msg.created_at * 1000);\r\n const hours = time.getHours().toString().padStart(2, '0');\r\n const minutes = time.getMinutes().toString().padStart(2, '0');\r\n const timeStr = `${hours}:${minutes}`;\r\n\r\n // 创建新的消息对象,不包含 inputs 字段\r\n const { inputs, ...msgWithoutInputs } = msg;\r\n\r\n return {\r\n ...msgWithoutInputs,\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 this.isLoadingHistory = false;\r\n\r\n requestAnimationFrame(() => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n });\r\n } else {\r\n this.isLoadingHistory = false;\r\n }\r\n },\r\n onError: (error) => {\r\n console.error('加载历史消息失败:', error);\r\n alert(error instanceof Error ? error.message : '加载历史消息失败,请刷新重试');\r\n this.isLoadingHistory = false;\r\n },\r\n onComplete: () => {\r\n this.isLoadingHistory = false;\r\n }\r\n });\r\n } catch (error) {\r\n console.error('加载历史消息失败:', error);\r\n alert(error instanceof Error ? error.message : '加载历史消息失败,请刷新重试');\r\n this.isLoadingHistory = false;\r\n }\r\n }\r\n\r\n // 修改 componentDidLoad 生命周期方法\r\n componentDidLoad() {\r\n\r\n // 添加滚动事件监听器\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory) {\r\n chatHistory.addEventListener('scroll', this.handleScroll);\r\n }\r\n }\r\n\r\n // 添加 componentWillLoad 生命周期方法\r\n componentWillLoad() {\r\n\r\n // 如果组件加载时已经是打开状态,则直接开始对话\r\n if (this.isOpen) {\r\n if (this.conversationId) {\r\n // 在下一个事件循环中加载历史消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.loadHistoryMessages(), 0);\r\n } else {\r\n // 在下一个事件循环中发送初始消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.sendMessageToAPI(this.defaultQuery), 0);\r\n }\r\n }\r\n }\r\n\r\n // 开始等待录制\r\n private startWaitingToRecord() {\r\n // 清除可能存在的计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n }\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n }\r\n\r\n this.waitingToRecord = true;\r\n this.waitingTimeLeft = 10;\r\n\r\n this.waitingTimer = setInterval(() => {\r\n this.waitingTimeLeft--;\r\n if (this.waitingTimeLeft <= 0) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n this.waitingToRecord = false;\r\n this.startRecording();\r\n }\r\n }, 1000);\r\n }\r\n\r\n // 开始录制视频\r\n private async startRecording() {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: true,\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 }\r\n }\r\n });\r\n\r\n this.recordingStream = stream;\r\n this.showRecordingUI = true;\r\n this.showCountdownWarning = false;\r\n\r\n // 重置视频引用\r\n this.videoRef = null;\r\n\r\n // 确保视频元素获取到流\r\n this.setupVideoPreview(stream);\r\n\r\n // 检测浏览器支持的MIME类型\r\n const mimeType = this.getSupportedMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let mediaRecorder;\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType\r\n });\r\n } catch (e) {\r\n // 如果指定MIME类型失败,尝试使用默认设置\r\n console.warn('指定的MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n mediaRecorder = new MediaRecorder(stream);\r\n } catch (recorderError) {\r\n // 通知父组件录制器创建失败\r\n this.recordingError.emit({\r\n type: 'recorder_creation_failed',\r\n message: '无法创建媒体录制器,您的浏览器可能不支持此功能',\r\n details: recorderError\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n }\r\n\r\n this.mediaRecorder = mediaRecorder;\r\n\r\n const chunks: BlobPart[] = [];\r\n\r\n mediaRecorder.ondataavailable = (event) => {\r\n if (event.data.size > 0) {\r\n chunks.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onerror = (event) => {\r\n // 通知父组件录制过程中发生错误\r\n this.recordingError.emit({\r\n type: 'recording_error',\r\n message: '录制过程中发生错误',\r\n details: event\r\n });\r\n this.stopRecording();\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n try {\r\n // 根据实际使用的MIME类型创建Blob\r\n const blobType = mimeType || 'video/mp4';\r\n const blob = new Blob(chunks, { type: blobType });\r\n\r\n if (blob.size === 0) {\r\n // 通知父组件录制的视频为空\r\n this.recordingError.emit({\r\n type: 'empty_recording',\r\n message: '录制的视频为空'\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n this.recordedBlob = blob;\r\n\r\n // 通知父组件录制已完成\r\n this.recordingStatusChange.emit({\r\n status: 'stopped',\r\n details: {\r\n duration: Math.floor((Date.now() - this.recordingStartTime) / 1000),\r\n size: blob.size,\r\n type: blob.type\r\n }\r\n });\r\n\r\n this.uploadRecordedVideo();\r\n } catch (error) {\r\n // 通知父组件处理录制视频时出错\r\n this.recordingError.emit({\r\n type: 'processing_error',\r\n message: '处理录制视频时出错',\r\n details: error\r\n });\r\n this.showRecordingUI = false;\r\n }\r\n };\r\n\r\n // 开始录制\r\n try {\r\n mediaRecorder.start();\r\n this.isRecording = true;\r\n this.recordingStartTime = Date.now();\r\n this.recordingTimeLeft = this.maxRecordingTime;\r\n\r\n // 通知父组件录制已开始\r\n this.recordingStatusChange.emit({\r\n status: 'started',\r\n details: {\r\n maxDuration: this.maxRecordingTime,\r\n mimeType: mediaRecorder.mimeType\r\n }\r\n });\r\n } catch (startError) {\r\n // 通知父组件开始录制失败\r\n this.recordingError.emit({\r\n type: 'start_failed',\r\n message: '开始录制失败,请检查您的设备权限',\r\n details: startError\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n // 设置录制计时器\r\n this.recordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.recordingStartTime) / 1000);\r\n this.recordingTimeLeft = Math.max(0, this.maxRecordingTime - elapsedTime);\r\n\r\n // 检查是否需要显示倒计时警告\r\n if (this.recordingTimeLeft <= this.countdownWarningTime && !this.showCountdownWarning) {\r\n this.showCountdownWarning = true;\r\n }\r\n\r\n // 时间到自动停止录制\r\n if (this.recordingTimeLeft <= 0) {\r\n this.stopRecording();\r\n }\r\n }, 1000);\r\n\r\n } catch (error) {\r\n console.error('无法访问摄像头或麦克风:', error);\r\n // 通知父组件无法访问媒体设备\r\n this.recordingError.emit({\r\n type: 'media_access_failed',\r\n message: '无法访问摄像头或麦克风,请确保已授予权限',\r\n details: error\r\n });\r\n this.showRecordingUI = false;\r\n }\r\n }\r\n\r\n // 添加新方法来设置视频预览\r\n private setupVideoPreview(stream: MediaStream) {\r\n // 延迟执行以确保DOM已更新\r\n setTimeout(() => {\r\n const videoElement = this.hostElement.shadowRoot?.querySelector('video') as HTMLVideoElement;\r\n if (videoElement && stream) {\r\n // 先尝试使用标准方法\r\n try {\r\n videoElement.srcObject = stream;\r\n videoElement.play().catch(err => {\r\n console.error('视频播放失败:', err);\r\n });\r\n } catch (e) {\r\n console.warn('设置srcObject失败,尝试替代方法:', e);\r\n\r\n // 对于不支持srcObject的旧浏览器,使用URL.createObjectURL\r\n try {\r\n // 使用类型断言解决TypeScript错误\r\n const objectUrl = URL.createObjectURL(stream as unknown as MediaSource);\r\n videoElement.src = objectUrl;\r\n\r\n // 确保在视频元素不再使用时释放URL\r\n videoElement.onended = () => {\r\n URL.revokeObjectURL(objectUrl);\r\n };\r\n } catch (urlError) {\r\n console.error('创建对象URL失败:', urlError);\r\n }\r\n }\r\n } else {\r\n console.warn('未找到视频元素或媒体流无效');\r\n }\r\n }, 100);\r\n }\r\n\r\n // 添加一个新方法来检测浏览器支持的MIME类型\r\n private getSupportedMimeType(): string {\r\n // 按优先级排列的MIME类型列表\r\n const mimeTypes = [\r\n 'video/webm;codecs=vp8,opus',\r\n 'video/webm;codecs=vp9,opus',\r\n 'video/webm',\r\n 'video/mp4',\r\n 'video/mp4;codecs=h264,aac',\r\n '' // 空字符串表示使用浏览器默认值\r\n ];\r\n\r\n // 检查MediaRecorder是否可用\r\n if (!window.MediaRecorder) {\r\n console.warn('MediaRecorder API不可用');\r\n return '';\r\n }\r\n\r\n // 检查每种MIME类型是否受支持\r\n for (const type of mimeTypes) {\r\n if (!type) return ''; // 如果是空字符串,直接返回\r\n\r\n try {\r\n if (MediaRecorder.isTypeSupported(type)) {\r\n return type;\r\n }\r\n } catch (e) {\r\n console.warn(`检查MIME类型支持时出错 ${type}:`, e);\r\n }\r\n }\r\n\r\n // 如果没有找到支持的类型,返回空字符串\r\n console.warn('没有找到支持的MIME类型,将使用浏览器默认值');\r\n return '';\r\n }\r\n\r\n // 停止录制\r\n private stopRecording() {\r\n if (this.mediaRecorder && this.isRecording) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n\r\n // 清理计时器\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止并释放媒体流\r\n if (this.recordingStream) {\r\n this.recordingStream.getTracks().forEach(track => track.stop());\r\n this.recordingStream = null;\r\n }\r\n\r\n // 清理视频引用\r\n this.videoRef = null;\r\n }\r\n }\r\n\r\n // 修改音频转文字方法\r\n private async convertAudioToText(cosKey: string): Promise<string | null> {\r\n try {\r\n // 创建一个Promise来处理响应\r\n return new Promise((resolve, reject) => {\r\n sendHttpRequest({\r\n url: `https://pcm_api.ylzhaopin.com/external/v1/tts/audio_to_text`,\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'authorization': 'Bearer ' + this.apiKey\r\n },\r\n data: {\r\n cos_key: cosKey\r\n },\r\n onMessage: (data) => {\r\n\r\n // 检查返回结果中是否包含转换后的文本\r\n if (data && data.text) {\r\n resolve(data.text);\r\n } else {\r\n console.warn('音频转文字返回结果格式不正确');\r\n resolve(null);\r\n }\r\n },\r\n onError: (error) => {\r\n console.error('音频转文字请求失败:', error);\r\n reject(error);\r\n }\r\n });\r\n });\r\n } catch (error) {\r\n console.error('音频转文字错误:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // 上传录制的视频\r\n private async uploadRecordedVideo() {\r\n if (!this.recordedBlob) return;\r\n\r\n try {\r\n this.isUploadingVideo = true; // 开始上传时设置状态\r\n this.showRecordingUI = false; // 隐藏视频预览\r\n\r\n // 根据Blob类型确定文件扩展名\r\n const fileExtension = this.recordedBlob.type.includes('webm') ? 'webm' : 'mp4';\r\n const fileName = `answer.${fileExtension}`;\r\n\r\n const formData = new FormData();\r\n formData.append('file', this.recordedBlob, fileName);\r\n\r\n const response = await fetch('https://pcm_api.ylzhaopin.com/external/v1/files/upload', {\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.apiKey\r\n },\r\n body: formData\r\n });\r\n\r\n const result = await response.json();\r\n\r\n if (result && result.cos_key) {\r\n // 调用音频转文字API\r\n const transcriptionText = await this.convertAudioToText(result.cos_key);\r\n\r\n // 保存视频答案\r\n await this.saveVideoAnswer(result.cos_key);\r\n\r\n // 发送\"下一题\"请求,可以附带转录文本\r\n this.sendMessageToAPI(transcriptionText || \"下一题\");\r\n } else {\r\n throw new Error('视频上传失败');\r\n }\r\n } catch (error) {\r\n console.error('视频上传或处理错误:', error);\r\n // 通知父组件视频上传失败\r\n this.recordingError.emit({\r\n type: 'upload_failed',\r\n message: '视频上传或处理失败',\r\n details: error\r\n });\r\n } finally {\r\n this.isUploadingVideo = false; // 上传完成后重置状态\r\n this.showRecordingUI = false;\r\n this.recordedBlob = null;\r\n }\r\n }\r\n\r\n // 保存视频答案\r\n private async saveVideoAnswer(cosKey: string) {\r\n if (!this.conversationId) return;\r\n\r\n try {\r\n const lastAIMessage = this.messages.length > 0 ? this.messages[this.messages.length - 1] : null;\r\n\r\n if (!lastAIMessage) return;\r\n\r\n await sendHttpRequest({\r\n url: 'https://pcm_api.ylzhaopin.com/agents/hr_competition/answer',\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.apiKey\r\n },\r\n data: {\r\n conversation_id: this.conversationId,\r\n user: this.userId, // 使用传入的 userId\r\n question: lastAIMessage.answer,\r\n file_url: cosKey\r\n },\r\n });\r\n } catch (error) {\r\n console.error('保存视频答案失败:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 发送面试完成请求\r\n */\r\n private async completeInterview() {\r\n if (!this.conversationId) return;\r\n\r\n try {\r\n const requestData: any = {\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: \"面试完成\",\r\n user: this.userId,\r\n inputs: {\r\n // 合并自定义输入参数\r\n ...this.customInputs\r\n }\r\n };\r\n\r\n // 不使用 await,直接发送请求\r\n sendSSERequest({\r\n url: `https://pcm_api.ylzhaopin.com/external/v1/chat/chat-messages`,\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.apiKey\r\n },\r\n data: requestData,\r\n }).catch(error => {\r\n console.error('发送面试完成请求失败:', error);\r\n });\r\n\r\n } catch (error) {\r\n console.error('发送面试完成请求失败:', error);\r\n }\r\n }\r\n\r\n // 添加TTS合成音频的方法\r\n private async synthesizeAudio(text: string): Promise<string> {\r\n try {\r\n const response = await fetch('https://pcm_api.ylzhaopin.com/external/v1/tts/synthesize_audio', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'authorization': 'Bearer ' + this.apiKey\r\n },\r\n body: JSON.stringify({ text })\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('语音合成失败');\r\n }\r\n\r\n // 获取音频数据并创建Blob URL\r\n const audioBlob = await response.blob();\r\n return URL.createObjectURL(audioBlob);\r\n } catch (error) {\r\n console.error('语音合成错误:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n // 播放音频的方法\r\n private playAudio(audioUrl: string): Promise<void> {\r\n return new Promise((resolve) => {\r\n this.isPlayingAudio = true;\r\n this.audioUrl = audioUrl;\r\n\r\n // 创建音频元素\r\n if (!this.audioElement) {\r\n this.audioElement = new Audio();\r\n }\r\n\r\n this.audioElement.src = audioUrl;\r\n this.audioElement.onended = () => {\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n resolve();\r\n };\r\n\r\n this.audioElement.onerror = () => {\r\n console.error('音频播放错误');\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n resolve();\r\n };\r\n\r\n this.audioElement.play().catch(error => {\r\n console.error('音频播放失败:', error);\r\n this.isPlayingAudio = false;\r\n this.audioUrl = null;\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n // 修改 componentDidLoad 生命周期方法,确保组件卸载时释放资源\r\n disconnectedCallback() {\r\n // 移除滚动事件监听器\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory) {\r\n chatHistory.removeEventListener('scroll', this.handleScroll);\r\n }\r\n\r\n // 释放音频资源\r\n if (this.audioElement) {\r\n this.audioElement.pause();\r\n this.audioElement.src = '';\r\n this.audioElement = null;\r\n }\r\n\r\n // 释放 Blob URL\r\n if (this.audioUrl) {\r\n URL.revokeObjectURL(this.audioUrl);\r\n this.audioUrl = null;\r\n }\r\n\r\n // 清理其他计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止录制\r\n this.stopRecording();\r\n }\r\n\r\n // 修改手动播放音频的方法\r\n private handlePlayAudio = async () => {\r\n if (this.audioUrl) {\r\n await this.playAudio(this.audioUrl);\r\n // 手动播放完成后开始等待录制\r\n this.startWaitingToRecord();\r\n }\r\n };\r\n\r\n // 处理文本输入变化\r\n private handleTextInputChange = (event: Event) => {\r\n const input = event.target as HTMLTextAreaElement;\r\n this.textAnswer = input.value;\r\n };\r\n\r\n // 添加处理键盘事件的方法\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n // 如果按下的是回车键\r\n if (event.key === 'Enter') {\r\n // 如果同时按下了Ctrl键,允许换行\r\n if (event.ctrlKey) {\r\n return; // 不阻止默认行为,允许插入换行符\r\n } else {\r\n // 阻止默认的换行行为\r\n event.preventDefault();\r\n // 如果文本框不为空且不处于禁用状态,则发送消息\r\n if (this.textAnswer.trim() && !this.isSubmittingText && !this.isLoading &&\r\n !this.currentStreamingMessage && !this.waitingToRecord && !this.isPlayingAudio) {\r\n this.submitTextAnswer();\r\n }\r\n }\r\n }\r\n };\r\n\r\n // 修改提交文本回答的方法\r\n private submitTextAnswer = async () => {\r\n if (!this.textAnswer.trim() || this.isSubmittingText) {\r\n return;\r\n }\r\n\r\n this.isSubmittingText = true;\r\n\r\n try {\r\n // 保存当前输入内容\r\n const textToSend = this.textAnswer;\r\n \r\n // 立即清空文本输入\r\n this.textAnswer = '';\r\n \r\n // 发送用户输入的文本作为查询\r\n await this.sendMessageToAPI(textToSend);\r\n } catch (error) {\r\n console.error('提交文本回答失败:', error);\r\n alert('提交回答失败,请重试');\r\n } finally {\r\n this.isSubmittingText = false;\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 const renderVideoPreview = () => (\r\n <div class=\"video-preview\">\r\n <video\r\n autoPlay\r\n playsInline\r\n muted\r\n style={{ transform: 'scaleX(-1)' }}\r\n ref={(el) => {\r\n if (el && this.recordingStream && !this.videoRef) {\r\n this.videoRef = el;\r\n // 不在这里设置srcObject,而是使用setupVideoPreview方法\r\n }\r\n }}\r\n ></video>\r\n <div class={{\r\n 'recording-status': true,\r\n 'warning': this.showCountdownWarning\r\n }}>\r\n <span class=\"recording-dot\"></span>\r\n <span>\r\n 录制中 {Math.floor(this.recordingTimeLeft / 60)}:{(this.recordingTimeLeft % 60).toString().padStart(2, '0')}\r\n {this.showCountdownWarning && ` (即将自动完成)`}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n\r\n // 渲染占位符状态信息\r\n const renderPlaceholderStatus = () => {\r\n // 正在播放音频\r\n if (this.isPlayingAudio) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>正在播放问题,请听完后准备回答...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在上传视频\r\n if (this.isUploadingVideo) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>正在上传视频,请稍候...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在加载或等待AI回复\r\n if (this.isLoading || this.currentStreamingMessage) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>请等待题目...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 等待开始录制\r\n if (this.waitingToRecord) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>请准备好,{this.waitingTimeLeft}秒后将开始录制您的回答...</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 添加默认状态\r\n return (\r\n <div class=\"placeholder-status default-status\">\r\n <p>准备中...</p>\r\n </div>\r\n );\r\n };\r\n\r\n // 修改文本输入区域渲染函数\r\n const renderTextInputArea = () => (\r\n <div class=\"text-input-area\">\r\n <textarea\r\n class=\"text-answer-input\"\r\n placeholder=\"请输入您的回答...(按回车发送,Ctrl+回车换行)\"\r\n value={this.textAnswer}\r\n onInput={this.handleTextInputChange}\r\n onKeyDown={this.handleKeyDown}\r\n disabled={this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio}\r\n ></textarea>\r\n <div class=\"input-toolbar\">\r\n <div class=\"toolbar-actions\">\r\n {/* <button class=\"toolbar-button\" title=\"表情\" disabled>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-5-6c.78 2.34 2.72 4 5 4s4.22-1.66 5-4H7zm1.5-5a1.5 1.5 0 100 3 1.5 1.5 0 000-3zm7 0a1.5 1.5 0 100 3 1.5 1.5 0 000-3z\" />\r\n </svg>\r\n </button>\r\n <button class=\"toolbar-button\" title=\"图片\" disabled>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86l-3 3.87L9 13.14 6 17h12l-3.86-5.14z\" />\r\n </svg>\r\n </button> */}\r\n </div>\r\n <button\r\n class={{\r\n 'submit-text-button': true,\r\n 'disabled': !this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio\r\n }}\r\n disabled={!this.textAnswer.trim() || this.isSubmittingText || this.isLoading || !!this.currentStreamingMessage || this.waitingToRecord || this.isPlayingAudio}\r\n onClick={this.submitTextAnswer}\r\n >\r\n {this.isSubmittingText ? '发送中...' : '发送'}\r\n </button>\r\n </div>\r\n </div>\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 <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div style={{ height: '100%' }}>\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 <div>\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 </div>\r\n )}\r\n </div>\r\n\r\n <div class=\"recording-section\">\r\n <div class=\"recording-container\">\r\n {\r\n this.interviewMode === 'text' && (\r\n renderTextInputArea()\r\n )\r\n }\r\n {this.interviewMode === 'video' && (\r\n <div style={{ width: '100%', display: 'flex', flexWrap: 'wrap', justifyContent: 'center' }}>\r\n <div class=\"video-area\">\r\n {this.showRecordingUI ? (\r\n renderVideoPreview()\r\n ) : (\r\n <div class=\"video-preview placeholder\">\r\n {renderPlaceholderStatus()}\r\n </div>\r\n )}\r\n <div class=\"progress-container\">\r\n <div class=\"progress-bar-container\">\r\n <div\r\n class=\"progress-bar\"\r\n style={{\r\n width: `${Math.max(0, this.currentQuestionNumber - 1) / this.totalQuestions * 100}%`\r\n }}\r\n ></div>\r\n </div>\r\n <div class=\"progress-text\">\r\n 已完成{Math.max(0, this.currentQuestionNumber - 1)}/{this.totalQuestions}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"recording-controls\">\r\n {this.showRecordingUI ? (\r\n <button\r\n class=\"stop-recording-button\"\r\n onClick={() => this.stopRecording()}\r\n >\r\n 完成本题回答\r\n </button>\r\n ) : (\r\n <div class=\"waiting-message\">\r\n {(() => {\r\n // 显示播放按钮(当不自动播放且有音频URL时)\r\n if (!this.enableVoice && this.audioUrl && !this.isPlayingAudio) {\r\n return (\r\n <div class=\"play-audio-container\" onClick={this.handlePlayAudio}>\r\n <p>\r\n <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"currentColor\" style={{ verticalAlign: 'middle', marginRight: '8px' }}>\r\n <path d=\"M8 5v14l11-7z\" />\r\n </svg>\r\n <span style={{ verticalAlign: 'middle' }}>播放题目</span>\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // 其他状态下显示禁用的\"完成回答\"按钮\r\n return (\r\n <button class=\"stop-recording-button disabled\" disabled>\r\n 完成回答\r\n </button>\r\n );\r\n })()}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}","/**\n * marked v9.1.6 - a markdown parser\n * Copyright (c) 2011-2023, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n/**\n * Gets the original marked default options.\n */\nfunction _getDefaults() {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null\n };\n}\nlet _defaults = _getDefaults();\nfunction changeDefaults(newDefaults) {\n _defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nconst escapeReplacements = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape(html, encode) {\n if (encode) {\n if (escapeTest.test(html)) {\n return html.replace(escapeReplace, getEscapeReplacement);\n }\n }\n else {\n if (escapeTestNoEncode.test(html)) {\n return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n return html;\n}\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\nfunction unescape(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon')\n return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\nconst caret = /(^|[^\\[])\\^/g;\nfunction edit(regex, opt) {\n regex = typeof regex === 'string' ? regex : regex.source;\n opt = opt || '';\n const obj = {\n replace: (name, val) => {\n val = typeof val === 'object' && 'source' in val ? val.source : val;\n val = val.replace(caret, '$1');\n regex = regex.replace(name, val);\n return obj;\n },\n getRegex: () => {\n return new RegExp(regex, opt);\n }\n };\n return obj;\n}\nfunction cleanUrl(href) {\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n }\n catch (e) {\n return null;\n }\n return href;\n}\nconst noopTest = { exec: () => null };\nfunction splitCells(tableRow, count) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\')\n escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n }\n else {\n // add space before unescaped |\n return ' |';\n }\n }), cells = row.split(/ \\|/);\n let i = 0;\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells[cells.length - 1].trim()) {\n cells.pop();\n }\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n }\n else {\n while (cells.length < count)\n cells.push('');\n }\n }\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n }\n return cells;\n}\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n }\n else if (currChar !== c && invert) {\n suffLen++;\n }\n else {\n break;\n }\n }\n return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n }\n else if (str[i] === b[0]) {\n level++;\n }\n else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n const href = link.href;\n const title = link.title ? escape(link.title) : null;\n const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n if (cap[0].charAt(0) !== '!') {\n lexer.state.inLink = true;\n const token = {\n type: 'link',\n raw,\n href,\n title,\n text,\n tokens: lexer.inlineTokens(text)\n };\n lexer.state.inLink = false;\n return token;\n }\n return {\n type: 'image',\n raw,\n href,\n title,\n text: escape(text)\n };\n}\nfunction indentCodeCompensation(raw, text) {\n const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n if (matchIndentToCode === null) {\n return text;\n }\n const indentToCode = matchIndentToCode[1];\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(/^\\s+/);\n if (matchIndentInNode === null) {\n return node;\n }\n const [indentInNode] = matchIndentInNode;\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n return node;\n })\n .join('\\n');\n}\n/**\n * Tokenizer\n */\nclass _Tokenizer {\n options;\n // TODO: Fix this rules type\n rules;\n lexer;\n constructor(options) {\n this.options = options || _defaults;\n }\n space(src) {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0]\n };\n }\n }\n code(src) {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(/^ {1,4}/gm, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(text, '\\n')\n : text\n };\n }\n }\n fences(src) {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '');\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, '$1') : cap[2],\n text\n };\n }\n }\n heading(src) {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n // remove trailing #s\n if (/#$/.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n }\n else if (!trimmed || / $/.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text)\n };\n }\n }\n hr(src) {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: cap[0]\n };\n }\n }\n blockquote(src) {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n const text = rtrim(cap[0].replace(/^ *>[ \\t]?/gm, ''), '\\n');\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n const tokens = this.lexer.blockTokens(text);\n this.lexer.state.top = top;\n return {\n type: 'blockquote',\n raw: cap[0],\n tokens,\n text\n };\n }\n }\n list(src) {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n const list = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: []\n };\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n // Get next list item\n const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n let raw = '';\n let itemContents = '';\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n raw = cap[0];\n src = src.substring(raw.length);\n let line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, (t) => ' '.repeat(3 * t.length));\n let nextLine = src.split('\\n', 1)[0];\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n }\n else {\n indent = cap[2].search(/[^ ]/); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n let blankLine = false;\n if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n if (!endEarly) {\n const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`);\n const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n nextLine = rawLine;\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' ');\n }\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n // Horizontal rule found\n if (hrRegex.test(src)) {\n break;\n }\n if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLine.slice(indent);\n }\n else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n // paragraph continuation unless last line was a different block level element\n if (line.search(/[^ ]/) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n itemContents += '\\n' + nextLine;\n }\n if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n blankLine = true;\n }\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLine.slice(indent);\n }\n }\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n }\n else if (/\\n *\\n *$/.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n let istask = null;\n let ischecked;\n // Check for task list items\n if (this.options.gfm) {\n istask = /^\\[[ xX]\\] /.exec(itemContents);\n if (istask) {\n ischecked = istask[0] !== '[ ] ';\n itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n }\n }\n list.items.push({\n type: 'list_item',\n raw,\n task: !!istask,\n checked: ischecked,\n loose: false,\n text: itemContents,\n tokens: []\n });\n list.raw += raw;\n }\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n list.items[list.items.length - 1].raw = raw.trimEnd();\n list.items[list.items.length - 1].text = itemContents.trimEnd();\n list.raw = list.raw.trimEnd();\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (let i = 0; i < list.items.length; i++) {\n this.lexer.state.top = false;\n list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n if (!list.loose) {\n // Check if list should be loose\n const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\\n.*\\n/.test(t.raw));\n list.loose = hasMultipleLineBreaks;\n }\n }\n // Set all items to loose if list is loose\n if (list.loose) {\n for (let i = 0; i < list.items.length; i++) {\n list.items[i].loose = true;\n }\n }\n return list;\n }\n }\n html(src) {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token = {\n type: 'html',\n block: true,\n raw: cap[0],\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: cap[0]\n };\n return token;\n }\n }\n def(src) {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: cap[0],\n href,\n title\n };\n }\n }\n table(src) {\n const cap = this.rules.block.table.exec(src);\n if (cap) {\n if (!/[:|]/.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n const item = {\n type: 'table',\n raw: cap[0],\n header: splitCells(cap[1]).map(c => {\n return { text: c, tokens: [] };\n }),\n align: cap[2].replace(/^\\||\\| *$/g, '').split('|'),\n rows: cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : []\n };\n if (item.header.length === item.align.length) {\n let l = item.align.length;\n let i, j, k, row;\n for (i = 0; i < l; i++) {\n const align = item.align[i];\n if (align) {\n if (/^ *-+: *$/.test(align)) {\n item.align[i] = 'right';\n }\n else if (/^ *:-+: *$/.test(align)) {\n item.align[i] = 'center';\n }\n else if (/^ *:-+ *$/.test(align)) {\n item.align[i] = 'left';\n }\n else {\n item.align[i] = null;\n }\n }\n }\n l = item.rows.length;\n for (i = 0; i < l; i++) {\n item.rows[i] = splitCells(item.rows[i], item.header.length).map(c => {\n return { text: c, tokens: [] };\n });\n }\n // parse child tokens inside headers and cells\n // header child tokens\n l = item.header.length;\n for (j = 0; j < l; j++) {\n item.header[j].tokens = this.lexer.inline(item.header[j].text);\n }\n // cell child tokens\n l = item.rows.length;\n for (j = 0; j < l; j++) {\n row = item.rows[j];\n for (k = 0; k < row.length; k++) {\n row[k].tokens = this.lexer.inline(row[k].text);\n }\n }\n return item;\n }\n }\n }\n lheading(src) {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: this.lexer.inline(cap[1])\n };\n }\n }\n paragraph(src) {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text)\n };\n }\n }\n text(src) {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0])\n };\n }\n }\n escape(src) {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: escape(cap[1])\n };\n }\n }\n tag(src) {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n this.lexer.state.inLink = true;\n }\n else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n }\n else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0]\n };\n }\n }\n link(src) {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(/>$/.test(trimmedUrl))) {\n return;\n }\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n }\n else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n if (link) {\n href = link[1];\n title = link[3];\n }\n }\n else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n href = href.trim();\n if (/^</.test(href)) {\n if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n }\n else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline._escapes, '$1') : href,\n title: title ? title.replace(this.rules.inline._escapes, '$1') : title\n }, cap[0], this.lexer);\n }\n }\n reflink(src, links) {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n let link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n link = links[link.toLowerCase()];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text\n };\n }\n return outputLink(cap, link, cap[0], this.lexer);\n }\n }\n emStrong(src, maskedSrc, prevChar = '') {\n let match = this.rules.inline.emStrong.lDelim.exec(src);\n if (!match)\n return;\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u))\n return;\n const nextChar = match[1] || match[2] || '';\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;\n endReg.lastIndex = 0;\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n if (!rDelim)\n continue; // skip single * in __abc*abc__\n rLength = [...rDelim].length;\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n }\n else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n delimTotal -= rLength;\n if (delimTotal > 0)\n continue; // Haven't found enough closing delimiters\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n }\n }\n codespan(src) {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(/\\n/g, ' ');\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n text = escape(text, true);\n return {\n type: 'codespan',\n raw: cap[0],\n text\n };\n }\n }\n br(src) {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0]\n };\n }\n }\n del(src) {\n const cap = this.rules.inline.del.exec(src);\n if (cap) {\n return {\n type: 'del',\n raw: cap[0],\n text: cap[2],\n tokens: this.lexer.inlineTokens(cap[2])\n };\n }\n }\n autolink(src) {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = escape(cap[1]);\n href = 'mailto:' + text;\n }\n else {\n text = escape(cap[1]);\n href = text;\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n url(src) {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = escape(cap[0]);\n href = 'mailto:' + text;\n }\n else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];\n } while (prevCapZero !== cap[0]);\n text = escape(cap[0]);\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n }\n else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n inlineText(src) {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n let text;\n if (this.lexer.state.inRawBlock) {\n text = cap[0];\n }\n else {\n text = escape(cap[0]);\n }\n return {\n type: 'text',\n raw: cap[0],\n text\n };\n }\n }\n}\n\n/**\n * Block-Level Grammar\n */\n// Not all rules are defined in the object literal\n// @ts-expect-error\nconst block = {\n newline: /^(?: *(?:\\n|$))+/,\n code: /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,\n fences: /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,\n hr: /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,\n heading: /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,\n blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n list: /^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/,\n html: '^ {0,3}(?:' // optional indentation\n + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n + ')',\n def: /^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/,\n table: noopTest,\n lheading: /^(?!bull )((?:.|\\n(?!\\s*?\\n|bull ))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n // regex template, placeholders will be replaced according to different paragraph\n // interruption rules of commonmark and the original markdown spec:\n _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,\n text: /^[^\\n]+/\n};\nblock._label = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def)\n .replace('label', block._label)\n .replace('title', block._title)\n .getRegex();\nblock.bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nblock.listItemStart = edit(/^( *)(bull) */)\n .replace('bull', block.bullet)\n .getRegex();\nblock.list = edit(block.list)\n .replace(/bull/g, block.bullet)\n .replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))')\n .replace('def', '\\\\n+(?=' + block.def.source + ')')\n .getRegex();\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'\n + '|track|ul';\nblock._comment = /<!--(?!-?>)[\\s\\S]*?(?:-->|$)/;\nblock.html = edit(block.html, 'i')\n .replace('comment', block._comment)\n .replace('tag', block._tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\nblock.lheading = edit(block.lheading)\n .replace(/bull/g, block.bullet) // lists can interrupt\n .getRegex();\nblock.paragraph = edit(block._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\nblock.blockquote = edit(block.blockquote)\n .replace('paragraph', block.paragraph)\n .getRegex();\n/**\n * Normal Block Grammar\n */\nblock.normal = { ...block };\n/**\n * GFM Block Grammar\n */\nblock.gfm = {\n ...block.normal,\n table: '^ *([^\\\\n ].*)\\\\n' // Header\n + ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)' // Cells\n};\nblock.gfm.table = edit(block.gfm.table)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', ' {4}[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\nblock.gfm.paragraph = edit(block._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('table', block.gfm.table) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\nblock.pedantic = {\n ...block.normal,\n html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', block._comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest,\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(block.normal._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', block.lheading)\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .getRegex()\n};\n/**\n * Inline-Level Grammar\n */\n// Not all rules are defined in the object literal\n// @ts-expect-error\nconst inline = {\n escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n url: noopTest,\n tag: '^comment'\n + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>',\n link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n reflink: /^!?\\[(label)\\]\\[(ref)\\]/,\n nolink: /^!?\\[(ref)\\](?:\\[\\])?/,\n reflinkSearch: 'reflink|nolink(?!\\\\()',\n emStrong: {\n lDelim: /^(?:\\*+(?:((?!\\*)[punct])|[^\\s*]))|^_+(?:((?!_)[punct])|([^\\s_]))/,\n // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right.\n // | Skip orphan inside strong | Consume to delim | (1) #*** | (2) a***#, a*** | (3) #***a, ***a | (4) ***# | (5) #***# | (6) a***a\n rDelimAst: /^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])/,\n rDelimUnd: /^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])/ // ^- Not allowed for _\n },\n code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n del: noopTest,\n text: /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,\n punctuation: /^((?![*_])[\\spunctuation])/\n};\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\ninline._punctuation = '\\\\p{P}$+<=>`^|~';\ninline.punctuation = edit(inline.punctuation, 'u').replace(/punctuation/g, inline._punctuation).getRegex();\n// sequences em should skip over [title](link), `code`, <html>\ninline.blockSkip = /\\[[^[\\]]*?\\]\\([^\\(\\)]*?\\)|`[^`]*?`|<[^<>]*?>/g;\ninline.anyPunctuation = /\\\\[punct]/g;\ninline._escapes = /\\\\([punct])/g;\ninline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex();\ninline.emStrong.lDelim = edit(inline.emStrong.lDelim, 'u')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\ninline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'gu')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\ninline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'gu')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\ninline.anyPunctuation = edit(inline.anyPunctuation, 'gu')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\ninline._escapes = edit(inline._escapes, 'gu')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink)\n .replace('scheme', inline._scheme)\n .replace('email', inline._email)\n .getRegex();\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\ninline.tag = edit(inline.tag)\n .replace('comment', inline._comment)\n .replace('attribute', inline._attribute)\n .getRegex();\ninline._label = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\ninline.link = edit(inline.link)\n .replace('label', inline._label)\n .replace('href', inline._href)\n .replace('title', inline._title)\n .getRegex();\ninline.reflink = edit(inline.reflink)\n .replace('label', inline._label)\n .replace('ref', block._label)\n .getRegex();\ninline.nolink = edit(inline.nolink)\n .replace('ref', block._label)\n .getRegex();\ninline.reflinkSearch = edit(inline.reflinkSearch, 'g')\n .replace('reflink', inline.reflink)\n .replace('nolink', inline.nolink)\n .getRegex();\n/**\n * Normal Inline Grammar\n */\ninline.normal = { ...inline };\n/**\n * Pedantic Inline Grammar\n */\ninline.pedantic = {\n ...inline.normal,\n strong: {\n start: /^__|\\*\\*/,\n middle: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n endAst: /\\*\\*(?!\\*)/g,\n endUnd: /__(?!_)/g\n },\n em: {\n start: /^_|\\*/,\n middle: /^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,\n endAst: /\\*(?!\\*)/g,\n endUnd: /_(?!_)/g\n },\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', inline._label)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', inline._label)\n .getRegex()\n};\n/**\n * GFM Inline Grammar\n */\ninline.gfm = {\n ...inline.normal,\n escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n};\ninline.gfm.url = edit(inline.gfm.url, 'i')\n .replace('email', inline.gfm._extended_email)\n .getRegex();\n/**\n * GFM + Line Breaks Inline Grammar\n */\ninline.breaks = {\n ...inline.gfm,\n br: edit(inline.br).replace('{2,}', '*').getRegex(),\n text: edit(inline.gfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex()\n};\n\n/**\n * Block Lexer\n */\nclass _Lexer {\n tokens;\n options;\n state;\n tokenizer;\n inlineQueue;\n constructor(options) {\n // TokenList cannot be created in one go\n // @ts-expect-error\n this.tokens = [];\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true\n };\n const rules = {\n block: block.normal,\n inline: inline.normal\n };\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n }\n else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n }\n else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline\n };\n }\n /**\n * Static Lex Method\n */\n static lex(src, options) {\n const lexer = new _Lexer(options);\n return lexer.lex(src);\n }\n /**\n * Static Lex Inline Method\n */\n static lexInline(src, options) {\n const lexer = new _Lexer(options);\n return lexer.inlineTokens(src);\n }\n /**\n * Preprocessing\n */\n lex(src) {\n src = src\n .replace(/\\r\\n|\\r/g, '\\n');\n this.blockTokens(src, this.tokens);\n let next;\n while (next = this.inlineQueue.shift()) {\n this.inlineTokens(next.src, next.tokens);\n }\n return this.tokens;\n }\n blockTokens(src, tokens = []) {\n if (this.options.pedantic) {\n src = src.replace(/\\t/g, ' ').replace(/^ +$/gm, '');\n }\n else {\n src = src.replace(/^( *)(\\t+)/gm, (_, leading, tabs) => {\n return leading + ' '.repeat(tabs.length);\n });\n }\n let token;\n let lastToken;\n let cutSrc;\n let lastParagraphClipped;\n while (src) {\n if (this.options.extensions\n && this.options.extensions.block\n && this.options.extensions.block.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n if (token.raw.length === 1 && tokens.length > 0) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n tokens[tokens.length - 1].raw += '\\n';\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n // An indented code block cannot interrupt a paragraph.\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title\n };\n }\n continue;\n }\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n lastToken = tokens[tokens.length - 1];\n if (lastParagraphClipped && lastToken.type === 'paragraph') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n lastParagraphClipped = (cutSrc.length !== src.length);\n src = src.substring(token.raw.length);\n continue;\n }\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n this.state.top = true;\n return tokens;\n }\n inline(src, tokens = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n /**\n * Lexing/Compiling\n */\n inlineTokens(src, tokens = []) {\n let token, lastToken, cutSrc;\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match;\n let keepPrevChar, prevChar;\n // Mask out reflinks\n if (this.tokens.links) {\n const links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n // Mask out other blocks\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n // Mask out escaped characters\n while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n }\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n // extensions\n if (this.options.extensions\n && this.options.extensions.inline\n && this.options.extensions.inline.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // del (gfm)\n if (token = this.tokenizer.del(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n }\n else {\n tokens.push(token);\n }\n continue;\n }\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n return tokens;\n }\n}\n\n/**\n * Renderer\n */\nclass _Renderer {\n options;\n constructor(options) {\n this.options = options || _defaults;\n }\n code(code, infostring, escaped) {\n const lang = (infostring || '').match(/^\\S*/)?.[0];\n code = code.replace(/\\n$/, '') + '\\n';\n if (!lang) {\n return '<pre><code>'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n';\n }\n return '<pre><code class=\"language-'\n + escape(lang)\n + '\">'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n';\n }\n blockquote(quote) {\n return `<blockquote>\\n${quote}</blockquote>\\n`;\n }\n html(html, block) {\n return html;\n }\n heading(text, level, raw) {\n // ignore IDs\n return `<h${level}>${text}</h${level}>\\n`;\n }\n hr() {\n return '<hr>\\n';\n }\n list(body, ordered, start) {\n const type = ordered ? 'ol' : 'ul';\n const startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n }\n listitem(text, task, checked) {\n return `<li>${text}</li>\\n`;\n }\n checkbox(checked) {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\">';\n }\n paragraph(text) {\n return `<p>${text}</p>\\n`;\n }\n table(header, body) {\n if (body)\n body = `<tbody>${body}</tbody>`;\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n';\n }\n tablerow(content) {\n return `<tr>\\n${content}</tr>\\n`;\n }\n tablecell(content, flags) {\n const type = flags.header ? 'th' : 'td';\n const tag = flags.align\n ? `<${type} align=\"${flags.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n`;\n }\n /**\n * span level renderer\n */\n strong(text) {\n return `<strong>${text}</strong>`;\n }\n em(text) {\n return `<em>${text}</em>`;\n }\n codespan(text) {\n return `<code>${text}</code>`;\n }\n br() {\n return '<br>';\n }\n del(text) {\n return `<del>${text}</del>`;\n }\n link(href, title, text) {\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text;\n }\n href = cleanHref;\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + title + '\"';\n }\n out += '>' + text + '</a>';\n return out;\n }\n image(href, title, text) {\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text;\n }\n href = cleanHref;\n let out = `<img src=\"${href}\" alt=\"${text}\"`;\n if (title) {\n out += ` title=\"${title}\"`;\n }\n out += '>';\n return out;\n }\n text(text) {\n return text;\n }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass _TextRenderer {\n // no need for block level renderers\n strong(text) {\n return text;\n }\n em(text) {\n return text;\n }\n codespan(text) {\n return text;\n }\n del(text) {\n return text;\n }\n html(text) {\n return text;\n }\n text(text) {\n return text;\n }\n link(href, title, text) {\n return '' + text;\n }\n image(href, title, text) {\n return '' + text;\n }\n br() {\n return '';\n }\n}\n\n/**\n * Parsing & Compiling\n */\nclass _Parser {\n options;\n renderer;\n textRenderer;\n constructor(options) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.textRenderer = new _TextRenderer();\n }\n /**\n * Static Parse Method\n */\n static parse(tokens, options) {\n const parser = new _Parser(options);\n return parser.parse(tokens);\n }\n /**\n * Static Parse Inline Method\n */\n static parseInline(tokens, options) {\n const parser = new _Parser(options);\n return parser.parseInline(tokens);\n }\n /**\n * Parse Loop\n */\n parse(tokens, top = true) {\n let out = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n const genericToken = token;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n switch (token.type) {\n case 'space': {\n continue;\n }\n case 'hr': {\n out += this.renderer.hr();\n continue;\n }\n case 'heading': {\n const headingToken = token;\n out += this.renderer.heading(this.parseInline(headingToken.tokens), headingToken.depth, unescape(this.parseInline(headingToken.tokens, this.textRenderer)));\n continue;\n }\n case 'code': {\n const codeToken = token;\n out += this.renderer.code(codeToken.text, codeToken.lang, !!codeToken.escaped);\n continue;\n }\n case 'table': {\n const tableToken = token;\n let header = '';\n // header\n let cell = '';\n for (let j = 0; j < tableToken.header.length; j++) {\n cell += this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens), { header: true, align: tableToken.align[j] });\n }\n header += this.renderer.tablerow(cell);\n let body = '';\n for (let j = 0; j < tableToken.rows.length; j++) {\n const row = tableToken.rows[j];\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { header: false, align: tableToken.align[k] });\n }\n body += this.renderer.tablerow(cell);\n }\n out += this.renderer.table(header, body);\n continue;\n }\n case 'blockquote': {\n const blockquoteToken = token;\n const body = this.parse(blockquoteToken.tokens);\n out += this.renderer.blockquote(body);\n continue;\n }\n case 'list': {\n const listToken = token;\n const ordered = listToken.ordered;\n const start = listToken.start;\n const loose = listToken.loose;\n let body = '';\n for (let j = 0; j < listToken.items.length; j++) {\n const item = listToken.items[j];\n const checked = item.checked;\n const task = item.task;\n let itemBody = '';\n if (item.task) {\n const checkbox = this.renderer.checkbox(!!checked);\n if (loose) {\n if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n }\n }\n else {\n item.tokens.unshift({\n type: 'text',\n text: checkbox + ' '\n });\n }\n }\n else {\n itemBody += checkbox + ' ';\n }\n }\n itemBody += this.parse(item.tokens, loose);\n body += this.renderer.listitem(itemBody, task, !!checked);\n }\n out += this.renderer.list(body, ordered, start);\n continue;\n }\n case 'html': {\n const htmlToken = token;\n out += this.renderer.html(htmlToken.text, htmlToken.block);\n continue;\n }\n case 'paragraph': {\n const paragraphToken = token;\n out += this.renderer.paragraph(this.parseInline(paragraphToken.tokens));\n continue;\n }\n case 'text': {\n let textToken = token;\n let body = textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text;\n while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {\n textToken = tokens[++i];\n body += '\\n' + (textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text);\n }\n out += top ? this.renderer.paragraph(body) : body;\n continue;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '';\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens, renderer) {\n renderer = renderer || this.renderer;\n let out = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n const ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n switch (token.type) {\n case 'escape': {\n const escapeToken = token;\n out += renderer.text(escapeToken.text);\n break;\n }\n case 'html': {\n const tagToken = token;\n out += renderer.html(tagToken.text);\n break;\n }\n case 'link': {\n const linkToken = token;\n out += renderer.link(linkToken.href, linkToken.title, this.parseInline(linkToken.tokens, renderer));\n break;\n }\n case 'image': {\n const imageToken = token;\n out += renderer.image(imageToken.href, imageToken.title, imageToken.text);\n break;\n }\n case 'strong': {\n const strongToken = token;\n out += renderer.strong(this.parseInline(strongToken.tokens, renderer));\n break;\n }\n case 'em': {\n const emToken = token;\n out += renderer.em(this.parseInline(emToken.tokens, renderer));\n break;\n }\n case 'codespan': {\n const codespanToken = token;\n out += renderer.codespan(codespanToken.text);\n break;\n }\n case 'br': {\n out += renderer.br();\n break;\n }\n case 'del': {\n const delToken = token;\n out += renderer.del(this.parseInline(delToken.tokens, renderer));\n break;\n }\n case 'text': {\n const textToken = token;\n out += renderer.text(textToken.text);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '';\n }\n else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n}\n\nclass _Hooks {\n options;\n constructor(options) {\n this.options = options || _defaults;\n }\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess'\n ]);\n /**\n * Process markdown before marked\n */\n preprocess(markdown) {\n return markdown;\n }\n /**\n * Process HTML after marked is finished\n */\n postprocess(html) {\n return html;\n }\n}\n\nclass Marked {\n defaults = _getDefaults();\n options = this.setOptions;\n parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse);\n parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline);\n Parser = _Parser;\n Renderer = _Renderer;\n TextRenderer = _TextRenderer;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer;\n Hooks = _Hooks;\n constructor(...args) {\n this.use(...args);\n }\n /**\n * Run callback for every token\n */\n walkTokens(tokens, callback) {\n let values = [];\n for (const token of tokens) {\n values = values.concat(callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token;\n for (const cell of tableToken.header) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token;\n values = values.concat(this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n values = values.concat(this.walkTokens(genericToken[childTokens], callback));\n });\n }\n else if (genericToken.tokens) {\n values = values.concat(this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n use(...args) {\n const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack };\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function (...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n }\n else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n }\n else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n }\n else {\n extensions.startBlock = [ext.start];\n }\n }\n else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n }\n else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer(this.defaults);\n for (const prop in pack.renderer) {\n const rendererFunc = pack.renderer[prop];\n const rendererKey = prop;\n const prevRenderer = renderer[rendererKey];\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererKey] = (...args) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return ret || '';\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);\n for (const prop in pack.tokenizer) {\n const tokenizerFunc = pack.tokenizer[prop];\n const tokenizerKey = prop;\n const prevTokenizer = tokenizer[tokenizerKey];\n // Replace tokenizer with func to run extension, but fall back if false\n tokenizer[tokenizerKey] = (...args) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks();\n for (const prop in pack.hooks) {\n const hooksFunc = pack.hooks[prop];\n const hooksKey = prop;\n const prevHook = hooks[hooksKey];\n if (_Hooks.passThroughHooks.has(prop)) {\n hooks[hooksKey] = (arg) => {\n if (this.defaults.async) {\n return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {\n return prevHook.call(hooks, ret);\n });\n }\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n }\n else {\n hooks[hooksKey] = (...args) => {\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function (token) {\n let values = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n values = values.concat(walkTokens.call(this, token));\n }\n return values;\n };\n }\n this.defaults = { ...this.defaults, ...opts };\n });\n return this;\n }\n setOptions(opt) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n lexer(src, options) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n parser(tokens, options) {\n return _Parser.parse(tokens, options ?? this.defaults);\n }\n #parseMarkdown(lexer, parser) {\n return (src, options) => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n // Show warning if an extension set async to true but the parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n if (!opt.silent) {\n console.warn('marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored.');\n }\n opt.async = true;\n }\n const throwError = this.#onError(!!opt.silent, !!opt.async);\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n if (opt.hooks) {\n opt.hooks.options = opt;\n }\n if (opt.async) {\n return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n .then(src => lexer(src, opt))\n .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n .then(tokens => parser(tokens, opt))\n .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n .catch(throwError);\n }\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src);\n }\n const tokens = lexer(src, opt);\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n }\n catch (e) {\n return throwError(e);\n }\n };\n }\n #onError(silent, async) {\n return (e) => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escape(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n\nconst markedInstance = new Marked();\nfunction marked(src, opt) {\n return markedInstance.parse(src, opt);\n}\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n marked.setOptions = function (options) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n };\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\nmarked.defaults = _defaults;\n/**\n * Use Extension\n */\nmarked.use = function (...args) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n/**\n * Run callback for every token\n */\nmarked.walkTokens = function (tokens, callback) {\n return markedInstance.walkTokens(tokens, callback);\n};\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = _Parser.parse;\nconst lexer = _Lexer.lex;\n\nexport { _Hooks as Hooks, _Lexer as Lexer, Marked, _Parser as Parser, _Renderer as Renderer, _TextRenderer as TextRenderer, _Tokenizer as Tokenizer, _defaults as defaults, _getDefaults as getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\n//# sourceMappingURL=marked.esm.js.map\n",":host {\r\n display: block;\r\n width: 100%;\r\n}\r\n\r\n.message-round {\r\n margin-bottom: 16px;\r\n width: 100%;\r\n}\r\n\r\n.user-message-container {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-end;\r\n margin-bottom: 8px;\r\n}\r\n\r\n.assistant-message-container {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n margin-bottom: 8px;\r\n}\r\n\r\n/* 添加消息气泡样式 */\r\n.message-bubble {\r\n padding: 7px 18px;\r\n max-width: 80%;\r\n position: relative;\r\n}\r\n\r\n/* 用户消息气泡样式 */\r\n.user-message {\r\n background-image: linear-gradient(100deg, #4A9FFF 0%, #1058FF 100%);\r\n font-weight: 600;\r\nfont-size: 14px;\r\ncolor: #FFFFFF;\r\n border-radius: 14px 0 14px 14px;\r\n}\r\n\r\n/* 助手消息气泡样式 */\r\n.assistant-message {\r\n background-color: #0000000f;\r\n border-radius: 0 14px 14px 14px;\r\n font-weight: 600;\r\n font-size: 14px;\r\n color: #00000099;\r\n}\r\n\r\n.message-time {\r\n font-size: 12px;\r\n color: #999;\r\n margin-top: 4px;\r\n}\r\n\r\n/* 用户消息时间样式 */\r\n.user-message-container .message-time {\r\n color: rgba(255, 255, 255, 0.7);\r\n}\r\n\r\n.loading-dots {\r\n display: flex;\r\n align-items: center;\r\n padding: 12px 16px;\r\n background-color: #f0f0f0;\r\n border-radius: 18px;\r\n border-top-left-radius: 4px;\r\n}\r\n\r\n.loading-dots span {\r\n width: 8px;\r\n height: 8px;\r\n margin: 0 3px;\r\n background-color: #999;\r\n border-radius: 50%;\r\n display: inline-block;\r\n animation: dot-pulse 1.5s infinite ease-in-out;\r\n}\r\n\r\n.loading-dots span:nth-child(2) {\r\n animation-delay: 0.2s;\r\n}\r\n\r\n.loading-dots span:nth-child(3) {\r\n animation-delay: 0.4s;\r\n}\r\n\r\n@keyframes dot-pulse {\r\n\r\n 0%,\r\n 80%,\r\n 100% {\r\n transform: scale(0.8);\r\n opacity: 0.5;\r\n }\r\n\r\n 40% {\r\n transform: scale(1.2);\r\n opacity: 1;\r\n }\r\n}\r\n\r\n.file-view {\r\n margin-top: 8px;\r\n padding: 8px;\r\n background-color: #f5f5f5;\r\n border-radius: 4px;\r\n font-size: 14px;\r\n word-break: break-all;\r\n}\r\n\r\n.input-view {\r\n margin-top: 8px;\r\n border: 1px solid #eee;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.input-label {\r\n padding: 4px 8px;\r\n background-color: #f5f5f5;\r\n font-size: 12px;\r\n font-weight: 500;\r\n}\r\n\r\n.input-value {\r\n padding: 8px;\r\n font-size: 14px;\r\n}\r\n\r\n.input-metadata {\r\n font-size: 0.875rem;\r\n margin-top: 4px;\r\n}\r\n\r\n.markdown-body {\r\n --base-size-4: 0.25rem;\r\n --base-size-8: 0.5rem;\r\n --base-size-16: 1rem;\r\n --base-size-24: 1.5rem;\r\n --base-size-40: 2.5rem;\r\n --base-text-weight-normal: 400;\r\n --base-text-weight-medium: 500;\r\n --base-text-weight-semibold: 600;\r\n --fontStack-monospace: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;\r\n --fgColor-accent: Highlight;\r\n}\r\n\r\n@media (prefers-color-scheme: dark) {\r\n\r\n .markdown-body,\r\n [data-theme=\"dark\"] {\r\n /* dark */\r\n color-scheme: dark;\r\n --focus-outlineColor: #1f6feb;\r\n --fgColor-default: #f0f6fc;\r\n --fgColor-muted: #9198a1;\r\n --fgColor-accent: #4493f8;\r\n --fgColor-success: #3fb950;\r\n --fgColor-attention: #d29922;\r\n --fgColor-danger: #f85149;\r\n --fgColor-done: #ab7df8;\r\n --bgColor-default: #0d1117;\r\n --bgColor-muted: #151b23;\r\n --bgColor-neutral-muted: #656c7633;\r\n --bgColor-attention-muted: #bb800926;\r\n --borderColor-default: #3d444d;\r\n --borderColor-muted: #3d444db3;\r\n --borderColor-neutral-muted: #3d444db3;\r\n --borderColor-accent-emphasis: #1f6feb;\r\n --borderColor-success-emphasis: #238636;\r\n --borderColor-attention-emphasis: #9e6a03;\r\n --borderColor-danger-emphasis: #da3633;\r\n --borderColor-done-emphasis: #8957e5;\r\n --color-prettylights-syntax-comment: #9198a1;\r\n --color-prettylights-syntax-constant: #79c0ff;\r\n --color-prettylights-syntax-constant-other-reference-link: #a5d6ff;\r\n --color-prettylights-syntax-entity: #d2a8ff;\r\n --color-prettylights-syntax-storage-modifier-import: #f0f6fc;\r\n --color-prettylights-syntax-entity-tag: #7ee787;\r\n --color-prettylights-syntax-keyword: #ff7b72;\r\n --color-prettylights-syntax-string: #a5d6ff;\r\n --color-prettylights-syntax-variable: #ffa657;\r\n --color-prettylights-syntax-brackethighlighter-unmatched: #f85149;\r\n --color-prettylights-syntax-brackethighlighter-angle: #9198a1;\r\n --color-prettylights-syntax-invalid-illegal-text: #f0f6fc;\r\n --color-prettylights-syntax-invalid-illegal-bg: #8e1519;\r\n --color-prettylights-syntax-carriage-return-text: #f0f6fc;\r\n --color-prettylights-syntax-carriage-return-bg: #b62324;\r\n --color-prettylights-syntax-string-regexp: #7ee787;\r\n --color-prettylights-syntax-markup-list: #f2cc60;\r\n --color-prettylights-syntax-markup-heading: #1f6feb;\r\n --color-prettylights-syntax-markup-italic: #f0f6fc;\r\n --color-prettylights-syntax-markup-bold: #f0f6fc;\r\n --color-prettylights-syntax-markup-deleted-text: #ffdcd7;\r\n --color-prettylights-syntax-markup-deleted-bg: #67060c;\r\n --color-prettylights-syntax-markup-inserted-text: #aff5b4;\r\n --color-prettylights-syntax-markup-inserted-bg: #033a16;\r\n --color-prettylights-syntax-markup-changed-text: #ffdfb6;\r\n --color-prettylights-syntax-markup-changed-bg: #5a1e02;\r\n --color-prettylights-syntax-markup-ignored-text: #f0f6fc;\r\n --color-prettylights-syntax-markup-ignored-bg: #1158c7;\r\n --color-prettylights-syntax-meta-diff-range: #d2a8ff;\r\n --color-prettylights-syntax-sublimelinter-gutter-mark: #3d444d;\r\n }\r\n}\r\n\r\n@media (prefers-color-scheme: light) {\r\n\r\n .markdown-body,\r\n [data-theme=\"light\"] {\r\n /* light */\r\n color-scheme: light;\r\n --focus-outlineColor: #0969da;\r\n --fgColor-default: #1f2328;\r\n --fgColor-muted: #59636e;\r\n --fgColor-accent: #0969da;\r\n --fgColor-success: #1a7f37;\r\n --fgColor-attention: #9a6700;\r\n --fgColor-danger: #d1242f;\r\n --fgColor-done: #8250df;\r\n --bgColor-default: #ffffff;\r\n --bgColor-muted: #f6f8fa;\r\n --bgColor-neutral-muted: #818b981f;\r\n --bgColor-attention-muted: #fff8c5;\r\n --borderColor-default: #d1d9e0;\r\n --borderColor-muted: #d1d9e0b3;\r\n --borderColor-neutral-muted: #d1d9e0b3;\r\n --borderColor-accent-emphasis: #0969da;\r\n --borderColor-success-emphasis: #1a7f37;\r\n --borderColor-attention-emphasis: #9a6700;\r\n --borderColor-danger-emphasis: #cf222e;\r\n --borderColor-done-emphasis: #8250df;\r\n --color-prettylights-syntax-comment: #59636e;\r\n --color-prettylights-syntax-constant: #0550ae;\r\n --color-prettylights-syntax-constant-other-reference-link: #0a3069;\r\n --color-prettylights-syntax-entity: #6639ba;\r\n --color-prettylights-syntax-storage-modifier-import: #1f2328;\r\n --color-prettylights-syntax-entity-tag: #0550ae;\r\n --color-prettylights-syntax-keyword: #cf222e;\r\n --color-prettylights-syntax-string: #0a3069;\r\n --color-prettylights-syntax-variable: #953800;\r\n --color-prettylights-syntax-brackethighlighter-unmatched: #82071e;\r\n --color-prettylights-syntax-brackethighlighter-angle: #59636e;\r\n --color-prettylights-syntax-invalid-illegal-text: #f6f8fa;\r\n --color-prettylights-syntax-invalid-illegal-bg: #82071e;\r\n --color-prettylights-syntax-carriage-return-text: #f6f8fa;\r\n --color-prettylights-syntax-carriage-return-bg: #cf222e;\r\n --color-prettylights-syntax-string-regexp: #116329;\r\n --color-prettylights-syntax-markup-list: #3b2300;\r\n --color-prettylights-syntax-markup-heading: #0550ae;\r\n --color-prettylights-syntax-markup-italic: #1f2328;\r\n --color-prettylights-syntax-markup-bold: #1f2328;\r\n --color-prettylights-syntax-markup-deleted-text: #82071e;\r\n --color-prettylights-syntax-markup-deleted-bg: #ffebe9;\r\n --color-prettylights-syntax-markup-inserted-text: #116329;\r\n --color-prettylights-syntax-markup-inserted-bg: #dafbe1;\r\n --color-prettylights-syntax-markup-changed-text: #953800;\r\n --color-prettylights-syntax-markup-changed-bg: #ffd8b5;\r\n --color-prettylights-syntax-markup-ignored-text: #d1d9e0;\r\n --color-prettylights-syntax-markup-ignored-bg: #0550ae;\r\n --color-prettylights-syntax-meta-diff-range: #8250df;\r\n --color-prettylights-syntax-sublimelinter-gutter-mark: #818b98;\r\n }\r\n}\r\n\r\n.markdown-body {\r\n -ms-text-size-adjust: 100%;\r\n -webkit-text-size-adjust: 100%;\r\n margin: 0;\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\r\n font-size: 16px;\r\n line-height: 1.5;\r\n word-wrap: break-word;\r\n}\r\n\r\n.markdown-body .octicon {\r\n display: inline-block;\r\n fill: currentColor;\r\n vertical-align: text-bottom;\r\n}\r\n\r\n.markdown-body h1:hover .anchor .octicon-link:before,\r\n.markdown-body h2:hover .anchor .octicon-link:before,\r\n.markdown-body h3:hover .anchor .octicon-link:before,\r\n.markdown-body h4:hover .anchor .octicon-link:before,\r\n.markdown-body h5:hover .anchor .octicon-link:before,\r\n.markdown-body h6:hover .anchor .octicon-link:before {\r\n width: 16px;\r\n height: 16px;\r\n content: ' ';\r\n display: inline-block;\r\n background-color: currentColor;\r\n -webkit-mask-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>\");\r\n mask-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>\");\r\n}\r\n\r\n.markdown-body details,\r\n.markdown-body figcaption,\r\n.markdown-body figure {\r\n display: block;\r\n}\r\n\r\n.markdown-body summary {\r\n display: list-item;\r\n}\r\n\r\n.markdown-body [hidden] {\r\n display: none !important;\r\n}\r\n\r\n.markdown-body a {\r\n background-color: transparent;\r\n color: var(--fgColor-accent);\r\n text-decoration: none;\r\n}\r\n\r\n.markdown-body abbr[title] {\r\n border-bottom: none;\r\n -webkit-text-decoration: underline dotted;\r\n text-decoration: underline dotted;\r\n}\r\n\r\n.markdown-body b,\r\n.markdown-body strong {\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n}\r\n\r\n.markdown-body dfn {\r\n font-style: italic;\r\n}\r\n\r\n.markdown-body h1 {\r\n margin: .67em 0;\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n padding-bottom: .3em;\r\n font-size: 1.5em;\r\n border-bottom: 1px solid var(--borderColor-muted);\r\n}\r\n\r\n.markdown-body mark {\r\n background-color: var(--bgColor-attention-muted);\r\n color: var(--fgColor-default);\r\n}\r\n\r\n.markdown-body small {\r\n font-size: 90%;\r\n}\r\n\r\n.markdown-body sub,\r\n.markdown-body sup {\r\n font-size: 75%;\r\n line-height: 0;\r\n position: relative;\r\n vertical-align: baseline;\r\n}\r\n\r\n.markdown-body sub {\r\n bottom: -0.25em;\r\n}\r\n\r\n.markdown-body sup {\r\n top: -0.5em;\r\n}\r\n\r\n.markdown-body img {\r\n border-style: none;\r\n max-width: 100%;\r\n box-sizing: content-box;\r\n}\r\n\r\n.markdown-body code,\r\n.markdown-body kbd,\r\n.markdown-body pre,\r\n.markdown-body samp {\r\n font-family: monospace;\r\n font-size: 1em;\r\n}\r\n\r\n.markdown-body figure {\r\n margin: 1em var(--base-size-40);\r\n}\r\n\r\n.markdown-body hr {\r\n box-sizing: content-box;\r\n overflow: hidden;\r\n background: transparent;\r\n border-bottom: 1px solid var(--borderColor-muted);\r\n height: .25em;\r\n padding: 0;\r\n margin: var(--base-size-24) 0;\r\n background-color: var(--borderColor-default);\r\n border: 0;\r\n}\r\n\r\n.markdown-body input {\r\n font: inherit;\r\n margin: 0;\r\n overflow: visible;\r\n font-family: inherit;\r\n font-size: inherit;\r\n line-height: inherit;\r\n}\r\n\r\n.markdown-body [type=button],\r\n.markdown-body [type=reset],\r\n.markdown-body [type=submit] {\r\n -webkit-appearance: button;\r\n appearance: button;\r\n}\r\n\r\n.markdown-body [type=checkbox],\r\n.markdown-body [type=radio] {\r\n box-sizing: border-box;\r\n padding: 0;\r\n}\r\n\r\n.markdown-body [type=number]::-webkit-inner-spin-button,\r\n.markdown-body [type=number]::-webkit-outer-spin-button {\r\n height: auto;\r\n}\r\n\r\n.markdown-body [type=search]::-webkit-search-cancel-button,\r\n.markdown-body [type=search]::-webkit-search-decoration {\r\n -webkit-appearance: none;\r\n appearance: none;\r\n}\r\n\r\n.markdown-body ::-webkit-input-placeholder {\r\n color: inherit;\r\n opacity: .54;\r\n}\r\n\r\n.markdown-body ::-webkit-file-upload-button {\r\n -webkit-appearance: button;\r\n appearance: button;\r\n font: inherit;\r\n}\r\n\r\n.markdown-body a:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.markdown-body ::placeholder {\r\n color: var(--fgColor-muted);\r\n opacity: 1;\r\n}\r\n\r\n.markdown-body hr::before {\r\n display: table;\r\n content: \"\";\r\n}\r\n\r\n.markdown-body hr::after {\r\n display: table;\r\n clear: both;\r\n content: \"\";\r\n}\r\n\r\n.markdown-body table {\r\n border-spacing: 0;\r\n border-collapse: collapse;\r\n display: block;\r\n width: max-content;\r\n max-width: 100%;\r\n overflow: auto;\r\n font-variant: tabular-nums;\r\n}\r\n\r\n.markdown-body td,\r\n.markdown-body th {\r\n padding: 0;\r\n}\r\n\r\n.markdown-body details summary {\r\n cursor: pointer;\r\n}\r\n\r\n.markdown-body a:focus,\r\n.markdown-body [role=button]:focus,\r\n.markdown-body input[type=radio]:focus,\r\n.markdown-body input[type=checkbox]:focus {\r\n outline: 2px solid var(--focus-outlineColor);\r\n outline-offset: -2px;\r\n box-shadow: none;\r\n}\r\n\r\n.markdown-body a:focus:not(:focus-visible),\r\n.markdown-body [role=button]:focus:not(:focus-visible),\r\n.markdown-body input[type=radio]:focus:not(:focus-visible),\r\n.markdown-body input[type=checkbox]:focus:not(:focus-visible) {\r\n outline: solid 1px transparent;\r\n}\r\n\r\n.markdown-body a:focus-visible,\r\n.markdown-body [role=button]:focus-visible,\r\n.markdown-body input[type=radio]:focus-visible,\r\n.markdown-body input[type=checkbox]:focus-visible {\r\n outline: 2px solid var(--focus-outlineColor);\r\n outline-offset: -2px;\r\n box-shadow: none;\r\n}\r\n\r\n.markdown-body a:not([class]):focus,\r\n.markdown-body a:not([class]):focus-visible,\r\n.markdown-body input[type=radio]:focus,\r\n.markdown-body input[type=radio]:focus-visible,\r\n.markdown-body input[type=checkbox]:focus,\r\n.markdown-body input[type=checkbox]:focus-visible {\r\n outline-offset: 0;\r\n}\r\n\r\n.markdown-body kbd {\r\n display: inline-block;\r\n padding: var(--base-size-4);\r\n font: 11px var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);\r\n line-height: 10px;\r\n color: var(--fgColor-default);\r\n vertical-align: middle;\r\n background-color: var(--bgColor-muted);\r\n border: solid 1px var(--borderColor-neutral-muted);\r\n border-bottom-color: var(--borderColor-neutral-muted);\r\n border-radius: 6px;\r\n box-shadow: inset 0 -1px 0 var(--borderColor-neutral-muted);\r\n}\r\n\r\n.markdown-body h1,\r\n.markdown-body h2,\r\n.markdown-body h3,\r\n.markdown-body h4,\r\n.markdown-body h5,\r\n.markdown-body h6 {\r\n margin-top: var(--base-size-24);\r\n margin-bottom: var(--base-size-16);\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n line-height: 1.25;\r\n}\r\n\r\n.markdown-body h2 {\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n padding-bottom: .3em;\r\n font-size: 1.2em;\r\n border-bottom: 1px solid var(--borderColor-muted);\r\n}\r\n\r\n.markdown-body h3 {\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n font-size: 1.05em;\r\n}\r\n\r\n.markdown-body h4 {\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n font-size: 0.875em;\r\n}\r\n\r\n.markdown-body h5 {\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n font-size: .85em;\r\n}\r\n\r\n.markdown-body h6 {\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n font-size: .80em;\r\n color: var(--fgColor-muted);\r\n}\r\n\r\n.markdown-body p {\r\n margin-top: 0;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.markdown-body blockquote {\r\n margin: 0;\r\n padding: 0 1em;\r\n color: var(--fgColor-muted);\r\n border-left: .25em solid var(--borderColor-default);\r\n}\r\n\r\n.markdown-body ul,\r\n.markdown-body ol {\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n padding-left: 2em;\r\n}\r\n\r\n.markdown-body ol ol,\r\n.markdown-body ul ol {\r\n list-style-type: lower-roman;\r\n}\r\n\r\n.markdown-body ul ul ol,\r\n.markdown-body ul ol ol,\r\n.markdown-body ol ul ol,\r\n.markdown-body ol ol ol {\r\n list-style-type: lower-alpha;\r\n}\r\n\r\n.markdown-body dd {\r\n margin-left: 0;\r\n}\r\n\r\n.markdown-body tt,\r\n.markdown-body code,\r\n.markdown-body samp {\r\n font-family: var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);\r\n font-size: 12px;\r\n}\r\n\r\n.markdown-body pre {\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n font-family: var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);\r\n font-size: 12px;\r\n word-wrap: normal;\r\n}\r\n\r\n.markdown-body .octicon {\r\n display: inline-block;\r\n overflow: visible !important;\r\n vertical-align: text-bottom;\r\n fill: currentColor;\r\n}\r\n\r\n.markdown-body input::-webkit-outer-spin-button,\r\n.markdown-body input::-webkit-inner-spin-button {\r\n margin: 0;\r\n appearance: none;\r\n}\r\n\r\n.markdown-body .mr-2 {\r\n margin-right: var(--base-size-8, 8px) !important;\r\n}\r\n\r\n.markdown-body::before {\r\n display: table;\r\n content: \"\";\r\n}\r\n\r\n.markdown-body::after {\r\n display: table;\r\n clear: both;\r\n content: \"\";\r\n}\r\n\r\n.markdown-body>*:first-child {\r\n margin-top: 0 !important;\r\n}\r\n\r\n.markdown-body>*:last-child {\r\n margin-bottom: 0 !important;\r\n}\r\n\r\n.markdown-body a:not([href]) {\r\n color: inherit;\r\n text-decoration: none;\r\n}\r\n\r\n.markdown-body .absent {\r\n color: var(--fgColor-danger);\r\n}\r\n\r\n.markdown-body .anchor {\r\n float: left;\r\n padding-right: var(--base-size-4);\r\n margin-left: -20px;\r\n line-height: 1;\r\n}\r\n\r\n.markdown-body .anchor:focus {\r\n outline: none;\r\n}\r\n\r\n.markdown-body p,\r\n.markdown-body blockquote,\r\n.markdown-body ul,\r\n.markdown-body ol,\r\n.markdown-body dl,\r\n.markdown-body table,\r\n.markdown-body pre,\r\n.markdown-body details {\r\n margin-top: 0;\r\n margin-bottom: var(--base-size-16);\r\n font-size: 16px;\r\n font-weight: 400;\r\n}\r\n\r\n.markdown-body blockquote>:first-child {\r\n margin-top: 0;\r\n}\r\n\r\n.markdown-body blockquote>:last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n.markdown-body h1 .octicon-link,\r\n.markdown-body h2 .octicon-link,\r\n.markdown-body h3 .octicon-link,\r\n.markdown-body h4 .octicon-link,\r\n.markdown-body h5 .octicon-link,\r\n.markdown-body h6 .octicon-link {\r\n color: var(--fgColor-default);\r\n vertical-align: middle;\r\n visibility: hidden;\r\n}\r\n\r\n.markdown-body h1:hover .anchor,\r\n.markdown-body h2:hover .anchor,\r\n.markdown-body h3:hover .anchor,\r\n.markdown-body h4:hover .anchor,\r\n.markdown-body h5:hover .anchor,\r\n.markdown-body h6:hover .anchor {\r\n text-decoration: none;\r\n}\r\n\r\n.markdown-body h1:hover .anchor .octicon-link,\r\n.markdown-body h2:hover .anchor .octicon-link,\r\n.markdown-body h3:hover .anchor .octicon-link,\r\n.markdown-body h4:hover .anchor .octicon-link,\r\n.markdown-body h5:hover .anchor .octicon-link,\r\n.markdown-body h6:hover .anchor .octicon-link {\r\n visibility: visible;\r\n}\r\n\r\n.markdown-body h1 tt,\r\n.markdown-body h1 code,\r\n.markdown-body h2 tt,\r\n.markdown-body h2 code,\r\n.markdown-body h3 tt,\r\n.markdown-body h3 code,\r\n.markdown-body h4 tt,\r\n.markdown-body h4 code,\r\n.markdown-body h5 tt,\r\n.markdown-body h5 code,\r\n.markdown-body h6 tt,\r\n.markdown-body h6 code {\r\n padding: 0 .2em;\r\n font-size: inherit;\r\n}\r\n\r\n.markdown-body summary h1,\r\n.markdown-body summary h2,\r\n.markdown-body summary h3,\r\n.markdown-body summary h4,\r\n.markdown-body summary h5,\r\n.markdown-body summary h6 {\r\n display: inline-block;\r\n}\r\n\r\n.markdown-body summary h1 .anchor,\r\n.markdown-body summary h2 .anchor,\r\n.markdown-body summary h3 .anchor,\r\n.markdown-body summary h4 .anchor,\r\n.markdown-body summary h5 .anchor,\r\n.markdown-body summary h6 .anchor {\r\n margin-left: -40px;\r\n}\r\n\r\n.markdown-body summary h1,\r\n.markdown-body summary h2 {\r\n padding-bottom: 0;\r\n border-bottom: 0;\r\n}\r\n\r\n.markdown-body ul.no-list,\r\n.markdown-body ol.no-list {\r\n padding: 0;\r\n list-style-type: none;\r\n}\r\n\r\n.markdown-body ol[type=\"a s\"] {\r\n list-style-type: lower-alpha;\r\n}\r\n\r\n.markdown-body ol[type=\"A s\"] {\r\n list-style-type: upper-alpha;\r\n}\r\n\r\n.markdown-body ol[type=\"i s\"] {\r\n list-style-type: lower-roman;\r\n}\r\n\r\n.markdown-body ol[type=\"I s\"] {\r\n list-style-type: upper-roman;\r\n}\r\n\r\n.markdown-body ol[type=\"1\"] {\r\n list-style-type: decimal;\r\n}\r\n\r\n.markdown-body div>ol:not([type]) {\r\n list-style-type: decimal;\r\n}\r\n\r\n.markdown-body ul ul,\r\n.markdown-body ul ol,\r\n.markdown-body ol ol,\r\n.markdown-body ol ul {\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n}\r\n\r\n.markdown-body li>p {\r\n margin-top: var(--base-size-16);\r\n}\r\n\r\n.markdown-body li+li {\r\n margin-top: .25em;\r\n}\r\n\r\n.markdown-body dl {\r\n padding: 0;\r\n}\r\n\r\n.markdown-body dl dt {\r\n padding: 0;\r\n margin-top: var(--base-size-16);\r\n font-size: 1em;\r\n font-style: italic;\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n}\r\n\r\n.markdown-body dl dd {\r\n padding: 0 var(--base-size-16);\r\n margin-bottom: var(--base-size-16);\r\n}\r\n\r\n.markdown-body table th {\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n}\r\n\r\n.markdown-body table th,\r\n.markdown-body table td {\r\n padding: 6px 13px;\r\n border: 1px solid var(--borderColor-default);\r\n}\r\n\r\n.markdown-body table td>:last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n.markdown-body table tr {\r\n background-color: var(--bgColor-default);\r\n border-top: 1px solid var(--borderColor-muted);\r\n}\r\n\r\n.markdown-body table tr:nth-child(2n) {\r\n background-color: var(--bgColor-muted);\r\n}\r\n\r\n.markdown-body table img {\r\n background-color: transparent;\r\n}\r\n\r\n.markdown-body img[align=right] {\r\n padding-left: 20px;\r\n}\r\n\r\n.markdown-body img[align=left] {\r\n padding-right: 20px;\r\n}\r\n\r\n.markdown-body .emoji {\r\n max-width: none;\r\n vertical-align: text-top;\r\n background-color: transparent;\r\n}\r\n\r\n.markdown-body span.frame {\r\n display: block;\r\n overflow: hidden;\r\n}\r\n\r\n.markdown-body span.frame>span {\r\n display: block;\r\n float: left;\r\n width: auto;\r\n padding: 7px;\r\n margin: 13px 0 0;\r\n overflow: hidden;\r\n border: 1px solid var(--borderColor-default);\r\n}\r\n\r\n.markdown-body span.frame span img {\r\n display: block;\r\n float: left;\r\n}\r\n\r\n.markdown-body span.frame span span {\r\n display: block;\r\n padding: 5px 0 0;\r\n clear: both;\r\n color: var(--fgColor-default);\r\n}\r\n\r\n.markdown-body span.align-center {\r\n display: block;\r\n overflow: hidden;\r\n clear: both;\r\n}\r\n\r\n.markdown-body span.align-center>span {\r\n display: block;\r\n margin: 13px auto 0;\r\n overflow: hidden;\r\n text-align: center;\r\n}\r\n\r\n.markdown-body span.align-center span img {\r\n margin: 0 auto;\r\n text-align: center;\r\n}\r\n\r\n.markdown-body span.align-right {\r\n display: block;\r\n overflow: hidden;\r\n clear: both;\r\n}\r\n\r\n.markdown-body span.align-right>span {\r\n display: block;\r\n margin: 13px 0 0;\r\n overflow: hidden;\r\n text-align: right;\r\n}\r\n\r\n.markdown-body span.align-right span img {\r\n margin: 0;\r\n text-align: right;\r\n}\r\n\r\n.markdown-body span.float-left {\r\n display: block;\r\n float: left;\r\n margin-right: 13px;\r\n overflow: hidden;\r\n}\r\n\r\n.markdown-body span.float-left span {\r\n margin: 13px 0 0;\r\n}\r\n\r\n.markdown-body span.float-right {\r\n display: block;\r\n float: right;\r\n margin-left: 13px;\r\n overflow: hidden;\r\n}\r\n\r\n.markdown-body span.float-right>span {\r\n display: block;\r\n margin: 13px auto 0;\r\n overflow: hidden;\r\n text-align: right;\r\n}\r\n\r\n.markdown-body code,\r\n.markdown-body tt {\r\n padding: .2em .4em;\r\n margin: 0;\r\n font-size: 85%;\r\n white-space: break-spaces;\r\n background-color: var(--bgColor-neutral-muted);\r\n border-radius: 6px;\r\n}\r\n\r\n.markdown-body code br,\r\n.markdown-body tt br {\r\n display: none;\r\n}\r\n\r\n.markdown-body del code {\r\n text-decoration: inherit;\r\n}\r\n\r\n.markdown-body samp {\r\n font-size: 85%;\r\n}\r\n\r\n.markdown-body pre code {\r\n font-size: 100%;\r\n}\r\n\r\n.markdown-body pre>code {\r\n padding: 0;\r\n margin: 0;\r\n word-break: normal;\r\n white-space: pre;\r\n background: transparent;\r\n border: 0;\r\n}\r\n\r\n.markdown-body .highlight {\r\n margin-bottom: var(--base-size-16);\r\n}\r\n\r\n.markdown-body .highlight pre {\r\n margin-bottom: 0;\r\n word-break: normal;\r\n}\r\n\r\n.markdown-body .highlight pre,\r\n.markdown-body pre {\r\n padding: var(--base-size-16);\r\n overflow: auto;\r\n font-size: 85%;\r\n line-height: 1.45;\r\n color: var(--fgColor-default);\r\n background-color: var(--bgColor-muted);\r\n border-radius: 6px;\r\n}\r\n\r\n.markdown-body pre code,\r\n.markdown-body pre tt {\r\n display: inline;\r\n max-width: auto;\r\n padding: 0;\r\n margin: 0;\r\n overflow: visible;\r\n line-height: inherit;\r\n word-wrap: normal;\r\n background-color: transparent;\r\n border: 0;\r\n}\r\n\r\n.markdown-body .csv-data td,\r\n.markdown-body .csv-data th {\r\n padding: 5px;\r\n overflow: hidden;\r\n font-size: 12px;\r\n line-height: 1;\r\n text-align: left;\r\n white-space: nowrap;\r\n}\r\n\r\n.markdown-body .csv-data .blob-num {\r\n padding: 10px var(--base-size-8) 9px;\r\n text-align: right;\r\n background: var(--bgColor-default);\r\n border: 0;\r\n}\r\n\r\n.markdown-body .csv-data tr {\r\n border-top: 0;\r\n}\r\n\r\n.markdown-body .csv-data th {\r\n font-weight: var(--base-text-weight-semibold, 600);\r\n background: var(--bgColor-muted);\r\n border-top: 0;\r\n}\r\n\r\n.markdown-body [data-footnote-ref]::before {\r\n content: \"[\";\r\n}\r\n\r\n.markdown-body [data-footnote-ref]::after {\r\n content: \"]\";\r\n}\r\n\r\n.markdown-body .footnotes {\r\n font-size: 12px;\r\n color: var(--fgColor-muted);\r\n border-top: 1px solid var(--borderColor-default);\r\n}\r\n\r\n.markdown-body .footnotes ol {\r\n padding-left: var(--base-size-16);\r\n}\r\n\r\n.markdown-body .footnotes ol ul {\r\n display: inline-block;\r\n padding-left: var(--base-size-16);\r\n margin-top: var(--base-size-16);\r\n}\r\n\r\n.markdown-body .footnotes li {\r\n position: relative;\r\n}\r\n\r\n.markdown-body .footnotes li:target::before {\r\n position: absolute;\r\n top: calc(var(--base-size-8)*-1);\r\n right: calc(var(--base-size-8)*-1);\r\n bottom: calc(var(--base-size-8)*-1);\r\n left: calc(var(--base-size-24)*-1);\r\n pointer-events: none;\r\n content: \"\";\r\n border: 2px solid var(--borderColor-accent-emphasis);\r\n border-radius: 6px;\r\n}\r\n\r\n.markdown-body .footnotes li:target {\r\n color: var(--fgColor-default);\r\n}\r\n\r\n.markdown-body .footnotes .data-footnote-backref g-emoji {\r\n font-family: monospace;\r\n}\r\n\r\n.markdown-body body:has(:modal) {\r\n padding-right: var(--dialog-scrollgutter) !important;\r\n}\r\n\r\n.markdown-body .pl-c {\r\n color: var(--color-prettylights-syntax-comment);\r\n}\r\n\r\n.markdown-body .pl-c1,\r\n.markdown-body .pl-s .pl-v {\r\n color: var(--color-prettylights-syntax-constant);\r\n}\r\n\r\n.markdown-body .pl-e,\r\n.markdown-body .pl-en {\r\n color: var(--color-prettylights-syntax-entity);\r\n}\r\n\r\n.markdown-body .pl-smi,\r\n.markdown-body .pl-s .pl-s1 {\r\n color: var(--color-prettylights-syntax-storage-modifier-import);\r\n}\r\n\r\n.markdown-body .pl-ent {\r\n color: var(--color-prettylights-syntax-entity-tag);\r\n}\r\n\r\n.markdown-body .pl-k {\r\n color: var(--color-prettylights-syntax-keyword);\r\n}\r\n\r\n.markdown-body .pl-s,\r\n.markdown-body .pl-pds,\r\n.markdown-body .pl-s .pl-pse .pl-s1,\r\n.markdown-body .pl-sr,\r\n.markdown-body .pl-sr .pl-cce,\r\n.markdown-body .pl-sr .pl-sre,\r\n.markdown-body .pl-sr .pl-sra {\r\n color: var(--color-prettylights-syntax-string);\r\n}\r\n\r\n.markdown-body .pl-v,\r\n.markdown-body .pl-smw {\r\n color: var(--color-prettylights-syntax-variable);\r\n}\r\n\r\n.markdown-body .pl-bu {\r\n color: var(--color-prettylights-syntax-brackethighlighter-unmatched);\r\n}\r\n\r\n.markdown-body .pl-ii {\r\n color: var(--color-prettylights-syntax-invalid-illegal-text);\r\n background-color: var(--color-prettylights-syntax-invalid-illegal-bg);\r\n}\r\n\r\n.markdown-body .pl-c2 {\r\n color: var(--color-prettylights-syntax-carriage-return-text);\r\n background-color: var(--color-prettylights-syntax-carriage-return-bg);\r\n}\r\n\r\n.markdown-body .pl-sr .pl-cce {\r\n font-weight: bold;\r\n color: var(--color-prettylights-syntax-string-regexp);\r\n}\r\n\r\n.markdown-body .pl-ml {\r\n color: var(--color-prettylights-syntax-markup-list);\r\n}\r\n\r\n.markdown-body .pl-mh,\r\n.markdown-body .pl-mh .pl-en,\r\n.markdown-body .pl-ms {\r\n font-weight: bold;\r\n color: var(--color-prettylights-syntax-markup-heading);\r\n}\r\n\r\n.markdown-body .pl-mi {\r\n font-style: italic;\r\n color: var(--color-prettylights-syntax-markup-italic);\r\n}\r\n\r\n.markdown-body .pl-mb {\r\n font-weight: bold;\r\n color: var(--color-prettylights-syntax-markup-bold);\r\n}\r\n\r\n.markdown-body .pl-md {\r\n color: var(--color-prettylights-syntax-markup-deleted-text);\r\n background-color: var(--color-prettylights-syntax-markup-deleted-bg);\r\n}\r\n\r\n.markdown-body .pl-mi1 {\r\n color: var(--color-prettylights-syntax-markup-inserted-text);\r\n background-color: var(--color-prettylights-syntax-markup-inserted-bg);\r\n}\r\n\r\n.markdown-body .pl-mc {\r\n color: var(--color-prettylights-syntax-markup-changed-text);\r\n background-color: var(--color-prettylights-syntax-markup-changed-bg);\r\n}\r\n\r\n.markdown-body .pl-mi2 {\r\n color: var(--color-prettylights-syntax-markup-ignored-text);\r\n background-color: var(--color-prettylights-syntax-markup-ignored-bg);\r\n}\r\n\r\n.markdown-body .pl-mdr {\r\n font-weight: bold;\r\n color: var(--color-prettylights-syntax-meta-diff-range);\r\n}\r\n\r\n.markdown-body .pl-ba {\r\n color: var(--color-prettylights-syntax-brackethighlighter-angle);\r\n}\r\n\r\n.markdown-body .pl-sg {\r\n color: var(--color-prettylights-syntax-sublimelinter-gutter-mark);\r\n}\r\n\r\n.markdown-body .pl-corl {\r\n text-decoration: underline;\r\n color: var(--color-prettylights-syntax-constant-other-reference-link);\r\n}\r\n\r\n.markdown-body [role=button]:focus:not(:focus-visible),\r\n.markdown-body [role=tabpanel][tabindex=\"0\"]:focus:not(:focus-visible),\r\n.markdown-body button:focus:not(:focus-visible),\r\n.markdown-body summary:focus:not(:focus-visible),\r\n.markdown-body a:focus:not(:focus-visible) {\r\n outline: none;\r\n box-shadow: none;\r\n}\r\n\r\n.markdown-body [tabindex=\"0\"]:focus:not(:focus-visible),\r\n.markdown-body details-dialog:focus:not(:focus-visible) {\r\n outline: none;\r\n}\r\n\r\n.markdown-body g-emoji {\r\n display: inline-block;\r\n min-width: 1ch;\r\n font-family: \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\r\n font-size: 1em;\r\n font-style: normal !important;\r\n font-weight: var(--base-text-weight-normal, 400);\r\n line-height: 1;\r\n vertical-align: -0.075em;\r\n}\r\n\r\n.markdown-body g-emoji img {\r\n width: 1em;\r\n height: 1em;\r\n}\r\n\r\n.markdown-body .task-list-item {\r\n list-style-type: none;\r\n}\r\n\r\n.markdown-body .task-list-item label {\r\n font-weight: var(--base-text-weight-normal, 400);\r\n}\r\n\r\n.markdown-body .task-list-item.enabled label {\r\n cursor: pointer;\r\n}\r\n\r\n.markdown-body .task-list-item+.task-list-item {\r\n margin-top: var(--base-size-4);\r\n}\r\n\r\n.markdown-body .task-list-item .handle {\r\n display: none;\r\n}\r\n\r\n.markdown-body .task-list-item-checkbox {\r\n margin: 0 .2em .25em -1.4em;\r\n vertical-align: middle;\r\n}\r\n\r\n.markdown-body ul:dir(rtl) .task-list-item-checkbox {\r\n margin: 0 -1.6em .25em .2em;\r\n}\r\n\r\n.markdown-body ol:dir(rtl) .task-list-item-checkbox {\r\n margin: 0 -1.6em .25em .2em;\r\n}\r\n\r\n.markdown-body .contains-task-list:hover .task-list-item-convert-container,\r\n.markdown-body .contains-task-list:focus-within .task-list-item-convert-container {\r\n display: block;\r\n width: auto;\r\n height: 24px;\r\n overflow: visible;\r\n clip: auto;\r\n}\r\n\r\n.markdown-body ::-webkit-calendar-picker-indicator {\r\n filter: invert(50%);\r\n}\r\n\r\n.markdown-body .markdown-alert {\r\n padding: var(--base-size-8) var(--base-size-16);\r\n margin-bottom: var(--base-size-16);\r\n color: inherit;\r\n border-left: .25em solid var(--borderColor-default);\r\n}\r\n\r\n.markdown-body .markdown-alert>:first-child {\r\n margin-top: 0;\r\n}\r\n\r\n.markdown-body .markdown-alert>:last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n.markdown-body .markdown-alert .markdown-alert-title {\r\n display: flex;\r\n font-weight: var(--base-text-weight-medium, 500);\r\n align-items: center;\r\n line-height: 1;\r\n}\r\n\r\n.markdown-body .markdown-alert.markdown-alert-note {\r\n border-left-color: var(--borderColor-accent-emphasis);\r\n}\r\n\r\n.markdown-body .markdown-alert.markdown-alert-note .markdown-alert-title {\r\n color: var(--fgColor-accent);\r\n}\r\n\r\n.markdown-body .markdown-alert.markdown-alert-important {\r\n border-left-color: var(--borderColor-done-emphasis);\r\n}\r\n\r\n.markdown-body .markdown-alert.markdown-alert-important .markdown-alert-title {\r\n color: var(--fgColor-done);\r\n}\r\n\r\n.markdown-body .markdown-alert.markdown-alert-warning {\r\n border-left-color: var(--borderColor-attention-emphasis);\r\n}\r\n\r\n.markdown-body .markdown-alert.markdown-alert-warning .markdown-alert-title {\r\n color: var(--fgColor-attention);\r\n}\r\n\r\n.markdown-body .markdown-alert.markdown-alert-tip {\r\n border-left-color: var(--borderColor-success-emphasis);\r\n}\r\n\r\n.markdown-body .markdown-alert.markdown-alert-tip .markdown-alert-title {\r\n color: var(--fgColor-success);\r\n}\r\n\r\n.markdown-body .markdown-alert.markdown-alert-caution {\r\n border-left-color: var(--borderColor-danger-emphasis);\r\n}\r\n\r\n.markdown-body .markdown-alert.markdown-alert-caution .markdown-alert-title {\r\n color: var(--fgColor-danger);\r\n}\r\n\r\n.markdown-body>*:first-child>.heading-element:first-child {\r\n margin-top: 0 !important;\r\n}\r\n\r\n.markdown-body .highlight pre:has(+.zeroclipboard-container) {\r\n min-height: 52px;\r\n}\r\n\r\n.message-actions {\r\n position: absolute;\r\n top: 8px;\r\n right: 8px;\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n}\r\n\r\n.assistant-message:hover .message-actions {\r\n opacity: 1;\r\n}\r\n\r\n.copy-button {\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n padding: 4px;\r\n border-radius: 4px;\r\n color: #6e6e80;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.copy-button:hover {\r\n background-color: rgba(0, 0, 0, 0.05);\r\n color: #000;\r\n}\r\n\r\n.copy-button svg {\r\n width: 16px;\r\n height: 16px;\r\n}","import { Component, Prop, h, Element, Event, EventEmitter } from '@stencil/core';\r\nimport { marked } from 'marked';\r\nimport { ChatMessage } from '../../interfaces/chat';\r\n@Component({\r\n tag: 'pcm-chat-message',\r\n styleUrl: 'pcm-chat-message.css',\r\n shadow: true,\r\n})\r\nexport class ChatMessageComponent {\r\n /**\r\n * 消息数据\r\n */\r\n @Prop() message: ChatMessage;\r\n\r\n /**\r\n * 消息变更事件\r\n */\r\n @Event() messageChange: EventEmitter<Partial<ChatMessage>>;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n constructor() {\r\n // 配置 marked 选项\r\n marked.setOptions({\r\n breaks: true,\r\n gfm: true\r\n });\r\n }\r\n\r\n // 复制消息内容到剪贴板\r\n private copyMessageContent() {\r\n if (this.message.answer) {\r\n navigator.clipboard.writeText(this.message.answer)\r\n .then(() => {\r\n // 可以添加复制成功的提示\r\n console.log('内容已复制到剪贴板');\r\n })\r\n .catch(err => {\r\n console.error('复制失败:', err);\r\n });\r\n }\r\n }\r\n\r\n // 渲染用户消息部分\r\n private renderUserMessage() {\r\n if (!this.message?.query?.trim()) return null;\r\n\r\n return (\r\n <div class=\"user-message-container\">\r\n <div class=\"message-bubble user-message\">\r\n <p>{this.message.query}</p>\r\n {this.renderInputs()}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // 渲染助手消息部分\r\n private renderAssistantMessage() {\r\n if (!this.message.answer && !this.message.isStreaming) return null;\r\n\r\n // 只有在开始流式输出且还没有内容时才显示loading\r\n const showLoading = this.message.isStreaming && !this.message.answer;\r\n const htmlContent = this.message.answer ? marked(this.message.answer) : '';\r\n\r\n return (\r\n <div class=\"assistant-message-container\">\r\n <div class=\"message-bubble assistant-message\">\r\n <div\r\n class=\"markdown-content markdown-body\"\r\n innerHTML={showLoading ? \r\n `请稍等...` : \r\n htmlContent\r\n }\r\n ></div>\r\n </div>\r\n {!showLoading && this.message.answer && (\r\n <div class=\"message-actions\">\r\n <button class=\"copy-button\" onClick={() => this.copyMessageContent()} title=\"复制内容\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\r\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // 渲染输入数据\r\n private renderInputs() {\r\n if (!this.message.inputs) return null;\r\n\r\n return (\r\n <div>\r\n {Object.keys(this.message.inputs).map((key, index) => {\r\n const value = this.message.inputs[key];\r\n if (value && !key.startsWith('hide_') && key !== 'answer') {\r\n if (key === 'file_url') {\r\n return <div key={index} class=\"file-view\">{value}</div>;\r\n } else if (key === 'file_urls' || key === 'fileUrls') {\r\n const fileList = value.split(',');\r\n return (\r\n <div key={index} class=\"flex flex-wrap\">\r\n {fileList.map((fileUrl, fileIndex) => (\r\n <div key={fileIndex} class=\"file-view\">{fileUrl}</div>\r\n ))}\r\n </div>\r\n );\r\n } else if (key === 'job_info') {\r\n return (\r\n <div key={index} class=\"input-view\">\r\n <div class=\"input-label\">职位信息</div>\r\n <div class=\"input-value\">{value}</div>\r\n </div>\r\n );\r\n } else if (key === 'rule') {\r\n return (\r\n <div key={index} class=\"input-view\">\r\n <div class=\"input-label\">评估规则</div>\r\n <div class=\"input-value\">{value}</div>\r\n </div>\r\n );\r\n } else {\r\n return <div key={index} class=\"input-metadata\">{key}: {`${value}`}</div>;\r\n }\r\n }\r\n return null;\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n <div class=\"message-round\">\r\n {this.renderUserMessage()}\r\n {this.renderAssistantMessage()}\r\n </div>\r\n );\r\n }\r\n} ",":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: 500px;\r\n display: flex;\r\n flex-direction: column;\r\n position: relative;\r\n margin: auto;\r\n transition: all 0.3s ease-out;\r\n overflow: hidden;\r\n}\r\n\r\n/* 全屏模式样式 */\r\n.modal-container.fullscreen {\r\n width: 100vw;\r\n max-width: none;\r\n height: 100%;\r\n border-radius: 0;\r\n margin: 0;\r\n display: flex;\r\n flex-direction: column;\r\n height: 100vh;\r\n max-height: 100vh;\r\n}\r\n\r\n/* PC端布局 */\r\n.pc-layout {\r\n width: 80%;\r\n max-width: 500px;\r\n min-width: 320px;\r\n}\r\n\r\n/* 移动端布局 */\r\n.mobile-layout {\r\n width: 100%;\r\n height: 100%;\r\n border-radius: 0;\r\n}\r\n\r\n/* 响应式布局 */\r\n@media screen and (max-width: 768px) {\r\n .pc-layout {\r\n width: 95%;\r\n }\r\n\r\n .modal-overlay {\r\n padding: 0;\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 margin-top: 40px;\r\n height: calc(100% - 40px);\r\n max-height: calc(100% - 40px);\r\n border-radius: 16px 16px 0 0;\r\n }\r\n\r\n .modal-container.mobile-layout {\r\n width: 100%;\r\n height: 100vh;\r\n max-height: 100vh;\r\n min-height: 100vh;\r\n border-radius: 0;\r\n margin: 0;\r\n display: flex;\r\n flex-direction: column;\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 flex-shrink: 0; /* 防止头部被压缩 */\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.upload-container {\r\n padding: 30px 20px;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n text-align: center;\r\n height: calc(100% - 60px); /* 减去header高度 */\r\n transition: opacity 0.5s ease-out;\r\n}\r\n\r\n.upload-container h3 {\r\n margin-top: 0;\r\n margin-bottom: 20px;\r\n font-size: 18px;\r\n color: #333;\r\n}\r\n\r\n.upload-area {\r\n border: 2px dashed #ddd;\r\n border-radius: 8px;\r\n width: 100%;\r\n max-width: 400px;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\r\n margin-bottom: 20px;\r\n}\r\n\r\n.upload-area:hover {\r\n border-color: #1890ff;\r\n background-color: rgba(24, 144, 255, 0.05);\r\n}\r\n\r\n.upload-placeholder {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n color: #666;\r\n}\r\n\r\n.upload-hint {\r\n font-size: 0.8rem;\r\n color: #999;\r\n margin-top: 0.5rem;\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: #f9f9f9;\r\n border: 1px solid #e8e8e8;\r\n border-radius: 4px;\r\n}\r\n\r\n.file-info span {\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.submit-button {\r\n margin-top: 10px;\r\n padding: 10px 30px;\r\n background: #1890ff;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n font-size: 16px;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\r\n width: 100%;\r\n max-width: 400px;\r\n}\r\n\r\n.submit-button:disabled {\r\n background: #ccc;\r\n cursor: not-allowed;\r\n}\r\n\r\n.submit-button:hover:not(:disabled) {\r\n background: #40a9ff;\r\n}\r\n\r\n.file-input {\r\n display: none;\r\n}\r\n\r\n.transitioning {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.fade-out {\r\n opacity: 0.7;\r\n transition: opacity 0.5s ease-out;\r\n}\r\n\r\n.transition-container {\r\n margin-top: 20px;\r\n width: 100%;\r\n}\r\n\r\n.progress-bar {\r\n width: 100%;\r\n height: 6px;\r\n background-color: #f0f0f0;\r\n border-radius: 3px;\r\n overflow: hidden;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.progress-fill {\r\n height: 100%;\r\n background-color: #4285f4;\r\n transition: width 0.3s ease-out;\r\n}\r\n\r\n/* 淡出动画 */\r\n.upload-container.fade-out {\r\n opacity: 0;\r\n transform: translateY(-20px);\r\n transition: opacity 0.3s ease, transform 0.3s ease;\r\n}\r\n\r\n/* 淡入动画 */\r\n.chat-modal-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}\r\n\r\n/* 确保容器有相对定位,以便绝对定位的子元素能够正确定位 */\r\n.modal-container {\r\n position: relative;\r\n overflow: hidden;\r\n} ","import { Component, Prop, h, State, Element, Event, EventEmitter, Watch } from '@stencil/core';\r\n\r\n@Component({\r\n tag: 'pcm-mnms-modal',\r\n styleUrl: 'pcm-mnms-modal.css',\r\n shadow: true,\r\n})\r\nexport class MnmsModal {\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 @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({ mutable: true }) conversationId?: 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 /**\r\n * 是否为移动端布局\r\n */\r\n @Prop() isMobile: boolean = false;\r\n\r\n /**\r\n * 自定义输入参数\r\n */\r\n @Prop() customInputs: { [key: string]: any } = {};\r\n\r\n /**\r\n * 上传成功事件\r\n */\r\n @Event() uploadSuccess: EventEmitter<{\r\n cos_key: string;\r\n filename: string;\r\n ext: string;\r\n presigned_url: string;\r\n }>;\r\n\r\n /**\r\n * 流式输出完成事件\r\n */\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 /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: 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 /**\r\n * 当聊天完成时触发\r\n */\r\n @Event() interviewComplete: EventEmitter<{\r\n conversation_id: string;\r\n total_questions: number;\r\n }>;\r\n\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 } | null = null;\r\n @State() showChatModal: boolean = false;\r\n\r\n // 添加新的状态来控制过渡动画\r\n @State() isTransitioning: boolean = false;\r\n @State() transitionTimer: any = null;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n private handleClose = () => {\r\n this.isOpen = false;\r\n this.modalClosed.emit();\r\n };\r\n\r\n private handleFileChange = (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\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 = null;\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 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 headers: {\r\n 'authorization': 'Bearer ' + this.apiKey\r\n },\r\n body: formData\r\n });\r\n\r\n const result = await response.json();\r\n if (!response.ok) {\r\n throw new Error(result.message || '文件上传失败');\r\n }\r\n\r\n if (result) {\r\n this.uploadedFileInfo = {\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 // 触发上传成功事件\r\n this.uploadSuccess.emit(this.uploadedFileInfo);\r\n }\r\n } catch (error) {\r\n console.error('文件上传错误:', error);\r\n this.clearSelectedFile();\r\n alert(error instanceof Error ? error.message : '文件上传失败,请重试');\r\n } finally {\r\n this.isUploading = false;\r\n }\r\n }\r\n\r\n private handleStartInterview = async () => {\r\n if (!this.selectedFile) {\r\n alert('请上传简历');\r\n return;\r\n }\r\n\r\n // 如果还没上传,先上传文件\r\n if (!this.uploadedFileInfo) {\r\n await this.uploadFile();\r\n if (!this.uploadedFileInfo) {\r\n return; // 上传失败\r\n }\r\n }\r\n\r\n console.log('传递的customInputs:', {\r\n ...this.customInputs,\r\n file_url: this.uploadedFileInfo.cos_key\r\n });\r\n\r\n // 直接显示聊天模态框,不使用过渡动画\r\n this.showChatModal = true;\r\n };\r\n\r\n @Watch('isOpen')\r\n handleIsOpenChange(newValue: boolean) {\r\n if (!newValue) {\r\n // 重置状态\r\n this.clearSelectedFile();\r\n this.showChatModal = false;\r\n \r\n // 清除可能存在的计时器\r\n if (this.transitionTimer) {\r\n clearTimeout(this.transitionTimer);\r\n this.transitionTimer = null;\r\n }\r\n } else if (this.conversationId) {\r\n // 如果有会话ID,直接显示聊天模态框\r\n this.showChatModal = true;\r\n }\r\n }\r\n\r\n // 处理流式输出完成事件\r\n private handleStreamComplete = (event: CustomEvent) => {\r\n // 将事件转发出去\r\n this.streamComplete.emit(event.detail);\r\n };\r\n\r\n // 处理会话开始事件\r\n private handleConversationStart = (event: CustomEvent) => {\r\n this.conversationStart.emit(event.detail);\r\n };\r\n\r\n // 处理面试完成事件\r\n private handleInterviewComplete = (event: CustomEvent) => {\r\n this.interviewComplete.emit(event.detail);\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 console.log('showChatModal:', this.showChatModal);\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n 'pc-layout': !this.isMobile,\r\n 'mobile-layout': this.isMobile\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 // 检查是否有会话ID,如果有则直接显示聊天模态框\r\n if (this.conversationId && !this.showChatModal) {\r\n this.showChatModal = true;\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 <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 上传界面 - 仅在不显示聊天模态框且没有会话ID时显示 */}\r\n {!this.showChatModal && !this.conversationId && (\r\n <div class=\"upload-container\">\r\n <h3>开始前,请上传您的简历</h3>\r\n <div class=\"upload-area\" onClick={this.handleUploadClick}>\r\n {this.selectedFile ? (\r\n <div class=\"file-info\">\r\n <span>{this.selectedFile.name}</span>\r\n <button class=\"remove-file\" onClick={(e) => {\r\n e.stopPropagation();\r\n this.clearSelectedFile();\r\n }}>×</button>\r\n </div>\r\n ) : (\r\n <div class=\"upload-placeholder\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" width=\"48\" height=\"48\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v16m0-16l-4 4m4-4l4 4\" />\r\n </svg>\r\n <p>点击上传简历</p>\r\n <p class=\"upload-hint\">支持 txt、 markdown、 pdf、 docx、 md 格式</p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <button\r\n class=\"submit-button\"\r\n disabled={!this.selectedFile || this.isUploading}\r\n onClick={this.handleStartInterview}\r\n >\r\n {this.isUploading ? '上传中...' : '开始面试'}\r\n </button>\r\n\r\n <input\r\n type=\"file\"\r\n class=\"file-input\"\r\n onChange={this.handleFileChange}\r\n accept=\".pdf,.doc,.docx,.txt,.md\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* 聊天界面 - 在显示聊天模态框时显示 */}\r\n {this.showChatModal && (\r\n <div class=\"chat-modal-container\">\r\n <pcm-app-chat-modal\r\n isOpen={true}\r\n modalTitle={this.modalTitle}\r\n icon={this.icon}\r\n apiKey={this.apiKey}\r\n isShowHeader={this.isShowHeader} // 不显示内部的标题栏,因为外部已有\r\n isNeedClose={this.isShowHeader} // 不显示内部的关闭按钮,因为外部已有\r\n zIndex={this.zIndex}\r\n fullscreen={this.fullscreen}\r\n conversationId={this.conversationId}\r\n defaultQuery={this.defaultQuery}\r\n enableVoice={false}\r\n customInputs={this.conversationId ? undefined : {\r\n ...this.customInputs,\r\n file_url: this.uploadedFileInfo?.cos_key\r\n }}\r\n interviewMode=\"text\"\r\n onModalClosed={this.handleClose}\r\n onStreamComplete={this.handleStreamComplete}\r\n onConversationStart={this.handleConversationStart}\r\n onInterviewComplete={this.handleInterviewComplete}\r\n ></pcm-app-chat-modal>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n} "],"mappings":"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","ignoreList":[]}