@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.
Files changed (123) hide show
  1. package/README.md +33 -0
  2. package/lib/browser/ai-chat-ui-contribution.d.ts +24 -0
  3. package/lib/browser/ai-chat-ui-contribution.d.ts.map +1 -0
  4. package/lib/browser/ai-chat-ui-contribution.js +161 -0
  5. package/lib/browser/ai-chat-ui-contribution.js.map +1 -0
  6. package/lib/browser/ai-chat-ui-frontend-module.d.ts +5 -0
  7. package/lib/browser/ai-chat-ui-frontend-module.d.ts.map +1 -0
  8. package/lib/browser/ai-chat-ui-frontend-module.js +87 -0
  9. package/lib/browser/ai-chat-ui-frontend-module.js.map +1 -0
  10. package/lib/browser/chat-input-widget.d.ts +32 -0
  11. package/lib/browser/chat-input-widget.d.ts.map +1 -0
  12. package/lib/browser/chat-input-widget.js +217 -0
  13. package/lib/browser/chat-input-widget.js.map +1 -0
  14. package/lib/browser/chat-node-toolbar-action-contribution.d.ts +47 -0
  15. package/lib/browser/chat-node-toolbar-action-contribution.d.ts.map +1 -0
  16. package/lib/browser/chat-node-toolbar-action-contribution.js +25 -0
  17. package/lib/browser/chat-node-toolbar-action-contribution.js.map +1 -0
  18. package/lib/browser/chat-response-part-renderer.d.ts +10 -0
  19. package/lib/browser/chat-response-part-renderer.d.ts.map +1 -0
  20. package/lib/browser/chat-response-part-renderer.js +20 -0
  21. package/lib/browser/chat-response-part-renderer.js.map +1 -0
  22. package/lib/browser/chat-response-renderer/ai-editor-manager.d.ts +36 -0
  23. package/lib/browser/chat-response-renderer/ai-editor-manager.d.ts.map +1 -0
  24. package/lib/browser/chat-response-renderer/ai-editor-manager.js +184 -0
  25. package/lib/browser/chat-response-renderer/ai-editor-manager.js.map +1 -0
  26. package/lib/browser/chat-response-renderer/code-part-renderer.d.ts +45 -0
  27. package/lib/browser/chat-response-renderer/code-part-renderer.d.ts.map +1 -0
  28. package/lib/browser/chat-response-renderer/code-part-renderer.js +190 -0
  29. package/lib/browser/chat-response-renderer/code-part-renderer.js.map +1 -0
  30. package/lib/browser/chat-response-renderer/command-part-renderer.d.ts +12 -0
  31. package/lib/browser/chat-response-renderer/command-part-renderer.d.ts.map +1 -0
  32. package/lib/browser/chat-response-renderer/command-part-renderer.js +70 -0
  33. package/lib/browser/chat-response-renderer/command-part-renderer.js.map +1 -0
  34. package/lib/browser/chat-response-renderer/error-part-renderer.d.ts +9 -0
  35. package/lib/browser/chat-response-renderer/error-part-renderer.d.ts.map +1 -0
  36. package/lib/browser/chat-response-renderer/error-part-renderer.js +40 -0
  37. package/lib/browser/chat-response-renderer/error-part-renderer.js.map +1 -0
  38. package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.d.ts +12 -0
  39. package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.d.ts.map +1 -0
  40. package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.js +54 -0
  41. package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.js.map +1 -0
  42. package/lib/browser/chat-response-renderer/index.d.ts +9 -0
  43. package/lib/browser/chat-response-renderer/index.d.ts.map +1 -0
  44. package/lib/browser/chat-response-renderer/index.js +27 -0
  45. package/lib/browser/chat-response-renderer/index.js.map +1 -0
  46. package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts +25 -0
  47. package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts.map +1 -0
  48. package/lib/browser/chat-response-renderer/markdown-part-renderer.js +89 -0
  49. package/lib/browser/chat-response-renderer/markdown-part-renderer.js.map +1 -0
  50. package/lib/browser/chat-response-renderer/question-part-renderer.d.ts +10 -0
  51. package/lib/browser/chat-response-renderer/question-part-renderer.d.ts.map +1 -0
  52. package/lib/browser/chat-response-renderer/question-part-renderer.js +43 -0
  53. package/lib/browser/chat-response-renderer/question-part-renderer.js.map +1 -0
  54. package/lib/browser/chat-response-renderer/text-part-renderer.d.ts +9 -0
  55. package/lib/browser/chat-response-renderer/text-part-renderer.d.ts.map +1 -0
  56. package/lib/browser/chat-response-renderer/text-part-renderer.js +41 -0
  57. package/lib/browser/chat-response-renderer/text-part-renderer.js.map +1 -0
  58. package/lib/browser/chat-response-renderer/text-part-renderer.spec.d.ts +2 -0
  59. package/lib/browser/chat-response-renderer/text-part-renderer.spec.d.ts.map +1 -0
  60. package/lib/browser/chat-response-renderer/text-part-renderer.spec.js +46 -0
  61. package/lib/browser/chat-response-renderer/text-part-renderer.spec.js.map +1 -0
  62. package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts +12 -0
  63. package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts.map +1 -0
  64. package/lib/browser/chat-response-renderer/toolcall-part-renderer.js +81 -0
  65. package/lib/browser/chat-response-renderer/toolcall-part-renderer.js.map +1 -0
  66. package/lib/browser/chat-tree-view/chat-view-tree-container.d.ts +4 -0
  67. package/lib/browser/chat-tree-view/chat-view-tree-container.d.ts.map +1 -0
  68. package/lib/browser/chat-tree-view/chat-view-tree-container.js +33 -0
  69. package/lib/browser/chat-tree-view/chat-view-tree-container.js.map +1 -0
  70. package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts +56 -0
  71. package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts.map +1 -0
  72. package/lib/browser/chat-tree-view/chat-view-tree-widget.js +388 -0
  73. package/lib/browser/chat-tree-view/chat-view-tree-widget.js.map +1 -0
  74. package/lib/browser/chat-tree-view/index.d.ts +3 -0
  75. package/lib/browser/chat-tree-view/index.d.ts.map +1 -0
  76. package/lib/browser/chat-tree-view/index.js +21 -0
  77. package/lib/browser/chat-tree-view/index.js.map +1 -0
  78. package/lib/browser/chat-view-commands.d.ts +8 -0
  79. package/lib/browser/chat-view-commands.d.ts.map +1 -0
  80. package/lib/browser/chat-view-commands.js +44 -0
  81. package/lib/browser/chat-view-commands.js.map +1 -0
  82. package/lib/browser/chat-view-contribution.d.ts +18 -0
  83. package/lib/browser/chat-view-contribution.d.ts.map +1 -0
  84. package/lib/browser/chat-view-contribution.js +153 -0
  85. package/lib/browser/chat-view-contribution.js.map +1 -0
  86. package/lib/browser/chat-view-language-contribution.d.ts +20 -0
  87. package/lib/browser/chat-view-language-contribution.d.ts.map +1 -0
  88. package/lib/browser/chat-view-language-contribution.js +98 -0
  89. package/lib/browser/chat-view-language-contribution.js.map +1 -0
  90. package/lib/browser/chat-view-widget-toolbar-contribution.d.ts +11 -0
  91. package/lib/browser/chat-view-widget-toolbar-contribution.d.ts.map +1 -0
  92. package/lib/browser/chat-view-widget-toolbar-contribution.js +65 -0
  93. package/lib/browser/chat-view-widget-toolbar-contribution.js.map +1 -0
  94. package/lib/browser/chat-view-widget.d.ts +41 -0
  95. package/lib/browser/chat-view-widget.d.ts.map +1 -0
  96. package/lib/browser/chat-view-widget.js +182 -0
  97. package/lib/browser/chat-view-widget.js.map +1 -0
  98. package/package.json +59 -0
  99. package/src/browser/ai-chat-ui-contribution.ts +171 -0
  100. package/src/browser/ai-chat-ui-frontend-module.ts +105 -0
  101. package/src/browser/chat-input-widget.tsx +262 -0
  102. package/src/browser/chat-node-toolbar-action-contribution.ts +63 -0
  103. package/src/browser/chat-response-part-renderer.ts +25 -0
  104. package/src/browser/chat-response-renderer/ai-editor-manager.ts +183 -0
  105. package/src/browser/chat-response-renderer/code-part-renderer.tsx +211 -0
  106. package/src/browser/chat-response-renderer/command-part-renderer.tsx +60 -0
  107. package/src/browser/chat-response-renderer/error-part-renderer.tsx +35 -0
  108. package/src/browser/chat-response-renderer/horizontal-layout-part-renderer.tsx +59 -0
  109. package/src/browser/chat-response-renderer/index.ts +23 -0
  110. package/src/browser/chat-response-renderer/markdown-part-renderer.tsx +92 -0
  111. package/src/browser/chat-response-renderer/question-part-renderer.tsx +59 -0
  112. package/src/browser/chat-response-renderer/text-part-renderer.spec.ts +50 -0
  113. package/src/browser/chat-response-renderer/text-part-renderer.tsx +35 -0
  114. package/src/browser/chat-response-renderer/toolcall-part-renderer.tsx +89 -0
  115. package/src/browser/chat-tree-view/chat-view-tree-container.ts +32 -0
  116. package/src/browser/chat-tree-view/chat-view-tree-widget.tsx +526 -0
  117. package/src/browser/chat-tree-view/index.ts +18 -0
  118. package/src/browser/chat-view-commands.ts +45 -0
  119. package/src/browser/chat-view-contribution.ts +154 -0
  120. package/src/browser/chat-view-language-contribution.ts +141 -0
  121. package/src/browser/chat-view-widget-toolbar-contribution.tsx +54 -0
  122. package/src/browser/chat-view-widget.tsx +194 -0
  123. 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":"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"}
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
+ }