@ai-group/chat-sdk 3.7.1-alpha9 → 3.7.3

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 (84) hide show
  1. package/dist/cjs/components/XAdkChatbot/styles.js +8 -1
  2. package/dist/cjs/components/XAdkChatbot/styles.js.map +2 -2
  3. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +17 -50
  4. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
  5. package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +3 -2
  6. package/dist/cjs/components/XAdkProvider/compound/Sender.js +81 -4
  7. package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +3 -3
  8. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
  9. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js +34 -0
  10. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js.map +7 -0
  11. package/dist/cjs/components/XAdkProvider/context/index.d.ts +5 -4
  12. package/dist/cjs/components/XAdkProvider/context/index.js +3 -1
  13. package/dist/cjs/components/XAdkProvider/context/index.js.map +2 -2
  14. package/dist/cjs/components/XAdkSender/InlineTagInput.d.ts +4 -0
  15. package/dist/cjs/components/XAdkSender/InlineTagInput.js +28 -1
  16. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
  17. package/dist/cjs/components/XAdkSender/{QuickList.d.ts → InputSuggestionList.d.ts} +4 -3
  18. package/dist/cjs/components/XAdkSender/{QuickList.js → InputSuggestionList.js} +55 -30
  19. package/dist/cjs/components/XAdkSender/InputSuggestionList.js.map +7 -0
  20. package/dist/cjs/components/XAdkSender/index.js +35 -13
  21. package/dist/cjs/components/XAdkSender/index.js.map +3 -3
  22. package/dist/cjs/components/XAdkSender/styles.js +13 -1
  23. package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
  24. package/dist/cjs/components/XAiConversations/index.js +1 -1
  25. package/dist/cjs/components/XAiConversations/index.js.map +2 -2
  26. package/dist/cjs/components/XAiConversations/styles.js +11 -1
  27. package/dist/cjs/components/XAiConversations/styles.js.map +2 -2
  28. package/dist/cjs/index.d.ts +3 -3
  29. package/dist/cjs/index.js +5 -1
  30. package/dist/cjs/index.js.map +2 -2
  31. package/dist/cjs/presets/xgroup/index.d.ts +1 -0
  32. package/dist/cjs/presets/xgroup/index.js +2 -0
  33. package/dist/cjs/presets/xgroup/index.js.map +2 -2
  34. package/dist/cjs/presets/xgroup/knowledgeReference.js +3 -1
  35. package/dist/cjs/presets/xgroup/knowledgeReference.js.map +2 -2
  36. package/dist/cjs/presets/xgroup/webReference.d.ts +10 -0
  37. package/dist/cjs/presets/xgroup/webReference.js +85 -0
  38. package/dist/cjs/presets/xgroup/webReference.js.map +7 -0
  39. package/dist/cjs/types/XAdkSender.d.ts +4 -0
  40. package/dist/cjs/types/XAdkSender.js.map +1 -1
  41. package/dist/esm/components/XAdkChatbot/styles.js +3 -3
  42. package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
  43. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +16 -41
  44. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
  45. package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +3 -2
  46. package/dist/esm/components/XAdkProvider/compound/Sender.js +70 -7
  47. package/dist/esm/components/XAdkProvider/compound/Sender.js.map +1 -1
  48. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
  49. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js +9 -0
  50. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js.map +1 -0
  51. package/dist/esm/components/XAdkProvider/context/index.d.ts +5 -4
  52. package/dist/esm/components/XAdkProvider/context/index.js +1 -0
  53. package/dist/esm/components/XAdkProvider/context/index.js.map +1 -1
  54. package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +4 -0
  55. package/dist/esm/components/XAdkSender/InlineTagInput.js +26 -7
  56. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
  57. package/dist/esm/components/XAdkSender/{QuickList.d.ts → InputSuggestionList.d.ts} +4 -3
  58. package/dist/esm/components/XAdkSender/{QuickList.js → InputSuggestionList.js} +53 -28
  59. package/dist/esm/components/XAdkSender/InputSuggestionList.js.map +1 -0
  60. package/dist/esm/components/XAdkSender/index.js +39 -18
  61. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  62. package/dist/esm/components/XAdkSender/styles.js +2 -2
  63. package/dist/esm/components/XAdkSender/styles.js.map +1 -1
  64. package/dist/esm/components/XAiConversations/index.js +2 -1
  65. package/dist/esm/components/XAiConversations/index.js.map +1 -1
  66. package/dist/esm/components/XAiConversations/styles.js +3 -3
  67. package/dist/esm/components/XAiConversations/styles.js.map +1 -1
  68. package/dist/esm/index.d.ts +3 -3
  69. package/dist/esm/index.js +2 -2
  70. package/dist/esm/index.js.map +1 -1
  71. package/dist/esm/presets/xgroup/index.d.ts +1 -0
  72. package/dist/esm/presets/xgroup/index.js +1 -0
  73. package/dist/esm/presets/xgroup/index.js.map +1 -1
  74. package/dist/esm/presets/xgroup/knowledgeReference.js +2 -1
  75. package/dist/esm/presets/xgroup/knowledgeReference.js.map +1 -1
  76. package/dist/esm/presets/xgroup/webReference.d.ts +10 -0
  77. package/dist/esm/presets/xgroup/webReference.js +46 -0
  78. package/dist/esm/presets/xgroup/webReference.js.map +1 -0
  79. package/dist/esm/types/XAdkSender.d.ts +4 -0
  80. package/dist/esm/types/XAdkSender.js.map +1 -1
  81. package/dist/umd/chat-sdk.min.js +1 -1
  82. package/package.json +1 -1
  83. package/dist/cjs/components/XAdkSender/QuickList.js.map +0 -7
  84. package/dist/esm/components/XAdkSender/QuickList.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAdkSender/index.tsx"],
4
- "sourcesContent": ["import React, {\n useState,\n useRef,\n useCallback,\n forwardRef,\n useImperativeHandle,\n useMemo,\n useEffect,\n} from \"react\";\nimport { Popconfirm, message, Tooltip, Input, Modal } from \"antd\";\nimport {\n ClearOutlined,\n LoadingOutlined,\n ArrowUpOutlined,\n} from \"@ant-design/icons\";\nimport {\n XAdkSenderProps,\n XAdkSenderHandle,\n ServerFile,\n LocalFile,\n ActionsComponents,\n FileValidator,\n UploadFileResult,\n MentionTag,\n XAdkSenderSubmitData,\n XAdkSenderSubmitFormat,\n XAdkSenderSubmitPart,\n} from \"@/types\";\nimport { useStyles } from \"./styles\";\nimport FileGallery from \"../FileGallery\";\nimport QuickList from \"./QuickList\";\nimport InputTags from \"./InputTags\";\nimport InlineTagInput, { InlineTagInputRef } from \"./InlineTagInput\";\nimport { getExt } from \"@/utils/file\";\n\nconst XAdkSender = forwardRef<XAdkSenderHandle, XAdkSenderProps>(\n (\n {\n clearBtnShow = true,\n draggable = false,\n onFileSelect,\n loading = false,\n disabled = false,\n value: controlledValue,\n defaultValue = \"\",\n uploadRequest = () => {},\n onClear,\n onChange,\n onSubmit,\n onStop,\n onFilesChange,\n onUploadSuccess,\n onUploadError,\n maxFileSize = 10,\n placeholder = \"\",\n validators: customValidators = [],\n allowedFileTypes = [],\n maxFiles = Infinity,\n sendButtonRender,\n suffix,\n header,\n prefix,\n footer,\n footerLeft,\n quickKeys = [],\n inlineTags = false,\n renderMention,\n renderTag,\n mentions: controlledMentions,\n tags: controlledTags,\n defaultMentions,\n defaultTags = [],\n defaultInputParts,\n onMentionsChange,\n onTagsChange,\n onQuickKeyTrigger,\n submitFormat = \"text\",\n formatMention,\n formatTag,\n transformSubmitData,\n },\n ref,\n ) => {\n const styles = useStyles();\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState<string>(defaultValue);\n const value = isControlled ? controlledValue : internalValue;\n const setValue = (newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n // mentions 支持受控/非受控两种模式;inlineTags 打开时会和输入内容混排。\n const resolvedControlledMentions = controlledMentions ?? controlledTags;\n const initialMentions = defaultMentions ?? defaultTags;\n const isMentionsControlled = resolvedControlledMentions !== undefined;\n const [internalMentions, setInternalMentions] =\n useState<MentionTag[]>(initialMentions);\n const mentions = isMentionsControlled\n ? resolvedControlledMentions!\n : internalMentions;\n const setMentions = (newMentions: MentionTag[]) => {\n if (!isMentionsControlled) {\n setInternalMentions(newMentions);\n }\n onMentionsChange?.(newMentions);\n onTagsChange?.(newMentions);\n };\n\n const [files, setFiles] = useState<LocalFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<any>(null);\n const inlineInputRef = useRef<InlineTagInputRef>(null);\n\n // 快捷键弹层状态:记录触发字符、关键词,以及触发字符在纯文本中的位置。\n // SDK 不内置搜索框;业务方可在 onQuickKeyTrigger 中根据 keyword 自行更新 quickKeys.options。\n const [activeQuickKey, setActiveQuickKey] = useState<string | null>(null);\n const [quickKeyKeyword, setQuickKeyKeyword] = useState(\"\");\n const [quickKeyTriggerIdx, setQuickKeyTriggerIdx] = useState(-1);\n const [quickKeyActiveIndex, setQuickKeyActiveIndex] = useState(0);\n\n // 生成唯一ID\n const generateId = () => {\n return Date.now().toString(36) + Math.random().toString(36).substr(2);\n };\n\n const normalizeUploadResponse = (response: any): UploadFileResult => {\n const data = response?.data ?? response;\n return (Array.isArray(data) ? data[0] : data) ?? {};\n };\n\n const escapeXml = (text: string) =>\n text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n\n const escapeMarkdownLabel = (text: string) =>\n text.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\]/g, \"\\\\]\");\n\n const getMentionSubmitValue = (mention: MentionTag) =>\n String(\n mention.value ??\n mention.uri ??\n mention.data?.uri ??\n mention.data?.value ??\n mention.data?.name ??\n mention.targetId ??\n mention.displayName ??\n mention.label ??\n \"\",\n );\n\n const defaultFormatMention = (\n mention: MentionTag,\n format: Exclude<XAdkSenderSubmitFormat, \"structured\">,\n index: number,\n ) => {\n const value = getMentionSubmitValue(mention);\n if (format === \"xml\") {\n return `<mention type=\"${escapeXml(mention.type)}\" id=\"${escapeXml(mention.id)}\" label=\"${escapeXml(mention.label)}\" value=\"${escapeXml(value)}\" />`;\n }\n\n if (format === \"markdown\") {\n const href =\n mention.uri ||\n (value.includes(\"://\")\n ? value\n : `xadk-mention://${encodeURIComponent(mention.type)}/${encodeURIComponent(mention.id)}`);\n return `[@${escapeMarkdownLabel(mention.displayName || mention.label)}](${href})`;\n }\n\n return `@${mention.displayName || value || `mention-${index + 1}`}`;\n };\n\n const serializeMention = (\n mention: MentionTag,\n format: Exclude<XAdkSenderSubmitFormat, \"structured\">,\n index: number,\n ) =>\n formatMention?.(mention, { format, index }) ??\n formatTag?.(mention, { format, index }) ??\n defaultFormatMention(mention, format, index);\n\n const getSubmitParts = useCallback((): XAdkSenderSubmitPart[] => {\n if (inlineTags) {\n const parts = inlineInputRef.current?.getParts() || [];\n if (parts.length > 0) return parts;\n }\n\n const textParts: XAdkSenderSubmitPart[] = value ? [{ type: \"text\", text: value }] : [];\n const mentionParts = mentions.map((mention) => ({\n type: \"mention\" as const,\n mention,\n }));\n return [...mentionParts, ...textParts];\n }, [inlineTags, mentions, value]);\n\n const serializeParts = (\n parts: XAdkSenderSubmitPart[],\n format: XAdkSenderSubmitFormat,\n ) => {\n if (format === \"structured\") {\n return parts.reduce(\n (content, part) => content + (part.type === \"text\" ? part.text : \"\"),\n \"\",\n );\n }\n\n let tagIndex = 0;\n return parts\n .map((part) => {\n if (part.type === \"text\") return part.text;\n const result = serializeMention(part.mention, format, tagIndex);\n tagIndex += 1;\n return result;\n })\n .join(\"\");\n };\n\n const createSubmitData = (formattedFiles: ServerFile[]): XAdkSenderSubmitData => {\n const parts = getSubmitParts();\n const rawText = parts.reduce(\n (content, part) => content + (part.type === \"text\" ? part.text : \"\"),\n \"\",\n );\n const standardData: Omit<XAdkSenderSubmitData, \"payload\"> = {\n text: serializeParts(parts, submitFormat),\n rawText,\n format: submitFormat,\n parts,\n files: formattedFiles,\n mentions,\n tags: mentions,\n };\n\n return {\n ...standardData,\n payload: transformSubmitData?.(standardData),\n };\n };\n\n // 检查文件类型\n const checkFileType = (file: File): boolean => {\n if (allowedFileTypes?.length > 0) {\n const ext = getExt(file);\n\n return allowedFileTypes.some((type) => {\n if (type.includes(\"/\")) {\n if (type.endsWith(\"/*\")) {\n return file.type.startsWith(type.split(\"/\")[0]);\n }\n return file.type === type;\n }\n\n if (type.startsWith(\".\")) {\n return ext === type.slice(1);\n }\n\n return false;\n });\n }\n return true;\n };\n\n // 重复文件检测\n const isDuplicateFile = (file: File, files: LocalFile[]) => {\n return files.some((f) => f.name === file.name && f.size === file.size);\n };\n\n // 内置校验器集合\n const builtInValidators: FileValidator[] = [\n (_file, { files }) => {\n if (files.length >= maxFiles) {\n return `最多只能上传 ${maxFiles} 个文件`;\n }\n return null;\n },\n (file) => {\n const maxSize = maxFileSize * 1024 * 1024;\n if (file.size > maxSize) {\n return `文件大小不能超过 ${maxFileSize}MB`;\n }\n return null;\n },\n (file) => {\n if (!checkFileType(file)) {\n return \"不支持的文件类型\";\n }\n return null;\n },\n (file, { files }) => {\n if (isDuplicateFile(file, files)) {\n return \"文件已存在\";\n }\n return null;\n },\n ];\n\n const allValidators = [...builtInValidators, ...customValidators];\n\n // 验证文件\n const validateFile = (file: File): { valid: boolean; message?: string } => {\n for (const validator of allValidators) {\n const error = validator(file, { files });\n if (error) {\n return { valid: false, message: error };\n }\n }\n return { valid: true };\n };\n\n // 处理文件选择\n const handleFileSelect = useCallback(\n (selectedFiles: File[]) => {\n const fileArray = Array.from(selectedFiles);\n\n if (files.length + fileArray.length > maxFiles) {\n message.error(`最多只能上传 ${maxFiles} 个文件`);\n return;\n }\n\n const validFiles: LocalFile[] = [];\n\n fileArray.forEach((file) => {\n const validation = validateFile(file);\n\n if (validation.valid) {\n validFiles.push({\n id: generateId(),\n uid: generateId(),\n name: file.name,\n size: file.size,\n type: file.type,\n file,\n progress: 0,\n status: \"pending\",\n response: null,\n });\n } else {\n message.error(validation.message);\n }\n });\n\n if (validFiles.length > 0) {\n setFiles((prev) => {\n const next = [...prev, ...validFiles];\n onFilesChange?.(next);\n return next;\n });\n uploadFiles(validFiles);\n }\n },\n [files, maxFiles, maxFileSize, allowedFileTypes],\n );\n\n // 暴露给业务工具栏调用的命令式能力;外部 Popover 选择标签时可插入到当前光标位置。\n useImperativeHandle(\n ref,\n () => ({\n addFiles: (rawFiles: File[]) => {\n handleFileSelect(rawFiles);\n },\n insertMention: (mention: MentionTag) => {\n if (inlineTags) {\n inlineInputRef.current?.insertMention(mention);\n return;\n }\n setMentions([...mentions, mention]);\n },\n insertTag: (mention: MentionTag) => {\n if (inlineTags) {\n inlineInputRef.current?.insertMention(mention);\n return;\n }\n setMentions([...mentions, mention]);\n },\n focus: () => {\n inlineTags ? inlineInputRef.current?.focus() : textareaRef.current?.focus();\n },\n }),\n [handleFileSelect, inlineTags, setMentions, mentions],\n );\n\n // 上传文件\n const uploadFiles = async (fileList: LocalFile[]) => {\n for (const localFile of fileList) {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, status: \"uploading\" } : f,\n ),\n );\n\n try {\n await uploadRequest({\n file: localFile.file,\n onProgress: (e) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, progress: e.percent } : f,\n ),\n );\n },\n onSuccess: (response) => {\n const responseData = normalizeUploadResponse(response);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"success\",\n progress: 100,\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n }\n : f,\n ),\n );\n\n onUploadSuccess?.({\n ...localFile,\n status: \"success\",\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n });\n },\n onError: (error) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage: error.message,\n }\n : f,\n ),\n );\n onUploadError?.(localFile, error);\n },\n });\n } catch (error) {\n console.error(\"上传处理错误:\", error);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage:\n error instanceof Error ? error.message : \"上传处理失败\",\n }\n : f,\n ),\n );\n message.error(`${localFile.name} 上传失败`);\n }\n }\n };\n\n // 删除文件\n const handleRemoveFile = (id: string) => {\n setFiles((prev) => {\n const next = prev.filter((file) => file.id !== id);\n onFilesChange?.(next);\n return next;\n });\n };\n\n // 处理拖拽事件\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (draggable) {\n setIsDragOver(true);\n }\n },\n [draggable],\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (draggable) {\n setIsDragOver(false);\n }\n },\n [draggable],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (\n draggable &&\n e.dataTransfer.files &&\n e.dataTransfer.files.length > 0\n ) {\n // 内核不再自行处理文件,交给外层(DefaultLayout/业务)通过 onFileSelect 决定\n onFileSelect?.(Array.from(e.dataTransfer.files));\n }\n },\n [draggable, onFileSelect],\n );\n\n // 删除标签\n const handleRemoveMention = useCallback(\n (id: string) => {\n setMentions(mentions.filter((item) => item.id !== id));\n },\n [mentions, setMentions],\n );\n\n // 查找当前活跃的快捷键配置\n const activeQuickKeyConfig = useMemo(() => {\n if (!activeQuickKey) return null;\n return quickKeys.find((qk) => qk.key === activeQuickKey) || null;\n }, [activeQuickKey, quickKeys]);\n\n const activeQuickKeyOptionsLength = activeQuickKeyConfig?.options.length || 0;\n\n useEffect(() => {\n setQuickKeyActiveIndex(0);\n }, [activeQuickKey]);\n\n useEffect(() => {\n if (activeQuickKeyOptionsLength <= 0) {\n setQuickKeyActiveIndex(0);\n return;\n }\n\n // 业务方可能在 onQuickKeyTrigger 中动态更新 options;\n // 这里只做越界归一化,不重置有效索引,避免键盘高亮移动后又跳回第一项。\n setQuickKeyActiveIndex(\n (prev) => ((prev % activeQuickKeyOptionsLength) + activeQuickKeyOptionsLength) %\n activeQuickKeyOptionsLength,\n );\n }, [activeQuickKeyOptionsLength]);\n\n const getNextQuickKeyIndex = useCallback(\n (current: number, step: number) => {\n if (activeQuickKeyOptionsLength <= 0) return 0;\n return (\n (current + step + activeQuickKeyOptionsLength) %\n activeQuickKeyOptionsLength\n );\n },\n [activeQuickKeyOptionsLength],\n );\n\n // 从当前光标前的连续文本片段中查找最近的快捷键,例如 abc@doc 会触发 @。\n const detectQuickKey = useCallback(\n (text: string, cursorPos: number) => {\n const quickKeyChars = quickKeys.map((qk) => qk.key);\n if (quickKeyChars.length === 0) return;\n\n const textBeforeCursor = text.slice(0, cursorPos);\n let found = false;\n for (let i = textBeforeCursor.length - 1; i >= 0; i--) {\n const char = textBeforeCursor[i];\n if (/\\s/.test(char)) break;\n if (quickKeyChars.includes(char)) {\n const keyword = textBeforeCursor.slice(i + 1);\n setActiveQuickKey(char);\n setQuickKeyKeyword(keyword);\n setQuickKeyTriggerIdx(i);\n setQuickKeyActiveIndex(0);\n onQuickKeyTrigger?.(char, keyword);\n found = true;\n break;\n }\n }\n\n if (!found && activeQuickKey) {\n const triggerChar = text[quickKeyTriggerIdx];\n const keyword = text.slice(quickKeyTriggerIdx + 1, cursorPos);\n if (\n quickKeyTriggerIdx < 0 ||\n !triggerChar ||\n !quickKeyChars.includes(triggerChar) ||\n /\\s/.test(keyword)\n ) {\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n } else {\n setQuickKeyKeyword(keyword);\n }\n }\n },\n [activeQuickKey, onQuickKeyTrigger, quickKeyTriggerIdx, quickKeys],\n );\n\n // 选择快捷项后转成结构化 Mention;inline 模式会替换掉触发字符和关键词。\n const handleQuickKeySelect = useCallback(\n (option: any) => {\n const mentionType =\n activeQuickKeyConfig?.mentionType ||\n activeQuickKeyConfig?.tagType ||\n activeQuickKey ||\n \"unknown\";\n const newMention: MentionTag = {\n id: generateId(),\n label: option.label,\n type: mentionType,\n value: option.value ?? option.uri ?? option.name ?? option.label,\n uri: option.uri,\n targetId: option.targetId ?? option.skillNo ?? option.pluginNo,\n displayName: option.displayName ?? option.label,\n trigger: activeQuickKey || undefined,\n icon: option.icon,\n data: option,\n };\n activeQuickKeyConfig?.onSelect?.(option);\n\n if (inlineTags) {\n inlineInputRef.current?.insertMention(newMention, {\n start: quickKeyTriggerIdx,\n end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length,\n });\n } else {\n setMentions([...mentions, newMention]);\n\n // 从输入框中删除快捷键字符和关键词\n if (quickKeyTriggerIdx >= 0) {\n const newValue =\n value.slice(0, quickKeyTriggerIdx) +\n value.slice(quickKeyTriggerIdx + 1 + quickKeyKeyword.length);\n setValue(newValue);\n }\n }\n\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n inlineTags\n ? inlineInputRef.current?.focus()\n : textareaRef.current?.focus();\n },\n [\n activeQuickKey,\n activeQuickKeyConfig,\n inlineTags,\n mentions,\n setMentions,\n value,\n quickKeyTriggerIdx,\n quickKeyKeyword,\n setValue,\n ],\n );\n\n // 处理输入框变化(含快捷键检测)\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n setValue(newValue);\n\n // 检测快捷键触发\n detectQuickKey(newValue, e.target.selectionStart || 0);\n };\n\n const handleInlineInputChange = (newValue: string) => {\n setValue(newValue);\n // contenteditable 的 selection 不一定和 React state 同步,需实时读取内部光标 offset。\n detectQuickKey(\n newValue,\n inlineInputRef.current?.getCursorOffset() || newValue.length,\n );\n };\n\n const handleQuickKeyByText = (text: string, cursorPos: number) => {\n const quickKeyChars = quickKeys.map((qk) => qk.key);\n if (quickKeyChars.length === 0) return;\n\n const textBeforeCursor = text.slice(0, cursorPos);\n\n // 检测刚输入的字符是否是快捷键\n const lastChar = textBeforeCursor[cursorPos - 1];\n if (lastChar && quickKeyChars.includes(lastChar)) {\n // 上下键导航后会触发 keyup,此时光标前仍是同一个快捷键字符;\n // 如果重复重置 activeIndex,视觉上会“移动一下又回到第一项”。\n if (activeQuickKey === lastChar && quickKeyTriggerIdx === cursorPos - 1) {\n return;\n }\n setActiveQuickKey(lastChar);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(cursorPos - 1);\n setQuickKeyActiveIndex(0);\n onQuickKeyTrigger?.(lastChar, \"\");\n }\n };\n\n // onChange 负责更新搜索词;onKeyUp 兜底捕获刚输入的快捷键字符。\n const isQuickListControlKey = (key: string) =>\n key === \"ArrowDown\" || key === \"ArrowUp\" || key === \"Enter\" || key === \"Escape\";\n\n const handleKeyUp = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (activeQuickKey && isQuickListControlKey(e.key)) return;\n const target = e.target as HTMLTextAreaElement;\n handleQuickKeyByText(target.value || \"\", target.selectionStart || 0);\n };\n\n const handleInlineKeyUp = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (activeQuickKey && isQuickListControlKey(e.key)) return;\n // inline 输入区不是 textarea,不能读 event.target.value,只能从 ref 取纯文本。\n const text = inlineInputRef.current?.getText() || \"\";\n const cursorPos =\n inlineInputRef.current?.getCursorOffset() || text.length;\n handleQuickKeyByText(text, cursorPos);\n };\n\n // 处理提交\n const handleSubmit = () => {\n // 生成期间允许继续编辑下一条消息,但停止按钮仍代表当前唯一可执行动作。\n if (loading) return;\n if (!value.trim() && files.length === 0 && mentions.length === 0) {\n message.warning(\"请输入消息或选择文件\");\n return;\n }\n\n const successFiles = files.filter((file) => file.status === \"success\");\n const uploadingFiles = files.filter(\n (file) => file.status === \"uploading\",\n );\n\n if (uploadingFiles.length > 0) {\n Modal.confirm({\n title: \"文件上传中\",\n content: `还有 ${uploadingFiles.length} 个文件正在上传,是否继续发送?`,\n okText: \"发送已完成的\",\n cancelText: \"等待全部完成\",\n onOk: () => {\n const formattedFiles = formatFilesForServer(successFiles);\n if (onSubmit) {\n onSubmit(createSubmitData(formattedFiles));\n }\n\n setValue(\"\");\n setMentions([]);\n setFiles((prev) => prev.filter((f) => f.status !== \"success\"));\n },\n onCancel: () => {\n message.info(\"请等待文件上传完成后再发送\");\n },\n });\n } else {\n const formattedFiles = formatFilesForServer(successFiles);\n\n if (onSubmit) {\n onSubmit(createSubmitData(formattedFiles));\n }\n\n setValue(\"\");\n setMentions([]);\n setFiles((prev) => prev.filter((f) => f.status !== \"success\"));\n }\n };\n\n // 格式化文件列表为服务端格式\n const formatFilesForServer = (fileList: LocalFile[]): ServerFile[] => {\n return fileList\n .filter((file) => file.status === \"success\" && file.response)\n .map((file) => {\n const responseData = normalizeUploadResponse(file.response);\n\n return {\n fileName: responseData.fileName || file.name,\n fileId: responseData.fileId || responseData.id || \"\",\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url ||\n \"\",\n type: responseData.fileType || responseData.type || getExt(file),\n size: responseData.fileSize || responseData.size || file.size,\n mimeType: responseData.mimeType || file.type,\n raw: {\n ...responseData,\n },\n };\n });\n };\n\n // 处理回车键\n const handleKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n const quickKeyOptions = activeQuickKeyConfig?.options || [];\n\n if (activeQuickKey && quickKeyOptions.length > 0) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setQuickKeyActiveIndex((prev) => getNextQuickKeyIndex(prev, 1));\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setQuickKeyActiveIndex((prev) => getNextQuickKeyIndex(prev, -1));\n return;\n }\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleQuickKeySelect(\n quickKeyOptions[\n Math.min(quickKeyActiveIndex, quickKeyOptions.length - 1)\n ],\n );\n return;\n }\n\n if (e.key === \"Escape\") {\n e.preventDefault();\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n return;\n }\n }\n\n if (e.key === \"Enter\" && !e.shiftKey && !activeQuickKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n // 渲染文件列表\n const renderFileList = () => {\n if (files.length === 0) return null;\n\n return (\n <div className={styles.contextFiles}>\n {files.map((file) => (\n <FileGallery\n key={file.id}\n file={file}\n size=\"small\"\n removable\n onRemove={handleRemoveFile}\n />\n ))}\n </div>\n );\n };\n\n const containerClass = `${styles.container} ${isDragOver ? \"drag-over\" : \"\"}`;\n const uploading = files.some((f) => f.status === \"uploading\");\n const controlsDisabled = disabled || uploading || loading;\n const inputDisabled = disabled || uploading;\n const hasContent = value.trim().length > 0;\n const hasFiles = files.some((f) => f.status === \"success\");\n const hasMentions = mentions.length > 0;\n const canSend = hasContent || hasFiles || hasMentions;\n\n // 定义按钮组件\n const SendButton = (props: any) => {\n if (sendButtonRender) {\n return (\n <>\n {sendButtonRender({\n loading,\n disabled: uploading || disabled,\n canSend,\n onSend: handleSubmit,\n onStop,\n })}\n </>\n );\n }\n return (\n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? \"stop\" : \"\"}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading || disabled}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n {...props}\n >\n {loading ? <LoadingOutlined spin /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n );\n };\n\n const ClearButton = (props: any) => (\n <Popconfirm\n title=\"确定要清空聊天记录吗?\"\n onConfirm={onClear}\n placement=\"top\"\n okText=\"确定\"\n cancelText=\"取消\"\n disabled={controlsDisabled}\n >\n <button\n className={`${styles.iconButton} ${styles.clearButton}`}\n disabled={controlsDisabled}\n aria-label=\"清空聊天记录\"\n {...props}\n >\n <ClearOutlined />\n </button>\n </Popconfirm>\n );\n\n const actionsComponents: ActionsComponents = {\n SendButton,\n ClearButton,\n };\n\n // 渲染插槽内容\n const renderSlot = (\n slot:\n | React.ReactNode\n | false\n | ((\n oriNode: React.ReactNode,\n info: { components: ActionsComponents },\n ) => React.ReactNode | false)\n | undefined,\n oriNode: React.ReactNode,\n ): React.ReactNode | null => {\n if (slot === false) return null;\n if (slot === undefined) return oriNode;\n if (typeof slot === \"function\") {\n const result = slot(oriNode, { components: actionsComponents });\n return result === false ? null : result;\n }\n return slot;\n };\n\n const headerNode = renderSlot(header, false);\n const fileListNode = files.length > 0 ? renderFileList() : null;\n\n // 默认后缀仅保留发送/停止按钮;上传与清空统一放到底部 actionBar,方便业务扩展左侧按钮组。\n const defaultSuffix = (\n <div className={styles.buttonGroup}>\n {sendButtonRender ? (\n sendButtonRender({\n loading,\n disabled: uploading || disabled,\n canSend,\n onSend: handleSubmit,\n onStop,\n })\n ) : (\n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? \"stop\" : \"\"}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading || disabled}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n >\n {loading ? <LoadingOutlined spin /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n )}\n </div>\n );\n\n const defaultActionBar = (\n <div className={styles.actionBar}>\n <div className={styles.actionBarLeft}>\n {renderSlot(footerLeft, false)}\n </div>\n <div className={styles.actionBarRight}>\n {clearBtnShow && <ClearButton />}\n {renderSlot(suffix, defaultSuffix)}\n </div>\n </div>\n );\n\n return (\n <div\n ref={containerRef}\n className={containerClass}\n onDragOver={draggable ? handleDragOver : undefined}\n onDragLeave={draggable ? handleDragLeave : undefined}\n onDrop={draggable ? handleDrop : undefined}\n >\n <div className={styles.mainArea}>\n <div className={styles.senderWrap}>\n {(headerNode || fileListNode) && (\n <div className={styles.contextBar}>\n {/* 头部插槽与附件共享上下文行,便于知识库、文件等输入上下文统一展示。 */}\n {headerNode && (\n <div className={styles.contextHeader}>{headerNode}</div>\n )}\n {fileListNode}\n </div>\n )}\n\n {/* textarea 模式下保留历史标签展示;inlineTags 模式标签直接混排在输入区内 */}\n {!inlineTags && (\n <InputTags mentions={mentions} onRemove={handleRemoveMention} />\n )}\n\n <div className={styles.inputAndButtons}>\n {/* 前缀插槽 */}\n {renderSlot(prefix, false)}\n\n {inlineTags ? (\n <InlineTagInput\n ref={inlineInputRef}\n value={value}\n mentions={mentions}\n defaultInputParts={defaultInputParts}\n placeholder={placeholder}\n disabled={inputDisabled}\n onChange={handleInlineInputChange}\n onMentionsChange={setMentions}\n onKeyDown={handleKeyDown as any}\n onKeyUp={handleInlineKeyUp}\n renderMention={renderMention ?? renderTag}\n />\n ) : (\n <div className={styles.textAreaWrapper}>\n <Input.TextArea\n ref={textareaRef}\n className={styles.textArea}\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n placeholder={placeholder}\n autoSize={{ minRows: 1, maxRows: 4 }}\n style={{\n border: \"none\",\n boxShadow: \"none\",\n outline: \"none\",\n padding: 0,\n }}\n />\n </div>\n )}\n </div>\n\n {/* 快捷键弹出列表 */}\n {activeQuickKey && activeQuickKeyConfig && (\n <div className={styles.quickListWrapper}>\n <QuickList\n config={activeQuickKeyConfig}\n activeIndex={quickKeyActiveIndex}\n onSelect={handleQuickKeySelect}\n onClose={() => {\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n }}\n visible={true}\n />\n </div>\n )}\n\n {/* 底部操作行:左侧上传/业务按钮,右侧清空/发送按钮 */}\n {footer === false\n ? defaultActionBar\n : renderSlot(footer, defaultActionBar)}\n </div>\n </div>\n\n {/* 提示文案 */}\n {!footer && (\n <div className={styles.tip}>\n 内容由AI生成,无法确保真实准确,仅供参考\n </div>\n )}\n </div>\n );\n },\n);\n\nXAdkSender.displayName = \"XAdkSender\";\nexport default XAdkSender;\n"],
5
- "mappings": "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",
6
- "names": ["value", "files", "FileGallery", "InputTags", "InlineTagInput", "QuickList"]
4
+ "sourcesContent": ["import React, {\n useState,\n useRef,\n useCallback,\n forwardRef,\n useImperativeHandle,\n useMemo,\n useEffect,\n} from \"react\";\nimport { Popconfirm, message, Tooltip, Input, Modal } from \"antd\";\nimport {\n ClearOutlined,\n LoadingOutlined,\n ArrowUpOutlined,\n} from \"@ant-design/icons\";\nimport {\n XAdkSenderProps,\n XAdkSenderHandle,\n ServerFile,\n LocalFile,\n ActionsComponents,\n FileValidator,\n UploadFileResult,\n MentionTag,\n XAdkSenderSubmitData,\n XAdkSenderSubmitFormat,\n XAdkSenderSubmitPart,\n} from \"@/types\";\nimport { useStyles } from \"./styles\";\nimport FileGallery from \"../FileGallery\";\nimport InputSuggestionList from \"./InputSuggestionList\";\nimport InputTags from \"./InputTags\";\nimport InlineTagInput, { InlineTagInputRef } from \"./InlineTagInput\";\nimport { getExt } from \"@/utils/file\";\n\nconst XAdkSender = forwardRef<XAdkSenderHandle, XAdkSenderProps>(\n (\n {\n clearBtnShow = true,\n draggable = false,\n onFileSelect,\n loading = false,\n disabled = false,\n value: controlledValue,\n defaultValue = \"\",\n uploadRequest = () => {},\n onClear,\n onChange,\n onSubmit,\n onStop,\n onFilesChange,\n onUploadSuccess,\n onUploadError,\n maxFileSize = 10,\n placeholder = \"\",\n validators: customValidators = [],\n allowedFileTypes = [],\n maxFiles = Infinity,\n sendButtonRender,\n suffix,\n header,\n prefix,\n footer,\n footerLeft,\n quickKeys = [],\n inlineTags = false,\n renderMention,\n renderTag,\n mentions: controlledMentions,\n tags: controlledTags,\n defaultMentions,\n defaultTags = [],\n defaultInputParts,\n onMentionsChange,\n onTagsChange,\n onQuickKeyTrigger,\n submitFormat = \"text\",\n formatMention,\n formatTag,\n transformSubmitData,\n },\n ref,\n ) => {\n const styles = useStyles();\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState<string>(defaultValue);\n const value = isControlled ? controlledValue : internalValue;\n const setValue = (newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n // mentions 支持受控/非受控两种模式;inlineTags 打开时会和输入内容混排。\n const resolvedControlledMentions = controlledMentions ?? controlledTags;\n const initialMentions = defaultMentions ?? defaultTags;\n const isMentionsControlled = resolvedControlledMentions !== undefined;\n const [internalMentions, setInternalMentions] =\n useState<MentionTag[]>(initialMentions);\n const mentions = isMentionsControlled\n ? resolvedControlledMentions!\n : internalMentions;\n const setMentions = (newMentions: MentionTag[]) => {\n if (!isMentionsControlled) {\n setInternalMentions(newMentions);\n }\n onMentionsChange?.(newMentions);\n onTagsChange?.(newMentions);\n };\n\n const [files, setFiles] = useState<LocalFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<any>(null);\n const inlineInputRef = useRef<InlineTagInputRef>(null);\n\n // 快捷键弹层状态:记录触发字符、关键词,以及触发字符在纯文本中的位置。\n // SDK 不内置搜索框;业务方可在 onQuickKeyTrigger 中根据 keyword 自行更新 quickKeys.options。\n const [activeQuickKey, setActiveQuickKey] = useState<string | null>(null);\n const [quickKeyKeyword, setQuickKeyKeyword] = useState(\"\");\n const [quickKeyTriggerIdx, setQuickKeyTriggerIdx] = useState(-1);\n const [quickKeyActiveIndex, setQuickKeyActiveIndex] = useState(0);\n\n const closeQuickKeyList = useCallback(() => {\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n }, []);\n\n // 生成唯一ID\n const generateId = () => {\n return Date.now().toString(36) + Math.random().toString(36).substr(2);\n };\n\n const normalizeUploadResponse = (response: any): UploadFileResult => {\n const data = response?.data ?? response;\n return (Array.isArray(data) ? data[0] : data) ?? {};\n };\n\n const escapeXml = (text: string) =>\n text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n\n const escapeMarkdownLabel = (text: string) =>\n text.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\]/g, \"\\\\]\");\n\n const getMentionSubmitValue = (mention: MentionTag) =>\n String(\n mention.value ??\n mention.uri ??\n mention.data?.uri ??\n mention.data?.value ??\n mention.data?.name ??\n mention.targetId ??\n mention.displayName ??\n mention.label ??\n \"\",\n );\n\n const defaultFormatMention = (\n mention: MentionTag,\n format: Exclude<XAdkSenderSubmitFormat, \"structured\">,\n index: number,\n ) => {\n const value = getMentionSubmitValue(mention);\n if (format === \"xml\") {\n return `<mention type=\"${escapeXml(mention.type)}\" id=\"${escapeXml(mention.id)}\" label=\"${escapeXml(mention.label)}\" value=\"${escapeXml(value)}\" />`;\n }\n\n if (format === \"markdown\") {\n const href =\n mention.uri ||\n (value.includes(\"://\")\n ? value\n : `xadk-mention://${encodeURIComponent(mention.type)}/${encodeURIComponent(mention.id)}`);\n return `[@${escapeMarkdownLabel(mention.displayName || mention.label)}](${href})`;\n }\n\n return `@${mention.displayName || value || `mention-${index + 1}`}`;\n };\n\n const serializeMention = (\n mention: MentionTag,\n format: Exclude<XAdkSenderSubmitFormat, \"structured\">,\n index: number,\n ) =>\n formatMention?.(mention, { format, index }) ??\n formatTag?.(mention, { format, index }) ??\n defaultFormatMention(mention, format, index);\n\n const getSubmitParts = useCallback((): XAdkSenderSubmitPart[] => {\n if (inlineTags) {\n const parts = inlineInputRef.current?.getParts() || [];\n if (parts.length > 0) return parts;\n }\n\n const textParts: XAdkSenderSubmitPart[] = value\n ? [{ type: \"text\", text: value }]\n : [];\n const mentionParts = mentions.map((mention) => ({\n type: \"mention\" as const,\n mention,\n }));\n return [...mentionParts, ...textParts];\n }, [inlineTags, mentions, value]);\n\n const serializeParts = (\n parts: XAdkSenderSubmitPart[],\n format: XAdkSenderSubmitFormat,\n ) => {\n if (format === \"structured\") {\n return parts.reduce(\n (content, part) => content + (part.type === \"text\" ? part.text : \"\"),\n \"\",\n );\n }\n\n let tagIndex = 0;\n return parts\n .map((part) => {\n if (part.type === \"text\") return part.text;\n const result = serializeMention(part.mention, format, tagIndex);\n tagIndex += 1;\n return result;\n })\n .join(\"\");\n };\n\n const createSubmitData = (\n formattedFiles: ServerFile[],\n ): XAdkSenderSubmitData => {\n const parts = getSubmitParts();\n const rawText = parts.reduce(\n (content, part) => content + (part.type === \"text\" ? part.text : \"\"),\n \"\",\n );\n const standardData: Omit<XAdkSenderSubmitData, \"payload\"> = {\n text: serializeParts(parts, submitFormat),\n rawText,\n format: submitFormat,\n parts,\n files: formattedFiles,\n mentions,\n tags: mentions,\n };\n\n return {\n ...standardData,\n payload: transformSubmitData?.(standardData),\n };\n };\n\n // 检查文件类型\n const checkFileType = (file: File): boolean => {\n if (allowedFileTypes?.length > 0) {\n const ext = getExt(file);\n\n return allowedFileTypes.some((type) => {\n if (type.includes(\"/\")) {\n if (type.endsWith(\"/*\")) {\n return file.type.startsWith(type.split(\"/\")[0]);\n }\n return file.type === type;\n }\n\n if (type.startsWith(\".\")) {\n return ext === type.slice(1);\n }\n\n return false;\n });\n }\n return true;\n };\n\n // 重复文件检测\n const isDuplicateFile = (file: File, files: LocalFile[]) => {\n return files.some((f) => f.name === file.name && f.size === file.size);\n };\n\n // 内置校验器集合\n const builtInValidators: FileValidator[] = [\n (_file, { files }) => {\n if (files.length >= maxFiles) {\n return `最多只能上传 ${maxFiles} 个文件`;\n }\n return null;\n },\n (file) => {\n const maxSize = maxFileSize * 1024 * 1024;\n if (file.size > maxSize) {\n return `文件大小不能超过 ${maxFileSize}MB`;\n }\n return null;\n },\n (file) => {\n if (!checkFileType(file)) {\n return \"不支持的文件类型\";\n }\n return null;\n },\n (file, { files }) => {\n if (isDuplicateFile(file, files)) {\n return \"文件已存在\";\n }\n return null;\n },\n ];\n\n const allValidators = [...builtInValidators, ...customValidators];\n\n // 验证文件\n const validateFile = (file: File): { valid: boolean; message?: string } => {\n for (const validator of allValidators) {\n const error = validator(file, { files });\n if (error) {\n return { valid: false, message: error };\n }\n }\n return { valid: true };\n };\n\n // 处理文件选择\n const handleFileSelect = useCallback(\n (selectedFiles: File[]) => {\n const fileArray = Array.from(selectedFiles);\n\n if (files.length + fileArray.length > maxFiles) {\n message.error(`最多只能上传 ${maxFiles} 个文件`);\n return;\n }\n\n const validFiles: LocalFile[] = [];\n\n fileArray.forEach((file) => {\n const validation = validateFile(file);\n\n if (validation.valid) {\n validFiles.push({\n id: generateId(),\n uid: generateId(),\n name: file.name,\n size: file.size,\n type: file.type,\n file,\n progress: 0,\n status: \"pending\",\n response: null,\n });\n } else {\n message.error(validation.message);\n }\n });\n\n if (validFiles.length > 0) {\n setFiles((prev) => {\n const next = [...prev, ...validFiles];\n onFilesChange?.(next);\n return next;\n });\n uploadFiles(validFiles);\n }\n },\n [files, maxFiles, maxFileSize, allowedFileTypes],\n );\n\n // 暴露给业务工具栏调用的命令式能力;外部 Popover 选择标签时可插入到当前光标位置。\n useImperativeHandle(\n ref,\n () => ({\n addFiles: (rawFiles: File[]) => {\n handleFileSelect(rawFiles);\n },\n insertMention: (mention: MentionTag) => {\n if (inlineTags) {\n inlineInputRef.current?.insertMention(mention);\n return;\n }\n setMentions([...mentions, mention]);\n },\n insertTag: (mention: MentionTag) => {\n if (inlineTags) {\n inlineInputRef.current?.insertMention(mention);\n return;\n }\n setMentions([...mentions, mention]);\n },\n focus: () => {\n inlineTags\n ? inlineInputRef.current?.focus()\n : textareaRef.current?.focus();\n },\n }),\n [handleFileSelect, inlineTags, setMentions, mentions],\n );\n\n // 上传文件\n const uploadFiles = async (fileList: LocalFile[]) => {\n for (const localFile of fileList) {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, status: \"uploading\" } : f,\n ),\n );\n\n try {\n await uploadRequest({\n file: localFile.file,\n onProgress: (e) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, progress: e.percent } : f,\n ),\n );\n },\n onSuccess: (response) => {\n const responseData = normalizeUploadResponse(response);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"success\",\n progress: 100,\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n }\n : f,\n ),\n );\n\n onUploadSuccess?.({\n ...localFile,\n status: \"success\",\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n });\n },\n onError: (error) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage: error.message,\n }\n : f,\n ),\n );\n onUploadError?.(localFile, error);\n },\n });\n } catch (error) {\n console.error(\"上传处理错误:\", error);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage:\n error instanceof Error ? error.message : \"上传处理失败\",\n }\n : f,\n ),\n );\n message.error(`${localFile.name} 上传失败`);\n }\n }\n };\n\n // 删除文件\n const handleRemoveFile = (id: string) => {\n setFiles((prev) => {\n const next = prev.filter((file) => file.id !== id);\n onFilesChange?.(next);\n return next;\n });\n };\n\n // 处理拖拽事件\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (draggable) {\n setIsDragOver(true);\n }\n },\n [draggable],\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (draggable) {\n setIsDragOver(false);\n }\n },\n [draggable],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (\n draggable &&\n e.dataTransfer.files &&\n e.dataTransfer.files.length > 0\n ) {\n // 内核不再自行处理文件,交给外层(DefaultLayout/业务)通过 onFileSelect 决定\n onFileSelect?.(Array.from(e.dataTransfer.files));\n }\n },\n [draggable, onFileSelect],\n );\n\n // 删除标签\n const handleRemoveMention = useCallback(\n (id: string) => {\n setMentions(mentions.filter((item) => item.id !== id));\n },\n [mentions, setMentions],\n );\n\n // 查找当前活跃的快捷键配置\n const activeQuickKeyConfig = useMemo(() => {\n if (!activeQuickKey) return null;\n return quickKeys.find((qk) => qk.key === activeQuickKey) || null;\n }, [activeQuickKey, quickKeys]);\n\n const activeQuickKeyOptionsLength =\n activeQuickKeyConfig?.options.length || 0;\n\n useEffect(() => {\n setQuickKeyActiveIndex(0);\n }, [activeQuickKey]);\n\n useEffect(() => {\n if (activeQuickKeyOptionsLength <= 0) {\n setQuickKeyActiveIndex(0);\n return;\n }\n\n // 业务方可能在 onQuickKeyTrigger 中动态更新 options;\n // 这里只做越界归一化,不重置有效索引,避免键盘高亮移动后又跳回第一项。\n setQuickKeyActiveIndex(\n (prev) =>\n ((prev % activeQuickKeyOptionsLength) + activeQuickKeyOptionsLength) %\n activeQuickKeyOptionsLength,\n );\n }, [activeQuickKeyOptionsLength]);\n\n const getNextQuickKeyIndex = useCallback(\n (current: number, step: number) => {\n if (activeQuickKeyOptionsLength <= 0) return 0;\n return (\n (current + step + activeQuickKeyOptionsLength) %\n activeQuickKeyOptionsLength\n );\n },\n [activeQuickKeyOptionsLength],\n );\n\n // 从当前光标前的连续文本片段中查找最近的快捷键,例如 abc@doc 会触发 @。\n const detectQuickKey = useCallback(\n (text: string, cursorPos: number) => {\n const quickKeyChars = quickKeys.map((qk) => qk.key);\n if (quickKeyChars.length === 0) return;\n\n const textBeforeCursor = text.slice(0, cursorPos);\n let found = false;\n for (let i = textBeforeCursor.length - 1; i >= 0; i--) {\n const char = textBeforeCursor[i];\n if (/\\s/.test(char)) break;\n if (quickKeyChars.includes(char)) {\n const keyword = textBeforeCursor.slice(i + 1);\n setActiveQuickKey(char);\n setQuickKeyKeyword(keyword);\n setQuickKeyTriggerIdx(i);\n setQuickKeyActiveIndex(0);\n onQuickKeyTrigger?.(char, keyword);\n found = true;\n break;\n }\n }\n\n if (!found && activeQuickKey) {\n const triggerChar = text[quickKeyTriggerIdx];\n const keyword = text.slice(quickKeyTriggerIdx + 1, cursorPos);\n if (\n quickKeyTriggerIdx < 0 ||\n !triggerChar ||\n !quickKeyChars.includes(triggerChar) ||\n /\\s/.test(keyword)\n ) {\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n } else {\n setQuickKeyKeyword(keyword);\n }\n }\n },\n [activeQuickKey, onQuickKeyTrigger, quickKeyTriggerIdx, quickKeys],\n );\n\n // 选择快捷项后转成结构化 Mention;inline 模式会替换掉触发字符和关键词。\n const handleQuickKeySelect = useCallback(\n (option: any) => {\n const mentionType =\n activeQuickKeyConfig?.mentionType ||\n activeQuickKeyConfig?.tagType ||\n activeQuickKey ||\n \"unknown\";\n const newMention: MentionTag = {\n id: generateId(),\n label: option.label,\n type: mentionType,\n value: option.value ?? option.uri ?? option.name ?? option.label,\n uri: option.uri,\n targetId: option.targetId ?? option.skillNo ?? option.pluginNo,\n displayName: option.displayName ?? option.label,\n trigger: activeQuickKey || undefined,\n icon: option.icon,\n data: option,\n };\n option.onSelect?.(option);\n activeQuickKeyConfig?.onSelect?.(option);\n\n if (option.action === \"command\") {\n if (inlineTags) {\n inlineInputRef.current?.deleteTextRange({\n start: quickKeyTriggerIdx,\n end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length,\n });\n } else if (quickKeyTriggerIdx >= 0) {\n setValue(\n value.slice(0, quickKeyTriggerIdx) +\n value.slice(quickKeyTriggerIdx + 1 + quickKeyKeyword.length),\n );\n }\n } else if (inlineTags) {\n inlineInputRef.current?.insertMention(newMention, {\n start: quickKeyTriggerIdx,\n end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length,\n });\n } else {\n setMentions([...mentions, newMention]);\n\n // 从输入框中删除快捷键字符和关键词\n if (quickKeyTriggerIdx >= 0) {\n const newValue =\n value.slice(0, quickKeyTriggerIdx) +\n value.slice(quickKeyTriggerIdx + 1 + quickKeyKeyword.length);\n setValue(newValue);\n }\n }\n\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n inlineTags\n ? inlineInputRef.current?.focus()\n : textareaRef.current?.focus();\n },\n [\n activeQuickKey,\n activeQuickKeyConfig,\n inlineTags,\n mentions,\n setMentions,\n value,\n quickKeyTriggerIdx,\n quickKeyKeyword,\n setValue,\n ],\n );\n\n // 处理输入框变化(含快捷键检测)\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n setValue(newValue);\n\n // 检测快捷键触发\n detectQuickKey(newValue, e.target.selectionStart || 0);\n };\n\n const handleInlineInputChange = (newValue: string) => {\n setValue(newValue);\n // contenteditable 的 selection 不一定和 React state 同步,需实时读取内部光标 offset。\n detectQuickKey(\n newValue,\n inlineInputRef.current?.getCursorOffset() || newValue.length,\n );\n };\n\n const handleQuickKeyByText = (text: string, cursorPos: number) => {\n const quickKeyChars = quickKeys.map((qk) => qk.key);\n if (quickKeyChars.length === 0) return;\n\n const textBeforeCursor = text.slice(0, cursorPos);\n\n // 检测刚输入的字符是否是快捷键\n const lastChar = textBeforeCursor[cursorPos - 1];\n if (lastChar && quickKeyChars.includes(lastChar)) {\n // 上下键导航后会触发 keyup,此时光标前仍是同一个快捷键字符;\n // 如果重复重置 activeIndex,视觉上会“移动一下又回到第一项”。\n if (\n activeQuickKey === lastChar &&\n quickKeyTriggerIdx === cursorPos - 1\n ) {\n return;\n }\n setActiveQuickKey(lastChar);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(cursorPos - 1);\n setQuickKeyActiveIndex(0);\n onQuickKeyTrigger?.(lastChar, \"\");\n }\n };\n\n // onChange 负责更新搜索词;onKeyUp 兜底捕获刚输入的快捷键字符。\n const isQuickListControlKey = (key: string) =>\n key === \"ArrowDown\" ||\n key === \"ArrowUp\" ||\n key === \"Enter\" ||\n key === \"Escape\";\n\n const handleKeyUp = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (activeQuickKey && isQuickListControlKey(e.key)) return;\n const target = e.target as HTMLTextAreaElement;\n handleQuickKeyByText(target.value || \"\", target.selectionStart || 0);\n };\n\n const handleInlineKeyUp = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (activeQuickKey && isQuickListControlKey(e.key)) return;\n // inline 输入区不是 textarea,不能读 event.target.value,只能从 ref 取纯文本。\n const text = inlineInputRef.current?.getText() || \"\";\n const cursorPos =\n inlineInputRef.current?.getCursorOffset() || text.length;\n handleQuickKeyByText(text, cursorPos);\n };\n\n // 处理提交\n const handleSubmit = () => {\n // 生成期间允许继续编辑下一条消息,但停止按钮仍代表当前唯一可执行动作。\n if (loading) return;\n if (!value.trim() && files.length === 0 && mentions.length === 0) {\n message.warning(\"请输入消息或选择文件\");\n return;\n }\n\n const successFiles = files.filter((file) => file.status === \"success\");\n const uploadingFiles = files.filter(\n (file) => file.status === \"uploading\",\n );\n\n if (uploadingFiles.length > 0) {\n Modal.confirm({\n title: \"文件上传中\",\n content: `还有 ${uploadingFiles.length} 个文件正在上传,是否继续发送?`,\n okText: \"发送已完成的\",\n cancelText: \"等待全部完成\",\n onOk: () => {\n const formattedFiles = formatFilesForServer(successFiles);\n if (onSubmit) {\n onSubmit(createSubmitData(formattedFiles));\n }\n\n setValue(\"\");\n setMentions([]);\n setFiles((prev) => prev.filter((f) => f.status !== \"success\"));\n },\n onCancel: () => {\n message.info(\"请等待文件上传完成后再发送\");\n },\n });\n } else {\n const formattedFiles = formatFilesForServer(successFiles);\n\n if (onSubmit) {\n onSubmit(createSubmitData(formattedFiles));\n }\n\n setValue(\"\");\n setMentions([]);\n setFiles((prev) => prev.filter((f) => f.status !== \"success\"));\n }\n };\n\n // 格式化文件列表为服务端格式\n const formatFilesForServer = (fileList: LocalFile[]): ServerFile[] => {\n return fileList\n .filter((file) => file.status === \"success\" && file.response)\n .map((file) => {\n const responseData = normalizeUploadResponse(file.response);\n\n return {\n fileName: responseData.fileName || file.name,\n fileId: responseData.fileId || responseData.id || \"\",\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url ||\n \"\",\n type: responseData.fileType || responseData.type || getExt(file),\n size: responseData.fileSize || responseData.size || file.size,\n mimeType: responseData.mimeType || file.type,\n raw: {\n ...responseData,\n },\n };\n });\n };\n\n // 处理回车键\n const handleKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n // 输入法候选阶段的 Enter 用于确认候选词,不能触发快捷项选择或消息发送。\n if (e.nativeEvent.isComposing || e.keyCode === 229) return;\n\n const quickKeyOptions = activeQuickKeyConfig?.options || [];\n\n if (activeQuickKey && quickKeyOptions.length > 0) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setQuickKeyActiveIndex((prev) => getNextQuickKeyIndex(prev, 1));\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setQuickKeyActiveIndex((prev) => getNextQuickKeyIndex(prev, -1));\n return;\n }\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleQuickKeySelect(\n quickKeyOptions[\n Math.min(quickKeyActiveIndex, quickKeyOptions.length - 1)\n ],\n );\n return;\n }\n\n if (e.key === \"Escape\") {\n e.preventDefault();\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n return;\n }\n }\n\n if (e.key === \"Enter\" && !e.shiftKey && !activeQuickKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n // 渲染文件列表\n const renderFileList = () => {\n if (files.length === 0) return null;\n\n return (\n <div className={styles.contextFiles}>\n {files.map((file) => (\n <FileGallery\n key={file.id}\n file={file}\n size=\"small\"\n removable\n onRemove={handleRemoveFile}\n />\n ))}\n </div>\n );\n };\n\n const containerClass = `${styles.container} ${isDragOver ? \"drag-over\" : \"\"}`;\n const uploading = files.some((f) => f.status === \"uploading\");\n const controlsDisabled = disabled || uploading || loading;\n const inputDisabled = disabled || uploading;\n const hasContent = value.trim().length > 0;\n const hasFiles = files.some((f) => f.status === \"success\");\n const hasMentions = mentions.length > 0;\n const canSend = hasContent || hasFiles || hasMentions;\n\n // 定义按钮组件\n const SendButton = (props: any) => {\n if (sendButtonRender) {\n return (\n <>\n {sendButtonRender({\n loading,\n disabled: uploading || disabled,\n canSend,\n onSend: handleSubmit,\n onStop,\n })}\n </>\n );\n }\n return (\n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? \"stop\" : \"\"}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading || disabled}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n {...props}\n >\n {loading ? <LoadingOutlined spin /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n );\n };\n\n const ClearButton = (props: any) => (\n <Popconfirm\n title=\"确定要清空聊天记录吗?\"\n onConfirm={onClear}\n placement=\"top\"\n okText=\"确定\"\n cancelText=\"取消\"\n disabled={controlsDisabled}\n >\n <button\n className={`${styles.iconButton} ${styles.clearButton}`}\n disabled={controlsDisabled}\n aria-label=\"清空聊天记录\"\n {...props}\n >\n <ClearOutlined />\n </button>\n </Popconfirm>\n );\n\n const actionsComponents: ActionsComponents = {\n SendButton,\n ClearButton,\n };\n\n // 渲染插槽内容\n const renderSlot = (\n slot:\n | React.ReactNode\n | false\n | ((\n oriNode: React.ReactNode,\n info: { components: ActionsComponents },\n ) => React.ReactNode | false)\n | undefined,\n oriNode: React.ReactNode,\n ): React.ReactNode | null => {\n if (slot === false) return null;\n if (slot === undefined) return oriNode;\n if (typeof slot === \"function\") {\n const result = slot(oriNode, { components: actionsComponents });\n return result === false ? null : result;\n }\n return slot;\n };\n\n const headerNode = renderSlot(header, false);\n const fileListNode = files.length > 0 ? renderFileList() : null;\n\n // 默认后缀仅保留发送/停止按钮;上传与清空统一放到底部 actionBar,方便业务扩展左侧按钮组。\n const defaultSuffix = (\n <div className={styles.buttonGroup}>\n {sendButtonRender ? (\n sendButtonRender({\n loading,\n disabled: uploading || disabled,\n canSend,\n onSend: handleSubmit,\n onStop,\n })\n ) : (\n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? \"stop\" : \"\"}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading || disabled}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n >\n {loading ? <LoadingOutlined spin /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n )}\n </div>\n );\n\n const defaultActionBar = (\n <div className={styles.actionBar}>\n <div className={styles.actionBarLeft}>\n {renderSlot(footerLeft, false)}\n </div>\n <div className={styles.actionBarRight}>\n {clearBtnShow && <ClearButton />}\n {renderSlot(suffix, defaultSuffix)}\n </div>\n </div>\n );\n\n return (\n <div\n ref={containerRef}\n className={containerClass}\n onBlur={(event) => {\n const nextFocusedNode = event.relatedTarget as Node | null;\n if (\n nextFocusedNode &&\n event.currentTarget.contains(nextFocusedNode)\n ) {\n return;\n }\n closeQuickKeyList();\n }}\n onDragOver={draggable ? handleDragOver : undefined}\n onDragLeave={draggable ? handleDragLeave : undefined}\n onDrop={draggable ? handleDrop : undefined}\n >\n <div className={styles.mainArea}>\n <div className={styles.senderWrap}>\n {(headerNode || fileListNode) && (\n <div className={styles.contextBar}>\n {/* 头部插槽与附件共享上下文行,便于知识库、文件等输入上下文统一展示。 */}\n {headerNode && (\n <div className={styles.contextHeader}>{headerNode}</div>\n )}\n {fileListNode}\n </div>\n )}\n\n {/* textarea 模式下保留历史标签展示;inlineTags 模式标签直接混排在输入区内 */}\n {!inlineTags && (\n <InputTags mentions={mentions} onRemove={handleRemoveMention} />\n )}\n\n <div className={styles.inputAndButtons}>\n {/* 前缀插槽 */}\n {renderSlot(prefix, false)}\n\n {inlineTags ? (\n <InlineTagInput\n ref={inlineInputRef}\n value={value}\n mentions={mentions}\n defaultInputParts={defaultInputParts}\n placeholder={placeholder}\n disabled={inputDisabled}\n onChange={handleInlineInputChange}\n onMentionsChange={setMentions}\n onKeyDown={handleKeyDown as any}\n onKeyUp={handleInlineKeyUp}\n renderMention={renderMention ?? renderTag}\n />\n ) : (\n <div className={styles.textAreaWrapper}>\n <Input.TextArea\n ref={textareaRef}\n className={styles.textArea}\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n placeholder={placeholder}\n autoSize={{ minRows: 1, maxRows: 4 }}\n style={{\n border: \"none\",\n boxShadow: \"none\",\n outline: \"none\",\n padding: 0,\n }}\n />\n </div>\n )}\n </div>\n\n {/* 快捷键弹出列表 */}\n {activeQuickKey && activeQuickKeyConfig && (\n <div className={styles.quickListWrapper}>\n <InputSuggestionList\n config={activeQuickKeyConfig}\n activeIndex={quickKeyActiveIndex}\n onSelect={handleQuickKeySelect}\n onClose={closeQuickKeyList}\n visible={true}\n />\n </div>\n )}\n\n {/* 底部操作行:左侧上传/业务按钮,右侧清空/发送按钮 */}\n {footer === false\n ? defaultActionBar\n : renderSlot(footer, defaultActionBar)}\n </div>\n </div>\n\n {/* 提示文案 */}\n {!footer && (\n <div className={styles.tip}>\n 内容由AI生成,无法确保真实准确,仅供参考\n </div>\n )}\n </div>\n );\n },\n);\n\nXAdkSender.displayName = \"XAdkSender\";\nexport default XAdkSender;\n"],
5
+ "mappings": "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",
6
+ "names": ["value", "files", "FileGallery", "InputTags", "InlineTagInput", "InputSuggestionList"]
7
7
  }
@@ -333,7 +333,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
333
333
  // 快捷键弹出列表
334
334
  quickList: import_css.css`
335
335
  max-height: 320px;
336
- width: 280px;
336
+ width: 380px;
337
337
  display: flex;
338
338
  flex-direction: column;
339
339
  overflow: hidden;
@@ -394,21 +394,33 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
394
394
  }
395
395
 
396
396
  .quick-list-item-content {
397
+ display: flex;
398
+ align-items: center;
397
399
  flex: 1;
398
400
  min-width: 0;
401
+ gap: 12px;
399
402
  }
400
403
 
401
404
  .quick-list-item-label {
405
+ flex: 0 0 112px;
406
+ overflow: hidden;
402
407
  font-size: 13px;
403
408
  font-weight: 500;
404
409
  color: #262626;
405
410
  line-height: 1.4;
411
+ text-overflow: ellipsis;
412
+ white-space: nowrap;
406
413
  }
407
414
 
408
415
  .quick-list-item-desc {
416
+ flex: 1;
417
+ min-width: 0;
418
+ overflow: hidden;
409
419
  font-size: 12px;
410
420
  color: #8c8c8c;
411
421
  line-height: 1.4;
422
+ text-overflow: ellipsis;
423
+ white-space: nowrap;
412
424
  }
413
425
  `,
414
426
  // 输入框内标签
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAdkSender/styles.tsx"],
4
- "sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n // 容器样式 - 最外层边框\n container: css`\n position: relative;\n padding: 0 15px 10px;\n overflow: visible;\n border: 2px solid transparent;\n transition: all 0.3s ease;\n\n &.drag-over {\n border: 2px dashed #000;\n background: rgba(0, 0, 0, 0.02);\n }\n `,\n\n // 主内容区域\n mainArea: css`\n border-radius: 20px;\n overflow: visible;\n background: #fff;\n `,\n\n // 发送区域\n senderWrap: css`\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: var(--yb-input-bg-color);\n border: 0.5px solid var(--widget-line, rgba(0, 0, 0, 0.08));\n border-radius: 20px;\n box-sizing: border-box;\n caret-color: var(--yb-input-caret-color);\n flex: auto;\n font-size: 14px;\n line-height: 22px;\n padding: 10px 12px 8px;\n position: relative;\n z-index: 1;\n transition-duration: 0.2s;\n transition-property:\n color, background-color, border-color, text-decoration-color, fill,\n stroke, box-shadow;\n transition-timing-function: linear;\n box-shadow: 0 6px 30px 0 rgba(0, 0, 0, 0.08);\n `,\n\n contextBar: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n `,\n\n contextHeader: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n flex: 0 0 auto;\n min-width: 0;\n `,\n\n contextFiles: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n flex: 1 1 auto;\n min-width: 0;\n `,\n\n // 输入框和按钮容器\n inputAndButtons: css`\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n\n // 文本输入框容器\n textAreaWrapper: css`\n flex: 1;\n display: flex;\n align-items: center;\n background: #fff;\n padding: 0 4px;\n min-height: 44px;\n\n /* 移除所有蓝色效果 */\n &:focus-within {\n border-color: #d9d9d9;\n box-shadow: none;\n }\n\n .ant-input:disabled {\n background: transparent !important;\n }\n\n &::placeholder {\n color: #bfbfbf;\n }\n `,\n\n // 文本输入框\n textArea: css`\n flex: 1;\n border: none;\n background: transparent;\n font-size: 14px;\n line-height: 1.5;\n padding: 12px 0;\n outline: none;\n color: #262626;\n `,\n\n inlineInputWrapper: css`\n position: relative;\n flex: 1;\n min-height: 44px;\n display: flex;\n align-items: center;\n padding: 0 4px;\n background: #fff;\n `,\n\n inlineInput: css`\n width: 100%;\n min-height: 24px;\n max-height: 112px;\n overflow-y: auto;\n outline: none;\n border: none;\n color: #262626;\n font-size: 14px;\n line-height: 24px;\n white-space: pre-wrap;\n word-break: break-word;\n `,\n\n inlinePlaceholder: css`\n position: absolute;\n left: 4px;\n top: 50%;\n transform: translateY(-50%);\n color: #bfbfbf;\n font-size: 14px;\n line-height: 24px;\n pointer-events: none;\n user-select: none;\n `,\n\n inlineTag: css`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n max-width: 180px;\n height: 22px;\n padding: 0 7px;\n margin: 0 3px;\n vertical-align: baseline;\n border-radius: 6px;\n border: 1px solid #d6e4ff;\n background: #f0f7ff;\n color: #0958d9;\n font-size: 12px;\n line-height: 20px;\n user-select: none;\n\n .xadk-inline-tag-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .xadk-inline-tag-close {\n cursor: pointer;\n color: #597ef7;\n font-size: 12px;\n line-height: 1;\n }\n\n &[data-xadk-inline-mention-type=\"knowledge\"],\n &[data-xadk-inline-mention-type=\"knowledge_directory\"],\n &[data-xadk-inline-mention-type=\"knowledge_file\"],\n &[data-xadk-inline-mention-type=\"kb\"] {\n border-color: #f1f1f1;\n background: #f1f1f1;\n color: #1a1a1a;\n\n .xadk-inline-tag-close {\n color: #8c8c8c;\n }\n }\n `,\n\n // 按钮组\n buttonGroup: css`\n display: flex;\n gap: 8px;\n align-items: center;\n height: 36px;\n `,\n\n // 按钮统一样式\n iconButton: css`\n width: 36px;\n height: 36px;\n min-width: 36px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n\n &:hover {\n transform: translateY(-1px);\n }\n\n &:active {\n transform: translateY(0);\n }\n `,\n\n // 清空按钮\n clearButton: css`\n border: 1px solid #f0f0f0;\n background: #fff;\n color: #8c8c8c;\n\n &:hover {\n border-color: #d9d9d9;\n color: #262626;\n background: #fafafa;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n\n // 上传按钮\n uploadButton: css`\n border: 1px solid #f0f0f0;\n background: #fff;\n\n &:hover {\n //\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n border-color: #f0f0f0;\n background: #fafafa;\n }\n `,\n\n // 发送按钮\n sendButton: css`\n background: #000;\n border: none;\n color: #fff;\n\n &:hover:not(:disabled) {\n background: #333; /* 悬停状态 */\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n background: #cccccc;\n color: #fff;\n }\n\n &.stop {\n //\n\n &:hover:not(:disabled) {\n //\n }\n\n &:disabled {\n background: #cccccc; /* 禁用状态也保持淡灰色 */\n }\n }\n `,\n\n // 底部提示\n tip: css`\n margin: 12px 0;\n text-align: center;\n font-size: 12px;\n color: #8c8c8c;\n `,\n\n actionBar: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n min-height: 36px;\n `,\n\n actionBarLeft: css`\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n `,\n\n actionBarRight: css`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n flex-shrink: 0;\n `,\n\n // 快捷键弹出列表外层容器\n quickListWrapper: css`\n position: absolute;\n left: 0;\n bottom: 100%;\n margin-bottom: 4px;\n z-index: 100;\n `,\n\n // 快捷键弹出列表\n quickList: css`\n max-height: 320px;\n width: 280px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 40px 0 rgba(0, 0, 0, 0.12);\n `,\n\n quickListHeader: css`\n padding: 12px 16px 0;\n font-size: 13px;\n font-weight: 500;\n color: #8c8c8c;\n `,\n\n quickListBody: css`\n flex: 1;\n overflow-y: auto;\n padding: 4px 0;\n `,\n\n quickListEmpty: css`\n padding: 24px 16px;\n text-align: center;\n color: #8c8c8c;\n font-size: 13px;\n `,\n\n quickListGroup: css`\n padding: 8px 16px 4px;\n font-size: 11px;\n font-weight: 500;\n color: #8c8c8c;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n `,\n\n quickListItem: css`\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 16px;\n cursor: pointer;\n transition: background 0.15s ease;\n\n &:hover {\n background: #f5f5f5;\n }\n\n &.active {\n background: #f0f7ff;\n }\n\n .quick-list-item-icon {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: #f5f5f5;\n flex-shrink: 0;\n }\n\n .quick-list-item-content {\n flex: 1;\n min-width: 0;\n }\n\n .quick-list-item-label {\n font-size: 13px;\n font-weight: 500;\n color: #262626;\n line-height: 1.4;\n }\n\n .quick-list-item-desc {\n font-size: 12px;\n color: #8c8c8c;\n line-height: 1.4;\n }\n `,\n\n // 输入框内标签\n inputTags: css`\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 4px 0 8px;\n `,\n\n inputTag: css`\n margin: 0;\n font-size: 12px;\n border-radius: 6px;\n `,\n}));\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n // 容器样式 - 最外层边框\n container: css`\n position: relative;\n padding: 0 15px 10px;\n overflow: visible;\n border: 2px solid transparent;\n transition: all 0.3s ease;\n\n &.drag-over {\n border: 2px dashed #000;\n background: rgba(0, 0, 0, 0.02);\n }\n `,\n\n // 主内容区域\n mainArea: css`\n border-radius: 20px;\n overflow: visible;\n background: #fff;\n `,\n\n // 发送区域\n senderWrap: css`\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: var(--yb-input-bg-color);\n border: 0.5px solid var(--widget-line, rgba(0, 0, 0, 0.08));\n border-radius: 20px;\n box-sizing: border-box;\n caret-color: var(--yb-input-caret-color);\n flex: auto;\n font-size: 14px;\n line-height: 22px;\n padding: 10px 12px 8px;\n position: relative;\n z-index: 1;\n transition-duration: 0.2s;\n transition-property:\n color, background-color, border-color, text-decoration-color, fill,\n stroke, box-shadow;\n transition-timing-function: linear;\n box-shadow: 0 6px 30px 0 rgba(0, 0, 0, 0.08);\n `,\n\n contextBar: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n `,\n\n contextHeader: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n flex: 0 0 auto;\n min-width: 0;\n `,\n\n contextFiles: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n flex: 1 1 auto;\n min-width: 0;\n `,\n\n // 输入框和按钮容器\n inputAndButtons: css`\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n\n // 文本输入框容器\n textAreaWrapper: css`\n flex: 1;\n display: flex;\n align-items: center;\n background: #fff;\n padding: 0 4px;\n min-height: 44px;\n\n /* 移除所有蓝色效果 */\n &:focus-within {\n border-color: #d9d9d9;\n box-shadow: none;\n }\n\n .ant-input:disabled {\n background: transparent !important;\n }\n\n &::placeholder {\n color: #bfbfbf;\n }\n `,\n\n // 文本输入框\n textArea: css`\n flex: 1;\n border: none;\n background: transparent;\n font-size: 14px;\n line-height: 1.5;\n padding: 12px 0;\n outline: none;\n color: #262626;\n `,\n\n inlineInputWrapper: css`\n position: relative;\n flex: 1;\n min-height: 44px;\n display: flex;\n align-items: center;\n padding: 0 4px;\n background: #fff;\n `,\n\n inlineInput: css`\n width: 100%;\n min-height: 24px;\n max-height: 112px;\n overflow-y: auto;\n outline: none;\n border: none;\n color: #262626;\n font-size: 14px;\n line-height: 24px;\n white-space: pre-wrap;\n word-break: break-word;\n `,\n\n inlinePlaceholder: css`\n position: absolute;\n left: 4px;\n top: 50%;\n transform: translateY(-50%);\n color: #bfbfbf;\n font-size: 14px;\n line-height: 24px;\n pointer-events: none;\n user-select: none;\n `,\n\n inlineTag: css`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n max-width: 180px;\n height: 22px;\n padding: 0 7px;\n margin: 0 3px;\n vertical-align: baseline;\n border-radius: 6px;\n border: 1px solid #d6e4ff;\n background: #f0f7ff;\n color: #0958d9;\n font-size: 12px;\n line-height: 20px;\n user-select: none;\n\n .xadk-inline-tag-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .xadk-inline-tag-close {\n cursor: pointer;\n color: #597ef7;\n font-size: 12px;\n line-height: 1;\n }\n\n &[data-xadk-inline-mention-type=\"knowledge\"],\n &[data-xadk-inline-mention-type=\"knowledge_directory\"],\n &[data-xadk-inline-mention-type=\"knowledge_file\"],\n &[data-xadk-inline-mention-type=\"kb\"] {\n border-color: #f1f1f1;\n background: #f1f1f1;\n color: #1a1a1a;\n\n .xadk-inline-tag-close {\n color: #8c8c8c;\n }\n }\n `,\n\n // 按钮组\n buttonGroup: css`\n display: flex;\n gap: 8px;\n align-items: center;\n height: 36px;\n `,\n\n // 按钮统一样式\n iconButton: css`\n width: 36px;\n height: 36px;\n min-width: 36px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n\n &:hover {\n transform: translateY(-1px);\n }\n\n &:active {\n transform: translateY(0);\n }\n `,\n\n // 清空按钮\n clearButton: css`\n border: 1px solid #f0f0f0;\n background: #fff;\n color: #8c8c8c;\n\n &:hover {\n border-color: #d9d9d9;\n color: #262626;\n background: #fafafa;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n\n // 上传按钮\n uploadButton: css`\n border: 1px solid #f0f0f0;\n background: #fff;\n\n &:hover {\n //\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n border-color: #f0f0f0;\n background: #fafafa;\n }\n `,\n\n // 发送按钮\n sendButton: css`\n background: #000;\n border: none;\n color: #fff;\n\n &:hover:not(:disabled) {\n background: #333; /* 悬停状态 */\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n background: #cccccc;\n color: #fff;\n }\n\n &.stop {\n //\n\n &:hover:not(:disabled) {\n //\n }\n\n &:disabled {\n background: #cccccc; /* 禁用状态也保持淡灰色 */\n }\n }\n `,\n\n // 底部提示\n tip: css`\n margin: 12px 0;\n text-align: center;\n font-size: 12px;\n color: #8c8c8c;\n `,\n\n actionBar: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n min-height: 36px;\n `,\n\n actionBarLeft: css`\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n `,\n\n actionBarRight: css`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n flex-shrink: 0;\n `,\n\n // 快捷键弹出列表外层容器\n quickListWrapper: css`\n position: absolute;\n left: 0;\n bottom: 100%;\n margin-bottom: 4px;\n z-index: 100;\n `,\n\n // 快捷键弹出列表\n quickList: css`\n max-height: 320px;\n width: 380px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 40px 0 rgba(0, 0, 0, 0.12);\n `,\n\n quickListHeader: css`\n padding: 12px 16px 0;\n font-size: 13px;\n font-weight: 500;\n color: #8c8c8c;\n `,\n\n quickListBody: css`\n flex: 1;\n overflow-y: auto;\n padding: 4px 0;\n `,\n\n quickListEmpty: css`\n padding: 24px 16px;\n text-align: center;\n color: #8c8c8c;\n font-size: 13px;\n `,\n\n quickListGroup: css`\n padding: 8px 16px 4px;\n font-size: 11px;\n font-weight: 500;\n color: #8c8c8c;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n `,\n\n quickListItem: css`\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 16px;\n cursor: pointer;\n transition: background 0.15s ease;\n\n &:hover {\n background: #f5f5f5;\n }\n\n &.active {\n background: #f0f7ff;\n }\n\n .quick-list-item-icon {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: #f5f5f5;\n flex-shrink: 0;\n }\n\n .quick-list-item-content {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n gap: 12px;\n }\n\n .quick-list-item-label {\n flex: 0 0 112px;\n overflow: hidden;\n font-size: 13px;\n font-weight: 500;\n color: #262626;\n line-height: 1.4;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .quick-list-item-desc {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n font-size: 12px;\n color: #8c8c8c;\n line-height: 1.4;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n `,\n\n // 输入框内标签\n inputTags: css`\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 4px 0 8px;\n `,\n\n inputTag: css`\n margin: 0;\n font-size: 12px;\n border-radius: 6px;\n `,\n}));\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -89,7 +89,7 @@ var XAiConversations = (props) => {
89
89
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
90
90
  "div",
91
91
  {
92
- style: { display: listVisible ? "block" : "none" },
92
+ style: { display: listVisible ? "flex" : "none" },
93
93
  className: (0, import_clsx.default)(
94
94
  isNarrow ? styles.nWrapper : styles.fWrapper,
95
95
  animateDirection === "in" && styles.slideIn,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiConversations/index.tsx"],
4
- "sourcesContent": ["import React, { useState } from 'react';\nimport { Conversations } from '@ant-design/x';\nimport { RedoOutlined } from '@ant-design/icons';\nimport { Spin, Divider } from 'antd';\nimport InfiniteScroll from 'react-infinite-scroll-component';\nimport clsx from 'clsx';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { type XAiConversationsProps } from '@/types/XAiConversations';\nimport logo from '@/assets/logo.png';\nimport AddChatIcon from '@/assets/svg/AddChatIcon';\nimport flashOpen from '@/assets/flash-open.svg?url';\nimport { SESSION_PAGE_SIZE } from '@/constants';\nimport { useStyles, GlobalStyle } from './styles';\n\nconst XAiConversations: React.FC<XAiConversationsProps> = (props) => {\n const styles = useStyles();\n const { mergedProps } = useChatbotContext(props);\n const {\n isNarrow = false,\n sessionList,\n style,\n onActiveChange,\n onNewChat,\n loadMoreSessions,\n activeKey,\n menu,\n } = mergedProps;\n\n const [listVisible, setListVisible] = useState(false);\n const [animateDirection, setAnimateDirection] = useState<'in' | 'out' | null>(null);\n\n const handleSwitchTab = (key: string) => {\n onActiveChange?.(key);\n };\n\n const handleNewChat = () => {\n onNewChat?.();\n };\n\n const handleShowList = () => {\n setListVisible(true);\n setAnimateDirection('in');\n };\n\n const handleCloseList = () => {\n setAnimateDirection('out');\n setTimeout(() => {\n setListVisible(false);\n setAnimateDirection(null);\n }, 300);\n };\n\n return (\n <div className={styles.conversationsWrapper}>\n <GlobalStyle />\n {/** 顶部操作栏 */}\n {\n !listVisible && (\n <div className={styles.capWrapper}>\n <img alt=\"logo\" src={logo} className={clsx(styles.w(32), styles.h(29))} />\n <div className={styles.capShape}>\n <div className={styles.capIcon}>\n <img src={flashOpen} alt=\"\" onClick={handleShowList} />\n </div>\n <div className={styles.capIcon}>\n <AddChatIcon className={clsx(styles.w(17), styles.text('#343434'))} onClick={handleNewChat} />\n </div>\n </div>\n </div>\n )\n }\n\n {/* 会话列表 */}\n <div\n style={{ display: listVisible ? 'block' : 'none' }}\n className={clsx(\n isNarrow ? styles.nWrapper : styles.fWrapper,\n animateDirection === 'in' && styles.slideIn,\n animateDirection === 'out' && styles.slideOut,\n )}\n >\n {/* 固定头部 */}\n <div className={styles.fheaderWrapper}>\n <img alt=\"logo\" src={logo} className={clsx(styles.w(32), styles.h(29))} />\n <div className={styles.capIcon}>\n <img src={flashOpen} alt=\"\" onClick={handleCloseList} />\n </div>\n </div>\n <div className={styles.addChatBtn} onClick={handleNewChat}>\n <AddChatIcon className={clsx(styles.w(17), styles.mr(10))} />\n 开启新对话\n </div>\n <div className={styles.tipTitle}>历史对话</div>\n\n {/* 滚动区域 */}\n <div className={styles.scrollList}>\n <InfiniteScroll\n dataLength={sessionList.length}\n next={loadMoreSessions}\n hasMore={false}\n loader={(\n <div style={{ textAlign: 'center' }}>\n <Spin indicator={<RedoOutlined spin />} size=\"small\" />\n </div>\n )}\n endMessage={sessionList.length === SESSION_PAGE_SIZE && <Divider plain><span className={styles.textColor('#949494')}>只展示前 50 条数据</span></Divider>}\n style={{ overflow: 'hidden', paddingBottom: '5px' }}\n >\n <Conversations\n activeKey={activeKey}\n onActiveChange={(v) => handleSwitchTab(v)}\n items={sessionList}\n menu={menu}\n style={{\n width: 256,\n borderRadius: '6px',\n ...style,\n }}\n />\n </InfiniteScroll>\n </div>\n </div>\n\n {/* 遮罩层 - 仅在窄屏且列表可见时显示 */}\n {isNarrow && listVisible && (\n <div className={styles.mask} onClick={handleCloseList} />\n )}\n </div>\n );\n};\n\nexport default XAiConversations;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React, { useState } from 'react';\nimport { Conversations } from '@ant-design/x';\nimport { RedoOutlined } from '@ant-design/icons';\nimport { Spin, Divider } from 'antd';\nimport InfiniteScroll from 'react-infinite-scroll-component';\nimport clsx from 'clsx';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { type XAiConversationsProps } from '@/types/XAiConversations';\nimport logo from '@/assets/logo.png';\nimport AddChatIcon from '@/assets/svg/AddChatIcon';\nimport flashOpen from '@/assets/flash-open.svg?url';\nimport { SESSION_PAGE_SIZE } from '@/constants';\nimport { useStyles, GlobalStyle } from './styles';\n\nconst XAiConversations: React.FC<XAiConversationsProps> = (props) => {\n const styles = useStyles();\n const { mergedProps } = useChatbotContext(props);\n const {\n isNarrow = false,\n sessionList,\n style,\n onActiveChange,\n onNewChat,\n loadMoreSessions,\n activeKey,\n menu,\n } = mergedProps;\n\n const [listVisible, setListVisible] = useState(false);\n const [animateDirection, setAnimateDirection] = useState<'in' | 'out' | null>(null);\n\n const handleSwitchTab = (key: string) => {\n onActiveChange?.(key);\n };\n\n const handleNewChat = () => {\n onNewChat?.();\n };\n\n const handleShowList = () => {\n setListVisible(true);\n setAnimateDirection('in');\n };\n\n const handleCloseList = () => {\n setAnimateDirection('out');\n setTimeout(() => {\n setListVisible(false);\n setAnimateDirection(null);\n }, 300);\n };\n\n return (\n <div className={styles.conversationsWrapper}>\n <GlobalStyle />\n {/** 顶部操作栏 */}\n {\n !listVisible && (\n <div className={styles.capWrapper}>\n <img alt=\"logo\" src={logo} className={clsx(styles.w(32), styles.h(29))} />\n <div className={styles.capShape}>\n <div className={styles.capIcon}>\n <img src={flashOpen} alt=\"\" onClick={handleShowList} />\n </div>\n <div className={styles.capIcon}>\n <AddChatIcon className={clsx(styles.w(17), styles.text('#343434'))} onClick={handleNewChat} />\n </div>\n </div>\n </div>\n )\n }\n\n {/* 会话列表 */}\n <div\n // 展开时必须保持 flex 布局,scrollList 才能获得剩余高度并独立滚动。\n style={{ display: listVisible ? 'flex' : 'none' }}\n className={clsx(\n isNarrow ? styles.nWrapper : styles.fWrapper,\n animateDirection === 'in' && styles.slideIn,\n animateDirection === 'out' && styles.slideOut,\n )}\n >\n {/* 固定头部 */}\n <div className={styles.fheaderWrapper}>\n <img alt=\"logo\" src={logo} className={clsx(styles.w(32), styles.h(29))} />\n <div className={styles.capIcon}>\n <img src={flashOpen} alt=\"\" onClick={handleCloseList} />\n </div>\n </div>\n <div className={styles.addChatBtn} onClick={handleNewChat}>\n <AddChatIcon className={clsx(styles.w(17), styles.mr(10))} />\n 开启新对话\n </div>\n <div className={styles.tipTitle}>历史对话</div>\n\n {/* 滚动区域 */}\n <div className={styles.scrollList}>\n <InfiniteScroll\n dataLength={sessionList.length}\n next={loadMoreSessions}\n hasMore={false}\n loader={(\n <div style={{ textAlign: 'center' }}>\n <Spin indicator={<RedoOutlined spin />} size=\"small\" />\n </div>\n )}\n endMessage={sessionList.length === SESSION_PAGE_SIZE && <Divider plain><span className={styles.textColor('#949494')}>只展示前 50 条数据</span></Divider>}\n style={{ overflow: 'hidden', paddingBottom: '5px' }}\n >\n <Conversations\n activeKey={activeKey}\n onActiveChange={(v) => handleSwitchTab(v)}\n items={sessionList}\n menu={menu}\n style={{\n width: 256,\n borderRadius: '6px',\n ...style,\n }}\n />\n </InfiniteScroll>\n </div>\n </div>\n\n {/* 遮罩层 - 仅在窄屏且列表可见时显示 */}\n {isNarrow && listVisible && (\n <div className={styles.mask} onClick={handleCloseList} />\n )}\n </div>\n );\n};\n\nexport default XAiConversations;\n"],
5
+ "mappings": "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",
6
6
  "names": ["logo", "clsx", "flashOpen", "AddChatIcon", "InfiniteScroll"]
7
7
  }
@@ -119,6 +119,9 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
119
119
  height: 100%;
120
120
  box-sizing: border-box;
121
121
  position: relative;
122
+ display: flex;
123
+ flex-direction: column;
124
+ overflow: hidden;
122
125
  flex-shrink: 0;
123
126
  border-right: 1px solid #f0f0f0;
124
127
  `,
@@ -128,10 +131,14 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
128
131
  left: 0;
129
132
  width: 280px;
130
133
  height: 100%;
134
+ box-sizing: border-box;
131
135
  z-index: 1000;
132
136
  transition: left 0.3s ease;
133
137
  background: #F8FBFF;
134
138
  padding: 16px 0 13px;
139
+ display: flex;
140
+ flex-direction: column;
141
+ overflow: hidden;
135
142
  box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
136
143
  `,
137
144
  mask: import_css.css`
@@ -151,8 +158,11 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
151
158
  padding: 0 11px 0 16px;
152
159
  `,
153
160
  scrollList: import_css.css`
154
- max-height: calc(100vh - 120px); /* 120px为头部高度,可根据实际调整 */
161
+ /* 使用侧栏的真实剩余高度,兼容全屏、弹窗及任意高度的嵌入容器。 */
162
+ flex: 1;
163
+ min-height: 0;
155
164
  padding-bottom: 15px;
165
+ box-sizing: border-box;
156
166
  overflow-y: auto;
157
167
 
158
168
  /* 隐藏滚动条(Chrome, Edge, Safari) */
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiConversations/styles.tsx"],
4
- "sourcesContent": ["import React from 'react';\nimport { css, keyframes } from '@emotion/css';\nimport { css as globalCss, Global } from '@emotion/react';\nimport { withBasicStyles } from '@/styles/common';\n\nconst primaryBlue = '#0078FF'; // 主蓝色\nconst lightBlue = '#E6F0FF'; // 浅蓝色气泡背景\nconst darkGray = '#333'; // 深灰色文本\nconst lightGray = '#888'; // 浅灰文本\nconst borderGray = '#ddd'; // 边框灰色\n\nconst slideInRight = keyframes`\n from { transform: translateX(-100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideOutRight = keyframes`\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(-100%); opacity: 0; }\n`;\n\nexport const useStyles = withBasicStyles(() => ({\n // 静态样式\n conversationsWrapper: css`\n overflow: hidden;\n display: flex;\n flex-direction: column;\n height: 100%;\n `,\n\n capWrapper: css`\n padding: 12px 16px;\n display: flex;\n align-items: center;\n `,\n\n capShape: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 80px;\n height: 40px;\n margin-left: 16px;\n background: #FFFFFF;\n box-shadow: 0px 4px 16px 0px rgba(127,135,166,0.08);\n border-radius: 24px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n transition: box-shadow 0.2s, border-color 0.2s;\n cursor: pointer;\n /* &:hover {\n box-shadow: 0px 4px 24px 0px rgba(127,135,166,0.16);\n border-color: ${primaryBlue};\n } */\n `,\n\n capIcon: css`\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n\n img {\n width: 17px;\n }\n\n &:hover {\n background: #F2F2F2;\n border-radius: 50%;\n }\n `,\n\n addChatBtn: css`\n width: 256px;\n height: 40px;\n margin: 17px auto 24px;\n background: #FFFFFF;\n border-radius: 20px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #343434;\n\n &:hover {\n color: #3961F2;\n }\n\n &:active {\n color: #0A3BEE;\n }\n `,\n\n tipTitle: css`\n font-size: 12px;\n color: #949494;\n padding-left: 24px;\n `,\n\n fWrapper: css`\n background: #F8FBFF;\n padding: 16px 0 13px;\n width: 280px;\n height: 100%;\n box-sizing: border-box;\n position: relative;\n flex-shrink: 0;\n border-right: 1px solid #f0f0f0;\n `,\n\n nWrapper: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 280px;\n height: 100%;\n z-index: 1000;\n transition: left 0.3s ease;\n background: #F8FBFF;\n padding: 16px 0 13px;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n `,\n\n mask: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.15);\n z-index: 999;\n cursor: pointer;\n `,\n\n fheaderWrapper: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 11px 0 16px;\n `,\n\n scrollList: css`\n max-height: calc(100vh - 120px); /* 120px为头部高度,可根据实际调整 */\n padding-bottom: 15px;\n overflow-y: auto;\n\n /* 隐藏滚动条(Chrome, Edge, Safari) */\n &::-webkit-scrollbar {\n width: 0;\n height: 0;\n display: none;\n background: transparent;\n }\n\n /* 隐藏滚动条(Firefox) */\n scrollbar-width: none;\n\n /* 隐藏滚动条(IE/Edge) */\n -ms-overflow-style: none;\n `,\n\n slideIn: css`\n animation: ${slideInRight} 0.3s forwards;\n `,\n slideOut: css`\n animation: ${slideOutRight} 0.3s forwards;\n `,\n\n}));\n\nexport const GlobalStyle: React.FC = () => (\n <Global\n styles={globalCss`\n .ant-conversations .ant-conversations-item-active {\n background: rgba(57,97,242,0.08);\n }\n\n .ant-conversations .ant-conversations-item-active .ant-conversations-label {\n color: #3961F2;\n }\n `}\n />\n);\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA+B;AAC/B,mBAAyC;AACzC,oBAAgC;AA4K9B;AA1KF,IAAM,cAAc;AAMpB,IAAM,eAAe;AAAA;AAAA;AAAA;AAKrB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAKf,IAAM,gBAAY,+BAAgB,OAAO;AAAA;AAAA,EAE9C,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOtB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAgBU;AAAA;AAAA;AAAA,EAIpB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBT,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaV,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWN,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBZ,SAAS;AAAA,iBACM;AAAA;AAAA,EAEf,UAAU;AAAA,iBACK;AAAA;AAGjB,EAAE;AAEK,IAAM,cAAwB,MACnC;AAAA,EAAC;AAAA;AAAA,IACC,QAAQ,aAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV;",
4
+ "sourcesContent": ["import React from 'react';\nimport { css, keyframes } from '@emotion/css';\nimport { css as globalCss, Global } from '@emotion/react';\nimport { withBasicStyles } from '@/styles/common';\n\nconst primaryBlue = '#0078FF'; // 主蓝色\nconst lightBlue = '#E6F0FF'; // 浅蓝色气泡背景\nconst darkGray = '#333'; // 深灰色文本\nconst lightGray = '#888'; // 浅灰文本\nconst borderGray = '#ddd'; // 边框灰色\n\nconst slideInRight = keyframes`\n from { transform: translateX(-100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideOutRight = keyframes`\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(-100%); opacity: 0; }\n`;\n\nexport const useStyles = withBasicStyles(() => ({\n // 静态样式\n conversationsWrapper: css`\n overflow: hidden;\n display: flex;\n flex-direction: column;\n height: 100%;\n `,\n\n capWrapper: css`\n padding: 12px 16px;\n display: flex;\n align-items: center;\n `,\n\n capShape: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 80px;\n height: 40px;\n margin-left: 16px;\n background: #FFFFFF;\n box-shadow: 0px 4px 16px 0px rgba(127,135,166,0.08);\n border-radius: 24px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n transition: box-shadow 0.2s, border-color 0.2s;\n cursor: pointer;\n /* &:hover {\n box-shadow: 0px 4px 24px 0px rgba(127,135,166,0.16);\n border-color: ${primaryBlue};\n } */\n `,\n\n capIcon: css`\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n\n img {\n width: 17px;\n }\n\n &:hover {\n background: #F2F2F2;\n border-radius: 50%;\n }\n `,\n\n addChatBtn: css`\n width: 256px;\n height: 40px;\n margin: 17px auto 24px;\n background: #FFFFFF;\n border-radius: 20px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #343434;\n\n &:hover {\n color: #3961F2;\n }\n\n &:active {\n color: #0A3BEE;\n }\n `,\n\n tipTitle: css`\n font-size: 12px;\n color: #949494;\n padding-left: 24px;\n `,\n\n fWrapper: css`\n background: #F8FBFF;\n padding: 16px 0 13px;\n width: 280px;\n height: 100%;\n box-sizing: border-box;\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n flex-shrink: 0;\n border-right: 1px solid #f0f0f0;\n `,\n\n nWrapper: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 280px;\n height: 100%;\n box-sizing: border-box;\n z-index: 1000;\n transition: left 0.3s ease;\n background: #F8FBFF;\n padding: 16px 0 13px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n `,\n\n mask: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.15);\n z-index: 999;\n cursor: pointer;\n `,\n\n fheaderWrapper: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 11px 0 16px;\n `,\n\n scrollList: css`\n /* 使用侧栏的真实剩余高度,兼容全屏、弹窗及任意高度的嵌入容器。 */\n flex: 1;\n min-height: 0;\n padding-bottom: 15px;\n box-sizing: border-box;\n overflow-y: auto;\n\n /* 隐藏滚动条(Chrome, Edge, Safari) */\n &::-webkit-scrollbar {\n width: 0;\n height: 0;\n display: none;\n background: transparent;\n }\n\n /* 隐藏滚动条(Firefox) */\n scrollbar-width: none;\n\n /* 隐藏滚动条(IE/Edge) */\n -ms-overflow-style: none;\n `,\n\n slideIn: css`\n animation: ${slideInRight} 0.3s forwards;\n `,\n slideOut: css`\n animation: ${slideOutRight} 0.3s forwards;\n `,\n\n}));\n\nexport const GlobalStyle: React.FC = () => (\n <Global\n styles={globalCss`\n .ant-conversations .ant-conversations-item-active {\n background: rgba(57,97,242,0.08);\n }\n\n .ant-conversations .ant-conversations-item-active .ant-conversations-label {\n color: #3961F2;\n }\n `}\n />\n);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA+B;AAC/B,mBAAyC;AACzC,oBAAgC;AAsL9B;AApLF,IAAM,cAAc;AAMpB,IAAM,eAAe;AAAA;AAAA;AAAA;AAKrB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAKf,IAAM,gBAAY,+BAAgB,OAAO;AAAA;AAAA,EAE9C,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOtB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAgBU;AAAA;AAAA;AAAA,EAIpB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBT,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBV,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWN,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBZ,SAAS;AAAA,iBACM;AAAA;AAAA,EAEf,UAAU;AAAA,iBACK;AAAA;AAGjB,EAAE;AAEK,IAAM,cAAwB,MACnC;AAAA,EAAC;AAAA;AAAA,IACC,QAAQ,aAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV;",
6
6
  "names": ["globalCss"]
7
7
  }
@@ -14,13 +14,13 @@ import XAdkChatbot from "./components/XAdkChatbot";
14
14
  import XAdkSender from "./components/XAdkSender";
15
15
  import useADKChat from "./hooks/useADKChat";
16
16
  import { baseChatStrategies, basePreset, baseToolKindResolver, BUILTIN_CHAT_PRESETS, composeChatPresets, DEFAULT_CHAT_PRESET_NAME, defineChatPreset, mergeChatStrategies, resolvePresetUploadRequest, resolveChatPreset, resolvePresetMarkdownExtensions } from "./presets";
17
- import { extractXGroupKnowledgeReferences, parseXGroupKnowledgeReference, xGroupKnowledgeReferenceMarkdownExtension, xGroupMarkdownExtensions, createXGroupUploadRequest, xGroupAdkPreset, xGroupToolKindResolver } from "./presets/xgroup";
17
+ import { extractXGroupKnowledgeReferences, parseXGroupKnowledgeReference, xGroupKnowledgeReferenceMarkdownExtension, xGroupMarkdownExtensions, parseXGroupWebReference, xGroupWebReferenceMarkdownExtension, createXGroupUploadRequest, xGroupAdkPreset, xGroupToolKindResolver } from "./presets/xgroup";
18
18
  export { useChatState, useChatActions, useSession, } from "./components/XAdkProvider/context";
19
19
  export * from "./types";
20
20
  export type { ChatHookResult, ChatHookFactory } from "./types/ChatHook";
21
21
  export { useXAi, XAiProvider, XAiChatbot, XAiSDK, XAiSender, XAiConversations, useXAiSDK, request, };
22
- export { XAdkProvider, XAdkChatbot, XAdkSender, FileGallery, XAdkThoughtChain, useADKChat, formatMarkdownResourceLinksAsText, getMarkdownResourceDisplayLabel, parseMarkdownResourceLinksAsParts, parseMarkdownResourceHref, replaceMarkdownResourceLinks, baseChatStrategies, basePreset, baseToolKindResolver, BUILTIN_CHAT_PRESETS, composeChatPresets, DEFAULT_CHAT_PRESET_NAME, defineChatPreset, createXGroupUploadRequest, mergeChatStrategies, resolvePresetUploadRequest, resolveChatPreset, resolvePresetMarkdownExtensions, extractXGroupKnowledgeReferences, parseXGroupKnowledgeReference, xGroupKnowledgeReferenceMarkdownExtension, xGroupMarkdownExtensions, xGroupAdkPreset, xGroupToolKindResolver, };
23
- export type { XGroupKnowledgeReference } from "./presets/xgroup";
22
+ export { XAdkProvider, XAdkChatbot, XAdkSender, FileGallery, XAdkThoughtChain, useADKChat, formatMarkdownResourceLinksAsText, getMarkdownResourceDisplayLabel, parseMarkdownResourceLinksAsParts, parseMarkdownResourceHref, replaceMarkdownResourceLinks, baseChatStrategies, basePreset, baseToolKindResolver, BUILTIN_CHAT_PRESETS, composeChatPresets, DEFAULT_CHAT_PRESET_NAME, defineChatPreset, createXGroupUploadRequest, mergeChatStrategies, resolvePresetUploadRequest, resolveChatPreset, resolvePresetMarkdownExtensions, extractXGroupKnowledgeReferences, parseXGroupKnowledgeReference, xGroupKnowledgeReferenceMarkdownExtension, xGroupMarkdownExtensions, parseXGroupWebReference, xGroupWebReferenceMarkdownExtension, xGroupAdkPreset, xGroupToolKindResolver, };
23
+ export type { XGroupKnowledgeReference, XGroupWebReference, } from "./presets/xgroup";
24
24
  import Sources from "./components/Sources";
25
25
  export { Sources };
26
26
  export type { SourcesProps, SourcesItem, SourcesRef } from "./types/Sources";
package/dist/cjs/index.js CHANGED
@@ -62,6 +62,7 @@ __export(src_exports, {
62
62
  parseMarkdownResourceHref: () => import_markdownResource.parseMarkdownResourceHref,
63
63
  parseMarkdownResourceLinksAsParts: () => import_markdownResource.parseMarkdownResourceLinksAsParts,
64
64
  parseXGroupKnowledgeReference: () => import_xgroup.parseXGroupKnowledgeReference,
65
+ parseXGroupWebReference: () => import_xgroup.parseXGroupWebReference,
65
66
  replaceMarkdownResourceLinks: () => import_markdownResource.replaceMarkdownResourceLinks,
66
67
  request: () => import_request.default,
67
68
  resolveChatPreset: () => import_presets.resolveChatPreset,
@@ -80,7 +81,8 @@ __export(src_exports, {
80
81
  xGroupAdkPreset: () => import_xgroup.xGroupAdkPreset,
81
82
  xGroupKnowledgeReferenceMarkdownExtension: () => import_xgroup.xGroupKnowledgeReferenceMarkdownExtension,
82
83
  xGroupMarkdownExtensions: () => import_xgroup.xGroupMarkdownExtensions,
83
- xGroupToolKindResolver: () => import_xgroup.xGroupToolKindResolver
84
+ xGroupToolKindResolver: () => import_xgroup.xGroupToolKindResolver,
85
+ xGroupWebReferenceMarkdownExtension: () => import_xgroup.xGroupWebReferenceMarkdownExtension
84
86
  });
85
87
  module.exports = __toCommonJS(src_exports);
86
88
  var import_AiProviderContext = require("./context/AiProviderContext");
@@ -145,6 +147,7 @@ var import_xgroup2 = require("./presets/xgroup");
145
147
  parseMarkdownResourceHref,
146
148
  parseMarkdownResourceLinksAsParts,
147
149
  parseXGroupKnowledgeReference,
150
+ parseXGroupWebReference,
148
151
  replaceMarkdownResourceLinks,
149
152
  request,
150
153
  resolveChatPreset,
@@ -164,6 +167,7 @@ var import_xgroup2 = require("./presets/xgroup");
164
167
  xGroupKnowledgeReferenceMarkdownExtension,
165
168
  xGroupMarkdownExtensions,
166
169
  xGroupToolKindResolver,
170
+ xGroupWebReferenceMarkdownExtension,
167
171
  ...require("./types"),
168
172
  ...require("./core")
169
173
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["// index.ts\nimport { useXAi } from \"./context/AiProviderContext\";\nimport XAiProvider from \"./components/XAiProvider\";\nimport XAiChatbot from \"./components/XAiChatbot\";\nimport XAiSDK from \"./components/XAiSDK\";\nimport XAiSender from \"./components/XAiSender\";\nimport FileGallery from \"./components/FileGallery\";\nimport XAiConversations from \"./components/XAiConversations\";\nimport XAdkThoughtChain from \"./components/XAdkThoughtChain\";\nimport useXAiSDK from \"./hooks/useXAiSDK\";\nimport request from \"./utils/request\";\nimport {\n formatMarkdownResourceLinksAsText,\n getMarkdownResourceDisplayLabel,\n parseMarkdownResourceLinksAsParts,\n parseMarkdownResourceHref,\n replaceMarkdownResourceLinks,\n} from \"./utils/markdownResource\";\n\n// 新的 Compound Components 架构\nimport XAdkProvider from \"./components/XAdkProvider\";\nimport XAdkChatbot from \"./components/XAdkChatbot\";\nimport XAdkSender from \"./components/XAdkSender\";\nimport useADKChat from \"./hooks/useADKChat\";\nimport {\n baseChatStrategies,\n basePreset,\n baseToolKindResolver,\n BUILTIN_CHAT_PRESETS,\n composeChatPresets,\n DEFAULT_CHAT_PRESET_NAME,\n defineChatPreset,\n mergeChatStrategies,\n resolvePresetUploadRequest,\n resolveChatPreset,\n resolvePresetMarkdownExtensions,\n} from \"./presets\";\nimport {\n extractXGroupKnowledgeReferences,\n parseXGroupKnowledgeReference,\n xGroupKnowledgeReferenceMarkdownExtension,\n xGroupMarkdownExtensions,\n createXGroupUploadRequest,\n xGroupAdkPreset,\n xGroupToolKindResolver,\n} from \"./presets/xgroup\";\n\n// 导出新的 Context Hooks\nexport {\n useChatState,\n useChatActions,\n useSession,\n} from \"./components/XAdkProvider/context\";\n\nexport * from \"./types\";\n\n// 导出自定义 Hook 相关类型\nexport type { ChatHookResult, ChatHookFactory } from \"./types/ChatHook\";\n\n// 旧 API - 保持向后兼容\nexport {\n useXAi,\n XAiProvider,\n XAiChatbot,\n XAiSDK,\n XAiSender,\n XAiConversations,\n useXAiSDK,\n request,\n};\n\n// 新 API - 推荐使用\nexport {\n XAdkProvider,\n XAdkChatbot,\n XAdkSender,\n FileGallery,\n XAdkThoughtChain,\n useADKChat,\n formatMarkdownResourceLinksAsText,\n getMarkdownResourceDisplayLabel,\n parseMarkdownResourceLinksAsParts,\n parseMarkdownResourceHref,\n replaceMarkdownResourceLinks,\n baseChatStrategies,\n basePreset,\n baseToolKindResolver,\n BUILTIN_CHAT_PRESETS,\n composeChatPresets,\n DEFAULT_CHAT_PRESET_NAME,\n defineChatPreset,\n createXGroupUploadRequest,\n mergeChatStrategies,\n resolvePresetUploadRequest,\n resolveChatPreset,\n resolvePresetMarkdownExtensions,\n extractXGroupKnowledgeReferences,\n parseXGroupKnowledgeReference,\n xGroupKnowledgeReferenceMarkdownExtension,\n xGroupMarkdownExtensions,\n xGroupAdkPreset,\n xGroupToolKindResolver,\n};\nexport type { XGroupKnowledgeReference } from \"./presets/xgroup\";\n\n// Sources 来源引用组件\nimport Sources from \"./components/Sources\";\nexport { Sources };\nexport type { SourcesProps, SourcesItem, SourcesRef } from \"./types/Sources\";\n\n// FolderTree 文件树组件\nimport FolderTree from \"./components/FolderTree\";\nexport { FolderTree };\nexport type {\n FolderTreeProps,\n FolderTreeData,\n FileContentService,\n FolderTreeRef,\n} from \"./components/FolderTree\";\n\n// 基础组件导出 - 供高级用户和业务侧使用\nexport { default as MarkdownRender } from \"./components/XAdkChatbot/components/MarkdownRender\";\nexport { default as FunctionCallRender } from \"./components/XAdkChatbot/components/FunctionCallRender\";\nexport { default as ThinkRender } from \"./components/XAdkChatbot/components/ThinkRender\";\n\n// 基础组件类型导出\nexport type { MarkdownRenderProps } from \"./components/XAdkChatbot/components/MarkdownRender\";\nexport type { FunctionCallRenderProps } from \"./types/FunctionCallRender\";\nexport type {\n XAdkThoughtChainProps,\n ThoughtChainItemType,\n ThoughtChainStatus,\n} from \"./types/XAdkThoughtChain\";\n\n// 设计令牌导出 - 供引用方覆盖样式\nexport { tokens, tokenDefaults, token, cssVarStyle } from \"./styles/tokens\";\n\n// Headless ADK data-flow APIs\nexport * from \"./core\";\nexport { default as useAdkConversation } from \"./react/useAdkConversation\";\nexport type { UseAdkConversationResult } from \"./react/useAdkConversation\";\nexport { createXGroupOpenApiTransport } from \"./presets/xgroup\";\nexport type { XGroupOpenApiTransportOptions } from \"./presets/xgroup\";\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAAA;AAAA,EAAA,oCAAAC;AAAA,EAAA;AAAA;AAAA,gCAAAC;AAAA,EAAA;AAAA,wCAAAC;AAAA,EAAA,wCAAAC;AAAA,EAAA,oCAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA,oCAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA,sCAAAC;AAAA,EAAA,4BAAAC;AAAA,EAAA,kCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,+BAAuB;AACvB,yBAAwB;AACxB,wBAAuB;AACvB,oBAAmB;AACnB,uBAAsB;AACtB,yBAAwB;AACxB,8BAA6B;AAC7B,8BAA6B;AAC7B,uBAAsB;AACtB,qBAAoB;AACpB,8BAMO;AAGP,0BAAyB;AACzB,yBAAwB;AACxB,wBAAuB;AACvB,wBAAuB;AACvB,qBAYO;AACP,oBAQO;AAGP,qBAIO;AAEP,wBAAc,oBAtDd;AA0GA,qBAAoB;AAKpB,wBAAuB;AAUvB,4BAA0C;AAC1C,gCAA8C;AAC9C,yBAAuC;AAYvC,oBAA0D;AAG1D,wBAAc,mBA1Id;AA2IA,gCAA8C;AAE9C,IAAAC,iBAA6C;",
4
+ "sourcesContent": ["// index.ts\nimport { useXAi } from \"./context/AiProviderContext\";\nimport XAiProvider from \"./components/XAiProvider\";\nimport XAiChatbot from \"./components/XAiChatbot\";\nimport XAiSDK from \"./components/XAiSDK\";\nimport XAiSender from \"./components/XAiSender\";\nimport FileGallery from \"./components/FileGallery\";\nimport XAiConversations from \"./components/XAiConversations\";\nimport XAdkThoughtChain from \"./components/XAdkThoughtChain\";\nimport useXAiSDK from \"./hooks/useXAiSDK\";\nimport request from \"./utils/request\";\nimport {\n formatMarkdownResourceLinksAsText,\n getMarkdownResourceDisplayLabel,\n parseMarkdownResourceLinksAsParts,\n parseMarkdownResourceHref,\n replaceMarkdownResourceLinks,\n} from \"./utils/markdownResource\";\n\n// 新的 Compound Components 架构\nimport XAdkProvider from \"./components/XAdkProvider\";\nimport XAdkChatbot from \"./components/XAdkChatbot\";\nimport XAdkSender from \"./components/XAdkSender\";\nimport useADKChat from \"./hooks/useADKChat\";\nimport {\n baseChatStrategies,\n basePreset,\n baseToolKindResolver,\n BUILTIN_CHAT_PRESETS,\n composeChatPresets,\n DEFAULT_CHAT_PRESET_NAME,\n defineChatPreset,\n mergeChatStrategies,\n resolvePresetUploadRequest,\n resolveChatPreset,\n resolvePresetMarkdownExtensions,\n} from \"./presets\";\nimport {\n extractXGroupKnowledgeReferences,\n parseXGroupKnowledgeReference,\n xGroupKnowledgeReferenceMarkdownExtension,\n xGroupMarkdownExtensions,\n parseXGroupWebReference,\n xGroupWebReferenceMarkdownExtension,\n createXGroupUploadRequest,\n xGroupAdkPreset,\n xGroupToolKindResolver,\n} from \"./presets/xgroup\";\n\n// 导出新的 Context Hooks\nexport {\n useChatState,\n useChatActions,\n useSession,\n} from \"./components/XAdkProvider/context\";\n\nexport * from \"./types\";\n\n// 导出自定义 Hook 相关类型\nexport type { ChatHookResult, ChatHookFactory } from \"./types/ChatHook\";\n\n// 旧 API - 保持向后兼容\nexport {\n useXAi,\n XAiProvider,\n XAiChatbot,\n XAiSDK,\n XAiSender,\n XAiConversations,\n useXAiSDK,\n request,\n};\n\n// 新 API - 推荐使用\nexport {\n XAdkProvider,\n XAdkChatbot,\n XAdkSender,\n FileGallery,\n XAdkThoughtChain,\n useADKChat,\n formatMarkdownResourceLinksAsText,\n getMarkdownResourceDisplayLabel,\n parseMarkdownResourceLinksAsParts,\n parseMarkdownResourceHref,\n replaceMarkdownResourceLinks,\n baseChatStrategies,\n basePreset,\n baseToolKindResolver,\n BUILTIN_CHAT_PRESETS,\n composeChatPresets,\n DEFAULT_CHAT_PRESET_NAME,\n defineChatPreset,\n createXGroupUploadRequest,\n mergeChatStrategies,\n resolvePresetUploadRequest,\n resolveChatPreset,\n resolvePresetMarkdownExtensions,\n extractXGroupKnowledgeReferences,\n parseXGroupKnowledgeReference,\n xGroupKnowledgeReferenceMarkdownExtension,\n xGroupMarkdownExtensions,\n parseXGroupWebReference,\n xGroupWebReferenceMarkdownExtension,\n xGroupAdkPreset,\n xGroupToolKindResolver,\n};\nexport type {\n XGroupKnowledgeReference,\n XGroupWebReference,\n} from \"./presets/xgroup\";\n\n// Sources 来源引用组件\nimport Sources from \"./components/Sources\";\nexport { Sources };\nexport type { SourcesProps, SourcesItem, SourcesRef } from \"./types/Sources\";\n\n// FolderTree 文件树组件\nimport FolderTree from \"./components/FolderTree\";\nexport { FolderTree };\nexport type {\n FolderTreeProps,\n FolderTreeData,\n FileContentService,\n FolderTreeRef,\n} from \"./components/FolderTree\";\n\n// 基础组件导出 - 供高级用户和业务侧使用\nexport { default as MarkdownRender } from \"./components/XAdkChatbot/components/MarkdownRender\";\nexport { default as FunctionCallRender } from \"./components/XAdkChatbot/components/FunctionCallRender\";\nexport { default as ThinkRender } from \"./components/XAdkChatbot/components/ThinkRender\";\n\n// 基础组件类型导出\nexport type { MarkdownRenderProps } from \"./components/XAdkChatbot/components/MarkdownRender\";\nexport type { FunctionCallRenderProps } from \"./types/FunctionCallRender\";\nexport type {\n XAdkThoughtChainProps,\n ThoughtChainItemType,\n ThoughtChainStatus,\n} from \"./types/XAdkThoughtChain\";\n\n// 设计令牌导出 - 供引用方覆盖样式\nexport { tokens, tokenDefaults, token, cssVarStyle } from \"./styles/tokens\";\n\n// Headless ADK data-flow APIs\nexport * from \"./core\";\nexport { default as useAdkConversation } from \"./react/useAdkConversation\";\nexport type { UseAdkConversationResult } from \"./react/useAdkConversation\";\nexport { createXGroupOpenApiTransport } from \"./presets/xgroup\";\nexport type { XGroupOpenApiTransportOptions } from \"./presets/xgroup\";\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAAA;AAAA,EAAA,oCAAAC;AAAA,EAAA;AAAA;AAAA,gCAAAC;AAAA,EAAA;AAAA,wCAAAC;AAAA,EAAA,wCAAAC;AAAA,EAAA,oCAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA,oCAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA,sCAAAC;AAAA,EAAA,4BAAAC;AAAA,EAAA,kCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,+BAAuB;AACvB,yBAAwB;AACxB,wBAAuB;AACvB,oBAAmB;AACnB,uBAAsB;AACtB,yBAAwB;AACxB,8BAA6B;AAC7B,8BAA6B;AAC7B,uBAAsB;AACtB,qBAAoB;AACpB,8BAMO;AAGP,0BAAyB;AACzB,yBAAwB;AACxB,wBAAuB;AACvB,wBAAuB;AACvB,qBAYO;AACP,oBAUO;AAGP,qBAIO;AAEP,wBAAc,oBAxDd;AAiHA,qBAAoB;AAKpB,wBAAuB;AAUvB,4BAA0C;AAC1C,gCAA8C;AAC9C,yBAAuC;AAYvC,oBAA0D;AAG1D,wBAAc,mBAjJd;AAkJA,gCAA8C;AAE9C,IAAAC,iBAA6C;",
6
6
  "names": ["FileGallery", "FolderTree", "Sources", "XAdkChatbot", "XAdkProvider", "XAdkSender", "XAdkThoughtChain", "XAiChatbot", "XAiConversations", "XAiProvider", "XAiSDK", "XAiSender", "request", "useADKChat", "useXAiSDK", "import_xgroup"]
7
7
  }