@vectorx/agent-simulator 0.0.0-beta-20251112071234

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 (303) hide show
  1. package/README.md +76 -0
  2. package/bin/agent.js +55 -0
  3. package/lib/app.d.ts +43 -0
  4. package/lib/app.d.ts.map +1 -0
  5. package/lib/app.js +99 -0
  6. package/lib/app.js.map +1 -0
  7. package/lib/config/api.config.d.ts +2 -0
  8. package/lib/config/api.config.d.ts.map +1 -0
  9. package/lib/config/api.config.js +13 -0
  10. package/lib/config/api.config.js.map +1 -0
  11. package/lib/config/app.config.d.ts +22 -0
  12. package/lib/config/app.config.d.ts.map +1 -0
  13. package/lib/config/app.config.js +18 -0
  14. package/lib/config/app.config.js.map +1 -0
  15. package/lib/config/upload.config.d.ts +6 -0
  16. package/lib/config/upload.config.d.ts.map +1 -0
  17. package/lib/config/upload.config.js +10 -0
  18. package/lib/config/upload.config.js.map +1 -0
  19. package/lib/container/container.d.ts +6 -0
  20. package/lib/container/container.d.ts.map +1 -0
  21. package/lib/container/container.js +34 -0
  22. package/lib/container/container.js.map +1 -0
  23. package/lib/container/identifiers.d.ts +14 -0
  24. package/lib/container/identifiers.d.ts.map +1 -0
  25. package/lib/container/identifiers.js +20 -0
  26. package/lib/container/identifiers.js.map +1 -0
  27. package/lib/container/index.d.ts +4 -0
  28. package/lib/container/index.d.ts.map +1 -0
  29. package/lib/container/index.js +20 -0
  30. package/lib/container/index.js.map +1 -0
  31. package/lib/container/types.d.ts +48 -0
  32. package/lib/container/types.d.ts.map +1 -0
  33. package/lib/container/types.js +3 -0
  34. package/lib/container/types.js.map +1 -0
  35. package/lib/controllers/agent.controller.d.ts +19 -0
  36. package/lib/controllers/agent.controller.d.ts.map +1 -0
  37. package/lib/controllers/agent.controller.js +102 -0
  38. package/lib/controllers/agent.controller.js.map +1 -0
  39. package/lib/controllers/auth.controller.d.ts +23 -0
  40. package/lib/controllers/auth.controller.d.ts.map +1 -0
  41. package/lib/controllers/auth.controller.js +132 -0
  42. package/lib/controllers/auth.controller.js.map +1 -0
  43. package/lib/controllers/simulator.controller.d.ts +11 -0
  44. package/lib/controllers/simulator.controller.d.ts.map +1 -0
  45. package/lib/controllers/simulator.controller.js +44 -0
  46. package/lib/controllers/simulator.controller.js.map +1 -0
  47. package/lib/controllers/upload.controller.d.ts +8 -0
  48. package/lib/controllers/upload.controller.d.ts.map +1 -0
  49. package/lib/controllers/upload.controller.js +44 -0
  50. package/lib/controllers/upload.controller.js.map +1 -0
  51. package/lib/index.d.ts +7 -0
  52. package/lib/index.d.ts.map +1 -0
  53. package/lib/index.js +18 -0
  54. package/lib/index.js.map +1 -0
  55. package/lib/middleware/cors.middleware.d.ts +7 -0
  56. package/lib/middleware/cors.middleware.d.ts.map +1 -0
  57. package/lib/middleware/cors.middleware.js +14 -0
  58. package/lib/middleware/cors.middleware.js.map +1 -0
  59. package/lib/middleware/error.middleware.d.ts +8 -0
  60. package/lib/middleware/error.middleware.d.ts.map +1 -0
  61. package/lib/middleware/error.middleware.js +33 -0
  62. package/lib/middleware/error.middleware.js.map +1 -0
  63. package/lib/middleware/proxy.middleware.d.ts +3 -0
  64. package/lib/middleware/proxy.middleware.d.ts.map +1 -0
  65. package/lib/middleware/proxy.middleware.js +21 -0
  66. package/lib/middleware/proxy.middleware.js.map +1 -0
  67. package/lib/middleware/upload.middleware.d.ts +10 -0
  68. package/lib/middleware/upload.middleware.d.ts.map +1 -0
  69. package/lib/middleware/upload.middleware.js +27 -0
  70. package/lib/middleware/upload.middleware.js.map +1 -0
  71. package/lib/routes/agent.d.ts +3 -0
  72. package/lib/routes/agent.d.ts.map +1 -0
  73. package/lib/routes/agent.js +19 -0
  74. package/lib/routes/agent.js.map +1 -0
  75. package/lib/routes/auth.d.ts +3 -0
  76. package/lib/routes/auth.d.ts.map +1 -0
  77. package/lib/routes/auth.js +20 -0
  78. package/lib/routes/auth.js.map +1 -0
  79. package/lib/routes/index.d.ts +3 -0
  80. package/lib/routes/index.d.ts.map +1 -0
  81. package/lib/routes/index.js +19 -0
  82. package/lib/routes/index.js.map +1 -0
  83. package/lib/routes/simulator.d.ts +3 -0
  84. package/lib/routes/simulator.d.ts.map +1 -0
  85. package/lib/routes/simulator.js +14 -0
  86. package/lib/routes/simulator.js.map +1 -0
  87. package/lib/routes/upload.d.ts +3 -0
  88. package/lib/routes/upload.d.ts.map +1 -0
  89. package/lib/routes/upload.js +13 -0
  90. package/lib/routes/upload.js.map +1 -0
  91. package/lib/services/agent.service.d.ts +49 -0
  92. package/lib/services/agent.service.d.ts.map +1 -0
  93. package/lib/services/agent.service.js +147 -0
  94. package/lib/services/agent.service.js.map +1 -0
  95. package/lib/services/auth.service.d.ts +55 -0
  96. package/lib/services/auth.service.d.ts.map +1 -0
  97. package/lib/services/auth.service.js +124 -0
  98. package/lib/services/auth.service.js.map +1 -0
  99. package/lib/services/simulator.service.d.ts +23 -0
  100. package/lib/services/simulator.service.d.ts.map +1 -0
  101. package/lib/services/simulator.service.js +49 -0
  102. package/lib/services/simulator.service.js.map +1 -0
  103. package/lib/services/upload.service.d.ts +32 -0
  104. package/lib/services/upload.service.d.ts.map +1 -0
  105. package/lib/services/upload.service.js +61 -0
  106. package/lib/services/upload.service.js.map +1 -0
  107. package/lib/simulator.d.ts +27 -0
  108. package/lib/simulator.d.ts.map +1 -0
  109. package/lib/simulator.js +79 -0
  110. package/lib/simulator.js.map +1 -0
  111. package/lib/utils/logger.d.ts +8 -0
  112. package/lib/utils/logger.d.ts.map +1 -0
  113. package/lib/utils/logger.js +28 -0
  114. package/lib/utils/logger.js.map +1 -0
  115. package/lib/utils/request.d.ts +11 -0
  116. package/lib/utils/request.d.ts.map +1 -0
  117. package/lib/utils/request.js +36 -0
  118. package/lib/utils/request.js.map +1 -0
  119. package/lib/utils/url-parser.d.ts +14 -0
  120. package/lib/utils/url-parser.d.ts.map +1 -0
  121. package/lib/utils/url-parser.js +25 -0
  122. package/lib/utils/url-parser.js.map +1 -0
  123. package/lib/utils.d.ts +6 -0
  124. package/lib/utils.d.ts.map +1 -0
  125. package/lib/utils.js +12 -0
  126. package/lib/utils.js.map +1 -0
  127. package/lib/webview-ui/Agent.d.ts +5 -0
  128. package/lib/webview-ui/Agent.d.ts.map +1 -0
  129. package/lib/webview-ui/Agent.js +24 -0
  130. package/lib/webview-ui/Agent.js.map +1 -0
  131. package/lib/webview-ui/App.d.ts +3 -0
  132. package/lib/webview-ui/App.d.ts.map +1 -0
  133. package/lib/webview-ui/App.js +775 -0
  134. package/lib/webview-ui/App.js.map +1 -0
  135. package/lib/webview-ui/ErrorBoundary.d.ts +19 -0
  136. package/lib/webview-ui/ErrorBoundary.d.ts.map +1 -0
  137. package/lib/webview-ui/ErrorBoundary.js +54 -0
  138. package/lib/webview-ui/ErrorBoundary.js.map +1 -0
  139. package/lib/webview-ui/components/AsyncTaskBlock.d.ts +13 -0
  140. package/lib/webview-ui/components/AsyncTaskBlock.d.ts.map +1 -0
  141. package/lib/webview-ui/components/AsyncTaskBlock.js +179 -0
  142. package/lib/webview-ui/components/AsyncTaskBlock.js.map +1 -0
  143. package/lib/webview-ui/components/AuthIndicator.d.ts +3 -0
  144. package/lib/webview-ui/components/AuthIndicator.d.ts.map +1 -0
  145. package/lib/webview-ui/components/AuthIndicator.js +17 -0
  146. package/lib/webview-ui/components/AuthIndicator.js.map +1 -0
  147. package/lib/webview-ui/components/ErrorCard.d.ts +11 -0
  148. package/lib/webview-ui/components/ErrorCard.d.ts.map +1 -0
  149. package/lib/webview-ui/components/ErrorCard.js +18 -0
  150. package/lib/webview-ui/components/ErrorCard.js.map +1 -0
  151. package/lib/webview-ui/components/KnowledgeBaseSearchBlock.d.ts +20 -0
  152. package/lib/webview-ui/components/KnowledgeBaseSearchBlock.d.ts.map +1 -0
  153. package/lib/webview-ui/components/KnowledgeBaseSearchBlock.js +45 -0
  154. package/lib/webview-ui/components/KnowledgeBaseSearchBlock.js.map +1 -0
  155. package/lib/webview-ui/components/KnowledgeBaseSearchResult.d.ts +9 -0
  156. package/lib/webview-ui/components/KnowledgeBaseSearchResult.d.ts.map +1 -0
  157. package/lib/webview-ui/components/KnowledgeBaseSearchResult.js +31 -0
  158. package/lib/webview-ui/components/KnowledgeBaseSearchResult.js.map +1 -0
  159. package/lib/webview-ui/components/MarkdownRenderer.d.ts +7 -0
  160. package/lib/webview-ui/components/MarkdownRenderer.d.ts.map +1 -0
  161. package/lib/webview-ui/components/MarkdownRenderer.js +28 -0
  162. package/lib/webview-ui/components/MarkdownRenderer.js.map +1 -0
  163. package/lib/webview-ui/components/MessageRenderer.d.ts +7 -0
  164. package/lib/webview-ui/components/MessageRenderer.d.ts.map +1 -0
  165. package/lib/webview-ui/components/MessageRenderer.js +33 -0
  166. package/lib/webview-ui/components/MessageRenderer.js.map +1 -0
  167. package/lib/webview-ui/components/MultimodalFileRenderer.d.ts +20 -0
  168. package/lib/webview-ui/components/MultimodalFileRenderer.d.ts.map +1 -0
  169. package/lib/webview-ui/components/MultimodalFileRenderer.js +216 -0
  170. package/lib/webview-ui/components/MultimodalFileRenderer.js.map +1 -0
  171. package/lib/webview-ui/components/ThinkingBlock.d.ts +8 -0
  172. package/lib/webview-ui/components/ThinkingBlock.d.ts.map +1 -0
  173. package/lib/webview-ui/components/ThinkingBlock.js +75 -0
  174. package/lib/webview-ui/components/ThinkingBlock.js.map +1 -0
  175. package/lib/webview-ui/components/ToolUseBlock.d.ts +10 -0
  176. package/lib/webview-ui/components/ToolUseBlock.d.ts.map +1 -0
  177. package/lib/webview-ui/components/ToolUseBlock.js +14 -0
  178. package/lib/webview-ui/components/ToolUseBlock.js.map +1 -0
  179. package/lib/webview-ui/components/ToolUseBlockHeader.d.ts +10 -0
  180. package/lib/webview-ui/components/ToolUseBlockHeader.d.ts.map +1 -0
  181. package/lib/webview-ui/components/ToolUseBlockHeader.js +31 -0
  182. package/lib/webview-ui/components/ToolUseBlockHeader.js.map +1 -0
  183. package/lib/webview-ui/components/UploadPreview.d.ts +6 -0
  184. package/lib/webview-ui/components/UploadPreview.d.ts.map +1 -0
  185. package/lib/webview-ui/components/UploadPreview.js +12 -0
  186. package/lib/webview-ui/components/UploadPreview.js.map +1 -0
  187. package/lib/webview-ui/components/WelcomeModule.d.ts +10 -0
  188. package/lib/webview-ui/components/WelcomeModule.d.ts.map +1 -0
  189. package/lib/webview-ui/components/WelcomeModule.js +161 -0
  190. package/lib/webview-ui/components/WelcomeModule.js.map +1 -0
  191. package/lib/webview-ui/components/index.d.ts +14 -0
  192. package/lib/webview-ui/components/index.d.ts.map +1 -0
  193. package/lib/webview-ui/components/index.js +30 -0
  194. package/lib/webview-ui/components/index.js.map +1 -0
  195. package/lib/webview-ui/config/cos-config.d.ts +41 -0
  196. package/lib/webview-ui/config/cos-config.d.ts.map +1 -0
  197. package/lib/webview-ui/config/cos-config.js +83 -0
  198. package/lib/webview-ui/config/cos-config.js.map +1 -0
  199. package/lib/webview-ui/config/http-config.d.ts +8 -0
  200. package/lib/webview-ui/config/http-config.d.ts.map +1 -0
  201. package/lib/webview-ui/config/http-config.js +36 -0
  202. package/lib/webview-ui/config/http-config.js.map +1 -0
  203. package/lib/webview-ui/constants.d.ts +18 -0
  204. package/lib/webview-ui/constants.d.ts.map +1 -0
  205. package/lib/webview-ui/constants.js +25 -0
  206. package/lib/webview-ui/constants.js.map +1 -0
  207. package/lib/webview-ui/contexts/AgentContext.d.ts +13 -0
  208. package/lib/webview-ui/contexts/AgentContext.d.ts.map +1 -0
  209. package/lib/webview-ui/contexts/AgentContext.js +19 -0
  210. package/lib/webview-ui/contexts/AgentContext.js.map +1 -0
  211. package/lib/webview-ui/contexts/AuthContext.d.ts +17 -0
  212. package/lib/webview-ui/contexts/AuthContext.d.ts.map +1 -0
  213. package/lib/webview-ui/contexts/AuthContext.js +79 -0
  214. package/lib/webview-ui/contexts/AuthContext.js.map +1 -0
  215. package/lib/webview-ui/contexts/ThemeContext.d.ts +12 -0
  216. package/lib/webview-ui/contexts/ThemeContext.d.ts.map +1 -0
  217. package/lib/webview-ui/contexts/ThemeContext.js +21 -0
  218. package/lib/webview-ui/contexts/ThemeContext.js.map +1 -0
  219. package/lib/webview-ui/hooks/useAgentStatus.d.ts +17 -0
  220. package/lib/webview-ui/hooks/useAgentStatus.d.ts.map +1 -0
  221. package/lib/webview-ui/hooks/useAgentStatus.js +117 -0
  222. package/lib/webview-ui/hooks/useAgentStatus.js.map +1 -0
  223. package/lib/webview-ui/hooks/useUploader.d.ts +19 -0
  224. package/lib/webview-ui/hooks/useUploader.d.ts.map +1 -0
  225. package/lib/webview-ui/hooks/useUploader.js +132 -0
  226. package/lib/webview-ui/hooks/useUploader.js.map +1 -0
  227. package/lib/webview-ui/hooks/useUserAvatar.d.ts +28 -0
  228. package/lib/webview-ui/hooks/useUserAvatar.d.ts.map +1 -0
  229. package/lib/webview-ui/hooks/useUserAvatar.js +74 -0
  230. package/lib/webview-ui/hooks/useUserAvatar.js.map +1 -0
  231. package/lib/webview-ui/index.d.ts +3 -0
  232. package/lib/webview-ui/index.d.ts.map +1 -0
  233. package/lib/webview-ui/index.js +17 -0
  234. package/lib/webview-ui/index.js.map +1 -0
  235. package/lib/webview-ui/services/agent-service.d.ts +124 -0
  236. package/lib/webview-ui/services/agent-service.d.ts.map +1 -0
  237. package/lib/webview-ui/services/agent-service.js +80 -0
  238. package/lib/webview-ui/services/agent-service.js.map +1 -0
  239. package/lib/webview-ui/services/index.d.ts +3 -0
  240. package/lib/webview-ui/services/index.d.ts.map +1 -0
  241. package/lib/webview-ui/services/index.js +19 -0
  242. package/lib/webview-ui/services/index.js.map +1 -0
  243. package/lib/webview-ui/services/logger-service.d.ts +46 -0
  244. package/lib/webview-ui/services/logger-service.d.ts.map +1 -0
  245. package/lib/webview-ui/services/logger-service.js +69 -0
  246. package/lib/webview-ui/services/logger-service.js.map +1 -0
  247. package/lib/webview-ui/styles/copilot.d.ts +14 -0
  248. package/lib/webview-ui/styles/copilot.d.ts.map +1 -0
  249. package/lib/webview-ui/styles/copilot.js +119 -0
  250. package/lib/webview-ui/styles/copilot.js.map +1 -0
  251. package/lib/webview-ui/styles/workarea.d.ts +11 -0
  252. package/lib/webview-ui/styles/workarea.d.ts.map +1 -0
  253. package/lib/webview-ui/styles/workarea.js +73 -0
  254. package/lib/webview-ui/styles/workarea.js.map +1 -0
  255. package/lib/webview-ui/types.d.ts +65 -0
  256. package/lib/webview-ui/types.d.ts.map +1 -0
  257. package/lib/webview-ui/types.js +3 -0
  258. package/lib/webview-ui/types.js.map +1 -0
  259. package/lib/webview-ui/utils/cos.d.ts +65 -0
  260. package/lib/webview-ui/utils/cos.d.ts.map +1 -0
  261. package/lib/webview-ui/utils/cos.js +113 -0
  262. package/lib/webview-ui/utils/cos.js.map +1 -0
  263. package/lib/webview-ui/utils/http-client.d.ts +44 -0
  264. package/lib/webview-ui/utils/http-client.d.ts.map +1 -0
  265. package/lib/webview-ui/utils/http-client.js +101 -0
  266. package/lib/webview-ui/utils/http-client.js.map +1 -0
  267. package/lib/webview-ui/utils/stream-text-handler.d.ts +4 -0
  268. package/lib/webview-ui/utils/stream-text-handler.d.ts.map +1 -0
  269. package/lib/webview-ui/utils/stream-text-handler.js +54 -0
  270. package/lib/webview-ui/utils/stream-text-handler.js.map +1 -0
  271. package/lib/webview-ui/utils/upload.d.ts +8 -0
  272. package/lib/webview-ui/utils/upload.d.ts.map +1 -0
  273. package/lib/webview-ui/utils/upload.js +22 -0
  274. package/lib/webview-ui/utils/upload.js.map +1 -0
  275. package/lib/webview-ui/widgets/BubbleComponents.d.ts +8 -0
  276. package/lib/webview-ui/widgets/BubbleComponents.d.ts.map +1 -0
  277. package/lib/webview-ui/widgets/BubbleComponents.js +62 -0
  278. package/lib/webview-ui/widgets/BubbleComponents.js.map +1 -0
  279. package/lib/webview-ui/widgets/ChatInput.d.ts +27 -0
  280. package/lib/webview-ui/widgets/ChatInput.d.ts.map +1 -0
  281. package/lib/webview-ui/widgets/ChatInput.js +203 -0
  282. package/lib/webview-ui/widgets/ChatInput.js.map +1 -0
  283. package/lib/webview-ui/widgets/LogPanel.d.ts +15 -0
  284. package/lib/webview-ui/widgets/LogPanel.d.ts.map +1 -0
  285. package/lib/webview-ui/widgets/LogPanel.js +59 -0
  286. package/lib/webview-ui/widgets/LogPanel.js.map +1 -0
  287. package/lib/webview-ui/widgets/SystemLogs.d.ts +30 -0
  288. package/lib/webview-ui/widgets/SystemLogs.d.ts.map +1 -0
  289. package/lib/webview-ui/widgets/SystemLogs.js +460 -0
  290. package/lib/webview-ui/widgets/SystemLogs.js.map +1 -0
  291. package/lib/webview-ui/widgets/ToolBar.d.ts +18 -0
  292. package/lib/webview-ui/widgets/ToolBar.d.ts.map +1 -0
  293. package/lib/webview-ui/widgets/ToolBar.js +90 -0
  294. package/lib/webview-ui/widgets/ToolBar.js.map +1 -0
  295. package/lib/webview-ui/widgets/index.d.ts +6 -0
  296. package/lib/webview-ui/widgets/index.d.ts.map +1 -0
  297. package/lib/webview-ui/widgets/index.js +22 -0
  298. package/lib/webview-ui/widgets/index.js.map +1 -0
  299. package/package.json +92 -0
  300. package/public/assets/index-j_rEEDWU.js +93 -0
  301. package/public/assets/main.js +603 -0
  302. package/public/assets/style.css +1 -0
  303. package/public/index.html +15 -0
@@ -0,0 +1,775 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const jsx_runtime_1 = require("react/jsx-runtime");
37
+ const icons_1 = require("@ant-design/icons");
38
+ const x_1 = require("@ant-design/x");
39
+ const antd_1 = require("antd");
40
+ const antd_2 = require("antd");
41
+ const react_1 = __importStar(require("react"));
42
+ const upload_config_1 = require("../config/upload.config");
43
+ const Agent_1 = require("./Agent");
44
+ const ErrorBoundary_1 = require("./ErrorBoundary");
45
+ const components_1 = require("./components");
46
+ const cos_config_1 = require("./config/cos-config");
47
+ const constants_1 = require("./constants");
48
+ const AgentContext_1 = require("./contexts/AgentContext");
49
+ const AuthContext_1 = require("./contexts/AuthContext");
50
+ const ThemeContext_1 = require("./contexts/ThemeContext");
51
+ const useAgentStatus_1 = require("./hooks/useAgentStatus");
52
+ const useUploader_1 = require("./hooks/useUploader");
53
+ const useUserAvatar_1 = require("./hooks/useUserAvatar");
54
+ const copilot_1 = require("./styles/copilot");
55
+ const workarea_1 = require("./styles/workarea");
56
+ const http_client_1 = require("./utils/http-client");
57
+ const stream_text_handler_1 = require("./utils/stream-text-handler");
58
+ const widgets_1 = require("./widgets");
59
+ const LogPanel_1 = require("./widgets/LogPanel");
60
+ // 根据 mimeType 确定文件类型的工具函数
61
+ const getFileTypeFromMimeType = (mimeType) => {
62
+ const normalizedType = mimeType.toLowerCase();
63
+ // 调试信息
64
+ console.log("==== 文件类型检测 ====", { mimeType, normalizedType });
65
+ if (normalizedType.startsWith("image/")) {
66
+ return "image";
67
+ }
68
+ else if (normalizedType === "application/pdf") {
69
+ return "pdf";
70
+ }
71
+ else if (normalizedType.startsWith("video/")) {
72
+ return "video";
73
+ }
74
+ else if (normalizedType.startsWith("audio/")) {
75
+ return "audio";
76
+ }
77
+ else {
78
+ // 如果 MIME 类型无法识别,尝试通过文件扩展名判断
79
+ const imageExtensions = [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp", ".svg"];
80
+ const hasImageExtension = imageExtensions.some((ext) => normalizedType.includes(ext) || mimeType.includes(ext));
81
+ if (hasImageExtension) {
82
+ console.log("==== 通过扩展名识别为图片 ====", mimeType);
83
+ return "image";
84
+ }
85
+ console.log("==== 无法识别文件类型,默认为文档 ====", mimeType);
86
+ return "document";
87
+ }
88
+ };
89
+ const ChatAgent = ({ agentSimulatorInfo, onMessageUpdate, onRequestStart, onRequestEnd, onUserSubmit, onCancel, }) => {
90
+ let abortController = (0, react_1.useRef)(null);
91
+ const [agent] = (0, x_1.useXAgent)({
92
+ baseURL: (0, Agent_1.getSendMessageUri)(agentSimulatorInfo),
93
+ });
94
+ const handleUserSubmit = (0, react_1.useCallback)((val, messages, files, agentFiles) => {
95
+ // 将 OpenAI 文件转换为 MultimodalFile 格式
96
+ const agentFilesAsMultimodal = (agentFiles || []).map((file) => {
97
+ // 根据文件名推断文件类型(OpenAI 文件通常没有 mimeType)
98
+ const filename = file.filename || file.name || "";
99
+ let fileType = "document";
100
+ if (filename.toLowerCase().endsWith(".pdf")) {
101
+ fileType = "pdf";
102
+ }
103
+ else if (/\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i.test(filename)) {
104
+ fileType = "image";
105
+ }
106
+ else if (/\.(mp4|avi|mov|wmv|flv|webm)$/i.test(filename)) {
107
+ fileType = "video";
108
+ }
109
+ else if (/\.(mp3|wav|ogg|aac|flac)$/i.test(filename)) {
110
+ fileType = "audio";
111
+ }
112
+ return {
113
+ id: `openai_${file.id}_${Date.now()}`,
114
+ name: file.filename || file.name || "OpenAI 文件",
115
+ url: undefined, // OpenAI 文件没有 HTTP URL
116
+ type: fileType,
117
+ size: file.bytes || 0,
118
+ mimeType: "application/octet-stream", // OpenAI 文件通常没有 mimeType
119
+ uploadTime: file.created_at || Date.now(),
120
+ status: "success",
121
+ fileSource: "openai",
122
+ fileId: file.id,
123
+ purpose: file.purpose || "file-extract",
124
+ };
125
+ });
126
+ // 合并标准文件和 OpenAI 文件
127
+ const allFiles = [...(files || []), ...agentFilesAsMultimodal];
128
+ // 添加用户消息
129
+ const userMessage = {
130
+ id: `user-${Date.now()}`,
131
+ role: "user",
132
+ content: val,
133
+ isThinking: false,
134
+ isTimeout: false,
135
+ isInterrupted: false,
136
+ isUiDiscard: false,
137
+ uiTimeStr: new Date().toLocaleTimeString(),
138
+ type: "answer",
139
+ files: allFiles,
140
+ };
141
+ const newMessages = [...messages, userMessage];
142
+ onMessageUpdate(newMessages);
143
+ onRequestStart();
144
+ // 发送请求(将图文转为多模态消息内容)
145
+ const contentParts = [];
146
+ if (files && files.length > 0) {
147
+ files.forEach((file) => {
148
+ if (file.type === "image" && file.url) {
149
+ contentParts.push({
150
+ type: "image_url",
151
+ image_url: { url: file.url },
152
+ });
153
+ }
154
+ else if (file.type === "pdf" && file.url) {
155
+ contentParts.push({
156
+ type: "doc_url",
157
+ doc_url: [file.url],
158
+ file_parsing_strategy: "auto",
159
+ });
160
+ }
161
+ // 其他类型暂不参与多模态对话内容,仍在气泡中展示
162
+ });
163
+ }
164
+ if (val && val.trim()) {
165
+ contentParts.push({ type: "text", text: val.trim() });
166
+ }
167
+ // 合并标准文件和 OpenAI 文件到统一的 files 字段(用于请求)
168
+ const requestFiles = [
169
+ // 标准上传的文件(有 url)
170
+ ...(files?.map((file) => ({
171
+ url: file.url,
172
+ type: file.type,
173
+ size: file.size,
174
+ mimeType: file.mimeType,
175
+ fileSource: "standard", // 标识为标准上传
176
+ })) || []),
177
+ // OpenAI 上传的文件(OpenAI 标准格式,有 id)
178
+ ...(agentFiles?.map((file) => ({
179
+ id: file.id,
180
+ filename: file.filename,
181
+ purpose: file.purpose,
182
+ bytes: file.bytes,
183
+ created_at: file.created_at,
184
+ fileSource: "openai", // 标识为 OpenAI 上传
185
+ })) || []),
186
+ ];
187
+ // 注意:history 字段只支持字符串格式的 content,不支持多模态内容数组
188
+ // 多模态内容(图片、文档等)应通过 files 字段传递,由服务端处理
189
+ const requestData = {
190
+ msg: val || "",
191
+ files: requestFiles,
192
+ history: contentParts.length
193
+ ? [
194
+ {
195
+ role: "user",
196
+ content: contentParts,
197
+ },
198
+ ]
199
+ : [],
200
+ };
201
+ agent.request(requestData, {
202
+ onUpdate: (chunk) => {
203
+ try {
204
+ let message = null;
205
+ let rawChunk = null;
206
+ if (typeof chunk?.data === "string") {
207
+ message = (0, stream_text_handler_1.parseStreamChunk)(chunk.data);
208
+ // 如果解析失败,尝试解析为错误响应
209
+ if (!message) {
210
+ try {
211
+ const parsed = JSON.parse(chunk.data);
212
+ // 检查是否是错误响应格式(有 code 字段且是字符串或非 0 数字,或有 message 字段)
213
+ if (parsed && (parsed.code !== undefined || parsed.message)) {
214
+ rawChunk = parsed;
215
+ }
216
+ }
217
+ catch {
218
+ // 忽略解析失败
219
+ }
220
+ if (!rawChunk)
221
+ return;
222
+ }
223
+ }
224
+ else if (chunk && typeof chunk === "object") {
225
+ message = (0, stream_text_handler_1.parseNonStreamChunk)(chunk);
226
+ // 如果解析失败,检查是否是错误响应
227
+ if (!message) {
228
+ if (chunk.code !== 0 || chunk.message || chunk.error) {
229
+ rawChunk = chunk;
230
+ }
231
+ else {
232
+ return;
233
+ }
234
+ }
235
+ }
236
+ // 处理错误响应(没有 choices 字段的响应)
237
+ if (rawChunk && !message) {
238
+ const errorMessageId = `error-${Date.now()}`;
239
+ // 构建标准错误信息格式,与 ErrorCard 的消费逻辑匹配
240
+ const errorInfo = {
241
+ message: rawChunk.message || rawChunk.error || "请求失败",
242
+ code: rawChunk.code,
243
+ log_id: rawChunk.log_id || rawChunk.requestId,
244
+ rawData: {
245
+ message: rawChunk.message || rawChunk.error || "请求失败",
246
+ error: rawChunk.error || rawChunk.message || "请求失败",
247
+ code: rawChunk.code,
248
+ log_id: rawChunk.log_id || rawChunk.requestId,
249
+ },
250
+ };
251
+ onMessageUpdate((prev) => {
252
+ const newMessages = [...prev];
253
+ const lastMessageIndex = newMessages.length - 1;
254
+ if (lastMessageIndex >= 0 && newMessages[lastMessageIndex].isThinking) {
255
+ newMessages[lastMessageIndex] = {
256
+ ...newMessages[lastMessageIndex],
257
+ id: errorMessageId,
258
+ content: errorInfo.message,
259
+ type: "error",
260
+ isThinking: false,
261
+ cards: [
262
+ {
263
+ type: "error_card",
264
+ content: JSON.stringify(errorInfo),
265
+ },
266
+ ],
267
+ };
268
+ }
269
+ else {
270
+ newMessages.push({
271
+ id: errorMessageId,
272
+ role: "assistant",
273
+ content: errorInfo.message,
274
+ type: "error",
275
+ isThinking: false,
276
+ isTimeout: false,
277
+ isInterrupted: false,
278
+ isUiDiscard: false,
279
+ uiTimeStr: new Date().toLocaleTimeString(),
280
+ cards: [
281
+ {
282
+ type: "error_card",
283
+ content: JSON.stringify(errorInfo),
284
+ },
285
+ ],
286
+ timestamp: Date.now(),
287
+ });
288
+ }
289
+ return newMessages;
290
+ });
291
+ return;
292
+ }
293
+ if (!message || typeof message !== "object") {
294
+ console.warn("Invalid message object:", message);
295
+ return;
296
+ }
297
+ // 兼容两种格式:message (旧) 和 delta (新)
298
+ const choice = message.choices[0];
299
+ const messageData = choice.message || choice.delta || {};
300
+ // 检测错误类型:空 type 或 "error" type,或者有 finish_reason 为 "error"
301
+ const isError = (choice.message && !messageData.type) || messageData.type === "error" || choice.finish_reason === "error";
302
+ const msgType = isError ? "error" : (messageData.type || "answer");
303
+ const currentText = messageData.content || "";
304
+ const currentReasoning = messageData.reasoning_content || "";
305
+ const messageId = message.id;
306
+ // 对于错误情况,提取错误信息(构建标准格式,与 ErrorCard 匹配)
307
+ const errorInfo = isError
308
+ ? {
309
+ message: message.error || currentText || message.message || "未知错误",
310
+ code: message.code,
311
+ log_id: message.log_id,
312
+ rawData: {
313
+ message: message.error || currentText || message.message || "未知错误",
314
+ error: message.error || message.message || "未知错误",
315
+ code: message.code,
316
+ log_id: message.log_id,
317
+ },
318
+ }
319
+ : null;
320
+ onMessageUpdate((prev) => {
321
+ const newMessages = [...prev];
322
+ let existingIndex = newMessages.findIndex((msg) => msg.id === messageId);
323
+ if (existingIndex === -1) {
324
+ const newMessage = {
325
+ id: messageId,
326
+ role: "assistant",
327
+ content: "",
328
+ reasoningContent: "",
329
+ isThinking: true,
330
+ isTimeout: false,
331
+ isInterrupted: false,
332
+ isUiDiscard: false,
333
+ uiTimeStr: new Date().toLocaleTimeString(),
334
+ type: "thinking",
335
+ cards: [],
336
+ timestamp: Date.now(),
337
+ };
338
+ newMessages.push(newMessage);
339
+ existingIndex = newMessages.length - 1;
340
+ }
341
+ const existingMessage = newMessages[existingIndex];
342
+ // 创建一个可变副本进行更新
343
+ const updatedMessage = {
344
+ ...existingMessage,
345
+ };
346
+ updatedMessage.reasoningContent = (updatedMessage.reasoningContent || "") + currentReasoning;
347
+ updatedMessage.isThinking = !!currentReasoning;
348
+ // 根据消息类型处理
349
+ if (msgType === "error") {
350
+ // 错误类型处理
351
+ updatedMessage.content = errorInfo?.message || "处理失败";
352
+ updatedMessage.type = "error";
353
+ updatedMessage.isThinking = false;
354
+ // 将完整的错误信息存储在 cards 中供 ErrorCard 使用
355
+ updatedMessage.cards = [
356
+ {
357
+ type: "error_card",
358
+ content: JSON.stringify(errorInfo),
359
+ },
360
+ ];
361
+ }
362
+ else if (msgType === "answer") {
363
+ updatedMessage.content = (updatedMessage.content || "") + currentText;
364
+ updatedMessage.type = "answer";
365
+ }
366
+ else if ([
367
+ "function_call",
368
+ "function_call_response",
369
+ "knowledge_base_search",
370
+ "knowledge_base_search_response",
371
+ ].includes(msgType)) {
372
+ const cards = updatedMessage.cards ? [...updatedMessage.cards] : [];
373
+ const existingCardIndex = cards.findIndex((card) => card.type === msgType);
374
+ const newCard = {
375
+ type: msgType,
376
+ content: currentText,
377
+ };
378
+ if (existingCardIndex !== -1) {
379
+ // 如果卡片已存在,则更新它 (流式更新卡片内容)
380
+ cards[existingCardIndex].content += currentText;
381
+ }
382
+ else {
383
+ cards.push(newCard);
384
+ }
385
+ updatedMessage.cards = cards;
386
+ // 如果消息还在思考中,则更新其主类型
387
+ if (existingMessage.type === "thinking") {
388
+ updatedMessage.type = msgType;
389
+ }
390
+ }
391
+ // 图片/视频类型:主内容按图片渲染,type 跟随分片类型
392
+ else if (msgType === "image" || msgType === "video") {
393
+ if (currentText) {
394
+ updatedMessage.content = currentText; // 图片/视频 URL/base64
395
+ }
396
+ updatedMessage.type = msgType;
397
+ // 图片/视频结果为最终结果,确保结束思考态以触发渲染
398
+ updatedMessage.isThinking = false;
399
+ }
400
+ // 异步任务类型:统一走卡片渲染
401
+ else if (msgType === "async_task") {
402
+ const cards = updatedMessage.cards ? [...updatedMessage.cards] : [];
403
+ const existingCardIndex = cards.findIndex((card) => card.type === msgType);
404
+ const newCard = {
405
+ type: msgType,
406
+ content: currentText,
407
+ };
408
+ if (existingCardIndex !== -1) {
409
+ cards[existingCardIndex].content += currentText;
410
+ }
411
+ else {
412
+ cards.push(newCard);
413
+ }
414
+ updatedMessage.cards = cards;
415
+ if (existingMessage.type === "thinking") {
416
+ updatedMessage.type = msgType;
417
+ }
418
+ }
419
+ newMessages[existingIndex] = updatedMessage;
420
+ return newMessages;
421
+ });
422
+ }
423
+ catch (error) {
424
+ console.error("Transform message error:", error);
425
+ }
426
+ },
427
+ onSuccess: (chunks) => {
428
+ onMessageUpdate((prev) => {
429
+ return prev.map((msg) => ({
430
+ ...msg,
431
+ isThinking: false,
432
+ }));
433
+ });
434
+ onRequestEnd();
435
+ },
436
+ onError: (error) => {
437
+ console.error("Request error:", error);
438
+ // 简化错误处理:直接使用错误消息
439
+ let errorMessage = error.message || "请求失败,请重试!";
440
+ // 如果是 AbortError,表示用户取消
441
+ if (error.name === "AbortError") {
442
+ errorMessage = "请求已取消";
443
+ }
444
+ else if (errorMessage.includes("status")) {
445
+ // 提取 HTTP 状态码:Fetch failed with status 500
446
+ const statusMatch = errorMessage.match(/status (\d+)/);
447
+ if (statusMatch) {
448
+ errorMessage = `请求失败 (HTTP ${statusMatch[1]})`;
449
+ }
450
+ }
451
+ // 构建标准错误信息格式,与 ErrorCard 的消费逻辑匹配
452
+ const errorMessageId = `error-${Date.now()}`;
453
+ const errorInfo = {
454
+ message: errorMessage,
455
+ code: undefined, // 网络错误没有 code
456
+ log_id: undefined, // 网络错误没有 log_id
457
+ rawData: {
458
+ message: errorMessage,
459
+ error: error.message || errorMessage,
460
+ },
461
+ };
462
+ onMessageUpdate((prev) => {
463
+ const newMessages = [...prev];
464
+ const lastMessageIndex = newMessages.length - 1;
465
+ if (lastMessageIndex >= 0 && newMessages[lastMessageIndex].isThinking) {
466
+ // 更新现有的 thinking 消息为错误消息
467
+ newMessages[lastMessageIndex] = {
468
+ ...newMessages[lastMessageIndex],
469
+ id: errorMessageId,
470
+ content: errorMessage,
471
+ type: "error",
472
+ isThinking: false,
473
+ cards: [
474
+ {
475
+ type: "error_card",
476
+ content: JSON.stringify(errorInfo),
477
+ },
478
+ ],
479
+ };
480
+ }
481
+ else {
482
+ // 如果没有 thinking 消息,创建新的错误消息
483
+ newMessages.push({
484
+ id: errorMessageId,
485
+ role: "assistant",
486
+ content: errorMessage,
487
+ type: "error",
488
+ isThinking: false,
489
+ isTimeout: false,
490
+ isInterrupted: false,
491
+ isUiDiscard: false,
492
+ uiTimeStr: new Date().toLocaleTimeString(),
493
+ cards: [
494
+ {
495
+ type: "error_card",
496
+ content: JSON.stringify(errorInfo),
497
+ },
498
+ ],
499
+ timestamp: Date.now(),
500
+ });
501
+ }
502
+ return newMessages;
503
+ });
504
+ onRequestEnd();
505
+ },
506
+ onStream: (controller) => {
507
+ // @ts-ignore
508
+ abortController.current = controller;
509
+ },
510
+ });
511
+ }, [agent, onMessageUpdate, onRequestStart, onRequestEnd]);
512
+ const handleCancel = (0, react_1.useCallback)(() => {
513
+ abortController.current?.abort();
514
+ }, []);
515
+ // 向父组件暴露方法
516
+ react_1.default.useEffect(() => {
517
+ onUserSubmit(handleUserSubmit);
518
+ onCancel(handleCancel);
519
+ }, [handleUserSubmit, handleCancel, onUserSubmit, onCancel]);
520
+ // 返回一个隐藏的 div,而不是 null
521
+ return (0, jsx_runtime_1.jsx)("div", { style: { display: "none" } });
522
+ };
523
+ const Copilot = () => {
524
+ const { isDark } = (0, ThemeContext_1.useThemeHook)();
525
+ const { token } = antd_1.theme.useToken();
526
+ const { styles } = (0, copilot_1.useCopilotStyle)();
527
+ const { isLoggedIn } = (0, AuthContext_1.useAuth)();
528
+ const { getUserAvatarProps } = (0, useUserAvatar_1.useUserAvatar)();
529
+ const chatUserSubmitRef = (0, react_1.useRef)(null);
530
+ const chatCancelRef = (0, react_1.useRef)(null);
531
+ // ==================== State ====================
532
+ const [attachmentsOpen, setAttachmentsOpen] = (0, react_1.useState)(false);
533
+ // 扩展 attachedFiles 类型,添加 fileSource 字段来区分文件来源
534
+ const [attachedFiles, setAttachedFiles] = (0, react_1.useState)([]);
535
+ const [inputValue, setInputValue] = (0, react_1.useState)("");
536
+ const [messages, setMessages] = (0, react_1.useState)([]);
537
+ const [loading, setLoading] = (0, react_1.useState)(false);
538
+ // ==================== Agent Status ====================
539
+ const { agentSimulatorInfo, debugStatus, isConnecting, retryConnection } = (0, useAgentStatus_1.useAgentStatus)();
540
+ // ========== Widgets 相关状态 ==========
541
+ const [showSystemLogs, setShowSystemLogs] = (0, react_1.useState)(false);
542
+ const [activeLogTab, setActiveLogTab] = (0, react_1.useState)("system");
543
+ const [currentModule, setCurrentModule] = (0, react_1.useState)(null);
544
+ // ToolBar 事件
545
+ const handleClearChat = () => {
546
+ setMessages([]);
547
+ };
548
+ const handleToggleLogs = () => setShowSystemLogs((v) => !v);
549
+ // ==================== 消息发送可用性检查 ====================
550
+ const canSendMessage = agentSimulatorInfo && debugStatus === "normal";
551
+ const getDisabledReason = () => {
552
+ if (!agentSimulatorInfo) {
553
+ return "服务断开,无法发送消息";
554
+ }
555
+ if (debugStatus !== "normal") {
556
+ return "调试状态异常,无法发送消息";
557
+ }
558
+ return "Ask or input / use skills";
559
+ };
560
+ // ==================== Event ====================
561
+ const handleUserSubmit = (val) => {
562
+ if (!canSendMessage) {
563
+ antd_2.message.warning(getDisabledReason());
564
+ return;
565
+ }
566
+ // 分离标准上传的文件和 OpenAI 上传的文件
567
+ const standardFiles = (attachedFiles || []).filter((f) => f.fileSource !== "openai" && f.status === "done" && f.url);
568
+ const agentFiles = (attachedFiles || []).filter((f) => f.fileSource === "openai" && f.status === "done");
569
+ // 将标准上传的文件转为 MultimodalFile
570
+ const files = standardFiles.map((f) => {
571
+ // 根据 mimeType 确定文件类型
572
+ const mimeType = f.type || f.mimeType || f.originFileObj?.type || "application/octet-stream";
573
+ const fileType = getFileTypeFromMimeType(mimeType);
574
+ // 调试信息
575
+ console.log("==== 文件上传类型检测 ====", {
576
+ fileName: f.name,
577
+ mimeType,
578
+ fileType,
579
+ originFileObj: f.originFileObj?.type,
580
+ });
581
+ return {
582
+ id: f.uid || f.id || `file_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
583
+ name: f.name || "未知文件",
584
+ url: f.url,
585
+ type: fileType,
586
+ size: f.size || f.originFileObj?.size || 0,
587
+ mimeType: f.type || f.mimeType || "application/octet-stream",
588
+ uploadTime: f.uploadTime || Date.now(),
589
+ status: "success",
590
+ thumbnail: fileType === "image" ? f.url : undefined,
591
+ };
592
+ });
593
+ // 将 OpenAI 上传的文件转为 OpenAI 标准格式
594
+ const agentFilesData = agentFiles.map((f) => {
595
+ // 移除可能的 [Agent] 前缀(如果在显示时添加了)
596
+ let filename = f.name || f.filename || "OpenAI 文件";
597
+ if (filename.startsWith("[Agent] ")) {
598
+ filename = filename.replace("[Agent] ", "");
599
+ }
600
+ return {
601
+ id: f.agentFileId || f.id,
602
+ filename,
603
+ purpose: f.purpose || "file-extract",
604
+ bytes: f.size || f.bytes || 0,
605
+ created_at: f.created_at || f.uploadTime || Date.now(),
606
+ };
607
+ });
608
+ if (chatUserSubmitRef.current) {
609
+ // 传递标准文件和 OpenAI 文件信息给 ChatAgent
610
+ chatUserSubmitRef.current(val, messages, files, agentFilesData);
611
+ setAttachedFiles([]);
612
+ setAttachmentsOpen(false);
613
+ }
614
+ };
615
+ const handleCancel = () => {
616
+ if (chatCancelRef.current) {
617
+ chatCancelRef.current();
618
+ }
619
+ };
620
+ // 处理 OpenAI 文件上传成功 - 添加到 attachedFiles 中,标记为 openai 类型
621
+ const handleAgentFileUpload = (fileInfo) => {
622
+ const uid = `openai_${fileInfo.id}_${Date.now()}`;
623
+ const agentFileItem = {
624
+ uid,
625
+ id: fileInfo.id,
626
+ name: fileInfo.filename || fileInfo.name || "OpenAI 文件",
627
+ status: "done",
628
+ percent: 100,
629
+ fileSource: "openai",
630
+ agentFileId: fileInfo.id,
631
+ size: fileInfo.bytes || 0,
632
+ purpose: fileInfo.purpose || "file-extract",
633
+ created_at: fileInfo.created_at || Date.now(),
634
+ uploadTime: fileInfo.created_at || Date.now(),
635
+ // 对于 OpenAI 文件,没有 url,只有 file_id,但为了显示可能需要一个占位符或特殊处理
636
+ url: undefined, // OpenAI 文件没有 HTTP 链接
637
+ };
638
+ setAttachedFiles((prev) => [...prev, agentFileItem]);
639
+ // 上传成功后自动打开 Attachments 面板
640
+ setAttachmentsOpen(true);
641
+ };
642
+ // 处理文件上传
643
+ const { uploadFiles } = (0, useUploader_1.useUploader)({
644
+ bizName: upload_config_1.uploadBizConfig.bizName,
645
+ scene: upload_config_1.uploadBizConfig.scene,
646
+ getToken: async () => {
647
+ const res = await http_client_1.httpClient.get(`/api/upload/token`, {
648
+ params: {
649
+ bizName: upload_config_1.uploadBizConfig.bizName,
650
+ scene: upload_config_1.uploadBizConfig.scene,
651
+ },
652
+ });
653
+ if (res.code === 0) {
654
+ return res.data;
655
+ }
656
+ throw new Error(`处理文件上传,获取上传Token失败: ${res.message}`);
657
+ },
658
+ });
659
+ const enqueueUpload = (file) => {
660
+ const uid = `manual_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
661
+ const newItem = {
662
+ uid,
663
+ name: file.name,
664
+ status: "uploading",
665
+ originFileObj: file,
666
+ percent: 0,
667
+ fileSource: "standard", // 标记为标准上传
668
+ };
669
+ setAttachedFiles((prev) => [...prev, newItem]);
670
+ uploadFiles([file], {
671
+ onStart: () => { },
672
+ onComplete: (ok) => {
673
+ setAttachedFiles((prev) => prev.map((it) => it.uid === uid ? { ...it, status: "done", url: ok.url, percent: 100, fileSource: "standard" } : it));
674
+ antd_2.message.success(`${ok.name} 上传成功`);
675
+ // 上传成功后自动打开 Attachments 面板
676
+ setAttachmentsOpen(true);
677
+ },
678
+ onError: (err) => {
679
+ setAttachedFiles((prev) => prev.map((it) => (it.uid === uid ? { ...it, status: "error" } : it)));
680
+ antd_2.message.error(`${file.name} 上传失败: ${err.message}`);
681
+ },
682
+ });
683
+ };
684
+ const handleFileUpload = async (fileList) => {
685
+ if (!fileList?.length)
686
+ return;
687
+ fileList.forEach((f) => enqueueUpload(f));
688
+ };
689
+ // 获取文件类型
690
+ const getFileType = (file) => {
691
+ const mimeType = file.type.toLowerCase();
692
+ return cos_config_1.uploadConfig.fileTypeMap[mimeType] || "document";
693
+ };
694
+ const onPasteFile = (_, files) => {
695
+ if (!isLoggedIn) {
696
+ antd_2.message.warning("请先登录后再上传文件");
697
+ return;
698
+ }
699
+ const fileArray = Array.from(files);
700
+ handleFileUpload(fileArray);
701
+ setAttachmentsOpen(true);
702
+ };
703
+ // 预览功能如需启用,请结合 UploadFile 结构扩展;当前手动上传暂不启用内置预览。
704
+ // ==================== Nodes ====================
705
+ 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) => {
706
+ return {
707
+ content: item.content,
708
+ role: item.role,
709
+ messageRender: () => (0, jsx_runtime_1.jsx)(components_1.MessageRenderer, { message: item }),
710
+ };
711
+ }), roles: {
712
+ assistant: {
713
+ placement: "start",
714
+ loadingRender: () => ((0, jsx_runtime_1.jsxs)(antd_2.Space, { children: [(0, jsx_runtime_1.jsx)(antd_2.Spin, { size: "small" }), "Custom loading..."] })),
715
+ avatar: {
716
+ icon: (0, jsx_runtime_1.jsx)(icons_1.AliwangwangFilled, {}),
717
+ style: { background: token.colorInfoText },
718
+ },
719
+ styles: {
720
+ content: {
721
+ backgroundColor: "transparent",
722
+ padding: 0,
723
+ },
724
+ },
725
+ },
726
+ user: {
727
+ placement: "start",
728
+ avatar: {
729
+ ...getUserAvatarProps(),
730
+ size: 40,
731
+ },
732
+ },
733
+ } })) : ((0, jsx_runtime_1.jsx)(components_1.WelcomeModule, { onPromptSelect: handleUserSubmit, onModuleChange: setCurrentModule, isDark: isDark })) }));
734
+ 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, attachmentsOpen: attachmentsOpen, onAttachmentsOpenChange: setAttachmentsOpen, onAgentFileUpload: handleAgentFileUpload, currentModule: currentModule, onInputChange: (value) => setInputValue(value || ""), onSubmit: handleUserSubmit, onCancel: handleCancel, onPasteFile: onPasteFile, enqueueUpload: enqueueUpload, onRemoveFile: (file) => {
735
+ const index = attachedFiles.indexOf(file);
736
+ const newFileList = attachedFiles.slice();
737
+ newFileList.splice(index, 1);
738
+ setAttachedFiles(newFileList);
739
+ }, getDisabledReason: getDisabledReason }));
740
+ return ((0, jsx_runtime_1.jsx)(AgentContext_1.AgentProvider, { agentSimulatorInfo: agentSimulatorInfo, children: (0, jsx_runtime_1.jsxs)("div", { className: styles.copilotChat, style: {
741
+ background: token.colorBgContainer,
742
+ minHeight: "100vh",
743
+ borderRadius: 0,
744
+ boxShadow: "none",
745
+ padding: 0,
746
+ border: `1px solid ${token.colorBorder}`,
747
+ }, 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) => {
748
+ chatUserSubmitRef.current = fn;
749
+ }, onCancel: (fn) => {
750
+ chatCancelRef.current = fn;
751
+ } }))] }) }));
752
+ };
753
+ const CopilotSimulator = () => {
754
+ const { styles: workareaStyles } = (0, workarea_1.useWorkareaStyle)();
755
+ // 从 URL query 参数中读取 isDark
756
+ const getIsDarkFromQuery = () => {
757
+ const params = new URLSearchParams(window.location.search);
758
+ return params.get("isDark") ? params.get("isDark") === "true" : false;
759
+ };
760
+ const initIsDarkMode = getIsDarkFromQuery();
761
+ const [darkMode, setDarkMode] = (0, react_1.useState)(initIsDarkMode);
762
+ if (typeof require === "function") {
763
+ // 当前运行在IDE中,electron环境
764
+ const { ipcRenderer } = require("electron");
765
+ // @ts-ignore
766
+ ipcRenderer.on("setTheme", (event, isDark) => {
767
+ setDarkMode(isDark);
768
+ });
769
+ }
770
+ return ((0, jsx_runtime_1.jsx)(ThemeContext_1.ThemeProvider, { isDark: darkMode, children: (0, jsx_runtime_1.jsx)(antd_1.ConfigProvider, { theme: {
771
+ algorithm: darkMode ? antd_1.theme.darkAlgorithm : antd_1.theme.defaultAlgorithm,
772
+ }, 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, {}) }) }) }) }) }));
773
+ };
774
+ exports.default = CopilotSimulator;
775
+ //# sourceMappingURL=App.js.map