@opensumi/ide-ai-native 3.9.1-next-1749204089.0 → 3.9.1-next-1749538805.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 (253) hide show
  1. package/lib/browser/ai-core.contribution.d.ts.map +1 -1
  2. package/lib/browser/ai-core.contribution.js +9 -4
  3. package/lib/browser/ai-core.contribution.js.map +1 -1
  4. package/lib/browser/chat/apply.service.d.ts +3 -0
  5. package/lib/browser/chat/apply.service.d.ts.map +1 -1
  6. package/lib/browser/chat/apply.service.js +47 -0
  7. package/lib/browser/chat/apply.service.js.map +1 -1
  8. package/lib/browser/chat/chat-manager.service.d.ts +1 -0
  9. package/lib/browser/chat/chat-manager.service.d.ts.map +1 -1
  10. package/lib/browser/chat/chat-manager.service.js +9 -3
  11. package/lib/browser/chat/chat-manager.service.js.map +1 -1
  12. package/lib/browser/chat/chat-model.d.ts +8 -1
  13. package/lib/browser/chat/chat-model.d.ts.map +1 -1
  14. package/lib/browser/chat/chat-model.js +113 -76
  15. package/lib/browser/chat/chat-model.js.map +1 -1
  16. package/lib/browser/chat/chat-proxy.service.d.ts +0 -2
  17. package/lib/browser/chat/chat-proxy.service.d.ts.map +1 -1
  18. package/lib/browser/chat/chat-proxy.service.js +50 -57
  19. package/lib/browser/chat/chat-proxy.service.js.map +1 -1
  20. package/lib/browser/chat/chat.feature.registry.d.ts +4 -1
  21. package/lib/browser/chat/chat.feature.registry.d.ts.map +1 -1
  22. package/lib/browser/chat/chat.feature.registry.js +6 -0
  23. package/lib/browser/chat/chat.feature.registry.js.map +1 -1
  24. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  25. package/lib/browser/chat/chat.view.js +50 -10
  26. package/lib/browser/chat/chat.view.js.map +1 -1
  27. package/lib/browser/components/ChatEditor.js +2 -2
  28. package/lib/browser/components/ChatEditor.js.map +1 -1
  29. package/lib/browser/components/ChatHistory.d.ts.map +1 -1
  30. package/lib/browser/components/ChatHistory.js +2 -1
  31. package/lib/browser/components/ChatHistory.js.map +1 -1
  32. package/lib/browser/components/ChatMentionInput.d.ts.map +1 -1
  33. package/lib/browser/components/ChatMentionInput.js +148 -30
  34. package/lib/browser/components/ChatMentionInput.js.map +1 -1
  35. package/lib/browser/components/ChatReply.js +2 -2
  36. package/lib/browser/components/ChatReply.js.map +1 -1
  37. package/lib/browser/components/ChatToolRender.d.ts.map +1 -1
  38. package/lib/browser/components/ChatToolRender.js +7 -2
  39. package/lib/browser/components/ChatToolRender.js.map +1 -1
  40. package/lib/browser/components/ChatToolRender.module.less +25 -0
  41. package/lib/browser/components/components.module.less +37 -8
  42. package/lib/browser/components/mention-input/mention-input.d.ts.map +1 -1
  43. package/lib/browser/components/mention-input/mention-input.js +150 -14
  44. package/lib/browser/components/mention-input/mention-input.js.map +1 -1
  45. package/lib/browser/components/mention-input/mention-input.module.less +165 -1
  46. package/lib/browser/components/mention-input/mention-select.d.ts +28 -0
  47. package/lib/browser/components/mention-input/mention-select.d.ts.map +1 -0
  48. package/lib/browser/components/mention-input/mention-select.js +136 -0
  49. package/lib/browser/components/mention-input/mention-select.js.map +1 -0
  50. package/lib/browser/components/mention-input/mention-select.module.less +297 -0
  51. package/lib/browser/components/mention-input/types.d.ts +28 -1
  52. package/lib/browser/components/mention-input/types.d.ts.map +1 -1
  53. package/lib/browser/components/mention-input/types.js +1 -0
  54. package/lib/browser/components/mention-input/types.js.map +1 -1
  55. package/lib/browser/components/utils.d.ts +2 -2
  56. package/lib/browser/context/llm-context.service.d.ts +21 -2
  57. package/lib/browser/context/llm-context.service.d.ts.map +1 -1
  58. package/lib/browser/context/llm-context.service.js +162 -20
  59. package/lib/browser/context/llm-context.service.js.map +1 -1
  60. package/lib/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.d.ts.map +1 -1
  61. package/lib/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.js.map +1 -1
  62. package/lib/browser/contrib/intelligent-completions/diff-computer.js +1 -1
  63. package/lib/browser/contrib/intelligent-completions/diff-computer.js.map +1 -1
  64. package/lib/browser/contrib/terminal/terminal.feature.registry.js.map +1 -1
  65. package/lib/browser/index.d.ts.map +1 -1
  66. package/lib/browser/index.js +7 -0
  67. package/lib/browser/index.js.map +1 -1
  68. package/lib/browser/layout/ai-layout.d.ts.map +1 -1
  69. package/lib/browser/layout/ai-layout.js +6 -4
  70. package/lib/browser/layout/ai-layout.js.map +1 -1
  71. package/lib/browser/layout/tabbar.view.d.ts +1 -1
  72. package/lib/browser/layout/tabbar.view.d.ts.map +1 -1
  73. package/lib/browser/layout/tabbar.view.js +5 -12
  74. package/lib/browser/layout/tabbar.view.js.map +1 -1
  75. package/lib/browser/mcp/base-apply.service.d.ts +5 -4
  76. package/lib/browser/mcp/base-apply.service.d.ts.map +1 -1
  77. package/lib/browser/mcp/base-apply.service.js +23 -5
  78. package/lib/browser/mcp/base-apply.service.js.map +1 -1
  79. package/lib/browser/mcp/mcp-server-proxy.service.d.ts +3 -1
  80. package/lib/browser/mcp/mcp-server-proxy.service.d.ts.map +1 -1
  81. package/lib/browser/mcp/mcp-server-proxy.service.js +4 -0
  82. package/lib/browser/mcp/mcp-server-proxy.service.js.map +1 -1
  83. package/lib/browser/mcp/mcp-server.feature.registry.d.ts.map +1 -1
  84. package/lib/browser/mcp/mcp-server.feature.registry.js +7 -1
  85. package/lib/browser/mcp/mcp-server.feature.registry.js.map +1 -1
  86. package/lib/browser/mcp/tools/createNewFileWithText.d.ts +1 -3
  87. package/lib/browser/mcp/tools/createNewFileWithText.d.ts.map +1 -1
  88. package/lib/browser/mcp/tools/createNewFileWithText.js +14 -40
  89. package/lib/browser/mcp/tools/createNewFileWithText.js.map +1 -1
  90. package/lib/browser/mcp/tools/fileSearch.d.ts.map +1 -1
  91. package/lib/browser/mcp/tools/fileSearch.js +9 -5
  92. package/lib/browser/mcp/tools/fileSearch.js.map +1 -1
  93. package/lib/browser/mcp/tools/getDiagnosticsByPath.js.map +1 -1
  94. package/lib/browser/mcp/tools/getOpenEditorFileDiagnostics.js.map +1 -1
  95. package/lib/browser/mcp/tools/grepSearch.d.ts.map +1 -1
  96. package/lib/browser/mcp/tools/grepSearch.js +22 -10
  97. package/lib/browser/mcp/tools/grepSearch.js.map +1 -1
  98. package/lib/browser/mcp/tools/handlers/CreateNewFileWithText.d.ts +15 -0
  99. package/lib/browser/mcp/tools/handlers/CreateNewFileWithText.d.ts.map +1 -0
  100. package/lib/browser/mcp/tools/handlers/CreateNewFileWithText.js +53 -0
  101. package/lib/browser/mcp/tools/handlers/CreateNewFileWithText.js.map +1 -0
  102. package/lib/browser/mcp/tools/handlers/ListDir.js +1 -1
  103. package/lib/browser/mcp/tools/handlers/ListDir.js.map +1 -1
  104. package/lib/browser/mcp/tools/handlers/ReadFile.js +1 -1
  105. package/lib/browser/mcp/tools/handlers/ReadFile.js.map +1 -1
  106. package/lib/browser/mcp/tools/handlers/RunCommand.d.ts +11 -1
  107. package/lib/browser/mcp/tools/handlers/RunCommand.d.ts.map +1 -1
  108. package/lib/browser/mcp/tools/handlers/RunCommand.js +11 -4
  109. package/lib/browser/mcp/tools/handlers/RunCommand.js.map +1 -1
  110. package/lib/browser/mcp/tools/listDir.d.ts.map +1 -1
  111. package/lib/browser/mcp/tools/listDir.js +19 -15
  112. package/lib/browser/mcp/tools/listDir.js.map +1 -1
  113. package/lib/browser/mcp/tools/runTerminalCmd.js.map +1 -1
  114. package/lib/browser/model/msg-history-manager.d.ts +47 -1
  115. package/lib/browser/model/msg-history-manager.d.ts.map +1 -1
  116. package/lib/browser/model/msg-history-manager.js +127 -2
  117. package/lib/browser/model/msg-history-manager.js.map +1 -1
  118. package/lib/browser/preferences/schema.d.ts.map +1 -1
  119. package/lib/browser/preferences/schema.js +5 -0
  120. package/lib/browser/preferences/schema.js.map +1 -1
  121. package/lib/browser/rules/rules.contribution.d.ts +29 -0
  122. package/lib/browser/rules/rules.contribution.d.ts.map +1 -0
  123. package/lib/browser/rules/rules.contribution.js +94 -0
  124. package/lib/browser/rules/rules.contribution.js.map +1 -0
  125. package/lib/browser/rules/rules.module.less +175 -0
  126. package/lib/browser/rules/rules.service.d.ts +25 -0
  127. package/lib/browser/rules/rules.service.d.ts.map +1 -0
  128. package/lib/browser/rules/rules.service.js +180 -0
  129. package/lib/browser/rules/rules.service.js.map +1 -0
  130. package/lib/browser/rules/rules.view.d.ts +3 -0
  131. package/lib/browser/rules/rules.view.d.ts.map +1 -0
  132. package/lib/browser/rules/rules.view.js +76 -0
  133. package/lib/browser/rules/rules.view.js.map +1 -0
  134. package/lib/browser/types.d.ts +12 -1
  135. package/lib/browser/types.d.ts.map +1 -1
  136. package/lib/browser/types.js.map +1 -1
  137. package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts.map +1 -1
  138. package/lib/browser/widget/inline-stream-diff/live-preview.component.js.map +1 -1
  139. package/lib/common/image-compression.d.ts +25 -0
  140. package/lib/common/image-compression.d.ts.map +1 -0
  141. package/lib/common/image-compression.js +153 -0
  142. package/lib/common/image-compression.js.map +1 -0
  143. package/lib/common/index.d.ts +5 -1
  144. package/lib/common/index.d.ts.map +1 -1
  145. package/lib/common/index.js +2 -0
  146. package/lib/common/index.js.map +1 -1
  147. package/lib/common/llm-context.d.ts +19 -0
  148. package/lib/common/llm-context.d.ts.map +1 -1
  149. package/lib/common/llm-context.js.map +1 -1
  150. package/lib/common/mdc-parser.d.ts +60 -0
  151. package/lib/common/mdc-parser.d.ts.map +1 -0
  152. package/lib/common/mdc-parser.js +246 -0
  153. package/lib/common/mdc-parser.js.map +1 -0
  154. package/lib/common/model.d.ts +1 -0
  155. package/lib/common/model.d.ts.map +1 -1
  156. package/lib/common/model.js.map +1 -1
  157. package/lib/common/prompts/context-prompt-provider.d.ts +0 -2
  158. package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
  159. package/lib/common/prompts/context-prompt-provider.js +35 -29
  160. package/lib/common/prompts/context-prompt-provider.js.map +1 -1
  161. package/lib/common/prompts/system-prompt.d.ts +2 -0
  162. package/lib/common/prompts/system-prompt.d.ts.map +1 -0
  163. package/lib/common/prompts/system-prompt.js +5 -0
  164. package/lib/common/prompts/system-prompt.js.map +1 -0
  165. package/lib/common/types.d.ts +21 -0
  166. package/lib/common/types.d.ts.map +1 -1
  167. package/lib/common/types.js.map +1 -1
  168. package/lib/common/utils.d.ts +1 -0
  169. package/lib/common/utils.d.ts.map +1 -1
  170. package/lib/common/utils.js +5 -2
  171. package/lib/common/utils.js.map +1 -1
  172. package/lib/node/anthropic/anthropic-language-model.d.ts +1 -1
  173. package/lib/node/base-language-model.d.ts +2 -1
  174. package/lib/node/base-language-model.d.ts.map +1 -1
  175. package/lib/node/base-language-model.js +12 -2
  176. package/lib/node/base-language-model.js.map +1 -1
  177. package/lib/node/deepseek/deepseek-language-model.d.ts +1 -1
  178. package/lib/node/mcp/sumi-mcp-server.d.ts +3 -1
  179. package/lib/node/mcp/sumi-mcp-server.d.ts.map +1 -1
  180. package/lib/node/mcp/sumi-mcp-server.js +7 -1
  181. package/lib/node/mcp/sumi-mcp-server.js.map +1 -1
  182. package/lib/node/mcp-server-manager-impl.d.ts +3 -1
  183. package/lib/node/mcp-server-manager-impl.d.ts.map +1 -1
  184. package/lib/node/mcp-server-manager-impl.js +14 -2
  185. package/lib/node/mcp-server-manager-impl.js.map +1 -1
  186. package/lib/node/mcp-server.sse.d.ts +187 -1
  187. package/lib/node/mcp-server.sse.d.ts.map +1 -1
  188. package/lib/node/mcp-server.sse.js +2 -2
  189. package/lib/node/mcp-server.sse.js.map +1 -1
  190. package/lib/node/mcp-server.stdio.d.ts +187 -1
  191. package/lib/node/mcp-server.stdio.d.ts.map +1 -1
  192. package/package.json +27 -26
  193. package/src/browser/ai-core.contribution.ts +14 -4
  194. package/src/browser/chat/apply.service.ts +62 -1
  195. package/src/browser/chat/chat-manager.service.ts +16 -7
  196. package/src/browser/chat/chat-model.ts +130 -73
  197. package/src/browser/chat/chat-proxy.service.ts +68 -81
  198. package/src/browser/chat/chat.feature.registry.ts +17 -1
  199. package/src/browser/chat/chat.view.tsx +73 -12
  200. package/src/browser/components/ChatEditor.tsx +1 -1
  201. package/src/browser/components/ChatHistory.tsx +2 -1
  202. package/src/browser/components/ChatMentionInput.tsx +180 -35
  203. package/src/browser/components/ChatReply.tsx +4 -4
  204. package/src/browser/components/ChatToolRender.module.less +25 -0
  205. package/src/browser/components/ChatToolRender.tsx +10 -2
  206. package/src/browser/components/components.module.less +37 -8
  207. package/src/browser/components/mention-input/mention-input.module.less +165 -1
  208. package/src/browser/components/mention-input/mention-input.tsx +232 -31
  209. package/src/browser/components/mention-input/mention-select.module.less +297 -0
  210. package/src/browser/components/mention-input/mention-select.tsx +256 -0
  211. package/src/browser/components/mention-input/types.ts +29 -0
  212. package/src/browser/context/llm-context.service.ts +182 -21
  213. package/src/browser/contrib/intelligent-completions/decoration/additions-deletions.decoration.ts +1 -1
  214. package/src/browser/contrib/intelligent-completions/diff-computer.ts +1 -1
  215. package/src/browser/contrib/terminal/terminal.feature.registry.ts +1 -1
  216. package/src/browser/index.ts +8 -0
  217. package/src/browser/layout/ai-layout.tsx +12 -8
  218. package/src/browser/layout/tabbar.view.tsx +10 -23
  219. package/src/browser/mcp/base-apply.service.ts +30 -10
  220. package/src/browser/mcp/mcp-server-proxy.service.ts +6 -1
  221. package/src/browser/mcp/mcp-server.feature.registry.ts +6 -1
  222. package/src/browser/mcp/tools/createNewFileWithText.ts +17 -46
  223. package/src/browser/mcp/tools/fileSearch.ts +8 -5
  224. package/src/browser/mcp/tools/getDiagnosticsByPath.ts +1 -1
  225. package/src/browser/mcp/tools/getOpenEditorFileDiagnostics.ts +1 -1
  226. package/src/browser/mcp/tools/grepSearch.ts +32 -21
  227. package/src/browser/mcp/tools/handlers/CreateNewFileWithText.ts +49 -0
  228. package/src/browser/mcp/tools/handlers/ListDir.ts +2 -2
  229. package/src/browser/mcp/tools/handlers/ReadFile.ts +2 -2
  230. package/src/browser/mcp/tools/handlers/RunCommand.ts +21 -14
  231. package/src/browser/mcp/tools/listDir.ts +15 -12
  232. package/src/browser/mcp/tools/runTerminalCmd.ts +1 -1
  233. package/src/browser/model/msg-history-manager.ts +181 -2
  234. package/src/browser/preferences/schema.ts +5 -0
  235. package/src/browser/rules/rules.contribution.ts +105 -0
  236. package/src/browser/rules/rules.module.less +175 -0
  237. package/src/browser/rules/rules.service.ts +189 -0
  238. package/src/browser/rules/rules.view.tsx +127 -0
  239. package/src/browser/types.ts +18 -0
  240. package/src/browser/widget/inline-stream-diff/live-preview.component.tsx +0 -1
  241. package/src/common/image-compression.ts +174 -0
  242. package/src/common/index.ts +6 -1
  243. package/src/common/llm-context.ts +23 -0
  244. package/src/common/mdc-parser.ts +295 -0
  245. package/src/common/model.ts +1 -0
  246. package/src/common/prompts/context-prompt-provider.ts +55 -40
  247. package/src/common/prompts/system-prompt.ts +2 -0
  248. package/src/common/types.ts +18 -0
  249. package/src/common/utils.ts +4 -1
  250. package/src/node/base-language-model.ts +11 -14
  251. package/src/node/mcp/sumi-mcp-server.ts +10 -2
  252. package/src/node/mcp-server-manager-impl.ts +17 -2
  253. package/src/node/mcp-server.sse.ts +1 -2
@@ -1,18 +1,16 @@
1
1
  import { Autowired, Injectable } from '@opensumi/di';
2
- import { AppConfig, PreferenceService } from '@opensumi/ide-core-browser';
2
+ import { PreferenceService } from '@opensumi/ide-core-browser';
3
3
  import {
4
4
  AIBackSerivcePath,
5
5
  CancellationToken,
6
6
  ChatAgentViewServiceToken,
7
7
  ChatFeatureRegistryToken,
8
- ChatServiceToken,
9
8
  Deferred,
10
9
  Disposable,
11
10
  IAIBackService,
12
11
  IAIReporter,
13
12
  IApplicationService,
14
13
  IChatProgress,
15
- getOperatingSystemName,
16
14
  } from '@opensumi/ide-core-common';
17
15
  import { AINativeSettingSectionsId } from '@opensumi/ide-core-common/lib/settings/ai-native';
18
16
  import { MonacoCommandRegistry } from '@opensumi/ide-editor/lib/browser/monaco-contrib/command/command.service';
@@ -27,10 +25,10 @@ import {
27
25
  IChatAgentService,
28
26
  IChatAgentWelcomeMessage,
29
27
  } from '../../common';
28
+ import { DEFAULT_SYSTEM_PROMPT } from '../../common/prompts/system-prompt';
30
29
  import { ChatToolRender } from '../components/ChatToolRender';
31
30
  import { IChatAgentViewService } from '../types';
32
31
 
33
- import { ChatService } from './chat.api.service';
34
32
  import { ChatFeatureRegistry } from './chat.feature.registry';
35
33
 
36
34
  /**
@@ -53,9 +51,6 @@ export class ChatProxyService extends Disposable {
53
51
  @Autowired(MonacoCommandRegistry)
54
52
  private readonly monacoCommandRegistry: MonacoCommandRegistry;
55
53
 
56
- @Autowired(ChatServiceToken)
57
- private aiChatService: ChatService;
58
-
59
54
  @Autowired(IAIReporter)
60
55
  private readonly aiReporter: IAIReporter;
61
56
 
@@ -71,9 +66,6 @@ export class ChatProxyService extends Disposable {
71
66
  @Autowired(IMessageService)
72
67
  private readonly messageService: IMessageService;
73
68
 
74
- @Autowired(AppConfig)
75
- private readonly appConfig: AppConfig;
76
-
77
69
  private chatDeferred: Deferred<void> = new Deferred<void>();
78
70
 
79
71
  public getRequestOptions() {
@@ -112,79 +104,74 @@ export class ChatProxyService extends Disposable {
112
104
  initialProps: {},
113
105
  });
114
106
 
115
- this.addDispose(
116
- this.chatAgentService.registerAgent({
117
- id: ChatProxyService.AGENT_ID,
118
- metadata: {
119
- systemPrompt:
120
- this.preferenceService.get<string>(
107
+ this.applicationService.getBackendOS().then(() => {
108
+ this.addDispose(
109
+ this.chatAgentService.registerAgent({
110
+ id: ChatProxyService.AGENT_ID,
111
+ metadata: {
112
+ systemPrompt: this.preferenceService.get<string>(
121
113
  AINativeSettingSectionsId.SystemPrompt,
122
- 'You are a powerful AI coding assistant working in OpenSumi, a top IDE framework. You collaborate with a USER to solve coding tasks, which may involve creating, modifying, or debugging code, or answering questions. When the USER sends a message, relevant context (e.g., open files, cursor position, edit history, linter errors) may be attached. Use this information as needed.\n\n<tool_calling>\nYou have access to tools to assist with tasks. Follow these rules:\n1. Always adhere to the tool call schema and provide all required parameters.\n2. Only use tools explicitly provided; ignore unavailable ones.\n3. Avoid mentioning tool names to the USER (e.g., say "I will edit your file" instead of "I need to use the edit_file tool").\n4. Only call tools when necessary; respond directly if the task is general or you already know the answer.\n5. Explain to the USER why you’re using a tool before calling it.\n</tool_calling>\n\n<making_code_changes>\nWhen modifying code:\n1. Use code edit tools instead of outputting code unless explicitly requested.\n2. Limit tool calls to one per turn.\n3. Ensure generated code is immediately executable by including necessary imports, dependencies, and endpoints.\n4. For new projects, create a dependency management file (e.g., requirements.txt) and a README.\n5. For web apps, design a modern, user-friendly UI.\n6. Avoid generating non-textual or excessively long code.\n7. Read file contents before editing, unless appending a small change or creating a new file.\n8. Fix introduced linter errors if possible, but stop after 3 attempts and ask the USER for guidance.\n9. Reapply reasonable code edits if they weren’t followed initially.\n</making_code_changes>\n\nUse the appropriate tools to fulfill the USER’s request, ensuring all required parameters are provided or inferred from context.',
123
- ) +
124
- `\n\n<user_info>\nThe user's OS is ${getOperatingSystemName()}. The absolute path of the user's workspace is ${
125
- this.appConfig.workspaceDir
126
- }.\n</user_info>`,
127
- },
128
- invoke: async (
129
- request: IChatAgentRequest,
130
- progress: (part: IChatProgress) => void,
131
- history: CoreMessage[],
132
- token: CancellationToken,
133
- ): Promise<IChatAgentResult> => {
134
- this.chatDeferred = new Deferred<void>();
135
-
136
- const { message, command } = request;
137
- let prompt: string = message;
138
-
139
- if (command) {
140
- const commandHandler = this.chatFeatureRegistry.getSlashCommandHandler(command);
141
- if (commandHandler && commandHandler.providerPrompt) {
142
- const editor = this.monacoCommandRegistry.getActiveCodeEditor();
143
- const slashCommandPrompt = await commandHandler.providerPrompt(message, editor);
144
- prompt = slashCommandPrompt;
114
+ DEFAULT_SYSTEM_PROMPT,
115
+ ),
116
+ },
117
+ invoke: async (
118
+ request: IChatAgentRequest,
119
+ progress: (part: IChatProgress) => void,
120
+ history: CoreMessage[],
121
+ token: CancellationToken,
122
+ ): Promise<IChatAgentResult> => {
123
+ this.chatDeferred = new Deferred<void>();
124
+ const { message, command } = request;
125
+ let prompt: string = message;
126
+ if (command) {
127
+ const commandHandler = this.chatFeatureRegistry.getSlashCommandHandler(command);
128
+ if (commandHandler && commandHandler.providerPrompt) {
129
+ const editor = this.monacoCommandRegistry.getActiveCodeEditor();
130
+ const slashCommandPrompt = await commandHandler.providerPrompt(message, editor);
131
+ prompt = slashCommandPrompt;
132
+ }
145
133
  }
146
- }
147
-
148
- const stream = await this.aiBackService.requestStream(
149
- prompt,
150
- {
151
- requestId: request.requestId,
152
- sessionId: request.sessionId,
153
- history,
154
- images: request.images,
155
- ...this.getRequestOptions(),
156
- },
157
- token,
158
- );
159
-
160
- listenReadable<IChatProgress>(stream, {
161
- onData: (data) => {
162
- progress(data);
163
- },
164
- onEnd: () => {
165
- this.chatDeferred.resolve();
166
- },
167
- onError: (error) => {
168
- this.messageService.error(error.message);
169
- this.aiReporter.end(request.sessionId + '_' + request.requestId, {
170
- message: error.message,
171
- success: false,
172
- command,
173
- });
174
- },
175
- });
176
-
177
- await this.chatDeferred.promise;
178
- return {};
179
- },
180
- provideSlashCommands: async (token: CancellationToken): Promise<IChatAgentCommand[]> =>
181
- this.chatFeatureRegistry
182
- .getAllSlashCommand()
183
- .map((s) => ({ ...s, name: s.name, description: s.description || '' })),
184
- provideChatWelcomeMessage: async (token: CancellationToken): Promise<IChatAgentWelcomeMessage | undefined> =>
185
- undefined,
186
- }),
187
- );
134
+
135
+ const stream = await this.aiBackService.requestStream(
136
+ prompt,
137
+ {
138
+ requestId: request.requestId,
139
+ sessionId: request.sessionId,
140
+ history,
141
+ images: request.images,
142
+ ...this.getRequestOptions(),
143
+ },
144
+ token,
145
+ );
146
+
147
+ listenReadable<IChatProgress>(stream, {
148
+ onData: (data) => {
149
+ progress(data);
150
+ },
151
+ onEnd: () => {
152
+ this.chatDeferred.resolve();
153
+ },
154
+ onError: (error) => {
155
+ this.messageService.error(error.message);
156
+ this.aiReporter.end(request.sessionId + '_' + request.requestId, {
157
+ message: error.message,
158
+ success: false,
159
+ command,
160
+ });
161
+ },
162
+ });
163
+
164
+ await this.chatDeferred.promise;
165
+ return {};
166
+ },
167
+ provideSlashCommands: async (): Promise<IChatAgentCommand[]> =>
168
+ this.chatFeatureRegistry
169
+ .getAllSlashCommand()
170
+ .map((s) => ({ ...s, name: s.name, description: s.description || '' })),
171
+ provideChatWelcomeMessage: async (): Promise<IChatAgentWelcomeMessage | undefined> => undefined,
172
+ }),
173
+ );
174
+ });
188
175
 
189
176
  queueMicrotask(() => {
190
177
  this.chatAgentService.updateAgent(ChatProxyService.AGENT_ID, {});
@@ -2,7 +2,13 @@ import { Injectable } from '@opensumi/di';
2
2
  import { Disposable, Emitter, Event, getDebugLogger } from '@opensumi/ide-core-common';
3
3
 
4
4
  import { IChatWelcomeMessageContent, ISampleQuestions, SLASH_SYMBOL } from '../../common';
5
- import { IChatFeatureRegistry, IChatSlashCommandHandler, IChatSlashCommandItem, IImageUploadProvider } from '../types';
5
+ import {
6
+ IChatFeatureRegistry,
7
+ IChatSlashCommandHandler,
8
+ IChatSlashCommandItem,
9
+ IImageUploadProvider,
10
+ IMessageSummaryProvider,
11
+ } from '../types';
6
12
 
7
13
  import { ChatSlashCommandItemModel, ChatWelcomeMessageModel } from './chat-model';
8
14
  import { ChatProxyService } from './chat-proxy.service';
@@ -14,6 +20,8 @@ export class ChatFeatureRegistry extends Disposable implements IChatFeatureRegis
14
20
  private slashCommandsHandlerMap: Map<string, IChatSlashCommandHandler> = new Map();
15
21
  private imageUploadProvider: IImageUploadProvider | undefined;
16
22
 
23
+ private messageSummaryProvider?: IMessageSummaryProvider;
24
+
17
25
  public registerImageUploadProvider(provider: IImageUploadProvider): void {
18
26
  this.imageUploadProvider = provider;
19
27
  }
@@ -22,6 +30,14 @@ export class ChatFeatureRegistry extends Disposable implements IChatFeatureRegis
22
30
  return this.imageUploadProvider;
23
31
  }
24
32
 
33
+ public registerMessageSummaryProvider(provider: IMessageSummaryProvider): void {
34
+ this.messageSummaryProvider = provider;
35
+ }
36
+
37
+ public getMessageSummaryProvider(): IMessageSummaryProvider | undefined {
38
+ return this.messageSummaryProvider;
39
+ }
40
+
25
41
  public chatWelcomeMessageModel?: ChatWelcomeMessageModel;
26
42
 
27
43
  private _onDidWelcomeMessageChange: Emitter<void> = new Emitter<void>();
@@ -1,3 +1,4 @@
1
+ import debounce from 'lodash/debounce';
1
2
  import * as React from 'react';
2
3
  import { MessageList } from 'react-chat-elements';
3
4
 
@@ -617,7 +618,12 @@ export const AIChatView = () => {
617
618
  const { message, images, agentId, command, reportExtra } = value;
618
619
  const { actionType, actionSource } = reportExtra || {};
619
620
 
620
- const request = aiChatService.createRequest(message, agentId!, images, command);
621
+ const request = aiChatService.createRequest(
622
+ message.replaceAll(LLM_CONTEXT_KEY_REGEX, ''),
623
+ agentId!,
624
+ images,
625
+ command,
626
+ );
621
627
  if (!request) {
622
628
  return;
623
629
  }
@@ -641,7 +647,7 @@ export const AIChatView = () => {
641
647
  600 * 1000,
642
648
  );
643
649
  msgHistoryManager.addUserMessage({
644
- content: message.replaceAll(LLM_CONTEXT_KEY_REGEX, ''),
650
+ content: message,
645
651
  images: images || [],
646
652
  agentId: agentId!,
647
653
  agentCommand: command!,
@@ -695,14 +701,9 @@ export const AIChatView = () => {
695
701
  let processedContent = message;
696
702
  const filePattern = /\{\{@file:(.*?)\}\}/g;
697
703
  const fileMatches = message.match(filePattern);
698
- let isCleanContext = false;
699
704
  if (fileMatches) {
700
705
  for (const match of fileMatches) {
701
706
  const filePath = match.replace(/\{\{@file:(.*?)\}\}/, '$1');
702
- if (filePath && !isCleanContext) {
703
- isCleanContext = true;
704
- llmContextService.cleanFileContext();
705
- }
706
707
  const fileUri = new URI(filePath);
707
708
  const relativePath = (await workspaceService.asRelativePath(fileUri))?.path || fileUri.displayName;
708
709
  processedContent = processedContent.replace(match, `\`${LLM_CONTEXT_KEY.AttachedFile}${relativePath}\``);
@@ -738,6 +739,18 @@ export const AIChatView = () => {
738
739
  );
739
740
  }
740
741
  }
742
+ const rulePattern = /\{\{@rule:(.*?)\}\}/g;
743
+ const ruleMatches = processedContent.match(rulePattern);
744
+ if (ruleMatches) {
745
+ for (const match of ruleMatches) {
746
+ const ruleName = match.replace(/\{\{@rule:(.*?)\}\}/, '$1');
747
+ const ruleUri = new URI(ruleName);
748
+ processedContent = processedContent.replace(
749
+ match,
750
+ `\`${LLM_CONTEXT_KEY.AttachedFile}${ruleUri.displayName}\``,
751
+ );
752
+ }
753
+ }
741
754
  return handleAgentReply({ message: processedContent, images, agentId, command, reportExtra });
742
755
  },
743
756
  [handleAgentReply],
@@ -918,6 +931,7 @@ export function DefaultChatViewHeader({
918
931
  }) {
919
932
  const aiChatService = useInjectable<ChatInternalService>(IChatInternalService);
920
933
  const messageService = useInjectable<IMessageService>(IMessageService);
934
+ const chatFeatureRegistry = useInjectable<ChatFeatureRegistry>(ChatFeatureRegistryToken);
921
935
 
922
936
  const [historyList, setHistoryList] = React.useState<IChatHistoryItem[]>([]);
923
937
  const [currentTitle, setCurrentTitle] = React.useState<string>('');
@@ -943,13 +957,60 @@ export function DefaultChatViewHeader({
943
957
  [aiChatService],
944
958
  );
945
959
 
960
+ // 防抖函数,避免频繁触发摘要生成
961
+ const debouncedGetSummary = React.useCallback(
962
+ debounce(
963
+ async (messages: { role: ChatMessageRole; content: string }[], currentTitle: string): Promise<string> => {
964
+ const summaryProvider = chatFeatureRegistry.getMessageSummaryProvider();
965
+ if (!summaryProvider || !aiChatService.sessionModel.sessionId) {
966
+ return currentTitle;
967
+ }
968
+
969
+ try {
970
+ const summary = await summaryProvider.getMessageSummary(messages);
971
+ return summary ? summary.slice(0, MAX_TITLE_LENGTH) : currentTitle;
972
+ } catch (error) {
973
+ return currentTitle;
974
+ }
975
+ },
976
+ 1000,
977
+ { leading: false, trailing: true },
978
+ ),
979
+ [chatFeatureRegistry, aiChatService.sessionModel.sessionId],
980
+ );
981
+
982
+ // 使用 ref 来跟踪最新的请求
983
+ const latestSummaryRequestRef = React.useRef<number>(0);
984
+
946
985
  React.useEffect(() => {
947
- const getHistoryList = () => {
986
+ const getHistoryList = async () => {
948
987
  const currentMessages = aiChatService.sessionModel.history.getMessages();
949
- const latestUserMessage = currentMessages.findLast((m) => m.role === ChatMessageRole.User);
950
- setCurrentTitle(
951
- latestUserMessage ? cleanAttachedTextWrapper(latestUserMessage.content).slice(0, MAX_TITLE_LENGTH) : '',
952
- );
988
+ const latestUserMessage = [...currentMessages].find((m) => m.role === ChatMessageRole.User);
989
+ const currentTitle = latestUserMessage
990
+ ? cleanAttachedTextWrapper(latestUserMessage.content).slice(0, MAX_TITLE_LENGTH)
991
+ : '';
992
+
993
+ // 设置初始标题
994
+ setCurrentTitle(currentTitle);
995
+
996
+ const messages = currentMessages.map((msg) => ({
997
+ role: msg.role,
998
+ content: msg.content,
999
+ }));
1000
+
1001
+ // 只有当消息数量超过阈值时才生成摘要
1002
+ if (messages.length > 2) {
1003
+ const requestId = Date.now();
1004
+ latestSummaryRequestRef.current = requestId;
1005
+
1006
+ const summary = await debouncedGetSummary(messages, currentTitle);
1007
+
1008
+ // 检查是否是最新请求
1009
+ if (requestId === latestSummaryRequestRef.current && summary) {
1010
+ setCurrentTitle(summary);
1011
+ }
1012
+ }
1013
+
953
1014
  setHistoryList(
954
1015
  aiChatService.getSessions().map((session) => {
955
1016
  const history = session.history;
@@ -25,7 +25,7 @@ import {
25
25
  localize,
26
26
  runWhenIdle,
27
27
  } from '@opensumi/ide-core-common';
28
- import { insertSnippetWithMonacoEditor } from '@opensumi/ide-editor/lib/browser/base-editor-wrapper';
28
+ import { insertSnippetWithMonacoEditor } from '@opensumi/ide-editor/lib/browser/editor-collection.service';
29
29
  import { MonacoCommandRegistry } from '@opensumi/ide-editor/lib/browser/monaco-contrib/command/command.service';
30
30
  import { ITheme, IThemeService } from '@opensumi/ide-theme';
31
31
  import { WorkbenchThemeService } from '@opensumi/ide-theme/lib/browser/workbench.theme.service';
@@ -216,7 +216,8 @@ const ChatHistory: FC<IChatHistoryProps> = memo(
216
216
  // 渲染历史记录列表
217
217
  const renderHistory = useCallback(() => {
218
218
  const filteredList = historyList
219
- .slice(0, MAX_HISTORY_LIST)
219
+ .slice(-MAX_HISTORY_LIST)
220
+ .reverse()
220
221
  .filter((item) => item.title && item.title.includes(searchValue));
221
222
 
222
223
  const groupedHistoryList = formatHistory(filteredList);