@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.
- package/lib/browser/ai-core.contextkeys.d.ts +1 -1
- package/lib/browser/ai-core.contextkeys.d.ts.map +1 -1
- package/lib/browser/ai-core.contextkeys.js +1 -1
- package/lib/browser/ai-core.contextkeys.js.map +1 -1
- package/lib/browser/ai-core.contribution.d.ts +5 -0
- package/lib/browser/ai-core.contribution.d.ts.map +1 -1
- package/lib/browser/ai-core.contribution.js +71 -9
- package/lib/browser/ai-core.contribution.js.map +1 -1
- package/lib/browser/chat/chat-agent.service.d.ts +11 -3
- package/lib/browser/chat/chat-agent.service.d.ts.map +1 -1
- package/lib/browser/chat/chat-agent.service.js +43 -5
- package/lib/browser/chat/chat-agent.service.js.map +1 -1
- package/lib/browser/chat/chat-manager.service.d.ts +1 -0
- package/lib/browser/chat/chat-manager.service.d.ts.map +1 -1
- package/lib/browser/chat/chat-manager.service.js +6 -8
- package/lib/browser/chat/chat-manager.service.js.map +1 -1
- package/lib/browser/chat/chat-model.d.ts +4 -1
- package/lib/browser/chat/chat-model.d.ts.map +1 -1
- package/lib/browser/chat/chat-model.js +57 -2
- package/lib/browser/chat/chat-model.js.map +1 -1
- package/lib/browser/chat/chat-proxy.service.d.ts.map +1 -1
- package/lib/browser/chat/chat-proxy.service.js +13 -6
- package/lib/browser/chat/chat-proxy.service.js.map +1 -1
- package/lib/browser/chat/chat.api.service.d.ts +1 -2
- package/lib/browser/chat/chat.api.service.d.ts.map +1 -1
- package/lib/browser/chat/chat.api.service.js +0 -4
- package/lib/browser/chat/chat.api.service.js.map +1 -1
- package/lib/browser/chat/chat.internal.service.d.ts +2 -0
- package/lib/browser/chat/chat.internal.service.d.ts.map +1 -1
- package/lib/browser/chat/chat.internal.service.js +3 -0
- package/lib/browser/chat/chat.internal.service.js.map +1 -1
- package/lib/browser/chat/chat.module.less +1 -2
- package/lib/browser/chat/chat.view.d.ts.map +1 -1
- package/lib/browser/chat/chat.view.js +46 -29
- package/lib/browser/chat/chat.view.js.map +1 -1
- package/lib/browser/components/ChatContext/index.js +2 -2
- package/lib/browser/components/ChatContext/index.js.map +1 -1
- package/lib/browser/components/ChatInput.d.ts.map +1 -1
- package/lib/browser/components/ChatInput.js +29 -1
- package/lib/browser/components/ChatInput.js.map +1 -1
- package/lib/browser/components/ChatReply.js +6 -1
- package/lib/browser/components/ChatReply.js.map +1 -1
- package/lib/browser/components/ChatThinking.d.ts +0 -2
- package/lib/browser/components/ChatThinking.d.ts.map +1 -1
- package/lib/browser/components/ChatThinking.js +2 -10
- package/lib/browser/components/ChatThinking.js.map +1 -1
- package/lib/browser/components/ChatToolRender.d.ts.map +1 -1
- package/lib/browser/components/ChatToolRender.js +2 -3
- package/lib/browser/components/ChatToolRender.js.map +1 -1
- package/lib/browser/components/WelcomeMsg.js +1 -1
- package/lib/browser/components/WelcomeMsg.js.map +1 -1
- package/lib/browser/components/chat-history.module.less +2 -1
- package/lib/browser/components/components.module.less +22 -0
- package/lib/browser/context/llm-context.service.d.ts +18 -5
- package/lib/browser/context/llm-context.service.d.ts.map +1 -1
- package/lib/browser/context/llm-context.service.js +80 -47
- package/lib/browser/context/llm-context.service.js.map +1 -1
- package/lib/browser/contrib/inline-completions/inline-completions.controller.js +1 -1
- package/lib/browser/contrib/inline-completions/inline-completions.controller.js.map +1 -1
- package/lib/browser/contrib/inline-completions/prompt/matcher.js +2 -2
- package/lib/browser/contrib/inline-completions/prompt/similarSnippets.d.ts +1 -1
- package/lib/browser/contrib/inline-completions/prompt/similarSnippets.js +2 -2
- package/lib/browser/contrib/intelligent-completions/index.d.ts +2 -1
- package/lib/browser/contrib/intelligent-completions/index.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/index.js +4 -1
- package/lib/browser/contrib/intelligent-completions/index.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js +2 -2
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js +6 -5
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/view/code-edits-previewer.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/view/code-edits-previewer.js +4 -2
- package/lib/browser/contrib/intelligent-completions/view/code-edits-previewer.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/view/default.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/view/default.js +23 -11
- package/lib/browser/contrib/intelligent-completions/view/default.js.map +1 -1
- package/lib/browser/index.d.ts.map +1 -1
- package/lib/browser/index.js +4 -0
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/layout/layout.module.less +4 -4
- package/lib/browser/mcp/base-apply.service.d.ts +26 -11
- package/lib/browser/mcp/base-apply.service.d.ts.map +1 -1
- package/lib/browser/mcp/base-apply.service.js +255 -103
- package/lib/browser/mcp/base-apply.service.js.map +1 -1
- package/lib/browser/mcp/config/components/mcp-config.module.less +178 -0
- package/lib/browser/mcp/config/components/mcp-config.view.d.ts +3 -0
- package/lib/browser/mcp/config/components/mcp-config.view.d.ts.map +1 -0
- package/lib/browser/mcp/config/components/mcp-config.view.js +150 -0
- package/lib/browser/mcp/config/components/mcp-config.view.js.map +1 -0
- package/lib/browser/mcp/config/components/mcp-server-form.d.ts +16 -0
- package/lib/browser/mcp/config/components/mcp-server-form.d.ts.map +1 -0
- package/lib/browser/mcp/config/components/mcp-server-form.js +84 -0
- package/lib/browser/mcp/config/components/mcp-server-form.js.map +1 -0
- package/lib/browser/mcp/config/components/mcp-server-form.module.less +78 -0
- package/lib/browser/mcp/config/mcp-config.commands.d.ts +10 -0
- package/lib/browser/mcp/config/mcp-config.commands.d.ts.map +1 -0
- package/lib/browser/mcp/config/mcp-config.commands.js +35 -0
- package/lib/browser/mcp/config/mcp-config.commands.js.map +1 -0
- package/lib/browser/mcp/config/mcp-config.contribution.d.ts +16 -0
- package/lib/browser/mcp/config/mcp-config.contribution.d.ts.map +1 -0
- package/lib/browser/mcp/config/mcp-config.contribution.js +62 -0
- package/lib/browser/mcp/config/mcp-config.contribution.js.map +1 -0
- package/lib/browser/mcp/mcp-server-proxy.service.d.ts +6 -0
- package/lib/browser/mcp/mcp-server-proxy.service.d.ts.map +1 -1
- package/lib/browser/mcp/mcp-server-proxy.service.js +10 -1
- package/lib/browser/mcp/mcp-server-proxy.service.js.map +1 -1
- package/lib/browser/mcp/mcp-server.feature.registry.d.ts +8 -0
- package/lib/browser/mcp/mcp-server.feature.registry.d.ts.map +1 -1
- package/lib/browser/mcp/mcp-server.feature.registry.js +28 -3
- package/lib/browser/mcp/mcp-server.feature.registry.js.map +1 -1
- package/lib/browser/mcp/tools/components/EditFile.d.ts.map +1 -1
- package/lib/browser/mcp/tools/components/EditFile.js +15 -9
- package/lib/browser/mcp/tools/components/EditFile.js.map +1 -1
- package/lib/browser/mcp/tools/components/ExpandableFileList.d.ts +13 -0
- package/lib/browser/mcp/tools/components/ExpandableFileList.d.ts.map +1 -0
- package/lib/browser/mcp/tools/components/{SearchResult.js → ExpandableFileList.js} +29 -19
- package/lib/browser/mcp/tools/components/ExpandableFileList.js.map +1 -0
- package/lib/browser/mcp/tools/components/Terminal.d.ts.map +1 -1
- package/lib/browser/mcp/tools/components/Terminal.js +10 -2
- package/lib/browser/mcp/tools/components/Terminal.js.map +1 -1
- package/lib/browser/mcp/tools/components/index.module.less +4 -0
- package/lib/browser/mcp/tools/createNewFileWithText.d.ts +1 -0
- package/lib/browser/mcp/tools/createNewFileWithText.d.ts.map +1 -1
- package/lib/browser/mcp/tools/createNewFileWithText.js +19 -11
- package/lib/browser/mcp/tools/createNewFileWithText.js.map +1 -1
- package/lib/browser/mcp/tools/fileSearch.d.ts +1 -0
- package/lib/browser/mcp/tools/fileSearch.d.ts.map +1 -1
- package/lib/browser/mcp/tools/fileSearch.js +14 -5
- package/lib/browser/mcp/tools/fileSearch.js.map +1 -1
- package/lib/browser/mcp/tools/getDiagnosticsByPath.d.ts.map +1 -1
- package/lib/browser/mcp/tools/getDiagnosticsByPath.js +1 -0
- package/lib/browser/mcp/tools/getDiagnosticsByPath.js.map +1 -1
- package/lib/browser/mcp/tools/grepSearch.d.ts.map +1 -1
- package/lib/browser/mcp/tools/grepSearch.js +6 -3
- package/lib/browser/mcp/tools/grepSearch.js.map +1 -1
- package/lib/browser/mcp/tools/handlers/EditFile.js +1 -1
- package/lib/browser/mcp/tools/handlers/EditFile.js.map +1 -1
- package/lib/browser/mcp/tools/handlers/ListDir.d.ts +1 -0
- package/lib/browser/mcp/tools/handlers/ListDir.d.ts.map +1 -1
- package/lib/browser/mcp/tools/handlers/ListDir.js +3 -0
- package/lib/browser/mcp/tools/handlers/ListDir.js.map +1 -1
- package/lib/browser/mcp/tools/handlers/RunCommand.d.ts.map +1 -1
- package/lib/browser/mcp/tools/handlers/RunCommand.js +2 -0
- package/lib/browser/mcp/tools/handlers/RunCommand.js.map +1 -1
- package/lib/browser/mcp/tools/listDir.d.ts +1 -0
- package/lib/browser/mcp/tools/listDir.d.ts.map +1 -1
- package/lib/browser/mcp/tools/listDir.js +35 -4
- package/lib/browser/mcp/tools/listDir.js.map +1 -1
- package/lib/browser/mcp/tools/runTerminalCmd.d.ts.map +1 -1
- package/lib/browser/mcp/tools/runTerminalCmd.js +1 -0
- package/lib/browser/mcp/tools/runTerminalCmd.js.map +1 -1
- package/lib/browser/model/msg-history-manager.d.ts +2 -2
- package/lib/browser/model/msg-history-manager.d.ts.map +1 -1
- package/lib/browser/model/msg-history-manager.js +4 -10
- package/lib/browser/model/msg-history-manager.js.map +1 -1
- package/lib/browser/preferences/schema.d.ts.map +1 -1
- package/lib/browser/preferences/schema.js +22 -2
- package/lib/browser/preferences/schema.js.map +1 -1
- package/lib/browser/types.d.ts +4 -0
- package/lib/browser/types.d.ts.map +1 -1
- package/lib/browser/widget/inline-chat/inline-chat-controller.d.ts.map +1 -1
- package/lib/browser/widget/inline-chat/inline-chat-controller.js +6 -1
- package/lib/browser/widget/inline-chat/inline-chat-controller.js.map +1 -1
- package/lib/browser/widget/inline-diff/inline-diff-manager.d.ts.map +1 -1
- package/lib/browser/widget/inline-diff/inline-diff-manager.js +68 -8
- package/lib/browser/widget/inline-diff/inline-diff-manager.js.map +1 -1
- package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts +10 -4
- package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts.map +1 -1
- package/lib/browser/widget/inline-diff/inline-diff-previewer.js +14 -3
- package/lib/browser/widget/inline-diff/inline-diff-previewer.js.map +1 -1
- package/lib/browser/widget/inline-diff/inline-diff-widget.module.less +25 -4
- package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts +3 -3
- package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts.map +1 -1
- package/lib/browser/widget/inline-diff/inline-diff.controller.js +10 -5
- package/lib/browser/widget/inline-diff/inline-diff.controller.js.map +1 -1
- package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts +46 -17
- package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts.map +1 -1
- package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js +110 -53
- package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js.map +1 -1
- package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts +4 -0
- package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts.map +1 -1
- package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js +26 -1
- package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js.map +1 -1
- package/lib/common/index.d.ts +13 -4
- package/lib/common/index.d.ts.map +1 -1
- package/lib/common/index.js +5 -1
- package/lib/common/index.js.map +1 -1
- package/lib/common/llm-context.d.ts +13 -9
- package/lib/common/llm-context.d.ts.map +1 -1
- package/lib/common/llm-context.js.map +1 -1
- package/lib/common/mcp-server-manager.d.ts +17 -1
- package/lib/common/mcp-server-manager.d.ts.map +1 -1
- package/lib/common/mcp-server-manager.js.map +1 -1
- package/lib/common/model.d.ts +12 -0
- package/lib/common/model.d.ts.map +1 -0
- package/lib/common/model.js +83 -0
- package/lib/common/model.js.map +1 -0
- package/lib/common/prompts/context-prompt-provider.d.ts +4 -3
- package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
- package/lib/common/prompts/context-prompt-provider.js +33 -22
- package/lib/common/prompts/context-prompt-provider.js.map +1 -1
- package/lib/common/tool-invocation-registry.d.ts +2 -2
- package/lib/common/tool-invocation-registry.d.ts.map +1 -1
- package/lib/common/tool-invocation-registry.js +1 -1
- package/lib/common/tool-invocation-registry.js.map +1 -1
- package/lib/common/types.d.ts +8 -0
- package/lib/common/types.d.ts.map +1 -1
- package/lib/common/utils.d.ts.map +1 -1
- package/lib/common/utils.js +2 -1
- package/lib/common/utils.js.map +1 -1
- package/lib/node/anthropic/anthropic-language-model.d.ts +3 -1
- package/lib/node/anthropic/anthropic-language-model.d.ts.map +1 -1
- package/lib/node/anthropic/anthropic-language-model.js +6 -2
- package/lib/node/anthropic/anthropic-language-model.js.map +1 -1
- package/lib/node/base-language-model.d.ts +6 -3
- package/lib/node/base-language-model.d.ts.map +1 -1
- package/lib/node/base-language-model.js +14 -31
- package/lib/node/base-language-model.js.map +1 -1
- package/lib/node/deepseek/deepseek-language-model.d.ts +3 -1
- package/lib/node/deepseek/deepseek-language-model.d.ts.map +1 -1
- package/lib/node/deepseek/deepseek-language-model.js +6 -2
- package/lib/node/deepseek/deepseek-language-model.js.map +1 -1
- package/lib/node/mcp/sumi-mcp-server.d.ts +17 -3
- package/lib/node/mcp/sumi-mcp-server.d.ts.map +1 -1
- package/lib/node/mcp/sumi-mcp-server.js +59 -6
- package/lib/node/mcp/sumi-mcp-server.js.map +1 -1
- package/lib/node/mcp-server-manager-impl.d.ts +4 -3
- package/lib/node/mcp-server-manager-impl.d.ts.map +1 -1
- package/lib/node/mcp-server-manager-impl.js +26 -6
- package/lib/node/mcp-server-manager-impl.js.map +1 -1
- package/lib/node/mcp-server.d.ts +5 -16
- package/lib/node/mcp-server.d.ts.map +1 -1
- package/lib/node/mcp-server.js +12 -6
- package/lib/node/mcp-server.js.map +1 -1
- package/lib/node/openai/openai-language-model.d.ts +4 -2
- package/lib/node/openai/openai-language-model.d.ts.map +1 -1
- package/lib/node/openai/openai-language-model.js +6 -4
- package/lib/node/openai/openai-language-model.js.map +1 -1
- package/lib/node/openai-compatible/openai-compatible-language-model.d.ts +10 -0
- package/lib/node/openai-compatible/openai-compatible-language-model.d.ts.map +1 -0
- package/lib/node/openai-compatible/openai-compatible-language-model.js +32 -0
- package/lib/node/openai-compatible/openai-compatible-language-model.js.map +1 -0
- package/package.json +27 -26
- package/src/browser/ai-core.contextkeys.ts +3 -3
- package/src/browser/ai-core.contribution.ts +89 -12
- package/src/browser/chat/chat-agent.service.ts +53 -9
- package/src/browser/chat/chat-manager.service.ts +10 -8
- package/src/browser/chat/chat-model.ts +63 -5
- package/src/browser/chat/chat-proxy.service.ts +16 -8
- package/src/browser/chat/chat.api.service.ts +1 -5
- package/src/browser/chat/chat.internal.service.ts +4 -0
- package/src/browser/chat/chat.module.less +1 -2
- package/src/browser/chat/chat.view.tsx +63 -69
- package/src/browser/components/ChatContext/index.tsx +2 -2
- package/src/browser/components/ChatInput.tsx +81 -6
- package/src/browser/components/ChatReply.tsx +6 -6
- package/src/browser/components/ChatThinking.tsx +3 -9
- package/src/browser/components/ChatToolRender.tsx +1 -2
- package/src/browser/components/WelcomeMsg.tsx +1 -1
- package/src/browser/components/chat-history.module.less +2 -1
- package/src/browser/components/components.module.less +22 -0
- package/src/browser/context/llm-context.service.ts +93 -54
- package/src/browser/contrib/inline-completions/inline-completions.controller.ts +1 -1
- package/src/browser/contrib/inline-completions/prompt/matcher.ts +2 -2
- package/src/browser/contrib/inline-completions/prompt/similarSnippets.ts +2 -2
- package/src/browser/contrib/intelligent-completions/index.ts +5 -1
- package/src/browser/contrib/intelligent-completions/intelligent-completions.contribution.ts +3 -3
- package/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +7 -6
- package/src/browser/contrib/intelligent-completions/view/code-edits-previewer.ts +4 -2
- package/src/browser/contrib/intelligent-completions/view/default.ts +34 -19
- package/src/browser/index.ts +4 -0
- package/src/browser/layout/layout.module.less +4 -4
- package/src/browser/mcp/base-apply.service.ts +306 -109
- package/src/browser/mcp/config/components/mcp-config.module.less +178 -0
- package/src/browser/mcp/config/components/mcp-config.view.tsx +215 -0
- package/src/browser/mcp/config/components/mcp-server-form.module.less +78 -0
- package/src/browser/mcp/config/components/mcp-server-form.tsx +144 -0
- package/src/browser/mcp/config/mcp-config.commands.ts +29 -0
- package/src/browser/mcp/config/mcp-config.contribution.ts +65 -0
- package/src/browser/mcp/mcp-server-proxy.service.ts +14 -2
- package/src/browser/mcp/mcp-server.feature.registry.ts +35 -4
- package/src/browser/mcp/tools/components/EditFile.tsx +16 -9
- package/src/browser/mcp/tools/components/ExpandableFileList.tsx +133 -0
- package/src/browser/mcp/tools/components/Terminal.tsx +13 -2
- package/src/browser/mcp/tools/components/index.module.less +4 -0
- package/src/browser/mcp/tools/createNewFileWithText.ts +21 -12
- package/src/browser/mcp/tools/fileSearch.ts +14 -4
- package/src/browser/mcp/tools/getDiagnosticsByPath.ts +1 -0
- package/src/browser/mcp/tools/grepSearch.ts +6 -3
- package/src/browser/mcp/tools/handlers/EditFile.ts +1 -1
- package/src/browser/mcp/tools/handlers/ListDir.ts +4 -0
- package/src/browser/mcp/tools/handlers/RunCommand.ts +2 -0
- package/src/browser/mcp/tools/listDir.ts +36 -5
- package/src/browser/mcp/tools/runTerminalCmd.ts +1 -0
- package/src/browser/model/msg-history-manager.ts +5 -11
- package/src/browser/preferences/schema.ts +22 -2
- package/src/browser/types.ts +1 -0
- package/src/browser/widget/inline-chat/inline-chat-controller.ts +5 -1
- package/src/browser/widget/inline-diff/inline-diff-manager.tsx +143 -21
- package/src/browser/widget/inline-diff/inline-diff-previewer.ts +25 -7
- package/src/browser/widget/inline-diff/inline-diff-widget.module.less +25 -4
- package/src/browser/widget/inline-diff/inline-diff.controller.ts +16 -8
- package/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +139 -68
- package/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +30 -1
- package/src/common/index.ts +15 -4
- package/src/common/llm-context.ts +10 -4
- package/src/common/mcp-server-manager.ts +17 -1
- package/src/common/model.ts +90 -0
- package/src/common/prompts/context-prompt-provider.ts +38 -29
- package/src/common/tool-invocation-registry.ts +2 -2
- package/src/common/types.ts +8 -0
- package/src/common/utils.ts +3 -1
- package/src/node/anthropic/anthropic-language-model.ts +7 -2
- package/src/node/base-language-model.ts +25 -38
- package/src/node/deepseek/deepseek-language-model.ts +7 -2
- package/src/node/mcp/sumi-mcp-server.ts +67 -9
- package/src/node/mcp-server-manager-impl.ts +30 -9
- package/src/node/mcp-server.ts +11 -14
- package/src/node/openai/openai-language-model.ts +8 -4
- package/src/node/openai-compatible/openai-compatible-language-model.ts +30 -0
- package/lib/browser/mcp/tools/components/SearchResult.d.ts +0 -11
- package/lib/browser/mcp/tools/components/SearchResult.d.ts.map +0 -1
- package/lib/browser/mcp/tools/components/SearchResult.js.map +0 -1
- 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
|
|
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(
|
|
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
|
},
|
package/src/browser/types.ts
CHANGED
|
@@ -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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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 {
|
|
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<
|
|
315
|
-
private listenNode(node:
|
|
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():
|
|
335
|
-
|
|
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
|
-
|
|
26
|
-
|
|
25
|
+
border-radius: 14px;
|
|
26
|
+
align-items: center;
|
|
27
27
|
position: absolute;
|
|
28
|
-
bottom:
|
|
28
|
+
bottom: 18px;
|
|
29
29
|
left: 50%;
|
|
30
30
|
transform: translateX(-50%);
|
|
31
|
-
|
|
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 {
|
|
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 |
|
|
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 |
|
|
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
|
-
|
|
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
|
|