@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":["XMarkdown","name","props","text","type","String","default","autoHideThinking","Boolean","typing","speed","Number","isHistoryMessage","historyInputs","Object","expose","emits","setup","emit","container","useTemplateRef","startTime","ref","Date","now","endTime","Infinity","context","pendingImages","Set","isInitAnimation","tagComplete","hitlData","formRefs","useTemplateRefsList","curIndex","curInit","ast","isRewrite","streamGener","createStreamGenerator","stream","value","formatText","computed","content","mdText","isFirstSummary","replace","match","summaryTag","divContent","divEnd","isDivComplete","updateSummaryClasses","includes","res","exec","refListStr","JSON","parse","error","checkAndReturnRefList","duration","toFixed","length","checkDisabled","node","properties","parentScope","disabled","watch","v","o","oldText","startsWith","reset","update","stop","checkReg","test","setSpeed","immediate","refConfig","renderComplete","debounce","getRefConfig","refContainer","querySelector","textContent","activeRef","newVal","oldVal","getAttribute","target","find","item","link","getTargeElement","e","tagName","isInRefContainer","classList","contains","isRefContainer","parentElement","handleMouseOver","handleClick","async","stopPropagation","preventDefault","href","id","title","ext","split","pop","ElMessage","window","open","handleAClick","highlight","page","data","onMounted","addEventListener","onBeforeUnmount","removeEventListener","processNewImages","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","mdAst","run","preNodes","findPreNodes","preNode","codeNode","className","code","console","computedForm","nextTick","details","Accordion","renderSkeleton","h","class","hastToVNode","index","row","map","ElConfigProvider","locale","zhCN","formatChildren","fileType","ElTimeline","ElRow","ElCol","ElCard","slots","header","slotItem","CoreCard","ElForm","set","model","ElFormItem","payload","ElButton","onClick","action","log","validate","btnClick","ElSelect","modelValue","formProp","ElDatePicker","ElInput","ElRadioGroup","ElRadio","CoreTable","ElTableColumn","scope","findIndex","prop","CoreText","CoreTips","CoreResult","CoreChart","jsonStr","trim","trimmed","firstChar","isCompleteJSON","viewTree","parseCorePilot","onUpdated","getContentText","innerText","render","_createVNode","this"],"mappings":"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"}
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":["XMarkdown","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","Infinity","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","e","target","tagName","async","stopPropagation","preventDefault","href","getAttribute","id","title","ext","split","pop","ElMessage","window","open","handleAClick","uploadHeaders","Authorization","uploadExtendData","nextTick","details","querySelector","Accordion","onMounted","addEventListener","onBeforeUnmount","removeEventListener","onUpdated","hastToVNode","node","disabledContext","getContentText","innerText","render","_createVNode","class","this"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),s=require("element-plus");/* empty css *//* empty css */require("../../../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"),/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */require("../../../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"),/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */require("../../../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");const l=require("../../../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"),r=require("../../core-text/index.js"),t=require("../../core-tips/index.js"),o=require("../../core-result/index.js"),p=require("../../core-table/index.js"),i=require("../../core-chart/index.js"),n=require("../../core-card/index.js"),u=require("../../core-upload/index.js"),a=require("../utils/parseCorePilotSchema.js"),d=require("../utils/jsonUtils.js"),m=require("../utils/disabledUtils.js"),c=()=>e.h("div",{class:"hitl-skeleton"},[e.h("div",{class:"skeleton-header"},[e.h("div",{class:"skeleton-avatar"}),e.h("div",{class:"skeleton-title"})]),e.h("div",{class:"skeleton-item skeleton-item-long"}),e.h("div",{class:"skeleton-item skeleton-item-medium"}),e.h("div",{class:"skeleton-item skeleton-item-short"}),e.h("div",{class:"skeleton-item skeleton-item-long"}),e.h("div",{class:"skeleton-item skeleton-item-medium"})]),_=(h,v,f,k)=>{var g,b,N,j,q,E,y,C,x,P,D,w,S,T,V,R,U,I;if(!h)return null;const{hitlData:F,formRefs:O,curIndex:B,getCurInit:G,btnClick:J,uploadHeaders:L,uploadExtendData:z,disabledContext:H}=v;let M=[];var A,K;switch(["sub","pre","text","ElForm"].includes(h.tagName)||(A=h.children||[],K=f,M=A&&0!==A.length?A.map((e,s)=>_(e,v,void 0!==K?K:f,k)):[]),h.type){case"root":return e.h("div",{class:"markdown-body"},e.h(s.ElConfigProvider,{locale:l},M));case"element":if("sub"===h.tagName){const s=[{type:"element",tagName:"span",properties:{class:"x-markdown-split"}},...h.children||[]].map(e=>_(e,v,f));return e.h("span",{...h.properties,class:"x-markdown-sub"},s)}if("span"===h.tagName)return e.h("span",{...h.properties},M);if("img"===h.tagName)return e.h("img",{...h.properties,class:"markdown-image","data-processed":"false"});if("a"===h.tagName){const s=(null==(g=h.properties)?void 0:g.href)||"",l=s?s.split(".").pop():null;return e.h("a",{...h.properties,class:"file-link","data-file-type":l},M)}if("ElTimeline"===h.tagName)return e.h(s.ElTimeline,{...h.properties},M);if("table"===h.tagName)return e.h("div",{class:"custom-table-container"},[e.h("table",M)]);if("view"===h.tagName)return e.h("div",{class:"custom-view-container"},[M[B]]);if("ElRow"===h.tagName)return e.h(s.ElRow,{...h.properties},M);if("ElCol"===h.tagName)return e.h(s.ElCol,{...h.properties},M);if("ElCard"===h.tagName)return e.h(s.ElCard,{...h.properties},M);if("ElTag"===h.tagName)return e.h(s.ElTag,{...h.properties},M);if("CoreCard"===h.tagName){const s={};return(null==(b=h.slots)?void 0:b.header)&&(s.header=()=>h.slots.header.map(e=>_(e,v,f))),M&&M.length>0&&(s.default=()=>M),e.h(n,{...h.properties},s)}if("ElForm"===h.tagName){const l=G(),r=(h.children||[]).map(e=>_(e,v,l));return e.h(s.ElForm,{ref:O.set,model:F[l],...h.properties,disabled:m.checkDisabled(h,H)},r)}if("ElFormItem"===h.tagName)return e.h(s.ElFormItem,{...h.properties},M);if("ElButton"===h.tagName){let l=null==(N=h.properties)?void 0:N.payload;"table"===h.parentScope&&(l=k);const r="form"===h.parentScope?f:void 0;return e.h(s.ElButton,{...h.properties,disabled:m.checkDisabled(h,H),onClick:()=>{var e;J(void 0!==r?r:void 0!==f?f:0,null==(e=h.properties)?void 0:e.action,l,h.parentScope)}},M)}if("ElSelect"===h.tagName)return e.h(s.ElSelect,{...h.properties,disabled:m.checkDisabled(h,H),modelValue:null==(q=F[f])?void 0:q[null==(j=h.properties)?void 0:j.formProp],"onUpdate:modelValue":e=>{var s;F[f]&&(F[f][null==(s=h.properties)?void 0:s.formProp]=e)}},M);if("ElDatePicker"===h.tagName)return e.h(s.ElDatePicker,{...h.properties,disabled:m.checkDisabled(h,H),modelValue:null==(y=F[f])?void 0:y[null==(E=h.properties)?void 0:E.formProp],"onUpdate:modelValue":e=>{var s;F[f]&&(F[f][null==(s=h.properties)?void 0:s.formProp]=e)}},M);if("ElInput"===h.tagName)return e.h(s.ElInput,{...h.properties,disabled:m.checkDisabled(h,H),modelValue:null==(x=F[f])?void 0:x[null==(C=h.properties)?void 0:C.formProp],"onUpdate:modelValue":e=>{var s;F[f]&&(F[f][null==(s=h.properties)?void 0:s.formProp]=e)}},M);if("ElRadioGroup"===h.tagName)return e.h(s.ElRadioGroup,{...h.properties,disabled:m.checkDisabled(h,H),modelValue:null==(D=F[f])?void 0:D[null==(P=h.properties)?void 0:P.formProp],"onUpdate:modelValue":e=>{var s;F[f]&&(F[f][null==(s=h.properties)?void 0:s.formProp]=e)}},M);if("ElRadio"===h.tagName)return e.h(s.ElRadio,{...h.properties,disabled:m.checkDisabled(h,H)},M);if("ElTable"===h.tagName)return e.h(p,{...h.properties},M);if("ElTableColumn"===h.tagName)return e.h(s.ElTableColumn,{...h.properties},{default:e=>{const s=(h.children||[]).map(s=>_(s,v,-1/0,e.row)),l=(h.children||[]).findIndex(s=>{var l;return s.value===e.row[null==(l=h.properties)?void 0:l.prop]&&void 0!==s.value});return-1===l?s:null==s?void 0:s[l]}});if("CoreText"===h.tagName)return e.h(r,{...h.properties});if("CoreTips"===h.tagName)return e.h(t,{...h.properties});if("CoreResult"===h.tagName)return e.h(o,{...h.properties});if("CoreChart"===h.tagName)return e.h(i,{...h.properties});if("CoreUpload"===h.tagName){if("form"===h.parentScope&&(null==(w=h.properties)?void 0:w.formProp)){const s=h.properties.formProp;return e.h(u,{headers:L,extendData:z,...h.properties,disabled:m.checkDisabled(h,H),fileList:(null==(S=F[f])?void 0:S[s])||[],"onUpdate:fileList":e=>{F[f]||(F[f]={}),F[f].__files__||(F[f].__files__={}),F[f].__files__[s]=e,F[f][s]=e}})}return e.h(u,{...h.properties,disabled:m.checkDisabled(h,H)})}if("pre"===h.tagName){const s=null==(T=h.children)?void 0:T.find(e=>"code"===e.tagName);if(s&&(null==(R=null==(V=s.properties)?void 0:V.className)?void 0:R.includes("language-CorePilot"))){const l=(null==(I=null==(U=s.children)?void 0:U[0])?void 0:I.value)||"";if(!d.isCompleteJSON(l))return c();try{const s=JSON.parse(l),r=a.parseCorePilot(s),t=_(r,v);return e.h("div",{class:"hitl-wrapper"},[t])}catch(Q){return c()}}}return e.h(h.tagName,h.properties,M);case"text":return h.value.trim();default:return null}};exports.hastToVNode=_;
2
+ //# 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":["renderSkeleton","h","class","hastToVNode","node","config","index","row","hitlData","formRefs","curIndex","getCurInit","btnClick","uploadHeaders","uploadExtendData","disabledContext","children","formIndex","includes","tagName","length","map","child","idx","type","ElConfigProvider","locale","zhCN","subChildren","properties","href","_a","fileType","split","pop","ElTimeline","ElRow","ElCol","ElCard","ElTag","slots","_b","header","slotItem","default","CoreCard","formChildren","ElForm","ref","set","model","disabled","checkDisabled","ElFormItem","payload","_c","parentScope","buttonFormIndex","ElButton","onClick","action","ElSelect","modelValue","_e","_d","formProp","value","ElDatePicker","_g","_f","ElInput","_i","_h","ElRadioGroup","_k","_j","ElRadio","CoreTable","ElTableColumn","scope","columnChildren","Infinity","childIndex","findIndex","prop","CoreText","CoreTips","CoreResult","CoreChart","_l","CoreUpload","headers","extendData","fileList","_m","__files__","codeNode","_n","find","_p","_o","className","code","_r","_q","isCompleteJSON","schema","JSON","parse","viewTree","parseCorePilot","corePilotChildren","error","trim"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});exports.checkDisabled=(e,r)=>{const{properties:t={},parentScope:s}=e,{disabled:o}=t;return!!o||"form"===s&&(r.isHistoryMessage&&!r.isRewrite)};
2
+ //# sourceMappingURL=disabledUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disabledUtils.js","sources":["../../../../../src/components/x-markdown/utils/disabledUtils.ts"],"sourcesContent":["/**\n * 禁用状态相关工具函数\n * 规范了组件禁用状态的判断逻辑\n */\n\nimport { InputSchema } from '@/types/index.ts';\n\nexport interface DisabledCheckContext {\n isHistoryMessage: boolean;\n isRewrite: boolean;\n}\n\n/**\n * 检查节点是否应该被禁用\n * \n * 规范说明:\n * - 如果节点本身设置了 disabled 属性,则禁用\n * - 如果节点在 form 作用域内,且是历史消息且未处于重写状态,则禁用\n * - 其他情况不禁用\n * \n * @param node - 输入节点 schema\n * @param context - 禁用检查上下文\n * @returns 是否应该禁用\n */\nexport const checkDisabled = (\n node: InputSchema,\n context: DisabledCheckContext\n): boolean => {\n const { properties = {}, parentScope } = node;\n const { disabled } = properties;\n \n // 如果节点本身设置了 disabled,则禁用\n if (disabled) {\n return true;\n }\n \n // 如果当前是历史消息,且父级作用域为 form,且未处于重写状态,则禁用\n if (parentScope === 'form') {\n return context.isHistoryMessage && !context.isRewrite;\n }\n \n return false;\n};\n\n"],"names":["node","context","properties","parentScope","disabled","isHistoryMessage","isRewrite"],"mappings":"sGAwB6B,CAC3BA,EACAC,KAEA,MAAMC,WAAEA,EAAa,eAAIC,GAAgBH,GACnCI,SAAEA,GAAaF,EAGrB,QAAIE,GAKgB,SAAhBD,IACKF,EAAQI,mBAAqBJ,EAAQK"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=(e,o,t=0,i)=>{var n;if(!e||"object"!=typeof e)return t;if("form"===e.type){const r={...(null==(n=e.properties)?void 0:n.data)||{},...(null==i?void 0:i[t])||{}};return o.push(r),t+1}if(Array.isArray(e.children)){let n=t;return e.children.forEach(e=>{n=r(e,o,n,i)}),n}return t};exports.collectFormsFromSchema=r,exports.computedForm=(e,o)=>{const t=[],i=[],n=r=>{r&&("pre"===r.tagName&&i.push(r),Array.isArray(r.children)&&r.children.forEach(n))};return Array.isArray(e.children)&&e.children.forEach(n),i.forEach(e=>{var i,n,l,c,s;const a=null==(i=e.children)?void 0:i.find(r=>"code"===r.tagName);if(null==(l=null==(n=null==a?void 0:a.properties)?void 0:n.className)?void 0:l.includes("language-CorePilot"))try{const e=(null==(s=null==(c=a.children)?void 0:c[0])?void 0:s.value)||"";if(e){const i=JSON.parse(e);r(i,t,0,o)}}catch(d){console.error("Failed to parse CorePilot schema:",d)}}),t},exports.normalizeHistoryInputs=r=>{if(r){if("object"==typeof r&&!Array.isArray(r)){const e=Object.keys(r);if(e.some(r=>/^\d+$/.test(r))){const o={};return e.forEach(e=>{const t=parseInt(e,10);isNaN(t)||(o[t]=r[e])}),o}}return{0:r}}};
2
+ //# sourceMappingURL=formUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formUtils.js","sources":["../../../../../src/components/x-markdown/utils/formUtils.ts"],"sourcesContent":["/**\n * 表单相关工具函数\n */\n\n/**\n * 表单数据映射接口\n * 用于支持多表单场景,每个表单可以有独立的 historyInputs\n */\nexport interface FormDataMap {\n [formIndex: number]: Record<string, any>;\n}\n\n/**\n * 递归遍历 schema,收集所有 form 表单及其 data 属性\n * 支持多表单场景:每个表单可以有独立的 historyInputs\n * \n * @param schema - CorePilot schema 对象\n * @param formDataList - 用于存储收集到的 form data 的数组\n * @param formIndex - 当前表单索引(用于多表单场景)\n * @param historyInputsMap - 历史输入映射,支持多表单场景\n * @returns void\n */\nexport const collectFormsFromSchema = (\n schema: any,\n formDataList: Array<Record<string, any>>,\n formIndex: number = 0,\n historyInputsMap?: FormDataMap\n): number => {\n if (!schema || typeof schema !== 'object') return formIndex;\n \n // 如果当前节点是 form,收集其 data 属性\n if (schema.type === 'form') {\n const formData = {\n ...schema.properties?.data || {},\n // 支持多表单场景:根据表单索引获取对应的 historyInputs\n ...(historyInputsMap?.[formIndex] || {}),\n };\n formDataList.push(formData);\n return formIndex + 1; // 返回下一个表单索引\n }\n \n // 递归遍历 children 数组\n if (Array.isArray(schema.children)) {\n let currentFormIndex = formIndex;\n schema.children.forEach((child) => {\n currentFormIndex = collectFormsFromSchema(\n child,\n formDataList,\n currentFormIndex,\n historyInputsMap\n );\n });\n return currentFormIndex;\n }\n \n return formIndex;\n};\n\n/**\n * 计算 markdown AST 中所有 form 表单的数量,并提取每个 form 的预定义数据\n * 支持多表单场景\n * \n * @param mdAst - markdown AST 对象\n * @param historyInputsMap - 历史输入映射,支持多表单场景\n * @returns form data 列表\n */\nexport const computedForm = (\n mdAst: any,\n historyInputsMap?: FormDataMap\n): Array<Record<string, 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, 0, historyInputsMap);\n }\n } catch (error) {\n console.error('Failed to parse CorePilot schema:', error);\n }\n }\n });\n \n return formDataList;\n};\n\n/**\n * 将单个 historyInputs 对象转换为表单索引映射\n * 用于向后兼容:如果传入的是单个对象,则将其映射到第一个表单\n * \n * @param historyInputs - 历史输入对象(单个或多个)\n * @returns 表单数据映射\n */\nexport const normalizeHistoryInputs = (\n historyInputs?: Record<string, any> | FormDataMap\n): FormDataMap | undefined => {\n if (!historyInputs) return undefined;\n \n // 如果已经是 FormDataMap 格式,直接返回\n if (typeof historyInputs === 'object' && !Array.isArray(historyInputs)) {\n // 检查是否是 FormDataMap 格式(键是数字字符串)\n const keys = Object.keys(historyInputs);\n const isFormDataMap = keys.some(key => /^\\d+$/.test(key));\n \n if (isFormDataMap) {\n // 转换为数字键\n const result: FormDataMap = {};\n keys.forEach(key => {\n const numKey = parseInt(key, 10);\n if (!isNaN(numKey)) {\n result[numKey] = historyInputs[key];\n }\n });\n return result;\n }\n }\n \n // 向后兼容:单个对象映射到第一个表单\n return { 0: historyInputs as Record<string, any> };\n};\n\n"],"names":["collectFormsFromSchema","schema","formDataList","formIndex","historyInputsMap","type","formData","_a","properties","data","push","Array","isArray","children","currentFormIndex","forEach","child","mdAst","preNodes","findPreNodes","node","tagName","preNode","codeNode","find","_c","_b","className","includes","code","_e","_d","value","JSON","parse","error","console","historyInputs","keys","Object","some","test","key","result","numKey","parseInt","isNaN"],"mappings":"gFAsBO,MAAMA,EAAyB,CACpCC,EACAC,EACAC,EAAoB,EACpBC,WAEA,IAAKH,GAA4B,iBAAXA,EAAqB,OAAOE,EAGlD,GAAoB,SAAhBF,EAAOI,KAAiB,CAC1B,MAAMC,EAAW,KACZ,OAAAC,EAAAN,EAAOO,iBAAP,EAAAD,EAAmBE,OAAQ,CAAA,MAE1B,MAAAL,OAAA,EAAAA,EAAmBD,KAAc,CAAA,GAGvC,OADAD,EAAaQ,KAAKJ,GACXH,EAAY,CACrB,CAGA,GAAIQ,MAAMC,QAAQX,EAAOY,UAAW,CAClC,IAAIC,EAAmBX,EASvB,OARAF,EAAOY,SAASE,QAASC,IACvBF,EAAmBd,EACjBgB,EACAd,EACAY,EACAV,KAGGU,CACT,CAEA,OAAOX,yDAWmB,CAC1Bc,EACAb,KAEA,MAAMF,EAA2C,GAG3CgB,EAAkB,GAClBC,EAAgBC,IACfA,IACgB,QAAjBA,EAAKC,SACPH,EAASR,KAAKU,GAEZT,MAAMC,QAAQQ,EAAKP,WACrBO,EAAKP,SAASE,QAAQI,KA0B1B,OArBIR,MAAMC,QAAQK,EAAMJ,WACtBI,EAAMJ,SAASE,QAAQI,GAIzBD,EAASH,QAASO,kBAChB,MAAMC,EAAW,OAAAhB,IAAQM,eAAR,EAAAN,EAAkBiB,KAAMR,GAAiC,SAAlBA,EAAMK,SAC9D,GAAI,OAAAI,EAAA,0BAAUjB,iBAAV,EAAAkB,EAAsBC,gBAAtB,EAAAF,EAAiCG,SAAS,sBAC5C,IACE,MAAMC,GAAO,OAAAC,EAAA,OAAAC,EAAAR,EAASV,eAAT,EAAAkB,EAAoB,aAAIC,QAAS,GAC9C,GAAIH,EAAM,CACR,MAAM5B,EAASgC,KAAKC,MAAML,GAE1B7B,EAAuBC,EAAQC,EAAc,EAAGE,EAClD,CACF,OAAS+B,GACPC,QAAQD,MAAM,oCAAqCA,EACrD,IAIGjC,kCAWPmC,IAEA,GAAKA,EAAL,CAGA,GAA6B,iBAAlBA,IAA+B1B,MAAMC,QAAQyB,GAAgB,CAEtE,MAAMC,EAAOC,OAAOD,KAAKD,GAGzB,GAFsBC,EAAKE,QAAY,QAAQC,KAAKC,IAEjC,CAEjB,MAAMC,EAAsB,CAAA,EAO5B,OANAL,EAAKvB,QAAQ2B,IACX,MAAME,EAASC,SAASH,EAAK,IACxBI,MAAMF,KACTD,EAAOC,GAAUP,EAAcK,MAG5BC,CACT,CACF,CAGA,MAAO,CAAE,EAAGN,EAtBe"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});exports.isCompleteJSON=t=>{if(!t||0===t.trim().length)return!1;const r=t.trim(),e=r[0];if("{"!==e&&"["!==e)return!1;try{return JSON.parse(r),!0}catch(i){return!1}};
2
+ //# sourceMappingURL=jsonUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonUtils.js","sources":["../../../../../src/components/x-markdown/utils/jsonUtils.ts"],"sourcesContent":["/**\n * JSON 相关工具函数\n */\n\n/**\n * 检测 JSON 字符串是否完整\n * 使用最高效的方式:快速检查基本结构后直接尝试解析\n */\nexport const 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\n"],"names":["jsonStr","trim","length","trimmed","firstChar","JSON","parse","error"],"mappings":"uGAQ+BA,IAC7B,IAAKA,GAAqC,IAA1BA,EAAQC,OAAOC,OAC7B,OAAO,EAGT,MAAMC,EAAUH,EAAQC,OAGlBG,EAAYD,EAAQ,GAC1B,GAAkB,MAAdC,GAAmC,MAAdA,EACvB,OAAO,EAIT,IAEE,OADAC,KAAKC,MAAMH,IACJ,CACT,OAASI,GAEP,OAAO,CACT"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=(e,E)=>{switch(e.type){case"view":return t(e);case"form":return p(e);case"card":return s(e);case"table":return c(e);case"input":return a(e,E);case"select":return o(e,E);case"dateTimePicker":return n(e,E);case"button":return i(e,E);case"tips":return m(e,E);case"text":return u(e,E);case"formfield":return d(e,E);case"column":return l(e,E);case"row":return g(e,E);case"col":return h(e,E);case"result":return r(e,E);case"tag":return v(e,E);case"radioGroup":return y(e,E);case"radio":return N(e,E);case"echart":return S(e,E);default:const b=e;console.error(b)}},r=(e,r)=>({tagName:"CoreResult",type:"element",properties:e.properties,parentScope:r}),t=r=>({tagName:"view",type:"element",properties:{title:r.title},children:r.children.map(r=>e(r))}),p=r=>{const t=[];r.fields.forEach(r=>{t.push(e(r,"form"))});const p={tagName:"div",type:"element",properties:{class:"hitl-btn-list"},children:r.actions.map(r=>e(r,"form"))};return t.push(p),{tagName:"ElForm",type:"element",properties:{labelPosition:"right",...r.properties},children:t}},a=(e,r)=>({tagName:"ElInput",type:"element",properties:e.properties,parentScope:r}),o=(e,r)=>({tagName:"ElSelect",type:"element",properties:e.properties,parentScope:r}),n=(e,r)=>({tagName:"ElDatePicker",type:"element",properties:e.properties,parentScope:r}),i=(r,t)=>{var p,a;return{tagName:"ElButton",type:"element",properties:{...r.properties,action:r.action,payload:r.payload},parentScope:t,children:null==(a=null==(p=r.children)?void 0:p.map)?void 0:a.call(p,r=>e(r,t))}},s=r=>{var t;const p={tagName:"CoreCard",type:"element",properties:r.properties,children:r.children.map(r=>e(r))};return(null==(t=r.slots)?void 0:t.header)&&(p.slots={header:r.slots.header.map(r=>e(r))}),p},l=(r,t)=>{var p;return{tagName:"ElTableColumn",type:"element",properties:r.properties,parentScope:t,children:null==(p=r.children)?void 0:p.map(r=>e(r,t))}},c=r=>(r.properties.tableProps||(r.properties.tableProps={data:[],...r.properties}),{tagName:"ElTable",type:"element",properties:r.properties,children:r.children.map(r=>e(r,"table"))}),m=(e,r)=>({tagName:"CoreTips",type:"element",properties:e.properties,parentScope:r}),u=(e,r)=>({tagName:"CoreText",type:"element",properties:e.properties,parentScope:r}),d=(r,t)=>{const p=r.properties.prop,a=((e,r)=>e.map(e=>({...e,properties:{...e.properties,formProp:r}})))(r.children,p);return{tagName:"ElFormItem",type:"element",properties:{...r.properties,rules:(o=r.properties.rules,null==o?void 0:o.map(e=>"pattern"in e&&e.pattern?{pattern:new RegExp(e.pattern),message:e.message,trigger:e.trigger}:e))},parentScope:t,children:[e(a[0],t)]};var o},g=(r,t)=>({tagName:"ElRow",type:"element",properties:r.properties,children:r.children.map(r=>e(r,t))}),h=(r,t)=>({tagName:"ElCol",type:"element",properties:r.properties,parentScope:t,children:r.children.map(r=>e(r,t))}),y=(r,t)=>{var p;return{tagName:"ElRadioGroup",type:"element",properties:r.properties,parentScope:t,children:null==(p=r.properties.options)?void 0:p.map(r=>e({type:"radio",properties:r},t))}},N=(e,r)=>({tagName:"ElRadio",type:"element",properties:e.properties,parentScope:r}),v=(r,t)=>{const p={tagName:"ElTag",type:"element",properties:r.properties,parentScope:t,children:r.children.map(r=>e(r,t))};return"table"===t&&(p.value=r.value),p},S=(e,r)=>({tagName:"CoreChart",type:"element",properties:e.properties,parentScope:r});exports.parseCorePilot=r=>e(r);
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=(e,b)=>{switch(e.type){case"view":return t(e);case"form":return p(e);case"card":return s(e);case"table":return c(e);case"input":return a(e,b);case"select":return o(e,b);case"dateTimePicker":return n(e,b);case"button":return i(e,b);case"tips":return m(e,b);case"text":return u(e,b);case"formfield":return d(e,b);case"column":return l(e,b);case"row":return g(e,b);case"col":return h(e,b);case"result":return r(e,b);case"tag":return S(e,b);case"radioGroup":return y(e,b);case"radio":return N(e,b);case"echart":return v(e,b);case"upload":return E(e,b);default:const C=e;console.error(C)}},r=(e,r)=>({tagName:"CoreResult",type:"element",properties:e.properties,parentScope:r}),t=r=>({tagName:"view",type:"element",properties:{title:r.title},children:r.children.map(r=>e(r))}),p=r=>{const t=[];r.fields.forEach(r=>{t.push(e(r,"form"))});const p={tagName:"div",type:"element",properties:{class:"hitl-btn-list"},children:r.actions.map(r=>e(r,"form"))};return t.push(p),{tagName:"ElForm",type:"element",properties:{labelPosition:"right",...r.properties},children:t}},a=(e,r)=>({tagName:"ElInput",type:"element",properties:e.properties,parentScope:r}),o=(e,r)=>({tagName:"ElSelect",type:"element",properties:e.properties,parentScope:r}),n=(e,r)=>({tagName:"ElDatePicker",type:"element",properties:e.properties,parentScope:r}),i=(r,t)=>{var p,a;return{tagName:"ElButton",type:"element",properties:{...r.properties,action:r.action,payload:r.payload},parentScope:t,children:null==(a=null==(p=r.children)?void 0:p.map)?void 0:a.call(p,r=>e(r,t))}},s=r=>{var t;const p={tagName:"CoreCard",type:"element",properties:r.properties,children:r.children.map(r=>e(r))};return(null==(t=r.slots)?void 0:t.header)&&(p.slots={header:r.slots.header.map(r=>e(r))}),p},l=(r,t)=>{var p;return{tagName:"ElTableColumn",type:"element",properties:r.properties,parentScope:t,children:null==(p=r.children)?void 0:p.map(r=>e(r,t))}},c=r=>(r.properties.tableProps||(r.properties.tableProps={data:[],...r.properties}),{tagName:"ElTable",type:"element",properties:r.properties,children:r.children.map(r=>e(r,"table"))}),m=(e,r)=>({tagName:"CoreTips",type:"element",properties:e.properties,parentScope:r}),u=(e,r)=>({tagName:"CoreText",type:"element",properties:e.properties,parentScope:r}),d=(r,t)=>{const p=r.properties.prop,a=((e,r)=>e.map(e=>({...e,properties:{...e.properties,formProp:r}})))(r.children,p);return{tagName:"ElFormItem",type:"element",properties:{...r.properties,rules:(o=r.properties.rules,null==o?void 0:o.map(e=>"pattern"in e&&e.pattern?{pattern:new RegExp(e.pattern),message:e.message,trigger:e.trigger}:e))},parentScope:t,children:[e(a[0],t)]};var o},g=(r,t)=>({tagName:"ElRow",type:"element",properties:r.properties,children:r.children.map(r=>e(r,t))}),h=(r,t)=>({tagName:"ElCol",type:"element",properties:r.properties,parentScope:t,children:r.children.map(r=>e(r,t))}),y=(r,t)=>{var p;return{tagName:"ElRadioGroup",type:"element",properties:r.properties,parentScope:t,children:null==(p=r.properties.options)?void 0:p.map(r=>e({type:"radio",properties:r},t))}},N=(e,r)=>({tagName:"ElRadio",type:"element",properties:e.properties,parentScope:r}),S=(r,t)=>{const p={tagName:"ElTag",type:"element",properties:r.properties,parentScope:t,children:r.children.map(r=>e(r,t))};return"table"===t&&(p.value=r.value),p},v=(e,r)=>({tagName:"CoreChart",type:"element",properties:e.properties,parentScope:r}),E=(e,r)=>({tagName:"CoreUpload",type:"element",properties:e.properties,parentScope:r});exports.parseCorePilot=r=>e(r);
2
2
  //# sourceMappingURL=parseCorePilotSchema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseCorePilotSchema.js","sources":["../../../../../src/components/x-markdown/utils/parseCorePilotSchema.ts"],"sourcesContent":["import { \n FormSchema, \n ViewSchema,\n FormFieldSchema, \n CardSchema, \n ButtonSchema, \n TableSchema, \n TipsSchema, \n TextSchema, \n InputSchema, \n SelectSchema, \n DateTimePickerSchema, \n TableColumnSchema, \n RowSchema, \n ColSchema, \n ResultSchema, \n TagSchema,\n RadioGroupSchema,\n RadioSchema,\n EChartsSchema,\n} from '@/types/index';\n\ntype ElementSchema = \n | ViewSchema<any> \n | FormSchema \n | FormFieldSchema \n | CardSchema \n | ButtonSchema \n | TableSchema \n | TipsSchema \n | TextSchema \n | InputSchema \n | SelectSchema \n | DateTimePickerSchema \n | TableColumnSchema \n | RowSchema \n | ColSchema \n | ResultSchema \n | TagSchema \n | RadioGroupSchema \n | RadioSchema\n | EChartsSchema;\n\ntype ParentScopeType = 'form' | 'table';\n\nconst parseSchema = (schema: ElementSchema, type?: ParentScopeType) => {\n switch (schema.type) {\n case 'view':\n return parseView(schema);\n case 'form':\n return parseForm(schema);\n case 'card':\n return parseCard(schema);\n case 'table':\n return parseTable(schema);\n case 'input':\n return parseInput(schema, type);\n case 'select':\n return parseSelect(schema, type);\n case 'dateTimePicker':\n return parseDate(schema, type);\n case 'button':\n return parseButton(schema, type);\n case 'tips':\n return parseTips(schema, type);\n case 'text':\n return parseText(schema, type);\n case 'formfield':\n return parseFormItem(schema, type);\n case 'column':\n return parseTableColumn(schema, type);\n case 'row':\n return parseRow(schema, type);\n case 'col':\n return parseCol(schema, type);\n case 'result':\n return parseResult(schema, type);\n case 'tag':\n return parseTag(schema, type);\n case 'radioGroup':\n return parseRadioGroup(schema, type);\n case 'radio':\n return parseRadio(schema, type);\n case 'echart':\n return parseECharts(schema, type);\n default:\n const _: never = schema;\n console.error(_);\n }\n}\n\n// result组件解析\nconst parseResult = (schema: ResultSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'CoreResult',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n }\n}\n\n// view组件解析\nconst parseView = (schema: ViewSchema<any>) => {\n return {\n tagName: 'view',\n type: 'element',\n properties: {\n title: schema.title,\n },\n children: schema.children.map((item) => {\n return parseSchema(item);\n })\n }\n}\n\n// form组件解析\nconst parseForm = (schema: FormSchema) => {\n const children: any[] = [] \n schema.fields.forEach((item) => {\n children.push(parseSchema(item, 'form'));\n });\n const actionChild = {\n tagName: 'div',\n type: 'element',\n properties: {\n class: 'hitl-btn-list',\n },\n children: schema.actions.map((item) => {\n return parseSchema(item, 'form');\n })\n }\n children.push(actionChild);\n return {\n tagName: 'ElForm',\n type: 'element',\n properties: {\n labelPosition: 'right',\n ...schema.properties,\n },\n children,\n }\n}\n\nconst parseInput = (schema: InputSchema, type?: ParentScopeType) => {\n return {\n tagName: 'ElInput',\n type: 'element',\n properties: schema.properties,\n parentScope: type,\n }\n}\n\nconst parseSelect = (schema: SelectSchema, type?: ParentScopeType) => {\n return {\n tagName: 'ElSelect',\n type: 'element',\n properties: schema.properties,\n parentScope: type,\n }\n}\n\nconst parseDate = (schema: DateTimePickerSchema, type?: ParentScopeType) => {\n return {\n tagName: 'ElDatePicker',\n type: 'element',\n properties: schema.properties,\n parentScope: type,\n }\n}\n\nconst parseButton = (schema: ButtonSchema, type?: ParentScopeType) => {\n return {\n tagName: 'ElButton',\n type: 'element',\n properties: {\n ...schema.properties,\n action: schema.action,\n payload: schema.payload,\n },\n // TODO 记录父级作用域,用于在form、table 组件中使用\n parentScope: type,\n children: schema.children?.map?.((item) => {\n return parseSchema(item, type);\n })\n }\n}\n\nconst parseCard = (schema: CardSchema) => {\n const result: any = {\n tagName: 'CoreCard',\n type: 'element',\n properties: schema.properties,\n children: schema.children.map((item) => {\n return parseSchema(item);\n })\n };\n \n // 处理 header 插槽\n if (schema.slots?.header) {\n result.slots = {\n header: schema.slots.header.map((item) => {\n return parseSchema(item);\n })\n };\n }\n \n return result;\n}\n\nconst parseTableColumn = (schema: TableColumnSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'ElTableColumn',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n children: schema.children?.map((item) => {\n return parseSchema(item, parentType);\n })\n }\n}\n\nconst parseTable = (schema: TableSchema) => {\n // 兼容旧版本不存在tableProps属性\n if (!schema.properties.tableProps) {\n schema.properties.tableProps = {\n data: [],\n ...schema.properties,\n };\n }\n return {\n tagName: 'ElTable',\n type: 'element',\n properties: schema.properties,\n children: schema.children.map((item) => {\n return parseSchema(item, 'table');\n })\n }\n}\n\n\nconst parseTips = (schema: TipsSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'CoreTips',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n }\n}\n\nconst parseText = (schema: TextSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'CoreText',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n }\n}\nconst injectFormProp = (schema: FormFieldSchema['children'], prop: string) => {\n return schema.map((item) => {\n return {\n ...item,\n properties: {\n ...item.properties,\n formProp: prop,\n },\n }\n })\n}\nconst parseFormItem = (schema: FormFieldSchema, parentType?: ParentScopeType) => {\n const prop = schema.properties.prop;\n const children = injectFormProp(schema.children, prop);\n const formatRules = (rules: FormFieldSchema['properties']['rules']) => {\n return rules?.map((item) => {\n if ('pattern' in item && item.pattern) {\n return {\n pattern: new RegExp(item.pattern),\n message: item.message,\n trigger: item.trigger,\n }\n }\n return item;\n })\n }\n return {\n tagName: 'ElFormItem',\n type: 'element',\n properties: {\n ...schema.properties,\n rules: formatRules(schema.properties.rules),\n },\n parentScope: parentType,\n children: [\n parseSchema(children[0] as InputSchema, parentType),\n ]\n }\n}\n\nconst parseRow = (schema: RowSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'ElRow',\n type: 'element',\n properties: schema.properties,\n children: schema.children.map((item) => {\n return parseSchema(item, parentType);\n })\n }\n}\n\nconst parseCol = (schema: ColSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'ElCol',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n children: schema.children.map((item) => {\n return parseSchema(item as ElementSchema, parentType);\n })\n }\n}\n\nconst parseRadioGroup = (schema: RadioGroupSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'ElRadioGroup',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n children: schema.properties.options?.map((item) => {\n return parseSchema({\n type: 'radio',\n properties: item,\n } as RadioSchema, parentType);\n })\n }\n}\n\nconst parseRadio = (schema: RadioSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'ElRadio',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n }\n}\n\nconst parseTag = (schema: TagSchema, parentType?: ParentScopeType) => {\n const formatSchema = {\n tagName: 'ElTag',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n children: schema.children.map((item) => {\n return parseSchema(item as TextSchema, parentType);\n })\n }\n if (parentType === 'table') {\n formatSchema.value = schema.value;\n }\n return formatSchema;\n}\n\n// ECharts 图表解析\nconst parseECharts = (schema: EChartsSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'CoreChart',\n type: 'element' as const,\n properties: schema.properties,\n parentScope: parentType,\n };\n}\n\nexport const parseCorePilot = (schema: ViewSchema<any>) => {\n return parseSchema(schema);\n}"],"names":["parseSchema","schema","type","parseView","parseForm","parseCard","parseTable","parseInput","parseSelect","parseDate","parseButton","parseTips","parseText","parseFormItem","parseTableColumn","parseRow","parseCol","parseResult","parseTag","parseRadioGroup","parseRadio","parseECharts","_","console","error","parentType","tagName","properties","parentScope","title","children","map","item","fields","forEach","push","actionChild","class","actions","labelPosition","action","payload","_b","_a","call","result","slots","header","tableProps","data","prop","formProp","injectFormProp","rules","pattern","RegExp","message","trigger","options","formatSchema","value"],"mappings":"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"}
1
+ {"version":3,"file":"parseCorePilotSchema.js","sources":["../../../../../src/components/x-markdown/utils/parseCorePilotSchema.ts"],"sourcesContent":["import { \n FormSchema, \n ViewSchema,\n FormFieldSchema, \n CardSchema, \n ButtonSchema, \n TableSchema, \n TipsSchema, \n TextSchema, \n InputSchema, \n SelectSchema, \n DateTimePickerSchema, \n TableColumnSchema, \n RowSchema, \n ColSchema, \n ResultSchema, \n TagSchema,\n RadioGroupSchema,\n RadioSchema,\n EChartsSchema,\n UploadSchema,\n} from '@/types/index';\n\ntype ElementSchema = \n | ViewSchema<any> \n | FormSchema \n | FormFieldSchema \n | CardSchema \n | ButtonSchema \n | TableSchema \n | TipsSchema \n | TextSchema \n | InputSchema \n | SelectSchema \n | DateTimePickerSchema \n | TableColumnSchema \n | RowSchema \n | ColSchema \n | ResultSchema \n | TagSchema \n | RadioGroupSchema \n | RadioSchema\n | EChartsSchema\n | UploadSchema;\n\ntype ParentScopeType = 'form' | 'table';\n\nconst parseSchema = (schema: ElementSchema, type?: ParentScopeType) => {\n switch (schema.type) {\n case 'view':\n return parseView(schema);\n case 'form':\n return parseForm(schema);\n case 'card':\n return parseCard(schema);\n case 'table':\n return parseTable(schema);\n case 'input':\n return parseInput(schema, type);\n case 'select':\n return parseSelect(schema, type);\n case 'dateTimePicker':\n return parseDate(schema, type);\n case 'button':\n return parseButton(schema, type);\n case 'tips':\n return parseTips(schema, type);\n case 'text':\n return parseText(schema, type);\n case 'formfield':\n return parseFormItem(schema, type);\n case 'column':\n return parseTableColumn(schema, type);\n case 'row':\n return parseRow(schema, type);\n case 'col':\n return parseCol(schema, type);\n case 'result':\n return parseResult(schema, type);\n case 'tag':\n return parseTag(schema, type);\n case 'radioGroup':\n return parseRadioGroup(schema, type);\n case 'radio':\n return parseRadio(schema, type);\n case 'echart':\n return parseECharts(schema, type);\n case 'upload':\n return parseUpload(schema, type);\n default:\n const _: never = schema;\n console.error(_);\n }\n}\n\n// result组件解析\nconst parseResult = (schema: ResultSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'CoreResult',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n }\n}\n\n// view组件解析\nconst parseView = (schema: ViewSchema<any>) => {\n return {\n tagName: 'view',\n type: 'element',\n properties: {\n title: schema.title,\n },\n children: schema.children.map((item) => {\n return parseSchema(item);\n })\n }\n}\n\n// form组件解析\nconst parseForm = (schema: FormSchema) => {\n const children: any[] = [] \n schema.fields.forEach((item) => {\n children.push(parseSchema(item, 'form'));\n });\n const actionChild = {\n tagName: 'div',\n type: 'element',\n properties: {\n class: 'hitl-btn-list',\n },\n children: schema.actions.map((item) => {\n return parseSchema(item, 'form');\n })\n }\n children.push(actionChild);\n return {\n tagName: 'ElForm',\n type: 'element',\n properties: {\n labelPosition: 'right',\n ...schema.properties,\n },\n children,\n }\n}\n\nconst parseInput = (schema: InputSchema, type?: ParentScopeType) => {\n return {\n tagName: 'ElInput',\n type: 'element',\n properties: schema.properties,\n parentScope: type,\n }\n}\n\nconst parseSelect = (schema: SelectSchema, type?: ParentScopeType) => {\n return {\n tagName: 'ElSelect',\n type: 'element',\n properties: schema.properties,\n parentScope: type,\n }\n}\n\nconst parseDate = (schema: DateTimePickerSchema, type?: ParentScopeType) => {\n return {\n tagName: 'ElDatePicker',\n type: 'element',\n properties: schema.properties,\n parentScope: type,\n }\n}\n\nconst parseButton = (schema: ButtonSchema, type?: ParentScopeType) => {\n return {\n tagName: 'ElButton',\n type: 'element',\n properties: {\n ...schema.properties,\n action: schema.action,\n payload: schema.payload,\n },\n // TODO 记录父级作用域,用于在form、table 组件中使用\n parentScope: type,\n children: schema.children?.map?.((item) => {\n return parseSchema(item, type);\n })\n }\n}\n\nconst parseCard = (schema: CardSchema) => {\n const result: any = {\n tagName: 'CoreCard',\n type: 'element',\n properties: schema.properties,\n children: schema.children.map((item) => {\n return parseSchema(item);\n })\n };\n \n // 处理 header 插槽\n if (schema.slots?.header) {\n result.slots = {\n header: schema.slots.header.map((item) => {\n return parseSchema(item);\n })\n };\n }\n \n return result;\n}\n\nconst parseTableColumn = (schema: TableColumnSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'ElTableColumn',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n children: schema.children?.map((item) => {\n return parseSchema(item, parentType);\n })\n }\n}\n\nconst parseTable = (schema: TableSchema) => {\n // 兼容旧版本不存在tableProps属性\n if (!schema.properties.tableProps) {\n schema.properties.tableProps = {\n data: [],\n ...schema.properties,\n };\n }\n return {\n tagName: 'ElTable',\n type: 'element',\n properties: schema.properties,\n children: schema.children.map((item) => {\n return parseSchema(item, 'table');\n })\n }\n}\n\n\nconst parseTips = (schema: TipsSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'CoreTips',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n }\n}\n\nconst parseText = (schema: TextSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'CoreText',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n }\n}\nconst injectFormProp = (schema: FormFieldSchema['children'], prop: string) => {\n return schema.map((item) => {\n return {\n ...item,\n properties: {\n ...item.properties,\n formProp: prop,\n },\n }\n })\n}\nconst parseFormItem = (schema: FormFieldSchema, parentType?: ParentScopeType) => {\n const prop = schema.properties.prop;\n const children = injectFormProp(schema.children, prop);\n const formatRules = (rules: FormFieldSchema['properties']['rules']) => {\n return rules?.map((item) => {\n if ('pattern' in item && item.pattern) {\n return {\n pattern: new RegExp(item.pattern),\n message: item.message,\n trigger: item.trigger,\n }\n }\n return item;\n })\n }\n return {\n tagName: 'ElFormItem',\n type: 'element',\n properties: {\n ...schema.properties,\n rules: formatRules(schema.properties.rules),\n },\n parentScope: parentType,\n children: [\n parseSchema(children[0] as InputSchema, parentType),\n ]\n }\n}\n\nconst parseRow = (schema: RowSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'ElRow',\n type: 'element',\n properties: schema.properties,\n children: schema.children.map((item) => {\n return parseSchema(item, parentType);\n })\n }\n}\n\nconst parseCol = (schema: ColSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'ElCol',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n children: schema.children.map((item) => {\n return parseSchema(item as ElementSchema, parentType);\n })\n }\n}\n\nconst parseRadioGroup = (schema: RadioGroupSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'ElRadioGroup',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n children: schema.properties.options?.map((item) => {\n return parseSchema({\n type: 'radio',\n properties: item,\n } as RadioSchema, parentType);\n })\n }\n}\n\nconst parseRadio = (schema: RadioSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'ElRadio',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n }\n}\n\nconst parseTag = (schema: TagSchema, parentType?: ParentScopeType) => {\n const formatSchema = {\n tagName: 'ElTag',\n type: 'element',\n properties: schema.properties,\n parentScope: parentType,\n children: schema.children.map((item) => {\n return parseSchema(item as TextSchema, parentType);\n })\n }\n if (parentType === 'table') {\n formatSchema.value = schema.value;\n }\n return formatSchema;\n}\n\n// ECharts 图表解析\nconst parseECharts = (schema: EChartsSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'CoreChart',\n type: 'element' as const,\n properties: schema.properties,\n parentScope: parentType,\n };\n}\n\n// Upload 上传组件解析\nconst parseUpload = (schema: UploadSchema, parentType?: ParentScopeType) => {\n return {\n tagName: 'CoreUpload',\n type: 'element' as const,\n properties: schema.properties,\n parentScope: parentType,\n };\n}\n\nexport const parseCorePilot = (schema: ViewSchema<any>) => {\n return parseSchema(schema);\n}"],"names":["parseSchema","schema","type","parseView","parseForm","parseCard","parseTable","parseInput","parseSelect","parseDate","parseButton","parseTips","parseText","parseFormItem","parseTableColumn","parseRow","parseCol","parseResult","parseTag","parseRadioGroup","parseRadio","parseECharts","parseUpload","_","console","error","parentType","tagName","properties","parentScope","title","children","map","item","fields","forEach","push","actionChild","class","actions","labelPosition","action","payload","_b","_a","call","result","slots","header","tableProps","data","prop","formProp","injectFormProp","rules","pattern","RegExp","message","trigger","options","formatSchema","value"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});exports.checkAndReturnRefList=e=>{const t=/<div hidden>([\s\S]*?)<\/div>/g.exec(e);if(!t)return[];const r=t[1];try{return JSON.parse(r)}catch(n){return[]}};
2
+ //# sourceMappingURL=refUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refUtils.js","sources":["../../../../../src/components/x-markdown/utils/refUtils.ts"],"sourcesContent":["/**\n * 引用相关工具函数\n */\n\nexport interface RefConfig {\n title: string;\n link: string;\n time: string;\n author: string;\n}\n\n/**\n * 从文本中提取引用列表\n */\nexport const checkAndReturnRefList = (text: string): RefConfig[] => {\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"],"names":["text","match","exec","refListStr","JSON","parse","error"],"mappings":"8GAcsCA,IACpC,MACMC,EADM,iCACMC,KAAKF,GACvB,IAAKC,EACH,MAAO,GAET,MAAME,EAAaF,EAAM,GACzB,IAEE,OADgBG,KAAKC,MAAMF,EAE7B,OAASG,GACP,MAAO,EACT"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./refUtils.js"),s=e=>{let s=!0;return e.replace(/(<summary[^>]*>[\s\S]*?<\/summary>)\s*(<div>[\s\S]*?)(<\/div>|$)/g,(e,r,t,a)=>{const l="</div>"===a;return`${r.replace(/(<summary)/g,e=>s?(s=!1,e):`<summary class="${l?"loaded":"loading"}"`)}\n${t}${a}`})};exports.formatMarkdownText=(r,t,a,l)=>{if(!t)return r;let u=r;if(u=s(u),u=u.replace(/[\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000]/g," "),u.includes("</details>")){const s=e.checkAndReturnRefList(u);return u.replace(/<details open>([\s\S]*?)<\/details>/g,(e,r)=>`<details>${r=(r=r.replace(/<summary>([\s\S]*?)<\/summary>/,(e,r)=>{const t=((l-a)/1e3).toFixed(0);return`<summary style="color: #8D90A0;font-weight: 300; font-size: 16px;">\n 已完成思考 ${t>"0"?t+"s":""} ${s.length?`<span style="display: inline-block;margin: 0 8px;border-left: 1px solid #CDCFD7;width: 1px;height: 16px;"></span> 引用文档:${null==s?void 0:s.length} 个`:""}\n </summary>`})).replace(/<summary>完成<\/summary>/,'<summary class="loaded">完成</summary>')}</details>`)}return u},exports.updateSummaryClasses=s;
2
+ //# sourceMappingURL=textFormatUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textFormatUtils.js","sources":["../../../../../src/components/x-markdown/utils/textFormatUtils.ts"],"sourcesContent":["/**\n * 文本格式化相关工具函数\n */\n\nimport { checkAndReturnRefList } from './refUtils';\n\n/**\n * 更新 summary 标签的 class\n */\nexport const updateSummaryClasses = (mdText: string): 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/**\n * 格式化文本,处理思考过程、引用等\n */\nexport const formatMarkdownText = (\n content: string,\n autoHideThinking: boolean,\n startTime: number,\n endTime: number\n): string => {\n if (!autoHideThinking) return content;\n \n let formatted = content;\n formatted = updateSummaryClasses(formatted);\n formatted = formatted.replace(/[\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/g, ' ');\n \n if (formatted.includes('</details>')) {\n const res = checkAndReturnRefList(formatted);\n\n const text = formatted.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 - startTime) / 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 \n return formatted;\n};\n\n"],"names":["updateSummaryClasses","mdText","isFirstSummary","replace","match","summaryTag","divContent","divEnd","isDivComplete","content","autoHideThinking","startTime","endTime","formatted","includes","res","checkAndReturnRefList","duration","toFixed","length"],"mappings":"iHASaA,EAAwBC,IAEnC,IAAIC,GAAiB,EAErB,OAAOD,EAAOE,QAHQ,oEAGe,CAACC,EAAOC,EAAYC,EAAYC,KACnE,MAAMC,EAA2B,WAAXD,EAWtB,MAAO,GAVgBF,EAAWF,QAChC,cACCC,GACKF,GACFA,GAAiB,EACVE,GAEF,mBAAmBI,EAAgB,SAAW,kBAG5BF,IAAaC,kCAOZ,CAChCE,EACAC,EACAC,EACAC,KAEA,IAAKF,EAAkB,OAAOD,EAE9B,IAAII,EAAYJ,EAIhB,GAHAI,EAAYb,EAAqBa,GACjCA,EAAYA,EAAUV,QAAQ,iDAAkD,KAE5EU,EAAUC,SAAS,cAAe,CACpC,MAAMC,EAAMC,EAAAA,sBAAsBH,GAgBlC,OAdaA,EAAUV,QAAQ,uCAAwC,CAACC,EAAOK,IAWtE,YAFPA,GAPAA,EAAUA,EAAQN,QAAQ,iCAAkC,CAACC,EAAOK,KAClE,MAAMQ,IAAaL,EAAUD,GAAa,KAAMO,QAAQ,GACxD,MAAO,wFACGD,EAAW,IAAMA,EAAW,IAAM,MAAMF,EAAII,OAAS,0HAA0H,MAAAJ,OAAA,EAAAA,EAAKI,WAAa,4BAI3LhB,QAAQ,yBAA0B,oDAMxD,CAEA,OAAOU"}