@opensumi/ide-ai-native 3.8.1-next-1741228774.0 → 3.8.1-next-1741250387.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 (325) hide show
  1. package/lib/browser/ai-core.contextkeys.d.ts +1 -1
  2. package/lib/browser/ai-core.contextkeys.d.ts.map +1 -1
  3. package/lib/browser/ai-core.contextkeys.js +1 -1
  4. package/lib/browser/ai-core.contextkeys.js.map +1 -1
  5. package/lib/browser/ai-core.contribution.d.ts +0 -5
  6. package/lib/browser/ai-core.contribution.d.ts.map +1 -1
  7. package/lib/browser/ai-core.contribution.js +9 -71
  8. package/lib/browser/ai-core.contribution.js.map +1 -1
  9. package/lib/browser/chat/chat-agent.service.d.ts +3 -11
  10. package/lib/browser/chat/chat-agent.service.d.ts.map +1 -1
  11. package/lib/browser/chat/chat-agent.service.js +5 -43
  12. package/lib/browser/chat/chat-agent.service.js.map +1 -1
  13. package/lib/browser/chat/chat-manager.service.d.ts +0 -1
  14. package/lib/browser/chat/chat-manager.service.d.ts.map +1 -1
  15. package/lib/browser/chat/chat-manager.service.js +8 -6
  16. package/lib/browser/chat/chat-manager.service.js.map +1 -1
  17. package/lib/browser/chat/chat-model.d.ts +1 -4
  18. package/lib/browser/chat/chat-model.d.ts.map +1 -1
  19. package/lib/browser/chat/chat-model.js +2 -57
  20. package/lib/browser/chat/chat-model.js.map +1 -1
  21. package/lib/browser/chat/chat-proxy.service.d.ts.map +1 -1
  22. package/lib/browser/chat/chat-proxy.service.js +6 -13
  23. package/lib/browser/chat/chat-proxy.service.js.map +1 -1
  24. package/lib/browser/chat/chat.api.service.d.ts +2 -1
  25. package/lib/browser/chat/chat.api.service.d.ts.map +1 -1
  26. package/lib/browser/chat/chat.api.service.js +4 -0
  27. package/lib/browser/chat/chat.api.service.js.map +1 -1
  28. package/lib/browser/chat/chat.internal.service.d.ts +0 -2
  29. package/lib/browser/chat/chat.internal.service.d.ts.map +1 -1
  30. package/lib/browser/chat/chat.internal.service.js +0 -3
  31. package/lib/browser/chat/chat.internal.service.js.map +1 -1
  32. package/lib/browser/chat/chat.module.less +2 -1
  33. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  34. package/lib/browser/chat/chat.view.js +29 -46
  35. package/lib/browser/chat/chat.view.js.map +1 -1
  36. package/lib/browser/components/ChatContext/index.js +2 -2
  37. package/lib/browser/components/ChatContext/index.js.map +1 -1
  38. package/lib/browser/components/ChatInput.d.ts.map +1 -1
  39. package/lib/browser/components/ChatInput.js +1 -29
  40. package/lib/browser/components/ChatInput.js.map +1 -1
  41. package/lib/browser/components/ChatReply.js +1 -6
  42. package/lib/browser/components/ChatReply.js.map +1 -1
  43. package/lib/browser/components/ChatThinking.d.ts +2 -0
  44. package/lib/browser/components/ChatThinking.d.ts.map +1 -1
  45. package/lib/browser/components/ChatThinking.js +10 -2
  46. package/lib/browser/components/ChatThinking.js.map +1 -1
  47. package/lib/browser/components/ChatToolRender.d.ts.map +1 -1
  48. package/lib/browser/components/ChatToolRender.js +3 -2
  49. package/lib/browser/components/ChatToolRender.js.map +1 -1
  50. package/lib/browser/components/WelcomeMsg.js +1 -1
  51. package/lib/browser/components/WelcomeMsg.js.map +1 -1
  52. package/lib/browser/components/chat-history.module.less +1 -2
  53. package/lib/browser/components/components.module.less +0 -22
  54. package/lib/browser/context/llm-context.service.d.ts +5 -18
  55. package/lib/browser/context/llm-context.service.d.ts.map +1 -1
  56. package/lib/browser/context/llm-context.service.js +47 -81
  57. package/lib/browser/context/llm-context.service.js.map +1 -1
  58. package/lib/browser/contrib/inline-completions/inline-completions.controller.js +1 -1
  59. package/lib/browser/contrib/inline-completions/inline-completions.controller.js.map +1 -1
  60. package/lib/browser/contrib/inline-completions/prompt/matcher.js +2 -2
  61. package/lib/browser/contrib/inline-completions/prompt/similarSnippets.d.ts +1 -1
  62. package/lib/browser/contrib/inline-completions/prompt/similarSnippets.js +2 -2
  63. package/lib/browser/contrib/intelligent-completions/index.d.ts +1 -2
  64. package/lib/browser/contrib/intelligent-completions/index.d.ts.map +1 -1
  65. package/lib/browser/contrib/intelligent-completions/index.js +1 -4
  66. package/lib/browser/contrib/intelligent-completions/index.js.map +1 -1
  67. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js +2 -2
  68. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js.map +1 -1
  69. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.d.ts.map +1 -1
  70. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js +5 -6
  71. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js.map +1 -1
  72. package/lib/browser/contrib/intelligent-completions/view/code-edits-previewer.d.ts.map +1 -1
  73. package/lib/browser/contrib/intelligent-completions/view/code-edits-previewer.js +2 -4
  74. package/lib/browser/contrib/intelligent-completions/view/code-edits-previewer.js.map +1 -1
  75. package/lib/browser/contrib/intelligent-completions/view/default.d.ts.map +1 -1
  76. package/lib/browser/contrib/intelligent-completions/view/default.js +11 -23
  77. package/lib/browser/contrib/intelligent-completions/view/default.js.map +1 -1
  78. package/lib/browser/index.d.ts.map +1 -1
  79. package/lib/browser/index.js +0 -4
  80. package/lib/browser/index.js.map +1 -1
  81. package/lib/browser/layout/layout.module.less +4 -4
  82. package/lib/browser/mcp/base-apply.service.d.ts +11 -26
  83. package/lib/browser/mcp/base-apply.service.d.ts.map +1 -1
  84. package/lib/browser/mcp/base-apply.service.js +103 -255
  85. package/lib/browser/mcp/base-apply.service.js.map +1 -1
  86. package/lib/browser/mcp/mcp-server-proxy.service.d.ts +0 -6
  87. package/lib/browser/mcp/mcp-server-proxy.service.d.ts.map +1 -1
  88. package/lib/browser/mcp/mcp-server-proxy.service.js +1 -10
  89. package/lib/browser/mcp/mcp-server-proxy.service.js.map +1 -1
  90. package/lib/browser/mcp/mcp-server.feature.registry.d.ts +0 -8
  91. package/lib/browser/mcp/mcp-server.feature.registry.d.ts.map +1 -1
  92. package/lib/browser/mcp/mcp-server.feature.registry.js +3 -28
  93. package/lib/browser/mcp/mcp-server.feature.registry.js.map +1 -1
  94. package/lib/browser/mcp/tools/components/EditFile.d.ts.map +1 -1
  95. package/lib/browser/mcp/tools/components/EditFile.js +9 -15
  96. package/lib/browser/mcp/tools/components/EditFile.js.map +1 -1
  97. package/lib/browser/mcp/tools/components/SearchResult.d.ts +11 -0
  98. package/lib/browser/mcp/tools/components/SearchResult.d.ts.map +1 -0
  99. package/lib/browser/mcp/tools/components/{ExpandableFileList.js → SearchResult.js} +19 -29
  100. package/lib/browser/mcp/tools/components/SearchResult.js.map +1 -0
  101. package/lib/browser/mcp/tools/components/Terminal.d.ts.map +1 -1
  102. package/lib/browser/mcp/tools/components/Terminal.js +2 -10
  103. package/lib/browser/mcp/tools/components/Terminal.js.map +1 -1
  104. package/lib/browser/mcp/tools/components/index.module.less +0 -4
  105. package/lib/browser/mcp/tools/createNewFileWithText.d.ts +0 -1
  106. package/lib/browser/mcp/tools/createNewFileWithText.d.ts.map +1 -1
  107. package/lib/browser/mcp/tools/createNewFileWithText.js +11 -19
  108. package/lib/browser/mcp/tools/createNewFileWithText.js.map +1 -1
  109. package/lib/browser/mcp/tools/fileSearch.d.ts +0 -1
  110. package/lib/browser/mcp/tools/fileSearch.d.ts.map +1 -1
  111. package/lib/browser/mcp/tools/fileSearch.js +5 -14
  112. package/lib/browser/mcp/tools/fileSearch.js.map +1 -1
  113. package/lib/browser/mcp/tools/getDiagnosticsByPath.d.ts.map +1 -1
  114. package/lib/browser/mcp/tools/getDiagnosticsByPath.js +0 -1
  115. package/lib/browser/mcp/tools/getDiagnosticsByPath.js.map +1 -1
  116. package/lib/browser/mcp/tools/grepSearch.d.ts.map +1 -1
  117. package/lib/browser/mcp/tools/grepSearch.js +3 -6
  118. package/lib/browser/mcp/tools/grepSearch.js.map +1 -1
  119. package/lib/browser/mcp/tools/handlers/EditFile.js +1 -1
  120. package/lib/browser/mcp/tools/handlers/EditFile.js.map +1 -1
  121. package/lib/browser/mcp/tools/handlers/ListDir.d.ts +0 -1
  122. package/lib/browser/mcp/tools/handlers/ListDir.d.ts.map +1 -1
  123. package/lib/browser/mcp/tools/handlers/ListDir.js +0 -3
  124. package/lib/browser/mcp/tools/handlers/ListDir.js.map +1 -1
  125. package/lib/browser/mcp/tools/handlers/RunCommand.d.ts.map +1 -1
  126. package/lib/browser/mcp/tools/handlers/RunCommand.js +0 -2
  127. package/lib/browser/mcp/tools/handlers/RunCommand.js.map +1 -1
  128. package/lib/browser/mcp/tools/listDir.d.ts +0 -1
  129. package/lib/browser/mcp/tools/listDir.d.ts.map +1 -1
  130. package/lib/browser/mcp/tools/listDir.js +4 -35
  131. package/lib/browser/mcp/tools/listDir.js.map +1 -1
  132. package/lib/browser/mcp/tools/runTerminalCmd.d.ts.map +1 -1
  133. package/lib/browser/mcp/tools/runTerminalCmd.js +0 -1
  134. package/lib/browser/mcp/tools/runTerminalCmd.js.map +1 -1
  135. package/lib/browser/model/msg-history-manager.d.ts +2 -2
  136. package/lib/browser/model/msg-history-manager.d.ts.map +1 -1
  137. package/lib/browser/model/msg-history-manager.js +10 -4
  138. package/lib/browser/model/msg-history-manager.js.map +1 -1
  139. package/lib/browser/preferences/schema.d.ts.map +1 -1
  140. package/lib/browser/preferences/schema.js +2 -22
  141. package/lib/browser/preferences/schema.js.map +1 -1
  142. package/lib/browser/types.d.ts +0 -4
  143. package/lib/browser/types.d.ts.map +1 -1
  144. package/lib/browser/widget/inline-chat/inline-chat-controller.d.ts.map +1 -1
  145. package/lib/browser/widget/inline-chat/inline-chat-controller.js +1 -6
  146. package/lib/browser/widget/inline-chat/inline-chat-controller.js.map +1 -1
  147. package/lib/browser/widget/inline-diff/inline-diff-manager.d.ts.map +1 -1
  148. package/lib/browser/widget/inline-diff/inline-diff-manager.js +8 -68
  149. package/lib/browser/widget/inline-diff/inline-diff-manager.js.map +1 -1
  150. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts +4 -10
  151. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts.map +1 -1
  152. package/lib/browser/widget/inline-diff/inline-diff-previewer.js +3 -14
  153. package/lib/browser/widget/inline-diff/inline-diff-previewer.js.map +1 -1
  154. package/lib/browser/widget/inline-diff/inline-diff-widget.module.less +4 -25
  155. package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts +3 -3
  156. package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts.map +1 -1
  157. package/lib/browser/widget/inline-diff/inline-diff.controller.js +5 -10
  158. package/lib/browser/widget/inline-diff/inline-diff.controller.js.map +1 -1
  159. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts +17 -46
  160. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts.map +1 -1
  161. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js +53 -110
  162. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js.map +1 -1
  163. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts +0 -4
  164. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts.map +1 -1
  165. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js +1 -26
  166. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js.map +1 -1
  167. package/lib/common/index.d.ts +4 -13
  168. package/lib/common/index.d.ts.map +1 -1
  169. package/lib/common/index.js +1 -5
  170. package/lib/common/index.js.map +1 -1
  171. package/lib/common/llm-context.d.ts +9 -13
  172. package/lib/common/llm-context.d.ts.map +1 -1
  173. package/lib/common/llm-context.js.map +1 -1
  174. package/lib/common/mcp-server-manager.d.ts +1 -17
  175. package/lib/common/mcp-server-manager.d.ts.map +1 -1
  176. package/lib/common/mcp-server-manager.js.map +1 -1
  177. package/lib/common/prompts/context-prompt-provider.d.ts +3 -4
  178. package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
  179. package/lib/common/prompts/context-prompt-provider.js +22 -33
  180. package/lib/common/prompts/context-prompt-provider.js.map +1 -1
  181. package/lib/common/tool-invocation-registry.d.ts +2 -2
  182. package/lib/common/tool-invocation-registry.d.ts.map +1 -1
  183. package/lib/common/tool-invocation-registry.js +1 -1
  184. package/lib/common/tool-invocation-registry.js.map +1 -1
  185. package/lib/common/types.d.ts +0 -8
  186. package/lib/common/types.d.ts.map +1 -1
  187. package/lib/common/utils.d.ts.map +1 -1
  188. package/lib/common/utils.js +1 -2
  189. package/lib/common/utils.js.map +1 -1
  190. package/lib/node/anthropic/anthropic-language-model.d.ts +1 -3
  191. package/lib/node/anthropic/anthropic-language-model.d.ts.map +1 -1
  192. package/lib/node/anthropic/anthropic-language-model.js +2 -6
  193. package/lib/node/anthropic/anthropic-language-model.js.map +1 -1
  194. package/lib/node/base-language-model.d.ts +3 -6
  195. package/lib/node/base-language-model.d.ts.map +1 -1
  196. package/lib/node/base-language-model.js +31 -14
  197. package/lib/node/base-language-model.js.map +1 -1
  198. package/lib/node/deepseek/deepseek-language-model.d.ts +1 -3
  199. package/lib/node/deepseek/deepseek-language-model.d.ts.map +1 -1
  200. package/lib/node/deepseek/deepseek-language-model.js +2 -6
  201. package/lib/node/deepseek/deepseek-language-model.js.map +1 -1
  202. package/lib/node/mcp/sumi-mcp-server.d.ts +3 -17
  203. package/lib/node/mcp/sumi-mcp-server.d.ts.map +1 -1
  204. package/lib/node/mcp/sumi-mcp-server.js +6 -59
  205. package/lib/node/mcp/sumi-mcp-server.js.map +1 -1
  206. package/lib/node/mcp-server-manager-impl.d.ts +3 -4
  207. package/lib/node/mcp-server-manager-impl.d.ts.map +1 -1
  208. package/lib/node/mcp-server-manager-impl.js +6 -26
  209. package/lib/node/mcp-server-manager-impl.js.map +1 -1
  210. package/lib/node/mcp-server.d.ts +16 -5
  211. package/lib/node/mcp-server.d.ts.map +1 -1
  212. package/lib/node/mcp-server.js +6 -12
  213. package/lib/node/mcp-server.js.map +1 -1
  214. package/lib/node/openai/openai-language-model.d.ts +2 -4
  215. package/lib/node/openai/openai-language-model.d.ts.map +1 -1
  216. package/lib/node/openai/openai-language-model.js +4 -6
  217. package/lib/node/openai/openai-language-model.js.map +1 -1
  218. package/package.json +26 -27
  219. package/src/browser/ai-core.contextkeys.ts +3 -3
  220. package/src/browser/ai-core.contribution.ts +12 -89
  221. package/src/browser/chat/chat-agent.service.ts +9 -53
  222. package/src/browser/chat/chat-manager.service.ts +8 -10
  223. package/src/browser/chat/chat-model.ts +5 -63
  224. package/src/browser/chat/chat-proxy.service.ts +8 -16
  225. package/src/browser/chat/chat.api.service.ts +5 -1
  226. package/src/browser/chat/chat.internal.service.ts +0 -4
  227. package/src/browser/chat/chat.module.less +2 -1
  228. package/src/browser/chat/chat.view.tsx +69 -63
  229. package/src/browser/components/ChatContext/index.tsx +2 -2
  230. package/src/browser/components/ChatInput.tsx +6 -81
  231. package/src/browser/components/ChatReply.tsx +6 -6
  232. package/src/browser/components/ChatThinking.tsx +9 -3
  233. package/src/browser/components/ChatToolRender.tsx +2 -1
  234. package/src/browser/components/WelcomeMsg.tsx +1 -1
  235. package/src/browser/components/chat-history.module.less +1 -2
  236. package/src/browser/components/components.module.less +0 -22
  237. package/src/browser/context/llm-context.service.ts +54 -100
  238. package/src/browser/contrib/inline-completions/inline-completions.controller.ts +1 -1
  239. package/src/browser/contrib/inline-completions/prompt/matcher.ts +2 -2
  240. package/src/browser/contrib/inline-completions/prompt/similarSnippets.ts +2 -2
  241. package/src/browser/contrib/intelligent-completions/index.ts +1 -5
  242. package/src/browser/contrib/intelligent-completions/intelligent-completions.contribution.ts +3 -3
  243. package/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +6 -7
  244. package/src/browser/contrib/intelligent-completions/view/code-edits-previewer.ts +2 -4
  245. package/src/browser/contrib/intelligent-completions/view/default.ts +19 -34
  246. package/src/browser/index.ts +0 -4
  247. package/src/browser/layout/layout.module.less +4 -4
  248. package/src/browser/mcp/base-apply.service.ts +109 -306
  249. package/src/browser/mcp/mcp-server-proxy.service.ts +2 -14
  250. package/src/browser/mcp/mcp-server.feature.registry.ts +4 -35
  251. package/src/browser/mcp/tools/components/EditFile.tsx +9 -16
  252. package/src/browser/mcp/tools/components/SearchResult.tsx +92 -0
  253. package/src/browser/mcp/tools/components/Terminal.tsx +2 -13
  254. package/src/browser/mcp/tools/components/index.module.less +0 -4
  255. package/src/browser/mcp/tools/createNewFileWithText.ts +12 -21
  256. package/src/browser/mcp/tools/fileSearch.ts +4 -14
  257. package/src/browser/mcp/tools/getDiagnosticsByPath.ts +0 -1
  258. package/src/browser/mcp/tools/grepSearch.ts +3 -6
  259. package/src/browser/mcp/tools/handlers/EditFile.ts +1 -1
  260. package/src/browser/mcp/tools/handlers/ListDir.ts +0 -4
  261. package/src/browser/mcp/tools/handlers/RunCommand.ts +0 -2
  262. package/src/browser/mcp/tools/listDir.ts +5 -36
  263. package/src/browser/mcp/tools/runTerminalCmd.ts +0 -1
  264. package/src/browser/model/msg-history-manager.ts +11 -5
  265. package/src/browser/preferences/schema.ts +2 -22
  266. package/src/browser/types.ts +0 -1
  267. package/src/browser/widget/inline-chat/inline-chat-controller.ts +1 -5
  268. package/src/browser/widget/inline-diff/inline-diff-manager.tsx +21 -143
  269. package/src/browser/widget/inline-diff/inline-diff-previewer.ts +7 -25
  270. package/src/browser/widget/inline-diff/inline-diff-widget.module.less +4 -25
  271. package/src/browser/widget/inline-diff/inline-diff.controller.ts +8 -16
  272. package/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +68 -139
  273. package/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +1 -30
  274. package/src/common/index.ts +4 -15
  275. package/src/common/llm-context.ts +4 -10
  276. package/src/common/mcp-server-manager.ts +1 -17
  277. package/src/common/prompts/context-prompt-provider.ts +29 -38
  278. package/src/common/tool-invocation-registry.ts +2 -2
  279. package/src/common/types.ts +0 -8
  280. package/src/common/utils.ts +1 -3
  281. package/src/node/anthropic/anthropic-language-model.ts +2 -7
  282. package/src/node/base-language-model.ts +38 -25
  283. package/src/node/deepseek/deepseek-language-model.ts +2 -7
  284. package/src/node/mcp/sumi-mcp-server.ts +9 -67
  285. package/src/node/mcp-server-manager-impl.ts +9 -30
  286. package/src/node/mcp-server.ts +14 -11
  287. package/src/node/openai/openai-language-model.ts +4 -8
  288. package/lib/browser/mcp/config/components/mcp-config.module.less +0 -178
  289. package/lib/browser/mcp/config/components/mcp-config.view.d.ts +0 -3
  290. package/lib/browser/mcp/config/components/mcp-config.view.d.ts.map +0 -1
  291. package/lib/browser/mcp/config/components/mcp-config.view.js +0 -150
  292. package/lib/browser/mcp/config/components/mcp-config.view.js.map +0 -1
  293. package/lib/browser/mcp/config/components/mcp-server-form.d.ts +0 -16
  294. package/lib/browser/mcp/config/components/mcp-server-form.d.ts.map +0 -1
  295. package/lib/browser/mcp/config/components/mcp-server-form.js +0 -84
  296. package/lib/browser/mcp/config/components/mcp-server-form.js.map +0 -1
  297. package/lib/browser/mcp/config/components/mcp-server-form.module.less +0 -78
  298. package/lib/browser/mcp/config/mcp-config.commands.d.ts +0 -10
  299. package/lib/browser/mcp/config/mcp-config.commands.d.ts.map +0 -1
  300. package/lib/browser/mcp/config/mcp-config.commands.js +0 -35
  301. package/lib/browser/mcp/config/mcp-config.commands.js.map +0 -1
  302. package/lib/browser/mcp/config/mcp-config.contribution.d.ts +0 -16
  303. package/lib/browser/mcp/config/mcp-config.contribution.d.ts.map +0 -1
  304. package/lib/browser/mcp/config/mcp-config.contribution.js +0 -62
  305. package/lib/browser/mcp/config/mcp-config.contribution.js.map +0 -1
  306. package/lib/browser/mcp/tools/components/ExpandableFileList.d.ts +0 -13
  307. package/lib/browser/mcp/tools/components/ExpandableFileList.d.ts.map +0 -1
  308. package/lib/browser/mcp/tools/components/ExpandableFileList.js.map +0 -1
  309. package/lib/common/model.d.ts +0 -12
  310. package/lib/common/model.d.ts.map +0 -1
  311. package/lib/common/model.js +0 -83
  312. package/lib/common/model.js.map +0 -1
  313. package/lib/node/openai-compatible/openai-compatible-language-model.d.ts +0 -10
  314. package/lib/node/openai-compatible/openai-compatible-language-model.d.ts.map +0 -1
  315. package/lib/node/openai-compatible/openai-compatible-language-model.js +0 -32
  316. package/lib/node/openai-compatible/openai-compatible-language-model.js.map +0 -1
  317. package/src/browser/mcp/config/components/mcp-config.module.less +0 -178
  318. package/src/browser/mcp/config/components/mcp-config.view.tsx +0 -215
  319. package/src/browser/mcp/config/components/mcp-server-form.module.less +0 -78
  320. package/src/browser/mcp/config/components/mcp-server-form.tsx +0 -144
  321. package/src/browser/mcp/config/mcp-config.commands.ts +0 -29
  322. package/src/browser/mcp/config/mcp-config.contribution.ts +0 -65
  323. package/src/browser/mcp/tools/components/ExpandableFileList.tsx +0 -133
  324. package/src/common/model.ts +0 -90
  325. package/src/node/openai-compatible/openai-compatible-language-model.ts +0 -30
@@ -1,8 +1,7 @@
1
1
  // OpenSumi as MCP Server 前端的代理服务
2
2
  import { Autowired, Injectable } from '@opensumi/di';
3
- import { AIServiceType, IAIReporter, ILogger } from '@opensumi/ide-core-common';
3
+ import { ILogger } from '@opensumi/ide-core-common';
4
4
 
5
- import { BUILTIN_MCP_SERVER_NAME } from '../../common';
6
5
  import { getToolName } from '../../common/utils';
7
6
  import { IMCPServerRegistry, IMCPServerToolComponentProps, MCPLogger, MCPToolDefinition } from '../types';
8
7
 
@@ -19,27 +18,14 @@ export class MCPServerRegistry implements IMCPServerRegistry {
19
18
  private tools: MCPToolDefinition[] = [];
20
19
  private toolComponents: Record<string, React.FC<IMCPServerToolComponentProps>> = {};
21
20
 
22
- private _activeMessageInfo: {
23
- messageId: string;
24
- sessionId: string;
25
- };
26
-
27
21
  @Autowired(ILogger)
28
22
  private readonly baseLogger: ILogger;
29
23
 
30
- @Autowired(IAIReporter)
31
- private readonly aiReporter: IAIReporter;
32
-
33
24
  private get logger(): MCPLogger {
34
25
  return new LoggerAdapter(this.baseLogger);
35
26
  }
36
27
 
37
- /** 设置当前活跃的消息信息,便于toolCall打点 */
38
- set activeMessageInfo(params: { messageId: string; sessionId: string }) {
39
- this._activeMessageInfo = params;
40
- }
41
-
42
- getMCPTool(name: string, serverName = BUILTIN_MCP_SERVER_NAME): MCPToolDefinition | undefined {
28
+ getMCPTool(name: string, serverName = 'sumi-builtin'): MCPToolDefinition | undefined {
43
29
  return this.tools.find((tool) => getToolName(tool.name, serverName) === name);
44
30
  }
45
31
 
@@ -50,7 +36,7 @@ export class MCPServerRegistry implements IMCPServerRegistry {
50
36
  registerToolComponent(
51
37
  name: string,
52
38
  component: React.FC<IMCPServerToolComponentProps>,
53
- serverName = BUILTIN_MCP_SERVER_NAME,
39
+ serverName = 'sumi-builtin',
54
40
  ): void {
55
41
  this.toolComponents[getToolName(name, serverName)] = component;
56
42
  }
@@ -78,31 +64,14 @@ export class MCPServerRegistry implements IMCPServerRegistry {
78
64
  // 统一校验并转换
79
65
  const toolCallId = args.toolCallId;
80
66
  args = tool.inputSchema.parse(args);
81
- const result = await tool.handler({ ...args, toolCallId }, this.logger);
82
- this.reportToolCall(name, args, result, toolCallId);
83
- return result;
67
+ return await tool.handler({ ...args, toolCallId }, this.logger);
84
68
  } catch (error) {
85
69
  // eslint-disable-next-line no-console
86
70
  console.error('callMCPTool error:', error);
87
- this.reportToolCall(name, args, error, args.toolCallId);
88
71
  return {
89
72
  content: [{ type: 'text', text: `The tool ${name} failed to execute. Error: ${error}` }],
90
73
  isError: true,
91
74
  };
92
75
  }
93
76
  }
94
-
95
- private reportToolCall(name: string, args: any, result: any, toolCallId: string) {
96
- const tool = this.tools.find((tool) => tool.name === name);
97
- if (!tool) {
98
- throw new Error(`MCP tool ${name} not found`);
99
- }
100
- this.aiReporter.send({
101
- msgType: AIServiceType.ToolCall,
102
- message: JSON.stringify({ args, name, result }),
103
- messageId: this._activeMessageInfo.messageId,
104
- sessionId: this._activeMessageInfo.sessionId,
105
- relationId: toolCallId,
106
- });
107
- }
108
77
  }
@@ -13,7 +13,6 @@ import {
13
13
  useInjectable,
14
14
  } from '@opensumi/ide-core-browser';
15
15
  import { Loading } from '@opensumi/ide-core-browser/lib/components/ai-native';
16
- import { WorkbenchEditorService } from '@opensumi/ide-editor';
17
16
  import { ILanguageService } from '@opensumi/monaco-editor-core/esm/vs/editor/common/languages/language';
18
17
  import { IModelService } from '@opensumi/monaco-editor-core/esm/vs/editor/common/services/model';
19
18
  import { StandaloneServices } from '@opensumi/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices';
@@ -31,7 +30,6 @@ export const EditFileToolComponent = (props: IMCPServerToolComponentProps) => {
31
30
  const labelService = useInjectable(LabelService);
32
31
  const appConfig = useInjectable<AppConfig>(AppConfig);
33
32
  const applyService = useInjectable<BaseApplyService>(BaseApplyService);
34
- const editorService = useInjectable<WorkbenchEditorService>(WorkbenchEditorService);
35
33
  const { target_file = '', code_edit, instructions } = args || {};
36
34
  const absolutePath = path.join(appConfig.workspaceDir, target_file);
37
35
  const [codeBlockData, setCodeBlockData] = useState<CodeBlockData | undefined>(
@@ -57,20 +55,15 @@ export const EditFileToolComponent = (props: IMCPServerToolComponentProps) => {
57
55
 
58
56
  useEffect(() => {
59
57
  const disposable = applyService.onCodeBlockUpdate((codeBlockData) => {
60
- if (codeBlockData.toolCallId === toolCallId) {
61
- setCodeBlockData({ ...codeBlockData });
62
- }
58
+ setCodeBlockData({ ...codeBlockData });
63
59
  });
64
60
  return () => {
65
61
  disposable.dispose();
66
62
  };
67
63
  }, []);
68
64
 
69
- const handleToggleMode = (e: React.MouseEvent<HTMLDivElement>) => {
70
- e.stopPropagation();
71
- setMode(mode === 'code' ? 'diff' : 'code');
72
- };
73
-
65
+ // 多次迭代时,仅在首处tool组件中展示
66
+ // FIXME: 这个优化有必要吗?每次都展示也挺好?
74
67
  if (!args || !codeBlockData) {
75
68
  return null;
76
69
  }
@@ -84,7 +77,7 @@ export const EditFileToolComponent = (props: IMCPServerToolComponentProps) => {
84
77
  })}
85
78
  onClick={() => {
86
79
  if (codeBlockData.status === 'pending') {
87
- editorService.open(URI.file(absolutePath));
80
+ applyService.renderApplyResult(codeBlockData, codeBlockData.updatedCode!);
88
81
  } else if (codeBlockData.status === 'success') {
89
82
  applyService.revealApplyPosition(codeBlockData);
90
83
  }
@@ -96,15 +89,15 @@ export const EditFileToolComponent = (props: IMCPServerToolComponentProps) => {
96
89
  {codeBlockData.iterationCount > 1 && (
97
90
  <span className={styles['edit-file-tool-iteration-count']}>{codeBlockData.iterationCount}/3</span>
98
91
  )}
99
- {renderStatus(codeBlockData, props.result)}
92
+ {renderStatus(codeBlockData)}
100
93
  </div>
101
94
  <div className={styles.right}>
102
95
  <Popover title={'Show Code'} id={'edit-file-tool-show-code'}>
103
- <Icon iconClass='codicon codicon-file-code' onClick={handleToggleMode} />
96
+ <Icon iconClass='codicon codicon-file-code' onClick={() => setMode('code')} />
104
97
  </Popover>
105
98
  {codeBlockData.applyResult?.diff && (
106
99
  <Popover title={'Show Diff'} id={'edit-file-tool-show-diff'}>
107
- <Icon iconClass='codicon codicon-diff-multiple' onClick={handleToggleMode} />
100
+ <Icon iconClass='codicon codicon-diff-multiple' onClick={() => setMode('diff')} />
108
101
  </Popover>
109
102
  )}
110
103
  </div>
@@ -138,7 +131,7 @@ export const EditFileToolComponent = (props: IMCPServerToolComponentProps) => {
138
131
  ];
139
132
  };
140
133
 
141
- const renderStatus = (codeBlockData: CodeBlockData, error?: string) => {
134
+ const renderStatus = (codeBlockData: CodeBlockData) => {
142
135
  const status = codeBlockData.status;
143
136
  switch (status) {
144
137
  case 'generating':
@@ -157,7 +150,7 @@ const renderStatus = (codeBlockData: CodeBlockData, error?: string) => {
157
150
  );
158
151
  case 'failed':
159
152
  return (
160
- <Popover title={`Failed (${error})`} id={'edit-file-tool-status-failed'}>
153
+ <Popover title='Failed' id={'edit-file-tool-status-failed'}>
161
154
  <Icon iconClass='codicon codicon-error' style={{ color: 'var(--debugConsole-errorForeground)' }} />
162
155
  </Popover>
163
156
  );
@@ -0,0 +1,92 @@
1
+ import React, { useEffect, useMemo, useState } from 'react';
2
+
3
+ import { LabelService, URI, path, useInjectable } from '@opensumi/ide-core-browser';
4
+ import { WorkbenchEditorService } from '@opensumi/ide-editor';
5
+ import { IWorkspaceService } from '@opensumi/ide-workspace';
6
+
7
+ import { IChatInternalService } from '../../../../common';
8
+ import { ChatInternalService } from '../../../chat/chat.internal.service';
9
+
10
+ import styles from './index.module.less';
11
+
12
+ interface SearchResultProps {
13
+ args: any;
14
+ toolCallId: string;
15
+ messageId: string;
16
+ toolName: string;
17
+ }
18
+
19
+ export const FileSearchToolComponent: React.FC<SearchResultProps> = ({ args, toolCallId, messageId }) => (
20
+ <SearchResult args={args} toolCallId={toolCallId} messageId={messageId} toolName='fileSearch' />
21
+ );
22
+
23
+ export const GrepSearchToolComponent: React.FC<SearchResultProps> = ({ args, toolCallId, messageId }) => (
24
+ <SearchResult args={args} toolCallId={toolCallId} messageId={messageId} toolName='grepSearch' />
25
+ );
26
+
27
+ const SearchResult: React.FC<SearchResultProps> = ({ args, toolCallId, toolName, messageId }) => {
28
+ const [isExpanded, setIsExpanded] = useState(false);
29
+ const labelService = useInjectable<LabelService>(LabelService);
30
+ const editorService = useInjectable<WorkbenchEditorService>(WorkbenchEditorService);
31
+ const workspaceService = useInjectable<IWorkspaceService>(IWorkspaceService);
32
+ const workspaceRoot = useMemo(() => URI.parse(workspaceService.tryGetRoots()?.[0]?.uri), []);
33
+
34
+ const chatService = useInjectable<ChatInternalService>(IChatInternalService);
35
+ const [files, setFiles] = useState<string[]>(
36
+ chatService.sessionModel.history.getMessageAdditional(messageId)?.[toolCallId]?.files || [],
37
+ );
38
+ useEffect(() => {
39
+ const toDispose = chatService.sessionModel.history.onMessageAdditionalChange((additional) => {
40
+ setFiles(additional[toolCallId]?.files || []);
41
+ });
42
+ return () => {
43
+ toDispose.dispose();
44
+ };
45
+ }, []);
46
+
47
+ const handleFileClick = (uri: URI) => {
48
+ // 处理文件点击跳转
49
+ editorService.open(uri);
50
+ };
51
+
52
+ const parsedFiles = useMemo(
53
+ () =>
54
+ files.map((file) => {
55
+ const uri = URI.parse(file);
56
+ const iconClass = labelService.getIcon(uri);
57
+ return {
58
+ iconClass,
59
+ name: uri.path.base,
60
+ path: path.relative(workspaceRoot.codeUri.fsPath, uri.path.dir.toString()),
61
+ };
62
+ }),
63
+ [files],
64
+ );
65
+
66
+ return (
67
+ <div className={styles.container}>
68
+ <div className={styles.header} onClick={() => setIsExpanded(!isExpanded)}>
69
+ <span style={{ transform: `rotate(${isExpanded ? '90deg' : '0deg'})` }}>▶</span>
70
+ <span>
71
+ {toolName === 'fileSearch' ? `Searched files "${args.query}"` : `Grepped codebase "${args.query}"`} ·{' '}
72
+ {files.length} files
73
+ </span>
74
+ </div>
75
+ {isExpanded && (
76
+ <ul className={styles.fileList}>
77
+ {parsedFiles.map((file, index) => (
78
+ <li
79
+ key={index}
80
+ className={styles.fileItem}
81
+ onClick={() => handleFileClick(URI.file(path.join(workspaceRoot.codeUri.fsPath, file.path, file.name)))}
82
+ >
83
+ <span className={file.iconClass}></span>
84
+ <span style={{ flex: 1 }}>{file.name}</span>
85
+ <span className={styles.filePath}>{file.path}</span>
86
+ </li>
87
+ ))}
88
+ </ul>
89
+ )}
90
+ </div>
91
+ );
92
+ };
@@ -3,7 +3,6 @@ import React, { memo, useCallback, useMemo, useState } from 'react';
3
3
  import { useInjectable } from '@opensumi/ide-core-browser';
4
4
  import { Button, Icon } from '@opensumi/ide-core-browser/lib/components';
5
5
  import { localize } from '@opensumi/ide-core-common';
6
- import { stripAnsi } from '@opensumi/ide-utils/lib/ansi';
7
6
 
8
7
  import { IMCPServerToolComponentProps } from '../../../types';
9
8
  import { RunCommandHandler } from '../handlers/RunCommand';
@@ -59,23 +58,13 @@ export const TerminalToolComponent = memo((props: IMCPServerToolComponentProps)
59
58
  <div className={styles.run_cmd_tool}>
60
59
  {props.state === 'result' && (
61
60
  <div>
62
- {args && (
63
- <>
64
- <div className={styles.command_title}>
65
- <Icon icon='terminal' />
66
- <span>{localize('ai.native.mcp.terminal.command')}</span>
67
- </div>
68
- <p className={styles.command_content}>
69
- <code>$ {args.command}</code>
70
- </p>
71
- </>
72
- )}
73
61
  <div className={styles.command_title}>
62
+ <Icon icon='terminal' />
74
63
  <span>{localize('ai.native.mcp.terminal.output')}</span>
75
64
  </div>
76
65
  {output ? (
77
66
  <div className={styles.command_content}>
78
- <code>{stripAnsi(output.text)}</code>
67
+ <code>{output.text}</code>
79
68
  </div>
80
69
  ) : (
81
70
  ''
@@ -17,9 +17,6 @@
17
17
  align-items: center;
18
18
  justify-content: center;
19
19
  }
20
- .left {
21
- overflow: hidden;
22
- }
23
20
  .left,
24
21
  .right {
25
22
  display: flex;
@@ -157,7 +154,6 @@
157
154
  background-color: var(--design-chatInput-background);
158
155
  padding: 10px;
159
156
  border-radius: 4px;
160
- margin: 10px 0px;
161
157
 
162
158
  .command_title {
163
159
  display: flex;
@@ -6,13 +6,10 @@ import { IFileServiceClient } from '@opensumi/ide-file-service';
6
6
  import { IWorkspaceService } from '@opensumi/ide-workspace';
7
7
 
8
8
  import { IMCPServerRegistry, MCPLogger, MCPServerContribution, MCPToolDefinition } from '../../types';
9
- import { BaseApplyService } from '../base-apply.service';
10
-
11
- import { EditFileToolComponent } from './components/EditFile';
12
9
 
13
10
  const inputSchema = z.object({
14
- target_file: z.string().describe('The relative path where the file should be created'),
15
- code_edit: z.string().describe('The content to write into the new file'),
11
+ pathInProject: z.string().describe('The relative path where the file should be created'),
12
+ text: z.string().describe('The content to write into the new file'),
16
13
  });
17
14
 
18
15
  @Domain(MCPServerContribution)
@@ -23,31 +20,29 @@ export class CreateNewFileWithTextTool implements MCPServerContribution {
23
20
  @Autowired(IFileServiceClient)
24
21
  private readonly fileService: IFileServiceClient;
25
22
 
26
- @Autowired(BaseApplyService)
27
- private applyService: BaseApplyService;
28
-
29
23
  registerMCPServer(registry: IMCPServerRegistry): void {
30
24
  registry.registerMCPTool(this.getToolDefinition());
31
- registry.registerToolComponent('create_new_file_with_text', EditFileToolComponent);
32
25
  }
33
26
 
34
27
  getToolDefinition(): MCPToolDefinition {
35
28
  return {
36
29
  name: 'create_new_file_with_text',
37
- label: 'Create File',
38
30
  description:
39
31
  'Creates a new file at the specified path within the project directory and populates it with the provided text. ' +
40
32
  'Use this tool to generate new files in your project structure. ' +
33
+ 'Requires two parameters: ' +
34
+ '- pathInProject: The relative path where the file should be created ' +
35
+ '- text: The content to write into the new file ' +
41
36
  'Returns one of two possible responses: ' +
42
37
  '"ok" if the file was successfully created and populated, ' +
43
38
  '"can\'t find project dir" if the project directory cannot be determined. ' +
44
- 'Note: This tool creates any necessary parent directories automatically.',
39
+ 'Note: Creates any necessary parent directories automatically.',
45
40
  inputSchema,
46
41
  handler: this.handler.bind(this),
47
42
  };
48
43
  }
49
44
 
50
- private async handler(args: z.infer<typeof inputSchema> & { toolCallId: string }, logger: MCPLogger) {
45
+ private async handler(args: z.infer<typeof inputSchema>, logger: MCPLogger) {
51
46
  try {
52
47
  // 获取工作区根目录
53
48
  const workspaceRoots = this.workspaceService.tryGetRoots();
@@ -61,7 +56,7 @@ export class CreateNewFileWithTextTool implements MCPServerContribution {
61
56
 
62
57
  // 构建完整的文件路径
63
58
  const rootUri = URI.parse(workspaceRoots[0].uri);
64
- const fullPath = path.join(rootUri.codeUri.fsPath, args.target_file);
59
+ const fullPath = path.join(rootUri.codeUri.fsPath, args.pathInProject);
65
60
  const fileUri = URI.file(fullPath);
66
61
 
67
62
  // 创建父目录
@@ -69,21 +64,17 @@ export class CreateNewFileWithTextTool implements MCPServerContribution {
69
64
  const parentUri = URI.file(parentDir);
70
65
  await this.fileService.createFolder(parentUri.toString());
71
66
 
72
- // 创建文件
73
- await this.fileService.createFile(fileUri.toString());
74
-
75
- // 使用 applyService 写入文件内容
76
- const codeBlock = await this.applyService.registerCodeBlock(args.target_file, args.code_edit, args.toolCallId);
77
- await this.applyService.apply(codeBlock);
67
+ // 写入文件内容
68
+ await this.fileService.createFile(fileUri.toString(), { content: args.text });
78
69
 
79
- logger.appendLine(`Successfully created file at: ${args.target_file}`);
70
+ logger.appendLine(`Successfully created file at: ${args.pathInProject}`);
80
71
  return {
81
72
  content: [{ type: 'text', text: 'ok' }],
82
73
  };
83
74
  } catch (error) {
84
75
  logger.appendLine(`Error during file creation: ${error}`);
85
76
  return {
86
- content: [{ type: 'text', text: error.message }],
77
+ content: [{ type: 'text', text: 'unknown error' }],
87
78
  isError: true,
88
79
  };
89
80
  }
@@ -1,7 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
3
  import { Autowired } from '@opensumi/di';
4
- import { getValidateInput } from '@opensumi/ide-addons/lib/browser/file-search.contribution';
5
4
  import { Domain, URI } from '@opensumi/ide-core-common';
6
5
  import { FileSearchServicePath, IFileSearchService } from '@opensumi/ide-file-search/lib/common';
7
6
  import { IWorkspaceService } from '@opensumi/ide-workspace';
@@ -10,7 +9,7 @@ import { IChatInternalService } from '../../../common';
10
9
  import { ChatInternalService } from '../../chat/chat.internal.service';
11
10
  import { IMCPServerRegistry, MCPLogger, MCPServerContribution, MCPToolDefinition } from '../../types';
12
11
 
13
- import { FileSearchToolComponent } from './components/ExpandableFileList';
12
+ import { FileSearchToolComponent } from './components/SearchResult';
14
13
 
15
14
  const inputSchema = z.object({
16
15
  query: z.string().describe('Fuzzy filename to search for'),
@@ -59,7 +58,7 @@ export class FileSearchTool implements MCPServerContribution {
59
58
  }
60
59
 
61
60
  // 使用 OpenSumi 的文件搜索 API
62
- const searchPattern = this.normalizeQuery(args.query);
61
+ const searchPattern = args.query;
63
62
  const searchResults = await this.fileSearchService.find(searchPattern, {
64
63
  rootUris: [new URI(workspaceRoots[0].uri).codeUri.fsPath],
65
64
  // TODO: 忽略配置
@@ -72,10 +71,7 @@ export class FileSearchTool implements MCPServerContribution {
72
71
 
73
72
  const files = searchResults.slice(0, MAX_RESULTS).map((file) => {
74
73
  const uri = URI.parse(file);
75
- return {
76
- uri: uri.codeUri.fsPath,
77
- isDirectory: false, // 文件搜索结果都是文件
78
- };
74
+ return uri.codeUri.fsPath;
79
75
  });
80
76
 
81
77
  const messages = this.chatInternalService.sessionModel.history.getMessages();
@@ -91,7 +87,7 @@ export class FileSearchTool implements MCPServerContribution {
91
87
  content: [
92
88
  {
93
89
  type: 'text',
94
- text: `${files.map((f) => f.uri).join('\n')}\n${
90
+ text: `${files.join('\n')}\n${
95
91
  searchResults.length > MAX_RESULTS
96
92
  ? `\nFound ${searchResults.length} files matching "${args.query}", only return the first ${MAX_RESULTS} results`
97
93
  : ''
@@ -100,10 +96,4 @@ export class FileSearchTool implements MCPServerContribution {
100
96
  ],
101
97
  };
102
98
  }
103
-
104
- private normalizeQuery(query: string): string {
105
- const nonBlank = query.trim().replace(/\s/g, '');
106
- const validated = getValidateInput(nonBlank);
107
- return validated;
108
- }
109
99
  }
@@ -29,7 +29,6 @@ export class GetDiagnosticsByPathTool implements MCPServerContribution {
29
29
  getToolDefinition(): MCPToolDefinition {
30
30
  return {
31
31
  name: 'get_diagnostics_by_path',
32
- label: 'Get Diagnostics',
33
32
  description:
34
33
  'Retrieves diagnostic information (errors, warnings, etc.) from a specific file in the project. ' +
35
34
  'Use this tool to get information about problems in any project file. ' +
@@ -10,7 +10,7 @@ import { IChatInternalService } from '../../../common';
10
10
  import { ChatInternalService } from '../../chat/chat.internal.service';
11
11
  import { IMCPServerRegistry, MCPLogger, MCPServerContribution, MCPToolDefinition } from '../../types';
12
12
 
13
- import { GrepSearchToolComponent } from './components/ExpandableFileList';
13
+ import { GrepSearchToolComponent } from './components/SearchResult';
14
14
 
15
15
  const inputSchema = z.object({
16
16
  query: z.string().describe('The regex pattern to search for'),
@@ -90,7 +90,7 @@ export class GrepSearchTool implements MCPServerContribution {
90
90
  return;
91
91
  }
92
92
  const results: string[] = [];
93
- const files: Array<{ uri: string; isDirectory: boolean }> = [];
93
+ const files: string[] = [];
94
94
  for (const [fileUri, result] of this.searchService.searchResults.entries()) {
95
95
  results.push(
96
96
  `File: ${fileUri}\n${result
@@ -103,10 +103,7 @@ export class GrepSearchTool implements MCPServerContribution {
103
103
  .map((r) => `Line: ${r.line}\nContent: ${r.lineText || r.renderLineText}`)
104
104
  .join('\n')}`,
105
105
  );
106
- files.push({
107
- uri: fileUri,
108
- isDirectory: false, // grep 搜索结果都是文件
109
- });
106
+ files.push(fileUri);
110
107
  }
111
108
  deferred.resolve(results.join('\n\n'));
112
109
  const messages = this.chatInternalService.sessionModel.history.getMessages();
@@ -14,7 +14,7 @@ export class EditFileHandler {
14
14
 
15
15
  async handler(params: { targetFile: string; codeEdit: string; instructions?: string }, toolCallId: string) {
16
16
  const { targetFile, codeEdit } = params;
17
- const block = await this.applyService.registerCodeBlock(targetFile, codeEdit, toolCallId);
17
+ const block = this.applyService.registerCodeBlock(targetFile, codeEdit, toolCallId);
18
18
  const blockData = await this.applyService.apply(block);
19
19
  return blockData;
20
20
  }
@@ -56,10 +56,6 @@ export class ListDirHandler {
56
56
  @Autowired(IFileServiceClient)
57
57
  private readonly fileSystemService: IFileServiceClient;
58
58
 
59
- getWorkspaceDir(): string {
60
- return this.appConfig.workspaceDir;
61
- }
62
-
63
59
  async handler(args: { relativeWorkspacePath: string }) {
64
60
  const { relativeWorkspacePath } = args;
65
61
  if (!relativeWorkspacePath) {
@@ -49,7 +49,6 @@ export class RunCommandHandler {
49
49
  }
50
50
 
51
51
  async handler(args: z.infer<typeof inputSchema> & { toolCallId: string }, logger: MCPLogger) {
52
- logger.appendLine(`Executing command: ${args.command}`);
53
52
  if (args.require_user_approval) {
54
53
  const def = new Deferred<boolean>();
55
54
  this.approvalDeferredMap.set(args.toolCallId, def);
@@ -90,7 +89,6 @@ export class RunCommandHandler {
90
89
  content: result,
91
90
  });
92
91
 
93
- logger.appendLine(`Command ${args.command} finished with exit code: ${e.code}`);
94
92
  terminalClient.term.writeln(
95
93
  `\n${color.italic}> Command ${args.command} executed successfully. Terminal will close in ${
96
94
  3000 / 1000
@@ -3,11 +3,8 @@ import { z } from 'zod';
3
3
  import { Autowired } from '@opensumi/di';
4
4
  import { Domain } from '@opensumi/ide-core-common';
5
5
 
6
- import { IChatInternalService } from '../../../common';
7
- import { ChatInternalService } from '../../chat/chat.internal.service';
8
6
  import { IMCPServerRegistry, MCPLogger, MCPServerContribution, MCPToolDefinition } from '../../types';
9
7
 
10
- import { ListDirToolComponent } from './components/ExpandableFileList';
11
8
  import { ListDirHandler } from './handlers/ListDir';
12
9
 
13
10
  const inputSchema = z
@@ -29,12 +26,8 @@ export class ListDirTool implements MCPServerContribution {
29
26
  @Autowired(ListDirHandler)
30
27
  private readonly listDirHandler: ListDirHandler;
31
28
 
32
- @Autowired(IChatInternalService)
33
- private readonly chatInternalService: ChatInternalService;
34
-
35
29
  registerMCPServer(registry: IMCPServerRegistry): void {
36
30
  registry.registerMCPTool(this.getToolDefinition());
37
- registry.registerToolComponent('list_dir', ListDirToolComponent);
38
31
  }
39
32
 
40
33
  getToolDefinition(): MCPToolDefinition {
@@ -48,40 +41,16 @@ export class ListDirTool implements MCPServerContribution {
48
41
  };
49
42
  }
50
43
 
51
- private async handler(args: z.infer<typeof inputSchema> & { toolCallId: string }, logger: MCPLogger) {
44
+ private async handler(args: z.infer<typeof inputSchema>, logger: MCPLogger) {
52
45
  const result = await this.listDirHandler.handler(args);
53
-
54
- // 构建文件 URI 列表,用于前端渲染
55
- const fileUris = result.files.map((file) => {
56
- const filePath = `${this.listDirHandler.getWorkspaceDir()}/${result.directoryRelativeWorkspacePath}/${file.name}`;
57
- return {
58
- uri: filePath,
59
- isDirectory: file.isDirectory,
60
- };
61
- });
62
-
63
- // 设置消息的附加数据
64
- const messages = this.chatInternalService.sessionModel.history.getMessages();
65
- this.chatInternalService.sessionModel.history.setMessageAdditional(messages[messages.length - 1].id, {
66
- [args.toolCallId]: {
67
- files: fileUris,
68
- title: `Listed directory "${args.relativeWorkspacePath}"`,
69
- details: result.files.map((file) => ({
70
- type: file.isDirectory ? 'dir' : 'file',
71
- name: file.name,
72
- info: file.isDirectory ? `${file.numChildren ?? '?'} items` : `${file.size}KB, ${file.numLines} lines`,
73
- lastModified: file.lastModified,
74
- })),
75
- },
76
- });
77
-
78
- logger.appendLine(`Listed ${fileUris.length} files in directory "${args.relativeWorkspacePath}"`);
79
-
80
46
  return {
81
47
  content: [
82
48
  {
83
49
  type: 'text',
84
- text: `Contents of directory "${args.relativeWorkspacePath}":\n${result.files
50
+ text: `Contents of directory:
51
+
52
+
53
+ ${result.files
85
54
  .map(
86
55
  (file) =>
87
56
  `[${file.isDirectory ? 'dir' : 'file'}] ${file.name} ${
@@ -32,7 +32,6 @@ export class RunTerminalCommandTool implements MCPServerContribution {
32
32
  getToolDefinition(): MCPToolDefinition {
33
33
  return {
34
34
  name: 'run_terminal_cmd',
35
- label: 'Run Command',
36
35
  description:
37
36
  "PROPOSE a command to run on behalf of the user.\nIf you have this tool, note that you DO have the ability to run commands directly on the USER's system.\n\nAdhere to these rules:\n1. Based on the contents of the conversation, you will be told if you are in the same shell as a previous step or a new shell.\n2. If in a new shell, you should `cd` to the right directory and do necessary setup in addition to running the command.\n3. If in the same shell, the state will persist, no need to do things like `cd` to the same directory.\n4. For ANY commands that would use a pager, you should append ` | cat` to the command (or whatever is appropriate). You MUST do this for: git, less, head, tail, more, etc.\n5. For commands that are long running/expected to run indefinitely until interruption, please run them in the background. To run jobs in the background, set `is_background` to true rather than changing the details of the command.\n6. Dont include any newlines in the command.",
38
37
  inputSchema,
@@ -57,6 +57,11 @@ export class MsgHistoryManager extends Disposable {
57
57
 
58
58
  private startIndex = 0;
59
59
 
60
+ private get totalTokens(): number {
61
+ const list = this.messageList.slice(this.startIndex);
62
+ return list.reduce((acc, msg) => acc + (msg.content.length || 0), 0) / 3;
63
+ }
64
+
60
65
  public get slicedMessageCount(): number {
61
66
  return this.startIndex;
62
67
  }
@@ -66,7 +71,12 @@ export class MsgHistoryManager extends Disposable {
66
71
  return list[list.length - 1]?.id;
67
72
  }
68
73
 
69
- public getMessages(): IHistoryChatMessage[] {
74
+ public getMessages(maxTokens?: number): IHistoryChatMessage[] {
75
+ if (maxTokens && this.totalTokens > maxTokens) {
76
+ while (this.totalTokens > maxTokens) {
77
+ this.startIndex++;
78
+ }
79
+ }
70
80
  return this.messageList.slice(this.startIndex);
71
81
  }
72
82
 
@@ -118,10 +128,6 @@ export class MsgHistoryManager extends Disposable {
118
128
  return this.messageAdditionalMap.get(id) || {};
119
129
  }
120
130
 
121
- public get sessionAdditionals() {
122
- return this.messageAdditionalMap;
123
- }
124
-
125
131
  toJSON() {
126
132
  return {
127
133
  messages: this.getMessages(),