@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.
- package/lib/browser/ai-core.contextkeys.d.ts +1 -0
- package/lib/browser/ai-core.contextkeys.d.ts.map +1 -1
- package/lib/browser/ai-core.contextkeys.js +1 -0
- package/lib/browser/ai-core.contextkeys.js.map +1 -1
- package/lib/browser/ai-core.contribution.d.ts +2 -1
- package/lib/browser/ai-core.contribution.d.ts.map +1 -1
- package/lib/browser/ai-core.contribution.js +55 -14
- package/lib/browser/ai-core.contribution.js.map +1 -1
- package/lib/browser/components/utils.d.ts +2 -2
- package/lib/browser/contrib/intelligent-completions/index.d.ts +8 -12
- package/lib/browser/contrib/intelligent-completions/index.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/index.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.d.ts +1 -0
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js +26 -4
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.d.ts +3 -1
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js +9 -1
- package/lib/browser/contrib/intelligent-completions/intelligent-completions.controller.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/source/base.d.ts +9 -3
- package/lib/browser/contrib/intelligent-completions/source/base.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/source/base.js +21 -3
- package/lib/browser/contrib/intelligent-completions/source/base.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/source/line-change.source.d.ts +0 -3
- package/lib/browser/contrib/intelligent-completions/source/line-change.source.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/source/line-change.source.js +20 -22
- package/lib/browser/contrib/intelligent-completions/source/line-change.source.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/source/lint-error.source.d.ts +1 -3
- package/lib/browser/contrib/intelligent-completions/source/lint-error.source.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/source/lint-error.source.js +13 -20
- package/lib/browser/contrib/intelligent-completions/source/lint-error.source.js.map +1 -1
- package/lib/browser/contrib/intelligent-completions/source/typing.source.d.ts +2 -2
- package/lib/browser/contrib/intelligent-completions/source/typing.source.d.ts.map +1 -1
- package/lib/browser/contrib/intelligent-completions/source/typing.source.js +6 -8
- package/lib/browser/contrib/intelligent-completions/source/typing.source.js.map +1 -1
- package/lib/browser/contrib/terminal/component/terminal-command-suggest-controller.js +2 -2
- package/lib/browser/contrib/terminal/component/terminal-command-suggest-controller.js.map +1 -1
- package/lib/browser/index.js +1 -1
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/layout/ai-layout.d.ts.map +1 -1
- package/lib/browser/layout/ai-layout.js +2 -2
- package/lib/browser/layout/ai-layout.js.map +1 -1
- package/lib/browser/model/enhanceDecorationsCollection.d.ts +14 -10
- package/lib/browser/model/enhanceDecorationsCollection.d.ts.map +1 -1
- package/lib/browser/model/enhanceDecorationsCollection.js +42 -53
- package/lib/browser/model/enhanceDecorationsCollection.js.map +1 -1
- package/lib/browser/types.d.ts +2 -1
- package/lib/browser/types.d.ts.map +1 -1
- package/lib/browser/widget/inline-chat/inline-chat-editor.controller.d.ts +2 -1
- package/lib/browser/widget/inline-chat/inline-chat-editor.controller.d.ts.map +1 -1
- package/lib/browser/widget/inline-chat/inline-chat-editor.controller.js +13 -41
- package/lib/browser/widget/inline-chat/inline-chat-editor.controller.js.map +1 -1
- package/lib/browser/widget/inline-chat/inline-chat.feature.registry.d.ts +3 -13
- package/lib/browser/widget/inline-chat/inline-chat.feature.registry.d.ts.map +1 -1
- package/lib/browser/widget/inline-chat/inline-chat.feature.registry.js +24 -72
- package/lib/browser/widget/inline-chat/inline-chat.feature.registry.js.map +1 -1
- package/lib/browser/widget/inline-chat/inline-chat.service.d.ts +1 -6
- package/lib/browser/widget/inline-chat/inline-chat.service.d.ts.map +1 -1
- package/lib/browser/widget/inline-chat/inline-chat.service.js +5 -19
- package/lib/browser/widget/inline-chat/inline-chat.service.js.map +1 -1
- package/lib/browser/widget/inline-chat/inline-content-widget.d.ts +2 -5
- package/lib/browser/widget/inline-chat/inline-content-widget.d.ts.map +1 -1
- package/lib/browser/widget/inline-chat/inline-content-widget.js +17 -42
- package/lib/browser/widget/inline-chat/inline-content-widget.js.map +1 -1
- package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts +22 -5
- package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts.map +1 -1
- package/lib/browser/widget/inline-diff/inline-diff-previewer.js +61 -30
- package/lib/browser/widget/inline-diff/inline-diff-previewer.js.map +1 -1
- package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts +8 -12
- package/lib/browser/widget/inline-diff/inline-diff.controller.d.ts.map +1 -1
- package/lib/browser/widget/inline-diff/inline-diff.controller.js +68 -96
- package/lib/browser/widget/inline-diff/inline-diff.controller.js.map +1 -1
- package/lib/browser/widget/inline-hint/inline-hint.controller.d.ts +0 -1
- package/lib/browser/widget/inline-hint/inline-hint.controller.d.ts.map +1 -1
- package/lib/browser/widget/inline-hint/inline-hint.controller.js +0 -5
- package/lib/browser/widget/inline-hint/inline-hint.controller.js.map +1 -1
- package/lib/browser/widget/inline-input/inline-input-widget.d.ts +12 -2
- package/lib/browser/widget/inline-input/inline-input-widget.d.ts.map +1 -1
- package/lib/browser/widget/inline-input/inline-input-widget.js +26 -18
- package/lib/browser/widget/inline-input/inline-input-widget.js.map +1 -1
- package/lib/browser/widget/inline-input/inline-input.controller.d.ts +14 -6
- package/lib/browser/widget/inline-input/inline-input.controller.d.ts.map +1 -1
- package/lib/browser/widget/inline-input/inline-input.controller.js +320 -169
- package/lib/browser/widget/inline-input/inline-input.controller.js.map +1 -1
- package/lib/browser/widget/inline-input/inline-input.module.less +4 -0
- package/lib/browser/widget/inline-input/inline-input.service.d.ts +19 -7
- package/lib/browser/widget/inline-input/inline-input.service.d.ts.map +1 -1
- package/lib/browser/widget/inline-input/inline-input.service.js +72 -12
- package/lib/browser/widget/inline-input/inline-input.service.js.map +1 -1
- package/lib/browser/widget/inline-input/model.d.ts +34 -0
- package/lib/browser/widget/inline-input/model.d.ts.map +1 -0
- package/lib/browser/widget/inline-input/model.js +63 -0
- package/lib/browser/widget/inline-input/model.js.map +1 -0
- package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts +8 -19
- package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts.map +1 -1
- package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js +48 -41
- package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js.map +1 -1
- package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts +17 -4
- package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts.map +1 -1
- package/lib/browser/widget/inline-stream-diff/live-preview.component.js +37 -5
- package/lib/browser/widget/inline-stream-diff/live-preview.component.js.map +1 -1
- package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts +7 -11
- package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts.map +1 -1
- package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js +33 -77
- package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js.map +1 -1
- package/package.json +21 -21
- package/src/browser/ai-core.contextkeys.ts +3 -0
- package/src/browser/ai-core.contribution.ts +63 -16
- package/src/browser/contrib/intelligent-completions/index.ts +9 -4
- package/src/browser/contrib/intelligent-completions/intelligent-completions.contribution.ts +29 -8
- package/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts +13 -1
- package/src/browser/contrib/intelligent-completions/source/base.ts +28 -7
- package/src/browser/contrib/intelligent-completions/source/line-change.source.ts +31 -26
- package/src/browser/contrib/intelligent-completions/source/lint-error.source.ts +19 -31
- package/src/browser/contrib/intelligent-completions/source/typing.source.ts +7 -9
- package/src/browser/contrib/terminal/component/terminal-command-suggest-controller.tsx +1 -1
- package/src/browser/index.ts +2 -2
- package/src/browser/layout/ai-layout.tsx +5 -2
- package/src/browser/model/enhanceDecorationsCollection.ts +62 -77
- package/src/browser/types.ts +2 -2
- package/src/browser/widget/inline-chat/inline-chat-editor.controller.ts +21 -56
- package/src/browser/widget/inline-chat/inline-chat.feature.registry.ts +23 -90
- package/src/browser/widget/inline-chat/inline-chat.service.ts +2 -19
- package/src/browser/widget/inline-chat/inline-content-widget.tsx +14 -71
- package/src/browser/widget/inline-diff/inline-diff-previewer.ts +87 -32
- package/src/browser/widget/inline-diff/inline-diff.controller.ts +90 -114
- package/src/browser/widget/inline-hint/inline-hint.controller.ts +1 -7
- package/src/browser/widget/inline-input/inline-input-widget.tsx +34 -12
- package/src/browser/widget/inline-input/inline-input.controller.ts +453 -247
- package/src/browser/widget/inline-input/inline-input.module.less +4 -0
- package/src/browser/widget/inline-input/inline-input.service.ts +92 -13
- package/src/browser/widget/inline-input/model.ts +74 -0
- package/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +58 -69
- package/src/browser/widget/inline-stream-diff/live-preview.component.tsx +45 -6
- package/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +40 -112
- package/lib/browser/model/styles.module.less +0 -7
- 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 {
|
|
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,
|
|
44
|
-
const aiInlineChatService:
|
|
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,
|
|
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(
|
|
165
|
-
|
|
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.
|
|
222
|
-
|
|
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
|
|
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
|
-
|
|
203
|
-
|
|
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) {
|