@opensumi/ide-ai-native 3.7.1-next-1739439717.0 → 3.7.1-next-1739521933.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 (138) hide show
  1. package/lib/browser/ai-core.contextkeys.d.ts +1 -0
  2. package/lib/browser/ai-core.contextkeys.d.ts.map +1 -1
  3. package/lib/browser/ai-core.contextkeys.js +1 -0
  4. package/lib/browser/ai-core.contextkeys.js.map +1 -1
  5. package/lib/browser/ai-core.contribution.d.ts +2 -1
  6. package/lib/browser/ai-core.contribution.d.ts.map +1 -1
  7. package/lib/browser/ai-core.contribution.js +55 -14
  8. package/lib/browser/ai-core.contribution.js.map +1 -1
  9. package/lib/browser/components/utils.d.ts +2 -2
  10. package/lib/browser/contrib/intelligent-completions/index.d.ts +8 -12
  11. package/lib/browser/contrib/intelligent-completions/index.d.ts.map +1 -1
  12. package/lib/browser/contrib/intelligent-completions/index.js.map +1 -1
  13. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.d.ts +1 -0
  14. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.d.ts.map +1 -1
  15. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js +26 -4
  16. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js.map +1 -1
  17. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.d.ts +3 -1
  18. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.d.ts.map +1 -1
  19. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js +9 -1
  20. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js.map +1 -1
  21. package/lib/browser/contrib/intelligent-completions/source/base.d.ts +9 -3
  22. package/lib/browser/contrib/intelligent-completions/source/base.d.ts.map +1 -1
  23. package/lib/browser/contrib/intelligent-completions/source/base.js +21 -3
  24. package/lib/browser/contrib/intelligent-completions/source/base.js.map +1 -1
  25. package/lib/browser/contrib/intelligent-completions/source/line-change.source.d.ts +0 -3
  26. package/lib/browser/contrib/intelligent-completions/source/line-change.source.d.ts.map +1 -1
  27. package/lib/browser/contrib/intelligent-completions/source/line-change.source.js +20 -22
  28. package/lib/browser/contrib/intelligent-completions/source/line-change.source.js.map +1 -1
  29. package/lib/browser/contrib/intelligent-completions/source/lint-error.source.d.ts +1 -3
  30. package/lib/browser/contrib/intelligent-completions/source/lint-error.source.d.ts.map +1 -1
  31. package/lib/browser/contrib/intelligent-completions/source/lint-error.source.js +13 -20
  32. package/lib/browser/contrib/intelligent-completions/source/lint-error.source.js.map +1 -1
  33. package/lib/browser/contrib/intelligent-completions/source/typing.source.d.ts +2 -2
  34. package/lib/browser/contrib/intelligent-completions/source/typing.source.d.ts.map +1 -1
  35. package/lib/browser/contrib/intelligent-completions/source/typing.source.js +6 -8
  36. package/lib/browser/contrib/intelligent-completions/source/typing.source.js.map +1 -1
  37. package/lib/browser/contrib/terminal/component/terminal-command-suggest-controller.js +2 -2
  38. package/lib/browser/contrib/terminal/component/terminal-command-suggest-controller.js.map +1 -1
  39. package/lib/browser/index.js +1 -1
  40. package/lib/browser/index.js.map +1 -1
  41. package/lib/browser/layout/ai-layout.d.ts.map +1 -1
  42. package/lib/browser/layout/ai-layout.js +2 -2
  43. package/lib/browser/layout/ai-layout.js.map +1 -1
  44. package/lib/browser/model/enhanceDecorationsCollection.d.ts +14 -10
  45. package/lib/browser/model/enhanceDecorationsCollection.d.ts.map +1 -1
  46. package/lib/browser/model/enhanceDecorationsCollection.js +42 -53
  47. package/lib/browser/model/enhanceDecorationsCollection.js.map +1 -1
  48. package/lib/browser/types.d.ts +2 -1
  49. package/lib/browser/types.d.ts.map +1 -1
  50. package/lib/browser/widget/inline-chat/inline-chat-editor.controller.d.ts +2 -1
  51. package/lib/browser/widget/inline-chat/inline-chat-editor.controller.d.ts.map +1 -1
  52. package/lib/browser/widget/inline-chat/inline-chat-editor.controller.js +13 -41
  53. package/lib/browser/widget/inline-chat/inline-chat-editor.controller.js.map +1 -1
  54. package/lib/browser/widget/inline-chat/inline-chat.feature.registry.d.ts +3 -13
  55. package/lib/browser/widget/inline-chat/inline-chat.feature.registry.d.ts.map +1 -1
  56. package/lib/browser/widget/inline-chat/inline-chat.feature.registry.js +24 -72
  57. package/lib/browser/widget/inline-chat/inline-chat.feature.registry.js.map +1 -1
  58. package/lib/browser/widget/inline-chat/inline-chat.service.d.ts +1 -6
  59. package/lib/browser/widget/inline-chat/inline-chat.service.d.ts.map +1 -1
  60. package/lib/browser/widget/inline-chat/inline-chat.service.js +5 -19
  61. package/lib/browser/widget/inline-chat/inline-chat.service.js.map +1 -1
  62. package/lib/browser/widget/inline-chat/inline-content-widget.d.ts +2 -5
  63. package/lib/browser/widget/inline-chat/inline-content-widget.d.ts.map +1 -1
  64. package/lib/browser/widget/inline-chat/inline-content-widget.js +17 -42
  65. package/lib/browser/widget/inline-chat/inline-content-widget.js.map +1 -1
  66. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts +22 -5
  67. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts.map +1 -1
  68. package/lib/browser/widget/inline-diff/inline-diff-previewer.js +61 -30
  69. package/lib/browser/widget/inline-diff/inline-diff-previewer.js.map +1 -1
  70. package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts +8 -12
  71. package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts.map +1 -1
  72. package/lib/browser/widget/inline-diff/inline-diff.controller.js +68 -96
  73. package/lib/browser/widget/inline-diff/inline-diff.controller.js.map +1 -1
  74. package/lib/browser/widget/inline-hint/inline-hint.controller.d.ts +0 -1
  75. package/lib/browser/widget/inline-hint/inline-hint.controller.d.ts.map +1 -1
  76. package/lib/browser/widget/inline-hint/inline-hint.controller.js +0 -5
  77. package/lib/browser/widget/inline-hint/inline-hint.controller.js.map +1 -1
  78. package/lib/browser/widget/inline-input/inline-input-widget.d.ts +12 -2
  79. package/lib/browser/widget/inline-input/inline-input-widget.d.ts.map +1 -1
  80. package/lib/browser/widget/inline-input/inline-input-widget.js +26 -18
  81. package/lib/browser/widget/inline-input/inline-input-widget.js.map +1 -1
  82. package/lib/browser/widget/inline-input/inline-input.controller.d.ts +14 -6
  83. package/lib/browser/widget/inline-input/inline-input.controller.d.ts.map +1 -1
  84. package/lib/browser/widget/inline-input/inline-input.controller.js +320 -169
  85. package/lib/browser/widget/inline-input/inline-input.controller.js.map +1 -1
  86. package/lib/browser/widget/inline-input/inline-input.module.less +4 -0
  87. package/lib/browser/widget/inline-input/inline-input.service.d.ts +19 -7
  88. package/lib/browser/widget/inline-input/inline-input.service.d.ts.map +1 -1
  89. package/lib/browser/widget/inline-input/inline-input.service.js +72 -12
  90. package/lib/browser/widget/inline-input/inline-input.service.js.map +1 -1
  91. package/lib/browser/widget/inline-input/model.d.ts +34 -0
  92. package/lib/browser/widget/inline-input/model.d.ts.map +1 -0
  93. package/lib/browser/widget/inline-input/model.js +63 -0
  94. package/lib/browser/widget/inline-input/model.js.map +1 -0
  95. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts +8 -19
  96. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts.map +1 -1
  97. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js +48 -41
  98. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js.map +1 -1
  99. package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts +17 -4
  100. package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts.map +1 -1
  101. package/lib/browser/widget/inline-stream-diff/live-preview.component.js +37 -5
  102. package/lib/browser/widget/inline-stream-diff/live-preview.component.js.map +1 -1
  103. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts +7 -11
  104. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts.map +1 -1
  105. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js +33 -77
  106. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js.map +1 -1
  107. package/package.json +21 -21
  108. package/src/browser/ai-core.contextkeys.ts +3 -0
  109. package/src/browser/ai-core.contribution.ts +63 -16
  110. package/src/browser/contrib/intelligent-completions/index.ts +9 -4
  111. package/src/browser/contrib/intelligent-completions/intelligent-completions.contribution.ts +29 -8
  112. package/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +13 -1
  113. package/src/browser/contrib/intelligent-completions/source/base.ts +28 -7
  114. package/src/browser/contrib/intelligent-completions/source/line-change.source.ts +31 -26
  115. package/src/browser/contrib/intelligent-completions/source/lint-error.source.ts +19 -31
  116. package/src/browser/contrib/intelligent-completions/source/typing.source.ts +7 -9
  117. package/src/browser/contrib/terminal/component/terminal-command-suggest-controller.tsx +1 -1
  118. package/src/browser/index.ts +2 -2
  119. package/src/browser/layout/ai-layout.tsx +5 -2
  120. package/src/browser/model/enhanceDecorationsCollection.ts +62 -77
  121. package/src/browser/types.ts +2 -2
  122. package/src/browser/widget/inline-chat/inline-chat-editor.controller.ts +21 -56
  123. package/src/browser/widget/inline-chat/inline-chat.feature.registry.ts +23 -90
  124. package/src/browser/widget/inline-chat/inline-chat.service.ts +2 -19
  125. package/src/browser/widget/inline-chat/inline-content-widget.tsx +14 -71
  126. package/src/browser/widget/inline-diff/inline-diff-previewer.ts +87 -32
  127. package/src/browser/widget/inline-diff/inline-diff.controller.ts +90 -114
  128. package/src/browser/widget/inline-hint/inline-hint.controller.ts +1 -7
  129. package/src/browser/widget/inline-input/inline-input-widget.tsx +34 -12
  130. package/src/browser/widget/inline-input/inline-input.controller.ts +453 -247
  131. package/src/browser/widget/inline-input/inline-input.module.less +4 -0
  132. package/src/browser/widget/inline-input/inline-input.service.ts +92 -13
  133. package/src/browser/widget/inline-input/model.ts +74 -0
  134. package/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +58 -69
  135. package/src/browser/widget/inline-stream-diff/live-preview.component.tsx +45 -6
  136. package/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +40 -112
  137. package/lib/browser/model/styles.module.less +0 -7
  138. package/src/browser/model/styles.module.less +0 -7
@@ -3,7 +3,6 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
3
3
  import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di';
4
4
  import { IAIInlineChatService, StackingLevel, useInjectable } from '@opensumi/ide-core-browser';
5
5
  import { AIAction } from '@opensumi/ide-core-browser/lib/components/ai-native';
6
- import { InteractiveInput } from '@opensumi/ide-core-browser/lib/components/ai-native/interactive-input/index';
7
6
  import { MenuNode } from '@opensumi/ide-core-browser/lib/menu/next/base';
8
7
  import {
9
8
  AIInlineChatContentWidgetId,
@@ -11,7 +10,6 @@ import {
11
10
  Emitter,
12
11
  Event,
13
12
  InlineChatFeatureRegistryToken,
14
- localize,
15
13
  runWhenIdle,
16
14
  } from '@opensumi/ide-core-common';
17
15
  import * as monaco from '@opensumi/ide-monaco';
@@ -23,40 +21,32 @@ import {
23
21
 
24
22
  import { AINativeContextKey } from '../../ai-core.contextkeys';
25
23
  import { InlineResultAction } from '../inline-actions/result-items/index';
24
+ import { InlineInputService } from '../inline-input/inline-input.service';
25
+ import { InteractiveInputModel } from '../inline-input/model';
26
26
 
27
27
  import { InlineChatFeatureRegistry } from './inline-chat.feature.registry';
28
28
  import styles from './inline-chat.module.less';
29
- import { AIInlineChatService, EInlineChatStatus, EResultKind } from './inline-chat.service';
29
+ import { EInlineChatStatus, EResultKind, InlineChatService } from './inline-chat.service';
30
30
 
31
31
  import type { ICodeEditor as IMonacoCodeEditor } from '@opensumi/ide-monaco/lib/browser/monaco-api/types';
32
32
 
33
33
  interface IAIInlineChatControllerProps {
34
34
  onClickActions: (id: string) => void;
35
- onLayoutChange: (height: number) => void;
36
35
  onClose?: () => void;
37
- onInteractiveInputSend?: (value: string) => void;
38
36
  onChatStatus: Event<EInlineChatStatus>;
39
37
  onResultClick: (k: EResultKind) => void;
40
38
  }
41
39
 
42
40
  const AIInlineChatController = (props: IAIInlineChatControllerProps) => {
43
- const { onClickActions, onClose, onInteractiveInputSend, onLayoutChange, onChatStatus, onResultClick } = props;
44
- const aiInlineChatService: AIInlineChatService = useInjectable(IAIInlineChatService);
41
+ const { onClickActions, onClose, onChatStatus, onResultClick } = props;
42
+ const aiInlineChatService: InlineChatService = useInjectable(IAIInlineChatService);
45
43
  const inlineChatFeatureRegistry: InlineChatFeatureRegistry = useInjectable(InlineChatFeatureRegistryToken);
44
+
46
45
  const [status, setStatus] = useState<EInlineChatStatus>(EInlineChatStatus.READY);
47
- const [interactiveInputVisible, setInteractiveInputVisible] = useState<boolean>(
48
- aiInlineChatService.interactiveInputVisible,
49
- );
50
46
  useEffect(() => {
51
47
  const dis = new Disposable();
52
48
  dis.addDispose(onChatStatus((s) => setStatus(s)));
53
49
 
54
- dis.addDispose(
55
- aiInlineChatService.onInteractiveInputVisible((v) => {
56
- setInteractiveInputVisible(v);
57
- }),
58
- );
59
-
60
50
  return () => {
61
51
  dis.dispose();
62
52
  };
@@ -84,13 +74,6 @@ const AIInlineChatController = (props: IAIInlineChatControllerProps) => {
84
74
  onClose?.();
85
75
  }, [onClose]);
86
76
 
87
- const handleInteractiveInputSend = useCallback(
88
- (value: string) => {
89
- onInteractiveInputSend?.(value);
90
- },
91
- [onInteractiveInputSend],
92
- );
93
-
94
77
  const moreOperation = useMemo(
95
78
  () =>
96
79
  inlineChatFeatureRegistry.getEditorActionMenus().map(
@@ -107,24 +90,6 @@ const AIInlineChatController = (props: IAIInlineChatControllerProps) => {
107
90
  [inlineChatFeatureRegistry],
108
91
  );
109
92
 
110
- const customOperationRender = useMemo(() => {
111
- if (!interactiveInputVisible) {
112
- return null;
113
- }
114
-
115
- return (
116
- <InteractiveInput
117
- autoFocus
118
- onHeightChange={(height) => onLayoutChange(height)}
119
- size='small'
120
- placeholder={localize('aiNative.inline.chat.input.placeholder.default')}
121
- width={320}
122
- disabled={isLoading}
123
- onSend={handleInteractiveInputSend}
124
- />
125
- );
126
- }, [isLoading, interactiveInputVisible]);
127
-
128
93
  const renderContent = useCallback(() => {
129
94
  if (operationList.length === 0 && moreOperation.length === 0) {
130
95
  return null;
@@ -145,11 +110,9 @@ const AIInlineChatController = (props: IAIInlineChatControllerProps) => {
145
110
  onClickItem={handleClickActions}
146
111
  onClose={handleClose}
147
112
  loading={isLoading}
148
- loadingShowOperation={interactiveInputVisible}
149
- customOperationRender={customOperationRender}
150
113
  />
151
114
  );
152
- }, [operationList, moreOperation, customOperationRender, onResultClick, status, interactiveInputVisible]);
115
+ }, [operationList, moreOperation, onResultClick, status]);
153
116
 
154
117
  return <div className={styles.inline_chat_controller_box}>{renderContent()}</div>;
155
118
  };
@@ -161,28 +124,20 @@ export class AIInlineContentWidget extends ReactInlineContentWidget {
161
124
  @Autowired(INJECTOR_TOKEN)
162
125
  private readonly injector: Injector;
163
126
 
164
- @Autowired(InlineChatFeatureRegistryToken)
165
- private readonly inlineChatFeatureRegistry: InlineChatFeatureRegistry;
127
+ @Autowired(InlineInputService)
128
+ protected readonly inlineInputService: InlineInputService;
166
129
 
167
130
  private readonly aiNativeContextKey: AINativeContextKey;
168
131
 
169
132
  private readonly _onActionClickEmitter = new Emitter<{ actionId: string; source: string }>();
170
133
  public readonly onActionClick = this._onActionClickEmitter.event;
171
134
 
172
- protected readonly _onInteractiveInputValue = new Emitter<string>();
173
- public readonly onInteractiveInputValue = this._onInteractiveInputValue.event;
174
-
175
135
  protected readonly _onStatusChange = new Emitter<EInlineChatStatus>();
176
136
  public readonly onStatusChange: Event<EInlineChatStatus> = this._onStatusChange.event;
177
137
 
178
138
  protected readonly _onResultClick = new Emitter<EResultKind>();
179
139
  public readonly onResultClick: Event<EResultKind> = this._onResultClick.event;
180
140
 
181
- protected _interactiveInputValue: string;
182
- public get interactiveInputValue(): string {
183
- return this._interactiveInputValue;
184
- }
185
-
186
141
  protected _status: EInlineChatStatus = EInlineChatStatus.READY;
187
142
  public get status(): EInlineChatStatus {
188
143
  return this._status;
@@ -196,13 +151,6 @@ export class AIInlineContentWidget extends ReactInlineContentWidget {
196
151
  super(editor);
197
152
 
198
153
  this.aiNativeContextKey = this.injector.get(AINativeContextKey, [this.editor.contextKeyService]);
199
- this.addDispose(
200
- this.editor.onDidLayoutChange(() => {
201
- if (this.isOutOfArea()) {
202
- this.dispose();
203
- }
204
- }),
205
- );
206
154
  }
207
155
 
208
156
  public launchChatStatus(status: EInlineChatStatus) {
@@ -218,8 +166,11 @@ export class AIInlineContentWidget extends ReactInlineContentWidget {
218
166
  }
219
167
 
220
168
  public clickActionId(actionId: string, source: string): void {
221
- if (actionId === this.inlineChatFeatureRegistry.getInteractiveInputId()) {
222
- this.inlineChatFeatureRegistry._onChatClick.fire();
169
+ if (actionId === InteractiveInputModel.ID && this.options?.selection) {
170
+ // 隐藏当前的 inline chat widget
171
+ this.hide();
172
+ // 显示 inline input widget
173
+ this.inlineInputService.visibleBySelection(this.options.selection);
223
174
  return;
224
175
  }
225
176
 
@@ -232,14 +183,6 @@ export class AIInlineContentWidget extends ReactInlineContentWidget {
232
183
  onClickActions={(id) => this.clickActionId(id, 'widget')}
233
184
  onClose={() => this.dispose()}
234
185
  onChatStatus={this.onStatusChange.bind(this)}
235
- onLayoutChange={() => {
236
- this.editor.layoutContentWidget(this);
237
- }}
238
- onInteractiveInputSend={(value) => {
239
- this.launchChatStatus(EInlineChatStatus.THINKING);
240
- this._interactiveInputValue = value;
241
- this._onInteractiveInputValue.fire(value);
242
- }}
243
186
  onResultClick={(kind: EResultKind) => {
244
187
  this._onResultClick.fire(kind);
245
188
  }}
@@ -3,6 +3,7 @@ import { Disposable, ErrorResponse, IDisposable, ReplyResponse } from '@opensumi
3
3
  import { EOL, ICodeEditor, IPosition, ITextModel, Position, Selection } from '@opensumi/ide-monaco';
4
4
  import { ContentWidgetPositionPreference } from '@opensumi/ide-monaco/lib/browser/monaco-exports/editor';
5
5
  import { empty, getLeadingWhitespace } from '@opensumi/ide-utils/lib/strings';
6
+ import { LineRange } from '@opensumi/monaco-editor-core/esm/vs/editor/common/core/lineRange';
6
7
  import { DefaultEndOfLine } from '@opensumi/monaco-editor-core/esm/vs/editor/common/model';
7
8
  import { createTextBuffer } from '@opensumi/monaco-editor-core/esm/vs/editor/common/model/textModel';
8
9
  import { ModelService } from '@opensumi/monaco-editor-core/esm/vs/editor/common/services/modelService';
@@ -43,10 +44,13 @@ export abstract class BaseInlineDiffPreviewer<N extends IInlineDiffPreviewerNode
43
44
  protected inlineContentWidget: AIInlineContentWidget | null = null;
44
45
  protected selection: Selection;
45
46
  protected model: ITextModel;
47
+ public modelId: string;
46
48
 
47
49
  constructor(protected readonly monacoEditor: ICodeEditor) {
48
50
  super();
49
51
  this.model = this.monacoEditor.getModel()!;
52
+ this.modelId = this.model.id;
53
+
50
54
  this.addDispose(
51
55
  Disposable.create(() => {
52
56
  if (this.inlineContentWidget) {
@@ -106,11 +110,7 @@ export abstract class BaseInlineDiffPreviewer<N extends IInlineDiffPreviewerNode
106
110
  return this.node;
107
111
  }
108
112
 
109
- public createNodeSnapshot(): N | undefined {
110
- return this.node;
111
- }
112
-
113
- public mount(contentWidget: AIInlineContentWidget): void {
113
+ public mountWidget(contentWidget: AIInlineContentWidget): void {
114
114
  this.inlineContentWidget = contentWidget;
115
115
  }
116
116
 
@@ -156,20 +156,25 @@ export abstract class BaseInlineDiffPreviewer<N extends IInlineDiffPreviewerNode
156
156
  setValue(content: string): void {
157
157
  // do nothing
158
158
  }
159
+
159
160
  getValue(): string {
160
161
  // do nothing
161
162
  return '';
162
163
  }
164
+
163
165
  getOriginValue(): string {
164
166
  // do nothing
165
167
  return '';
166
168
  }
169
+
167
170
  onError(error: ErrorResponse): void {
168
171
  // do nothing
169
172
  }
173
+
170
174
  onAbort(): void {
171
175
  // do nothing
172
176
  }
177
+
173
178
  onEnd(): void {
174
179
  // do nothing
175
180
  }
@@ -178,6 +183,30 @@ export abstract class BaseInlineDiffPreviewer<N extends IInlineDiffPreviewerNode
178
183
  // do nothing
179
184
  }
180
185
 
186
+ /**
187
+ * 会新建一个渲染层的实例
188
+ * 或重新赋值渲染层的数据
189
+ * 适用于首次渲染
190
+ */
191
+ render(): void {
192
+ // do nothing
193
+ }
194
+
195
+ /**
196
+ * 仅隐藏渲染层,而不销毁实例
197
+ */
198
+ hide(): void {
199
+ // do nothing
200
+ }
201
+
202
+ /**
203
+ * 恢复渲染层
204
+ * 适用于非首次渲染
205
+ */
206
+ resume(): void {
207
+ // do nothing
208
+ }
209
+
181
210
  isModel(uri: string): boolean {
182
211
  return this.model.uri.toString() === uri;
183
212
  }
@@ -199,30 +228,37 @@ export class SideBySideInlineDiffWidget extends BaseInlineDiffPreviewer<InlineDi
199
228
  this.addDispose(widget);
200
229
  return widget;
201
230
  }
202
- mount(contentWidget: AIInlineContentWidget): void {
203
- super.mount(contentWidget);
231
+
232
+ mountWidget(contentWidget: AIInlineContentWidget): void {
233
+ super.mountWidget(contentWidget);
204
234
  contentWidget.addDispose(this);
205
235
  }
236
+
206
237
  getPosition(): IPosition {
207
238
  return Position.lift({ lineNumber: this.selection.endLineNumber + 1, column: 1 });
208
239
  }
240
+
209
241
  layout(): void {
210
242
  this.inlineContentWidget?.setPositionPreference([ContentWidgetPositionPreference.BELOW]);
211
243
  super.layout();
212
244
  }
245
+
213
246
  onReady(exec: () => void): IDisposable {
214
247
  if (this.node) {
215
248
  return this.node!.onReady(exec.bind(this));
216
249
  }
217
250
  return Disposable.NULL;
218
251
  }
252
+
219
253
  show(line: number, heightInLines: number): void {
220
254
  this.node?.showByLine(line, heightInLines);
221
255
  }
256
+
222
257
  setValue(content: string): void {
223
258
  const modifiedModel = this.node?.getModifiedModel();
224
259
  modifiedModel?.setValue(this.formatIndentation(content));
225
260
  }
261
+
226
262
  getValue(): string {
227
263
  const model = this.node?.getModifiedModel();
228
264
  return model!.getValue();
@@ -240,10 +276,12 @@ export class SideBySideInlineDiffWidget extends BaseInlineDiffPreviewer<InlineDi
240
276
  this.model.pushStackElement();
241
277
  }
242
278
  }
279
+
243
280
  onLineCount(event: (count: number) => void): Disposable {
244
281
  this.node?.onMaxLineCount(event.bind(this));
245
282
  return this;
246
283
  }
284
+
247
285
  onData(data: ReplyResponse): void {
248
286
  const { message } = data;
249
287
 
@@ -258,12 +296,15 @@ export class SideBySideInlineDiffWidget extends BaseInlineDiffPreviewer<InlineDi
258
296
  disposable.dispose();
259
297
  this.node?.layout();
260
298
  }
299
+
261
300
  onError(error: ErrorResponse): void {
262
301
  this.node?.layout();
263
302
  }
303
+
264
304
  onAbort(): void {
265
305
  this.node?.layout();
266
306
  }
307
+
267
308
  onEnd(): void {
268
309
  this.node?.layout();
269
310
  }
@@ -296,30 +337,6 @@ export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer<InlineStrea
296
337
  this.listenNode(node);
297
338
  return node;
298
339
  }
299
- attachNode(node: InlineStreamDiffHandler): void {
300
- this.node?.dispose();
301
- this.node = node;
302
-
303
- if (node) {
304
- const snapshot = node.currentSnapshotStore;
305
- if (snapshot) {
306
- this.node.restoreDecorationSnapshot(snapshot.decorationSnapshotData);
307
- this.listenNode(node);
308
- }
309
- }
310
- }
311
- public createNodeSnapshot(): InlineStreamDiffHandler | undefined {
312
- if (!this.node) {
313
- return this.createNode();
314
- }
315
-
316
- // 拿前一个 node 的快照信息
317
- const snapshot = this.node.createSnapshot();
318
- // 创建新的实例
319
- const node = this.injector.get(InlineStreamDiffHandler, [this.monacoEditor]);
320
- node.restoreSnapshot(snapshot);
321
- return node;
322
- }
323
340
 
324
341
  getPosition(): IPosition {
325
342
  const zone = this.node?.getZone();
@@ -328,6 +345,7 @@ export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer<InlineStrea
328
345
  }
329
346
  return Position.lift({ lineNumber: 1, column: 1 });
330
347
  }
348
+
331
349
  handleAction(action: EResultKind): void {
332
350
  switch (action) {
333
351
  case EResultKind.ACCEPT:
@@ -343,9 +361,11 @@ export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer<InlineStrea
343
361
  break;
344
362
  }
345
363
  }
364
+
346
365
  onLineCount() {
347
366
  return Disposable.NULL;
348
367
  }
368
+
349
369
  layout(): void {
350
370
  this.inlineContentWidget?.setPositionPreference([
351
371
  ContentWidgetPositionPreference.ABOVE,
@@ -365,17 +385,52 @@ export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer<InlineStrea
365
385
  const firstRemovedWidgetLineNumber = firstRemovedWidget.getLastPosition()?.lineNumber;
366
386
  if (firstRemovedWidgetLineNumber <= lineNumber) {
367
387
  const lineHeight = this.inlineContentWidget.getLineHeight();
368
- const len = firstRemovedWidget.height;
388
+ const len = firstRemovedWidget.height + 1;
369
389
  this.inlineContentWidget.setOffsetTop(-lineHeight * len - 4);
390
+ } else {
391
+ this.inlineContentWidget.setOffsetTop(0);
370
392
  }
371
393
  }
394
+ } else {
395
+ this.inlineContentWidget.setOffsetTop(0);
372
396
  }
373
397
  }
374
398
  }
399
+
400
+ render(): void {
401
+ this.inlineContentWidget?.show();
402
+ this.node?.rateRenderEditController();
403
+ }
404
+
405
+ hide(): void {
406
+ this.inlineContentWidget?.hide();
407
+ this.node?.hide();
408
+ }
409
+
410
+ resume(): void {
411
+ this.inlineContentWidget?.show();
412
+ this.node?.resume();
413
+ }
414
+
375
415
  onData(data: ReplyResponse): void {
376
416
  const { message } = data;
377
417
  this.node?.addLinesToDiff(this.formatIndentation(message));
378
418
  }
419
+
420
+ onAbort(): void {
421
+ const diffModel = this.node?.recompute(EComputerMode.default);
422
+ if (diffModel) {
423
+ /**
424
+ * abort 的时候,需要保留当前已经输出的内容
425
+ * 同时需要去掉流式过程中的 pending 区域和 activeLine
426
+ */
427
+ diffModel.activeLine = 0;
428
+ diffModel.pendingRange = new LineRange(0, 0);
429
+
430
+ this.node?.finallyRender(diffModel);
431
+ }
432
+ }
433
+
379
434
  onEnd(): void {
380
435
  const diffModel = this.node?.recompute(EComputerMode.legacy);
381
436
  if (diffModel) {