@opensumi/ide-ai-native 3.8.3-next-1741772268.0 → 3.8.3-next-1741774971.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 (85) hide show
  1. package/lib/browser/chat/chat-agent.service.d.ts +1 -1
  2. package/lib/browser/chat/chat-agent.service.d.ts.map +1 -1
  3. package/lib/browser/chat/chat-agent.service.js +7 -7
  4. package/lib/browser/chat/chat-agent.service.js.map +1 -1
  5. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  6. package/lib/browser/chat/chat.view.js +55 -18
  7. package/lib/browser/chat/chat.view.js.map +1 -1
  8. package/lib/browser/components/ChatEditor.d.ts +11 -2
  9. package/lib/browser/components/ChatEditor.d.ts.map +1 -1
  10. package/lib/browser/components/ChatEditor.js +66 -6
  11. package/lib/browser/components/ChatEditor.js.map +1 -1
  12. package/lib/browser/components/ChatMentionInput.d.ts +25 -0
  13. package/lib/browser/components/ChatMentionInput.d.ts.map +1 -0
  14. package/lib/browser/components/ChatMentionInput.js +224 -0
  15. package/lib/browser/components/ChatMentionInput.js.map +1 -0
  16. package/lib/browser/components/ChatThinking.d.ts +1 -1
  17. package/lib/browser/components/ChatThinking.d.ts.map +1 -1
  18. package/lib/browser/components/ChatThinking.js +8 -2
  19. package/lib/browser/components/ChatThinking.js.map +1 -1
  20. package/lib/browser/components/change-list.module.less +2 -0
  21. package/lib/browser/components/{ChatContext/ContextSelector.d.ts → chat-context/context-selector.d.ts} +1 -1
  22. package/lib/browser/components/chat-context/context-selector.d.ts.map +1 -0
  23. package/lib/browser/components/{ChatContext/ContextSelector.js → chat-context/context-selector.js} +1 -1
  24. package/lib/browser/components/chat-context/context-selector.js.map +1 -0
  25. package/lib/browser/components/chat-context/index.d.ts.map +1 -0
  26. package/lib/browser/components/{ChatContext → chat-context}/index.js +2 -2
  27. package/lib/browser/components/chat-context/index.js.map +1 -0
  28. package/lib/browser/components/components.module.less +32 -2
  29. package/lib/browser/components/mention-input/mention-input.d.ts +5 -0
  30. package/lib/browser/components/mention-input/mention-input.d.ts.map +1 -0
  31. package/lib/browser/components/mention-input/mention-input.js +763 -0
  32. package/lib/browser/components/mention-input/mention-input.js.map +1 -0
  33. package/lib/browser/components/mention-input/mention-input.module.less +329 -0
  34. package/lib/browser/components/mention-input/mention-item.d.ts +10 -0
  35. package/lib/browser/components/mention-input/mention-item.d.ts.map +1 -0
  36. package/lib/browser/components/mention-input/mention-item.js +16 -0
  37. package/lib/browser/components/mention-input/mention-item.js.map +1 -0
  38. package/lib/browser/components/mention-input/mention-panel.d.ts +15 -0
  39. package/lib/browser/components/mention-input/mention-panel.d.ts.map +1 -0
  40. package/lib/browser/components/mention-input/mention-panel.js +49 -0
  41. package/lib/browser/components/mention-input/mention-panel.js.map +1 -0
  42. package/lib/browser/components/mention-input/types.d.ts +78 -0
  43. package/lib/browser/components/mention-input/types.d.ts.map +1 -0
  44. package/lib/browser/components/mention-input/types.js +16 -0
  45. package/lib/browser/components/mention-input/types.js.map +1 -0
  46. package/lib/browser/context/llm-context.service.d.ts +10 -2
  47. package/lib/browser/context/llm-context.service.d.ts.map +1 -1
  48. package/lib/browser/context/llm-context.service.js +71 -2
  49. package/lib/browser/context/llm-context.service.js.map +1 -1
  50. package/lib/common/llm-context.d.ts +15 -1
  51. package/lib/common/llm-context.d.ts.map +1 -1
  52. package/lib/common/llm-context.js.map +1 -1
  53. package/lib/common/prompts/context-prompt-provider.d.ts +12 -2
  54. package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
  55. package/lib/common/prompts/context-prompt-provider.js +94 -30
  56. package/lib/common/prompts/context-prompt-provider.js.map +1 -1
  57. package/lib/node/mcp-server.sse.d.ts.map +1 -1
  58. package/lib/node/mcp-server.sse.js +2 -2
  59. package/lib/node/mcp-server.sse.js.map +1 -1
  60. package/package.json +23 -23
  61. package/src/browser/chat/chat-agent.service.ts +7 -7
  62. package/src/browser/chat/chat.view.tsx +74 -21
  63. package/src/browser/components/ChatEditor.tsx +126 -9
  64. package/src/browser/components/ChatMentionInput.tsx +271 -0
  65. package/src/browser/components/ChatThinking.tsx +10 -4
  66. package/src/browser/components/change-list.module.less +2 -0
  67. package/src/browser/components/{ChatContext → chat-context}/index.tsx +1 -1
  68. package/src/browser/components/components.module.less +32 -2
  69. package/src/browser/components/mention-input/mention-input.module.less +329 -0
  70. package/src/browser/components/mention-input/mention-input.tsx +952 -0
  71. package/src/browser/components/mention-input/mention-item.tsx +24 -0
  72. package/src/browser/components/mention-input/mention-panel.tsx +89 -0
  73. package/src/browser/components/mention-input/types.ts +84 -0
  74. package/src/browser/context/llm-context.service.ts +81 -3
  75. package/src/common/llm-context.ts +16 -1
  76. package/src/common/prompts/context-prompt-provider.ts +126 -36
  77. package/src/node/mcp-server.sse.ts +1 -2
  78. package/lib/browser/components/ChatContext/ContextSelector.d.ts.map +0 -1
  79. package/lib/browser/components/ChatContext/ContextSelector.js.map +0 -1
  80. package/lib/browser/components/ChatContext/index.d.ts.map +0 -1
  81. package/lib/browser/components/ChatContext/index.js.map +0 -1
  82. /package/lib/browser/components/{ChatContext → chat-context}/index.d.ts +0 -0
  83. /package/lib/browser/components/{ChatContext → chat-context}/style.module.less +0 -0
  84. /package/src/browser/components/{ChatContext/ContextSelector.tsx → chat-context/context-selector.tsx} +0 -0
  85. /package/src/browser/components/{ChatContext → chat-context}/style.module.less +0 -0
@@ -0,0 +1,24 @@
1
+ import cls from 'classnames';
2
+ import * as React from 'react';
3
+
4
+ import { Icon, getIcon } from '@opensumi/ide-core-browser/lib/components';
5
+
6
+ import styles from './mention-input.module.less';
7
+ import { MentionItem as MentionItemType } from './types';
8
+
9
+ interface MentionItemProps {
10
+ item: MentionItemType;
11
+ isActive: boolean;
12
+ onClick: (item: MentionItemType) => void;
13
+ }
14
+
15
+ export const MentionItem: React.FC<MentionItemProps> = ({ item, isActive, onClick }) => (
16
+ <div className={`${styles.mention_item} ${isActive ? styles.active : ''}`} onClick={() => onClick(item)}>
17
+ <div className={styles.mention_item_left}>
18
+ <Icon className={cls(styles.mention_item_icon, item.icon)} />
19
+ <span className={styles.mention_item_text}>{item.text}</span>
20
+ <span className={styles.mention_item_description}>{item.description}</span>
21
+ </div>
22
+ {item.getItems && <Icon className={cls(styles.mention_item_right, getIcon('arrowright'))} />}
23
+ </div>
24
+ );
@@ -0,0 +1,89 @@
1
+ import * as React from 'react';
2
+
3
+ import styles from './mention-input.module.less';
4
+ import { MentionItem } from './mention-item';
5
+ import { MentionItem as MentionItemType, MentionPosition } from './types';
6
+
7
+ interface MentionPanelProps {
8
+ items: MentionItemType[];
9
+ activeIndex: number;
10
+ onSelectItem: (item: MentionItemType, isTriggerByClick?: boolean) => void;
11
+ position: MentionPosition;
12
+ filter: string;
13
+ visible: boolean;
14
+ level: number;
15
+ loading?: boolean;
16
+ }
17
+
18
+ export const MentionPanel: React.FC<MentionPanelProps> = ({
19
+ items,
20
+ activeIndex,
21
+ onSelectItem,
22
+ position,
23
+ filter,
24
+ visible,
25
+ level,
26
+ loading = false,
27
+ }) => {
28
+ const panelRef = React.useRef<HTMLDivElement>(null);
29
+
30
+ // 当活动项改变时滚动到可见区域
31
+ React.useEffect(() => {
32
+ if (visible && panelRef.current) {
33
+ const activeItem = panelRef.current.querySelector(`.${styles.mention_item}.${styles.active}`);
34
+ if (activeItem) {
35
+ activeItem.scrollIntoView({ block: 'nearest' });
36
+ }
37
+ }
38
+ }, [activeIndex, visible]);
39
+
40
+ if (!visible) {
41
+ return null;
42
+ }
43
+
44
+ // 根据过滤条件筛选项目
45
+ const getFilteredItems = () => {
46
+ let filteredItems = items;
47
+
48
+ if (level === 0) {
49
+ // 一级菜单根据 @ 后面的文本过滤
50
+ if (filter && filter.length > 1) {
51
+ const searchText = filter.substring(1).toLowerCase();
52
+ filteredItems = items.filter((item) => item.text.toLowerCase().includes(searchText));
53
+ }
54
+ } else {
55
+ // 二级菜单根据 @file: 后面的文本过滤
56
+ if (filter && filter.length > 0) {
57
+ filteredItems = items.filter((item) => item.text.toLowerCase().includes(filter.toLowerCase()));
58
+ }
59
+ }
60
+
61
+ return filteredItems;
62
+ };
63
+
64
+ const filteredItems = getFilteredItems();
65
+
66
+ if (level === 0 && filteredItems.length === 0) {
67
+ return null;
68
+ }
69
+
70
+ return (
71
+ <div ref={panelRef} className={styles.mention_panel} style={{ top: position.top, left: position.left }}>
72
+ {loading && <div className={styles.loading_bar}></div>}
73
+ {items.length > 0 ? (
74
+ <ul className={styles.mention_list}>
75
+ {items.map((item, index) => (
76
+ <MentionItem
77
+ key={item.id}
78
+ item={item}
79
+ isActive={index === activeIndex}
80
+ onClick={() => onSelectItem(item, true)}
81
+ />
82
+ ))}
83
+ </ul>
84
+ ) : (
85
+ <div className={styles.no_results}>{loading ? '正在搜索...' : '无匹配结果'}</div>
86
+ )}
87
+ </div>
88
+ );
89
+ };
@@ -0,0 +1,84 @@
1
+ import type { LabelService } from '@opensumi/ide-core-browser';
2
+ import type { IWorkspaceService } from '@opensumi/ide-workspace';
3
+
4
+ export interface MentionItem {
5
+ id: string;
6
+ type: string;
7
+ text: string;
8
+ value?: string;
9
+ description?: string;
10
+ contextId?: string;
11
+ icon?: string;
12
+ getHighestLevelItems?: () => MentionItem[];
13
+ getItems?: (searchText: string) => Promise<MentionItem[]>;
14
+ }
15
+
16
+ export interface SecondLevelMenuConfig {
17
+ getDefaultItems: () => MentionItem[];
18
+ getHighestLevelItems: () => MentionItem[];
19
+ }
20
+
21
+ export interface MentionPosition {
22
+ top: number;
23
+ left: number;
24
+ }
25
+
26
+ export interface MentionState {
27
+ active: boolean;
28
+ startPos: number | null;
29
+ filter: string;
30
+ position: MentionPosition;
31
+ activeIndex: number;
32
+ level: number; // 0: 一级菜单, 1: 二级菜单
33
+ parentType: string | null; // 二级菜单的父类型
34
+ secondLevelFilter: string; // 二级菜单的筛选文本
35
+ inlineSearchActive: boolean; // 是否在输入框中进行二级搜索
36
+ inlineSearchStartPos: number | null; // 内联搜索的起始位置
37
+ loading: boolean; // 加载状态
38
+ }
39
+
40
+ interface ModelOption {
41
+ label: string;
42
+ value: string;
43
+ }
44
+
45
+ export enum FooterButtonPosition {
46
+ LEFT = 'left',
47
+ RIGHT = 'right',
48
+ }
49
+
50
+ export enum MentionType {
51
+ FILE = 'file',
52
+ FOLDER = 'folder',
53
+ CODE = 'code',
54
+ }
55
+
56
+ interface FooterButton {
57
+ id: string;
58
+ icon: string;
59
+ title: string;
60
+ onClick?: () => void;
61
+ position: FooterButtonPosition;
62
+ }
63
+
64
+ export interface FooterConfig {
65
+ modelOptions?: ModelOption[];
66
+ defaultModel?: string;
67
+ buttons?: FooterButton[];
68
+ showModelSelector?: boolean;
69
+ }
70
+
71
+ export interface MentionInputProps {
72
+ mentionItems?: MentionItem[]; // 简化为单一菜单项配置
73
+ onSend?: (content: string, config?: { model: string; [key: string]: any }) => void;
74
+ onStop?: () => void;
75
+ placeholder?: string;
76
+ loading?: boolean;
77
+ onSelectionChange?: (value: string) => void;
78
+ footerConfig?: FooterConfig; // 新增配置项
79
+ mentionKeyword?: string;
80
+ labelService?: LabelService;
81
+ workspaceService?: IWorkspaceService;
82
+ }
83
+
84
+ export const MENTION_KEYWORD = '@';
@@ -10,6 +10,7 @@ import {
10
10
  IEditorDocumentModelService,
11
11
  } from '@opensumi/ide-editor/lib/browser/doc-model/types';
12
12
  import { EditorSelectionChangeEvent } from '@opensumi/ide-editor/lib/browser/types';
13
+ import { FileType, IFileServiceClient } from '@opensumi/ide-file-service';
13
14
  import { IMarkerService } from '@opensumi/ide-markers/lib/common/types';
14
15
  import { Range } from '@opensumi/ide-monaco';
15
16
 
@@ -26,13 +27,18 @@ export class LLMContextServiceImpl extends WithEventBus implements LLMContextSer
26
27
  @Autowired(IMarkerService)
27
28
  protected readonly markerService: IMarkerService;
28
29
 
30
+ @Autowired(IFileServiceClient)
31
+ protected readonly fileService: IFileServiceClient;
32
+
29
33
  private isAutoCollecting = false;
30
34
 
31
35
  private contextVersion = 0;
32
36
 
33
37
  private readonly maxAttachFilesLimit = 10;
38
+ private readonly maxAttachFoldersLimit = 10;
34
39
  private readonly maxViewFilesLimit = 20;
35
- private readonly attachedFiles: FileContext[] = [];
40
+ private attachedFiles: FileContext[] = [];
41
+ private attachedFolders: FileContext[] = [];
36
42
  private readonly recentlyViewFiles: FileContext[] = [];
37
43
  private readonly onDidContextFilesChangeEmitter = new Emitter<{
38
44
  viewed: FileContext[];
@@ -53,6 +59,18 @@ export class LLMContextServiceImpl extends WithEventBus implements LLMContextSer
53
59
  }
54
60
  }
55
61
 
62
+ private addFolderToList(folder: FileContext, list: FileContext[], maxLimit: number) {
63
+ const existingIndex = list.findIndex((f) => f.uri.toString() === folder.uri.toString());
64
+ if (existingIndex > -1) {
65
+ list.splice(existingIndex, 1);
66
+ }
67
+
68
+ list.push(folder);
69
+ if (list.length > maxLimit) {
70
+ list.shift();
71
+ }
72
+ }
73
+
56
74
  addFileToContext(uri: URI, selection?: [number, number], isManual = false): void {
57
75
  if (!uri) {
58
76
  return;
@@ -70,12 +88,24 @@ export class LLMContextServiceImpl extends WithEventBus implements LLMContextSer
70
88
  this.notifyContextChange();
71
89
  }
72
90
 
91
+ addFolderToContext(uri: URI): void {
92
+ if (!uri) {
93
+ return;
94
+ }
95
+
96
+ const file = { uri };
97
+
98
+ this.addFolderToList(file, this.attachedFolders, this.maxAttachFoldersLimit);
99
+ this.notifyContextChange();
100
+ }
101
+
73
102
  private notifyContextChange(): void {
74
103
  this.onDidContextFilesChangeEmitter.fire(this.getAllContextFiles());
75
104
  }
76
105
 
77
106
  cleanFileContext() {
78
- this.attachedFiles.length = 0;
107
+ this.attachedFiles = [];
108
+ this.attachedFolders = [];
79
109
  this.notifyContextChange();
80
110
  }
81
111
 
@@ -83,6 +113,7 @@ export class LLMContextServiceImpl extends WithEventBus implements LLMContextSer
83
113
  return {
84
114
  viewed: this.recentlyViewFiles,
85
115
  attached: this.attachedFiles,
116
+ attachedFolders: this.attachedFolders,
86
117
  version: this.contextVersion++,
87
118
  };
88
119
  }
@@ -160,16 +191,63 @@ export class LLMContextServiceImpl extends WithEventBus implements LLMContextSer
160
191
  this.dispose();
161
192
  }
162
193
 
163
- serialize(): SerializedContext {
194
+ async serialize(): Promise<SerializedContext> {
164
195
  const files = this.getAllContextFiles();
165
196
  const workspaceRoot = URI.file(this.appConfig.workspaceDir);
166
197
 
167
198
  return {
168
199
  recentlyViewFiles: this.serializeRecentlyViewFiles(files.viewed, workspaceRoot),
169
200
  attachedFiles: this.serializeAttachedFiles(files.attached, workspaceRoot),
201
+ attachedFolders: await this.serializeAttachedFolders(files.attachedFolders, workspaceRoot),
170
202
  };
171
203
  }
172
204
 
205
+ private async serializeAttachedFolders(folders: FileContext[], workspaceRoot: URI): Promise<string[]> {
206
+ // 去重
207
+ const folderPath = Array.from(new Set(folders.map((folder) => folder.uri.toString())));
208
+ return Promise.all(
209
+ folderPath.map(async (folder) => {
210
+ const folderUri = new URI(folder);
211
+ const root = workspaceRoot.relative(folderUri)?.toString() || '/';
212
+ return `\`\`\`\n${root}\n${(await this.getPartiaFolderStructure(folderUri.codeUri.fsPath))
213
+ .map((line) => `- ${line}`)
214
+ .join('\n')}\n\`\`\`\n`;
215
+ }),
216
+ );
217
+ }
218
+
219
+ private async getPartiaFolderStructure(folder: string, level = 2): Promise<string[]> {
220
+ const result: string[] = [];
221
+ const stat = await this.fileService.getFileStat(folder);
222
+
223
+ for (const child of stat?.children || []) {
224
+ const relativePath = new URI(folder).relative(new URI(child.uri))!.toString();
225
+
226
+ if (child.isSymbolicLink) {
227
+ // 处理软链接
228
+ const target = await this.fileService.getFileStat(child.realUri || child.uri);
229
+ if (target) {
230
+ result.push(`${relativePath} -> ${target} (symbolic link)`);
231
+ } else {
232
+ result.push(`${relativePath} (broken symbolic link)`);
233
+ }
234
+ continue;
235
+ }
236
+
237
+ if (child.type === FileType.Directory) {
238
+ result.push(`${relativePath}/`);
239
+ if (level > 1) {
240
+ const subDirStructure = await this.getPartiaFolderStructure(child.uri, level - 1);
241
+ result.push(...subDirStructure.map((subEntry) => `${relativePath}/${subEntry}`));
242
+ }
243
+ } else if (child.type === FileType.File) {
244
+ result.push(relativePath);
245
+ }
246
+ }
247
+
248
+ return result;
249
+ }
250
+
173
251
  private serializeRecentlyViewFiles(files: FileContext[], workspaceRoot: URI): string[] {
174
252
  return files
175
253
  .map((file) => workspaceRoot.relative(file.uri)?.toString() || file.uri.parent.toString())
@@ -1,8 +1,14 @@
1
1
  import { Event, URI } from '@opensumi/ide-core-common/lib/utils';
2
2
 
3
3
  export interface LLMContextService {
4
+ /**
5
+ * 开始自动收集
6
+ */
4
7
  startAutoCollection(): void;
5
8
 
9
+ /**
10
+ * 停止自动收集
11
+ */
6
12
  stopAutoCollection(): void;
7
13
 
8
14
  /**
@@ -10,11 +16,19 @@ export interface LLMContextService {
10
16
  */
11
17
  addFileToContext(uri: URI, selection?: [number, number], isManual?: boolean): void;
12
18
 
19
+ /**
20
+ * 添加文件夹到 context 中
21
+ */
22
+ addFolderToContext(uri: URI, isManual?: boolean): void;
23
+
13
24
  /**
14
25
  * 清除上下文
15
26
  */
16
27
  cleanFileContext(): void;
17
28
 
29
+ /**
30
+ * 上下文文件变化事件
31
+ */
18
32
  onDidContextFilesChangeEvent: Event<{ viewed: FileContext[]; attached: FileContext[]; version: number }>;
19
33
 
20
34
  /**
@@ -24,7 +38,7 @@ export interface LLMContextService {
24
38
  removeFileFromContext(uri: URI, isManual?: boolean): void;
25
39
 
26
40
  /** 导出为可序列化格式 */
27
- serialize(): SerializedContext;
41
+ serialize(): Promise<SerializedContext>;
28
42
  }
29
43
 
30
44
  export interface FileContext {
@@ -44,4 +58,5 @@ export interface AttachFileContext {
44
58
  export interface SerializedContext {
45
59
  recentlyViewFiles: string[];
46
60
  attachedFiles: Array<AttachFileContext>;
61
+ attachedFolders: string[];
47
62
  }
@@ -1,5 +1,6 @@
1
1
  import { Autowired, Injectable } from '@opensumi/di';
2
2
  import { WorkbenchEditorService } from '@opensumi/ide-editor/lib/common/editor';
3
+ import { IWorkspaceService } from '@opensumi/ide-workspace';
3
4
 
4
5
  import { SerializedContext } from '../llm-context';
5
6
 
@@ -10,7 +11,7 @@ export interface ChatAgentPromptProvider {
10
11
  * 提供上下文提示
11
12
  * @param context 上下文
12
13
  */
13
- provideContextPrompt(context: SerializedContext, userMessage: string): string;
14
+ provideContextPrompt(context: SerializedContext, userMessage: string): Promise<string>;
14
15
  }
15
16
 
16
17
  @Injectable()
@@ -18,42 +19,131 @@ export class DefaultChatAgentPromptProvider implements ChatAgentPromptProvider {
18
19
  @Autowired(WorkbenchEditorService)
19
20
  protected readonly workbenchEditorService: WorkbenchEditorService;
20
21
 
21
- provideContextPrompt(context: SerializedContext, userMessage: string): string {
22
+ @Autowired(IWorkspaceService)
23
+ protected readonly workspaceService: IWorkspaceService;
24
+
25
+ async provideContextPrompt(context: SerializedContext, userMessage: string) {
26
+ const currentFileInfo = await this.getCurrentFileInfo();
27
+
28
+ return this.buildPromptTemplate({
29
+ recentFiles: this.buildRecentFilesSection(context.recentlyViewFiles),
30
+ attachedFiles: this.buildAttachedFilesSection(context.attachedFiles),
31
+ attachedFolders: this.buildAttachedFoldersSection(context.attachedFolders),
32
+ currentFile: currentFileInfo,
33
+ userMessage,
34
+ });
35
+ }
36
+
37
+ private async getCurrentFileInfo() {
22
38
  const editor = this.workbenchEditorService.currentEditor;
23
39
  const currentModel = editor?.currentDocumentModel;
24
- return `
25
- <additional_data>
26
- Below are some potentially helpful/relevant pieces of information for figuring out to respond
27
- <recently_viewed_files>
28
- ${context.recentlyViewFiles.map((file, idx) => ` ${idx + 1}: ${file}`).join('\n')}
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
- ${
46
- currentModel
47
- ? `<current_opened_file>
48
- \`\`\`${currentModel.languageId} ${currentModel.uri.toString()}
49
- ${currentModel.getText()}
50
- \`\`\`
51
- </current_opened_file>`
52
- : ''
53
- }
54
- </additional_data>
55
- <user_query>
56
- ${userMessage}
57
- </user_query>`;
40
+
41
+ if (!currentModel?.uri) {
42
+ return null;
43
+ }
44
+
45
+ const currentPath =
46
+ (await this.workspaceService.asRelativePath(currentModel.uri))?.path || currentModel.uri.codeUri.fsPath;
47
+
48
+ return {
49
+ path: currentPath,
50
+ languageId: currentModel.languageId,
51
+ content: currentModel.getText(),
52
+ };
53
+ }
54
+
55
+ private buildPromptTemplate({
56
+ recentFiles,
57
+ attachedFiles,
58
+ attachedFolders,
59
+ currentFile,
60
+ userMessage,
61
+ }: {
62
+ recentFiles: string;
63
+ attachedFiles: string;
64
+ attachedFolders: string;
65
+ currentFile: { path: string; languageId: string; content: string } | null;
66
+ userMessage: string;
67
+ }) {
68
+ const sections = [
69
+ '<additional_data>',
70
+ 'Below are some potentially helpful/relevant pieces of information for figuring out to respond',
71
+ recentFiles,
72
+ attachedFiles,
73
+ attachedFolders,
74
+ this.buildCurrentFileSection(currentFile),
75
+ '</additional_data>',
76
+ '<user_query>',
77
+ userMessage,
78
+ '</user_query>',
79
+ ].filter(Boolean);
80
+
81
+ return sections.join('\n');
82
+ }
83
+
84
+ private buildRecentFilesSection(files: string[]): string {
85
+ if (!files.length) {
86
+ return '';
87
+ }
88
+
89
+ return `<recently_viewed_files>
90
+ ${files.map((file, idx) => ` ${idx + 1}: ${file}`).join('\n')}
91
+ </recently_viewed_files>`;
92
+ }
93
+
94
+ private buildAttachedFilesSection(files: { path: string; content: string; lineErrors: string[] }[]): string {
95
+ if (!files.length) {
96
+ return '';
97
+ }
98
+
99
+ const fileContents = files
100
+ .map((file) => {
101
+ const sections = [
102
+ this.buildFileContentSection(file),
103
+ file.lineErrors.length ? this.buildLineErrorsSection(file.lineErrors) : '',
104
+ ].filter(Boolean);
105
+
106
+ return sections.join('\n');
107
+ })
108
+ .filter(Boolean)
109
+ .join('\n');
110
+
111
+ return `<attached_files>\n${fileContents}\n</attached_files>`;
112
+ }
113
+
114
+ private buildFileContentSection(file: { path: string; content: string }): string {
115
+ return `<file_contents>
116
+ \`\`\`${file.path}
117
+ ${file.content}
118
+ \`\`\`
119
+ </file_contents>`;
120
+ }
121
+
122
+ private buildLineErrorsSection(errors: string[]): string {
123
+ if (!errors.length) {
124
+ return '';
125
+ }
126
+
127
+ return `<linter_errors>\n${errors.join('\n')}\n</linter_errors>`;
128
+ }
129
+
130
+ private buildAttachedFoldersSection(folders: string[]): string {
131
+ if (!folders.length) {
132
+ return '';
133
+ }
134
+
135
+ return `<attached_folders>\n${folders.join('\n')}</attached_folders>`;
136
+ }
137
+
138
+ private buildCurrentFileSection(fileInfo: { path: string; languageId: string; content: string } | null): string {
139
+ if (!fileInfo) {
140
+ return '';
141
+ }
142
+
143
+ return `<current_opened_file>
144
+ \`\`\`${fileInfo.languageId} ${fileInfo.path}
145
+ ${fileInfo.content}
146
+ \`\`\`
147
+ </current_opened_file>`;
58
148
  }
59
149
  }
@@ -1,5 +1,6 @@
1
1
  // have to import with extension since the exports map is ./* -> ./dist/cjs/*
2
2
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
3
4
  import { EventSource } from 'eventsource';
4
5
 
5
6
  import { ILogger } from '@opensumi/ide-core-common';
@@ -33,8 +34,6 @@ export class SSEMCPServer implements IMCPServer {
33
34
  }
34
35
  this.logger?.log(`Starting server "${this.name}" with serverHost: ${this.serverHost}`);
35
36
 
36
- const SSEClientTransport = (await import('@modelcontextprotocol/sdk/client/sse.js')).SSEClientTransport;
37
-
38
37
  const transport = new SSEClientTransport(new URL(this.serverHost));
39
38
  transport.onerror = (error) => {
40
39
  this.logger?.error('Transport Error:', error);
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContextSelector.d.ts","sourceRoot":"","sources":["../../../../src/browser/components/ChatContext/ContextSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAyD,MAAM,OAAO,CAAC;AAQ9E,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAyC1D,UAAU,oBAAoB;IAC5B,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,qFAAiE,oBAAoB,uBAoH/G,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContextSelector.js","sourceRoot":"","sources":["../../../../src/browser/components/ChatContext/ContextSelector.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/browser/components/ChatContext/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAEtE,OAAO,8BAA8B,CAAC;AAsBtC,eAAO,MAAM,WAAW,oDA6HtB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/browser/components/ChatContext/index.tsx"],"names":[],"mappings":"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"}