@vectorx/agent-simulator 0.1.2 → 0.3.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 +362 -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 +143 -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,44 @@ 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
+ });
52
67
  const ChatAgent = ({ agentSimulatorInfo, onMessageUpdate, onRequestStart, onRequestEnd, onUserSubmit, onCancel, }) => {
53
- const abortController = (0, react_1.useRef)(null);
68
+ let abortController = (0, react_1.useRef)(null);
54
69
  const [agent] = (0, x_1.useXAgent)({
55
70
  baseURL: (0, Agent_1.getSendMessageUri)(agentSimulatorInfo),
56
71
  });
57
- const handleUserSubmit = (0, react_1.useCallback)((val, messages) => {
72
+ const handleUserSubmit = (0, react_1.useCallback)((val, messages, files) => {
73
+ // 添加用户消息
58
74
  const userMessage = {
59
75
  id: `user-${Date.now()}`,
60
76
  role: "user",
@@ -65,101 +81,191 @@ const ChatAgent = ({ agentSimulatorInfo, onMessageUpdate, onRequestStart, onRequ
65
81
  isUiDiscard: false,
66
82
  uiTimeStr: new Date().toLocaleTimeString(),
67
83
  type: "answer",
84
+ files: files || [],
68
85
  };
69
86
  const newMessages = [...messages, userMessage];
70
87
  onMessageUpdate(newMessages);
71
88
  onRequestStart();
72
- agent.request({
89
+ // 发送请求(将图文转为多模态消息内容)
90
+ const contentParts = [];
91
+ if (files && files.length > 0) {
92
+ files.forEach((file) => {
93
+ if (file.type === "image" && file.url) {
94
+ contentParts.push({
95
+ type: "image_url",
96
+ image_url: { url: file.url },
97
+ });
98
+ }
99
+ // 其他类型暂不参与多模态对话内容,仍在气泡中展示
100
+ });
101
+ }
102
+ if (val && val.trim()) {
103
+ contentParts.push({ type: "text", text: val.trim() });
104
+ }
105
+ const requestData = {
73
106
  msg: val,
74
- history: [],
75
- }, {
107
+ files: files?.map((file) => ({
108
+ url: file.url,
109
+ type: file.type,
110
+ size: file.size,
111
+ mimeType: file.mimeType,
112
+ })) || [],
113
+ history: contentParts.length
114
+ ? [
115
+ {
116
+ role: "user",
117
+ content: contentParts,
118
+ },
119
+ ]
120
+ : [],
121
+ };
122
+ agent.request(requestData, {
76
123
  onUpdate: (chunk) => {
77
124
  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]")) {
125
+ let message = null;
126
+ if (typeof chunk?.data === "string") {
127
+ message = (0, stream_text_handler_1.parseStreamChunk)(chunk.data);
128
+ if (!message)
81
129
  return;
130
+ }
131
+ else if (chunk && typeof chunk === "object") {
132
+ message = (0, stream_text_handler_1.parseNonStreamChunk)(chunk);
133
+ }
134
+ if (!message || typeof message !== "object") {
135
+ console.warn("Invalid message object:", message);
136
+ return;
137
+ }
138
+ // 兼容两种格式:message (旧) 和 delta (新)
139
+ const choice = message.choices[0];
140
+ const messageData = choice.message || choice.delta || {};
141
+ // 检测错误类型:空 type 或 "error" type,或者有 finish_reason 为 "error"
142
+ const isError = (choice.message && !messageData.type) || messageData.type === "error" || choice.finish_reason === "error";
143
+ const msgType = isError ? "error" : (messageData.type || "answer");
144
+ const currentText = messageData.content || "";
145
+ const currentReasoning = messageData.reasoning_content || "";
146
+ const messageId = message.id;
147
+ // 对于错误情况,提取错误信息
148
+ const errorInfo = isError
149
+ ? {
150
+ message: message.error || currentText || message.message || "未知错误",
151
+ code: message.code,
152
+ log_id: message.log_id,
153
+ rawData: message,
82
154
  }
83
- let message;
84
- try {
85
- message = JSON.parse(data);
155
+ : null;
156
+ onMessageUpdate((prev) => {
157
+ const newMessages = [...prev];
158
+ let existingIndex = newMessages.findIndex((msg) => msg.id === messageId);
159
+ if (existingIndex === -1) {
160
+ const newMessage = {
161
+ id: messageId,
162
+ role: "assistant",
163
+ content: "",
164
+ reasoningContent: "",
165
+ isThinking: true,
166
+ isTimeout: false,
167
+ isInterrupted: false,
168
+ isUiDiscard: false,
169
+ uiTimeStr: new Date().toLocaleTimeString(),
170
+ type: "thinking",
171
+ cards: [],
172
+ timestamp: Date.now(),
173
+ };
174
+ newMessages.push(newMessage);
175
+ existingIndex = newMessages.length - 1;
86
176
  }
87
- catch (parseError) {
88
- console.error("Failed to parse message data:", parseError);
89
- return;
177
+ const existingMessage = newMessages[existingIndex];
178
+ // 创建一个可变副本进行更新
179
+ const updatedMessage = {
180
+ ...existingMessage,
181
+ };
182
+ updatedMessage.reasoningContent = (updatedMessage.reasoningContent || "") + currentReasoning;
183
+ updatedMessage.isThinking = !!currentReasoning;
184
+ // 根据消息类型处理
185
+ if (msgType === "error") {
186
+ // 错误类型处理
187
+ updatedMessage.content = errorInfo?.message || "处理失败";
188
+ updatedMessage.type = "error";
189
+ updatedMessage.isThinking = false;
190
+ // 将完整的错误信息存储在 cards 中供 ErrorCard 使用
191
+ updatedMessage.cards = [
192
+ {
193
+ type: "error_card",
194
+ content: JSON.stringify(errorInfo),
195
+ },
196
+ ];
90
197
  }
91
- if (!message || typeof message !== "object") {
92
- console.warn("Invalid message object:", message);
93
- return;
198
+ else if (msgType === "answer") {
199
+ updatedMessage.content = (updatedMessage.content || "") + currentText;
200
+ updatedMessage.type = "answer";
94
201
  }
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;
202
+ else if ([
203
+ "function_call",
204
+ "function_call_response",
205
+ "knowledge_base_search",
206
+ "knowledge_base_search_response",
207
+ ].includes(msgType)) {
208
+ const cards = updatedMessage.cards ? [...updatedMessage.cards] : [];
209
+ const existingCardIndex = cards.findIndex((card) => card.type === msgType);
210
+ const newCard = {
211
+ type: msgType,
212
+ content: currentText,
213
+ };
214
+ if (existingCardIndex !== -1) {
215
+ // 如果卡片已存在,则更新它 (流式更新卡片内容)
216
+ cards[existingCardIndex].content += currentText;
119
217
  }
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";
218
+ else {
219
+ cards.push(newCard);
127
220
  }
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
- }
221
+ updatedMessage.cards = cards;
222
+ // 如果消息还在思考中,则更新其主类型
223
+ if (existingMessage.type === "thinking") {
224
+ updatedMessage.type = msgType;
150
225
  }
151
- newMessages[existingIndex] = updatedMessage;
152
- return newMessages;
153
- });
154
- }
226
+ }
227
+ // 图片/视频类型:主内容按图片渲染,type 跟随分片类型
228
+ else if (msgType === "image" || msgType === "video") {
229
+ if (currentText) {
230
+ updatedMessage.content = currentText; // 图片/视频 URL/base64
231
+ }
232
+ updatedMessage.type = msgType;
233
+ // 图片/视频结果为最终结果,确保结束思考态以触发渲染
234
+ updatedMessage.isThinking = false;
235
+ }
236
+ // 异步任务类型:统一走卡片渲染
237
+ else if (msgType === "async_task") {
238
+ const cards = updatedMessage.cards ? [...updatedMessage.cards] : [];
239
+ const existingCardIndex = cards.findIndex((card) => card.type === msgType);
240
+ const newCard = {
241
+ type: msgType,
242
+ content: currentText,
243
+ };
244
+ if (existingCardIndex !== -1) {
245
+ cards[existingCardIndex].content += currentText;
246
+ }
247
+ else {
248
+ cards.push(newCard);
249
+ }
250
+ updatedMessage.cards = cards;
251
+ if (existingMessage.type === "thinking") {
252
+ updatedMessage.type = msgType;
253
+ }
254
+ }
255
+ newMessages[existingIndex] = updatedMessage;
256
+ return newMessages;
257
+ });
155
258
  }
156
259
  catch (error) {
157
260
  console.error("Transform message error:", error);
158
261
  }
159
262
  },
160
- onSuccess: () => {
263
+ onSuccess: (chunks) => {
161
264
  onMessageUpdate((prev) => {
162
- return prev.map((msg) => (Object.assign(Object.assign({}, msg), { isThinking: false })));
265
+ return prev.map((msg) => ({
266
+ ...msg,
267
+ isThinking: false,
268
+ }));
163
269
  });
164
270
  onRequestEnd();
165
271
  },
@@ -169,46 +275,59 @@ const ChatAgent = ({ agentSimulatorInfo, onMessageUpdate, onRequestStart, onRequ
169
275
  const newMessages = [...prev];
170
276
  const lastMessageIndex = newMessages.length - 1;
171
277
  if (lastMessageIndex >= 0 && newMessages[lastMessageIndex].isThinking) {
172
- newMessages[lastMessageIndex] = Object.assign(Object.assign({}, newMessages[lastMessageIndex]), { content: error.name === "AbortError" ? "请求已取消" : "请求失败,请重试!", isThinking: false });
278
+ newMessages[lastMessageIndex] = {
279
+ ...newMessages[lastMessageIndex],
280
+ content: error.name === "AbortError" ? "请求已取消" : "请求失败,请重试!",
281
+ isThinking: false,
282
+ };
173
283
  }
174
284
  return newMessages;
175
285
  });
176
286
  onRequestEnd();
177
287
  },
178
288
  onStream: (controller) => {
289
+ // @ts-ignore
179
290
  abortController.current = controller;
180
291
  },
181
292
  });
182
293
  }, [agent, onMessageUpdate, onRequestStart, onRequestEnd]);
183
294
  const handleCancel = (0, react_1.useCallback)(() => {
184
- var _a;
185
- (_a = abortController.current) === null || _a === void 0 ? void 0 : _a.abort();
295
+ abortController.current?.abort();
186
296
  }, []);
297
+ // 向父组件暴露方法
187
298
  react_1.default.useEffect(() => {
188
299
  onUserSubmit(handleUserSubmit);
189
300
  onCancel(handleCancel);
190
301
  }, [handleUserSubmit, handleCancel, onUserSubmit, onCancel]);
191
- return react_1.default.createElement("div", { style: { display: "none" } });
302
+ // 返回一个隐藏的 div,而不是 null
303
+ return (0, jsx_runtime_1.jsx)("div", { style: { display: "none" } });
192
304
  };
193
305
  const Copilot = () => {
194
306
  const { isDark } = (0, ThemeContext_1.useThemeHook)();
195
307
  const { token } = antd_1.theme.useToken();
196
308
  const { styles } = (0, copilot_1.useCopilotStyle)();
197
- const attachmentsRef = (0, react_1.useRef)(null);
309
+ const { isLoggedIn } = (0, AuthContext_1.useAuth)();
310
+ const { getUserAvatarProps } = (0, useUserAvatar_1.useUserAvatar)();
198
311
  const chatUserSubmitRef = (0, react_1.useRef)(null);
199
312
  const chatCancelRef = (0, react_1.useRef)(null);
313
+ // ==================== State ====================
200
314
  const [attachmentsOpen, setAttachmentsOpen] = (0, react_1.useState)(false);
201
- const [files, setFiles] = (0, react_1.useState)([]);
315
+ const [attachedFiles, setAttachedFiles] = (0, react_1.useState)([]);
202
316
  const [inputValue, setInputValue] = (0, react_1.useState)("");
203
317
  const [messages, setMessages] = (0, react_1.useState)([]);
204
318
  const [loading, setLoading] = (0, react_1.useState)(false);
319
+ // ==================== Agent Status ====================
205
320
  const { agentSimulatorInfo, debugStatus, isConnecting, retryConnection } = (0, useAgentStatus_1.useAgentStatus)();
321
+ // ========== Widgets 相关状态 ==========
206
322
  const [showSystemLogs, setShowSystemLogs] = (0, react_1.useState)(false);
207
323
  const [activeLogTab, setActiveLogTab] = (0, react_1.useState)("system");
324
+ const [currentModule, setCurrentModule] = (0, react_1.useState)(null);
325
+ // ToolBar 事件
208
326
  const handleClearChat = () => {
209
327
  setMessages([]);
210
328
  };
211
329
  const handleToggleLogs = () => setShowSystemLogs((v) => !v);
330
+ // ==================== 消息发送可用性检查 ====================
212
331
  const canSendMessage = agentSimulatorInfo && debugStatus === "normal";
213
332
  const getDisabledReason = () => {
214
333
  if (!agentSimulatorInfo) {
@@ -217,15 +336,33 @@ const Copilot = () => {
217
336
  if (debugStatus !== "normal") {
218
337
  return "调试状态异常,无法发送消息";
219
338
  }
220
- return "";
339
+ return "Ask or input / use skills";
221
340
  };
341
+ // ==================== Event ====================
222
342
  const handleUserSubmit = (val) => {
223
343
  if (!canSendMessage) {
224
344
  antd_2.message.warning(getDisabledReason());
225
345
  return;
226
346
  }
347
+ // 将附加文件中已完成上传的转为 MultimodalFile
348
+ const files = (attachedFiles || [])
349
+ .filter((f) => f.status === "done" && f.url)
350
+ .map((f) => ({
351
+ id: f.uid || `file_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
352
+ name: f.name,
353
+ url: f.url,
354
+ type: "image", // 仅以图片参与多模态发送,其他类型仅做展示
355
+ size: f.size || 0,
356
+ mimeType: f.type || "image/*",
357
+ uploadTime: Date.now(),
358
+ status: "success",
359
+ thumbnail: f.url,
360
+ }));
227
361
  if (chatUserSubmitRef.current) {
228
- chatUserSubmitRef.current(val, messages);
362
+ chatUserSubmitRef.current(val, messages, files);
363
+ // 发送后清空附件面板
364
+ setAttachedFiles([]);
365
+ setAttachmentsOpen(false);
229
366
  }
230
367
  };
231
368
  const handleCancel = () => {
@@ -233,109 +370,154 @@ const Copilot = () => {
233
370
  chatCancelRef.current();
234
371
  }
235
372
  };
373
+ // 处理文件上传
374
+ const { uploadFiles } = (0, useUploader_1.useUploader)({
375
+ bizName: upload_config_1.uploadBizConfig.bizName,
376
+ scene: upload_config_1.uploadBizConfig.scene,
377
+ getToken: async () => {
378
+ const res = await http_client_1.httpClient.get(`/api/upload/token`, {
379
+ params: {
380
+ bizName: upload_config_1.uploadBizConfig.bizName,
381
+ scene: upload_config_1.uploadBizConfig.scene,
382
+ },
383
+ });
384
+ if (res.code === 0) {
385
+ return res.data;
386
+ }
387
+ throw new Error(`处理文件上传,获取上传Token失败: ${res.message}`);
388
+ },
389
+ });
390
+ const enqueueUpload = (file) => {
391
+ const uid = `manual_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
392
+ const newItem = {
393
+ uid,
394
+ name: file.name,
395
+ status: "uploading",
396
+ originFileObj: file,
397
+ percent: 0,
398
+ };
399
+ setAttachedFiles((prev) => [...prev, newItem]);
400
+ uploadFiles([file], {
401
+ onStart: () => { },
402
+ onComplete: (ok) => {
403
+ setAttachedFiles((prev) => prev.map((it) => (it.uid === uid ? { ...it, status: "done", url: ok.url, percent: 100 } : it)));
404
+ antd_2.message.success(`${ok.name} 上传成功`);
405
+ },
406
+ onError: (err) => {
407
+ setAttachedFiles((prev) => prev.map((it) => (it.uid === uid ? { ...it, status: "error" } : it)));
408
+ antd_2.message.error(`${file.name} 上传失败: ${err.message}`);
409
+ },
410
+ });
411
+ };
412
+ const handleFileUpload = async (fileList) => {
413
+ if (!fileList?.length)
414
+ return;
415
+ fileList.forEach((f) => enqueueUpload(f));
416
+ };
417
+ // 获取文件类型
418
+ const getFileType = (file) => {
419
+ const mimeType = file.type.toLowerCase();
420
+ return cos_config_1.uploadConfig.fileTypeMap[mimeType] || "document";
421
+ };
236
422
  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);
423
+ if (!isLoggedIn) {
424
+ antd_2.message.warning("请先登录后再上传文件");
425
+ return;
240
426
  }
427
+ const fileArray = Array.from(files);
428
+ handleFileUpload(fileArray);
241
429
  setAttachmentsOpen(true);
242
430
  };
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,
431
+ // 预览功能如需启用,请结合 UploadFile 结构扩展;当前手动上传暂不启用内置预览。
432
+ // ==================== Nodes ====================
433
+ 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) => {
434
+ return {
435
+ content: item.content,
436
+ role: item.role,
437
+ messageRender: () => (0, jsx_runtime_1.jsx)(components_1.MessageRenderer, { message: item }),
438
+ };
439
+ }), roles: {
440
+ assistant: {
441
+ placement: "start",
442
+ loadingRender: () => ((0, jsx_runtime_1.jsxs)(antd_2.Space, { children: [(0, jsx_runtime_1.jsx)(antd_2.Spin, { size: "small" }), "Custom loading..."] })),
443
+ avatar: {
444
+ icon: (0, jsx_runtime_1.jsx)(icons_2.AliwangwangFilled, {}),
445
+ style: { background: token.colorInfoText },
446
+ },
447
+ styles: {
448
+ content: {
449
+ backgroundColor: "transparent",
450
+ padding: 0,
451
+ },
263
452
  },
264
453
  },
265
- },
266
- user: {
267
- placement: "start",
268
- avatar: {
269
- icon: react_1.default.createElement(icons_2.UserOutlined, null),
270
- style: {
271
- background: token.colorSuccessText,
454
+ user: {
455
+ placement: "start",
456
+ avatar: {
457
+ ...getUserAvatarProps(),
458
+ size: 40,
272
459
  },
273
460
  },
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" }
461
+ } })) : ((0, jsx_runtime_1.jsx)(components_1.WelcomeModule, { onPromptSelect: handleUserSubmit, onModuleChange: setCurrentModule, isDark: isDark })) }));
462
+ const sendHeader = ((0, jsx_runtime_1.jsx)(x_1.Sender.Header, { title: "Upload File", styles: { content: { padding: 0 } }, open: attachmentsOpen, onOpenChange: (open) => {
463
+ if (!isLoggedIn && open) {
464
+ antd_2.message.warning("请先登录后再上传文件");
465
+ return;
466
+ }
467
+ setAttachmentsOpen(open);
468
+ }, forceRender: true, children: (0, jsx_runtime_1.jsx)(x_1.Attachments, { beforeUpload: (file) => {
469
+ // 登录校验
470
+ if (!isLoggedIn) {
471
+ antd_2.message.warning("请先登录后再上传文件");
472
+ return antd_2.Upload.LIST_IGNORE;
473
+ }
474
+ // 类型和大小校验
475
+ if (file.size > cos_config_1.uploadConfig.maxFileSize) {
476
+ antd_2.message.error(`文件大小不能超过 ${cos_config_1.uploadConfig.maxFileSize / 1024 / 1024}MB`);
477
+ return antd_2.Upload.LIST_IGNORE;
478
+ }
479
+ if (!cos_config_1.uploadConfig.allowedTypes.includes(file.type)) {
480
+ antd_2.message.error("不支持的文件类型");
481
+ return antd_2.Upload.LIST_IGNORE;
482
+ }
483
+ // 自定义上传:交由 enqueueUpload 统一入列与上传
484
+ enqueueUpload(file);
485
+ // 阻止组件默认入列与上传
486
+ return antd_2.Upload.LIST_IGNORE;
487
+ }, items: attachedFiles, onRemove: (file) => {
488
+ const index = attachedFiles.indexOf(file);
489
+ const newFileList = attachedFiles.slice();
490
+ newFileList.splice(index, 1);
491
+ setAttachedFiles(newFileList);
492
+ }, placeholder: (type) => type === "drop"
493
+ ? { title: "拖拽文件到此处上传" }
292
494
  : {
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
- } }))));
495
+ icon: (0, jsx_runtime_1.jsx)(icons_1.CloudUploadOutlined, {}),
496
+ title: "上传多模态文件",
497
+ description: "支持图片、PDF、视频、音频等文件格式",
498
+ } }) }));
499
+ 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) => {
500
+ const index = attachedFiles.indexOf(file);
501
+ const newFileList = attachedFiles.slice();
502
+ newFileList.splice(index, 1);
503
+ setAttachedFiles(newFileList);
504
+ }, getDisabledReason: getDisabledReason }));
505
+ return ((0, jsx_runtime_1.jsx)(AgentContext_1.AgentProvider, { agentSimulatorInfo: agentSimulatorInfo, children: (0, jsx_runtime_1.jsxs)("div", { className: styles.copilotChat, style: {
506
+ background: token.colorBgContainer,
507
+ minHeight: "100vh",
508
+ borderRadius: 0,
509
+ boxShadow: "none",
510
+ padding: 0,
511
+ border: `1px solid ${token.colorBorder}`,
512
+ }, 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) => {
513
+ chatUserSubmitRef.current = fn;
514
+ }, onCancel: (fn) => {
515
+ chatCancelRef.current = fn;
516
+ } }))] }) }));
336
517
  };
337
518
  const CopilotSimulator = () => {
338
519
  const { styles: workareaStyles } = (0, workarea_1.useWorkareaStyle)();
520
+ // 从 URL query 参数中读取 isDark
339
521
  const getIsDarkFromQuery = () => {
340
522
  const params = new URLSearchParams(window.location.search);
341
523
  return params.get("isDark") ? params.get("isDark") === "true" : false;
@@ -343,17 +525,16 @@ const CopilotSimulator = () => {
343
525
  const initIsDarkMode = getIsDarkFromQuery();
344
526
  const [darkMode, setDarkMode] = (0, react_1.useState)(initIsDarkMode);
345
527
  if (typeof require === "function") {
528
+ // 当前运行在IDE中,electron环境
346
529
  const { ipcRenderer } = require("electron");
530
+ // @ts-ignore
347
531
  ipcRenderer.on("setTheme", (event, isDark) => {
348
532
  setDarkMode(isDark);
349
533
  });
350
534
  }
351
- return (react_1.default.createElement(ThemeContext_1.ThemeProvider, { isDark: darkMode },
352
- react_1.default.createElement(antd_1.ConfigProvider, { theme: {
535
+ return ((0, jsx_runtime_1.jsx)(ThemeContext_1.ThemeProvider, { isDark: darkMode, children: (0, jsx_runtime_1.jsx)(antd_1.ConfigProvider, { theme: {
353
536
  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))))));
537
+ }, 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
538
  };
359
539
  exports.default = CopilotSimulator;
540
+ //# sourceMappingURL=App.js.map