@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.
- package/dist/cjs/components/FileGallery/styles.js +21 -1
- package/dist/cjs/components/FileGallery/styles.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +7 -1
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +82 -22
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +39 -0
- package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +35 -5
- package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/styles.js +1 -1
- package/dist/cjs/components/XAdkChatbot/styles.js.map +1 -1
- package/dist/cjs/components/XAdkSender/InlineTagInput.d.ts +11 -5
- package/dist/cjs/components/XAdkSender/InlineTagInput.js +119 -77
- package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
- package/dist/cjs/components/XAdkSender/InputTags.d.ts +2 -2
- package/dist/cjs/components/XAdkSender/InputTags.js +8 -8
- package/dist/cjs/components/XAdkSender/InputTags.js.map +2 -2
- package/dist/cjs/components/XAdkSender/index.js +73 -45
- package/dist/cjs/components/XAdkSender/index.js.map +2 -2
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/types/XAdkChatbot.d.ts +15 -0
- package/dist/cjs/types/XAdkChatbot.js.map +1 -1
- package/dist/cjs/types/XAdkSender.d.ts +62 -24
- package/dist/cjs/types/XAdkSender.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +1 -0
- package/dist/cjs/utils/index.js +3 -1
- package/dist/cjs/utils/index.js.map +2 -2
- package/dist/cjs/utils/markdownResource.d.ts +7 -0
- package/dist/cjs/utils/markdownResource.js +73 -0
- package/dist/cjs/utils/markdownResource.js.map +7 -0
- package/dist/esm/components/FileGallery/styles.js +2 -2
- package/dist/esm/components/FileGallery/styles.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +7 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +57 -7
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +5 -2
- package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.js +20 -6
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/styles.js +1 -1
- package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
- package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +11 -5
- package/dist/esm/components/XAdkSender/InlineTagInput.js +125 -97
- package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
- package/dist/esm/components/XAdkSender/InputTags.d.ts +2 -2
- package/dist/esm/components/XAdkSender/InputTags.js +9 -9
- package/dist/esm/components/XAdkSender/InputTags.js.map +1 -1
- package/dist/esm/components/XAdkSender/index.js +97 -71
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/XAdkChatbot.d.ts +15 -0
- package/dist/esm/types/XAdkChatbot.js.map +1 -1
- package/dist/esm/types/XAdkSender.d.ts +62 -24
- package/dist/esm/types/XAdkSender.js.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/markdownResource.d.ts +7 -0
- package/dist/esm/utils/markdownResource.js +33 -0
- package/dist/esm/utils/markdownResource.js.map +1 -0
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -87,7 +87,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
.ant-progress-line {
|
|
90
|
-
width:
|
|
90
|
+
width: auto;
|
|
91
91
|
}
|
|
92
92
|
`,
|
|
93
93
|
imageThumbnail: import_css.css`
|
|
@@ -190,7 +190,27 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
190
190
|
|
|
191
191
|
`,
|
|
192
192
|
progressSmall: import_css.css`
|
|
193
|
+
position: absolute;
|
|
194
|
+
left: 34px;
|
|
195
|
+
right: 10px;
|
|
196
|
+
bottom: 3px;
|
|
193
197
|
margin-top: 0;
|
|
198
|
+
line-height: 0;
|
|
199
|
+
|
|
200
|
+
.ant-progress-outer {
|
|
201
|
+
display: block;
|
|
202
|
+
width: 100%;
|
|
203
|
+
padding-inline-end: 0 !important;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.ant-progress-inner {
|
|
207
|
+
height: 3px !important;
|
|
208
|
+
background: rgba(22, 119, 255, 0.12);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.ant-progress-bg {
|
|
212
|
+
height: 3px !important;
|
|
213
|
+
}
|
|
194
214
|
`,
|
|
195
215
|
fileRemoveBtn: import_css.css`
|
|
196
216
|
position: absolute;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/FileGallery/styles.tsx"],
|
|
4
|
-
"sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &.align-right {\n align-items: flex-end;\n }\n `,\n\n fileList: css`\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n `,\n\n fileCard: css`\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n margin: 8px 0;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n min-width: 260px;\n max-width: 280px;\n min-height: 64px;\n transition: all 0.2s ease;\n\n &:hover {\n background: #f5f5f5;\n border-color: #e0e0e0;\n }\n\n /* align=right 时图标在右侧 */\n &.align-right {\n flex-direction: row-reverse;\n }\n\n `,\n\n fileCardSmall: css`\n gap: 6px;\n min-width: 0;\n max-width: 260px;\n width: auto;\n height: 32px;\n min-height: 32px;\n margin: 0;\n padding: 4px 10px 4px 8px;\n border-radius: 7px;\n background: #f5f5f5;\n border-color: transparent;\n box-sizing: border-box;\n\n &:hover {\n background: #eeeeee;\n border-color: transparent;\n }\n\n .ant-progress-line {\n width:
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAoB;AACpB,oBAAgC;AAEzB,IAAM,gBAAY,+BAAgB,OAAO;AAAA,EAC9C,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWX,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BV,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBf,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BhB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAad,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWV,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWV,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,eAAe;AAAA;AAAA;AAAA,EAIf,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaV,eAAe;AAAA;AAAA;AAAA,
|
|
4
|
+
"sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &.align-right {\n align-items: flex-end;\n }\n `,\n\n fileList: css`\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n `,\n\n fileCard: css`\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n margin: 8px 0;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n min-width: 260px;\n max-width: 280px;\n min-height: 64px;\n transition: all 0.2s ease;\n\n &:hover {\n background: #f5f5f5;\n border-color: #e0e0e0;\n }\n\n /* align=right 时图标在右侧 */\n &.align-right {\n flex-direction: row-reverse;\n }\n\n `,\n\n fileCardSmall: css`\n gap: 6px;\n min-width: 0;\n max-width: 260px;\n width: auto;\n height: 32px;\n min-height: 32px;\n margin: 0;\n padding: 4px 10px 4px 8px;\n border-radius: 7px;\n background: #f5f5f5;\n border-color: transparent;\n box-sizing: border-box;\n\n &:hover {\n background: #eeeeee;\n border-color: transparent;\n }\n\n .ant-progress-line {\n width: auto;\n }\n `,\n\n imageThumbnail: css`\n position: relative;\n width: 44px;\n height: 44px;\n flex-shrink: 0;\n border-radius: 4px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n\n .ant-image {\n width: 100% !important;\n height: 100% !important;\n display: flex !important;\n justify-content: center;\n align-items: center;\n }\n\n img {\n width: 100% !important;\n height: 100% !important;\n object-fit: cover !important;\n display: block !important;\n }\n\n `,\n\n imageThumbnailSmall: css`\n width: 22px;\n height: 22px;\n border-radius: 5px;\n `,\n\n imageOverlay: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.05);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n `,\n\n fileIcon: css`\n font-size: 24px;\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n `,\n\n fileIconSmall: css`\n width: 20px;\n height: 20px;\n font-size: 16px;\n `,\n\n fileInfo: css`\n flex: 1;\n min-width: 0;\n overflow: hidden;\n `,\n\n fileName: css`\n font-size: 13px;\n font-weight: 500;\n color: #262626;\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n `,\n\n fileNameSmall: css`\n max-width: 190px;\n margin-bottom: 0;\n font-size: 12px;\n line-height: 20px;\n `,\n\n fileSize: css`\n font-size: 11px;\n color: #8c8c8c;\n\n `,\n\n fileSizeSmall: css`\n display: none;\n `,\n\n progress: css`\n margin-top: 4px;\n\n .ant-progress-inner {\n height: 4px !important;\n }\n\n .ant-progress-bg {\n height: 4px !important;\n }\n\n `,\n\n progressSmall: css`\n position: absolute;\n left: 34px;\n right: 10px;\n bottom: 3px;\n margin-top: 0;\n line-height: 0;\n\n .ant-progress-outer {\n display: block;\n width: 100%;\n padding-inline-end: 0 !important;\n }\n\n .ant-progress-inner {\n height: 3px !important;\n background: rgba(22, 119, 255, 0.12);\n }\n\n .ant-progress-bg {\n height: 3px !important;\n }\n `,\n\n fileRemoveBtn: css`\n position: absolute;\n top: -6px;\n right: -6px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.75);\n color: #fff;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1;\n padding: 0;\n font-size: 10px;\n transition: all 0.2s ease;\n\n &:hover {\n background: rgba(0, 0, 0, 0.9);\n transform: scale(1.1);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n\n fileRemoveBtnSmall: css`\n top: -5px;\n right: -5px;\n width: 14px;\n height: 14px;\n font-size: 8px;\n `,\n\n fileLink: css`\n display: flex;\n align-items: center;\n gap: 8px;\n color: rgba(0, 0, 0, 0.85);\n text-decoration: none;\n font-size: 13px;\n\n &:hover {\n color: #1677ff;\n }\n `,\n\n mediaWrapper: css`\n margin-top: 6px;\n\n audio {\n width: 100%;\n height: 32px;\n outline: none;\n }\n\n video {\n width: 100%;\n max-height: 240px;\n border-radius: 4px;\n outline: none;\n background: #000;\n }\n `,\n\n // ========== 图片展示模式 ==========\n imagePreviewMode: css`\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n\n .ant-image {\n display: flex !important;\n justify-content: center;\n align-items: center;\n }\n\n img {\n display: block !important;\n object-fit: contain !important;\n }\n `,\n\n imageFullMode: css`\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n width: 100%;\n\n .ant-image {\n width: 100% !important;\n display: flex !important;\n }\n\n img {\n width: 100% !important;\n display: block !important;\n object-fit: contain !important;\n }\n `,\n\n // ========== 图片加载状态 ==========\n imageLoadingSkeleton: css`\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(90deg, #f5f5f5 25%, #e8e8e8 50%, #f5f5f5 75%);\n background-size: 200% 100%;\n animation: shimmer 1.5s infinite;\n\n @keyframes shimmer {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n }\n `,\n\n imageErrorFallback: css`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: #fafafa;\n color: #bfbfbf;\n font-size: 20px;\n gap: 4px;\n\n span {\n font-size: 11px;\n color: #bfbfbf;\n }\n `,\n\n // ========== Media Card 模式 ==========\n mediaCardPlayIcon: css`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.5);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n z-index: 2;\n `,\n}));\n\nexport default useStyles;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import "@ant-design/x-markdown/themes/light.css";
|
|
3
|
-
import type { FileItem } from "../../../../types";
|
|
3
|
+
import type { FileItem, MarkdownResourceLink, RenderMarkdownResourceLink } from "../../../../types";
|
|
4
4
|
export interface MarkdownRenderProps {
|
|
5
5
|
text: string;
|
|
6
|
+
/** 紧凑布局,适合用户消息气泡等内联场景 */
|
|
7
|
+
compact?: boolean;
|
|
6
8
|
/** 点击 Markdown 中识别到的文件链接的回调 */
|
|
7
9
|
onFileClick?: (file: FileItem) => void;
|
|
10
|
+
/** 点击 Markdown 中识别到的资源链接标签,如 [@skill](skill://xxx) */
|
|
11
|
+
onResourceLinkClick?: (link: MarkdownResourceLink) => void;
|
|
12
|
+
/** 自定义资源链接渲染,返回 null 时使用默认标签样式 */
|
|
13
|
+
renderResourceLink?: RenderMarkdownResourceLink;
|
|
8
14
|
}
|
|
9
15
|
declare const MarkdownRender: React.FC<MarkdownRenderProps>;
|
|
10
16
|
export default MarkdownRender;
|
|
@@ -41,6 +41,7 @@ var import_Latex = __toESM(require("@ant-design/x-markdown/plugins/Latex"));
|
|
|
41
41
|
var import_styles = require("./styles");
|
|
42
42
|
var import_icons = require("@ant-design/icons");
|
|
43
43
|
var import_FileGallery = __toESM(require("../../../FileGallery"));
|
|
44
|
+
var import_markdownResource = require("../../../../utils/markdownResource");
|
|
44
45
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
45
46
|
var FILE_EXT_REGEX = /\.(pdf|doc|docx|xls|xlsx|csv|ppt|pptx|zip|rar|7z|txt|md|json|xml|mp3|wav|m4a|aac|ogg|flac|mp4|mov|webm|mkv|avi|png|jpg|jpeg|gif|webp|bmp|svg)(\?.*)?$/i;
|
|
46
47
|
var MIME_MAP = {
|
|
@@ -84,6 +85,8 @@ var extractExt = (str) => {
|
|
|
84
85
|
return "";
|
|
85
86
|
return match[1].toLowerCase();
|
|
86
87
|
};
|
|
88
|
+
var escapeHtml = (value) => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
89
|
+
var escapeAttr = (value) => escapeHtml(value).replace(/"/g, """).replace(/'/g, "'");
|
|
87
90
|
var CodeComponent = (props) => {
|
|
88
91
|
var _a;
|
|
89
92
|
const { className, children } = props;
|
|
@@ -126,17 +129,61 @@ var extractText = (children) => {
|
|
|
126
129
|
};
|
|
127
130
|
var MarkdownRender = ({
|
|
128
131
|
text,
|
|
129
|
-
|
|
132
|
+
compact = false,
|
|
133
|
+
onFileClick,
|
|
134
|
+
onResourceLinkClick,
|
|
135
|
+
renderResourceLink
|
|
130
136
|
}) => {
|
|
131
137
|
const styles = (0, import_styles.useStyles)();
|
|
132
|
-
const markdown =
|
|
138
|
+
const markdown = (0, import_markdownResource.replaceMarkdownResourceLinks)(text, (link) => {
|
|
139
|
+
return `<resource-link href="${escapeAttr(link.href)}" label="${escapeAttr(link.label)}" type="${escapeAttr(link.type)}" value="${escapeAttr(link.value)}">${escapeHtml(link.label)}</resource-link>`;
|
|
140
|
+
}).replaceAll(/\/\*\s*PLANNING\s*\*\//g, '<tag type="planning"></tag>').replaceAll(/\/\*\s*REPLANNING\s*\*\//g, '<tag type="replanning"></tag>').replaceAll(/\/\*\s*REASONING\s*\*\//g, '<tag type="reasoning"></tag>').replaceAll(/\/\*\s*ACTION\s*\*\//g, '<tag type="action"></tag>').replaceAll(
|
|
133
141
|
/\/\*\s*FINAL_ANSWER\s*\*\//g,
|
|
134
142
|
'<tag type="final_answer"></tag>'
|
|
135
143
|
);
|
|
144
|
+
const ResourceLinkComponent = import_react.default.useCallback(
|
|
145
|
+
(props) => {
|
|
146
|
+
const href = String(props.href || "");
|
|
147
|
+
const linkText = String(props.label || "") || extractText(props.children);
|
|
148
|
+
const resourceLink = (0, import_markdownResource.parseMarkdownResourceHref)(href, linkText);
|
|
149
|
+
if (!resourceLink)
|
|
150
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: props.children });
|
|
151
|
+
const customNode = renderResourceLink == null ? void 0 : renderResourceLink(resourceLink);
|
|
152
|
+
if (customNode)
|
|
153
|
+
return customNode;
|
|
154
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
155
|
+
"button",
|
|
156
|
+
{
|
|
157
|
+
type: "button",
|
|
158
|
+
className: styles.resourceLink,
|
|
159
|
+
onClick: () => onResourceLinkClick == null ? void 0 : onResourceLinkClick(resourceLink),
|
|
160
|
+
"aria-label": resourceLink.label,
|
|
161
|
+
children: resourceLink.label
|
|
162
|
+
}
|
|
163
|
+
);
|
|
164
|
+
},
|
|
165
|
+
[onResourceLinkClick, renderResourceLink, styles.resourceLink]
|
|
166
|
+
);
|
|
136
167
|
const LinkComponent = import_react.default.useCallback(
|
|
137
168
|
(props) => {
|
|
138
169
|
const href = String(props.href || "");
|
|
139
170
|
const linkText = extractText(props.children);
|
|
171
|
+
const resourceLink = (0, import_markdownResource.parseMarkdownResourceHref)(href, linkText);
|
|
172
|
+
if (resourceLink) {
|
|
173
|
+
const customNode = renderResourceLink == null ? void 0 : renderResourceLink(resourceLink);
|
|
174
|
+
if (customNode)
|
|
175
|
+
return customNode;
|
|
176
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
177
|
+
"button",
|
|
178
|
+
{
|
|
179
|
+
type: "button",
|
|
180
|
+
className: styles.resourceLink,
|
|
181
|
+
onClick: () => onResourceLinkClick == null ? void 0 : onResourceLinkClick(resourceLink),
|
|
182
|
+
"aria-label": resourceLink.label,
|
|
183
|
+
children: resourceLink.label
|
|
184
|
+
}
|
|
185
|
+
);
|
|
186
|
+
}
|
|
140
187
|
const ext = extractExt(linkText) || extractExt(href);
|
|
141
188
|
if (ext) {
|
|
142
189
|
if (!href)
|
|
@@ -157,30 +204,43 @@ var MarkdownRender = ({
|
|
|
157
204
|
}
|
|
158
205
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href, target: "_blank", rel: "noopener noreferrer", children: props.children });
|
|
159
206
|
},
|
|
160
|
-
[onFileClick]
|
|
207
|
+
[onFileClick, onResourceLinkClick, renderResourceLink, styles.resourceLink]
|
|
161
208
|
);
|
|
162
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
163
|
-
|
|
209
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
210
|
+
"div",
|
|
164
211
|
{
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
212
|
+
className: `${styles.markdownWrapper}${compact ? ` ${styles.markdownWrapperCompact}` : ""}`,
|
|
213
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
214
|
+
"div",
|
|
215
|
+
{
|
|
216
|
+
className: `${styles.markdownHost}${compact ? ` ${styles.markdownHostCompact}` : ""}`,
|
|
217
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
218
|
+
import_x_markdown.default,
|
|
219
|
+
{
|
|
220
|
+
content: markdown,
|
|
221
|
+
className: "x-markdown-light",
|
|
222
|
+
paragraphTag: "div",
|
|
223
|
+
config: {
|
|
224
|
+
extensions: (0, import_Latex.default)()
|
|
225
|
+
},
|
|
226
|
+
components: {
|
|
227
|
+
tag: ThinkComponent,
|
|
228
|
+
"resource-link": ResourceLinkComponent,
|
|
229
|
+
code: CodeComponent,
|
|
230
|
+
a: LinkComponent
|
|
231
|
+
},
|
|
232
|
+
streaming: {
|
|
233
|
+
enableAnimation: true,
|
|
234
|
+
animationConfig: {
|
|
235
|
+
fadeDuration: 400
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
)
|
|
180
240
|
}
|
|
181
|
-
|
|
241
|
+
)
|
|
182
242
|
}
|
|
183
|
-
)
|
|
243
|
+
);
|
|
184
244
|
};
|
|
185
245
|
var MarkdownRender_default = MarkdownRender;
|
|
186
246
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from \"react\";\nimport XMarkdown, { type ComponentProps } from \"@ant-design/x-markdown\";\nimport \"@ant-design/x-markdown/themes/light.css\";\nimport { CodeHighlighter } from \"@ant-design/x\";\nimport { Flex } from \"antd\";\nimport Latex from \"@ant-design/x-markdown/plugins/Latex\";\nimport { useStyles } from \"./styles\";\nimport {\n BarsOutlined,\n BulbOutlined,\n ThunderboltOutlined,\n CheckCircleOutlined,\n} from \"@ant-design/icons\";\nimport FileGallery from \"@/components/FileGallery\";\nimport type {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAClB,wBAA+C;AAC/C,mBAAO;AACP,eAAgC;AAChC,kBAAqB;AACrB,mBAAkB;AAClB,oBAA0B;AAC1B,mBAKO;AACP,yBAAwB;
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport XMarkdown, { type ComponentProps } from \"@ant-design/x-markdown\";\nimport \"@ant-design/x-markdown/themes/light.css\";\nimport { CodeHighlighter } from \"@ant-design/x\";\nimport { Flex } from \"antd\";\nimport Latex from \"@ant-design/x-markdown/plugins/Latex\";\nimport { useStyles } from \"./styles\";\nimport {\n BarsOutlined,\n BulbOutlined,\n ThunderboltOutlined,\n CheckCircleOutlined,\n} from \"@ant-design/icons\";\nimport FileGallery from \"@/components/FileGallery\";\nimport type {\n FileItem,\n MarkdownResourceLink,\n RenderMarkdownResourceLink,\n} from \"@/types\";\nimport {\n parseMarkdownResourceHref,\n replaceMarkdownResourceLinks,\n} from \"@/utils/markdownResource\";\n\n// 支持识别的文件扩展名\nconst FILE_EXT_REGEX =\n /\\.(pdf|doc|docx|xls|xlsx|csv|ppt|pptx|zip|rar|7z|txt|md|json|xml|mp3|wav|m4a|aac|ogg|flac|mp4|mov|webm|mkv|avi|png|jpg|jpeg|gif|webp|bmp|svg)(\\?.*)?$/i;\n\nconst MIME_MAP: Record<string, string> = {\n pdf: \"application/pdf\",\n doc: \"application/msword\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xls: \"application/vnd.ms-excel\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n csv: \"text/csv\",\n ppt: \"application/vnd.ms-powerpoint\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n zip: \"application/zip\",\n rar: \"application/x-rar-compressed\",\n \"7z\": \"application/x-7z-compressed\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n json: \"application/json\",\n xml: \"application/xml\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n m4a: \"audio/mp4\",\n aac: \"audio/aac\",\n ogg: \"audio/ogg\",\n flac: \"audio/flac\",\n mp4: \"video/mp4\",\n mov: \"video/quicktime\",\n webm: \"video/webm\",\n mkv: \"video/x-matroska\",\n avi: \"video/x-msvideo\",\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n bmp: \"image/bmp\",\n svg: \"image/svg+xml\",\n};\n\n/**\n * 从字符串中提取文件扩展名(小写,不含点和查询参数)\n */\nconst extractExt = (str: string): string => {\n const match = str.match(FILE_EXT_REGEX);\n if (!match) return \"\";\n return match[1].toLowerCase();\n};\n\nconst escapeHtml = (value: string) =>\n value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n\nconst escapeAttr = (value: string) =>\n escapeHtml(value).replace(/\"/g, \""\").replace(/'/g, \"'\");\n\nconst CodeComponent: React.FC<ComponentProps> = (props) => {\n const { className, children } = props;\n const lang = className?.match(/language-(\\S+)/)?.[1] || \"\";\n\n if (typeof children !== \"string\") return null;\n return <CodeHighlighter lang={lang}>{children}</CodeHighlighter>;\n};\n\nexport interface MarkdownRenderProps {\n text: string;\n /** 紧凑布局,适合用户消息气泡等内联场景 */\n compact?: boolean;\n /** 点击 Markdown 中识别到的文件链接的回调 */\n onFileClick?: (file: FileItem) => void;\n /** 点击 Markdown 中识别到的资源链接标签,如 [@skill](skill://xxx) */\n onResourceLinkClick?: (link: MarkdownResourceLink) => void;\n /** 自定义资源链接渲染,返回 null 时使用默认标签样式 */\n renderResourceLink?: RenderMarkdownResourceLink;\n}\n\nconst ThinkComponent = React.memo((props: ComponentProps) => {\n const type = (props.type || \"\") as string;\n const titleMap: Record<string, string> = {\n planning: \"规划\",\n replanning: \"重新规划\",\n reasoning: \"推理\",\n action: \"行动\",\n final_answer: \"最终答案\",\n };\n const iconMap = {\n planning: <BarsOutlined />,\n replanning: <BarsOutlined />,\n reasoning: <BulbOutlined />,\n action: <ThunderboltOutlined />,\n final_answer: <CheckCircleOutlined />,\n };\n\n return (\n <Flex align=\"center\" gap={8} style={{ color: \"#888\", margin: \"4px 0\" }}>\n {type in titleMap && iconMap[type as keyof typeof iconMap]}\n {titleMap[type] && <span>{titleMap[type]}</span>}\n </Flex>\n );\n});\n\n/**\n * 递归从 React children 中提取纯文本\n */\nconst extractText = (children: React.ReactNode): string => {\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return String(children);\n if (Array.isArray(children)) return children.map(extractText).join(\"\");\n if (React.isValidElement(children))\n return extractText((children.props as any).children);\n return \"\";\n};\n\nconst MarkdownRender: React.FC<MarkdownRenderProps> = ({\n text,\n compact = false,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n}) => {\n const styles = useStyles();\n const markdown = replaceMarkdownResourceLinks(text, (link) => {\n // 非 http(s) 协议容易被 Markdown 引擎清洗成普通文本,先转为内部自定义标签再交给 XMarkdown。\n return `<resource-link href=\"${escapeAttr(link.href)}\" label=\"${escapeAttr(link.label)}\" type=\"${escapeAttr(link.type)}\" value=\"${escapeAttr(link.value)}\">${escapeHtml(link.label)}</resource-link>`;\n })\n .replaceAll(/\\/\\*\\s*PLANNING\\s*\\*\\//g, '<tag type=\"planning\"></tag>')\n .replaceAll(/\\/\\*\\s*REPLANNING\\s*\\*\\//g, '<tag type=\"replanning\"></tag>')\n .replaceAll(/\\/\\*\\s*REASONING\\s*\\*\\//g, '<tag type=\"reasoning\"></tag>')\n .replaceAll(/\\/\\*\\s*ACTION\\s*\\*\\//g, '<tag type=\"action\"></tag>')\n .replaceAll(\n /\\/\\*\\s*FINAL_ANSWER\\s*\\*\\//g,\n '<tag type=\"final_answer\"></tag>',\n );\n\n const ResourceLinkComponent = React.useCallback(\n (props: ComponentProps) => {\n const href = String((props.href as string) || \"\");\n const linkText =\n String((props.label as string) || \"\") || extractText(props.children);\n const resourceLink = parseMarkdownResourceHref(href, linkText);\n if (!resourceLink) return <>{props.children as React.ReactNode}</>;\n\n const customNode = renderResourceLink?.(resourceLink);\n if (customNode) return customNode;\n\n return (\n <button\n type=\"button\"\n className={styles.resourceLink}\n onClick={() => onResourceLinkClick?.(resourceLink)}\n aria-label={resourceLink.label}\n >\n {resourceLink.label}\n </button>\n );\n },\n [onResourceLinkClick, renderResourceLink, styles.resourceLink],\n );\n\n // 自定义 a 标签渲染:资源协议渲染为标签,文件链接渲染为 FileGallery,其余保持普通链接。\n const LinkComponent = React.useCallback(\n (props: ComponentProps) => {\n const href = String((props.href as string) || \"\");\n // 用递归提取纯文本,避免 children 是 React node 时 String() 得到 \"[object Object]\"\n const linkText = extractText(props.children);\n const resourceLink = parseMarkdownResourceHref(href, linkText);\n\n if (resourceLink) {\n const customNode = renderResourceLink?.(resourceLink);\n if (customNode) return customNode;\n\n return (\n <button\n type=\"button\"\n className={styles.resourceLink}\n onClick={() => onResourceLinkClick?.(resourceLink)}\n aria-label={resourceLink.label}\n >\n {resourceLink.label}\n </button>\n );\n }\n\n // 先识别 name(链接文字),再识别 url(href)\n const ext = extractExt(linkText) || extractExt(href);\n\n if (ext) {\n // href 为空说明链接还在流式截断中,不渲染,避免显示出错误文字\n if (!href) return null;\n const mimeType = MIME_MAP[ext] || \"\";\n const fileItem: FileItem = {\n displayName: linkText || href,\n mimeType,\n fileUri: href,\n };\n return (\n <FileGallery\n file={fileItem}\n onClick={onFileClick ? () => onFileClick(fileItem) : undefined}\n />\n );\n }\n\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {props.children as React.ReactNode}\n </a>\n );\n },\n [onFileClick, onResourceLinkClick, renderResourceLink, styles.resourceLink],\n );\n\n return (\n <div\n className={`${styles.markdownWrapper}${compact ? ` ${styles.markdownWrapperCompact}` : \"\"}`}\n >\n <div\n className={`${styles.markdownHost}${compact ? ` ${styles.markdownHostCompact}` : \"\"}`}\n >\n <XMarkdown\n content={markdown}\n className=\"x-markdown-light\"\n paragraphTag=\"div\"\n config={{\n extensions: Latex(),\n }}\n components={{\n tag: ThinkComponent,\n \"resource-link\": ResourceLinkComponent,\n code: CodeComponent,\n a: LinkComponent,\n }}\n streaming={{\n enableAnimation: true,\n animationConfig: {\n fadeDuration: 400,\n },\n }}\n />\n </div>\n </div>\n );\n};\n\nexport default MarkdownRender;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["React", "FileGallery", "XMarkdown", "Latex"]
|
|
7
7
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
export declare const useStyles: () => {
|
|
2
2
|
markdownWrapper: string;
|
|
3
|
+
markdownWrapperCompact: string;
|
|
3
4
|
markdownHost: string;
|
|
5
|
+
markdownHostCompact: string;
|
|
6
|
+
resourceLink: string;
|
|
4
7
|
} & {
|
|
5
8
|
w: (width: string | number) => string;
|
|
6
9
|
h: (height: string | number) => string;
|
|
@@ -32,6 +32,11 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
32
32
|
max-width: 100%; /* 自定义最大宽度 */
|
|
33
33
|
margin: 0 auto;
|
|
34
34
|
`,
|
|
35
|
+
markdownWrapperCompact: import_css.css`
|
|
36
|
+
display: inline;
|
|
37
|
+
margin: 0;
|
|
38
|
+
max-width: none;
|
|
39
|
+
`,
|
|
35
40
|
markdownHost: import_css.css`
|
|
36
41
|
container-type: inline-size;
|
|
37
42
|
width: 100%;
|
|
@@ -109,6 +114,40 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
109
114
|
max-width: 100%;
|
|
110
115
|
border-radius: 6px;
|
|
111
116
|
}
|
|
117
|
+
`,
|
|
118
|
+
markdownHostCompact: import_css.css`
|
|
119
|
+
display: inline;
|
|
120
|
+
width: auto;
|
|
121
|
+
overflow: visible;
|
|
122
|
+
|
|
123
|
+
.x-markdown-light,
|
|
124
|
+
p,
|
|
125
|
+
div {
|
|
126
|
+
display: inline;
|
|
127
|
+
margin: 0;
|
|
128
|
+
line-height: inherit;
|
|
129
|
+
}
|
|
130
|
+
`,
|
|
131
|
+
resourceLink: import_css.css`
|
|
132
|
+
display: inline-flex;
|
|
133
|
+
align-items: center;
|
|
134
|
+
max-width: 100%;
|
|
135
|
+
height: 22px;
|
|
136
|
+
margin: 0 2px;
|
|
137
|
+
padding: 0 8px;
|
|
138
|
+
border: 1px solid #d9e8ff;
|
|
139
|
+
border-radius: 6px;
|
|
140
|
+
background: #f5f9ff;
|
|
141
|
+
color: #1f1f1f;
|
|
142
|
+
font-size: 13px;
|
|
143
|
+
line-height: 20px;
|
|
144
|
+
vertical-align: baseline;
|
|
145
|
+
cursor: pointer;
|
|
146
|
+
|
|
147
|
+
&:hover {
|
|
148
|
+
border-color: #91caff;
|
|
149
|
+
background: #eaf3ff;
|
|
150
|
+
}
|
|
112
151
|
`
|
|
113
152
|
}));
|
|
114
153
|
var styles_default = useStyles;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/styles.tsx"],
|
|
4
|
-
"sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n markdownWrapper: css`\n display: grid;\n grid-template-columns: minmax(0, 1fr); /* 关键:允许内容收缩 */\n max-width: 100%; /* 自定义最大宽度 */\n margin: 0 auto;\n `,\n\n markdownHost: css`\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown 基础排版 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n li {\n margin: 0 0 4px 0 !important;\n }\n\n u {\n text-decoration: underline;\n }\n\n em {\n font-style: italic;\n }\n\n /* ===== Table 样式 ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== 图片 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n `,\n}));\n\nexport default useStyles;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAoB;AACpB,oBAAgC;AAEzB,IAAM,gBAAY,+BAAgB,OAAO;AAAA,EAC9C,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n markdownWrapper: css`\n display: grid;\n grid-template-columns: minmax(0, 1fr); /* 关键:允许内容收缩 */\n max-width: 100%; /* 自定义最大宽度 */\n margin: 0 auto;\n `,\n\n markdownWrapperCompact: css`\n display: inline;\n margin: 0;\n max-width: none;\n `,\n\n markdownHost: css`\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown 基础排版 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n li {\n margin: 0 0 4px 0 !important;\n }\n\n u {\n text-decoration: underline;\n }\n\n em {\n font-style: italic;\n }\n\n /* ===== Table 样式 ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== 图片 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n `,\n\n markdownHostCompact: css`\n display: inline;\n width: auto;\n overflow: visible;\n\n .x-markdown-light,\n p,\n div {\n display: inline;\n margin: 0;\n line-height: inherit;\n }\n `,\n\n resourceLink: css`\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n height: 22px;\n margin: 0 2px;\n padding: 0 8px;\n border: 1px solid #d9e8ff;\n border-radius: 6px;\n background: #f5f9ff;\n color: #1f1f1f;\n font-size: 13px;\n line-height: 20px;\n vertical-align: baseline;\n cursor: pointer;\n\n &:hover {\n border-color: #91caff;\n background: #eaf3ff;\n }\n `,\n}));\n\nexport default useStyles;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAoB;AACpB,oBAAgC;AAEzB,IAAM,gBAAY,+BAAgB,OAAO;AAAA,EAC9C,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+Ed,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcrB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBhB,EAAE;AAEF,IAAO,iBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -73,6 +73,8 @@ var XAdkChatbot = (0, import_react.forwardRef)(
|
|
|
73
73
|
initialized = true,
|
|
74
74
|
sessionId,
|
|
75
75
|
onFileClick,
|
|
76
|
+
onResourceLinkClick,
|
|
77
|
+
renderResourceLink,
|
|
76
78
|
renderFunctionCall,
|
|
77
79
|
toolKindResolver,
|
|
78
80
|
strategies,
|
|
@@ -254,7 +256,9 @@ var XAdkChatbot = (0, import_react.forwardRef)(
|
|
|
254
256
|
import_MarkdownRender.default,
|
|
255
257
|
{
|
|
256
258
|
text: msg.text,
|
|
257
|
-
onFileClick
|
|
259
|
+
onFileClick,
|
|
260
|
+
onResourceLinkClick,
|
|
261
|
+
renderResourceLink
|
|
258
262
|
},
|
|
259
263
|
`${msg.id}-${i}`
|
|
260
264
|
);
|
|
@@ -407,7 +411,9 @@ var XAdkChatbot = (0, import_react.forwardRef)(
|
|
|
407
411
|
import_MarkdownRender.default,
|
|
408
412
|
{
|
|
409
413
|
text: node.content,
|
|
410
|
-
onFileClick
|
|
414
|
+
onFileClick,
|
|
415
|
+
onResourceLinkClick,
|
|
416
|
+
renderResourceLink
|
|
411
417
|
}
|
|
412
418
|
) }, node.key);
|
|
413
419
|
}),
|
|
@@ -469,6 +475,8 @@ var XAdkChatbot = (0, import_react.forwardRef)(
|
|
|
469
475
|
actions,
|
|
470
476
|
actionsExtra,
|
|
471
477
|
onFileClick,
|
|
478
|
+
onResourceLinkClick,
|
|
479
|
+
renderResourceLink,
|
|
472
480
|
styles,
|
|
473
481
|
resolveToolKind,
|
|
474
482
|
mergedStrategies
|
|
@@ -487,10 +495,24 @@ var XAdkChatbot = (0, import_react.forwardRef)(
|
|
|
487
495
|
},
|
|
488
496
|
index
|
|
489
497
|
)) }),
|
|
490
|
-
m.text && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.card, children:
|
|
498
|
+
m.text && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.card, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
499
|
+
import_MarkdownRender.default,
|
|
500
|
+
{
|
|
501
|
+
text: m.text,
|
|
502
|
+
compact: true,
|
|
503
|
+
onFileClick,
|
|
504
|
+
onResourceLinkClick,
|
|
505
|
+
renderResourceLink
|
|
506
|
+
}
|
|
507
|
+
) })
|
|
491
508
|
] }, m.id || i)) }, group.id);
|
|
492
509
|
},
|
|
493
|
-
[
|
|
510
|
+
[
|
|
511
|
+
styles,
|
|
512
|
+
onFileClick,
|
|
513
|
+
onResourceLinkClick,
|
|
514
|
+
renderResourceLink
|
|
515
|
+
]
|
|
494
516
|
);
|
|
495
517
|
const renderSuggestions = () => {
|
|
496
518
|
if (!suggestions || suggestions.length === 0)
|
|
@@ -521,7 +543,15 @@ var XAdkChatbot = (0, import_react.forwardRef)(
|
|
|
521
543
|
const isEmpty = messages.length === 0 && !prologue && (!suggestions || suggestions.length === 0);
|
|
522
544
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_clsx.default)(styles.wrapper, className), style, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.list, ref: listRef, children: [
|
|
523
545
|
isEmpty && empty && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.emptyWrapper, children: typeof empty === "function" ? empty() : empty }),
|
|
524
|
-
prologue && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.prologue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
546
|
+
prologue && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.prologue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
547
|
+
import_MarkdownRender.default,
|
|
548
|
+
{
|
|
549
|
+
text: prologue,
|
|
550
|
+
onFileClick,
|
|
551
|
+
onResourceLinkClick,
|
|
552
|
+
renderResourceLink
|
|
553
|
+
}
|
|
554
|
+
) }),
|
|
525
555
|
chatGroups.map(
|
|
526
556
|
(group, idx) => group.role === "user" ? renderUserGroup(group) : renderBotGroup(
|
|
527
557
|
group,
|