@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.
- package/README.md +1 -0
- package/package.json +10 -10
- package/src/browser/chat-input-widget.tsx +77 -14
- package/src/browser/chat-response-renderer/markdown-part-renderer.tsx +4 -3
- package/src/browser/style/index.css +31 -0
- package/lib/browser/ai-chat-ui-contribution.d.ts +0 -66
- package/lib/browser/ai-chat-ui-contribution.d.ts.map +0 -1
- package/lib/browser/ai-chat-ui-contribution.js +0 -587
- package/lib/browser/ai-chat-ui-contribution.js.map +0 -1
- package/lib/browser/ai-chat-ui-frontend-module.d.ts +0 -5
- package/lib/browser/ai-chat-ui-frontend-module.d.ts.map +0 -1
- package/lib/browser/ai-chat-ui-frontend-module.js +0 -153
- package/lib/browser/ai-chat-ui-frontend-module.js.map +0 -1
- package/lib/browser/change-set-actions/change-set-accept-action.d.ts +0 -10
- package/lib/browser/change-set-actions/change-set-accept-action.d.ts.map +0 -1
- package/lib/browser/change-set-actions/change-set-accept-action.js +0 -47
- package/lib/browser/change-set-actions/change-set-accept-action.js.map +0 -1
- package/lib/browser/change-set-actions/change-set-action-service.d.ts +0 -31
- package/lib/browser/change-set-actions/change-set-action-service.d.ts.map +0 -1
- package/lib/browser/change-set-actions/change-set-action-service.js +0 -57
- package/lib/browser/change-set-actions/change-set-action-service.js.map +0 -1
- package/lib/browser/chat-input-agent-suggestions.d.ts +0 -11
- package/lib/browser/chat-input-agent-suggestions.d.ts.map +0 -1
- package/lib/browser/chat-input-agent-suggestions.js +0 -76
- package/lib/browser/chat-input-agent-suggestions.js.map +0 -1
- package/lib/browser/chat-input-history-contribution.d.ts +0 -17
- package/lib/browser/chat-input-history-contribution.d.ts.map +0 -1
- package/lib/browser/chat-input-history-contribution.js +0 -158
- package/lib/browser/chat-input-history-contribution.js.map +0 -1
- package/lib/browser/chat-input-history.d.ts +0 -32
- package/lib/browser/chat-input-history.d.ts.map +0 -1
- package/lib/browser/chat-input-history.js +0 -125
- package/lib/browser/chat-input-history.js.map +0 -1
- package/lib/browser/chat-input-mode-contribution.d.ts +0 -12
- package/lib/browser/chat-input-mode-contribution.d.ts.map +0 -1
- package/lib/browser/chat-input-mode-contribution.js +0 -77
- package/lib/browser/chat-input-mode-contribution.js.map +0 -1
- package/lib/browser/chat-input-widget.d.ts +0 -115
- package/lib/browser/chat-input-widget.d.ts.map +0 -1
- package/lib/browser/chat-input-widget.js +0 -973
- package/lib/browser/chat-input-widget.js.map +0 -1
- package/lib/browser/chat-node-toolbar-action-contribution.d.ts +0 -56
- package/lib/browser/chat-node-toolbar-action-contribution.d.ts.map +0 -1
- package/lib/browser/chat-node-toolbar-action-contribution.js +0 -92
- package/lib/browser/chat-node-toolbar-action-contribution.js.map +0 -1
- package/lib/browser/chat-progress-message.d.ts +0 -7
- package/lib/browser/chat-progress-message.d.ts.map +0 -1
- package/lib/browser/chat-progress-message.js +0 -33
- package/lib/browser/chat-progress-message.js.map +0 -1
- package/lib/browser/chat-response-part-renderer.d.ts +0 -10
- package/lib/browser/chat-response-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-part-renderer.js +0 -20
- package/lib/browser/chat-response-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/ai-selection-resolver.d.ts +0 -23
- package/lib/browser/chat-response-renderer/ai-selection-resolver.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/ai-selection-resolver.js +0 -148
- package/lib/browser/chat-response-renderer/ai-selection-resolver.js.map +0 -1
- package/lib/browser/chat-response-renderer/code-part-renderer.d.ts +0 -73
- package/lib/browser/chat-response-renderer/code-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/code-part-renderer.js +0 -227
- package/lib/browser/chat-response-renderer/code-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/command-part-renderer.d.ts +0 -12
- package/lib/browser/chat-response-renderer/command-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/command-part-renderer.js +0 -67
- package/lib/browser/chat-response-renderer/command-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/delegation-response-renderer.d.ts +0 -14
- package/lib/browser/chat-response-renderer/delegation-response-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/delegation-response-renderer.js +0 -144
- package/lib/browser/chat-response-renderer/delegation-response-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/error-part-renderer.d.ts +0 -9
- package/lib/browser/chat-response-renderer/error-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/error-part-renderer.js +0 -40
- package/lib/browser/chat-response-renderer/error-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.d.ts +0 -12
- package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.js +0 -54
- package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/index.d.ts +0 -13
- package/lib/browser/chat-response-renderer/index.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/index.js +0 -31
- package/lib/browser/chat-response-renderer/index.js.map +0 -1
- package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts +0 -36
- package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/markdown-part-renderer.js +0 -128
- package/lib/browser/chat-response-renderer/markdown-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/progress-part-renderer.d.ts +0 -9
- package/lib/browser/chat-response-renderer/progress-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/progress-part-renderer.js +0 -39
- package/lib/browser/chat-response-renderer/progress-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/question-part-renderer.d.ts +0 -10
- package/lib/browser/chat-response-renderer/question-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/question-part-renderer.js +0 -49
- package/lib/browser/chat-response-renderer/question-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/text-part-renderer.d.ts +0 -9
- package/lib/browser/chat-response-renderer/text-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/text-part-renderer.js +0 -43
- package/lib/browser/chat-response-renderer/text-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/text-part-renderer.spec.d.ts +0 -2
- package/lib/browser/chat-response-renderer/text-part-renderer.spec.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/text-part-renderer.spec.js +0 -46
- package/lib/browser/chat-response-renderer/text-part-renderer.spec.js.map +0 -1
- package/lib/browser/chat-response-renderer/thinking-part-renderer.d.ts +0 -9
- package/lib/browser/chat-response-renderer/thinking-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/thinking-part-renderer.js +0 -42
- package/lib/browser/chat-response-renderer/thinking-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/tool-confirmation.d.ts +0 -17
- package/lib/browser/chat-response-renderer/tool-confirmation.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/tool-confirmation.js +0 -122
- package/lib/browser/chat-response-renderer/tool-confirmation.js.map +0 -1
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts +0 -20
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.js +0 -223
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.js.map +0 -1
- package/lib/browser/chat-response-renderer/unknown-part-renderer.d.ts +0 -9
- package/lib/browser/chat-response-renderer/unknown-part-renderer.d.ts.map +0 -1
- package/lib/browser/chat-response-renderer/unknown-part-renderer.js +0 -42
- package/lib/browser/chat-response-renderer/unknown-part-renderer.js.map +0 -1
- package/lib/browser/chat-tree-view/chat-view-tree-container.d.ts +0 -4
- package/lib/browser/chat-tree-view/chat-view-tree-container.d.ts.map +0 -1
- package/lib/browser/chat-tree-view/chat-view-tree-container.js +0 -33
- package/lib/browser/chat-tree-view/chat-view-tree-container.js.map +0 -1
- package/lib/browser/chat-tree-view/chat-view-tree-input-widget.d.ts +0 -38
- package/lib/browser/chat-tree-view/chat-view-tree-input-widget.d.ts.map +0 -1
- package/lib/browser/chat-tree-view/chat-view-tree-input-widget.js +0 -88
- package/lib/browser/chat-tree-view/chat-view-tree-input-widget.js.map +0 -1
- package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts +0 -120
- package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts.map +0 -1
- package/lib/browser/chat-tree-view/chat-view-tree-widget.js +0 -654
- package/lib/browser/chat-tree-view/chat-view-tree-widget.js.map +0 -1
- package/lib/browser/chat-tree-view/index.d.ts +0 -3
- package/lib/browser/chat-tree-view/index.d.ts.map +0 -1
- package/lib/browser/chat-tree-view/index.js +0 -21
- package/lib/browser/chat-tree-view/index.js.map +0 -1
- package/lib/browser/chat-tree-view/sub-chat-widget.d.ts +0 -22
- package/lib/browser/chat-tree-view/sub-chat-widget.d.ts.map +0 -1
- package/lib/browser/chat-tree-view/sub-chat-widget.js +0 -92
- package/lib/browser/chat-tree-view/sub-chat-widget.js.map +0 -1
- package/lib/browser/chat-view-commands.d.ts +0 -15
- package/lib/browser/chat-view-commands.d.ts.map +0 -1
- package/lib/browser/chat-view-commands.js +0 -76
- package/lib/browser/chat-view-commands.js.map +0 -1
- package/lib/browser/chat-view-contribution.d.ts +0 -21
- package/lib/browser/chat-view-contribution.d.ts.map +0 -1
- package/lib/browser/chat-view-contribution.js +0 -183
- package/lib/browser/chat-view-contribution.js.map +0 -1
- package/lib/browser/chat-view-language-contribution.d.ts +0 -41
- package/lib/browser/chat-view-language-contribution.d.ts.map +0 -1
- package/lib/browser/chat-view-language-contribution.js +0 -269
- package/lib/browser/chat-view-language-contribution.js.map +0 -1
- package/lib/browser/chat-view-widget-toolbar-contribution.d.ts +0 -20
- package/lib/browser/chat-view-widget-toolbar-contribution.d.ts.map +0 -1
- package/lib/browser/chat-view-widget-toolbar-contribution.js +0 -115
- package/lib/browser/chat-view-widget-toolbar-contribution.js.map +0 -1
- package/lib/browser/chat-view-widget.d.ts +0 -60
- package/lib/browser/chat-view-widget.d.ts.map +0 -1
- package/lib/browser/chat-view-widget.js +0 -243
- package/lib/browser/chat-view-widget.js.map +0 -1
- package/lib/browser/context-variable-picker.d.ts +0 -9
- package/lib/browser/context-variable-picker.d.ts.map +0 -1
- package/lib/browser/context-variable-picker.js +0 -86
- package/lib/browser/context-variable-picker.js.map +0 -1
- package/lib/browser/session-settings-dialog.d.ts +0 -35
- package/lib/browser/session-settings-dialog.d.ts.map +0 -1
- package/lib/browser/session-settings-dialog.js +0 -118
- 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
|
+
"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.
|
|
7
|
-
"@theia/ai-core": "1.67.0-next.
|
|
8
|
-
"@theia/core": "1.67.0-next.
|
|
9
|
-
"@theia/editor": "1.67.0-next.
|
|
10
|
-
"@theia/editor-preview": "1.67.0-next.
|
|
11
|
-
"@theia/filesystem": "1.67.0-next.
|
|
12
|
-
"@theia/monaco": "1.67.0-next.
|
|
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.
|
|
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": "
|
|
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'
|
|
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
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
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
|
-
|
|
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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"}
|