@ai-group/chat-sdk 3.7.1-alpha3 → 3.7.1-alpha4

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 (68) hide show
  1. package/dist/cjs/components/FileGallery/styles.js +21 -1
  2. package/dist/cjs/components/FileGallery/styles.js.map +2 -2
  3. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +7 -1
  4. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +82 -22
  5. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
  6. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
  7. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +39 -0
  8. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
  9. package/dist/cjs/components/XAdkChatbot/index.js +35 -5
  10. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  11. package/dist/cjs/components/XAdkChatbot/styles.js +1 -1
  12. package/dist/cjs/components/XAdkChatbot/styles.js.map +1 -1
  13. package/dist/cjs/components/XAdkSender/InlineTagInput.d.ts +11 -5
  14. package/dist/cjs/components/XAdkSender/InlineTagInput.js +119 -77
  15. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
  16. package/dist/cjs/components/XAdkSender/InputTags.d.ts +2 -2
  17. package/dist/cjs/components/XAdkSender/InputTags.js +8 -8
  18. package/dist/cjs/components/XAdkSender/InputTags.js.map +2 -2
  19. package/dist/cjs/components/XAdkSender/index.js +73 -45
  20. package/dist/cjs/components/XAdkSender/index.js.map +2 -2
  21. package/dist/cjs/index.d.ts +2 -1
  22. package/dist/cjs/index.js +7 -0
  23. package/dist/cjs/index.js.map +2 -2
  24. package/dist/cjs/types/XAdkChatbot.d.ts +15 -0
  25. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  26. package/dist/cjs/types/XAdkSender.d.ts +62 -24
  27. package/dist/cjs/types/XAdkSender.js.map +1 -1
  28. package/dist/cjs/utils/index.d.ts +1 -0
  29. package/dist/cjs/utils/index.js +3 -1
  30. package/dist/cjs/utils/index.js.map +2 -2
  31. package/dist/cjs/utils/markdownResource.d.ts +7 -0
  32. package/dist/cjs/utils/markdownResource.js +73 -0
  33. package/dist/cjs/utils/markdownResource.js.map +7 -0
  34. package/dist/esm/components/FileGallery/styles.js +2 -2
  35. package/dist/esm/components/FileGallery/styles.js.map +1 -1
  36. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +7 -1
  37. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +57 -7
  38. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
  39. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
  40. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +5 -2
  41. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
  42. package/dist/esm/components/XAdkChatbot/index.js +20 -6
  43. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  44. package/dist/esm/components/XAdkChatbot/styles.js +1 -1
  45. package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
  46. package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +11 -5
  47. package/dist/esm/components/XAdkSender/InlineTagInput.js +125 -97
  48. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
  49. package/dist/esm/components/XAdkSender/InputTags.d.ts +2 -2
  50. package/dist/esm/components/XAdkSender/InputTags.js +9 -9
  51. package/dist/esm/components/XAdkSender/InputTags.js.map +1 -1
  52. package/dist/esm/components/XAdkSender/index.js +97 -71
  53. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  54. package/dist/esm/index.d.ts +2 -1
  55. package/dist/esm/index.js +2 -1
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/esm/types/XAdkChatbot.d.ts +15 -0
  58. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  59. package/dist/esm/types/XAdkSender.d.ts +62 -24
  60. package/dist/esm/types/XAdkSender.js.map +1 -1
  61. package/dist/esm/utils/index.d.ts +1 -0
  62. package/dist/esm/utils/index.js +1 -0
  63. package/dist/esm/utils/index.js.map +1 -1
  64. package/dist/esm/utils/markdownResource.d.ts +7 -0
  65. package/dist/esm/utils/markdownResource.js +33 -0
  66. package/dist/esm/utils/markdownResource.js.map +1 -0
  67. package/dist/umd/chat-sdk.min.js +1 -1
  68. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAdkSender/InputTags.tsx"],
4
- "sourcesContent": ["import React from \"react\";\nimport { Tag } from \"antd\";\nimport { CloseOutlined } from \"@ant-design/icons\";\nimport type { InputTag as InputTagType } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\nexport interface InputTagsProps {\n tags: InputTagType[];\n onRemove: (id: string) => void;\n}\n\nconst InputTags: React.FC<InputTagsProps> = ({ tags, onRemove }) => {\n const styles = useStyles();\n\n if (!tags.length) return null;\n\n // 非 inlineTags 模式下,标签以独立区域展示;inlineTags 模式由 InlineTagInput 接管混排和删除。\n return (\n <div className={styles.inputTags}>\n {tags.map((tag) => (\n <Tag\n key={tag.id}\n className={styles.inputTag}\n closable\n onClose={(e) => {\n e.preventDefault();\n onRemove(tag.id);\n }}\n closeIcon={<CloseOutlined style={{ fontSize: 10 }} />}\n color={tag.color}\n icon={tag.icon}\n >\n {tag.label}\n </Tag>\n ))}\n </div>\n );\n};\n\nexport default InputTags;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAAoB;AACpB,mBAA8B;AAE9B,oBAA0B;AAwBL;AAjBrB,IAAM,YAAsC,CAAC,EAAE,MAAM,SAAS,MAAM;AAClE,QAAM,aAAS,yBAAU;AAEzB,MAAI,CAAC,KAAK;AAAQ,WAAO;AAGzB,SACE,4CAAC,SAAI,WAAW,OAAO,WACpB,eAAK,IAAI,CAAC,QACT;AAAA,IAAC;AAAA;AAAA,MAEC,WAAW,OAAO;AAAA,MAClB,UAAQ;AAAA,MACR,SAAS,CAAC,MAAM;AACd,UAAE,eAAe;AACjB,iBAAS,IAAI,EAAE;AAAA,MACjB;AAAA,MACA,WAAW,4CAAC,8BAAc,OAAO,EAAE,UAAU,GAAG,GAAG;AAAA,MACnD,OAAO,IAAI;AAAA,MACX,MAAM,IAAI;AAAA,MAET,cAAI;AAAA;AAAA,IAXA,IAAI;AAAA,EAYX,CACD,GACH;AAEJ;AAEA,IAAO,oBAAQ;",
4
+ "sourcesContent": ["import React from \"react\";\nimport { Tag } from \"antd\";\nimport { CloseOutlined } from \"@ant-design/icons\";\nimport type { MentionTag } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\nexport interface InputTagsProps {\n mentions: MentionTag[];\n onRemove: (id: string) => void;\n}\n\nconst InputTags: React.FC<InputTagsProps> = ({ mentions, onRemove }) => {\n const styles = useStyles();\n\n if (!mentions.length) return null;\n\n // 非 inlineTags 模式下,Mention 以独立区域展示;inlineTags 模式由 InlineTagInput 接管混排和删除。\n return (\n <div className={styles.inputTags}>\n {mentions.map((mention) => (\n <Tag\n key={mention.id}\n className={styles.inputTag}\n closable\n onClose={(e) => {\n e.preventDefault();\n onRemove(mention.id);\n }}\n closeIcon={<CloseOutlined style={{ fontSize: 10 }} />}\n color={mention.color}\n icon={mention.icon}\n >\n {mention.displayName || mention.label}\n </Tag>\n ))}\n </div>\n );\n};\n\nexport default InputTags;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAAoB;AACpB,mBAA8B;AAE9B,oBAA0B;AAwBL;AAjBrB,IAAM,YAAsC,CAAC,EAAE,UAAU,SAAS,MAAM;AACtE,QAAM,aAAS,yBAAU;AAEzB,MAAI,CAAC,SAAS;AAAQ,WAAO;AAG7B,SACE,4CAAC,SAAI,WAAW,OAAO,WACpB,mBAAS,IAAI,CAAC,YACb;AAAA,IAAC;AAAA;AAAA,MAEC,WAAW,OAAO;AAAA,MAClB,UAAQ;AAAA,MACR,SAAS,CAAC,MAAM;AACd,UAAE,eAAe;AACjB,iBAAS,QAAQ,EAAE;AAAA,MACrB;AAAA,MACA,WAAW,4CAAC,8BAAc,OAAO,EAAE,UAAU,GAAG,GAAG;AAAA,MACnD,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ;AAAA,MAEb,kBAAQ,eAAe,QAAQ;AAAA;AAAA,IAX3B,QAAQ;AAAA,EAYf,CACD,GACH;AAEJ;AAEA,IAAO,oBAAQ;",
6
6
  "names": []
7
7
  }
@@ -73,12 +73,18 @@ var XAdkSender = (0, import_react.forwardRef)(
73
73
  footerLeft,
74
74
  quickKeys = [],
75
75
  inlineTags = false,
76
+ renderMention,
76
77
  renderTag,
78
+ mentions: controlledMentions,
77
79
  tags: controlledTags,
80
+ defaultMentions,
78
81
  defaultTags = [],
82
+ defaultInputParts,
83
+ onMentionsChange,
79
84
  onTagsChange,
80
85
  onQuickKeyTrigger,
81
86
  submitFormat = "text",
87
+ formatMention,
82
88
  formatTag,
83
89
  transformSubmitData
84
90
  }, ref) => {
@@ -92,14 +98,17 @@ var XAdkSender = (0, import_react.forwardRef)(
92
98
  }
93
99
  onChange == null ? void 0 : onChange(newValue);
94
100
  };
95
- const isTagsControlled = controlledTags !== void 0;
96
- const [internalTags, setInternalTags] = (0, import_react.useState)(defaultTags);
97
- const tags = isTagsControlled ? controlledTags : internalTags;
98
- const setTags = (newTags) => {
99
- if (!isTagsControlled) {
100
- setInternalTags(newTags);
101
+ const resolvedControlledMentions = controlledMentions ?? controlledTags;
102
+ const initialMentions = defaultMentions ?? defaultTags;
103
+ const isMentionsControlled = resolvedControlledMentions !== void 0;
104
+ const [internalMentions, setInternalMentions] = (0, import_react.useState)(initialMentions);
105
+ const mentions = isMentionsControlled ? resolvedControlledMentions : internalMentions;
106
+ const setMentions = (newMentions) => {
107
+ if (!isMentionsControlled) {
108
+ setInternalMentions(newMentions);
101
109
  }
102
- onTagsChange == null ? void 0 : onTagsChange(newTags);
110
+ onMentionsChange == null ? void 0 : onMentionsChange(newMentions);
111
+ onTagsChange == null ? void 0 : onTagsChange(newMentions);
103
112
  };
104
113
  const [files, setFiles] = (0, import_react.useState)([]);
105
114
  const [isDragOver, setIsDragOver] = (0, import_react.useState)(false);
@@ -120,21 +129,24 @@ var XAdkSender = (0, import_react.forwardRef)(
120
129
  };
121
130
  const escapeXml = (text) => text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
122
131
  const escapeMarkdownLabel = (text) => text.replace(/\\/g, "\\\\").replace(/\]/g, "\\]");
123
- const getTagSubmitValue = (tag) => {
124
- var _a, _b;
125
- return String(tag.value ?? ((_a = tag.data) == null ? void 0 : _a.value) ?? ((_b = tag.data) == null ? void 0 : _b.name) ?? tag.label ?? "");
132
+ const getMentionSubmitValue = (mention) => {
133
+ var _a, _b, _c;
134
+ return String(
135
+ mention.value ?? mention.uri ?? ((_a = mention.data) == null ? void 0 : _a.uri) ?? ((_b = mention.data) == null ? void 0 : _b.value) ?? ((_c = mention.data) == null ? void 0 : _c.name) ?? mention.targetId ?? mention.displayName ?? mention.label ?? ""
136
+ );
126
137
  };
127
- const defaultFormatTag = (tag, format, index) => {
128
- const value2 = getTagSubmitValue(tag);
138
+ const defaultFormatMention = (mention, format, index) => {
139
+ const value2 = getMentionSubmitValue(mention);
129
140
  if (format === "xml") {
130
- return `<tag type="${escapeXml(tag.type)}" id="${escapeXml(tag.id)}" label="${escapeXml(tag.label)}" value="${escapeXml(value2)}" />`;
141
+ return `<mention type="${escapeXml(mention.type)}" id="${escapeXml(mention.id)}" label="${escapeXml(mention.label)}" value="${escapeXml(value2)}" />`;
131
142
  }
132
143
  if (format === "markdown") {
133
- return `[/${escapeMarkdownLabel(tag.label)}](xadk-tag://${encodeURIComponent(tag.type)}/${encodeURIComponent(tag.id)})`;
144
+ const href = mention.uri || (value2.includes("://") ? value2 : `xadk-mention://${encodeURIComponent(mention.type)}/${encodeURIComponent(mention.id)}`);
145
+ return `[@${escapeMarkdownLabel(mention.displayName || mention.label)}](${href})`;
134
146
  }
135
- return `/${value2 || `tag-${index + 1}`}`;
147
+ return `@${mention.displayName || value2 || `mention-${index + 1}`}`;
136
148
  };
137
- const serializeTag = (tag, format, index) => (formatTag == null ? void 0 : formatTag(tag, { format, index })) ?? defaultFormatTag(tag, format, index);
149
+ const serializeMention = (mention, format, index) => (formatMention == null ? void 0 : formatMention(mention, { format, index })) ?? (formatTag == null ? void 0 : formatTag(mention, { format, index })) ?? defaultFormatMention(mention, format, index);
138
150
  const getSubmitParts = (0, import_react.useCallback)(() => {
139
151
  var _a;
140
152
  if (inlineTags) {
@@ -143,9 +155,12 @@ var XAdkSender = (0, import_react.forwardRef)(
143
155
  return parts;
144
156
  }
145
157
  const textParts = value ? [{ type: "text", text: value }] : [];
146
- const tagParts = tags.map((tag) => ({ type: "tag", tag }));
147
- return [...tagParts, ...textParts];
148
- }, [inlineTags, tags, value]);
158
+ const mentionParts = mentions.map((mention) => ({
159
+ type: "mention",
160
+ mention
161
+ }));
162
+ return [...mentionParts, ...textParts];
163
+ }, [inlineTags, mentions, value]);
149
164
  const serializeParts = (parts, format) => {
150
165
  if (format === "structured") {
151
166
  return parts.reduce(
@@ -157,7 +172,7 @@ var XAdkSender = (0, import_react.forwardRef)(
157
172
  return parts.map((part) => {
158
173
  if (part.type === "text")
159
174
  return part.text;
160
- const result = serializeTag(part.tag, format, tagIndex);
175
+ const result = serializeMention(part.mention, format, tagIndex);
161
176
  tagIndex += 1;
162
177
  return result;
163
178
  }).join("");
@@ -174,7 +189,8 @@ var XAdkSender = (0, import_react.forwardRef)(
174
189
  format: submitFormat,
175
190
  parts,
176
191
  files: formattedFiles,
177
- tags
192
+ mentions,
193
+ tags: mentions
178
194
  };
179
195
  return {
180
196
  ...standardData,
@@ -282,20 +298,28 @@ var XAdkSender = (0, import_react.forwardRef)(
282
298
  addFiles: (rawFiles) => {
283
299
  handleFileSelect(rawFiles);
284
300
  },
285
- insertTag: (tag) => {
301
+ insertMention: (mention) => {
302
+ var _a;
303
+ if (inlineTags) {
304
+ (_a = inlineInputRef.current) == null ? void 0 : _a.insertMention(mention);
305
+ return;
306
+ }
307
+ setMentions([...mentions, mention]);
308
+ },
309
+ insertTag: (mention) => {
286
310
  var _a;
287
311
  if (inlineTags) {
288
- (_a = inlineInputRef.current) == null ? void 0 : _a.insertTag(tag);
312
+ (_a = inlineInputRef.current) == null ? void 0 : _a.insertMention(mention);
289
313
  return;
290
314
  }
291
- setTags([...tags, tag]);
315
+ setMentions([...mentions, mention]);
292
316
  },
293
317
  focus: () => {
294
318
  var _a, _b;
295
319
  inlineTags ? (_a = inlineInputRef.current) == null ? void 0 : _a.focus() : (_b = textareaRef.current) == null ? void 0 : _b.focus();
296
320
  }
297
321
  }),
298
- [handleFileSelect, inlineTags, setTags, tags]
322
+ [handleFileSelect, inlineTags, setMentions, mentions]
299
323
  );
300
324
  const triggerFileSelect = () => {
301
325
  if (fileInputRef.current) {
@@ -407,11 +431,11 @@ var XAdkSender = (0, import_react.forwardRef)(
407
431
  },
408
432
  [allowUpload, handleFileSelect]
409
433
  );
410
- const handleRemoveTag = (0, import_react.useCallback)(
434
+ const handleRemoveMention = (0, import_react.useCallback)(
411
435
  (id) => {
412
- setTags(tags.filter((t) => t.id !== id));
436
+ setMentions(mentions.filter((item) => item.id !== id));
413
437
  },
414
- [tags, setTags]
438
+ [mentions, setMentions]
415
439
  );
416
440
  const activeQuickKeyConfig = (0, import_react.useMemo)(() => {
417
441
  if (!activeQuickKey)
@@ -479,24 +503,27 @@ var XAdkSender = (0, import_react.forwardRef)(
479
503
  const handleQuickKeySelect = (0, import_react.useCallback)(
480
504
  (option) => {
481
505
  var _a, _b, _c, _d;
482
- const tagType = (activeQuickKeyConfig == null ? void 0 : activeQuickKeyConfig.tagType) || activeQuickKey || "unknown";
483
- const newTag = {
506
+ const mentionType = (activeQuickKeyConfig == null ? void 0 : activeQuickKeyConfig.mentionType) || (activeQuickKeyConfig == null ? void 0 : activeQuickKeyConfig.tagType) || activeQuickKey || "unknown";
507
+ const newMention = {
484
508
  id: generateId(),
485
509
  label: option.label,
486
- type: tagType,
487
- value: option.value ?? option.name ?? option.label,
510
+ type: mentionType,
511
+ value: option.value ?? option.uri ?? option.name ?? option.label,
512
+ uri: option.uri,
513
+ targetId: option.targetId ?? option.skillNo ?? option.pluginNo,
514
+ displayName: option.displayName ?? option.label,
488
515
  trigger: activeQuickKey || void 0,
489
516
  icon: option.icon,
490
517
  data: option
491
518
  };
492
519
  (_a = activeQuickKeyConfig == null ? void 0 : activeQuickKeyConfig.onSelect) == null ? void 0 : _a.call(activeQuickKeyConfig, option);
493
520
  if (inlineTags) {
494
- (_b = inlineInputRef.current) == null ? void 0 : _b.insertTag(newTag, {
521
+ (_b = inlineInputRef.current) == null ? void 0 : _b.insertMention(newMention, {
495
522
  start: quickKeyTriggerIdx,
496
523
  end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length
497
524
  });
498
525
  } else {
499
- setTags([...tags, newTag]);
526
+ setMentions([...mentions, newMention]);
500
527
  if (quickKeyTriggerIdx >= 0) {
501
528
  const newValue = value.slice(0, quickKeyTriggerIdx) + value.slice(quickKeyTriggerIdx + 1 + quickKeyKeyword.length);
502
529
  setValue(newValue);
@@ -512,8 +539,8 @@ var XAdkSender = (0, import_react.forwardRef)(
512
539
  activeQuickKey,
513
540
  activeQuickKeyConfig,
514
541
  inlineTags,
515
- tags,
516
- setTags,
542
+ mentions,
543
+ setMentions,
517
544
  value,
518
545
  quickKeyTriggerIdx,
519
546
  quickKeyKeyword,
@@ -566,7 +593,7 @@ var XAdkSender = (0, import_react.forwardRef)(
566
593
  handleQuickKeyByText(text, cursorPos);
567
594
  };
568
595
  const handleSubmit = () => {
569
- if (!value.trim() && files.length === 0 && tags.length === 0) {
596
+ if (!value.trim() && files.length === 0 && mentions.length === 0) {
570
597
  import_antd.message.warning("请输入消息或选择文件");
571
598
  return;
572
599
  }
@@ -586,7 +613,7 @@ var XAdkSender = (0, import_react.forwardRef)(
586
613
  onSubmit(createSubmitData(formattedFiles));
587
614
  }
588
615
  setValue("");
589
- setTags([]);
616
+ setMentions([]);
590
617
  setFiles((prev) => prev.filter((f) => f.status !== "success"));
591
618
  },
592
619
  onCancel: () => {
@@ -599,7 +626,7 @@ var XAdkSender = (0, import_react.forwardRef)(
599
626
  onSubmit(createSubmitData(formattedFiles));
600
627
  }
601
628
  setValue("");
602
- setTags([]);
629
+ setMentions([]);
603
630
  setFiles((prev) => prev.filter((f) => f.status !== "success"));
604
631
  }
605
632
  };
@@ -672,8 +699,8 @@ var XAdkSender = (0, import_react.forwardRef)(
672
699
  const isDisabled = disabled || uploading || loading;
673
700
  const hasContent = value.trim().length > 0;
674
701
  const hasFiles = files.some((f) => f.status === "success");
675
- const hasTags = tags.length > 0;
676
- const canSend = hasContent || hasFiles || hasTags;
702
+ const hasMentions = mentions.length > 0;
703
+ const canSend = hasContent || hasFiles || hasMentions;
677
704
  const SendButton = (props) => {
678
705
  if (sendButtonRender) {
679
706
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: sendButtonRender({
@@ -802,7 +829,7 @@ var XAdkSender = (0, import_react.forwardRef)(
802
829
  headerNode && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.contextHeader, children: headerNode }),
803
830
  fileListNode
804
831
  ] }),
805
- !inlineTags && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_InputTags.default, { tags, onRemove: handleRemoveTag }),
832
+ !inlineTags && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_InputTags.default, { mentions, onRemove: handleRemoveMention }),
806
833
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.inputAndButtons, children: [
807
834
  renderSlot(prefix, false),
808
835
  inlineTags ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -810,14 +837,15 @@ var XAdkSender = (0, import_react.forwardRef)(
810
837
  {
811
838
  ref: inlineInputRef,
812
839
  value,
813
- tags,
840
+ mentions,
841
+ defaultInputParts,
814
842
  placeholder,
815
843
  disabled: isDisabled,
816
844
  onChange: handleInlineInputChange,
817
- onTagsChange: setTags,
845
+ onMentionsChange: setMentions,
818
846
  onKeyDown: handleKeyDown,
819
847
  onKeyUp: handleInlineKeyUp,
820
- renderTag
848
+ renderMention: renderMention ?? renderTag
821
849
  }
822
850
  ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.textAreaWrapper, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
823
851
  import_antd.Input.TextArea,
@@ -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 PaperClipOutlined,\n} from \"@ant-design/icons\";\nimport {\n XAdkSenderProps,\n XAdkSenderHandle,\n ServerFile,\n LocalFile,\n ActionsComponents,\n FileValidator,\n UploadFileResult,\n InputTag,\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 allowUpload = false,\n draggable = true,\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 renderTag,\n tags: controlledTags,\n defaultTags = [],\n onTagsChange,\n onQuickKeyTrigger,\n submitFormat = \"text\",\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 // tags 支持受控/非受控两种模式;inlineTags 打开时会和输入内容混排。\n const isTagsControlled = controlledTags !== undefined;\n const [internalTags, setInternalTags] = useState<InputTag[]>(defaultTags);\n const tags = isTagsControlled ? controlledTags : internalTags;\n const setTags = (newTags: InputTag[]) => {\n if (!isTagsControlled) {\n setInternalTags(newTags);\n }\n onTagsChange?.(newTags);\n };\n\n const [files, setFiles] = useState<LocalFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(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 getTagSubmitValue = (tag: InputTag) =>\n String(tag.value ?? tag.data?.value ?? tag.data?.name ?? tag.label ?? \"\");\n\n const defaultFormatTag = (\n tag: InputTag,\n format: Exclude<XAdkSenderSubmitFormat, \"structured\">,\n index: number,\n ) => {\n const value = getTagSubmitValue(tag);\n if (format === \"xml\") {\n return `<tag type=\"${escapeXml(tag.type)}\" id=\"${escapeXml(tag.id)}\" label=\"${escapeXml(tag.label)}\" value=\"${escapeXml(value)}\" />`;\n }\n\n if (format === \"markdown\") {\n return `[/${escapeMarkdownLabel(tag.label)}](xadk-tag://${encodeURIComponent(tag.type)}/${encodeURIComponent(tag.id)})`;\n }\n\n return `/${value || `tag-${index + 1}`}`;\n };\n\n const serializeTag = (\n tag: InputTag,\n format: Exclude<XAdkSenderSubmitFormat, \"structured\">,\n index: number,\n ) => formatTag?.(tag, { format, index }) ?? defaultFormatTag(tag, 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 tagParts = tags.map((tag) => ({ type: \"tag\" as const, tag }));\n return [...tagParts, ...textParts];\n }, [inlineTags, tags, 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 = serializeTag(part.tag, 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 tags,\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 insertTag: (tag: InputTag) => {\n if (inlineTags) {\n inlineInputRef.current?.insertTag(tag);\n return;\n }\n setTags([...tags, tag]);\n },\n focus: () => {\n inlineTags ? inlineInputRef.current?.focus() : textareaRef.current?.focus();\n },\n }),\n [handleFileSelect, inlineTags, setTags, tags],\n );\n\n // 触发文件选择\n const triggerFileSelect = () => {\n if (fileInputRef.current) {\n fileInputRef.current.click();\n }\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 (allowUpload) {\n setIsDragOver(true);\n }\n },\n [allowUpload],\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(false);\n }\n },\n [allowUpload],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (\n allowUpload &&\n e.dataTransfer.files &&\n e.dataTransfer.files.length > 0\n ) {\n handleFileSelect(Array.from(e.dataTransfer.files));\n }\n },\n [allowUpload, handleFileSelect],\n );\n\n // 删除标签\n const handleRemoveTag = useCallback(\n (id: string) => {\n setTags(tags.filter((t) => t.id !== id));\n },\n [tags, setTags],\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 // 选择快捷项后转成结构化 tag;inline 模式会替换掉触发字符和关键词。\n const handleQuickKeySelect = useCallback(\n (option: any) => {\n const tagType = activeQuickKeyConfig?.tagType || activeQuickKey || \"unknown\";\n const newTag: InputTag = {\n id: generateId(),\n label: option.label,\n type: tagType,\n value: option.value ?? option.name ?? 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?.insertTag(newTag, {\n start: quickKeyTriggerIdx,\n end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length,\n });\n } else {\n setTags([...tags, newTag]);\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 tags,\n setTags,\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 if (!value.trim() && files.length === 0 && tags.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 setTags([]);\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 setTags([]);\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 isDisabled = disabled || uploading || loading;\n const hasContent = value.trim().length > 0;\n const hasFiles = files.some((f) => f.status === \"success\");\n const hasTags = tags.length > 0;\n const canSend = hasContent || hasFiles || hasTags;\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 UploadButton = (props: any) => (\n <Tooltip title=\"上传文件\">\n <button\n className={`${styles.iconButton} ${styles.uploadButton}`}\n onClick={triggerFileSelect}\n disabled={isDisabled}\n aria-label=\"上传文件\"\n {...props}\n >\n <PaperClipOutlined />\n </button>\n </Tooltip>\n );\n\n const ClearButton = (props: any) => (\n <Popconfirm\n title=\"确定要清空聊天记录吗?\"\n onConfirm={onClear}\n placement=\"top\"\n okText=\"确定\"\n cancelText=\"取消\"\n disabled={isDisabled}\n >\n <button\n className={`${styles.iconButton} ${styles.clearButton}`}\n disabled={isDisabled}\n aria-label=\"清空聊天记录\"\n {...props}\n >\n <ClearOutlined />\n </button>\n </Popconfirm>\n );\n\n const actionsComponents: ActionsComponents = {\n SendButton,\n UploadButton,\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 = allowUpload && 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 {allowUpload && <UploadButton />}\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={allowUpload && draggable ? handleDragOver : undefined}\n onDragLeave={allowUpload && draggable ? handleDragLeave : undefined}\n onDrop={allowUpload && draggable ? handleDrop : undefined}\n >\n {/* 隐藏的原生 file input */}\n {allowUpload && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={allowedFileTypes.join(\",\")}\n style={{ display: \"none\" }}\n onChange={(e) => {\n if (e.target.files) {\n handleFileSelect(Array.from(e.target.files));\n e.target.value = \"\";\n }\n }}\n />\n )}\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 tags={tags} onRemove={handleRemoveTag} />\n )}\n\n <div className={styles.inputAndButtons}>\n {/* 前缀插槽 */}\n {renderSlot(prefix, false)}\n\n {inlineTags ? (\n <InlineTagInput\n ref={inlineInputRef}\n value={value}\n tags={tags}\n placeholder={placeholder}\n disabled={isDisabled}\n onChange={handleInlineInputChange}\n onTagsChange={setTags}\n onKeyDown={handleKeyDown as any}\n onKeyUp={handleInlineKeyUp}\n renderTag={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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",
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 PaperClipOutlined,\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 allowUpload = false,\n draggable = true,\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 fileInputRef = useRef<HTMLInputElement>(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 triggerFileSelect = () => {\n if (fileInputRef.current) {\n fileInputRef.current.click();\n }\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 (allowUpload) {\n setIsDragOver(true);\n }\n },\n [allowUpload],\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(false);\n }\n },\n [allowUpload],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (\n allowUpload &&\n e.dataTransfer.files &&\n e.dataTransfer.files.length > 0\n ) {\n handleFileSelect(Array.from(e.dataTransfer.files));\n }\n },\n [allowUpload, handleFileSelect],\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 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 isDisabled = disabled || uploading || loading;\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 UploadButton = (props: any) => (\n <Tooltip title=\"上传文件\">\n <button\n className={`${styles.iconButton} ${styles.uploadButton}`}\n onClick={triggerFileSelect}\n disabled={isDisabled}\n aria-label=\"上传文件\"\n {...props}\n >\n <PaperClipOutlined />\n </button>\n </Tooltip>\n );\n\n const ClearButton = (props: any) => (\n <Popconfirm\n title=\"确定要清空聊天记录吗?\"\n onConfirm={onClear}\n placement=\"top\"\n okText=\"确定\"\n cancelText=\"取消\"\n disabled={isDisabled}\n >\n <button\n className={`${styles.iconButton} ${styles.clearButton}`}\n disabled={isDisabled}\n aria-label=\"清空聊天记录\"\n {...props}\n >\n <ClearOutlined />\n </button>\n </Popconfirm>\n );\n\n const actionsComponents: ActionsComponents = {\n SendButton,\n UploadButton,\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 = allowUpload && 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 {allowUpload && <UploadButton />}\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={allowUpload && draggable ? handleDragOver : undefined}\n onDragLeave={allowUpload && draggable ? handleDragLeave : undefined}\n onDrop={allowUpload && draggable ? handleDrop : undefined}\n >\n {/* 隐藏的原生 file input */}\n {allowUpload && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={allowedFileTypes.join(\",\")}\n style={{ display: \"none\" }}\n onChange={(e) => {\n if (e.target.files) {\n handleFileSelect(Array.from(e.target.files));\n e.target.value = \"\";\n }\n }}\n />\n )}\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={isDisabled}\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
6
  "names": ["value", "files", "FileGallery", "InputTags", "InlineTagInput", "QuickList"]
7
7
  }
@@ -8,6 +8,7 @@ import XAiConversations from "./components/XAiConversations";
8
8
  import XAdkThoughtChain from "./components/XAdkThoughtChain";
9
9
  import useXAiSDK from "./hooks/useXAiSDK";
10
10
  import request from "./utils/request";
11
+ import { formatMarkdownResourceLinksAsText, parseMarkdownResourceHref, replaceMarkdownResourceLinks } from "./utils/markdownResource";
11
12
  import XAdkProvider from "./components/XAdkProvider";
12
13
  import XAdkChatbot from "./components/XAdkChatbot";
13
14
  import XAdkSender from "./components/XAdkSender";
@@ -17,7 +18,7 @@ export { useChatState, useChatActions, useSession, } from "./components/XAdkProv
17
18
  export * from "./types";
18
19
  export type { ChatHookResult, ChatHookFactory } from "./types/ChatHook";
19
20
  export { useXAi, XAiProvider, XAiChatbot, XAiSDK, XAiSender, XAiConversations, useXAiSDK, request, };
20
- export { XAdkProvider, XAdkChatbot, XAdkSender, FileGallery, XAdkThoughtChain, useADKChat, baseChatStrategies, basePreset, baseToolKindResolver, createXGroupUploadRequest, mergeChatStrategies, resolvePresetUploadRequest, resolveChatPreset, xGroupAdkPreset, xGroupToolKindResolver, };
21
+ export { XAdkProvider, XAdkChatbot, XAdkSender, FileGallery, XAdkThoughtChain, useADKChat, formatMarkdownResourceLinksAsText, parseMarkdownResourceHref, replaceMarkdownResourceLinks, baseChatStrategies, basePreset, baseToolKindResolver, createXGroupUploadRequest, mergeChatStrategies, resolvePresetUploadRequest, resolveChatPreset, xGroupAdkPreset, xGroupToolKindResolver, };
21
22
  import Sources from "./components/Sources";
22
23
  export { Sources };
23
24
  export type { SourcesProps, SourcesItem, SourcesRef } from "./types/Sources";
package/dist/cjs/index.js CHANGED
@@ -51,7 +51,10 @@ __export(src_exports, {
51
51
  createXGroupOpenApiTransport: () => import_xgroup2.createXGroupOpenApiTransport,
52
52
  createXGroupUploadRequest: () => import_xgroup.createXGroupUploadRequest,
53
53
  cssVarStyle: () => import_tokens.cssVarStyle,
54
+ formatMarkdownResourceLinksAsText: () => import_markdownResource.formatMarkdownResourceLinksAsText,
54
55
  mergeChatStrategies: () => import_xgroup.mergeChatStrategies,
56
+ parseMarkdownResourceHref: () => import_markdownResource.parseMarkdownResourceHref,
57
+ replaceMarkdownResourceLinks: () => import_markdownResource.replaceMarkdownResourceLinks,
55
58
  request: () => import_request.default,
56
59
  resolveChatPreset: () => import_xgroup.resolveChatPreset,
57
60
  resolvePresetUploadRequest: () => import_xgroup.resolvePresetUploadRequest,
@@ -79,6 +82,7 @@ var import_XAiConversations = __toESM(require("./components/XAiConversations"));
79
82
  var import_XAdkThoughtChain = __toESM(require("./components/XAdkThoughtChain"));
80
83
  var import_useXAiSDK = __toESM(require("./hooks/useXAiSDK"));
81
84
  var import_request = __toESM(require("./utils/request"));
85
+ var import_markdownResource = require("./utils/markdownResource");
82
86
  var import_XAdkProvider = __toESM(require("./components/XAdkProvider"));
83
87
  var import_XAdkChatbot = __toESM(require("./components/XAdkChatbot"));
84
88
  var import_XAdkSender = __toESM(require("./components/XAdkSender"));
@@ -118,7 +122,10 @@ var import_xgroup2 = require("./presets/xgroup");
118
122
  createXGroupOpenApiTransport,
119
123
  createXGroupUploadRequest,
120
124
  cssVarStyle,
125
+ formatMarkdownResourceLinksAsText,
121
126
  mergeChatStrategies,
127
+ parseMarkdownResourceHref,
128
+ replaceMarkdownResourceLinks,
122
129
  request,
123
130
  resolveChatPreset,
124
131
  resolvePresetUploadRequest,