@alicloud/appflow-chat 0.0.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README-ZH.md +188 -0
  2. package/README.md +190 -0
  3. package/dist/appflow-chat.cjs.js +1903 -0
  4. package/dist/appflow-chat.esm.js +36965 -0
  5. package/dist/types/index.d.ts +862 -0
  6. package/package.json +87 -0
  7. package/src/components/DocReferences.tsx +64 -0
  8. package/src/components/HumanVerify/CustomParamsRenderer/ArrayField.tsx +394 -0
  9. package/src/components/HumanVerify/CustomParamsRenderer/FieldRenderer.tsx +202 -0
  10. package/src/components/HumanVerify/CustomParamsRenderer/ObjectField.tsx +126 -0
  11. package/src/components/HumanVerify/CustomParamsRenderer/index.tsx +166 -0
  12. package/src/components/HumanVerify/CustomParamsRenderer/types.ts +203 -0
  13. package/src/components/HumanVerify/HistoryCard.tsx +156 -0
  14. package/src/components/HumanVerify/HumanVerify.tsx +184 -0
  15. package/src/components/HumanVerify/index.ts +11 -0
  16. package/src/components/MarkdownRenderer.tsx +195 -0
  17. package/src/components/MessageBubble.tsx +400 -0
  18. package/src/components/RichMessageBubble.tsx +283 -0
  19. package/src/components/WebSearchPanel.tsx +68 -0
  20. package/src/context/RichBubble.tsx +21 -0
  21. package/src/core/BubbleContent.tsx +75 -0
  22. package/src/core/RichBubbleContent.tsx +324 -0
  23. package/src/core/SourceContent.tsx +285 -0
  24. package/src/core/WebSearchContent.tsx +219 -0
  25. package/src/core/index.ts +16 -0
  26. package/src/hooks/usePreSignUpload.ts +36 -0
  27. package/src/index.ts +80 -0
  28. package/src/markdown/components/Chart.tsx +120 -0
  29. package/src/markdown/components/Error.tsx +39 -0
  30. package/src/markdown/components/FileDisplay.tsx +246 -0
  31. package/src/markdown/components/Loading.tsx +41 -0
  32. package/src/markdown/components/SyntaxHighlight.tsx +182 -0
  33. package/src/markdown/index.tsx +250 -0
  34. package/src/markdown/styled.ts +234 -0
  35. package/src/markdown/utils/dataProcessor.ts +89 -0
  36. package/src/services/ChatService.ts +926 -0
  37. package/src/utils/fetchEventSource.ts +65 -0
  38. package/src/utils/loadEcharts.ts +32 -0
  39. package/src/utils/loadPrism.ts +156 -0
  40. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * fetchEventSource CDN 加载封装模块
3
+ */
4
+
5
+ let fetchEventSourceFn: any = null;
6
+ let loadPromise: Promise<any> | null = null;
7
+
8
+ const CDN_URL = 'https://g.alicdn.com/code/npm/@ali/chatui-sdk/6.6.5/ChatSSE.js';
9
+
10
+ /**
11
+ * 动态加载 ChatSSE CDN 脚本
12
+ */
13
+ function loadChatSSEScript(): Promise<any> {
14
+ if (loadPromise) return loadPromise;
15
+
16
+ loadPromise = new Promise((resolve, reject) => {
17
+ // 检查是否已加载
18
+ if ((window as any).ChatSSE?.fetchEventSource) {
19
+ fetchEventSourceFn = (window as any).ChatSSE.fetchEventSource;
20
+ resolve(fetchEventSourceFn);
21
+ return;
22
+ }
23
+
24
+ const script = document.createElement('script');
25
+ script.src = CDN_URL;
26
+ script.async = true;
27
+
28
+ script.onload = () => {
29
+ fetchEventSourceFn = (window as any).ChatSSE?.fetchEventSource;
30
+ if (fetchEventSourceFn) {
31
+ resolve(fetchEventSourceFn);
32
+ } else {
33
+ reject(new Error('ChatSSE.fetchEventSource not found after script load'));
34
+ }
35
+ };
36
+
37
+ script.onerror = () => {
38
+ loadPromise = null; // 重置以便重试
39
+ reject(new Error('Failed to load ChatSSE script from CDN'));
40
+ };
41
+
42
+ document.head.appendChild(script);
43
+ });
44
+
45
+ return loadPromise;
46
+ }
47
+
48
+ /**
49
+ * 获取 fetchEventSource 函数
50
+ */
51
+ export async function getFetchEventSource(): Promise<any> {
52
+ if (fetchEventSourceFn) return fetchEventSourceFn;
53
+ return loadChatSSEScript();
54
+ }
55
+
56
+ /**
57
+ * fetchEventSource 包装函数
58
+ * 与原 @ali/chatui-sdk 的 fetchEventSource 接口保持一致
59
+ */
60
+ export async function fetchEventSource(url: string, options: any): Promise<void> {
61
+ const fn = await getFetchEventSource();
62
+ return fn(url, options);
63
+ }
64
+
65
+ export default fetchEventSource;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * ECharts 按需加载函数
3
+ * 用于在需要渲染图表时动态加载 ECharts 库
4
+ */
5
+
6
+ export const loadEchartsScript = (): Promise<void> => {
7
+ return new Promise((resolve, reject) => {
8
+ // 检查 echarts 是否已经加载
9
+ if (typeof window !== 'undefined' && (window as any).echarts) {
10
+ resolve();
11
+ return;
12
+ }
13
+
14
+ // 动态加载 echarts
15
+ const script = document.createElement('script');
16
+ script.src = 'https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.2/echarts.min.js';
17
+ script.async = true;
18
+
19
+ script.onload = () => {
20
+ resolve();
21
+ };
22
+
23
+ script.onerror = (error) => {
24
+ console.error('ECharts 加载失败:', error);
25
+ reject(new Error('Failed to load ECharts'));
26
+ };
27
+
28
+ document.head.appendChild(script);
29
+ });
30
+ };
31
+
32
+ export default loadEchartsScript;
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Prism.js CDN 动态加载工具
3
+ * 用于代码语法高亮
4
+ */
5
+
6
+ // Prism CDN 基础路径
7
+ const PRISM_CDN_BASE = 'https://cdn.jsdelivr.net/npm/prismjs@1.29.0';
8
+
9
+ // 已加载的语言缓存
10
+ const loadedLanguages = new Set<string>(['javascript', 'css', 'markup', 'clike']);
11
+
12
+ // Prism 加载 Promise 缓存
13
+ let prismLoadPromise: Promise<any> | null = null;
14
+
15
+ /**
16
+ * 加载 Prism.js 核心库和基础样式
17
+ */
18
+ export async function loadPrism(): Promise<any> {
19
+ // 如果已经加载过,直接返回
20
+ if (typeof window !== 'undefined' && (window as any).Prism) {
21
+ return (window as any).Prism;
22
+ }
23
+
24
+ // 如果正在加载,返回现有的 Promise
25
+ if (prismLoadPromise) {
26
+ return prismLoadPromise;
27
+ }
28
+
29
+ prismLoadPromise = new Promise((resolve, reject) => {
30
+ // 加载 CSS 主题
31
+ const link = document.createElement('link');
32
+ link.rel = 'stylesheet';
33
+ link.href = `${PRISM_CDN_BASE}/themes/prism-coldark-cold.min.css`;
34
+ document.head.appendChild(link);
35
+
36
+ // 加载行号插件 CSS
37
+ const lineNumbersCSS = document.createElement('link');
38
+ lineNumbersCSS.rel = 'stylesheet';
39
+ lineNumbersCSS.href = `${PRISM_CDN_BASE}/plugins/line-numbers/prism-line-numbers.min.css`;
40
+ document.head.appendChild(lineNumbersCSS);
41
+
42
+ // 加载 Prism 核心 JS
43
+ const script = document.createElement('script');
44
+ script.src = `${PRISM_CDN_BASE}/prism.min.js`;
45
+ script.onload = () => {
46
+ // 加载行号插件
47
+ const lineNumbersScript = document.createElement('script');
48
+ lineNumbersScript.src = `${PRISM_CDN_BASE}/plugins/line-numbers/prism-line-numbers.min.js`;
49
+ lineNumbersScript.onload = () => {
50
+ // 加载自动加载器(用于按需加载语言)
51
+ const autoloaderScript = document.createElement('script');
52
+ autoloaderScript.src = `${PRISM_CDN_BASE}/plugins/autoloader/prism-autoloader.min.js`;
53
+ autoloaderScript.onload = () => {
54
+ const Prism = (window as any).Prism;
55
+ if (Prism && Prism.plugins && Prism.plugins.autoloader) {
56
+ // 配置自动加载器的语言路径
57
+ Prism.plugins.autoloader.languages_path = `${PRISM_CDN_BASE}/components/`;
58
+ }
59
+ resolve(Prism);
60
+ };
61
+ autoloaderScript.onerror = reject;
62
+ document.head.appendChild(autoloaderScript);
63
+ };
64
+ lineNumbersScript.onerror = reject;
65
+ document.head.appendChild(lineNumbersScript);
66
+ };
67
+ script.onerror = reject;
68
+ document.head.appendChild(script);
69
+ });
70
+
71
+ return prismLoadPromise;
72
+ }
73
+
74
+ /**
75
+ * 加载指定语言的语法支持
76
+ */
77
+ export async function loadPrismLanguage(language: string): Promise<void> {
78
+ const Prism = await loadPrism();
79
+
80
+ // 如果语言已加载,直接返回
81
+ if (loadedLanguages.has(language) || Prism.languages[language]) {
82
+ loadedLanguages.add(language);
83
+ return;
84
+ }
85
+
86
+ // 语言别名映射
87
+ const languageAliases: Record<string, string> = {
88
+ 'js': 'javascript',
89
+ 'ts': 'typescript',
90
+ 'py': 'python',
91
+ 'rb': 'ruby',
92
+ 'sh': 'bash',
93
+ 'shell': 'bash',
94
+ 'yml': 'yaml',
95
+ 'md': 'markdown',
96
+ 'html': 'markup',
97
+ 'xml': 'markup',
98
+ 'svg': 'markup',
99
+ };
100
+
101
+ const actualLanguage = languageAliases[language] || language;
102
+
103
+ // 如果使用自动加载器,它会自动处理
104
+ if (Prism.plugins && Prism.plugins.autoloader) {
105
+ loadedLanguages.add(language);
106
+ return;
107
+ }
108
+
109
+ // 手动加载语言
110
+ return new Promise((resolve, _reject) => {
111
+ const script = document.createElement('script');
112
+ script.src = `${PRISM_CDN_BASE}/components/prism-${actualLanguage}.min.js`;
113
+ script.onload = () => {
114
+ loadedLanguages.add(language);
115
+ resolve();
116
+ };
117
+ script.onerror = () => {
118
+ // 语言加载失败不影响基本功能
119
+ console.warn(`Failed to load Prism language: ${actualLanguage}`);
120
+ resolve();
121
+ };
122
+ document.head.appendChild(script);
123
+ });
124
+ }
125
+
126
+ /**
127
+ * 高亮代码
128
+ */
129
+ export async function highlightCode(code: string, language: string = 'javascript'): Promise<string> {
130
+ const Prism = await loadPrism();
131
+
132
+ // 尝试加载语言
133
+ await loadPrismLanguage(language);
134
+
135
+ // 获取语法定义
136
+ const grammar = Prism.languages[language] || Prism.languages.javascript;
137
+
138
+ // 高亮代码
139
+ return Prism.highlight(code, grammar, language);
140
+ }
141
+
142
+ /**
143
+ * 高亮元素
144
+ */
145
+ export async function highlightElement(element: HTMLElement): Promise<void> {
146
+ const Prism = await loadPrism();
147
+ Prism.highlightElement(element);
148
+ }
149
+
150
+ /**
151
+ * 高亮所有代码块
152
+ */
153
+ export async function highlightAll(): Promise<void> {
154
+ const Prism = await loadPrism();
155
+ Prism.highlightAll();
156
+ }
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />