@theia/ai-chat-ui 1.59.0-next.62 → 1.59.0

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 (57) hide show
  1. package/lib/browser/ai-chat-ui-frontend-module.d.ts +1 -1
  2. package/lib/browser/ai-chat-ui-frontend-module.d.ts.map +1 -1
  3. package/lib/browser/ai-chat-ui-frontend-module.js +12 -11
  4. package/lib/browser/ai-chat-ui-frontend-module.js.map +1 -1
  5. package/lib/browser/change-set-actions/change-set-accept-action.d.ts +10 -0
  6. package/lib/browser/change-set-actions/change-set-accept-action.d.ts.map +1 -0
  7. package/lib/browser/change-set-actions/change-set-accept-action.js +47 -0
  8. package/lib/browser/change-set-actions/change-set-accept-action.js.map +1 -0
  9. package/lib/browser/change-set-actions/change-set-action-service.d.ts +31 -0
  10. package/lib/browser/change-set-actions/change-set-action-service.d.ts.map +1 -0
  11. package/lib/browser/change-set-actions/change-set-action-service.js +57 -0
  12. package/lib/browser/change-set-actions/change-set-action-service.js.map +1 -0
  13. package/lib/browser/chat-input-widget.d.ts +6 -4
  14. package/lib/browser/chat-input-widget.d.ts.map +1 -1
  15. package/lib/browser/chat-input-widget.js +57 -43
  16. package/lib/browser/chat-input-widget.js.map +1 -1
  17. package/lib/browser/chat-response-renderer/ai-selection-resolver.d.ts +23 -0
  18. package/lib/browser/chat-response-renderer/ai-selection-resolver.d.ts.map +1 -0
  19. package/lib/browser/chat-response-renderer/{ai-editor-manager.js → ai-selection-resolver.js} +2 -38
  20. package/lib/browser/chat-response-renderer/ai-selection-resolver.js.map +1 -0
  21. package/lib/browser/chat-response-renderer/code-part-renderer.d.ts.map +1 -1
  22. package/lib/browser/chat-response-renderer/code-part-renderer.js +3 -2
  23. package/lib/browser/chat-response-renderer/code-part-renderer.js.map +1 -1
  24. package/lib/browser/chat-response-renderer/index.d.ts +1 -1
  25. package/lib/browser/chat-response-renderer/index.d.ts.map +1 -1
  26. package/lib/browser/chat-response-renderer/index.js +1 -1
  27. package/lib/browser/chat-response-renderer/index.js.map +1 -1
  28. package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts.map +1 -1
  29. package/lib/browser/chat-tree-view/chat-view-tree-widget.js +2 -1
  30. package/lib/browser/chat-tree-view/chat-view-tree-widget.js.map +1 -1
  31. package/lib/browser/chat-view-contribution.d.ts.map +1 -1
  32. package/lib/browser/chat-view-contribution.js +2 -2
  33. package/lib/browser/chat-view-contribution.js.map +1 -1
  34. package/lib/browser/chat-view-language-contribution.d.ts +1 -0
  35. package/lib/browser/chat-view-language-contribution.d.ts.map +1 -1
  36. package/lib/browser/chat-view-language-contribution.js +19 -9
  37. package/lib/browser/chat-view-language-contribution.js.map +1 -1
  38. package/lib/browser/chat-view-widget.d.ts +1 -1
  39. package/lib/browser/chat-view-widget.d.ts.map +1 -1
  40. package/lib/browser/chat-view-widget.js +2 -3
  41. package/lib/browser/chat-view-widget.js.map +1 -1
  42. package/package.json +11 -11
  43. package/src/browser/ai-chat-ui-frontend-module.ts +12 -14
  44. package/src/browser/change-set-actions/change-set-accept-action.tsx +52 -0
  45. package/src/browser/change-set-actions/change-set-action-service.ts +65 -0
  46. package/src/browser/chat-input-widget.tsx +88 -61
  47. package/src/browser/chat-response-renderer/{ai-editor-manager.ts → ai-selection-resolver.ts} +6 -45
  48. package/src/browser/chat-response-renderer/code-part-renderer.tsx +3 -2
  49. package/src/browser/chat-response-renderer/index.ts +1 -1
  50. package/src/browser/chat-tree-view/chat-view-tree-widget.tsx +2 -1
  51. package/src/browser/chat-view-contribution.ts +2 -2
  52. package/src/browser/chat-view-language-contribution.ts +22 -10
  53. package/src/browser/chat-view-widget.tsx +2 -3
  54. package/src/browser/style/index.css +20 -4
  55. package/lib/browser/chat-response-renderer/ai-editor-manager.d.ts +0 -36
  56. package/lib/browser/chat-response-renderer/ai-editor-manager.d.ts.map +0 -1
  57. package/lib/browser/chat-response-renderer/ai-editor-manager.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { ContainerModule } from '@theia/core/shared/inversify';
2
1
  import '../../src/browser/style/index.css';
2
+ import { ContainerModule } from '@theia/core/shared/inversify';
3
3
  declare const _default: ContainerModule;
4
4
  export default _default;
5
5
  //# sourceMappingURL=ai-chat-ui-frontend-module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-chat-ui-frontend-module.d.ts","sourceRoot":"","sources":["../../src/browser/ai-chat-ui-frontend-module.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,eAAe,EAAc,MAAM,8BAA8B,CAAC;AAG3E,OAAO,mCAAmC,CAAC;;AAgC3C,wBA6DG"}
1
+ {"version":3,"file":"ai-chat-ui-frontend-module.d.ts","sourceRoot":"","sources":["../../src/browser/ai-chat-ui-frontend-module.ts"],"names":[],"mappings":"AAgBA,OAAO,mCAAmC,CAAC;AAI3C,OAAO,EAAE,eAAe,EAAc,MAAM,8BAA8B,CAAC;;AAiC3E,wBA4DG"}
@@ -15,19 +15,18 @@
15
15
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
16
  // *****************************************************************************
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
+ require("../../src/browser/style/index.css");
18
19
  const core_1 = require("@theia/core");
19
20
  const browser_1 = require("@theia/core/lib/browser");
20
21
  const tab_bar_toolbar_1 = require("@theia/core/lib/browser/shell/tab-bar-toolbar");
21
22
  const inversify_1 = require("@theia/core/shared/inversify");
22
- const editor_preview_manager_1 = require("@theia/editor-preview/lib/browser/editor-preview-manager");
23
- const browser_2 = require("@theia/editor/lib/browser");
24
- require("../../src/browser/style/index.css");
23
+ const editor_manager_1 = require("@theia/editor/lib/browser/editor-manager");
25
24
  const ai_chat_ui_contribution_1 = require("./ai-chat-ui-contribution");
26
25
  const chat_input_widget_1 = require("./chat-input-widget");
27
26
  const chat_node_toolbar_action_contribution_1 = require("./chat-node-toolbar-action-contribution");
28
27
  const chat_response_part_renderer_1 = require("./chat-response-part-renderer");
29
28
  const chat_response_renderer_1 = require("./chat-response-renderer");
30
- const ai_editor_manager_1 = require("./chat-response-renderer/ai-editor-manager");
29
+ const ai_selection_resolver_1 = require("./chat-response-renderer/ai-selection-resolver");
31
30
  const question_part_renderer_1 = require("./chat-response-renderer/question-part-renderer");
32
31
  const chat_tree_view_1 = require("./chat-tree-view");
33
32
  const chat_view_tree_widget_1 = require("./chat-tree-view/chat-view-tree-widget");
@@ -36,6 +35,8 @@ const chat_view_language_contribution_1 = require("./chat-view-language-contribu
36
35
  const chat_view_widget_1 = require("./chat-view-widget");
37
36
  const chat_view_widget_toolbar_contribution_1 = require("./chat-view-widget-toolbar-contribution");
38
37
  const context_variable_picker_1 = require("./context-variable-picker");
38
+ const change_set_action_service_1 = require("./change-set-actions/change-set-action-service");
39
+ const change_set_accept_action_1 = require("./change-set-actions/change-set-accept-action");
39
40
  exports.default = new inversify_1.ContainerModule((bind, _unbind, _isBound, rebind) => {
40
41
  (0, browser_1.bindViewContribution)(bind, ai_chat_ui_contribution_1.AIChatContribution);
41
42
  bind(tab_bar_toolbar_1.TabBarToolbarContribution).toService(ai_chat_ui_contribution_1.AIChatContribution);
@@ -66,20 +67,20 @@ exports.default = new inversify_1.ContainerModule((bind, _unbind, _isBound, rebi
66
67
  bind(chat_response_part_renderer_1.ChatResponsePartRenderer).to(question_part_renderer_1.QuestionPartRenderer).inSingletonScope();
67
68
  [core_1.CommandContribution, core_1.MenuContribution].forEach(serviceIdentifier => bind(serviceIdentifier).to(chat_view_contribution_1.ChatViewMenuContribution).inSingletonScope());
68
69
  (0, core_1.bindContributionProvider)(bind, chat_response_renderer_1.CodePartRendererAction);
70
+ (0, core_1.bindContributionProvider)(bind, change_set_action_service_1.ChangeSetActionRenderer);
69
71
  bind(chat_response_renderer_1.CopyToClipboardButtonAction).toSelf().inSingletonScope();
70
72
  bind(chat_response_renderer_1.CodePartRendererAction).toService(chat_response_renderer_1.CopyToClipboardButtonAction);
71
73
  bind(chat_response_renderer_1.InsertCodeAtCursorButtonAction).toSelf().inSingletonScope();
72
74
  bind(chat_response_renderer_1.CodePartRendererAction).toService(chat_response_renderer_1.InsertCodeAtCursorButtonAction);
73
- bind(ai_editor_manager_1.AIEditorManager).toSelf().inSingletonScope();
74
- rebind(browser_2.EditorManager).toService(ai_editor_manager_1.AIEditorManager);
75
- rebind(editor_preview_manager_1.EditorPreviewManager).toService(ai_editor_manager_1.AIEditorManager);
76
- (0, core_1.bindContributionProvider)(bind, ai_editor_manager_1.AIEditorSelectionResolver);
77
- bind(ai_editor_manager_1.AIEditorSelectionResolver).to(ai_editor_manager_1.GitHubSelectionResolver).inSingletonScope();
78
- bind(ai_editor_manager_1.AIEditorSelectionResolver).to(ai_editor_manager_1.TypeDocSymbolSelectionResolver).inSingletonScope();
79
- bind(ai_editor_manager_1.AIEditorSelectionResolver).to(ai_editor_manager_1.TextFragmentSelectionResolver).inSingletonScope();
75
+ bind(editor_manager_1.EditorSelectionResolver).to(ai_selection_resolver_1.GitHubSelectionResolver).inSingletonScope();
76
+ bind(editor_manager_1.EditorSelectionResolver).to(ai_selection_resolver_1.TypeDocSymbolSelectionResolver).inSingletonScope();
77
+ bind(editor_manager_1.EditorSelectionResolver).to(ai_selection_resolver_1.TextFragmentSelectionResolver).inSingletonScope();
80
78
  bind(chat_view_widget_toolbar_contribution_1.ChatViewWidgetToolbarContribution).toSelf().inSingletonScope();
81
79
  bind(tab_bar_toolbar_1.TabBarToolbarContribution).toService(chat_view_widget_toolbar_contribution_1.ChatViewWidgetToolbarContribution);
82
80
  bind(browser_1.FrontendApplicationContribution).to(chat_view_language_contribution_1.ChatViewLanguageContribution).inSingletonScope();
81
+ bind(change_set_action_service_1.ChangeSetActionService).toSelf().inSingletonScope();
82
+ bind(change_set_accept_action_1.ChangeSetAcceptAction).toSelf().inSingletonScope();
83
+ bind(change_set_action_service_1.ChangeSetActionRenderer).toService(change_set_accept_action_1.ChangeSetAcceptAction);
83
84
  (0, core_1.bindContributionProvider)(bind, chat_node_toolbar_action_contribution_1.ChatNodeToolbarActionContribution);
84
85
  });
85
86
  function bindChatViewWidget(bind) {
@@ -1 +1 @@
1
- {"version":3,"file":"ai-chat-ui-frontend-module.js","sourceRoot":"","sources":["../../src/browser/ai-chat-ui-frontend-module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-chat-ui-frontend-module.js","sourceRoot":"","sources":["../../src/browser/ai-chat-ui-frontend-module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import * as React from '@theia/core/shared/react';
3
+ import { ChangeSetActionRenderer } from './change-set-action-service';
4
+ import { ChangeSet } from '@theia/ai-chat';
5
+ export declare class ChangeSetAcceptAction implements ChangeSetActionRenderer {
6
+ readonly id = "change-set-accept-action";
7
+ canRender(changeSet: ChangeSet): boolean;
8
+ render(changeSet: ChangeSet): React.ReactNode;
9
+ }
10
+ //# sourceMappingURL=change-set-accept-action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-set-accept-action.d.ts","sourceRoot":"","sources":["../../../src/browser/change-set-actions/change-set-accept-action.tsx"],"names":[],"mappings":";AAgBA,OAAO,KAAK,KAAK,MAAM,0BAA0B,CAAC;AAElD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,SAAS,EAAoB,MAAM,gBAAgB,CAAC;AAG7D,qBACa,qBAAsB,YAAW,uBAAuB;IACjE,QAAQ,CAAC,EAAE,8BAA8B;IACzC,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAIxC,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,KAAK,CAAC,SAAS;CAUhD"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2025 EclipseSource GmbH and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ChangeSetAcceptAction = void 0;
19
+ const tslib_1 = require("tslib");
20
+ const React = require("@theia/core/shared/react");
21
+ const inversify_1 = require("@theia/core/shared/inversify");
22
+ const core_1 = require("@theia/core");
23
+ let ChangeSetAcceptAction = class ChangeSetAcceptAction {
24
+ constructor() {
25
+ this.id = 'change-set-accept-action';
26
+ }
27
+ canRender(changeSet) {
28
+ return changeSet.getElements().length > 0;
29
+ }
30
+ render(changeSet) {
31
+ return React.createElement("button", { className: 'theia-button', disabled: !hasPendingElementsToAccept(changeSet), title: core_1.nls.localize('theia/ai/chat-ui/applyAllTitle', 'Apply all pending changes'), onClick: () => acceptAllPendingElements(changeSet) }, core_1.nls.localize('theia/ai/chat-ui/applyAll', 'Apply All'));
32
+ }
33
+ };
34
+ exports.ChangeSetAcceptAction = ChangeSetAcceptAction;
35
+ exports.ChangeSetAcceptAction = ChangeSetAcceptAction = tslib_1.__decorate([
36
+ (0, inversify_1.injectable)()
37
+ ], ChangeSetAcceptAction);
38
+ function acceptAllPendingElements(changeSet) {
39
+ acceptablePendingElements(changeSet).forEach(e => e.apply());
40
+ }
41
+ function hasPendingElementsToAccept(changeSet) {
42
+ return acceptablePendingElements(changeSet).length > 0;
43
+ }
44
+ function acceptablePendingElements(changeSet) {
45
+ return changeSet.getElements().filter(e => e.apply && (e.state === undefined || e.state === 'pending'));
46
+ }
47
+ //# sourceMappingURL=change-set-accept-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-set-accept-action.js","sourceRoot":"","sources":["../../../src/browser/change-set-actions/change-set-accept-action.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,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;;;;AAEhF,kDAAkD;AAClD,4DAA0D;AAG1D,sCAAkC;AAG3B,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAA3B;QACM,OAAE,GAAG,0BAA0B,CAAC;IAe7C,CAAC;IAdG,SAAS,CAAC,SAAoB;QAC1B,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,SAAoB;QACvB,OAAO,gCACH,SAAS,EAAC,cAAc,EACxB,QAAQ,EAAE,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAChD,KAAK,EAAE,UAAG,CAAC,QAAQ,CAAC,gCAAgC,EAAE,2BAA2B,CAAC,EAClF,OAAO,EAAE,GAAG,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC,IAEjD,UAAG,CAAC,QAAQ,CAAC,2BAA2B,EAAE,WAAW,CAAC,CAClD,CAAC;IACd,CAAC;CACJ,CAAA;AAhBY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,sBAAU,GAAE;GACA,qBAAqB,CAgBjC;AAED,SAAS,wBAAwB,CAAC,SAAoB;IAClD,yBAAyB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAM,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,0BAA0B,CAAC,SAAoB;IACpD,OAAO,yBAAyB,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,yBAAyB,CAAC,SAAoB;IACnD,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;AAC5G,CAAC"}
@@ -0,0 +1,31 @@
1
+ /// <reference types="react" />
2
+ import { ContributionProvider, Event, Emitter } from '@theia/core';
3
+ import { ChangeSet } from '@theia/ai-chat';
4
+ export declare const ChangeSetActionRenderer: unique symbol;
5
+ /**
6
+ * The CodePartRenderer offers to contribute arbitrary React nodes to the rendered code part.
7
+ * Technically anything can be rendered, however it is intended to be used for actions, like
8
+ * "Copy to Clipboard" or "Insert at Cursor".
9
+ */
10
+ export interface ChangeSetActionRenderer {
11
+ readonly id: string;
12
+ onDidChange?: Event<void>;
13
+ render(changeSet: ChangeSet): React.ReactNode;
14
+ /**
15
+ * Determines if the action should be rendered for the given response.
16
+ */
17
+ canRender?(changeSet: ChangeSet): boolean;
18
+ /**
19
+ * Actions are ordered by descending priority. (Highest on left).
20
+ */
21
+ readonly priority?: number;
22
+ }
23
+ export declare class ChangeSetActionService {
24
+ protected readonly onDidChangeEmitter: Emitter<void>;
25
+ get onDidChange(): Event<void>;
26
+ protected readonly contributions: ContributionProvider<ChangeSetActionRenderer>;
27
+ protected init(): void;
28
+ getActions(): readonly ChangeSetActionRenderer[];
29
+ getActionsForChangeset(changeSet: ChangeSet): ChangeSetActionRenderer[];
30
+ }
31
+ //# sourceMappingURL=change-set-action-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-set-action-service.d.ts","sourceRoot":"","sources":["../../../src/browser/change-set-actions/change-set-action-service.ts"],"names":[],"mappings":";AAgBA,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,eAAO,MAAM,uBAAuB,eAAoC,CAAC;AACzE;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAC9C;;OAEG;IACH,SAAS,CAAC,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1C;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBACa,sBAAsB;IAC/B,SAAS,CAAC,QAAQ,CAAC,kBAAkB,gBAAuB;IAC5D,IAAI,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,CAE7B;IAGD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC,uBAAuB,CAAC,CAAC;IAGhF,SAAS,CAAC,IAAI,IAAI,IAAI;IAMtB,UAAU,IAAI,SAAS,uBAAuB,EAAE;IAIhD,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,uBAAuB,EAAE;CAG1E"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2025 EclipseSource GmbH.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ChangeSetActionService = exports.ChangeSetActionRenderer = void 0;
19
+ const tslib_1 = require("tslib");
20
+ const core_1 = require("@theia/core");
21
+ const inversify_1 = require("@theia/core/shared/inversify");
22
+ exports.ChangeSetActionRenderer = Symbol('ChangeSetActionRenderer');
23
+ let ChangeSetActionService = class ChangeSetActionService {
24
+ constructor() {
25
+ this.onDidChangeEmitter = new core_1.Emitter();
26
+ }
27
+ get onDidChange() {
28
+ return this.onDidChangeEmitter.event;
29
+ }
30
+ init() {
31
+ const actions = this.contributions.getContributions();
32
+ actions.sort((a, b) => { var _a, _b; return ((_a = b.priority) !== null && _a !== void 0 ? _a : 0) - ((_b = a.priority) !== null && _b !== void 0 ? _b : 0); });
33
+ actions.forEach(contribution => { var _a; return (_a = contribution.onDidChange) === null || _a === void 0 ? void 0 : _a.call(contribution, this.onDidChangeEmitter.fire, this.onDidChangeEmitter); });
34
+ }
35
+ getActions() {
36
+ return this.contributions.getContributions();
37
+ }
38
+ getActionsForChangeset(changeSet) {
39
+ return this.getActions().filter(candidate => !candidate.canRender || candidate.canRender(changeSet));
40
+ }
41
+ };
42
+ exports.ChangeSetActionService = ChangeSetActionService;
43
+ tslib_1.__decorate([
44
+ (0, inversify_1.inject)(core_1.ContributionProvider),
45
+ (0, inversify_1.named)(exports.ChangeSetActionRenderer),
46
+ tslib_1.__metadata("design:type", Object)
47
+ ], ChangeSetActionService.prototype, "contributions", void 0);
48
+ tslib_1.__decorate([
49
+ (0, inversify_1.postConstruct)(),
50
+ tslib_1.__metadata("design:type", Function),
51
+ tslib_1.__metadata("design:paramtypes", []),
52
+ tslib_1.__metadata("design:returntype", void 0)
53
+ ], ChangeSetActionService.prototype, "init", null);
54
+ exports.ChangeSetActionService = ChangeSetActionService = tslib_1.__decorate([
55
+ (0, inversify_1.injectable)()
56
+ ], ChangeSetActionService);
57
+ //# sourceMappingURL=change-set-action-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-set-action-service.js","sourceRoot":"","sources":["../../../src/browser/change-set-actions/change-set-action-service.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;;;;AAEhF,sCAAmE;AAEnE,4DAAwF;AAE3E,QAAA,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAqBlE,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAA5B;QACgB,uBAAkB,GAAG,IAAI,cAAO,EAAQ,CAAC;IAsBhE,CAAC;IArBG,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;IACzC,CAAC;IAMS,IAAI;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,eAAC,OAAA,CAAC,MAAA,CAAC,CAAC,QAAQ,mCAAI,CAAC,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,QAAQ,mCAAI,CAAC,CAAC,CAAA,EAAA,CAAC,CAAC;QAC9D,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,WAAC,OAAA,MAAA,YAAY,CAAC,WAAW,6DAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAA,EAAA,CAAC,CAAC;IACvH,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;IACjD,CAAC;IAED,sBAAsB,CAAC,SAAoB;QACvC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IACzG,CAAC;CACJ,CAAA;AAvBY,wDAAsB;AAOZ;IADlB,IAAA,kBAAM,EAAC,2BAAoB,CAAC;IAAE,IAAA,iBAAK,EAAC,+BAAuB,CAAC;;6DACmB;AAGtE;IADT,IAAA,yBAAa,GAAE;;;;kDAKf;iCAdQ,sBAAsB;IADlC,IAAA,sBAAU,GAAE;GACA,sBAAsB,CAuBlC"}
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { ChatAgent, ChatModel, ChatRequestModel } from '@theia/ai-chat';
3
- import { InMemoryResources } from '@theia/core';
3
+ import { DisposableCollection, InMemoryResources } from '@theia/core';
4
4
  import { ContextMenuRenderer, LabelProvider, Message, ReactWidget } from '@theia/core/lib/browser';
5
5
  import * as React from '@theia/core/shared/react';
6
6
  import { IMouseEvent } from '@theia/monaco-editor-core';
@@ -9,7 +9,8 @@ import { MonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-pr
9
9
  import { AIVariableResolutionRequest } from '@theia/ai-core';
10
10
  import { FrontendVariableService } from '@theia/ai-core/lib/browser';
11
11
  import { ContextVariablePicker } from './context-variable-picker';
12
- type Query = (query: string, context?: AIVariableResolutionRequest[]) => Promise<void>;
12
+ import { ChangeSetActionService } from './change-set-actions/change-set-action-service';
13
+ type Query = (query: string) => Promise<void>;
13
14
  type Unpin = () => void;
14
15
  type Cancel = (requestModel: ChatRequestModel) => void;
15
16
  type DeleteChangeSet = (requestModel: ChatRequestModel) => void;
@@ -29,10 +30,10 @@ export declare class AIChatInputWidget extends ReactWidget {
29
30
  protected readonly variableService: FrontendVariableService;
30
31
  protected readonly labelProvider: LabelProvider;
31
32
  protected readonly contextVariablePicker: ContextVariablePicker;
33
+ protected readonly changeSetActionService: ChangeSetActionService;
32
34
  protected editorRef: MonacoEditor | undefined;
33
35
  private editorReady;
34
36
  protected isEnabled: boolean;
35
- protected context: AIVariableResolutionRequest[];
36
37
  private _onQuery;
37
38
  set onQuery(query: Query);
38
39
  private _onUnpin;
@@ -43,6 +44,7 @@ export declare class AIChatInputWidget extends ReactWidget {
43
44
  set onDeleteChangeSet(deleteChangeSet: DeleteChangeSet);
44
45
  private _onDeleteChangeSetElement;
45
46
  set onDeleteChangeSetElement(deleteChangeSetElement: DeleteChangeSetElement);
47
+ protected onDisposeForChatModel: DisposableCollection;
46
48
  private _chatModel;
47
49
  set chatModel(chatModel: ChatModel);
48
50
  private _pinnedAgent;
@@ -56,7 +58,7 @@ export declare class AIChatInputWidget extends ReactWidget {
56
58
  protected addContextElement(): void;
57
59
  protected deleteContextElement(index: number): void;
58
60
  protected handleContextMenu(event: IMouseEvent): void;
59
- addContext(variableRequest: AIVariableResolutionRequest): void;
61
+ addContext(variable: AIVariableResolutionRequest): void;
60
62
  }
61
63
  export {};
62
64
  //# sourceMappingURL=chat-input-widget.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-input-widget.d.ts","sourceRoot":"","sources":["../../src/browser/chat-input-widget.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-input-widget.d.ts","sourceRoot":"","sources":["../../src/browser/chat-input-widget.tsx"],"names":[],"mappings":"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"}
@@ -28,6 +28,7 @@ const monaco_editor_provider_1 = require("@theia/monaco/lib/browser/monaco-edito
28
28
  const chat_view_language_contribution_1 = require("./chat-view-language-contribution");
29
29
  const browser_2 = require("@theia/ai-core/lib/browser");
30
30
  const context_variable_picker_1 = require("./context-variable-picker");
31
+ const change_set_action_service_1 = require("./change-set-actions/change-set-action-service");
31
32
  exports.AIChatInputConfiguration = Symbol('AIChatInputConfiguration');
32
33
  let AIChatInputWidget = AIChatInputWidget_1 = class AIChatInputWidget extends browser_1.ReactWidget {
33
34
  constructor() {
@@ -35,7 +36,7 @@ let AIChatInputWidget = AIChatInputWidget_1 = class AIChatInputWidget extends br
35
36
  this.editorRef = undefined;
36
37
  this.editorReady = new promise_util_1.Deferred();
37
38
  this.isEnabled = false;
38
- this.context = [];
39
+ this.onDisposeForChatModel = new core_1.DisposableCollection();
39
40
  }
40
41
  set onQuery(query) {
41
42
  this._onQuery = query;
@@ -53,6 +54,13 @@ let AIChatInputWidget = AIChatInputWidget_1 = class AIChatInputWidget extends br
53
54
  this._onDeleteChangeSetElement = deleteChangeSetElement;
54
55
  }
55
56
  set chatModel(chatModel) {
57
+ this.onDisposeForChatModel.dispose();
58
+ this.onDisposeForChatModel = new core_1.DisposableCollection();
59
+ this.onDisposeForChatModel.push(chatModel.onDidChange(event => {
60
+ if (event.kind === 'addVariable' || event.kind === 'removeVariable') {
61
+ this.update();
62
+ }
63
+ }));
56
64
  this._chatModel = chatModel;
57
65
  this.update();
58
66
  }
@@ -75,10 +83,10 @@ let AIChatInputWidget = AIChatInputWidget_1 = class AIChatInputWidget extends br
75
83
  }
76
84
  render() {
77
85
  var _a, _b;
78
- return (React.createElement(ChatInput, { onQuery: this._onQuery.bind(this), onUnpin: this._onUnpin.bind(this), onCancel: this._onCancel.bind(this), onDragOver: this.onDragOver.bind(this), onDrop: this.onDrop.bind(this), onDeleteChangeSet: this._onDeleteChangeSet.bind(this), onDeleteChangeSetElement: this._onDeleteChangeSetElement.bind(this), onAddContextElement: this.addContextElement.bind(this), onDeleteContextElement: this.deleteContextElement.bind(this), context: this.context, chatModel: this._chatModel, pinnedAgent: this._pinnedAgent, editorProvider: this.editorProvider, resources: this.resources, contextMenuCallback: this.handleContextMenu.bind(this), isEnabled: this.isEnabled, setEditorRef: editor => {
86
+ return (React.createElement(ChatInput, { onQuery: this._onQuery.bind(this), onUnpin: this._onUnpin.bind(this), onCancel: this._onCancel.bind(this), onDragOver: this.onDragOver.bind(this), onDrop: this.onDrop.bind(this), onDeleteChangeSet: this._onDeleteChangeSet.bind(this), onDeleteChangeSetElement: this._onDeleteChangeSetElement.bind(this), onAddContextElement: this.addContextElement.bind(this), onDeleteContextElement: this.deleteContextElement.bind(this), context: this._chatModel.context.getVariables(), chatModel: this._chatModel, pinnedAgent: this._pinnedAgent, editorProvider: this.editorProvider, resources: this.resources, contextMenuCallback: this.handleContextMenu.bind(this), isEnabled: this.isEnabled, setEditorRef: editor => {
79
87
  this.editorRef = editor;
80
88
  this.editorReady.resolve();
81
- }, showContext: (_a = this.configuration) === null || _a === void 0 ? void 0 : _a.showContext, showPinnedAgent: (_b = this.configuration) === null || _b === void 0 ? void 0 : _b.showPinnedAgent, labelProvider: this.labelProvider }));
89
+ }, showContext: (_a = this.configuration) === null || _a === void 0 ? void 0 : _a.showContext, showPinnedAgent: (_b = this.configuration) === null || _b === void 0 ? void 0 : _b.showPinnedAgent, labelProvider: this.labelProvider, actionService: this.changeSetActionService }));
82
90
  }
83
91
  onDragOver(event) {
84
92
  var _a;
@@ -123,27 +131,23 @@ let AIChatInputWidget = AIChatInputWidget_1 = class AIChatInputWidget extends br
123
131
  addContextElement() {
124
132
  this.contextVariablePicker.pickContextVariable().then(contextElement => {
125
133
  if (contextElement) {
126
- this.addContext(contextElement);
134
+ this._chatModel.context.addVariables(contextElement);
127
135
  }
128
136
  });
129
137
  }
130
138
  deleteContextElement(index) {
131
- this.context.splice(index, 1);
132
- this.update();
139
+ this._chatModel.context.deleteVariables(index);
133
140
  }
134
141
  handleContextMenu(event) {
135
142
  this.contextMenuRenderer.render({
136
143
  menuPath: AIChatInputWidget_1.CONTEXT_MENU,
137
144
  anchor: { x: event.posx, y: event.posy },
145
+ context: event.target
138
146
  });
139
147
  event.preventDefault();
140
148
  }
141
- addContext(variableRequest) {
142
- if (this.context.some(existing => existing.variable.id === variableRequest.variable.id && existing.arg === variableRequest.arg)) {
143
- return;
144
- }
145
- this.context.push(variableRequest);
146
- this.update();
149
+ addContext(variable) {
150
+ this._chatModel.context.addVariables(variable);
147
151
  }
148
152
  };
149
153
  exports.AIChatInputWidget = AIChatInputWidget;
@@ -178,6 +182,10 @@ tslib_1.__decorate([
178
182
  (0, inversify_1.inject)(context_variable_picker_1.ContextVariablePicker),
179
183
  tslib_1.__metadata("design:type", context_variable_picker_1.ContextVariablePicker)
180
184
  ], AIChatInputWidget.prototype, "contextVariablePicker", void 0);
185
+ tslib_1.__decorate([
186
+ (0, inversify_1.inject)(change_set_action_service_1.ChangeSetActionService),
187
+ tslib_1.__metadata("design:type", change_set_action_service_1.ChangeSetActionService)
188
+ ], AIChatInputWidget.prototype, "changeSetActionService", void 0);
181
189
  tslib_1.__decorate([
182
190
  (0, inversify_1.postConstruct)(),
183
191
  tslib_1.__metadata("design:type", Function),
@@ -192,7 +200,9 @@ const ChatInput = (props) => {
192
200
  const onDeleteChangeSetElement = (index) => props.onDeleteChangeSetElement(props.chatModel.id, index);
193
201
  const [inProgress, setInProgress] = React.useState(false);
194
202
  const [isInputEmpty, setIsInputEmpty] = React.useState(true);
195
- const [changeSetUI, setChangeSetUI] = React.useState(() => props.chatModel.changeSet ? buildChangeSetUI(props.chatModel.changeSet, props.labelProvider, onDeleteChangeSet, onDeleteChangeSetElement) : undefined);
203
+ const [changeSetUI, setChangeSetUI] = React.useState(() => props.chatModel.changeSet
204
+ ? buildChangeSetUI(props.chatModel.changeSet, props.labelProvider, props.actionService.getActionsForChangeset(props.chatModel.changeSet), onDeleteChangeSet, onDeleteChangeSetElement)
205
+ : undefined);
196
206
  // eslint-disable-next-line no-null/no-null
197
207
  const editorContainerRef = React.useRef(null);
198
208
  // eslint-disable-next-line no-null/no-null
@@ -285,15 +295,17 @@ const ChatInput = (props) => {
285
295
  responseListenerRef.current = event.request.response.onDidChange(() => setInProgress(ai_chat_1.ChatRequestModel.isInProgress(event.request)));
286
296
  }
287
297
  else if (ai_chat_1.ChatChangeEvent.isChangeSetEvent(event)) {
288
- if (event.changeSet) {
289
- setChangeSetUI(buildChangeSetUI(event.changeSet, props.labelProvider, onDeleteChangeSet, onDeleteChangeSetElement));
290
- }
291
- else {
298
+ if (event.kind === 'removeChangeSet') {
292
299
  setChangeSetUI(undefined);
293
300
  }
301
+ else if (event.kind === 'setChangeSet' || 'updateChangeSet') {
302
+ setChangeSetUI(buildChangeSetUI(event.changeSet, props.labelProvider, props.actionService.getActionsForChangeset(event.changeSet), onDeleteChangeSet, onDeleteChangeSetElement));
303
+ }
294
304
  }
295
305
  });
296
- setChangeSetUI(props.chatModel.changeSet ? buildChangeSetUI(props.chatModel.changeSet, props.labelProvider, onDeleteChangeSet, onDeleteChangeSetElement) : undefined);
306
+ setChangeSetUI(props.chatModel.changeSet
307
+ ? buildChangeSetUI(props.chatModel.changeSet, props.labelProvider, props.actionService.getActionsForChangeset(props.chatModel.changeSet), onDeleteChangeSet, onDeleteChangeSetElement)
308
+ : undefined);
297
309
  return () => {
298
310
  var _a;
299
311
  listener === null || listener === void 0 ? void 0 : listener.dispose();
@@ -301,16 +313,26 @@ const ChatInput = (props) => {
301
313
  responseListenerRef.current = undefined;
302
314
  };
303
315
  }, [props.chatModel]);
304
- function submit(value) {
316
+ React.useEffect(() => {
317
+ const disposable = props.actionService.onDidChange(() => {
318
+ if (!props.chatModel.changeSet) {
319
+ return;
320
+ }
321
+ const newActions = props.actionService.getActionsForChangeset(props.chatModel.changeSet);
322
+ setChangeSetUI(current => !current ? current : { ...current, actions: newActions });
323
+ });
324
+ return () => disposable.dispose();
325
+ });
326
+ const submit = React.useCallback(function submit(value) {
305
327
  if (!value || value.trim().length === 0) {
306
328
  return;
307
329
  }
308
330
  setInProgress(true);
309
- props.onQuery(value, props.context);
331
+ props.onQuery(value);
310
332
  if (editorRef.current) {
311
333
  editorRef.current.document.textEditorModel.setValue('');
312
334
  }
313
- }
335
+ }, [props.context, props.onQuery, editorRef]);
314
336
  const onKeyDown = React.useCallback((event) => {
315
337
  var _a;
316
338
  if (!props.isEnabled) {
@@ -320,7 +342,7 @@ const ChatInput = (props) => {
320
342
  event.preventDefault();
321
343
  submit(((_a = editorRef.current) === null || _a === void 0 ? void 0 : _a.document.textEditorModel.getValue()) || '');
322
344
  }
323
- }, [props.isEnabled]);
345
+ }, [props.isEnabled, submit]);
324
346
  const handleInputFocus = () => {
325
347
  hidePlaceholderIfEditorFilled();
326
348
  };
@@ -418,15 +440,14 @@ const noPropagation = (handler) => (e) => {
418
440
  handler();
419
441
  e.stopPropagation();
420
442
  };
421
- const buildChangeSetUI = (changeSet, labelProvider, onDeleteChangeSet, onDeleteChangeSetElement) => ({
443
+ const buildChangeSetUI = (changeSet, labelProvider, actions, onDeleteChangeSet, onDeleteChangeSetElement) => ({
422
444
  title: changeSet.title,
423
- disabled: !hasPendingElementsToAccept(changeSet),
424
- applyAllPendingElements: () => applyAllPendingElements(changeSet),
425
- delete: () => onDeleteChangeSet(),
445
+ changeSet,
446
+ deleteChangeSet: onDeleteChangeSet,
426
447
  elements: changeSet.getElements().map(element => {
427
448
  var _a, _b, _c, _d, _e, _f, _g, _h;
428
449
  return ({
429
- open: (_a = element === null || element === void 0 ? void 0 : element.open) === null || _a === void 0 ? void 0 : _a.bind(element),
450
+ open: (_a = element.open) === null || _a === void 0 ? void 0 : _a.bind(element),
430
451
  iconClass: (_c = (_b = element.icon) !== null && _b !== void 0 ? _b : labelProvider.getIcon(element.uri)) !== null && _c !== void 0 ? _c : labelProvider.fileIcon,
431
452
  nameClass: `${element.type} ${element.state}`,
432
453
  name: (_d = element.name) !== null && _d !== void 0 ? _d : labelProvider.getName(element.uri),
@@ -436,16 +457,18 @@ const buildChangeSetUI = (changeSet, labelProvider, onDeleteChangeSet, onDeleteC
436
457
  revert: element.state === 'applied' || element.state === 'stale' ? (_h = element === null || element === void 0 ? void 0 : element.revert) === null || _h === void 0 ? void 0 : _h.bind(element) : undefined,
437
458
  delete: () => onDeleteChangeSetElement(changeSet.getElements().indexOf(element))
438
459
  });
439
- })
460
+ }),
461
+ actions
440
462
  });
441
- const ChangeSetBox = ({ changeSet }) => (React.createElement("div", { className: 'theia-ChatInput-ChangeSet-Box' },
463
+ /** Memo because the parent element rerenders on every key press in the chat widget. */
464
+ const ChangeSetBox = React.memo(({ changeSet: { changeSet, title, deleteChangeSet, elements, actions } }) => (React.createElement("div", { className: 'theia-ChatInput-ChangeSet-Box' },
442
465
  React.createElement("div", { className: 'theia-ChatInput-ChangeSet-Header' },
443
- React.createElement("h3", null, changeSet.title),
466
+ React.createElement("h3", null, title),
444
467
  React.createElement("div", { className: 'theia-ChatInput-ChangeSet-Header-Actions' },
445
- React.createElement("button", { className: 'theia-button', disabled: changeSet.disabled, title: core_1.nls.localize('theia/ai/chat-ui/applyAllTitle', 'Apply all pending suggestions'), onClick: () => changeSet.applyAllPendingElements() }, core_1.nls.localize('theia/ai/chat-ui/acceptAll', 'Apply All')),
446
- React.createElement("span", { className: 'codicon codicon-close action', title: core_1.nls.localize('theia/ai/chat-ui/deleteChangeSet', 'Delete Change Set'), onClick: () => changeSet.delete() }))),
468
+ actions.map(action => React.createElement("div", { key: action.id, className: 'theia-changeSet-Action' }, action.render(changeSet))),
469
+ React.createElement("span", { className: 'codicon codicon-close action', title: core_1.nls.localize('theia/ai/chat-ui/deleteChangeSet', 'Delete Change Set'), onClick: () => deleteChangeSet() }))),
447
470
  React.createElement("div", { className: 'theia-ChatInput-ChangeSet-List' },
448
- React.createElement("ul", null, changeSet.elements.map((element, index) => (React.createElement("li", { key: index, title: core_1.nls.localize('theia/ai/chat-ui/openDiff', 'Open Diff'), onClick: () => { var _a; return (_a = element.openChange) === null || _a === void 0 ? void 0 : _a.call(element); } },
471
+ React.createElement("ul", null, elements.map((element, index) => (React.createElement("li", { key: index, title: core_1.nls.localize('theia/ai/chat-ui/openDiff', 'Open Diff'), onClick: () => { var _a; return (_a = element.openChange) === null || _a === void 0 ? void 0 : _a.call(element); } },
449
472
  React.createElement("div", { className: `theia-ChatInput-ChangeSet-Icon ${element.iconClass}` }),
450
473
  React.createElement("span", { className: 'theia-ChatInput-ChangeSet-labelParts' },
451
474
  React.createElement("span", { className: `theia-ChatInput-ChangeSet-title ${element.nameClass}` }, element.name),
@@ -454,7 +477,7 @@ const ChangeSetBox = ({ changeSet }) => (React.createElement("div", { className:
454
477
  element.open && (React.createElement("span", { className: 'codicon codicon-file action', title: core_1.nls.localize('theia/ai/chat-ui/openOriginalFile', 'Open Original File'), onClick: noPropagation(() => element.open()) })),
455
478
  element.revert && (React.createElement("span", { className: 'codicon codicon-discard action', title: core_1.nls.localizeByDefault('Revert'), onClick: noPropagation(() => element.revert()) })),
456
479
  element.apply && (React.createElement("span", { className: 'codicon codicon-check action', title: core_1.nls.localizeByDefault('Apply'), onClick: noPropagation(() => element.apply()) })),
457
- React.createElement("span", { className: 'codicon codicon-close action', title: core_1.nls.localizeByDefault('Delete'), onClick: noPropagation(() => element.delete()) })))))))));
480
+ React.createElement("span", { className: 'codicon codicon-close action', title: core_1.nls.localizeByDefault('Delete'), onClick: noPropagation(() => element.delete()) }))))))))));
458
481
  const ChatInputOptions = ({ leftOptions, rightOptions }) => (React.createElement("div", { className: "theia-ChatInputOptions" },
459
482
  React.createElement("div", { className: "theia-ChatInputOptions-left" }, leftOptions.map((option, index) => {
460
483
  var _a, _b;
@@ -468,15 +491,6 @@ const ChatInputOptions = ({ leftOptions, rightOptions }) => (React.createElement
468
491
  React.createElement("span", null, (_b = option.text) === null || _b === void 0 ? void 0 : _b.content),
469
492
  React.createElement("span", { className: `codicon ${option.className}` })));
470
493
  }))));
471
- function applyAllPendingElements(changeSet) {
472
- getPendingElements(changeSet).forEach(e => e.apply());
473
- }
474
- function hasPendingElementsToAccept(changeSet) {
475
- return getPendingElements(changeSet).length > 0;
476
- }
477
- function getPendingElements(changeSet) {
478
- return changeSet.getElements().filter(e => e.apply && (e.state === undefined || e.state === 'pending'));
479
- }
480
494
  function getLatestRequest(chatModel) {
481
495
  const requests = chatModel.getRequests();
482
496
  return requests.length > 0 ? requests[requests.length - 1] : undefined;