@opensumi/ide-ai-native 3.8.3-next-1741747748.0 → 3.8.3-next-1741752385.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 (171) hide show
  1. package/lib/browser/chat/chat-agent.service.d.ts.map +1 -1
  2. package/lib/browser/chat/chat-agent.service.js +4 -4
  3. package/lib/browser/chat/chat-agent.service.js.map +1 -1
  4. package/lib/browser/chat/chat-model.d.ts +2 -2
  5. package/lib/browser/chat/chat-model.d.ts.map +1 -1
  6. package/lib/browser/chat/chat-model.js +1 -18
  7. package/lib/browser/chat/chat-model.js.map +1 -1
  8. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  9. package/lib/browser/chat/chat.view.js +16 -46
  10. package/lib/browser/chat/chat.view.js.map +1 -1
  11. package/lib/browser/components/{chat-context/context-selector.d.ts → ChatContext/ContextSelector.d.ts} +1 -1
  12. package/lib/browser/components/ChatContext/ContextSelector.d.ts.map +1 -0
  13. package/lib/browser/components/{chat-context/context-selector.js → ChatContext/ContextSelector.js} +1 -1
  14. package/lib/browser/components/ChatContext/ContextSelector.js.map +1 -0
  15. package/lib/browser/components/ChatContext/index.d.ts.map +1 -0
  16. package/lib/browser/components/{chat-context → ChatContext}/index.js +2 -2
  17. package/lib/browser/components/ChatContext/index.js.map +1 -0
  18. package/lib/browser/components/ChatReply.d.ts.map +1 -1
  19. package/lib/browser/components/ChatReply.js +17 -35
  20. package/lib/browser/components/ChatReply.js.map +1 -1
  21. package/lib/browser/components/ChatThinking.js +1 -1
  22. package/lib/browser/components/ChatThinking.js.map +1 -1
  23. package/lib/browser/components/WelcomeMsg.js +1 -1
  24. package/lib/browser/components/WelcomeMsg.js.map +1 -1
  25. package/lib/browser/components/components.module.less +0 -25
  26. package/lib/browser/context/llm-context.service.d.ts +2 -10
  27. package/lib/browser/context/llm-context.service.d.ts.map +1 -1
  28. package/lib/browser/context/llm-context.service.js +2 -71
  29. package/lib/browser/context/llm-context.service.js.map +1 -1
  30. package/lib/browser/contrib/inline-completions/prompt/matcher.js +2 -2
  31. package/lib/browser/contrib/inline-completions/prompt/similarSnippets.d.ts +1 -1
  32. package/lib/browser/contrib/inline-completions/prompt/similarSnippets.js +2 -2
  33. package/lib/browser/contrib/intelligent-completions/view/default.d.ts.map +1 -1
  34. package/lib/browser/contrib/intelligent-completions/view/default.js.map +1 -1
  35. package/lib/browser/mcp/config/components/mcp-config.view.d.ts.map +1 -1
  36. package/lib/browser/mcp/config/components/mcp-config.view.js +18 -28
  37. package/lib/browser/mcp/config/components/mcp-config.view.js.map +1 -1
  38. package/lib/browser/mcp/config/components/mcp-server-form.d.ts.map +1 -1
  39. package/lib/browser/mcp/config/components/mcp-server-form.js +25 -33
  40. package/lib/browser/mcp/config/components/mcp-server-form.js.map +1 -1
  41. package/lib/browser/mcp/mcp-server.feature.registry.js +1 -1
  42. package/lib/browser/mcp/mcp-server.feature.registry.js.map +1 -1
  43. package/lib/browser/mcp/tools/components/ExpandableFileList.d.ts.map +1 -1
  44. package/lib/browser/mcp/tools/components/ExpandableFileList.js +1 -3
  45. package/lib/browser/mcp/tools/components/ExpandableFileList.js.map +1 -1
  46. package/lib/browser/mcp/tools/components/Terminal.d.ts.map +1 -1
  47. package/lib/browser/mcp/tools/components/Terminal.js +5 -6
  48. package/lib/browser/mcp/tools/components/Terminal.js.map +1 -1
  49. package/lib/browser/mcp/tools/components/index.module.less +5 -8
  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/editFile.d.ts.map +1 -1
  54. package/lib/browser/mcp/tools/editFile.js +0 -1
  55. package/lib/browser/mcp/tools/editFile.js.map +1 -1
  56. package/lib/browser/mcp/tools/fileSearch.d.ts.map +1 -1
  57. package/lib/browser/mcp/tools/fileSearch.js +0 -1
  58. package/lib/browser/mcp/tools/fileSearch.js.map +1 -1
  59. package/lib/browser/mcp/tools/getDiagnosticsByPath.d.ts.map +1 -1
  60. package/lib/browser/mcp/tools/getDiagnosticsByPath.js +1 -2
  61. package/lib/browser/mcp/tools/getDiagnosticsByPath.js.map +1 -1
  62. package/lib/browser/mcp/tools/getOpenEditorFileDiagnostics.d.ts.map +1 -1
  63. package/lib/browser/mcp/tools/getOpenEditorFileDiagnostics.js +0 -2
  64. package/lib/browser/mcp/tools/getOpenEditorFileDiagnostics.js.map +1 -1
  65. package/lib/browser/mcp/tools/grepSearch.d.ts.map +1 -1
  66. package/lib/browser/mcp/tools/grepSearch.js +0 -1
  67. package/lib/browser/mcp/tools/grepSearch.js.map +1 -1
  68. package/lib/browser/mcp/tools/listDir.d.ts.map +1 -1
  69. package/lib/browser/mcp/tools/listDir.js +0 -1
  70. package/lib/browser/mcp/tools/listDir.js.map +1 -1
  71. package/lib/browser/mcp/tools/readFile.d.ts.map +1 -1
  72. package/lib/browser/mcp/tools/readFile.js +0 -1
  73. package/lib/browser/mcp/tools/readFile.js.map +1 -1
  74. package/lib/browser/mcp/tools/runTerminalCmd.d.ts.map +1 -1
  75. package/lib/browser/mcp/tools/runTerminalCmd.js +0 -1
  76. package/lib/browser/mcp/tools/runTerminalCmd.js.map +1 -1
  77. package/lib/browser/types.d.ts +0 -1
  78. package/lib/browser/types.d.ts.map +1 -1
  79. package/lib/browser/widget/inline-diff/inline-diff-manager.d.ts.map +1 -1
  80. package/lib/browser/widget/inline-diff/inline-diff-manager.js.map +1 -1
  81. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts.map +1 -1
  82. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js +5 -10
  83. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js.map +1 -1
  84. package/lib/common/llm-context.d.ts +1 -15
  85. package/lib/common/llm-context.d.ts.map +1 -1
  86. package/lib/common/llm-context.js.map +1 -1
  87. package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
  88. package/lib/common/prompts/context-prompt-provider.js +21 -26
  89. package/lib/common/prompts/context-prompt-provider.js.map +1 -1
  90. package/lib/node/base-language-model.d.ts.map +1 -1
  91. package/lib/node/base-language-model.js +0 -6
  92. package/lib/node/base-language-model.js.map +1 -1
  93. package/package.json +23 -24
  94. package/src/browser/chat/chat-agent.service.ts +4 -4
  95. package/src/browser/chat/chat-model.ts +2 -19
  96. package/src/browser/chat/chat.view.tsx +19 -47
  97. package/src/browser/components/{chat-context → ChatContext}/index.tsx +1 -1
  98. package/src/browser/components/ChatReply.tsx +18 -61
  99. package/src/browser/components/ChatThinking.tsx +1 -1
  100. package/src/browser/components/WelcomeMsg.tsx +1 -1
  101. package/src/browser/components/components.module.less +0 -25
  102. package/src/browser/context/llm-context.service.ts +3 -83
  103. package/src/browser/contrib/inline-completions/prompt/matcher.ts +2 -2
  104. package/src/browser/contrib/inline-completions/prompt/similarSnippets.ts +2 -2
  105. package/src/browser/contrib/intelligent-completions/view/default.ts +1 -0
  106. package/src/browser/mcp/config/components/mcp-config.view.tsx +12 -23
  107. package/src/browser/mcp/config/components/mcp-server-form.tsx +54 -68
  108. package/src/browser/mcp/mcp-server.feature.registry.ts +1 -1
  109. package/src/browser/mcp/tools/components/ExpandableFileList.tsx +1 -4
  110. package/src/browser/mcp/tools/components/Terminal.tsx +6 -4
  111. package/src/browser/mcp/tools/components/index.module.less +5 -8
  112. package/src/browser/mcp/tools/createNewFileWithText.ts +0 -1
  113. package/src/browser/mcp/tools/editFile.ts +0 -1
  114. package/src/browser/mcp/tools/fileSearch.ts +0 -1
  115. package/src/browser/mcp/tools/getDiagnosticsByPath.ts +1 -2
  116. package/src/browser/mcp/tools/getOpenEditorFileDiagnostics.ts +0 -2
  117. package/src/browser/mcp/tools/grepSearch.ts +0 -1
  118. package/src/browser/mcp/tools/listDir.ts +0 -1
  119. package/src/browser/mcp/tools/readFile.ts +0 -1
  120. package/src/browser/mcp/tools/runTerminalCmd.ts +0 -1
  121. package/src/browser/types.ts +0 -1
  122. package/src/browser/widget/inline-diff/inline-diff-manager.tsx +1 -0
  123. package/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +5 -9
  124. package/src/common/llm-context.ts +1 -16
  125. package/src/common/prompts/context-prompt-provider.ts +24 -31
  126. package/src/node/base-language-model.ts +0 -5
  127. package/lib/browser/components/ChatMentionInput.d.ts +0 -25
  128. package/lib/browser/components/ChatMentionInput.d.ts.map +0 -1
  129. package/lib/browser/components/ChatMentionInput.js +0 -221
  130. package/lib/browser/components/ChatMentionInput.js.map +0 -1
  131. package/lib/browser/components/chat-context/context-selector.d.ts.map +0 -1
  132. package/lib/browser/components/chat-context/context-selector.js.map +0 -1
  133. package/lib/browser/components/chat-context/index.d.ts.map +0 -1
  134. package/lib/browser/components/chat-context/index.js.map +0 -1
  135. package/lib/browser/components/mention-input/mention-input.d.ts +0 -5
  136. package/lib/browser/components/mention-input/mention-input.d.ts.map +0 -1
  137. package/lib/browser/components/mention-input/mention-input.js +0 -734
  138. package/lib/browser/components/mention-input/mention-input.js.map +0 -1
  139. package/lib/browser/components/mention-input/mention-input.module.less +0 -309
  140. package/lib/browser/components/mention-input/mention-item.d.ts +0 -10
  141. package/lib/browser/components/mention-input/mention-item.d.ts.map +0 -1
  142. package/lib/browser/components/mention-input/mention-item.js +0 -16
  143. package/lib/browser/components/mention-input/mention-item.js.map +0 -1
  144. package/lib/browser/components/mention-input/mention-panel.d.ts +0 -15
  145. package/lib/browser/components/mention-input/mention-panel.d.ts.map +0 -1
  146. package/lib/browser/components/mention-input/mention-panel.js +0 -49
  147. package/lib/browser/components/mention-input/mention-panel.js.map +0 -1
  148. package/lib/browser/components/mention-input/types.d.ts +0 -74
  149. package/lib/browser/components/mention-input/types.d.ts.map +0 -1
  150. package/lib/browser/components/mention-input/types.js +0 -16
  151. package/lib/browser/components/mention-input/types.js.map +0 -1
  152. package/lib/browser/mcp/tools/components/computeAnsiLogString.d.ts +0 -4
  153. package/lib/browser/mcp/tools/components/computeAnsiLogString.d.ts.map +0 -1
  154. package/lib/browser/mcp/tools/components/computeAnsiLogString.js +0 -22
  155. package/lib/browser/mcp/tools/components/computeAnsiLogString.js.map +0 -1
  156. package/lib/browser/mcp/tools/components/filterEraseMultipleLine.d.ts +0 -18
  157. package/lib/browser/mcp/tools/components/filterEraseMultipleLine.d.ts.map +0 -1
  158. package/lib/browser/mcp/tools/components/filterEraseMultipleLine.js +0 -69
  159. package/lib/browser/mcp/tools/components/filterEraseMultipleLine.js.map +0 -1
  160. package/src/browser/components/ChatMentionInput.tsx +0 -267
  161. package/src/browser/components/mention-input/mention-input.module.less +0 -309
  162. package/src/browser/components/mention-input/mention-input.tsx +0 -913
  163. package/src/browser/components/mention-input/mention-item.tsx +0 -24
  164. package/src/browser/components/mention-input/mention-panel.tsx +0 -89
  165. package/src/browser/components/mention-input/types.ts +0 -79
  166. package/src/browser/mcp/tools/components/computeAnsiLogString.ts +0 -24
  167. package/src/browser/mcp/tools/components/filterEraseMultipleLine.ts +0 -71
  168. /package/lib/browser/components/{chat-context → ChatContext}/index.d.ts +0 -0
  169. /package/lib/browser/components/{chat-context → ChatContext}/style.module.less +0 -0
  170. /package/src/browser/components/{chat-context/context-selector.tsx → ChatContext/ContextSelector.tsx} +0 -0
  171. /package/src/browser/components/{chat-context → ChatContext}/style.module.less +0 -0
@@ -4,8 +4,8 @@ import React, { useCallback } from 'react';
4
4
  import { Badge } from '@opensumi/ide-components';
5
5
  import { AINativeSettingSectionsId, ILogger, useInjectable } from '@opensumi/ide-core-browser';
6
6
  import { PreferenceService } from '@opensumi/ide-core-browser/lib/preferences';
7
- import { PreferenceScope, localize } from '@opensumi/ide-core-common';
8
- import { IMessageService } from '@opensumi/ide-overlay';
7
+ import { localize } from '@opensumi/ide-core-common';
8
+ import { IMessageService } from '@opensumi/ide-overlay/lib/common';
9
9
 
10
10
  import { BUILTIN_MCP_SERVER_NAME, ISumiMCPServerBackend, SumiMCPServerProxyServicePath } from '../../../../common';
11
11
  import { MCPServerDescription } from '../../../../common/mcp-server-manager';
@@ -18,13 +18,13 @@ import { MCPServerForm, MCPServerFormData } from './mcp-server-form';
18
18
  export const MCPConfigView: React.FC = () => {
19
19
  const mcpServerProxyService = useInjectable<MCPServerProxyService>(MCPServerProxyService);
20
20
  const preferenceService = useInjectable<PreferenceService>(PreferenceService);
21
- const messageService = useInjectable<IMessageService>(IMessageService);
22
21
  const sumiMCPServerBackendProxy = useInjectable<ISumiMCPServerBackend>(SumiMCPServerProxyServicePath);
23
22
  const logger = useInjectable<ILogger>(ILogger);
23
+ const messageService = useInjectable<IMessageService>(IMessageService);
24
24
  const [servers, setServers] = React.useState<MCPServer[]>([]);
25
25
  const [formVisible, setFormVisible] = React.useState(false);
26
26
  const [editingServer, setEditingServer] = React.useState<MCPServerFormData | undefined>();
27
- const [loadingServer, setLoadingServer] = React.useState<string | undefined>();
27
+
28
28
  const loadServers = useCallback(async () => {
29
29
  const allServers = await mcpServerProxyService.$getServers();
30
30
  setServers(allServers);
@@ -44,7 +44,6 @@ export const MCPConfigView: React.FC = () => {
44
44
  const handleServerControl = useCallback(
45
45
  async (serverName: string, start: boolean) => {
46
46
  try {
47
- setLoadingServer(serverName);
48
47
  if (start) {
49
48
  await mcpServerProxyService.$startServer(serverName);
50
49
  } else {
@@ -88,14 +87,12 @@ export const MCPConfigView: React.FC = () => {
88
87
  });
89
88
  }
90
89
 
91
- await preferenceService.set(AINativeSettingSectionsId.MCPServers, updatedServers, PreferenceScope.User);
90
+ await preferenceService.set(AINativeSettingSectionsId.MCPServers, updatedServers);
92
91
  await loadServers();
93
- setLoadingServer(undefined);
94
92
  } catch (error) {
95
93
  const msg = error.message || error;
96
94
  logger.error(`Failed to ${start ? 'start' : 'stop'} server ${serverName}:`, error);
97
- messageService.error(error.message);
98
- setLoadingServer(undefined);
95
+ messageService.error(`Failed to ${start ? 'start' : 'stop'} server ${serverName}:` + msg);
99
96
  }
100
97
  },
101
98
  [mcpServerProxyService, preferenceService, sumiMCPServerBackendProxy, loadServers],
@@ -124,7 +121,7 @@ export const MCPConfigView: React.FC = () => {
124
121
  const servers = preferenceService.get<MCPServerFormData[]>(AINativeSettingSectionsId.MCPServers, []);
125
122
  const updatedServers = servers.filter((s) => s.name !== serverName);
126
123
  sumiMCPServerBackendProxy.removeServer(serverName);
127
- await preferenceService.set(AINativeSettingSectionsId.MCPServers, updatedServers, PreferenceScope.User);
124
+ await preferenceService.set(AINativeSettingSectionsId.MCPServers, updatedServers);
128
125
  await loadServers();
129
126
  },
130
127
  [editingServer, formVisible],
@@ -143,7 +140,7 @@ export const MCPConfigView: React.FC = () => {
143
140
  setServers(servers as MCPServer[]);
144
141
  setFormVisible(false);
145
142
  await sumiMCPServerBackendProxy.addOrUpdateServer(data as MCPServerDescription);
146
- await preferenceService.set(AINativeSettingSectionsId.MCPServers, servers, PreferenceScope.User);
143
+ await preferenceService.set(AINativeSettingSectionsId.MCPServers, servers);
147
144
  await loadServers();
148
145
  },
149
146
  [servers, formVisible, loadServers],
@@ -167,10 +164,10 @@ export const MCPConfigView: React.FC = () => {
167
164
  <div className={styles.header}>
168
165
  <div>
169
166
  <h2 className={styles.title}>MCP Servers</h2>
170
- <p className={styles.description}>{localize('ai.native.mcp.manage.connections')}</p>
167
+ <p className={styles.description}>Manage your MCP server connections.</p>
171
168
  </div>
172
169
  <button className={styles.addButton} onClick={handleAddServer}>
173
- + {localize('ai.native.mcp.addMCPServer.title')}
170
+ + Add new MCP server
174
171
  </button>
175
172
  </div>
176
173
  <div className={styles.serversList}>
@@ -191,15 +188,7 @@ export const MCPConfigView: React.FC = () => {
191
188
  title={server.isStarted ? 'Stop' : 'Start'}
192
189
  onClick={() => handleServerControl(server.name, !server.isStarted)}
193
190
  >
194
- <i
195
- className={`codicon ${
196
- loadingServer === server.name
197
- ? 'codicon-loading kt-icon-loading'
198
- : server.isStarted
199
- ? 'codicon-debug-stop'
200
- : 'codicon-debug-start'
201
- }`}
202
- />
191
+ <i className={`codicon ${server.isStarted ? 'codicon-debug-stop' : 'codicon-debug-start'}`} />
203
192
  </button>
204
193
  {server.name !== BUILTIN_MCP_SERVER_NAME && (
205
194
  <button className={styles.iconButton} title='Delete' onClick={() => handleDeleteServer(server.name)}>
@@ -212,7 +201,7 @@ export const MCPConfigView: React.FC = () => {
212
201
  <div className={styles.detailRow}>
213
202
  <span className={styles.detailLabel}>Status:</span>
214
203
  <span className={`${styles.serverStatus} ${server.isStarted ? styles.running : styles.stopped}`}>
215
- {server.isStarted ? localize('ai.native.mcp.running') : localize('ai.native.mcp.stopped')}
204
+ {server.isStarted ? 'Running' : 'Stopped'}
216
205
  </span>
217
206
  </div>
218
207
  {server.type && (
@@ -67,75 +67,35 @@ export const MCPServerForm: FC<Props> = ({ visible, initialData, onSave, onCance
67
67
  );
68
68
  }, [initialData]);
69
69
 
70
- const validateForm = useCallback(
71
- (formData: MCPServerFormData) => {
72
- if (formData.name.trim() === '') {
73
- messageService.error(localize('ai.native.mcp.name.isRequired'));
74
- return false;
75
- }
76
- if (
77
- !initialData &&
78
- existingServers.some((server) => server.name.toLocaleLowerCase() === formData.name.toLocaleLowerCase())
79
- ) {
80
- messageService.error(formatLocalize('ai.native.mcp.serverNameExists', formData.name));
81
- return false;
82
- }
83
- if (formData.type === MCP_SERVER_TYPE.SSE) {
84
- const isServerHostValid = formData.serverHost?.trim() !== '';
85
- if (!isServerHostValid) {
86
- messageService.error(localize('ai.native.mcp.serverHost.isRequired'));
87
- }
88
- return isServerHostValid;
89
- }
90
- const isCommandValid = formData.command?.trim() !== '';
91
- if (!isCommandValid) {
92
- messageService.error(localize('ai.native.mcp.command.isRequired'));
93
- }
94
- return isCommandValid;
95
- },
96
- [existingServers, initialData],
97
- );
98
-
99
- const handleSubmit = useCallback(
100
- (e: FormEvent) => {
101
- e.preventDefault();
102
- const isValid = validateForm(formData);
103
- if (!isValid) {
104
- return;
105
- }
106
- const form = {
107
- ...formData,
108
- };
109
- if (formData.type === MCP_SERVER_TYPE.SSE) {
110
- form.serverHost = form.serverHost?.trim();
111
- } else {
112
- const args = argsText.split(' ').filter(Boolean);
113
- const env = envText
114
- .split('\n')
115
- .filter(Boolean)
116
- .reduce((acc, line) => {
117
- const [key, value] = line.split('=');
118
- if (key && value) {
119
- acc[key.trim()] = value.trim();
120
- }
121
- return acc;
122
- }, {} as Record<string, string>);
123
- form.args = args;
124
- form.env = env;
125
- }
126
-
127
- setFormData({
128
- ...formData,
129
- command: '',
130
- serverHost: '',
131
- args: [],
132
- env: {},
133
- });
70
+ const handleSubmit = (e: FormEvent) => {
71
+ e.preventDefault();
72
+ const isValid = validateForm(formData);
73
+ if (!isValid) {
74
+ return;
75
+ }
76
+ const form = {
77
+ ...formData,
78
+ };
79
+ if (formData.type === MCP_SERVER_TYPE.SSE) {
80
+ form.serverHost = form.serverHost?.trim();
81
+ } else {
82
+ const args = argsText.split(' ').filter(Boolean);
83
+ const env = envText
84
+ .split('\n')
85
+ .filter(Boolean)
86
+ .reduce((acc, line) => {
87
+ const [key, value] = line.split('=');
88
+ if (key && value) {
89
+ acc[key.trim()] = value.trim();
90
+ }
91
+ return acc;
92
+ }, {} as Record<string, string>);
93
+ form.args = args;
94
+ form.env = env;
95
+ }
134
96
 
135
- onSave(form);
136
- },
137
- [formData, argsText, envText, onSave, validateForm],
138
- );
97
+ onSave(form);
98
+ };
139
99
 
140
100
  const handleCommandChange = useCallback(
141
101
  (e: ChangeEvent<HTMLInputElement>) => {
@@ -223,6 +183,32 @@ export const MCPServerForm: FC<Props> = ({ visible, initialData, onSave, onCance
223
183
  }
224
184
  }, [formData, argsText, envText]);
225
185
 
186
+ const validateForm = useCallback(
187
+ (formData: MCPServerFormData) => {
188
+ if (formData.name.trim() === '') {
189
+ messageService.error(localize('ai.native.mcp.name.isRequired'));
190
+ return false;
191
+ }
192
+ if (existingServers.some((server) => server.name.toLocaleLowerCase() === formData.name.toLocaleLowerCase())) {
193
+ messageService.error(formatLocalize('ai.native.mcp.serverNameExists', formData.name));
194
+ return false;
195
+ }
196
+ if (formData.type === MCP_SERVER_TYPE.SSE) {
197
+ const isServerHostValid = formData.serverHost?.trim() !== '';
198
+ if (!isServerHostValid) {
199
+ messageService.error(localize('ai.native.mcp.serverHost.isRequired'));
200
+ }
201
+ return isServerHostValid;
202
+ }
203
+ const isCommandValid = formData.command?.trim() !== '';
204
+ if (!isCommandValid) {
205
+ messageService.error(localize('ai.native.mcp.command.isRequired'));
206
+ }
207
+ return isCommandValid;
208
+ },
209
+ [existingServers],
210
+ );
211
+
226
212
  return (
227
213
  <Modal
228
214
  title={initialData ? localize('ai.native.mcp.editMCPServer.title') : localize('ai.native.mcp.addMCPServer.title')}
@@ -60,7 +60,7 @@ export class MCPServerRegistry implements IMCPServerRegistry {
60
60
  }
61
61
 
62
62
  getMCPTools(): MCPToolDefinition[] {
63
- return this.tools.sort((a, b) => (a.order ?? Infinity) - (b.order ?? Infinity));
63
+ return this.tools;
64
64
  }
65
65
 
66
66
  async callMCPTool(
@@ -1,6 +1,5 @@
1
1
  import React, { useEffect, useMemo, useState } from 'react';
2
2
 
3
- import { Icon } from '@opensumi/ide-components/lib/icon/icon';
4
3
  import { CommandService, LabelService, URI, path, useInjectable } from '@opensumi/ide-core-browser';
5
4
  import { WorkbenchEditorService } from '@opensumi/ide-editor';
6
5
  import { IWorkspaceService } from '@opensumi/ide-workspace';
@@ -111,9 +110,7 @@ const ExpandableFileList: React.FC<ExpandableFileListProps> = ({
111
110
  return (
112
111
  <div className={styles.container}>
113
112
  <div className={styles.header} onClick={() => setIsExpanded(!isExpanded)}>
114
- <span style={{ transform: `rotate(${isExpanded ? '90deg' : '0deg'})`, display: 'flex' }}>
115
- <Icon iconClass={'codicon codicon-chevron-right'} />
116
- </span>
113
+ <span style={{ transform: `rotate(${isExpanded ? '90deg' : '0deg'})` }}>▶</span>
117
114
  <span>
118
115
  {headerText} · {fileList.length} files
119
116
  </span>
@@ -3,11 +3,11 @@ import React, { memo, useCallback, useMemo, useState } from 'react';
3
3
  import { useInjectable } from '@opensumi/ide-core-browser';
4
4
  import { Button, Icon } from '@opensumi/ide-core-browser/lib/components';
5
5
  import { localize } from '@opensumi/ide-core-common';
6
+ import { stripAnsi } from '@opensumi/ide-utils/lib/ansi';
6
7
 
7
8
  import { IMCPServerToolComponentProps } from '../../../types';
8
9
  import { RunCommandHandler } from '../handlers/RunCommand';
9
10
 
10
- import { computeAnsiLogString } from './computeAnsiLogString';
11
11
  import styles from './index.module.less';
12
12
 
13
13
  function getResult(raw: string) {
@@ -63,17 +63,19 @@ export const TerminalToolComponent = memo((props: IMCPServerToolComponentProps)
63
63
  <>
64
64
  <div className={styles.command_title}>
65
65
  <Icon icon='terminal' />
66
- <span>{localize('ai.native.mcp.terminal.command')}:</span>
66
+ <span>{localize('ai.native.mcp.terminal.command')}</span>
67
67
  </div>
68
68
  <p className={styles.command_content}>
69
69
  <code>$ {args.command}</code>
70
70
  </p>
71
71
  </>
72
72
  )}
73
+ <div className={styles.command_title}>
74
+ <span>{localize('ai.native.mcp.terminal.output')}</span>
75
+ </div>
73
76
  {output ? (
74
77
  <div className={styles.command_content}>
75
- <Icon icon='output' />
76
- <code dangerouslySetInnerHTML={{ __html: computeAnsiLogString(output.text || '') }} />
78
+ <code>{stripAnsi(output.text)}</code>
77
79
  </div>
78
80
  ) : (
79
81
  ''
@@ -96,7 +96,7 @@
96
96
  }
97
97
 
98
98
  .header {
99
- padding: 4px;
99
+ padding: 8px 12px;
100
100
  background-color: var(--design-block-background);
101
101
  border-bottom: 1px solid var(--vscode-commandCenter-inactiveBorder);
102
102
  cursor: pointer;
@@ -104,7 +104,7 @@
104
104
  align-items: center;
105
105
  gap: 4px;
106
106
  color: var(--design-text-foreground);
107
- font-size: 11px;
107
+ font-size: 12px;
108
108
  }
109
109
 
110
110
  .fileList {
@@ -162,17 +162,14 @@
162
162
  .command_title {
163
163
  display: flex;
164
164
  align-items: center;
165
- font-size: 11px;
166
165
  span {
167
166
  margin-left: 5px;
168
167
  }
169
168
  }
170
169
 
171
170
  .command_content {
172
- max-height: 200px;
173
- overflow-y: auto;
174
- padding: 2px 4px;
175
- font-size: 11px;
171
+ padding: 4px;
172
+ font-size: 12px;
176
173
  color: var(--design-text-foreground);
177
174
  margin: 0px;
178
175
  background-color: var(--terminal-background);
@@ -181,7 +178,7 @@
181
178
  overflow: auto;
182
179
 
183
180
  code {
184
- font-size: 11px;
181
+ font-size: 12px;
185
182
  white-space: pre;
186
183
  }
187
184
  }
@@ -35,7 +35,6 @@ export class CreateNewFileWithTextTool implements MCPServerContribution {
35
35
  return {
36
36
  name: 'create_new_file_with_text',
37
37
  label: 'Create File',
38
- order: 7,
39
38
  description:
40
39
  'Creates a new file at the specified path within the project directory and populates it with the provided text. ' +
41
40
  'Use this tool to generate new files in your project structure. ' +
@@ -46,7 +46,6 @@ export class EditFileTool implements MCPServerContribution {
46
46
  return {
47
47
  name: 'edit_file',
48
48
  label: 'Edit File',
49
- order: 5,
50
49
  description: `Use this tool to propose an edit to an existing file.
51
50
  This will be read by a less intelligent model, which will quickly apply the edit. You should make it clear what the edit is, while also minimizing the unchanged code you write.
52
51
  When writing the edit, you should specify each edit in sequence, with the special comment \`// ... existing code ...\` to represent unchanged code in between edited lines.
@@ -41,7 +41,6 @@ export class FileSearchTool implements MCPServerContribution {
41
41
  return {
42
42
  name: 'file_search',
43
43
  label: 'Search Files',
44
- order: 6,
45
44
  description:
46
45
  "Fast file search based on fuzzy matching against file path. Use if you know part of the file path but don't know where it's located exactly. Response will be capped to 10 results. Make your query more specific if need to filter results further.",
47
46
  inputSchema,
@@ -29,8 +29,7 @@ export class GetDiagnosticsByPathTool implements MCPServerContribution {
29
29
  getToolDefinition(): MCPToolDefinition {
30
30
  return {
31
31
  name: 'get_diagnostics_by_path',
32
- label: 'Get Diagnostics By Path',
33
- order: 9,
32
+ label: 'Get Diagnostics',
34
33
  description:
35
34
  'Retrieves diagnostic information (errors, warnings, etc.) from a specific file in the project. ' +
36
35
  'Use this tool to get information about problems in any project file. ' +
@@ -31,8 +31,6 @@ export class GetOpenEditorFileDiagnosticsTool implements MCPServerContribution {
31
31
  getToolDefinition(): MCPToolDefinition {
32
32
  return {
33
33
  name: 'get_open_in_editor_file_diagnostics',
34
- label: 'Get Current Editor Diagnostics',
35
- order: 8,
36
34
  description:
37
35
  'Retrieves diagnostic information (errors, warnings, etc.) from the currently active file in VS Code editor. ' +
38
36
  'Use this tool to get information about problems in your current file. ' +
@@ -48,7 +48,6 @@ export class GrepSearchTool implements MCPServerContribution {
48
48
  return {
49
49
  name: 'grep_search',
50
50
  label: 'Search Contents',
51
- order: 4,
52
51
  description:
53
52
  // TODO: 支持语义化搜索后需要描述清楚优劣势
54
53
  'Fast text-based regex search that finds exact pattern matches within files or directories, utilizing the ripgrep command for efficient searching.\nResults will be formatted in the style of ripgrep and can be configured to include line numbers and content.\nTo avoid overwhelming output, the results are capped at 50 matches.\nUse the include or exclude patterns to filter the search scope by file type or specific paths.\n\nThis is best for finding exact text matches or regex patterns.',
@@ -41,7 +41,6 @@ export class ListDirTool implements MCPServerContribution {
41
41
  return {
42
42
  name: 'list_dir',
43
43
  label: 'List Directory',
44
- order: 3,
45
44
  description:
46
45
  'List the contents of a directory. The quick tool to use for discovery, before using more targeted tools like semantic search or file reading. Useful to try to understand the file structure before diving deeper into specific files. Can be used to explore the codebase.',
47
46
  inputSchema,
@@ -38,7 +38,6 @@ export class ReadFileTool implements MCPServerContribution {
38
38
  return {
39
39
  name: 'read_file',
40
40
  label: 'Read File',
41
- order: 1,
42
41
  description: `Read the contents of a file (and the outline).
43
42
 
44
43
  When using this tool to gather information, it's your responsibility to ensure you have the COMPLETE context. Each time you call this command you should:
@@ -33,7 +33,6 @@ export class RunTerminalCommandTool implements MCPServerContribution {
33
33
  return {
34
34
  name: 'run_terminal_cmd',
35
35
  label: 'Run Command',
36
- order: 2,
37
36
  description:
38
37
  "PROPOSE a command to run on behalf of the user.\nIf you have this tool, note that you DO have the ability to run commands directly on the USER's system.\n\nAdhere to these rules:\n1. Based on the contents of the conversation, you will be told if you are in the same shell as a previous step or a new shell.\n2. If in a new shell, you should `cd` to the right directory and do necessary setup in addition to running the command.\n3. If in the same shell, the state will persist, no need to do things like `cd` to the same directory.\n4. For ANY commands that would use a pager, you should append ` | cat` to the command (or whatever is appropriate). You MUST do this for: git, less, head, tail, more, etc.\n5. For commands that are long running/expected to run indefinitely until interruption, please run them in the background. To run jobs in the background, set `is_background` to true rather than changing the details of the command.\n6. Dont include any newlines in the command.",
39
38
  inputSchema,
@@ -350,7 +350,6 @@ export interface MCPLogger {
350
350
  export interface MCPToolDefinition {
351
351
  name: string;
352
352
  label?: string;
353
- order?: number;
354
353
  description: string;
355
354
  inputSchema: ZodSchema<any>; // JSON Schema
356
355
  handler: (
@@ -3,6 +3,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
3
3
  import { Icon, Popover } from '@opensumi/ide-components';
4
4
  import { AppConfig, IDisposable, URI, localize, path, useInjectable } from '@opensumi/ide-core-browser';
5
5
  import { IResource, WorkbenchEditorService } from '@opensumi/ide-editor';
6
+ import { Path } from '@opensumi/ide-utils/lib/path';
6
7
 
7
8
  import { BaseApplyService } from '../../mcp/base-apply.service';
8
9
 
@@ -326,15 +326,11 @@ export class LivePreviewDiffDecorationModel extends Disposable {
326
326
  let modifyContent: string;
327
327
  const removeContent = removedWidget?.getRemovedTextLines().join('\n') || '';
328
328
  const range = addedDec?.getRange();
329
- try {
330
- if (range) {
331
- modifyContent = model.getValueInRange({
332
- ...range,
333
- endColumn: model.getLineMaxColumn(range.endLineNumber),
334
- });
335
- }
336
- } catch (error) {
337
- modifyContent = '';
329
+ if (range) {
330
+ modifyContent = model.getValueInRange({
331
+ ...range,
332
+ endColumn: model.getLineMaxColumn(range.endLineNumber),
333
+ });
338
334
  }
339
335
  const discard = (decorationModel: LivePreviewDiffDecorationModel) => {
340
336
  // 只有点击行丢弃时才会上报
@@ -1,14 +1,8 @@
1
1
  import { Event, URI } from '@opensumi/ide-core-common/lib/utils';
2
2
 
3
3
  export interface LLMContextService {
4
- /**
5
- * 开始自动收集
6
- */
7
4
  startAutoCollection(): void;
8
5
 
9
- /**
10
- * 停止自动收集
11
- */
12
6
  stopAutoCollection(): void;
13
7
 
14
8
  /**
@@ -16,19 +10,11 @@ export interface LLMContextService {
16
10
  */
17
11
  addFileToContext(uri: URI, selection?: [number, number], isManual?: boolean): void;
18
12
 
19
- /**
20
- * 添加文件夹到 context 中
21
- */
22
- addFolderToContext(uri: URI, isManual?: boolean): void;
23
-
24
13
  /**
25
14
  * 清除上下文
26
15
  */
27
16
  cleanFileContext(): void;
28
17
 
29
- /**
30
- * 上下文文件变化事件
31
- */
32
18
  onDidContextFilesChangeEvent: Event<{ viewed: FileContext[]; attached: FileContext[]; version: number }>;
33
19
 
34
20
  /**
@@ -38,7 +24,7 @@ export interface LLMContextService {
38
24
  removeFileFromContext(uri: URI, isManual?: boolean): void;
39
25
 
40
26
  /** 导出为可序列化格式 */
41
- serialize(): Promise<SerializedContext>;
27
+ serialize(): SerializedContext;
42
28
  }
43
29
 
44
30
  export interface FileContext {
@@ -58,5 +44,4 @@ export interface AttachFileContext {
58
44
  export interface SerializedContext {
59
45
  recentlyViewFiles: string[];
60
46
  attachedFiles: Array<AttachFileContext>;
61
- attachedFolders: string[];
62
47
  }
@@ -21,39 +21,32 @@ export class DefaultChatAgentPromptProvider implements ChatAgentPromptProvider {
21
21
  provideContextPrompt(context: SerializedContext, userMessage: string): string {
22
22
  const editor = this.workbenchEditorService.currentEditor;
23
23
  const currentModel = editor?.currentDocumentModel;
24
- return `<additional_data>
25
- Below are some potentially helpful/relevant pieces of information for figuring out to respond
26
- <recently_viewed_files>
24
+ return `
25
+ <additional_data>
26
+ Below are some potentially helpful/relevant pieces of information for figuring out to respond
27
+ <recently_viewed_files>
27
28
  ${context.recentlyViewFiles.map((file, idx) => ` ${idx + 1}: ${file}`).join('\n')}
28
- </recently_viewed_files>
29
- <attached_files>
30
- ${context.attachedFiles.map(
31
- (file) =>
32
- `
33
- <file_contents>
34
- \`\`\`${file.path}
35
- ${file.content}
36
- \`\`\`
37
- </file_contents>
38
- <linter_errors>
39
- ${file.lineErrors.join('\n')}
40
- </linter_errors>
41
- `,
42
- )}
43
- </attached_files>
44
- <attached_folders>
45
-
46
- ${context.attachedFolders.join('\n')}
47
- </attached_folders>
48
- ${
49
- currentModel
50
- ? `<current_opened_file>
51
- \`\`\`${currentModel.languageId} ${currentModel.uri.toString()}
29
+ </recently_viewed_files>
30
+ <attached_files>
31
+ ${context.attachedFiles.map(
32
+ (file) =>
33
+ `
34
+ <file_contents>
35
+ \`\`\`${file.path}
36
+ ${file.content}
37
+ \`\`\`
38
+ </file_contents>
39
+ <linter_errors>
40
+ ${file.lineErrors.join('\n')}
41
+ </linter_errors>
42
+ `,
43
+ )}
44
+ </attached_files>
45
+ ${currentModel ? `<current_opened_file>
46
+ \`\`\`${currentModel.languageId} ${currentModel.uri.toString()}
52
47
  ${currentModel.getText()}
53
- \`\`\`
54
- </current_opened_file>`
55
- : ''
56
- }
48
+ \`\`\`
49
+ </current_opened_file>` : ''}
57
50
  </additional_data>
58
51
  <user_query>
59
52
  ${userMessage}
@@ -185,11 +185,6 @@ export abstract class BaseLanguageModel {
185
185
  });
186
186
  } else if (chunk.type === 'error') {
187
187
  chatReadableStream.emitError(new Error(chunk.error as string));
188
- } else if (chunk.type === 'reasoning') {
189
- chatReadableStream.emitData({
190
- kind: 'reasoning',
191
- content: chunk.textDelta,
192
- });
193
188
  }
194
189
  }
195
190
 
@@ -1,25 +0,0 @@
1
- import React from 'react';
2
- export interface IChatMentionInputProps {
3
- onSend: (value: string, agentId?: string, command?: string, option?: {
4
- model: string;
5
- [key: string]: any;
6
- }) => void;
7
- onValueChange?: (value: string) => void;
8
- onExpand?: (value: boolean) => void;
9
- placeholder?: string;
10
- enableOptions?: boolean;
11
- disabled?: boolean;
12
- sendBtnClassName?: string;
13
- defaultHeight?: number;
14
- value?: string;
15
- autoFocus?: boolean;
16
- theme?: string | null;
17
- setTheme: (theme: string | null) => void;
18
- agentId: string;
19
- setAgentId: (id: string) => void;
20
- defaultAgentId?: string;
21
- command: string;
22
- setCommand: (command: string) => void;
23
- }
24
- export declare const ChatMentionInput: React.ForwardRefExoticComponent<IChatMentionInputProps & React.RefAttributes<unknown>>;
25
- //# sourceMappingURL=ChatMentionInput.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChatMentionInput.d.ts","sourceRoot":"","sources":["../../../src/browser/components/ChatMentionInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAkBzE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,KAAK,IAAI,CAAC;IACpH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAGD,eAAO,MAAM,gBAAgB,wFAmO3B,CAAC"}