@theia/ai-chat-ui 1.63.0-next.0 → 1.63.0-next.24
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-chat-ui-contribution.js +2 -2
- package/lib/browser/ai-chat-ui-contribution.js.map +1 -1
- package/lib/browser/chat-input-widget.d.ts +3 -1
- package/lib/browser/chat-input-widget.d.ts.map +1 -1
- package/lib/browser/chat-input-widget.js +101 -90
- package/lib/browser/chat-input-widget.js.map +1 -1
- package/lib/browser/chat-response-renderer/index.d.ts +1 -0
- package/lib/browser/chat-response-renderer/index.d.ts.map +1 -1
- package/lib/browser/chat-response-renderer/index.js +1 -0
- package/lib/browser/chat-response-renderer/index.js.map +1 -1
- package/lib/browser/chat-response-renderer/tool-confirmation.d.ts +17 -0
- package/lib/browser/chat-response-renderer/tool-confirmation.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/tool-confirmation.js +120 -0
- package/lib/browser/chat-response-renderer/tool-confirmation.js.map +1 -0
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts +5 -1
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts.map +1 -1
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.js +83 -19
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.js.map +1 -1
- package/lib/browser/chat-tree-view/chat-view-tree-input-widget.d.ts +6 -1
- package/lib/browser/chat-tree-view/chat-view-tree-input-widget.d.ts.map +1 -1
- package/lib/browser/chat-tree-view/chat-view-tree-input-widget.js +9 -0
- package/lib/browser/chat-tree-view/chat-view-tree-input-widget.js.map +1 -1
- package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts +6 -0
- package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts.map +1 -1
- package/lib/browser/chat-tree-view/chat-view-tree-widget.js +30 -3
- package/lib/browser/chat-tree-view/chat-view-tree-widget.js.map +1 -1
- package/lib/browser/chat-view-widget.d.ts +5 -2
- package/lib/browser/chat-view-widget.d.ts.map +1 -1
- package/lib/browser/chat-view-widget.js +19 -6
- package/lib/browser/chat-view-widget.js.map +1 -1
- package/package.json +10 -10
- package/src/browser/ai-chat-ui-contribution.ts +2 -2
- package/src/browser/chat-input-widget.tsx +171 -137
- package/src/browser/chat-response-renderer/index.ts +1 -0
- package/src/browser/chat-response-renderer/tool-confirmation.tsx +173 -0
- package/src/browser/chat-response-renderer/toolcall-part-renderer.tsx +115 -19
- package/src/browser/chat-tree-view/chat-view-tree-input-widget.tsx +16 -1
- package/src/browser/chat-tree-view/chat-view-tree-widget.tsx +39 -5
- package/src/browser/chat-view-widget.tsx +23 -7
- package/src/browser/style/index.css +173 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-view-widget.d.ts","sourceRoot":"","sources":["../../src/browser/chat-view-widget.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,cAAc,EAAa,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-view-widget.d.ts","sourceRoot":"","sources":["../../src/browser/chat-view-widget.tsx"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,7 @@ let ChatViewWidget = ChatViewWidget_1 = class ChatViewWidget extends browser_1.B
|
|
|
33
33
|
super();
|
|
34
34
|
this.treeWidget = treeWidget;
|
|
35
35
|
this.inputWidget = inputWidget;
|
|
36
|
-
this._state = { locked: false };
|
|
36
|
+
this._state = { locked: false, temporaryLocked: false };
|
|
37
37
|
this.onStateChangedEmitter = new core_1.Emitter();
|
|
38
38
|
this.id = ChatViewWidget_1.ID;
|
|
39
39
|
this.title.label = ChatViewWidget_1.LABEL;
|
|
@@ -48,7 +48,8 @@ let ChatViewWidget = ChatViewWidget_1 = class ChatViewWidget extends browser_1.B
|
|
|
48
48
|
this.treeWidget,
|
|
49
49
|
this.inputWidget,
|
|
50
50
|
this.onStateChanged(newState => {
|
|
51
|
-
|
|
51
|
+
const shouldScrollToEnd = !newState.locked && !newState.temporaryLocked;
|
|
52
|
+
this.treeWidget.shouldScrollToEnd = shouldScrollToEnd;
|
|
52
53
|
this.update();
|
|
53
54
|
})
|
|
54
55
|
]);
|
|
@@ -66,6 +67,7 @@ let ChatViewWidget = ChatViewWidget_1 = class ChatViewWidget extends browser_1.B
|
|
|
66
67
|
this.inputWidget.onDeleteChangeSet = this.onDeleteChangeSet.bind(this);
|
|
67
68
|
this.inputWidget.onDeleteChangeSetElement = this.onDeleteChangeSetElement.bind(this);
|
|
68
69
|
this.treeWidget.trackChatModel(this.chatSession.model);
|
|
70
|
+
this.treeWidget.onScrollLockChange = this.onScrollLockChange.bind(this);
|
|
69
71
|
this.initListeners();
|
|
70
72
|
this.inputWidget.setEnabled(this.activationService.isActive);
|
|
71
73
|
this.treeWidget.setEnabled(this.activationService.isActive);
|
|
@@ -114,6 +116,8 @@ let ChatViewWidget = ChatViewWidget_1 = class ChatViewWidget extends browser_1.B
|
|
|
114
116
|
if (oldState.locked) {
|
|
115
117
|
copy.locked = oldState.locked;
|
|
116
118
|
}
|
|
119
|
+
// Don't restore temporary lock state as it should reset on restart
|
|
120
|
+
copy.temporaryLocked = false;
|
|
117
121
|
this.state = copy;
|
|
118
122
|
}
|
|
119
123
|
get state() {
|
|
@@ -156,14 +160,23 @@ let ChatViewWidget = ChatViewWidget_1 = class ChatViewWidget extends browser_1.B
|
|
|
156
160
|
onDeleteChangeSet(sessionId) {
|
|
157
161
|
this.chatService.deleteChangeSet(sessionId);
|
|
158
162
|
}
|
|
159
|
-
onDeleteChangeSetElement(sessionId,
|
|
160
|
-
this.chatService.deleteChangeSetElement(sessionId,
|
|
163
|
+
onDeleteChangeSetElement(sessionId, uri) {
|
|
164
|
+
this.chatService.deleteChangeSetElement(sessionId, uri);
|
|
165
|
+
}
|
|
166
|
+
onScrollLockChange(temporaryLocked) {
|
|
167
|
+
this.setTemporaryLock(temporaryLocked);
|
|
161
168
|
}
|
|
162
169
|
lock() {
|
|
163
|
-
this.state = { ...(0, core_1.deepClone)(this.state), locked: true };
|
|
170
|
+
this.state = { ...(0, core_1.deepClone)(this.state), locked: true, temporaryLocked: false };
|
|
164
171
|
}
|
|
165
172
|
unlock() {
|
|
166
|
-
this.state = { ...(0, core_1.deepClone)(this.state), locked: false };
|
|
173
|
+
this.state = { ...(0, core_1.deepClone)(this.state), locked: false, temporaryLocked: false };
|
|
174
|
+
}
|
|
175
|
+
setTemporaryLock(locked) {
|
|
176
|
+
// Only set temporary lock if not permanently locked
|
|
177
|
+
if (!this.state.locked) {
|
|
178
|
+
this.state = { ...(0, core_1.deepClone)(this.state), temporaryLocked: locked };
|
|
179
|
+
}
|
|
167
180
|
}
|
|
168
181
|
get isLocked() {
|
|
169
182
|
return !!this.state.locked;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-view-widget.js","sourceRoot":"","sources":["../../src/browser/chat-view-widget.tsx"],"names":[],"mappings":";;;;;AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"chat-view-widget.js","sourceRoot":"","sources":["../../src/browser/chat-view-widget.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-chat-ui",
|
|
3
|
-
"version": "1.63.0-next.
|
|
3
|
+
"version": "1.63.0-next.24+83b50cc66",
|
|
4
4
|
"description": "Theia - AI Chat UI Extension",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/ai-chat": "1.63.0-next.
|
|
7
|
-
"@theia/ai-core": "1.63.0-next.
|
|
8
|
-
"@theia/core": "1.63.0-next.
|
|
9
|
-
"@theia/editor": "1.63.0-next.
|
|
10
|
-
"@theia/editor-preview": "1.63.0-next.
|
|
11
|
-
"@theia/filesystem": "1.63.0-next.
|
|
12
|
-
"@theia/monaco": "1.63.0-next.
|
|
6
|
+
"@theia/ai-chat": "1.63.0-next.24+83b50cc66",
|
|
7
|
+
"@theia/ai-core": "1.63.0-next.24+83b50cc66",
|
|
8
|
+
"@theia/core": "1.63.0-next.24+83b50cc66",
|
|
9
|
+
"@theia/editor": "1.63.0-next.24+83b50cc66",
|
|
10
|
+
"@theia/editor-preview": "1.63.0-next.24+83b50cc66",
|
|
11
|
+
"@theia/filesystem": "1.63.0-next.24+83b50cc66",
|
|
12
|
+
"@theia/monaco": "1.63.0-next.24+83b50cc66",
|
|
13
13
|
"@theia/monaco-editor-core": "1.96.302",
|
|
14
|
-
"@theia/workspace": "1.63.0-next.
|
|
14
|
+
"@theia/workspace": "1.63.0-next.24+83b50cc66",
|
|
15
15
|
"date-fns": "^4.1.0",
|
|
16
16
|
"minimatch": "^5.1.0",
|
|
17
17
|
"tslib": "^2.6.2",
|
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"nyc": {
|
|
57
57
|
"extends": "../../configs/nyc.json"
|
|
58
58
|
},
|
|
59
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "83b50cc66b001a5b9100ccd944dcace04cd4ae2e"
|
|
60
60
|
}
|
|
@@ -138,7 +138,7 @@ export class AIChatContribution extends AbstractViewContribution<ChatViewWidget>
|
|
|
138
138
|
});
|
|
139
139
|
registry.registerCommand(AI_CHAT_SHOW_CHATS_COMMAND, {
|
|
140
140
|
execute: () => this.selectChat(),
|
|
141
|
-
isEnabled: widget => this.withWidget(widget) && this.chatService.getSessions().
|
|
141
|
+
isEnabled: widget => this.withWidget(widget) && this.chatService.getSessions().some(session => !!session.title),
|
|
142
142
|
isVisible: widget => this.withWidget(widget)
|
|
143
143
|
});
|
|
144
144
|
registry.registerCommand(ChatNodeToolbarCommands.EDIT, {
|
|
@@ -210,7 +210,7 @@ export class AIChatContribution extends AbstractViewContribution<ChatViewWidget>
|
|
|
210
210
|
protected askForChatSession(): Promise<QuickPickItem | undefined> {
|
|
211
211
|
const getItems = () =>
|
|
212
212
|
this.chatService.getSessions()
|
|
213
|
-
.filter(session =>
|
|
213
|
+
.filter(session => session.title)
|
|
214
214
|
.sort((a, b) => {
|
|
215
215
|
if (!a.lastInteraction) { return 1; }
|
|
216
216
|
if (!b.lastInteraction) { return -1; }
|
|
@@ -13,8 +13,11 @@
|
|
|
13
13
|
//
|
|
14
14
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
15
|
// *****************************************************************************
|
|
16
|
-
import {
|
|
17
|
-
|
|
16
|
+
import {
|
|
17
|
+
ChangeSet, ChangeSetElement, ChatAgent, ChatChangeEvent, ChatModel, ChatRequestModel,
|
|
18
|
+
ChatService, ChatSuggestion, EditableChatRequestModel, ChatHierarchyBranch
|
|
19
|
+
} from '@theia/ai-chat';
|
|
20
|
+
import { DisposableCollection, InMemoryResources, URI, nls } from '@theia/core';
|
|
18
21
|
import { ContextMenuRenderer, LabelProvider, Message, OpenerService, ReactWidget } from '@theia/core/lib/browser';
|
|
19
22
|
import { Deferred } from '@theia/core/lib/common/promise-util';
|
|
20
23
|
import { inject, injectable, optional, postConstruct } from '@theia/core/shared/inversify';
|
|
@@ -88,6 +91,14 @@ export class AIChatInputWidget extends ReactWidget {
|
|
|
88
91
|
|
|
89
92
|
protected isEnabled = false;
|
|
90
93
|
|
|
94
|
+
private _branch?: ChatHierarchyBranch;
|
|
95
|
+
set branch(branch: ChatHierarchyBranch | undefined) {
|
|
96
|
+
if (this._branch !== branch) {
|
|
97
|
+
this._branch = branch;
|
|
98
|
+
this.update();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
91
102
|
private _onQuery: Query;
|
|
92
103
|
set onQuery(query: Query) {
|
|
93
104
|
this._onQuery = query;
|
|
@@ -120,7 +131,7 @@ export class AIChatInputWidget extends ReactWidget {
|
|
|
120
131
|
this.onDisposeForChatModel.dispose();
|
|
121
132
|
this.onDisposeForChatModel = new DisposableCollection();
|
|
122
133
|
this.onDisposeForChatModel.push(chatModel.onDidChange(event => {
|
|
123
|
-
if (event.kind === 'addVariable' || event.kind === 'removeVariable') {
|
|
134
|
+
if (event.kind === 'addVariable' || event.kind === 'removeVariable' || event.kind === 'addRequest' || event.kind === 'changeHierarchyBranch') {
|
|
124
135
|
this.update();
|
|
125
136
|
}
|
|
126
137
|
}));
|
|
@@ -137,6 +148,7 @@ export class AIChatInputWidget extends ReactWidget {
|
|
|
137
148
|
protected init(): void {
|
|
138
149
|
this.id = AIChatInputWidget.ID;
|
|
139
150
|
this.title.closable = false;
|
|
151
|
+
this.toDispose.push(this.resources.add(this.getResourceUri(), ''));
|
|
140
152
|
this.update();
|
|
141
153
|
}
|
|
142
154
|
|
|
@@ -154,8 +166,20 @@ export class AIChatInputWidget extends ReactWidget {
|
|
|
154
166
|
}
|
|
155
167
|
|
|
156
168
|
protected render(): React.ReactNode {
|
|
169
|
+
const branch = this._branch;
|
|
170
|
+
const chatModel = this._chatModel;
|
|
171
|
+
|
|
172
|
+
// State of the input widget's action buttons depends on the state of the currently active or last processed
|
|
173
|
+
// request, if there is one. If the chat model has branched, then the current request is the last on the
|
|
174
|
+
// branch. Otherwise, it's the last request in the chat model.
|
|
175
|
+
const currentRequest: ChatRequestModel | undefined = branch?.items?.at(-1)?.element ?? chatModel.getRequests().at(-1);
|
|
176
|
+
const isEditing = !!(currentRequest && (EditableChatRequestModel.isEditing(currentRequest)));
|
|
177
|
+
const isPending = () => !!(currentRequest && !isEditing && ChatRequestModel.isInProgress(currentRequest));
|
|
178
|
+
const pending = isPending();
|
|
179
|
+
|
|
157
180
|
return (
|
|
158
181
|
<ChatInput
|
|
182
|
+
branch={this._branch}
|
|
159
183
|
onQuery={this._onQuery.bind(this)}
|
|
160
184
|
onUnpin={this._onUnpin.bind(this)}
|
|
161
185
|
onCancel={this._onCancel.bind(this)}
|
|
@@ -165,13 +189,12 @@ export class AIChatInputWidget extends ReactWidget {
|
|
|
165
189
|
onDeleteChangeSetElement={this._onDeleteChangeSetElement.bind(this)}
|
|
166
190
|
onAddContextElement={this.addContextElement.bind(this)}
|
|
167
191
|
onDeleteContextElement={this.deleteContextElement.bind(this)}
|
|
168
|
-
context={this.getContext()}
|
|
169
192
|
onOpenContextElement={this.openContextElement.bind(this)}
|
|
193
|
+
context={this.getContext()}
|
|
170
194
|
chatModel={this._chatModel}
|
|
171
195
|
pinnedAgent={this._pinnedAgent}
|
|
172
196
|
editorProvider={this.editorProvider}
|
|
173
|
-
|
|
174
|
-
resourceUriProvider={this.getResourceUri.bind(this)}
|
|
197
|
+
uri={this.getResourceUri()}
|
|
175
198
|
contextMenuCallback={this.handleContextMenu.bind(this)}
|
|
176
199
|
isEnabled={this.isEnabled}
|
|
177
200
|
setEditorRef={editor => {
|
|
@@ -188,6 +211,14 @@ export class AIChatInputWidget extends ReactWidget {
|
|
|
188
211
|
initialValue={this._initialValue}
|
|
189
212
|
openerService={this.openerService}
|
|
190
213
|
suggestions={this._chatModel.suggestions}
|
|
214
|
+
currentRequest={currentRequest}
|
|
215
|
+
isEditing={isEditing}
|
|
216
|
+
pending={pending}
|
|
217
|
+
onResponseChanged={() => {
|
|
218
|
+
if (isPending() !== pending) {
|
|
219
|
+
this.update();
|
|
220
|
+
}
|
|
221
|
+
}}
|
|
191
222
|
/>
|
|
192
223
|
);
|
|
193
224
|
}
|
|
@@ -269,13 +300,14 @@ export class AIChatInputWidget extends ReactWidget {
|
|
|
269
300
|
}
|
|
270
301
|
|
|
271
302
|
interface ChatInputProperties {
|
|
303
|
+
branch?: ChatHierarchyBranch;
|
|
272
304
|
onCancel: (requestModel: ChatRequestModel) => void;
|
|
273
305
|
onQuery: (query: string) => void;
|
|
274
306
|
onUnpin: () => void;
|
|
275
307
|
onDragOver: (event: React.DragEvent) => void;
|
|
276
308
|
onDrop: (event: React.DragEvent) => void;
|
|
277
309
|
onDeleteChangeSet: (sessionId: string) => void;
|
|
278
|
-
onDeleteChangeSetElement: (sessionId: string,
|
|
310
|
+
onDeleteChangeSetElement: (sessionId: string, uri: URI) => void;
|
|
279
311
|
onAddContextElement: () => void;
|
|
280
312
|
onDeleteContextElement: (index: number) => void;
|
|
281
313
|
onOpenContextElement: OpenContextElement;
|
|
@@ -284,8 +316,7 @@ interface ChatInputProperties {
|
|
|
284
316
|
chatModel: ChatModel;
|
|
285
317
|
pinnedAgent?: ChatAgent;
|
|
286
318
|
editorProvider: MonacoEditorProvider;
|
|
287
|
-
|
|
288
|
-
resourceUriProvider: () => URI;
|
|
319
|
+
uri: URI;
|
|
289
320
|
contextMenuCallback: (event: IMouseEvent) => void;
|
|
290
321
|
setEditorRef: (editor: SimpleMonacoEditor | undefined) => void;
|
|
291
322
|
showContext?: boolean;
|
|
@@ -297,27 +328,27 @@ interface ChatInputProperties {
|
|
|
297
328
|
decoratorService: ChangeSetDecoratorService;
|
|
298
329
|
initialValue?: string;
|
|
299
330
|
openerService: OpenerService;
|
|
300
|
-
suggestions: readonly ChatSuggestion[]
|
|
331
|
+
suggestions: readonly ChatSuggestion[];
|
|
332
|
+
currentRequest?: ChatRequestModel;
|
|
333
|
+
isEditing: boolean;
|
|
334
|
+
pending: boolean;
|
|
335
|
+
onResponseChanged: () => void;
|
|
301
336
|
}
|
|
302
337
|
|
|
303
338
|
const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInputProperties) => {
|
|
304
339
|
const onDeleteChangeSet = () => props.onDeleteChangeSet(props.chatModel.id);
|
|
305
|
-
const onDeleteChangeSetElement = (
|
|
340
|
+
const onDeleteChangeSetElement = (uri: URI) => props.onDeleteChangeSetElement(props.chatModel.id, uri);
|
|
306
341
|
|
|
307
|
-
const [inProgress, setInProgress] = React.useState(false);
|
|
308
342
|
const [isInputEmpty, setIsInputEmpty] = React.useState(true);
|
|
309
343
|
const [changeSetUI, setChangeSetUI] = React.useState(
|
|
310
|
-
() =>
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
)
|
|
319
|
-
: undefined
|
|
320
|
-
);
|
|
344
|
+
() => buildChangeSetUI(
|
|
345
|
+
props.chatModel.changeSet,
|
|
346
|
+
props.labelProvider,
|
|
347
|
+
props.decoratorService,
|
|
348
|
+
props.actionService.getActionsForChangeset(props.chatModel.changeSet),
|
|
349
|
+
onDeleteChangeSet,
|
|
350
|
+
onDeleteChangeSetElement
|
|
351
|
+
));
|
|
321
352
|
|
|
322
353
|
// eslint-disable-next-line no-null/no-null
|
|
323
354
|
const editorContainerRef = React.useRef<HTMLDivElement | null>(null);
|
|
@@ -326,8 +357,7 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
|
|
|
326
357
|
const editorRef = React.useRef<SimpleMonacoEditor | undefined>(undefined);
|
|
327
358
|
|
|
328
359
|
React.useEffect(() => {
|
|
329
|
-
const uri = props.
|
|
330
|
-
const resource = props.resources.add(uri, '');
|
|
360
|
+
const uri = props.uri;
|
|
331
361
|
const createInputElement = async () => {
|
|
332
362
|
const paddingTop = 6;
|
|
333
363
|
const lineHeight = 20;
|
|
@@ -403,7 +433,6 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
|
|
|
403
433
|
createInputElement();
|
|
404
434
|
|
|
405
435
|
return () => {
|
|
406
|
-
resource.dispose();
|
|
407
436
|
props.setEditorRef(undefined);
|
|
408
437
|
if (editorRef.current) {
|
|
409
438
|
editorRef.current.dispose();
|
|
@@ -411,55 +440,34 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
|
|
|
411
440
|
};
|
|
412
441
|
}, []);
|
|
413
442
|
|
|
414
|
-
const responseListenerRef = React.useRef<Disposable>();
|
|
415
|
-
// track chat model updates to keep our UI in sync
|
|
416
|
-
// - keep "inProgress" in sync with the request state
|
|
417
|
-
// - keep "changeSetUI" in sync with the change set
|
|
418
443
|
React.useEffect(() => {
|
|
444
|
+
setChangeSetUI(buildChangeSetUI(
|
|
445
|
+
props.chatModel.changeSet,
|
|
446
|
+
props.labelProvider,
|
|
447
|
+
props.decoratorService,
|
|
448
|
+
props.actionService.getActionsForChangeset(props.chatModel.changeSet),
|
|
449
|
+
onDeleteChangeSet,
|
|
450
|
+
onDeleteChangeSetElement
|
|
451
|
+
));
|
|
419
452
|
const listener = props.chatModel.onDidChange(event => {
|
|
420
|
-
if (event
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
if (event.kind === 'removeChangeSet') {
|
|
430
|
-
setChangeSetUI(undefined);
|
|
431
|
-
} else if (event.kind === 'setChangeSet' || 'updateChangeSet') {
|
|
432
|
-
setChangeSetUI(buildChangeSetUI(
|
|
433
|
-
event.changeSet,
|
|
434
|
-
props.labelProvider,
|
|
435
|
-
props.decoratorService,
|
|
436
|
-
props.actionService.getActionsForChangeset(event.changeSet),
|
|
437
|
-
onDeleteChangeSet,
|
|
438
|
-
onDeleteChangeSetElement
|
|
439
|
-
));
|
|
440
|
-
}
|
|
453
|
+
if (ChatChangeEvent.isChangeSetEvent(event)) {
|
|
454
|
+
setChangeSetUI(buildChangeSetUI(
|
|
455
|
+
props.chatModel.changeSet,
|
|
456
|
+
props.labelProvider,
|
|
457
|
+
props.decoratorService,
|
|
458
|
+
props.actionService.getActionsForChangeset(props.chatModel.changeSet),
|
|
459
|
+
onDeleteChangeSet,
|
|
460
|
+
onDeleteChangeSetElement
|
|
461
|
+
));
|
|
441
462
|
}
|
|
442
463
|
});
|
|
443
|
-
setChangeSetUI(props.chatModel.changeSet
|
|
444
|
-
? buildChangeSetUI(
|
|
445
|
-
props.chatModel.changeSet,
|
|
446
|
-
props.labelProvider,
|
|
447
|
-
props.decoratorService,
|
|
448
|
-
props.actionService.getActionsForChangeset(props.chatModel.changeSet),
|
|
449
|
-
onDeleteChangeSet,
|
|
450
|
-
onDeleteChangeSetElement
|
|
451
|
-
)
|
|
452
|
-
: undefined);
|
|
453
464
|
return () => {
|
|
454
|
-
listener
|
|
455
|
-
responseListenerRef.current?.dispose();
|
|
456
|
-
responseListenerRef.current = undefined;
|
|
465
|
+
listener.dispose();
|
|
457
466
|
};
|
|
458
|
-
}, [props.chatModel]);
|
|
467
|
+
}, [props.chatModel, props.labelProvider, props.decoratorService, props.actionService]);
|
|
459
468
|
|
|
460
469
|
React.useEffect(() => {
|
|
461
470
|
const disposable = props.actionService.onDidChange(() => {
|
|
462
|
-
if (!props.chatModel.changeSet) { return; }
|
|
463
471
|
const newActions = props.actionService.getActionsForChangeset(props.chatModel.changeSet);
|
|
464
472
|
setChangeSetUI(current => !current ? current : { ...current, actions: newActions });
|
|
465
473
|
});
|
|
@@ -468,9 +476,6 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
|
|
|
468
476
|
|
|
469
477
|
React.useEffect(() => {
|
|
470
478
|
const disposable = props.decoratorService.onDidChangeDecorations(() => {
|
|
471
|
-
if (!props.chatModel.changeSet) {
|
|
472
|
-
return;
|
|
473
|
-
}
|
|
474
479
|
setChangeSetUI(buildChangeSetUI(
|
|
475
480
|
props.chatModel.changeSet,
|
|
476
481
|
props.labelProvider,
|
|
@@ -493,7 +498,6 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
|
|
|
493
498
|
if (!value || value.trim().length === 0) {
|
|
494
499
|
return;
|
|
495
500
|
}
|
|
496
|
-
setInProgress(true);
|
|
497
501
|
props.onQuery(value);
|
|
498
502
|
setValue('');
|
|
499
503
|
}, [props.context, props.onQuery, setValue]);
|
|
@@ -571,19 +575,38 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
|
|
|
571
575
|
: []),
|
|
572
576
|
] as Option[];
|
|
573
577
|
|
|
574
|
-
|
|
575
|
-
|
|
578
|
+
let rightOptions: Option[] = [];
|
|
579
|
+
const { currentRequest: latestRequest, isEditing, pending, onResponseChanged } = props;
|
|
580
|
+
React.useEffect(() => {
|
|
581
|
+
if (!latestRequest) {
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
const disposable = latestRequest.response.onDidChange(onResponseChanged);
|
|
585
|
+
return () => disposable.dispose();
|
|
586
|
+
}, [latestRequest, onResponseChanged]);
|
|
587
|
+
if (isEditing) {
|
|
588
|
+
rightOptions = [{
|
|
589
|
+
title: nls.localize('theia/ai/chat-ui/send', 'Send (Enter)'),
|
|
590
|
+
handler: () => {
|
|
591
|
+
if (props.isEnabled) {
|
|
592
|
+
submit(editorRef.current?.document.textEditorModel.getValue() || '');
|
|
593
|
+
}
|
|
594
|
+
},
|
|
595
|
+
className: 'codicon-send',
|
|
596
|
+
disabled: isInputEmpty || !props.isEnabled
|
|
597
|
+
}];
|
|
598
|
+
} else if (pending) {
|
|
599
|
+
rightOptions = [{
|
|
576
600
|
title: nls.localize('theia/ai/chat-ui/cancel', 'Cancel (Esc)'),
|
|
577
601
|
handler: () => {
|
|
578
|
-
const latestRequest = getLatestRequest(props.chatModel);
|
|
579
602
|
if (latestRequest) {
|
|
580
603
|
props.onCancel(latestRequest);
|
|
581
604
|
}
|
|
582
|
-
setInProgress(false);
|
|
583
605
|
},
|
|
584
606
|
className: 'codicon-stop-circle'
|
|
585
|
-
}]
|
|
586
|
-
|
|
607
|
+
}];
|
|
608
|
+
} else {
|
|
609
|
+
rightOptions = [{
|
|
587
610
|
title: nls.localize('theia/ai/chat-ui/send', 'Send (Enter)'),
|
|
588
611
|
handler: () => {
|
|
589
612
|
if (props.isEnabled) {
|
|
@@ -593,6 +616,7 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
|
|
|
593
616
|
className: 'codicon-send',
|
|
594
617
|
disabled: isInputEmpty || !props.isEnabled
|
|
595
618
|
}];
|
|
619
|
+
}
|
|
596
620
|
|
|
597
621
|
const contextUI = buildContextUI(props.context, props.labelProvider, props.onDeleteContextElement, props.onOpenContextElement);
|
|
598
622
|
|
|
@@ -624,28 +648,21 @@ const buildChangeSetUI = (
|
|
|
624
648
|
decoratorService: ChangeSetDecoratorService,
|
|
625
649
|
actions: ChangeSetActionRenderer[],
|
|
626
650
|
onDeleteChangeSet: () => void,
|
|
627
|
-
onDeleteChangeSetElement: (
|
|
628
|
-
): ChangeSetUI =>
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
additionalInfoSuffixIcon: decoratorService.getAdditionalInfoSuffixIcon(element),
|
|
639
|
-
openChange: element?.openChange?.bind(element),
|
|
640
|
-
apply: element.state !== 'applied' ? element?.apply?.bind(element) : undefined,
|
|
641
|
-
revert: element.state === 'applied' || element.state === 'stale' ? element?.revert?.bind(element) : undefined,
|
|
642
|
-
delete: () => onDeleteChangeSetElement(changeSet.getElements().indexOf(element))
|
|
643
|
-
} satisfies ChangeSetUIElement)),
|
|
644
|
-
actions
|
|
645
|
-
});
|
|
651
|
+
onDeleteChangeSetElement: (uri: URI) => void
|
|
652
|
+
): ChangeSetUI | undefined => {
|
|
653
|
+
const elements = changeSet.getElements();
|
|
654
|
+
return elements.length ? ({
|
|
655
|
+
title: changeSet.title,
|
|
656
|
+
changeSet,
|
|
657
|
+
deleteChangeSet: onDeleteChangeSet,
|
|
658
|
+
elements: changeSet.getElements().map(element => toUiElement(element, onDeleteChangeSetElement, labelProvider, decoratorService)),
|
|
659
|
+
actions
|
|
660
|
+
}) : undefined;
|
|
661
|
+
};
|
|
646
662
|
|
|
647
663
|
interface ChangeSetUIElement {
|
|
648
664
|
name: string;
|
|
665
|
+
uri: string;
|
|
649
666
|
iconClass: string;
|
|
650
667
|
nameClass: string;
|
|
651
668
|
additionalInfo: string;
|
|
@@ -677,48 +694,70 @@ const ChangeSetBox: React.FunctionComponent<{ changeSet: ChangeSetUI }> = React.
|
|
|
677
694
|
</div>
|
|
678
695
|
<div className='theia-ChatInput-ChangeSet-List'>
|
|
679
696
|
<ul>
|
|
680
|
-
{elements.map(
|
|
681
|
-
<li key={index} title={nls.localize('theia/ai/chat-ui/openDiff', 'Open Diff')} onClick={() => element.openChange?.()}>
|
|
682
|
-
<div className={`theia-ChatInput-ChangeSet-Icon ${element.iconClass}`}>
|
|
683
|
-
</div>
|
|
684
|
-
<div className='theia-ChatInput-ChangeSet-labelParts'>
|
|
685
|
-
<span className={`theia-ChatInput-ChangeSet-title ${element.nameClass}`}>
|
|
686
|
-
{element.name}
|
|
687
|
-
</span>
|
|
688
|
-
<div className='theia-ChatInput-ChangeSet-additionalInfo'>
|
|
689
|
-
{element.additionalInfo && <span>{element.additionalInfo}</span>}
|
|
690
|
-
{element.additionalInfoSuffixIcon
|
|
691
|
-
&& <div className={`theia-ChatInput-ChangeSet-AdditionalInfo-SuffixIcon ${element.additionalInfoSuffixIcon.join(' ')}`}></div>}
|
|
692
|
-
</div>
|
|
693
|
-
</div>
|
|
694
|
-
<div className='theia-ChatInput-ChangeSet-Actions'>
|
|
695
|
-
{element.open && (
|
|
696
|
-
<span
|
|
697
|
-
className='codicon codicon-file action'
|
|
698
|
-
title={nls.localize('theia/ai/chat-ui/openOriginalFile', 'Open Original File')}
|
|
699
|
-
onClick={noPropagation(() => element.open!())}
|
|
700
|
-
/>)}
|
|
701
|
-
{element.revert && (
|
|
702
|
-
<span
|
|
703
|
-
className='codicon codicon-discard action'
|
|
704
|
-
title={nls.localizeByDefault('Revert')}
|
|
705
|
-
onClick={noPropagation(() => element.revert!())}
|
|
706
|
-
/>)}
|
|
707
|
-
{element.apply && (
|
|
708
|
-
<span
|
|
709
|
-
className='codicon codicon-check action'
|
|
710
|
-
title={nls.localizeByDefault('Apply')}
|
|
711
|
-
onClick={noPropagation(() => element.apply!())}
|
|
712
|
-
/>)}
|
|
713
|
-
<span className='codicon codicon-close action' title={nls.localizeByDefault('Delete')} onClick={noPropagation(() => element.delete())} />
|
|
714
|
-
</div>
|
|
715
|
-
</li>
|
|
716
|
-
))}
|
|
697
|
+
{elements.map(element => ChangeSetElement(element))}
|
|
717
698
|
</ul>
|
|
718
699
|
</div>
|
|
719
700
|
</div>
|
|
720
701
|
));
|
|
721
702
|
|
|
703
|
+
function toUiElement(element: ChangeSetElement,
|
|
704
|
+
onDeleteChangeSetElement: (uri: URI) => void,
|
|
705
|
+
labelProvider: LabelProvider,
|
|
706
|
+
decoratorService: ChangeSetDecoratorService
|
|
707
|
+
): ChangeSetUIElement {
|
|
708
|
+
return ({
|
|
709
|
+
open: element.open?.bind(element),
|
|
710
|
+
uri: element.uri.toString(),
|
|
711
|
+
iconClass: element.icon ?? labelProvider.getIcon(element.uri) ?? labelProvider.fileIcon,
|
|
712
|
+
nameClass: `${element.type} ${element.state}`,
|
|
713
|
+
name: element.name ?? labelProvider.getName(element.uri),
|
|
714
|
+
additionalInfo: element.additionalInfo ?? labelProvider.getDetails(element.uri),
|
|
715
|
+
additionalInfoSuffixIcon: decoratorService.getAdditionalInfoSuffixIcon(element),
|
|
716
|
+
openChange: element?.openChange?.bind(element),
|
|
717
|
+
apply: element.state !== 'applied' ? element?.apply?.bind(element) : undefined,
|
|
718
|
+
revert: element.state === 'applied' || element.state === 'stale' ? element?.revert?.bind(element) : undefined,
|
|
719
|
+
delete: () => onDeleteChangeSetElement(element.uri)
|
|
720
|
+
} satisfies ChangeSetUIElement);
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
const ChangeSetElement: React.FC<ChangeSetUIElement> = element => (
|
|
724
|
+
<li key={element.uri} title={nls.localize('theia/ai/chat-ui/openDiff', 'Open Diff')} onClick={() => element.openChange?.()}>
|
|
725
|
+
<div className={`theia-ChatInput-ChangeSet-Icon ${element.iconClass}`}>
|
|
726
|
+
</div>
|
|
727
|
+
<div className='theia-ChatInput-ChangeSet-labelParts'>
|
|
728
|
+
<span className={`theia-ChatInput-ChangeSet-title ${element.nameClass}`}>
|
|
729
|
+
{element.name}
|
|
730
|
+
</span>
|
|
731
|
+
<div className='theia-ChatInput-ChangeSet-additionalInfo'>
|
|
732
|
+
{element.additionalInfo && <span>{element.additionalInfo}</span>}
|
|
733
|
+
{element.additionalInfoSuffixIcon
|
|
734
|
+
&& <div className={`theia-ChatInput-ChangeSet-AdditionalInfo-SuffixIcon ${element.additionalInfoSuffixIcon.join(' ')}`}></div>}
|
|
735
|
+
</div>
|
|
736
|
+
</div>
|
|
737
|
+
<div className='theia-ChatInput-ChangeSet-Actions'>
|
|
738
|
+
{element.open && (
|
|
739
|
+
<span
|
|
740
|
+
className='codicon codicon-file action'
|
|
741
|
+
title={nls.localize('theia/ai/chat-ui/openOriginalFile', 'Open Original File')}
|
|
742
|
+
onClick={noPropagation(() => element.open!())}
|
|
743
|
+
/>)}
|
|
744
|
+
{element.revert && (
|
|
745
|
+
<span
|
|
746
|
+
className='codicon codicon-discard action'
|
|
747
|
+
title={nls.localizeByDefault('Revert')}
|
|
748
|
+
onClick={noPropagation(() => element.revert!())}
|
|
749
|
+
/>)}
|
|
750
|
+
{element.apply && (
|
|
751
|
+
<span
|
|
752
|
+
className='codicon codicon-check action'
|
|
753
|
+
title={nls.localizeByDefault('Apply')}
|
|
754
|
+
onClick={noPropagation(() => element.apply!())}
|
|
755
|
+
/>)}
|
|
756
|
+
<span className='codicon codicon-close action' title={nls.localizeByDefault('Delete')} onClick={noPropagation(() => element.delete())} />
|
|
757
|
+
</div>
|
|
758
|
+
</li>
|
|
759
|
+
);
|
|
760
|
+
|
|
722
761
|
interface ChatInputOptionsProps {
|
|
723
762
|
leftOptions: Option[];
|
|
724
763
|
rightOptions: Option[];
|
|
@@ -766,11 +805,6 @@ const ChatInputOptions: React.FunctionComponent<ChatInputOptionsProps> = ({ left
|
|
|
766
805
|
</div>
|
|
767
806
|
);
|
|
768
807
|
|
|
769
|
-
function getLatestRequest(chatModel: ChatModel): ChatRequestModel | undefined {
|
|
770
|
-
const requests = chatModel.getRequests();
|
|
771
|
-
return requests.length > 0 ? requests[requests.length - 1] : undefined;
|
|
772
|
-
}
|
|
773
|
-
|
|
774
808
|
function buildContextUI(
|
|
775
809
|
context: readonly AIVariableResolutionRequest[] | undefined,
|
|
776
810
|
labelProvider: LabelProvider,
|