@opensumi/ide-ai-native 3.8.3-next-1741850419.0 → 3.8.3-next-1741917543.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 (101) hide show
  1. package/lib/browser/chat/chat-agent.service.d.ts +1 -1
  2. package/lib/browser/chat/chat-agent.service.d.ts.map +1 -1
  3. package/lib/browser/chat/chat-agent.service.js +7 -7
  4. package/lib/browser/chat/chat-agent.service.js.map +1 -1
  5. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  6. package/lib/browser/chat/chat.view.js +31 -69
  7. package/lib/browser/chat/chat.view.js.map +1 -1
  8. package/lib/browser/components/{chat-context/context-selector.d.ts → ChatContext/ContextSelector.d.ts} +1 -1
  9. package/lib/browser/components/ChatContext/ContextSelector.d.ts.map +1 -0
  10. package/lib/browser/components/{chat-context/context-selector.js → ChatContext/ContextSelector.js} +1 -1
  11. package/lib/browser/components/ChatContext/ContextSelector.js.map +1 -0
  12. package/lib/browser/components/ChatContext/index.d.ts.map +1 -0
  13. package/lib/browser/components/{chat-context → ChatContext}/index.js +2 -2
  14. package/lib/browser/components/ChatContext/index.js.map +1 -0
  15. package/lib/browser/components/ChatEditor.d.ts +2 -11
  16. package/lib/browser/components/ChatEditor.d.ts.map +1 -1
  17. package/lib/browser/components/ChatEditor.js +6 -66
  18. package/lib/browser/components/ChatEditor.js.map +1 -1
  19. package/lib/browser/components/ChatHistory.d.ts.map +1 -1
  20. package/lib/browser/components/ChatHistory.js +15 -15
  21. package/lib/browser/components/ChatHistory.js.map +1 -1
  22. package/lib/browser/components/ChatThinking.d.ts +1 -1
  23. package/lib/browser/components/ChatThinking.d.ts.map +1 -1
  24. package/lib/browser/components/ChatThinking.js +2 -8
  25. package/lib/browser/components/ChatThinking.js.map +1 -1
  26. package/lib/browser/components/change-list.module.less +0 -2
  27. package/lib/browser/components/chat-history.module.less +16 -33
  28. package/lib/browser/components/components.module.less +3 -39
  29. package/lib/browser/context/llm-context.service.d.ts +2 -10
  30. package/lib/browser/context/llm-context.service.d.ts.map +1 -1
  31. package/lib/browser/context/llm-context.service.js +2 -71
  32. package/lib/browser/context/llm-context.service.js.map +1 -1
  33. package/lib/browser/mcp/base-apply.service.d.ts +1 -1
  34. package/lib/browser/mcp/base-apply.service.d.ts.map +1 -1
  35. package/lib/browser/mcp/base-apply.service.js +9 -2
  36. package/lib/browser/mcp/base-apply.service.js.map +1 -1
  37. package/lib/common/llm-context.d.ts +1 -15
  38. package/lib/common/llm-context.d.ts.map +1 -1
  39. package/lib/common/llm-context.js.map +1 -1
  40. package/lib/common/prompts/context-prompt-provider.d.ts +2 -12
  41. package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
  42. package/lib/common/prompts/context-prompt-provider.js +30 -95
  43. package/lib/common/prompts/context-prompt-provider.js.map +1 -1
  44. package/lib/common/utils.d.ts +0 -1
  45. package/lib/common/utils.d.ts.map +1 -1
  46. package/lib/common/utils.js +1 -9
  47. package/lib/common/utils.js.map +1 -1
  48. package/lib/node/mcp-server.sse.d.ts.map +1 -1
  49. package/lib/node/mcp-server.sse.js +2 -2
  50. package/lib/node/mcp-server.sse.js.map +1 -1
  51. package/package.json +23 -23
  52. package/src/browser/chat/chat-agent.service.ts +7 -7
  53. package/src/browser/chat/chat.view.tsx +24 -81
  54. package/src/browser/components/{chat-context → ChatContext}/index.tsx +1 -1
  55. package/src/browser/components/ChatEditor.tsx +9 -126
  56. package/src/browser/components/ChatHistory.tsx +30 -16
  57. package/src/browser/components/ChatThinking.tsx +4 -10
  58. package/src/browser/components/change-list.module.less +0 -2
  59. package/src/browser/components/chat-history.module.less +16 -33
  60. package/src/browser/components/components.module.less +3 -39
  61. package/src/browser/context/llm-context.service.ts +3 -81
  62. package/src/browser/mcp/base-apply.service.ts +9 -2
  63. package/src/common/llm-context.ts +1 -16
  64. package/src/common/prompts/context-prompt-provider.ts +36 -130
  65. package/src/common/utils.ts +0 -8
  66. package/src/node/mcp-server.sse.ts +2 -1
  67. package/lib/browser/components/ChatMentionInput.d.ts +0 -25
  68. package/lib/browser/components/ChatMentionInput.d.ts.map +0 -1
  69. package/lib/browser/components/ChatMentionInput.js +0 -229
  70. package/lib/browser/components/ChatMentionInput.js.map +0 -1
  71. package/lib/browser/components/chat-context/context-selector.d.ts.map +0 -1
  72. package/lib/browser/components/chat-context/context-selector.js.map +0 -1
  73. package/lib/browser/components/chat-context/index.d.ts.map +0 -1
  74. package/lib/browser/components/chat-context/index.js.map +0 -1
  75. package/lib/browser/components/mention-input/mention-input.d.ts +0 -5
  76. package/lib/browser/components/mention-input/mention-input.d.ts.map +0 -1
  77. package/lib/browser/components/mention-input/mention-input.js +0 -763
  78. package/lib/browser/components/mention-input/mention-input.js.map +0 -1
  79. package/lib/browser/components/mention-input/mention-input.module.less +0 -333
  80. package/lib/browser/components/mention-input/mention-item.d.ts +0 -10
  81. package/lib/browser/components/mention-input/mention-item.d.ts.map +0 -1
  82. package/lib/browser/components/mention-input/mention-item.js +0 -16
  83. package/lib/browser/components/mention-input/mention-item.js.map +0 -1
  84. package/lib/browser/components/mention-input/mention-panel.d.ts +0 -15
  85. package/lib/browser/components/mention-input/mention-panel.d.ts.map +0 -1
  86. package/lib/browser/components/mention-input/mention-panel.js +0 -49
  87. package/lib/browser/components/mention-input/mention-panel.js.map +0 -1
  88. package/lib/browser/components/mention-input/types.d.ts +0 -78
  89. package/lib/browser/components/mention-input/types.d.ts.map +0 -1
  90. package/lib/browser/components/mention-input/types.js +0 -16
  91. package/lib/browser/components/mention-input/types.js.map +0 -1
  92. package/src/browser/components/ChatMentionInput.tsx +0 -276
  93. package/src/browser/components/mention-input/mention-input.module.less +0 -333
  94. package/src/browser/components/mention-input/mention-input.tsx +0 -952
  95. package/src/browser/components/mention-input/mention-item.tsx +0 -24
  96. package/src/browser/components/mention-input/mention-panel.tsx +0 -89
  97. package/src/browser/components/mention-input/types.ts +0 -84
  98. /package/lib/browser/components/{chat-context → ChatContext}/index.d.ts +0 -0
  99. /package/lib/browser/components/{chat-context → ChatContext}/style.module.less +0 -0
  100. /package/src/browser/components/{chat-context/context-selector.tsx → ChatContext/ContextSelector.tsx} +0 -0
  101. /package/src/browser/components/{chat-context → ChatContext}/style.module.less +0 -0
@@ -1,276 +0,0 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
-
3
- import { LabelService, RecentFilesManager, useInjectable } from '@opensumi/ide-core-browser';
4
- import { getIcon } from '@opensumi/ide-core-browser/lib/components';
5
- import { URI, localize } from '@opensumi/ide-core-common';
6
- import { CommandService } from '@opensumi/ide-core-common/lib/command';
7
- import { WorkbenchEditorService } from '@opensumi/ide-editor';
8
- import { FileSearchServicePath, IFileSearchService } from '@opensumi/ide-file-search';
9
- import { IWorkspaceService } from '@opensumi/ide-workspace';
10
-
11
- import { IChatInternalService } from '../../common';
12
- import { ChatInternalService } from '../chat/chat.internal.service';
13
- import { OPEN_MCP_CONFIG_COMMAND } from '../mcp/config/mcp-config.commands';
14
-
15
- import styles from './components.module.less';
16
- import { MentionInput } from './mention-input/mention-input';
17
- import { FooterButtonPosition, FooterConfig, MentionItem, MentionType } from './mention-input/types';
18
-
19
- export interface IChatMentionInputProps {
20
- onSend: (value: string, agentId?: string, command?: string, option?: { model: string; [key: string]: any }) => void;
21
- onValueChange?: (value: string) => void;
22
- onExpand?: (value: boolean) => void;
23
- placeholder?: string;
24
- enableOptions?: boolean;
25
- disabled?: boolean;
26
- sendBtnClassName?: string;
27
- defaultHeight?: number;
28
- value?: string;
29
- autoFocus?: boolean;
30
- theme?: string | null;
31
- setTheme: (theme: string | null) => void;
32
- agentId: string;
33
- setAgentId: (id: string) => void;
34
- defaultAgentId?: string;
35
- command: string;
36
- setCommand: (command: string) => void;
37
- }
38
-
39
- // 指令命令激活组件
40
- export const ChatMentionInput = (props: IChatMentionInputProps) => {
41
- const { onSend, disabled = false } = props;
42
-
43
- const [value, setValue] = useState(props.value || '');
44
- const aiChatService = useInjectable<ChatInternalService>(IChatInternalService);
45
- const commandService = useInjectable<CommandService>(CommandService);
46
- const searchService = useInjectable<IFileSearchService>(FileSearchServicePath);
47
- const recentFilesManager = useInjectable<RecentFilesManager>(RecentFilesManager);
48
- const workspaceService = useInjectable<IWorkspaceService>(IWorkspaceService);
49
- const editorService = useInjectable<WorkbenchEditorService>(WorkbenchEditorService);
50
- const labelService = useInjectable<LabelService>(LabelService);
51
-
52
- const handleShowMCPConfig = React.useCallback(() => {
53
- commandService.executeCommand(OPEN_MCP_CONFIG_COMMAND.id);
54
- }, [commandService]);
55
-
56
- useEffect(() => {
57
- if (props.value !== value) {
58
- setValue(props.value || '');
59
- }
60
- }, [props.value]);
61
-
62
- // 默认菜单项
63
- const defaultMenuItems: MentionItem[] = [
64
- // {
65
- // id: 'code',
66
- // type: 'code',
67
- // text: 'Code',
68
- // icon: getIcon('codebraces'),
69
- // getHighestLevelItems: () => [],
70
- // getItems: async (searchText: string) => {
71
- // const currentEditor = editorService.currentEditor;
72
- // if (!currentEditor) {
73
- // return [];
74
- // }
75
- // const currentDocumentModel = currentEditor.currentDocumentModel;
76
- // if (!currentDocumentModel) {
77
- // return [];
78
- // }
79
- // const symbols = await commandService.executeCommand('_executeFormatDocumentProvider', currentDocumentModel.uri.codeUri);
80
- // return [];
81
- // },
82
- // },
83
- {
84
- id: MentionType.FILE,
85
- type: MentionType.FILE,
86
- text: 'File',
87
- icon: getIcon('file'),
88
- getHighestLevelItems: () => {
89
- const currentEditor = editorService.currentEditor;
90
- const currentUri = currentEditor?.currentUri;
91
- if (!currentUri) {
92
- return [];
93
- }
94
- return [
95
- {
96
- id: currentUri.codeUri.fsPath,
97
- type: MentionType.FILE,
98
- text: currentUri.displayName,
99
- value: currentUri.codeUri.fsPath,
100
- description: `(${localize('aiNative.chat.defaultContextFile')})`,
101
- contextId: currentUri.codeUri.fsPath,
102
- icon: labelService.getIcon(currentUri),
103
- },
104
- ];
105
- },
106
- getItems: async (searchText: string) => {
107
- if (!searchText) {
108
- const recentFile = await recentFilesManager.getMostRecentlyOpenedFiles();
109
- return Promise.all(
110
- recentFile.map(async (file) => {
111
- const uri = new URI(file);
112
- const relatveParentPath = (await workspaceService.asRelativePath(uri.parent))?.path;
113
- return {
114
- id: uri.codeUri.fsPath,
115
- type: MentionType.FILE,
116
- text: uri.displayName,
117
- value: uri.codeUri.fsPath,
118
- description: relatveParentPath || '',
119
- contextId: uri.codeUri.fsPath,
120
- icon: labelService.getIcon(uri),
121
- };
122
- }),
123
- );
124
- } else {
125
- const rootUris = (await workspaceService.roots).map((root) => new URI(root.uri).codeUri.fsPath.toString());
126
- const results = await searchService.find(searchText, {
127
- rootUris,
128
- useGitIgnore: true,
129
- noIgnoreParent: true,
130
- fuzzyMatch: true,
131
- limit: 10,
132
- });
133
- return Promise.all(
134
- results.map(async (file) => {
135
- const uri = new URI(file);
136
- const relatveParentPath = (await workspaceService.asRelativePath(uri.parent))?.path;
137
- return {
138
- id: uri.codeUri.fsPath,
139
- type: MentionType.FILE,
140
- text: uri.displayName,
141
- value: uri.codeUri.fsPath,
142
- description: relatveParentPath || '',
143
- contextId: uri.codeUri.fsPath,
144
- icon: labelService.getIcon(uri),
145
- };
146
- }),
147
- );
148
- }
149
- },
150
- },
151
- {
152
- id: MentionType.FOLDER,
153
- type: MentionType.FOLDER,
154
- text: 'Folder',
155
- icon: getIcon('folder'),
156
- getHighestLevelItems: () => {
157
- const currentEditor = editorService.currentEditor;
158
- const currentFolderUri = currentEditor?.currentUri?.parent;
159
- if (!currentFolderUri) {
160
- return [];
161
- }
162
- if (currentFolderUri.toString() === workspaceService.workspace?.uri) {
163
- return [];
164
- }
165
- return [
166
- {
167
- id: currentFolderUri.codeUri.fsPath,
168
- type: MentionType.FOLDER,
169
- text: currentFolderUri.displayName,
170
- value: currentFolderUri.codeUri.fsPath,
171
- description: `(${localize('aiNative.chat.defaultContextFolder')})`,
172
- contextId: currentFolderUri.codeUri.fsPath,
173
- icon: getIcon('folder'),
174
- },
175
- ];
176
- },
177
- getItems: async (searchText: string) => {
178
- let folders: MentionItem[] = [];
179
- if (!searchText) {
180
- const recentFile = await recentFilesManager.getMostRecentlyOpenedFiles();
181
- const recentFolder = Array.from(new Set(recentFile.map((file) => new URI(file).parent.codeUri.fsPath)));
182
- folders = await Promise.all(
183
- recentFolder.map(async (folder) => {
184
- const uri = new URI(folder);
185
- const relativePath = await workspaceService.asRelativePath(uri);
186
- return {
187
- id: uri.codeUri.fsPath,
188
- type: MentionType.FOLDER,
189
- text: uri.displayName,
190
- value: uri.codeUri.fsPath,
191
- description: relativePath?.root ? relativePath.path : '',
192
- contextId: uri.codeUri.fsPath,
193
- icon: getIcon('folder'),
194
- };
195
- }),
196
- );
197
- } else {
198
- const rootUris = (await workspaceService.roots).map((root) => new URI(root.uri).codeUri.fsPath);
199
- const results = await searchService.find(searchText, {
200
- rootUris,
201
- useGitIgnore: true,
202
- noIgnoreParent: true,
203
- fuzzyMatch: true,
204
- limit: 10,
205
- onlyFolders: true,
206
- });
207
- folders = await Promise.all(
208
- results.map(async (folder) => {
209
- const uri = new URI(folder);
210
- return {
211
- id: uri.codeUri.fsPath,
212
- type: MentionType.FOLDER,
213
- text: uri.displayName,
214
- value: uri.codeUri.fsPath,
215
- description: (await workspaceService.asRelativePath(uri.parent))?.path || '',
216
- contextId: uri.codeUri.fsPath,
217
- icon: getIcon('folder'),
218
- };
219
- }),
220
- );
221
- }
222
- return folders.filter((folder) => folder.id !== new URI(workspaceService.workspace?.uri).codeUri.fsPath);
223
- },
224
- },
225
- ];
226
-
227
- const defaultMentionInputFooterOptions: FooterConfig = useMemo(
228
- () => ({
229
- modelOptions: [
230
- { label: 'QWQ 32B', value: 'qwq-32b' },
231
- { label: 'DeepSeek R1', value: 'deepseek-r1' },
232
- ],
233
- defaultModel: 'deepseek-r1',
234
- buttons: [
235
- {
236
- id: 'mcp-server',
237
- icon: 'mcp',
238
- title: 'MCP Server',
239
- onClick: handleShowMCPConfig,
240
- position: FooterButtonPosition.LEFT,
241
- },
242
- ],
243
- showModelSelector: true,
244
- }),
245
- [handleShowMCPConfig],
246
- );
247
-
248
- const handleStop = useCallback(() => {
249
- aiChatService.cancelRequest();
250
- }, []);
251
-
252
- const handleSend = useCallback(
253
- async (content: string, option?: { model: string; [key: string]: any }) => {
254
- if (disabled) {
255
- return;
256
- }
257
- onSend(content, undefined, undefined, option);
258
- },
259
- [onSend, editorService, disabled],
260
- );
261
-
262
- return (
263
- <div className={styles.chat_input_container}>
264
- <MentionInput
265
- mentionItems={defaultMenuItems}
266
- onSend={handleSend}
267
- onStop={handleStop}
268
- loading={disabled}
269
- labelService={labelService}
270
- workspaceService={workspaceService}
271
- placeholder={localize('aiNative.chat.input.placeholder.default')}
272
- footerConfig={defaultMentionInputFooterOptions}
273
- />
274
- </div>
275
- );
276
- };
@@ -1,333 +0,0 @@
1
- .input_container {
2
- position: relative;
3
- width: 100%;
4
- margin: 0 auto;
5
- border-radius: 4px;
6
-
7
- .model_selector {
8
- margin-right: 5px;
9
- min-width: 150px;
10
- }
11
-
12
- .editor_area {
13
- position: relative;
14
- padding: 0 15px;
15
- min-height: 42px;
16
- max-height: 105px;
17
- }
18
-
19
- .editor {
20
- width: 100%;
21
- background-color: transparent;
22
- border: none;
23
- font-size: 14px;
24
- line-height: 1.5;
25
- outline: none;
26
- resize: none;
27
- min-height: 24px;
28
- max-height: 120px;
29
- overflow-y: auto;
30
- border-radius: 4px;
31
- word-break: break-word;
32
-
33
- .mention_tag {
34
- margin: 0 2px;
35
- vertical-align: middle;
36
- }
37
- }
38
-
39
- .editor:empty:before,
40
- .editor[data-content=''] + .editor:before {
41
- content: attr(data-placeholder);
42
- color: var(--descriptionForeground);
43
- pointer-events: none;
44
- display: block;
45
- }
46
-
47
- .ai_enhance_icon {
48
- border-radius: 6px;
49
- padding: 2px 3px;
50
- display: flex;
51
- align-items: center;
52
- cursor: pointer;
53
- white-space: nowrap;
54
- box-sizing: border-box;
55
-
56
- span {
57
- color: var(--design-text-foreground);
58
- }
59
-
60
- &:hover {
61
- background-color: var(--badge-background);
62
-
63
- span {
64
- color: var(--badge-foreground);
65
- }
66
- }
67
-
68
- > span {
69
- &::before {
70
- font-size: 14px;
71
- }
72
- }
73
- }
74
-
75
- .footer {
76
- padding: 12px 15px;
77
- display: flex;
78
- justify-content: flex-start;
79
- align-items: center;
80
- flex-direction: row;
81
-
82
- .left_control {
83
- display: flex;
84
- align-items: center;
85
- justify-content: flex-start;
86
- flex-direction: row;
87
- flex: 1;
88
- }
89
-
90
- .right_control {
91
- display: flex;
92
- align-items: center;
93
- justify-content: flex-end;
94
- flex-direction: row;
95
-
96
- .send_logo,
97
- .stop_logo {
98
- background-color: var(--badge-background);
99
- color: var(--badge-foreground);
100
- .stop_logo_icon {
101
- line-height: 16px;
102
- color: var(--kt-dangerButton-background);
103
- }
104
- }
105
- .send_logo {
106
- &:hover {
107
- background-color: var(--kt-primaryButton-background);
108
-
109
- .send_logo_icon {
110
- color: var(--kt-primaryButton-foreground);
111
- }
112
- }
113
- }
114
- }
115
- }
116
-
117
- .send_button {
118
- color: var(--icon-foreground);
119
- border: none;
120
- border-radius: 4px;
121
- padding: 6px 12px;
122
- cursor: pointer;
123
- display: flex;
124
- align-items: center;
125
- justify-content: center;
126
- transition: background-color 0.2s;
127
- }
128
-
129
- .send_button:hover {
130
- background-color: var(--notification-success-background);
131
- }
132
- }
133
-
134
- .mention_panel_container {
135
- position: absolute;
136
- top: -20px;
137
- left: 0;
138
- right: 0;
139
- width: 100%;
140
- z-index: 1000;
141
- transform: translateY(-100%);
142
- display: flex;
143
- justify-content: center;
144
- }
145
-
146
- .mention_panel {
147
- background-color: var(--editor-background);
148
- color: var(--editor-foreground);
149
- border-radius: 6px;
150
- max-height: 300px;
151
- overflow-y: auto;
152
- z-index: 1000;
153
- padding: 8px 4px;
154
- width: 100%;
155
- }
156
-
157
- .mention_item {
158
- padding: 0 8px;
159
- border-radius: 8px;
160
- cursor: pointer;
161
- line-height: 22px;
162
- height: 22px;
163
- display: flex;
164
- align-items: center;
165
- transition: all 0.2s ease;
166
- justify-content: space-between;
167
- color: var(--foreground);
168
- border-radius: 4px;
169
- margin-bottom: 5px;
170
-
171
- &:last-child {
172
- margin-bottom: 0;
173
- }
174
- }
175
-
176
- .mention_list {
177
- margin: 0;
178
- padding: 0;
179
- list-style: none;
180
- }
181
-
182
- .mention_item.active {
183
- color: var(--kt-tree-inactiveSelectionForeground);
184
- background: var(--kt-tree-inactiveSelectionBackground);
185
- }
186
-
187
- .mention_item:hover:not(.active) {
188
- color: var(--kt-tree-inactiveSelectionForeground);
189
- background: var(--kt-tree-inactiveSelectionBackground);
190
- }
191
-
192
- .mention_item_left {
193
- display: flex;
194
- align-items: center;
195
- flex: 1;
196
- }
197
-
198
- .mention_item_icon {
199
- margin-right: 8px;
200
- width: 18px;
201
- height: 18px;
202
- display: flex;
203
- align-items: center;
204
- justify-content: center;
205
- }
206
-
207
- .mention_item_text {
208
- font-size: 13px;
209
- margin-right: 6px;
210
- display: inline;
211
- white-space: pre;
212
- }
213
-
214
- .mention_item_description {
215
- color: var(--descriptionForeground);
216
- font-size: 13px;
217
- display: inline;
218
- flex: 1;
219
- text-overflow: ellipsis;
220
- overflow: hidden;
221
- white-space: nowrap;
222
- margin-left: 5px;
223
- text-align: right;
224
- }
225
-
226
- .mention_item_right {
227
- color: #8b949e;
228
- font-size: 12px;
229
- }
230
-
231
- .mention_panel_title {
232
- padding: 8px 12px;
233
- font-size: 12px;
234
- display: flex;
235
- justify-content: space-between;
236
- align-items: center;
237
- }
238
-
239
- .back_button {
240
- background: none;
241
- border: none;
242
- cursor: pointer;
243
- font-size: 12px;
244
- display: flex;
245
- align-items: center;
246
- }
247
-
248
- .back_button:hover {
249
- text-decoration: underline;
250
- }
251
-
252
- .mention_tag {
253
- background-color: var(--chat-slashCommandBackground);
254
- color: var(--chat-slashCommandForeground);
255
- border-radius: 4px;
256
- padding: 0 4px;
257
- margin: 0 3px;
258
- user-select: all;
259
- cursor: default;
260
- display: inline-flex;
261
- align-items: center;
262
- justify-content: center;
263
- }
264
-
265
- .mention_icon {
266
- display: inline-flex;
267
- align-items: center;
268
- justify-content: center;
269
- margin-right: 3px;
270
- font-size: 12px;
271
- }
272
-
273
- .empty_state {
274
- padding: 5px 10px;
275
- text-align: center;
276
- color: var(--descriptionForeground);
277
- font-size: 14px;
278
- }
279
-
280
- .model_selector {
281
- margin-right: 5px;
282
- }
283
-
284
- .mcp_logo {
285
- margin-right: 5px;
286
- }
287
-
288
- .send_logo {
289
- color: var(--icon-foreground);
290
- cursor: pointer;
291
- margin-left: auto;
292
-
293
- &:hover {
294
- color: var(--notification-success-foreground);
295
- }
296
- }
297
-
298
- .popover_icon {
299
- // 移除 margin-left: auto
300
- }
301
-
302
- .loading_container {
303
- display: none;
304
- }
305
-
306
- .loading_bar {
307
- position: absolute;
308
- top: 0;
309
- left: 0;
310
- height: 2px;
311
- width: 100%;
312
- background: linear-gradient(90deg, transparent, var(--kt-primaryButton-background), transparent);
313
- background-size: 200% 100%;
314
- animation: loading-bar 1.5s infinite;
315
- z-index: 10;
316
- }
317
-
318
- @keyframes loading-bar {
319
- 0% {
320
- background-position: 100% 0;
321
- }
322
-
323
- 100% {
324
- background-position: -100% 0;
325
- }
326
- }
327
-
328
- .no_results {
329
- padding: 12px;
330
- text-align: center;
331
- color: #666;
332
- font-style: italic;
333
- }