@ai-group/chat-sdk 3.0.4 → 3.0.5
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/FileGallery.stories.d.ts +6 -0
- package/dist/cjs/components/FileGallery/FileGallery.stories.js +143 -0
- package/dist/cjs/components/FileGallery/FileGallery.stories.js.map +7 -0
- package/dist/cjs/components/FileGallery/index.d.ts +13 -12
- package/dist/cjs/components/FileGallery/index.js +165 -159
- package/dist/cjs/components/FileGallery/index.js.map +2 -2
- package/dist/cjs/components/FileGallery/styles.js +5 -0
- package/dist/cjs/components/FileGallery/styles.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/XAdkChatbot.stories.js +18 -9
- package/dist/cjs/components/XAdkChatbot/XAdkChatbot.stories.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +11 -3
- package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/styles.d.ts +1 -0
- package/dist/cjs/components/XAdkChatbot/styles.js +7 -0
- package/dist/cjs/components/XAdkChatbot/styles.js.map +2 -2
- package/dist/cjs/components/XAdkSender/index.js +9 -1
- package/dist/cjs/components/XAdkSender/index.js.map +2 -2
- package/dist/cjs/types/FileGallery.d.ts +1 -21
- package/dist/cjs/types/FileGallery.js.map +1 -1
- package/dist/cjs/types/XAdkSender.js.map +1 -1
- package/dist/esm/components/FileGallery/FileGallery.stories.d.ts +6 -0
- package/dist/esm/components/FileGallery/FileGallery.stories.js +48 -0
- package/dist/esm/components/FileGallery/FileGallery.stories.js.map +1 -0
- package/dist/esm/components/FileGallery/index.d.ts +13 -12
- package/dist/esm/components/FileGallery/index.js +48 -69
- package/dist/esm/components/FileGallery/index.js.map +1 -1
- package/dist/esm/components/FileGallery/styles.js +1 -1
- package/dist/esm/components/FileGallery/styles.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.js +17 -13
- package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.js +23 -6
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/styles.d.ts +1 -0
- package/dist/esm/components/XAdkChatbot/styles.js +21 -20
- package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
- package/dist/esm/components/XAdkSender/index.js +14 -4
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/types/FileGallery.d.ts +1 -21
- package/dist/esm/types/FileGallery.js.map +1 -1
- package/dist/esm/types/XAdkSender.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ export var useStyles = withBasicStyles(function () {
|
|
|
6
6
|
return {
|
|
7
7
|
container: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\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 "]))),
|
|
8
8
|
fileList: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n "]))),
|
|
9
|
-
fileCard: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\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 "]))),
|
|
9
|
+
fileCard: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\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 \u65F6\u56FE\u6807\u5728\u53F3\u4FA7 */\n &.align-right {\n flex-direction: row-reverse;\n }\n "]))),
|
|
10
10
|
imageThumbnail: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\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 "]))),
|
|
11
11
|
imageOverlay: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\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 "]))),
|
|
12
12
|
fileIcon: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\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 "]))),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","fileList","_templateObject2","fileCard","_templateObject3","imageThumbnail","_templateObject4","imageOverlay","_templateObject5","fileIcon","_templateObject6","fileInfo","_templateObject7","fileName","_templateObject8","fileSize","_templateObject9","progress","_templateObject10","fileRemoveBtn","_templateObject11","fileLink","_templateObject12","mediaWrapper","_templateObject13"],"sources":["../../../../src/components/FileGallery/styles.tsx"],"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 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\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 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 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 fileSize: css`\n font-size: 11px;\n color: #8c8c8c;\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 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 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}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,+JASb;IAEDC,QAAQ,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,qEAIZ;IAEDG,QAAQ,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,
|
|
1
|
+
{"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","fileList","_templateObject2","fileCard","_templateObject3","imageThumbnail","_templateObject4","imageOverlay","_templateObject5","fileIcon","_templateObject6","fileInfo","_templateObject7","fileName","_templateObject8","fileSize","_templateObject9","progress","_templateObject10","fileRemoveBtn","_templateObject11","fileLink","_templateObject12","mediaWrapper","_templateObject13"],"sources":["../../../../src/components/FileGallery/styles.tsx"],"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 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 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 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 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 fileSize: css`\n font-size: 11px;\n color: #8c8c8c;\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 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 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}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,+JASb;IAEDC,QAAQ,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,qEAIZ;IAEDG,QAAQ,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,mgBAuBZ;IAEDK,cAAc,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,4iBAwBlB;IAEDO,YAAY,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,mOAWhB;IAEDS,QAAQ,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,wKAQZ;IAEDW,QAAQ,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,oEAIZ;IAEDa,QAAQ,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,sLAQZ;IAEDe,QAAQ,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,uDAGZ;IAEDiB,QAAQ,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,qKAUZ;IAEDmB,aAAa,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,mjBA4BjB;IAEDqB,QAAQ,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,2MAWZ;IAEDuB,YAAY,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA;EAGnB,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
2
|
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
3
3
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
4
|
-
import React, { useState } from "react";
|
|
4
|
+
import React, { useEffect, useState } from "react";
|
|
5
5
|
import { Button, Space } from "antd";
|
|
6
6
|
import XAdkChatbot from "./index";
|
|
7
7
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
@@ -64,13 +64,20 @@ export var 基础用法 = {
|
|
|
64
64
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
65
65
|
loading = _useState4[0],
|
|
66
66
|
setLoading = _useState4[1];
|
|
67
|
-
|
|
68
|
-
var text = _ref.text;
|
|
69
|
-
if (!(text !== null && text !== void 0 && text.trim())) return;
|
|
67
|
+
useEffect(function () {
|
|
70
68
|
var userMsg = {
|
|
71
69
|
id: Date.now().toString(),
|
|
72
70
|
role: "user",
|
|
73
|
-
text:
|
|
71
|
+
text: "你好",
|
|
72
|
+
fileData: [{
|
|
73
|
+
displayName: "06f26c566fe4a3b5eaad678d0d270c97_origin.jpg",
|
|
74
|
+
fileUri: "https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285",
|
|
75
|
+
mimeType: "image/jpeg"
|
|
76
|
+
}, {
|
|
77
|
+
displayName: "06f26c566fe4a3b5eaad678d0d270c98_origin.jpg",
|
|
78
|
+
fileUri: "https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285",
|
|
79
|
+
mimeType: "image/jpeg"
|
|
80
|
+
}]
|
|
74
81
|
};
|
|
75
82
|
setMessages(function (prev) {
|
|
76
83
|
return [].concat(_toConsumableArray(prev), [userMsg]);
|
|
@@ -80,7 +87,7 @@ export var 基础用法 = {
|
|
|
80
87
|
var botMsg = {
|
|
81
88
|
id: (Date.now() + 1).toString(),
|
|
82
89
|
role: "bot",
|
|
83
|
-
text: "\u8FD9\u662F\u5BF9 \"
|
|
90
|
+
text: "\u8FD9\u662F\u5BF9 \"\u7528\u6237\" \u7684\u6A21\u62DF\u56DE\u590D\u3002",
|
|
84
91
|
invocationId: "inv-".concat(Date.now())
|
|
85
92
|
};
|
|
86
93
|
setMessages(function (prev) {
|
|
@@ -88,11 +95,12 @@ export var 基础用法 = {
|
|
|
88
95
|
});
|
|
89
96
|
setLoading(false);
|
|
90
97
|
}, 1000);
|
|
91
|
-
};
|
|
98
|
+
}, []);
|
|
92
99
|
return /*#__PURE__*/_jsx("div", {
|
|
93
100
|
style: {
|
|
94
101
|
width: 700,
|
|
95
102
|
height: "600px",
|
|
103
|
+
padding: "20px",
|
|
96
104
|
border: "1px solid #f0f0f0",
|
|
97
105
|
borderRadius: "8px",
|
|
98
106
|
overflow: "hidden"
|
|
@@ -101,12 +109,8 @@ export var 基础用法 = {
|
|
|
101
109
|
messages: messages,
|
|
102
110
|
loading: loading,
|
|
103
111
|
initialized: true,
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
return setLoading(false);
|
|
107
|
-
},
|
|
108
|
-
onClear: function onClear() {
|
|
109
|
-
return setMessages([]);
|
|
112
|
+
style: {
|
|
113
|
+
width: "670px"
|
|
110
114
|
}
|
|
111
115
|
})
|
|
112
116
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useState","Button","Space","XAdkChatbot","jsx","_jsx","jsxs","_jsxs","meta","title","component","parameters","layout","docs","description","tags","argTypes","loading","control","showFnCallDetail","mockMessages","id","role","text","invocationId","基础用法","render","_useState","_useState2","_slicedToArray","messages","setMessages","_useState3","_useState4","setLoading","handleSubmit","_ref","trim","userMsg","Date","now","toString","prev","concat","_toConsumableArray","setTimeout","botMsg","style","width","height","border","borderRadius","overflow","children","initialized","onSubmit","onStop","onClear","开场白和建议","_useState5","_useState6","_useState7","_useState8","suggestions","setSuggestions","prologue","handleSuggest","onSuggest","流式输出","_useState9","_useState10","_useState11","_useState12","handleStart","fullText","currentText","index","interval","setInterval","length","newMessages","_objectSpread","clearInterval","marginBottom","type","onClick","disabled","自定义Footer","_useState13","_useState14","_useState15","Set","_useState16","likedMessages","setLikedMessages","handleLike","messageId","newSet","has","delete","add","customFooter","data","message","isLastBotMsg","isLiked","padding","size","actions","函数调用","messagesWithFunctionCall","functionCall","name","args","city","date","思维链","messagesWithThought","thought","代码高亮","messagesWithCode","多轮对话","multiRoundMessages"],"sources":["../../../../src/components/XAdkChatbot/XAdkChatbot.stories.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\nimport { Button, Space } from \"antd\";\nimport XAdkChatbot from \"./index\";\nimport type { IMessage } from \"@/types\";\n\nconst meta: Meta<typeof XAdkChatbot> = {\n title: \"AI组件/XAdkChatbot 聊天消息组件\",\n component: XAdkChatbot,\n parameters: {\n layout: \"padded\",\n docs: {\n description: {\n component: `\n\n独立的聊天消息显示组件,用于渲染消息列表和建议问题。\n\n## 核心功能\n\n- 📝 **消息渲染**: 支持文本、Markdown、代码块、函数调用等\n- 💭 **思维链**: 支持显示 AI 推理过程\n- 🎯 **建议问题**: 显示和点击建议问题\n- 📌 **开场白**: 支持显示欢迎消息\n- 🔄 **加载状态**: 实时显示 AI 生成状态\n- 🎨 **自定义渲染**: 支持自定义消息底部内容\n\n## Props\n\n| 属性 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| messages | IMessage[] | [] | 消息列表 |\n| loading | boolean | false | 是否正在加载 |\n| prologue | string | - | 开场白 |\n| suggestions | string[] | [] | 建议问题 |\n| showFnCallDetail | boolean | false | 显示函数调用详情 |\n| footer | (msg) => ReactNode | - | 自定义消息底部 |\n| onSubmit | (content) => void | - | 发送消息回调 |\n| onStop | () => void | - | 停止生成回调 |\n| onClear | () => void | - | 清空消息回调 |\n| onSuggest | (text) => void | - | 点击建议回调 |\n| onConfirm | (fnCall, confirmed) => void | - | 确认函数调用 |\n `,\n },\n },\n },\n tags: [\"autodocs\"],\n argTypes: {\n loading: {\n description: \"是否正在加载(AI 生成中)\",\n control: \"boolean\",\n },\n showFnCallDetail: {\n description: \"是否显示函数调用详情\",\n control: \"boolean\",\n },\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// Mock 消息数据\nconst mockMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"你好\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"你好!我是 AI 助手,很高兴为你服务。有什么我可以帮助你的吗?\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"介绍一下 React Hooks\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: `React Hooks 是 React 16.8 引入的新特性,它让你在不编写 class 的情况下使用 state 和其他 React 特性。\n\n## 常用的 Hooks\n\n### 1. useState\n用于在函数组件中添加状态:\n\n\\`\\`\\`jsx\nconst [count, setCount] = useState(0);\n\\`\\`\\`\n\n### 2. useEffect\n用于处理副作用:\n\n\\`\\`\\`jsx\nuseEffect(() => {\n document.title = \\`Count: \\${count}\\`;\n}, [count]);\n\\`\\`\\`\n\n### 3. useContext\n用于访问 Context:\n\n\\`\\`\\`jsx\nconst theme = useContext(ThemeContext);\n\\`\\`\\`\n\n## 优势\n\n- ✅ 代码更简洁\n- ✅ 逻辑复用更容易\n- ✅ 避免 this 相关问题\n- ✅ 更好的代码组织`,\n invocationId: \"inv-2\",\n },\n];\n\n// ============================================\n// 示例 1: 基础用法\n// ============================================\nexport const 基础用法: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>(mockMessages);\n const [loading, setLoading] = useState(false);\n\n const handleSubmit = ({ text }: any) => {\n if (!text?.trim()) return;\n\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text,\n };\n setMessages((prev) => [...prev, userMsg]);\n\n setLoading(true);\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"${text}\" 的模拟回复。`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n setLoading(false);\n }, 1000);\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n onSubmit={handleSubmit}\n onStop={() => setLoading(false)}\n onClear={() => setMessages([])}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 2: 开场白和建议问题\n// ============================================\nexport const 开场白和建议: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([]);\n const [suggestions, setSuggestions] = useState([\n \"什么是 React Hooks?\",\n \"如何使用 useState?\",\n \"useEffect 的作用是什么?\",\n ]);\n\n const prologue = \"你好!我是 AI 助手,专注于 React 开发相关的问题。\";\n\n const handleSuggest = (text: string) => {\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text,\n };\n setMessages([userMsg]);\n setSuggestions([]);\n\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"${text}\" 的回答...`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n }, 1000);\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n prologue={prologue}\n suggestions={suggestions}\n onSuggest={handleSuggest}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 3: 流式输出\n// ============================================\nexport const 流式输出: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([\n {\n id: \"1\",\n role: \"user\",\n text: \"给我讲一个故事\",\n },\n ]);\n const [loading, setLoading] = useState(false);\n\n const handleStart = () => {\n setLoading(true);\n\n const fullText =\n \"从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事。讲什么呢?从前有座山,山里有座庙...\";\n let currentText = \"\";\n let index = 0;\n\n const botMsg: IMessage = {\n id: \"2\",\n role: \"bot\",\n text: \"\",\n invocationId: \"inv-1\",\n };\n\n setMessages((prev) => [...prev, botMsg]);\n\n const interval = setInterval(() => {\n if (index < fullText.length) {\n currentText += fullText[index];\n setMessages((prev) => {\n const newMessages = [...prev];\n newMessages[newMessages.length - 1] = {\n ...botMsg,\n text: currentText,\n };\n return newMessages;\n });\n index++;\n } else {\n clearInterval(interval);\n setLoading(false);\n }\n }, 50);\n };\n\n return (\n <div style={{ width: 700 }}>\n <div style={{ marginBottom: \"16px\" }}>\n <Button type=\"primary\" onClick={handleStart} disabled={loading}>\n 开始流式输出演示\n </Button>\n </div>\n <div\n style={{\n height: \"550px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n onStop={() => setLoading(false)}\n />\n </div>\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 4: 自定义消息 Footer\n// ============================================\nexport const 自定义Footer: Story = {\n render: () => {\n const [messages] = useState<IMessage[]>(mockMessages);\n const [likedMessages, setLikedMessages] = useState<Set<string>>(new Set());\n\n const handleLike = (messageId: string) => {\n setLikedMessages((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(messageId)) {\n newSet.delete(messageId);\n } else {\n newSet.add(messageId);\n }\n return newSet;\n });\n };\n\n const customFooter = (data: any) => {\n const { message, isLastBotMsg } = data;\n\n if (!isLastBotMsg) return null;\n\n const isLiked = likedMessages.has(message.id);\n\n return (\n <div style={{ padding: \"8px 0\" }}>\n <Space size=\"small\">\n <Button\n size=\"small\"\n type={isLiked ? \"primary\" : \"text\"}\n onClick={() => handleLike(message.id)}\n >\n {isLiked ? \"👍 已赞\" : \"👍 赞\"}\n </Button>\n <Button size=\"small\" type=\"text\">\n 👎 踩\n </Button>\n <Button size=\"small\" type=\"text\">\n 📋 复制\n </Button>\n <Button size=\"small\" type=\"text\">\n 🔄 重新生成\n </Button>\n </Space>\n </div>\n );\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n actions={customFooter}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 5: 函数调用\n// ============================================\nexport const 函数调用: Story = {\n render: () => {\n const messagesWithFunctionCall: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"今天北京的天气怎么样?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n functionCall: {\n id: \"call-1\",\n name: \"get_weather\",\n args: {\n city: \"北京\",\n date: \"2024-03-05\",\n },\n },\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"根据天气查询,今天北京的天气是晴天,温度 15-25°C,空气质量良好,适合户外活动。\",\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithFunctionCall}\n loading={false}\n initialized={true}\n showFnCallDetail={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 6: 思维链\n// ============================================\nexport const 思维链: Story = {\n render: () => {\n const messagesWithThought: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"帮我分析一下这个问题\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"让我分析一下这个问题...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"首先,我需要理解问题的核心...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"根据分析,我的结论是...(这是最终回答)\",\n thought: false,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithThought}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 7: 代码高亮\n// ============================================\nexport const 代码高亮: Story = {\n render: () => {\n const messagesWithCode: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"写一个 React 组件\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: `这是一个简单的 React 计数器组件:\n\n\\`\\`\\`jsx\nimport React, { useState } from 'react';\n\nfunction Counter() {\n const [count, setCount] = useState(0);\n\n return (\n <div>\n <h1>Count: {count}</h1>\n <button onClick={() => setCount(count + 1)}>\n +1\n </button>\n <button onClick={() => setCount(count - 1)}>\n -1\n </button>\n </div>\n );\n}\n\nexport default Counter;\n\\`\\`\\`\n\n这个组件使用了 \\`useState\\` Hook 来管理计数器状态。`,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithCode}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 8: 多轮对话\n// ============================================\nexport const 多轮对话: Story = {\n render: () => {\n const multiRoundMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"React 是什么?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"React 是一个用于构建用户界面的 JavaScript 库。\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"它有什么特点?\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"React 的主要特点包括:\\n1. 组件化\\n2. 虚拟 DOM\\n3. 单向数据流\\n4. JSX 语法\",\n invocationId: \"inv-2\",\n },\n {\n id: \"5\",\n role: \"user\",\n text: \"什么是虚拟 DOM?\",\n },\n {\n id: \"6\",\n role: \"bot\",\n text: \"虚拟 DOM 是真实 DOM 的 JavaScript 对象表示,React 通过对比虚拟 DOM 的变化来高效更新真实 DOM。\",\n invocationId: \"inv-3\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={multiRoundMessages}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["React","useEffect","useState","Button","Space","XAdkChatbot","jsx","_jsx","jsxs","_jsxs","meta","title","component","parameters","layout","docs","description","tags","argTypes","loading","control","showFnCallDetail","mockMessages","id","role","text","invocationId","基础用法","render","_useState","_useState2","_slicedToArray","messages","setMessages","_useState3","_useState4","setLoading","userMsg","Date","now","toString","fileData","displayName","fileUri","mimeType","prev","concat","_toConsumableArray","setTimeout","botMsg","style","width","height","padding","border","borderRadius","overflow","children","initialized","开场白和建议","_useState5","_useState6","_useState7","_useState8","suggestions","setSuggestions","prologue","handleSuggest","onSuggest","流式输出","_useState9","_useState10","_useState11","_useState12","handleStart","fullText","currentText","index","interval","setInterval","length","newMessages","_objectSpread","clearInterval","marginBottom","type","onClick","disabled","onStop","自定义Footer","_useState13","_useState14","_useState15","Set","_useState16","likedMessages","setLikedMessages","handleLike","messageId","newSet","has","delete","add","customFooter","data","message","isLastBotMsg","isLiked","size","actions","函数调用","messagesWithFunctionCall","functionCall","name","args","city","date","思维链","messagesWithThought","thought","代码高亮","messagesWithCode","多轮对话","multiRoundMessages"],"sources":["../../../../src/components/XAdkChatbot/XAdkChatbot.stories.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\nimport { Button, Space } from \"antd\";\nimport XAdkChatbot from \"./index\";\nimport type { IMessage } from \"@/types\";\n\nconst meta: Meta<typeof XAdkChatbot> = {\n title: \"AI组件/XAdkChatbot 聊天消息组件\",\n component: XAdkChatbot,\n parameters: {\n layout: \"padded\",\n docs: {\n description: {\n component: `\n\n独立的聊天消息显示组件,用于渲染消息列表和建议问题。\n\n## 核心功能\n\n- 📝 **消息渲染**: 支持文本、Markdown、代码块、函数调用等\n- 💭 **思维链**: 支持显示 AI 推理过程\n- 🎯 **建议问题**: 显示和点击建议问题\n- 📌 **开场白**: 支持显示欢迎消息\n- 🔄 **加载状态**: 实时显示 AI 生成状态\n- 🎨 **自定义渲染**: 支持自定义消息底部内容\n\n## Props\n\n| 属性 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| messages | IMessage[] | [] | 消息列表 |\n| loading | boolean | false | 是否正在加载 |\n| prologue | string | - | 开场白 |\n| suggestions | string[] | [] | 建议问题 |\n| showFnCallDetail | boolean | false | 显示函数调用详情 |\n| footer | (msg) => ReactNode | - | 自定义消息底部 |\n| onSubmit | (content) => void | - | 发送消息回调 |\n| onStop | () => void | - | 停止生成回调 |\n| onClear | () => void | - | 清空消息回调 |\n| onSuggest | (text) => void | - | 点击建议回调 |\n| onConfirm | (fnCall, confirmed) => void | - | 确认函数调用 |\n `,\n },\n },\n },\n tags: [\"autodocs\"],\n argTypes: {\n loading: {\n description: \"是否正在加载(AI 生成中)\",\n control: \"boolean\",\n },\n showFnCallDetail: {\n description: \"是否显示函数调用详情\",\n control: \"boolean\",\n },\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// Mock 消息数据\nconst mockMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"你好\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"你好!我是 AI 助手,很高兴为你服务。有什么我可以帮助你的吗?\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"介绍一下 React Hooks\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: `React Hooks 是 React 16.8 引入的新特性,它让你在不编写 class 的情况下使用 state 和其他 React 特性。\n\n## 常用的 Hooks\n\n### 1. useState\n用于在函数组件中添加状态:\n\n\\`\\`\\`jsx\nconst [count, setCount] = useState(0);\n\\`\\`\\`\n\n### 2. useEffect\n用于处理副作用:\n\n\\`\\`\\`jsx\nuseEffect(() => {\n document.title = \\`Count: \\${count}\\`;\n}, [count]);\n\\`\\`\\`\n\n### 3. useContext\n用于访问 Context:\n\n\\`\\`\\`jsx\nconst theme = useContext(ThemeContext);\n\\`\\`\\`\n\n## 优势\n\n- ✅ 代码更简洁\n- ✅ 逻辑复用更容易\n- ✅ 避免 this 相关问题\n- ✅ 更好的代码组织`,\n invocationId: \"inv-2\",\n },\n];\n\n// ============================================\n// 示例 1: 基础用法\n// ============================================\nexport const 基础用法: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>(mockMessages);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text: \"你好\",\n fileData: [\n {\n displayName: \"06f26c566fe4a3b5eaad678d0d270c97_origin.jpg\",\n fileUri:\n \"https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285\",\n mimeType: \"image/jpeg\",\n },\n {\n displayName: \"06f26c566fe4a3b5eaad678d0d270c98_origin.jpg\",\n fileUri:\n \"https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285\",\n mimeType: \"image/jpeg\",\n },\n ],\n };\n setMessages((prev) => [...prev, userMsg]);\n\n setLoading(true);\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"用户\" 的模拟回复。`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n setLoading(false);\n }, 1000);\n }, []);\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n padding: \"20px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n style={{ width: \"670px\" }}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 2: 开场白和建议问题\n// ============================================\nexport const 开场白和建议: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([]);\n const [suggestions, setSuggestions] = useState([\n \"什么是 React Hooks?\",\n \"如何使用 useState?\",\n \"useEffect 的作用是什么?\",\n ]);\n\n const prologue = \"你好!我是 AI 助手,专注于 React 开发相关的问题。\";\n\n const handleSuggest = (text: string) => {\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text,\n };\n setMessages([userMsg]);\n setSuggestions([]);\n\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"${text}\" 的回答...`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n }, 1000);\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n prologue={prologue}\n suggestions={suggestions}\n onSuggest={handleSuggest}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 3: 流式输出\n// ============================================\nexport const 流式输出: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([\n {\n id: \"1\",\n role: \"user\",\n text: \"给我讲一个故事\",\n },\n ]);\n const [loading, setLoading] = useState(false);\n\n const handleStart = () => {\n setLoading(true);\n\n const fullText =\n \"从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事。讲什么呢?从前有座山,山里有座庙...\";\n let currentText = \"\";\n let index = 0;\n\n const botMsg: IMessage = {\n id: \"2\",\n role: \"bot\",\n text: \"\",\n invocationId: \"inv-1\",\n };\n\n setMessages((prev) => [...prev, botMsg]);\n\n const interval = setInterval(() => {\n if (index < fullText.length) {\n currentText += fullText[index];\n setMessages((prev) => {\n const newMessages = [...prev];\n newMessages[newMessages.length - 1] = {\n ...botMsg,\n text: currentText,\n };\n return newMessages;\n });\n index++;\n } else {\n clearInterval(interval);\n setLoading(false);\n }\n }, 50);\n };\n\n return (\n <div style={{ width: 700 }}>\n <div style={{ marginBottom: \"16px\" }}>\n <Button type=\"primary\" onClick={handleStart} disabled={loading}>\n 开始流式输出演示\n </Button>\n </div>\n <div\n style={{\n height: \"550px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n onStop={() => setLoading(false)}\n />\n </div>\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 4: 自定义消息 Footer\n// ============================================\nexport const 自定义Footer: Story = {\n render: () => {\n const [messages] = useState<IMessage[]>(mockMessages);\n const [likedMessages, setLikedMessages] = useState<Set<string>>(new Set());\n\n const handleLike = (messageId: string) => {\n setLikedMessages((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(messageId)) {\n newSet.delete(messageId);\n } else {\n newSet.add(messageId);\n }\n return newSet;\n });\n };\n\n const customFooter = (data: any) => {\n const { message, isLastBotMsg } = data;\n\n if (!isLastBotMsg) return null;\n\n const isLiked = likedMessages.has(message.id);\n\n return (\n <div style={{ padding: \"8px 0\" }}>\n <Space size=\"small\">\n <Button\n size=\"small\"\n type={isLiked ? \"primary\" : \"text\"}\n onClick={() => handleLike(message.id)}\n >\n {isLiked ? \"👍 已赞\" : \"👍 赞\"}\n </Button>\n <Button size=\"small\" type=\"text\">\n 👎 踩\n </Button>\n <Button size=\"small\" type=\"text\">\n 📋 复制\n </Button>\n <Button size=\"small\" type=\"text\">\n 🔄 重新生成\n </Button>\n </Space>\n </div>\n );\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n actions={customFooter}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 5: 函数调用\n// ============================================\nexport const 函数调用: Story = {\n render: () => {\n const messagesWithFunctionCall: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"今天北京的天气怎么样?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n functionCall: {\n id: \"call-1\",\n name: \"get_weather\",\n args: {\n city: \"北京\",\n date: \"2024-03-05\",\n },\n },\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"根据天气查询,今天北京的天气是晴天,温度 15-25°C,空气质量良好,适合户外活动。\",\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithFunctionCall}\n loading={false}\n initialized={true}\n showFnCallDetail={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 6: 思维链\n// ============================================\nexport const 思维链: Story = {\n render: () => {\n const messagesWithThought: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"帮我分析一下这个问题\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"让我分析一下这个问题...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"首先,我需要理解问题的核心...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"根据分析,我的结论是...(这是最终回答)\",\n thought: false,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithThought}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 7: 代码高亮\n// ============================================\nexport const 代码高亮: Story = {\n render: () => {\n const messagesWithCode: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"写一个 React 组件\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: `这是一个简单的 React 计数器组件:\n\n\\`\\`\\`jsx\nimport React, { useState } from 'react';\n\nfunction Counter() {\n const [count, setCount] = useState(0);\n\n return (\n <div>\n <h1>Count: {count}</h1>\n <button onClick={() => setCount(count + 1)}>\n +1\n </button>\n <button onClick={() => setCount(count - 1)}>\n -1\n </button>\n </div>\n );\n}\n\nexport default Counter;\n\\`\\`\\`\n\n这个组件使用了 \\`useState\\` Hook 来管理计数器状态。`,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithCode}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 8: 多轮对话\n// ============================================\nexport const 多轮对话: Story = {\n render: () => {\n const multiRoundMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"React 是什么?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"React 是一个用于构建用户界面的 JavaScript 库。\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"它有什么特点?\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"React 的主要特点包括:\\n1. 组件化\\n2. 虚拟 DOM\\n3. 单向数据流\\n4. JSX 语法\",\n invocationId: \"inv-2\",\n },\n {\n id: \"5\",\n role: \"user\",\n text: \"什么是虚拟 DOM?\",\n },\n {\n id: \"6\",\n role: \"bot\",\n text: \"虚拟 DOM 是真实 DOM 的 JavaScript 对象表示,React 通过对比虚拟 DOM 的变化来高效更新真实 DOM。\",\n invocationId: \"inv-3\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={multiRoundMessages}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import XAiThoughtChain from "../XAiThoughtChain";
|
|
|
13
13
|
import { parseAgentMessage } from "../../utils";
|
|
14
14
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
15
15
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
16
|
+
import { Fragment as _Fragment } from "react/jsx-runtime";
|
|
16
17
|
var scrollThreshold = 10;
|
|
17
18
|
|
|
18
19
|
/**
|
|
@@ -319,9 +320,17 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
319
320
|
children: /*#__PURE__*/_jsxs("span", {
|
|
320
321
|
children: ["\u751F\u6210\u6587\u4EF6 (", allFiles.length, ")"]
|
|
321
322
|
})
|
|
322
|
-
}), /*#__PURE__*/_jsx(
|
|
323
|
-
|
|
324
|
-
|
|
323
|
+
}), /*#__PURE__*/_jsx("div", {
|
|
324
|
+
style: {
|
|
325
|
+
display: "flex",
|
|
326
|
+
flexWrap: "wrap",
|
|
327
|
+
gap: "8px"
|
|
328
|
+
},
|
|
329
|
+
children: allFiles.map(function (file, index) {
|
|
330
|
+
return /*#__PURE__*/_jsx(FileGallery, {
|
|
331
|
+
file: file
|
|
332
|
+
}, index);
|
|
333
|
+
})
|
|
325
334
|
})]
|
|
326
335
|
}), !isGroupLoading && (actions ? actions({
|
|
327
336
|
message: group,
|
|
@@ -364,9 +373,17 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
364
373
|
className: styles.userMsg,
|
|
365
374
|
children: group.msgs.map(function (m, i) {
|
|
366
375
|
return /*#__PURE__*/_jsxs("div", {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
376
|
+
className: styles.userContainer,
|
|
377
|
+
children: [m.fileData && m.fileData.length > 0 && /*#__PURE__*/_jsx(_Fragment, {
|
|
378
|
+
children: m.fileData.map(function (file, index) {
|
|
379
|
+
return /*#__PURE__*/_jsx(FileGallery, {
|
|
380
|
+
file: file,
|
|
381
|
+
align: "left",
|
|
382
|
+
style: {
|
|
383
|
+
marginBottom: "16px"
|
|
384
|
+
}
|
|
385
|
+
}, index);
|
|
386
|
+
})
|
|
370
387
|
}), m.text && /*#__PURE__*/_jsx("div", {
|
|
371
388
|
className: styles.card,
|
|
372
389
|
children: m.text
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","Button","Flex","Tooltip","message","antdMessage","clsx","SwapRightOutlined","ReloadOutlined","CopyOutlined","InfoCircleOutlined","CheckCircleFilled","copy","useStyles","MarkdownRender","FunctionCallRender","FileGallery","XAiThoughtChain","parseAgentMessage","jsx","_jsx","jsxs","_jsxs","scrollThreshold","XAdkChatbot","_ref","_ref$loading","loading","prologue","suggestions","messages","showFnCallDetail","onConfirm","onSuggest","showRetry","showCopy","showLog","onRetry","onCopy","onShowLog","actions","className","style","_ref$enableGrouping","enableGrouping","_ref$enableProcessPar","enableProcessParsing","parseOptions","styles","listRef","lastScrollTopRef","userHasScrolledRef","messagesEndRef","_messagesEndRef$curre","current","scrollIntoView","behavior","handleScroll","el","currentTop","scrollTop","isAtBottom","Math","abs","scrollHeight","clientHeight","listElement","addEventListener","removeEventListener","chatGroups","map","msg","_msg$isLike","id","role","msgs","invocationId","allFiles","fileData","isLike","groups","forEach","isRealUserQuery","functionResponse","functionCall","lastGroup","length","isLastGroupAgent","push","_msg$isLike2","concat","g","reduce","acc","m","_toConsumableArray","renderBotGroup","group","isLastGroup","botMsg","children","i","text","showDetail","mergedToolMap","Map","callId","has","set","_objectSpread","_mergedToolMap$get","get","tool","name","args","nodes","currentProcessItems","processedToolIds","Set","flushProcessItems","type","items","key","mergedMsg","content","add","parts","part","partIdx","includes","titleMap","planning","replanning","reasoning","action_log","process_text","title","trim","lastNode","fullTextToCopy","filter","join","lastBotMsg","hasProcess","some","n","isGroupLoading","node","idx","defaultOpen","showBadge","findIndex","successBadge","fileSection","fileHeader","files","align","isLastBotMsg","metaFooter","gap","actionIcons","onClick","success","timestamp","renderUserGroup","userMsg","card","renderSuggestions","suggestionWrapper","item","suggestion","suggestContent","icon","iconPosition","whiteSpace","height","wordWrap","textAlign","padding","lineHeight","wrapper","list","ref"],"sources":["../../../../src/components/XAdkChatbot/index.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAiThoughtChain from \"@/components/XAiThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport type { IMessage, XAdkChatbotProps, ChatGroup } from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAiThoughtChain\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n}) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // 滚动到底部\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (group: ChatGroup, isLastGroup: boolean) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender key={`${msg.id}-${i}`} text={msg.text} />\n );\n }\n if (msg.functionCall) {\n return (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n />\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseAgentMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n\n // 4. 渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n return (\n <XAiThoughtChain\n key={node.key}\n loading={isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isGroupLoading}\n />\n );\n }\n\n // 文本节点\n const showBadge =\n hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )}\n <MarkdownRender text={node.content} />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <FileGallery files={allFiles} align=\"left\" />\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions\n ? actions({ message: group, isLastBotMsg: isLastGroup })\n : (showRetry || showCopy || showLog) && (\n <div className={styles.metaFooter}>\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n </div>\n ))}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n styles,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <FileGallery files={m.fileData} align=\"right\" />\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles],\n );\n\n // ========== 欢迎页面 ==========\n // const isEmpty =\n // messages.length === 0 &&\n // !prologue &&\n // (!suggestions || suggestions.length === 0);\n\n // const renderWelcome = () => {\n // if (!isEmpty) return null;\n\n // return (\n // <>\n // {welcome ?? (\n // <div className={styles.welcomeWrapper}>\n // {agentIcon && (\n // <img src={agentIcon} alt=\"icon\" className={styles.welcomeIcon} />\n // )}\n // {agentName && (\n // <div className={styles.welcomeTitle}>{agentName}</div>\n // )}\n // {description && (\n // <div className={styles.welcomeDesc}>{description}</div>\n // )}\n // </div>\n // )}\n // </>\n // );\n // };\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} />\n </div>\n )}\n\n {/* 欢迎页面 */}\n {/* {renderWelcome()} */}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(group, idx === chatGroups.length - 1),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n};\n\nexport default XAdkChatbot;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","Button","Flex","Tooltip","message","antdMessage","clsx","SwapRightOutlined","ReloadOutlined","CopyOutlined","InfoCircleOutlined","CheckCircleFilled","copy","useStyles","MarkdownRender","FunctionCallRender","FileGallery","XAiThoughtChain","parseAgentMessage","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","scrollThreshold","XAdkChatbot","_ref","_ref$loading","loading","prologue","suggestions","messages","showFnCallDetail","onConfirm","onSuggest","showRetry","showCopy","showLog","onRetry","onCopy","onShowLog","actions","className","style","_ref$enableGrouping","enableGrouping","_ref$enableProcessPar","enableProcessParsing","parseOptions","styles","listRef","lastScrollTopRef","userHasScrolledRef","messagesEndRef","_messagesEndRef$curre","current","scrollIntoView","behavior","handleScroll","el","currentTop","scrollTop","isAtBottom","Math","abs","scrollHeight","clientHeight","listElement","addEventListener","removeEventListener","chatGroups","map","msg","_msg$isLike","id","role","msgs","invocationId","allFiles","fileData","isLike","groups","forEach","isRealUserQuery","functionResponse","functionCall","lastGroup","length","isLastGroupAgent","push","_msg$isLike2","concat","g","reduce","acc","m","_toConsumableArray","renderBotGroup","group","isLastGroup","botMsg","children","i","text","showDetail","mergedToolMap","Map","callId","has","set","_objectSpread","_mergedToolMap$get","get","tool","name","args","nodes","currentProcessItems","processedToolIds","Set","flushProcessItems","type","items","key","mergedMsg","content","add","parts","part","partIdx","includes","titleMap","planning","replanning","reasoning","action_log","process_text","title","trim","lastNode","fullTextToCopy","filter","join","lastBotMsg","hasProcess","some","n","isGroupLoading","node","idx","defaultOpen","showBadge","findIndex","successBadge","fileSection","fileHeader","display","flexWrap","gap","file","index","isLastBotMsg","metaFooter","actionIcons","onClick","success","timestamp","renderUserGroup","userMsg","userContainer","align","marginBottom","card","renderSuggestions","suggestionWrapper","item","suggestion","suggestContent","icon","iconPosition","whiteSpace","height","wordWrap","textAlign","padding","lineHeight","wrapper","list","ref"],"sources":["../../../../src/components/XAdkChatbot/index.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAiThoughtChain from \"@/components/XAiThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport type { IMessage, XAdkChatbotProps, ChatGroup } from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAiThoughtChain\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n}) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // 滚动到底部\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (group: ChatGroup, isLastGroup: boolean) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender key={`${msg.id}-${i}`} text={msg.text} />\n );\n }\n if (msg.functionCall) {\n return (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n />\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseAgentMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n\n // 4. 渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n return (\n <XAiThoughtChain\n key={node.key}\n loading={isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isGroupLoading}\n />\n );\n }\n\n // 文本节点\n const showBadge =\n hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )}\n <MarkdownRender text={node.content} />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery key={index} file={file} />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions\n ? actions({ message: group, isLastBotMsg: isLastGroup })\n : (showRetry || showCopy || showLog) && (\n <div className={styles.metaFooter}>\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n </div>\n ))}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n styles,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles],\n );\n\n // ========== 欢迎页面 ==========\n // const isEmpty =\n // messages.length === 0 &&\n // !prologue &&\n // (!suggestions || suggestions.length === 0);\n\n // const renderWelcome = () => {\n // if (!isEmpty) return null;\n\n // return (\n // <>\n // {welcome ?? (\n // <div className={styles.welcomeWrapper}>\n // {agentIcon && (\n // <img src={agentIcon} alt=\"icon\" className={styles.welcomeIcon} />\n // )}\n // {agentName && (\n // <div className={styles.welcomeTitle}>{agentName}</div>\n // )}\n // {description && (\n // <div className={styles.welcomeDesc}>{description}</div>\n // )}\n // </div>\n // )}\n // </>\n // );\n // };\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} />\n </div>\n )}\n\n {/* 欢迎页面 */}\n {/* {renderWelcome()} */}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(group, idx === chatGroups.length - 1),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n};\n\nexport default XAdkChatbot;\n"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,OAAO,EAAEC,WAAW,EAAEC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACtE,SAASC,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,OAAO,IAAIC,WAAW,QAAQ,MAAM;AACpE,OAAOC,IAAI,MAAM,MAAM;AACvB,SACEC,iBAAiB,EACjBC,cAAc,EACdC,YAAY,EACZC,kBAAkB,EAClBC,iBAAiB,QACZ,mBAAmB;AAC1B,OAAOC,IAAI,MAAM,mBAAmB;AACpC,SAASC,SAAS;AAClB,OAAOC,cAAc;AACrB,OAAOC,kBAAkB;AACzB,OAAOC,WAAW;AAClB,OAAOC,eAAe;AACtB,SAASC,iBAAiB;AAAkB,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAAA,SAAAC,QAAA,IAAAC,SAAA;AAI5C,IAAMC,eAAe,GAAG,EAAE;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,WAAuC,GAAG,SAA1CA,WAAuCA,CAAAC,IAAA,EAqBvC;EAAA,IAAAC,YAAA,GAAAD,IAAA,CApBJE,OAAO;IAAPA,OAAO,GAAAD,YAAA,cAAG,KAAK,GAAAA,YAAA;IACfE,QAAQ,GAAAH,IAAA,CAARG,QAAQ;IACRC,WAAW,GAAAJ,IAAA,CAAXI,WAAW;IACXC,QAAQ,GAAAL,IAAA,CAARK,QAAQ;IACRC,gBAAgB,GAAAN,IAAA,CAAhBM,gBAAgB;IAChBC,SAAS,GAAAP,IAAA,CAATO,SAAS;IACTC,SAAS,GAAAR,IAAA,CAATQ,SAAS;IACTC,SAAS,GAAAT,IAAA,CAATS,SAAS;IACTC,QAAQ,GAAAV,IAAA,CAARU,QAAQ;IACRC,OAAO,GAAAX,IAAA,CAAPW,OAAO;IACPC,OAAO,GAAAZ,IAAA,CAAPY,OAAO;IACPC,MAAM,GAAAb,IAAA,CAANa,MAAM;IACNC,SAAS,GAAAd,IAAA,CAATc,SAAS;IACTC,OAAO,GAAAf,IAAA,CAAPe,OAAO;IACPC,SAAS,GAAAhB,IAAA,CAATgB,SAAS;IACTC,KAAK,GAAAjB,IAAA,CAALiB,KAAK;IAAAC,mBAAA,GAAAlB,IAAA,CAELmB,cAAc;IAAdA,cAAc,GAAAD,mBAAA,cAAG,IAAI,GAAAA,mBAAA;IAAAE,qBAAA,GAAApB,IAAA,CACrBqB,oBAAoB;IAApBA,oBAAoB,GAAAD,qBAAA,cAAG,IAAI,GAAAA,qBAAA;IAC3BE,YAAY,GAAAtB,IAAA,CAAZsB,YAAY;EAEZ,IAAMC,MAAM,GAAGrC,SAAS,CAAC,CAAC;EAC1B,IAAMsC,OAAO,GAAGnD,MAAM,CAAiB,IAAI,CAAC;EAC5C,IAAMoD,gBAAgB,GAAGpD,MAAM,CAAC,CAAC,CAAC;EAClC,IAAMqD,kBAAkB,GAAGrD,MAAM,CAAC,KAAK,CAAC;EACxC,IAAMsD,cAAc,GAAGtD,MAAM,CAAiB,IAAI,CAAC;;EAEnD;EACAD,SAAS,CAAC,YAAM;IAAA,IAAAwD,qBAAA;IACd,IAAI,CAAC1B,OAAO,EAAE;IACd,IAAIwB,kBAAkB,CAACG,OAAO,EAAE;IAChC,CAAAD,qBAAA,GAAAD,cAAc,CAACE,OAAO,cAAAD,qBAAA,eAAtBA,qBAAA,CAAwBE,cAAc,CAAC;MAAEC,QAAQ,EAAE;IAAS,CAAC,CAAC;EAChE,CAAC,EAAE,CAAC7B,OAAO,EAAEG,QAAQ,CAAC,CAAC;;EAEvB;EACA,IAAM2B,YAAY,GAAG7D,WAAW,CAAC,YAAM;IACrC,IAAM8D,EAAE,GAAGT,OAAO,CAACK,OAAO;IAC1B,IAAI,CAACI,EAAE,EAAE;IACT,IAAMC,UAAU,GAAGD,EAAE,CAACE,SAAS;IAE/B,IAAID,UAAU,GAAGT,gBAAgB,CAACI,OAAO,EAAE;MACzCH,kBAAkB,CAACG,OAAO,GAAG,IAAI;IACnC;IAEA,IAAMO,UAAU,GACdC,IAAI,CAACC,GAAG,CAACL,EAAE,CAACM,YAAY,GAAGL,UAAU,GAAGD,EAAE,CAACO,YAAY,CAAC,IACxD1C,eAAe;IACjB,IAAIsC,UAAU,EAAE;MACdV,kBAAkB,CAACG,OAAO,GAAG,KAAK;IACpC;IAEAJ,gBAAgB,CAACI,OAAO,GAAGK,UAAU;EACvC,CAAC,EAAE,EAAE,CAAC;EAEN9D,SAAS,CAAC,YAAM;IACd,IAAMqE,WAAW,GAAGjB,OAAO,CAACK,OAAO;IACnC,IAAI,CAACY,WAAW,EAAE;IAElBA,WAAW,CAACC,gBAAgB,CAAC,QAAQ,EAAEV,YAAY,CAAC;IACpD,OAAO,YAAM;MACXS,WAAW,CAACE,mBAAmB,CAAC,QAAQ,EAAEX,YAAY,CAAC;IACzD,CAAC;EACH,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;;EAElB;EACA,IAAMY,UAAU,GAAG1E,OAAO,CAAC,YAAM;IAC/B,IAAI,CAACiD,cAAc,EAAE;MACnB;MACA,OAAOd,QAAQ,CAACwC,GAAG,CAAC,UAACC,GAAG;QAAA,IAAAC,WAAA;QAAA,OAAM;UAC5BC,EAAE,EAAEF,GAAG,CAACE,EAAE;UACVC,IAAI,EAAEH,GAAG,CAACG,IAAI;UACdC,IAAI,EAAE,CAACJ,GAAG,CAAC;UACXK,YAAY,EAAEL,GAAG,CAACK,YAAY;UAC9BC,QAAQ,EAAEN,GAAG,CAACO,QAAQ,IAAI,EAAE;UAC5BC,MAAM,GAAAP,WAAA,GAAED,GAAG,CAACQ,MAAM,cAAAP,WAAA,cAAAA,WAAA,GAAI;QACxB,CAAC;MAAA,CAAC,CAAC;IACL;IAEA,IAAMQ,MAAmB,GAAG,EAAE;IAC9BlD,QAAQ,CAACmD,OAAO,CAAC,UAACV,GAAG,EAAK;MACxB;MACA,IAAKA,GAAG,CAASG,IAAI,KAAK,UAAU,EAAE;MAEtC,IAAMQ,eAAe,GACnBX,GAAG,CAACG,IAAI,KAAK,MAAM,IAAI,CAACH,GAAG,CAACY,gBAAgB,IAAI,CAACZ,GAAG,CAACa,YAAY;MACnE,IAAMC,SAAS,GAAGL,MAAM,CAACA,MAAM,CAACM,MAAM,GAAG,CAAC,CAAC;MAC3C,IAAMC,gBAAgB,GAAG,CAAAF,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEX,IAAI,MAAK,KAAK;MAElD,IAAIa,gBAAgB,IAAI,CAACL,eAAe,EAAE;QACxC;QACAG,SAAS,CAACV,IAAI,CAACa,IAAI,CAACjB,GAAG,CAAC;QACxB,IAAIA,GAAG,CAACK,YAAY,EAAES,SAAS,CAACT,YAAY,GAAGL,GAAG,CAACK,YAAY;QAC/D;QACA,IAAIL,GAAG,CAACQ,MAAM,IAAIR,GAAG,CAACQ,MAAM,KAAK,CAAC,EAAE;UAClCM,SAAS,CAACN,MAAM,GAAGR,GAAG,CAACQ,MAAM;QAC/B;MACF,CAAC,MAAM;QAAA,IAAAU,YAAA;QACL;QACAT,MAAM,CAACQ,IAAI,CAAC;UACVf,EAAE,EAAEF,GAAG,CAACE,EAAE,aAAAiB,MAAA,CAAaV,MAAM,CAACM,MAAM,CAAE;UACtCZ,IAAI,EAAEQ,eAAe,GAAG,MAAM,GAAG,KAAK;UACtCP,IAAI,EAAE,CAACJ,GAAG,CAAC;UACXK,YAAY,EAAEL,GAAG,CAACK,YAAY;UAC9BC,QAAQ,EAAE,EAAE;UACZE,MAAM,GAAAU,YAAA,GAAElB,GAAG,CAACQ,MAAM,cAAAU,YAAA,cAAAA,YAAA,GAAI;QACxB,CAAC,CAAC;MACJ;IACF,CAAC,CAAC;;IAEF;IACAT,MAAM,CAACC,OAAO,CAAC,UAACU,CAAC,EAAK;MACpBA,CAAC,CAACd,QAAQ,GAAGc,CAAC,CAAChB,IAAI,CAACiB,MAAM,CACxB,UAACC,GAAG,EAAEC,CAAC;QAAA,UAAAJ,MAAA,CAAAK,kBAAA,CAASF,GAAG,GAAAE,kBAAA,CAAMD,CAAC,CAAChB,QAAQ,IAAI,EAAE;MAAA,CAAE,EAC3C,EACF,CAAC;IACH,CAAC,CAAC;IAEF,OAAOE,MAAM;EACf,CAAC,EAAE,CAAClD,QAAQ,EAAEc,cAAc,CAAC,CAAC;;EAE9B;EACA,IAAMoD,cAAc,GAAGpG,WAAW,CAChC,UAACqG,KAAgB,EAAEC,WAAoB,EAAK;IAC1C,IAAQvB,IAAI,GAAesB,KAAK,CAAxBtB,IAAI;MAAEE,QAAQ,GAAKoB,KAAK,CAAlBpB,QAAQ;IAEtB,IAAI,CAAC/B,oBAAoB,EAAE;MACzB;MACA,oBACE5B,IAAA;QAAoBuB,SAAS,EAAEO,MAAM,CAACmD,MAAO;QAAAC,QAAA,EAC1CzB,IAAI,CAACL,GAAG,CAAC,UAACC,GAAG,EAAE8B,CAAC,EAAK;UACpB,IAAI9B,GAAG,CAAC+B,IAAI,EAAE;YACZ,oBACEpF,IAAA,CAACN,cAAc;cAAwB0F,IAAI,EAAE/B,GAAG,CAAC+B;YAAK,MAAAZ,MAAA,CAA9BnB,GAAG,CAACE,EAAE,OAAAiB,MAAA,CAAIW,CAAC,CAAqB,CAAC;UAE7D;UACA,IAAI9B,GAAG,CAACa,YAAY,EAAE;YACpB,oBACElE,IAAA,CAACL,kBAAkB;cAEjB0D,GAAG,EAAEA,GAAI;cACTgC,UAAU,EAAExE,gBAAiB;cAC7BC,SAAS,EAAEA;YAAU,MAAA0D,MAAA,CAHbnB,GAAG,CAACE,EAAE,OAAAiB,MAAA,CAAIW,CAAC,CAIpB,CAAC;UAEN;UACA,OAAO,IAAI;QACb,CAAC;MAAC,GAlBMJ,KAAK,CAACxB,EAmBX,CAAC;IAEV;;IAEA;;IAEA;IACA,IAAM+B,aAAa,GAAG,IAAIC,GAAG,CAAmB,CAAC;IACjD9B,IAAI,CAACM,OAAO,CAAC,UAACV,GAAG,EAAK;MACpB,IAAIA,GAAG,CAACa,YAAY,EAAE;QACpB,IAAMsB,MAAM,GAAGnC,GAAG,CAACa,YAAY,CAACX,EAAE,IAAI,EAAE;QACxC,IAAI,CAAC+B,aAAa,CAACG,GAAG,CAACD,MAAM,CAAC,EAAE;UAC9BF,aAAa,CAACI,GAAG,CAACF,MAAM,EAAAG,aAAA,KAAOtC,GAAG,CAAE,CAAC;QACvC,CAAC,MAAM;UAAA,IAAAuC,kBAAA;UACLN,aAAa,CAACI,GAAG,CAACF,MAAM,EAAAG,aAAA,CAAAA,aAAA,MAAAC,kBAAA,GAClBN,aAAa,CAACO,GAAG,CAACL,MAAM,CAAC,cAAAI,kBAAA,cAAAA,kBAAA,GAAI,CAAC,CAAC,GAChCvC,GAAG,CACP,CAAC;QACJ;MACF,CAAC,MAAM,IAAIA,GAAG,CAACY,gBAAgB,EAAE;QAC/B,IAAMuB,OAAM,GAAGnC,GAAG,CAACY,gBAAgB,CAACV,EAAE,IAAI,EAAE;QAC5C,IAAI+B,aAAa,CAACG,GAAG,CAACD,OAAM,CAAC,EAAE;UAC7B,IAAMM,IAAI,GAAGR,aAAa,CAACO,GAAG,CAACL,OAAM,CAAC;UACtC,IAAIM,IAAI,EAAEA,IAAI,CAAC7B,gBAAgB,GAAGZ,GAAG,CAACY,gBAAgB;QACxD,CAAC,MAAM;UACLqB,aAAa,CAACI,GAAG,CAACF,OAAM,EAAAG,aAAA,CAAAA,aAAA,KACnBtC,GAAG;YACNa,YAAY,EAAE;cACZX,EAAE,EAAEiC,OAAM;cACVO,IAAI,EAAE1C,GAAG,CAACY,gBAAgB,CAAC8B,IAAI,IAAI,SAAS;cAC5CC,IAAI,EAAE,CAAC;YACT;UAAC,EACF,CAAC;QACJ;MACF;IACF,CAAC,CAAC;;IAEF;;IAKA,IAAMC,KAAmB,GAAG,EAAE;IAC9B,IAAIC,mBAA2C,GAAG,EAAE;IACpD,IAAMC,gBAAgB,GAAG,IAAIC,GAAG,CAAS,CAAC;IAE1C,IAAMC,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAA,EAAS;MAC9B,IAAIH,mBAAmB,CAAC9B,MAAM,GAAG,CAAC,EAAE;QAClC6B,KAAK,CAAC3B,IAAI,CAAC;UACTgC,IAAI,EAAE,SAAS;UACfC,KAAK,EAAA1B,kBAAA,CAAMqB,mBAAmB,CAAC;UAC/BM,GAAG,aAAAhC,MAAA,CAAayB,KAAK,CAAC7B,MAAM;QAC9B,CAAC,CAAC;QACF8B,mBAAmB,GAAG,EAAE;MAC1B;IACF,CAAC;IAEDzC,IAAI,CAACM,OAAO,CAAC,UAACV,GAAG,EAAK;MACpB;MACA,IAAIA,GAAG,CAACa,YAAY,EAAE;QACpB,IAAMsB,MAAM,GAAGnC,GAAG,CAACa,YAAY,CAACX,EAAE,IAAI,EAAE;QACxC,IAAI,CAAC4C,gBAAgB,CAACV,GAAG,CAACD,MAAM,CAAC,EAAE;UACjC,IAAMiB,SAAS,GAAGnB,aAAa,CAACO,GAAG,CAACL,MAAM,CAAC;UAC3C,IAAIiB,SAAS,EAAE;YACbP,mBAAmB,CAAC5B,IAAI,CAAC;cACvBgC,IAAI,EAAE,MAAM;cACZE,GAAG,UAAAhC,MAAA,CAAUgB,MAAM,CAAE;cACrBkB,OAAO,EAAE,EAAE;cACXrD,GAAG,EAAEoD;YACP,CAAC,CAAC;YACFN,gBAAgB,CAACQ,GAAG,CAACnB,MAAM,CAAC;UAC9B;QACF;MACF;MACA;MAAA,KACK,IAAInC,GAAG,CAAC+B,IAAI,IAAI,CAAC/B,GAAG,CAACY,gBAAgB,EAAE;QAC1C,IAAM2C,KAAK,GAAG9G,iBAAiB,CAACuD,GAAG,CAAC+B,IAAI,EAAEvD,YAAmB,CAAC;QAE9D+E,KAAK,CAAC7C,OAAO,CAAC,UAAC8C,IAAI,EAAEC,OAAO,EAAK;UAC/B;UACA,IACE,CACE,UAAU,EACV,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,CACf,CAACC,QAAQ,CAACF,IAAI,CAACP,IAAI,CAAC,EACrB;YACA,IAAMU,QAAgC,GAAG;cACvCC,QAAQ,EAAE,MAAM;cAChBC,UAAU,EAAE,MAAM;cAClBC,SAAS,EAAE,MAAM;cACjBC,UAAU,EAAE,MAAM;cAClBC,YAAY,EAAE;YAChB,CAAC;YAEDnB,mBAAmB,CAAC5B,IAAI,CAAC;cACvBgC,IAAI,EAAE,MAAM;cACZE,GAAG,KAAAhC,MAAA,CAAKnB,GAAG,CAACE,EAAE,OAAAiB,MAAA,CAAIsC,OAAO,CAAE;cAC3BJ,OAAO,EAAEG,IAAI,CAACH,OAAO;cACrBY,KAAK,EAAEN,QAAQ,CAACH,IAAI,CAACP,IAAI,CAAC,IAAI;YAChC,CAAC,CAAC;UACJ;UACA;UAAA,KACK;YACHD,iBAAiB,CAAC,CAAC;YACnB,IAAIQ,IAAI,CAACH,OAAO,CAACa,IAAI,CAAC,CAAC,EAAE;cACvB,IAAMC,QAAQ,GAAGvB,KAAK,CAACA,KAAK,CAAC7B,MAAM,GAAG,CAAC,CAAC;cACxC,IAAI,CAAAoD,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAElB,IAAI,MAAK,MAAM,EAAE;gBAC7B;gBACAkB,QAAQ,CAACd,OAAO,IAAI,MAAM,GAAGG,IAAI,CAACH,OAAO;cAC3C,CAAC,MAAM;gBACLT,KAAK,CAAC3B,IAAI,CAAC;kBACTgC,IAAI,EAAE,MAAM;kBACZI,OAAO,EAAEG,IAAI,CAACH,OAAO;kBACrBF,GAAG,UAAAhC,MAAA,CAAUnB,GAAG,CAACE,EAAE,OAAAiB,MAAA,CAAIsC,OAAO;gBAChC,CAAC,CAAC;cACJ;YACF;UACF;QACF,CAAC,CAAC;MACJ;IACF,CAAC,CAAC;;IAEF;IACAT,iBAAiB,CAAC,CAAC;;IAEnB;IACA,IAAMoB,cAAc,GAAGhE,IAAI,CACxBiE,MAAM,CAAC,UAAC9C,CAAC;MAAA,OAAK,CAACA,CAAC,CAACV,YAAY,IAAI,CAACU,CAAC,CAACX,gBAAgB;IAAA,EAAC,CACrDb,GAAG,CAAC,UAACwB,CAAC;MAAA,OAAKA,CAAC,CAACQ,IAAI,IAAI,EAAE;IAAA,EAAC,CACxBuC,IAAI,CAAC,EAAE,CAAC;IAEX,IAAMC,UAAU,GAAGnE,IAAI,CAACA,IAAI,CAACW,MAAM,GAAG,CAAC,CAAC;IACxC,IAAMyD,UAAU,GAAG5B,KAAK,CAAC6B,IAAI,CAAC,UAACC,CAAC;MAAA,OAAKA,CAAC,CAACzB,IAAI,KAAK,SAAS;IAAA,EAAC;IAC1D,IAAM0B,cAAc,GAAGvH,OAAO,IAAIuE,WAAW;;IAE7C;IACA,oBACE9E,KAAA;MAAoBqB,SAAS,EAAEO,MAAM,CAACmD,MAAO;MAAAC,QAAA,GAC1Ce,KAAK,CAAC7C,GAAG,CAAC,UAAC6E,IAAI,EAAEC,GAAG,EAAK;QACxB,IAAID,IAAI,CAAC3B,IAAI,KAAK,SAAS,EAAE;UAC3B,oBACEtG,IAAA,CAACH,eAAe;YAEdY,OAAO,EAAEuH,cAAe;YACxBV,KAAK,EAAC,sCAAQ;YACdf,KAAK,EAAE0B,IAAI,CAAC1B,KAAM;YAClB1F,gBAAgB,EAAEA,gBAAiB;YACnCC,SAAS,EAAEA,SAAU;YACrBqH,WAAW,EAAEH;UAAe,GANvBC,IAAI,CAACzB,GAOX,CAAC;QAEN;;QAEA;QACA,IAAM4B,SAAS,GACbP,UAAU,IAAI5B,KAAK,CAACoC,SAAS,CAAC,UAACN,CAAC;UAAA,OAAKA,CAAC,CAACzB,IAAI,KAAK,MAAM;QAAA,EAAC,KAAK4B,GAAG;QACjE,oBACEhI,KAAA;UAAAgF,QAAA,GACGkD,SAAS,iBACRlI,KAAA;YAAKqB,SAAS,EAAEO,MAAM,CAACwG,YAAa;YAAApD,QAAA,gBAClClF,IAAA,CAACT,iBAAiB,IAAE,CAAC,2DACvB;UAAA,CAAK,CACN,eACDS,IAAA,CAACN,cAAc;YAAC0F,IAAI,EAAE6C,IAAI,CAACvB;UAAQ,CAAE,CAAC;QAAA,GAN9BuB,IAAI,CAACzB,GAOV,CAAC;MAEV,CAAC,CAAC,EAGD7C,QAAQ,CAACS,MAAM,GAAG,CAAC,iBAClBlE,KAAA;QAAKqB,SAAS,EAAEO,MAAM,CAACyG,WAAY;QAAArD,QAAA,gBACjClF,IAAA;UAAKuB,SAAS,EAAEO,MAAM,CAAC0G,UAAW;UAAAtD,QAAA,eAChChF,KAAA;YAAAgF,QAAA,GAAM,4BAAM,EAACvB,QAAQ,CAACS,MAAM,EAAC,GAAC;UAAA,CAAM;QAAC,CAClC,CAAC,eACNpE,IAAA;UAAKwB,KAAK,EAAE;YAAEiH,OAAO,EAAE,MAAM;YAAEC,QAAQ,EAAE,MAAM;YAAEC,GAAG,EAAE;UAAM,CAAE;UAAAzD,QAAA,EAC3DvB,QAAQ,CAACP,GAAG,CAAC,UAACwF,IAAI,EAAEC,KAAK;YAAA,oBACxB7I,IAAA,CAACJ,WAAW;cAAagJ,IAAI,EAAEA;YAAK,GAAlBC,KAAoB,CAAC;UAAA,CACxC;QAAC,CACC,CAAC;MAAA,CACH,CACN,EAGA,CAACb,cAAc,KACb1G,OAAO,GACJA,OAAO,CAAC;QAAEtC,OAAO,EAAE+F,KAAK;QAAE+D,YAAY,EAAE9D;MAAY,CAAC,CAAC,GACtD,CAAChE,SAAS,IAAIC,QAAQ,IAAIC,OAAO,kBAC/BlB,IAAA;QAAKuB,SAAS,EAAEO,MAAM,CAACiH,UAAW;QAAA7D,QAAA,eAChChF,KAAA,CAACpB,IAAI;UAAC6J,GAAG,EAAE,EAAG;UAACpH,SAAS,EAAEO,MAAM,CAACkH,WAAY;UAAA9D,QAAA,GAC1ClE,SAAS,IAAIgE,WAAW,iBACvBhF,IAAA,CAACjB,OAAO;YAACuI,KAAK,EAAC,0BAAM;YAAApC,QAAA,eACnBlF,IAAA,CAACZ,cAAc;cAAC6J,OAAO,EAAE9H;YAAQ,CAAE;UAAC,CAC7B,CACV,EACAF,QAAQ,iBACPjB,IAAA,CAACjB,OAAO;YAACuI,KAAK,EAAC,0BAAM;YAAApC,QAAA,eACnBlF,IAAA,CAACX,YAAY;cACX4J,OAAO,EAAE,SAAAA,QAAA,EAAM;gBACbzJ,IAAI,CAACiI,cAAc,CAAC;gBACpBxI,WAAW,CAACiK,OAAO,CAAC,MAAM,CAAC;gBAC3B9H,MAAM,aAANA,MAAM,eAANA,MAAM,CAAGqG,cAAc,CAAC;cAC1B;YAAE,CACH;UAAC,CACK,CACV,EACAvG,OAAO,KAAI0G,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAElE,YAAY,kBAClC1D,IAAA,CAACjB,OAAO;YAACuI,KAAK,EAAC,0BAAM;YAAApC,QAAA,eACnBlF,IAAA,CAACV,kBAAkB;cACjB2J,OAAO,EAAE,SAAAA,QAAA;gBAAA,OACP5H,SAAS,aAATA,SAAS,uBAATA,SAAS,CACPuG,UAAU,CAAClE,YAAY,EACvBkE,UAAU,CAACuB,SACb,CAAC;cAAA;YACF,CACF;UAAC,CACK,CACV;QAAA,CACG;MAAC,CACJ,CACN,CAAC;IAAA,GAlFApE,KAAK,CAACxB,EAmFX,CAAC;EAEV,CAAC,EACD,CACE3B,oBAAoB,EACpBC,YAAY,EACZhB,gBAAgB,EAChBC,SAAS,EACTL,OAAO,EACPO,SAAS,EACTC,QAAQ,EACRC,OAAO,EACPC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTS,MAAM,CAEV,CAAC;;EAED;EACA,IAAMsH,eAAe,GAAG1K,WAAW,CACjC,UAACqG,KAAgB,EAAK;IACpB,oBACE/E,IAAA;MAAoBuB,SAAS,EAAEO,MAAM,CAACuH,OAAQ;MAAAnE,QAAA,EAC3CH,KAAK,CAACtB,IAAI,CAACL,GAAG,CAAC,UAACwB,CAAC,EAAEO,CAAC;QAAA,oBACnBjF,KAAA;UAAqBqB,SAAS,EAAEO,MAAM,CAACwH,aAAc;UAAApE,QAAA,GAElDN,CAAC,CAAChB,QAAQ,IAAIgB,CAAC,CAAChB,QAAQ,CAACQ,MAAM,GAAG,CAAC,iBAClCpE,IAAA,CAAAI,SAAA;YAAA8E,QAAA,EACGN,CAAC,CAAChB,QAAQ,CAACR,GAAG,CAAC,UAACwF,IAAI,EAAEC,KAAK;cAAA,oBAC1B7I,IAAA,CAACJ,WAAW;gBAEVgJ,IAAI,EAAEA,IAAK;gBACXW,KAAK,EAAC,MAAM;gBACZ/H,KAAK,EAAE;kBAAEgI,YAAY,EAAE;gBAAO;cAAE,GAH3BX,KAIN,CAAC;YAAA,CACH;UAAC,CACF,CACH,EAEAjE,CAAC,CAACQ,IAAI,iBAAIpF,IAAA;YAAKuB,SAAS,EAAEO,MAAM,CAAC2H,IAAK;YAAAvE,QAAA,EAAEN,CAAC,CAACQ;UAAI,CAAM,CAAC;QAAA,GAf9CR,CAAC,CAACrB,EAAE,IAAI4B,CAgBb,CAAC;MAAA,CACP;IAAC,GAnBMJ,KAAK,CAACxB,EAoBX,CAAC;EAEV,CAAC,EACD,CAACzB,MAAM,CACT,CAAC;;EAED;EACA;EACA;EACA;EACA;;EAEA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA,IAAM4H,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAA,EAAS;IAC9B,IAAI,CAAC/I,WAAW,IAAIA,WAAW,CAACyD,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;IAEzD,oBACEpE,IAAA;MAAKuB,SAAS,EAAEO,MAAM,CAAC6H,iBAAkB;MAAAzE,QAAA,EACtCvE,WAAW,CAACyC,GAAG,CAAC,UAACwG,IAAI;QAAA,oBACpB5J,IAAA;UAAgBuB,SAAS,EAAEO,MAAM,CAAC+H,UAAW;UAAA3E,QAAA,eAC3ClF,IAAA;YAAKuB,SAAS,EAAEO,MAAM,CAACgI,cAAe;YAAA5E,QAAA,eACpClF,IAAA,CAACnB,MAAM;cACLyH,IAAI,EAAC,MAAM;cACXyD,IAAI,eAAE/J,IAAA,CAACb,iBAAiB,IAAE,CAAE;cAC5B6K,YAAY,EAAC,KAAK;cAClBf,OAAO,EAAE,SAAAA,QAAA,EAAM;gBACb,IAAI,CAACW,IAAI,EAAE;gBACX7I,SAAS,aAATA,SAAS,eAATA,SAAS,CAAG6I,IAAI,CAAC;cACnB,CAAE;cACFpI,KAAK,EAAE;gBACLyI,UAAU,EAAE,QAAQ;gBACpBC,MAAM,EAAE,MAAM;gBACdC,QAAQ,EAAE,YAAY;gBACtBC,SAAS,EAAE,MAAM;gBACjBC,OAAO,EAAE,UAAU;gBACnBC,UAAU,EAAE;cACd,CAAE;cAAApF,QAAA,EAED0E;YAAI,CACC;UAAC,CACN;QAAC,GArBEA,IAsBL,CAAC;MAAA,CACP;IAAC,CACC,CAAC;EAEV,CAAC;EAED,oBACE5J,IAAA;IAAKuB,SAAS,EAAErC,IAAI,CAAC4C,MAAM,CAACyI,OAAO,EAAEhJ,SAAS,CAAE;IAACC,KAAK,EAAEA,KAAM;IAAA0D,QAAA,eAC5DhF,KAAA;MAAKqB,SAAS,EAAEO,MAAM,CAAC0I,IAAK;MAACC,GAAG,EAAE1I,OAAQ;MAAAmD,QAAA,GAEvCxE,QAAQ,iBACPV,IAAA;QAAKuB,SAAS,EAAEO,MAAM,CAACpB,QAAS;QAAAwE,QAAA,eAC9BlF,IAAA,CAACN,cAAc;UAAC0F,IAAI,EAAE1E;QAAS,CAAE;MAAC,CAC/B,CACN,EAMAyC,UAAU,CAACC,GAAG,CAAC,UAAC2B,KAAK,EAAEmD,GAAG;QAAA,OACzBnD,KAAK,CAACvB,IAAI,KAAK,MAAM,GACjB4F,eAAe,CAACrE,KAAK,CAAC,GACtBD,cAAc,CAACC,KAAK,EAAEmD,GAAG,KAAK/E,UAAU,CAACiB,MAAM,GAAG,CAAC,CAAC;MAAA,CAC1D,CAAC,EAGAsF,iBAAiB,CAAC,CAAC,eAEpB1J,IAAA;QAAKyK,GAAG,EAAEvI;MAAe,CAAE,CAAC;IAAA,CACzB;EAAC,CACH,CAAC;AAEV,CAAC;AAED,eAAe5B,WAAW"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import _taggedTemplateLiteral from "@babel/runtime/helpers/esm/taggedTemplateLiteral";
|
|
2
|
-
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18, _templateObject19, _templateObject20, _templateObject21, _templateObject22, _templateObject23, _templateObject24, _templateObject25;
|
|
2
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18, _templateObject19, _templateObject20, _templateObject21, _templateObject22, _templateObject23, _templateObject24, _templateObject25, _templateObject26;
|
|
3
3
|
import { css } from "@emotion/css";
|
|
4
4
|
import { withBasicStyles } from "../../styles/common";
|
|
5
5
|
export var useStyles = withBasicStyles(function () {
|
|
@@ -10,26 +10,27 @@ export var useStyles = withBasicStyles(function () {
|
|
|
10
10
|
suggestion: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n margin-bottom: 12px;\n "]))),
|
|
11
11
|
suggestContent: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n display: inline-flex;\n border: 2px solid #e7e7e7;\n border-radius: 8px;\n "]))),
|
|
12
12
|
userMsg: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n display: flex;\n justify-content: flex-end;\n margin-bottom: 24px;\n "]))),
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
userContainer: css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n "]))),
|
|
14
|
+
card: css(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n display: inline-flex;\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 100%;\n white-space: pre-line;\n word-break: break-all;\n "]))),
|
|
15
|
+
botMsg: css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n margin-bottom: 12px;\n "]))),
|
|
15
16
|
// 新增样式
|
|
16
|
-
welcomeWrapper: css(
|
|
17
|
-
welcomeIcon: css(
|
|
18
|
-
welcomeTitle: css(
|
|
19
|
-
welcomeDesc: css(
|
|
20
|
-
suggestionWrapper: css(
|
|
21
|
-
successBadge: css(
|
|
22
|
-
fileSection: css(
|
|
23
|
-
fileHeader: css(
|
|
24
|
-
metaFooter: css(
|
|
25
|
-
actionIcons: css(
|
|
26
|
-
fnCall: css(
|
|
27
|
-
confirm: css(
|
|
28
|
-
footer: css(
|
|
29
|
-
sender: css(
|
|
30
|
-
senderWrap: css(
|
|
31
|
-
tip: css(
|
|
32
|
-
input: css(
|
|
17
|
+
welcomeWrapper: css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 40px 20px;\n text-align: center;\n "]))),
|
|
18
|
+
welcomeIcon: css(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n width: 64px;\n height: 64px;\n border-radius: 12px;\n margin-bottom: 16px;\n "]))),
|
|
19
|
+
welcomeTitle: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n font-size: 24px;\n font-weight: 600;\n color: rgba(0, 0, 0, 0.88);\n margin-bottom: 8px;\n "]))),
|
|
20
|
+
welcomeDesc: css(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n font-size: 14px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 24px;\n "]))),
|
|
21
|
+
suggestionWrapper: css(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n margin-top: 16px;\n "]))),
|
|
22
|
+
successBadge: css(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n background: #f6ffed;\n border: 1px solid #b7eb8f;\n border-radius: 4px;\n color: #52c41a;\n font-size: 13px;\n margin-bottom: 12px;\n "]))),
|
|
23
|
+
fileSection: css(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral(["\n margin: 12px 0;\n "]))),
|
|
24
|
+
fileHeader: css(_templateObject17 || (_templateObject17 = _taggedTemplateLiteral(["\n font-size: 13px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 8px;\n "]))),
|
|
25
|
+
metaFooter: css(_templateObject18 || (_templateObject18 = _taggedTemplateLiteral(["\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #f0f0f0;\n "]))),
|
|
26
|
+
actionIcons: css(_templateObject19 || (_templateObject19 = _taggedTemplateLiteral(["\n color: rgba(0, 0, 0, 0.45);\n\n & > span {\n cursor: pointer;\n transition: color 0.2s;\n\n &:hover {\n color: #1890ff;\n }\n }\n "]))),
|
|
27
|
+
fnCall: css(_templateObject20 || (_templateObject20 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 11px;\n border-radius: 24px;\n line-height: 16px;\n border: 1px solid #e7e7e7;\n cursor: pointer;\n "]))),
|
|
28
|
+
confirm: css(_templateObject21 || (_templateObject21 = _taggedTemplateLiteral(["\n padding: 12px;\n border-radius: 12px;\n border: 1px solid #e7e7e7;\n "]))),
|
|
29
|
+
footer: css(_templateObject22 || (_templateObject22 = _taggedTemplateLiteral(["\n /* senderWrap and tip moved to top-level keys so they are\n accessible as styles.senderWrap and styles.tip in the component */\n "]))),
|
|
30
|
+
sender: css(_templateObject23 || (_templateObject23 = _taggedTemplateLiteral(["\n width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 8px 8px 12px;\n border: 1px solid #e7e7e7;\n border-radius: 24px;\n\n /* .input moved to top-level key so component can use styles.input */\n "]))),
|
|
31
|
+
senderWrap: css(_templateObject24 || (_templateObject24 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n "]))),
|
|
32
|
+
tip: css(_templateObject25 || (_templateObject25 = _taggedTemplateLiteral(["\n padding: 4px;\n font-size: 12px;\n text-align: center;\n color: rgba(0, 0, 0, 0.4);\n "]))),
|
|
33
|
+
input: css(_templateObject26 || (_templateObject26 = _taggedTemplateLiteral(["\n padding: 0;\n margin: 5px 0;\n line-height: 22px;\n font-size: 15px;\n border-radius: 0;\n border: none;\n\n &:focus {\n box-shadow: none;\n }\n "])))
|
|
33
34
|
};
|
|
34
35
|
});
|
|
35
36
|
export default useStyles;
|