@opensumi/ide-ai-native 3.8.1-next-1741250387.0 → 3.8.1-next-1741251026.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 +5 -0
  6. package/lib/browser/ai-core.contribution.d.ts.map +1 -1
  7. package/lib/browser/ai-core.contribution.js +71 -9
  8. package/lib/browser/ai-core.contribution.js.map +1 -1
  9. package/lib/browser/chat/chat-agent.service.d.ts +11 -3
  10. package/lib/browser/chat/chat-agent.service.d.ts.map +1 -1
  11. package/lib/browser/chat/chat-agent.service.js +43 -5
  12. package/lib/browser/chat/chat-agent.service.js.map +1 -1
  13. package/lib/browser/chat/chat-manager.service.d.ts +1 -0
  14. package/lib/browser/chat/chat-manager.service.d.ts.map +1 -1
  15. package/lib/browser/chat/chat-manager.service.js +6 -8
  16. package/lib/browser/chat/chat-manager.service.js.map +1 -1
  17. package/lib/browser/chat/chat-model.d.ts +4 -1
  18. package/lib/browser/chat/chat-model.d.ts.map +1 -1
  19. package/lib/browser/chat/chat-model.js +57 -2
  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 +13 -6
  23. package/lib/browser/chat/chat-proxy.service.js.map +1 -1
  24. package/lib/browser/chat/chat.api.service.d.ts +1 -2
  25. package/lib/browser/chat/chat.api.service.d.ts.map +1 -1
  26. package/lib/browser/chat/chat.api.service.js +0 -4
  27. package/lib/browser/chat/chat.api.service.js.map +1 -1
  28. package/lib/browser/chat/chat.internal.service.d.ts +2 -0
  29. package/lib/browser/chat/chat.internal.service.d.ts.map +1 -1
  30. package/lib/browser/chat/chat.internal.service.js +3 -0
  31. package/lib/browser/chat/chat.internal.service.js.map +1 -1
  32. package/lib/browser/chat/chat.module.less +1 -2
  33. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  34. package/lib/browser/chat/chat.view.js +46 -29
  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 +29 -1
  40. package/lib/browser/components/ChatInput.js.map +1 -1
  41. package/lib/browser/components/ChatReply.js +6 -1
  42. package/lib/browser/components/ChatReply.js.map +1 -1
  43. package/lib/browser/components/ChatThinking.d.ts +0 -2
  44. package/lib/browser/components/ChatThinking.d.ts.map +1 -1
  45. package/lib/browser/components/ChatThinking.js +2 -10
  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 +2 -3
  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 +2 -1
  53. package/lib/browser/components/components.module.less +22 -0
  54. package/lib/browser/context/llm-context.service.d.ts +18 -5
  55. package/lib/browser/context/llm-context.service.d.ts.map +1 -1
  56. package/lib/browser/context/llm-context.service.js +80 -47
  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 +2 -1
  64. package/lib/browser/contrib/intelligent-completions/index.d.ts.map +1 -1
  65. package/lib/browser/contrib/intelligent-completions/index.js +4 -1
  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 +6 -5
  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 +4 -2
  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 +23 -11
  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 +4 -0
  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 +26 -11
  83. package/lib/browser/mcp/base-apply.service.d.ts.map +1 -1
  84. package/lib/browser/mcp/base-apply.service.js +255 -103
  85. package/lib/browser/mcp/base-apply.service.js.map +1 -1
  86. package/lib/browser/mcp/config/components/mcp-config.module.less +178 -0
  87. package/lib/browser/mcp/config/components/mcp-config.view.d.ts +3 -0
  88. package/lib/browser/mcp/config/components/mcp-config.view.d.ts.map +1 -0
  89. package/lib/browser/mcp/config/components/mcp-config.view.js +150 -0
  90. package/lib/browser/mcp/config/components/mcp-config.view.js.map +1 -0
  91. package/lib/browser/mcp/config/components/mcp-server-form.d.ts +16 -0
  92. package/lib/browser/mcp/config/components/mcp-server-form.d.ts.map +1 -0
  93. package/lib/browser/mcp/config/components/mcp-server-form.js +84 -0
  94. package/lib/browser/mcp/config/components/mcp-server-form.js.map +1 -0
  95. package/lib/browser/mcp/config/components/mcp-server-form.module.less +78 -0
  96. package/lib/browser/mcp/config/mcp-config.commands.d.ts +10 -0
  97. package/lib/browser/mcp/config/mcp-config.commands.d.ts.map +1 -0
  98. package/lib/browser/mcp/config/mcp-config.commands.js +35 -0
  99. package/lib/browser/mcp/config/mcp-config.commands.js.map +1 -0
  100. package/lib/browser/mcp/config/mcp-config.contribution.d.ts +16 -0
  101. package/lib/browser/mcp/config/mcp-config.contribution.d.ts.map +1 -0
  102. package/lib/browser/mcp/config/mcp-config.contribution.js +62 -0
  103. package/lib/browser/mcp/config/mcp-config.contribution.js.map +1 -0
  104. package/lib/browser/mcp/mcp-server-proxy.service.d.ts +6 -0
  105. package/lib/browser/mcp/mcp-server-proxy.service.d.ts.map +1 -1
  106. package/lib/browser/mcp/mcp-server-proxy.service.js +10 -1
  107. package/lib/browser/mcp/mcp-server-proxy.service.js.map +1 -1
  108. package/lib/browser/mcp/mcp-server.feature.registry.d.ts +8 -0
  109. package/lib/browser/mcp/mcp-server.feature.registry.d.ts.map +1 -1
  110. package/lib/browser/mcp/mcp-server.feature.registry.js +28 -3
  111. package/lib/browser/mcp/mcp-server.feature.registry.js.map +1 -1
  112. package/lib/browser/mcp/tools/components/EditFile.d.ts.map +1 -1
  113. package/lib/browser/mcp/tools/components/EditFile.js +15 -9
  114. package/lib/browser/mcp/tools/components/EditFile.js.map +1 -1
  115. package/lib/browser/mcp/tools/components/ExpandableFileList.d.ts +13 -0
  116. package/lib/browser/mcp/tools/components/ExpandableFileList.d.ts.map +1 -0
  117. package/lib/browser/mcp/tools/components/{SearchResult.js → ExpandableFileList.js} +29 -19
  118. package/lib/browser/mcp/tools/components/ExpandableFileList.js.map +1 -0
  119. package/lib/browser/mcp/tools/components/Terminal.d.ts.map +1 -1
  120. package/lib/browser/mcp/tools/components/Terminal.js +10 -2
  121. package/lib/browser/mcp/tools/components/Terminal.js.map +1 -1
  122. package/lib/browser/mcp/tools/components/index.module.less +4 -0
  123. package/lib/browser/mcp/tools/createNewFileWithText.d.ts +1 -0
  124. package/lib/browser/mcp/tools/createNewFileWithText.d.ts.map +1 -1
  125. package/lib/browser/mcp/tools/createNewFileWithText.js +19 -11
  126. package/lib/browser/mcp/tools/createNewFileWithText.js.map +1 -1
  127. package/lib/browser/mcp/tools/fileSearch.d.ts +1 -0
  128. package/lib/browser/mcp/tools/fileSearch.d.ts.map +1 -1
  129. package/lib/browser/mcp/tools/fileSearch.js +14 -5
  130. package/lib/browser/mcp/tools/fileSearch.js.map +1 -1
  131. package/lib/browser/mcp/tools/getDiagnosticsByPath.d.ts.map +1 -1
  132. package/lib/browser/mcp/tools/getDiagnosticsByPath.js +1 -0
  133. package/lib/browser/mcp/tools/getDiagnosticsByPath.js.map +1 -1
  134. package/lib/browser/mcp/tools/grepSearch.d.ts.map +1 -1
  135. package/lib/browser/mcp/tools/grepSearch.js +6 -3
  136. package/lib/browser/mcp/tools/grepSearch.js.map +1 -1
  137. package/lib/browser/mcp/tools/handlers/EditFile.js +1 -1
  138. package/lib/browser/mcp/tools/handlers/EditFile.js.map +1 -1
  139. package/lib/browser/mcp/tools/handlers/ListDir.d.ts +1 -0
  140. package/lib/browser/mcp/tools/handlers/ListDir.d.ts.map +1 -1
  141. package/lib/browser/mcp/tools/handlers/ListDir.js +3 -0
  142. package/lib/browser/mcp/tools/handlers/ListDir.js.map +1 -1
  143. package/lib/browser/mcp/tools/handlers/RunCommand.d.ts.map +1 -1
  144. package/lib/browser/mcp/tools/handlers/RunCommand.js +2 -0
  145. package/lib/browser/mcp/tools/handlers/RunCommand.js.map +1 -1
  146. package/lib/browser/mcp/tools/listDir.d.ts +1 -0
  147. package/lib/browser/mcp/tools/listDir.d.ts.map +1 -1
  148. package/lib/browser/mcp/tools/listDir.js +35 -4
  149. package/lib/browser/mcp/tools/listDir.js.map +1 -1
  150. package/lib/browser/mcp/tools/runTerminalCmd.d.ts.map +1 -1
  151. package/lib/browser/mcp/tools/runTerminalCmd.js +1 -0
  152. package/lib/browser/mcp/tools/runTerminalCmd.js.map +1 -1
  153. package/lib/browser/model/msg-history-manager.d.ts +2 -2
  154. package/lib/browser/model/msg-history-manager.d.ts.map +1 -1
  155. package/lib/browser/model/msg-history-manager.js +4 -10
  156. package/lib/browser/model/msg-history-manager.js.map +1 -1
  157. package/lib/browser/preferences/schema.d.ts.map +1 -1
  158. package/lib/browser/preferences/schema.js +22 -2
  159. package/lib/browser/preferences/schema.js.map +1 -1
  160. package/lib/browser/types.d.ts +4 -0
  161. package/lib/browser/types.d.ts.map +1 -1
  162. package/lib/browser/widget/inline-chat/inline-chat-controller.d.ts.map +1 -1
  163. package/lib/browser/widget/inline-chat/inline-chat-controller.js +6 -1
  164. package/lib/browser/widget/inline-chat/inline-chat-controller.js.map +1 -1
  165. package/lib/browser/widget/inline-diff/inline-diff-manager.d.ts.map +1 -1
  166. package/lib/browser/widget/inline-diff/inline-diff-manager.js +68 -8
  167. package/lib/browser/widget/inline-diff/inline-diff-manager.js.map +1 -1
  168. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts +10 -4
  169. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts.map +1 -1
  170. package/lib/browser/widget/inline-diff/inline-diff-previewer.js +14 -3
  171. package/lib/browser/widget/inline-diff/inline-diff-previewer.js.map +1 -1
  172. package/lib/browser/widget/inline-diff/inline-diff-widget.module.less +25 -4
  173. package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts +3 -3
  174. package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts.map +1 -1
  175. package/lib/browser/widget/inline-diff/inline-diff.controller.js +10 -5
  176. package/lib/browser/widget/inline-diff/inline-diff.controller.js.map +1 -1
  177. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts +46 -17
  178. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts.map +1 -1
  179. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js +110 -53
  180. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js.map +1 -1
  181. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts +4 -0
  182. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts.map +1 -1
  183. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js +26 -1
  184. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js.map +1 -1
  185. package/lib/common/index.d.ts +13 -4
  186. package/lib/common/index.d.ts.map +1 -1
  187. package/lib/common/index.js +5 -1
  188. package/lib/common/index.js.map +1 -1
  189. package/lib/common/llm-context.d.ts +13 -9
  190. package/lib/common/llm-context.d.ts.map +1 -1
  191. package/lib/common/llm-context.js.map +1 -1
  192. package/lib/common/mcp-server-manager.d.ts +17 -1
  193. package/lib/common/mcp-server-manager.d.ts.map +1 -1
  194. package/lib/common/mcp-server-manager.js.map +1 -1
  195. package/lib/common/model.d.ts +12 -0
  196. package/lib/common/model.d.ts.map +1 -0
  197. package/lib/common/model.js +83 -0
  198. package/lib/common/model.js.map +1 -0
  199. package/lib/common/prompts/context-prompt-provider.d.ts +4 -3
  200. package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
  201. package/lib/common/prompts/context-prompt-provider.js +33 -22
  202. package/lib/common/prompts/context-prompt-provider.js.map +1 -1
  203. package/lib/common/tool-invocation-registry.d.ts +2 -2
  204. package/lib/common/tool-invocation-registry.d.ts.map +1 -1
  205. package/lib/common/tool-invocation-registry.js +1 -1
  206. package/lib/common/tool-invocation-registry.js.map +1 -1
  207. package/lib/common/types.d.ts +8 -0
  208. package/lib/common/types.d.ts.map +1 -1
  209. package/lib/common/utils.d.ts.map +1 -1
  210. package/lib/common/utils.js +2 -1
  211. package/lib/common/utils.js.map +1 -1
  212. package/lib/node/anthropic/anthropic-language-model.d.ts +3 -1
  213. package/lib/node/anthropic/anthropic-language-model.d.ts.map +1 -1
  214. package/lib/node/anthropic/anthropic-language-model.js +6 -2
  215. package/lib/node/anthropic/anthropic-language-model.js.map +1 -1
  216. package/lib/node/base-language-model.d.ts +6 -3
  217. package/lib/node/base-language-model.d.ts.map +1 -1
  218. package/lib/node/base-language-model.js +14 -31
  219. package/lib/node/base-language-model.js.map +1 -1
  220. package/lib/node/deepseek/deepseek-language-model.d.ts +3 -1
  221. package/lib/node/deepseek/deepseek-language-model.d.ts.map +1 -1
  222. package/lib/node/deepseek/deepseek-language-model.js +6 -2
  223. package/lib/node/deepseek/deepseek-language-model.js.map +1 -1
  224. package/lib/node/mcp/sumi-mcp-server.d.ts +17 -3
  225. package/lib/node/mcp/sumi-mcp-server.d.ts.map +1 -1
  226. package/lib/node/mcp/sumi-mcp-server.js +59 -6
  227. package/lib/node/mcp/sumi-mcp-server.js.map +1 -1
  228. package/lib/node/mcp-server-manager-impl.d.ts +4 -3
  229. package/lib/node/mcp-server-manager-impl.d.ts.map +1 -1
  230. package/lib/node/mcp-server-manager-impl.js +26 -6
  231. package/lib/node/mcp-server-manager-impl.js.map +1 -1
  232. package/lib/node/mcp-server.d.ts +5 -16
  233. package/lib/node/mcp-server.d.ts.map +1 -1
  234. package/lib/node/mcp-server.js +12 -6
  235. package/lib/node/mcp-server.js.map +1 -1
  236. package/lib/node/openai/openai-language-model.d.ts +4 -2
  237. package/lib/node/openai/openai-language-model.d.ts.map +1 -1
  238. package/lib/node/openai/openai-language-model.js +6 -4
  239. package/lib/node/openai/openai-language-model.js.map +1 -1
  240. package/lib/node/openai-compatible/openai-compatible-language-model.d.ts +10 -0
  241. package/lib/node/openai-compatible/openai-compatible-language-model.d.ts.map +1 -0
  242. package/lib/node/openai-compatible/openai-compatible-language-model.js +32 -0
  243. package/lib/node/openai-compatible/openai-compatible-language-model.js.map +1 -0
  244. package/package.json +27 -26
  245. package/src/browser/ai-core.contextkeys.ts +3 -3
  246. package/src/browser/ai-core.contribution.ts +89 -12
  247. package/src/browser/chat/chat-agent.service.ts +53 -9
  248. package/src/browser/chat/chat-manager.service.ts +10 -8
  249. package/src/browser/chat/chat-model.ts +63 -5
  250. package/src/browser/chat/chat-proxy.service.ts +16 -8
  251. package/src/browser/chat/chat.api.service.ts +1 -5
  252. package/src/browser/chat/chat.internal.service.ts +4 -0
  253. package/src/browser/chat/chat.module.less +1 -2
  254. package/src/browser/chat/chat.view.tsx +63 -69
  255. package/src/browser/components/ChatContext/index.tsx +2 -2
  256. package/src/browser/components/ChatInput.tsx +81 -6
  257. package/src/browser/components/ChatReply.tsx +6 -6
  258. package/src/browser/components/ChatThinking.tsx +3 -9
  259. package/src/browser/components/ChatToolRender.tsx +1 -2
  260. package/src/browser/components/WelcomeMsg.tsx +1 -1
  261. package/src/browser/components/chat-history.module.less +2 -1
  262. package/src/browser/components/components.module.less +22 -0
  263. package/src/browser/context/llm-context.service.ts +93 -54
  264. package/src/browser/contrib/inline-completions/inline-completions.controller.ts +1 -1
  265. package/src/browser/contrib/inline-completions/prompt/matcher.ts +2 -2
  266. package/src/browser/contrib/inline-completions/prompt/similarSnippets.ts +2 -2
  267. package/src/browser/contrib/intelligent-completions/index.ts +5 -1
  268. package/src/browser/contrib/intelligent-completions/intelligent-completions.contribution.ts +3 -3
  269. package/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +7 -6
  270. package/src/browser/contrib/intelligent-completions/view/code-edits-previewer.ts +4 -2
  271. package/src/browser/contrib/intelligent-completions/view/default.ts +34 -19
  272. package/src/browser/index.ts +4 -0
  273. package/src/browser/layout/layout.module.less +4 -4
  274. package/src/browser/mcp/base-apply.service.ts +306 -109
  275. package/src/browser/mcp/config/components/mcp-config.module.less +178 -0
  276. package/src/browser/mcp/config/components/mcp-config.view.tsx +215 -0
  277. package/src/browser/mcp/config/components/mcp-server-form.module.less +78 -0
  278. package/src/browser/mcp/config/components/mcp-server-form.tsx +144 -0
  279. package/src/browser/mcp/config/mcp-config.commands.ts +29 -0
  280. package/src/browser/mcp/config/mcp-config.contribution.ts +65 -0
  281. package/src/browser/mcp/mcp-server-proxy.service.ts +14 -2
  282. package/src/browser/mcp/mcp-server.feature.registry.ts +35 -4
  283. package/src/browser/mcp/tools/components/EditFile.tsx +16 -9
  284. package/src/browser/mcp/tools/components/ExpandableFileList.tsx +133 -0
  285. package/src/browser/mcp/tools/components/Terminal.tsx +13 -2
  286. package/src/browser/mcp/tools/components/index.module.less +4 -0
  287. package/src/browser/mcp/tools/createNewFileWithText.ts +21 -12
  288. package/src/browser/mcp/tools/fileSearch.ts +14 -4
  289. package/src/browser/mcp/tools/getDiagnosticsByPath.ts +1 -0
  290. package/src/browser/mcp/tools/grepSearch.ts +6 -3
  291. package/src/browser/mcp/tools/handlers/EditFile.ts +1 -1
  292. package/src/browser/mcp/tools/handlers/ListDir.ts +4 -0
  293. package/src/browser/mcp/tools/handlers/RunCommand.ts +2 -0
  294. package/src/browser/mcp/tools/listDir.ts +36 -5
  295. package/src/browser/mcp/tools/runTerminalCmd.ts +1 -0
  296. package/src/browser/model/msg-history-manager.ts +5 -11
  297. package/src/browser/preferences/schema.ts +22 -2
  298. package/src/browser/types.ts +1 -0
  299. package/src/browser/widget/inline-chat/inline-chat-controller.ts +5 -1
  300. package/src/browser/widget/inline-diff/inline-diff-manager.tsx +143 -21
  301. package/src/browser/widget/inline-diff/inline-diff-previewer.ts +25 -7
  302. package/src/browser/widget/inline-diff/inline-diff-widget.module.less +25 -4
  303. package/src/browser/widget/inline-diff/inline-diff.controller.ts +16 -8
  304. package/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +139 -68
  305. package/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +30 -1
  306. package/src/common/index.ts +15 -4
  307. package/src/common/llm-context.ts +10 -4
  308. package/src/common/mcp-server-manager.ts +17 -1
  309. package/src/common/model.ts +90 -0
  310. package/src/common/prompts/context-prompt-provider.ts +38 -29
  311. package/src/common/tool-invocation-registry.ts +2 -2
  312. package/src/common/types.ts +8 -0
  313. package/src/common/utils.ts +3 -1
  314. package/src/node/anthropic/anthropic-language-model.ts +7 -2
  315. package/src/node/base-language-model.ts +25 -38
  316. package/src/node/deepseek/deepseek-language-model.ts +7 -2
  317. package/src/node/mcp/sumi-mcp-server.ts +67 -9
  318. package/src/node/mcp-server-manager-impl.ts +30 -9
  319. package/src/node/mcp-server.ts +11 -14
  320. package/src/node/openai/openai-language-model.ts +8 -4
  321. package/src/node/openai-compatible/openai-compatible-language-model.ts +30 -0
  322. package/lib/browser/mcp/tools/components/SearchResult.d.ts +0 -11
  323. package/lib/browser/mcp/tools/components/SearchResult.d.ts.map +0 -1
  324. package/lib/browser/mcp/tools/components/SearchResult.js.map +0 -1
  325. package/src/browser/mcp/tools/components/SearchResult.tsx +0 -92
@@ -3,8 +3,11 @@ 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';
6
8
  import { IMCPServerRegistry, MCPLogger, MCPServerContribution, MCPToolDefinition } from '../../types';
7
9
 
10
+ import { ListDirToolComponent } from './components/ExpandableFileList';
8
11
  import { ListDirHandler } from './handlers/ListDir';
9
12
 
10
13
  const inputSchema = z
@@ -26,8 +29,12 @@ export class ListDirTool implements MCPServerContribution {
26
29
  @Autowired(ListDirHandler)
27
30
  private readonly listDirHandler: ListDirHandler;
28
31
 
32
+ @Autowired(IChatInternalService)
33
+ private readonly chatInternalService: ChatInternalService;
34
+
29
35
  registerMCPServer(registry: IMCPServerRegistry): void {
30
36
  registry.registerMCPTool(this.getToolDefinition());
37
+ registry.registerToolComponent('list_dir', ListDirToolComponent);
31
38
  }
32
39
 
33
40
  getToolDefinition(): MCPToolDefinition {
@@ -41,16 +48,40 @@ export class ListDirTool implements MCPServerContribution {
41
48
  };
42
49
  }
43
50
 
44
- private async handler(args: z.infer<typeof inputSchema>, logger: MCPLogger) {
51
+ private async handler(args: z.infer<typeof inputSchema> & { toolCallId: string }, logger: MCPLogger) {
45
52
  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
+
46
80
  return {
47
81
  content: [
48
82
  {
49
83
  type: 'text',
50
- text: `Contents of directory:
51
-
52
-
53
- ${result.files
84
+ text: `Contents of directory "${args.relativeWorkspacePath}":\n${result.files
54
85
  .map(
55
86
  (file) =>
56
87
  `[${file.isDirectory ? 'dir' : 'file'}] ${file.name} ${
@@ -32,6 +32,7 @@ export class RunTerminalCommandTool implements MCPServerContribution {
32
32
  getToolDefinition(): MCPToolDefinition {
33
33
  return {
34
34
  name: 'run_terminal_cmd',
35
+ label: 'Run Command',
35
36
  description:
36
37
  "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.",
37
38
  inputSchema,
@@ -57,11 +57,6 @@ 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
-
65
60
  public get slicedMessageCount(): number {
66
61
  return this.startIndex;
67
62
  }
@@ -71,12 +66,7 @@ export class MsgHistoryManager extends Disposable {
71
66
  return list[list.length - 1]?.id;
72
67
  }
73
68
 
74
- public getMessages(maxTokens?: number): IHistoryChatMessage[] {
75
- if (maxTokens && this.totalTokens > maxTokens) {
76
- while (this.totalTokens > maxTokens) {
77
- this.startIndex++;
78
- }
79
- }
69
+ public getMessages(): IHistoryChatMessage[] {
80
70
  return this.messageList.slice(this.startIndex);
81
71
  }
82
72
 
@@ -128,6 +118,10 @@ export class MsgHistoryManager extends Disposable {
128
118
  return this.messageAdditionalMap.get(id) || {};
129
119
  }
130
120
 
121
+ public get sessionAdditionals() {
122
+ return this.messageAdditionalMap;
123
+ }
124
+
131
125
  toJSON() {
132
126
  return {
133
127
  messages: this.getMessages(),
@@ -69,9 +69,14 @@ export const aiNativePreferenceSchema: PreferenceSchema = {
69
69
  [AINativeSettingSectionsId.LLMModelSelection]: {
70
70
  type: 'string',
71
71
  default: 'deepseek',
72
- enum: ['deepseek', 'anthropic', 'openai'],
72
+ enum: ['deepseek', 'anthropic', 'openai', 'openai-compatible'],
73
73
  description: localize('preference.ai.native.llm.model.selection.description'),
74
74
  },
75
+ [AINativeSettingSectionsId.ModelID]: {
76
+ type: 'string',
77
+ default: 'deepseek-chat',
78
+ description: localize('preference.ai.native.llm.model.id'),
79
+ },
75
80
  [AINativeSettingSectionsId.DeepseekApiKey]: {
76
81
  type: 'string',
77
82
  default: '',
@@ -108,11 +113,27 @@ export const aiNativePreferenceSchema: PreferenceSchema = {
108
113
  type: 'string',
109
114
  description: localize('preference.ai.native.mcp.servers.command.description'),
110
115
  },
116
+ type: {
117
+ type: 'string',
118
+ enum: ['stdio', 'sse'],
119
+ enumDescriptions: [
120
+ localize('preference.ai.native.mcp.servers.type.stdio'),
121
+ localize('preference.ai.native.mcp.servers.type.sse'),
122
+ ],
123
+ description: localize('preference.ai.native.mcp.servers.type.description'),
124
+ default: 'stdio',
125
+ },
126
+ enabled: {
127
+ type: 'boolean',
128
+ description: localize('preference.ai.native.mcp.servers.enabled.description'),
129
+ default: true,
130
+ },
111
131
  args: {
112
132
  type: 'array',
113
133
  items: {
114
134
  type: 'string',
115
135
  },
136
+ default: [],
116
137
  description: localize('preference.ai.native.mcp.servers.args.description'),
117
138
  },
118
139
  env: {
@@ -132,7 +153,6 @@ export const aiNativePreferenceSchema: PreferenceSchema = {
132
153
  },
133
154
  [AINativeSettingSectionsId.SystemPrompt]: {
134
155
  type: 'string',
135
- default: '',
136
156
  description: localize('preference.ai.native.chat.system.prompt.description'),
137
157
  },
138
158
  },
@@ -372,6 +372,7 @@ export interface IMCPServerToolComponentProps {
372
372
  }
373
373
 
374
374
  export interface IMCPServerRegistry {
375
+ activeMessageInfo: { messageId: string; sessionId: string };
375
376
  registerMCPTool(tool: MCPToolDefinition): void;
376
377
  getMCPTools(): MCPToolDefinition[];
377
378
  getMCPTool(name: string): MCPToolDefinition | undefined;
@@ -83,7 +83,11 @@ export class InlineChatController {
83
83
  this._onData.fire(reply);
84
84
  },
85
85
  onEnd: () => {
86
- this._onEnd.fire();
86
+ if (!wholeContent) {
87
+ this._onError.fire(new ErrorResponse(new Error('No content')));
88
+ } else {
89
+ this._onEnd.fire();
90
+ }
87
91
  },
88
92
  onError: (error) => {
89
93
  if (AbortError.is(error)) {
@@ -1,38 +1,160 @@
1
- import React, { useEffect, useState } from 'react';
1
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
2
 
3
- import { Button } from '@opensumi/ide-components';
4
- import { localize, useInjectable } from '@opensumi/ide-core-browser';
5
- import { IResource } from '@opensumi/ide-editor';
3
+ import { Icon, Popover } from '@opensumi/ide-components';
4
+ import { AppConfig, IDisposable, URI, localize, path, useInjectable } from '@opensumi/ide-core-browser';
5
+ import { IResource, WorkbenchEditorService } from '@opensumi/ide-editor';
6
+ import { Path } from '@opensumi/ide-utils/lib/path';
6
7
 
7
8
  import { BaseApplyService } from '../../mcp/base-apply.service';
8
9
 
9
10
  import styles from './inline-diff-widget.module.less';
10
11
 
12
+ const IconWithPopover = (props: {
13
+ icon: string;
14
+ content: string;
15
+ id: string;
16
+ onClick?: () => void;
17
+ disabled?: boolean;
18
+ }) => (
19
+ <Popover content={props.content} id={props.id} onClick={props.onClick}>
20
+ <Icon iconClass={props.icon} className={props.disabled ? styles.disabled : ''} />
21
+ </Popover>
22
+ );
23
+
11
24
  export const InlineDiffManager: React.FC<{ resource: IResource }> = (props) => {
25
+ const { resource } = props;
12
26
  const applyService = useInjectable<BaseApplyService>(BaseApplyService);
27
+ const editorService = useInjectable<WorkbenchEditorService>(WorkbenchEditorService);
28
+ const appConfig = useInjectable<AppConfig>(AppConfig);
13
29
  const [show, setShow] = useState(true);
30
+ const [changesCount, setChangesCount] = useState(0);
31
+ const [currentChangeIndex, setCurrentChangeIndex] = useState(0);
32
+ const [filePaths, setFilePaths] = useState<string[]>(applyService.getPendingPaths());
33
+
34
+ const currentFilePath = useMemo(
35
+ () => path.relative(appConfig.workspaceDir, resource.uri.path.toString()),
36
+ [resource],
37
+ );
38
+
14
39
  useEffect(() => {
15
- applyService.onCodeBlockUpdate((codeBlock) => {
16
- setShow(codeBlock.status === 'pending');
40
+ const toDispose = applyService.onCodeBlockUpdate((codeBlock) => {
41
+ if (path.relative(appConfig.workspaceDir, props.resource.uri.path.toString()) === codeBlock.relativePath) {
42
+ setShow(codeBlock.status === 'pending');
43
+ }
44
+ const pendingPaths = applyService.getPendingPaths();
45
+ setFilePaths(pendingPaths);
17
46
  });
47
+ return () => {
48
+ toDispose.dispose();
49
+ };
18
50
  }, []);
51
+
52
+ // 不同编辑器是不同实例,所以不需要监听
53
+ const decorationModelService = applyService.currentPreviewer?.getNode()?.livePreviewDiffDecorationModel;
54
+
55
+ useEffect(() => {
56
+ let toDispose: IDisposable | undefined;
57
+ if (decorationModelService) {
58
+ setChangesCount(decorationModelService.partialEditWidgetCount);
59
+ toDispose = decorationModelService.onPartialEditWidgetListChange((e) => {
60
+ setChangesCount(e.filter((item) => item.status === 'pending').length);
61
+ });
62
+ }
63
+ return () => {
64
+ toDispose?.dispose();
65
+ };
66
+ }, [decorationModelService]);
67
+
68
+ const handleSiblingChange = useCallback(
69
+ (direction: 'up' | 'down') => {
70
+ const index = decorationModelService?.revealSiblingChange(direction);
71
+ if (index !== undefined) {
72
+ setCurrentChangeIndex(index);
73
+ }
74
+ },
75
+ [decorationModelService],
76
+ );
77
+
78
+ const handleSiblingFile = useCallback(
79
+ (direction: 'up' | 'down') => {
80
+ const index = filePaths.indexOf(currentFilePath!);
81
+ if (index === -1) {
82
+ return;
83
+ }
84
+ const uri = URI.file(path.join(appConfig.workspaceDir, filePaths[index + (direction === 'up' ? -1 : 1)]));
85
+ editorService.open(uri);
86
+ },
87
+ [currentFilePath, filePaths],
88
+ );
89
+
90
+ const changeTip = useMemo(() => {
91
+ if (changesCount === 0) {
92
+ return '';
93
+ }
94
+ return ` ${currentChangeIndex + 1} of ${changesCount}`;
95
+ }, [changesCount, currentChangeIndex]);
96
+
97
+ const fileTip = useMemo(() => {
98
+ if (!currentFilePath) {
99
+ return '';
100
+ }
101
+ return ` ${filePaths.indexOf(currentFilePath) + 1} of ${filePaths.length}`;
102
+ }, [currentFilePath, filePaths]);
103
+
19
104
  return (
20
105
  <div className={styles.inlineDiffManager} style={{ display: show ? 'flex' : 'none' }}>
21
- <Button
22
- onClick={() => {
23
- applyService.processAll(props.resource.uri, 'accept');
24
- }}
25
- >
26
- {localize('aiNative.inlineDiff.acceptAll')}
27
- </Button>
28
- <Button
29
- type='ghost'
30
- onClick={() => {
31
- applyService.processAll(props.resource.uri, 'reject');
32
- }}
33
- >
34
- {localize('aiNative.inlineDiff.rejectAll')}
35
- </Button>
106
+ {/* <div className={styles.left}>
107
+ <IconWithPopover
108
+ icon='codicon codicon-issues'
109
+ content={localize('aiNative.inlineDiff.reveal')}
110
+ id='inline-diff-manager-reveal'
111
+ onClick={handleReveal}
112
+ />
113
+ </div> */}
114
+ <div className={styles.mid}>
115
+ <IconWithPopover
116
+ icon='codicon codicon-check'
117
+ onClick={() => applyService.processAll(props.resource.uri, 'accept')}
118
+ content={localize('aiNative.inlineDiff.acceptAll')}
119
+ id='inline-diff-manager-accept-all'
120
+ />
121
+ <IconWithPopover
122
+ icon='codicon codicon-close'
123
+ onClick={() => applyService.processAll(props.resource.uri, 'reject')}
124
+ content={localize('aiNative.inlineDiff.rejectAll')}
125
+ id='inline-diff-manager-reject-all'
126
+ />
127
+ <IconWithPopover
128
+ icon='codicon codicon-arrow-up'
129
+ content={localize('aiNative.inlineDiff.up') + changeTip}
130
+ id='inline-diff-manager-up'
131
+ disabled={currentChangeIndex === 0}
132
+ onClick={() => handleSiblingChange('up')}
133
+ />
134
+ <IconWithPopover
135
+ icon='codicon codicon-arrow-down'
136
+ content={localize('aiNative.inlineDiff.down') + changeTip}
137
+ id='inline-diff-manager-down'
138
+ disabled={currentChangeIndex === changesCount - 1}
139
+ onClick={() => handleSiblingChange('down')}
140
+ />
141
+ </div>
142
+ <div className={styles.right}>
143
+ <IconWithPopover
144
+ icon='codicon codicon-arrow-left'
145
+ onClick={() => handleSiblingFile('up')}
146
+ disabled={filePaths.length === 0 || filePaths[0] === currentFilePath}
147
+ content={localize('aiNative.inlineDiff.left') + fileTip}
148
+ id='inline-diff-manager-left'
149
+ />
150
+ <IconWithPopover
151
+ icon='codicon codicon-arrow-right'
152
+ onClick={() => handleSiblingFile('down')}
153
+ disabled={filePaths.length === 0 || filePaths[filePaths.length - 1] === currentFilePath}
154
+ content={localize('aiNative.inlineDiff.right') + fileTip}
155
+ id='inline-diff-manager-right'
156
+ />
157
+ </div>
36
158
  </div>
37
159
  );
38
160
  };
@@ -1,5 +1,6 @@
1
1
  import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di';
2
2
  import { Disposable, ErrorResponse, IDisposable, ReplyResponse } from '@opensumi/ide-core-common';
3
+ import { WorkbenchEditorService } from '@opensumi/ide-editor';
3
4
  import { EOL, ICodeEditor, IPosition, ITextModel, Position, Selection } from '@opensumi/ide-monaco';
4
5
  import { ContentWidgetPositionPreference } from '@opensumi/ide-monaco/lib/browser/monaco-exports/editor';
5
6
  import { empty, getLeadingWhitespace } from '@opensumi/ide-utils/lib/strings';
@@ -14,7 +15,12 @@ import {
14
15
 
15
16
  import { EResultKind } from '../inline-chat/inline-chat.service';
16
17
  import { AIInlineContentWidget } from '../inline-chat/inline-content-widget';
17
- import { EComputerMode, InlineStreamDiffHandler } from '../inline-stream-diff/inline-stream-diff.handler';
18
+ import {
19
+ BaseInlineStreamDiffHandler,
20
+ EComputerMode,
21
+ InlineStreamDiffHandler,
22
+ ReverseInlineStreamDiffHandler,
23
+ } from '../inline-stream-diff/inline-stream-diff.handler';
18
24
 
19
25
  import { InlineDiffWidget } from './inline-diff-widget';
20
26
 
@@ -29,6 +35,11 @@ export interface IDiffPreviewerOptions {
29
35
  * 默认情况下,removed widget 会在 `runWhenIdle` 内被添加,如果需要立即添加,可以设置为 true
30
36
  */
31
37
  renderRemovedWidgetImmediately?: boolean;
38
+
39
+ /**
40
+ * 是否为回退模式,即 setValue 内容作为 original,编辑器 getValue 内容作为 modified
41
+ */
42
+ reverse?: boolean;
32
43
  }
33
44
 
34
45
  export interface IInlineDiffPreviewerNode extends IDisposable {
@@ -41,6 +52,8 @@ export abstract class BaseInlineDiffPreviewer<N extends IInlineDiffPreviewerNode
41
52
  @Autowired(INJECTOR_TOKEN)
42
53
  protected readonly injector: Injector;
43
54
 
55
+ @Autowired(WorkbenchEditorService)
56
+ protected readonly editorService: WorkbenchEditorService;
44
57
  protected inlineContentWidget: AIInlineContentWidget | null = null;
45
58
  protected selection: Selection;
46
59
  protected model: ITextModel;
@@ -124,7 +137,7 @@ export abstract class BaseInlineDiffPreviewer<N extends IInlineDiffPreviewerNode
124
137
  return Disposable.NULL;
125
138
  }
126
139
 
127
- protected abstract createNode(): N;
140
+ protected abstract createNode(reverse?: boolean): N;
128
141
  abstract onData(data: ReplyResponse): void;
129
142
  abstract handleAction(action: EResultKind): void;
130
143
  abstract getPosition(): IPosition;
@@ -136,7 +149,7 @@ export abstract class BaseInlineDiffPreviewer<N extends IInlineDiffPreviewerNode
136
149
  },
137
150
  ): void {
138
151
  this.selection = selection;
139
- this.node = this.createNode();
152
+ this.node = this.createNode(options.reverse);
140
153
  this.node.setPreviewerOptions(options);
141
154
  }
142
155
 
@@ -311,8 +324,8 @@ export class SideBySideInlineDiffWidget extends BaseInlineDiffPreviewer<InlineDi
311
324
  }
312
325
 
313
326
  @Injectable({ multiple: true })
314
- export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer<InlineStreamDiffHandler> {
315
- private listenNode(node: InlineStreamDiffHandler): void {
327
+ export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer<BaseInlineStreamDiffHandler> {
328
+ private listenNode(node: BaseInlineStreamDiffHandler): void {
316
329
  node.addDispose(node.onDidEditChange(() => this.layout()));
317
330
  node.addDispose(
318
331
  node.onPartialEditWidgetListChange((widgets) => {
@@ -331,8 +344,13 @@ export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer<InlineStrea
331
344
  this.addDispose(node);
332
345
  }
333
346
 
334
- createNode(): InlineStreamDiffHandler {
335
- const node = this.injector.get(InlineStreamDiffHandler, [this.monacoEditor]);
347
+ createNode(reverse?: boolean): BaseInlineStreamDiffHandler {
348
+ let node: BaseInlineStreamDiffHandler;
349
+ if (reverse) {
350
+ node = this.injector.get(ReverseInlineStreamDiffHandler, [this.monacoEditor]);
351
+ } else {
352
+ node = this.injector.get(InlineStreamDiffHandler, [this.monacoEditor]);
353
+ }
336
354
  node.initialize(this.selection);
337
355
  this.listenNode(node);
338
356
  return node;
@@ -22,12 +22,33 @@
22
22
 
23
23
  .inlineDiffManager {
24
24
  display: flex;
25
- padding: 12px 16px;
26
- justify-content: center;
25
+ border-radius: 14px;
26
+ align-items: center;
27
27
  position: absolute;
28
- bottom: 0;
28
+ bottom: 18px;
29
29
  left: 50%;
30
30
  transform: translateX(-50%);
31
- gap: 12px;
31
+ overflow: hidden;
32
32
  z-index: 999;
33
+ > div {
34
+ display: flex;
35
+ align-items: center;
36
+ }
37
+ .mid {
38
+ border-right: 1px solid var(--design-borderColor);
39
+ }
40
+ :global(.codicon) {
41
+ font-size: 16px;
42
+ padding: 6px;
43
+ color: var(--kt-primaryButton-foreground);
44
+ background-color: var(--kt-primaryButton-hoverBackground);
45
+ &:hover {
46
+ background-color: var(--kt-primaryButton-background);
47
+ }
48
+ }
49
+ }
50
+ .disabled {
51
+ color: var(--kt-button-disableForeground) !important;
52
+ background-color: var(--kt-button-disableBackground) !important;
53
+ cursor: not-allowed;
33
54
  }
@@ -3,6 +3,7 @@ import {
3
3
  AINativeSettingSectionsId,
4
4
  ChatResponse,
5
5
  Disposable,
6
+ DisposableCollection,
6
7
  Emitter,
7
8
  Event,
8
9
  IDisposable,
@@ -23,7 +24,7 @@ import { BaseAIMonacoEditorController } from '../../contrib/base';
23
24
  import { EInlineDiffPreviewMode } from '../../preferences/schema';
24
25
  import { InlineChatController } from '../inline-chat/inline-chat-controller';
25
26
  import { EResultKind } from '../inline-chat/inline-chat.service';
26
- import { InlineStreamDiffHandler } from '../inline-stream-diff/inline-stream-diff.handler';
27
+ import { BaseInlineStreamDiffHandler } from '../inline-stream-diff/inline-stream-diff.handler';
27
28
 
28
29
  import {
29
30
  BaseInlineDiffPreviewer,
@@ -33,7 +34,7 @@ import {
33
34
  } from './inline-diff-previewer';
34
35
  import { InlineDiffWidget } from './inline-diff-widget';
35
36
 
36
- type IInlineDiffPreviewer = BaseInlineDiffPreviewer<InlineDiffWidget | InlineStreamDiffHandler>;
37
+ type IInlineDiffPreviewer = BaseInlineDiffPreviewer<InlineDiffWidget | BaseInlineStreamDiffHandler>;
37
38
 
38
39
  export class InlineDiffController extends BaseAIMonacoEditorController {
39
40
  public static readonly ID = 'editor.contrib.ai.inline.diff';
@@ -118,28 +119,26 @@ export class InlineDiffController extends BaseAIMonacoEditorController {
118
119
  chatResponse?: ChatResponse | InlineChatController;
119
120
  previewerOptions?: IDiffPreviewerOptions;
120
121
  },
121
- ): BaseInlineDiffPreviewer<InlineDiffWidget | InlineStreamDiffHandler> {
122
+ ): BaseInlineDiffPreviewer<InlineDiffWidget | BaseInlineStreamDiffHandler> {
122
123
  const { crossSelection, chatResponse } = options;
123
124
 
124
125
  const disposable = new Disposable();
125
126
 
126
127
  const previewer = this.createDiffPreviewer(monacoEditor, crossSelection, options.previewerOptions);
127
- transaction((tx) => {
128
- this.currentPreviewer.set(previewer, tx);
129
- this.previewerStore.set(previewer.modelId, previewer);
130
- });
131
128
 
132
129
  const onFinish = () => {
133
130
  previewer.layout();
134
131
  disposable.dispose();
135
132
  };
136
133
 
134
+ const previewerDisposable = new DisposableCollection();
135
+
137
136
  disposable.addDispose(
138
137
  previewer.onReady(() => {
139
138
  if (InlineChatController.is(chatResponse)) {
140
139
  const controller = chatResponse as InlineChatController;
141
140
 
142
- disposable.addDispose([
141
+ previewerDisposable.pushAll([
143
142
  controller.onData((data) => {
144
143
  if (ReplyResponse.is(data)) {
145
144
  this.renderDiff(previewer, data);
@@ -167,6 +166,10 @@ export class InlineDiffController extends BaseAIMonacoEditorController {
167
166
  }),
168
167
  );
169
168
 
169
+ previewer.onDispose(() => {
170
+ previewerDisposable.dispose();
171
+ });
172
+ disposable.addDispose(previewerDisposable);
170
173
  previewer.layout();
171
174
  return previewer;
172
175
  }
@@ -196,6 +199,11 @@ export class InlineDiffController extends BaseAIMonacoEditorController {
196
199
  }),
197
200
  );
198
201
 
202
+ transaction((tx) => {
203
+ this.currentPreviewer.set(previewer, tx);
204
+ this.previewerStore.set(previewer.modelId, previewer);
205
+ });
206
+
199
207
  return previewer;
200
208
  }
201
209