@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.
Files changed (40) hide show
  1. package/lib/browser/ai-chat-ui-contribution.js +2 -2
  2. package/lib/browser/ai-chat-ui-contribution.js.map +1 -1
  3. package/lib/browser/chat-input-widget.d.ts +3 -1
  4. package/lib/browser/chat-input-widget.d.ts.map +1 -1
  5. package/lib/browser/chat-input-widget.js +101 -90
  6. package/lib/browser/chat-input-widget.js.map +1 -1
  7. package/lib/browser/chat-response-renderer/index.d.ts +1 -0
  8. package/lib/browser/chat-response-renderer/index.d.ts.map +1 -1
  9. package/lib/browser/chat-response-renderer/index.js +1 -0
  10. package/lib/browser/chat-response-renderer/index.js.map +1 -1
  11. package/lib/browser/chat-response-renderer/tool-confirmation.d.ts +17 -0
  12. package/lib/browser/chat-response-renderer/tool-confirmation.d.ts.map +1 -0
  13. package/lib/browser/chat-response-renderer/tool-confirmation.js +120 -0
  14. package/lib/browser/chat-response-renderer/tool-confirmation.js.map +1 -0
  15. package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts +5 -1
  16. package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts.map +1 -1
  17. package/lib/browser/chat-response-renderer/toolcall-part-renderer.js +83 -19
  18. package/lib/browser/chat-response-renderer/toolcall-part-renderer.js.map +1 -1
  19. package/lib/browser/chat-tree-view/chat-view-tree-input-widget.d.ts +6 -1
  20. package/lib/browser/chat-tree-view/chat-view-tree-input-widget.d.ts.map +1 -1
  21. package/lib/browser/chat-tree-view/chat-view-tree-input-widget.js +9 -0
  22. package/lib/browser/chat-tree-view/chat-view-tree-input-widget.js.map +1 -1
  23. package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts +6 -0
  24. package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts.map +1 -1
  25. package/lib/browser/chat-tree-view/chat-view-tree-widget.js +30 -3
  26. package/lib/browser/chat-tree-view/chat-view-tree-widget.js.map +1 -1
  27. package/lib/browser/chat-view-widget.d.ts +5 -2
  28. package/lib/browser/chat-view-widget.d.ts.map +1 -1
  29. package/lib/browser/chat-view-widget.js +19 -6
  30. package/lib/browser/chat-view-widget.js.map +1 -1
  31. package/package.json +10 -10
  32. package/src/browser/ai-chat-ui-contribution.ts +2 -2
  33. package/src/browser/chat-input-widget.tsx +171 -137
  34. package/src/browser/chat-response-renderer/index.ts +1 -0
  35. package/src/browser/chat-response-renderer/tool-confirmation.tsx +173 -0
  36. package/src/browser/chat-response-renderer/toolcall-part-renderer.tsx +115 -19
  37. package/src/browser/chat-tree-view/chat-view-tree-input-widget.tsx +16 -1
  38. package/src/browser/chat-tree-view/chat-view-tree-widget.tsx +39 -5
  39. package/src/browser/chat-view-widget.tsx +23 -7
  40. 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":"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"}
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
- this.treeWidget.shouldScrollToEnd = !newState.locked;
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, index) {
160
- this.chatService.deleteChangeSetElement(sessionId, index);
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":"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"}
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.0+c02e6a4f5",
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.0+c02e6a4f5",
7
- "@theia/ai-core": "1.63.0-next.0+c02e6a4f5",
8
- "@theia/core": "1.63.0-next.0+c02e6a4f5",
9
- "@theia/editor": "1.63.0-next.0+c02e6a4f5",
10
- "@theia/editor-preview": "1.63.0-next.0+c02e6a4f5",
11
- "@theia/filesystem": "1.63.0-next.0+c02e6a4f5",
12
- "@theia/monaco": "1.63.0-next.0+c02e6a4f5",
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.0+c02e6a4f5",
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": "c02e6a4f58728b4067cbd267d598550192abb249"
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().length > 1,
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 => !session.isActive && session.title)
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 { ChangeSet, ChatAgent, ChatChangeEvent, ChatModel, ChatRequestModel, ChatService, ChatSuggestion } from '@theia/ai-chat';
17
- import { Disposable, DisposableCollection, InMemoryResources, URI, nls } from '@theia/core';
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
- resources={this.resources}
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, index: number) => void;
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
- resources: InMemoryResources;
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 = (index: number) => props.onDeleteChangeSetElement(props.chatModel.id, index);
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
- () => props.chatModel.changeSet
311
- ? buildChangeSetUI(
312
- props.chatModel.changeSet,
313
- props.labelProvider,
314
- props.decoratorService,
315
- props.actionService.getActionsForChangeset(props.chatModel.changeSet),
316
- onDeleteChangeSet,
317
- onDeleteChangeSetElement
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.resourceUriProvider();
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.kind === 'addRequest') {
421
- if (event.request) {
422
- setInProgress(ChatRequestModel.isInProgress(event.request));
423
- }
424
- responseListenerRef.current?.dispose();
425
- responseListenerRef.current = event.request.response.onDidChange(() =>
426
- setInProgress(ChatRequestModel.isInProgress(event.request))
427
- );
428
- } else if (ChatChangeEvent.isChangeSetEvent(event)) {
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?.dispose();
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
- const rightOptions = inProgress
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: (index: number) => void
628
- ): ChangeSetUI => ({
629
- title: changeSet.title,
630
- changeSet,
631
- deleteChangeSet: onDeleteChangeSet,
632
- elements: changeSet.getElements().map(element => ({
633
- open: element.open?.bind(element),
634
- iconClass: element.icon ?? labelProvider.getIcon(element.uri) ?? labelProvider.fileIcon,
635
- nameClass: `${element.type} ${element.state}`,
636
- name: element.name ?? labelProvider.getName(element.uri),
637
- additionalInfo: element.additionalInfo ?? labelProvider.getDetails(element.uri),
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((element, index) => (
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,