@opensumi/ide-ai-native 3.9.1-next-1749540423.0 → 3.9.1-next-1749546307.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 +49 -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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensumi/ide-ai-native",
3
- "version": "3.9.1-next-1749540423.0",
3
+ "version": "3.9.1-next-1749546307.0",
4
4
  "files": [
5
5
  "lib",
6
6
  "src"
@@ -23,30 +23,31 @@
23
23
  "@ai-sdk/deepseek": "^0.1.11",
24
24
  "@ai-sdk/openai": "^1.1.9",
25
25
  "@ai-sdk/openai-compatible": "^0.1.11",
26
- "@modelcontextprotocol/sdk": "^1.3.1",
27
- "@opensumi/ide-addons": "3.9.1-next-1749540423.0",
28
- "@opensumi/ide-components": "3.9.1-next-1749540423.0",
29
- "@opensumi/ide-connection": "3.9.1-next-1749540423.0",
30
- "@opensumi/ide-core-common": "3.9.1-next-1749540423.0",
31
- "@opensumi/ide-core-node": "3.9.1-next-1749540423.0",
32
- "@opensumi/ide-debug": "3.9.1-next-1749540423.0",
33
- "@opensumi/ide-design": "3.9.1-next-1749540423.0",
34
- "@opensumi/ide-editor": "3.9.1-next-1749540423.0",
35
- "@opensumi/ide-file-search": "3.9.1-next-1749540423.0",
36
- "@opensumi/ide-file-service": "3.9.1-next-1749540423.0",
37
- "@opensumi/ide-main-layout": "3.9.1-next-1749540423.0",
38
- "@opensumi/ide-markers": "3.9.1-next-1749540423.0",
39
- "@opensumi/ide-monaco": "3.9.1-next-1749540423.0",
40
- "@opensumi/ide-outline": "3.9.1-next-1749540423.0",
41
- "@opensumi/ide-overlay": "3.9.1-next-1749540423.0",
42
- "@opensumi/ide-preferences": "3.9.1-next-1749540423.0",
43
- "@opensumi/ide-search": "3.9.1-next-1749540423.0",
44
- "@opensumi/ide-terminal-next": "3.9.1-next-1749540423.0",
45
- "@opensumi/ide-theme": "3.9.1-next-1749540423.0",
46
- "@opensumi/ide-utils": "3.9.1-next-1749540423.0",
47
- "@opensumi/ide-workspace": "3.9.1-next-1749540423.0",
26
+ "@modelcontextprotocol/sdk": "^1.11.4",
27
+ "@opensumi/ide-addons": "3.9.1-next-1749546307.0",
28
+ "@opensumi/ide-components": "3.9.1-next-1749546307.0",
29
+ "@opensumi/ide-connection": "3.9.1-next-1749546307.0",
30
+ "@opensumi/ide-core-common": "3.9.1-next-1749546307.0",
31
+ "@opensumi/ide-core-node": "3.9.1-next-1749546307.0",
32
+ "@opensumi/ide-debug": "3.9.1-next-1749546307.0",
33
+ "@opensumi/ide-design": "3.9.1-next-1749546307.0",
34
+ "@opensumi/ide-editor": "3.9.1-next-1749546307.0",
35
+ "@opensumi/ide-file-search": "3.9.1-next-1749546307.0",
36
+ "@opensumi/ide-file-service": "3.9.1-next-1749546307.0",
37
+ "@opensumi/ide-main-layout": "3.9.1-next-1749546307.0",
38
+ "@opensumi/ide-markers": "3.9.1-next-1749546307.0",
39
+ "@opensumi/ide-monaco": "3.9.1-next-1749546307.0",
40
+ "@opensumi/ide-outline": "3.9.1-next-1749546307.0",
41
+ "@opensumi/ide-overlay": "3.9.1-next-1749546307.0",
42
+ "@opensumi/ide-preferences": "3.9.1-next-1749546307.0",
43
+ "@opensumi/ide-quick-open": "3.9.1-next-1749546307.0",
44
+ "@opensumi/ide-search": "3.9.1-next-1749546307.0",
45
+ "@opensumi/ide-terminal-next": "3.9.1-next-1749546307.0",
46
+ "@opensumi/ide-theme": "3.9.1-next-1749546307.0",
47
+ "@opensumi/ide-utils": "3.9.1-next-1749546307.0",
48
+ "@opensumi/ide-workspace": "3.9.1-next-1749546307.0",
48
49
  "@xterm/xterm": "5.5.0",
49
- "ai": "^4.1.45",
50
+ "ai": "^4.3.16",
50
51
  "ansi-regex": "^2.0.0",
51
52
  "ansi_up": "^5.1.0",
52
53
  "diff": "^7.0.0",
@@ -61,7 +62,7 @@
61
62
  "zod-to-json-schema": "^3.24.1"
62
63
  },
63
64
  "devDependencies": {
64
- "@opensumi/ide-core-browser": "3.9.1-next-1749540423.0"
65
+ "@opensumi/ide-core-browser": "3.9.1-next-1749546307.0"
65
66
  },
66
- "gitHead": "862246b6eb15f13dd84d1e7bb063ea37d3f44e2d"
67
+ "gitHead": "b6c7e9fae4bda7d6db15119cdcf514f7a08cb693"
67
68
  }
@@ -24,6 +24,7 @@ import {
24
24
  SlotLocation,
25
25
  SlotRendererContribution,
26
26
  SlotRendererRegistry,
27
+ TabbarBehaviorConfig,
27
28
  getIcon,
28
29
  localize,
29
30
  } from '@opensumi/ide-core-browser';
@@ -813,15 +814,24 @@ export class AINativeBrowserContribution
813
814
  }
814
815
 
815
816
  registerRenderer(registry: SlotRendererRegistry): void {
817
+ const tabbarConfig: TabbarBehaviorConfig = {
818
+ isLatter: true,
819
+ };
816
820
  if (this.designLayoutConfig.supportExternalChatPanel) {
817
- registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRendererWithTab);
821
+ registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRendererWithTab, tabbarConfig);
818
822
  } else {
819
- registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRenderer);
823
+ registry.registerSlotRenderer(AI_CHAT_VIEW_ID, AIChatTabRenderer, tabbarConfig);
820
824
  }
821
825
 
822
826
  if (this.designLayoutConfig.useMergeRightWithLeftPanel) {
823
- registry.registerSlotRenderer(SlotLocation.left, AILeftTabRenderer);
824
- registry.registerSlotRenderer(SlotLocation.right, AIRightTabRenderer);
827
+ registry.registerSlotRenderer(
828
+ SlotLocation.view,
829
+ AILeftTabRenderer,
830
+ Object.assign({}, tabbarConfig, {
831
+ isLatter: false,
832
+ }),
833
+ );
834
+ registry.registerSlotRenderer(SlotLocation.extendView, AIRightTabRenderer, tabbarConfig);
825
835
  }
826
836
  }
827
837
 
@@ -1,6 +1,16 @@
1
1
  import { Autowired, Injectable } from '@opensumi/di';
2
- import { AIBackSerivcePath, IAIBackService, IChatProgress, URI, path } from '@opensumi/ide-core-browser';
2
+ import {
3
+ AIBackSerivcePath,
4
+ CancellationTokenSource,
5
+ IAIBackService,
6
+ IChatProgress,
7
+ URI,
8
+ path,
9
+ } from '@opensumi/ide-core-browser';
10
+ import { CommandService } from '@opensumi/ide-core-common/lib/command';
3
11
  import { IEditorDocumentModelService } from '@opensumi/ide-editor/lib/browser';
12
+ import { CodeAction, CodeActionContext, CodeActionTriggerType, ICodeEditor } from '@opensumi/ide-monaco';
13
+ import { languageFeaturesService } from '@opensumi/ide-monaco/lib/browser/monaco-api/languages';
4
14
  import { SumiReadableStream } from '@opensumi/ide-utils/lib/stream';
5
15
  import { Range } from '@opensumi/monaco-editor-core';
6
16
 
@@ -10,8 +20,59 @@ import { BaseApplyService } from '../mcp/base-apply.service';
10
20
 
11
21
  import { ChatProxyService } from './chat-proxy.service';
12
22
 
23
+ /**
24
+ * Filter code actions to only apply batch fixes
25
+ * Skip individual fixes as consecutive WorkspaceEdits may interfere with each other
26
+ * @param codeAction The code action to check
27
+ * @returns boolean indicating if the action is auto-fixable
28
+ */
29
+ function isAutoFixable(codeAction: CodeAction): boolean {
30
+ return codeAction.title.toLowerCase().includes('all');
31
+ }
32
+
13
33
  @Injectable()
14
34
  export class ApplyService extends BaseApplyService {
35
+ @Autowired(CommandService)
36
+ private commandService: CommandService;
37
+
38
+ protected async postApplyHandler(editor: ICodeEditor): Promise<void> {
39
+ const model = editor.getModel();
40
+ if (!model) {
41
+ return Promise.resolve();
42
+ }
43
+ const providers = languageFeaturesService.codeActionProvider.ordered(model);
44
+
45
+ if (!providers) {
46
+ return Promise.resolve();
47
+ }
48
+
49
+ const [provider] = providers;
50
+ const range = model.getFullModelRange();
51
+ const context: CodeActionContext = {
52
+ trigger: CodeActionTriggerType.Auto,
53
+ };
54
+ const ts = new CancellationTokenSource();
55
+ const actionList = await provider.provideCodeActions(model, range, context, ts.token);
56
+
57
+ // 提取所有可修复的代码操作
58
+ const fixableActions = actionList?.actions.filter(isAutoFixable) || [];
59
+
60
+ if (fixableActions.length === 0) {
61
+ return Promise.resolve();
62
+ }
63
+
64
+ // 执行所有可修复的代码操作
65
+ await Promise.allSettled(
66
+ fixableActions.map(async (action) => {
67
+ if (action.command) {
68
+ try {
69
+ await this.commandService.executeCommand(action.command.id, ...(action.command.arguments || []));
70
+ } catch (err) {}
71
+ }
72
+ }),
73
+ );
74
+ }
75
+
15
76
  @Autowired(IEditorDocumentModelService)
16
77
  private readonly modelService: IEditorDocumentModelService;
17
78
 
@@ -15,12 +15,13 @@ import {
15
15
  StorageProvider,
16
16
  debounce,
17
17
  } from '@opensumi/ide-core-common';
18
- import { IHistoryChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
18
+ import { ChatFeatureRegistryToken, IHistoryChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
19
19
 
20
20
  import { IChatAgentService, IChatFollowup, IChatRequestMessage, IChatResponseErrorDetails } from '../../common';
21
21
  import { MsgHistoryManager } from '../model/msg-history-manager';
22
22
 
23
23
  import { ChatModel, ChatRequestModel, ChatResponseModel, IChatProgressResponseContent } from './chat-model';
24
+ import { ChatFeatureRegistry } from './chat.feature.registry';
24
25
 
25
26
  interface ISessionModel {
26
27
  sessionId: string;
@@ -78,17 +79,23 @@ export class ChatManagerService extends Disposable {
78
79
  @Autowired(PreferenceService)
79
80
  private preferenceService: PreferenceService;
80
81
 
82
+ @Autowired(ChatFeatureRegistryToken)
83
+ private chatFeatureRegistry: ChatFeatureRegistry;
84
+
81
85
  private _chatStorage: IStorage;
82
86
 
83
87
  protected fromJSON(data: ISessionModel[]) {
84
88
  return data
85
89
  .filter((item) => item.history.messages.length > 0)
86
90
  .map((item) => {
87
- const model = new ChatModel({
88
- sessionId: item.sessionId,
89
- history: new MsgHistoryManager(item.history),
90
- modelId: item.modelId,
91
- });
91
+ const model = new ChatModel(
92
+ this.chatFeatureRegistry,
93
+ {
94
+ sessionId: item.sessionId,
95
+ history: new MsgHistoryManager(this.chatFeatureRegistry, item.history),
96
+ modelId: item.modelId,
97
+ },
98
+ );
92
99
  const requests = item.requests.map(
93
100
  (request) =>
94
101
  new ChatRequestModel(
@@ -131,7 +138,9 @@ export class ChatManagerService extends Disposable {
131
138
  }
132
139
 
133
140
  startSession() {
134
- const model = new ChatModel();
141
+ const model = new ChatModel(
142
+ this.chatFeatureRegistry,
143
+ );
135
144
  this.#sessionModels.set(model.sessionId, model);
136
145
  this.listenSession(model);
137
146
  return model;
@@ -28,7 +28,7 @@ import {
28
28
  import { MsgHistoryManager } from '../model/msg-history-manager';
29
29
  import { IChatSlashCommandItem } from '../types';
30
30
 
31
- import type { ImagePart, TextPart, ToolCallPart } from 'ai';
31
+ import { ChatFeatureRegistry } from './chat.feature.registry';
32
32
 
33
33
  export type IChatProgressResponseContent =
34
34
  | IChatMarkdownContent
@@ -296,10 +296,13 @@ export class ChatRequestModel implements IChatRequestModel {
296
296
  export class ChatModel extends Disposable implements IChatModel {
297
297
  private requestIdPool = 0;
298
298
 
299
- constructor(initParams?: { sessionId?: string; history?: MsgHistoryManager; modelId?: string }) {
299
+ constructor(
300
+ private chatFeatureRegistry: ChatFeatureRegistry,
301
+ initParams?: { sessionId?: string; history?: MsgHistoryManager; modelId?: string },
302
+ ) {
300
303
  super();
301
304
  this.#sessionId = initParams?.sessionId ?? uuid();
302
- this.history = initParams?.history ?? new MsgHistoryManager();
305
+ this.history = initParams?.history ?? new MsgHistoryManager(this.chatFeatureRegistry);
303
306
  this.#modelId = initParams?.modelId;
304
307
  }
305
308
 
@@ -336,88 +339,142 @@ export class ChatModel extends Disposable implements IChatModel {
336
339
  this.#modelId = modelId;
337
340
  }
338
341
 
339
- getMessageHistory(contextWindow?: number) {
342
+ private processMemorySummaries(): CoreMessage[] {
343
+ const memorySummaries = this.history.getMemorySummaries();
344
+ if (memorySummaries.length === 0) {
345
+ return [];
346
+ }
347
+
348
+ const processedSummaries = memorySummaries
349
+ .map((summary) => {
350
+ try {
351
+ const parsed = JSON.parse(summary.content);
352
+ return parsed.memory || parsed.content || summary.content;
353
+ } catch {
354
+ return summary.content;
355
+ }
356
+ })
357
+ .filter((content) => content && content !== 'no_memory_needed')
358
+ .filter((content, index, self) => self.indexOf(content) === index);
359
+
360
+ return processedSummaries.length > 0
361
+ ? [
362
+ {
363
+ role: 'system',
364
+ content: '以下是之前对话的总结:\n' + processedSummaries.join('\n\n'),
365
+ },
366
+ ]
367
+ : [];
368
+ }
369
+
370
+ private processToolCall(part: IChatToolContent, history: CoreMessage[]): void {
371
+ if (history[history.length - 1].role !== 'assistant') {
372
+ history.push({
373
+ role: 'assistant',
374
+ content: [],
375
+ });
376
+ }
377
+
378
+ const toolCallId = part.content.id;
379
+ const toolCallInfo = {
380
+ id: toolCallId,
381
+ name: part.content.function.name,
382
+ args: this.parseJsonSafely(part.content.function.arguments || '{}', 'tool call arguments'),
383
+ result: this.parseJsonSafely(part.content.result || '{}', 'tool result'),
384
+ };
385
+
386
+ this.history.addToolCall(toolCallInfo);
387
+ this.history.setMessageAdditional(part.content.id, { toolCallId });
388
+
389
+ const lastMessage = history[history.length - 1];
390
+ lastMessage.content = [
391
+ {
392
+ type: 'tool-call',
393
+ toolCallId: part.content.id,
394
+ toolName: part.content.function.name,
395
+ args: toolCallInfo.args,
396
+ },
397
+ ];
398
+
399
+ history.push({
400
+ role: 'tool',
401
+ content: [
402
+ {
403
+ type: 'tool-result',
404
+ toolCallId: part.content.id,
405
+ toolName: part.content.function.name,
406
+ result: toolCallInfo.result,
407
+ },
408
+ ],
409
+ });
410
+ }
411
+
412
+ private parseJsonSafely(jsonString: string, context: string): any {
413
+ try {
414
+ return JSON.parse(jsonString);
415
+ } catch (e) {
416
+ console.error(`[ChatModel] Failed to parse ${context}:`, e);
417
+ return {};
418
+ }
419
+ }
420
+
421
+ private processRecentMessages(): CoreMessage[] {
340
422
  const history: CoreMessage[] = [];
341
- for (const request of this.requests) {
342
- if (!request.response.isComplete) {
343
- continue;
344
- }
423
+ // MsgHistoryManager 获取消息,并过滤掉已总结的消息
424
+ const recentMessages = this.history
425
+ .getMessages()
426
+ .filter((msg) => !msg.isSummarized)
427
+ .slice(-this.history.memoryConfig.shortTermSize);
428
+
429
+ for (const message of recentMessages) {
345
430
  history.push({
346
431
  role: 'user',
347
- content: request.message.images?.length
348
- ? [
349
- { type: 'text', text: request.message.prompt },
350
- ...request.message.images.map((image) => ({ type: 'image', image: new URL(image) } as ImagePart)),
351
- ]
352
- : request.message.prompt,
432
+ content: message.content,
353
433
  });
354
- for (const part of request.response.responseParts) {
355
- if (part.kind === 'treeData' || part.kind === 'component') {
356
- continue;
357
- }
358
- if (part.kind !== 'toolCall') {
359
- history.push({
360
- role: 'assistant',
361
- content: [
362
- {
363
- type: 'text',
364
- text: part.kind === 'markdownContent' ? part.content.value : part.content,
365
- },
366
- ],
367
- });
434
+
435
+ // 如果有响应内容,添加响应
436
+ const additional = this.history.getMessageAdditional(message.id);
437
+ if (additional?.response) {
438
+ const response = additional.response;
439
+ if (response.kind === 'toolCall') {
440
+ this.processToolCall(response, history);
368
441
  } else {
369
- // 直接开始toolCall场景
370
- if (history[history.length - 1].role !== 'assistant') {
371
- history.push({
372
- role: 'assistant',
373
- content: [],
374
- });
375
- }
376
- (history[history.length - 1].content as Array<TextPart | ToolCallPart>).push({
377
- type: 'tool-call',
378
- toolCallId: part.content.id,
379
- toolName: part.content.function.name,
380
- args: (() => {
381
- try {
382
- return JSON.parse(part.content.function.arguments || '{}');
383
- } catch (e) {
384
- console.error('Failed to parse tool call arguments:', e);
385
- return {};
386
- }
387
- })(),
388
- });
389
442
  history.push({
390
- role: 'tool',
391
- content: [
392
- {
393
- type: 'tool-result',
394
- toolCallId: part.content.id,
395
- toolName: part.content.function.name,
396
- result: (() => {
397
- try {
398
- return JSON.parse(part.content.result || '{}');
399
- } catch (e) {
400
- console.error('Failed to parse tool result:', e);
401
- return {};
402
- }
403
- })(),
404
- },
405
- ],
443
+ role: 'assistant',
444
+ content: response.kind === 'markdownContent' ? response.content.value : response.content,
406
445
  });
407
446
  }
408
447
  }
409
448
  }
410
- if (contextWindow) {
411
- while (this.#slicedMessageCount < history.length) {
412
- // 简单的使用 JSON.stringify 计算 token 数量
413
- const tokenCount = JSON.stringify(history.slice(this.#slicedMessageCount)).length / 3;
414
- if (tokenCount <= contextWindow) {
415
- break;
416
- }
417
- this.#slicedMessageCount++;
449
+
450
+ return history;
451
+ }
452
+
453
+ private limitTokens(history: CoreMessage[], contextWindow?: number): CoreMessage[] {
454
+ if (!contextWindow) {
455
+ return history;
456
+ }
457
+
458
+ let currentHistory = history;
459
+ let tokenCount = JSON.stringify(currentHistory).length / 3;
460
+
461
+ while (tokenCount > contextWindow && currentHistory.length > 1) {
462
+ if (currentHistory[0].role === 'system' && currentHistory.length > 2) {
463
+ currentHistory = [currentHistory[0], ...currentHistory.slice(2)];
464
+ } else {
465
+ currentHistory = currentHistory.slice(1);
418
466
  }
467
+ tokenCount = JSON.stringify(currentHistory).length / 3;
419
468
  }
420
- return history.slice(this.#slicedMessageCount);
469
+
470
+ return currentHistory;
471
+ }
472
+
473
+ getMessageHistory(contextWindow?: number): CoreMessage[] {
474
+ const memorySummaries = this.processMemorySummaries();
475
+ const recentMessages = this.processRecentMessages();
476
+ const history = [...memorySummaries, ...recentMessages];
477
+ return this.limitTokens(history, contextWindow);
421
478
  }
422
479
 
423
480
  addRequest(message: IChatRequestMessage): ChatRequestModel {