@opensumi/ide-ai-native 3.8.1-next-1741253659.0 → 3.8.1-next-1741255538.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 (62) hide show
  1. package/lib/browser/chat/chat-proxy.service.d.ts +0 -8
  2. package/lib/browser/chat/chat-proxy.service.d.ts.map +1 -1
  3. package/lib/browser/chat/chat-proxy.service.js +25 -30
  4. package/lib/browser/chat/chat-proxy.service.js.map +1 -1
  5. package/lib/browser/components/ChatInput.js +1 -1
  6. package/lib/browser/components/ChatInput.js.map +1 -1
  7. package/lib/browser/index.d.ts.map +1 -1
  8. package/lib/browser/index.js +0 -6
  9. package/lib/browser/index.js.map +1 -1
  10. package/lib/browser/mcp/config/components/mcp-config.view.d.ts.map +1 -1
  11. package/lib/browser/mcp/config/components/mcp-config.view.js +2 -0
  12. package/lib/browser/mcp/config/components/mcp-config.view.js.map +1 -1
  13. package/lib/browser/mcp/config/components/mcp-server-form.d.ts +5 -2
  14. package/lib/browser/mcp/config/components/mcp-server-form.d.ts.map +1 -1
  15. package/lib/browser/mcp/config/components/mcp-server-form.js +79 -33
  16. package/lib/browser/mcp/config/components/mcp-server-form.js.map +1 -1
  17. package/lib/browser/mcp/config/components/mcp-server-form.module.less +24 -1
  18. package/lib/common/mcp-server-manager.d.ts +21 -3
  19. package/lib/common/mcp-server-manager.d.ts.map +1 -1
  20. package/lib/common/mcp-server-manager.js.map +1 -1
  21. package/lib/common/types.d.ts +4 -0
  22. package/lib/common/types.d.ts.map +1 -1
  23. package/lib/common/types.js +6 -1
  24. package/lib/common/types.js.map +1 -1
  25. package/lib/node/base-language-model.js +1 -1
  26. package/lib/node/base-language-model.js.map +1 -1
  27. package/lib/node/mcp/sumi-mcp-server.d.ts +10 -1
  28. package/lib/node/mcp/sumi-mcp-server.d.ts.map +1 -1
  29. package/lib/node/mcp/sumi-mcp-server.js +13 -4
  30. package/lib/node/mcp/sumi-mcp-server.js.map +1 -1
  31. package/lib/node/mcp-server-manager-impl.d.ts.map +1 -1
  32. package/lib/node/mcp-server-manager-impl.js +22 -8
  33. package/lib/node/mcp-server-manager-impl.js.map +1 -1
  34. package/lib/node/mcp-server.sse.d.ts +192 -0
  35. package/lib/node/mcp-server.sse.d.ts.map +1 -0
  36. package/lib/node/mcp-server.sse.js +86 -0
  37. package/lib/node/mcp-server.sse.js.map +1 -0
  38. package/lib/node/{mcp-server.d.ts → mcp-server.stdio.d.ts} +2 -2
  39. package/lib/node/mcp-server.stdio.d.ts.map +1 -0
  40. package/lib/node/{mcp-server.js → mcp-server.stdio.js} +8 -6
  41. package/lib/node/mcp-server.stdio.js.map +1 -0
  42. package/package.json +23 -23
  43. package/src/browser/chat/chat-proxy.service.ts +22 -28
  44. package/src/browser/components/ChatInput.tsx +1 -1
  45. package/src/browser/index.ts +0 -6
  46. package/src/browser/mcp/config/components/mcp-config.view.tsx +2 -0
  47. package/src/browser/mcp/config/components/mcp-server-form.module.less +24 -1
  48. package/src/browser/mcp/config/components/mcp-server-form.tsx +149 -63
  49. package/src/common/mcp-server-manager.ts +22 -3
  50. package/src/common/types.ts +5 -0
  51. package/src/node/base-language-model.ts +1 -1
  52. package/src/node/mcp/sumi-mcp-server.ts +12 -7
  53. package/src/node/mcp-server-manager-impl.ts +20 -9
  54. package/src/node/mcp-server.sse.ts +97 -0
  55. package/src/node/{mcp-server.ts → mcp-server.stdio.ts} +4 -3
  56. package/lib/browser/chat/apply.service.d.ts +0 -16
  57. package/lib/browser/chat/apply.service.d.ts.map +0 -1
  58. package/lib/browser/chat/apply.service.js +0 -52
  59. package/lib/browser/chat/apply.service.js.map +0 -1
  60. package/lib/node/mcp-server.d.ts.map +0 -1
  61. package/lib/node/mcp-server.js.map +0 -1
  62. package/src/browser/chat/apply.service.ts +0 -55
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SSEMCPServer = void 0;
4
+ const tslib_1 = require("tslib");
5
+ // have to import with extension since the exports map is ./* -> ./dist/cjs/*
6
+ const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
7
+ const sse_js_1 = require("@modelcontextprotocol/sdk/client/sse.js");
8
+ const package_json_1 = tslib_1.__importDefault(require("../../package.json"));
9
+ class SSEMCPServer {
10
+ constructor(name, serverHost, logger) {
11
+ this.logger = logger;
12
+ this.started = false;
13
+ this.name = name;
14
+ this.serverHost = serverHost;
15
+ }
16
+ isStarted() {
17
+ return this.started;
18
+ }
19
+ getServerName() {
20
+ return this.name;
21
+ }
22
+ async start() {
23
+ var _a;
24
+ if (this.started) {
25
+ return;
26
+ }
27
+ (_a = this.logger) === null || _a === void 0 ? void 0 : _a.log(`Starting server "${this.name}" with serverHost: ${this.serverHost}`);
28
+ const transport = new sse_js_1.SSEClientTransport(new URL(this.serverHost));
29
+ transport.onerror = (error) => {
30
+ var _a;
31
+ (_a = this.logger) === null || _a === void 0 ? void 0 : _a.error('Transport Error:', error);
32
+ };
33
+ this.client = new index_js_1.Client({
34
+ name: 'sumi-ide-sse-mcp-client',
35
+ version: package_json_1.default.version,
36
+ }, {
37
+ capabilities: {},
38
+ });
39
+ this.client.onerror = (error) => {
40
+ var _a;
41
+ (_a = this.logger) === null || _a === void 0 ? void 0 : _a.error('Error in MCP client:', error);
42
+ };
43
+ await this.client.connect(transport);
44
+ this.started = true;
45
+ }
46
+ async callTool(toolName, toolCallId, arg_string) {
47
+ var _a;
48
+ let args;
49
+ try {
50
+ args = JSON.parse(arg_string);
51
+ }
52
+ catch (error) {
53
+ (_a = this.logger) === null || _a === void 0 ? void 0 : _a.error(`Failed to parse arguments for calling tool "${toolName}" in MCP server "${this.name}" with serverHost "${this.serverHost}".
54
+ Invalid JSON: ${arg_string}`, error);
55
+ }
56
+ const params = {
57
+ name: toolName,
58
+ arguments: args,
59
+ toolCallId,
60
+ };
61
+ return this.client.callTool(params);
62
+ }
63
+ async getTools() {
64
+ return await this.client.listTools();
65
+ }
66
+ update(serverHost) {
67
+ this.serverHost = serverHost;
68
+ }
69
+ async stop() {
70
+ var _a, _b, _c;
71
+ if (!this.started || !this.client) {
72
+ return;
73
+ }
74
+ (_a = this.logger) === null || _a === void 0 ? void 0 : _a.log(`Stopping MCP server "${this.name}"`);
75
+ try {
76
+ await this.client.close();
77
+ }
78
+ catch (error) {
79
+ (_b = this.logger) === null || _b === void 0 ? void 0 : _b.error(`Failed to stop MCP server "${this.name}":`, error);
80
+ }
81
+ (_c = this.logger) === null || _c === void 0 ? void 0 : _c.log(`MCP server "${this.name}" stopped`);
82
+ this.started = false;
83
+ }
84
+ }
85
+ exports.SSEMCPServer = SSEMCPServer;
86
+ //# sourceMappingURL=mcp-server.sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.sse.js","sourceRoot":"","sources":["../../src/node/mcp-server.sse.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { ILogger } from '@opensumi/ide-core-common';
2
2
  import { IMCPServer } from '../common/mcp-server-manager';
3
- export declare class StdioMCPServerImpl implements IMCPServer {
3
+ export declare class StdioMCPServer implements IMCPServer {
4
4
  private readonly logger?;
5
5
  private name;
6
6
  command: string;
@@ -193,4 +193,4 @@ export declare class StdioMCPServerImpl implements IMCPServer {
193
193
  }): void;
194
194
  stop(): Promise<void>;
195
195
  }
196
- //# sourceMappingURL=mcp-server.d.ts.map
196
+ //# sourceMappingURL=mcp-server.stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.stdio.d.ts","sourceRoot":"","sources":["../../src/node/mcp-server.stdio.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StdioMCPServerImpl = void 0;
3
+ exports.StdioMCPServer = void 0;
4
+ const tslib_1 = require("tslib");
4
5
  // have to import with extension since the exports map is ./* -> ./dist/cjs/*
5
6
  const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
6
7
  const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
7
- class StdioMCPServerImpl {
8
+ const package_json_1 = tslib_1.__importDefault(require("../../package.json"));
9
+ class StdioMCPServer {
8
10
  constructor(name, command, args, env, logger) {
9
11
  this.logger = logger;
10
12
  this.started = false;
@@ -41,8 +43,8 @@ class StdioMCPServerImpl {
41
43
  (_a = this.logger) === null || _a === void 0 ? void 0 : _a.error('Transport Error:', error);
42
44
  };
43
45
  this.client = new index_js_1.Client({
44
- name: 'opensumi-mcp-client',
45
- version: '1.0.0',
46
+ name: 'sumi-ide-stdio-mcp-client',
47
+ version: package_json_1.default.version,
46
48
  }, {
47
49
  capabilities: {},
48
50
  });
@@ -94,5 +96,5 @@ class StdioMCPServerImpl {
94
96
  this.started = false;
95
97
  }
96
98
  }
97
- exports.StdioMCPServerImpl = StdioMCPServerImpl;
98
- //# sourceMappingURL=mcp-server.js.map
99
+ exports.StdioMCPServer = StdioMCPServer;
100
+ //# sourceMappingURL=mcp-server.stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.stdio.js","sourceRoot":"","sources":["../../src/node/mcp-server.stdio.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensumi/ide-ai-native",
3
- "version": "3.8.1-next-1741253659.0",
3
+ "version": "3.8.1-next-1741255538.0",
4
4
  "files": [
5
5
  "lib",
6
6
  "src"
@@ -24,26 +24,26 @@
24
24
  "@ai-sdk/openai": "^1.1.9",
25
25
  "@ai-sdk/openai-compatible": "^0.1.11",
26
26
  "@modelcontextprotocol/sdk": "^1.3.1",
27
- "@opensumi/ide-addons": "3.8.1-next-1741253659.0",
28
- "@opensumi/ide-components": "3.8.1-next-1741253659.0",
29
- "@opensumi/ide-connection": "3.8.1-next-1741253659.0",
30
- "@opensumi/ide-core-common": "3.8.1-next-1741253659.0",
31
- "@opensumi/ide-core-node": "3.8.1-next-1741253659.0",
32
- "@opensumi/ide-debug": "3.8.1-next-1741253659.0",
33
- "@opensumi/ide-design": "3.8.1-next-1741253659.0",
34
- "@opensumi/ide-editor": "3.8.1-next-1741253659.0",
35
- "@opensumi/ide-file-search": "3.8.1-next-1741253659.0",
36
- "@opensumi/ide-file-service": "3.8.1-next-1741253659.0",
37
- "@opensumi/ide-main-layout": "3.8.1-next-1741253659.0",
38
- "@opensumi/ide-markers": "3.8.1-next-1741253659.0",
39
- "@opensumi/ide-monaco": "3.8.1-next-1741253659.0",
40
- "@opensumi/ide-overlay": "3.8.1-next-1741253659.0",
41
- "@opensumi/ide-preferences": "3.8.1-next-1741253659.0",
42
- "@opensumi/ide-search": "3.8.1-next-1741253659.0",
43
- "@opensumi/ide-terminal-next": "3.8.1-next-1741253659.0",
44
- "@opensumi/ide-theme": "3.8.1-next-1741253659.0",
45
- "@opensumi/ide-utils": "3.8.1-next-1741253659.0",
46
- "@opensumi/ide-workspace": "3.8.1-next-1741253659.0",
27
+ "@opensumi/ide-addons": "3.8.1-next-1741255538.0",
28
+ "@opensumi/ide-components": "3.8.1-next-1741255538.0",
29
+ "@opensumi/ide-connection": "3.8.1-next-1741255538.0",
30
+ "@opensumi/ide-core-common": "3.8.1-next-1741255538.0",
31
+ "@opensumi/ide-core-node": "3.8.1-next-1741255538.0",
32
+ "@opensumi/ide-debug": "3.8.1-next-1741255538.0",
33
+ "@opensumi/ide-design": "3.8.1-next-1741255538.0",
34
+ "@opensumi/ide-editor": "3.8.1-next-1741255538.0",
35
+ "@opensumi/ide-file-search": "3.8.1-next-1741255538.0",
36
+ "@opensumi/ide-file-service": "3.8.1-next-1741255538.0",
37
+ "@opensumi/ide-main-layout": "3.8.1-next-1741255538.0",
38
+ "@opensumi/ide-markers": "3.8.1-next-1741255538.0",
39
+ "@opensumi/ide-monaco": "3.8.1-next-1741255538.0",
40
+ "@opensumi/ide-overlay": "3.8.1-next-1741255538.0",
41
+ "@opensumi/ide-preferences": "3.8.1-next-1741255538.0",
42
+ "@opensumi/ide-search": "3.8.1-next-1741255538.0",
43
+ "@opensumi/ide-terminal-next": "3.8.1-next-1741255538.0",
44
+ "@opensumi/ide-theme": "3.8.1-next-1741255538.0",
45
+ "@opensumi/ide-utils": "3.8.1-next-1741255538.0",
46
+ "@opensumi/ide-workspace": "3.8.1-next-1741255538.0",
47
47
  "@xterm/xterm": "5.5.0",
48
48
  "ai": "^4.1.45",
49
49
  "ansi-regex": "^2.0.0",
@@ -58,7 +58,7 @@
58
58
  "zod-to-json-schema": "^3.24.1"
59
59
  },
60
60
  "devDependencies": {
61
- "@opensumi/ide-core-browser": "3.8.1-next-1741253659.0"
61
+ "@opensumi/ide-core-browser": "3.8.1-next-1741255538.0"
62
62
  },
63
- "gitHead": "c26a8e014a6e0dc205b830c484301c351ab91ca6"
63
+ "gitHead": "caf10136878780f24630586cc38db9fd0fcd2a5d"
64
64
  }
@@ -76,33 +76,6 @@ export class ChatProxyService extends Disposable {
76
76
 
77
77
  private chatDeferred: Deferred<void> = new Deferred<void>();
78
78
 
79
- public getRequestOptions() {
80
- const model = this.preferenceService.get<string>(AINativeSettingSectionsId.LLMModelSelection);
81
- const modelId = this.preferenceService.get<string>(AINativeSettingSectionsId.ModelID);
82
- let apiKey: string = '';
83
- let baseURL: string = '';
84
- if (model === 'deepseek') {
85
- apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.DeepseekApiKey, '');
86
- } else if (model === 'openai') {
87
- apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiApiKey, '');
88
- } else if (model === 'anthropic') {
89
- apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.AnthropicApiKey, '');
90
- } else {
91
- // openai-compatible 为兜底
92
- apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiApiKey, '');
93
- baseURL = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiBaseURL, '');
94
- }
95
- const agent = this.chatAgentService.getAgent(ChatProxyService.AGENT_ID);
96
- return {
97
- clientId: this.applicationService.clientId,
98
- model,
99
- modelId,
100
- apiKey,
101
- baseURL,
102
- system: agent?.metadata.systemPrompt,
103
- };
104
- }
105
-
106
79
  public registerDefaultAgent() {
107
80
  this.chatAgentViewService.registerChatComponent({
108
81
  id: 'toolCall',
@@ -143,13 +116,34 @@ export class ChatProxyService extends Disposable {
143
116
  }
144
117
  }
145
118
 
119
+ const model = this.preferenceService.get<string>(AINativeSettingSectionsId.LLMModelSelection);
120
+ const modelId = this.preferenceService.get<string>(AINativeSettingSectionsId.ModelID);
121
+ let apiKey: string = '';
122
+ let baseURL: string = '';
123
+ if (model === 'deepseek') {
124
+ apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.DeepseekApiKey, '');
125
+ } else if (model === 'openai') {
126
+ apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiApiKey, '');
127
+ } else if (model === 'anthropic') {
128
+ apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.AnthropicApiKey, '');
129
+ } else {
130
+ // openai-compatible 为兜底
131
+ apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiApiKey, '');
132
+ baseURL = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiBaseURL, '');
133
+ }
134
+ const agent = this.chatAgentService.getAgent(ChatProxyService.AGENT_ID);
146
135
  const stream = await this.aiBackService.requestStream(
147
136
  prompt,
148
137
  {
149
138
  requestId: request.requestId,
150
139
  sessionId: request.sessionId,
151
140
  history,
152
- ...this.getRequestOptions(),
141
+ clientId: this.applicationService.clientId,
142
+ apiKey,
143
+ model,
144
+ modelId,
145
+ baseURL,
146
+ system: agent?.metadata.systemPrompt,
153
147
  },
154
148
  token,
155
149
  );
@@ -512,7 +512,7 @@ export const ChatInput = React.forwardRef((props: IChatInputProps, ref) => {
512
512
  >
513
513
  <EnhanceIcon
514
514
  wrapperClassName={styles.action_btn}
515
- className={'codicon codicon-server'}
515
+ className={'codicon codicon-radio-tower'}
516
516
  onClick={handleShowMCPConfig}
517
517
  tabIndex={0}
518
518
  role='button'
@@ -33,7 +33,6 @@ import { MCPServerManager, MCPServerManagerPath } from '../common/mcp-server-man
33
33
  import { ChatAgentPromptProvider, DefaultChatAgentPromptProvider } from '../common/prompts/context-prompt-provider';
34
34
 
35
35
  import { AINativeBrowserContribution } from './ai-core.contribution';
36
- import { ApplyService } from './chat/apply.service';
37
36
  import { ChatAgentService } from './chat/chat-agent.service';
38
37
  import { ChatAgentViewService } from './chat/chat-agent.view.service';
39
38
  import { ChatManagerService } from './chat/chat-manager.service';
@@ -56,7 +55,6 @@ import { RenameCandidatesProviderRegistry } from './contrib/rename/rename.featur
56
55
  import { TerminalAIContribution } from './contrib/terminal/terminal-ai.contributon';
57
56
  import { TerminalFeatureRegistry } from './contrib/terminal/terminal.feature.registry';
58
57
  import { LanguageParserService } from './languages/service';
59
- import { BaseApplyService } from './mcp/base-apply.service';
60
58
  import { MCPConfigCommandContribution } from './mcp/config/mcp-config.commands';
61
59
  import { MCPConfigContribution } from './mcp/config/mcp-config.contribution';
62
60
  import { MCPServerProxyService } from './mcp/mcp-server-proxy.service';
@@ -201,10 +199,6 @@ export class AINativeModule extends BrowserModule {
201
199
  token: ChatAgentPromptProvider,
202
200
  useClass: DefaultChatAgentPromptProvider,
203
201
  },
204
- {
205
- token: BaseApplyService,
206
- useClass: ApplyService,
207
- },
208
202
  ];
209
203
 
210
204
  backServices = [
@@ -5,6 +5,7 @@ import { PreferenceService } from '@opensumi/ide-core-browser/lib/preferences';
5
5
 
6
6
  import { BUILTIN_MCP_SERVER_NAME } from '../../../../common';
7
7
  import { MCPServerDescription } from '../../../../common/mcp-server-manager';
8
+ import { MCP_SERVER_TYPE } from '../../../../common/types';
8
9
  import { MCPServerProxyService } from '../../mcp-server-proxy.service';
9
10
 
10
11
  import styles from './mcp-config.module.less';
@@ -66,6 +67,7 @@ export const MCPConfigView: React.FC = () => {
66
67
  name: BUILTIN_MCP_SERVER_NAME,
67
68
  enabled: false,
68
69
  command: '', // 内置服务器的 command 为空字符串
70
+ type: MCP_SERVER_TYPE.STDIO,
69
71
  },
70
72
  ];
71
73
  } else {
@@ -44,11 +44,34 @@
44
44
  display: flex;
45
45
  justify-content: flex-end;
46
46
  gap: 8px;
47
- margin-top: 24px;
48
47
  padding-top: 16px;
49
48
  border-top: 1px solid var(--border-color);
50
49
  }
51
50
 
51
+ .formRow {
52
+ display: flex;
53
+ gap: 16px;
54
+ flex-direction: row;
55
+ align-items: center;
56
+ justify-content: flex-start;
57
+ }
58
+
59
+ .formItemName {
60
+ flex: 1;
61
+ }
62
+
63
+ .formItemType {
64
+ flex-grow: 0;
65
+ min-width: 120px;
66
+ }
67
+
68
+ .formItemSelect {
69
+ height: 37.5px;
70
+ :global(.kt-select-value-large) {
71
+ height: 100% !important;
72
+ }
73
+ }
74
+
52
75
  .cancelButton {
53
76
  padding: 6px 12px;
54
77
  border: 1px solid var(--button-border);
@@ -1,15 +1,21 @@
1
- import React from 'react';
1
+ import cls from 'classnames';
2
+ import React, { useCallback } from 'react';
2
3
 
4
+ import { Select } from '@opensumi/ide-components';
3
5
  import { Button } from '@opensumi/ide-components/lib/button';
4
6
  import { Modal } from '@opensumi/ide-components/lib/modal';
7
+ import { localize } from '@opensumi/ide-core-common';
5
8
 
6
- import styles from './mcp-server-form.module.less';
9
+ import { MCP_SERVER_TYPE } from '../../../../common/types';
7
10
 
11
+ import styles from './mcp-server-form.module.less';
8
12
  export interface MCPServerFormData {
9
13
  name: string;
10
- command: string;
11
- args: string[];
14
+ command?: string;
15
+ args?: string[];
12
16
  env?: Record<string, string>;
17
+ type: MCP_SERVER_TYPE;
18
+ serverHost?: string;
13
19
  }
14
20
 
15
21
  interface Props {
@@ -25,7 +31,7 @@ export const MCPServerForm: React.FC<Props> = ({ visible, initialData, onSave, o
25
31
  command: '',
26
32
  args: [],
27
33
  env: {},
28
- type: 'stdio', // TODO: 支持 SSE
34
+ type: MCP_SERVER_TYPE.STDIO,
29
35
  ...initialData,
30
36
  }));
31
37
 
@@ -39,13 +45,13 @@ export const MCPServerForm: React.FC<Props> = ({ visible, initialData, onSave, o
39
45
  .join('\n');
40
46
  });
41
47
 
42
- // Update form data when initialData changes
43
48
  React.useEffect(() => {
44
49
  setFormData({
45
50
  name: '',
46
51
  command: '',
47
52
  args: [],
48
53
  env: {},
54
+ type: MCP_SERVER_TYPE.STDIO,
49
55
  ...initialData,
50
56
  });
51
57
  setArgsText(initialData?.args?.join(' ') || '');
@@ -60,28 +66,120 @@ export const MCPServerForm: React.FC<Props> = ({ visible, initialData, onSave, o
60
66
 
61
67
  const handleSubmit = (e: React.FormEvent) => {
62
68
  e.preventDefault();
63
- const args = argsText.split(' ').filter(Boolean);
64
- const env = envText
65
- .split('\n')
66
- .filter(Boolean)
67
- .reduce((acc, line) => {
68
- const [key, value] = line.split('=');
69
- if (key && value) {
70
- acc[key.trim()] = value.trim();
71
- }
72
- return acc;
73
- }, {} as Record<string, string>);
74
-
75
- onSave({
69
+ const form = {
76
70
  ...formData,
77
- args,
78
- env,
79
- });
71
+ };
72
+ if (formData.type === MCP_SERVER_TYPE.SSE) {
73
+ form.serverHost = form.serverHost?.trim();
74
+ } else {
75
+ const args = argsText.split(' ').filter(Boolean);
76
+ const env = envText
77
+ .split('\n')
78
+ .filter(Boolean)
79
+ .reduce((acc, line) => {
80
+ const [key, value] = line.split('=');
81
+ if (key && value) {
82
+ acc[key.trim()] = value.trim();
83
+ }
84
+ return acc;
85
+ }, {} as Record<string, string>);
86
+ form.args = args;
87
+ form.env = env;
88
+ }
89
+
90
+ onSave(form);
80
91
  };
81
92
 
93
+ const handleCommandChange = useCallback(
94
+ (e: React.ChangeEvent<HTMLInputElement>) => {
95
+ setFormData({ ...formData, command: e.target.value });
96
+ setArgsText(e.target.value.split(' ').filter(Boolean).join(' '));
97
+ },
98
+ [formData, argsText],
99
+ );
100
+
101
+ const handleArgsChange = useCallback(
102
+ (e: React.ChangeEvent<HTMLTextAreaElement>) => {
103
+ setArgsText(e.target.value);
104
+ },
105
+ [argsText],
106
+ );
107
+
108
+ const handleEnvChange = useCallback(
109
+ (e: React.ChangeEvent<HTMLTextAreaElement>) => {
110
+ setEnvText(e.target.value);
111
+ },
112
+ [envText],
113
+ );
114
+
115
+ const handleServerHostChange = useCallback(
116
+ (e: React.ChangeEvent<HTMLTextAreaElement>) => {
117
+ setFormData({ ...formData, serverHost: e.target.value });
118
+ },
119
+ [formData],
120
+ );
121
+
122
+ const handleTypeChange = useCallback(
123
+ (value: MCP_SERVER_TYPE) => {
124
+ setFormData({ ...formData, type: value });
125
+ },
126
+ [formData],
127
+ );
128
+
129
+ const renderFormItems = useCallback(() => {
130
+ if (formData?.type === MCP_SERVER_TYPE.STDIO) {
131
+ return (
132
+ <>
133
+ <div className={styles.formItem}>
134
+ <label>{localize('ai.native.mcp.command')}</label>
135
+ <input
136
+ type='text'
137
+ value={formData.command}
138
+ onChange={handleCommandChange}
139
+ placeholder={localize('ai.native.mcp.command.placeHolder')}
140
+ required
141
+ />
142
+ </div>
143
+ <div className={styles.formItem}>
144
+ <label>{localize('ai.native.mcp.args')}</label>
145
+ <textarea
146
+ value={argsText}
147
+ onChange={handleArgsChange}
148
+ placeholder={localize('ai.native.mcp.args.placeHolder')}
149
+ rows={3}
150
+ />
151
+ </div>
152
+ <div className={styles.formItem}>
153
+ <label>{localize('ai.native.mcp.env')}</label>
154
+ <textarea
155
+ value={envText}
156
+ onChange={handleEnvChange}
157
+ placeholder={localize('ai.native.mcp.env.placeHolder')}
158
+ rows={3}
159
+ />
160
+ </div>
161
+ </>
162
+ );
163
+ } else {
164
+ return (
165
+ <>
166
+ <div className={styles.formItem}>
167
+ <label>{localize('ai.native.mcp.serverHost')}</label>
168
+ <textarea
169
+ value={formData.serverHost}
170
+ onChange={handleServerHostChange}
171
+ placeholder={localize('ai.native.mcp.serverHost.placeHolder')}
172
+ rows={3}
173
+ />
174
+ </div>
175
+ </>
176
+ );
177
+ }
178
+ }, [formData, argsText, envText]);
179
+
82
180
  return (
83
181
  <Modal
84
- title={initialData ? 'Edit MCP Server' : 'Add New MCP Server'}
182
+ title={initialData ? localize('ai.native.mcp.editMCPServer.title') : localize('ai.native.mcp.addMCPServer.title')}
85
183
  visible={visible}
86
184
  onCancel={onCancel}
87
185
  centered
@@ -92,50 +190,38 @@ export const MCPServerForm: React.FC<Props> = ({ visible, initialData, onSave, o
92
190
  }}
93
191
  >
94
192
  <form className={styles.form} onSubmit={(e) => e.preventDefault()}>
95
- <div className={styles.formItem}>
96
- <label>Name:</label>
97
- <input
98
- type='text'
99
- value={formData.name}
100
- onChange={(e) => setFormData({ ...formData, name: e.target.value })}
101
- placeholder='Enter server name'
102
- required
103
- />
104
- </div>
105
- <div className={styles.formItem}>
106
- <label>Command:</label>
107
- <input
108
- type='text'
109
- value={formData.command}
110
- onChange={(e) => setFormData({ ...formData, command: e.target.value })}
111
- placeholder='Enter command (e.g., npx)'
112
- required
113
- />
114
- </div>
115
- <div className={styles.formItem}>
116
- <label>Arguments:</label>
117
- <textarea
118
- value={argsText}
119
- onChange={(e) => setArgsText(e.target.value)}
120
- placeholder='Enter arguments separated by space'
121
- rows={3}
122
- />
123
- </div>
124
- <div className={styles.formItem}>
125
- <label>Environment Variables:</label>
126
- <textarea
127
- value={envText}
128
- onChange={(e) => setEnvText(e.target.value)}
129
- placeholder='KEY=value (one per line)'
130
- rows={3}
131
- />
193
+ <div className={styles.formRow}>
194
+ <div className={cls(styles.formItem, styles.formItemName)}>
195
+ <label>{localize('ai.native.mcp.name')}</label>
196
+ <input
197
+ type='text'
198
+ value={formData.name}
199
+ onChange={(e) => setFormData({ ...formData, name: e.target.value })}
200
+ placeholder={localize('ai.native.mcp.name.placeHolder')}
201
+ required
202
+ />
203
+ </div>
204
+ <div className={cls(styles.formItem, styles.formItemType)}>
205
+ <label>{localize('ai.native.mcp.type')}</label>
206
+ <Select
207
+ size='large'
208
+ value={formData.type}
209
+ options={[
210
+ { label: localize('ai.native.mcp.stdio'), value: MCP_SERVER_TYPE.STDIO },
211
+ { label: localize('ai.native.mcp.sse'), value: MCP_SERVER_TYPE.SSE },
212
+ ]}
213
+ className={styles.formItemSelect}
214
+ onChange={handleTypeChange}
215
+ />
216
+ </div>
132
217
  </div>
218
+ {renderFormItems()}
133
219
  <div className={styles.formActions}>
134
- <Button onClick={onCancel} type='secondary'>
135
- Cancel
220
+ <Button onClick={onCancel} type='ghost'>
221
+ {localize('ai.native.mcp.buttonCancel')}
136
222
  </Button>
137
223
  <Button onClick={handleSubmit} type='primary'>
138
- Save
224
+ {initialData ? localize('ai.native.mcp.buttonUpdate') : localize('ai.native.mcp.buttonSave')}
139
225
  </Button>
140
226
  </div>
141
227
  </form>