@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,24 +0,0 @@
1
- import cls from 'classnames';
2
- import * as React from 'react';
3
-
4
- import { Icon, getIcon } from '@opensumi/ide-core-browser/lib/components';
5
-
6
- import styles from './mention-input.module.less';
7
- import { MentionItem as MentionItemType } from './types';
8
-
9
- interface MentionItemProps {
10
- item: MentionItemType;
11
- isActive: boolean;
12
- onClick: (item: MentionItemType) => void;
13
- }
14
-
15
- export const MentionItem: React.FC<MentionItemProps> = ({ item, isActive, onClick }) => (
16
- <div className={`${styles.mention_item} ${isActive ? styles.active : ''}`} onClick={() => onClick(item)}>
17
- <div className={styles.mention_item_left}>
18
- <Icon className={cls(styles.mention_item_icon, item.icon)} />
19
- <span className={styles.mention_item_text}>{item.text}</span>
20
- <span className={styles.mention_item_description}>{item.description}</span>
21
- </div>
22
- {item.getItems && <Icon className={cls(styles.mention_item_right, getIcon('arrowright'))} />}
23
- </div>
24
- );
@@ -1,89 +0,0 @@
1
- import * as React from 'react';
2
-
3
- import styles from './mention-input.module.less';
4
- import { MentionItem } from './mention-item';
5
- import { MentionItem as MentionItemType, MentionPosition } from './types';
6
-
7
- interface MentionPanelProps {
8
- items: MentionItemType[];
9
- activeIndex: number;
10
- onSelectItem: (item: MentionItemType, isTriggerByClick?: boolean) => void;
11
- position: MentionPosition;
12
- filter: string;
13
- visible: boolean;
14
- level: number;
15
- loading?: boolean;
16
- }
17
-
18
- export const MentionPanel: React.FC<MentionPanelProps> = ({
19
- items,
20
- activeIndex,
21
- onSelectItem,
22
- position,
23
- filter,
24
- visible,
25
- level,
26
- loading = false,
27
- }) => {
28
- const panelRef = React.useRef<HTMLDivElement>(null);
29
-
30
- // 当活动项改变时滚动到可见区域
31
- React.useEffect(() => {
32
- if (visible && panelRef.current) {
33
- const activeItem = panelRef.current.querySelector(`.${styles.mention_item}.${styles.active}`);
34
- if (activeItem) {
35
- activeItem.scrollIntoView({ block: 'nearest' });
36
- }
37
- }
38
- }, [activeIndex, visible]);
39
-
40
- if (!visible) {
41
- return null;
42
- }
43
-
44
- // 根据过滤条件筛选项目
45
- const getFilteredItems = () => {
46
- let filteredItems = items;
47
-
48
- if (level === 0) {
49
- // 一级菜单根据 @ 后面的文本过滤
50
- if (filter && filter.length > 1) {
51
- const searchText = filter.substring(1).toLowerCase();
52
- filteredItems = items.filter((item) => item.text.toLowerCase().includes(searchText));
53
- }
54
- } else {
55
- // 二级菜单根据 @file: 后面的文本过滤
56
- if (filter && filter.length > 0) {
57
- filteredItems = items.filter((item) => item.text.toLowerCase().includes(filter.toLowerCase()));
58
- }
59
- }
60
-
61
- return filteredItems;
62
- };
63
-
64
- const filteredItems = getFilteredItems();
65
-
66
- if (level === 0 && filteredItems.length === 0) {
67
- return null;
68
- }
69
-
70
- return (
71
- <div ref={panelRef} className={styles.mention_panel} style={{ top: position.top, left: position.left }}>
72
- {loading && <div className={styles.loading_bar}></div>}
73
- {items.length > 0 ? (
74
- <ul className={styles.mention_list}>
75
- {items.map((item, index) => (
76
- <MentionItem
77
- key={item.id}
78
- item={item}
79
- isActive={index === activeIndex}
80
- onClick={() => onSelectItem(item, true)}
81
- />
82
- ))}
83
- </ul>
84
- ) : (
85
- <div className={styles.no_results}>{loading ? '正在搜索...' : '无匹配结果'}</div>
86
- )}
87
- </div>
88
- );
89
- };
@@ -1,79 +0,0 @@
1
- export interface MentionItem {
2
- id: string;
3
- type: string;
4
- text: string;
5
- value?: string;
6
- description?: string;
7
- contextId?: string;
8
- icon?: string;
9
- getHighestLevelItems?: () => MentionItem[];
10
- getItems?: (searchText: string) => Promise<MentionItem[]>;
11
- }
12
-
13
- export interface SecondLevelMenuConfig {
14
- getDefaultItems: () => MentionItem[];
15
- getHighestLevelItems: () => MentionItem[];
16
- }
17
-
18
- export interface MentionPosition {
19
- top: number;
20
- left: number;
21
- }
22
-
23
- export interface MentionState {
24
- active: boolean;
25
- startPos: number | null;
26
- filter: string;
27
- position: MentionPosition;
28
- activeIndex: number;
29
- level: number; // 0: 一级菜单, 1: 二级菜单
30
- parentType: string | null; // 二级菜单的父类型
31
- secondLevelFilter: string; // 二级菜单的筛选文本
32
- inlineSearchActive: boolean; // 是否在输入框中进行二级搜索
33
- inlineSearchStartPos: number | null; // 内联搜索的起始位置
34
- loading: boolean; // 加载状态
35
- }
36
-
37
- interface ModelOption {
38
- label: string;
39
- value: string;
40
- }
41
-
42
- export enum FooterButtonPosition {
43
- LEFT = 'left',
44
- RIGHT = 'right',
45
- }
46
-
47
- export enum MentionType {
48
- FILE = 'file',
49
- FOLDER = 'folder',
50
- CODE = 'code',
51
- }
52
-
53
- interface FooterButton {
54
- id: string;
55
- icon: string;
56
- title: string;
57
- onClick?: () => void;
58
- position: FooterButtonPosition;
59
- }
60
-
61
- export interface FooterConfig {
62
- modelOptions?: ModelOption[];
63
- defaultModel?: string;
64
- buttons?: FooterButton[];
65
- showModelSelector?: boolean;
66
- }
67
-
68
- export interface MentionInputProps {
69
- mentionItems?: MentionItem[]; // 简化为单一菜单项配置
70
- onSend?: (content: string, config?: { model: string; [key: string]: any }) => void;
71
- onStop?: () => void;
72
- placeholder?: string;
73
- loading?: boolean;
74
- onSelectionChange?: (value: string) => void;
75
- footerConfig?: FooterConfig; // 新增配置项
76
- mentionKeyword?: string;
77
- }
78
-
79
- export const MENTION_KEYWORD = '@';
@@ -1,24 +0,0 @@
1
- import AnsiUp from 'ansi_up';
2
-
3
- import filterEraseMultipleLine from './filterEraseMultipleLine';
4
-
5
- type LogContent = string;
6
-
7
- const ansiUp = new AnsiUp();
8
-
9
- export function computeAnsiLogString(logs: LogContent, enableEraseLineFilter = true, hideEmptyLine = false): string {
10
- const splittedLogs = logs.split('\n');
11
- // 处理清空上行逻辑
12
- // 上移 cursor + 清空整行
13
- let filteredLogs = enableEraseLineFilter ? filterEraseMultipleLine(splittedLogs) : splittedLogs;
14
- if (hideEmptyLine) {
15
- filteredLogs = filteredLogs.map((line) => line.replace('\r', '')).filter((line) => !!line);
16
- }
17
-
18
- const htmlLogLines = filteredLogs.map((line) => {
19
- const htmlLog = ansiUp.ansi_to_html(line);
20
-
21
- return htmlLog;
22
- });
23
- return htmlLogLines.join('\n');
24
- }
@@ -1,71 +0,0 @@
1
- export const ESC = '\u001B[';
2
- export const eraseLine = ESC + '2K';
3
- export const eraseEndLine = ESC + 'K';
4
-
5
- export const cursorUp = (count = 1) => ESC + count + 'A';
6
-
7
- /**
8
- * 处理过滤清空上行,清空本行逻辑。
9
- *
10
- * 关于清空上 n 行:
11
- * 一般在日志中,出现覆盖上行的情况,ascii 编码为 2K [1A 2K ...] 1G 的样式。 如 \u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[G\r\n,代表清空上两行。
12
- * 其中,2K 代表清空整行,1A 代表光标上移,配合下一个 2K 则最终效果为清空上行,而 1G 是移动光标到本行开始(位置 1)。
13
- * 在日志过滤过程中,可以只处理 1A 2K 这个序列,遇到后把该日志的上一行删掉即可。
14
- *
15
- * 关于清空本行,按顺序执行:
16
- * 1. 在当前行没有 Cursor 操作符(如上移时),匹配最后一个 [2K (清空本行)或 \r[K(指针回 0,再清空本行到末尾,相当于清空本行),只输出 [2K 后的内容,
17
- * 2. 在当前行没有 Cursor 操作符时且有多个 \r (carriage return charactor,移动光标到行首)时,reduce 按 \r \x1b[G 或 \x1b[1G 切分的片断,不段用后一 part 的部分从头覆盖得出结果。
18
- */
19
- export default function filterEraseMultipleLine(logs: string[]) {
20
- // 上移 cursor + 清空整行
21
- const eraseLastLine = cursorUp(1) + eraseLine;
22
- const eraseCurrentLine = eraseLine;
23
- const eraseCurrentLine2 = `\r${eraseEndLine}`;
24
-
25
- const moveCursorToLeftRegStrs = ['\\r', '\\u001b\\[G', '\\u001b\\[1G'];
26
- const moveCursorToLeftRegStr = new RegExp(`${moveCursorToLeftRegStrs.join('|')}`);
27
-
28
- const filteredLogs = logs.reduce((acc: string[], nowLine) => {
29
- // 当前清空上行搜索指针
30
- let pos = 0;
31
- const step = eraseLastLine.length;
32
-
33
- while (true) {
34
- pos = nowLine.indexOf(eraseLastLine, pos);
35
- // 出现清空上行
36
- if (pos >= 0) {
37
- pos += step;
38
- acc.pop();
39
- } else {
40
- break;
41
- }
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
-
57
- // 处理多 \r 情况,当 \r 连续时,切分出的空字段无用,过滤掉
58
- const carriageRewrites = nowLine.split(moveCursorToLeftRegStr).filter((part) => !!part);
59
- if (carriageRewrites.length > 1) {
60
- nowLine = carriageRewrites.reduce((nextNowLine, nowPart) => {
61
- const leftPart = nextNowLine.slice(nowPart.length);
62
- return nowPart + leftPart;
63
- }, '');
64
- }
65
-
66
- acc.push(nowLine);
67
- return acc;
68
- }, []);
69
-
70
- return filteredLogs;
71
- }