@opensumi/ide-ai-native 3.8.1-next-1740478950.0 → 3.8.1-next-1740556231.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 (206) hide show
  1. package/lib/browser/ai-core.contribution.d.ts +4 -1
  2. package/lib/browser/ai-core.contribution.d.ts.map +1 -1
  3. package/lib/browser/ai-core.contribution.js +23 -11
  4. package/lib/browser/ai-core.contribution.js.map +1 -1
  5. package/lib/browser/chat/chat-manager.service.d.ts +1 -5
  6. package/lib/browser/chat/chat-manager.service.d.ts.map +1 -1
  7. package/lib/browser/chat/chat-manager.service.js +13 -17
  8. package/lib/browser/chat/chat-manager.service.js.map +1 -1
  9. package/lib/browser/chat/chat-model.d.ts +0 -2
  10. package/lib/browser/chat/chat-model.d.ts.map +1 -1
  11. package/lib/browser/chat/chat-model.js +2 -8
  12. package/lib/browser/chat/chat-model.js.map +1 -1
  13. package/lib/browser/chat/chat.internal.service.d.ts +1 -0
  14. package/lib/browser/chat/chat.internal.service.d.ts.map +1 -1
  15. package/lib/browser/chat/chat.internal.service.js +3 -0
  16. package/lib/browser/chat/chat.internal.service.js.map +1 -1
  17. package/lib/browser/chat/chat.module.less +2 -1
  18. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  19. package/lib/browser/chat/chat.view.js +9 -6
  20. package/lib/browser/chat/chat.view.js.map +1 -1
  21. package/lib/browser/components/ChatContext/index.js +2 -2
  22. package/lib/browser/components/ChatContext/index.js.map +1 -1
  23. package/lib/browser/components/ChatHistory.d.ts +0 -1
  24. package/lib/browser/components/ChatHistory.d.ts.map +1 -1
  25. package/lib/browser/components/ChatHistory.js +14 -14
  26. package/lib/browser/components/ChatHistory.js.map +1 -1
  27. package/lib/browser/components/ChatInput.d.ts.map +1 -1
  28. package/lib/browser/components/ChatInput.js +1 -25
  29. package/lib/browser/components/ChatInput.js.map +1 -1
  30. package/lib/browser/components/ChatToolRender.d.ts.map +1 -1
  31. package/lib/browser/components/ChatToolRender.js +3 -2
  32. package/lib/browser/components/ChatToolRender.js.map +1 -1
  33. package/lib/browser/components/{chat-history.css → chat-history.module.less} +1 -1
  34. package/lib/browser/components/components.module.less +0 -20
  35. package/lib/browser/context/llm-context.service.d.ts +5 -16
  36. package/lib/browser/context/llm-context.service.d.ts.map +1 -1
  37. package/lib/browser/context/llm-context.service.js +47 -78
  38. package/lib/browser/context/llm-context.service.js.map +1 -1
  39. package/lib/browser/index.d.ts.map +1 -1
  40. package/lib/browser/index.js +0 -4
  41. package/lib/browser/index.js.map +1 -1
  42. package/lib/browser/layout/layout.module.less +4 -4
  43. package/lib/browser/mcp/base-apply.service.d.ts +31 -40
  44. package/lib/browser/mcp/base-apply.service.d.ts.map +1 -1
  45. package/lib/browser/mcp/base-apply.service.js +233 -167
  46. package/lib/browser/mcp/base-apply.service.js.map +1 -1
  47. package/lib/browser/mcp/mcp-server-proxy.service.d.ts +0 -6
  48. package/lib/browser/mcp/mcp-server-proxy.service.d.ts.map +1 -1
  49. package/lib/browser/mcp/mcp-server-proxy.service.js +1 -10
  50. package/lib/browser/mcp/mcp-server-proxy.service.js.map +1 -1
  51. package/lib/browser/mcp/mcp-server.feature.registry.d.ts.map +1 -1
  52. package/lib/browser/mcp/mcp-server.feature.registry.js +2 -3
  53. package/lib/browser/mcp/mcp-server.feature.registry.js.map +1 -1
  54. package/lib/browser/mcp/tools/components/EditFile.d.ts.map +1 -1
  55. package/lib/browser/mcp/tools/components/EditFile.js +55 -41
  56. package/lib/browser/mcp/tools/components/EditFile.js.map +1 -1
  57. package/lib/browser/mcp/tools/components/index.module.less +22 -4
  58. package/lib/browser/mcp/tools/createNewFileWithText.d.ts.map +1 -1
  59. package/lib/browser/mcp/tools/createNewFileWithText.js +0 -1
  60. package/lib/browser/mcp/tools/createNewFileWithText.js.map +1 -1
  61. package/lib/browser/mcp/tools/editFile.js +1 -1
  62. package/lib/browser/mcp/tools/editFile.js.map +1 -1
  63. package/lib/browser/mcp/tools/getDiagnosticsByPath.d.ts.map +1 -1
  64. package/lib/browser/mcp/tools/getDiagnosticsByPath.js +0 -1
  65. package/lib/browser/mcp/tools/getDiagnosticsByPath.js.map +1 -1
  66. package/lib/browser/mcp/tools/handlers/EditFile.d.ts +5 -1
  67. package/lib/browser/mcp/tools/handlers/EditFile.d.ts.map +1 -1
  68. package/lib/browser/mcp/tools/handlers/EditFile.js +4 -4
  69. package/lib/browser/mcp/tools/handlers/EditFile.js.map +1 -1
  70. package/lib/browser/mcp/tools/handlers/RunCommand.d.ts.map +1 -1
  71. package/lib/browser/mcp/tools/handlers/RunCommand.js +0 -2
  72. package/lib/browser/mcp/tools/handlers/RunCommand.js.map +1 -1
  73. package/lib/browser/mcp/tools/runTerminalCmd.d.ts.map +1 -1
  74. package/lib/browser/mcp/tools/runTerminalCmd.js +0 -1
  75. package/lib/browser/mcp/tools/runTerminalCmd.js.map +1 -1
  76. package/lib/browser/model/msg-history-manager.d.ts +1 -0
  77. package/lib/browser/model/msg-history-manager.d.ts.map +1 -1
  78. package/lib/browser/model/msg-history-manager.js +12 -2
  79. package/lib/browser/model/msg-history-manager.js.map +1 -1
  80. package/lib/browser/preferences/schema.d.ts.map +1 -1
  81. package/lib/browser/preferences/schema.js +0 -16
  82. package/lib/browser/preferences/schema.js.map +1 -1
  83. package/lib/browser/types.d.ts +1 -1
  84. package/lib/browser/types.d.ts.map +1 -1
  85. package/lib/browser/widget/inline-diff/inline-diff-manager.d.ts +6 -0
  86. package/lib/browser/widget/inline-diff/inline-diff-manager.d.ts.map +1 -0
  87. package/lib/browser/widget/inline-diff/inline-diff-manager.js +27 -0
  88. package/lib/browser/widget/inline-diff/inline-diff-manager.js.map +1 -0
  89. package/lib/browser/widget/inline-diff/inline-diff-widget.module.less +12 -0
  90. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts +2 -0
  91. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts.map +1 -1
  92. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js +11 -4
  93. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js.map +1 -1
  94. package/lib/common/index.d.ts +1 -8
  95. package/lib/common/index.d.ts.map +1 -1
  96. package/lib/common/index.js +1 -3
  97. package/lib/common/index.js.map +1 -1
  98. package/lib/common/llm-context.d.ts +9 -12
  99. package/lib/common/llm-context.d.ts.map +1 -1
  100. package/lib/common/llm-context.js.map +1 -1
  101. package/lib/common/mcp-server-manager.d.ts +1 -17
  102. package/lib/common/mcp-server-manager.d.ts.map +1 -1
  103. package/lib/common/mcp-server-manager.js.map +1 -1
  104. package/lib/common/prompts/context-prompt-provider.d.ts +3 -2
  105. package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
  106. package/lib/common/prompts/context-prompt-provider.js +22 -21
  107. package/lib/common/prompts/context-prompt-provider.js.map +1 -1
  108. package/lib/common/tool-invocation-registry.d.ts +2 -2
  109. package/lib/common/tool-invocation-registry.d.ts.map +1 -1
  110. package/lib/common/tool-invocation-registry.js +1 -1
  111. package/lib/common/tool-invocation-registry.js.map +1 -1
  112. package/lib/common/types.d.ts +17 -6
  113. package/lib/common/types.d.ts.map +1 -1
  114. package/lib/common/types.js.map +1 -1
  115. package/lib/common/utils.d.ts.map +1 -1
  116. package/lib/common/utils.js +1 -2
  117. package/lib/common/utils.js.map +1 -1
  118. package/lib/node/base-language-model.d.ts +1 -1
  119. package/lib/node/base-language-model.d.ts.map +1 -1
  120. package/lib/node/base-language-model.js +54 -3
  121. package/lib/node/base-language-model.js.map +1 -1
  122. package/lib/node/mcp/sumi-mcp-server.d.ts +3 -17
  123. package/lib/node/mcp/sumi-mcp-server.d.ts.map +1 -1
  124. package/lib/node/mcp/sumi-mcp-server.js +6 -59
  125. package/lib/node/mcp/sumi-mcp-server.js.map +1 -1
  126. package/lib/node/mcp-server-manager-impl.d.ts +3 -4
  127. package/lib/node/mcp-server-manager-impl.d.ts.map +1 -1
  128. package/lib/node/mcp-server-manager-impl.js +6 -26
  129. package/lib/node/mcp-server-manager-impl.js.map +1 -1
  130. package/lib/node/mcp-server.d.ts +16 -5
  131. package/lib/node/mcp-server.d.ts.map +1 -1
  132. package/lib/node/mcp-server.js +6 -12
  133. package/lib/node/mcp-server.js.map +1 -1
  134. package/lib/node/openai/openai-language-model.d.ts +3 -4
  135. package/lib/node/openai/openai-language-model.d.ts.map +1 -1
  136. package/lib/node/openai/openai-language-model.js +2 -3
  137. package/lib/node/openai/openai-language-model.js.map +1 -1
  138. package/package.json +27 -27
  139. package/src/browser/ai-core.contribution.ts +29 -14
  140. package/src/browser/chat/chat-manager.service.ts +13 -17
  141. package/src/browser/chat/chat-model.ts +3 -18
  142. package/src/browser/chat/chat.internal.service.ts +4 -0
  143. package/src/browser/chat/chat.module.less +2 -1
  144. package/src/browser/chat/chat.view.tsx +26 -10
  145. package/src/browser/components/ChatContext/index.tsx +2 -2
  146. package/src/browser/components/ChatHistory.tsx +21 -15
  147. package/src/browser/components/ChatInput.tsx +4 -67
  148. package/src/browser/components/ChatToolRender.tsx +2 -1
  149. package/src/browser/components/{chat-history.css → chat-history.module.less} +1 -1
  150. package/src/browser/components/components.module.less +0 -20
  151. package/src/browser/context/llm-context.service.ts +54 -90
  152. package/src/browser/index.ts +0 -4
  153. package/src/browser/layout/layout.module.less +4 -4
  154. package/src/browser/mcp/base-apply.service.ts +266 -213
  155. package/src/browser/mcp/mcp-server-proxy.service.ts +2 -14
  156. package/src/browser/mcp/mcp-server.feature.registry.ts +2 -3
  157. package/src/browser/mcp/tools/components/EditFile.tsx +82 -60
  158. package/src/browser/mcp/tools/components/index.module.less +22 -4
  159. package/src/browser/mcp/tools/createNewFileWithText.ts +0 -1
  160. package/src/browser/mcp/tools/editFile.ts +2 -2
  161. package/src/browser/mcp/tools/getDiagnosticsByPath.ts +0 -1
  162. package/src/browser/mcp/tools/handlers/EditFile.ts +4 -4
  163. package/src/browser/mcp/tools/handlers/RunCommand.ts +0 -2
  164. package/src/browser/mcp/tools/runTerminalCmd.ts +0 -1
  165. package/src/browser/model/msg-history-manager.ts +12 -2
  166. package/src/browser/preferences/schema.ts +0 -16
  167. package/src/browser/types.ts +1 -1
  168. package/src/browser/widget/inline-diff/inline-diff-manager.tsx +38 -0
  169. package/src/browser/widget/inline-diff/inline-diff-widget.module.less +12 -0
  170. package/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +13 -4
  171. package/src/common/index.ts +1 -7
  172. package/src/common/llm-context.ts +4 -10
  173. package/src/common/mcp-server-manager.ts +1 -17
  174. package/src/common/prompts/context-prompt-provider.ts +28 -26
  175. package/src/common/tool-invocation-registry.ts +2 -2
  176. package/src/common/types.ts +20 -6
  177. package/src/common/utils.ts +1 -3
  178. package/src/node/base-language-model.ts +63 -1
  179. package/src/node/mcp/sumi-mcp-server.ts +9 -67
  180. package/src/node/mcp-server-manager-impl.ts +9 -30
  181. package/src/node/mcp-server.ts +14 -11
  182. package/src/node/openai/openai-language-model.ts +4 -7
  183. package/lib/browser/mcp/config/components/mcp-config.module.less +0 -178
  184. package/lib/browser/mcp/config/components/mcp-config.view.d.ts +0 -3
  185. package/lib/browser/mcp/config/components/mcp-config.view.d.ts.map +0 -1
  186. package/lib/browser/mcp/config/components/mcp-config.view.js +0 -150
  187. package/lib/browser/mcp/config/components/mcp-config.view.js.map +0 -1
  188. package/lib/browser/mcp/config/components/mcp-server-form.d.ts +0 -16
  189. package/lib/browser/mcp/config/components/mcp-server-form.d.ts.map +0 -1
  190. package/lib/browser/mcp/config/components/mcp-server-form.js +0 -84
  191. package/lib/browser/mcp/config/components/mcp-server-form.js.map +0 -1
  192. package/lib/browser/mcp/config/components/mcp-server-form.module.less +0 -78
  193. package/lib/browser/mcp/config/mcp-config.commands.d.ts +0 -10
  194. package/lib/browser/mcp/config/mcp-config.commands.d.ts.map +0 -1
  195. package/lib/browser/mcp/config/mcp-config.commands.js +0 -35
  196. package/lib/browser/mcp/config/mcp-config.commands.js.map +0 -1
  197. package/lib/browser/mcp/config/mcp-config.contribution.d.ts +0 -16
  198. package/lib/browser/mcp/config/mcp-config.contribution.d.ts.map +0 -1
  199. package/lib/browser/mcp/config/mcp-config.contribution.js +0 -62
  200. package/lib/browser/mcp/config/mcp-config.contribution.js.map +0 -1
  201. package/src/browser/mcp/config/components/mcp-config.module.less +0 -178
  202. package/src/browser/mcp/config/components/mcp-config.view.tsx +0 -215
  203. package/src/browser/mcp/config/components/mcp-server-form.module.less +0 -78
  204. package/src/browser/mcp/config/components/mcp-server-form.tsx +0 -144
  205. package/src/browser/mcp/config/mcp-config.commands.ts +0 -29
  206. package/src/browser/mcp/config/mcp-config.contribution.ts +0 -65
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StdioMCPServerImpl = void 0;
3
+ exports.MCPServerImpl = void 0;
4
4
  // have to import with extension since the exports map is ./* -> ./dist/cjs/*
5
5
  const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
6
6
  const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
7
- class StdioMCPServerImpl {
7
+ class MCPServerImpl {
8
8
  constructor(name, command, args, env, logger) {
9
9
  this.logger = logger;
10
10
  this.started = false;
@@ -78,21 +78,15 @@ class StdioMCPServerImpl {
78
78
  this.args = args;
79
79
  this.env = env;
80
80
  }
81
- async stop() {
82
- var _a, _b, _c;
81
+ stop() {
82
+ var _a;
83
83
  if (!this.started || !this.client) {
84
84
  return;
85
85
  }
86
86
  (_a = this.logger) === null || _a === void 0 ? void 0 : _a.log(`Stopping MCP server "${this.name}"`);
87
- try {
88
- await this.client.close();
89
- }
90
- catch (error) {
91
- (_b = this.logger) === null || _b === void 0 ? void 0 : _b.error(`Failed to stop MCP server "${this.name}":`, error);
92
- }
93
- (_c = this.logger) === null || _c === void 0 ? void 0 : _c.log(`MCP server "${this.name}" stopped`);
87
+ this.client.close();
94
88
  this.started = false;
95
89
  }
96
90
  }
97
- exports.StdioMCPServerImpl = StdioMCPServerImpl;
91
+ exports.MCPServerImpl = MCPServerImpl;
98
92
  //# sourceMappingURL=mcp-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/node/mcp-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/node/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,9 @@
1
- import { OpenAICompatibleProvider } from '@ai-sdk/openai-compatible';
2
- import { LanguageModelV1 } from 'ai';
1
+ import { OpenAIProvider } from '@ai-sdk/openai';
3
2
  import { IAIBackServiceOption } from '@opensumi/ide-core-common';
4
3
  import { BaseLanguageModel } from '../base-language-model';
5
4
  export declare const DeepSeekModelIdentifier: unique symbol;
6
5
  export declare class OpenAIModel extends BaseLanguageModel {
7
- protected initializeProvider(options: IAIBackServiceOption): OpenAICompatibleProvider;
8
- protected getModelIdentifier(provider: OpenAICompatibleProvider, modelId?: string): LanguageModelV1;
6
+ protected initializeProvider(options: IAIBackServiceOption): OpenAIProvider;
7
+ protected getModelIdentifier(provider: OpenAIProvider, modelId?: string): import("ai").LanguageModelV1;
9
8
  }
10
9
  //# sourceMappingURL=openai-language-model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-language-model.d.ts","sourceRoot":"","sources":["../../../src/node/openai/openai-language-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAA0B,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAGrC,OAAO,EAA6B,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAE5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,eAAO,MAAM,uBAAuB,eAAoC,CAAC;AAEzE,qBACa,WAAY,SAAQ,iBAAiB;IAChD,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,wBAAwB;IAYrF,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe;CAGpG"}
1
+ {"version":3,"file":"openai-language-model.d.ts","sourceRoot":"","sources":["../../../src/node/openai/openai-language-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgB,MAAM,gBAAgB,CAAC;AAG9D,OAAO,EAA6B,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAE5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,eAAO,MAAM,uBAAuB,eAAoC,CAAC;AAEzE,qBACa,WAAY,SAAQ,iBAAiB;IAChD,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc;IAW3E,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM;CAGxE"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OpenAIModel = exports.DeepSeekModelIdentifier = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const openai_compatible_1 = require("@ai-sdk/openai-compatible");
5
+ const openai_1 = require("@ai-sdk/openai");
6
6
  const di_1 = require("@opensumi/di");
7
7
  const ide_core_common_1 = require("@opensumi/ide-core-common");
8
8
  const base_language_model_1 = require("../base-language-model");
@@ -13,10 +13,9 @@ let OpenAIModel = class OpenAIModel extends base_language_model_1.BaseLanguageMo
13
13
  if (!apiKey) {
14
14
  throw new Error(`Please provide OpenAI API Key in preferences (${ide_core_common_1.AINativeSettingSectionsId.OpenaiApiKey})`);
15
15
  }
16
- return (0, openai_compatible_1.createOpenAICompatible)({
16
+ return (0, openai_1.createOpenAI)({
17
17
  apiKey,
18
18
  baseURL: options.baseURL || 'https://dashscope.aliyuncs.com/compatible-mode/v1',
19
- name: 'openai',
20
19
  });
21
20
  }
22
21
  getModelIdentifier(provider, modelId) {
@@ -1 +1 @@
1
- {"version":3,"file":"openai-language-model.js","sourceRoot":"","sources":["../../../src/node/openai/openai-language-model.ts"],"names":[],"mappings":";;;;AAAA,iEAA6F;AAG7F,qCAA0C;AAC1C,+DAA4F;AAE5F,gEAA2D;AAE9C,QAAA,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAGlE,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,uCAAiB;IACtC,kBAAkB,CAAC,OAA6B;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,2CAAyB,CAAC,YAAY,GAAG,CAAC,CAAC;QAC9G,CAAC;QACD,OAAO,IAAA,0CAAsB,EAAC;YAC5B,MAAM;YACN,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,mDAAmD;YAC/E,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC;IAES,kBAAkB,CAAC,QAAkC,EAAE,OAAgB;QAC/E,OAAO,QAAQ,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;IACzC,CAAC;CACF,CAAA;AAhBY,kCAAW;sBAAX,WAAW;IADvB,IAAA,eAAU,GAAE;GACA,WAAW,CAgBvB"}
1
+ {"version":3,"file":"openai-language-model.js","sourceRoot":"","sources":["../../../src/node/openai/openai-language-model.ts"],"names":[],"mappings":";;;;AAAA,2CAA8D;AAE9D,qCAA0C;AAC1C,+DAA4F;AAE5F,gEAA2D;AAC9C,QAAA,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAGlE,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,uCAAiB;IACtC,kBAAkB,CAAC,OAA6B;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,2CAAyB,CAAC,YAAY,GAAG,CAAC,CAAC;QAC9G,CAAC;QACD,OAAO,IAAA,qBAAY,EAAC;YAClB,MAAM;YACN,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,mDAAmD;SAChF,CAAC,CAAC;IACL,CAAC;IAES,kBAAkB,CAAC,QAAwB,EAAE,OAAgB;QACrE,OAAO,QAAQ,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;IACzC,CAAC;CACF,CAAA;AAfY,kCAAW;sBAAX,WAAW;IADvB,IAAA,eAAU,GAAE;GACA,WAAW,CAevB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensumi/ide-ai-native",
3
- "version": "3.8.1-next-1740478950.0",
3
+ "version": "3.8.1-next-1740556231.0",
4
4
  "files": [
5
5
  "lib",
6
6
  "src"
@@ -19,32 +19,32 @@
19
19
  "url": "git@github.com:opensumi/core.git"
20
20
  },
21
21
  "dependencies": {
22
- "@ai-sdk/anthropic": "^1.1.9",
23
- "@ai-sdk/deepseek": "^0.1.11",
24
- "@ai-sdk/openai-compatible": "^0.1.11",
22
+ "@ai-sdk/anthropic": "^1.1.6",
23
+ "@ai-sdk/deepseek": "^0.1.8",
24
+ "@ai-sdk/openai": "^1.1.9",
25
25
  "@modelcontextprotocol/sdk": "^1.3.1",
26
- "@opensumi/ide-addons": "3.8.1-next-1740478950.0",
27
- "@opensumi/ide-components": "3.8.1-next-1740478950.0",
28
- "@opensumi/ide-connection": "3.8.1-next-1740478950.0",
29
- "@opensumi/ide-core-common": "3.8.1-next-1740478950.0",
30
- "@opensumi/ide-core-node": "3.8.1-next-1740478950.0",
31
- "@opensumi/ide-debug": "3.8.1-next-1740478950.0",
32
- "@opensumi/ide-design": "3.8.1-next-1740478950.0",
33
- "@opensumi/ide-editor": "3.8.1-next-1740478950.0",
34
- "@opensumi/ide-file-search": "3.8.1-next-1740478950.0",
35
- "@opensumi/ide-file-service": "3.8.1-next-1740478950.0",
36
- "@opensumi/ide-main-layout": "3.8.1-next-1740478950.0",
37
- "@opensumi/ide-markers": "3.8.1-next-1740478950.0",
38
- "@opensumi/ide-monaco": "3.8.1-next-1740478950.0",
39
- "@opensumi/ide-overlay": "3.8.1-next-1740478950.0",
40
- "@opensumi/ide-preferences": "3.8.1-next-1740478950.0",
41
- "@opensumi/ide-search": "3.8.1-next-1740478950.0",
42
- "@opensumi/ide-terminal-next": "3.8.1-next-1740478950.0",
43
- "@opensumi/ide-theme": "3.8.1-next-1740478950.0",
44
- "@opensumi/ide-utils": "3.8.1-next-1740478950.0",
45
- "@opensumi/ide-workspace": "3.8.1-next-1740478950.0",
26
+ "@opensumi/ide-addons": "3.8.1-next-1740556231.0",
27
+ "@opensumi/ide-components": "3.8.1-next-1740556231.0",
28
+ "@opensumi/ide-connection": "3.8.1-next-1740556231.0",
29
+ "@opensumi/ide-core-common": "3.8.1-next-1740556231.0",
30
+ "@opensumi/ide-core-node": "3.8.1-next-1740556231.0",
31
+ "@opensumi/ide-debug": "3.8.1-next-1740556231.0",
32
+ "@opensumi/ide-design": "3.8.1-next-1740556231.0",
33
+ "@opensumi/ide-editor": "3.8.1-next-1740556231.0",
34
+ "@opensumi/ide-file-search": "3.8.1-next-1740556231.0",
35
+ "@opensumi/ide-file-service": "3.8.1-next-1740556231.0",
36
+ "@opensumi/ide-main-layout": "3.8.1-next-1740556231.0",
37
+ "@opensumi/ide-markers": "3.8.1-next-1740556231.0",
38
+ "@opensumi/ide-monaco": "3.8.1-next-1740556231.0",
39
+ "@opensumi/ide-overlay": "3.8.1-next-1740556231.0",
40
+ "@opensumi/ide-preferences": "3.8.1-next-1740556231.0",
41
+ "@opensumi/ide-search": "3.8.1-next-1740556231.0",
42
+ "@opensumi/ide-terminal-next": "3.8.1-next-1740556231.0",
43
+ "@opensumi/ide-theme": "3.8.1-next-1740556231.0",
44
+ "@opensumi/ide-utils": "3.8.1-next-1740556231.0",
45
+ "@opensumi/ide-workspace": "3.8.1-next-1740556231.0",
46
46
  "@xterm/xterm": "5.5.0",
47
- "ai": "^4.1.45",
47
+ "ai": "^4.1.21",
48
48
  "ansi-regex": "^2.0.0",
49
49
  "diff": "^7.0.0",
50
50
  "dom-align": "^1.7.0",
@@ -57,7 +57,7 @@
57
57
  "zod-to-json-schema": "^3.24.1"
58
58
  },
59
59
  "devDependencies": {
60
- "@opensumi/ide-core-browser": "3.8.1-next-1740478950.0"
60
+ "@opensumi/ide-core-browser": "3.8.1-next-1740556231.0"
61
61
  },
62
- "gitHead": "919a16c55d69177cb5e6326f09c9af5794336e24"
62
+ "gitHead": "d7a58257c41fb36ec7fd284c7ded010bf2e588b7"
63
63
  }
@@ -59,7 +59,11 @@ import {
59
59
  } from '@opensumi/ide-core-common';
60
60
  import { DESIGN_MENU_BAR_RIGHT } from '@opensumi/ide-design';
61
61
  import { IEditor, WorkbenchEditorService } from '@opensumi/ide-editor';
62
- import { BrowserEditorContribution, IEditorFeatureRegistry } from '@opensumi/ide-editor/lib/browser';
62
+ import {
63
+ BrowserEditorContribution,
64
+ EditorComponentRegistry,
65
+ IEditorFeatureRegistry,
66
+ } from '@opensumi/ide-editor/lib/browser';
63
67
  import { WorkbenchEditorServiceImpl } from '@opensumi/ide-editor/lib/browser/workbench-editor.service';
64
68
  import { IMainLayoutService } from '@opensumi/ide-main-layout';
65
69
  import { ISettingRegistry, SettingContribution } from '@opensumi/ide-preferences';
@@ -72,7 +76,6 @@ import {
72
76
  AI_CHAT_LOGO_AVATAR_ID,
73
77
  AI_CHAT_VIEW_ID,
74
78
  AI_MENU_BAR_DEBUG_TOOLBAR,
75
- BUILTIN_MCP_SERVER_NAME,
76
79
  ChatProxyServiceToken,
77
80
  IChatInternalService,
78
81
  IChatManagerService,
@@ -100,6 +103,7 @@ import {
100
103
  AIRightTabRenderer,
101
104
  } from './layout/tabbar.view';
102
105
  import { AIChatLogoAvatar } from './layout/view/avatar/avatar.view';
106
+ import { BaseApplyService } from './mcp/base-apply.service';
103
107
  import {
104
108
  AINativeCoreContribution,
105
109
  IChatFeatureRegistry,
@@ -116,6 +120,7 @@ import {
116
120
  import { InlineChatEditorController } from './widget/inline-chat/inline-chat-editor.controller';
117
121
  import { InlineChatFeatureRegistry } from './widget/inline-chat/inline-chat.feature.registry';
118
122
  import { InlineChatService } from './widget/inline-chat/inline-chat.service';
123
+ import { InlineDiffManager } from './widget/inline-diff/inline-diff-manager';
119
124
  import { InlineDiffController } from './widget/inline-diff/inline-diff.controller';
120
125
  import { InlineHintController } from './widget/inline-hint/inline-hint.controller';
121
126
  import { InlineInputController } from './widget/inline-input/inline-input.controller';
@@ -123,6 +128,8 @@ import { InlineInputService } from './widget/inline-input/inline-input.service';
123
128
  import { InlineStreamDiffService } from './widget/inline-stream-diff/inline-stream-diff.service';
124
129
  import { SumiLightBulbWidget } from './widget/light-bulb';
125
130
 
131
+ export const INLINE_DIFF_MANAGER_WIDGET_ID = 'inline-diff-manager-widget';
132
+
126
133
  @Domain(
127
134
  ClientAppContribution,
128
135
  BrowserEditorContribution,
@@ -237,6 +244,9 @@ export class AINativeBrowserContribution
237
244
  @Autowired(IChatInternalService)
238
245
  private readonly chatInternalService: ChatInternalService;
239
246
 
247
+ @Autowired(BaseApplyService)
248
+ private readonly applyService: BaseApplyService;
249
+
240
250
  constructor() {
241
251
  this.registerFeature();
242
252
  }
@@ -328,23 +338,15 @@ export class AINativeBrowserContribution
328
338
  }
329
339
 
330
340
  if (supportsMCP) {
341
+ // 初始化内置 MCP Server
342
+ this.sumiMCPServerBackendProxy.initBuiltinMCPServer();
343
+
331
344
  // 从 preferences 获取并初始化外部 MCP Servers
332
345
  const mcpServers = this.preferenceService.getValid<MCPServerDescription[]>(
333
346
  AINativeSettingSectionsId.MCPServers,
334
347
  );
335
-
336
- // 查找内置 MCP Server 的配置
337
- const builtinServer = mcpServers?.find((server) => server.name === BUILTIN_MCP_SERVER_NAME);
338
-
339
- // 总是初始化内置服务器,根据配置决定是否启用
340
- this.sumiMCPServerBackendProxy.initBuiltinMCPServer(builtinServer?.enabled ?? true);
341
-
342
- // 初始化其他外部 MCP Servers
343
348
  if (mcpServers && mcpServers.length > 0) {
344
- const externalServers = mcpServers.filter((server) => server.name !== BUILTIN_MCP_SERVER_NAME);
345
- if (externalServers.length > 0) {
346
- this.sumiMCPServerBackendProxy.initExternalMCPServers(externalServers);
347
- }
349
+ this.sumiMCPServerBackendProxy.initExternalMCPServers(mcpServers);
348
350
  }
349
351
  }
350
352
  });
@@ -524,6 +526,19 @@ export class AINativeBrowserContribution
524
526
  });
525
527
  }
526
528
 
529
+ registerEditorComponent(registry: EditorComponentRegistry): void {
530
+ registry.registerEditorSideWidget({
531
+ id: INLINE_DIFF_MANAGER_WIDGET_ID,
532
+ component: InlineDiffManager,
533
+ displaysOnResource: (resource) => {
534
+ if (this.applyService.getUriPendingCodeBlock(resource.uri)) {
535
+ return true;
536
+ }
537
+ return false;
538
+ },
539
+ });
540
+ }
541
+
527
542
  registerCommands(commands: CommandRegistry): void {
528
543
  commands.registerCommand(AI_INLINE_CHAT_VISIBLE, {
529
544
  execute: (value: boolean) => {
@@ -9,12 +9,11 @@ import {
9
9
  IStorage,
10
10
  STORAGE_NAMESPACE,
11
11
  StorageProvider,
12
+ debounce,
12
13
  } from '@opensumi/ide-core-common';
13
14
  import { ChatMessageRole, IChatMessage, IHistoryChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
14
15
 
15
16
  import { IChatAgentService, IChatFollowup, IChatRequestMessage, IChatResponseErrorDetails } from '../../common';
16
- import { LLMContextService, LLMContextServiceToken } from '../../common/llm-context';
17
- import { ChatAgentPromptProvider } from '../../common/prompts/context-prompt-provider';
18
17
  import { MsgHistoryManager } from '../model/msg-history-manager';
19
18
 
20
19
  import { ChatModel, ChatRequestModel, ChatResponseModel, IChatProgressResponseContent } from './chat-model';
@@ -51,12 +50,6 @@ export class ChatManagerService extends Disposable {
51
50
  @Autowired(StorageProvider)
52
51
  private storageProvider: StorageProvider;
53
52
 
54
- @Autowired(ChatAgentPromptProvider)
55
- protected readonly promptProvider: ChatAgentPromptProvider;
56
-
57
- @Autowired(LLMContextServiceToken)
58
- protected readonly contextService: LLMContextService;
59
-
60
53
  private _chatStorage: IStorage;
61
54
 
62
55
  protected fromJSON(data: ISessionModel[]) {
@@ -97,6 +90,7 @@ export class ChatManagerService extends Disposable {
97
90
  const savedSessions = this.fromJSON(sessionsModelData);
98
91
  savedSessions.forEach((session) => {
99
92
  this.#sessionModels.set(session.sessionId, session);
93
+ this.listenSession(session);
100
94
  });
101
95
  await this.storageInitEmitter.fireAndAwait();
102
96
  }
@@ -106,19 +100,12 @@ export class ChatManagerService extends Disposable {
106
100
  }
107
101
 
108
102
  startSession() {
109
- const model = new ChatModel({
110
- provideContext: this.provideContextPrompt.bind(this),
111
- });
103
+ const model = new ChatModel();
112
104
  this.#sessionModels.set(model.sessionId, model);
105
+ this.listenSession(model);
113
106
  return model;
114
107
  }
115
108
 
116
- private provideContextPrompt(message: string) {
117
- const context = this.contextService.serialize();
118
- const fullMessage = this.promptProvider.provideContextPrompt(context, message);
119
- return fullMessage;
120
- }
121
-
122
109
  getSession(sessionId: string): ChatModel | undefined {
123
110
  return this.#sessionModels.get(sessionId);
124
111
  }
@@ -212,6 +199,15 @@ export class ChatManagerService extends Disposable {
212
199
  }
213
200
  }
214
201
 
202
+ protected listenSession(session: ChatModel) {
203
+ this.addDispose(
204
+ session.history.onMessageAdditionalChange(() => {
205
+ this.saveSessions();
206
+ }),
207
+ );
208
+ }
209
+
210
+ @debounce(1000)
215
211
  protected saveSessions() {
216
212
  this._chatStorage.set('sessionModels', this.getSessions());
217
213
  }
@@ -274,22 +274,13 @@ export class ChatRequestModel implements IChatRequestModel {
274
274
  export class ChatModel extends Disposable implements IChatModel {
275
275
  private static requestIdPool = 0;
276
276
 
277
- private provideContextPrompt?: (string) => string;
278
-
279
- constructor(initParams?: {
280
- sessionId?: string;
281
- history?: MsgHistoryManager;
282
- requests?: ChatRequestModel[];
283
- provideContext?: (msg: string) => string;
284
- }) {
277
+ constructor(initParams?: { sessionId?: string; history?: MsgHistoryManager; requests?: ChatRequestModel[] }) {
285
278
  super();
286
279
  this.#sessionId = initParams?.sessionId ?? uuid();
287
280
  this.history = initParams?.history ?? new MsgHistoryManager();
288
281
  if (initParams?.requests) {
289
282
  this.#requests = new Map(initParams.requests.map((r) => [r.requestId, r]));
290
283
  }
291
-
292
- this.provideContextPrompt = initParams?.provideContext;
293
284
  }
294
285
 
295
286
  #sessionId: string;
@@ -309,15 +300,9 @@ export class ChatModel extends Disposable implements IChatModel {
309
300
  readonly history: MsgHistoryManager;
310
301
 
311
302
  addRequest(message: IChatRequestMessage): ChatRequestModel {
312
- const msg = message;
313
- // first msg
314
- if (ChatModel.requestIdPool === 0 && this.provideContextPrompt) {
315
- msg.prompt = this.provideContextPrompt(msg.prompt);
316
- }
317
-
318
303
  const requestId = `${this.sessionId}_request_${ChatModel.requestIdPool++}`;
319
- const response = new ChatResponseModel(requestId, this, msg.agentId);
320
- const request = new ChatRequestModel(requestId, this, msg, response);
304
+ const response = new ChatResponseModel(requestId, this, message.agentId);
305
+ const request = new ChatRequestModel(requestId, this, message, response);
321
306
 
322
307
  this.#requests.set(requestId, request);
323
308
  return request;
@@ -94,6 +94,10 @@ export class ChatInternalService extends Disposable {
94
94
  return this.chatManagerService.getSessions();
95
95
  }
96
96
 
97
+ getSession(sessionId: string) {
98
+ return this.chatManagerService.getSession(sessionId);
99
+ }
100
+
97
101
  activateSession(sessionId: string) {
98
102
  const targetSession = this.chatManagerService.getSession(sessionId);
99
103
  if (!targetSession) {
@@ -279,6 +279,7 @@
279
279
  }
280
280
  }
281
281
 
282
+
282
283
  .chat_tips_container {
283
284
  display: flex;
284
285
  align-items: center;
@@ -289,6 +290,6 @@
289
290
  }
290
291
 
291
292
  .chat_history {
292
- width: calc(100% - 40px);
293
+ width: calc(100% - 60px);
293
294
  color: var(--design-text-foreground);
294
295
  }
@@ -3,8 +3,8 @@ import { MessageList } from 'react-chat-elements';
3
3
 
4
4
  import {
5
5
  AINativeConfigService,
6
- CommandService,
7
6
  getIcon,
7
+ useEventEffect,
8
8
  useInjectable,
9
9
  useUpdateOnEvent,
10
10
  } from '@opensumi/ide-core-browser';
@@ -41,6 +41,8 @@ import {
41
41
  IChatMessageStructure,
42
42
  TokenMCPServerProxyService,
43
43
  } from '../../common';
44
+ import { LLMContextService, LLMContextServiceToken } from '../../common/llm-context';
45
+ import { ChatAgentPromptProvider } from '../../common/prompts/context-prompt-provider';
44
46
  import { ChatContext } from '../components/ChatContext';
45
47
  import { CodeBlockWrapperInput } from '../components/ChatEditor';
46
48
  import ChatHistory, { IChatHistoryItem } from '../components/ChatHistory';
@@ -50,7 +52,6 @@ import { ChatNotify, ChatReply } from '../components/ChatReply';
50
52
  import { SlashCustomRender } from '../components/SlashCustomRender';
51
53
  import { MessageData, createMessageByAI, createMessageByUser } from '../components/utils';
52
54
  import { WelcomeMessage } from '../components/WelcomeMsg';
53
- import { OPEN_MCP_CONFIG_COMMAND } from '../mcp/config/mcp-config.commands';
54
55
  import { MCPServerProxyService } from '../mcp/mcp-server-proxy.service';
55
56
  import { MCPToolsDialog } from '../mcp/mcp-tools-dialog.view';
56
57
  import { ChatViewHeaderRender, TSlashCommandCustomRender } from '../types';
@@ -62,7 +63,6 @@ import { ChatFeatureRegistry } from './chat.feature.registry';
62
63
  import { ChatInternalService } from './chat.internal.service';
63
64
  import styles from './chat.module.less';
64
65
  import { ChatRenderRegistry } from './chat.render.registry';
65
-
66
66
  const SCROLL_CLASSNAME = 'chat_scroll';
67
67
 
68
68
  interface TDispatchAction {
@@ -79,6 +79,8 @@ export const AIChatView = () => {
79
79
  const chatAgentService = useInjectable<IChatAgentService>(IChatAgentService);
80
80
  const chatFeatureRegistry = useInjectable<ChatFeatureRegistry>(ChatFeatureRegistryToken);
81
81
  const chatRenderRegistry = useInjectable<ChatRenderRegistry>(ChatRenderRegistryToken);
82
+ const contextService = useInjectable<LLMContextService>(LLMContextServiceToken);
83
+ const promptProvider = useInjectable<ChatAgentPromptProvider>(ChatAgentPromptProvider);
82
84
 
83
85
  const layoutService = useInjectable<IMainLayoutService>(IMainLayoutService);
84
86
  const msgHistoryManager = aiChatService.sessionModel.history;
@@ -504,7 +506,10 @@ export const AIChatView = () => {
504
506
  const { message, agentId, command, reportExtra } = value;
505
507
  const { actionType, actionSource } = reportExtra || {};
506
508
 
507
- const request = aiChatService.createRequest(message, agentId!, command);
509
+ const context = contextService.serialize();
510
+ const fullMessage = await promptProvider.provideContextPrompt(context, message);
511
+
512
+ const request = aiChatService.createRequest(fullMessage, agentId!, command);
508
513
  if (!request) {
509
514
  return;
510
515
  }
@@ -734,8 +739,6 @@ export function DefaultChatViewHeader({
734
739
  const aiNativeConfigService = useInjectable<AINativeConfigService>(AINativeConfigService);
735
740
  const mcpServerProxyService = useInjectable<MCPServerProxyService>(TokenMCPServerProxyService);
736
741
  const aiChatService = useInjectable<ChatInternalService>(IChatInternalService);
737
- const commandService = useInjectable<CommandService>(CommandService);
738
-
739
742
  const [historyList, setHistoryList] = React.useState<IChatHistoryItem[]>([]);
740
743
  const [currentTitle, setCurrentTitle] = React.useState<string>('');
741
744
  const handleNewChat = React.useCallback(() => {
@@ -756,10 +759,6 @@ export function DefaultChatViewHeader({
756
759
  [aiChatService],
757
760
  );
758
761
 
759
- const handleShowMCPConfig = React.useCallback(() => {
760
- commandService.executeCommand(OPEN_MCP_CONFIG_COMMAND.id);
761
- }, [commandService]);
762
-
763
762
  const handleShowMCPTools = React.useCallback(async () => {
764
763
  const tools = await mcpServerProxyService.getAllMCPTools();
765
764
  dialogService.open({
@@ -848,6 +847,23 @@ export function DefaultChatViewHeader({
848
847
  ariaLabel={localize('aiNative.operate.clear.title')}
849
848
  />
850
849
  </Popover>
850
+ {aiNativeConfigService.capabilities.supportsMCP && (
851
+ <Popover
852
+ overlayClassName={styles.popover_icon}
853
+ id={'ai-chat-header-tools'}
854
+ position={PopoverPosition.left}
855
+ title={localize('aiNative.operate.tools.title')}
856
+ >
857
+ <EnhanceIcon
858
+ wrapperClassName={styles.action_btn}
859
+ className={getIcon('menubar-tool')}
860
+ onClick={handleShowMCPTools}
861
+ tabIndex={0}
862
+ role='button'
863
+ ariaLabel={localize('aiNative.operate.tools.title')}
864
+ />
865
+ </Popover>
866
+ )}
851
867
  <Popover
852
868
  overlayClassName={styles.popover_icon}
853
869
  id={'ai-chat-header-close'}
@@ -39,7 +39,7 @@ export const ChatContext = memo(() => {
39
39
  50,
40
40
  )((files) => {
41
41
  if (files) {
42
- updateAddedFiles([...files.attached]);
42
+ updateAddedFiles(files);
43
43
  }
44
44
  }, contextService);
45
45
 
@@ -57,7 +57,7 @@ export const ChatContext = memo(() => {
57
57
  }, []);
58
58
 
59
59
  const onDidDeselect = useCallback((uri: URI) => {
60
- contextService.removeFileFromContext(uri, true);
60
+ contextService.removeFileFromContext(uri);
61
61
  }, []);
62
62
 
63
63
  const onDidClickFile = useCallback((uri: URI) => {
@@ -2,10 +2,11 @@ import cls from 'classnames';
2
2
  import React, { FC, memo, useCallback, useEffect, useRef, useState } from 'react';
3
3
 
4
4
  import { Icon, Input, Loading, Popover, PopoverPosition, PopoverTriggerType, getIcon } from '@opensumi/ide-components';
5
- import './chat-history.css';
6
5
  import { localize } from '@opensumi/ide-core-browser';
7
6
  import { EnhanceIcon } from '@opensumi/ide-core-browser/lib/components/ai-native';
8
7
 
8
+ import styles from './chat-history.module.less';
9
+
9
10
  export interface IChatHistoryItem {
10
11
  id: string;
11
12
  title: string;
@@ -162,22 +163,25 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
162
163
  (item: IChatHistoryItem) => (
163
164
  <div
164
165
  key={item.id}
165
- className={cls('dm-chat-history-item', item.id === currentId ? 'dm-chat-history-item-selected' : '')}
166
+ className={cls(
167
+ styles['dm-chat-history-item'],
168
+ item.id === currentId ? styles['dm-chat-history-item-selected'] : '',
169
+ )}
166
170
  onClick={() => handleHistoryItemSelect(item)}
167
171
  >
168
- <div className='dm-chat-history-item-content'>
172
+ <div className={styles['dm-chat-history-item-content']}>
169
173
  {item.loading ? (
170
174
  <Loading />
171
175
  ) : (
172
176
  <Icon icon='message' style={{ width: '16px', height: '16px', marginRight: 4 }} />
173
177
  )}
174
178
  {!historyTitleEditable?.[item.id] ? (
175
- <span id={`dm-chat-history-item-title-${item.id}`} className='dm-chat-history-item-title'>
179
+ <span id={`dm-chat-history-item-title-${item.id}`} className={styles['dm-chat-history-item-title']}>
176
180
  {item.title}
177
181
  </span>
178
182
  ) : (
179
183
  <Input
180
- className='dm-chat-history-item-title'
184
+ className={styles['dm-chat-history-item-title']}
181
185
  defaultValue={item.title}
182
186
  ref={inputRef}
183
187
  onPressEnter={(e: any) => {
@@ -187,7 +191,7 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
187
191
  />
188
192
  )}
189
193
  </div>
190
- <div className='dm-chat-history-item-actions'>
194
+ <div className={styles['dm-chat-history-item-actions']}>
191
195
  {/* <EditOutlined
192
196
  title={localize('aiNative.operate.chatHistory.edit')}
193
197
  style={{ marginRight: 8 }}
@@ -198,7 +202,7 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
198
202
  }}
199
203
  /> */}
200
204
  <EnhanceIcon
201
- className={cls('dm-chat-history-item-actions-delete', getIcon('delete'))}
205
+ className={cls(styles['dm-chat-history-item-actions-delete'], getIcon('delete'))}
202
206
  onClick={(e) => {
203
207
  e.preventDefault();
204
208
  e.stopPropagation();
@@ -237,10 +241,10 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
237
241
  value={searchValue}
238
242
  onChange={handleSearchChange}
239
243
  />
240
- <div className='dm-chat-history-list'>
244
+ <div className={styles['dm-chat-history-list']}>
241
245
  {groupedHistoryList.map((group) => (
242
246
  <div key={group.key} style={{ padding: '4px' }}>
243
- <div className='dm-chat-history-time'>{group.key}</div>
247
+ <div className={styles['dm-chat-history-time']}>{group.key}</div>
244
248
  {group.items.map(renderHistoryItem)}
245
249
  </div>
246
250
  ))}
@@ -253,11 +257,11 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
253
257
  const getPopupContainer = useCallback((triggerNode: HTMLElement) => triggerNode.parentElement!, []);
254
258
 
255
259
  return (
256
- <div className={cls('dm-chat-history-header', className)}>
257
- <div className='dm-chat-history-header-title'>
260
+ <div className={cls(styles['dm-chat-history-header'], className)}>
261
+ <div className={styles['dm-chat-history-header-title']}>
258
262
  <span>{title}</span>
259
263
  </div>
260
- <div className='dm-chat-history-header-actions'>
264
+ <div className={styles['dm-chat-history-header-actions']}>
261
265
  <Popover
262
266
  id='dm-chat-history-header-actions-history'
263
267
  content={renderHistory()}
@@ -267,10 +271,12 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
267
271
  getPopupContainer={getPopupContainer}
268
272
  >
269
273
  <div
270
- className='dm-chat-history-header-actions-history'
274
+ className={styles['dm-chat-history-header-actions-history']}
271
275
  title={localize('aiNative.operate.chatHistory.title')}
272
276
  >
273
- <EnhanceIcon className={cls('dm-chat-history-header-actions-history', 'codicon codicon-history')} />
277
+ <EnhanceIcon
278
+ className={cls(styles['dm-chat-history-header-actions-history'], 'codicon codicon-history')}
279
+ />
274
280
  </div>
275
281
  </Popover>
276
282
  <Popover
@@ -279,7 +285,7 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
279
285
  title={localize('aiNative.operate.newChat.title')}
280
286
  >
281
287
  <EnhanceIcon
282
- className={cls('dm-chat-history-header-actions-new', getIcon('plus'))}
288
+ className={cls(styles['dm-chat-history-header-actions-new'], getIcon('plus'))}
283
289
  onClick={handleNewChat}
284
290
  />
285
291
  </Popover>