@core-pilot/client-vue 0.0.9 → 0.0.11

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 (67) hide show
  1. package/dist/cjs/client-vue.css +1 -1
  2. package/dist/cjs/components/bubble-list/index.js +1 -1
  3. package/dist/cjs/components/bubble-list/index.js.map +1 -1
  4. package/dist/cjs/components/core-upload/index.js +1 -1
  5. package/dist/cjs/components/core-upload/index.js.map +1 -1
  6. package/dist/cjs/components/editor-sender/index.js +1 -1
  7. package/dist/cjs/components/editor-sender/index.js.map +1 -1
  8. package/dist/cjs/components/x-markdown/composables/useFormHandler.js +2 -0
  9. package/dist/cjs/components/x-markdown/composables/useFormHandler.js.map +1 -0
  10. package/dist/cjs/components/x-markdown/composables/useImageLoader.js +2 -0
  11. package/dist/cjs/components/x-markdown/composables/useImageLoader.js.map +1 -0
  12. package/dist/cjs/components/x-markdown/composables/useMarkdownProcessor.js +2 -0
  13. package/dist/cjs/components/x-markdown/composables/useMarkdownProcessor.js.map +1 -0
  14. package/dist/cjs/components/x-markdown/composables/useRefHandler.js +2 -0
  15. package/dist/cjs/components/x-markdown/composables/useRefHandler.js.map +1 -0
  16. package/dist/cjs/components/x-markdown/composables/useStreamHandler.js +2 -0
  17. package/dist/cjs/components/x-markdown/composables/useStreamHandler.js.map +1 -0
  18. package/dist/cjs/components/x-markdown/index.js +1 -1
  19. package/dist/cjs/components/x-markdown/index.js.map +1 -1
  20. package/dist/cjs/components/x-markdown/renderers/hastRenderer.js +2 -0
  21. package/dist/cjs/components/x-markdown/renderers/hastRenderer.js.map +1 -0
  22. package/dist/cjs/components/x-markdown/utils/disabledUtils.js +2 -0
  23. package/dist/cjs/components/x-markdown/utils/disabledUtils.js.map +1 -0
  24. package/dist/cjs/components/x-markdown/utils/formUtils.js +2 -0
  25. package/dist/cjs/components/x-markdown/utils/formUtils.js.map +1 -0
  26. package/dist/cjs/components/x-markdown/utils/jsonUtils.js +2 -0
  27. package/dist/cjs/components/x-markdown/utils/jsonUtils.js.map +1 -0
  28. package/dist/cjs/components/x-markdown/utils/parseCorePilotSchema.js +1 -1
  29. package/dist/cjs/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
  30. package/dist/cjs/components/x-markdown/utils/refUtils.js +2 -0
  31. package/dist/cjs/components/x-markdown/utils/refUtils.js.map +1 -0
  32. package/dist/cjs/components/x-markdown/utils/textFormatUtils.js +2 -0
  33. package/dist/cjs/components/x-markdown/utils/textFormatUtils.js.map +1 -0
  34. package/dist/es/client-vue.css +1 -1
  35. package/dist/es/components/bubble-list/index.js +3 -0
  36. package/dist/es/components/bubble-list/index.js.map +1 -1
  37. package/dist/es/components/core-upload/index.js +33 -24
  38. package/dist/es/components/core-upload/index.js.map +1 -1
  39. package/dist/es/components/editor-sender/index.js +39 -16
  40. package/dist/es/components/editor-sender/index.js.map +1 -1
  41. package/dist/es/components/x-markdown/composables/useFormHandler.js +66 -0
  42. package/dist/es/components/x-markdown/composables/useFormHandler.js.map +1 -0
  43. package/dist/es/components/x-markdown/composables/useImageLoader.js +58 -0
  44. package/dist/es/components/x-markdown/composables/useImageLoader.js.map +1 -0
  45. package/dist/es/components/x-markdown/composables/useMarkdownProcessor.js +48 -0
  46. package/dist/es/components/x-markdown/composables/useMarkdownProcessor.js.map +1 -0
  47. package/dist/es/components/x-markdown/composables/useRefHandler.js +80 -0
  48. package/dist/es/components/x-markdown/composables/useRefHandler.js.map +1 -0
  49. package/dist/es/components/x-markdown/composables/useStreamHandler.js +45 -0
  50. package/dist/es/components/x-markdown/composables/useStreamHandler.js.map +1 -0
  51. package/dist/es/components/x-markdown/index.js +85 -646
  52. package/dist/es/components/x-markdown/index.js.map +1 -1
  53. package/dist/es/components/x-markdown/renderers/hastRenderer.js +427 -0
  54. package/dist/es/components/x-markdown/renderers/hastRenderer.js.map +1 -0
  55. package/dist/es/components/x-markdown/utils/disabledUtils.js +15 -0
  56. package/dist/es/components/x-markdown/utils/disabledUtils.js.map +1 -0
  57. package/dist/es/components/x-markdown/utils/formUtils.js +82 -0
  58. package/dist/es/components/x-markdown/utils/formUtils.js.map +1 -0
  59. package/dist/es/components/x-markdown/utils/jsonUtils.js +20 -0
  60. package/dist/es/components/x-markdown/utils/jsonUtils.js.map +1 -0
  61. package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js +10 -0
  62. package/dist/es/components/x-markdown/utils/parseCorePilotSchema.js.map +1 -1
  63. package/dist/es/components/x-markdown/utils/refUtils.js +18 -0
  64. package/dist/es/components/x-markdown/utils/refUtils.js.map +1 -0
  65. package/dist/es/components/x-markdown/utils/textFormatUtils.js +46 -0
  66. package/dist/es/components/x-markdown/utils/textFormatUtils.js.map +1 -0
  67. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/x-markdown/index.tsx"],"sourcesContent":["import { \n defineComponent, \n ref, computed, watch, \n onMounted, onBeforeUnmount, \n useTemplateRef, h, nextTick,\n onUpdated,\n} from 'vue';\nimport debounce from 'lodash/debounce';\nimport { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport remarkBreaks from \"remark-breaks\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport remarkGemoji from \"remark-gemoji\";\nimport remarkRehype from \"remark-rehype\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeKatex from \"rehype-katex\";\nimport rehypeStringify from \"rehype-stringify\";\nimport { useTemplateRefsList } from '@vueuse/core'\n\nimport { \n ElMessage, \n ElForm,\n ElFormItem, \n ElInput, \n ElCard,\n ElButton,\n ElSelect,\n ElDatePicker,\n ElTable,\n ElTableColumn,\n ElTimeline,\n ElRow,\n ElCol,\n ElRadioGroup,\n ElRadio,\n ElConfigProvider\n} from 'element-plus';\nimport './style/index.less';\nimport './theme/index.less';\nimport { createStreamGenerator } from './utils/mockStream.ts';\nimport { parseCorePilot } from './utils/parseCorePilotSchema.ts';\nimport { Accordion } from './utils/animation.ts';\nimport CoreText from '../core-text';\nimport CoreTips from '../core-tips';\nimport CoreResult from '../core-result';\nimport CoreTable from '../core-table';\nimport CoreChart from '../core-chart';\nimport CoreCard from '../core-card';\nimport 'katex/dist/katex.min.css'\nimport zhCN from 'element-plus/es/locale/lang/zh-cn';\nimport { InputSchema } from '@/types/index.ts';\n\nconst checkAndReturnRefList = (text: string) => {\n const reg = /<div hidden>([\\s\\S]*?)<\\/div>/g;\n const match = reg.exec(text);\n if (!match) {\n return [];\n }\n const refListStr = match[1];\n try {\n const refList = JSON.parse(refListStr);\n return refList;\n } catch (error) {\n return [];\n }\n}\n\n/**\n * 检测 JSON 字符串是否完整\n * 使用最高效的方式:快速检查基本结构后直接尝试解析\n */\nconst isCompleteJSON = (jsonStr: string): boolean => {\n if (!jsonStr || jsonStr.trim().length === 0) {\n return false;\n }\n \n const trimmed = jsonStr.trim();\n \n // 快速检查:必须以 { 或 [ 开头\n const firstChar = trimmed[0];\n if (firstChar !== '{' && firstChar !== '[') {\n return false;\n }\n \n // 直接尝试解析,如果成功就是完整的 JSON\n try {\n JSON.parse(trimmed);\n return true;\n } catch (error) {\n // 解析失败,说明 JSON 不完整或格式错误\n return false;\n }\n}\n\ninterface RefConfig {\n title: string,\n link: string,\n time: string,\n author: string,\n}\n\nexport default defineComponent({\n name: 'XMarkdown',\n props: {\n text: {\n type: String,\n default: '',\n },\n autoHideThinking: {\n type: Boolean,\n default: true,\n },\n typing: {\n type: Boolean,\n default: false,\n },\n speed: {\n type: Number,\n default: 200,\n },\n isHistoryMessage: {\n type: Boolean,\n default: false,\n },\n historyInputs: {\n type: Object,\n default: () => ({}),\n },\n },\n expose: [\n 'getContentText'\n ],\n emits: ['hoverActiveRefTrigger', 'clickActiveRefTrigger', 'refConfigUpdate', 'downloadFile', 'coreSubmit'],\n setup(props, { emit }) {\n const container = useTemplateRef<HTMLElement>('x-markdown-container');\n const startTime = ref<number>(Date.now());\n const endTime = ref<number>(-Infinity);\n const context = ref('');\n const pendingImages = new Set(); // 存储待处理的图片\n const isInitAnimation = ref(false);\n const tagComplete = ref(false);\n const hitlData = ref<Array<Record<string, string>>>([]);\n const formRefs = useTemplateRefsList<typeof ElForm>();\n const curIndex = ref(0);\n let curInit = 0;\n const ast = ref<any>(null);\n const isRewrite = ref(false);\n\n const streamCall = (stream: string) => {\n context.value = context.value + stream;\n }\n\n const streamGener = ref<ReturnType<typeof createStreamGenerator>>(createStreamGenerator(streamCall, props.speed));\n\n const updateSummaryClasses = (mdText: string) => {\n const summaryDivReg = /(<summary[^>]*>[\\s\\S]*?<\\/summary>)\\s*(<div>[\\s\\S]*?)(<\\/div>|$)/g;\n let isFirstSummary = true;\n\n return mdText.replace(summaryDivReg, (match, summaryTag, divContent, divEnd) => {\n const isDivComplete = divEnd === '</div>'; // 直接判断闭合标签是否存在\n const updatedSummary = summaryTag.replace(\n /(<summary)/g,\n (match) => {\n if (isFirstSummary) {\n isFirstSummary = false;\n return match;\n }\n return `<summary class=\"${isDivComplete ? 'loaded' : 'loading'}\"`\n }\n );\n return `${updatedSummary}\\n${divContent}${divEnd}`; // 重组时拼接闭合部分\n });\n }\n\n const formatText = computed(() => {\n if (!props.autoHideThinking) return context.value;\n let content = context.value;\n content = updateSummaryClasses(content);\n content = content.replace(/[\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/g, ' ');\n if (content.includes('</details>')) {\n if (endTime.value === -Infinity) {\n endTime.value = Date.now();\n }\n\n const res = checkAndReturnRefList(content);\n\n let text = content.replace(/<details open>([\\s\\S]*?)<\\/details>/g, (match, content) => {\n // 将 content 中的第一个 <summary> 中的内容替换为 具体的秒数\n content = content.replace(/<summary>([\\s\\S]*?)<\\/summary>/, (match, content) => {\n const duration = ((endTime.value - startTime.value) / 1000).toFixed(0);\n return `<summary style=\"color: #8D90A0;font-weight: 300; font-size: 16px;\">\n 已完成思考 ${duration > '0' ? duration + 's' : ''} ${res.length ? `<span style=\"display: inline-block;margin: 0 8px;border-left: 1px solid #CDCFD7;width: 1px;height: 16px;\"></span> 引用文档:${res?.length} 个` : ''}\n </summary>`;\n })\n\n content = content.replace(/<summary>完成<\\/summary>/, '<summary class=\"loaded\">完成</summary>')\n\n return `<details>${content}</details>`;\n });\n \n return text;\n }\n return content;\n })\n\n // TODO 后续需要规范相关定义\n // 如果当前是历史消息, 且父级作用域为form,则禁用点击事件\n const checkDisabled = (node: InputSchema) => {\n const { properties = {}, parentScope } = node;\n const { disabled } = properties;\n if (disabled) {\n return true;\n }\n if (parentScope === 'form') {\n return props.isHistoryMessage && !isRewrite.value;\n }\n return false;\n }\n\n watch(() => [props.text, props.typing], (v, o) => {\n const [text, typing] = v;\n const [oldText] = o || [];\n if (!(text as string).startsWith(oldText as string)) {\n streamGener.value?.reset();\n context.value = '';\n }\n if (text) {\n streamGener.value?.update(text);\n if (!typing) {\n streamGener.value?.stop();\n return;\n }\n // 资料整合 标签之后,采用服务端流式速度\n const checkReg = /<summary>资料整合<\\/summary>\\r?\\n(.|\\s)+?/;\n if (!tagComplete.value && checkReg.test(text as string)) {\n tagComplete.value = true;\n streamGener.value?.setSpeed(500);\n return;\n }\n }\n }, {\n immediate: true,\n })\n\n // 获取所有的ref配置\n const refConfig = ref<Array<RefConfig>>([]);\n\n const getRefConfig = () => {\n const refContainer = (container.value as HTMLElement)?.querySelector('div[hidden]');\n refConfig.value = JSON.parse(refContainer?.textContent || '[]');\n emit('refConfigUpdate', refConfig.value);\n }\n const renderComplete = debounce(() => {\n getRefConfig();\n }, 100);\n\n // 获取当前激活的索引文件\n const activeRef = ref<HTMLElement | null>(null);\n\n watch(() => context.value, renderComplete, {\n immediate: true,\n });\n\n watch(activeRef, (newVal, oldVal) => {\n if (newVal !== oldVal) {\n if (newVal) {\n const text = newVal.getAttribute('dataherf');\n const target = refConfig.value.find((item) => {\n return item.link === text;\n });\n emit('hoverActiveRefTrigger', target);\n } else {\n emit('hoverActiveRefTrigger', '');\n }\n }\n });\n\n const getTargeElement = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === 'SPAN') {\n const isInRefContainer = target.classList.contains('x-markdown-split');\n const isRefContainer = target.classList.contains('x-markdown-sub')\n if (isInRefContainer || isRefContainer) {\n if (!isRefContainer) {\n return target.parentElement as HTMLElement;\n }\n return target;\n }\n }\n };\n\n const handleMouseOver = (e: MouseEvent) => {\n const target = getTargeElement(e);\n if (target) {\n activeRef.value = target;\n return;\n }\n activeRef.value = null;\n }\n\n const handleAClick = async (e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const target = e.target as HTMLElement;\n const href = target.getAttribute('href');\n const id = target.getAttribute('data-id') || target.getAttribute('dataid');\n const title = target.getAttribute('data-name') || target.getAttribute('dataname');\n if (!href) {\n return;\n }\n // const fileExt = ['pdf', 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'txt', 'md', 'png', 'gif', 'jpg', 'jpeg', 'webp', 'svg'];\n const ext = href.split('.').pop();\n // 如果id不存在,则使用a标签新打开浏览器页面兜底\n if (!id) {\n window.open(href, '_blank');\n return;\n }\n ElMessage('文件下载中...');\n\n emit('downloadFile', {\n title,\n id,\n ext,\n href,\n });\n\n // downloadFile(href);\n return;\n }\n\n const btnClick = async (index: number, action: string, payload: any, parentScope?: 'form' | 'table') => {\n if (action === 'inner_next') {\n curIndex.value += 1;\n return;\n }\n if (action === 'inner_prev') {\n curIndex.value -= 1;\n return;\n }\n if (action === 'inner_rewrite') {\n isRewrite.value = true;\n console.log('isRewrite', isRewrite.value);\n return;\n }\n\n let res = {\n action,\n payload: {},\n };\n // 区分是否为form组件的按钮,如果带有payload 则约定为非form组件的按钮\n if (payload && parentScope !== 'form') {\n res = {\n action,\n payload,\n }\n } else {\n await formRefs.value[index]?.validate();\n res = {\n action,\n payload: {\n ...hitlData.value[index],\n ...payload,\n }\n }\n }\n if (isRewrite.value && action.startsWith('core_')) {\n isRewrite.value = false;\n }\n emit('coreSubmit', res)\n }\n\n const handleClick = (e: MouseEvent) => {\n // 如果当前点击的是a标签,则根据a标签的href属性直接下载文件\n if ((e.target as HTMLElement).tagName === 'A') {\n handleAClick(e);\n return;\n }\n\n const target = getTargeElement(e);\n if (target) {\n const text = target.getAttribute('dataherf');\n const highlight = JSON.parse(target.getAttribute('datahighlight') || '[]') as Array<string>;\n const page = Number(target.getAttribute('datanumber'));\n const id = target.getAttribute('id');\n const source = refConfig.value.find((item) => {\n return item.link === text;\n });\n const data = {\n ...source,\n highlight,\n page,\n id,\n }\n emit('clickActiveRefTrigger', data);\n }\n }\n\n const getContentText = () => {\n return container.value?.innerText;\n }\n\n onMounted(() => {\n (container.value as HTMLElement).addEventListener('mouseover', handleMouseOver);\n (container.value as HTMLElement).addEventListener('click', handleClick);\n });\n\n onBeforeUnmount(() => {\n (container.value as HTMLElement).removeEventListener('mouseover', handleMouseOver);\n (container.value as HTMLElement).addEventListener('click', handleClick)\n })\n\n /**\n * 处理新加载的图片\n * 核心逻辑:设置占位尺寸,渐进式加载\n */\n const processNewImages = () => {\n if (!container.value) return;\n \n const newImages = container.value.querySelectorAll(\n \"img:not([data-processed='true'])\"\n ) as NodeListOf<HTMLImageElement>;\n \n newImages.forEach((img) => {\n if (pendingImages.has(img)) return;\n pendingImages.add(img);\n \n // 设置占位尺寸,避免布局重排\n setPlaceholderDimensions(img);\n \n // 处理已加载的图片\n if (img.complete) {\n handleImageLoad(img);\n } else {\n img.addEventListener(\"load\", () => handleImageLoad(img));\n img.addEventListener(\"error\", () => handleImageError(img));\n }\n });\n };\n \n // 设置图片占位尺寸\n const setPlaceholderDimensions = (img) => {\n const containerWidth = img.parentElement.offsetWidth;\n if (img.naturalWidth > containerWidth) {\n img.style.maxWidth = \"100%\";\n }\n \n if (img.naturalWidth && img.naturalHeight) {\n const ratio = img.naturalHeight / img.naturalWidth;\n img.style.maxHeight = `${Math.min(500, containerWidth * ratio)}px`;\n }\n };\n \n // 图片加载成功处理\n const handleImageLoad = (img) => {\n pendingImages.delete(img);\n img.setAttribute(\"data-processed\", \"true\");\n img.classList.add(\"loaded\");\n img.style.opacity = \"1\";\n img.removeEventListener(\"load\", handleImageLoad);\n img.removeEventListener(\"error\", handleImageError);\n };\n \n // 图片加载失败处理\n const handleImageError = (img) => {\n pendingImages.delete(img);\n img.setAttribute(\"data-processed\", \"true\");\n img.classList.add(\"load-error\");\n img.style.maxHeight = \"200px\";\n img.removeEventListener(\"load\", handleImageLoad);\n img.removeEventListener(\"error\", handleImageError);\n };\n\n // 初始化unified处理链\n const md = unified()\n .use(remarkParse) // 解析Markdown为AST\n .use(remarkBreaks) // 处理换行符\n .use(remarkGfm, { singleTilde: false }) // GitHub Flavored Markdown支持\n .use(remarkMath) // 数学公式支持\n .use(remarkGemoji) // Emoji支持\n .use(remarkRehype, { allowDangerousHtml: true }) // 转换为HTML AST\n .use(rehypeRaw)\n .use(rehypeKatex)\n .use(rehypeStringify)\n\n /**\n * 递归遍历 schema,收集所有 form 表单及其 data 属性\n * @param schema - CorePilot schema 对象\n * @param formDataList - 用于存储收集到的 form data 的数组\n * @returns void\n */\n const collectFormsFromSchema = (schema: any, formDataList: Array<Record<string, any>>) => {\n if (!schema || typeof schema !== 'object') return;\n \n // 如果当前节点是 form,收集其 data 属性并停止向下递归(form 内部不会嵌套 form)\n if (schema.type === 'form') {\n const formData = {\n ...schema.properties?.data || {},\n // FIXME 目前只有卡片里面仅有可能出现单个表单,需要需要支持多表单场景\n ...props.historyInputs || {},\n };\n formDataList.push(formData);\n return; // form 内部不会再嵌套 form,直接返回\n }\n \n // 递归遍历 children 数组\n if (Array.isArray(schema.children)) {\n schema.children.forEach((child) => {\n collectFormsFromSchema(child, formDataList);\n });\n }\n }\n\n /**\n * 计算 markdown AST 中所有 form 表单的数量,并提取每个 form 的预定义数据\n * @param mdAst - markdown AST 对象\n * @returns { length: number, formDataList: Array<Record<string, any>> } - form 数量和 form data 列表\n */\n const computedForm = (mdAst: any) => {\n const formDataList: Array<Record<string, any>> = [];\n \n // 高效检索:直接查找所有 pre 标签\n const preNodes: any[] = [];\n const findPreNodes = (node: any) => {\n if (!node) return;\n if (node.tagName === \"pre\") {\n preNodes.push(node);\n }\n if (Array.isArray(node.children)) {\n node.children.forEach(findPreNodes);\n }\n };\n \n // 遍历 mdAst 查找所有 pre 节点\n if (Array.isArray(mdAst.children)) {\n mdAst.children.forEach(findPreNodes);\n }\n \n // 处理每个 pre 节点中的 CorePilot 代码块\n preNodes.forEach((preNode: any) => {\n const codeNode = preNode.children?.find((child: any) => child.tagName === \"code\");\n if (codeNode?.properties?.className?.includes(\"language-CorePilot\")) {\n try {\n const code = codeNode.children?.[0]?.value || '';\n if (code) {\n const schema = JSON.parse(code);\n // 递归收集所有 form\n collectFormsFromSchema(schema, formDataList);\n }\n } catch (error) {\n console.error('Failed to parse CorePilot schema:', error);\n }\n }\n });\n \n return formDataList\n }\n\n watch(\n () => formatText.value!,\n async (text) => {\n // 处理Markdown到hast再到VNode的转换\n curInit = 0;\n const mdAst = await md.run(md.parse(text));\n // 递归遍历所有 CorePilot schema,收集 form 表单及其预定义数据\n const formDataList = computedForm(mdAst);\n hitlData.value = formDataList;\n\n await nextTick();\n ast.value = mdAst;\n \n // 等待DOM更新后处理图片\n nextTick(processNewImages);\n nextTick(() => {\n const details = container.value?.querySelector('details');\n const summary = details?.querySelector('summary');\n if (summary && !isInitAnimation.value) {\n isInitAnimation.value = true;\n new Accordion(details!);\n }\n })\n },\n { immediate: true }\n );\n\n /**\n * 渲染骨架屏组件\n * @returns {VNode} 骨架屏虚拟节点\n */\n const renderSkeleton = () => {\n return h(\"div\", {\n class: \"hitl-skeleton\",\n }, [\n // 头部骨架\n h(\"div\", {\n class: \"skeleton-header\",\n }, [\n h(\"div\", { class: \"skeleton-avatar\" }),\n h(\"div\", { class: \"skeleton-title\" }),\n ]),\n // 内容骨架\n h(\"div\", { class: \"skeleton-item skeleton-item-long\" }),\n h(\"div\", { class: \"skeleton-item skeleton-item-medium\" }),\n h(\"div\", { class: \"skeleton-item skeleton-item-short\" }),\n h(\"div\", { class: \"skeleton-item skeleton-item-long\" }),\n h(\"div\", { class: \"skeleton-item skeleton-item-medium\" }),\n ]);\n };\n\n /**\n * 将hast(HTML AST)转换为Vue VNode\n * @param {Object} node hast节点\n * @returns {VNode} Vue虚拟节点\n */\n // FIXME ⚠️⚠️⚠️ 复杂表单存在性能问题 ⚠️⚠️⚠️\n const hastToVNode = (node, index?: number, row?: any) => {\n if (!node) return null;\n let children: any[] = [];\n const blackTagNames = ['sub', 'pre', 'text', 'ElForm'];\n\n if (!blackTagNames.includes(node.tagName)) {\n children = node.children?.map?.(child => hastToVNode(child, index)) || [];\n }\n switch (node.type) {\n case \"root\":\n return h(\n \"div\",\n { class: \"markdown-body\" },\n h(ElConfigProvider, {\n locale: zhCN,\n }, children)\n );\n \n case \"element\":\n if (node.tagName === \"sub\") {\n const formatChildren = [\n {\n type: \"element\",\n tagName: \"span\",\n properties: {\n class: \"x-markdown-split\",\n },\n }, \n ...node.children\n ]\n const children = formatChildren?.map(child => hastToVNode(child, index));\n return h(\"span\", {\n ...node.properties,\n class: \"x-markdown-sub\",\n }, children);\n }\n if (node.tagName === \"span\") {\n return h(\"span\", {\n ...node.properties,\n }, \n children\n );\n }\n // 处理特殊元素:图片、链接、代码块等\n if (node.tagName === \"img\") {\n return h(\"img\", {\n ...node.properties,\n class: \"markdown-image\",\n \"data-processed\": \"false\" // 标记未处理图片\n });\n }\n \n if (node.tagName === \"a\") {\n const href = node.properties?.href || ''; // 获取链接地址\n const fileType = href ? href.split('.').pop() : null; // 标记文件类型\n return h(\n \"a\",\n {\n ...node.properties,\n class: 'file-link',\n 'data-file-type': fileType,\n },\n children\n );\n }\n if (node.tagName === 'ElTimeline') {\n return h(\n ElTimeline,\n {\n ...node.properties,\n },\n children\n );\n }\n if (node.tagName === 'table') {\n return h(\n \"div\",\n {\n class: 'custom-table-container',\n },\n [\n h(\n \"table\",\n children\n ),\n ]\n );\n }\n\n if (node.tagName === 'view') {\n return h(\n 'div',\n {\n class: 'custom-view-container',\n },\n [children[curIndex.value]]\n );\n }\n\n if (node.tagName === 'ElRow') {\n return h(\n ElRow,\n {\n ...node.properties,\n },\n children\n );\n }\n\n if (node.tagName === 'ElCol') {\n return h(\n ElCol,\n {\n ...node.properties,\n },\n children\n );\n }\n\n if (node.tagName === 'ElCard') {\n \n return h(\n ElCard,\n {\n ...node.properties,\n },\n children\n );\n }\n\n if (node.tagName === 'CoreCard') {\n const slots: any = {};\n \n // 处理 header 插槽\n if (node.slots?.header) {\n slots.header = () => {\n return node.slots.header.map((slotItem: any) => {\n return hastToVNode(slotItem, index);\n });\n };\n }\n \n // 处理默认插槽\n if (children && children.length > 0) {\n slots.default = () => children;\n }\n \n return h(\n CoreCard,\n {\n ...node.properties,\n },\n slots\n );\n }\n\n if (node.tagName === 'ElForm') {\n const children = node.children?.map(child => hastToVNode(child, curInit));\n curInit++;\n return h(\n ElForm,\n {\n ref: formRefs.value.set,\n model: hitlData.value[index!],\n ...node.properties,\n disabled: checkDisabled(node),\n },\n children\n )\n }\n\n if (node.tagName === 'ElFormItem') {\n return h(\n ElFormItem,\n {\n ...node.properties,\n },\n children\n )\n }\n\n if (node.tagName === 'ElButton') {\n let payload = node.properties?.payload;\n if (node.parentScope === 'table') {\n payload = row;\n }\n return h(\n ElButton,\n {\n ...node.properties,\n disabled: checkDisabled(node),\n onClick: () => {\n btnClick(index!, node.properties?.action, payload, node.parentScope);\n },\n },\n children\n )\n }\n\n if (node.tagName === 'ElSelect') {\n return h(\n ElSelect,\n {\n ...node.properties,\n disabled: checkDisabled(node),\n modelValue: hitlData.value[index!][node.properties?.formProp],\n 'onUpdate:modelValue': (value) => {\n hitlData.value[index!][node.properties?.formProp] = value;\n },\n },\n children\n )\n }\n\n if (node.tagName === 'ElDatePicker') {\n return h(\n ElDatePicker,\n {\n ...node.properties,\n disabled: checkDisabled(node),\n modelValue: hitlData.value[index!][node.properties?.formProp],\n 'onUpdate:modelValue': (value) => {\n hitlData.value[index!][node.properties?.formProp] = value;\n },\n },\n children\n )\n }\n\n if (node.tagName === 'ElInput') {\n return h(\n ElInput,\n {\n ...node.properties,\n disabled: checkDisabled(node),\n modelValue: hitlData.value[index!][node.properties?.formProp],\n 'onUpdate:modelValue': (value) => {\n hitlData.value[index!][node.properties?.formProp] = value;\n },\n },\n children\n )\n }\n\n if (node.tagName === 'ElRadioGroup') {\n return h(\n ElRadioGroup,\n {\n ...node.properties,\n disabled: checkDisabled(node),\n modelValue: hitlData.value[index!][node.properties?.formProp],\n 'onUpdate:modelValue': (value) => {\n hitlData.value[index!][node.properties?.formProp] = value as string;\n }\n },\n children\n )\n }\n\n if (node.tagName === 'ElRadio') {\n\n return h(\n ElRadio,\n {\n ...node.properties,\n disabled: checkDisabled(node),\n },\n children\n )\n }\n \n if (node.tagName === 'ElTable') {\n return h(\n CoreTable,\n {\n ...node.properties,\n },\n children\n )\n }\n\n if (node.tagName === 'ElTableColumn') {\n return h(\n ElTableColumn,\n {\n ...node.properties,\n },\n {\n default: (scope) => {\n const children = node.children?.map(child => hastToVNode(child, curInit, scope.row));\n const index = node.children?.findIndex(child => child.value === scope.row[node.properties?.prop]);\n if (index === -1) {\n return children;\n }\n return children?.[index];\n },\n }\n )\n }\n\n if (node.tagName === 'CoreText') {\n return h(\n CoreText,\n {\n ...node.properties,\n }\n )\n }\n\n if (node.tagName === 'CoreTips') {\n return h(\n CoreTips,\n {\n ...node.properties,\n }\n )\n }\n\n if (node.tagName === 'CoreResult') {\n return h(\n CoreResult,\n {\n ...node.properties,\n }\n )\n }\n\n if (node.tagName === 'CoreChart') {\n return h(\n CoreChart,\n {\n ...node.properties,\n }\n )\n }\n \n // 处理CorePilot代码块\n if (node.tagName === \"pre\") {\n const codeNode = node.children?.find(child => child.tagName === \"code\");\n if (codeNode) {\n if (codeNode.properties?.className?.includes(\"language-CorePilot\")) {\n const code = codeNode.children?.[0]?.value || '';\n // 检查 JSON 是否完整\n if (!isCompleteJSON(code)) {\n // JSON 不完整,显示骨架屏\n return renderSkeleton();\n }\n try {\n const schema = JSON.parse(code);\n const viewTree = parseCorePilot(schema);\n const children = hastToVNode(viewTree, curInit)\n return h(\"div\", {\n class: \"hitl-wrapper\",\n }, [children]);\n } catch (error) {\n // JSON 解析失败,可能是格式错误,显示骨架屏\n return renderSkeleton();\n }\n }\n }\n }\n \n // 其他普通元素\n return h(\n node.tagName,\n node.properties,\n children\n );\n \n case \"text\":\n return node.value.trim();\n \n default:\n return null;\n }\n };\n\n onUpdated(() => {\n curInit = 0;\n })\n\n return {\n hastToVNode,\n ast,\n container,\n renderComplete,\n isRewrite,\n getContentText,\n };\n },\n render() {\n return (\n <div\n ref=\"x-markdown-container\"\n class=\"x-markdown\"\n >\n {\n this.hastToVNode(this.ast)\n }\n </div>\n );\n },\n});"],"names":["checkAndReturnRefList","text","reg","match","exec","refListStr","refList","JSON","parse","error","isCompleteJSON","jsonStr","trim","length","trimmed","firstChar","name","props","type","String","default","autoHideThinking","Boolean","typing","speed","Number","isHistoryMessage","historyInputs","Object","expose","emits","setup","emit","container","useTemplateRef","startTime","ref","Date","now","endTime","context","pendingImages","Set","isInitAnimation","tagComplete","hitlData","formRefs","useTemplateRefsList","curIndex","curInit","ast","isRewrite","streamCall","stream","value","streamGener","createStreamGenerator","updateSummaryClasses","mdText","summaryDivReg","isFirstSummary","replace","summaryTag","divContent","divEnd","isDivComplete","updatedSummary","formatText","computed","content","includes","res","duration","toFixed","checkDisabled","node","properties","parentScope","disabled","watch","v","o","oldText","startsWith","reset","update","stop","checkReg","test","setSpeed","immediate","refConfig","getRefConfig","refContainer","querySelector","textContent","renderComplete","debounce","activeRef","newVal","oldVal","getAttribute","target","find","item","link","getTargeElement","e","tagName","isInRefContainer","classList","contains","isRefContainer","parentElement","handleMouseOver","handleAClick","stopPropagation","preventDefault","href","id","title","ext","split","pop","window","open","ElMessage","btnClick","index","action","payload","console","log","validate","handleClick","highlight","page","source","data","getContentText","innerText","onMounted","addEventListener","onBeforeUnmount","removeEventListener","processNewImages","newImages","querySelectorAll","forEach","img","has","add","setPlaceholderDimensions","complete","handleImageLoad","handleImageError","containerWidth","offsetWidth","naturalWidth","style","maxWidth","naturalHeight","ratio","maxHeight","Math","min","delete","setAttribute","opacity","md","unified","use","remarkParse","remarkBreaks","remarkGfm","singleTilde","remarkMath","remarkGemoji","remarkRehype","allowDangerousHtml","rehypeRaw","rehypeKatex","rehypeStringify","collectFormsFromSchema","schema","formDataList","formData","push","Array","isArray","children","child","computedForm","mdAst","preNodes","findPreNodes","preNode","codeNode","className","code","run","nextTick","details","summary","Accordion","renderSkeleton","h","class","hastToVNode","row","blackTagNames","map","ElConfigProvider","locale","zhCN","formatChildren","fileType","ElTimeline","ElRow","ElCol","ElCard","slots","header","slotItem","CoreCard","ElForm","set","model","ElFormItem","ElButton","onClick","ElSelect","modelValue","formProp","ElDatePicker","ElInput","ElRadioGroup","ElRadio","CoreTable","ElTableColumn","scope","findIndex","prop","CoreText","CoreTips","CoreResult","CoreChart","viewTree","parseCorePilot","onUpdated","render","_createVNode"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA,MAAMA,wBAAyBC,UAAiB;AAC9C,QAAMC,MAAM;AACZ,QAAMC,QAAQD,IAAIE,KAAKH,IAAI;AAC3B,MAAI,CAACE,OAAO;AACV,WAAO,CAAA;AAAA,EACT;AACA,QAAME,aAAaF,MAAM,CAAC;AAC1B,MAAI;AACF,UAAMG,UAAUC,KAAKC,MAAMH,UAAU;AACrC,WAAOC;AAAAA,EACT,SAASG,OAAO;AACd,WAAO,CAAA;AAAA,EACT;AACF;AAMA,MAAMC,iBAAkBC,aAA6B;AACnD,MAAI,CAACA,WAAWA,QAAQC,KAAI,EAAGC,WAAW,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,QAAMC,UAAUH,QAAQC,KAAI;AAG5B,QAAMG,YAAYD,QAAQ,CAAC;AAC3B,MAAIC,cAAc,OAAOA,cAAc,KAAK;AAC1C,WAAO;AAAA,EACT;AAGA,MAAI;AACFR,SAAKC,MAAMM,OAAO;AAClB,WAAO;AAAA,EACT,SAASL,OAAO;AAEd,WAAO;AAAA,EACT;AACF;AASA,MAAA,4CAA+B;AAAA,EAC7BO,MAAM;AAAA,EACNC,OAAO;AAAA,IACLhB,MAAM;AAAA,MACJiB,MAAMC;AAAAA,MACNC,SAAS;AAAA;IAEXC,kBAAkB;AAAA,MAChBH,MAAMI;AAAAA,MACNF,SAAS;AAAA;IAEXG,QAAQ;AAAA,MACNL,MAAMI;AAAAA,MACNF,SAAS;AAAA;IAEXI,OAAO;AAAA,MACLN,MAAMO;AAAAA,MACNL,SAAS;AAAA;IAEXM,kBAAkB;AAAA,MAChBR,MAAMI;AAAAA,MACNF,SAAS;AAAA;IAEXO,eAAe;AAAA,MACbT,MAAMU;AAAAA,MACNR,SAASA,OAAO,CAAA;AAAA,IAClB;AAAA;EAEFS,QAAQ,CACN,gBAAgB;AAAA,EAElBC,OAAO,CAAC,yBAAyB,yBAAyB,mBAAmB,gBAAgB,YAAY;AAAA,EACzGC,MAAMd,OAAO;AAAA,IAAEe;AAAAA,EAAK,GAAG;AACrB,UAAMC,YAAYC,eAA4B,sBAAsB;AACpE,UAAMC,YAAYC,IAAYC,KAAKC,IAAG,CAAE;AACxC,UAAMC,UAAUH,IAAY,SAAS;AACrC,UAAMI,UAAUJ,IAAI,EAAE;AACtB,UAAMK,gBAAgB,oBAAIC;AAC1B,UAAMC,kBAAkBP,IAAI,KAAK;AACjC,UAAMQ,cAAcR,IAAI,KAAK;AAC7B,UAAMS,WAAWT,IAAmC,EAAE;AACtD,UAAMU,WAAWC,oBAAmB;AACpC,UAAMC,WAAWZ,IAAI,CAAC;AACtB,QAAIa,UAAU;AACd,UAAMC,MAAMd,IAAS,IAAI;AACzB,UAAMe,YAAYf,IAAI,KAAK;AAE3B,UAAMgB,aAAcC,YAAmB;AACrCb,cAAQc,QAAQd,QAAQc,QAAQD;AAAAA,IAClC;AAEA,UAAME,cAAcnB,IAA8CoB,sBAAsBJ,YAAYnC,MAAMO,KAAK,CAAC;AAEhH,UAAMiC,uBAAwBC,YAAmB;AAC/C,YAAMC,gBAAgB;AACtB,UAAIC,iBAAiB;AAErB,aAAOF,OAAOG,QAAQF,eAAe,CAACxD,OAAO2D,YAAYC,YAAYC,WAAW;AAC9E,cAAMC,gBAAgBD,WAAW;AACjC,cAAME,iBAAiBJ,WAAWD,QAChC,eACC1D,CAAAA,WAAU;AACT,cAAIyD,gBAAgB;AAClBA,6BAAiB;AACjB,mBAAOzD;AAAAA,UACT;AACA,iBAAO,mBAAmB8D,gBAAgB,WAAW,SAAS;AAAA,QAChE,CACF;AACA,eAAO,GAAGC,cAAc;AAAA,EAAKH,UAAU,GAAGC,MAAM;AAAA,MAClD,CAAC;AAAA,IACH;AAEA,UAAMG,aAAaC,SAAS,MAAM;AAChC,UAAI,CAACnD,MAAMI,iBAAkB,QAAOmB,QAAQc;AAC5C,UAAIe,UAAU7B,QAAQc;AACtBe,gBAAUZ,qBAAqBY,OAAO;AACtCA,gBAAUA,QAAQR,QAAQ,kDAAkD,GAAG;AAC/E,UAAIQ,QAAQC,SAAS,YAAY,GAAG;AAClC,YAAI/B,QAAQe,UAAU,WAAW;AAC/Bf,kBAAQe,QAAQjB,KAAKC,IAAG;AAAA,QAC1B;AAEA,cAAMiC,MAAMvE,sBAAsBqE,OAAO;AAEzC,YAAIpE,OAAOoE,QAAQR,QAAQ,wCAAwC,CAAC1D,OAAOkE,aAAY;AAErFA,UAAAA,WAAUA,SAAQR,QAAQ,kCAAkC,CAAC1D,QAAOkE,aAAY;AAC9E,kBAAMG,aAAajC,QAAQe,QAAQnB,UAAUmB,SAAS,KAAMmB,QAAQ,CAAC;AACrE,mBAAO;AAAA,sBACGD,WAAW,MAAMA,WAAW,MAAM,EAAE,IAAID,IAAI1D,SAAS,0HAA0H0D,2BAAK1D,MAAM,OAAO,EAAE;AAAA;AAAA,UAE/M,CAAC;AAEDwD,UAAAA,WAAUA,SAAQR,QAAQ,0BAA0B,sCAAsC;AAE1F,iBAAO,YAAYQ,QAAO;AAAA,QAC5B,CAAC;AAED,eAAOpE;AAAAA,MACT;AACA,aAAOoE;AAAAA,IACT,CAAC;AAID,UAAMK,gBAAiBC,UAAsB;AAC3C,YAAM;AAAA,QAAEC,aAAa,CAAA;AAAA,QAAIC;AAAAA,MAAY,IAAIF;AACzC,YAAM;AAAA,QAAEG;AAAAA,MAAS,IAAIF;AACrB,UAAIE,UAAU;AACZ,eAAO;AAAA,MACT;AACA,UAAID,gBAAgB,QAAQ;AAC1B,eAAO5D,MAAMS,oBAAoB,CAACyB,UAAUG;AAAAA,MAC9C;AACA,aAAO;AAAA,IACT;AAEAyB,UAAM,MAAM,CAAC9D,MAAMhB,MAAMgB,MAAMM,MAAM,GAAG,CAACyD,GAAGC,MAAM;;AAChD,YAAM,CAAChF,MAAMsB,MAAM,IAAIyD;AACvB,YAAM,CAACE,OAAO,IAAID,KAAK,CAAA;AACvB,UAAI,CAAEhF,KAAgBkF,WAAWD,OAAiB,GAAG;AACnD3B,0BAAYD,UAAZC,mBAAmB6B;AACnB5C,gBAAQc,QAAQ;AAAA,MAClB;AACA,UAAIrD,MAAM;AACRsD,0BAAYD,UAAZC,mBAAmB8B,OAAOpF;AAC1B,YAAI,CAACsB,QAAQ;AACXgC,4BAAYD,UAAZC,mBAAmB+B;AACnB;AAAA,QACF;AAEA,cAAMC,WAAW;AACjB,YAAI,CAAC3C,YAAYU,SAASiC,SAASC,KAAKvF,IAAc,GAAG;AACvD2C,sBAAYU,QAAQ;AACpBC,4BAAYD,UAAZC,mBAAmBkC,SAAS;AAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG;AAAA,MACDC,WAAW;AAAA,IACb,CAAC;AAGD,UAAMC,YAAYvD,IAAsB,EAAE;AAE1C,UAAMwD,eAAeA,MAAM;;AACzB,YAAMC,gBAAgB5D,eAAUqB,UAAVrB,mBAAiC6D,cAAc;AACrEH,gBAAUrC,QAAQ/C,KAAKC,OAAMqF,6CAAcE,gBAAe,IAAI;AAC9D/D,WAAK,mBAAmB2D,UAAUrC,KAAK;AAAA,IACzC;AACA,UAAM0C,iBAAiBC,SAAS,MAAM;AACpCL,mBAAY;AAAA,IACd,GAAG,GAAG;AAGN,UAAMM,YAAY9D,IAAwB,IAAI;AAE9C2C,UAAM,MAAMvC,QAAQc,OAAO0C,gBAAgB;AAAA,MACzCN,WAAW;AAAA,IACb,CAAC;AAEDX,UAAMmB,WAAW,CAACC,QAAQC,WAAW;AACnC,UAAID,WAAWC,QAAQ;AACrB,YAAID,QAAQ;AACV,gBAAMlG,OAAOkG,OAAOE,aAAa,UAAU;AAC3C,gBAAMC,SAASX,UAAUrC,MAAMiD,KAAMC,UAAS;AAC5C,mBAAOA,KAAKC,SAASxG;AAAAA,UACvB,CAAC;AACD+B,eAAK,yBAAyBsE,MAAM;AAAA,QACtC,OAAO;AACLtE,eAAK,yBAAyB,EAAE;AAAA,QAClC;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM0E,kBAAmBC,OAAkB;AACzC,YAAML,SAASK,EAAEL;AACjB,UAAIA,OAAOM,YAAY,QAAQ;AAC7B,cAAMC,mBAAmBP,OAAOQ,UAAUC,SAAS,kBAAkB;AACrE,cAAMC,iBAAiBV,OAAOQ,UAAUC,SAAS,gBAAgB;AACjE,YAAIF,oBAAoBG,gBAAgB;AACtC,cAAI,CAACA,gBAAgB;AACnB,mBAAOV,OAAOW;AAAAA,UAChB;AACA,iBAAOX;AAAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,UAAMY,kBAAmBP,OAAkB;AACzC,YAAML,SAASI,gBAAgBC,CAAC;AAChC,UAAIL,QAAQ;AACVJ,kBAAU5C,QAAQgD;AAClB;AAAA,MACF;AACAJ,gBAAU5C,QAAQ;AAAA,IACpB;AAEA,UAAM6D,eAAe,OAAOR,MAAkB;AAC5CA,QAAES,gBAAe;AACjBT,QAAEU,eAAc;AAChB,YAAMf,SAASK,EAAEL;AACjB,YAAMgB,OAAOhB,OAAOD,aAAa,MAAM;AACvC,YAAMkB,KAAKjB,OAAOD,aAAa,SAAS,KAAKC,OAAOD,aAAa,QAAQ;AACzE,YAAMmB,QAAQlB,OAAOD,aAAa,WAAW,KAAKC,OAAOD,aAAa,UAAU;AAChF,UAAI,CAACiB,MAAM;AACT;AAAA,MACF;AAEA,YAAMG,MAAMH,KAAKI,MAAM,GAAG,EAAEC,IAAG;AAE/B,UAAI,CAACJ,IAAI;AACPK,eAAOC,KAAKP,MAAM,QAAQ;AAC1B;AAAA,MACF;AACAQ,gBAAU,UAAU;AAEpB9F,WAAK,gBAAgB;AAAA,QACnBwF;AAAAA,QACAD;AAAAA,QACAE;AAAAA,QACAH;AAAAA,MACF,CAAC;AAGD;AAAA,IACF;AAEA,UAAMS,WAAW,OAAOC,OAAeC,QAAgBC,SAAcrD,gBAAmC;;AACtG,UAAIoD,WAAW,cAAc;AAC3BjF,iBAASM,SAAS;AAClB;AAAA,MACF;AACA,UAAI2E,WAAW,cAAc;AAC3BjF,iBAASM,SAAS;AAClB;AAAA,MACF;AACA,UAAI2E,WAAW,iBAAiB;AAC9B9E,kBAAUG,QAAQ;AAClB6E,gBAAQC,IAAI,aAAajF,UAAUG,KAAK;AACxC;AAAA,MACF;AAEA,UAAIiB,MAAM;AAAA,QACR0D;AAAAA,QACAC,SAAS,CAAA;AAAA;AAGX,UAAIA,WAAWrD,gBAAgB,QAAQ;AACrCN,cAAM;AAAA,UACJ0D;AAAAA,UACAC;AAAAA;MAEJ,OAAO;AACL,gBAAMpF,cAASQ,MAAM0E,KAAK,MAApBlF,mBAAuBuF;AAC7B9D,cAAM;AAAA,UACJ0D;AAAAA,UACAC,SAAS;AAAA,YACP,GAAGrF,SAASS,MAAM0E,KAAK;AAAA,YACvB,GAAGE;AAAAA,UACL;AAAA;MAEJ;AACA,UAAI/E,UAAUG,SAAS2E,OAAO9C,WAAW,OAAO,GAAG;AACjDhC,kBAAUG,QAAQ;AAAA,MACpB;AACAtB,WAAK,cAAcuC,GAAG;AAAA,IACxB;AAEA,UAAM+D,cAAe3B,OAAkB;AAErC,UAAKA,EAAEL,OAAuBM,YAAY,KAAK;AAC7CO,qBAAaR,CAAC;AACd;AAAA,MACF;AAEA,YAAML,SAASI,gBAAgBC,CAAC;AAChC,UAAIL,QAAQ;AACV,cAAMrG,OAAOqG,OAAOD,aAAa,UAAU;AAC3C,cAAMkC,YAAYhI,KAAKC,MAAM8F,OAAOD,aAAa,eAAe,KAAK,IAAI;AACzE,cAAMmC,OAAO/G,OAAO6E,OAAOD,aAAa,YAAY,CAAC;AACrD,cAAMkB,KAAKjB,OAAOD,aAAa,IAAI;AACnC,cAAMoC,SAAS9C,UAAUrC,MAAMiD,KAAMC,UAAS;AAC5C,iBAAOA,KAAKC,SAASxG;AAAAA,QACvB,CAAC;AACD,cAAMyI,OAAO;AAAA,UACX,GAAGD;AAAAA,UACHF;AAAAA,UACAC;AAAAA,UACAjB;AAAAA;AAEFvF,aAAK,yBAAyB0G,IAAI;AAAA,MACpC;AAAA,IACF;AAEA,UAAMC,iBAAiBA,MAAM;;AAC3B,cAAO1G,eAAUqB,UAAVrB,mBAAiB2G;AAAAA,IAC1B;AAEAC,cAAU,MAAM;AACb5G,gBAAUqB,MAAsBwF,iBAAiB,aAAa5B,eAAe;AAC7EjF,gBAAUqB,MAAsBwF,iBAAiB,SAASR,WAAW;AAAA,IACxE,CAAC;AAEDS,oBAAgB,MAAM;AACnB9G,gBAAUqB,MAAsB0F,oBAAoB,aAAa9B,eAAe;AAChFjF,gBAAUqB,MAAsBwF,iBAAiB,SAASR,WAAW;AAAA,IACxE,CAAC;AAMD,UAAMW,mBAAmBA,MAAM;AAC7B,UAAI,CAAChH,UAAUqB,MAAO;AAEtB,YAAM4F,YAAYjH,UAAUqB,MAAM6F,iBAChC,kCACF;AAEAD,gBAAUE,QAASC,SAAQ;AACzB,YAAI5G,cAAc6G,IAAID,GAAG,EAAG;AAC5B5G,sBAAc8G,IAAIF,GAAG;AAGrBG,iCAAyBH,GAAG;AAG5B,YAAIA,IAAII,UAAU;AAChBC,0BAAgBL,GAAG;AAAA,QACrB,OAAO;AACLA,cAAIP,iBAAiB,QAAQ,MAAMY,gBAAgBL,GAAG,CAAC;AACvDA,cAAIP,iBAAiB,SAAS,MAAMa,iBAAiBN,GAAG,CAAC;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH;AAGA,UAAMG,2BAA4BH,SAAQ;AACxC,YAAMO,iBAAiBP,IAAIpC,cAAc4C;AACzC,UAAIR,IAAIS,eAAeF,gBAAgB;AACrCP,YAAIU,MAAMC,WAAW;AAAA,MACvB;AAEA,UAAIX,IAAIS,gBAAgBT,IAAIY,eAAe;AACzC,cAAMC,QAAQb,IAAIY,gBAAgBZ,IAAIS;AACtCT,YAAIU,MAAMI,YAAY,GAAGC,KAAKC,IAAI,KAAKT,iBAAiBM,KAAK,CAAC;AAAA,MAChE;AAAA,IACF;AAGA,UAAMR,kBAAmBL,SAAQ;AAC/B5G,oBAAc6H,OAAOjB,GAAG;AACxBA,UAAIkB,aAAa,kBAAkB,MAAM;AACzClB,UAAIvC,UAAUyC,IAAI,QAAQ;AAC1BF,UAAIU,MAAMS,UAAU;AACpBnB,UAAIL,oBAAoB,QAAQU,eAAe;AAC/CL,UAAIL,oBAAoB,SAASW,gBAAgB;AAAA,IACnD;AAGA,UAAMA,mBAAoBN,SAAQ;AAChC5G,oBAAc6H,OAAOjB,GAAG;AACxBA,UAAIkB,aAAa,kBAAkB,MAAM;AACzClB,UAAIvC,UAAUyC,IAAI,YAAY;AAC9BF,UAAIU,MAAMI,YAAY;AACtBd,UAAIL,oBAAoB,QAAQU,eAAe;AAC/CL,UAAIL,oBAAoB,SAASW,gBAAgB;AAAA,IACnD;AAGA,UAAMc,KAAKC,UACRC,IAAIC,WAAW,EACfD,IAAIE,YAAY,EAChBF,IAAIG,WAAW;AAAA,MAAEC,aAAa;AAAA,IAAM,CAAC,EACrCJ,IAAIK,UAAU,EACdL,IAAIM,YAAY,EAChBN,IAAIO,cAAc;AAAA,MAAEC,oBAAoB;AAAA,IAAK,CAAC,EAC9CR,IAAIS,SAAS,EACbT,IAAIU,WAAW,EACfV,IAAIW,eAAe;AAQtB,UAAMC,yBAAyBA,CAACC,QAAaC,iBAA6C;;AACxF,UAAI,CAACD,UAAU,OAAOA,WAAW,SAAU;AAG3C,UAAIA,OAAOtK,SAAS,QAAQ;AAC1B,cAAMwK,WAAW;AAAA,UACf,KAAGF,YAAO5G,eAAP4G,mBAAmB9C,SAAQ;;UAE9B,GAAGzH,MAAMU,iBAAiB,CAAA;AAAA;AAE5B8J,qBAAaE,KAAKD,QAAQ;AAC1B;AAAA,MACF;AAGA,UAAIE,MAAMC,QAAQL,OAAOM,QAAQ,GAAG;AAClCN,eAAOM,SAAS1C,QAAS2C,WAAU;AACjCR,iCAAuBQ,OAAON,YAAY;AAAA,QAC5C,CAAC;AAAA,MACH;AAAA,IACF;AAOA,UAAMO,eAAgBC,WAAe;AACnC,YAAMR,eAA2C,CAAA;AAGjD,YAAMS,WAAkB,CAAA;AACxB,YAAMC,eAAgBxH,UAAc;AAClC,YAAI,CAACA,KAAM;AACX,YAAIA,KAAKiC,YAAY,OAAO;AAC1BsF,mBAASP,KAAKhH,IAAI;AAAA,QACpB;AACA,YAAIiH,MAAMC,QAAQlH,KAAKmH,QAAQ,GAAG;AAChCnH,eAAKmH,SAAS1C,QAAQ+C,YAAY;AAAA,QACpC;AAAA,MACF;AAGA,UAAIP,MAAMC,QAAQI,MAAMH,QAAQ,GAAG;AACjCG,cAAMH,SAAS1C,QAAQ+C,YAAY;AAAA,MACrC;AAGAD,eAAS9C,QAASgD,aAAiB;;AACjC,cAAMC,YAAWD,aAAQN,aAARM,mBAAkB7F,KAAMwF,WAAeA,MAAMnF,YAAY;AAC1E,aAAIyF,gDAAUzH,eAAVyH,mBAAsBC,cAAtBD,mBAAiC/H,SAAS,uBAAuB;AACnE,cAAI;AACF,kBAAMiI,SAAOF,oBAASP,aAATO,mBAAoB,OAApBA,mBAAwB/I,UAAS;AAC9C,gBAAIiJ,MAAM;AACR,oBAAMf,SAASjL,KAAKC,MAAM+L,IAAI;AAE9BhB,qCAAuBC,QAAQC,YAAY;AAAA,YAC7C;AAAA,UACF,SAAShL,OAAO;AACd0H,oBAAQ1H,MAAM,qCAAqCA,KAAK;AAAA,UAC1D;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAOgL;AAAAA,IACT;AAEA1G,UACE,MAAMZ,WAAWb,OACjB,OAAOrD,SAAS;AAEdgD,gBAAU;AACV,YAAMgJ,QAAQ,MAAMxB,GAAG+B,IAAI/B,GAAGjK,MAAMP,IAAI,CAAC;AAEzC,YAAMwL,eAAeO,aAAaC,KAAK;AACvCpJ,eAASS,QAAQmI;AAEjB,YAAMgB,SAAQ;AACdvJ,UAAII,QAAQ2I;AAGZQ,eAASxD,gBAAgB;AACzBwD,eAAS,MAAM;;AACb,cAAMC,WAAUzK,eAAUqB,UAAVrB,mBAAiB6D,cAAc;AAC/C,cAAM6G,UAAUD,mCAAS5G,cAAc;AACvC,YAAI6G,WAAW,CAAChK,gBAAgBW,OAAO;AACrCX,0BAAgBW,QAAQ;AACxB,cAAIsJ,UAAUF,OAAQ;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH,GACA;AAAA,MAAEhH,WAAW;AAAA,IAAK,CACpB;AAMA,UAAMmH,iBAAiBA,MAAM;AAC3B,aAAOC,EAAE,OAAO;AAAA,QACdC,OAAO;AAAA,MACT,GAAG;AAAA;AAAA,QAEDD,EAAE,OAAO;AAAA,UACPC,OAAO;AAAA,QACT,GAAG,CACDD,EAAE,OAAO;AAAA,UAAEC,OAAO;AAAA,QAAkB,CAAC,GACrCD,EAAE,OAAO;AAAA,UAAEC,OAAO;AAAA,SAAkB,CAAC,CACtC;AAAA;AAAA,QAEDD,EAAE,OAAO;AAAA,UAAEC,OAAO;AAAA,QAAmC,CAAC;AAAA,QACtDD,EAAE,OAAO;AAAA,UAAEC,OAAO;AAAA,QAAqC,CAAC;AAAA,QACxDD,EAAE,OAAO;AAAA,UAAEC,OAAO;AAAA,QAAoC,CAAC;AAAA,QACvDD,EAAE,OAAO;AAAA,UAAEC,OAAO;AAAA,QAAmC,CAAC;AAAA,QACtDD,EAAE,OAAO;AAAA,UAAEC,OAAO;AAAA,SAAsC;AAAA,MAAC,CAC1D;AAAA,IACH;AAQA,UAAMC,cAAcA,CAACrI,MAAMqD,OAAgBiF,QAAc;;AACvD,UAAI,CAACtI,KAAM,QAAO;AAClB,UAAImH,WAAkB,CAAA;AACtB,YAAMoB,gBAAgB,CAAC,OAAO,OAAO,QAAQ,QAAQ;AAErD,UAAI,CAACA,cAAc5I,SAASK,KAAKiC,OAAO,GAAG;AACzCkF,qBAAWnH,gBAAKmH,aAALnH,mBAAewI,QAAfxI,4BAAqBoH,WAASiB,YAAYjB,OAAO/D,KAAK,OAAM,CAAA;AAAA,MACzE;AACA,cAAQrD,KAAKzD,MAAI;AAAA,QACf,KAAK;AACH,iBAAO4L,EACL,OACA;AAAA,YAAEC,OAAO;AAAA,UAAgB,GACzBD,EAAEM,kBAAkB;AAAA,YAClBC,QAAQC;AAAAA,aACPxB,QAAQ,CACb;AAAA,QAEF,KAAK;AACH,cAAInH,KAAKiC,YAAY,OAAO;AAC1B,kBAAM2G,iBAAiB,CACrB;AAAA,cACErM,MAAM;AAAA,cACN0F,SAAS;AAAA,cACThC,YAAY;AAAA,gBACVmI,OAAO;AAAA,cACT;AAAA,YACF,GACA,GAAGpI,KAAKmH,QAAQ;AAElB,kBAAMA,YAAWyB,iDAAgBJ,IAAIpB,WAASiB,YAAYjB,OAAO/D,KAAK;AACtE,mBAAO8E,EAAE,QAAQ;AAAA,cACf,GAAGnI,KAAKC;AAAAA,cACRmI,OAAO;AAAA,eACNjB,SAAQ;AAAA,UACb;AACA,cAAInH,KAAKiC,YAAY,QAAQ;AAC3B,mBAAOkG,EAAE,QAAQ;AAAA,cACb,GAAGnI,KAAKC;AAAAA,eAEVkH,QACJ;AAAA,UACA;AAEA,cAAInH,KAAKiC,YAAY,OAAO;AAC1B,mBAAOkG,EAAE,OAAO;AAAA,cACd,GAAGnI,KAAKC;AAAAA,cACRmI,OAAO;AAAA,cACP,kBAAkB;AAAA;AAAA,YACpB,CAAC;AAAA,UACH;AAEA,cAAIpI,KAAKiC,YAAY,KAAK;AACxB,kBAAMU,SAAO3C,UAAKC,eAALD,mBAAiB2C,SAAQ;AACtC,kBAAMkG,WAAWlG,OAAOA,KAAKI,MAAM,GAAG,EAAEC,IAAG,IAAK;AAChD,mBAAOmF,EACL,KACA;AAAA,cACE,GAAGnI,KAAKC;AAAAA,cACRmI,OAAO;AAAA,cACP,kBAAkBS;AAAAA,eAEpB1B,QACF;AAAA,UACF;AACA,cAAInH,KAAKiC,YAAY,cAAc;AACjC,mBAAOkG,EACLW,YACA;AAAA,cACE,GAAG9I,KAAKC;AAAAA,eAEVkH,QACF;AAAA,UACF;AACA,cAAInH,KAAKiC,YAAY,SAAS;AAC5B,mBAAOkG,EACL,OACA;AAAA,cACEC,OAAO;AAAA,eAET,CACED,EACE,SACAhB,QACF,CAAC,CAEL;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,QAAQ;AAC3B,mBAAOkG,EACL,OACA;AAAA,cACEC,OAAO;AAAA,eAET,CAACjB,SAAS9I,SAASM,KAAK,CAAC,CAC3B;AAAA,UACF;AAEA,cAAIqB,KAAKiC,YAAY,SAAS;AAC5B,mBAAOkG,EACLY,OACA;AAAA,cACA,GAAG/I,KAAKC;AAAAA,eAERkH,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,SAAS;AAC5B,mBAAOkG,EACLa,OACA;AAAA,cACD,GAAGhJ,KAAKC;AAAAA,eAEPkH,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,UAAU;AAE7B,mBAAOkG,EACLc,QACA;AAAA,cACE,GAAGjJ,KAAKC;AAAAA,eAEVkH,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,YAAY;AAC/B,kBAAMiH,QAAa,CAAA;AAGnB,iBAAIlJ,UAAKkJ,UAALlJ,mBAAYmJ,QAAQ;AACtBD,oBAAMC,SAAS,MAAM;AACnB,uBAAOnJ,KAAKkJ,MAAMC,OAAOX,IAAKY,cAAkB;AAC9C,yBAAOf,YAAYe,UAAU/F,KAAK;AAAA,gBACpC,CAAC;AAAA,cACH;AAAA,YACF;AAGA,gBAAI8D,YAAYA,SAASjL,SAAS,GAAG;AACnCgN,oBAAMzM,UAAU,MAAM0K;AAAAA,YACxB;AAEA,mBAAOgB,EACLkB,UACA;AAAA,cACE,GAAGrJ,KAAKC;AAAAA,eAEViJ,KACF;AAAA,UACF;AAEA,cAAIlJ,KAAKiC,YAAY,UAAU;AAC7B,kBAAMkF,aAAWnH,UAAKmH,aAALnH,mBAAewI,IAAIpB,WAASiB,YAAYjB,OAAO9I,OAAO;AACvEA;AACA,mBAAO6J,EACLmB,QACA;AAAA,cACE7L,KAAKU,SAASQ,MAAM4K;AAAAA,cACpBC,OAAOtL,SAASS,MAAM0E,KAAK;AAAA,cAC3B,GAAGrD,KAAKC;AAAAA,cACRE,UAAUJ,cAAcC,IAAI;AAAA,eAE9BmH,SACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,cAAc;AACjC,mBAAOkG,EACLsB,YACA;AAAA,cACE,GAAGzJ,KAAKC;AAAAA,eAEVkH,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,YAAY;AAC/B,gBAAIsB,WAAUvD,UAAKC,eAALD,mBAAiBuD;AAC/B,gBAAIvD,KAAKE,gBAAgB,SAAS;AAChCqD,wBAAU+E;AAAAA,YACZ;AACA,mBAAOH,EACLuB,UACA;AAAA,cACC,GAAG1J,KAAKC;AAAAA,cACRE,UAAUJ,cAAcC,IAAI;AAAA,cAC3B2J,SAASA,MAAM;;AACbvG,yBAASC,QAAQrD,MAAAA,KAAKC,eAALD,gBAAAA,IAAiBsD,QAAQC,SAASvD,KAAKE,WAAW;AAAA,cACrE;AAAA,eAEFiH,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,YAAY;AAC/B,mBAAOkG,EACLyB,UACA;AAAA,cACA,GAAG5J,KAAKC;AAAAA,cACRE,UAAUJ,cAAcC,IAAI;AAAA,cAC1B6J,YAAY3L,SAASS,MAAM0E,KAAK,GAAGrD,UAAKC,eAALD,mBAAiB8J,QAAQ;AAAA,cAC5D,uBAAwBnL,WAAU;;AAChCT,yBAASS,MAAM0E,KAAK,GAAGrD,MAAAA,KAAKC,eAALD,gBAAAA,IAAiB8J,QAAQ,IAAInL;AAAAA,cACtD;AAAA,eAEFwI,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,gBAAgB;AACnC,mBAAOkG,EACL4B,cACA;AAAA,cACA,GAAG/J,KAAKC;AAAAA,cACNE,UAAUJ,cAAcC,IAAI;AAAA,cAC5B6J,YAAY3L,SAASS,MAAM0E,KAAK,GAAGrD,UAAKC,eAALD,mBAAiB8J,QAAQ;AAAA,cAC5D,uBAAwBnL,WAAU;;AAChCT,yBAASS,MAAM0E,KAAK,GAAGrD,MAAAA,KAAKC,eAALD,gBAAAA,IAAiB8J,QAAQ,IAAInL;AAAAA,cACtD;AAAA,eAEFwI,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,WAAW;AAC9B,mBAAOkG,EACL6B,SACA;AAAA,cACE,GAAGhK,KAAKC;AAAAA,cACRE,UAAUJ,cAAcC,IAAI;AAAA,cAC5B6J,YAAY3L,SAASS,MAAM0E,KAAK,GAAGrD,UAAKC,eAALD,mBAAiB8J,QAAQ;AAAA,cAC5D,uBAAwBnL,WAAU;;AAChCT,yBAASS,MAAM0E,KAAK,GAAGrD,MAAAA,KAAKC,eAALD,gBAAAA,IAAiB8J,QAAQ,IAAInL;AAAAA,cACtD;AAAA,eAEFwI,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,gBAAgB;AACnC,mBAAOkG,EACL8B,cACA;AAAA,cACE,GAAGjK,KAAKC;AAAAA,cACRE,UAAUJ,cAAcC,IAAI;AAAA,cAC5B6J,YAAY3L,SAASS,MAAM0E,KAAK,GAAGrD,UAAKC,eAALD,mBAAiB8J,QAAQ;AAAA,cAC5D,uBAAwBnL,WAAU;;AAChCT,yBAASS,MAAM0E,KAAK,GAAGrD,MAAAA,KAAKC,eAALD,gBAAAA,IAAiB8J,QAAQ,IAAInL;AAAAA,cACtD;AAAA,eAEFwI,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,WAAW;AAE9B,mBAAOkG,EACL+B,SACA;AAAA,cACE,GAAGlK,KAAKC;AAAAA,cACRE,UAAUJ,cAAcC,IAAI;AAAA,eAE9BmH,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,WAAW;AAC9B,mBAAOkG,EACLgC,WACA;AAAA,cACC,GAAGnK,KAAKC;AAAAA,eAETkH,QACF;AAAA,UACF;AAEA,cAAInH,KAAKiC,YAAY,iBAAiB;AACpC,mBAAOkG,EACLiC,eACA;AAAA,cACA,GAAGpK,KAAKC;AAAAA,YACR,GACA;AAAA,cACExD,SAAU4N,WAAU;;AAClB,sBAAMlD,aAAWnH,MAAAA,KAAKmH,aAALnH,gBAAAA,IAAewI,IAAIpB,WAASiB,YAAYjB,OAAO9I,SAAS+L,MAAM/B,GAAG;AAClF,sBAAMjF,UAAQrD,MAAAA,KAAKmH,aAALnH,gBAAAA,IAAesK,UAAUlD,WAAK;;AAAIA,+BAAMzI,UAAU0L,MAAM/B,KAAItI,MAAAA,KAAKC,eAALD,gBAAAA,IAAiBuK,IAAI;AAAA;AAC/F,oBAAIlH,WAAU,IAAI;AAChB,yBAAO8D;AAAAA,gBACT;AACA,uBAAOA,aAAAA,gBAAAA,UAAW9D;AAAAA,cACpB;AAAA,YACF,CACF;AAAA,UACF;AAEA,cAAIrD,KAAKiC,YAAY,YAAY;AAC/B,mBAAOkG,EACLqC,UACA;AAAA,cACE,GAAGxK,KAAKC;AAAAA,YACV,CACF;AAAA,UACF;AAEA,cAAID,KAAKiC,YAAY,YAAY;AAC/B,mBAAOkG,EACLsC,UACA;AAAA,cACC,GAAGzK,KAAKC;AAAAA,YACT,CACF;AAAA,UACF;AAEA,cAAID,KAAKiC,YAAY,cAAc;AACjC,mBAAOkG,EACLuC,YACA;AAAA,cACE,GAAG1K,KAAKC;AAAAA,YACV,CACF;AAAA,UACF;AAEA,cAAID,KAAKiC,YAAY,aAAa;AAChC,mBAAOkG,EACLwC,WACA;AAAA,cACE,GAAG3K,KAAKC;AAAAA,YACV,CACF;AAAA,UACF;AAGA,cAAID,KAAKiC,YAAY,OAAO;AAC1B,kBAAMyF,YAAW1H,UAAKmH,aAALnH,mBAAe4B,KAAKwF,WAASA,MAAMnF,YAAY;AAChE,gBAAIyF,UAAU;AACZ,mBAAIA,oBAASzH,eAATyH,mBAAqBC,cAArBD,mBAAgC/H,SAAS,uBAAuB;AAClE,sBAAMiI,SAAOF,oBAASP,aAATO,mBAAoB,OAApBA,mBAAwB/I,UAAS;AAE9C,oBAAI,CAAC5C,eAAe6L,IAAI,GAAG;AAEzB,yBAAOM,eAAc;AAAA,gBACvB;AACA,oBAAI;AACF,wBAAMrB,SAASjL,KAAKC,MAAM+L,IAAI;AAC9B,wBAAMgD,WAAWC,eAAehE,MAAM;AACtC,wBAAMM,YAAWkB,YAAYuC,UAAUtM,OAAO;AAC9C,yBAAO6J,EAAE,OAAO;AAAA,oBACdC,OAAO;AAAA,kBACT,GAAG,CAACjB,SAAQ,CAAC;AAAA,gBACf,SAASrL,OAAO;AAEd,yBAAOoM,eAAc;AAAA,gBACvB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAGA,iBAAOC,EACLnI,KAAKiC,SACLjC,KAAKC,YACLkH,QACF;AAAA,QAEF,KAAK;AACH,iBAAOnH,KAAKrB,MAAM1C,KAAI;AAAA,QAExB;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAEA6O,cAAU,MAAM;AACdxM,gBAAU;AAAA,IACZ,CAAC;AAED,WAAO;AAAA,MACL+J;AAAAA,MACA9J;AAAAA,MACAjB;AAAAA,MACA+D;AAAAA,MACA7C;AAAAA,MACAwF;AAAAA;EAEJ;AAAA,EACA+G,SAAS;AACP,WAAAC,YAAA,OAAA;AAAA,MAAA,OAAA;AAAA,MAAA,SAAA;AAAA,IAAA,GAAA,CAMM,KAAK3C,YAAY,KAAK9J,GAAG,CAAC,CAAA;AAAA,EAIlC;AACF,CAAC;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/x-markdown/index.tsx"],"sourcesContent":["import { \n defineComponent, \n ref, computed, watch,\n onMounted, onBeforeUnmount, \n useTemplateRef, nextTick,\n onUpdated,\n} from 'vue';\nimport debounce from 'lodash/debounce';\nimport { ElMessage } from 'element-plus';\nimport './style/index.less';\nimport './theme/index.less';\nimport 'katex/dist/katex.min.css';\nimport { Accordion } from './utils/animation.ts';\nimport { formatMarkdownText } from './utils/textFormatUtils';\nimport { useImageLoader } from './composables/useImageLoader';\nimport { useRefHandler } from './composables/useRefHandler';\nimport { useStreamHandler } from './composables/useStreamHandler';\nimport { useMarkdownProcessor } from './composables/useMarkdownProcessor';\nimport { useFormHandler } from './composables/useFormHandler';\nimport { hastToVNode, RendererConfig } from './renderers/hastRenderer';\nimport { checkDisabled, DisabledCheckContext } from './utils/disabledUtils';\nimport { normalizeHistoryInputs, FormDataMap } from './utils/formUtils';\n\nexport default defineComponent({\n name: 'XMarkdown',\n props: {\n text: {\n type: String,\n default: '',\n },\n autoHideThinking: {\n type: Boolean,\n default: true,\n },\n typing: {\n type: Boolean,\n default: false,\n },\n speed: {\n type: Number,\n default: 200,\n },\n isHistoryMessage: {\n type: Boolean,\n default: false,\n },\n historyInputs: {\n type: Object,\n default: () => ({}),\n },\n user: {\n type: String,\n default: 'default',\n },\n authToken: {\n type: String,\n default: 'ApiSecretKey_mEKsrCMvxNLzzUUKeQmpzaUZqwZxFyJf',\n },\n appId: {\n type: String,\n default: '9a673565-d4f6-4382-bc67-f1beb07df435',\n },\n },\n expose: [\n 'getContentText'\n ],\n emits: ['hoverActiveRefTrigger', 'clickActiveRefTrigger', 'refConfigUpdate', 'downloadFile', 'coreSubmit'],\n setup(props, { emit }) {\n const container = useTemplateRef<HTMLElement>('x-markdown-container');\n const startTime = ref<number>(Date.now());\n const endTime = ref<number>(-Infinity);\n const isInitAnimation = ref(false);\n\n // 流式渲染处理\n const { context, tagComplete } = useStreamHandler(\n computed(() => props.text),\n computed(() => props.typing),\n computed(() => props.speed)\n );\n\n // 格式化文本\n const formatText = computed(() => {\n if (context.value.includes('</details>') && endTime.value === -Infinity) {\n endTime.value = Date.now();\n }\n\n return formatMarkdownText(\n context.value,\n props.autoHideThinking,\n startTime.value,\n endTime.value === -Infinity ? Date.now() : endTime.value\n );\n });\n\n // Markdown 处理\n const historyInputsRef = computed(() => props.historyInputs as Record<string, any> | FormDataMap | undefined);\n const { ast, hitlData } = useMarkdownProcessor(formatText, historyInputsRef);\n\n // 表单处理\n const {\n formRefs,\n curIndex,\n isRewrite,\n btnClick,\n resetCurInit,\n getCurInit,\n } = useFormHandler(hitlData, emit);\n\n // 图片加载处理\n const { processNewImages } = useImageLoader(container);\n\n // 引用处理\n const {\n getRefConfig,\n handleMouseOver,\n handleClick: handleRefClick,\n } = useRefHandler(container, emit);\n\n // 渲染完成回调\n const renderComplete = debounce(() => {\n getRefConfig();\n }, 100);\n\n // 监听 context 变化,更新引用配置\n watch(() => context.value, renderComplete, {\n immediate: true,\n });\n\n // 文件下载处理\n const handleAClick = async (e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const target = e.target as HTMLElement;\n const href = target.getAttribute('href');\n const id = target.getAttribute('data-id') || target.getAttribute('dataid');\n const title = target.getAttribute('data-name') || target.getAttribute('dataname');\n if (!href) {\n return;\n }\n const ext = href.split('.').pop();\n // 如果id不存在,则使用a标签新打开浏览器页面兜底\n if (!id) {\n window.open(href, '_blank');\n return;\n }\n ElMessage('文件下载中...');\n\n emit('downloadFile', {\n title,\n id,\n ext,\n href,\n });\n };\n\n // 统一的点击处理\n const handleClick = (e: MouseEvent) => {\n // 如果当前点击的是a标签,则根据a标签的href属性直接下载文件\n if ((e.target as HTMLElement).tagName === 'A') {\n handleAClick(e);\n return;\n }\n\n // 处理引用点击\n handleRefClick(e);\n };\n\n // 获取内容文本\n const getContentText = () => {\n return container.value?.innerText;\n };\n\n // 上传相关配置\n const uploadHeaders = computed(() => {\n return {\n Authorization: `Bearer ${props.authToken}`,\n appId: props.appId,\n };\n });\n\n const uploadExtendData = computed(() => {\n return {\n user: props.user,\n };\n });\n\n // 创建渲染器配置的工厂函数,确保每次获取最新值\n const createRendererConfig = (): RendererConfig => {\n return {\n hitlData: hitlData.value,\n formRefs: formRefs.value,\n curIndex: curIndex.value,\n getCurInit,\n btnClick,\n uploadHeaders: uploadHeaders.value,\n uploadExtendData: uploadExtendData.value,\n disabledContext: {\n isHistoryMessage: props.isHistoryMessage,\n isRewrite: isRewrite.value,\n },\n };\n };\n\n // 监听 AST 变化,处理图片和动画\n watch(\n () => ast.value,\n async () => {\n if (!ast.value) return;\n\n await nextTick();\n \n // 等待DOM更新后处理图片\n nextTick(processNewImages);\n \n nextTick(() => {\n const details = container.value?.querySelector('details');\n const summary = details?.querySelector('summary');\n if (summary && !isInitAnimation.value) {\n isInitAnimation.value = true;\n new Accordion(details!);\n }\n });\n },\n { immediate: true }\n );\n\n // 生命周期钩子\n onMounted(() => {\n if (container.value) {\n container.value.addEventListener('mouseover', handleMouseOver);\n container.value.addEventListener('click', handleClick);\n }\n });\n\n onBeforeUnmount(() => {\n if (container.value) {\n container.value.removeEventListener('mouseover', handleMouseOver);\n container.value.removeEventListener('click', handleClick);\n }\n });\n\n onUpdated(() => {\n resetCurInit();\n });\n\n return {\n hastToVNode: (node: any) => hastToVNode(node, createRendererConfig()),\n ast,\n container,\n renderComplete,\n isRewrite,\n getContentText,\n };\n },\n render() {\n return (\n <div\n ref=\"x-markdown-container\"\n class=\"x-markdown\"\n >\n {\n this.hastToVNode(this.ast)\n }\n </div>\n );\n },\n});\n"],"names":["name","props","text","type","String","default","autoHideThinking","Boolean","typing","speed","Number","isHistoryMessage","historyInputs","Object","user","authToken","appId","expose","emits","setup","emit","container","useTemplateRef","startTime","ref","Date","now","endTime","isInitAnimation","context","useStreamHandler","computed","formatText","value","includes","formatMarkdownText","historyInputsRef","ast","hitlData","useMarkdownProcessor","formRefs","curIndex","isRewrite","btnClick","resetCurInit","getCurInit","useFormHandler","processNewImages","useImageLoader","getRefConfig","handleMouseOver","handleClick","handleRefClick","useRefHandler","renderComplete","debounce","watch","immediate","handleAClick","e","stopPropagation","preventDefault","target","href","getAttribute","id","title","ext","split","pop","window","open","ElMessage","tagName","getContentText","innerText","uploadHeaders","Authorization","uploadExtendData","createRendererConfig","disabledContext","nextTick","details","querySelector","summary","Accordion","onMounted","addEventListener","onBeforeUnmount","removeEventListener","onUpdated","hastToVNode","node","render","_createVNode"],"mappings":"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"}
@@ -0,0 +1,427 @@
1
+ import { h } from "vue";
2
+ import { ElTimeline, ElRow, ElCol, ElCard, ElTag, ElForm, ElFormItem, ElButton, ElSelect, ElDatePicker, ElInput, ElRadioGroup, ElRadio, ElTableColumn, ElConfigProvider } from "element-plus";
3
+ /* empty css */
4
+ /* empty css */
5
+ import "../../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/form-item.scss.js";
6
+ /* empty css */
7
+ /* empty css */
8
+ /* empty css */
9
+ /* empty css */
10
+ /* empty css */
11
+ /* empty css */
12
+ /* empty css */
13
+ /* empty css */
14
+ /* empty css */
15
+ import "../../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/date-picker.scss.js";
16
+ /* empty css */
17
+ /* empty css */
18
+ /* empty css */
19
+ /* empty css */
20
+ /* empty css */
21
+ /* empty css */
22
+ /* empty css */
23
+ /* empty css */
24
+ import "../../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/theme-chalk/src/config-provider.scss.js";
25
+ import zhCn from "../../../node_modules/.pnpm/element-plus@2.11.8_vue@3.5.24_typescript@5.6.3_/node_modules/element-plus/es/locale/lang/zh-cn.js";
26
+ import CoreText from "../../core-text/index.js";
27
+ import CoreTips from "../../core-tips/index.js";
28
+ import CoreResult from "../../core-result/index.js";
29
+ import CoreTable from "../../core-table/index.js";
30
+ import CoreChart from "../../core-chart/index.js";
31
+ import CoreCard from "../../core-card/index.js";
32
+ import CoreUpload from "../../core-upload/index.js";
33
+ import { parseCorePilot } from "../utils/parseCorePilotSchema.js";
34
+ import { isCompleteJSON } from "../utils/jsonUtils.js";
35
+ import { checkDisabled } from "../utils/disabledUtils.js";
36
+ const renderSkeleton = () => {
37
+ return h("div", {
38
+ class: "hitl-skeleton"
39
+ }, [
40
+ // 头部骨架
41
+ h("div", {
42
+ class: "skeleton-header"
43
+ }, [
44
+ h("div", { class: "skeleton-avatar" }),
45
+ h("div", { class: "skeleton-title" })
46
+ ]),
47
+ // 内容骨架
48
+ h("div", { class: "skeleton-item skeleton-item-long" }),
49
+ h("div", { class: "skeleton-item skeleton-item-medium" }),
50
+ h("div", { class: "skeleton-item skeleton-item-short" }),
51
+ h("div", { class: "skeleton-item skeleton-item-long" }),
52
+ h("div", { class: "skeleton-item skeleton-item-medium" })
53
+ ]);
54
+ };
55
+ const hastToVNode = (node, config, index, row) => {
56
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
57
+ if (!node) return null;
58
+ const {
59
+ hitlData,
60
+ formRefs,
61
+ curIndex,
62
+ getCurInit,
63
+ btnClick,
64
+ uploadHeaders,
65
+ uploadExtendData,
66
+ disabledContext
67
+ } = config;
68
+ const renderChildren = (children2, formIndex) => {
69
+ if (!children2 || children2.length === 0) return [];
70
+ return children2.map((child, idx) => {
71
+ return hastToVNode(child, config, formIndex !== void 0 ? formIndex : index, row);
72
+ });
73
+ };
74
+ const blackTagNames = ["sub", "pre", "text", "ElForm"];
75
+ let children = [];
76
+ if (!blackTagNames.includes(node.tagName)) {
77
+ children = renderChildren(node.children || [], index);
78
+ }
79
+ switch (node.type) {
80
+ case "root":
81
+ return h(
82
+ "div",
83
+ { class: "markdown-body" },
84
+ h(ElConfigProvider, {
85
+ locale: zhCn
86
+ }, children)
87
+ );
88
+ case "element":
89
+ if (node.tagName === "sub") {
90
+ const formatChildren = [
91
+ {
92
+ type: "element",
93
+ tagName: "span",
94
+ properties: {
95
+ class: "x-markdown-split"
96
+ }
97
+ },
98
+ ...node.children || []
99
+ ];
100
+ const subChildren = formatChildren.map((child) => hastToVNode(child, config, index));
101
+ return h("span", {
102
+ ...node.properties,
103
+ class: "x-markdown-sub"
104
+ }, subChildren);
105
+ }
106
+ if (node.tagName === "span") {
107
+ return h("span", {
108
+ ...node.properties
109
+ }, children);
110
+ }
111
+ if (node.tagName === "img") {
112
+ return h("img", {
113
+ ...node.properties,
114
+ class: "markdown-image",
115
+ "data-processed": "false"
116
+ });
117
+ }
118
+ if (node.tagName === "a") {
119
+ const href = ((_a = node.properties) == null ? void 0 : _a.href) || "";
120
+ const fileType = href ? href.split(".").pop() : null;
121
+ return h(
122
+ "a",
123
+ {
124
+ ...node.properties,
125
+ class: "file-link",
126
+ "data-file-type": fileType
127
+ },
128
+ children
129
+ );
130
+ }
131
+ if (node.tagName === "ElTimeline") {
132
+ return h(ElTimeline, {
133
+ ...node.properties
134
+ }, children);
135
+ }
136
+ if (node.tagName === "table") {
137
+ return h(
138
+ "div",
139
+ { class: "custom-table-container" },
140
+ [h("table", children)]
141
+ );
142
+ }
143
+ if (node.tagName === "view") {
144
+ return h(
145
+ "div",
146
+ { class: "custom-view-container" },
147
+ [children[curIndex]]
148
+ );
149
+ }
150
+ if (node.tagName === "ElRow") {
151
+ return h(ElRow, {
152
+ ...node.properties
153
+ }, children);
154
+ }
155
+ if (node.tagName === "ElCol") {
156
+ return h(ElCol, {
157
+ ...node.properties
158
+ }, children);
159
+ }
160
+ if (node.tagName === "ElCard") {
161
+ return h(ElCard, {
162
+ ...node.properties
163
+ }, children);
164
+ }
165
+ if (node.tagName === "ElTag") {
166
+ return h(
167
+ ElTag,
168
+ {
169
+ ...node.properties
170
+ },
171
+ children
172
+ );
173
+ }
174
+ if (node.tagName === "CoreCard") {
175
+ const slots = {};
176
+ if ((_b = node.slots) == null ? void 0 : _b.header) {
177
+ slots.header = () => {
178
+ return node.slots.header.map((slotItem) => {
179
+ return hastToVNode(slotItem, config, index);
180
+ });
181
+ };
182
+ }
183
+ if (children && children.length > 0) {
184
+ slots.default = () => children;
185
+ }
186
+ return h(CoreCard, {
187
+ ...node.properties
188
+ }, slots);
189
+ }
190
+ if (node.tagName === "ElForm") {
191
+ const formIndex = getCurInit();
192
+ const formChildren = (node.children || []).map(
193
+ (child) => hastToVNode(child, config, formIndex)
194
+ );
195
+ return h(
196
+ ElForm,
197
+ {
198
+ ref: formRefs.set,
199
+ model: hitlData[formIndex],
200
+ ...node.properties,
201
+ disabled: checkDisabled(node, disabledContext)
202
+ },
203
+ formChildren
204
+ );
205
+ }
206
+ if (node.tagName === "ElFormItem") {
207
+ return h(ElFormItem, {
208
+ ...node.properties
209
+ }, children);
210
+ }
211
+ if (node.tagName === "ElButton") {
212
+ let payload = (_c = node.properties) == null ? void 0 : _c.payload;
213
+ if (node.parentScope === "table") {
214
+ payload = row;
215
+ }
216
+ const buttonFormIndex = node.parentScope === "form" ? index : void 0;
217
+ return h(
218
+ ElButton,
219
+ {
220
+ ...node.properties,
221
+ disabled: checkDisabled(node, disabledContext),
222
+ onClick: () => {
223
+ var _a2;
224
+ const validateIndex = buttonFormIndex !== void 0 ? buttonFormIndex : index !== void 0 ? index : 0;
225
+ btnClick(validateIndex, (_a2 = node.properties) == null ? void 0 : _a2.action, payload, node.parentScope);
226
+ }
227
+ },
228
+ children
229
+ );
230
+ }
231
+ if (node.tagName === "ElSelect") {
232
+ return h(
233
+ ElSelect,
234
+ {
235
+ ...node.properties,
236
+ disabled: checkDisabled(node, disabledContext),
237
+ modelValue: (_e = hitlData[index]) == null ? void 0 : _e[(_d = node.properties) == null ? void 0 : _d.formProp],
238
+ "onUpdate:modelValue": (value) => {
239
+ var _a2;
240
+ if (hitlData[index]) {
241
+ hitlData[index][(_a2 = node.properties) == null ? void 0 : _a2.formProp] = value;
242
+ }
243
+ }
244
+ },
245
+ children
246
+ );
247
+ }
248
+ if (node.tagName === "ElDatePicker") {
249
+ return h(
250
+ ElDatePicker,
251
+ {
252
+ ...node.properties,
253
+ disabled: checkDisabled(node, disabledContext),
254
+ modelValue: (_g = hitlData[index]) == null ? void 0 : _g[(_f = node.properties) == null ? void 0 : _f.formProp],
255
+ "onUpdate:modelValue": (value) => {
256
+ var _a2;
257
+ if (hitlData[index]) {
258
+ hitlData[index][(_a2 = node.properties) == null ? void 0 : _a2.formProp] = value;
259
+ }
260
+ }
261
+ },
262
+ children
263
+ );
264
+ }
265
+ if (node.tagName === "ElInput") {
266
+ return h(
267
+ ElInput,
268
+ {
269
+ ...node.properties,
270
+ disabled: checkDisabled(node, disabledContext),
271
+ modelValue: (_i = hitlData[index]) == null ? void 0 : _i[(_h = node.properties) == null ? void 0 : _h.formProp],
272
+ "onUpdate:modelValue": (value) => {
273
+ var _a2;
274
+ if (hitlData[index]) {
275
+ hitlData[index][(_a2 = node.properties) == null ? void 0 : _a2.formProp] = value;
276
+ }
277
+ }
278
+ },
279
+ children
280
+ );
281
+ }
282
+ if (node.tagName === "ElRadioGroup") {
283
+ return h(
284
+ ElRadioGroup,
285
+ {
286
+ ...node.properties,
287
+ disabled: checkDisabled(node, disabledContext),
288
+ modelValue: (_k = hitlData[index]) == null ? void 0 : _k[(_j = node.properties) == null ? void 0 : _j.formProp],
289
+ "onUpdate:modelValue": (value) => {
290
+ var _a2;
291
+ if (hitlData[index]) {
292
+ hitlData[index][(_a2 = node.properties) == null ? void 0 : _a2.formProp] = value;
293
+ }
294
+ }
295
+ },
296
+ children
297
+ );
298
+ }
299
+ if (node.tagName === "ElRadio") {
300
+ return h(
301
+ ElRadio,
302
+ {
303
+ ...node.properties,
304
+ disabled: checkDisabled(node, disabledContext)
305
+ },
306
+ children
307
+ );
308
+ }
309
+ if (node.tagName === "ElTable") {
310
+ return h(
311
+ CoreTable,
312
+ {
313
+ ...node.properties
314
+ },
315
+ children
316
+ );
317
+ }
318
+ if (node.tagName === "ElTableColumn") {
319
+ return h(
320
+ ElTableColumn,
321
+ {
322
+ ...node.properties
323
+ },
324
+ {
325
+ default: (scope) => {
326
+ const columnChildren = (node.children || []).map(
327
+ (child) => hastToVNode(child, config, -Infinity, scope.row)
328
+ );
329
+ const childIndex = (node.children || []).findIndex(
330
+ (child) => {
331
+ var _a2;
332
+ return child.value === scope.row[(_a2 = node.properties) == null ? void 0 : _a2.prop] && child.value !== void 0;
333
+ }
334
+ );
335
+ return childIndex === -1 ? columnChildren : columnChildren == null ? void 0 : columnChildren[childIndex];
336
+ }
337
+ }
338
+ );
339
+ }
340
+ if (node.tagName === "CoreText") {
341
+ return h(CoreText, {
342
+ ...node.properties
343
+ });
344
+ }
345
+ if (node.tagName === "CoreTips") {
346
+ return h(CoreTips, {
347
+ ...node.properties
348
+ });
349
+ }
350
+ if (node.tagName === "CoreResult") {
351
+ return h(CoreResult, {
352
+ ...node.properties
353
+ });
354
+ }
355
+ if (node.tagName === "CoreChart") {
356
+ return h(CoreChart, {
357
+ ...node.properties
358
+ });
359
+ }
360
+ if (node.tagName === "CoreUpload") {
361
+ if (node.parentScope === "form" && ((_l = node.properties) == null ? void 0 : _l.formProp)) {
362
+ const formProp = node.properties.formProp;
363
+ return h(
364
+ CoreUpload,
365
+ {
366
+ headers: uploadHeaders,
367
+ extendData: uploadExtendData,
368
+ ...node.properties,
369
+ disabled: checkDisabled(node, disabledContext),
370
+ fileList: ((_m = hitlData[index]) == null ? void 0 : _m[formProp]) || [],
371
+ "onUpdate:fileList": (value) => {
372
+ if (!hitlData[index]) {
373
+ hitlData[index] = {};
374
+ }
375
+ if (!hitlData[index].__files__) {
376
+ hitlData[index].__files__ = {};
377
+ }
378
+ hitlData[index].__files__[formProp] = value;
379
+ hitlData[index][formProp] = value;
380
+ }
381
+ }
382
+ );
383
+ }
384
+ return h(
385
+ CoreUpload,
386
+ {
387
+ ...node.properties,
388
+ disabled: checkDisabled(node, disabledContext)
389
+ }
390
+ );
391
+ }
392
+ if (node.tagName === "pre") {
393
+ const codeNode = (_n = node.children) == null ? void 0 : _n.find((child) => child.tagName === "code");
394
+ if (codeNode) {
395
+ if ((_p = (_o = codeNode.properties) == null ? void 0 : _o.className) == null ? void 0 : _p.includes("language-CorePilot")) {
396
+ const code = ((_r = (_q = codeNode.children) == null ? void 0 : _q[0]) == null ? void 0 : _r.value) || "";
397
+ if (!isCompleteJSON(code)) {
398
+ return renderSkeleton();
399
+ }
400
+ try {
401
+ const schema = JSON.parse(code);
402
+ const viewTree = parseCorePilot(schema);
403
+ const corePilotChildren = hastToVNode(viewTree, config);
404
+ return h("div", {
405
+ class: "hitl-wrapper"
406
+ }, [corePilotChildren]);
407
+ } catch (error) {
408
+ return renderSkeleton();
409
+ }
410
+ }
411
+ }
412
+ }
413
+ return h(
414
+ node.tagName,
415
+ node.properties,
416
+ children
417
+ );
418
+ case "text":
419
+ return node.value.trim();
420
+ default:
421
+ return null;
422
+ }
423
+ };
424
+ export {
425
+ hastToVNode
426
+ };
427
+ //# sourceMappingURL=hastRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hastRenderer.js","sources":["../../../../../src/components/x-markdown/renderers/hastRenderer.ts"],"sourcesContent":["/**\n * HAST (HTML AST) 渲染器\n * 将 HAST 节点转换为 Vue VNode\n * 优化了复杂表单的性能问题\n */\n\nimport { h } from 'vue';\nimport {\n ElMessage,\n ElForm,\n ElFormItem,\n ElInput,\n ElCard,\n ElButton,\n ElSelect,\n ElDatePicker,\n ElTableColumn,\n ElTimeline,\n ElRow,\n ElCol,\n ElRadioGroup,\n ElRadio,\n ElConfigProvider,\n ElTag,\n} from 'element-plus';\nimport zhCN from 'element-plus/es/locale/lang/zh-cn';\nimport CoreText from '../../core-text';\nimport CoreTips from '../../core-tips';\nimport CoreResult from '../../core-result';\nimport CoreTable from '../../core-table';\nimport CoreChart from '../../core-chart';\nimport CoreCard from '../../core-card';\nimport CoreUpload from '../../core-upload';\nimport { parseCorePilot } from '../utils/parseCorePilotSchema';\nimport { isCompleteJSON } from '../utils/jsonUtils';\nimport { checkDisabled, DisabledCheckContext } from '../utils/disabledUtils';\nimport { InputSchema } from '@/types/index.ts';\n\n/**\n * 渲染骨架屏组件\n */\nconst renderSkeleton = () => {\n return h(\"div\", {\n class: \"hitl-skeleton\",\n }, [\n // 头部骨架\n h(\"div\", {\n class: \"skeleton-header\",\n }, [\n h(\"div\", { class: \"skeleton-avatar\" }),\n h(\"div\", { class: \"skeleton-title\" }),\n ]),\n // 内容骨架\n h(\"div\", { class: \"skeleton-item skeleton-item-long\" }),\n h(\"div\", { class: \"skeleton-item skeleton-item-medium\" }),\n h(\"div\", { class: \"skeleton-item skeleton-item-short\" }),\n h(\"div\", { class: \"skeleton-item skeleton-item-long\" }),\n h(\"div\", { class: \"skeleton-item skeleton-item-medium\" }),\n ]);\n};\n\n/**\n * 渲染器配置接口\n */\nexport interface RendererConfig {\n hitlData: Array<Record<string, any>>;\n formRefs: any;\n curIndex: number;\n getCurInit: () => number;\n btnClick: (index: number, action: string, payload: any, parentScope?: 'form' | 'table') => void;\n uploadHeaders: Record<string, string>;\n uploadExtendData: Record<string, any>;\n disabledContext: DisabledCheckContext;\n}\n\n/**\n * 将hast(HTML AST)转换为Vue VNode\n * 性能优化:\n * 1. 使用缓存避免重复计算\n * 2. 延迟子节点渲染(仅在需要时渲染)\n * 3. 优化递归深度\n * \n * @param node - hast节点\n * @param config - 渲染器配置\n * @param index - 表单索引\n * @param row - 表格行数据\n * @returns Vue虚拟节点\n */\nexport const hastToVNode = (\n node: any,\n config: RendererConfig,\n index?: number,\n row?: any\n): any => {\n if (!node) return null;\n\n const {\n hitlData,\n formRefs,\n curIndex,\n getCurInit,\n btnClick,\n uploadHeaders,\n uploadExtendData,\n disabledContext,\n } = config;\n\n // 缓存子节点渲染函数,避免重复计算\n const renderChildren = (children: any[], formIndex?: number) => {\n if (!children || children.length === 0) return [];\n \n // 对于复杂表单,使用批量渲染优化\n // 优先使用传入的 formIndex,如果没有则使用当前的 index\n return children.map((child, idx) => {\n return hastToVNode(child, config, formIndex !== undefined ? formIndex : index, row);\n });\n };\n\n const blackTagNames = ['sub', 'pre', 'text', 'ElForm'];\n let children: any[] = [];\n\n if (!blackTagNames.includes(node.tagName)) {\n // 如果当前节点在表单中(index 是数字),继续传递这个 index 给子节点\n // 这样可以确保表单内的所有子节点(包括按钮)都能获取到正确的表单索引\n children = renderChildren(node.children || [], index);\n }\n\n switch (node.type) {\n case \"root\":\n return h(\n \"div\",\n { class: \"markdown-body\" },\n h(ElConfigProvider, {\n locale: zhCN,\n }, children)\n );\n\n case \"element\":\n // 处理 sub 标签(引用标记)\n if (node.tagName === \"sub\") {\n const formatChildren = [\n {\n type: \"element\",\n tagName: \"span\",\n properties: {\n class: \"x-markdown-split\",\n },\n },\n ...(node.children || [])\n ];\n const subChildren = formatChildren.map(child => hastToVNode(child, config, index));\n return h(\"span\", {\n ...node.properties,\n class: \"x-markdown-sub\",\n }, subChildren);\n }\n\n if (node.tagName === \"span\") {\n return h(\"span\", {\n ...node.properties,\n }, children);\n }\n\n // 处理特殊元素:图片、链接、代码块等\n if (node.tagName === \"img\") {\n return h(\"img\", {\n ...node.properties,\n class: \"markdown-image\",\n \"data-processed\": \"false\"\n });\n }\n\n if (node.tagName === \"a\") {\n const href = node.properties?.href || '';\n const fileType = href ? href.split('.').pop() : null;\n return h(\n \"a\",\n {\n ...node.properties,\n class: 'file-link',\n 'data-file-type': fileType,\n },\n children\n );\n }\n\n if (node.tagName === 'ElTimeline') {\n return h(ElTimeline, {\n ...node.properties,\n }, children);\n }\n\n if (node.tagName === 'table') {\n return h(\n \"div\",\n { class: 'custom-table-container' },\n [h(\"table\", children)]\n );\n }\n\n if (node.tagName === 'view') {\n return h(\n 'div',\n { class: 'custom-view-container' },\n [children[curIndex]]\n );\n }\n\n if (node.tagName === 'ElRow') {\n return h(ElRow, {\n ...node.properties,\n }, children);\n }\n\n if (node.tagName === 'ElCol') {\n return h(ElCol, {\n ...node.properties,\n }, children);\n }\n\n if (node.tagName === 'ElCard') {\n return h(ElCard, {\n ...node.properties,\n }, children);\n }\n\n if (node.tagName === 'ElTag') {\n return h(\n ElTag,\n {\n ...node.properties,\n },\n children\n )\n }\n\n if (node.tagName === 'CoreCard') {\n const slots: any = {};\n \n if (node.slots?.header) {\n slots.header = () => {\n return node.slots.header.map((slotItem: any) => {\n return hastToVNode(slotItem, config, index);\n });\n };\n }\n \n if (children && children.length > 0) {\n slots.default = () => children;\n }\n \n return h(CoreCard, {\n ...node.properties,\n }, slots);\n }\n\n // 表单相关元素\n if (node.tagName === 'ElForm') {\n const formIndex = getCurInit();\n const formChildren = (node.children || []).map((child: any) => \n hastToVNode(child, config, formIndex)\n );\n \n return h(\n ElForm,\n {\n ref: formRefs.set,\n model: hitlData[formIndex],\n ...node.properties,\n disabled: checkDisabled(node as InputSchema, disabledContext),\n },\n formChildren\n );\n }\n\n if (node.tagName === 'ElFormItem') {\n return h(ElFormItem, {\n ...node.properties,\n }, children);\n }\n\n // 表单控件\n if (node.tagName === 'ElButton') {\n let payload = node.properties?.payload;\n if (node.parentScope === 'table') {\n payload = row;\n }\n // 确保按钮在表单中使用正确的表单索引\n // 当 parentScope 是 'form' 时,index 应该是表单索引(从表单渲染时传递下来的)\n // 当 parentScope 不是 'form' 时,index 可能是 undefined 或其他值,但不会用于表单验证\n const buttonFormIndex = node.parentScope === 'form' ? index : undefined;\n return h(\n ElButton,\n {\n ...node.properties,\n disabled: checkDisabled(node as InputSchema, disabledContext),\n onClick: () => {\n // 如果按钮在表单中(parentScope === 'form'),必须使用正确的表单索引进行验证\n // 如果不在表单中,使用 0 作为默认值(但不会触发表单验证,因为 btnClick 会检查 parentScope)\n // 关键:index 在表单渲染时已经正确传递,所以 buttonFormIndex 应该是正确的表单索引\n const validateIndex = buttonFormIndex !== undefined ? buttonFormIndex : (index !== undefined ? index : 0);\n btnClick(validateIndex, node.properties?.action, payload, node.parentScope);\n },\n },\n children\n );\n }\n\n if (node.tagName === 'ElSelect') {\n return h(\n ElSelect,\n {\n ...node.properties,\n disabled: checkDisabled(node as InputSchema, disabledContext),\n modelValue: hitlData[index!]?.[node.properties?.formProp],\n 'onUpdate:modelValue': (value) => {\n if (hitlData[index!]) {\n hitlData[index!][node.properties?.formProp] = value;\n }\n },\n },\n children\n );\n }\n\n if (node.tagName === 'ElDatePicker') {\n return h(\n ElDatePicker,\n {\n ...node.properties,\n disabled: checkDisabled(node as InputSchema, disabledContext),\n modelValue: hitlData[index!]?.[node.properties?.formProp],\n 'onUpdate:modelValue': (value) => {\n if (hitlData[index!]) {\n hitlData[index!][node.properties?.formProp] = value;\n }\n },\n },\n children\n );\n }\n\n if (node.tagName === 'ElInput') {\n return h(\n ElInput,\n {\n ...node.properties,\n disabled: checkDisabled(node as InputSchema, disabledContext),\n modelValue: hitlData[index!]?.[node.properties?.formProp],\n 'onUpdate:modelValue': (value) => {\n if (hitlData[index!]) {\n hitlData[index!][node.properties?.formProp] = value;\n }\n },\n },\n children\n );\n }\n\n if (node.tagName === 'ElRadioGroup') {\n return h(\n ElRadioGroup,\n {\n ...node.properties,\n disabled: checkDisabled(node as InputSchema, disabledContext),\n modelValue: hitlData[index!]?.[node.properties?.formProp],\n 'onUpdate:modelValue': (value) => {\n if (hitlData[index!]) {\n hitlData[index!][node.properties?.formProp] = value as string;\n }\n }\n },\n children\n );\n }\n\n if (node.tagName === 'ElRadio') {\n return h(\n ElRadio,\n {\n ...node.properties,\n disabled: checkDisabled(node as InputSchema, disabledContext),\n },\n children\n );\n }\n\n // 表格相关\n if (node.tagName === 'ElTable') {\n return h(\n CoreTable,\n {\n ...node.properties,\n },\n children\n );\n }\n\n if (node.tagName === 'ElTableColumn') {\n return h(\n ElTableColumn,\n {\n ...node.properties,\n },\n {\n default: (scope: any) => {\n const columnChildren = (node.children || []).map((child: any) => \n hastToVNode(child, config, -Infinity, scope.row)\n );\n const childIndex = (node.children || []).findIndex(\n (child: any) => child.value === scope.row[node.properties?.prop] && child.value !== undefined\n );\n return childIndex === -1 ? columnChildren : columnChildren?.[childIndex];\n },\n }\n );\n }\n\n // 自定义组件\n if (node.tagName === 'CoreText') {\n return h(CoreText, {\n ...node.properties,\n });\n }\n\n if (node.tagName === 'CoreTips') {\n return h(CoreTips, {\n ...node.properties,\n });\n }\n\n if (node.tagName === 'CoreResult') {\n return h(CoreResult, {\n ...node.properties,\n });\n }\n\n if (node.tagName === 'CoreChart') {\n return h(CoreChart, {\n ...node.properties,\n });\n }\n\n if (node.tagName === 'CoreUpload') {\n // 如果在表单中,需要处理 formProp 和双向绑定\n if (node.parentScope === 'form' && node.properties?.formProp) {\n const formProp = node.properties.formProp;\n return h(\n CoreUpload,\n {\n headers: uploadHeaders,\n extendData: uploadExtendData,\n ...node.properties,\n disabled: checkDisabled(node as InputSchema, disabledContext),\n fileList: hitlData[index!]?.[formProp] || [],\n 'onUpdate:fileList': (value: any) => {\n if (!hitlData[index!]) {\n hitlData[index!] = {};\n }\n // 针对目前上传的文件解析,CA 这边必须得放在files 属性中,故被迫需要进行兼容\n // 这里将基于 __files__ 去识别,后续在coreagent 的 adapter 中进行处理\n if (!hitlData[index!].__files__) {\n hitlData[index!].__files__ = {};\n }\n hitlData[index!].__files__[formProp] = value;\n hitlData[index!][formProp] = value;\n },\n }\n );\n }\n // 非表单场景,直接渲染\n return h(\n CoreUpload,\n {\n ...node.properties,\n disabled: checkDisabled(node as InputSchema, disabledContext),\n }\n );\n }\n\n // 处理CorePilot代码块\n if (node.tagName === \"pre\") {\n const codeNode = node.children?.find((child: any) => child.tagName === \"code\");\n if (codeNode) {\n if (codeNode.properties?.className?.includes(\"language-CorePilot\")) {\n const code = codeNode.children?.[0]?.value || '';\n // 检查 JSON 是否完整\n if (!isCompleteJSON(code)) {\n // JSON 不完整,显示骨架屏\n return renderSkeleton();\n }\n try {\n const schema = JSON.parse(code);\n const viewTree = parseCorePilot(schema);\n const corePilotChildren = hastToVNode(viewTree, config);\n return h(\"div\", {\n class: \"hitl-wrapper\",\n }, [corePilotChildren]);\n } catch (error) {\n // JSON 解析失败,可能是格式错误,显示骨架屏\n return renderSkeleton();\n }\n }\n }\n }\n\n // 其他普通元素\n return h(\n node.tagName,\n node.properties,\n children\n );\n\n case \"text\":\n return node.value.trim();\n\n default:\n return null;\n }\n};\n\n"],"names":["children","zhCN","_a"],"mappings":"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"}