@vectorx/agent-simulator 0.1.3 → 0.4.0

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 (302) hide show
  1. package/lib/app.d.ts +43 -0
  2. package/lib/app.d.ts.map +1 -0
  3. package/lib/app.js +96 -0
  4. package/lib/app.js.map +1 -0
  5. package/lib/config/api.config.d.ts +2 -0
  6. package/lib/config/api.config.d.ts.map +1 -0
  7. package/lib/config/api.config.js +13 -0
  8. package/lib/config/api.config.js.map +1 -0
  9. package/lib/config/app.config.d.ts +22 -0
  10. package/lib/config/app.config.d.ts.map +1 -0
  11. package/lib/config/app.config.js +18 -0
  12. package/lib/config/app.config.js.map +1 -0
  13. package/lib/config/upload.config.d.ts +6 -0
  14. package/lib/config/upload.config.d.ts.map +1 -0
  15. package/lib/config/upload.config.js +10 -0
  16. package/lib/config/upload.config.js.map +1 -0
  17. package/lib/container/container.d.ts +6 -0
  18. package/lib/container/container.d.ts.map +1 -0
  19. package/lib/container/container.js +34 -0
  20. package/lib/container/container.js.map +1 -0
  21. package/lib/container/identifiers.d.ts +14 -0
  22. package/lib/container/identifiers.d.ts.map +1 -0
  23. package/lib/container/identifiers.js +20 -0
  24. package/lib/container/identifiers.js.map +1 -0
  25. package/lib/container/index.d.ts +4 -0
  26. package/lib/container/index.d.ts.map +1 -0
  27. package/lib/container/index.js +20 -0
  28. package/lib/container/index.js.map +1 -0
  29. package/lib/container/types.d.ts +41 -0
  30. package/lib/container/types.d.ts.map +1 -0
  31. package/lib/{types.js → container/types.js} +1 -0
  32. package/lib/container/types.js.map +1 -0
  33. package/lib/controllers/agent.controller.d.ts +15 -0
  34. package/lib/controllers/agent.controller.d.ts.map +1 -0
  35. package/lib/controllers/agent.controller.js +59 -0
  36. package/lib/controllers/agent.controller.js.map +1 -0
  37. package/lib/controllers/auth.controller.d.ts +23 -0
  38. package/lib/controllers/auth.controller.d.ts.map +1 -0
  39. package/lib/controllers/auth.controller.js +132 -0
  40. package/lib/controllers/auth.controller.js.map +1 -0
  41. package/lib/controllers/simulator.controller.d.ts +11 -0
  42. package/lib/controllers/simulator.controller.d.ts.map +1 -0
  43. package/lib/controllers/simulator.controller.js +44 -0
  44. package/lib/controllers/simulator.controller.js.map +1 -0
  45. package/lib/controllers/upload.controller.d.ts +8 -0
  46. package/lib/controllers/upload.controller.d.ts.map +1 -0
  47. package/lib/controllers/upload.controller.js +44 -0
  48. package/lib/controllers/upload.controller.js.map +1 -0
  49. package/lib/index.d.ts +7 -0
  50. package/lib/index.d.ts.map +1 -0
  51. package/lib/index.js +15 -2
  52. package/lib/index.js.map +1 -0
  53. package/lib/middleware/cors.middleware.d.ts +7 -0
  54. package/lib/middleware/cors.middleware.d.ts.map +1 -0
  55. package/lib/middleware/cors.middleware.js +14 -0
  56. package/lib/middleware/cors.middleware.js.map +1 -0
  57. package/lib/middleware/error.middleware.d.ts +8 -0
  58. package/lib/middleware/error.middleware.d.ts.map +1 -0
  59. package/lib/middleware/error.middleware.js +33 -0
  60. package/lib/middleware/error.middleware.js.map +1 -0
  61. package/lib/middleware/proxy.middleware.d.ts +3 -0
  62. package/lib/middleware/proxy.middleware.d.ts.map +1 -0
  63. package/lib/middleware/proxy.middleware.js +21 -0
  64. package/lib/middleware/proxy.middleware.js.map +1 -0
  65. package/lib/routes/agent.d.ts +3 -0
  66. package/lib/routes/agent.d.ts.map +1 -0
  67. package/lib/routes/agent.js +16 -0
  68. package/lib/routes/agent.js.map +1 -0
  69. package/lib/routes/auth.d.ts +3 -0
  70. package/lib/routes/auth.d.ts.map +1 -0
  71. package/lib/routes/auth.js +20 -0
  72. package/lib/routes/auth.js.map +1 -0
  73. package/lib/routes/index.d.ts +3 -0
  74. package/lib/routes/index.d.ts.map +1 -0
  75. package/lib/routes/index.js +19 -0
  76. package/lib/routes/index.js.map +1 -0
  77. package/lib/routes/simulator.d.ts +3 -0
  78. package/lib/routes/simulator.d.ts.map +1 -0
  79. package/lib/routes/simulator.js +14 -0
  80. package/lib/routes/simulator.js.map +1 -0
  81. package/lib/routes/upload.d.ts +3 -0
  82. package/lib/routes/upload.d.ts.map +1 -0
  83. package/lib/routes/upload.js +13 -0
  84. package/lib/routes/upload.js.map +1 -0
  85. package/{types/webview-ui/services/agent-service.d.ts → lib/services/agent.service.d.ts} +15 -3
  86. package/lib/services/agent.service.d.ts.map +1 -0
  87. package/lib/services/agent.service.js +116 -0
  88. package/lib/services/agent.service.js.map +1 -0
  89. package/lib/services/auth.service.d.ts +55 -0
  90. package/lib/services/auth.service.d.ts.map +1 -0
  91. package/lib/services/auth.service.js +124 -0
  92. package/lib/services/auth.service.js.map +1 -0
  93. package/lib/services/simulator.service.d.ts +23 -0
  94. package/lib/services/simulator.service.d.ts.map +1 -0
  95. package/lib/services/simulator.service.js +49 -0
  96. package/lib/services/simulator.service.js.map +1 -0
  97. package/lib/services/upload.service.d.ts +32 -0
  98. package/lib/services/upload.service.d.ts.map +1 -0
  99. package/lib/services/upload.service.js +61 -0
  100. package/lib/services/upload.service.js.map +1 -0
  101. package/lib/simulator.d.ts +27 -0
  102. package/lib/simulator.d.ts.map +1 -0
  103. package/lib/simulator.js +42 -187
  104. package/lib/simulator.js.map +1 -0
  105. package/lib/utils/logger.d.ts +8 -0
  106. package/lib/utils/logger.d.ts.map +1 -0
  107. package/lib/utils/logger.js +28 -0
  108. package/lib/utils/logger.js.map +1 -0
  109. package/lib/utils/request.d.ts +11 -0
  110. package/lib/utils/request.d.ts.map +1 -0
  111. package/lib/utils/request.js +36 -0
  112. package/lib/utils/request.js.map +1 -0
  113. package/lib/utils/url-parser.d.ts +14 -0
  114. package/lib/utils/url-parser.d.ts.map +1 -0
  115. package/lib/utils/url-parser.js +25 -0
  116. package/lib/utils/url-parser.js.map +1 -0
  117. package/lib/utils.d.ts +6 -0
  118. package/lib/utils.d.ts.map +1 -0
  119. package/lib/utils.js +5 -0
  120. package/lib/utils.js.map +1 -0
  121. package/{types → lib}/webview-ui/Agent.d.ts +2 -0
  122. package/lib/webview-ui/Agent.d.ts.map +1 -0
  123. package/lib/webview-ui/Agent.js +8 -0
  124. package/lib/webview-ui/Agent.js.map +1 -0
  125. package/lib/webview-ui/App.d.ts +3 -0
  126. package/lib/webview-ui/App.d.ts.map +1 -0
  127. package/lib/webview-ui/App.js +392 -181
  128. package/lib/webview-ui/App.js.map +1 -0
  129. package/{types → lib}/webview-ui/ErrorBoundary.d.ts +2 -1
  130. package/lib/webview-ui/ErrorBoundary.d.ts.map +1 -0
  131. package/lib/webview-ui/ErrorBoundary.js +15 -18
  132. package/lib/webview-ui/ErrorBoundary.js.map +1 -0
  133. package/lib/webview-ui/components/AsyncTaskBlock.d.ts +13 -0
  134. package/lib/webview-ui/components/AsyncTaskBlock.d.ts.map +1 -0
  135. package/lib/webview-ui/components/AsyncTaskBlock.js +179 -0
  136. package/lib/webview-ui/components/AsyncTaskBlock.js.map +1 -0
  137. package/lib/webview-ui/components/AuthIndicator.d.ts +3 -0
  138. package/lib/webview-ui/components/AuthIndicator.d.ts.map +1 -0
  139. package/lib/webview-ui/components/AuthIndicator.js +17 -0
  140. package/lib/webview-ui/components/AuthIndicator.js.map +1 -0
  141. package/lib/webview-ui/components/ErrorCard.d.ts +11 -0
  142. package/lib/webview-ui/components/ErrorCard.d.ts.map +1 -0
  143. package/lib/webview-ui/components/ErrorCard.js +50 -0
  144. package/lib/webview-ui/components/ErrorCard.js.map +1 -0
  145. package/{types → lib}/webview-ui/components/KnowledgeBaseSearchBlock.d.ts +1 -0
  146. package/lib/webview-ui/components/KnowledgeBaseSearchBlock.d.ts.map +1 -0
  147. package/lib/webview-ui/components/KnowledgeBaseSearchBlock.js +7 -24
  148. package/lib/webview-ui/components/KnowledgeBaseSearchBlock.js.map +1 -0
  149. package/{types → lib}/webview-ui/components/KnowledgeBaseSearchResult.d.ts +1 -0
  150. package/lib/webview-ui/components/KnowledgeBaseSearchResult.d.ts.map +1 -0
  151. package/lib/webview-ui/components/KnowledgeBaseSearchResult.js +3 -9
  152. package/lib/webview-ui/components/KnowledgeBaseSearchResult.js.map +1 -0
  153. package/{types → lib}/webview-ui/components/MarkdownRenderer.d.ts +1 -0
  154. package/lib/webview-ui/components/MarkdownRenderer.d.ts.map +1 -0
  155. package/lib/webview-ui/components/MarkdownRenderer.js +6 -5
  156. package/lib/webview-ui/components/MarkdownRenderer.js.map +1 -0
  157. package/{types → lib}/webview-ui/components/MessageRenderer.d.ts +1 -0
  158. package/lib/webview-ui/components/MessageRenderer.d.ts.map +1 -0
  159. package/lib/webview-ui/components/MessageRenderer.js +22 -25
  160. package/lib/webview-ui/components/MessageRenderer.js.map +1 -0
  161. package/lib/webview-ui/components/MultimodalFileRenderer.d.ts +20 -0
  162. package/lib/webview-ui/components/MultimodalFileRenderer.d.ts.map +1 -0
  163. package/lib/webview-ui/components/MultimodalFileRenderer.js +169 -0
  164. package/lib/webview-ui/components/MultimodalFileRenderer.js.map +1 -0
  165. package/{types → lib}/webview-ui/components/ThinkingBlock.d.ts +1 -0
  166. package/lib/webview-ui/components/ThinkingBlock.d.ts.map +1 -0
  167. package/lib/webview-ui/components/ThinkingBlock.js +11 -41
  168. package/lib/webview-ui/components/ThinkingBlock.js.map +1 -0
  169. package/{types → lib}/webview-ui/components/ToolUseBlock.d.ts +1 -0
  170. package/lib/webview-ui/components/ToolUseBlock.d.ts.map +1 -0
  171. package/lib/webview-ui/components/ToolUseBlock.js +5 -11
  172. package/lib/webview-ui/components/ToolUseBlock.js.map +1 -0
  173. package/{types → lib}/webview-ui/components/ToolUseBlockHeader.d.ts +1 -0
  174. package/lib/webview-ui/components/ToolUseBlockHeader.d.ts.map +1 -0
  175. package/lib/webview-ui/components/ToolUseBlockHeader.js +4 -21
  176. package/lib/webview-ui/components/ToolUseBlockHeader.js.map +1 -0
  177. package/lib/webview-ui/components/UploadPreview.d.ts +6 -0
  178. package/lib/webview-ui/components/UploadPreview.d.ts.map +1 -0
  179. package/lib/webview-ui/components/UploadPreview.js +12 -0
  180. package/lib/webview-ui/components/UploadPreview.js.map +1 -0
  181. package/lib/webview-ui/components/WelcomeModule.d.ts +10 -0
  182. package/lib/webview-ui/components/WelcomeModule.d.ts.map +1 -0
  183. package/lib/webview-ui/components/WelcomeModule.js +161 -0
  184. package/lib/webview-ui/components/WelcomeModule.js.map +1 -0
  185. package/{types → lib}/webview-ui/components/index.d.ts +7 -0
  186. package/lib/webview-ui/components/index.d.ts.map +1 -0
  187. package/lib/webview-ui/components/index.js +7 -0
  188. package/lib/webview-ui/components/index.js.map +1 -0
  189. package/lib/webview-ui/config/cos-config.d.ts +41 -0
  190. package/lib/webview-ui/config/cos-config.d.ts.map +1 -0
  191. package/lib/webview-ui/config/cos-config.js +83 -0
  192. package/lib/webview-ui/config/cos-config.js.map +1 -0
  193. package/lib/webview-ui/config/http-config.d.ts +8 -0
  194. package/lib/webview-ui/config/http-config.d.ts.map +1 -0
  195. package/lib/webview-ui/config/http-config.js +36 -0
  196. package/lib/webview-ui/config/http-config.js.map +1 -0
  197. package/{types → lib}/webview-ui/constants.d.ts +1 -0
  198. package/lib/webview-ui/constants.d.ts.map +1 -0
  199. package/lib/webview-ui/constants.js +1 -0
  200. package/lib/webview-ui/constants.js.map +1 -0
  201. package/lib/webview-ui/contexts/AgentContext.d.ts +13 -0
  202. package/lib/webview-ui/contexts/AgentContext.d.ts.map +1 -0
  203. package/lib/webview-ui/contexts/AgentContext.js +19 -0
  204. package/lib/webview-ui/contexts/AgentContext.js.map +1 -0
  205. package/lib/webview-ui/contexts/AuthContext.d.ts +17 -0
  206. package/lib/webview-ui/contexts/AuthContext.d.ts.map +1 -0
  207. package/lib/webview-ui/contexts/AuthContext.js +79 -0
  208. package/lib/webview-ui/contexts/AuthContext.js.map +1 -0
  209. package/{types → lib}/webview-ui/contexts/ThemeContext.d.ts +1 -0
  210. package/lib/webview-ui/contexts/ThemeContext.d.ts.map +1 -0
  211. package/lib/webview-ui/contexts/ThemeContext.js +6 -35
  212. package/lib/webview-ui/contexts/ThemeContext.js.map +1 -0
  213. package/{types → lib}/webview-ui/hooks/useAgentStatus.d.ts +5 -0
  214. package/lib/webview-ui/hooks/useAgentStatus.d.ts.map +1 -0
  215. package/lib/webview-ui/hooks/useAgentStatus.js +39 -19
  216. package/lib/webview-ui/hooks/useAgentStatus.js.map +1 -0
  217. package/lib/webview-ui/hooks/useUploader.d.ts +19 -0
  218. package/lib/webview-ui/hooks/useUploader.d.ts.map +1 -0
  219. package/lib/webview-ui/hooks/useUploader.js +132 -0
  220. package/lib/webview-ui/hooks/useUploader.js.map +1 -0
  221. package/lib/webview-ui/hooks/useUserAvatar.d.ts +28 -0
  222. package/lib/webview-ui/hooks/useUserAvatar.d.ts.map +1 -0
  223. package/lib/webview-ui/hooks/useUserAvatar.js +74 -0
  224. package/lib/webview-ui/hooks/useUserAvatar.js.map +1 -0
  225. package/{types → lib}/webview-ui/index.d.ts +1 -0
  226. package/lib/webview-ui/index.d.ts.map +1 -0
  227. package/lib/webview-ui/index.js +4 -3
  228. package/lib/webview-ui/index.js.map +1 -0
  229. package/lib/webview-ui/services/agent-service.d.ts +106 -0
  230. package/lib/webview-ui/services/agent-service.d.ts.map +1 -0
  231. package/lib/webview-ui/services/agent-service.js +52 -25
  232. package/lib/webview-ui/services/agent-service.js.map +1 -0
  233. package/lib/webview-ui/services/index.d.ts +3 -0
  234. package/lib/webview-ui/services/index.d.ts.map +1 -0
  235. package/lib/webview-ui/services/index.js +19 -0
  236. package/lib/webview-ui/services/index.js.map +1 -0
  237. package/{types → lib}/webview-ui/services/logger-service.d.ts +18 -1
  238. package/lib/webview-ui/services/logger-service.d.ts.map +1 -0
  239. package/lib/webview-ui/services/logger-service.js +45 -27
  240. package/lib/webview-ui/services/logger-service.js.map +1 -0
  241. package/{types → lib}/webview-ui/styles/copilot.d.ts +1 -0
  242. package/lib/webview-ui/styles/copilot.d.ts.map +1 -0
  243. package/lib/webview-ui/styles/copilot.js +1 -0
  244. package/lib/webview-ui/styles/copilot.js.map +1 -0
  245. package/{types → lib}/webview-ui/styles/workarea.d.ts +1 -0
  246. package/lib/webview-ui/styles/workarea.d.ts.map +1 -0
  247. package/lib/webview-ui/styles/workarea.js +1 -0
  248. package/lib/webview-ui/styles/workarea.js.map +1 -0
  249. package/{types → lib}/webview-ui/types.d.ts +15 -1
  250. package/lib/webview-ui/types.d.ts.map +1 -0
  251. package/lib/webview-ui/types.js +1 -0
  252. package/lib/webview-ui/types.js.map +1 -0
  253. package/lib/webview-ui/utils/cos.d.ts +65 -0
  254. package/lib/webview-ui/utils/cos.d.ts.map +1 -0
  255. package/lib/webview-ui/utils/cos.js +113 -0
  256. package/lib/webview-ui/utils/cos.js.map +1 -0
  257. package/lib/webview-ui/utils/http-client.d.ts +44 -0
  258. package/lib/webview-ui/utils/http-client.d.ts.map +1 -0
  259. package/lib/webview-ui/utils/http-client.js +101 -0
  260. package/lib/webview-ui/utils/http-client.js.map +1 -0
  261. package/lib/webview-ui/utils/stream-text-handler.d.ts +4 -0
  262. package/lib/webview-ui/utils/stream-text-handler.d.ts.map +1 -0
  263. package/lib/webview-ui/utils/stream-text-handler.js +42 -0
  264. package/lib/webview-ui/utils/stream-text-handler.js.map +1 -0
  265. package/lib/webview-ui/utils/upload.d.ts +8 -0
  266. package/lib/webview-ui/utils/upload.d.ts.map +1 -0
  267. package/lib/webview-ui/utils/upload.js +22 -0
  268. package/lib/webview-ui/utils/upload.js.map +1 -0
  269. package/{types → lib}/webview-ui/widgets/BubbleComponents.d.ts +1 -5
  270. package/lib/webview-ui/widgets/BubbleComponents.d.ts.map +1 -0
  271. package/lib/webview-ui/widgets/BubbleComponents.js +17 -69
  272. package/lib/webview-ui/widgets/BubbleComponents.js.map +1 -0
  273. package/lib/webview-ui/widgets/ChatInput.d.ts +24 -0
  274. package/lib/webview-ui/widgets/ChatInput.d.ts.map +1 -0
  275. package/lib/webview-ui/widgets/ChatInput.js +113 -0
  276. package/lib/webview-ui/widgets/ChatInput.js.map +1 -0
  277. package/{types → lib}/webview-ui/widgets/LogPanel.d.ts +1 -0
  278. package/lib/webview-ui/widgets/LogPanel.d.ts.map +1 -0
  279. package/lib/webview-ui/widgets/LogPanel.js +37 -44
  280. package/lib/webview-ui/widgets/LogPanel.js.map +1 -0
  281. package/{types → lib}/webview-ui/widgets/SystemLogs.d.ts +7 -0
  282. package/lib/webview-ui/widgets/SystemLogs.d.ts.map +1 -0
  283. package/lib/webview-ui/widgets/SystemLogs.js +243 -187
  284. package/lib/webview-ui/widgets/SystemLogs.js.map +1 -0
  285. package/{types → lib}/webview-ui/widgets/ToolBar.d.ts +5 -0
  286. package/lib/webview-ui/widgets/ToolBar.d.ts.map +1 -0
  287. package/lib/webview-ui/widgets/ToolBar.js +49 -68
  288. package/lib/webview-ui/widgets/ToolBar.js.map +1 -0
  289. package/{types → lib}/webview-ui/widgets/index.d.ts +4 -2
  290. package/lib/webview-ui/widgets/index.d.ts.map +1 -0
  291. package/lib/webview-ui/widgets/index.js +4 -2
  292. package/lib/webview-ui/widgets/index.js.map +1 -0
  293. package/package.json +13 -4
  294. package/public/assets/main.js +141 -118
  295. package/public/assets/style.css +1 -1
  296. package/lib/webview-ui/types/index.js +0 -2
  297. package/types/index.d.ts +0 -3
  298. package/types/simulator.d.ts +0 -15
  299. package/types/types.d.ts +0 -6
  300. package/types/utils.d.ts +0 -1
  301. package/types/webview-ui/App.d.ts +0 -3
  302. package/types/webview-ui/types/index.d.ts +0 -20
@@ -33,28 +33,63 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ const jsx_runtime_1 = require("react/jsx-runtime");
36
37
  const icons_1 = require("@ant-design/icons");
37
38
  const icons_2 = require("@ant-design/icons");
38
39
  const x_1 = require("@ant-design/x");
39
40
  const antd_1 = require("antd");
40
41
  const antd_2 = require("antd");
41
42
  const react_1 = __importStar(require("react"));
43
+ const upload_config_1 = require("../config/upload.config");
42
44
  const Agent_1 = require("./Agent");
43
45
  const ErrorBoundary_1 = require("./ErrorBoundary");
44
46
  const components_1 = require("./components");
47
+ const cos_config_1 = require("./config/cos-config");
45
48
  const constants_1 = require("./constants");
49
+ const AgentContext_1 = require("./contexts/AgentContext");
50
+ const AuthContext_1 = require("./contexts/AuthContext");
46
51
  const ThemeContext_1 = require("./contexts/ThemeContext");
47
52
  const useAgentStatus_1 = require("./hooks/useAgentStatus");
53
+ const useUploader_1 = require("./hooks/useUploader");
54
+ const useUserAvatar_1 = require("./hooks/useUserAvatar");
48
55
  const copilot_1 = require("./styles/copilot");
49
56
  const workarea_1 = require("./styles/workarea");
57
+ const http_client_1 = require("./utils/http-client");
58
+ const stream_text_handler_1 = require("./utils/stream-text-handler");
50
59
  const widgets_1 = require("./widgets");
51
60
  const LogPanel_1 = require("./widgets/LogPanel");
61
+ const getBase64 = (file) => new Promise((resolve, reject) => {
62
+ const reader = new FileReader();
63
+ reader.readAsDataURL(file);
64
+ reader.onload = () => resolve(reader.result);
65
+ reader.onerror = (error) => reject(error);
66
+ });
67
+ // 根据 mimeType 确定文件类型的工具函数
68
+ const getFileTypeFromMimeType = (mimeType) => {
69
+ const normalizedType = mimeType.toLowerCase();
70
+ if (normalizedType.startsWith("image/")) {
71
+ return "image";
72
+ }
73
+ else if (normalizedType === "application/pdf") {
74
+ return "pdf";
75
+ }
76
+ else if (normalizedType.startsWith("video/")) {
77
+ return "video";
78
+ }
79
+ else if (normalizedType.startsWith("audio/")) {
80
+ return "audio";
81
+ }
82
+ else {
83
+ return "document";
84
+ }
85
+ };
52
86
  const ChatAgent = ({ agentSimulatorInfo, onMessageUpdate, onRequestStart, onRequestEnd, onUserSubmit, onCancel, }) => {
53
- const abortController = (0, react_1.useRef)(null);
87
+ let abortController = (0, react_1.useRef)(null);
54
88
  const [agent] = (0, x_1.useXAgent)({
55
89
  baseURL: (0, Agent_1.getSendMessageUri)(agentSimulatorInfo),
56
90
  });
57
- const handleUserSubmit = (0, react_1.useCallback)((val, messages) => {
91
+ const handleUserSubmit = (0, react_1.useCallback)((val, messages, files) => {
92
+ // 添加用户消息
58
93
  const userMessage = {
59
94
  id: `user-${Date.now()}`,
60
95
  role: "user",
@@ -65,101 +100,198 @@ const ChatAgent = ({ agentSimulatorInfo, onMessageUpdate, onRequestStart, onRequ
65
100
  isUiDiscard: false,
66
101
  uiTimeStr: new Date().toLocaleTimeString(),
67
102
  type: "answer",
103
+ files: files || [],
68
104
  };
69
105
  const newMessages = [...messages, userMessage];
70
106
  onMessageUpdate(newMessages);
71
107
  onRequestStart();
72
- agent.request({
108
+ // 发送请求(将图文转为多模态消息内容)
109
+ const contentParts = [];
110
+ if (files && files.length > 0) {
111
+ files.forEach((file) => {
112
+ if (file.type === "image" && file.url) {
113
+ contentParts.push({
114
+ type: "image_url",
115
+ image_url: { url: file.url },
116
+ });
117
+ }
118
+ else if (file.type === "pdf" && file.url) {
119
+ contentParts.push({
120
+ type: "doc_url",
121
+ doc_url: [file.url],
122
+ file_parsing_strategy: "auto",
123
+ });
124
+ }
125
+ // 其他类型暂不参与多模态对话内容,仍在气泡中展示
126
+ });
127
+ }
128
+ if (val && val.trim()) {
129
+ contentParts.push({ type: "text", text: val.trim() });
130
+ }
131
+ const requestData = {
73
132
  msg: val,
74
- history: [],
75
- }, {
133
+ files: files?.map((file) => ({
134
+ url: file.url,
135
+ type: file.type,
136
+ size: file.size,
137
+ mimeType: file.mimeType,
138
+ })) || [],
139
+ history: contentParts.length
140
+ ? [
141
+ {
142
+ role: "user",
143
+ content: contentParts,
144
+ },
145
+ ]
146
+ : [],
147
+ };
148
+ agent.request(requestData, {
76
149
  onUpdate: (chunk) => {
77
150
  try {
78
- if (chunk === null || chunk === void 0 ? void 0 : chunk.data) {
79
- const data = typeof chunk.data === "string" ? chunk.data : chunk.data.toString();
80
- if (data.endsWith("[DONE]")) {
151
+ let message = null;
152
+ if (typeof chunk?.data === "string") {
153
+ message = (0, stream_text_handler_1.parseStreamChunk)(chunk.data);
154
+ if (!message)
81
155
  return;
156
+ }
157
+ else if (chunk && typeof chunk === "object") {
158
+ message = (0, stream_text_handler_1.parseNonStreamChunk)(chunk);
159
+ }
160
+ if (!message || typeof message !== "object") {
161
+ console.warn("Invalid message object:", message);
162
+ return;
163
+ }
164
+ // 兼容两种格式:message (旧) 和 delta (新)
165
+ const choice = message.choices[0];
166
+ const messageData = choice.message || choice.delta || {};
167
+ // 检测错误类型:空 type 或 "error" type,或者有 finish_reason 为 "error"
168
+ const isError = (choice.message && !messageData.type) || messageData.type === "error" || choice.finish_reason === "error";
169
+ const msgType = isError ? "error" : (messageData.type || "answer");
170
+ const currentText = messageData.content || "";
171
+ const currentReasoning = messageData.reasoning_content || "";
172
+ const messageId = message.id;
173
+ // 对于错误情况,提取错误信息
174
+ const errorInfo = isError
175
+ ? {
176
+ message: message.error || currentText || message.message || "未知错误",
177
+ code: message.code,
178
+ log_id: message.log_id,
179
+ rawData: message,
82
180
  }
83
- let message;
84
- try {
85
- message = JSON.parse(data);
181
+ : null;
182
+ onMessageUpdate((prev) => {
183
+ const newMessages = [...prev];
184
+ let existingIndex = newMessages.findIndex((msg) => msg.id === messageId);
185
+ if (existingIndex === -1) {
186
+ const newMessage = {
187
+ id: messageId,
188
+ role: "assistant",
189
+ content: "",
190
+ reasoningContent: "",
191
+ isThinking: true,
192
+ isTimeout: false,
193
+ isInterrupted: false,
194
+ isUiDiscard: false,
195
+ uiTimeStr: new Date().toLocaleTimeString(),
196
+ type: "thinking",
197
+ cards: [],
198
+ timestamp: Date.now(),
199
+ };
200
+ newMessages.push(newMessage);
201
+ existingIndex = newMessages.length - 1;
86
202
  }
87
- catch (parseError) {
88
- console.error("Failed to parse message data:", parseError);
89
- return;
203
+ const existingMessage = newMessages[existingIndex];
204
+ // 创建一个可变副本进行更新
205
+ const updatedMessage = {
206
+ ...existingMessage,
207
+ };
208
+ updatedMessage.reasoningContent = (updatedMessage.reasoningContent || "") + currentReasoning;
209
+ updatedMessage.isThinking = !!currentReasoning;
210
+ // 根据消息类型处理
211
+ if (msgType === "error") {
212
+ // 错误类型处理
213
+ updatedMessage.content = errorInfo?.message || "处理失败";
214
+ updatedMessage.type = "error";
215
+ updatedMessage.isThinking = false;
216
+ // 将完整的错误信息存储在 cards 中供 ErrorCard 使用
217
+ updatedMessage.cards = [
218
+ {
219
+ type: "error_card",
220
+ content: JSON.stringify(errorInfo),
221
+ },
222
+ ];
90
223
  }
91
- if (!message || typeof message !== "object") {
92
- console.warn("Invalid message object:", message);
93
- return;
224
+ else if (msgType === "answer") {
225
+ updatedMessage.content = (updatedMessage.content || "") + currentText;
226
+ updatedMessage.type = "answer";
94
227
  }
95
- const msgType = message.choices[0].message.type;
96
- const currentText = message.choices[0].message.content || "";
97
- const currentReasoning = message.choices[0].message.reasoning_content || "";
98
- const messageId = message.id;
99
- onMessageUpdate((prev) => {
100
- const newMessages = [...prev];
101
- let existingIndex = newMessages.findIndex((msg) => msg.id === messageId);
102
- if (existingIndex === -1) {
103
- const newMessage = {
104
- id: messageId,
105
- role: "assistant",
106
- content: "",
107
- reasoningContent: "",
108
- isThinking: true,
109
- isTimeout: false,
110
- isInterrupted: false,
111
- isUiDiscard: false,
112
- uiTimeStr: new Date().toLocaleTimeString(),
113
- type: "thinking",
114
- cards: [],
115
- timestamp: Date.now(),
116
- };
117
- newMessages.push(newMessage);
118
- existingIndex = newMessages.length - 1;
228
+ else if ([
229
+ "function_call",
230
+ "function_call_response",
231
+ "knowledge_base_search",
232
+ "knowledge_base_search_response",
233
+ ].includes(msgType)) {
234
+ const cards = updatedMessage.cards ? [...updatedMessage.cards] : [];
235
+ const existingCardIndex = cards.findIndex((card) => card.type === msgType);
236
+ const newCard = {
237
+ type: msgType,
238
+ content: currentText,
239
+ };
240
+ if (existingCardIndex !== -1) {
241
+ // 如果卡片已存在,则更新它 (流式更新卡片内容)
242
+ cards[existingCardIndex].content += currentText;
119
243
  }
120
- const existingMessage = newMessages[existingIndex];
121
- const updatedMessage = Object.assign({}, existingMessage);
122
- updatedMessage.reasoningContent = (updatedMessage.reasoningContent || "") + currentReasoning;
123
- updatedMessage.isThinking = !!currentReasoning;
124
- if (msgType === "answer") {
125
- updatedMessage.content = (updatedMessage.content || "") + currentText;
126
- updatedMessage.type = "answer";
244
+ else {
245
+ cards.push(newCard);
127
246
  }
128
- else if ([
129
- "function_call",
130
- "function_call_response",
131
- "knowledge_base_search",
132
- "knowledge_base_search_response",
133
- ].includes(msgType)) {
134
- const cards = updatedMessage.cards ? [...updatedMessage.cards] : [];
135
- const existingCardIndex = cards.findIndex((card) => card.type === msgType);
136
- const newCard = {
137
- type: msgType,
138
- content: currentText,
139
- };
140
- if (existingCardIndex !== -1) {
141
- cards[existingCardIndex].content += currentText;
142
- }
143
- else {
144
- cards.push(newCard);
145
- }
146
- updatedMessage.cards = cards;
147
- if (existingMessage.type === "thinking") {
148
- updatedMessage.type = msgType;
149
- }
247
+ updatedMessage.cards = cards;
248
+ // 如果消息还在思考中,则更新其主类型
249
+ if (existingMessage.type === "thinking") {
250
+ updatedMessage.type = msgType;
150
251
  }
151
- newMessages[existingIndex] = updatedMessage;
152
- return newMessages;
153
- });
154
- }
252
+ }
253
+ // 图片/视频类型:主内容按图片渲染,type 跟随分片类型
254
+ else if (msgType === "image" || msgType === "video") {
255
+ if (currentText) {
256
+ updatedMessage.content = currentText; // 图片/视频 URL/base64
257
+ }
258
+ updatedMessage.type = msgType;
259
+ // 图片/视频结果为最终结果,确保结束思考态以触发渲染
260
+ updatedMessage.isThinking = false;
261
+ }
262
+ // 异步任务类型:统一走卡片渲染
263
+ else if (msgType === "async_task") {
264
+ const cards = updatedMessage.cards ? [...updatedMessage.cards] : [];
265
+ const existingCardIndex = cards.findIndex((card) => card.type === msgType);
266
+ const newCard = {
267
+ type: msgType,
268
+ content: currentText,
269
+ };
270
+ if (existingCardIndex !== -1) {
271
+ cards[existingCardIndex].content += currentText;
272
+ }
273
+ else {
274
+ cards.push(newCard);
275
+ }
276
+ updatedMessage.cards = cards;
277
+ if (existingMessage.type === "thinking") {
278
+ updatedMessage.type = msgType;
279
+ }
280
+ }
281
+ newMessages[existingIndex] = updatedMessage;
282
+ return newMessages;
283
+ });
155
284
  }
156
285
  catch (error) {
157
286
  console.error("Transform message error:", error);
158
287
  }
159
288
  },
160
- onSuccess: () => {
289
+ onSuccess: (chunks) => {
161
290
  onMessageUpdate((prev) => {
162
- return prev.map((msg) => (Object.assign(Object.assign({}, msg), { isThinking: false })));
291
+ return prev.map((msg) => ({
292
+ ...msg,
293
+ isThinking: false,
294
+ }));
163
295
  });
164
296
  onRequestEnd();
165
297
  },
@@ -169,46 +301,59 @@ const ChatAgent = ({ agentSimulatorInfo, onMessageUpdate, onRequestStart, onRequ
169
301
  const newMessages = [...prev];
170
302
  const lastMessageIndex = newMessages.length - 1;
171
303
  if (lastMessageIndex >= 0 && newMessages[lastMessageIndex].isThinking) {
172
- newMessages[lastMessageIndex] = Object.assign(Object.assign({}, newMessages[lastMessageIndex]), { content: error.name === "AbortError" ? "请求已取消" : "请求失败,请重试!", isThinking: false });
304
+ newMessages[lastMessageIndex] = {
305
+ ...newMessages[lastMessageIndex],
306
+ content: error.name === "AbortError" ? "请求已取消" : "请求失败,请重试!",
307
+ isThinking: false,
308
+ };
173
309
  }
174
310
  return newMessages;
175
311
  });
176
312
  onRequestEnd();
177
313
  },
178
314
  onStream: (controller) => {
315
+ // @ts-ignore
179
316
  abortController.current = controller;
180
317
  },
181
318
  });
182
319
  }, [agent, onMessageUpdate, onRequestStart, onRequestEnd]);
183
320
  const handleCancel = (0, react_1.useCallback)(() => {
184
- var _a;
185
- (_a = abortController.current) === null || _a === void 0 ? void 0 : _a.abort();
321
+ abortController.current?.abort();
186
322
  }, []);
323
+ // 向父组件暴露方法
187
324
  react_1.default.useEffect(() => {
188
325
  onUserSubmit(handleUserSubmit);
189
326
  onCancel(handleCancel);
190
327
  }, [handleUserSubmit, handleCancel, onUserSubmit, onCancel]);
191
- return react_1.default.createElement("div", { style: { display: "none" } });
328
+ // 返回一个隐藏的 div,而不是 null
329
+ return (0, jsx_runtime_1.jsx)("div", { style: { display: "none" } });
192
330
  };
193
331
  const Copilot = () => {
194
332
  const { isDark } = (0, ThemeContext_1.useThemeHook)();
195
333
  const { token } = antd_1.theme.useToken();
196
334
  const { styles } = (0, copilot_1.useCopilotStyle)();
197
- const attachmentsRef = (0, react_1.useRef)(null);
335
+ const { isLoggedIn } = (0, AuthContext_1.useAuth)();
336
+ const { getUserAvatarProps } = (0, useUserAvatar_1.useUserAvatar)();
198
337
  const chatUserSubmitRef = (0, react_1.useRef)(null);
199
338
  const chatCancelRef = (0, react_1.useRef)(null);
339
+ // ==================== State ====================
200
340
  const [attachmentsOpen, setAttachmentsOpen] = (0, react_1.useState)(false);
201
- const [files, setFiles] = (0, react_1.useState)([]);
341
+ const [attachedFiles, setAttachedFiles] = (0, react_1.useState)([]);
202
342
  const [inputValue, setInputValue] = (0, react_1.useState)("");
203
343
  const [messages, setMessages] = (0, react_1.useState)([]);
204
344
  const [loading, setLoading] = (0, react_1.useState)(false);
345
+ // ==================== Agent Status ====================
205
346
  const { agentSimulatorInfo, debugStatus, isConnecting, retryConnection } = (0, useAgentStatus_1.useAgentStatus)();
347
+ // ========== Widgets 相关状态 ==========
206
348
  const [showSystemLogs, setShowSystemLogs] = (0, react_1.useState)(false);
207
349
  const [activeLogTab, setActiveLogTab] = (0, react_1.useState)("system");
350
+ const [currentModule, setCurrentModule] = (0, react_1.useState)(null);
351
+ // ToolBar 事件
208
352
  const handleClearChat = () => {
209
353
  setMessages([]);
210
354
  };
211
355
  const handleToggleLogs = () => setShowSystemLogs((v) => !v);
356
+ // ==================== 消息发送可用性检查 ====================
212
357
  const canSendMessage = agentSimulatorInfo && debugStatus === "normal";
213
358
  const getDisabledReason = () => {
214
359
  if (!agentSimulatorInfo) {
@@ -217,15 +362,37 @@ const Copilot = () => {
217
362
  if (debugStatus !== "normal") {
218
363
  return "调试状态异常,无法发送消息";
219
364
  }
220
- return "";
365
+ return "Ask or input / use skills";
221
366
  };
367
+ // ==================== Event ====================
222
368
  const handleUserSubmit = (val) => {
223
369
  if (!canSendMessage) {
224
370
  antd_2.message.warning(getDisabledReason());
225
371
  return;
226
372
  }
373
+ // 将附加文件中已完成上传的转为 MultimodalFile
374
+ const files = (attachedFiles || [])
375
+ .filter((f) => f.status === "done" && f.url)
376
+ .map((f) => {
377
+ // 根据 mimeType 确定文件类型
378
+ const fileType = getFileTypeFromMimeType(f.type || f.mimeType || "application/octet-stream");
379
+ return {
380
+ id: f.uid || f.id || `file_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
381
+ name: f.name || "未知文件",
382
+ url: f.url,
383
+ type: fileType,
384
+ size: f.size || f.originFileObj?.size || 0,
385
+ mimeType: f.type || f.mimeType || "application/octet-stream",
386
+ uploadTime: f.uploadTime || Date.now(),
387
+ status: "success",
388
+ thumbnail: fileType === "image" ? f.url : undefined,
389
+ };
390
+ });
227
391
  if (chatUserSubmitRef.current) {
228
- chatUserSubmitRef.current(val, messages);
392
+ chatUserSubmitRef.current(val, messages, files);
393
+ // 发送后清空附件面板
394
+ setAttachedFiles([]);
395
+ setAttachmentsOpen(false);
229
396
  }
230
397
  };
231
398
  const handleCancel = () => {
@@ -233,109 +400,154 @@ const Copilot = () => {
233
400
  chatCancelRef.current();
234
401
  }
235
402
  };
403
+ // 处理文件上传
404
+ const { uploadFiles } = (0, useUploader_1.useUploader)({
405
+ bizName: upload_config_1.uploadBizConfig.bizName,
406
+ scene: upload_config_1.uploadBizConfig.scene,
407
+ getToken: async () => {
408
+ const res = await http_client_1.httpClient.get(`/api/upload/token`, {
409
+ params: {
410
+ bizName: upload_config_1.uploadBizConfig.bizName,
411
+ scene: upload_config_1.uploadBizConfig.scene,
412
+ },
413
+ });
414
+ if (res.code === 0) {
415
+ return res.data;
416
+ }
417
+ throw new Error(`处理文件上传,获取上传Token失败: ${res.message}`);
418
+ },
419
+ });
420
+ const enqueueUpload = (file) => {
421
+ const uid = `manual_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
422
+ const newItem = {
423
+ uid,
424
+ name: file.name,
425
+ status: "uploading",
426
+ originFileObj: file,
427
+ percent: 0,
428
+ };
429
+ setAttachedFiles((prev) => [...prev, newItem]);
430
+ uploadFiles([file], {
431
+ onStart: () => { },
432
+ onComplete: (ok) => {
433
+ setAttachedFiles((prev) => prev.map((it) => (it.uid === uid ? { ...it, status: "done", url: ok.url, percent: 100 } : it)));
434
+ antd_2.message.success(`${ok.name} 上传成功`);
435
+ },
436
+ onError: (err) => {
437
+ setAttachedFiles((prev) => prev.map((it) => (it.uid === uid ? { ...it, status: "error" } : it)));
438
+ antd_2.message.error(`${file.name} 上传失败: ${err.message}`);
439
+ },
440
+ });
441
+ };
442
+ const handleFileUpload = async (fileList) => {
443
+ if (!fileList?.length)
444
+ return;
445
+ fileList.forEach((f) => enqueueUpload(f));
446
+ };
447
+ // 获取文件类型
448
+ const getFileType = (file) => {
449
+ const mimeType = file.type.toLowerCase();
450
+ return cos_config_1.uploadConfig.fileTypeMap[mimeType] || "document";
451
+ };
236
452
  const onPasteFile = (_, files) => {
237
- var _a;
238
- for (const file of files) {
239
- (_a = attachmentsRef.current) === null || _a === void 0 ? void 0 : _a.upload(file);
453
+ if (!isLoggedIn) {
454
+ antd_2.message.warning("请先登录后再上传文件");
455
+ return;
240
456
  }
457
+ const fileArray = Array.from(files);
458
+ handleFileUpload(fileArray);
241
459
  setAttachmentsOpen(true);
242
460
  };
243
- const chatList = (react_1.default.createElement("div", { className: styles.chatList, style: { display: "flex", flexDirection: "column" } }, (messages === null || messages === void 0 ? void 0 : messages.length) ? (react_1.default.createElement(x_1.Bubble.List, { style: { height: "100%", padding: "12px 16px" }, items: messages.map((item) => {
244
- return {
245
- content: item.content,
246
- role: item.role,
247
- messageRender: () => (item.role === "user" ? item.content : react_1.default.createElement(components_1.MessageRenderer, { message: item })),
248
- };
249
- }), roles: {
250
- assistant: {
251
- placement: "start",
252
- loadingRender: () => (react_1.default.createElement(antd_2.Space, null,
253
- react_1.default.createElement(antd_2.Spin, { size: "small" }),
254
- "Custom loading...")),
255
- avatar: {
256
- icon: react_1.default.createElement(icons_2.AliwangwangFilled, null),
257
- style: { background: token.colorInfoText },
258
- },
259
- styles: {
260
- content: {
261
- backgroundColor: "transparent",
262
- padding: 0,
461
+ // 预览功能如需启用,请结合 UploadFile 结构扩展;当前手动上传暂不启用内置预览。
462
+ // ==================== Nodes ====================
463
+ const chatList = ((0, jsx_runtime_1.jsx)("div", { className: styles.chatList, style: { display: "flex", flexDirection: "column" }, children: messages?.length ? ((0, jsx_runtime_1.jsx)(x_1.Bubble.List, { style: { height: "100%", padding: "12px 16px" }, items: messages.map((item) => {
464
+ return {
465
+ content: item.content,
466
+ role: item.role,
467
+ messageRender: () => (0, jsx_runtime_1.jsx)(components_1.MessageRenderer, { message: item }),
468
+ };
469
+ }), roles: {
470
+ assistant: {
471
+ placement: "start",
472
+ loadingRender: () => ((0, jsx_runtime_1.jsxs)(antd_2.Space, { children: [(0, jsx_runtime_1.jsx)(antd_2.Spin, { size: "small" }), "Custom loading..."] })),
473
+ avatar: {
474
+ icon: (0, jsx_runtime_1.jsx)(icons_2.AliwangwangFilled, {}),
475
+ style: { background: token.colorInfoText },
476
+ },
477
+ styles: {
478
+ content: {
479
+ backgroundColor: "transparent",
480
+ padding: 0,
481
+ },
263
482
  },
264
483
  },
265
- },
266
- user: {
267
- placement: "start",
268
- avatar: {
269
- icon: react_1.default.createElement(icons_2.UserOutlined, null),
270
- style: {
271
- background: token.colorSuccessText,
484
+ user: {
485
+ placement: "start",
486
+ avatar: {
487
+ ...getUserAvatarProps(),
488
+ size: 40,
272
489
  },
273
490
  },
274
- },
275
- } })) : (react_1.default.createElement(react_1.default.Fragment, null,
276
- react_1.default.createElement(x_1.Welcome, { variant: "borderless", title: "\uD83D\uDC4B Hello, \u5C0F\u7A0B\u5E8F\u5F00\u653E\u5E73\u53F0\u667A\u80FD\u4F53\u8C03\u8BD5\u5668", description: "\u63D0\u4F9B Agent \u8C03\u8BD5\u6A21\u62DF\u529F\u80FD", className: styles.chatWelcome, style: {
277
- backgroundImage: isDark
278
- ? "linear-gradient(97deg, rgba(90,196,255,0.12) 0%, rgba(174,136,255,0.12) 100%)"
279
- : "linear-gradient(97deg, #f2f9fe 0%, #f7f3ff 100%)",
280
- } }),
281
- react_1.default.createElement(x_1.Prompts, { vertical: true, title: "\u6211\u53EF\u4EE5\u5E2E\u52A9\u4F60\uFF1A", items: constants_1.MOCK_QUESTIONS.map((i) => ({
282
- key: i,
283
- description: i,
284
- })), onItemClick: (info) => { var _a; return handleUserSubmit((_a = info === null || info === void 0 ? void 0 : info.data) === null || _a === void 0 ? void 0 : _a.description); }, style: {
285
- marginInline: 16,
286
- }, styles: {
287
- title: { fontSize: 14 },
288
- } })))));
289
- const sendHeader = (react_1.default.createElement(x_1.Sender.Header, { title: "Upload File", styles: { content: { padding: 0 } }, open: attachmentsOpen, onOpenChange: setAttachmentsOpen, forceRender: true },
290
- react_1.default.createElement(x_1.Attachments, { ref: attachmentsRef, beforeUpload: () => false, items: files, onChange: ({ fileList }) => setFiles(fileList), placeholder: (type) => type === "drop"
291
- ? { title: "Drop file here" }
491
+ } })) : ((0, jsx_runtime_1.jsx)(components_1.WelcomeModule, { onPromptSelect: handleUserSubmit, onModuleChange: setCurrentModule, isDark: isDark })) }));
492
+ const sendHeader = ((0, jsx_runtime_1.jsx)(x_1.Sender.Header, { title: "Upload File", styles: { content: { padding: 0 } }, open: attachmentsOpen, onOpenChange: (open) => {
493
+ if (!isLoggedIn && open) {
494
+ antd_2.message.warning("请先登录后再上传文件");
495
+ return;
496
+ }
497
+ setAttachmentsOpen(open);
498
+ }, forceRender: true, children: (0, jsx_runtime_1.jsx)(x_1.Attachments, { beforeUpload: (file) => {
499
+ // 登录校验
500
+ if (!isLoggedIn) {
501
+ antd_2.message.warning("请先登录后再上传文件");
502
+ return antd_2.Upload.LIST_IGNORE;
503
+ }
504
+ // 类型和大小校验
505
+ if (file.size > cos_config_1.uploadConfig.maxFileSize) {
506
+ antd_2.message.error(`文件大小不能超过 ${cos_config_1.uploadConfig.maxFileSize / 1024 / 1024}MB`);
507
+ return antd_2.Upload.LIST_IGNORE;
508
+ }
509
+ if (!cos_config_1.uploadConfig.allowedTypes.includes(file.type)) {
510
+ antd_2.message.error("不支持的文件类型");
511
+ return antd_2.Upload.LIST_IGNORE;
512
+ }
513
+ // 自定义上传:交由 enqueueUpload 统一入列与上传
514
+ enqueueUpload(file);
515
+ // 阻止组件默认入列与上传
516
+ return antd_2.Upload.LIST_IGNORE;
517
+ }, items: attachedFiles, onRemove: (file) => {
518
+ const index = attachedFiles.indexOf(file);
519
+ const newFileList = attachedFiles.slice();
520
+ newFileList.splice(index, 1);
521
+ setAttachedFiles(newFileList);
522
+ }, placeholder: (type) => type === "drop"
523
+ ? { title: "拖拽文件到此处上传" }
292
524
  : {
293
- icon: react_1.default.createElement(icons_1.CloudUploadOutlined, null),
294
- title: "Upload files",
295
- description: "Click or drag files to this area to upload",
296
- } })));
297
- const chatSender = (react_1.default.createElement("div", { className: styles.chatSend, style: {
298
- background: token.colorBgContainer,
299
- borderTop: `1px solid ${token.colorBorder}`,
300
- borderRadius: 0,
301
- padding: "16px 20px",
302
- } },
303
- react_1.default.createElement(x_1.Suggestion, { items: constants_1.MOCK_SUGGESTIONS, onSelect: (itemVal) => setInputValue(`[${itemVal}]:`) }, ({ onTrigger, onKeyDown }) => (react_1.default.createElement(x_1.Sender, { loading: loading, value: inputValue, disabled: !canSendMessage, onChange: (v) => {
304
- onTrigger(v === "/");
305
- setInputValue(v);
306
- }, onSubmit: () => {
307
- handleUserSubmit(inputValue);
308
- setInputValue("");
309
- }, onCancel: handleCancel, allowSpeech: true, placeholder: !canSendMessage ? getDisabledReason() : "Ask or input / use skills", onKeyDown: onKeyDown, header: sendHeader, prefix: react_1.default.createElement(antd_2.Button, { type: "text", icon: react_1.default.createElement(icons_1.PaperClipOutlined, { style: { fontSize: 18 } }), onClick: () => setAttachmentsOpen(!attachmentsOpen), disabled: !canSendMessage }), onPasteFile: onPasteFile, actions: (_, info) => {
310
- const { SendButton, LoadingButton, SpeechButton } = info.components;
311
- return (react_1.default.createElement("div", { style: {
312
- display: "flex",
313
- alignItems: "center",
314
- gap: 4,
315
- } },
316
- react_1.default.createElement(SpeechButton, { className: styles.speechButton, disabled: !canSendMessage }),
317
- loading ? (react_1.default.createElement(LoadingButton, { type: "default" })) : (react_1.default.createElement(SendButton, { type: "primary", disabled: !canSendMessage }))));
318
- } })))));
319
- return (react_1.default.createElement("div", { className: styles.copilotChat, style: {
320
- background: token.colorBgContainer,
321
- minHeight: "100vh",
322
- borderRadius: 0,
323
- boxShadow: "none",
324
- padding: 0,
325
- border: `1px solid ${token.colorBorder}`,
326
- } },
327
- react_1.default.createElement(widgets_1.ToolBar, { agentSimulatorInfo: agentSimulatorInfo, debugStatus: debugStatus, showSystemLogs: showSystemLogs, isConnecting: isConnecting, onRetryConnection: retryConnection, onClearChat: handleClearChat, onToggleLogs: handleToggleLogs }),
328
- react_1.default.createElement(LogPanel_1.LogPanel, { open: showSystemLogs, activeTab: activeLogTab, onTabChange: setActiveLogTab, onClose: () => setShowSystemLogs(false), agentSimulatorInfo: agentSimulatorInfo, height: constants_1.LOG_PANEL_HEIGHT, debugStatus: debugStatus }),
329
- chatList,
330
- chatSender,
331
- agentSimulatorInfo && (react_1.default.createElement(ChatAgent, { agentSimulatorInfo: agentSimulatorInfo, onMessageUpdate: setMessages, onRequestStart: () => setLoading(true), onRequestEnd: () => setLoading(false), onUserSubmit: (fn) => {
332
- chatUserSubmitRef.current = fn;
333
- }, onCancel: (fn) => {
334
- chatCancelRef.current = fn;
335
- } }))));
525
+ icon: (0, jsx_runtime_1.jsx)(icons_1.CloudUploadOutlined, {}),
526
+ title: "上传多模态文件",
527
+ description: "支持图片、PDF、视频、音频等文件格式",
528
+ } }) }));
529
+ const chatSender = ((0, jsx_runtime_1.jsx)(widgets_1.ChatInput, { loading: loading, inputValue: inputValue, canSendMessage: canSendMessage || false, isLoggedIn: isLoggedIn, attachedFiles: attachedFiles, uploadConfig: cos_config_1.uploadConfig, currentModule: currentModule, onInputChange: (value) => setInputValue(value || ""), onSubmit: handleUserSubmit, onCancel: handleCancel, onPasteFile: onPasteFile, enqueueUpload: enqueueUpload, onRemoveFile: (file) => {
530
+ const index = attachedFiles.indexOf(file);
531
+ const newFileList = attachedFiles.slice();
532
+ newFileList.splice(index, 1);
533
+ setAttachedFiles(newFileList);
534
+ }, getDisabledReason: getDisabledReason }));
535
+ return ((0, jsx_runtime_1.jsx)(AgentContext_1.AgentProvider, { agentSimulatorInfo: agentSimulatorInfo, children: (0, jsx_runtime_1.jsxs)("div", { className: styles.copilotChat, style: {
536
+ background: token.colorBgContainer,
537
+ minHeight: "100vh",
538
+ borderRadius: 0,
539
+ boxShadow: "none",
540
+ padding: 0,
541
+ border: `1px solid ${token.colorBorder}`,
542
+ }, children: [(0, jsx_runtime_1.jsx)(widgets_1.ToolBar, { agentSimulatorInfo: agentSimulatorInfo, debugStatus: debugStatus, showSystemLogs: showSystemLogs, isConnecting: isConnecting, onRetryConnection: retryConnection, onClearChat: handleClearChat, onToggleLogs: handleToggleLogs }), (0, jsx_runtime_1.jsx)(LogPanel_1.LogPanel, { open: showSystemLogs, activeTab: activeLogTab, onTabChange: setActiveLogTab, onClose: () => setShowSystemLogs(false), agentSimulatorInfo: agentSimulatorInfo, height: constants_1.LOG_PANEL_HEIGHT, debugStatus: debugStatus }), chatList, chatSender, agentSimulatorInfo && ((0, jsx_runtime_1.jsx)(ChatAgent, { agentSimulatorInfo: agentSimulatorInfo, onMessageUpdate: setMessages, onRequestStart: () => setLoading(true), onRequestEnd: () => setLoading(false), onUserSubmit: (fn) => {
543
+ chatUserSubmitRef.current = fn;
544
+ }, onCancel: (fn) => {
545
+ chatCancelRef.current = fn;
546
+ } }))] }) }));
336
547
  };
337
548
  const CopilotSimulator = () => {
338
549
  const { styles: workareaStyles } = (0, workarea_1.useWorkareaStyle)();
550
+ // 从 URL query 参数中读取 isDark
339
551
  const getIsDarkFromQuery = () => {
340
552
  const params = new URLSearchParams(window.location.search);
341
553
  return params.get("isDark") ? params.get("isDark") === "true" : false;
@@ -343,17 +555,16 @@ const CopilotSimulator = () => {
343
555
  const initIsDarkMode = getIsDarkFromQuery();
344
556
  const [darkMode, setDarkMode] = (0, react_1.useState)(initIsDarkMode);
345
557
  if (typeof require === "function") {
558
+ // 当前运行在IDE中,electron环境
346
559
  const { ipcRenderer } = require("electron");
560
+ // @ts-ignore
347
561
  ipcRenderer.on("setTheme", (event, isDark) => {
348
562
  setDarkMode(isDark);
349
563
  });
350
564
  }
351
- return (react_1.default.createElement(ThemeContext_1.ThemeProvider, { isDark: darkMode },
352
- react_1.default.createElement(antd_1.ConfigProvider, { theme: {
565
+ return ((0, jsx_runtime_1.jsx)(ThemeContext_1.ThemeProvider, { isDark: darkMode, children: (0, jsx_runtime_1.jsx)(antd_1.ConfigProvider, { theme: {
353
566
  algorithm: darkMode ? antd_1.theme.darkAlgorithm : antd_1.theme.defaultAlgorithm,
354
- } },
355
- react_1.default.createElement(ErrorBoundary_1.ErrorBoundary, null,
356
- react_1.default.createElement("div", { className: workareaStyles.copilotWrapper },
357
- react_1.default.createElement(Copilot, null))))));
567
+ }, children: (0, jsx_runtime_1.jsx)(AuthContext_1.AuthProvider, { children: (0, jsx_runtime_1.jsx)(ErrorBoundary_1.ErrorBoundary, { children: (0, jsx_runtime_1.jsx)("div", { className: workareaStyles.copilotWrapper, children: (0, jsx_runtime_1.jsx)(Copilot, {}) }) }) }) }) }));
358
568
  };
359
569
  exports.default = CopilotSimulator;
570
+ //# sourceMappingURL=App.js.map