@theia/ai-chat-ui 1.59.0-next.72 → 1.60.0-next.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/browser/ai-chat-ui-contribution.d.ts +0 -1
- package/lib/browser/ai-chat-ui-contribution.d.ts.map +1 -1
- package/lib/browser/ai-chat-ui-contribution.js +20 -5
- package/lib/browser/ai-chat-ui-contribution.js.map +1 -1
- package/lib/browser/chat-input-widget.d.ts.map +1 -1
- package/lib/browser/chat-input-widget.js +3 -1
- package/lib/browser/chat-input-widget.js.map +1 -1
- package/lib/browser/chat-response-renderer/code-part-renderer.d.ts.map +1 -1
- package/lib/browser/chat-response-renderer/code-part-renderer.js +3 -2
- package/lib/browser/chat-response-renderer/code-part-renderer.js.map +1 -1
- package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts.map +1 -1
- package/lib/browser/chat-tree-view/chat-view-tree-widget.js +2 -1
- package/lib/browser/chat-tree-view/chat-view-tree-widget.js.map +1 -1
- package/lib/browser/chat-view-contribution.d.ts.map +1 -1
- package/lib/browser/chat-view-contribution.js +17 -2
- package/lib/browser/chat-view-contribution.js.map +1 -1
- package/lib/browser/chat-view-language-contribution.d.ts +14 -4
- package/lib/browser/chat-view-language-contribution.d.ts.map +1 -1
- package/lib/browser/chat-view-language-contribution.js +96 -38
- package/lib/browser/chat-view-language-contribution.js.map +1 -1
- package/package.json +12 -11
- package/src/browser/ai-chat-ui-contribution.ts +20 -6
- package/src/browser/chat-input-widget.tsx +3 -1
- package/src/browser/chat-response-renderer/code-part-renderer.tsx +3 -2
- package/src/browser/chat-tree-view/chat-view-tree-widget.tsx +2 -1
- package/src/browser/chat-view-contribution.ts +18 -2
- package/src/browser/chat-view-language-contribution.ts +134 -77
- package/src/browser/style/index.css +11 -3
|
@@ -34,72 +34,120 @@ const VARIABLE_ADD_CONTEXT_COMMAND = 'add-context-variable';
|
|
|
34
34
|
let ChatViewLanguageContribution = class ChatViewLanguageContribution {
|
|
35
35
|
onStart(_app) {
|
|
36
36
|
monaco.languages.register({ id: exports.CHAT_VIEW_LANGUAGE_ID, extensions: [exports.CHAT_VIEW_LANGUAGE_EXTENSION] });
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
this.registerCompletionProviders();
|
|
38
|
+
monaco.editor.registerCommand(VARIABLE_ARGUMENT_PICKER_COMMAND, this.triggerVariableArgumentPicker.bind(this));
|
|
39
|
+
monaco.editor.registerCommand(VARIABLE_ADD_CONTEXT_COMMAND, (_, ...args) => args.length > 1 ? this.addContextVariable(args[0], args[1]) : undefined);
|
|
40
|
+
}
|
|
41
|
+
registerCompletionProviders() {
|
|
42
|
+
this.registerStandardCompletionProvider({
|
|
43
|
+
triggerCharacter: prompt_text_1.PromptText.AGENT_CHAR,
|
|
44
|
+
getItems: () => this.agentService.getAgents(),
|
|
45
|
+
kind: monaco.languages.CompletionItemKind.Value,
|
|
46
|
+
getId: agent => `${agent.id} `,
|
|
47
|
+
getName: agent => agent.name,
|
|
48
|
+
getDescription: agent => agent.description
|
|
40
49
|
});
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
50
|
+
this.registerStandardCompletionProvider({
|
|
51
|
+
triggerCharacter: prompt_text_1.PromptText.VARIABLE_CHAR,
|
|
52
|
+
getItems: () => this.variableService.getVariables(),
|
|
53
|
+
kind: monaco.languages.CompletionItemKind.Variable,
|
|
54
|
+
getId: variable => { var _a; return ((_a = variable.args) === null || _a === void 0 ? void 0 : _a.some(arg => !arg.isOptional)) ? variable.name + prompt_text_1.PromptText.VARIABLE_SEPARATOR_CHAR : `${variable.name} `; },
|
|
55
|
+
getName: variable => variable.name,
|
|
56
|
+
getDescription: variable => variable.description,
|
|
57
|
+
command: {
|
|
58
|
+
title: core_1.nls.localize('theia/ai/chat-ui/selectVariableArguments', 'Select variable arguments'),
|
|
59
|
+
id: VARIABLE_ARGUMENT_PICKER_COMMAND,
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
this.registerStandardCompletionProvider({
|
|
63
|
+
triggerCharacter: prompt_text_1.PromptText.FUNCTION_CHAR,
|
|
64
|
+
getItems: () => this.toolInvocationRegistry.getAllFunctions(),
|
|
65
|
+
kind: monaco.languages.CompletionItemKind.Function,
|
|
66
|
+
getId: tool => `${tool.id} `,
|
|
67
|
+
getName: tool => tool.name,
|
|
68
|
+
getDescription: tool => { var _a; return (_a = tool.description) !== null && _a !== void 0 ? _a : ''; }
|
|
44
69
|
});
|
|
70
|
+
// Register the variable argument completion provider (special case)
|
|
45
71
|
monaco.languages.registerCompletionItemProvider(exports.CHAT_VIEW_LANGUAGE_ID, {
|
|
46
72
|
triggerCharacters: [prompt_text_1.PromptText.VARIABLE_CHAR, prompt_text_1.PromptText.VARIABLE_SEPARATOR_CHAR],
|
|
47
73
|
provideCompletionItems: (model, position, _context, _token) => this.provideVariableWithArgCompletions(model, position),
|
|
48
74
|
});
|
|
75
|
+
}
|
|
76
|
+
registerStandardCompletionProvider(source) {
|
|
49
77
|
monaco.languages.registerCompletionItemProvider(exports.CHAT_VIEW_LANGUAGE_ID, {
|
|
50
|
-
triggerCharacters: [
|
|
51
|
-
provideCompletionItems: (model, position, _context, _token) => this.
|
|
78
|
+
triggerCharacters: [source.triggerCharacter],
|
|
79
|
+
provideCompletionItems: (model, position, _context, _token) => this.provideCompletions(model, position, source),
|
|
52
80
|
});
|
|
53
|
-
monaco.editor.registerCommand(VARIABLE_ARGUMENT_PICKER_COMMAND, this.triggerVariableArgumentPicker.bind(this));
|
|
54
|
-
monaco.editor.registerCommand(VARIABLE_ADD_CONTEXT_COMMAND, (_, ...args) => args.length > 1 ? this.addContextVariable(args[0], args[1]) : undefined);
|
|
55
81
|
}
|
|
56
82
|
getCompletionRange(model, position, triggerCharacter) {
|
|
57
|
-
|
|
83
|
+
const wordInfo = model.getWordUntilPosition(position);
|
|
58
84
|
const lineContent = model.getLineContent(position.lineNumber);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
85
|
+
// one to the left, and -1 for 0-based index
|
|
86
|
+
const characterBeforeCurrentWord = lineContent[wordInfo.startColumn - 1 - 1];
|
|
87
|
+
if (characterBeforeCurrentWord !== triggerCharacter) {
|
|
62
88
|
return undefined;
|
|
63
89
|
}
|
|
64
|
-
//
|
|
65
|
-
|
|
90
|
+
// we are not at the beginning of the line
|
|
91
|
+
if (wordInfo.startColumn > 2) {
|
|
92
|
+
const charBeforeTrigger = model.getValueInRange({
|
|
93
|
+
startLineNumber: position.lineNumber,
|
|
94
|
+
startColumn: wordInfo.startColumn - 2,
|
|
95
|
+
endLineNumber: position.lineNumber,
|
|
96
|
+
endColumn: wordInfo.startColumn - 1
|
|
97
|
+
});
|
|
98
|
+
// If the character before the trigger is not whitespace, don't provide completions
|
|
99
|
+
if (!/\s/.test(charBeforeTrigger)) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
66
103
|
return new monaco.Range(position.lineNumber, wordInfo.startColumn, position.lineNumber, position.column);
|
|
67
104
|
}
|
|
68
|
-
|
|
69
|
-
const completionRange = this.getCompletionRange(model, position,
|
|
105
|
+
provideCompletions(model, position, source) {
|
|
106
|
+
const completionRange = this.getCompletionRange(model, position, source.triggerCharacter);
|
|
70
107
|
if (completionRange === undefined) {
|
|
71
108
|
return { suggestions: [] };
|
|
72
109
|
}
|
|
110
|
+
const items = source.getItems();
|
|
73
111
|
const suggestions = items.map(item => ({
|
|
74
|
-
insertText: getId(item),
|
|
75
|
-
kind: kind,
|
|
76
|
-
label: getName(item),
|
|
112
|
+
insertText: source.getId(item),
|
|
113
|
+
kind: source.kind,
|
|
114
|
+
label: source.getName(item),
|
|
77
115
|
range: completionRange,
|
|
78
|
-
detail: getDescription(item),
|
|
79
|
-
command
|
|
116
|
+
detail: source.getDescription(item),
|
|
117
|
+
command: source.command
|
|
80
118
|
}));
|
|
81
119
|
return { suggestions };
|
|
82
120
|
}
|
|
83
|
-
provideAgentCompletions(model, position) {
|
|
84
|
-
return this.getSuggestions(model, position, prompt_text_1.PromptText.AGENT_CHAR, this.agentService.getAgents(), monaco.languages.CompletionItemKind.Value, agent => agent.id, agent => agent.name, agent => agent.description);
|
|
85
|
-
}
|
|
86
|
-
provideVariableCompletions(model, position) {
|
|
87
|
-
return this.getSuggestions(model, position, prompt_text_1.PromptText.VARIABLE_CHAR, this.variableService.getVariables(), monaco.languages.CompletionItemKind.Variable, variable => variable.name, variable => variable.name, variable => variable.description, {
|
|
88
|
-
title: core_1.nls.localize('theia/ai/chat-ui/selectVariableArguments', 'Select variable arguments'),
|
|
89
|
-
id: VARIABLE_ARGUMENT_PICKER_COMMAND,
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
121
|
async provideVariableWithArgCompletions(model, position) {
|
|
122
|
+
// Get the text of the current line up to the cursor position
|
|
123
|
+
const textUntilPosition = model.getValueInRange({
|
|
124
|
+
startLineNumber: position.lineNumber,
|
|
125
|
+
startColumn: 1,
|
|
126
|
+
endLineNumber: position.lineNumber,
|
|
127
|
+
endColumn: position.column,
|
|
128
|
+
});
|
|
129
|
+
// Regex that captures the variable name in contexts like "#varname" or "#var-name:args"
|
|
130
|
+
// Matches only when # is at the beginning of the string or after whitespace
|
|
131
|
+
const variableRegex = /(?:^|\s)#([\w-]*)/;
|
|
132
|
+
const match = textUntilPosition.match(variableRegex);
|
|
133
|
+
if (!match) {
|
|
134
|
+
return { suggestions: [] };
|
|
135
|
+
}
|
|
136
|
+
const currentVariableName = match[1];
|
|
137
|
+
const hasColonSeparator = textUntilPosition.includes(`${currentVariableName}:`);
|
|
93
138
|
const variables = this.variableService.getVariables();
|
|
94
139
|
const suggestions = [];
|
|
95
140
|
for (const variable of variables) {
|
|
141
|
+
// If we have a variable:arg pattern, only process the matching variable
|
|
142
|
+
if (hasColonSeparator && variable.name !== currentVariableName) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
96
145
|
const provider = await this.variableService.getArgumentCompletionProvider(variable.name);
|
|
97
146
|
if (provider) {
|
|
98
147
|
const items = await provider(model, position);
|
|
99
148
|
if (items) {
|
|
100
149
|
suggestions.push(...items.map(item => ({
|
|
101
150
|
...item,
|
|
102
|
-
// trigger command to check if we should add a context variable
|
|
103
151
|
command: {
|
|
104
152
|
title: core_1.nls.localize('theia/ai/chat-ui/addContextVariable', 'Add context variable'),
|
|
105
153
|
id: VARIABLE_ADD_CONTEXT_COMMAND,
|
|
@@ -111,9 +159,6 @@ let ChatViewLanguageContribution = class ChatViewLanguageContribution {
|
|
|
111
159
|
}
|
|
112
160
|
return { suggestions };
|
|
113
161
|
}
|
|
114
|
-
provideToolCompletions(model, position) {
|
|
115
|
-
return this.getSuggestions(model, position, prompt_text_1.PromptText.FUNCTION_CHAR, this.toolInvocationRegistry.getAllFunctions(), monaco.languages.CompletionItemKind.Function, tool => tool.id, tool => tool.name, tool => { var _a; return (_a = tool.description) !== null && _a !== void 0 ? _a : ''; });
|
|
116
|
-
}
|
|
117
162
|
async triggerVariableArgumentPicker() {
|
|
118
163
|
var _a;
|
|
119
164
|
const inputEditor = monaco.editor.getEditors().find(editor => editor.hasTextFocus());
|
|
@@ -125,7 +170,17 @@ let ChatViewLanguageContribution = class ChatViewLanguageContribution {
|
|
|
125
170
|
if (!model || !position) {
|
|
126
171
|
return;
|
|
127
172
|
}
|
|
128
|
-
|
|
173
|
+
// // Get the word at cursor
|
|
174
|
+
const wordInfo = model.getWordUntilPosition(position);
|
|
175
|
+
// account for the variable separator character if present
|
|
176
|
+
let endOfWordPosition = position.column;
|
|
177
|
+
if (wordInfo.word === '' && this.getCharacterBeforePosition(model, position) === prompt_text_1.PromptText.VARIABLE_SEPARATOR_CHAR) {
|
|
178
|
+
endOfWordPosition = position.column - 1;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const variableName = (_a = model.getWordAtPosition({ ...position, column: endOfWordPosition })) === null || _a === void 0 ? void 0 : _a.word;
|
|
129
184
|
if (!variableName) {
|
|
130
185
|
return;
|
|
131
186
|
}
|
|
@@ -139,10 +194,13 @@ let ChatViewLanguageContribution = class ChatViewLanguageContribution {
|
|
|
139
194
|
}
|
|
140
195
|
inputEditor.executeEdits('variable-argument-picker', [{
|
|
141
196
|
range: new monaco.Range(position.lineNumber, position.column, position.lineNumber, position.column),
|
|
142
|
-
text:
|
|
197
|
+
text: arg
|
|
143
198
|
}]);
|
|
144
199
|
await this.addContextVariable(variableName, arg);
|
|
145
200
|
}
|
|
201
|
+
getCharacterBeforePosition(model, position) {
|
|
202
|
+
return model.getLineContent(position.lineNumber)[position.column - 1 - 1];
|
|
203
|
+
}
|
|
146
204
|
async addContextVariable(variableName, arg) {
|
|
147
205
|
const variable = this.variableService.getVariable(variableName);
|
|
148
206
|
if (!variable || !common_1.AIContextVariable.is(variable)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-view-language-contribution.js","sourceRoot":"","sources":["../../src/browser/chat-view-language-contribution.ts"],"names":[],"mappings":";;;;AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,4CAAkD;AAClD,sDAAiF;AACjF,uEAAmE;AACnE,iGAA4F;AAC5F,sCAAgD;AAChD,qDAAiH;AACjH,4DAAkE;AAClE,oDAAoD;AAEpD,yDAAoD;AAEvC,QAAA,qBAAqB,GAAG,6BAA6B,CAAC;AACtD,QAAA,4BAA4B,GAAG,oBAAoB,CAAC;AAEjE,MAAM,2BAA2B,GAAG,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAC3E,MAAM,gCAAgC,GAAG,kCAAkC,CAAC;AAC5E,MAAM,4BAA4B,GAAG,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-view-language-contribution.js","sourceRoot":"","sources":["../../src/browser/chat-view-language-contribution.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-chat-ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.60.0-next.43+2a13720d2",
|
|
4
4
|
"description": "Theia - AI Chat UI Extension",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/ai-chat": "1.
|
|
7
|
-
"@theia/ai-core": "1.
|
|
8
|
-
"@theia/
|
|
9
|
-
"@theia/
|
|
10
|
-
"@theia/editor
|
|
11
|
-
"@theia/
|
|
12
|
-
"@theia/
|
|
6
|
+
"@theia/ai-chat": "1.60.0-next.43+2a13720d2",
|
|
7
|
+
"@theia/ai-core": "1.60.0-next.43+2a13720d2",
|
|
8
|
+
"@theia/ai-history": "1.60.0-next.43+2a13720d2",
|
|
9
|
+
"@theia/core": "1.60.0-next.43+2a13720d2",
|
|
10
|
+
"@theia/editor": "1.60.0-next.43+2a13720d2",
|
|
11
|
+
"@theia/editor-preview": "1.60.0-next.43+2a13720d2",
|
|
12
|
+
"@theia/filesystem": "1.60.0-next.43+2a13720d2",
|
|
13
|
+
"@theia/monaco": "1.60.0-next.43+2a13720d2",
|
|
13
14
|
"@theia/monaco-editor-core": "1.96.302",
|
|
14
|
-
"@theia/workspace": "1.
|
|
15
|
+
"@theia/workspace": "1.60.0-next.43+2a13720d2",
|
|
15
16
|
"minimatch": "^5.1.0",
|
|
16
17
|
"tslib": "^2.6.2",
|
|
17
18
|
"uuid": "^9.0.1"
|
|
@@ -50,10 +51,10 @@
|
|
|
50
51
|
"watch": "theiaext watch"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
|
-
"@theia/ext-scripts": "1.
|
|
54
|
+
"@theia/ext-scripts": "1.59.0"
|
|
54
55
|
},
|
|
55
56
|
"nyc": {
|
|
56
57
|
"extends": "../../configs/nyc.json"
|
|
57
58
|
},
|
|
58
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "2a13720d2d41d8ae6ee4e34cd2dee1c656a18018"
|
|
59
60
|
}
|
|
@@ -24,6 +24,8 @@ import { TabBarToolbarContribution, TabBarToolbarRegistry } from '@theia/core/li
|
|
|
24
24
|
import { ChatViewWidget } from './chat-view-widget';
|
|
25
25
|
import { Deferred } from '@theia/core/lib/common/promise-util';
|
|
26
26
|
import { SecondaryWindowHandler } from '@theia/core/lib/browser/secondary-window-handler';
|
|
27
|
+
import { AI_SHOW_SETTINGS_COMMAND } from '@theia/ai-core/lib/browser';
|
|
28
|
+
import { OPEN_AI_HISTORY_VIEW } from '@theia/ai-history/lib/browser/ai-history-contribution';
|
|
27
29
|
|
|
28
30
|
export const AI_CHAT_TOGGLE_COMMAND_ID = 'aiChat:toggle';
|
|
29
31
|
|
|
@@ -91,18 +93,30 @@ export class AIChatContribution extends AbstractViewContribution<ChatViewWidget>
|
|
|
91
93
|
id: AI_CHAT_NEW_CHAT_WINDOW_COMMAND.id,
|
|
92
94
|
command: AI_CHAT_NEW_CHAT_WINDOW_COMMAND.id,
|
|
93
95
|
tooltip: nls.localizeByDefault('New Chat'),
|
|
94
|
-
isVisible: widget => this.
|
|
96
|
+
isVisible: widget => this.withWidget(widget)
|
|
95
97
|
});
|
|
96
98
|
registry.registerItem({
|
|
97
99
|
id: AI_CHAT_SHOW_CHATS_COMMAND.id,
|
|
98
100
|
command: AI_CHAT_SHOW_CHATS_COMMAND.id,
|
|
99
101
|
tooltip: nls.localizeByDefault('Show Chats...'),
|
|
100
|
-
isVisible: widget => this.
|
|
102
|
+
isVisible: widget => this.withWidget(widget),
|
|
103
|
+
});
|
|
104
|
+
registry.registerItem({
|
|
105
|
+
id: 'chat-view.' + AI_SHOW_SETTINGS_COMMAND.id,
|
|
106
|
+
command: AI_SHOW_SETTINGS_COMMAND.id,
|
|
107
|
+
group: 'ai-settings',
|
|
108
|
+
priority: 3,
|
|
109
|
+
tooltip: nls.localize('theia/ai-chat-ui/open-settings-tooltip', 'Open AI settings...'),
|
|
110
|
+
isVisible: widget => this.withWidget(widget),
|
|
111
|
+
});
|
|
112
|
+
registry.registerItem({
|
|
113
|
+
id: 'chat-view.' + OPEN_AI_HISTORY_VIEW.id,
|
|
114
|
+
command: OPEN_AI_HISTORY_VIEW.id,
|
|
115
|
+
tooltip: nls.localize('theia/ai-chat-ui/open-history-tooltip', 'Open AI history...'),
|
|
116
|
+
group: 'ai-settings',
|
|
117
|
+
priority: 1,
|
|
118
|
+
isVisible: widget => this.withWidget(widget),
|
|
101
119
|
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
protected isChatViewWidget(widget?: Widget): boolean {
|
|
105
|
-
return !!widget && ChatViewWidget.ID === widget.id;
|
|
106
120
|
}
|
|
107
121
|
|
|
108
122
|
protected async selectChat(sessionId?: string): Promise<void> {
|
|
@@ -216,6 +216,8 @@ export class AIChatInputWidget extends ReactWidget {
|
|
|
216
216
|
this.contextMenuRenderer.render({
|
|
217
217
|
menuPath: AIChatInputWidget.CONTEXT_MENU,
|
|
218
218
|
anchor: { x: event.posx, y: event.posy },
|
|
219
|
+
context: event.target,
|
|
220
|
+
args: [this.editorRef]
|
|
219
221
|
});
|
|
220
222
|
event.preventDefault();
|
|
221
223
|
}
|
|
@@ -462,7 +464,7 @@ const ChatInput: React.FunctionComponent<ChatInputProperties> = (props: ChatInpu
|
|
|
462
464
|
endLineNumber: 1,
|
|
463
465
|
endColumn: 1
|
|
464
466
|
},
|
|
465
|
-
text: '@
|
|
467
|
+
text: '@',
|
|
466
468
|
}]);
|
|
467
469
|
editorRef.current.getControl().setPosition({ lineNumber: 1, column: 2 });
|
|
468
470
|
editorRef.current.getControl().getAction('editor.action.triggerSuggest')?.run();
|
|
@@ -137,7 +137,8 @@ export class CodePartRenderer
|
|
|
137
137
|
this.contextMenuRenderer.render({
|
|
138
138
|
menuPath: ChatViewTreeWidget.CONTEXT_MENU,
|
|
139
139
|
anchor: { x: event.posx, y: event.posy },
|
|
140
|
-
args: [node, { code }]
|
|
140
|
+
args: [node, { code }],
|
|
141
|
+
context: event.target
|
|
141
142
|
});
|
|
142
143
|
event.preventDefault();
|
|
143
144
|
}
|
|
@@ -190,7 +191,7 @@ const InsertCodeAtCursorButton = (props: { code: string, editorManager: EditorMa
|
|
|
190
191
|
}]);
|
|
191
192
|
}
|
|
192
193
|
}, [code, editorManager]);
|
|
193
|
-
return <div className='button codicon codicon-insert' title={nls.localizeByDefault('Insert
|
|
194
|
+
return <div className='button codicon codicon-insert' title={nls.localizeByDefault('Insert At Cursor')} role='button' onClick={insertCode}></div>;
|
|
194
195
|
};
|
|
195
196
|
|
|
196
197
|
/**
|
|
@@ -439,7 +439,8 @@ export class ChatViewTreeWidget extends TreeWidget {
|
|
|
439
439
|
this.contextMenuRenderer.render({
|
|
440
440
|
menuPath: ChatViewTreeWidget.CONTEXT_MENU,
|
|
441
441
|
anchor: { x: event.clientX, y: event.clientY },
|
|
442
|
-
args: [node]
|
|
442
|
+
args: [node],
|
|
443
|
+
context: event.currentTarget
|
|
443
444
|
});
|
|
444
445
|
event.preventDefault();
|
|
445
446
|
}
|
|
@@ -19,6 +19,7 @@ import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
|
|
19
19
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
20
20
|
import { ChatViewTreeWidget, isRequestNode, isResponseNode, RequestNode, ResponseNode } from './chat-tree-view/chat-view-tree-widget';
|
|
21
21
|
import { AIChatInputWidget } from './chat-input-widget';
|
|
22
|
+
import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor';
|
|
22
23
|
|
|
23
24
|
export namespace ChatViewCommands {
|
|
24
25
|
export const COPY_MESSAGE = Command.toDefaultLocalizedCommand({
|
|
@@ -29,10 +30,10 @@ export namespace ChatViewCommands {
|
|
|
29
30
|
id: 'chat.copy.all',
|
|
30
31
|
label: 'Copy All'
|
|
31
32
|
});
|
|
32
|
-
export const COPY_CODE = Command.
|
|
33
|
+
export const COPY_CODE = Command.toLocalizedCommand({
|
|
33
34
|
id: 'chat.copy.code',
|
|
34
35
|
label: 'Copy Code Block'
|
|
35
|
-
});
|
|
36
|
+
}, 'theia/ai/chat-ui/copyCodeBlock');
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
@injectable()
|
|
@@ -55,6 +56,17 @@ export class ChatViewMenuContribution implements MenuContribution, CommandContri
|
|
|
55
56
|
},
|
|
56
57
|
isEnabled: (...args: unknown[]) => containsRequestOrResponseNode(args)
|
|
57
58
|
});
|
|
59
|
+
commands.registerHandler(CommonCommands.PASTE.id, {
|
|
60
|
+
execute: async (...args) => {
|
|
61
|
+
if (hasEditorAsFirstArg(args)) {
|
|
62
|
+
const editor = args[0];
|
|
63
|
+
const range = editor.selection;
|
|
64
|
+
const newText = await this.clipboardService.readText();
|
|
65
|
+
editor.executeEdits([{ range, newText }]);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
isEnabled: (...args) => hasEditorAsFirstArg(args)
|
|
69
|
+
});
|
|
58
70
|
commands.registerCommand(ChatViewCommands.COPY_MESSAGE, {
|
|
59
71
|
execute: (...args: unknown[]) => {
|
|
60
72
|
if (containsRequestOrResponseNode(args)) {
|
|
@@ -133,6 +145,10 @@ export class ChatViewMenuContribution implements MenuContribution, CommandContri
|
|
|
133
145
|
|
|
134
146
|
}
|
|
135
147
|
|
|
148
|
+
function hasEditorAsFirstArg(args: unknown[]): args is [MonacoEditor, ...unknown[]] {
|
|
149
|
+
return args.length > 0 && args[0] instanceof MonacoEditor;
|
|
150
|
+
}
|
|
151
|
+
|
|
136
152
|
function extractRequestOrResponseNodes(args: unknown[]): (RequestNode | ResponseNode)[] {
|
|
137
153
|
return args.filter(arg => isRequestOrResponseNode(arg)) as (RequestNode | ResponseNode)[];
|
|
138
154
|
}
|