@theia/ai-chat-ui 1.67.0-next.3 → 1.67.0-next.56

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 (165) hide show
  1. package/README.md +1 -0
  2. package/package.json +10 -10
  3. package/src/browser/chat-input-widget.tsx +77 -14
  4. package/src/browser/chat-response-renderer/markdown-part-renderer.tsx +4 -3
  5. package/src/browser/style/index.css +31 -0
  6. package/lib/browser/ai-chat-ui-contribution.d.ts +0 -66
  7. package/lib/browser/ai-chat-ui-contribution.d.ts.map +0 -1
  8. package/lib/browser/ai-chat-ui-contribution.js +0 -587
  9. package/lib/browser/ai-chat-ui-contribution.js.map +0 -1
  10. package/lib/browser/ai-chat-ui-frontend-module.d.ts +0 -5
  11. package/lib/browser/ai-chat-ui-frontend-module.d.ts.map +0 -1
  12. package/lib/browser/ai-chat-ui-frontend-module.js +0 -153
  13. package/lib/browser/ai-chat-ui-frontend-module.js.map +0 -1
  14. package/lib/browser/change-set-actions/change-set-accept-action.d.ts +0 -10
  15. package/lib/browser/change-set-actions/change-set-accept-action.d.ts.map +0 -1
  16. package/lib/browser/change-set-actions/change-set-accept-action.js +0 -47
  17. package/lib/browser/change-set-actions/change-set-accept-action.js.map +0 -1
  18. package/lib/browser/change-set-actions/change-set-action-service.d.ts +0 -31
  19. package/lib/browser/change-set-actions/change-set-action-service.d.ts.map +0 -1
  20. package/lib/browser/change-set-actions/change-set-action-service.js +0 -57
  21. package/lib/browser/change-set-actions/change-set-action-service.js.map +0 -1
  22. package/lib/browser/chat-input-agent-suggestions.d.ts +0 -11
  23. package/lib/browser/chat-input-agent-suggestions.d.ts.map +0 -1
  24. package/lib/browser/chat-input-agent-suggestions.js +0 -76
  25. package/lib/browser/chat-input-agent-suggestions.js.map +0 -1
  26. package/lib/browser/chat-input-history-contribution.d.ts +0 -17
  27. package/lib/browser/chat-input-history-contribution.d.ts.map +0 -1
  28. package/lib/browser/chat-input-history-contribution.js +0 -158
  29. package/lib/browser/chat-input-history-contribution.js.map +0 -1
  30. package/lib/browser/chat-input-history.d.ts +0 -32
  31. package/lib/browser/chat-input-history.d.ts.map +0 -1
  32. package/lib/browser/chat-input-history.js +0 -125
  33. package/lib/browser/chat-input-history.js.map +0 -1
  34. package/lib/browser/chat-input-mode-contribution.d.ts +0 -12
  35. package/lib/browser/chat-input-mode-contribution.d.ts.map +0 -1
  36. package/lib/browser/chat-input-mode-contribution.js +0 -77
  37. package/lib/browser/chat-input-mode-contribution.js.map +0 -1
  38. package/lib/browser/chat-input-widget.d.ts +0 -115
  39. package/lib/browser/chat-input-widget.d.ts.map +0 -1
  40. package/lib/browser/chat-input-widget.js +0 -973
  41. package/lib/browser/chat-input-widget.js.map +0 -1
  42. package/lib/browser/chat-node-toolbar-action-contribution.d.ts +0 -56
  43. package/lib/browser/chat-node-toolbar-action-contribution.d.ts.map +0 -1
  44. package/lib/browser/chat-node-toolbar-action-contribution.js +0 -92
  45. package/lib/browser/chat-node-toolbar-action-contribution.js.map +0 -1
  46. package/lib/browser/chat-progress-message.d.ts +0 -7
  47. package/lib/browser/chat-progress-message.d.ts.map +0 -1
  48. package/lib/browser/chat-progress-message.js +0 -33
  49. package/lib/browser/chat-progress-message.js.map +0 -1
  50. package/lib/browser/chat-response-part-renderer.d.ts +0 -10
  51. package/lib/browser/chat-response-part-renderer.d.ts.map +0 -1
  52. package/lib/browser/chat-response-part-renderer.js +0 -20
  53. package/lib/browser/chat-response-part-renderer.js.map +0 -1
  54. package/lib/browser/chat-response-renderer/ai-selection-resolver.d.ts +0 -23
  55. package/lib/browser/chat-response-renderer/ai-selection-resolver.d.ts.map +0 -1
  56. package/lib/browser/chat-response-renderer/ai-selection-resolver.js +0 -148
  57. package/lib/browser/chat-response-renderer/ai-selection-resolver.js.map +0 -1
  58. package/lib/browser/chat-response-renderer/code-part-renderer.d.ts +0 -73
  59. package/lib/browser/chat-response-renderer/code-part-renderer.d.ts.map +0 -1
  60. package/lib/browser/chat-response-renderer/code-part-renderer.js +0 -227
  61. package/lib/browser/chat-response-renderer/code-part-renderer.js.map +0 -1
  62. package/lib/browser/chat-response-renderer/command-part-renderer.d.ts +0 -12
  63. package/lib/browser/chat-response-renderer/command-part-renderer.d.ts.map +0 -1
  64. package/lib/browser/chat-response-renderer/command-part-renderer.js +0 -67
  65. package/lib/browser/chat-response-renderer/command-part-renderer.js.map +0 -1
  66. package/lib/browser/chat-response-renderer/delegation-response-renderer.d.ts +0 -14
  67. package/lib/browser/chat-response-renderer/delegation-response-renderer.d.ts.map +0 -1
  68. package/lib/browser/chat-response-renderer/delegation-response-renderer.js +0 -144
  69. package/lib/browser/chat-response-renderer/delegation-response-renderer.js.map +0 -1
  70. package/lib/browser/chat-response-renderer/error-part-renderer.d.ts +0 -9
  71. package/lib/browser/chat-response-renderer/error-part-renderer.d.ts.map +0 -1
  72. package/lib/browser/chat-response-renderer/error-part-renderer.js +0 -40
  73. package/lib/browser/chat-response-renderer/error-part-renderer.js.map +0 -1
  74. package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.d.ts +0 -12
  75. package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.d.ts.map +0 -1
  76. package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.js +0 -54
  77. package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.js.map +0 -1
  78. package/lib/browser/chat-response-renderer/index.d.ts +0 -13
  79. package/lib/browser/chat-response-renderer/index.d.ts.map +0 -1
  80. package/lib/browser/chat-response-renderer/index.js +0 -31
  81. package/lib/browser/chat-response-renderer/index.js.map +0 -1
  82. package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts +0 -36
  83. package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts.map +0 -1
  84. package/lib/browser/chat-response-renderer/markdown-part-renderer.js +0 -128
  85. package/lib/browser/chat-response-renderer/markdown-part-renderer.js.map +0 -1
  86. package/lib/browser/chat-response-renderer/progress-part-renderer.d.ts +0 -9
  87. package/lib/browser/chat-response-renderer/progress-part-renderer.d.ts.map +0 -1
  88. package/lib/browser/chat-response-renderer/progress-part-renderer.js +0 -39
  89. package/lib/browser/chat-response-renderer/progress-part-renderer.js.map +0 -1
  90. package/lib/browser/chat-response-renderer/question-part-renderer.d.ts +0 -10
  91. package/lib/browser/chat-response-renderer/question-part-renderer.d.ts.map +0 -1
  92. package/lib/browser/chat-response-renderer/question-part-renderer.js +0 -49
  93. package/lib/browser/chat-response-renderer/question-part-renderer.js.map +0 -1
  94. package/lib/browser/chat-response-renderer/text-part-renderer.d.ts +0 -9
  95. package/lib/browser/chat-response-renderer/text-part-renderer.d.ts.map +0 -1
  96. package/lib/browser/chat-response-renderer/text-part-renderer.js +0 -43
  97. package/lib/browser/chat-response-renderer/text-part-renderer.js.map +0 -1
  98. package/lib/browser/chat-response-renderer/text-part-renderer.spec.d.ts +0 -2
  99. package/lib/browser/chat-response-renderer/text-part-renderer.spec.d.ts.map +0 -1
  100. package/lib/browser/chat-response-renderer/text-part-renderer.spec.js +0 -46
  101. package/lib/browser/chat-response-renderer/text-part-renderer.spec.js.map +0 -1
  102. package/lib/browser/chat-response-renderer/thinking-part-renderer.d.ts +0 -9
  103. package/lib/browser/chat-response-renderer/thinking-part-renderer.d.ts.map +0 -1
  104. package/lib/browser/chat-response-renderer/thinking-part-renderer.js +0 -42
  105. package/lib/browser/chat-response-renderer/thinking-part-renderer.js.map +0 -1
  106. package/lib/browser/chat-response-renderer/tool-confirmation.d.ts +0 -17
  107. package/lib/browser/chat-response-renderer/tool-confirmation.d.ts.map +0 -1
  108. package/lib/browser/chat-response-renderer/tool-confirmation.js +0 -122
  109. package/lib/browser/chat-response-renderer/tool-confirmation.js.map +0 -1
  110. package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts +0 -20
  111. package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts.map +0 -1
  112. package/lib/browser/chat-response-renderer/toolcall-part-renderer.js +0 -223
  113. package/lib/browser/chat-response-renderer/toolcall-part-renderer.js.map +0 -1
  114. package/lib/browser/chat-response-renderer/unknown-part-renderer.d.ts +0 -9
  115. package/lib/browser/chat-response-renderer/unknown-part-renderer.d.ts.map +0 -1
  116. package/lib/browser/chat-response-renderer/unknown-part-renderer.js +0 -42
  117. package/lib/browser/chat-response-renderer/unknown-part-renderer.js.map +0 -1
  118. package/lib/browser/chat-tree-view/chat-view-tree-container.d.ts +0 -4
  119. package/lib/browser/chat-tree-view/chat-view-tree-container.d.ts.map +0 -1
  120. package/lib/browser/chat-tree-view/chat-view-tree-container.js +0 -33
  121. package/lib/browser/chat-tree-view/chat-view-tree-container.js.map +0 -1
  122. package/lib/browser/chat-tree-view/chat-view-tree-input-widget.d.ts +0 -38
  123. package/lib/browser/chat-tree-view/chat-view-tree-input-widget.d.ts.map +0 -1
  124. package/lib/browser/chat-tree-view/chat-view-tree-input-widget.js +0 -88
  125. package/lib/browser/chat-tree-view/chat-view-tree-input-widget.js.map +0 -1
  126. package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts +0 -120
  127. package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts.map +0 -1
  128. package/lib/browser/chat-tree-view/chat-view-tree-widget.js +0 -654
  129. package/lib/browser/chat-tree-view/chat-view-tree-widget.js.map +0 -1
  130. package/lib/browser/chat-tree-view/index.d.ts +0 -3
  131. package/lib/browser/chat-tree-view/index.d.ts.map +0 -1
  132. package/lib/browser/chat-tree-view/index.js +0 -21
  133. package/lib/browser/chat-tree-view/index.js.map +0 -1
  134. package/lib/browser/chat-tree-view/sub-chat-widget.d.ts +0 -22
  135. package/lib/browser/chat-tree-view/sub-chat-widget.d.ts.map +0 -1
  136. package/lib/browser/chat-tree-view/sub-chat-widget.js +0 -92
  137. package/lib/browser/chat-tree-view/sub-chat-widget.js.map +0 -1
  138. package/lib/browser/chat-view-commands.d.ts +0 -15
  139. package/lib/browser/chat-view-commands.d.ts.map +0 -1
  140. package/lib/browser/chat-view-commands.js +0 -76
  141. package/lib/browser/chat-view-commands.js.map +0 -1
  142. package/lib/browser/chat-view-contribution.d.ts +0 -21
  143. package/lib/browser/chat-view-contribution.d.ts.map +0 -1
  144. package/lib/browser/chat-view-contribution.js +0 -183
  145. package/lib/browser/chat-view-contribution.js.map +0 -1
  146. package/lib/browser/chat-view-language-contribution.d.ts +0 -41
  147. package/lib/browser/chat-view-language-contribution.d.ts.map +0 -1
  148. package/lib/browser/chat-view-language-contribution.js +0 -269
  149. package/lib/browser/chat-view-language-contribution.js.map +0 -1
  150. package/lib/browser/chat-view-widget-toolbar-contribution.d.ts +0 -20
  151. package/lib/browser/chat-view-widget-toolbar-contribution.d.ts.map +0 -1
  152. package/lib/browser/chat-view-widget-toolbar-contribution.js +0 -115
  153. package/lib/browser/chat-view-widget-toolbar-contribution.js.map +0 -1
  154. package/lib/browser/chat-view-widget.d.ts +0 -60
  155. package/lib/browser/chat-view-widget.d.ts.map +0 -1
  156. package/lib/browser/chat-view-widget.js +0 -243
  157. package/lib/browser/chat-view-widget.js.map +0 -1
  158. package/lib/browser/context-variable-picker.d.ts +0 -9
  159. package/lib/browser/context-variable-picker.d.ts.map +0 -1
  160. package/lib/browser/context-variable-picker.js +0 -86
  161. package/lib/browser/context-variable-picker.js.map +0 -1
  162. package/lib/browser/session-settings-dialog.d.ts +0 -35
  163. package/lib/browser/session-settings-dialog.d.ts.map +0 -1
  164. package/lib/browser/session-settings-dialog.js +0 -118
  165. package/lib/browser/session-settings-dialog.js.map +0 -1
package/README.md CHANGED
@@ -19,6 +19,7 @@ It is based on `@theia/ai-chat`.
19
19
 
20
20
  ## Additional Information
21
21
 
22
+ - [API documentation for `@theia/ai-chat-ui`](https://eclipse-theia.github.io/theia/docs/next/modules/_theia_ai-chat-ui.html)
22
23
  - [Theia - GitHub](https://github.com/eclipse-theia/theia)
23
24
  - [Theia - Website](https://theia-ide.org/)
24
25
 
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@theia/ai-chat-ui",
3
- "version": "1.67.0-next.3+7946ca874",
3
+ "version": "1.67.0-next.56+d8f18cc386c",
4
4
  "description": "Theia - AI Chat UI Extension",
5
5
  "dependencies": {
6
- "@theia/ai-chat": "1.67.0-next.3+7946ca874",
7
- "@theia/ai-core": "1.67.0-next.3+7946ca874",
8
- "@theia/core": "1.67.0-next.3+7946ca874",
9
- "@theia/editor": "1.67.0-next.3+7946ca874",
10
- "@theia/editor-preview": "1.67.0-next.3+7946ca874",
11
- "@theia/filesystem": "1.67.0-next.3+7946ca874",
12
- "@theia/monaco": "1.67.0-next.3+7946ca874",
6
+ "@theia/ai-chat": "1.67.0-next.56+d8f18cc386c",
7
+ "@theia/ai-core": "1.67.0-next.56+d8f18cc386c",
8
+ "@theia/core": "1.67.0-next.56+d8f18cc386c",
9
+ "@theia/editor": "1.67.0-next.56+d8f18cc386c",
10
+ "@theia/editor-preview": "1.67.0-next.56+d8f18cc386c",
11
+ "@theia/filesystem": "1.67.0-next.56+d8f18cc386c",
12
+ "@theia/monaco": "1.67.0-next.56+d8f18cc386c",
13
13
  "@theia/monaco-editor-core": "1.96.302",
14
- "@theia/workspace": "1.67.0-next.3+7946ca874",
14
+ "@theia/workspace": "1.67.0-next.56+d8f18cc386c",
15
15
  "date-fns": "^4.1.0",
16
16
  "tslib": "^2.6.2",
17
17
  "uuid": "^9.0.1"
@@ -55,5 +55,5 @@
55
55
  "nyc": {
56
56
  "extends": "../../configs/nyc.json"
57
57
  },
58
- "gitHead": "7946ca874b04e6249d883e9a586f193194df1365"
58
+ "gitHead": "d8f18cc386c45a736cd193d42eab02c8f64c6b10"
59
59
  }
@@ -39,6 +39,7 @@ import { TASK_CONTEXT_VARIABLE } from '@theia/ai-chat/lib/browser/task-context-v
39
39
  import { IModelDeltaDecoration } from '@theia/monaco-editor-core/esm/vs/editor/common/model';
40
40
  import { EditorOption } from '@theia/monaco-editor-core/esm/vs/editor/common/config/editorOptions';
41
41
  import { ChatInputHistoryService, ChatInputNavigationState } from './chat-input-history';
42
+ import { ContextFileValidationService, FileValidationResult, FileValidationState } from '@theia/ai-chat/lib/browser/context-file-validation-service';
42
43
 
43
44
  type Query = (query: string, mode?: string) => Promise<void>;
44
45
  type Unpin = () => void;
@@ -106,6 +107,11 @@ export class AIChatInputWidget extends ReactWidget {
106
107
  @inject(ChatRequestParser)
107
108
  protected readonly chatRequestParser: ChatRequestParser;
108
109
 
110
+ @inject(ContextFileValidationService) @optional()
111
+ protected readonly validationService: ContextFileValidationService | undefined;
112
+
113
+ protected fileValidationState = new Map<string, FileValidationResult>();
114
+
109
115
  @inject(ContextKeyService)
110
116
  protected readonly contextKeyService: ContextKeyService;
111
117
 
@@ -218,7 +224,25 @@ export class AIChatInputWidget extends ReactWidget {
218
224
  this.onDisposeForChatModel.dispose();
219
225
  this.onDisposeForChatModel = new DisposableCollection();
220
226
  this.onDisposeForChatModel.push(chatModel.onDidChange(event => {
221
- if (event.kind === 'addVariable' || event.kind === 'removeVariable' || event.kind === 'addRequest' || event.kind === 'changeHierarchyBranch') {
227
+ if (event.kind === 'addVariable') {
228
+ // Validate files added via any path (including LLM tool calls)
229
+ // Get the current variables and validate any new file variables
230
+ const variables = chatModel.context.getVariables();
231
+ variables.forEach(variable => {
232
+ if (variable.variable.name === 'file' && variable.arg) {
233
+ const pathKey = variable.arg; // Use the original path as the key
234
+ // Revalidate the file each time someone (User or LLM) adds it to the context,
235
+ // as the state may change over time.
236
+ if (this.validationService) {
237
+ this.validationService.validateFile(pathKey).then(result => {
238
+ this.fileValidationState.set(pathKey, result);
239
+ this.update();
240
+ });
241
+ }
242
+ }
243
+ });
244
+ this.update();
245
+ } else if (event.kind === 'removeVariable' || event.kind === 'addRequest' || event.kind === 'changeHierarchyBranch') {
222
246
  this.update();
223
247
  }
224
248
  }));
@@ -458,6 +482,7 @@ export class AIChatInputWidget extends ReactWidget {
458
482
  onDeleteContextElement={this.deleteContextElement.bind(this)}
459
483
  onOpenContextElement={this.openContextElement.bind(this)}
460
484
  context={this.getContext()}
485
+ fileValidationState={this.fileValidationState}
461
486
  onAgentCompletion={this.handleAgentCompletion.bind(this)}
462
487
  chatModel={this._chatModel}
463
488
  pinnedAgent={this._pinnedAgent}
@@ -562,6 +587,14 @@ export class AIChatInputWidget extends ReactWidget {
562
587
  }
563
588
 
564
589
  protected async openContextElement(request: AIVariableResolutionRequest): Promise<void> {
590
+ // Re-validate file before opening
591
+ if (request.variable.name === 'file' && request.arg) {
592
+ if (this.validationService) {
593
+ const result = await this.validationService.validateFile(request.arg);
594
+ this.fileValidationState.set(request.arg, result);
595
+ this.update();
596
+ }
597
+ }
565
598
  const session = this.chatService.getSessions().find(candidate => candidate.model.id === this._chatModel.id);
566
599
  const context = { session };
567
600
  await this.variableService.open(request, context);
@@ -595,6 +628,7 @@ export class AIChatInputWidget extends ReactWidget {
595
628
  }
596
629
 
597
630
  addContext(variable: AIVariableResolutionRequest): void {
631
+ // Validation happens in the chatModel.onDidChange listener
598
632
  this._chatModel.context.addVariables(variable);
599
633
  }
600
634
 
@@ -619,6 +653,7 @@ interface ChatInputProperties {
619
653
  onOpenContextElement: OpenContextElement;
620
654
  onAgentCompletion: (request: ChatRequestModel) => void;
621
655
  context?: readonly AIVariableResolutionRequest[];
656
+ fileValidationState: Map<string, FileValidationResult>;
622
657
  isEnabled?: boolean;
623
658
  chatModel: ChatModel;
624
659
  pinnedAgent?: ChatAgent;
@@ -1044,7 +1079,7 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
1044
1079
  }];
1045
1080
  }
1046
1081
 
1047
- const contextUI = buildContextUI(props.context, props.labelProvider, props.onDeleteContextElement, props.onOpenContextElement);
1082
+ const contextUI = buildContextUI(props.context, props.labelProvider, props.onDeleteContextElement, props.onOpenContextElement, props.fileValidationState);
1048
1083
 
1049
1084
  // Show mode selector if agent has multiple modes
1050
1085
  const showModeSelector = (props.modeSelectorProps.receivingAgentModes?.length ?? 0) > 1;
@@ -1293,22 +1328,43 @@ function buildContextUI(
1293
1328
  context: readonly AIVariableResolutionRequest[] | undefined,
1294
1329
  labelProvider: LabelProvider,
1295
1330
  onDeleteContextElement: (index: number) => void,
1296
- onOpen: OpenContextElement
1331
+ onOpen: OpenContextElement,
1332
+ fileValidationState: Map<string, FileValidationResult>
1297
1333
  ): ChatContextUI {
1298
1334
  if (!context) {
1299
1335
  return { context: [] };
1300
1336
  }
1301
1337
  return {
1302
- context: context.map((element, index) => ({
1303
- variable: element,
1304
- name: labelProvider.getName(element),
1305
- iconClass: labelProvider.getIcon(element),
1306
- nameClass: element.variable.name,
1307
- additionalInfo: labelProvider.getDetails(element),
1308
- details: labelProvider.getLongName(element),
1309
- delete: () => onDeleteContextElement(index),
1310
- open: () => onOpen(element)
1311
- }))
1338
+ context: context.map((element, index) => {
1339
+ // Check if this is an invalid file
1340
+ let className: string | undefined;
1341
+ let validationMessage: string | undefined;
1342
+ if (element.variable.name === 'file' && element.arg) {
1343
+ // Use the path directly as the key (same as storage)
1344
+ const validationResult = fileValidationState.get(element.arg);
1345
+ if (validationResult) {
1346
+ if (validationResult.state === FileValidationState.INVALID_SECONDARY) {
1347
+ className = 'warning-file';
1348
+ validationMessage = validationResult.message;
1349
+ } else if (validationResult.state === FileValidationState.INVALID_NOT_FOUND) {
1350
+ className = 'invalid-file';
1351
+ validationMessage = validationResult.message;
1352
+ }
1353
+ }
1354
+ }
1355
+ return {
1356
+ variable: element,
1357
+ name: labelProvider.getName(element),
1358
+ iconClass: labelProvider.getIcon(element),
1359
+ nameClass: element.variable.name,
1360
+ className,
1361
+ validationMessage,
1362
+ additionalInfo: labelProvider.getDetails(element),
1363
+ details: labelProvider.getLongName(element),
1364
+ delete: () => onDeleteContextElement(index),
1365
+ open: () => onOpen(element)
1366
+ };
1367
+ })
1312
1368
  };
1313
1369
  }
1314
1370
 
@@ -1318,6 +1374,8 @@ interface ChatContextUI {
1318
1374
  name: string;
1319
1375
  iconClass: string;
1320
1376
  nameClass: string;
1377
+ className?: string;
1378
+ validationMessage?: string;
1321
1379
  additionalInfo?: string;
1322
1380
  details?: string;
1323
1381
  delete: () => void;
@@ -1352,8 +1410,13 @@ const ChatContext: React.FunctionComponent<ChatContextUI> = ({ context }) => (
1352
1410
  </div>
1353
1411
  </li>;
1354
1412
  }
1355
- return <li key={index} className="theia-ChatInput-ChatContext-Element" title={element.details} onClick={() => element.open?.()}>
1413
+ const isWarning = element.className === 'warning-file';
1414
+ const isInvalid = element.className === 'invalid-file';
1415
+ const tooltipTitle = element.validationMessage ?? element.details;
1416
+ return <li key={index} className={`theia-ChatInput-ChatContext-Element ${element.className || ''}`} title={tooltipTitle} onClick={() => element.open?.()}>
1356
1417
  <div className="theia-ChatInput-ChatContext-Row">
1418
+ {isWarning && <span className="codicon codicon-warning warning-file-icon" />}
1419
+ {isInvalid && <span className="codicon codicon-error invalid-file-icon" />}
1357
1420
  <div className={`theia-ChatInput-ChatContext-Icon ${element.iconClass}`} />
1358
1421
  <div className="theia-ChatInput-ChatContext-labelParts">
1359
1422
  <span className={`theia-ChatInput-ChatContext-title ${element.nameClass}`}>
@@ -24,6 +24,7 @@ import {
24
24
  import { ReactNode, useEffect, useRef } from '@theia/core/shared/react';
25
25
  import * as React from '@theia/core/shared/react';
26
26
  import * as markdownit from '@theia/core/shared/markdown-it';
27
+ import * as markdownitemoji from '@theia/core/shared/markdown-it-emoji';
27
28
  import * as DOMPurify from '@theia/core/shared/dompurify';
28
29
  import { MarkdownString } from '@theia/core/lib/common/markdown-rendering';
29
30
  import { OpenerService, open } from '@theia/core/lib/browser';
@@ -32,7 +33,7 @@ import { URI } from '@theia/core';
32
33
  @injectable()
33
34
  export class MarkdownPartRenderer implements ChatResponsePartRenderer<MarkdownChatResponseContent | InformationalChatResponseContent> {
34
35
  @inject(OpenerService) protected readonly openerService: OpenerService;
35
- protected readonly markdownIt = markdownit();
36
+ protected readonly markdownIt = markdownit().use(markdownitemoji.full);
36
37
  canHandle(response: ChatResponseContent): number {
37
38
  if (MarkdownChatResponseContent.is(response)) {
38
39
  return 10;
@@ -92,7 +93,7 @@ export const useMarkdownRendering = (
92
93
  const ref = useRef<HTMLDivElement | null>(null);
93
94
  const markdownString = typeof markdown === 'string' ? markdown : markdown.value;
94
95
  useEffect(() => {
95
- const markdownIt = markdownit();
96
+ const markdownIt = markdownit().use(markdownitemoji.full);
96
97
  const host = document.createElement('div');
97
98
 
98
99
  // markdownIt always puts the content in a paragraph element, so we remove it if we don't want that
@@ -110,7 +111,7 @@ export const useMarkdownRendering = (
110
111
 
111
112
  // intercept link clicks to use the Theia OpenerService instead of the default browser behavior
112
113
  const handleClick = (event: MouseEvent) => {
113
- if ((eventHandler?.handleEvent(event) as unknown) === true) {return; }
114
+ if ((eventHandler?.handleEvent(event) as unknown) === true) { return; }
114
115
  let target = event.target as HTMLElement;
115
116
  while (target && target.tagName !== 'A') {
116
117
  target = target.parentElement as HTMLElement;
@@ -226,6 +226,37 @@ div:last-child > .theia-ChatNode {
226
226
  cursor: pointer;
227
227
  }
228
228
 
229
+ .theia-ChatInput-ChatContext-Element.invalid-file {
230
+ border-color: var(--theia-inputValidation-errorBorder, var(--theia-errorForeground));
231
+ background-color: var(--theia-inputValidation-errorBackground, rgba(255, 0, 0, 0.1));
232
+ }
233
+
234
+ .theia-ChatInput-ChatContext-Element.invalid-file .theia-ChatInput-ChatContext-title {
235
+ text-decoration: line-through;
236
+ color: var(--theia-errorForeground);
237
+ }
238
+
239
+ .invalid-file-icon {
240
+ color: var(--theia-errorForeground);
241
+ margin-right: 4px;
242
+ flex-shrink: 0;
243
+ }
244
+
245
+ .theia-ChatInput-ChatContext-Element.warning-file {
246
+ border-color: var(--theia-inputValidation-warningBorder, var(--theia-editorWarning-foreground));
247
+ background-color: var(--theia-inputValidation-warningBackground, rgba(255, 165, 0, 0.1));
248
+ }
249
+
250
+ .theia-ChatInput-ChatContext-Element.warning-file .theia-ChatInput-ChatContext-title {
251
+ color: var(--theia-editorWarning-foreground);
252
+ }
253
+
254
+ .warning-file-icon {
255
+ color: var(--theia-editorWarning-foreground);
256
+ margin-right: 4px;
257
+ flex-shrink: 0;
258
+ }
259
+
229
260
  .theia-ChatInput-ChatContext-Row {
230
261
  display: flex;
231
262
  align-items: center;
@@ -1,66 +0,0 @@
1
- import { CommandRegistry, MessageService, QuickInputButton, QuickInputService, QuickPickItem } from '@theia/core';
2
- import { ILogger } from '@theia/core/lib/common/logger';
3
- import { Widget } from '@theia/core/lib/browser';
4
- import { ChatAgent, ChatService } from '@theia/ai-chat';
5
- import { ChatAgentService } from '@theia/ai-chat/lib/common/chat-agent-service';
6
- import { EditorManager } from '@theia/editor/lib/browser/editor-manager';
7
- import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
8
- import { TabBarToolbarContribution, TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
9
- import { ChatViewWidget } from './chat-view-widget';
10
- import { SecondaryWindowHandler } from '@theia/core/lib/browser/secondary-window-handler';
11
- import { AIActivationService } from '@theia/ai-core/lib/browser';
12
- import { TaskContextService } from '@theia/ai-chat/lib/browser/task-context-service';
13
- export declare const AI_CHAT_TOGGLE_COMMAND_ID = "aiChat:toggle";
14
- export declare class AIChatContribution extends AbstractViewContribution<ChatViewWidget> implements TabBarToolbarContribution {
15
- protected readonly chatService: ChatService;
16
- protected readonly quickInputService: QuickInputService;
17
- protected readonly taskContextService: TaskContextService;
18
- protected readonly messageService: MessageService;
19
- protected readonly chatAgentService: ChatAgentService;
20
- protected readonly editorManager: EditorManager;
21
- protected readonly activationService: AIActivationService;
22
- protected readonly logger: ILogger;
23
- /**
24
- * Store whether there are persisted sessions to make this information available in
25
- * command enablement checks which are synchronous.
26
- */
27
- protected hasPersistedSessions: boolean;
28
- protected static readonly RENAME_CHAT_BUTTON: QuickInputButton;
29
- protected static readonly REMOVE_CHAT_BUTTON: QuickInputButton;
30
- protected readonly secondaryWindowHandler: SecondaryWindowHandler;
31
- constructor();
32
- initialize(): void;
33
- protected checkPersistedSessions(): Promise<void>;
34
- registerCommands(registry: CommandRegistry): void;
35
- registerToolbarItems(registry: TabBarToolbarRegistry): void;
36
- protected selectChat(sessionId?: string): Promise<void>;
37
- protected askForChatSession(): Promise<QuickPickItem | undefined>;
38
- protected withWidget(widget?: Widget | undefined, predicate?: (output: ChatViewWidget) => boolean): boolean | false;
39
- protected extractChatView(chatView: ChatViewWidget): void;
40
- canExtractChatView(chatView: ChatViewWidget): boolean;
41
- protected summarizeActiveSession(): Promise<string | undefined>;
42
- /**
43
- * Prompts the user to select a chat agent
44
- * @returns The selected agent or undefined if cancelled
45
- */
46
- /**
47
- * Prompts the user to select a chat agent with an optional default (pre-selected) agent.
48
- * @param defaultAgentId The id of the agent to pre-select, if present
49
- * @returns The selected agent or undefined if cancelled
50
- */
51
- protected selectAgent(defaultAgentId?: string): Promise<ChatAgent | undefined>;
52
- /**
53
- * Prompts the user to select a task context with special marking for currently opened files
54
- * @returns The selected task context ID or undefined if cancelled
55
- */
56
- protected selectTaskContextWithMarking(): Promise<string | undefined>;
57
- /**
58
- * Returns information about task context files that are currently opened
59
- * @returns Object with arrays of opened context IDs and the active context ID
60
- */
61
- protected getOpenedTaskContextFiles(): {
62
- openedIds: string[];
63
- activeId?: string;
64
- };
65
- }
66
- //# sourceMappingURL=ai-chat-ui-contribution.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-chat-ui-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/ai-chat-ui-contribution.ts"],"names":[],"mappings":"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"}