@theia/ai-ide 1.76.0-next.7 → 1.76.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 (174) hide show
  1. package/lib/browser/ai-allow-all-mode-chat-banner.js +1 -1
  2. package/lib/browser/ai-allow-all-mode-chat-banner.js.map +1 -1
  3. package/lib/browser/ai-aware-scm-commit-widget.d.ts +27 -0
  4. package/lib/browser/ai-aware-scm-commit-widget.d.ts.map +1 -0
  5. package/lib/browser/ai-aware-scm-commit-widget.js +142 -0
  6. package/lib/browser/ai-aware-scm-commit-widget.js.map +1 -0
  7. package/lib/browser/ai-configuration/ai-configuration-detail-widget.d.ts +10 -4
  8. package/lib/browser/ai-configuration/ai-configuration-detail-widget.d.ts.map +1 -1
  9. package/lib/browser/ai-configuration/ai-configuration-detail-widget.js +12 -7
  10. package/lib/browser/ai-configuration/ai-configuration-detail-widget.js.map +1 -1
  11. package/lib/browser/ai-configuration/ai-configuration-detail-widget.spec.js +14 -14
  12. package/lib/browser/ai-configuration/ai-configuration-detail-widget.spec.js.map +1 -1
  13. package/lib/browser/ai-configuration/ai-configuration-tree-widget.d.ts +6 -0
  14. package/lib/browser/ai-configuration/ai-configuration-tree-widget.d.ts.map +1 -1
  15. package/lib/browser/ai-configuration/ai-configuration-tree-widget.js +9 -0
  16. package/lib/browser/ai-configuration/ai-configuration-tree-widget.js.map +1 -1
  17. package/lib/browser/ai-configuration/categories/agent-capabilities-settings.d.ts.map +1 -1
  18. package/lib/browser/ai-configuration/categories/agent-capabilities-settings.js +2 -1
  19. package/lib/browser/ai-configuration/categories/agent-capabilities-settings.js.map +1 -1
  20. package/lib/browser/ai-configuration/categories/agent-chips.js +1 -1
  21. package/lib/browser/ai-configuration/categories/agent-chips.js.map +1 -1
  22. package/lib/browser/ai-configuration/categories/model-aliases-configuration-category.d.ts +8 -0
  23. package/lib/browser/ai-configuration/categories/model-aliases-configuration-category.d.ts.map +1 -1
  24. package/lib/browser/ai-configuration/categories/model-aliases-configuration-category.js +27 -8
  25. package/lib/browser/ai-configuration/categories/model-aliases-configuration-category.js.map +1 -1
  26. package/lib/browser/ai-configuration/categories/model-aliases-configuration-category.spec.js +38 -2
  27. package/lib/browser/ai-configuration/categories/model-aliases-configuration-category.spec.js.map +1 -1
  28. package/lib/browser/ai-configuration/categories/models-configuration-category.d.ts +13 -2
  29. package/lib/browser/ai-configuration/categories/models-configuration-category.d.ts.map +1 -1
  30. package/lib/browser/ai-configuration/categories/models-configuration-category.js +41 -2
  31. package/lib/browser/ai-configuration/categories/models-configuration-category.js.map +1 -1
  32. package/lib/browser/ai-configuration/categories/models-configuration-category.spec.js +32 -2
  33. package/lib/browser/ai-configuration/categories/models-configuration-category.spec.js.map +1 -1
  34. package/lib/browser/ai-configuration/categories/provider-model-discovery-section.d.ts +26 -0
  35. package/lib/browser/ai-configuration/categories/provider-model-discovery-section.d.ts.map +1 -0
  36. package/lib/browser/ai-configuration/categories/provider-model-discovery-section.js +212 -0
  37. package/lib/browser/ai-configuration/categories/provider-model-discovery-section.js.map +1 -0
  38. package/lib/browser/ai-configuration/categories/provider-model-discovery-section.spec.d.ts +2 -0
  39. package/lib/browser/ai-configuration/categories/provider-model-discovery-section.spec.d.ts.map +1 -0
  40. package/lib/browser/ai-configuration/categories/provider-model-discovery-section.spec.js +423 -0
  41. package/lib/browser/ai-configuration/categories/provider-model-discovery-section.spec.js.map +1 -0
  42. package/lib/browser/ai-configuration/language-model-renderer.d.ts.map +1 -1
  43. package/lib/browser/ai-configuration/language-model-renderer.js +10 -3
  44. package/lib/browser/ai-configuration/language-model-renderer.js.map +1 -1
  45. package/lib/browser/ai-getting-started-commands.d.ts +10 -0
  46. package/lib/browser/ai-getting-started-commands.d.ts.map +1 -0
  47. package/lib/browser/ai-getting-started-commands.js +34 -0
  48. package/lib/browser/ai-getting-started-commands.js.map +1 -0
  49. package/lib/browser/ai-getting-started-contribution.d.ts +20 -0
  50. package/lib/browser/ai-getting-started-contribution.d.ts.map +1 -0
  51. package/lib/browser/ai-getting-started-contribution.js +70 -0
  52. package/lib/browser/ai-getting-started-contribution.js.map +1 -0
  53. package/lib/browser/ai-getting-started-walkthrough.d.ts +41 -0
  54. package/lib/browser/ai-getting-started-walkthrough.d.ts.map +1 -0
  55. package/lib/browser/ai-getting-started-walkthrough.js +225 -0
  56. package/lib/browser/ai-getting-started-walkthrough.js.map +1 -0
  57. package/lib/browser/ai-getting-started-walkthrough.spec.d.ts +2 -0
  58. package/lib/browser/ai-getting-started-walkthrough.spec.d.ts.map +1 -0
  59. package/lib/browser/ai-getting-started-walkthrough.spec.js +124 -0
  60. package/lib/browser/ai-getting-started-walkthrough.spec.js.map +1 -0
  61. package/lib/browser/ai-walkthrough-context-keys.d.ts +55 -0
  62. package/lib/browser/ai-walkthrough-context-keys.d.ts.map +1 -0
  63. package/lib/browser/ai-walkthrough-context-keys.js +145 -0
  64. package/lib/browser/ai-walkthrough-context-keys.js.map +1 -0
  65. package/lib/browser/ai-walkthrough-context-keys.spec.d.ts +2 -0
  66. package/lib/browser/ai-walkthrough-context-keys.spec.d.ts.map +1 -0
  67. package/lib/browser/ai-walkthrough-context-keys.spec.js +166 -0
  68. package/lib/browser/ai-walkthrough-context-keys.spec.js.map +1 -0
  69. package/lib/browser/chat-session-item.js +2 -2
  70. package/lib/browser/chat-session-item.js.map +1 -1
  71. package/lib/browser/commit-message-agent.d.ts +31 -0
  72. package/lib/browser/commit-message-agent.d.ts.map +1 -0
  73. package/lib/browser/commit-message-agent.js +99 -0
  74. package/lib/browser/commit-message-agent.js.map +1 -0
  75. package/lib/browser/commit-message-agent.spec.d.ts +2 -0
  76. package/lib/browser/commit-message-agent.spec.d.ts.map +1 -0
  77. package/lib/browser/commit-message-agent.spec.js +82 -0
  78. package/lib/browser/commit-message-agent.spec.js.map +1 -0
  79. package/lib/browser/commit-message-command-contribution.d.ts +15 -0
  80. package/lib/browser/commit-message-command-contribution.d.ts.map +1 -0
  81. package/lib/browser/commit-message-command-contribution.js +73 -0
  82. package/lib/browser/commit-message-command-contribution.js.map +1 -0
  83. package/lib/browser/commit-message-commands.d.ts +5 -0
  84. package/lib/browser/commit-message-commands.d.ts.map +1 -0
  85. package/lib/browser/commit-message-commands.js +28 -0
  86. package/lib/browser/commit-message-commands.js.map +1 -0
  87. package/lib/browser/commit-message-prompt-template.d.ts +11 -0
  88. package/lib/browser/commit-message-prompt-template.d.ts.map +1 -0
  89. package/lib/browser/commit-message-prompt-template.js +63 -0
  90. package/lib/browser/commit-message-prompt-template.js.map +1 -0
  91. package/lib/browser/commit-message-runner.d.ts +41 -0
  92. package/lib/browser/commit-message-runner.d.ts.map +1 -0
  93. package/lib/browser/commit-message-runner.js +143 -0
  94. package/lib/browser/commit-message-runner.js.map +1 -0
  95. package/lib/browser/commit-message-runner.spec.d.ts +2 -0
  96. package/lib/browser/commit-message-runner.spec.d.ts.map +1 -0
  97. package/lib/browser/commit-message-runner.spec.js +206 -0
  98. package/lib/browser/commit-message-runner.spec.js.map +1 -0
  99. package/lib/browser/frontend-module.d.ts.map +1 -1
  100. package/lib/browser/frontend-module.js +25 -0
  101. package/lib/browser/frontend-module.js.map +1 -1
  102. package/lib/browser/git-changes-tool.d.ts +73 -0
  103. package/lib/browser/git-changes-tool.d.ts.map +1 -0
  104. package/lib/browser/git-changes-tool.js +217 -0
  105. package/lib/browser/git-changes-tool.js.map +1 -0
  106. package/lib/browser/git-changes-tool.spec.d.ts +2 -0
  107. package/lib/browser/git-changes-tool.spec.d.ts.map +1 -0
  108. package/lib/browser/git-changes-tool.spec.js +167 -0
  109. package/lib/browser/git-changes-tool.spec.js.map +1 -0
  110. package/lib/browser/ide-chat-welcome-message-provider.d.ts +26 -28
  111. package/lib/browser/ide-chat-welcome-message-provider.d.ts.map +1 -1
  112. package/lib/browser/ide-chat-welcome-message-provider.js +61 -151
  113. package/lib/browser/ide-chat-welcome-message-provider.js.map +1 -1
  114. package/lib/browser/review/pr-review-capability-contribution.js +1 -1
  115. package/lib/browser/review/pr-review-capability-contribution.js.map +1 -1
  116. package/lib/browser/user-interaction-tool-renderer.d.ts +6 -0
  117. package/lib/browser/user-interaction-tool-renderer.d.ts.map +1 -1
  118. package/lib/browser/user-interaction-tool-renderer.js +36 -7
  119. package/lib/browser/user-interaction-tool-renderer.js.map +1 -1
  120. package/lib/browser/user-interaction-tool.d.ts +23 -1
  121. package/lib/browser/user-interaction-tool.d.ts.map +1 -1
  122. package/lib/browser/user-interaction-tool.js +56 -17
  123. package/lib/browser/user-interaction-tool.js.map +1 -1
  124. package/lib/browser/user-interaction-tool.spec.js +151 -2
  125. package/lib/browser/user-interaction-tool.spec.js.map +1 -1
  126. package/lib/common/command-prompt-template.js +1 -1
  127. package/lib/common/user-interaction-tool.d.ts +19 -1
  128. package/lib/common/user-interaction-tool.d.ts.map +1 -1
  129. package/lib/common/user-interaction-tool.js +100 -29
  130. package/lib/common/user-interaction-tool.js.map +1 -1
  131. package/lib/common/user-interaction-tool.spec.js +215 -174
  132. package/lib/common/user-interaction-tool.spec.js.map +1 -1
  133. package/package.json +26 -25
  134. package/src/browser/ai-allow-all-mode-chat-banner.tsx +2 -2
  135. package/src/browser/ai-aware-scm-commit-widget.tsx +153 -0
  136. package/src/browser/ai-configuration/ai-configuration-detail-widget.spec.ts +14 -14
  137. package/src/browser/ai-configuration/ai-configuration-detail-widget.tsx +12 -7
  138. package/src/browser/ai-configuration/ai-configuration-tree-widget.tsx +8 -0
  139. package/src/browser/ai-configuration/categories/agent-capabilities-settings.tsx +7 -8
  140. package/src/browser/ai-configuration/categories/agent-chips.tsx +1 -1
  141. package/src/browser/ai-configuration/categories/model-aliases-configuration-category.spec.ts +40 -2
  142. package/src/browser/ai-configuration/categories/model-aliases-configuration-category.tsx +31 -10
  143. package/src/browser/ai-configuration/categories/models-configuration-category.spec.ts +47 -2
  144. package/src/browser/ai-configuration/categories/models-configuration-category.tsx +52 -5
  145. package/src/browser/ai-configuration/categories/provider-model-discovery-section.spec.tsx +451 -0
  146. package/src/browser/ai-configuration/categories/provider-model-discovery-section.tsx +341 -0
  147. package/src/browser/ai-configuration/language-model-renderer.tsx +11 -3
  148. package/src/browser/ai-getting-started-commands.ts +33 -0
  149. package/src/browser/ai-getting-started-contribution.ts +64 -0
  150. package/src/browser/ai-getting-started-walkthrough.spec.ts +146 -0
  151. package/src/browser/ai-getting-started-walkthrough.ts +249 -0
  152. package/src/browser/ai-walkthrough-context-keys.spec.ts +209 -0
  153. package/src/browser/ai-walkthrough-context-keys.ts +147 -0
  154. package/src/browser/chat-session-item.tsx +2 -2
  155. package/src/browser/commit-message-agent.spec.ts +97 -0
  156. package/src/browser/commit-message-agent.ts +113 -0
  157. package/src/browser/commit-message-command-contribution.ts +67 -0
  158. package/src/browser/commit-message-commands.ts +25 -0
  159. package/src/browser/commit-message-prompt-template.ts +65 -0
  160. package/src/browser/commit-message-runner.spec.ts +266 -0
  161. package/src/browser/commit-message-runner.ts +163 -0
  162. package/src/browser/frontend-module.ts +27 -0
  163. package/src/browser/git-changes-tool.spec.ts +200 -0
  164. package/src/browser/git-changes-tool.ts +239 -0
  165. package/src/browser/ide-chat-welcome-message-provider.tsx +93 -230
  166. package/src/browser/review/pr-review-capability-contribution.ts +1 -1
  167. package/src/browser/style/commit-message-overlay.css +64 -0
  168. package/src/browser/style/index.css +4 -42
  169. package/src/browser/user-interaction-tool-renderer.tsx +38 -8
  170. package/src/browser/user-interaction-tool.spec.ts +201 -2
  171. package/src/browser/user-interaction-tool.ts +69 -18
  172. package/src/common/command-prompt-template.ts +1 -1
  173. package/src/common/user-interaction-tool.spec.ts +217 -161
  174. package/src/common/user-interaction-tool.ts +127 -32
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 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
+ const chai_1 = require("chai");
19
+ const sinon = require("sinon");
20
+ const inversify_1 = require("@theia/core/shared/inversify");
21
+ const ai_core_1 = require("@theia/ai-core");
22
+ const commit_message_agent_1 = require("./commit-message-agent");
23
+ const commit_message_prompt_template_1 = require("./commit-message-prompt-template");
24
+ describe('CommitMessageAgent', () => {
25
+ let container;
26
+ let agent;
27
+ let registry;
28
+ let promptService;
29
+ let languageModelService;
30
+ const fakeModel = {};
31
+ beforeEach(() => {
32
+ container = new inversify_1.Container();
33
+ registry = { selectLanguageModel: sinon.stub().resolves(fakeModel) };
34
+ promptService = {
35
+ getResolvedPromptFragmentWithoutFunctions: sinon.stub().callsFake((id) => Promise.resolve({ text: `resolved:${id}` })),
36
+ getPromptVariantInfo: sinon.stub().returns(undefined)
37
+ };
38
+ languageModelService = { sendRequest: sinon.stub().resolves({ text: 'feat: add thing\n' }) };
39
+ container.bind(ai_core_1.LanguageModelRegistry).toConstantValue(registry);
40
+ container.bind(ai_core_1.PromptService).toConstantValue(promptService);
41
+ container.bind(ai_core_1.LanguageModelService).toConstantValue(languageModelService);
42
+ container.bind(commit_message_agent_1.CommitMessageAgent).toSelf();
43
+ agent = container.get(commit_message_agent_1.CommitMessageAgent);
44
+ });
45
+ afterEach(() => sinon.restore());
46
+ it('is a plain agent that exposes no functions', () => {
47
+ (0, chai_1.expect)(agent.functions).to.be.empty;
48
+ });
49
+ it('resolves both prompts, sends the request and returns the trimmed message', async () => {
50
+ const result = await agent.generateCommitMessage('the diff');
51
+ (0, chai_1.expect)(result).to.equal('feat: add thing');
52
+ (0, chai_1.expect)(promptService.getResolvedPromptFragmentWithoutFunctions.calledWith(commit_message_prompt_template_1.COMMIT_MESSAGE_SYSTEM_PROMPT_ID)).to.be.true;
53
+ (0, chai_1.expect)(promptService.getResolvedPromptFragmentWithoutFunctions.calledWith(commit_message_prompt_template_1.COMMIT_MESSAGE_USER_PROMPT_ID)).to.be.true;
54
+ (0, chai_1.expect)(languageModelService.sendRequest.calledOnce).to.be.true;
55
+ });
56
+ it('injects the diff into the prompt parameters', async () => {
57
+ await agent.generateCommitMessage('the diff');
58
+ const [, params] = promptService.getResolvedPromptFragmentWithoutFunctions.firstCall.args;
59
+ (0, chai_1.expect)(params).to.deep.equal({ changes: 'the diff' });
60
+ });
61
+ it('sends a system and a user message tagged with the agent id and the cancellation token', async () => {
62
+ const token = { isCancellationRequested: false };
63
+ await agent.generateCommitMessage('the diff', token);
64
+ const request = languageModelService.sendRequest.firstCall.args[1];
65
+ (0, chai_1.expect)(request.agentId).to.equal(agent.id);
66
+ (0, chai_1.expect)(request.cancellationToken).to.equal(token);
67
+ (0, chai_1.expect)(request.messages.map(m => m.actor)).to.deep.equal(['system', 'user']);
68
+ });
69
+ it('throws when no language model is available', async () => {
70
+ registry.selectLanguageModel.resolves(undefined);
71
+ const error = await agent.generateCommitMessage('the diff').then(() => undefined, e => e);
72
+ (0, chai_1.expect)(error).to.be.instanceOf(Error);
73
+ (0, chai_1.expect)(error.message).to.match(/No language model/);
74
+ });
75
+ it('throws when the prompts cannot be resolved', async () => {
76
+ promptService.getResolvedPromptFragmentWithoutFunctions.resolves(undefined);
77
+ const error = await agent.generateCommitMessage('the diff').then(() => undefined, e => e);
78
+ (0, chai_1.expect)(error).to.be.instanceOf(Error);
79
+ (0, chai_1.expect)(error.message).to.match(/prompt service/);
80
+ });
81
+ });
82
+ //# sourceMappingURL=commit-message-agent.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message-agent.spec.js","sourceRoot":"","sources":["../../src/browser/commit-message-agent.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { CommandContribution, CommandRegistry } from '@theia/core';
2
+ import { AgentService } from '@theia/ai-core/lib/common';
3
+ import { AICommandHandlerFactory } from '@theia/ai-core/lib/browser';
4
+ import { ScmService } from '@theia/scm/lib/browser/scm-service';
5
+ import { CommitMessageRunner } from './commit-message-runner';
6
+ export declare class CommitMessageCommandContribution implements CommandContribution {
7
+ protected readonly runner: CommitMessageRunner;
8
+ protected readonly scmService: ScmService;
9
+ protected readonly agentService: AgentService;
10
+ protected readonly commandHandlerFactory: AICommandHandlerFactory;
11
+ registerCommands(registry: CommandRegistry): void;
12
+ protected execute(): void | Promise<void>;
13
+ protected isEnabled(): boolean;
14
+ }
15
+ //# sourceMappingURL=commit-message-command-contribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message-command-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/commit-message-command-contribution.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAGhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,qBACa,gCAAiC,YAAW,mBAAmB;IAGxE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAG/C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAG1C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IAG9C,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;IAElE,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAOjD,SAAS,CAAC,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzC,SAAS,CAAC,SAAS,IAAI,OAAO;CAWjC"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 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.CommitMessageCommandContribution = void 0;
19
+ const tslib_1 = require("tslib");
20
+ const inversify_1 = require("@theia/core/shared/inversify");
21
+ const common_1 = require("@theia/ai-core/lib/common");
22
+ const browser_1 = require("@theia/ai-core/lib/browser");
23
+ const scm_service_1 = require("@theia/scm/lib/browser/scm-service");
24
+ const commit_message_agent_1 = require("./commit-message-agent");
25
+ const commit_message_commands_1 = require("./commit-message-commands");
26
+ const commit_message_runner_1 = require("./commit-message-runner");
27
+ let CommitMessageCommandContribution = class CommitMessageCommandContribution {
28
+ registerCommands(registry) {
29
+ registry.registerCommand(commit_message_commands_1.CommitMessageCommands.GENERATE_FROM_STAGED, this.commandHandlerFactory({
30
+ execute: () => this.execute(),
31
+ isEnabled: () => this.isEnabled()
32
+ }));
33
+ }
34
+ execute() {
35
+ if (this.runner.isRunning()) {
36
+ this.runner.cancel();
37
+ return;
38
+ }
39
+ return this.runner.run();
40
+ }
41
+ isEnabled() {
42
+ // While a generation is in flight the command cancels it, which must stay possible even
43
+ // once the git extension has disabled the commit input for an ongoing commit.
44
+ if (this.runner.isRunning()) {
45
+ return true;
46
+ }
47
+ const repository = this.scmService.selectedRepository;
48
+ return !!repository
49
+ && repository.input.enabled
50
+ && this.agentService.isEnabled(commit_message_agent_1.COMMIT_MESSAGE_AGENT_ID);
51
+ }
52
+ };
53
+ exports.CommitMessageCommandContribution = CommitMessageCommandContribution;
54
+ tslib_1.__decorate([
55
+ (0, inversify_1.inject)(commit_message_runner_1.CommitMessageRunner),
56
+ tslib_1.__metadata("design:type", commit_message_runner_1.CommitMessageRunner)
57
+ ], CommitMessageCommandContribution.prototype, "runner", void 0);
58
+ tslib_1.__decorate([
59
+ (0, inversify_1.inject)(scm_service_1.ScmService),
60
+ tslib_1.__metadata("design:type", scm_service_1.ScmService)
61
+ ], CommitMessageCommandContribution.prototype, "scmService", void 0);
62
+ tslib_1.__decorate([
63
+ (0, inversify_1.inject)(common_1.AgentService),
64
+ tslib_1.__metadata("design:type", Object)
65
+ ], CommitMessageCommandContribution.prototype, "agentService", void 0);
66
+ tslib_1.__decorate([
67
+ (0, inversify_1.inject)(browser_1.AICommandHandlerFactory),
68
+ tslib_1.__metadata("design:type", Function)
69
+ ], CommitMessageCommandContribution.prototype, "commandHandlerFactory", void 0);
70
+ exports.CommitMessageCommandContribution = CommitMessageCommandContribution = tslib_1.__decorate([
71
+ (0, inversify_1.injectable)()
72
+ ], CommitMessageCommandContribution);
73
+ //# sourceMappingURL=commit-message-command-contribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message-command-contribution.js","sourceRoot":"","sources":["../../src/browser/commit-message-command-contribution.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAGhF,4DAAkE;AAClE,sDAAyD;AACzD,wDAAqE;AACrE,oEAAgE;AAChE,iEAAiE;AACjE,uEAAkE;AAClE,mEAA8D;AAGvD,IAAM,gCAAgC,GAAtC,MAAM,gCAAgC;IAczC,gBAAgB,CAAC,QAAyB;QACtC,QAAQ,CAAC,eAAe,CAAC,+CAAqB,CAAC,oBAAoB,EAAE,IAAI,CAAC,qBAAqB,CAAC;YAC5F,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;YAC7B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE;SACpC,CAAC,CAAC,CAAC;IACR,CAAC;IAES,OAAO;QACb,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO;QACX,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IAC7B,CAAC;IAES,SAAS;QACf,wFAAwF;QACxF,8EAA8E;QAC9E,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;QACtD,OAAO,CAAC,CAAC,UAAU;eACZ,UAAU,CAAC,KAAK,CAAC,OAAO;eACxB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,8CAAuB,CAAC,CAAC;IAChE,CAAC;CACJ,CAAA;AAxCY,4EAAgC;AAGtB;IADlB,IAAA,kBAAM,EAAC,2CAAmB,CAAC;sCACD,2CAAmB;gEAAC;AAG5B;IADlB,IAAA,kBAAM,EAAC,wBAAU,CAAC;sCACY,wBAAU;oEAAC;AAGvB;IADlB,IAAA,kBAAM,EAAC,qBAAY,CAAC;;sEACyB;AAG3B;IADlB,IAAA,kBAAM,EAAC,iCAAuB,CAAC;;+EACkC;2CAZzD,gCAAgC;IAD5C,IAAA,sBAAU,GAAE;GACA,gCAAgC,CAwC5C"}
@@ -0,0 +1,5 @@
1
+ import { Command } from '@theia/core';
2
+ export declare namespace CommitMessageCommands {
3
+ const GENERATE_FROM_STAGED: Command;
4
+ }
5
+ //# sourceMappingURL=commit-message-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message-commands.d.ts","sourceRoot":"","sources":["../../src/browser/commit-message-commands.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,yBAAiB,qBAAqB,CAAC;IAC5B,MAAM,oBAAoB,EAAE,OAImB,CAAC;CAC1D"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 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.CommitMessageCommands = void 0;
19
+ const core_1 = require("@theia/core");
20
+ var CommitMessageCommands;
21
+ (function (CommitMessageCommands) {
22
+ CommitMessageCommands.GENERATE_FROM_STAGED = core_1.Command.toLocalizedCommand({
23
+ id: 'ai-ide.commit-message.generate-from-staged',
24
+ category: 'AI',
25
+ label: 'Generate Commit Message from Staged Changes'
26
+ }, 'theia/ai-ide/commit-message/generate-from-staged');
27
+ })(CommitMessageCommands || (exports.CommitMessageCommands = CommitMessageCommands = {}));
28
+ //# sourceMappingURL=commit-message-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message-commands.js","sourceRoot":"","sources":["../../src/browser/commit-message-commands.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,sCAAsC;AAEtC,IAAiB,qBAAqB,CAMrC;AAND,WAAiB,qBAAqB;IACrB,0CAAoB,GAAY,cAAO,CAAC,kBAAkB,CAAC;QACpE,EAAE,EAAE,4CAA4C;QAChD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,6CAA6C;KACvD,EAAE,kDAAkD,CAAC,CAAC;AAC3D,CAAC,EANgB,qBAAqB,qCAArB,qBAAqB,QAMrC"}
@@ -0,0 +1,11 @@
1
+ import { BasePromptFragment } from '@theia/ai-core/lib/common';
2
+ export declare const COMMIT_MESSAGE_SYSTEM_PROMPT_ID = "commit-message-system";
3
+ export declare const COMMIT_MESSAGE_USER_PROMPT_ID = "commit-message-user";
4
+ export declare const commitMessageSystemPrompt: BasePromptFragment;
5
+ export declare const commitMessageUserPrompt: BasePromptFragment;
6
+ export declare const commitMessagePrompts: {
7
+ id: string;
8
+ defaultVariant: BasePromptFragment;
9
+ variants: never[];
10
+ }[];
11
+ //# sourceMappingURL=commit-message-prompt-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message-prompt-template.d.ts","sourceRoot":"","sources":["../../src/browser/commit-message-prompt-template.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,eAAO,MAAM,+BAA+B,0BAA0B,CAAC;AACvE,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;AAEnE,eAAO,MAAM,yBAAyB,EAAE,kBA4BvC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,kBAQrC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;GAGhC,CAAC"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 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.commitMessagePrompts = exports.commitMessageUserPrompt = exports.commitMessageSystemPrompt = exports.COMMIT_MESSAGE_USER_PROMPT_ID = exports.COMMIT_MESSAGE_SYSTEM_PROMPT_ID = void 0;
19
+ exports.COMMIT_MESSAGE_SYSTEM_PROMPT_ID = 'commit-message-system';
20
+ exports.COMMIT_MESSAGE_USER_PROMPT_ID = 'commit-message-user';
21
+ exports.commitMessageSystemPrompt = {
22
+ id: exports.COMMIT_MESSAGE_SYSTEM_PROMPT_ID,
23
+ template: `# Role
24
+
25
+ You are an assistant that produces **git commit messages** from a unified diff of changes in a
26
+ workspace's git repository. The diff is provided to you directly in the user message.
27
+
28
+ # Output Format
29
+
30
+ Return ONLY the commit message text. Nothing else.
31
+
32
+ - **No** markdown headings, no quotes, no code fences, no preamble like "Here is …".
33
+ - First line is the **subject**:
34
+ - imperative mood ("Add", "Fix", "Refactor", not "Added"/"Adds")
35
+ - prefer the **Conventional Commits** style where appropriate, e.g. \`feat:\`, \`fix:\`, \`refactor:\`, \`docs:\`, \`test:\`, \`chore:\`, \`build:\`, \`ci:\`, \`perf:\`
36
+ - at most 72 characters
37
+ - no trailing period
38
+ - If a body is needed to explain the *why* or non-obvious *what*, separate it from the subject with a single blank line.
39
+ Wrap body lines at ~72 characters. Use bullet lists (\`- …\`) for multiple changes.
40
+ - Keep the message concise. Do not invent context that is not visible in the diff.
41
+
42
+ # Constraints
43
+
44
+ - Base the message only on the provided diff. Never include the diff itself in the response.
45
+ - Never include sign-off lines, issue numbers, or co-authored-by trailers unless they are
46
+ clearly present in the provided changes.
47
+ - If the provided diff is empty or you cannot determine a meaningful message, respond with exactly: \`No changes to commit.\`
48
+ `
49
+ };
50
+ exports.commitMessageUserPrompt = {
51
+ id: exports.COMMIT_MESSAGE_USER_PROMPT_ID,
52
+ template: `Generate a commit message for the following staged changes.
53
+
54
+ \`\`\`diff
55
+ {{changes}}
56
+ \`\`\`
57
+ `
58
+ };
59
+ exports.commitMessagePrompts = [
60
+ { id: exports.COMMIT_MESSAGE_SYSTEM_PROMPT_ID, defaultVariant: exports.commitMessageSystemPrompt, variants: [] },
61
+ { id: exports.COMMIT_MESSAGE_USER_PROMPT_ID, defaultVariant: exports.commitMessageUserPrompt, variants: [] }
62
+ ];
63
+ //# sourceMappingURL=commit-message-prompt-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message-prompt-template.js","sourceRoot":"","sources":["../../src/browser/commit-message-prompt-template.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;;;AAInE,QAAA,+BAA+B,GAAG,uBAAuB,CAAC;AAC1D,QAAA,6BAA6B,GAAG,qBAAqB,CAAC;AAEtD,QAAA,yBAAyB,GAAuB;IACzD,EAAE,EAAE,uCAA+B;IACnC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb;CACA,CAAC;AAEW,QAAA,uBAAuB,GAAuB;IACvD,EAAE,EAAE,qCAA6B;IACjC,QAAQ,EAAE;;;;;CAKb;CACA,CAAC;AAEW,QAAA,oBAAoB,GAAG;IAChC,EAAE,EAAE,EAAE,uCAA+B,EAAE,cAAc,EAAE,iCAAyB,EAAE,QAAQ,EAAE,EAAE,EAAE;IAChG,EAAE,EAAE,EAAE,qCAA6B,EAAE,cAAc,EAAE,+BAAuB,EAAE,QAAQ,EAAE,EAAE,EAAE;CAC/F,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { Emitter, Event, ILogger, MessageService } from '@theia/core';
2
+ import { CancellationTokenSource } from '@theia/core/lib/common/cancellation';
3
+ import { ScmRepository } from '@theia/scm/lib/browser/scm-repository';
4
+ import { ScmService } from '@theia/scm/lib/browser/scm-service';
5
+ import { CommitMessageAgent } from './commit-message-agent';
6
+ import { GetGitChangesTool } from './git-changes-tool';
7
+ /**
8
+ * Drives the {@link CommitMessageAgent}: reads the staged git diff of the selected repository,
9
+ * asks the agent to turn it into a commit message and writes the result into that repository's
10
+ * SCM commit-message input.
11
+ *
12
+ * The diff is read by calling {@link GetGitChangesTool.getStagedChanges} directly rather than by
13
+ * letting the model call the tool: the agent is a plain (non-chat) agent with a single, fixed
14
+ * input, so there is no chat session, no tool-confirmation prompt and no chat-model bookkeeping.
15
+ * `git diff --cached` also renders staged additions of new files as complete addition diffs, so
16
+ * untracked files need no separate handling.
17
+ */
18
+ export declare class CommitMessageRunner {
19
+ protected readonly commitMessageAgent: CommitMessageAgent;
20
+ protected readonly gitChangesTool: GetGitChangesTool;
21
+ protected readonly scmService: ScmService;
22
+ protected readonly messageService: MessageService;
23
+ protected readonly logger: ILogger;
24
+ /**
25
+ * Cancellation source of the in-flight generation, or `undefined` when idle. It is fired by
26
+ * {@link cancel} so a click on the spinning button cancels the run even while we are still in
27
+ * the pre-request phase (resolving the repository, fetching the diff, awaiting the overwrite
28
+ * confirmation). Once the LLM request is under way, the same token cancels it via
29
+ * {@link CommitMessageAgent.generateCommitMessage}.
30
+ */
31
+ protected current: CancellationTokenSource | undefined;
32
+ protected readonly onDidChangeEmitter: Emitter<void>;
33
+ readonly onDidChange: Event<void>;
34
+ isRunning(): boolean;
35
+ cancel(): void;
36
+ run(): Promise<void>;
37
+ protected notifyFailure(reason: string): void;
38
+ /** Returns `true` if the operation should proceed. */
39
+ protected confirmOverwrite(repository: ScmRepository): Promise<boolean>;
40
+ }
41
+ //# sourceMappingURL=commit-message-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message-runner.d.ts","sourceRoot":"","sources":["../../src/browser/commit-message-runner.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAO,MAAM,aAAa,CAAC;AAE3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,qBACa,mBAAmB;IAG5B,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAG1D,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC;IAGrD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAG1C,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IAGlD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAEvD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,gBAAuB;IAC5D,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAiC;IAElE,SAAS,IAAI,OAAO;IAIpB,MAAM,IAAI,IAAI;IAIR,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA+D1B,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAU7C,sDAAsD;cACtC,gBAAgB,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;CAchF"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 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.CommitMessageRunner = void 0;
19
+ const tslib_1 = require("tslib");
20
+ const core_1 = require("@theia/core");
21
+ const dialogs_1 = require("@theia/core/lib/browser/dialogs");
22
+ const cancellation_1 = require("@theia/core/lib/common/cancellation");
23
+ const inversify_1 = require("@theia/core/shared/inversify");
24
+ const scm_service_1 = require("@theia/scm/lib/browser/scm-service");
25
+ const commit_message_agent_1 = require("./commit-message-agent");
26
+ const git_changes_tool_1 = require("./git-changes-tool");
27
+ /**
28
+ * Drives the {@link CommitMessageAgent}: reads the staged git diff of the selected repository,
29
+ * asks the agent to turn it into a commit message and writes the result into that repository's
30
+ * SCM commit-message input.
31
+ *
32
+ * The diff is read by calling {@link GetGitChangesTool.getStagedChanges} directly rather than by
33
+ * letting the model call the tool: the agent is a plain (non-chat) agent with a single, fixed
34
+ * input, so there is no chat session, no tool-confirmation prompt and no chat-model bookkeeping.
35
+ * `git diff --cached` also renders staged additions of new files as complete addition diffs, so
36
+ * untracked files need no separate handling.
37
+ */
38
+ let CommitMessageRunner = class CommitMessageRunner {
39
+ constructor() {
40
+ this.onDidChangeEmitter = new core_1.Emitter();
41
+ this.onDidChange = this.onDidChangeEmitter.event;
42
+ }
43
+ isRunning() {
44
+ return !!this.current;
45
+ }
46
+ cancel() {
47
+ this.current?.cancel();
48
+ }
49
+ async run() {
50
+ if (this.current) {
51
+ return;
52
+ }
53
+ const cts = new cancellation_1.CancellationTokenSource();
54
+ this.current = cts;
55
+ this.onDidChangeEmitter.fire();
56
+ try {
57
+ const repository = this.scmService.selectedRepository;
58
+ if (!repository) {
59
+ // Deliberately not awaited: a dismissed toast never resolves, which would leave
60
+ // the button spinning forever.
61
+ this.messageService.warn(core_1.nls.localize('theia/ai-ide/commit-message/no-repository', 'No source-control repository is selected.'));
62
+ return;
63
+ }
64
+ const changes = await this.gitChangesTool.getStagedChanges(repository, cts.token);
65
+ if (cts.token.isCancellationRequested) {
66
+ return;
67
+ }
68
+ if (!changes.trim()) {
69
+ this.messageService.warn(core_1.nls.localize('theia/ai-ide/commit-message/no-changes', 'There are no staged changes to generate a commit message from.'));
70
+ return;
71
+ }
72
+ if (!(await this.confirmOverwrite(repository))) {
73
+ return;
74
+ }
75
+ if (cts.token.isCancellationRequested) {
76
+ return;
77
+ }
78
+ const message = await this.commitMessageAgent.generateCommitMessage(changes, cts.token);
79
+ if (cts.token.isCancellationRequested) {
80
+ return;
81
+ }
82
+ if (!message) {
83
+ this.messageService.warn(core_1.nls.localize('theia/ai-ide/commit-message/empty', 'The model returned an empty commit message.'));
84
+ return;
85
+ }
86
+ repository.input.value = message;
87
+ repository.input.focus();
88
+ }
89
+ catch (error) {
90
+ if (cts.token.isCancellationRequested) {
91
+ return;
92
+ }
93
+ this.logger.error('Failed to run commit-message agent', error);
94
+ this.notifyFailure(error instanceof Error ? error.message : String(error));
95
+ }
96
+ finally {
97
+ this.current = undefined;
98
+ this.onDidChangeEmitter.fire();
99
+ cts.dispose();
100
+ }
101
+ }
102
+ notifyFailure(reason) {
103
+ this.messageService.error(core_1.nls.localize('theia/ai-ide/commit-message/failed', 'Failed to generate commit message: {0}', reason));
104
+ }
105
+ /** Returns `true` if the operation should proceed. */
106
+ async confirmOverwrite(repository) {
107
+ if (!repository.input.value.trim()) {
108
+ return true;
109
+ }
110
+ return !!await new dialogs_1.ConfirmDialog({
111
+ title: core_1.nls.localize('theia/ai-ide/commit-message/replace-title', 'Replace Commit Message'),
112
+ msg: core_1.nls.localize('theia/ai-ide/commit-message/replace-prompt', 'The commit message field is not empty. Replace its content with the generated message?'),
113
+ ok: core_1.nls.localizeByDefault('Replace'),
114
+ cancel: dialogs_1.Dialog.CANCEL
115
+ }).open();
116
+ }
117
+ };
118
+ exports.CommitMessageRunner = CommitMessageRunner;
119
+ tslib_1.__decorate([
120
+ (0, inversify_1.inject)(commit_message_agent_1.CommitMessageAgent),
121
+ tslib_1.__metadata("design:type", commit_message_agent_1.CommitMessageAgent)
122
+ ], CommitMessageRunner.prototype, "commitMessageAgent", void 0);
123
+ tslib_1.__decorate([
124
+ (0, inversify_1.inject)(git_changes_tool_1.GetGitChangesTool),
125
+ tslib_1.__metadata("design:type", git_changes_tool_1.GetGitChangesTool)
126
+ ], CommitMessageRunner.prototype, "gitChangesTool", void 0);
127
+ tslib_1.__decorate([
128
+ (0, inversify_1.inject)(scm_service_1.ScmService),
129
+ tslib_1.__metadata("design:type", scm_service_1.ScmService)
130
+ ], CommitMessageRunner.prototype, "scmService", void 0);
131
+ tslib_1.__decorate([
132
+ (0, inversify_1.inject)(core_1.MessageService),
133
+ tslib_1.__metadata("design:type", core_1.MessageService)
134
+ ], CommitMessageRunner.prototype, "messageService", void 0);
135
+ tslib_1.__decorate([
136
+ (0, inversify_1.inject)(core_1.ILogger),
137
+ (0, inversify_1.named)('ai-ide:CommitMessageRunner'),
138
+ tslib_1.__metadata("design:type", Object)
139
+ ], CommitMessageRunner.prototype, "logger", void 0);
140
+ exports.CommitMessageRunner = CommitMessageRunner = tslib_1.__decorate([
141
+ (0, inversify_1.injectable)()
142
+ ], CommitMessageRunner);
143
+ //# sourceMappingURL=commit-message-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message-runner.js","sourceRoot":"","sources":["../../src/browser/commit-message-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=commit-message-runner.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message-runner.spec.d.ts","sourceRoot":"","sources":["../../src/browser/commit-message-runner.spec.ts"],"names":[],"mappings":""}