@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
|
@@ -2,21 +2,23 @@ import flatMap from 'lodash/flatMap';
|
|
|
2
2
|
|
|
3
3
|
import { Autowired, Injectable } from '@opensumi/di';
|
|
4
4
|
import {
|
|
5
|
+
AIServiceType,
|
|
6
|
+
ActionSourceEnum,
|
|
7
|
+
ActionTypeEnum,
|
|
5
8
|
CancellationToken,
|
|
6
9
|
ChatFeatureRegistryToken,
|
|
7
10
|
ChatServiceToken,
|
|
8
11
|
Disposable,
|
|
9
12
|
Emitter,
|
|
10
|
-
|
|
13
|
+
IAIReporter,
|
|
11
14
|
IChatProgress,
|
|
12
15
|
IDisposable,
|
|
13
16
|
ILogger,
|
|
14
17
|
toDisposable,
|
|
15
18
|
} from '@opensumi/ide-core-common';
|
|
16
|
-
import { ChatMessageRole } from '@opensumi/ide-core-common';
|
|
17
|
-
import { IChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
|
|
18
19
|
|
|
19
20
|
import {
|
|
21
|
+
CoreMessage,
|
|
20
22
|
IChatAgent,
|
|
21
23
|
IChatAgentCommand,
|
|
22
24
|
IChatAgentMetadata,
|
|
@@ -26,6 +28,8 @@ import {
|
|
|
26
28
|
IChatFollowup,
|
|
27
29
|
IChatMessageStructure,
|
|
28
30
|
} from '../../common';
|
|
31
|
+
import { LLMContextService, LLMContextServiceToken } from '../../common/llm-context';
|
|
32
|
+
import { ChatAgentPromptProvider } from '../../common/prompts/context-prompt-provider';
|
|
29
33
|
import { IChatFeatureRegistry } from '../types';
|
|
30
34
|
|
|
31
35
|
import { ChatService } from './chat.api.service';
|
|
@@ -36,6 +40,12 @@ export class ChatAgentService extends Disposable implements IChatAgentService {
|
|
|
36
40
|
|
|
37
41
|
private defaultAgentId: string | undefined;
|
|
38
42
|
|
|
43
|
+
private initialUserMessageMap: Map<string, string> = new Map();
|
|
44
|
+
|
|
45
|
+
private shouldUpdateContext = false;
|
|
46
|
+
|
|
47
|
+
private contextVersion: number;
|
|
48
|
+
|
|
39
49
|
private readonly _onDidChangeAgents = new Emitter<void>();
|
|
40
50
|
readonly onDidChangeAgents = this._onDidChangeAgents.event;
|
|
41
51
|
|
|
@@ -45,6 +55,15 @@ export class ChatAgentService extends Disposable implements IChatAgentService {
|
|
|
45
55
|
@Autowired(ILogger)
|
|
46
56
|
logger: ILogger;
|
|
47
57
|
|
|
58
|
+
@Autowired(IAIReporter)
|
|
59
|
+
private readonly aiReporter: IAIReporter;
|
|
60
|
+
|
|
61
|
+
@Autowired(LLMContextServiceToken)
|
|
62
|
+
protected readonly contextService: LLMContextService;
|
|
63
|
+
|
|
64
|
+
@Autowired(ChatAgentPromptProvider)
|
|
65
|
+
protected readonly promptProvider: ChatAgentPromptProvider;
|
|
66
|
+
|
|
48
67
|
@Autowired(ChatServiceToken)
|
|
49
68
|
private aiChatService: ChatService;
|
|
50
69
|
|
|
@@ -54,6 +73,14 @@ export class ChatAgentService extends Disposable implements IChatAgentService {
|
|
|
54
73
|
constructor() {
|
|
55
74
|
super();
|
|
56
75
|
this.addDispose(this._onDidChangeAgents);
|
|
76
|
+
this.addDispose(
|
|
77
|
+
this.contextService.onDidContextFilesChangeEvent((event) => {
|
|
78
|
+
if (event.version !== this.contextVersion) {
|
|
79
|
+
this.contextVersion = event.version;
|
|
80
|
+
this.shouldUpdateContext = true;
|
|
81
|
+
}
|
|
82
|
+
}),
|
|
83
|
+
);
|
|
57
84
|
}
|
|
58
85
|
|
|
59
86
|
registerAgent(agent: IChatAgent): IDisposable {
|
|
@@ -113,24 +140,41 @@ export class ChatAgentService extends Disposable implements IChatAgentService {
|
|
|
113
140
|
id: string,
|
|
114
141
|
request: IChatAgentRequest,
|
|
115
142
|
progress: (part: IChatProgress) => void,
|
|
116
|
-
history:
|
|
143
|
+
history: CoreMessage[],
|
|
117
144
|
token: CancellationToken,
|
|
118
145
|
): Promise<IChatAgentResult> {
|
|
119
146
|
const data = this.agents.get(id);
|
|
120
147
|
if (!data) {
|
|
121
148
|
throw new Error(`No agent with id ${id}`);
|
|
122
149
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
150
|
+
|
|
151
|
+
// 发送第一条消息时携带初始 context
|
|
152
|
+
if (!this.initialUserMessageMap.has(request.sessionId)) {
|
|
153
|
+
this.initialUserMessageMap.set(request.sessionId, request.message);
|
|
154
|
+
const rawMessage = request.message;
|
|
155
|
+
request.message = this.provideContextMessage(rawMessage, request.sessionId);
|
|
156
|
+
} else if (this.shouldUpdateContext || request.regenerate || history.length === 0) {
|
|
157
|
+
request.message = this.provideContextMessage(request.message, request.sessionId);
|
|
158
|
+
this.shouldUpdateContext = false;
|
|
128
159
|
}
|
|
129
160
|
|
|
130
161
|
const result = await data.agent.invoke(request, progress, history, token);
|
|
131
162
|
return result;
|
|
132
163
|
}
|
|
133
164
|
|
|
165
|
+
private provideContextMessage(message: string, sessionId: string) {
|
|
166
|
+
const context = this.contextService.serialize();
|
|
167
|
+
const fullMessage = this.promptProvider.provideContextPrompt(context, message);
|
|
168
|
+
this.aiReporter.send({
|
|
169
|
+
msgType: AIServiceType.Chat,
|
|
170
|
+
actionType: ActionTypeEnum.ContextEnhance,
|
|
171
|
+
actionSource: ActionSourceEnum.Chat,
|
|
172
|
+
sessionId,
|
|
173
|
+
message: fullMessage,
|
|
174
|
+
});
|
|
175
|
+
return fullMessage;
|
|
176
|
+
}
|
|
177
|
+
|
|
134
178
|
populateChatInput(id: string, message: IChatMessageStructure) {
|
|
135
179
|
this.aiChatService.sendMessage({
|
|
136
180
|
...message,
|
|
@@ -6,10 +6,12 @@ import {
|
|
|
6
6
|
DisposableMap,
|
|
7
7
|
Emitter,
|
|
8
8
|
IChatProgress,
|
|
9
|
+
IChatToolContent,
|
|
9
10
|
IStorage,
|
|
10
11
|
STORAGE_NAMESPACE,
|
|
11
12
|
StorageProvider,
|
|
12
13
|
debounce,
|
|
14
|
+
formatLocalize,
|
|
13
15
|
} from '@opensumi/ide-core-common';
|
|
14
16
|
import { ChatMessageRole, IChatMessage, IHistoryChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
|
|
15
17
|
|
|
@@ -28,12 +30,15 @@ interface ISessionModel {
|
|
|
28
30
|
isCanceled: boolean;
|
|
29
31
|
responseText: string;
|
|
30
32
|
responseContents: IChatProgressResponseContent[];
|
|
33
|
+
responseParts: IChatProgressResponseContent[];
|
|
31
34
|
errorDetails: IChatResponseErrorDetails | undefined;
|
|
32
35
|
followups: IChatFollowup[];
|
|
33
36
|
};
|
|
34
37
|
}[];
|
|
35
38
|
}
|
|
36
39
|
|
|
40
|
+
const MAX_SESSION_COUNT = 20;
|
|
41
|
+
|
|
37
42
|
@Injectable()
|
|
38
43
|
export class ChatManagerService extends Disposable {
|
|
39
44
|
#sessionModels = this.registerDispose(new DisposableMap<string, ChatModel>());
|
|
@@ -69,6 +74,7 @@ export class ChatManagerService extends Disposable {
|
|
|
69
74
|
responseContents: request.response.responseContents,
|
|
70
75
|
isComplete: true,
|
|
71
76
|
responseText: request.response.responseText,
|
|
77
|
+
responseParts: request.response.responseParts,
|
|
72
78
|
errorDetails: request.response.errorDetails,
|
|
73
79
|
followups: request.response.followups,
|
|
74
80
|
isCanceled: request.response.isCanceled,
|
|
@@ -100,6 +106,9 @@ export class ChatManagerService extends Disposable {
|
|
|
100
106
|
}
|
|
101
107
|
|
|
102
108
|
startSession() {
|
|
109
|
+
if (this.#sessionModels.size >= MAX_SESSION_COUNT) {
|
|
110
|
+
throw new Error(formatLocalize('aiNative.chat.session.max', MAX_SESSION_COUNT.toString()));
|
|
111
|
+
}
|
|
103
112
|
const model = new ChatModel();
|
|
104
113
|
this.#sessionModels.set(model.sessionId, model);
|
|
105
114
|
this.listenSession(model);
|
|
@@ -147,14 +156,7 @@ export class ChatManagerService extends Disposable {
|
|
|
147
156
|
request.response.cancel();
|
|
148
157
|
});
|
|
149
158
|
|
|
150
|
-
const history
|
|
151
|
-
for (const request of model.requests) {
|
|
152
|
-
if (!request.response.isComplete) {
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
history.push({ role: ChatMessageRole.User, content: request.message.prompt });
|
|
156
|
-
history.push({ role: ChatMessageRole.Assistant, content: request.response.responseText });
|
|
157
|
-
}
|
|
159
|
+
const history = model.messageHistory;
|
|
158
160
|
|
|
159
161
|
try {
|
|
160
162
|
const progressCallback = (progress: IChatProgress) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Injectable } from '@opensumi/di';
|
|
2
2
|
import {
|
|
3
3
|
Disposable,
|
|
4
4
|
Emitter,
|
|
@@ -8,13 +8,12 @@ import {
|
|
|
8
8
|
IChatProgress,
|
|
9
9
|
IChatToolContent,
|
|
10
10
|
IChatTreeData,
|
|
11
|
-
ILogger,
|
|
12
|
-
memoize,
|
|
13
11
|
uuid,
|
|
14
12
|
} from '@opensumi/ide-core-common';
|
|
15
13
|
import { MarkdownString, isMarkdownString } from '@opensumi/monaco-editor-core/esm/vs/base/common/htmlContent';
|
|
16
14
|
|
|
17
15
|
import {
|
|
16
|
+
CoreMessage,
|
|
18
17
|
IChatFollowup,
|
|
19
18
|
IChatModel,
|
|
20
19
|
IChatRequestMessage,
|
|
@@ -27,6 +26,8 @@ import {
|
|
|
27
26
|
import { MsgHistoryManager } from '../model/msg-history-manager';
|
|
28
27
|
import { IChatSlashCommandItem } from '../types';
|
|
29
28
|
|
|
29
|
+
import type { TextPart, ToolCallPart } from 'ai';
|
|
30
|
+
|
|
30
31
|
export type IChatProgressResponseContent =
|
|
31
32
|
| IChatMarkdownContent
|
|
32
33
|
| IChatAsyncContent
|
|
@@ -88,6 +89,7 @@ export class ChatResponseModel extends Disposable {
|
|
|
88
89
|
isComplete: boolean;
|
|
89
90
|
isCanceled: boolean;
|
|
90
91
|
responseContents: IChatProgressResponseContent[];
|
|
92
|
+
responseParts: IChatProgressResponseContent[];
|
|
91
93
|
responseText: string;
|
|
92
94
|
errorDetails: IChatResponseErrorDetails | undefined;
|
|
93
95
|
followups: IChatFollowup[] | undefined;
|
|
@@ -97,6 +99,7 @@ export class ChatResponseModel extends Disposable {
|
|
|
97
99
|
this.#requestId = requestId;
|
|
98
100
|
if (initParams) {
|
|
99
101
|
this.#responseContents = initParams.responseContents;
|
|
102
|
+
this.#responseParts = initParams.responseParts || [];
|
|
100
103
|
this.#responseText = initParams.responseText;
|
|
101
104
|
this.#isComplete = initParams.isComplete;
|
|
102
105
|
this.#isCanceled = initParams.isCanceled;
|
|
@@ -241,6 +244,7 @@ export class ChatResponseModel extends Disposable {
|
|
|
241
244
|
isCanceled: this.isCanceled,
|
|
242
245
|
responseContents: this.responseContents,
|
|
243
246
|
responseText: this.responseText,
|
|
247
|
+
responseParts: this.responseParts,
|
|
244
248
|
errorDetails: this.errorDetails,
|
|
245
249
|
followups: this.followups,
|
|
246
250
|
};
|
|
@@ -299,10 +303,64 @@ export class ChatModel extends Disposable implements IChatModel {
|
|
|
299
303
|
|
|
300
304
|
readonly history: MsgHistoryManager;
|
|
301
305
|
|
|
306
|
+
get messageHistory() {
|
|
307
|
+
const history: CoreMessage[] = [];
|
|
308
|
+
for (const request of this.requests) {
|
|
309
|
+
if (!request.response.isComplete) {
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
history.push({ role: 'user', content: request.message.prompt });
|
|
313
|
+
for (const part of request.response.responseParts) {
|
|
314
|
+
if (part.kind === 'treeData' || part.kind === 'component') {
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (part.kind !== 'toolCall') {
|
|
318
|
+
history.push({
|
|
319
|
+
role: 'assistant',
|
|
320
|
+
content: [
|
|
321
|
+
{
|
|
322
|
+
type: 'text',
|
|
323
|
+
text: part.kind === 'markdownContent' ? part.content.value : part.content,
|
|
324
|
+
},
|
|
325
|
+
],
|
|
326
|
+
});
|
|
327
|
+
} else {
|
|
328
|
+
// 直接开始toolCall场景
|
|
329
|
+
if (history[history.length - 1].role !== 'assistant') {
|
|
330
|
+
history.push({
|
|
331
|
+
role: 'assistant',
|
|
332
|
+
content: [],
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
(history[history.length - 1].content as Array<TextPart | ToolCallPart>).push({
|
|
336
|
+
type: 'tool-call',
|
|
337
|
+
toolCallId: part.content.id,
|
|
338
|
+
toolName: part.content.function.name,
|
|
339
|
+
args: JSON.parse(part.content.function.arguments || '{}'),
|
|
340
|
+
});
|
|
341
|
+
history.push({
|
|
342
|
+
role: 'tool',
|
|
343
|
+
content: [
|
|
344
|
+
{
|
|
345
|
+
type: 'tool-result',
|
|
346
|
+
toolCallId: part.content.id,
|
|
347
|
+
toolName: part.content.function.name,
|
|
348
|
+
result: JSON.parse(part.content.result || '{}'),
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return history;
|
|
356
|
+
}
|
|
357
|
+
|
|
302
358
|
addRequest(message: IChatRequestMessage): ChatRequestModel {
|
|
359
|
+
const msg = message;
|
|
360
|
+
|
|
303
361
|
const requestId = `${this.sessionId}_request_${ChatModel.requestIdPool++}`;
|
|
304
|
-
const response = new ChatResponseModel(requestId, this,
|
|
305
|
-
const request = new ChatRequestModel(requestId, this,
|
|
362
|
+
const response = new ChatResponseModel(requestId, this, msg.agentId);
|
|
363
|
+
const request = new ChatRequestModel(requestId, this, msg, response);
|
|
306
364
|
|
|
307
365
|
this.#requests.set(requestId, request);
|
|
308
366
|
return request;
|
|
@@ -12,15 +12,15 @@ import {
|
|
|
12
12
|
IAIReporter,
|
|
13
13
|
IApplicationService,
|
|
14
14
|
IChatProgress,
|
|
15
|
-
|
|
15
|
+
getOperatingSystemName,
|
|
16
16
|
} from '@opensumi/ide-core-common';
|
|
17
17
|
import { AINativeSettingSectionsId } from '@opensumi/ide-core-common/lib/settings/ai-native';
|
|
18
|
-
import { IChatMessage } from '@opensumi/ide-core-common/lib/types/ai-native';
|
|
19
18
|
import { MonacoCommandRegistry } from '@opensumi/ide-editor/lib/browser/monaco-contrib/command/command.service';
|
|
20
19
|
import { IMessageService } from '@opensumi/ide-overlay';
|
|
21
20
|
import { listenReadable } from '@opensumi/ide-utils/lib/stream';
|
|
22
21
|
|
|
23
22
|
import {
|
|
23
|
+
CoreMessage,
|
|
24
24
|
IChatAgentCommand,
|
|
25
25
|
IChatAgentRequest,
|
|
26
26
|
IChatAgentResult,
|
|
@@ -92,12 +92,14 @@ export class ChatProxyService extends Disposable {
|
|
|
92
92
|
AINativeSettingSectionsId.SystemPrompt,
|
|
93
93
|
'You are a powerful AI coding assistant working in OpenSumi, a top IDE framework. You collaborate with a USER to solve coding tasks, which may involve creating, modifying, or debugging code, or answering questions. When the USER sends a message, relevant context (e.g., open files, cursor position, edit history, linter errors) may be attached. Use this information as needed.\n\n<tool_calling>\nYou have access to tools to assist with tasks. Follow these rules:\n1. Always adhere to the tool call schema and provide all required parameters.\n2. Only use tools explicitly provided; ignore unavailable ones.\n3. Avoid mentioning tool names to the USER (e.g., say "I will edit your file" instead of "I need to use the edit_file tool").\n4. Only call tools when necessary; respond directly if the task is general or you already know the answer.\n5. Explain to the USER why you’re using a tool before calling it.\n</tool_calling>\n\n<making_code_changes>\nWhen modifying code:\n1. Use code edit tools instead of outputting code unless explicitly requested.\n2. Limit tool calls to one per turn.\n3. Ensure generated code is immediately executable by including necessary imports, dependencies, and endpoints.\n4. For new projects, create a dependency management file (e.g., requirements.txt) and a README.\n5. For web apps, design a modern, user-friendly UI.\n6. Avoid generating non-textual or excessively long code.\n7. Read file contents before editing, unless appending a small change or creating a new file.\n8. Fix introduced linter errors if possible, but stop after 3 attempts and ask the USER for guidance.\n9. Reapply reasonable code edits if they weren’t followed initially.\n</making_code_changes>\n\nUse the appropriate tools to fulfill the USER’s request, ensuring all required parameters are provided or inferred from context.',
|
|
94
94
|
) +
|
|
95
|
-
`\n\n<user_info>\nThe user's OS
|
|
95
|
+
`\n\n<user_info>\nThe user's OS is ${getOperatingSystemName()}. The absolute path of the user's workspace is ${
|
|
96
|
+
this.appConfig.workspaceDir
|
|
97
|
+
}.\n</user_info>`,
|
|
96
98
|
},
|
|
97
99
|
invoke: async (
|
|
98
100
|
request: IChatAgentRequest,
|
|
99
101
|
progress: (part: IChatProgress) => void,
|
|
100
|
-
|
|
102
|
+
history: CoreMessage[],
|
|
101
103
|
token: CancellationToken,
|
|
102
104
|
): Promise<IChatAgentResult> => {
|
|
103
105
|
this.chatDeferred = new Deferred<void>();
|
|
@@ -115,27 +117,33 @@ export class ChatProxyService extends Disposable {
|
|
|
115
117
|
}
|
|
116
118
|
|
|
117
119
|
const model = this.preferenceService.get<string>(AINativeSettingSectionsId.LLMModelSelection);
|
|
120
|
+
const modelId = this.preferenceService.get<string>(AINativeSettingSectionsId.ModelID);
|
|
118
121
|
let apiKey: string = '';
|
|
119
122
|
let baseURL: string = '';
|
|
120
123
|
if (model === 'deepseek') {
|
|
121
124
|
apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.DeepseekApiKey, '');
|
|
122
125
|
} else if (model === 'openai') {
|
|
123
126
|
apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiApiKey, '');
|
|
124
|
-
|
|
125
|
-
} else {
|
|
127
|
+
} else if (model === 'anthropic') {
|
|
126
128
|
apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.AnthropicApiKey, '');
|
|
129
|
+
} else {
|
|
130
|
+
// openai-compatible 为兜底
|
|
131
|
+
apiKey = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiApiKey, '');
|
|
132
|
+
baseURL = this.preferenceService.get<string>(AINativeSettingSectionsId.OpenaiBaseURL, '');
|
|
127
133
|
}
|
|
128
|
-
const
|
|
134
|
+
const agent = this.chatAgentService.getAgent(ChatProxyService.AGENT_ID);
|
|
129
135
|
const stream = await this.aiBackService.requestStream(
|
|
130
136
|
prompt,
|
|
131
137
|
{
|
|
132
138
|
requestId: request.requestId,
|
|
133
139
|
sessionId: request.sessionId,
|
|
134
|
-
history
|
|
140
|
+
history,
|
|
135
141
|
clientId: this.applicationService.clientId,
|
|
136
142
|
apiKey,
|
|
137
143
|
model,
|
|
144
|
+
modelId,
|
|
138
145
|
baseURL,
|
|
146
|
+
system: agent?.metadata.systemPrompt,
|
|
139
147
|
},
|
|
140
148
|
token,
|
|
141
149
|
);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Autowired, Injectable } from '@opensumi/di';
|
|
2
2
|
import { Disposable, Emitter, Event } from '@opensumi/ide-core-common';
|
|
3
|
-
import { IChatComponent, IChatContent
|
|
3
|
+
import { IChatComponent, IChatContent } from '@opensumi/ide-core-common/lib/types/ai-native';
|
|
4
4
|
import { IMainLayoutService } from '@opensumi/ide-main-layout';
|
|
5
5
|
|
|
6
6
|
import { AI_CHAT_VIEW_ID, IChatInternalService, IChatMessageListItem, IChatMessageStructure } from '../../common';
|
|
@@ -65,10 +65,6 @@ export class ChatService extends Disposable {
|
|
|
65
65
|
this._onChatMessageListLaunch.fire(list);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
public getHistoryMessages(maxInputTokens?: number): IHistoryChatMessage[] {
|
|
69
|
-
return this.chatInternalService.sessionModel?.history.getMessages(maxInputTokens) || [];
|
|
70
|
-
}
|
|
71
|
-
|
|
72
68
|
public scrollToBottom(): void {
|
|
73
69
|
this._onScrollToBottom.fire();
|
|
74
70
|
}
|
|
@@ -30,6 +30,9 @@ export class ChatInternalService extends Disposable {
|
|
|
30
30
|
private readonly _onCancelRequest = new Emitter<void>();
|
|
31
31
|
public readonly onCancelRequest: Event<void> = this._onCancelRequest.event;
|
|
32
32
|
|
|
33
|
+
private readonly _onWillClearSession = new Emitter<string>();
|
|
34
|
+
public readonly onWillClearSession: Event<string> = this._onWillClearSession.event;
|
|
35
|
+
|
|
33
36
|
private readonly _onRegenerateRequest = new Emitter<void>();
|
|
34
37
|
public readonly onRegenerateRequest: Event<void> = this._onRegenerateRequest.event;
|
|
35
38
|
|
|
@@ -83,6 +86,7 @@ export class ChatInternalService extends Disposable {
|
|
|
83
86
|
|
|
84
87
|
clearSessionModel(sessionId?: string) {
|
|
85
88
|
sessionId = sessionId || this.#sessionModel.sessionId;
|
|
89
|
+
this._onWillClearSession.fire(sessionId);
|
|
86
90
|
this.chatManagerService.clearSession(sessionId);
|
|
87
91
|
if (sessionId === this.#sessionModel.sessionId) {
|
|
88
92
|
this.#sessionModel = this.chatManagerService.startSession();
|
|
@@ -279,7 +279,6 @@
|
|
|
279
279
|
}
|
|
280
280
|
}
|
|
281
281
|
|
|
282
|
-
|
|
283
282
|
.chat_tips_container {
|
|
284
283
|
display: flex;
|
|
285
284
|
align-items: center;
|
|
@@ -290,6 +289,6 @@
|
|
|
290
289
|
}
|
|
291
290
|
|
|
292
291
|
.chat_history {
|
|
293
|
-
width: calc(100% -
|
|
292
|
+
width: calc(100% - 40px);
|
|
294
293
|
color: var(--design-text-foreground);
|
|
295
294
|
}
|