@opensumi/ide-ai-native 3.7.1-next-1739430207.0 → 3.7.1-next-1739439717.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 (122) hide show
  1. package/lib/browser/ai-core.contextkeys.d.ts +0 -1
  2. package/lib/browser/ai-core.contextkeys.d.ts.map +1 -1
  3. package/lib/browser/ai-core.contextkeys.js +0 -1
  4. package/lib/browser/ai-core.contextkeys.js.map +1 -1
  5. package/lib/browser/ai-core.contribution.d.ts +1 -2
  6. package/lib/browser/ai-core.contribution.d.ts.map +1 -1
  7. package/lib/browser/ai-core.contribution.js +14 -55
  8. package/lib/browser/ai-core.contribution.js.map +1 -1
  9. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.d.ts +0 -1
  10. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.d.ts.map +1 -1
  11. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js +4 -26
  12. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js.map +1 -1
  13. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.d.ts +1 -3
  14. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.d.ts.map +1 -1
  15. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js +1 -9
  16. package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js.map +1 -1
  17. package/lib/browser/contrib/intelligent-completions/source/base.d.ts +2 -1
  18. package/lib/browser/contrib/intelligent-completions/source/base.d.ts.map +1 -1
  19. package/lib/browser/contrib/intelligent-completions/source/base.js.map +1 -1
  20. package/lib/browser/contrib/intelligent-completions/source/line-change.source.d.ts +3 -2
  21. package/lib/browser/contrib/intelligent-completions/source/line-change.source.d.ts.map +1 -1
  22. package/lib/browser/contrib/intelligent-completions/source/line-change.source.js +21 -51
  23. package/lib/browser/contrib/intelligent-completions/source/line-change.source.js.map +1 -1
  24. package/lib/browser/contrib/terminal/component/terminal-command-suggest-controller.js +2 -2
  25. package/lib/browser/contrib/terminal/component/terminal-command-suggest-controller.js.map +1 -1
  26. package/lib/browser/index.js +1 -1
  27. package/lib/browser/index.js.map +1 -1
  28. package/lib/browser/layout/ai-layout.d.ts.map +1 -1
  29. package/lib/browser/layout/ai-layout.js +2 -2
  30. package/lib/browser/layout/ai-layout.js.map +1 -1
  31. package/lib/browser/model/enhanceDecorationsCollection.d.ts +10 -14
  32. package/lib/browser/model/enhanceDecorationsCollection.d.ts.map +1 -1
  33. package/lib/browser/model/enhanceDecorationsCollection.js +53 -42
  34. package/lib/browser/model/enhanceDecorationsCollection.js.map +1 -1
  35. package/lib/browser/model/styles.module.less +7 -0
  36. package/lib/browser/types.d.ts +1 -2
  37. package/lib/browser/types.d.ts.map +1 -1
  38. package/lib/browser/widget/inline-chat/inline-chat-editor.controller.d.ts +1 -2
  39. package/lib/browser/widget/inline-chat/inline-chat-editor.controller.d.ts.map +1 -1
  40. package/lib/browser/widget/inline-chat/inline-chat-editor.controller.js +41 -13
  41. package/lib/browser/widget/inline-chat/inline-chat-editor.controller.js.map +1 -1
  42. package/lib/browser/widget/inline-chat/inline-chat.feature.registry.d.ts +13 -3
  43. package/lib/browser/widget/inline-chat/inline-chat.feature.registry.d.ts.map +1 -1
  44. package/lib/browser/widget/inline-chat/inline-chat.feature.registry.js +72 -24
  45. package/lib/browser/widget/inline-chat/inline-chat.feature.registry.js.map +1 -1
  46. package/lib/browser/widget/inline-chat/inline-chat.service.d.ts +6 -1
  47. package/lib/browser/widget/inline-chat/inline-chat.service.d.ts.map +1 -1
  48. package/lib/browser/widget/inline-chat/inline-chat.service.js +19 -5
  49. package/lib/browser/widget/inline-chat/inline-chat.service.js.map +1 -1
  50. package/lib/browser/widget/inline-chat/inline-content-widget.d.ts +5 -2
  51. package/lib/browser/widget/inline-chat/inline-content-widget.d.ts.map +1 -1
  52. package/lib/browser/widget/inline-chat/inline-content-widget.js +42 -17
  53. package/lib/browser/widget/inline-chat/inline-content-widget.js.map +1 -1
  54. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts +5 -22
  55. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts.map +1 -1
  56. package/lib/browser/widget/inline-diff/inline-diff-previewer.js +30 -61
  57. package/lib/browser/widget/inline-diff/inline-diff-previewer.js.map +1 -1
  58. package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts +12 -8
  59. package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts.map +1 -1
  60. package/lib/browser/widget/inline-diff/inline-diff.controller.js +96 -68
  61. package/lib/browser/widget/inline-diff/inline-diff.controller.js.map +1 -1
  62. package/lib/browser/widget/inline-hint/inline-hint.controller.d.ts +1 -0
  63. package/lib/browser/widget/inline-hint/inline-hint.controller.d.ts.map +1 -1
  64. package/lib/browser/widget/inline-hint/inline-hint.controller.js +5 -0
  65. package/lib/browser/widget/inline-hint/inline-hint.controller.js.map +1 -1
  66. package/lib/browser/widget/inline-input/inline-input-widget.d.ts +2 -12
  67. package/lib/browser/widget/inline-input/inline-input-widget.d.ts.map +1 -1
  68. package/lib/browser/widget/inline-input/inline-input-widget.js +18 -26
  69. package/lib/browser/widget/inline-input/inline-input-widget.js.map +1 -1
  70. package/lib/browser/widget/inline-input/inline-input.controller.d.ts +6 -14
  71. package/lib/browser/widget/inline-input/inline-input.controller.d.ts.map +1 -1
  72. package/lib/browser/widget/inline-input/inline-input.controller.js +169 -320
  73. package/lib/browser/widget/inline-input/inline-input.controller.js.map +1 -1
  74. package/lib/browser/widget/inline-input/inline-input.module.less +0 -4
  75. package/lib/browser/widget/inline-input/inline-input.service.d.ts +7 -19
  76. package/lib/browser/widget/inline-input/inline-input.service.d.ts.map +1 -1
  77. package/lib/browser/widget/inline-input/inline-input.service.js +12 -72
  78. package/lib/browser/widget/inline-input/inline-input.service.js.map +1 -1
  79. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts +19 -8
  80. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts.map +1 -1
  81. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js +41 -48
  82. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js.map +1 -1
  83. package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts +4 -17
  84. package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts.map +1 -1
  85. package/lib/browser/widget/inline-stream-diff/live-preview.component.js +5 -37
  86. package/lib/browser/widget/inline-stream-diff/live-preview.component.js.map +1 -1
  87. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts +11 -7
  88. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts.map +1 -1
  89. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js +77 -33
  90. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js.map +1 -1
  91. package/package.json +21 -21
  92. package/src/browser/ai-core.contextkeys.ts +0 -3
  93. package/src/browser/ai-core.contribution.ts +16 -63
  94. package/src/browser/contrib/intelligent-completions/intelligent-completions.contribution.ts +8 -29
  95. package/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +1 -13
  96. package/src/browser/contrib/intelligent-completions/source/base.ts +2 -0
  97. package/src/browser/contrib/intelligent-completions/source/line-change.source.ts +24 -79
  98. package/src/browser/contrib/terminal/component/terminal-command-suggest-controller.tsx +1 -1
  99. package/src/browser/index.ts +2 -2
  100. package/src/browser/layout/ai-layout.tsx +2 -5
  101. package/src/browser/model/enhanceDecorationsCollection.ts +77 -62
  102. package/src/browser/model/styles.module.less +7 -0
  103. package/src/browser/types.ts +2 -2
  104. package/src/browser/widget/inline-chat/inline-chat-editor.controller.ts +56 -21
  105. package/src/browser/widget/inline-chat/inline-chat.feature.registry.ts +90 -23
  106. package/src/browser/widget/inline-chat/inline-chat.service.ts +19 -2
  107. package/src/browser/widget/inline-chat/inline-content-widget.tsx +71 -14
  108. package/src/browser/widget/inline-diff/inline-diff-previewer.ts +32 -87
  109. package/src/browser/widget/inline-diff/inline-diff.controller.ts +114 -90
  110. package/src/browser/widget/inline-hint/inline-hint.controller.ts +7 -1
  111. package/src/browser/widget/inline-input/inline-input-widget.tsx +12 -34
  112. package/src/browser/widget/inline-input/inline-input.controller.ts +247 -453
  113. package/src/browser/widget/inline-input/inline-input.module.less +0 -4
  114. package/src/browser/widget/inline-input/inline-input.service.ts +13 -92
  115. package/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +69 -58
  116. package/src/browser/widget/inline-stream-diff/live-preview.component.tsx +6 -45
  117. package/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +112 -40
  118. package/lib/browser/widget/inline-input/model.d.ts +0 -34
  119. package/lib/browser/widget/inline-input/model.d.ts.map +0 -1
  120. package/lib/browser/widget/inline-input/model.js +0 -63
  121. package/lib/browser/widget/inline-input/model.js.map +0 -1
  122. package/src/browser/widget/inline-input/model.ts +0 -74
@@ -5,7 +5,3 @@
5
5
  .input_wrapper {
6
6
  transform: translateY(-4px);
7
7
  }
8
-
9
- .input_decoration_pending_container {
10
- background-color: var(--vscode-diffEditor-unchangedCodeBackground);
11
- }
@@ -1,106 +1,27 @@
1
- import { Autowired, Injectable } from '@opensumi/di';
2
- import { KeybindingRegistry } from '@opensumi/ide-core-browser';
3
- import { AI_INLINE_CHAT_INTERACTIVE_INPUT_VISIBLE } from '@opensumi/ide-core-browser/lib/ai-native/command';
4
- import { Disposable, Emitter, Event, IDisposable } from '@opensumi/ide-core-common';
5
- import { ICodeEditor, Position, Selection } from '@opensumi/ide-monaco';
6
-
7
- import { LanguageParserService } from '../../languages/service';
8
- import { ERunStrategy, IInteractiveInputHandler, IInteractiveInputRunStrategy } from '../../types';
9
-
10
- import { InteractiveInputModel } from './model';
1
+ import { Injectable } from '@opensumi/di';
2
+ import { Emitter, Event } from '@opensumi/ide-core-common';
3
+ import { Position } from '@opensumi/ide-monaco';
11
4
 
12
5
  @Injectable()
13
- export class InlineInputService extends Disposable {
14
- @Autowired(KeybindingRegistry)
15
- private readonly keybindingRegistry: KeybindingRegistry;
16
-
17
- @Autowired(LanguageParserService)
18
- private readonly languageParserService: LanguageParserService;
19
-
20
- private interactiveInputModel: InteractiveInputModel = new InteractiveInputModel();
6
+ export class InlineInputChatService {
7
+ private _currentVisiblePosition: Position | undefined;
8
+ public get currentVisiblePosition(): Position | undefined {
9
+ return this._currentVisiblePosition;
10
+ }
21
11
 
22
12
  private readonly _onInteractiveInputVisibleInPosition = new Emitter<Position | undefined>();
23
13
  public readonly onInteractiveInputVisibleInPosition: Event<Position | undefined> =
24
14
  this._onInteractiveInputVisibleInPosition.event;
25
15
 
26
- private readonly _onInteractiveInputVisibleInSelection = new Emitter<Selection | undefined>();
27
- public readonly onInteractiveInputVisibleInSelection: Event<Selection | undefined> =
28
- this._onInteractiveInputVisibleInSelection.event;
29
-
30
- private readonly _onHidden = new Emitter<void>();
31
- public readonly onHidden: Event<void> = this._onHidden.event;
32
-
33
- public visibleByPosition(position: Position): void {
34
- this._onInteractiveInputVisibleInPosition.fire(position);
35
- }
36
-
37
- public visibleBySelection(selection: Selection): void {
38
- this._onInteractiveInputVisibleInSelection.fire(selection);
16
+ public setCurrentVisiblePosition(position: Position | undefined): void {
17
+ this._currentVisiblePosition = position;
39
18
  }
40
19
 
41
- public async visibleByNearestCodeBlock(position: Position, monacoEditor: ICodeEditor): Promise<void> {
42
- const codeBlock = await this.findNearestCodeBlockWithPosition(position, monacoEditor);
43
- if (codeBlock) {
44
- this.visibleBySelection(codeBlock);
45
- }
20
+ public visible(): void {
21
+ this._onInteractiveInputVisibleInPosition.fire(this._currentVisiblePosition);
46
22
  }
47
23
 
48
24
  public hide(): void {
49
- this._onHidden.fire();
50
- }
51
-
52
- public getInteractiveInputHandler(): IInteractiveInputHandler | undefined {
53
- return this.interactiveInputModel.handler();
54
- }
55
-
56
- public getInteractiveInputStrategyHandler() {
57
- return this.interactiveInputModel.strategyHandler();
58
- }
59
-
60
- // 根据光标位置自动检测并选中临近的代码块
61
- private async findNearestCodeBlockWithPosition(
62
- position: Position,
63
- monacoEditor: ICodeEditor,
64
- ): Promise<Selection | undefined> {
65
- const editorModel = monacoEditor.getModel();
66
- const cursor = editorModel?.getOffsetAt(position);
67
- const language = editorModel?.getLanguageId();
68
- const parser = this.languageParserService.createParser(language!);
69
- const codeBlock = await parser?.findNearestCodeBlockWithPosition(editorModel?.getValue() || '', cursor!);
70
-
71
- if (codeBlock) {
72
- return new Selection(
73
- codeBlock.range.start.line + 1,
74
- codeBlock.range.start.character,
75
- codeBlock.range.end.line + 1,
76
- codeBlock.range.end.character,
77
- );
78
- }
79
-
80
- return undefined;
81
- }
82
-
83
- public getSequenceKeyString() {
84
- const keybindings = this.keybindingRegistry.getKeybindingsForCommand(AI_INLINE_CHAT_INTERACTIVE_INPUT_VISIBLE.id);
85
- const resolved = keybindings[0]?.resolved;
86
- if (!resolved) {
87
- return '';
88
- }
89
- return this.keybindingRegistry.acceleratorForSequence(resolved, '+');
90
- }
91
-
92
- public registerInlineInput(
93
- runStrategy: IInteractiveInputRunStrategy,
94
- handler: IInteractiveInputHandler,
95
- ): IDisposable {
96
- this.interactiveInputModel.setHandler(handler);
97
-
98
- if (runStrategy.handleStrategy) {
99
- this.interactiveInputModel.setStrategyHandler(runStrategy.handleStrategy);
100
- } else {
101
- this.interactiveInputModel.setStrategyHandler(() => runStrategy.strategy || ERunStrategy.EXECUTE);
102
- }
103
-
104
- return this.interactiveInputModel;
25
+ this._onInteractiveInputVisibleInPosition.fire(undefined);
105
26
  }
106
27
  }
@@ -3,7 +3,6 @@ import { Disposable, Emitter, Event, FRAME_THREE, Schemes, Uri, randomString, sl
3
3
  import { ISingleEditOperation } from '@opensumi/ide-editor';
4
4
  import { ICodeEditor, ITextModel, Range, Selection } from '@opensumi/ide-monaco';
5
5
  import { StandaloneServices } from '@opensumi/ide-monaco/lib/browser/monaco-api/services';
6
- import { ISettableObservable, observableValue, transaction } from '@opensumi/ide-monaco/lib/common/observable';
7
6
  import { LineRange } from '@opensumi/monaco-editor-core/esm/vs/editor/common/core/lineRange';
8
7
  import { linesDiffComputers } from '@opensumi/monaco-editor-core/esm/vs/editor/common/diff/linesDiffComputers';
9
8
  import { DetailedLineRangeMapping } from '@opensumi/monaco-editor-core/esm/vs/editor/common/diff/rangeMapping';
@@ -16,7 +15,7 @@ import { IDiffPreviewerOptions, IInlineDiffPreviewerNode } from '../inline-diff/
16
15
 
17
16
  import { InlineStreamDiffComputer } from './inline-stream-diff-computer';
18
17
  import { IRemovedWidgetState } from './live-preview.component';
19
- import { LivePreviewDiffDecorationModel } from './live-preview.decoration';
18
+ import { ILivePreviewDiffDecorationSnapshotData, LivePreviewDiffDecorationModel } from './live-preview.decoration';
20
19
 
21
20
  interface IRangeChangeData {
22
21
  removedTextLines: string[];
@@ -30,7 +29,7 @@ interface IRangeChangeData {
30
29
  | undefined;
31
30
  }
32
31
 
33
- export interface IComputeDiffData {
32
+ interface IComputeDiffData {
34
33
  newFullRangeTextLines: string[];
35
34
  changes: IRangeChangeData[];
36
35
  activeLine: number;
@@ -42,6 +41,14 @@ export enum EComputerMode {
42
41
  default = 'default',
43
42
  }
44
43
 
44
+ export interface IInlineStreamDiffSnapshotData {
45
+ rawOriginalTextLines: string[];
46
+ rawOriginalTextLinesTokens: LineTokens[];
47
+ undoRedoGroup: UndoRedoGroup;
48
+ decorationSnapshotData: ILivePreviewDiffDecorationSnapshotData;
49
+ previewerOptions: IDiffPreviewerOptions;
50
+ }
51
+
45
52
  const inlineStreamDiffComputer = new InlineStreamDiffComputer();
46
53
 
47
54
  @Injectable({ multiple: true })
@@ -57,21 +64,18 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr
57
64
  private originalModel: ITextModel;
58
65
  private virtualModel: ITextModel;
59
66
 
67
+ // Parts that require snapshots
60
68
  private rawOriginalTextLines: string[];
61
69
  private rawOriginalTextLinesTokens: LineTokens[] = [];
62
- private undoRedoGroup: UndoRedoGroup = new UndoRedoGroup();
63
-
64
- private readonly diffModel: ISettableObservable<IComputeDiffData | undefined> = observableValue(this, undefined);
65
- private readonly finallyDiffModel: ISettableObservable<IComputeDiffData | undefined> = observableValue(
66
- this,
67
- undefined,
68
- );
70
+ private undoRedoGroup: UndoRedoGroup;
69
71
 
70
72
  public livePreviewDiffDecorationModel: LivePreviewDiffDecorationModel;
71
73
 
72
74
  constructor(private readonly monacoEditor: ICodeEditor) {
73
75
  super();
74
76
 
77
+ this.undoRedoGroup = new UndoRedoGroup();
78
+
75
79
  const modelService = StandaloneServices.get(IModelService);
76
80
  this.virtualModel = modelService.createModel(
77
81
  '',
@@ -132,6 +136,44 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr
132
136
  this.livePreviewDiffDecorationModel.initialize(zone);
133
137
  }
134
138
 
139
+ private _snapshotStore: IInlineStreamDiffSnapshotData | undefined;
140
+ restoreSnapshot(snapshot: IInlineStreamDiffSnapshotData): void {
141
+ this._snapshotStore = snapshot;
142
+ const {
143
+ rawOriginalTextLines,
144
+ rawOriginalTextLinesTokens,
145
+ undoRedoGroup,
146
+ decorationSnapshotData,
147
+ previewerOptions,
148
+ } = snapshot;
149
+
150
+ this.setPreviewerOptions(previewerOptions);
151
+
152
+ this.rawOriginalTextLines = rawOriginalTextLines;
153
+ this.rawOriginalTextLinesTokens = rawOriginalTextLinesTokens;
154
+ this.undoRedoGroup = undoRedoGroup;
155
+
156
+ this.livePreviewDiffDecorationModel.initialize(decorationSnapshotData.zone);
157
+ }
158
+
159
+ get currentSnapshotStore(): IInlineStreamDiffSnapshotData | undefined {
160
+ return this._snapshotStore;
161
+ }
162
+
163
+ restoreDecorationSnapshot(decorationSnapshotData: ILivePreviewDiffDecorationSnapshotData): void {
164
+ this.livePreviewDiffDecorationModel.restoreSnapshot(decorationSnapshotData);
165
+ }
166
+
167
+ createSnapshot(): IInlineStreamDiffSnapshotData {
168
+ return {
169
+ rawOriginalTextLines: this.rawOriginalTextLines,
170
+ rawOriginalTextLinesTokens: this.rawOriginalTextLinesTokens,
171
+ undoRedoGroup: this.undoRedoGroup,
172
+ decorationSnapshotData: this.livePreviewDiffDecorationModel.createSnapshot(),
173
+ previewerOptions: this.previewerOptions,
174
+ };
175
+ }
176
+
135
177
  getVirtualModelValue() {
136
178
  return this.virtualModel.getValue();
137
179
  }
@@ -286,9 +328,7 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr
286
328
  preRemovedLen += removedLinesOriginalRange.length - addedRange.length;
287
329
  }
288
330
 
289
- this.livePreviewDiffDecorationModel.touchRemovedWidget(states, () => {
290
- this._onDidEditChange.fire();
291
- });
331
+ this.livePreviewDiffDecorationModel.touchRemovedWidget(states);
292
332
  }
293
333
 
294
334
  /**
@@ -303,7 +343,7 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr
303
343
  });
304
344
  }
305
345
 
306
- private renderDiffEdits(diffModel: IComputeDiffData): void {
346
+ private handleEdits(diffModel: IComputeDiffData): void {
307
347
  const { activeLine, newFullRangeTextLines, pendingRange } = diffModel;
308
348
  const eol = this.originalModel.getEOL();
309
349
  const zone = this.getZone();
@@ -424,8 +464,9 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr
424
464
  }
425
465
 
426
466
  private currentEditLine = 0;
467
+ private finallyDiffModel: IComputeDiffData | null = null;
427
468
  private isEditing = false;
428
- public async rateRenderEditController(): Promise<void> {
469
+ private async rateEditController(): Promise<void> {
429
470
  if (this.isEditing === false) {
430
471
  this.isEditing = true;
431
472
 
@@ -437,22 +478,15 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr
437
478
  const virtualTextLines = this.virtualModel.getLinesContent();
438
479
  const currentText = virtualTextLines.slice(0, this.currentEditLine);
439
480
  const currentDiffModel = this.computeDiff(this.rawOriginalTextLines, currentText);
440
- transaction((tx) => {
441
- this.diffModel.set(currentDiffModel, tx);
442
- });
443
-
444
- if (this.originalModel.id === this.monacoEditor.getModel()?.id) {
445
- this.renderDiffEdits(currentDiffModel);
446
- }
481
+ this.handleEdits(currentDiffModel);
447
482
 
448
483
  this.currentEditLine += 1;
449
484
 
450
485
  await sleep(FRAME_THREE);
451
486
  }
452
487
 
453
- const finallyDiffModel = this.finallyDiffModel.get();
454
- if (finallyDiffModel) {
455
- this.finallyRender(finallyDiffModel);
488
+ if (this.finallyDiffModel) {
489
+ this.finallyRender(this.finallyDiffModel);
456
490
  }
457
491
 
458
492
  this.isEditing = false;
@@ -460,50 +494,27 @@ export class InlineStreamDiffHandler extends Disposable implements IInlineDiffPr
460
494
  }
461
495
 
462
496
  public addLinesToDiff(newText: string, computerMode: EComputerMode = EComputerMode.default): void {
463
- const diffModel = this.recompute(computerMode, newText);
464
- transaction((tx) => {
465
- this.diffModel.set(diffModel, tx);
466
- });
497
+ this.recompute(computerMode, newText);
498
+ this.rateEditController();
467
499
  }
468
500
 
469
501
  public pushRateFinallyDiffStack(diffModel: IComputeDiffData): void {
470
- transaction((tx) => {
471
- this.finallyDiffModel.set(diffModel, tx);
472
- // 可能存在 rate editor controller 处理完之后接口层流式才结束
473
- if (this.isEditing === false) {
474
- this.finallyRender(diffModel);
475
- }
476
- });
477
- }
478
-
479
- public finallyRender(diffModel: IComputeDiffData): void {
480
- transaction((tx) => {
481
- this.diffModel.set(diffModel, tx);
482
- });
502
+ this.finallyDiffModel = diffModel;
483
503
 
484
- if (this.originalModel.id !== this.monacoEditor.getModel()?.id) {
485
- return;
504
+ // 可能存在 rate editr controller 处理完之后接口层流式才结束
505
+ if (this.isEditing === false) {
506
+ this.finallyRender(this.finallyDiffModel);
486
507
  }
508
+ }
487
509
 
510
+ public finallyRender(diffModel: IComputeDiffData): void {
511
+ // 流式结束后才会确定所有的 added range,再渲染 partial edit widgets
488
512
  this.renderPartialEditWidgets(diffModel);
489
- this.renderDiffEdits(diffModel);
513
+ this.handleEdits(diffModel);
490
514
  this.pushStackElement();
491
515
  this.monacoEditor.focus();
492
516
  }
493
517
 
494
- public hide(): void {
495
- this.livePreviewDiffDecorationModel.hide();
496
- }
497
-
498
- public resume(): void {
499
- const finallyDiffModel = this.finallyDiffModel.get();
500
- if (!finallyDiffModel) {
501
- this.rateRenderEditController();
502
- }
503
-
504
- this.livePreviewDiffDecorationModel.resume();
505
- }
506
-
507
518
  acceptAll(): void {
508
519
  this.livePreviewDiffDecorationModel.acceptUnProcessed();
509
520
  this.dispose();
@@ -21,11 +21,6 @@ import { LineTokens } from '@opensumi/monaco-editor-core/esm/vs/editor/common/to
21
21
  import { IOptions, ZoneWidget } from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/zoneWidget/browser/zoneWidget';
22
22
  import { UndoRedoGroup } from '@opensumi/monaco-editor-core/esm/vs/platform/undoRedo/common/undoRedo';
23
23
 
24
- import {
25
- DeltaDecorations,
26
- EnhanceDecorationsCollection,
27
- IDeltaDecorationsOptions,
28
- } from '../../model/enhanceDecorationsCollection';
29
24
  import { renderLines } from '../ghost-text-widget/index';
30
25
 
31
26
  import styles from './inline-stream-diff.module.less';
@@ -39,7 +34,7 @@ interface IPartialEditWidgetComponent {
39
34
  discardSequence: string;
40
35
  }
41
36
 
42
- type IWidgetStatus = 'accept' | 'discard' | 'pending';
37
+ export type IWidgetStatus = 'accept' | 'discard' | 'pending';
43
38
 
44
39
  export interface IRemovedWidgetState {
45
40
  textLines: ITextLinesTokens[];
@@ -146,7 +141,7 @@ export class AcceptPartialEditWidget extends ReactInlineContentWidget {
146
141
  private readonly keybindingRegistry: KeybindingRegistry;
147
142
 
148
143
  private _id: string;
149
- private _addedRangeId: string;
144
+ private _decorationId: string;
150
145
 
151
146
  private readonly _onAccept = this.registerDispose(new Emitter<void>());
152
147
  public readonly onAccept: Event<void> = this._onAccept.event;
@@ -214,12 +209,12 @@ export class AcceptPartialEditWidget extends ReactInlineContentWidget {
214
209
  return styles.accept_partial_edit_widget_id;
215
210
  }
216
211
 
217
- public recordAddedRangeId(id: string): void {
218
- this._addedRangeId = id;
212
+ public recordDecorationId(id: string): void {
213
+ this._decorationId = id;
219
214
  }
220
215
 
221
- public getAddedRangeId(): string {
222
- return this._addedRangeId;
216
+ public getDecorationId(): string {
217
+ return this._decorationId;
223
218
  }
224
219
 
225
220
  public resume(): void {
@@ -319,8 +314,6 @@ export class RemovedZoneWidget extends ZoneWidget {
319
314
  return this._group;
320
315
  }
321
316
 
322
- public status: IWidgetStatus = 'pending';
323
-
324
317
  constructor(editor: ICodeEditor, public readonly textLines: ITextLinesTokens[], options: IRemovedZoneWidgetOptions) {
325
318
  super(editor, options);
326
319
 
@@ -369,23 +362,12 @@ export class RemovedZoneWidget extends ZoneWidget {
369
362
  return this.position || this._recordPosition;
370
363
  }
371
364
 
372
- accept(): void {
373
- this.status = 'accept';
374
- this.hide();
375
- }
376
-
377
- discard(): void {
378
- this.status = 'discard';
379
- super.hide();
380
- }
381
-
382
365
  hide(): void {
383
366
  this._hidden = true;
384
367
  super.hide();
385
368
  }
386
369
 
387
370
  resume(): void {
388
- this.status = 'pending';
389
371
  const position = this.getLastPosition();
390
372
  if (position) {
391
373
  this.show(position, this.height);
@@ -394,7 +376,6 @@ export class RemovedZoneWidget extends ZoneWidget {
394
376
 
395
377
  override show(pos: IPosition, heightInLines: number): void {
396
378
  this._hidden = false;
397
- this.status = 'pending';
398
379
  super.show(pos, heightInLines);
399
380
  }
400
381
 
@@ -426,23 +407,3 @@ export class RemovedZoneWidget extends ZoneWidget {
426
407
  super.dispose();
427
408
  }
428
409
  }
429
-
430
- class AddedRangeDeltaDecorations extends DeltaDecorations {
431
- public status: IWidgetStatus = 'pending';
432
-
433
- accept(): void {
434
- this.status = 'accept';
435
- super.hide();
436
- }
437
-
438
- discard(): void {
439
- this.status = 'discard';
440
- super.hide();
441
- }
442
- }
443
-
444
- export class AddedRangeDecorationsCollection extends EnhanceDecorationsCollection<AddedRangeDeltaDecorations> {
445
- protected override createDecorations(metaData: IDeltaDecorationsOptions) {
446
- return new AddedRangeDeltaDecorations(metaData);
447
- }
448
- }