@opensumi/ide-ai-native 3.8.3-next-1741747748.0 → 3.8.3-next-1741752385.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 (171) hide show
  1. package/lib/browser/chat/chat-agent.service.d.ts.map +1 -1
  2. package/lib/browser/chat/chat-agent.service.js +4 -4
  3. package/lib/browser/chat/chat-agent.service.js.map +1 -1
  4. package/lib/browser/chat/chat-model.d.ts +2 -2
  5. package/lib/browser/chat/chat-model.d.ts.map +1 -1
  6. package/lib/browser/chat/chat-model.js +1 -18
  7. package/lib/browser/chat/chat-model.js.map +1 -1
  8. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  9. package/lib/browser/chat/chat.view.js +16 -46
  10. package/lib/browser/chat/chat.view.js.map +1 -1
  11. package/lib/browser/components/{chat-context/context-selector.d.ts → ChatContext/ContextSelector.d.ts} +1 -1
  12. package/lib/browser/components/ChatContext/ContextSelector.d.ts.map +1 -0
  13. package/lib/browser/components/{chat-context/context-selector.js → ChatContext/ContextSelector.js} +1 -1
  14. package/lib/browser/components/ChatContext/ContextSelector.js.map +1 -0
  15. package/lib/browser/components/ChatContext/index.d.ts.map +1 -0
  16. package/lib/browser/components/{chat-context → ChatContext}/index.js +2 -2
  17. package/lib/browser/components/ChatContext/index.js.map +1 -0
  18. package/lib/browser/components/ChatReply.d.ts.map +1 -1
  19. package/lib/browser/components/ChatReply.js +17 -35
  20. package/lib/browser/components/ChatReply.js.map +1 -1
  21. package/lib/browser/components/ChatThinking.js +1 -1
  22. package/lib/browser/components/ChatThinking.js.map +1 -1
  23. package/lib/browser/components/WelcomeMsg.js +1 -1
  24. package/lib/browser/components/WelcomeMsg.js.map +1 -1
  25. package/lib/browser/components/components.module.less +0 -25
  26. package/lib/browser/context/llm-context.service.d.ts +2 -10
  27. package/lib/browser/context/llm-context.service.d.ts.map +1 -1
  28. package/lib/browser/context/llm-context.service.js +2 -71
  29. package/lib/browser/context/llm-context.service.js.map +1 -1
  30. package/lib/browser/contrib/inline-completions/prompt/matcher.js +2 -2
  31. package/lib/browser/contrib/inline-completions/prompt/similarSnippets.d.ts +1 -1
  32. package/lib/browser/contrib/inline-completions/prompt/similarSnippets.js +2 -2
  33. package/lib/browser/contrib/intelligent-completions/view/default.d.ts.map +1 -1
  34. package/lib/browser/contrib/intelligent-completions/view/default.js.map +1 -1
  35. package/lib/browser/mcp/config/components/mcp-config.view.d.ts.map +1 -1
  36. package/lib/browser/mcp/config/components/mcp-config.view.js +18 -28
  37. package/lib/browser/mcp/config/components/mcp-config.view.js.map +1 -1
  38. package/lib/browser/mcp/config/components/mcp-server-form.d.ts.map +1 -1
  39. package/lib/browser/mcp/config/components/mcp-server-form.js +25 -33
  40. package/lib/browser/mcp/config/components/mcp-server-form.js.map +1 -1
  41. package/lib/browser/mcp/mcp-server.feature.registry.js +1 -1
  42. package/lib/browser/mcp/mcp-server.feature.registry.js.map +1 -1
  43. package/lib/browser/mcp/tools/components/ExpandableFileList.d.ts.map +1 -1
  44. package/lib/browser/mcp/tools/components/ExpandableFileList.js +1 -3
  45. package/lib/browser/mcp/tools/components/ExpandableFileList.js.map +1 -1
  46. package/lib/browser/mcp/tools/components/Terminal.d.ts.map +1 -1
  47. package/lib/browser/mcp/tools/components/Terminal.js +5 -6
  48. package/lib/browser/mcp/tools/components/Terminal.js.map +1 -1
  49. package/lib/browser/mcp/tools/components/index.module.less +5 -8
  50. package/lib/browser/mcp/tools/createNewFileWithText.d.ts.map +1 -1
  51. package/lib/browser/mcp/tools/createNewFileWithText.js +0 -1
  52. package/lib/browser/mcp/tools/createNewFileWithText.js.map +1 -1
  53. package/lib/browser/mcp/tools/editFile.d.ts.map +1 -1
  54. package/lib/browser/mcp/tools/editFile.js +0 -1
  55. package/lib/browser/mcp/tools/editFile.js.map +1 -1
  56. package/lib/browser/mcp/tools/fileSearch.d.ts.map +1 -1
  57. package/lib/browser/mcp/tools/fileSearch.js +0 -1
  58. package/lib/browser/mcp/tools/fileSearch.js.map +1 -1
  59. package/lib/browser/mcp/tools/getDiagnosticsByPath.d.ts.map +1 -1
  60. package/lib/browser/mcp/tools/getDiagnosticsByPath.js +1 -2
  61. package/lib/browser/mcp/tools/getDiagnosticsByPath.js.map +1 -1
  62. package/lib/browser/mcp/tools/getOpenEditorFileDiagnostics.d.ts.map +1 -1
  63. package/lib/browser/mcp/tools/getOpenEditorFileDiagnostics.js +0 -2
  64. package/lib/browser/mcp/tools/getOpenEditorFileDiagnostics.js.map +1 -1
  65. package/lib/browser/mcp/tools/grepSearch.d.ts.map +1 -1
  66. package/lib/browser/mcp/tools/grepSearch.js +0 -1
  67. package/lib/browser/mcp/tools/grepSearch.js.map +1 -1
  68. package/lib/browser/mcp/tools/listDir.d.ts.map +1 -1
  69. package/lib/browser/mcp/tools/listDir.js +0 -1
  70. package/lib/browser/mcp/tools/listDir.js.map +1 -1
  71. package/lib/browser/mcp/tools/readFile.d.ts.map +1 -1
  72. package/lib/browser/mcp/tools/readFile.js +0 -1
  73. package/lib/browser/mcp/tools/readFile.js.map +1 -1
  74. package/lib/browser/mcp/tools/runTerminalCmd.d.ts.map +1 -1
  75. package/lib/browser/mcp/tools/runTerminalCmd.js +0 -1
  76. package/lib/browser/mcp/tools/runTerminalCmd.js.map +1 -1
  77. package/lib/browser/types.d.ts +0 -1
  78. package/lib/browser/types.d.ts.map +1 -1
  79. package/lib/browser/widget/inline-diff/inline-diff-manager.d.ts.map +1 -1
  80. package/lib/browser/widget/inline-diff/inline-diff-manager.js.map +1 -1
  81. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts.map +1 -1
  82. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js +5 -10
  83. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js.map +1 -1
  84. package/lib/common/llm-context.d.ts +1 -15
  85. package/lib/common/llm-context.d.ts.map +1 -1
  86. package/lib/common/llm-context.js.map +1 -1
  87. package/lib/common/prompts/context-prompt-provider.d.ts.map +1 -1
  88. package/lib/common/prompts/context-prompt-provider.js +21 -26
  89. package/lib/common/prompts/context-prompt-provider.js.map +1 -1
  90. package/lib/node/base-language-model.d.ts.map +1 -1
  91. package/lib/node/base-language-model.js +0 -6
  92. package/lib/node/base-language-model.js.map +1 -1
  93. package/package.json +23 -24
  94. package/src/browser/chat/chat-agent.service.ts +4 -4
  95. package/src/browser/chat/chat-model.ts +2 -19
  96. package/src/browser/chat/chat.view.tsx +19 -47
  97. package/src/browser/components/{chat-context → ChatContext}/index.tsx +1 -1
  98. package/src/browser/components/ChatReply.tsx +18 -61
  99. package/src/browser/components/ChatThinking.tsx +1 -1
  100. package/src/browser/components/WelcomeMsg.tsx +1 -1
  101. package/src/browser/components/components.module.less +0 -25
  102. package/src/browser/context/llm-context.service.ts +3 -83
  103. package/src/browser/contrib/inline-completions/prompt/matcher.ts +2 -2
  104. package/src/browser/contrib/inline-completions/prompt/similarSnippets.ts +2 -2
  105. package/src/browser/contrib/intelligent-completions/view/default.ts +1 -0
  106. package/src/browser/mcp/config/components/mcp-config.view.tsx +12 -23
  107. package/src/browser/mcp/config/components/mcp-server-form.tsx +54 -68
  108. package/src/browser/mcp/mcp-server.feature.registry.ts +1 -1
  109. package/src/browser/mcp/tools/components/ExpandableFileList.tsx +1 -4
  110. package/src/browser/mcp/tools/components/Terminal.tsx +6 -4
  111. package/src/browser/mcp/tools/components/index.module.less +5 -8
  112. package/src/browser/mcp/tools/createNewFileWithText.ts +0 -1
  113. package/src/browser/mcp/tools/editFile.ts +0 -1
  114. package/src/browser/mcp/tools/fileSearch.ts +0 -1
  115. package/src/browser/mcp/tools/getDiagnosticsByPath.ts +1 -2
  116. package/src/browser/mcp/tools/getOpenEditorFileDiagnostics.ts +0 -2
  117. package/src/browser/mcp/tools/grepSearch.ts +0 -1
  118. package/src/browser/mcp/tools/listDir.ts +0 -1
  119. package/src/browser/mcp/tools/readFile.ts +0 -1
  120. package/src/browser/mcp/tools/runTerminalCmd.ts +0 -1
  121. package/src/browser/types.ts +0 -1
  122. package/src/browser/widget/inline-diff/inline-diff-manager.tsx +1 -0
  123. package/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +5 -9
  124. package/src/common/llm-context.ts +1 -16
  125. package/src/common/prompts/context-prompt-provider.ts +24 -31
  126. package/src/node/base-language-model.ts +0 -5
  127. package/lib/browser/components/ChatMentionInput.d.ts +0 -25
  128. package/lib/browser/components/ChatMentionInput.d.ts.map +0 -1
  129. package/lib/browser/components/ChatMentionInput.js +0 -221
  130. package/lib/browser/components/ChatMentionInput.js.map +0 -1
  131. package/lib/browser/components/chat-context/context-selector.d.ts.map +0 -1
  132. package/lib/browser/components/chat-context/context-selector.js.map +0 -1
  133. package/lib/browser/components/chat-context/index.d.ts.map +0 -1
  134. package/lib/browser/components/chat-context/index.js.map +0 -1
  135. package/lib/browser/components/mention-input/mention-input.d.ts +0 -5
  136. package/lib/browser/components/mention-input/mention-input.d.ts.map +0 -1
  137. package/lib/browser/components/mention-input/mention-input.js +0 -734
  138. package/lib/browser/components/mention-input/mention-input.js.map +0 -1
  139. package/lib/browser/components/mention-input/mention-input.module.less +0 -309
  140. package/lib/browser/components/mention-input/mention-item.d.ts +0 -10
  141. package/lib/browser/components/mention-input/mention-item.d.ts.map +0 -1
  142. package/lib/browser/components/mention-input/mention-item.js +0 -16
  143. package/lib/browser/components/mention-input/mention-item.js.map +0 -1
  144. package/lib/browser/components/mention-input/mention-panel.d.ts +0 -15
  145. package/lib/browser/components/mention-input/mention-panel.d.ts.map +0 -1
  146. package/lib/browser/components/mention-input/mention-panel.js +0 -49
  147. package/lib/browser/components/mention-input/mention-panel.js.map +0 -1
  148. package/lib/browser/components/mention-input/types.d.ts +0 -74
  149. package/lib/browser/components/mention-input/types.d.ts.map +0 -1
  150. package/lib/browser/components/mention-input/types.js +0 -16
  151. package/lib/browser/components/mention-input/types.js.map +0 -1
  152. package/lib/browser/mcp/tools/components/computeAnsiLogString.d.ts +0 -4
  153. package/lib/browser/mcp/tools/components/computeAnsiLogString.d.ts.map +0 -1
  154. package/lib/browser/mcp/tools/components/computeAnsiLogString.js +0 -22
  155. package/lib/browser/mcp/tools/components/computeAnsiLogString.js.map +0 -1
  156. package/lib/browser/mcp/tools/components/filterEraseMultipleLine.d.ts +0 -18
  157. package/lib/browser/mcp/tools/components/filterEraseMultipleLine.d.ts.map +0 -1
  158. package/lib/browser/mcp/tools/components/filterEraseMultipleLine.js +0 -69
  159. package/lib/browser/mcp/tools/components/filterEraseMultipleLine.js.map +0 -1
  160. package/src/browser/components/ChatMentionInput.tsx +0 -267
  161. package/src/browser/components/mention-input/mention-input.module.less +0 -309
  162. package/src/browser/components/mention-input/mention-input.tsx +0 -913
  163. package/src/browser/components/mention-input/mention-item.tsx +0 -24
  164. package/src/browser/components/mention-input/mention-panel.tsx +0 -89
  165. package/src/browser/components/mention-input/types.ts +0 -79
  166. package/src/browser/mcp/tools/components/computeAnsiLogString.ts +0 -24
  167. package/src/browser/mcp/tools/components/filterEraseMultipleLine.ts +0 -71
  168. /package/lib/browser/components/{chat-context → ChatContext}/index.d.ts +0 -0
  169. /package/lib/browser/components/{chat-context → ChatContext}/style.module.less +0 -0
  170. /package/src/browser/components/{chat-context/context-selector.tsx → ChatContext/ContextSelector.tsx} +0 -0
  171. /package/src/browser/components/{chat-context → ChatContext}/style.module.less +0 -0
@@ -1,69 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.cursorUp = exports.eraseEndLine = exports.eraseLine = exports.ESC = void 0;
4
- exports.default = filterEraseMultipleLine;
5
- exports.ESC = '\u001B[';
6
- exports.eraseLine = exports.ESC + '2K';
7
- exports.eraseEndLine = exports.ESC + 'K';
8
- const cursorUp = (count = 1) => exports.ESC + count + 'A';
9
- exports.cursorUp = cursorUp;
10
- /**
11
- * 处理过滤清空上行,清空本行逻辑。
12
- *
13
- * 关于清空上 n 行:
14
- * 一般在日志中,出现覆盖上行的情况,ascii 编码为 2K [1A 2K ...] 1G 的样式。 如 \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[G\r\n,代表清空上两行。
15
- * 其中,2K 代表清空整行,1A 代表光标上移,配合下一个 2K 则最终效果为清空上行,而 1G 是移动光标到本行开始(位置 1)。
16
- * 在日志过滤过程中,可以只处理 1A 2K 这个序列,遇到后把该日志的上一行删掉即可。
17
- *
18
- * 关于清空本行,按顺序执行:
19
- * 1. 在当前行没有 Cursor 操作符(如上移时),匹配最后一个 [2K (清空本行)或 \r[K(指针回 0,再清空本行到末尾,相当于清空本行),只输出 [2K 后的内容,
20
- * 2. 在当前行没有 Cursor 操作符时且有多个 \r (carriage return charactor,移动光标到行首)时,reduce 按 \r \x1b[G 或 \x1b[1G 切分的片断,不段用后一 part 的部分从头覆盖得出结果。
21
- */
22
- function filterEraseMultipleLine(logs) {
23
- // 上移 cursor + 清空整行
24
- const eraseLastLine = (0, exports.cursorUp)(1) + exports.eraseLine;
25
- const eraseCurrentLine = exports.eraseLine;
26
- const eraseCurrentLine2 = `\r${exports.eraseEndLine}`;
27
- const moveCursorToLeftRegStrs = ['\\r', '\\u001b\\[G', '\\u001b\\[1G'];
28
- const moveCursorToLeftRegStr = new RegExp(`${moveCursorToLeftRegStrs.join('|')}`);
29
- const filteredLogs = logs.reduce((acc, nowLine) => {
30
- // 当前清空上行搜索指针
31
- let pos = 0;
32
- const step = eraseLastLine.length;
33
- while (true) {
34
- pos = nowLine.indexOf(eraseLastLine, pos);
35
- // 出现清空上行
36
- if (pos >= 0) {
37
- pos += step;
38
- acc.pop();
39
- }
40
- else {
41
- break;
42
- }
43
- }
44
- // 对单行日志的重写做处理
45
- // 简单处理,不去解析真正的 Cursor 所在行,否则逻辑过于麻烦
46
- // 处理 [2K
47
- let lastErasePos = nowLine.lastIndexOf(eraseCurrentLine);
48
- if (lastErasePos < 0) {
49
- // 处理 \r[K
50
- lastErasePos = nowLine.lastIndexOf(eraseCurrentLine2);
51
- }
52
- if (lastErasePos > 0) {
53
- // 从后向前搜索最后一个清行操作
54
- nowLine = nowLine.slice(lastErasePos);
55
- }
56
- // 处理多 \r 情况,当 \r 连续时,切分出的空字段无用,过滤掉
57
- const carriageRewrites = nowLine.split(moveCursorToLeftRegStr).filter((part) => !!part);
58
- if (carriageRewrites.length > 1) {
59
- nowLine = carriageRewrites.reduce((nextNowLine, nowPart) => {
60
- const leftPart = nextNowLine.slice(nowPart.length);
61
- return nowPart + leftPart;
62
- }, '');
63
- }
64
- acc.push(nowLine);
65
- return acc;
66
- }, []);
67
- return filteredLogs;
68
- }
69
- //# sourceMappingURL=filterEraseMultipleLine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filterEraseMultipleLine.js","sourceRoot":"","sources":["../../../../../src/browser/mcp/tools/components/filterEraseMultipleLine.ts"],"names":[],"mappings":";;;AAkBA,0CAoDC;AAtEY,QAAA,GAAG,GAAG,SAAS,CAAC;AAChB,QAAA,SAAS,GAAG,WAAG,GAAG,IAAI,CAAC;AACvB,QAAA,YAAY,GAAG,WAAG,GAAG,GAAG,CAAC;AAE/B,MAAM,QAAQ,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,WAAG,GAAG,KAAK,GAAG,GAAG,CAAC;AAA5C,QAAA,QAAQ,YAAoC;AAEzD;;;;;;;;;;;GAWG;AACH,SAAwB,uBAAuB,CAAC,IAAc;IAC5D,mBAAmB;IACnB,MAAM,aAAa,GAAG,IAAA,gBAAQ,EAAC,CAAC,CAAC,GAAG,iBAAS,CAAC;IAC9C,MAAM,gBAAgB,GAAG,iBAAS,CAAC;IACnC,MAAM,iBAAiB,GAAG,KAAK,oBAAY,EAAE,CAAC;IAE9C,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IACvE,MAAM,sBAAsB,GAAG,IAAI,MAAM,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAElF,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAa,EAAE,OAAO,EAAE,EAAE;QAC1D,aAAa;QACb,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC;QAElC,OAAO,IAAI,EAAE,CAAC;YACZ,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC1C,SAAS;YACT,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBACb,GAAG,IAAI,IAAI,CAAC;gBACZ,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,cAAc;QACd,mCAAmC;QACnC,SAAS;QACT,IAAI,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QACzD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,UAAU;YACV,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,iBAAiB;YACjB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC;QAED,mCAAmC;QACnC,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE;gBACzD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACnD,OAAO,OAAO,GAAG,QAAQ,CAAC;YAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;QACT,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -1,267 +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 = React.forwardRef((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
- return {
113
- id: uri.codeUri.fsPath,
114
- type: MentionType.FILE,
115
- text: uri.displayName,
116
- value: uri.codeUri.fsPath,
117
- description: (await workspaceService.asRelativePath(uri.parent))?.path || '',
118
- contextId: uri.codeUri.fsPath,
119
- icon: labelService.getIcon(uri),
120
- };
121
- }),
122
- );
123
- } else {
124
- const rootUris = (await workspaceService.roots).map((root) => new URI(root.uri).codeUri.fsPath.toString());
125
- const results = await searchService.find(searchText, {
126
- rootUris,
127
- useGitIgnore: true,
128
- noIgnoreParent: true,
129
- fuzzyMatch: true,
130
- limit: 10,
131
- });
132
- return Promise.all(
133
- results.map(async (file) => {
134
- const uri = new URI(file);
135
- return {
136
- id: uri.codeUri.fsPath,
137
- type: MentionType.FILE,
138
- text: uri.displayName,
139
- value: uri.codeUri.fsPath,
140
- description: (await workspaceService.asRelativePath(uri.parent))?.path || '',
141
- contextId: uri.codeUri.fsPath,
142
- icon: labelService.getIcon(uri),
143
- };
144
- }),
145
- );
146
- }
147
- },
148
- },
149
- {
150
- id: MentionType.FOLDER,
151
- type: MentionType.FOLDER,
152
- text: 'Folder',
153
- icon: getIcon('folder'),
154
- getHighestLevelItems: () => {
155
- const currentEditor = editorService.currentEditor;
156
- const currentFolderUri = currentEditor?.currentUri?.parent;
157
- if (!currentFolderUri) {
158
- return [];
159
- }
160
- return [
161
- {
162
- id: currentFolderUri.codeUri.fsPath,
163
- type: MentionType.FOLDER,
164
- text: currentFolderUri.displayName,
165
- value: currentFolderUri.codeUri.fsPath,
166
- description: `(${localize('aiNative.chat.defaultContextFolder')})`,
167
- contextId: currentFolderUri.codeUri.fsPath,
168
- icon: getIcon('folder'),
169
- },
170
- ];
171
- },
172
- getItems: async (searchText: string) => {
173
- if (!searchText) {
174
- const recentFile = await recentFilesManager.getMostRecentlyOpenedFiles();
175
- const recentFolder = Array.from(new Set(recentFile.map((file) => new URI(file).parent.codeUri.fsPath)));
176
- return Promise.all(
177
- recentFolder.map(async (folder) => {
178
- const uri = new URI(folder);
179
- const relativePath = await workspaceService.asRelativePath(uri);
180
- return {
181
- id: uri.codeUri.fsPath,
182
- type: MentionType.FOLDER,
183
- text: uri.displayName,
184
- value: uri.codeUri.fsPath,
185
- description: relativePath?.root ? relativePath.path : '',
186
- contextId: uri.codeUri.fsPath,
187
- icon: getIcon('folder'),
188
- };
189
- }),
190
- );
191
- } else {
192
- const rootUris = (await workspaceService.roots).map((root) => new URI(root.uri).codeUri.fsPath.toString());
193
- const results = await searchService.find(searchText, {
194
- rootUris,
195
- useGitIgnore: true,
196
- noIgnoreParent: true,
197
- fuzzyMatch: true,
198
- limit: 10,
199
- onlyFolders: true,
200
- });
201
- return Promise.all(
202
- results.map(async (folder) => {
203
- const uri = new URI(folder);
204
- return {
205
- id: uri.codeUri.fsPath,
206
- type: MentionType.FOLDER,
207
- text: uri.displayName,
208
- value: uri.codeUri.fsPath,
209
- description: (await workspaceService.asRelativePath(uri.parent))?.path || '',
210
- contextId: uri.codeUri.fsPath,
211
- icon: getIcon('folder'),
212
- };
213
- }),
214
- );
215
- }
216
- },
217
- },
218
- ];
219
-
220
- const defaultMentionInputFooterOptions: FooterConfig = useMemo(
221
- () => ({
222
- modelOptions: [
223
- { label: 'QWQ 32B', value: 'qwq-32b' },
224
- { label: 'DeepSeek R1', value: 'deepseek-r1' },
225
- ],
226
- defaultModel: 'deepseek-r1',
227
- buttons: [
228
- {
229
- id: 'mcp-server',
230
- icon: 'mcp',
231
- title: 'MCP Server',
232
- onClick: handleShowMCPConfig,
233
- position: FooterButtonPosition.LEFT,
234
- },
235
- ],
236
- showModelSelector: true,
237
- }),
238
- [handleShowMCPConfig],
239
- );
240
-
241
- const handleStop = useCallback(() => {
242
- aiChatService.cancelRequest();
243
- }, []);
244
-
245
- const handleSend = useCallback(
246
- async (content: string, option?: { model: string; [key: string]: any }) => {
247
- if (disabled) {
248
- return;
249
- }
250
- onSend(content, undefined, undefined, option);
251
- },
252
- [onSend, editorService, disabled],
253
- );
254
-
255
- return (
256
- <div className={styles.chat_input_container}>
257
- <MentionInput
258
- mentionItems={defaultMenuItems}
259
- onSend={handleSend}
260
- onStop={handleStop}
261
- loading={disabled}
262
- placeholder={localize('aiNative.chat.input.placeholder.default')}
263
- footerConfig={defaultMentionInputFooterOptions}
264
- />
265
- </div>
266
- );
267
- });
@@ -1,309 +0,0 @@
1
- .input_container {
2
- position: relative;
3
- width: 100%;
4
- margin: 0 auto;
5
- border-radius: 4px;
6
- .model_selector {
7
- margin-right: 5px;
8
- }
9
-
10
- .editor_area {
11
- position: relative;
12
- padding: 0 15px;
13
- min-height: 42px;
14
- max-height: 105px;
15
- }
16
-
17
- .editor {
18
- width: 100%;
19
- background-color: transparent;
20
- border: none;
21
- font-size: 14px;
22
- line-height: 1.5;
23
- outline: none;
24
- resize: none;
25
- min-height: 24px;
26
- max-height: 120px;
27
- overflow-y: auto;
28
- border-radius: 4px;
29
- word-break: break-word;
30
-
31
- .mention_tag {
32
- margin: 0 2px;
33
- vertical-align: middle;
34
- }
35
- }
36
-
37
- .editor:empty:before,
38
- .editor[data-content=''] + .editor:before {
39
- content: attr(data-placeholder);
40
- color: var(--descriptionForeground);
41
- pointer-events: none;
42
- display: block;
43
- }
44
-
45
- .ai_enhance_icon {
46
- border-radius: 6px;
47
- padding: 2px 3px;
48
- display: flex;
49
- align-items: center;
50
- cursor: pointer;
51
- text-wrap: nowrap;
52
- white-space: nowrap;
53
- box-sizing: border-box;
54
-
55
- span {
56
- color: var(--design-text-foreground);
57
- }
58
- &:hover {
59
- background-color: var(--badge-background);
60
- span {
61
- color: var(--badge-foreground);
62
- }
63
- }
64
-
65
- > span {
66
- &::before {
67
- font-size: 14px;
68
- }
69
- }
70
- }
71
-
72
- .footer {
73
- padding: 12px 15px;
74
- display: flex;
75
- justify-content: flex-start;
76
- align-items: center;
77
- flex-direction: row;
78
- .left_control {
79
- display: flex;
80
- align-items: center;
81
- justify-content: flex-start;
82
- flex-direction: row;
83
- flex: 1;
84
- }
85
- .right_control {
86
- display: flex;
87
- align-items: center;
88
- justify-content: flex-end;
89
- flex-direction: row;
90
- .send_logo,
91
- .stop_logo {
92
- background-color: var(--badge-background);
93
- color: var(--badge-foreground);
94
- &:hover {
95
- background-color: var(--kt-primaryButton-background);
96
- .send_logo_icon,
97
- .stop_logo_icon {
98
- color: var(--kt-primaryButton-foreground);
99
- }
100
- }
101
- }
102
- }
103
- }
104
-
105
- .send_button {
106
- color: var(--icon-foreground);
107
- border: none;
108
- border-radius: 4px;
109
- padding: 6px 12px;
110
- cursor: pointer;
111
- display: flex;
112
- align-items: center;
113
- justify-content: center;
114
- transition: background-color 0.2s;
115
- }
116
-
117
- .send_button:hover {
118
- background-color: var(--notification-success-background);
119
- }
120
- }
121
-
122
- .mention_panel_container {
123
- position: absolute;
124
- top: -20px;
125
- left: 0;
126
- right: 0;
127
- width: 100%;
128
- z-index: 1000;
129
- transform: translateY(-100%);
130
- display: flex;
131
- justify-content: center;
132
- }
133
-
134
- .mention_panel {
135
- background-color: var(--editor-background);
136
- color: var(--editor-foreground);
137
- border-radius: 6px;
138
- max-height: 300px;
139
- overflow-y: auto;
140
- z-index: 1000;
141
- padding: 8px 4px;
142
- width: 100%;
143
- }
144
-
145
- .mention_item {
146
- padding: 0 8px;
147
- border-radius: 8px;
148
- cursor: pointer;
149
- line-height: 22px;
150
- height: 22px;
151
- display: flex;
152
- align-items: center;
153
- transition: all 0.2s ease;
154
- justify-content: space-between;
155
- color: var(--foreground);
156
- border-radius: 4px;
157
- margin-bottom: 5px;
158
- &:last-child {
159
- margin-bottom: 0;
160
- }
161
- }
162
-
163
- .mention_list {
164
- margin: 0;
165
- padding: 0;
166
- list-style: none;
167
- }
168
-
169
- .mention_item.active {
170
- color: var(--kt-tree-inactiveSelectionForeground);
171
- background: var(--kt-tree-inactiveSelectionBackground);
172
- }
173
-
174
- .mention_item:hover:not(.active) {
175
- color: var(--kt-tree-inactiveSelectionForeground);
176
- background: var(--kt-tree-inactiveSelectionBackground);
177
- }
178
-
179
- .mention_item_left {
180
- display: flex;
181
- align-items: center;
182
- flex: 1;
183
- }
184
-
185
- .mention_item_icon {
186
- margin-right: 8px;
187
- width: 18px;
188
- height: 18px;
189
- display: flex;
190
- align-items: center;
191
- justify-content: center;
192
- }
193
-
194
- .mention_item_text {
195
- font-size: 13px;
196
- margin-right: 6px;
197
- display: inline;
198
- white-space: pre;
199
- }
200
-
201
- .mention_item_description {
202
- color: var(--descriptionForeground);
203
- font-size: 13px;
204
- display: inline;
205
- flex: 1;
206
- text-overflow: ellipsis;
207
- overflow: hidden;
208
- white-space: nowrap;
209
- margin-left: 5px;
210
- text-align: right;
211
- }
212
-
213
- .mention_item_right {
214
- color: #8b949e;
215
- font-size: 12px;
216
- }
217
-
218
- .mention_panel_title {
219
- padding: 8px 12px;
220
- font-size: 12px;
221
- display: flex;
222
- justify-content: space-between;
223
- align-items: center;
224
- }
225
-
226
- .back_button {
227
- background: none;
228
- border: none;
229
- cursor: pointer;
230
- font-size: 12px;
231
- display: flex;
232
- align-items: center;
233
- }
234
-
235
- .back_button:hover {
236
- text-decoration: underline;
237
- }
238
-
239
- .mention_tag {
240
- background-color: var(--chat-slashCommandBackground);
241
- color: var(--chat-slashCommandForeground);
242
- border-radius: 4px;
243
- padding: 0 4px;
244
- margin: 0 3px;
245
- display: inline-block;
246
- user-select: all;
247
- cursor: default;
248
- }
249
-
250
- .empty_state {
251
- padding: 5px 10px;
252
- text-align: center;
253
- color: var(--descriptionForeground);
254
- font-size: 14px;
255
- }
256
-
257
- .model_selector {
258
- margin-right: 5px;
259
- }
260
-
261
- .mcp_logo {
262
- margin-right: 5px;
263
- }
264
-
265
- .send_logo {
266
- color: var(--icon-foreground);
267
- cursor: pointer;
268
- margin-left: auto;
269
-
270
- &:hover {
271
- color: var(--notification-success-foreground);
272
- }
273
- }
274
-
275
- .popover_icon {
276
- // 移除 margin-left: auto
277
- }
278
-
279
- .loading_container {
280
- display: none;
281
- }
282
-
283
- .loading_bar {
284
- position: absolute;
285
- top: 0;
286
- left: 0;
287
- height: 2px;
288
- width: 100%;
289
- background: linear-gradient(90deg, transparent, var(--kt-primaryButton-background), transparent);
290
- background-size: 200% 100%;
291
- animation: loading-bar 1.5s infinite;
292
- z-index: 10;
293
- }
294
-
295
- @keyframes loading-bar {
296
- 0% {
297
- background-position: 100% 0;
298
- }
299
- 100% {
300
- background-position: -100% 0;
301
- }
302
- }
303
-
304
- .no_results {
305
- padding: 12px;
306
- text-align: center;
307
- color: #666;
308
- font-style: italic;
309
- }