pcm-agents 0.2.3 → 0.2.4

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 (27) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/pcm-agents.cjs.js +1 -1
  3. package/dist/cjs/pcm-chat-message.pcm-hr-chat-modal.entry.cjs.js.map +1 -1
  4. package/dist/cjs/pcm-chat-message_2.cjs.entry.js +19 -17
  5. package/dist/cjs/pcm-chat-message_2.cjs.entry.js.map +1 -1
  6. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js +55 -32
  7. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js.map +1 -1
  8. package/dist/components/pcm-hr-chat-modal.js +22 -19
  9. package/dist/components/pcm-hr-chat-modal.js.map +1 -1
  10. package/dist/esm/loader.js +1 -1
  11. package/dist/esm/pcm-agents.js +1 -1
  12. package/dist/esm/pcm-chat-message.pcm-hr-chat-modal.entry.js.map +1 -1
  13. package/dist/esm/pcm-chat-message_2.entry.js +19 -17
  14. package/dist/esm/pcm-chat-message_2.entry.js.map +1 -1
  15. package/dist/pcm-agents/app-globals-DQuL1Twl.js.map +1 -0
  16. package/dist/pcm-agents/index-Csq0E9fM.js.map +1 -0
  17. package/dist/pcm-agents/index.esm.js.map +1 -1
  18. package/dist/pcm-agents/{p-9a428ad8.entry.js → p-ed58d206.entry.js} +2 -2
  19. package/dist/pcm-agents/p-ed58d206.entry.js.map +1 -0
  20. package/dist/pcm-agents/pcm-agents.esm.js +1 -1
  21. package/dist/pcm-agents/pcm-agents.esm.js.map +1 -1
  22. package/dist/pcm-agents/pcm-chat-message.pcm-hr-chat-modal.entry.esm.js.map +1 -1
  23. package/dist/pcm-agents/utils-CxmVTYHl.js.map +1 -0
  24. package/dist/types/components/pcm-hr-chat-modal/pcm-hr-chat-modal.d.ts +12 -6
  25. package/dist/types/components.d.ts +16 -8
  26. package/package.json +1 -1
  27. package/dist/pcm-agents/p-9a428ad8.entry.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_getDefaults","async","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","String","fromCharCode","parseInt","substring","caret","edit","regex","opt","obj","name","val","getRegex","cleanUrl","href","encodeURI","e","noopTest","exec","splitCells","tableRow","count","row","match","offset","str","escaped","curr","cells","split","i","trim","shift","length","pop","splice","push","rtrim","c","invert","l","suffLen","currChar","slice","findClosingBracket","b","indexOf","level","outputLink","cap","link","raw","lexer","title","text","state","inLink","token","type","tokens","inlineTokens","indentCodeCompensation","matchIndentToCode","indentToCode","map","node","matchIndentInNode","indentInNode","join","_Tokenizer","options","rules","constructor","this","space","src","block","newline","code","codeBlockStyle","fences","lang","inline","_escapes","heading","trimmed","depth","hr","blockquote","top","blockTokens","list","bull","isordered","ordered","start","loose","items","itemRegex","itemContents","endsWithBlankLine","endEarly","line","t","repeat","nextLine","indent","trimStart","search","blankLine","nextBulletRegex","Math","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","url","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","forEach","getStartIndex","errMsg","charCodeAt","console","error","Error","keepPrevChar","keys","includes","lastIndexOf","startInline","_Renderer","infostring","quote","body","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","Promise","resolve","then","packWalktokens","origOpt","warn","throwError","onError","prototype","toString","all","catch","message","msg","reject","markedInstance","marked","getDefaults","pcmChatMessageCss","ChatMessageComponent","messageChange","hostRef","copyMessageContent","answer","navigator","clipboard","writeText","log","err","renderUserMessage","query","h","class","renderInputs","renderAssistantMessage","isStreaming","showLoading","htmlContent","innerHTML","onClick","xmlns","width","height","viewBox","fill","stroke","x","y","rx","ry","d","inputs","key","value","startsWith","fileList","fileUrl","fileIndex","render","pcmHrChatModalCss","ChatHRModal","modalTitle","apiKey","isOpen","messages","modalClosed","icon","zIndex","isShowHeader","isNeedClose","botId","conversationId","currentAssistantMessage","isLoading","currentStreamingMessage","shouldAutoScroll","isLoadingHistory","streamComplete","selectedFile","isUploading","uploadedFileInfo","defaultQuery","showInitialUpload","selectedJobCategory","jobCategories","dimensions","selectedDimensions","isRecording","recordingStream","recordedBlob","mediaRecorder","recordingTimeLeft","showRecordingUI","recordingTimer","recordingStartTime","recordingMaxTime","waitingToRecord","waitingTimer","waitingTimeLeft","videoRef","totalQuestions","currentQuestionNumber","isInterviewComplete","interviewComplete","SCROLL_THRESHOLD","maxRecordingTime","countdownWarningTime","showCountdownWarning","toEmail","fullscreen","isUploadingVideo","requireResume","isPlayingAudio","audioUrl","audioElement","recordingError","recordingStatusChange","enableVoice","displayContentStatus","userId","handleClose","stopRecording","emit","handleFileChange","event","input","target","files","uploadFile","formData","FormData","append","response","fetch","method","headers","authorization","result","json","ok","cos_key","filename","presigned_url","clearSelectedFile","alert","handleUploadClick","fileInput","hostElement","shadowRoot","querySelector","click","sendMessageToAPI","llmText","now","Date","time","getHours","getMinutes","padStart","queryText","lastAIMessage","saveAnswer","isLastQuestion","newMessage","id","bot_id","conversation_id","status","scrollToBottom","completeInterview","total_questions","requestData","response_mode","user","job_info","dimensional_info","email","display_content_status","fileUrls","fileInfo","file_urls","sendSSERequest","data","onMessage","updateUrlWithConversationId","LLMText","updatedMessage","message_id","onComplete","latestAIMessage","textForSynthesis","synthesizeAudio","playAudio","startWaitingToRecord","question","sendHttpRequest","handleScroll","chatHistory","scrollTop","scrollHeight","clientHeight","distanceFromBottom","componentDidRender","urlParams","URLSearchParams","window","location","get","newUrl","URL","searchParams","set","history","replaceState","loadHistoryMessages","limit","historyData","formattedMessages","created_at","hours","minutes","timeStr","msgWithoutInputs","requestAnimationFrame","handleIsOpenChange","newValue","handleJobCategorySelect","category","handleDimensionSelect","dimension","handleInitialSubmit","confirmed","confirm","clearInterval","setInterval","startRecording","stream","mediaDevices","getUserMedia","audio","video","ideal","frameRate","setupVideoPreview","mimeType","getSupportedMimeType","MediaRecorder","recorderError","details","chunks","ondataavailable","size","onerror","onstop","blobType","blob","Blob","duration","floor","uploadRecordedVideo","maxDuration","startError","elapsedTime","max","setTimeout","videoElement","srcObject","play","objectUrl","createObjectURL","onended","revokeObjectURL","urlError","mimeTypes","isTypeSupported","stop","getTracks","track","fileExtension","fileName","saveVideoAnswer","sendNextQuestion","cosKey","file_url","JSON","stringify","audioBlob","Audio","disconnectedCallback","pause","handlePlayAudio","modalStyle","containerClass","overlayClass","renderVideoPreview","autoPlay","playsInline","muted","style","transform","ref","el","warning","renderPlaceholderStatus","alt","Fragment","stopPropagation","selected","disabled","onChange","accept","onScroll","onMessageChange","updatedMessages","detail","verticalAlign","marginRight"],"sources":["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-hr-chat-modal/pcm-hr-chat-modal.css?tag=pcm-hr-chat-modal&encapsulation=shadow","src/components/pcm-hr-chat-modal/pcm-hr-chat-modal.tsx"],"sourcesContent":["/**\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: 800px;\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@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}\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: 200px;\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.file-name {\r\n font-size: 13px;\r\n color: #333;\r\n margin-right: 8px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n max-width: calc(100% - 30px);\r\n}\r\n\r\n.remove-file {\r\n background: transparent;\r\n border: none;\r\n color: #999;\r\n cursor: pointer;\r\n padding: 4px 8px;\r\n font-size: 16px;\r\n line-height: 1;\r\n border-radius: 4px;\r\n transition: all 0.2s;\r\n}\r\n\r\n.remove-file:hover {\r\n background-color: #f0f0f0;\r\n color: #666;\r\n}\r\n\r\n.initial-upload {\r\n padding: 1rem 1rem;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n height: 100%;\r\n}\r\n\r\n.upload-section {\r\n max-width: 600px;\r\n width: 100%;\r\n text-align: center;\r\n}\r\n\r\n.upload-area {\r\n border: 2px dashed #ddd;\r\n border-radius: 8px;\r\n padding: 1rem;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\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.function-select {\r\n margin-top: 2rem;\r\n}\r\n\r\n.function-options {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 1rem;\r\n justify-content: center;\r\n margin-top: 1rem;\r\n}\r\n\r\n.function-button {\r\n padding: 0.5rem 1rem;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n background: white;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.function-button:hover {\r\n border-color: #1890ff;\r\n color: #1890ff;\r\n}\r\n\r\n.function-button.selected {\r\n background: #1890ff;\r\n color: white;\r\n border-color: #1890ff;\r\n}\r\n\r\n.submit-button {\r\n margin-top: 1rem;\r\n padding: 0.8rem 2rem;\r\n background: #1890ff;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n font-size: 1rem;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\r\n width: 95%;\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.category-select,\r\n.dimension-select {\r\n margin: 30px 0;\r\n}\r\n\r\n.category-options,\r\n.dimension-options {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 10px;\r\n margin-top: 10px;\r\n}\r\n\r\n.category-button,\r\n.dimension-button {\r\n padding: 12px 16px;\r\n border: 1px solid #E5E5E5;\r\n border-radius: 6px;\r\n background: white;\r\n cursor: pointer;\r\n transition: all 0.3s;\r\n}\r\n\r\n.category-button:hover,\r\n.dimension-button:hover {\r\n background: #f5f5f5;\r\n}\r\n\r\n.category-button.selected {\r\n background-image: linear-gradient(111deg, #4A9FFF 0%, #1058FF 100%);\r\n color: white;\r\n}\r\n\r\n.dimension-button.selected {\r\n background-image: linear-gradient(111deg, #4A9FFF 0%, #1058FF 100%);\r\n color: white;\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}","import { Component, Prop, h, State, Event, EventEmitter, Element, Watch } from '@stencil/core';\r\nimport { convertWorkflowStreamNodeToMessageRound, UserInputMessageType, sendSSERequest, sendHttpRequest } from '../../utils/utils';\r\nimport { ChatMessage } from '../../interfaces/chat';\r\n\r\n@Component({\r\n tag: 'pcm-hr-chat-modal',\r\n styleUrl: 'pcm-hr-chat-modal.css',\r\n shadow: true,\r\n})\r\nexport class ChatHRModal {\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 * 机器人ID\r\n */\r\n @Prop() botId: string;\r\n\r\n /**\r\n * 会话ID\r\n */\r\n @Prop({ mutable: true }) conversationId?: string;\r\n\r\n /**\r\n * 当前助手回复的消息\r\n */\r\n @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 // 添加新的 Event\r\n @Event() streamComplete: EventEmitter<{\r\n conversation_id: string;\r\n event: string;\r\n message_id: string;\r\n id: string;\r\n }>;\r\n\r\n @State() 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 = true;\r\n @State() selectedJobCategory: string = '';\r\n @State() jobCategories: string[] = [\r\n '人力资源学生(实习)',\r\n '人力资源专员',\r\n '人力资源主管',\r\n '人力资源经理',\r\n '人力资源总监'\r\n ];\r\n\r\n @State() dimensions: string[] = [\r\n '人力资源规划',\r\n '招聘与配置',\r\n '员工关系',\r\n '培训与开发',\r\n '薪酬与绩效',\r\n '组织与人才发展'\r\n ];\r\n\r\n @State() selectedDimensions: string[] = [];\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 @State() isInterviewComplete: boolean = false;\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() toEmail: string = '';\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 * 是否需要上传简历\r\n */\r\n @Prop() requireResume: 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 private handleClose = () => {\r\n this.isOpen = false;\r\n this.stopRecording();\r\n this.modalClosed.emit();\r\n };\r\n\r\n private handleFileChange = async (event: Event) => {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this.selectedFile = input.files[0];\r\n }\r\n };\r\n\r\n private async uploadFile() {\r\n if (!this.selectedFile || this.uploadedFileInfo.length > 0) 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 } 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 handleUploadClick = () => {\r\n const fileInput = this.hostElement.shadowRoot?.querySelector('.file-input') as HTMLInputElement;\r\n fileInput?.click();\r\n };\r\n\r\n private clearSelectedFile = () => {\r\n this.selectedFile = null;\r\n this.uploadedFileInfo = [];\r\n const fileInput = this.hostElement.shadowRoot?.querySelector('.file-input') as HTMLInputElement;\r\n if (fileInput) {\r\n fileInput.value = '';\r\n }\r\n };\r\n\r\n private async sendMessageToAPI(message: 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() || (this.uploadedFileInfo.length > 0 ? '请分析这个文件' : '');\r\n\r\n // 获取上一条AI消息的回答内容\r\n const lastAIMessage = this.messages.length > 0 ? this.messages[this.messages.length - 1] : null;\r\n\r\n // 保存AI提问和用户回答\r\n if (lastAIMessage && this.conversationId && message !== \"下一题\") {\r\n this.saveAnswer(\r\n this.conversationId,\r\n lastAIMessage.answer, // AI的提问作为question\r\n queryText // 用户的输入作为answer\r\n );\r\n }\r\n\r\n // 检查是否是最后一题的\"下一题\"请求\r\n const isLastQuestion = (this.currentQuestionNumber >= this.totalQuestions) && message === \"下一题\";\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 bot_id: this.botId, // 机器人ID\r\n isStreaming: true, // 是否正在流式输出\r\n conversation_id: this.conversationId, // 会话ID\r\n inputs: {}, // 输入参数\r\n status: \"normal\", // 消息状态\r\n error: null // 错误信息\r\n };\r\n\r\n // 设置当前流式消息\r\n this.currentStreamingMessage = newMessage;\r\n\r\n this.shouldAutoScroll = true;\r\n // 滚动到底部\r\n this.scrollToBottom();\r\n\r\n // 如果是最后一题,直接显示结束消息并完成面试\r\n if (isLastQuestion) {\r\n this.messages = [...this.messages, newMessage];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n this.isInterviewComplete = true;\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 bot_id: this.botId,\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 requestData.inputs = {\r\n job_info: this.selectedJobCategory,\r\n dimensional_info: this.selectedDimensions.join(','),\r\n email: this.toEmail,\r\n display_content_status: this.displayContentStatus\r\n };\r\n // 如果有上传的文件,添加到inputs参数\r\n if (this.uploadedFileInfo.length > 0) {\r\n const fileUrls = this.uploadedFileInfo.map(fileInfo => fileInfo.cos_key).join(',');\r\n requestData.inputs.file_urls = fileUrls;\r\n }\r\n\r\n\r\n await sendSSERequest({\r\n url: `https://pcm_api.ylzhaopin.com/external/v1/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.updateUrlWithConversationId(data.conversation_id);\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 console.log('请求完成');\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 console.log(this.currentQuestionNumber);\r\n console.log(message);\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 private async saveAnswer(conversationId: string, question: string, answer: string) {\r\n try {\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: conversationId,\r\n user: this.userId, // 使用传入的 userId\r\n question: question,\r\n answer: answer\r\n },\r\n });\r\n } catch (error) {\r\n console.error('保存答案失败:', error);\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 private updateUrlWithConversationId(conversationId: string) {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n if (!urlParams.get('conversation_id')) {\r\n const newUrl = new URL(window.location.href);\r\n newUrl.searchParams.set('conversation_id', conversationId);\r\n window.history.replaceState({}, '', newUrl);\r\n }\r\n }\r\n\r\n // 修改 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/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 bot_id: this.botId,\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 bot_id: this.botId,\r\n isStreaming: false,\r\n status: msg.status === 'error' ? 'error' : 'normal' as const\r\n };\r\n });\r\n\r\n this.messages = formattedMessages;\r\n 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 // 修改 isOpen 的 watch 方法\r\n @Watch('isOpen')\r\n async handleIsOpenChange(newValue: boolean) {\r\n if (newValue) {\r\n if (this.conversationId) {\r\n await this.loadHistoryMessages();\r\n } \r\n }\r\n }\r\n\r\n\r\n private handleJobCategorySelect = (category: string) => {\r\n this.selectedJobCategory = category;\r\n };\r\n\r\n private handleDimensionSelect = (dimension: string) => {\r\n if (this.selectedDimensions.includes(dimension)) {\r\n this.selectedDimensions = this.selectedDimensions.filter(d => d !== dimension);\r\n } else {\r\n this.selectedDimensions = [...this.selectedDimensions, dimension];\r\n }\r\n };\r\n\r\n private handleInitialSubmit = async () => {\r\n // 修改验证逻辑\r\n if (this.requireResume && !this.selectedFile) {\r\n alert('请上传简历');\r\n return;\r\n }\r\n\r\n if (!this.selectedJobCategory) {\r\n alert('请选择职能类别');\r\n return;\r\n }\r\n\r\n if (this.selectedDimensions.length === 0) {\r\n alert('请至少选择一个关注模块');\r\n return;\r\n }\r\n\r\n // 不再显示欢迎确认对话框,因为已经在组件打开时显示了\r\n // 直接询问用户是否准备好开始面试\r\n const confirmed = confirm('如果您已做好准备请点击\"确定\"开始面试。');\r\n\r\n if (!confirmed) {\r\n return;\r\n }\r\n\r\n // 修改文件上传逻辑\r\n if (this.requireResume) {\r\n await this.uploadFile();\r\n if (this.uploadedFileInfo.length === 0) {\r\n return;\r\n }\r\n }\r\n\r\n this.showInitialUpload = false;\r\n const message = `我是一名${this.selectedJobCategory},请您开始提问`;\r\n this.sendMessageToAPI(message);\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 console.log('使用支持的MIME类型:', 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 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 console.log('视频上传结果:', result);\r\n\r\n if (result && result.cos_key) {\r\n // 保存视频答案\r\n await this.saveVideoAnswer(result.cos_key);\r\n\r\n // 发送\"下一题\"请求\r\n this.sendNextQuestion();\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 private sendNextQuestion() {\r\n this.sendMessageToAPI(\"下一题\");\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 await sendHttpRequest({\r\n url: `https://pcm_api.ylzhaopin.com/agents/hr_competition/${this.conversationId}/end`,\r\n method: 'POST',\r\n headers: {\r\n 'authorization': 'Bearer ' + this.apiKey\r\n },\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 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 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 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 {this.showInitialUpload ? (\r\n <div class=\"initial-upload\">\r\n <div class=\"upload-section\">\r\n {/* 根据 requireResume 条件渲染简历上传部分 */}\r\n {this.requireResume && (\r\n <>\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 )}\r\n\r\n <div class=\"category-select\">\r\n <h3>请选择您的职能类别(单选)</h3>\r\n <div class=\"category-options\">\r\n {this.jobCategories.map(category => (\r\n <button\r\n class={{\r\n 'category-button': true,\r\n 'selected': this.selectedJobCategory === category\r\n }}\r\n onClick={() => this.handleJobCategorySelect(category)}\r\n >\r\n {category}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n <div class=\"dimension-select\">\r\n <h3>请选择关注的模块(可多选)</h3>\r\n <div class=\"dimension-options\">\r\n {this.dimensions.map(dimension => (\r\n <button\r\n class={{\r\n 'dimension-button': true,\r\n 'selected': this.selectedDimensions.includes(dimension)\r\n }}\r\n onClick={() => this.handleDimensionSelect(dimension)}\r\n >\r\n {dimension}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n <button\r\n class=\"submit-button\"\r\n disabled={\r\n (this.requireResume && !this.selectedFile) ||\r\n !this.selectedJobCategory ||\r\n this.selectedDimensions.length === 0 ||\r\n (this.requireResume && this.isUploading)\r\n }\r\n onClick={this.handleInitialSubmit}\r\n >\r\n {this.requireResume && this.isUploading ? '上传中...' : '开始面试'}\r\n </button>\r\n </div>\r\n {this.requireResume && (\r\n <input\r\n type=\"file\"\r\n class=\"file-input\"\r\n onChange={this.handleFileChange}\r\n accept=\".pdf,.doc,.docx,.txt\"\r\n />\r\n )}\r\n </div>\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 <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>\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 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 \r\n \r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}"],"mappings":"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","ignoreList":[]}