@theia/ai-chat-ui 1.46.0-next.241
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 +33 -0
- package/lib/browser/ai-chat-ui-contribution.d.ts +24 -0
- package/lib/browser/ai-chat-ui-contribution.d.ts.map +1 -0
- package/lib/browser/ai-chat-ui-contribution.js +161 -0
- package/lib/browser/ai-chat-ui-contribution.js.map +1 -0
- package/lib/browser/ai-chat-ui-frontend-module.d.ts +5 -0
- package/lib/browser/ai-chat-ui-frontend-module.d.ts.map +1 -0
- package/lib/browser/ai-chat-ui-frontend-module.js +87 -0
- package/lib/browser/ai-chat-ui-frontend-module.js.map +1 -0
- package/lib/browser/chat-input-widget.d.ts +32 -0
- package/lib/browser/chat-input-widget.d.ts.map +1 -0
- package/lib/browser/chat-input-widget.js +217 -0
- package/lib/browser/chat-input-widget.js.map +1 -0
- package/lib/browser/chat-node-toolbar-action-contribution.d.ts +47 -0
- package/lib/browser/chat-node-toolbar-action-contribution.d.ts.map +1 -0
- package/lib/browser/chat-node-toolbar-action-contribution.js +25 -0
- package/lib/browser/chat-node-toolbar-action-contribution.js.map +1 -0
- package/lib/browser/chat-response-part-renderer.d.ts +10 -0
- package/lib/browser/chat-response-part-renderer.d.ts.map +1 -0
- package/lib/browser/chat-response-part-renderer.js +20 -0
- package/lib/browser/chat-response-part-renderer.js.map +1 -0
- package/lib/browser/chat-response-renderer/ai-editor-manager.d.ts +36 -0
- package/lib/browser/chat-response-renderer/ai-editor-manager.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/ai-editor-manager.js +184 -0
- package/lib/browser/chat-response-renderer/ai-editor-manager.js.map +1 -0
- package/lib/browser/chat-response-renderer/code-part-renderer.d.ts +45 -0
- package/lib/browser/chat-response-renderer/code-part-renderer.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/code-part-renderer.js +190 -0
- package/lib/browser/chat-response-renderer/code-part-renderer.js.map +1 -0
- package/lib/browser/chat-response-renderer/command-part-renderer.d.ts +12 -0
- package/lib/browser/chat-response-renderer/command-part-renderer.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/command-part-renderer.js +70 -0
- package/lib/browser/chat-response-renderer/command-part-renderer.js.map +1 -0
- package/lib/browser/chat-response-renderer/error-part-renderer.d.ts +9 -0
- package/lib/browser/chat-response-renderer/error-part-renderer.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/error-part-renderer.js +40 -0
- package/lib/browser/chat-response-renderer/error-part-renderer.js.map +1 -0
- package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.d.ts +12 -0
- package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.js +54 -0
- package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.js.map +1 -0
- package/lib/browser/chat-response-renderer/index.d.ts +9 -0
- package/lib/browser/chat-response-renderer/index.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/index.js +27 -0
- package/lib/browser/chat-response-renderer/index.js.map +1 -0
- package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts +25 -0
- package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/markdown-part-renderer.js +89 -0
- package/lib/browser/chat-response-renderer/markdown-part-renderer.js.map +1 -0
- package/lib/browser/chat-response-renderer/question-part-renderer.d.ts +10 -0
- package/lib/browser/chat-response-renderer/question-part-renderer.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/question-part-renderer.js +43 -0
- package/lib/browser/chat-response-renderer/question-part-renderer.js.map +1 -0
- package/lib/browser/chat-response-renderer/text-part-renderer.d.ts +9 -0
- package/lib/browser/chat-response-renderer/text-part-renderer.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/text-part-renderer.js +41 -0
- package/lib/browser/chat-response-renderer/text-part-renderer.js.map +1 -0
- package/lib/browser/chat-response-renderer/text-part-renderer.spec.d.ts +2 -0
- package/lib/browser/chat-response-renderer/text-part-renderer.spec.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/text-part-renderer.spec.js +46 -0
- package/lib/browser/chat-response-renderer/text-part-renderer.spec.js.map +1 -0
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts +12 -0
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.js +81 -0
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.js.map +1 -0
- package/lib/browser/chat-tree-view/chat-view-tree-container.d.ts +4 -0
- package/lib/browser/chat-tree-view/chat-view-tree-container.d.ts.map +1 -0
- package/lib/browser/chat-tree-view/chat-view-tree-container.js +33 -0
- package/lib/browser/chat-tree-view/chat-view-tree-container.js.map +1 -0
- package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts +56 -0
- package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts.map +1 -0
- package/lib/browser/chat-tree-view/chat-view-tree-widget.js +388 -0
- package/lib/browser/chat-tree-view/chat-view-tree-widget.js.map +1 -0
- package/lib/browser/chat-tree-view/index.d.ts +3 -0
- package/lib/browser/chat-tree-view/index.d.ts.map +1 -0
- package/lib/browser/chat-tree-view/index.js +21 -0
- package/lib/browser/chat-tree-view/index.js.map +1 -0
- package/lib/browser/chat-view-commands.d.ts +8 -0
- package/lib/browser/chat-view-commands.d.ts.map +1 -0
- package/lib/browser/chat-view-commands.js +44 -0
- package/lib/browser/chat-view-commands.js.map +1 -0
- package/lib/browser/chat-view-contribution.d.ts +18 -0
- package/lib/browser/chat-view-contribution.d.ts.map +1 -0
- package/lib/browser/chat-view-contribution.js +153 -0
- package/lib/browser/chat-view-contribution.js.map +1 -0
- package/lib/browser/chat-view-language-contribution.d.ts +20 -0
- package/lib/browser/chat-view-language-contribution.d.ts.map +1 -0
- package/lib/browser/chat-view-language-contribution.js +98 -0
- package/lib/browser/chat-view-language-contribution.js.map +1 -0
- package/lib/browser/chat-view-widget-toolbar-contribution.d.ts +11 -0
- package/lib/browser/chat-view-widget-toolbar-contribution.d.ts.map +1 -0
- package/lib/browser/chat-view-widget-toolbar-contribution.js +65 -0
- package/lib/browser/chat-view-widget-toolbar-contribution.js.map +1 -0
- package/lib/browser/chat-view-widget.d.ts +41 -0
- package/lib/browser/chat-view-widget.d.ts.map +1 -0
- package/lib/browser/chat-view-widget.js +182 -0
- package/lib/browser/chat-view-widget.js.map +1 -0
- package/package.json +59 -0
- package/src/browser/ai-chat-ui-contribution.ts +171 -0
- package/src/browser/ai-chat-ui-frontend-module.ts +105 -0
- package/src/browser/chat-input-widget.tsx +262 -0
- package/src/browser/chat-node-toolbar-action-contribution.ts +63 -0
- package/src/browser/chat-response-part-renderer.ts +25 -0
- package/src/browser/chat-response-renderer/ai-editor-manager.ts +183 -0
- package/src/browser/chat-response-renderer/code-part-renderer.tsx +211 -0
- package/src/browser/chat-response-renderer/command-part-renderer.tsx +60 -0
- package/src/browser/chat-response-renderer/error-part-renderer.tsx +35 -0
- package/src/browser/chat-response-renderer/horizontal-layout-part-renderer.tsx +59 -0
- package/src/browser/chat-response-renderer/index.ts +23 -0
- package/src/browser/chat-response-renderer/markdown-part-renderer.tsx +92 -0
- package/src/browser/chat-response-renderer/question-part-renderer.tsx +59 -0
- package/src/browser/chat-response-renderer/text-part-renderer.spec.ts +50 -0
- package/src/browser/chat-response-renderer/text-part-renderer.tsx +35 -0
- package/src/browser/chat-response-renderer/toolcall-part-renderer.tsx +89 -0
- package/src/browser/chat-tree-view/chat-view-tree-container.ts +32 -0
- package/src/browser/chat-tree-view/chat-view-tree-widget.tsx +526 -0
- package/src/browser/chat-tree-view/index.ts +18 -0
- package/src/browser/chat-view-commands.ts +45 -0
- package/src/browser/chat-view-contribution.ts +154 -0
- package/src/browser/chat-view-language-contribution.ts +141 -0
- package/src/browser/chat-view-widget-toolbar-contribution.tsx +54 -0
- package/src/browser/chat-view-widget.tsx +194 -0
- package/src/browser/style/index.css +415 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var ChatViewWidget_1;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ChatViewWidget = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
// *****************************************************************************
|
|
7
|
+
// Copyright (C) 2024 EclipseSource GmbH.
|
|
8
|
+
//
|
|
9
|
+
// This program and the accompanying materials are made available under the
|
|
10
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
11
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
12
|
+
//
|
|
13
|
+
// This Source Code may also be made available under the following Secondary
|
|
14
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
15
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
16
|
+
// with the GNU Classpath Exception which is available at
|
|
17
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
18
|
+
//
|
|
19
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
20
|
+
// *****************************************************************************
|
|
21
|
+
const core_1 = require("@theia/core");
|
|
22
|
+
const ai_chat_1 = require("@theia/ai-chat");
|
|
23
|
+
const browser_1 = require("@theia/core/lib/browser");
|
|
24
|
+
const nls_1 = require("@theia/core/lib/common/nls");
|
|
25
|
+
const inversify_1 = require("@theia/core/shared/inversify");
|
|
26
|
+
const chat_input_widget_1 = require("./chat-input-widget");
|
|
27
|
+
const chat_view_tree_widget_1 = require("./chat-tree-view/chat-view-tree-widget");
|
|
28
|
+
const ai_activation_service_1 = require("@theia/ai-core/lib/browser/ai-activation-service");
|
|
29
|
+
let ChatViewWidget = ChatViewWidget_1 = class ChatViewWidget extends browser_1.BaseWidget {
|
|
30
|
+
constructor(treeWidget, inputWidget) {
|
|
31
|
+
super();
|
|
32
|
+
this.treeWidget = treeWidget;
|
|
33
|
+
this.inputWidget = inputWidget;
|
|
34
|
+
this._state = { locked: false };
|
|
35
|
+
this.onStateChangedEmitter = new core_1.Emitter();
|
|
36
|
+
this.id = ChatViewWidget_1.ID;
|
|
37
|
+
this.title.label = ChatViewWidget_1.LABEL;
|
|
38
|
+
this.title.caption = ChatViewWidget_1.LABEL;
|
|
39
|
+
this.title.iconClass = (0, browser_1.codicon)('comment-discussion');
|
|
40
|
+
this.title.closable = true;
|
|
41
|
+
this.node.classList.add('chat-view-widget');
|
|
42
|
+
this.update();
|
|
43
|
+
}
|
|
44
|
+
init() {
|
|
45
|
+
this.toDispose.pushAll([
|
|
46
|
+
this.treeWidget,
|
|
47
|
+
this.inputWidget,
|
|
48
|
+
this.onStateChanged(newState => {
|
|
49
|
+
this.treeWidget.shouldScrollToEnd = !newState.locked;
|
|
50
|
+
this.update();
|
|
51
|
+
})
|
|
52
|
+
]);
|
|
53
|
+
const layout = this.layout = new browser_1.PanelLayout();
|
|
54
|
+
this.treeWidget.node.classList.add('chat-tree-view-widget');
|
|
55
|
+
layout.addWidget(this.treeWidget);
|
|
56
|
+
this.inputWidget.node.classList.add('chat-input-widget');
|
|
57
|
+
layout.addWidget(this.inputWidget);
|
|
58
|
+
this.chatSession = this.chatService.createSession();
|
|
59
|
+
this.inputWidget.onQuery = this.onQuery.bind(this);
|
|
60
|
+
this.inputWidget.onCancel = this.onCancel.bind(this);
|
|
61
|
+
this.inputWidget.chatModel = this.chatSession.model;
|
|
62
|
+
this.treeWidget.trackChatModel(this.chatSession.model);
|
|
63
|
+
this.initListeners();
|
|
64
|
+
this.inputWidget.setEnabled(this.activationService.isActive);
|
|
65
|
+
this.treeWidget.setEnabled(this.activationService.isActive);
|
|
66
|
+
this.activationService.onDidChangeActiveStatus(change => {
|
|
67
|
+
this.treeWidget.setEnabled(change);
|
|
68
|
+
this.inputWidget.setEnabled(change);
|
|
69
|
+
this.update();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
initListeners() {
|
|
73
|
+
this.toDispose.push(this.chatService.onActiveSessionChanged(event => {
|
|
74
|
+
const session = event.sessionId ? this.chatService.getSession(event.sessionId) : this.chatService.createSession();
|
|
75
|
+
if (session) {
|
|
76
|
+
this.chatSession = session;
|
|
77
|
+
this.treeWidget.trackChatModel(this.chatSession.model);
|
|
78
|
+
this.inputWidget.chatModel = this.chatSession.model;
|
|
79
|
+
if (event.focus) {
|
|
80
|
+
this.show();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.warn(`Session with ${event.sessionId} not found.`);
|
|
85
|
+
}
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
storeState() {
|
|
89
|
+
return this.state;
|
|
90
|
+
}
|
|
91
|
+
restoreState(oldState) {
|
|
92
|
+
const copy = (0, core_1.deepClone)(this.state);
|
|
93
|
+
if (oldState.locked) {
|
|
94
|
+
copy.locked = oldState.locked;
|
|
95
|
+
}
|
|
96
|
+
this.state = copy;
|
|
97
|
+
}
|
|
98
|
+
get state() {
|
|
99
|
+
return this._state;
|
|
100
|
+
}
|
|
101
|
+
set state(state) {
|
|
102
|
+
this._state = state;
|
|
103
|
+
this.onStateChangedEmitter.fire(this._state);
|
|
104
|
+
}
|
|
105
|
+
get onStateChanged() {
|
|
106
|
+
return this.onStateChangedEmitter.event;
|
|
107
|
+
}
|
|
108
|
+
async onQuery(query) {
|
|
109
|
+
if (query.length === 0) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const chatRequest = {
|
|
113
|
+
text: query
|
|
114
|
+
};
|
|
115
|
+
const requestProgress = await this.chatService.sendRequest(this.chatSession.id, chatRequest);
|
|
116
|
+
requestProgress === null || requestProgress === void 0 ? void 0 : requestProgress.responseCompleted.then(responseModel => {
|
|
117
|
+
var _a, _b;
|
|
118
|
+
if (responseModel.isError) {
|
|
119
|
+
this.messageService.error((_b = (_a = responseModel.errorObject) === null || _a === void 0 ? void 0 : _a.message) !== null && _b !== void 0 ? _b : 'An error occurred druring chat service invocation.');
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
if (!requestProgress) {
|
|
123
|
+
this.messageService.error(`Was not able to send request "${chatRequest.text}" to session ${this.chatSession.id}`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// Tree Widget currently tracks the ChatModel itself. Therefore no notification necessary.
|
|
127
|
+
}
|
|
128
|
+
onCancel(requestModel) {
|
|
129
|
+
// TODO we should pass a cancellation token with the request (or retrieve one from the request invocation) so we can cleanly cancel here
|
|
130
|
+
// For now we cancel manually via casting
|
|
131
|
+
requestModel.response.cancel();
|
|
132
|
+
}
|
|
133
|
+
lock() {
|
|
134
|
+
this.state = { ...(0, core_1.deepClone)(this.state), locked: true };
|
|
135
|
+
}
|
|
136
|
+
unlock() {
|
|
137
|
+
this.state = { ...(0, core_1.deepClone)(this.state), locked: false };
|
|
138
|
+
}
|
|
139
|
+
get isLocked() {
|
|
140
|
+
return !!this.state.locked;
|
|
141
|
+
}
|
|
142
|
+
get isExtractable() {
|
|
143
|
+
return this.secondaryWindow === undefined;
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
exports.ChatViewWidget = ChatViewWidget;
|
|
147
|
+
ChatViewWidget.ID = 'chat-view-widget';
|
|
148
|
+
ChatViewWidget.LABEL = `✨ ${nls_1.nls.localizeByDefault('Chat')} [Experimental]`;
|
|
149
|
+
tslib_1.__decorate([
|
|
150
|
+
(0, inversify_1.inject)(ai_chat_1.ChatService),
|
|
151
|
+
tslib_1.__metadata("design:type", Object)
|
|
152
|
+
], ChatViewWidget.prototype, "chatService", void 0);
|
|
153
|
+
tslib_1.__decorate([
|
|
154
|
+
(0, inversify_1.inject)(core_1.MessageService),
|
|
155
|
+
tslib_1.__metadata("design:type", core_1.MessageService)
|
|
156
|
+
], ChatViewWidget.prototype, "messageService", void 0);
|
|
157
|
+
tslib_1.__decorate([
|
|
158
|
+
(0, inversify_1.inject)(browser_1.PreferenceService),
|
|
159
|
+
tslib_1.__metadata("design:type", Object)
|
|
160
|
+
], ChatViewWidget.prototype, "preferenceService", void 0);
|
|
161
|
+
tslib_1.__decorate([
|
|
162
|
+
(0, inversify_1.inject)(core_1.CommandService),
|
|
163
|
+
tslib_1.__metadata("design:type", Object)
|
|
164
|
+
], ChatViewWidget.prototype, "commandService", void 0);
|
|
165
|
+
tslib_1.__decorate([
|
|
166
|
+
(0, inversify_1.inject)(ai_activation_service_1.AIActivationService),
|
|
167
|
+
tslib_1.__metadata("design:type", ai_activation_service_1.AIActivationService)
|
|
168
|
+
], ChatViewWidget.prototype, "activationService", void 0);
|
|
169
|
+
tslib_1.__decorate([
|
|
170
|
+
(0, inversify_1.postConstruct)(),
|
|
171
|
+
tslib_1.__metadata("design:type", Function),
|
|
172
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
173
|
+
tslib_1.__metadata("design:returntype", void 0)
|
|
174
|
+
], ChatViewWidget.prototype, "init", null);
|
|
175
|
+
exports.ChatViewWidget = ChatViewWidget = ChatViewWidget_1 = tslib_1.__decorate([
|
|
176
|
+
(0, inversify_1.injectable)(),
|
|
177
|
+
tslib_1.__param(0, (0, inversify_1.inject)(chat_view_tree_widget_1.ChatViewTreeWidget)),
|
|
178
|
+
tslib_1.__param(1, (0, inversify_1.inject)(chat_input_widget_1.AIChatInputWidget)),
|
|
179
|
+
tslib_1.__metadata("design:paramtypes", [chat_view_tree_widget_1.ChatViewTreeWidget,
|
|
180
|
+
chat_input_widget_1.AIChatInputWidget])
|
|
181
|
+
], ChatViewWidget);
|
|
182
|
+
//# sourceMappingURL=chat-view-widget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-view-widget.js","sourceRoot":"","sources":["../../src/browser/chat-view-widget.tsx"],"names":[],"mappings":";;;;;AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,sCAAwF;AACxF,4CAA+G;AAC/G,qDAAiI;AACjI,oDAAiD;AACjD,4DAAiF;AACjF,2DAAwD;AACxD,kFAA4E;AAC5E,4FAAuF;AAShF,IAAM,cAAc,sBAApB,MAAM,cAAe,SAAQ,oBAAU;IA2B1C,YAEI,UAAuC,EAEvC,WAAuC;QAEvC,KAAK,EAAE,CAAC;QAJC,eAAU,GAAV,UAAU,CAAoB;QAE9B,gBAAW,GAAX,WAAW,CAAmB;QATjC,WAAM,GAAyB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACxC,0BAAqB,GAAG,IAAI,cAAO,EAAwB,CAAC;QAW3E,IAAI,CAAC,EAAE,GAAG,gBAAc,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,gBAAc,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,gBAAc,CAAC,KAAK,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAA,iBAAO,EAAC,oBAAoB,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAGS,IAAI;QACV,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACnB,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,WAAW;YAChB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;gBAC3B,IAAI,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,CAAC,CAAC;SACL,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,qBAAW,EAAE,CAAC;QAE/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACzD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;QAEpD,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEvD,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAE5D,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE;YACpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;IAES,aAAa;QACnB,IAAI,CAAC,SAAS,CAAC,IAAI,CACf,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE;YAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;YAClH,IAAI,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;gBAC3B,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACvD,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;gBACpD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBACd,IAAI,CAAC,IAAI,EAAE,CAAC;gBAChB,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,SAAS,aAAa,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC,CAAC,CACL,CAAC;IACN,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,YAAY,CAAC,QAAgD;QACzD,MAAM,IAAI,GAAG,IAAA,gBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,IAAc,KAAK;QACf,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAc,KAAK,CAAC,KAA2B;QAC3C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;IAC5C,CAAC;IAES,KAAK,CAAC,OAAO,CAAC,KAAa;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAEnC,MAAM,WAAW,GAAgB;YAC7B,IAAI,EAAE,KAAK;SACd,CAAC;QAEF,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC7F,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;;YACpD,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAA,MAAA,aAAa,CAAC,WAAW,0CAAE,OAAO,mCAAI,oDAAoD,CAAC,CAAC;YAC1H,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,iCAAiC,WAAW,CAAC,IAAI,gBAAgB,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;YAClH,OAAO;QACX,CAAC;QACD,0FAA0F;IAC9F,CAAC;IAES,QAAQ,CAAC,YAA8B;QAC7C,wIAAwI;QACxI,yCAAyC;QACxC,YAAqC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI;QACA,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAA,gBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM;QACF,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAA,gBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC;IAC9C,CAAC;;AAjKQ,wCAAc;AAET,iBAAE,GAAG,kBAAkB,AAArB,CAAsB;AAC/B,oBAAK,GAAG,KAAK,SAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,AAAtD,CAAuD;AAGzD;IADT,IAAA,kBAAM,EAAC,qBAAW,CAAC;;mDACe;AAGzB;IADT,IAAA,kBAAM,EAAC,qBAAc,CAAC;sCACG,qBAAc;sDAAC;AAGtB;IADlB,IAAA,kBAAM,EAAC,2BAAiB,CAAC;;yDAC8B;AAGrC;IADlB,IAAA,kBAAM,EAAC,qBAAc,CAAC;;sDAC2B;AAG/B;IADlB,IAAA,kBAAM,EAAC,2CAAmB,CAAC;sCACU,2CAAmB;yDAAC;AA0BhD;IADT,IAAA,yBAAa,GAAE;;;;0CAiCf;yBA5EQ,cAAc;IAD1B,IAAA,sBAAU,GAAE;IA6BJ,mBAAA,IAAA,kBAAM,EAAC,0CAAkB,CAAC,CAAA;IAE1B,mBAAA,IAAA,kBAAM,EAAC,qCAAiB,CAAC,CAAA;6CADL,0CAAkB;QAEjB,qCAAiB;GA/BlC,cAAc,CAkK1B"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@theia/ai-chat-ui",
|
|
3
|
+
"version": "1.46.0-next.241+4295c1a8c",
|
|
4
|
+
"description": "Theia - AI Chat UI Extension",
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"@theia/ai-chat": "1.46.0-next.241+4295c1a8c",
|
|
7
|
+
"@theia/ai-core": "1.46.0-next.241+4295c1a8c",
|
|
8
|
+
"@theia/core": "1.46.0-next.241+4295c1a8c",
|
|
9
|
+
"@theia/editor": "1.46.0-next.241+4295c1a8c",
|
|
10
|
+
"@theia/editor-preview": "1.46.0-next.241+4295c1a8c",
|
|
11
|
+
"@theia/filesystem": "1.46.0-next.241+4295c1a8c",
|
|
12
|
+
"@theia/monaco": "1.46.0-next.241+4295c1a8c",
|
|
13
|
+
"@theia/monaco-editor-core": "1.83.101",
|
|
14
|
+
"@theia/workspace": "1.46.0-next.241+4295c1a8c",
|
|
15
|
+
"minimatch": "^5.1.0",
|
|
16
|
+
"tslib": "^2.6.2",
|
|
17
|
+
"uuid": "^9.0.1"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"theiaExtensions": [
|
|
23
|
+
{
|
|
24
|
+
"frontend": "lib/browser/ai-chat-ui-frontend-module",
|
|
25
|
+
"secondaryWindow": "lib/browser/ai-chat-ui-frontend-module"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"keywords": [
|
|
29
|
+
"theia-extension"
|
|
30
|
+
],
|
|
31
|
+
"license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/eclipse-theia/theia.git"
|
|
35
|
+
},
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/eclipse-theia/theia/issues"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://github.com/eclipse-theia/theia",
|
|
40
|
+
"files": [
|
|
41
|
+
"lib",
|
|
42
|
+
"src"
|
|
43
|
+
],
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "theiaext build",
|
|
46
|
+
"clean": "theiaext clean",
|
|
47
|
+
"compile": "theiaext compile",
|
|
48
|
+
"lint": "theiaext lint",
|
|
49
|
+
"test": "theiaext test",
|
|
50
|
+
"watch": "theiaext watch"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@theia/ext-scripts": "1.56.0"
|
|
54
|
+
},
|
|
55
|
+
"nyc": {
|
|
56
|
+
"extends": "../../configs/nyc.json"
|
|
57
|
+
},
|
|
58
|
+
"gitHead": "4295c1a8c8b5d23471f274265c798bac9e6baecc"
|
|
59
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2024 EclipseSource GmbH.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
18
|
+
import { CommandRegistry, QuickInputButton, QuickInputService, QuickPickItem } from '@theia/core';
|
|
19
|
+
import { Widget } from '@theia/core/lib/browser';
|
|
20
|
+
import { AI_CHAT_NEW_CHAT_WINDOW_COMMAND, AI_CHAT_SHOW_CHATS_COMMAND, ChatCommands } from './chat-view-commands';
|
|
21
|
+
import { ChatAgentLocation, ChatService } from '@theia/ai-chat';
|
|
22
|
+
import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
|
|
23
|
+
import { TabBarToolbarContribution, TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
|
24
|
+
import { ChatViewWidget } from './chat-view-widget';
|
|
25
|
+
import { Deferred } from '@theia/core/lib/common/promise-util';
|
|
26
|
+
import { SecondaryWindowHandler } from '@theia/core/lib/browser/secondary-window-handler';
|
|
27
|
+
|
|
28
|
+
export const AI_CHAT_TOGGLE_COMMAND_ID = 'aiChat:toggle';
|
|
29
|
+
|
|
30
|
+
@injectable()
|
|
31
|
+
export class AIChatContribution extends AbstractViewContribution<ChatViewWidget> implements TabBarToolbarContribution {
|
|
32
|
+
|
|
33
|
+
@inject(ChatService)
|
|
34
|
+
protected readonly chatService: ChatService;
|
|
35
|
+
@inject(QuickInputService)
|
|
36
|
+
protected readonly quickInputService: QuickInputService;
|
|
37
|
+
|
|
38
|
+
protected static readonly REMOVE_CHAT_BUTTON: QuickInputButton = {
|
|
39
|
+
iconClass: 'codicon-remove-close',
|
|
40
|
+
tooltip: 'Remove Chat',
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
@inject(SecondaryWindowHandler)
|
|
44
|
+
protected readonly secondaryWindowHandler: SecondaryWindowHandler;
|
|
45
|
+
|
|
46
|
+
constructor() {
|
|
47
|
+
super({
|
|
48
|
+
widgetId: ChatViewWidget.ID,
|
|
49
|
+
widgetName: ChatViewWidget.LABEL,
|
|
50
|
+
defaultWidgetOptions: {
|
|
51
|
+
area: 'left',
|
|
52
|
+
rank: 100
|
|
53
|
+
},
|
|
54
|
+
toggleCommandId: AI_CHAT_TOGGLE_COMMAND_ID,
|
|
55
|
+
toggleKeybinding: 'ctrlcmd+alt+i'
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
override registerCommands(registry: CommandRegistry): void {
|
|
60
|
+
super.registerCommands(registry);
|
|
61
|
+
registry.registerCommand(ChatCommands.SCROLL_LOCK_WIDGET, {
|
|
62
|
+
isEnabled: widget => this.withWidget(widget, chatWidget => !chatWidget.isLocked),
|
|
63
|
+
isVisible: widget => this.withWidget(widget, chatWidget => !chatWidget.isLocked),
|
|
64
|
+
execute: widget => this.withWidget(widget, chatWidget => {
|
|
65
|
+
chatWidget.lock();
|
|
66
|
+
return true;
|
|
67
|
+
})
|
|
68
|
+
});
|
|
69
|
+
registry.registerCommand(ChatCommands.SCROLL_UNLOCK_WIDGET, {
|
|
70
|
+
isEnabled: widget => this.withWidget(widget, chatWidget => chatWidget.isLocked),
|
|
71
|
+
isVisible: widget => this.withWidget(widget, chatWidget => chatWidget.isLocked),
|
|
72
|
+
execute: widget => this.withWidget(widget, chatWidget => {
|
|
73
|
+
chatWidget.unlock();
|
|
74
|
+
return true;
|
|
75
|
+
})
|
|
76
|
+
});
|
|
77
|
+
registry.registerCommand(AI_CHAT_NEW_CHAT_WINDOW_COMMAND, {
|
|
78
|
+
execute: () => this.chatService.createSession(ChatAgentLocation.Panel, { focus: true }),
|
|
79
|
+
isEnabled: widget => this.withWidget(widget, () => true),
|
|
80
|
+
isVisible: widget => this.withWidget(widget, () => true),
|
|
81
|
+
});
|
|
82
|
+
registry.registerCommand(AI_CHAT_SHOW_CHATS_COMMAND, {
|
|
83
|
+
execute: () => this.selectChat(),
|
|
84
|
+
isEnabled: widget => this.withWidget(widget, () => true) && this.chatService.getSessions().length > 1,
|
|
85
|
+
isVisible: widget => this.withWidget(widget, () => true)
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
registerToolbarItems(registry: TabBarToolbarRegistry): void {
|
|
90
|
+
registry.registerItem({
|
|
91
|
+
id: AI_CHAT_NEW_CHAT_WINDOW_COMMAND.id,
|
|
92
|
+
command: AI_CHAT_NEW_CHAT_WINDOW_COMMAND.id,
|
|
93
|
+
tooltip: 'New Chat',
|
|
94
|
+
isVisible: widget => this.isChatViewWidget(widget)
|
|
95
|
+
});
|
|
96
|
+
registry.registerItem({
|
|
97
|
+
id: AI_CHAT_SHOW_CHATS_COMMAND.id,
|
|
98
|
+
command: AI_CHAT_SHOW_CHATS_COMMAND.id,
|
|
99
|
+
tooltip: 'Show Chats...',
|
|
100
|
+
isVisible: widget => this.isChatViewWidget(widget),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
protected isChatViewWidget(widget?: Widget): boolean {
|
|
105
|
+
return !!widget && ChatViewWidget.ID === widget.id;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
protected async selectChat(sessionId?: string): Promise<void> {
|
|
109
|
+
let activeSessionId = sessionId;
|
|
110
|
+
|
|
111
|
+
if (!activeSessionId) {
|
|
112
|
+
const item = await this.askForChatSession();
|
|
113
|
+
if (item === undefined) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
activeSessionId = item.id;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
this.chatService.setActiveSession(activeSessionId!, { focus: true });
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
protected askForChatSession(): Promise<QuickPickItem | undefined> {
|
|
123
|
+
const getItems = () =>
|
|
124
|
+
this.chatService.getSessions().filter(session => !session.isActive).map(session => <QuickPickItem>({
|
|
125
|
+
label: session.title ?? 'New Chat',
|
|
126
|
+
id: session.id,
|
|
127
|
+
buttons: [AIChatContribution.REMOVE_CHAT_BUTTON]
|
|
128
|
+
})).reverse();
|
|
129
|
+
|
|
130
|
+
const defer = new Deferred<QuickPickItem | undefined>();
|
|
131
|
+
const quickPick = this.quickInputService.createQuickPick();
|
|
132
|
+
quickPick.placeholder = 'Select chat';
|
|
133
|
+
quickPick.canSelectMany = false;
|
|
134
|
+
quickPick.items = getItems();
|
|
135
|
+
|
|
136
|
+
quickPick.onDidTriggerItemButton(async context => {
|
|
137
|
+
this.chatService.deleteSession(context.item.id!);
|
|
138
|
+
quickPick.items = getItems();
|
|
139
|
+
if (this.chatService.getSessions().length <= 1) {
|
|
140
|
+
quickPick.hide();
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
quickPick.onDidAccept(() => {
|
|
145
|
+
const selectedItem = quickPick.selectedItems[0];
|
|
146
|
+
defer.resolve(selectedItem);
|
|
147
|
+
quickPick.hide();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
quickPick.onDidHide(() => defer.resolve(undefined));
|
|
151
|
+
|
|
152
|
+
quickPick.show();
|
|
153
|
+
|
|
154
|
+
return defer.promise;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
protected withWidget(
|
|
158
|
+
widget: Widget | undefined = this.tryGetWidget(),
|
|
159
|
+
predicate: (output: ChatViewWidget) => boolean = () => true
|
|
160
|
+
): boolean | false {
|
|
161
|
+
return widget instanceof ChatViewWidget ? predicate(widget) : false;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
protected extractChatView(chatView: ChatViewWidget): void {
|
|
165
|
+
this.secondaryWindowHandler.moveWidgetToSecondaryWindow(chatView);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
canExtractChatView(chatView: ChatViewWidget): boolean {
|
|
169
|
+
return !chatView.secondaryWindow;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2024 EclipseSource GmbH.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { bindContributionProvider, CommandContribution, MenuContribution } from '@theia/core';
|
|
18
|
+
import { bindViewContribution, FrontendApplicationContribution, WidgetFactory } from '@theia/core/lib/browser';
|
|
19
|
+
import { TabBarToolbarContribution } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
|
20
|
+
import { ContainerModule, interfaces } from '@theia/core/shared/inversify';
|
|
21
|
+
import { EditorManager } from '@theia/editor/lib/browser';
|
|
22
|
+
import '../../src/browser/style/index.css';
|
|
23
|
+
import { AIChatContribution } from './ai-chat-ui-contribution';
|
|
24
|
+
import { AIChatInputWidget } from './chat-input-widget';
|
|
25
|
+
import { ChatNodeToolbarActionContribution } from './chat-node-toolbar-action-contribution';
|
|
26
|
+
import { ChatResponsePartRenderer } from './chat-response-part-renderer';
|
|
27
|
+
import { CodePartRenderer, CommandPartRenderer, ErrorPartRenderer, HorizontalLayoutPartRenderer, MarkdownPartRenderer, ToolCallPartRenderer } from './chat-response-renderer';
|
|
28
|
+
import {
|
|
29
|
+
AIEditorManager, AIEditorSelectionResolver,
|
|
30
|
+
GitHubSelectionResolver, TextFragmentSelectionResolver, TypeDocSymbolSelectionResolver
|
|
31
|
+
} from './chat-response-renderer/ai-editor-manager';
|
|
32
|
+
import { createChatViewTreeWidget } from './chat-tree-view';
|
|
33
|
+
import { ChatViewTreeWidget } from './chat-tree-view/chat-view-tree-widget';
|
|
34
|
+
import { ChatViewMenuContribution } from './chat-view-contribution';
|
|
35
|
+
import { ChatViewLanguageContribution } from './chat-view-language-contribution';
|
|
36
|
+
import { ChatViewWidget } from './chat-view-widget';
|
|
37
|
+
import { ChatViewWidgetToolbarContribution } from './chat-view-widget-toolbar-contribution';
|
|
38
|
+
import { EditorPreviewManager } from '@theia/editor-preview/lib/browser/editor-preview-manager';
|
|
39
|
+
import { QuestionPartRenderer } from './chat-response-renderer/question-part-renderer';
|
|
40
|
+
|
|
41
|
+
export default new ContainerModule((bind, _unbind, _isBound, rebind) => {
|
|
42
|
+
bindViewContribution(bind, AIChatContribution);
|
|
43
|
+
bind(TabBarToolbarContribution).toService(AIChatContribution);
|
|
44
|
+
|
|
45
|
+
bindContributionProvider(bind, ChatResponsePartRenderer);
|
|
46
|
+
|
|
47
|
+
bindChatViewWidget(bind);
|
|
48
|
+
|
|
49
|
+
bind(AIChatInputWidget).toSelf();
|
|
50
|
+
bind(WidgetFactory).toDynamicValue(({ container }) => ({
|
|
51
|
+
id: AIChatInputWidget.ID,
|
|
52
|
+
createWidget: () => container.get(AIChatInputWidget)
|
|
53
|
+
})).inSingletonScope();
|
|
54
|
+
|
|
55
|
+
bind(ChatViewTreeWidget).toDynamicValue(ctx =>
|
|
56
|
+
createChatViewTreeWidget(ctx.container)
|
|
57
|
+
);
|
|
58
|
+
bind(WidgetFactory).toDynamicValue(({ container }) => ({
|
|
59
|
+
id: ChatViewTreeWidget.ID,
|
|
60
|
+
createWidget: () => container.get(ChatViewTreeWidget)
|
|
61
|
+
})).inSingletonScope();
|
|
62
|
+
|
|
63
|
+
bind(ChatResponsePartRenderer).to(HorizontalLayoutPartRenderer).inSingletonScope();
|
|
64
|
+
bind(ChatResponsePartRenderer).to(ErrorPartRenderer).inSingletonScope();
|
|
65
|
+
bind(ChatResponsePartRenderer).to(MarkdownPartRenderer).inSingletonScope();
|
|
66
|
+
bind(ChatResponsePartRenderer).to(CodePartRenderer).inSingletonScope();
|
|
67
|
+
bind(ChatResponsePartRenderer).to(CommandPartRenderer).inSingletonScope();
|
|
68
|
+
bind(ChatResponsePartRenderer).to(ToolCallPartRenderer).inSingletonScope();
|
|
69
|
+
bind(ChatResponsePartRenderer).to(ErrorPartRenderer).inSingletonScope();
|
|
70
|
+
bind(ChatResponsePartRenderer).to(QuestionPartRenderer).inSingletonScope();
|
|
71
|
+
[CommandContribution, MenuContribution].forEach(serviceIdentifier =>
|
|
72
|
+
bind(serviceIdentifier).to(ChatViewMenuContribution).inSingletonScope()
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
bind(AIEditorManager).toSelf().inSingletonScope();
|
|
76
|
+
rebind(EditorManager).toService(AIEditorManager);
|
|
77
|
+
rebind(EditorPreviewManager).toService(AIEditorManager);
|
|
78
|
+
|
|
79
|
+
bindContributionProvider(bind, AIEditorSelectionResolver);
|
|
80
|
+
bind(AIEditorSelectionResolver).to(GitHubSelectionResolver).inSingletonScope();
|
|
81
|
+
bind(AIEditorSelectionResolver).to(TypeDocSymbolSelectionResolver).inSingletonScope();
|
|
82
|
+
bind(AIEditorSelectionResolver).to(TextFragmentSelectionResolver).inSingletonScope();
|
|
83
|
+
|
|
84
|
+
bind(ChatViewWidgetToolbarContribution).toSelf().inSingletonScope();
|
|
85
|
+
bind(TabBarToolbarContribution).toService(ChatViewWidgetToolbarContribution);
|
|
86
|
+
|
|
87
|
+
bind(FrontendApplicationContribution).to(ChatViewLanguageContribution).inSingletonScope();
|
|
88
|
+
|
|
89
|
+
bindContributionProvider(bind, ChatNodeToolbarActionContribution);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
function bindChatViewWidget(bind: interfaces.Bind): void {
|
|
93
|
+
let chatViewWidget: ChatViewWidget | undefined;
|
|
94
|
+
bind(ChatViewWidget).toSelf();
|
|
95
|
+
|
|
96
|
+
bind(WidgetFactory).toDynamicValue(context => ({
|
|
97
|
+
id: ChatViewWidget.ID,
|
|
98
|
+
createWidget: () => {
|
|
99
|
+
if (chatViewWidget?.isDisposed !== false) {
|
|
100
|
+
chatViewWidget = context.container.get<ChatViewWidget>(ChatViewWidget);
|
|
101
|
+
}
|
|
102
|
+
return chatViewWidget;
|
|
103
|
+
}
|
|
104
|
+
})).inSingletonScope();
|
|
105
|
+
}
|