@opensumi/ide-ai-native 3.8.1-next-1740478950.0 → 3.8.1-next-1740571693.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 (98) hide show
  1. package/lib/browser/ai-core.contextkeys.d.ts +1 -1
  2. package/lib/browser/ai-core.contextkeys.d.ts.map +1 -1
  3. package/lib/browser/ai-core.contextkeys.js +1 -1
  4. package/lib/browser/ai-core.contextkeys.js.map +1 -1
  5. package/lib/browser/chat/chat-manager.service.d.ts +0 -5
  6. package/lib/browser/chat/chat-manager.service.d.ts.map +1 -1
  7. package/lib/browser/chat/chat-manager.service.js +1 -18
  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.module.less +2 -1
  14. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  15. package/lib/browser/chat/chat.view.js +38 -6
  16. package/lib/browser/chat/chat.view.js.map +1 -1
  17. package/lib/browser/components/ChatContext/index.js +2 -2
  18. package/lib/browser/components/ChatContext/index.js.map +1 -1
  19. package/lib/browser/components/ChatInput.d.ts.map +1 -1
  20. package/lib/browser/components/ChatInput.js +1 -25
  21. package/lib/browser/components/ChatInput.js.map +1 -1
  22. package/lib/browser/components/ChatToolRender.d.ts.map +1 -1
  23. package/lib/browser/components/ChatToolRender.js +3 -2
  24. package/lib/browser/components/ChatToolRender.js.map +1 -1
  25. package/lib/browser/components/chat-history.css +1 -1
  26. package/lib/browser/components/components.module.less +0 -20
  27. package/lib/browser/context/llm-context.service.d.ts +5 -16
  28. package/lib/browser/context/llm-context.service.d.ts.map +1 -1
  29. package/lib/browser/context/llm-context.service.js +47 -78
  30. package/lib/browser/context/llm-context.service.js.map +1 -1
  31. package/lib/browser/contrib/inline-completions/inline-completions.controller.js +1 -1
  32. package/lib/browser/contrib/inline-completions/inline-completions.controller.js.map +1 -1
  33. package/lib/browser/contrib/intelligent-completions/index.d.ts +2 -1
  34. package/lib/browser/contrib/intelligent-completions/index.d.ts.map +1 -1
  35. package/lib/browser/contrib/intelligent-completions/index.js +4 -1
  36. package/lib/browser/contrib/intelligent-completions/index.js.map +1 -1
  37. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js +2 -2
  38. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js.map +1 -1
  39. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.d.ts.map +1 -1
  40. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js +5 -4
  41. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js.map +1 -1
  42. package/lib/browser/contrib/intelligent-completions/view/code-edits-previewer.d.ts.map +1 -1
  43. package/lib/browser/contrib/intelligent-completions/view/code-edits-previewer.js +4 -2
  44. package/lib/browser/contrib/intelligent-completions/view/code-edits-previewer.js.map +1 -1
  45. package/lib/browser/contrib/intelligent-completions/view/default.d.ts.map +1 -1
  46. package/lib/browser/contrib/intelligent-completions/view/default.js +17 -11
  47. package/lib/browser/contrib/intelligent-completions/view/default.js.map +1 -1
  48. package/lib/browser/layout/layout.module.less +4 -4
  49. package/lib/browser/mcp/tools/components/index.module.less +0 -1
  50. package/lib/browser/mcp/tools/createNewFileWithText.d.ts.map +1 -1
  51. package/lib/browser/mcp/tools/createNewFileWithText.js +0 -1
  52. package/lib/browser/mcp/tools/createNewFileWithText.js.map +1 -1
  53. package/lib/browser/mcp/tools/getDiagnosticsByPath.d.ts.map +1 -1
  54. package/lib/browser/mcp/tools/getDiagnosticsByPath.js +0 -1
  55. package/lib/browser/mcp/tools/getDiagnosticsByPath.js.map +1 -1
  56. package/lib/browser/mcp/tools/handlers/RunCommand.d.ts.map +1 -1
  57. package/lib/browser/mcp/tools/handlers/RunCommand.js +0 -2
  58. package/lib/browser/mcp/tools/handlers/RunCommand.js.map +1 -1
  59. package/lib/browser/mcp/tools/runTerminalCmd.d.ts.map +1 -1
  60. package/lib/browser/mcp/tools/runTerminalCmd.js +0 -1
  61. package/lib/browser/mcp/tools/runTerminalCmd.js.map +1 -1
  62. package/lib/common/llm-context.d.ts +9 -12
  63. package/lib/common/llm-context.d.ts.map +1 -1
  64. package/lib/common/llm-context.js.map +1 -1
  65. package/lib/common/prompts/context-prompt-provider.d.ts +3 -2
  66. package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
  67. package/lib/common/prompts/context-prompt-provider.js +22 -21
  68. package/lib/common/prompts/context-prompt-provider.js.map +1 -1
  69. package/lib/node/base-language-model.d.ts.map +1 -1
  70. package/lib/node/base-language-model.js +5 -4
  71. package/lib/node/base-language-model.js.map +1 -1
  72. package/package.json +23 -23
  73. package/src/browser/ai-core.contextkeys.ts +3 -3
  74. package/src/browser/chat/chat-manager.service.ts +1 -17
  75. package/src/browser/chat/chat-model.ts +3 -18
  76. package/src/browser/chat/chat.module.less +2 -1
  77. package/src/browser/chat/chat.view.tsx +70 -7
  78. package/src/browser/components/ChatContext/index.tsx +2 -2
  79. package/src/browser/components/ChatInput.tsx +4 -67
  80. package/src/browser/components/ChatToolRender.tsx +2 -1
  81. package/src/browser/components/chat-history.css +1 -1
  82. package/src/browser/components/components.module.less +0 -20
  83. package/src/browser/context/llm-context.service.ts +54 -90
  84. package/src/browser/contrib/inline-completions/inline-completions.controller.ts +1 -1
  85. package/src/browser/contrib/intelligent-completions/index.ts +5 -1
  86. package/src/browser/contrib/intelligent-completions/intelligent-completions.contribution.ts +3 -3
  87. package/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +6 -5
  88. package/src/browser/contrib/intelligent-completions/view/code-edits-previewer.ts +4 -2
  89. package/src/browser/contrib/intelligent-completions/view/default.ts +27 -19
  90. package/src/browser/layout/layout.module.less +4 -4
  91. package/src/browser/mcp/tools/components/index.module.less +0 -1
  92. package/src/browser/mcp/tools/createNewFileWithText.ts +0 -1
  93. package/src/browser/mcp/tools/getDiagnosticsByPath.ts +0 -1
  94. package/src/browser/mcp/tools/handlers/RunCommand.ts +0 -2
  95. package/src/browser/mcp/tools/runTerminalCmd.ts +0 -1
  96. package/src/common/llm-context.ts +4 -10
  97. package/src/common/prompts/context-prompt-provider.ts +28 -26
  98. package/src/node/base-language-model.ts +7 -4
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-1740571693.0",
4
4
  "files": [
5
5
  "lib",
6
6
  "src"
@@ -23,26 +23,26 @@
23
23
  "@ai-sdk/deepseek": "^0.1.11",
24
24
  "@ai-sdk/openai-compatible": "^0.1.11",
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-1740571693.0",
27
+ "@opensumi/ide-components": "3.8.1-next-1740571693.0",
28
+ "@opensumi/ide-connection": "3.8.1-next-1740571693.0",
29
+ "@opensumi/ide-core-common": "3.8.1-next-1740571693.0",
30
+ "@opensumi/ide-core-node": "3.8.1-next-1740571693.0",
31
+ "@opensumi/ide-debug": "3.8.1-next-1740571693.0",
32
+ "@opensumi/ide-design": "3.8.1-next-1740571693.0",
33
+ "@opensumi/ide-editor": "3.8.1-next-1740571693.0",
34
+ "@opensumi/ide-file-search": "3.8.1-next-1740571693.0",
35
+ "@opensumi/ide-file-service": "3.8.1-next-1740571693.0",
36
+ "@opensumi/ide-main-layout": "3.8.1-next-1740571693.0",
37
+ "@opensumi/ide-markers": "3.8.1-next-1740571693.0",
38
+ "@opensumi/ide-monaco": "3.8.1-next-1740571693.0",
39
+ "@opensumi/ide-overlay": "3.8.1-next-1740571693.0",
40
+ "@opensumi/ide-preferences": "3.8.1-next-1740571693.0",
41
+ "@opensumi/ide-search": "3.8.1-next-1740571693.0",
42
+ "@opensumi/ide-terminal-next": "3.8.1-next-1740571693.0",
43
+ "@opensumi/ide-theme": "3.8.1-next-1740571693.0",
44
+ "@opensumi/ide-utils": "3.8.1-next-1740571693.0",
45
+ "@opensumi/ide-workspace": "3.8.1-next-1740571693.0",
46
46
  "@xterm/xterm": "5.5.0",
47
47
  "ai": "^4.1.45",
48
48
  "ansi-regex": "^2.0.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-1740571693.0"
61
61
  },
62
- "gitHead": "919a16c55d69177cb5e6326f09c9af5794336e24"
62
+ "gitHead": "f7916df4337a2adcfa8d06375bb4a4a289f704a5"
63
63
  }
@@ -1,13 +1,13 @@
1
1
  import { Autowired, Injectable, Optional } from '@opensumi/di';
2
2
  import { IContextKey, IContextKeyService, IScopedContextKeyService } from '@opensumi/ide-core-browser';
3
3
  import {
4
+ CodeEditsIsVisible,
4
5
  InlineChatIsVisible,
5
6
  InlineCompletionIsTrigger,
6
7
  InlineDiffPartialEditsIsVisible,
7
8
  InlineHintWidgetIsVisible,
8
9
  InlineInputWidgetIsStreaming,
9
10
  InlineInputWidgetIsVisible,
10
- MultiLineEditsIsVisible,
11
11
  } from '@opensumi/ide-core-browser/lib/contextkey/ai-native';
12
12
  import { ContextKeyService } from '@opensumi/monaco-editor-core/esm/vs/platform/contextkey/browser/contextKeyService';
13
13
  import { IContextKeyServiceTarget } from '@opensumi/monaco-editor-core/esm/vs/platform/contextkey/common/contextkey';
@@ -25,7 +25,7 @@ export class AINativeContextKey {
25
25
  public readonly inlineInputWidgetIsVisible: IContextKey<boolean>;
26
26
  public readonly inlineInputWidgetIsStreaming: IContextKey<boolean>;
27
27
  public readonly inlineDiffPartialEditsIsVisible: IContextKey<boolean>;
28
- public readonly multiLineEditsIsVisible: IContextKey<boolean>;
28
+ public readonly codeEditsIsVisible: IContextKey<boolean>;
29
29
  public get contextKeyService() {
30
30
  return this._contextKeyService;
31
31
  }
@@ -38,6 +38,6 @@ export class AINativeContextKey {
38
38
  this.inlineInputWidgetIsVisible = InlineInputWidgetIsVisible.bind(this._contextKeyService);
39
39
  this.inlineInputWidgetIsStreaming = InlineInputWidgetIsStreaming.bind(this._contextKeyService);
40
40
  this.inlineDiffPartialEditsIsVisible = InlineDiffPartialEditsIsVisible.bind(this._contextKeyService);
41
- this.multiLineEditsIsVisible = MultiLineEditsIsVisible.bind(this._contextKeyService);
41
+ this.codeEditsIsVisible = CodeEditsIsVisible.bind(this._contextKeyService);
42
42
  }
43
43
  }
@@ -13,8 +13,6 @@ import {
13
13
  import { ChatMessageRole, IChatMessage, IHistoryChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
14
14
 
15
15
  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
16
  import { MsgHistoryManager } from '../model/msg-history-manager';
19
17
 
20
18
  import { ChatModel, ChatRequestModel, ChatResponseModel, IChatProgressResponseContent } from './chat-model';
@@ -51,12 +49,6 @@ export class ChatManagerService extends Disposable {
51
49
  @Autowired(StorageProvider)
52
50
  private storageProvider: StorageProvider;
53
51
 
54
- @Autowired(ChatAgentPromptProvider)
55
- protected readonly promptProvider: ChatAgentPromptProvider;
56
-
57
- @Autowired(LLMContextServiceToken)
58
- protected readonly contextService: LLMContextService;
59
-
60
52
  private _chatStorage: IStorage;
61
53
 
62
54
  protected fromJSON(data: ISessionModel[]) {
@@ -106,19 +98,11 @@ export class ChatManagerService extends Disposable {
106
98
  }
107
99
 
108
100
  startSession() {
109
- const model = new ChatModel({
110
- provideContext: this.provideContextPrompt.bind(this),
111
- });
101
+ const model = new ChatModel();
112
102
  this.#sessionModels.set(model.sessionId, model);
113
103
  return model;
114
104
  }
115
105
 
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
106
  getSession(sessionId: string): ChatModel | undefined {
123
107
  return this.#sessionModels.get(sessionId);
124
108
  }
@@ -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;
@@ -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
  }
@@ -5,6 +5,7 @@ import {
5
5
  AINativeConfigService,
6
6
  CommandService,
7
7
  getIcon,
8
+ useEventEffect,
8
9
  useInjectable,
9
10
  useUpdateOnEvent,
10
11
  } from '@opensumi/ide-core-browser';
@@ -41,6 +42,8 @@ import {
41
42
  IChatMessageStructure,
42
43
  TokenMCPServerProxyService,
43
44
  } from '../../common';
45
+ import { LLMContextService, LLMContextServiceToken } from '../../common/llm-context';
46
+ import { ChatAgentPromptProvider } from '../../common/prompts/context-prompt-provider';
44
47
  import { ChatContext } from '../components/ChatContext';
45
48
  import { CodeBlockWrapperInput } from '../components/ChatEditor';
46
49
  import ChatHistory, { IChatHistoryItem } from '../components/ChatHistory';
@@ -79,11 +82,17 @@ export const AIChatView = () => {
79
82
  const chatAgentService = useInjectable<IChatAgentService>(IChatAgentService);
80
83
  const chatFeatureRegistry = useInjectable<ChatFeatureRegistry>(ChatFeatureRegistryToken);
81
84
  const chatRenderRegistry = useInjectable<ChatRenderRegistry>(ChatRenderRegistryToken);
85
+ const contextService = useInjectable<LLMContextService>(LLMContextServiceToken);
86
+ const promptProvider = useInjectable<ChatAgentPromptProvider>(ChatAgentPromptProvider);
87
+ const mcpServerProxyService = useInjectable<MCPServerProxyService>(TokenMCPServerProxyService);
82
88
 
83
89
  const layoutService = useInjectable<IMainLayoutService>(IMainLayoutService);
84
90
  const msgHistoryManager = aiChatService.sessionModel.history;
85
91
  const containerRef = React.useRef<HTMLDivElement>(null);
86
92
  const chatInputRef = React.useRef<{ setInputValue: (v: string) => void } | null>(null);
93
+ const dialogService = useInjectable<IDialogService>(IDialogService);
94
+ const aiNativeConfigService = useInjectable<AINativeConfigService>(AINativeConfigService);
95
+ const commandService = useInjectable<CommandService>(CommandService);
87
96
 
88
97
  const [shortcutCommands, setShortcutCommands] = React.useState<ChatSlashCommandItemModel[]>([]);
89
98
 
@@ -105,6 +114,8 @@ export const AIChatView = () => {
105
114
  const [defaultAgentId, setDefaultAgentId] = React.useState<string>('');
106
115
  const [command, setCommand] = React.useState('');
107
116
  const [theme, setTheme] = React.useState<string | null>(null);
117
+ const [mcpToolsCount, setMcpToolsCount] = React.useState<number>(0);
118
+ const [mcpServersCount, setMcpServersCount] = React.useState<number>(0);
108
119
 
109
120
  React.useEffect(() => {
110
121
  const featureSlashCommands = chatFeatureRegistry.getAllShortcutSlashCommand();
@@ -504,7 +515,10 @@ export const AIChatView = () => {
504
515
  const { message, agentId, command, reportExtra } = value;
505
516
  const { actionType, actionSource } = reportExtra || {};
506
517
 
507
- const request = aiChatService.createRequest(message, agentId!, command);
518
+ const context = contextService.serialize();
519
+ const fullMessage = await promptProvider.provideContextPrompt(context, message);
520
+
521
+ const request = aiChatService.createRequest(fullMessage, agentId!, command);
508
522
  if (!request) {
509
523
  return;
510
524
  }
@@ -653,6 +667,32 @@ export const AIChatView = () => {
653
667
  };
654
668
  }, [aiChatService.sessionModel]);
655
669
 
670
+ useEventEffect(
671
+ mcpServerProxyService.onChangeMCPServers,
672
+ () => {
673
+ mcpServerProxyService.getAllMCPTools().then((tools) => {
674
+ setMcpToolsCount(tools.length);
675
+ });
676
+ mcpServerProxyService.$getServers().then((servers) => {
677
+ setMcpServersCount(servers.length);
678
+ });
679
+ },
680
+ [mcpServerProxyService],
681
+ );
682
+
683
+ const handleShowMCPTools = React.useCallback(async () => {
684
+ const tools = await mcpServerProxyService.getAllMCPTools();
685
+ dialogService.open({
686
+ message: <MCPToolsDialog tools={tools} />,
687
+ type: MessageType.Empty,
688
+ buttons: ['关闭'],
689
+ });
690
+ }, [mcpServerProxyService, dialogService]);
691
+
692
+ const handleShowMCPConfig = React.useCallback(() => {
693
+ commandService.executeCommand(OPEN_MCP_CONFIG_COMMAND.id);
694
+ }, [commandService]);
695
+
656
696
  return (
657
697
  <div id={styles.ai_chat_view}>
658
698
  <div className={styles.header_container}>
@@ -692,6 +732,18 @@ export const AIChatView = () => {
692
732
  </Popover>
693
733
  ))}
694
734
  </div>
735
+ <div className={styles.header_operate_right}>
736
+ {aiNativeConfigService.capabilities.supportsMCP && (
737
+ <>
738
+ <div className={styles.tag} onClick={handleShowMCPConfig}>
739
+ {`MCP Servers: ${mcpServersCount}`}
740
+ </div>
741
+ <div className={styles.tag} onClick={handleShowMCPTools}>
742
+ {`MCP Tools: ${mcpToolsCount}`}
743
+ </div>
744
+ </>
745
+ )}
746
+ </div>
695
747
  </div>
696
748
  <ChatInputWrapperRender
697
749
  onSend={(value, agentId, command) =>
@@ -734,8 +786,6 @@ export function DefaultChatViewHeader({
734
786
  const aiNativeConfigService = useInjectable<AINativeConfigService>(AINativeConfigService);
735
787
  const mcpServerProxyService = useInjectable<MCPServerProxyService>(TokenMCPServerProxyService);
736
788
  const aiChatService = useInjectable<ChatInternalService>(IChatInternalService);
737
- const commandService = useInjectable<CommandService>(CommandService);
738
-
739
789
  const [historyList, setHistoryList] = React.useState<IChatHistoryItem[]>([]);
740
790
  const [currentTitle, setCurrentTitle] = React.useState<string>('');
741
791
  const handleNewChat = React.useCallback(() => {
@@ -756,10 +806,6 @@ export function DefaultChatViewHeader({
756
806
  [aiChatService],
757
807
  );
758
808
 
759
- const handleShowMCPConfig = React.useCallback(() => {
760
- commandService.executeCommand(OPEN_MCP_CONFIG_COMMAND.id);
761
- }, [commandService]);
762
-
763
809
  const handleShowMCPTools = React.useCallback(async () => {
764
810
  const tools = await mcpServerProxyService.getAllMCPTools();
765
811
  dialogService.open({
@@ -848,6 +894,23 @@ export function DefaultChatViewHeader({
848
894
  ariaLabel={localize('aiNative.operate.clear.title')}
849
895
  />
850
896
  </Popover>
897
+ {aiNativeConfigService.capabilities.supportsMCP && (
898
+ <Popover
899
+ overlayClassName={styles.popover_icon}
900
+ id={'ai-chat-header-tools'}
901
+ position={PopoverPosition.left}
902
+ title={localize('aiNative.operate.tools.title')}
903
+ >
904
+ <EnhanceIcon
905
+ wrapperClassName={styles.action_btn}
906
+ className={getIcon('menubar-tool')}
907
+ onClick={handleShowMCPTools}
908
+ tabIndex={0}
909
+ role='button'
910
+ ariaLabel={localize('aiNative.operate.tools.title')}
911
+ />
912
+ </Popover>
913
+ )}
851
914
  <Popover
852
915
  overlayClassName={styles.popover_icon}
853
916
  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) => {
@@ -1,31 +1,21 @@
1
1
  import cls from 'classnames';
2
2
  import React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
3
3
 
4
- import { AINativeConfigService, useInjectable, useLatest } from '@opensumi/ide-core-browser';
4
+ import { useInjectable, useLatest } from '@opensumi/ide-core-browser';
5
5
  import { Icon, Popover, PopoverPosition, getIcon } from '@opensumi/ide-core-browser/lib/components';
6
6
  import { EnhanceIcon } from '@opensumi/ide-core-browser/lib/components/ai-native';
7
7
  import { InteractiveInput } from '@opensumi/ide-core-browser/lib/components/ai-native/interactive-input/index';
8
- import {
9
- ChatAgentViewServiceToken,
10
- ChatFeatureRegistryToken,
11
- MessageType,
12
- localize,
13
- runWhenIdle,
14
- } from '@opensumi/ide-core-common';
15
- import { CommandService } from '@opensumi/ide-core-common/lib/command';
8
+ import { ChatAgentViewServiceToken, ChatFeatureRegistryToken, localize, runWhenIdle } from '@opensumi/ide-core-common';
16
9
  import { MonacoCommandRegistry } from '@opensumi/ide-editor/lib/browser/monaco-contrib/command/command.service';
17
- import { IDialogService } from '@opensumi/ide-overlay';
18
10
 
19
- import { AT_SIGN_SYMBOL, IChatAgentService, SLASH_SYMBOL, TokenMCPServerProxyService } from '../../common';
11
+ import { AT_SIGN_SYMBOL, IChatAgentService, SLASH_SYMBOL } from '../../common';
20
12
  import { ChatAgentViewService } from '../chat/chat-agent.view.service';
21
13
  import { ChatSlashCommandItemModel } from '../chat/chat-model';
22
14
  import { ChatProxyService } from '../chat/chat-proxy.service';
23
15
  import { ChatFeatureRegistry } from '../chat/chat.feature.registry';
24
- import { OPEN_MCP_CONFIG_COMMAND } from '../mcp/config/mcp-config.commands';
25
- import { MCPServerProxyService } from '../mcp/mcp-server-proxy.service';
26
- import { MCPToolsDialog } from '../mcp/mcp-tools-dialog.view';
27
16
  import { IChatSlashCommandItem } from '../types';
28
17
 
18
+ import { ChatContext } from './ChatContext';
29
19
  import styles from './components.module.less';
30
20
 
31
21
  const INSTRUCTION_BOTTOM = 8;
@@ -205,29 +195,12 @@ export const ChatInput = React.forwardRef((props: IChatInputProps, ref) => {
205
195
  const [isExpand, setIsExpand] = useState(false);
206
196
  const [placeholder, setPlaceHolder] = useState(localize('aiNative.chat.input.placeholder.default'));
207
197
 
208
- const dialogService = useInjectable<IDialogService>(IDialogService);
209
- const aiNativeConfigService = useInjectable<AINativeConfigService>(AINativeConfigService);
210
- const mcpServerProxyService = useInjectable<MCPServerProxyService>(TokenMCPServerProxyService);
211
198
  const monacoCommandRegistry = useInjectable<MonacoCommandRegistry>(MonacoCommandRegistry);
212
199
  const chatAgentService = useInjectable<IChatAgentService>(IChatAgentService);
213
200
  const chatFeatureRegistry = useInjectable<ChatFeatureRegistry>(ChatFeatureRegistryToken);
214
- const commandService = useInjectable<CommandService>(CommandService);
215
201
 
216
202
  const currentAgentIdRef = useLatest(agentId);
217
203
 
218
- const handleShowMCPConfig = React.useCallback(() => {
219
- commandService.executeCommand(OPEN_MCP_CONFIG_COMMAND.id);
220
- }, [commandService]);
221
-
222
- const handleShowMCPTools = React.useCallback(async () => {
223
- const tools = await mcpServerProxyService.getAllMCPTools();
224
- dialogService.open({
225
- message: <MCPToolsDialog tools={tools} />,
226
- type: MessageType.Empty,
227
- buttons: ['关闭'],
228
- });
229
- }, [mcpServerProxyService, dialogService]);
230
-
231
204
  useImperativeHandle(ref, () => ({
232
205
  setInputValue: (v: string) => {
233
206
  setValue(v);
@@ -489,42 +462,6 @@ export const ChatInput = React.forwardRef((props: IChatInputProps, ref) => {
489
462
  height={inputHeight}
490
463
  popoverPosition={PopoverPosition.left}
491
464
  />
492
- <div className={styles.chat_input_footer}>
493
- {aiNativeConfigService.capabilities.supportsMCP && (
494
- <div className={styles.mcp_desc}>
495
- <Popover
496
- overlayClassName={styles.popover_icon}
497
- id={'ai-chat-header-mcp-server'}
498
- position={PopoverPosition.left}
499
- title={'MCP Server'}
500
- >
501
- <EnhanceIcon
502
- wrapperClassName={styles.action_btn}
503
- className={'codicon codicon-server'}
504
- onClick={handleShowMCPConfig}
505
- tabIndex={0}
506
- role='button'
507
- ariaLabel={'MCP Server'}
508
- />
509
- </Popover>
510
- <Popover
511
- overlayClassName={styles.popover_icon}
512
- id={'ai-chat-header-tools'}
513
- position={PopoverPosition.left}
514
- title={localize('aiNative.operate.tools.title')}
515
- >
516
- <EnhanceIcon
517
- wrapperClassName={styles.action_btn}
518
- className={getIcon('menubar-tool')}
519
- onClick={handleShowMCPTools}
520
- tabIndex={0}
521
- role='button'
522
- ariaLabel={localize('aiNative.operate.tools.title')}
523
- />
524
- </Popover>
525
- </div>
526
- )}
527
- </div>
528
465
  </div>
529
466
  );
530
467
  });
@@ -67,12 +67,13 @@ export const ChatToolRender = (props: { value: IChatToolContent['content']; mess
67
67
  <div className={styles['chat-tool-render']}>
68
68
  <div className={styles['tool-header']} onClick={toggleExpand}>
69
69
  <div className={styles['tool-name']}>
70
- <Icon iconClass={`codicon codicon-triangle-${isExpanded ? 'down' : 'right'}`} />
70
+ <span className={cls(styles['expand-icon'], { [styles.expanded]: isExpanded })}>▶</span>
71
71
  {label}
72
72
  </div>
73
73
  {value.state && (
74
74
  <div className={styles['tool-state']}>
75
75
  <span className={styles['state-icon']}>{stateInfo.icon}</span>
76
+ <span className={styles['state-label']}>{stateInfo.label}</span>
76
77
  </div>
77
78
  )}
78
79
  </div>
@@ -3,7 +3,7 @@
3
3
  align-items: center;
4
4
  justify-content: space-between;
5
5
  font-size: 13px;
6
- padding: 0 0 0 12px;
6
+ padding: 0 4px 0 12px;
7
7
  color: var(--editor-foreground);
8
8
  text-overflow: ellipsis;
9
9
  white-space: nowrap;
@@ -96,7 +96,6 @@
96
96
  .chat_input_container {
97
97
  position: relative;
98
98
  border-radius: 9px;
99
- padding: 10px 0px 0px 0px;
100
99
  border: 1px solid var(--kt-input-border);
101
100
  background-color: var(--design-chatInput-background);
102
101
  &.active {
@@ -506,22 +505,3 @@
506
505
  }
507
506
  }
508
507
  }
509
-
510
- .chat_input_footer {
511
- padding: 0px 10px;
512
- display: flex;
513
- align-items: center;
514
- font-size: 12px;
515
-
516
- .model_selector {
517
- display: flex;
518
- font-size: 11px;
519
- align-items: center;
520
- }
521
-
522
- .mcp_desc {
523
- padding: 5px 0px;
524
- display: flex;
525
- align-items: center;
526
- }
527
- }