@theia/ai-ide 1.70.0 → 1.70.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/browser/agent-mode-confirmation-service.d.ts.map +1 -1
- package/lib/browser/agent-mode-confirmation-service.js +15 -15
- package/lib/browser/agent-mode-confirmation-service.js.map +1 -1
- package/lib/browser/coder-agent.d.ts +3 -0
- package/lib/browser/coder-agent.d.ts.map +1 -1
- package/lib/browser/coder-agent.js +23 -1
- package/lib/browser/coder-agent.js.map +1 -1
- package/lib/browser/workspace-task-provider.d.ts.map +1 -1
- package/lib/browser/workspace-task-provider.js +4 -1
- package/lib/browser/workspace-task-provider.js.map +1 -1
- package/lib/browser/workspace-task-provider.spec.js +90 -1
- package/lib/browser/workspace-task-provider.spec.js.map +1 -1
- package/lib/common/ai-ide-preferences.d.ts +1 -1
- package/lib/common/ai-ide-preferences.d.ts.map +1 -1
- package/lib/common/ai-ide-preferences.js +6 -6
- package/lib/common/ai-ide-preferences.js.map +1 -1
- package/package.json +22 -22
- package/src/browser/agent-mode-confirmation-service.ts +19 -18
- package/src/browser/coder-agent.ts +25 -1
- package/src/browser/workspace-task-provider.spec.ts +119 -1
- package/src/browser/workspace-task-provider.ts +4 -1
- package/src/common/ai-ide-preferences.ts +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-mode-confirmation-service.d.ts","sourceRoot":"","sources":["../../src/browser/agent-mode-confirmation-service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEH,uBAAuB,EAE1B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,
|
|
1
|
+
{"version":3,"file":"agent-mode-confirmation-service.d.ts","sourceRoot":"","sources":["../../src/browser/agent-mode-confirmation-service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEH,uBAAuB,EAE1B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAwB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAItE,eAAO,MAAM,4BAA4B,eAAyC,CAAC;AACnF,MAAM,WAAW,4BAA4B;IACzC,cAAc,IAAI,OAAO,CAAC;IAC1B,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3E;AAED,qBACa,gCAAiC,YAAW,4BAA4B;IAEtD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAEnF,cAAc,IAAI,OAAO;IAInB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;CA+ChF"}
|
|
@@ -25,21 +25,23 @@ const ai_ide_preferences_1 = require("../common/ai-ide-preferences");
|
|
|
25
25
|
exports.AgentModeConfirmationService = Symbol('AgentModeConfirmationService');
|
|
26
26
|
let AgentModeConfirmationServiceImpl = class AgentModeConfirmationServiceImpl {
|
|
27
27
|
isAcknowledged() {
|
|
28
|
-
return !!this.preferenceService.get(ai_ide_preferences_1.
|
|
28
|
+
return !!this.preferenceService.get(ai_ide_preferences_1.PREFERENCE_NAME_AGENT_MODE_ENABLED, false);
|
|
29
29
|
}
|
|
30
30
|
async requestConfirmation(request) {
|
|
31
31
|
const deferred = new promise_util_1.Deferred();
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
request.response.response.addContent(new common_1.MarkdownChatResponseContentImpl(core_1.nls.localize('theia/ai/ide/agentModeConfirmation/msg', '
|
|
35
|
-
+ '
|
|
36
|
-
+ '
|
|
37
|
-
+ '
|
|
38
|
-
+ '
|
|
39
|
-
+ '
|
|
40
|
-
request.response.response.addContent(new common_1.QuestionResponseContentImpl(core_1.nls.localize('theia/ai/ide/agentModeConfirmation/
|
|
41
|
-
|
|
42
|
-
|
|
32
|
+
const agentModeLabel = core_1.nls.localize('theia/ai/ide/agentModeConfirmation/continueAgentMode', 'Continue with Agent Mode');
|
|
33
|
+
const editModeLabel = core_1.nls.localize('theia/ai/ide/agentModeConfirmation/continueEditMode', 'Continue with Edit Mode');
|
|
34
|
+
request.response.response.addContent(new common_1.MarkdownChatResponseContentImpl(core_1.nls.localize('theia/ai/ide/agentModeConfirmation/msg', 'You are about to use **Agent Mode**. In this mode, the agent can **read, create, and modify files** '
|
|
35
|
+
+ 'in your workspace autonomously, without asking for confirmation on each change.\n\n'
|
|
36
|
+
+ 'We recommend using **version control** (e.g. Git) so you can easily review and revert any changes.\n\n'
|
|
37
|
+
+ 'If you prefer more control, you can continue with **Edit Mode** instead, '
|
|
38
|
+
+ 'where changes are presented as suggestions for you to apply.\n\n'
|
|
39
|
+
+ 'How would you like to proceed?')));
|
|
40
|
+
request.response.response.addContent(new common_1.QuestionResponseContentImpl(core_1.nls.localize('theia/ai/ide/agentModeConfirmation/info', 'Continuing with Agent Mode saves your confirmation. You can revoke this later again via the `ai-features.agentMode.enabled` setting.\n\n'
|
|
41
|
+
+ 'Continuing with Edit Mode changes your default mode to Edit Mode.\n\n'
|
|
42
|
+
+ 'You can change modes anytime via the mode selector or in the AI Configuration.'), [{ text: agentModeLabel }, { text: editModeLabel }], request, async (selectedOption) => {
|
|
43
|
+
if (selectedOption.text === agentModeLabel) {
|
|
44
|
+
await this.preferenceService.set(ai_ide_preferences_1.PREFERENCE_NAME_AGENT_MODE_ENABLED, true, core_1.PreferenceScope.User);
|
|
43
45
|
request.response.stopWaitingForInput();
|
|
44
46
|
deferred.resolve(true);
|
|
45
47
|
}
|
|
@@ -55,9 +57,7 @@ let AgentModeConfirmationServiceImpl = class AgentModeConfirmationServiceImpl {
|
|
|
55
57
|
request.response.waitForInput();
|
|
56
58
|
return deferred.promise.then(result => {
|
|
57
59
|
request.response.updateProgressMessage({ ...progressMessage, show: 'untilFirstContent', status: 'completed' });
|
|
58
|
-
|
|
59
|
-
request.response.response.clearContent();
|
|
60
|
-
}
|
|
60
|
+
request.response.response.clearContent();
|
|
61
61
|
return result;
|
|
62
62
|
});
|
|
63
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-mode-confirmation-service.js","sourceRoot":"","sources":["../../src/browser/agent-mode-confirmation-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+CAA+C;AAC/C,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,sDAImC;AACnC,4DAAkE;AAClE,
|
|
1
|
+
{"version":3,"file":"agent-mode-confirmation-service.js","sourceRoot":"","sources":["../../src/browser/agent-mode-confirmation-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,10 @@ export declare class CoderAgent extends AbstractModeAwareChatAgent {
|
|
|
14
14
|
protected readonly modeDefinitions: Omit<ChatMode, 'isDefault'>[];
|
|
15
15
|
prompts: PromptVariantSet[];
|
|
16
16
|
protected systemPromptId: string | undefined;
|
|
17
|
+
private useSettingsDefaultMode;
|
|
17
18
|
invoke(request: MutableChatRequestModel): Promise<void>;
|
|
19
|
+
protected getEffectiveVariantIdWithMode(modeId?: string): string | undefined;
|
|
20
|
+
protected switchToEditMode(): Promise<void>;
|
|
18
21
|
protected isAgentModeRequest(request: MutableChatRequestModel): boolean;
|
|
19
22
|
suggest(context: ChatSession | ChatRequestModel): Promise<void>;
|
|
20
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coder-agent.d.ts","sourceRoot":"","sources":["../../src/browser/coder-agent.ts"],"names":[],"mappings":"AAeA,OAAO,EACH,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAClC,uBAAuB,EAC5C,MAAM,2BAA2B,CAAC;AAYnC,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAI5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAEjF,eAAO,MAAM,YAAY,UAAU,CAAC;AAEpC,qBACa,UAAW,SAAQ,0BAA0B;IACjC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAC3B,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;IAC7G,EAAE,EAAE,MAAM,CAAgB;IAC1B,IAAI,SAAgB;IACpB,yBAAyB,EAAE,wBAAwB,EAAE,CAGlD;IACH,SAAS,CAAC,2BAA2B,EAAE,MAAM,CAAU;IAE9C,WAAW,SAGgB;IAEpC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAa/D;IAEO,OAAO,EAAE,gBAAgB,EAAE,CAIjC;IACH,UAAmB,cAAc,EAAE,MAAM,GAAG,SAAS,CAA0B;
|
|
1
|
+
{"version":3,"file":"coder-agent.d.ts","sourceRoot":"","sources":["../../src/browser/coder-agent.ts"],"names":[],"mappings":"AAeA,OAAO,EACH,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAClC,uBAAuB,EAC5C,MAAM,2BAA2B,CAAC;AAYnC,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAI5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAEjF,eAAO,MAAM,YAAY,UAAU,CAAC;AAEpC,qBACa,UAAW,SAAQ,0BAA0B;IACjC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAC3B,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;IAC7G,EAAE,EAAE,MAAM,CAAgB;IAC1B,IAAI,SAAgB;IACpB,yBAAyB,EAAE,wBAAwB,EAAE,CAGlD;IACH,SAAS,CAAC,2BAA2B,EAAE,MAAM,CAAU;IAE9C,WAAW,SAGgB;IAEpC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAa/D;IAEO,OAAO,EAAE,gBAAgB,EAAE,CAIjC;IACH,UAAmB,cAAc,EAAE,MAAM,GAAG,SAAS,CAA0B;IAE/E,OAAO,CAAC,sBAAsB,CAAS;IAExB,MAAM,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;cAqBnD,6BAA6B,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;cAOrE,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjD,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO;IASjE,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAsBxE"}
|
|
@@ -59,18 +59,40 @@ let CoderAgent = class CoderAgent extends mode_aware_chat_agent_1.AbstractModeAw
|
|
|
59
59
|
variants: [(0, coder_replace_prompt_template_1.getCoderPromptTemplateEdit)(), (0, coder_replace_prompt_template_1.getCoderAgentModeNextPromptTemplate)(), (0, coder_replace_prompt_template_1.getCoderPromptTemplateEditNext)()]
|
|
60
60
|
}];
|
|
61
61
|
this.systemPromptId = coder_replace_prompt_template_1.CODER_SYSTEM_PROMPT_ID;
|
|
62
|
+
this.useSettingsDefaultMode = false;
|
|
62
63
|
}
|
|
63
64
|
async invoke(request) {
|
|
64
65
|
if (this.isAgentModeRequest(request) && !this.agentModeConfirmation.isAcknowledged()) {
|
|
65
66
|
const confirmed = await this.agentModeConfirmation.requestConfirmation(request);
|
|
66
67
|
if (!confirmed) {
|
|
67
|
-
|
|
68
|
+
await this.switchToEditMode();
|
|
69
|
+
// Continue the same request using Edit Mode's prompt by ignoring
|
|
70
|
+
// the request's original agent mode modeId for variant resolution.
|
|
71
|
+
this.useSettingsDefaultMode = true;
|
|
72
|
+
try {
|
|
73
|
+
await super.invoke(request);
|
|
74
|
+
this.suggest(request);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
this.useSettingsDefaultMode = false;
|
|
78
|
+
}
|
|
68
79
|
return;
|
|
69
80
|
}
|
|
70
81
|
}
|
|
71
82
|
await super.invoke(request);
|
|
72
83
|
this.suggest(request);
|
|
73
84
|
}
|
|
85
|
+
getEffectiveVariantIdWithMode(modeId) {
|
|
86
|
+
if (this.useSettingsDefaultMode) {
|
|
87
|
+
return super.getEffectiveVariantIdWithMode(undefined);
|
|
88
|
+
}
|
|
89
|
+
return super.getEffectiveVariantIdWithMode(modeId);
|
|
90
|
+
}
|
|
91
|
+
async switchToEditMode() {
|
|
92
|
+
if (this.systemPromptId) {
|
|
93
|
+
await this.promptService.updateSelectedVariantId(this.id, this.systemPromptId, coder_replace_prompt_template_1.CODER_EDIT_TEMPLATE_ID);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
74
96
|
isAgentModeRequest(request) {
|
|
75
97
|
const modeId = request.request.modeId;
|
|
76
98
|
if (modeId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coder-agent.js","sourceRoot":"","sources":["../../src/browser/coder-agent.ts"],"names":[],"mappings":";;;;AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,sDAGmC;AACnC,4DAAkE;AAClE,2FASiD;AAEjD,sCAAkC;AAClC,kFAA+E;AAC/E,yFAAiH;AACjH,mEAAqE;AACrE,uFAAiF;AAEpE,QAAA,YAAY,GAAG,OAAO,CAAC;AAG7B,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,kDAA0B;IAAnD;;QAGH,OAAE,GAAW,oBAAY,CAAC;QAC1B,SAAI,GAAG,oBAAY,CAAC;QACpB,8BAAyB,GAA+B,CAAC;gBACrD,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,cAAc;aAC7B,CAAC,CAAC;QACO,gCAA2B,GAAW,MAAM,CAAC;QAE9C,gBAAW,GAAG,UAAG,CAAC,QAAQ,CAAC,2CAA2C,EAC3E;;sCAE8B,CAAC,CAAC;QAEjB,oBAAe,GAAkC;YAChE;gBACI,EAAE,EAAE,sDAAsB;gBAC1B,IAAI,EAAE,UAAG,CAAC,QAAQ,CAAC,mCAAmC,EAAE,WAAW,CAAC;aACvE;YACD;gBACI,EAAE,EAAE,4DAA4B;gBAChC,IAAI,EAAE,UAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC;aAC5C;YACD;gBACI,EAAE,EAAE,iEAAiC;gBACrC,IAAI,EAAE,UAAG,CAAC,QAAQ,CAAC,wCAAwC,EAAE,mBAAmB,CAAC;aACpF;SACJ,CAAC;QAEO,YAAO,GAAuB,CAAC;gBACpC,EAAE,EAAE,sDAAsB;gBAC1B,cAAc,EAAE,IAAA,+DAA+B,GAAE;gBACjD,QAAQ,EAAE,CAAC,IAAA,0DAA0B,GAAE,EAAE,IAAA,mEAAmC,GAAE,EAAE,IAAA,8DAA8B,GAAE,CAAC;aACpH,CAAC,CAAC;QACgB,mBAAc,GAAuB,sDAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"coder-agent.js","sourceRoot":"","sources":["../../src/browser/coder-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-task-provider.d.ts","sourceRoot":"","sources":["../../src/browser/workspace-task-provider.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAyB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlF,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AAGpF,qBACa,gBAAiB,YAAW,YAAY;IAGjD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAE5C,OAAO,IAAI,WAAW;YAgCR,iBAAiB;CAMlC;AAED,qBACa,kBAAmB,YAAW,YAAY;IAGnD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAG5C,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAEpD,OAAO,IAAI,WAAW;YA0BR,aAAa;
|
|
1
|
+
{"version":3,"file":"workspace-task-provider.d.ts","sourceRoot":"","sources":["../../src/browser/workspace-task-provider.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAyB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlF,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AAGpF,qBACa,gBAAiB,YAAW,YAAY;IAGjD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAE5C,OAAO,IAAI,WAAW;YAgCR,iBAAiB;CAMlC;AAED,qBACa,kBAAmB,YAAW,YAAY;IAGnD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAG5C,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAEpD,OAAO,IAAI,WAAW;YA0BR,aAAa;CA6C9B"}
|
|
@@ -103,7 +103,10 @@ let TaskRunnerProvider = class TaskRunnerProvider {
|
|
|
103
103
|
return `Did not find a task for the label: '${args.taskName}'`;
|
|
104
104
|
}
|
|
105
105
|
cancellationToken?.onCancellationRequested(() => {
|
|
106
|
-
|
|
106
|
+
// Only terminate if the task is still running
|
|
107
|
+
if (this.taskService.isTaskRunning(taskInfo.taskId)) {
|
|
108
|
+
this.taskService.terminateTask(taskInfo);
|
|
109
|
+
}
|
|
107
110
|
});
|
|
108
111
|
if (cancellationToken?.isCancellationRequested) {
|
|
109
112
|
return JSON.stringify({ error: 'Operation cancelled by user' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-task-provider.js","sourceRoot":"","sources":["../../src/browser/workspace-task-provider.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workspace-task-provider.js","sourceRoot":"","sources":["../../src/browser/workspace-task-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,7 +67,8 @@ describe('Workspace Task Provider Cancellation Tests', () => {
|
|
|
67
67
|
terminateTask: async (activeTaskInfo) => {
|
|
68
68
|
// Track termination
|
|
69
69
|
},
|
|
70
|
-
getTerminateSignal: async () => 'SIGTERM'
|
|
70
|
+
getTerminateSignal: async () => 'SIGTERM',
|
|
71
|
+
isTaskRunning: () => false
|
|
71
72
|
};
|
|
72
73
|
mockTerminalService = {
|
|
73
74
|
getByTerminalId: () => ({
|
|
@@ -87,6 +88,94 @@ describe('Workspace Task Provider Cancellation Tests', () => {
|
|
|
87
88
|
afterEach(() => {
|
|
88
89
|
cancellationTokenSource.dispose();
|
|
89
90
|
});
|
|
91
|
+
describe('Task cancellation with completed tasks', () => {
|
|
92
|
+
it('should NOT terminate task if task has already completed (not in runningTasks)', async () => {
|
|
93
|
+
let terminateTaskCalled = false;
|
|
94
|
+
mockTaskService.terminateTask = async () => {
|
|
95
|
+
terminateTaskCalled = true;
|
|
96
|
+
};
|
|
97
|
+
// Simulate task already completed (isTaskRunning returns false)
|
|
98
|
+
mockTaskService.isTaskRunning = () => false;
|
|
99
|
+
// Mock getTerminateSignal to never resolve (simulates in-flight handler)
|
|
100
|
+
mockTaskService.getTerminateSignal = () => new Promise(() => { });
|
|
101
|
+
const taskRunnerProvider = container.get(workspace_task_provider_1.TaskRunnerProvider);
|
|
102
|
+
const handler = taskRunnerProvider.getTool().handler;
|
|
103
|
+
// Start task execution (will hang on getTerminateSignal)
|
|
104
|
+
handler(JSON.stringify({ taskName: 'build' }), mockCtx);
|
|
105
|
+
// Give time for the handler to register the cancellation listener
|
|
106
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
107
|
+
// Cancel while handler is "in-flight"
|
|
108
|
+
cancellationTokenSource.cancel();
|
|
109
|
+
// Give time for cancellation to process
|
|
110
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
111
|
+
// terminateTask should NOT have been called since isTaskRunning returns false
|
|
112
|
+
(0, chai_1.expect)(terminateTaskCalled).to.be.false;
|
|
113
|
+
});
|
|
114
|
+
it('should terminate task if task is still running', async () => {
|
|
115
|
+
let terminateTaskCalled = false;
|
|
116
|
+
mockTaskService.terminateTask = async () => {
|
|
117
|
+
terminateTaskCalled = true;
|
|
118
|
+
};
|
|
119
|
+
// Mock isTaskRunning to return true (task still running)
|
|
120
|
+
mockTaskService.isTaskRunning = () => true;
|
|
121
|
+
// Mock getTerminateSignal to never resolve (simulates in-flight task)
|
|
122
|
+
mockTaskService.getTerminateSignal = () => new Promise(() => { });
|
|
123
|
+
const taskRunnerProvider = container.get(workspace_task_provider_1.TaskRunnerProvider);
|
|
124
|
+
const handler = taskRunnerProvider.getTool().handler;
|
|
125
|
+
// Start task execution (will hang on getTerminateSignal)
|
|
126
|
+
handler(JSON.stringify({ taskName: 'build' }), mockCtx);
|
|
127
|
+
// Give time for the handler to register the cancellation listener
|
|
128
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
129
|
+
// Cancel while task is "in-flight"
|
|
130
|
+
cancellationTokenSource.cancel();
|
|
131
|
+
// Give time for cancellation to process
|
|
132
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
133
|
+
// terminateTask SHOULD have been called since isTaskRunning returns true
|
|
134
|
+
(0, chai_1.expect)(terminateTaskCalled).to.be.true;
|
|
135
|
+
});
|
|
136
|
+
it('should handle multiple tasks with shared cancellation token - only terminate running tasks', async () => {
|
|
137
|
+
const terminatedTasks = [];
|
|
138
|
+
mockTaskService.terminateTask = async (taskInfo) => {
|
|
139
|
+
terminatedTasks.push(taskInfo.taskId);
|
|
140
|
+
};
|
|
141
|
+
// Mock isTaskRunning to simulate: task 0 completed, tasks 1 & 2 still running
|
|
142
|
+
mockTaskService.isTaskRunning = (taskId) => taskId !== 0;
|
|
143
|
+
// Mock getTerminateSignal to never resolve (simulates in-flight handlers)
|
|
144
|
+
mockTaskService.getTerminateSignal = () => new Promise(() => { });
|
|
145
|
+
// Mock runTaskByLabel to return different task IDs
|
|
146
|
+
let taskIdCounter = 0;
|
|
147
|
+
mockTaskService.runTaskByLabel = async (token, taskLabel) => ({
|
|
148
|
+
taskId: taskIdCounter++,
|
|
149
|
+
terminalId: taskIdCounter - 1,
|
|
150
|
+
config: {
|
|
151
|
+
label: taskLabel,
|
|
152
|
+
_scope: 'workspace',
|
|
153
|
+
type: 'shell'
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
const taskRunnerProvider = container.get(workspace_task_provider_1.TaskRunnerProvider);
|
|
157
|
+
const handler = taskRunnerProvider.getTool().handler;
|
|
158
|
+
// Use ONE shared CancellationTokenSource (simulates real scenario)
|
|
159
|
+
const sharedCts = new core_1.CancellationTokenSource();
|
|
160
|
+
const sharedCtx = { cancellationToken: sharedCts.token };
|
|
161
|
+
// Call handler three times with the same shared cancellation token
|
|
162
|
+
handler(JSON.stringify({ taskName: 'build' }), sharedCtx);
|
|
163
|
+
handler(JSON.stringify({ taskName: 'test' }), sharedCtx);
|
|
164
|
+
handler(JSON.stringify({ taskName: 'lint' }), sharedCtx);
|
|
165
|
+
// Give time for handlers to register cancellation listeners
|
|
166
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
167
|
+
// Cancel the shared token once - this fires all registered listeners
|
|
168
|
+
sharedCts.cancel();
|
|
169
|
+
// Give time for cancellation listeners to fire
|
|
170
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
171
|
+
// Only task 1 and 2 should have been terminated (task 0 was completed)
|
|
172
|
+
(0, chai_1.expect)(terminatedTasks).to.have.lengthOf(2);
|
|
173
|
+
(0, chai_1.expect)(terminatedTasks).to.include(1);
|
|
174
|
+
(0, chai_1.expect)(terminatedTasks).to.include(2);
|
|
175
|
+
(0, chai_1.expect)(terminatedTasks).to.not.include(0);
|
|
176
|
+
sharedCts.dispose();
|
|
177
|
+
});
|
|
178
|
+
});
|
|
90
179
|
it('TaskListProvider should respect cancellation token', async () => {
|
|
91
180
|
const taskListProvider = container.get(workspace_task_provider_1.TaskListProvider);
|
|
92
181
|
cancellationTokenSource.cancel();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-task-provider.spec.js","sourceRoot":"","sources":["../../src/browser/workspace-task-provider.spec.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,+BAA8B;AAC9B,sCAAsD;AACtD,uEAAiF;AAEjF,4DAAyD;AACzD,uEAAmE;AACnE,wFAAoF;AAIpF,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IACxD,IAAI,uBAAgD,CAAC;IACrD,IAAI,OAA8B,CAAC;IACnC,IAAI,SAAoB,CAAC;IACzB,IAAI,eAA4B,CAAC;IACjC,IAAI,mBAAoC,CAAC;IAEzC,UAAU,CAAC,GAAG,EAAE;QACZ,uBAAuB,GAAG,IAAI,8BAAuB,EAAE,CAAC;QAExD,qBAAqB;QACrB,OAAO,GAAG;YACN,iBAAiB,EAAE,uBAAuB,CAAC,KAAK;SACnD,CAAC;QAEF,uCAAuC;QACvC,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAC;QAE5B,oBAAoB;QACpB,eAAe,GAAG;YACd,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG;YAC1B,QAAQ,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE,CAAC;gBAC/B;oBACI,KAAK,EAAE,OAAO;oBACd,MAAM,EAAE,WAAW;oBACnB,IAAI,EAAE,OAAO;iBACK;gBACtB;oBACI,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,WAAW;oBACnB,IAAI,EAAE,OAAO;iBACK;aACzB;YACD,cAAc,EAAE,KAAK,EAAE,KAAa,EAAE,SAAiB,EAAE,EAAE;gBACvD,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;oBAChD,OAAO;wBACH,MAAM,EAAE,CAAC;wBACT,UAAU,EAAE,CAAC;wBACb,MAAM,EAAE;4BACJ,KAAK,EAAE,SAAS;4BAChB,MAAM,EAAE,WAAW;4BACnB,IAAI,EAAE,OAAO;yBAChB;qBACQ,CAAC;gBAClB,CAAC;gBACD,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,aAAa,EAAE,KAAK,EAAE,cAAwB,EAAE,EAAE;gBAC9C,oBAAoB;YACxB,CAAC;YACD,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"workspace-task-provider.spec.js","sourceRoot":"","sources":["../../src/browser/workspace-task-provider.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PreferenceSchema } from '@theia/core';
|
|
2
2
|
export declare const PREFERENCE_NAME_ENABLE_AI = "ai-features.AiEnable.enableAI";
|
|
3
3
|
export declare const PREFERENCE_NAME_ORCHESTRATOR_EXCLUSION_LIST = "ai-features.orchestrator.excludedAgents";
|
|
4
|
-
export declare const
|
|
4
|
+
export declare const PREFERENCE_NAME_AGENT_MODE_ENABLED = "ai-features.agentMode.enabled";
|
|
5
5
|
export declare const aiIdePreferenceSchema: PreferenceSchema;
|
|
6
6
|
//# sourceMappingURL=ai-ide-preferences.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-ide-preferences.d.ts","sourceRoot":"","sources":["../../src/common/ai-ide-preferences.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAO,gBAAgB,
|
|
1
|
+
{"version":3,"file":"ai-ide-preferences.d.ts","sourceRoot":"","sources":["../../src/common/ai-ide-preferences.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAO,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAGrE,eAAO,MAAM,yBAAyB,kCAAkC,CAAC;AACzE,eAAO,MAAM,2CAA2C,4CAA4C,CAAC;AACrG,eAAO,MAAM,kCAAkC,kCAAkC,CAAC;AAClF,eAAO,MAAM,qBAAqB,EAAE,gBAsCnC,CAAC"}
|
|
@@ -15,13 +15,13 @@
|
|
|
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
|
-
exports.aiIdePreferenceSchema = exports.
|
|
18
|
+
exports.aiIdePreferenceSchema = exports.PREFERENCE_NAME_AGENT_MODE_ENABLED = exports.PREFERENCE_NAME_ORCHESTRATOR_EXCLUSION_LIST = exports.PREFERENCE_NAME_ENABLE_AI = void 0;
|
|
19
19
|
const common_1 = require("@theia/ai-core/lib/common");
|
|
20
20
|
const core_1 = require("@theia/core");
|
|
21
21
|
// We reuse the context key for the preference name
|
|
22
22
|
exports.PREFERENCE_NAME_ENABLE_AI = 'ai-features.AiEnable.enableAI';
|
|
23
23
|
exports.PREFERENCE_NAME_ORCHESTRATOR_EXCLUSION_LIST = 'ai-features.orchestrator.excludedAgents';
|
|
24
|
-
exports.
|
|
24
|
+
exports.PREFERENCE_NAME_AGENT_MODE_ENABLED = 'ai-features.agentMode.enabled';
|
|
25
25
|
exports.aiIdePreferenceSchema = {
|
|
26
26
|
properties: {
|
|
27
27
|
[exports.PREFERENCE_NAME_ENABLE_AI]: {
|
|
@@ -48,13 +48,13 @@ exports.aiIdePreferenceSchema = {
|
|
|
48
48
|
},
|
|
49
49
|
default: ['ClaudeCode', 'Codex'],
|
|
50
50
|
},
|
|
51
|
-
[exports.
|
|
51
|
+
[exports.PREFERENCE_NAME_AGENT_MODE_ENABLED]: {
|
|
52
52
|
title: common_1.AI_CORE_PREFERENCES_TITLE,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
+ 'Set to `false` to see the confirmation again on the next agent mode request.'),
|
|
53
|
+
description: core_1.nls.localize('theia/ai/ide/agentMode/enabled/mdDescription', 'Enable agent mode for the Coder agent. Agent mode allows autonomous file modifications without further confirmation.\
|
|
54
|
+
A first-use confirmation dialog is shown when using agent mode until this is set to `true`.'),
|
|
56
55
|
type: 'boolean',
|
|
57
56
|
default: false,
|
|
57
|
+
scope: core_1.PreferenceScope.User
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-ide-preferences.js","sourceRoot":"","sources":["../../src/common/ai-ide-preferences.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,sDAAsE;AACtE,
|
|
1
|
+
{"version":3,"file":"ai-ide-preferences.js","sourceRoot":"","sources":["../../src/common/ai-ide-preferences.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,sDAAsE;AACtE,sCAAqE;AAErE,mDAAmD;AACtC,QAAA,yBAAyB,GAAG,+BAA+B,CAAC;AAC5D,QAAA,2CAA2C,GAAG,yCAAyC,CAAC;AACxF,QAAA,kCAAkC,GAAG,+BAA+B,CAAC;AACrE,QAAA,qBAAqB,GAAqB;IACnD,UAAU,EAAE;QACR,CAAC,iCAAyB,CAAC,EAAE;YACzB,KAAK,EAAE,kCAAyB;YAChC,mBAAmB,EAAE,IAAI,GAAG,UAAG,CAAC,QAAQ,CAAC,qCAAqC,EAC1E;;;;;;;;qGAQqF,CAAC;YAC1F,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;SACjB;QACD,CAAC,mDAA2C,CAAC,EAAE;YAC3C,KAAK,EAAE,kCAAyB;YAChC,mBAAmB,EAAE,UAAG,CAAC,QAAQ,CAAC,wDAAwD,EACtF,yEAAyE;gBACzE,mGAAmG,CAAC;YACxG,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACH,IAAI,EAAE,QAAQ;aACjB;YACD,OAAO,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC;SACnC;QACD,CAAC,0CAAkC,CAAC,EAAE;YAClC,KAAK,EAAE,kCAAyB;YAChC,WAAW,EAAE,UAAG,CAAC,QAAQ,CAAC,8CAA8C,EACpE;6GAC6F,CAAC;YAClG,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,sBAAe,CAAC,IAAI;SAC9B;KACJ;CACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-ide",
|
|
3
|
-
"version": "1.70.
|
|
3
|
+
"version": "1.70.2",
|
|
4
4
|
"description": "AI IDE Agents Extension",
|
|
5
5
|
"license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -15,24 +15,24 @@
|
|
|
15
15
|
"theia-extension"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@theia/ai-chat": "1.70.
|
|
19
|
-
"@theia/ai-chat-ui": "1.70.
|
|
20
|
-
"@theia/ai-core": "1.70.
|
|
21
|
-
"@theia/ai-mcp": "1.70.
|
|
22
|
-
"@theia/ai-terminal": "1.70.
|
|
23
|
-
"@theia/core": "1.70.
|
|
24
|
-
"@theia/debug": "1.70.
|
|
25
|
-
"@theia/editor": "1.70.
|
|
26
|
-
"@theia/filesystem": "1.70.
|
|
27
|
-
"@theia/markers": "1.70.
|
|
28
|
-
"@theia/monaco": "1.70.
|
|
29
|
-
"@theia/navigator": "1.70.
|
|
30
|
-
"@theia/preferences": "1.70.
|
|
31
|
-
"@theia/scm": "1.70.
|
|
32
|
-
"@theia/search-in-workspace": "1.70.
|
|
33
|
-
"@theia/task": "1.70.
|
|
34
|
-
"@theia/terminal": "1.70.
|
|
35
|
-
"@theia/workspace": "1.70.
|
|
18
|
+
"@theia/ai-chat": "1.70.2",
|
|
19
|
+
"@theia/ai-chat-ui": "1.70.2",
|
|
20
|
+
"@theia/ai-core": "1.70.2",
|
|
21
|
+
"@theia/ai-mcp": "1.70.2",
|
|
22
|
+
"@theia/ai-terminal": "1.70.2",
|
|
23
|
+
"@theia/core": "1.70.2",
|
|
24
|
+
"@theia/debug": "1.70.2",
|
|
25
|
+
"@theia/editor": "1.70.2",
|
|
26
|
+
"@theia/filesystem": "1.70.2",
|
|
27
|
+
"@theia/markers": "1.70.2",
|
|
28
|
+
"@theia/monaco": "1.70.2",
|
|
29
|
+
"@theia/navigator": "1.70.2",
|
|
30
|
+
"@theia/preferences": "1.70.2",
|
|
31
|
+
"@theia/scm": "1.70.2",
|
|
32
|
+
"@theia/search-in-workspace": "1.70.2",
|
|
33
|
+
"@theia/task": "1.70.2",
|
|
34
|
+
"@theia/terminal": "1.70.2",
|
|
35
|
+
"@theia/workspace": "1.70.2",
|
|
36
36
|
"date-fns": "^4.1.0",
|
|
37
37
|
"ignore": "^6.0.0",
|
|
38
38
|
"js-yaml": "^4.1.0",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"access": "public"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@theia/cli": "1.70.
|
|
48
|
-
"@theia/test": "1.70.
|
|
47
|
+
"@theia/cli": "1.70.2",
|
|
48
|
+
"@theia/test": "1.70.2"
|
|
49
49
|
},
|
|
50
50
|
"theiaExtensions": [
|
|
51
51
|
{
|
|
@@ -69,5 +69,5 @@
|
|
|
69
69
|
"nyc": {
|
|
70
70
|
"extends": "../../configs/nyc.json"
|
|
71
71
|
},
|
|
72
|
-
"gitHead": "
|
|
72
|
+
"gitHead": "083802498e3c7c969e0afa9c763548c4fc9f5ac0"
|
|
73
73
|
}
|
|
@@ -20,9 +20,9 @@ import {
|
|
|
20
20
|
QuestionResponseContentImpl
|
|
21
21
|
} from '@theia/ai-chat/lib/common';
|
|
22
22
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
23
|
-
import { nls, PreferenceService } from '@theia/core';
|
|
23
|
+
import { nls, PreferenceScope, PreferenceService } from '@theia/core';
|
|
24
24
|
import { Deferred } from '@theia/core/lib/common/promise-util';
|
|
25
|
-
import {
|
|
25
|
+
import { PREFERENCE_NAME_AGENT_MODE_ENABLED } from '../common/ai-ide-preferences';
|
|
26
26
|
|
|
27
27
|
export const AgentModeConfirmationService = Symbol('AgentModeConfirmationService');
|
|
28
28
|
export interface AgentModeConfirmationService {
|
|
@@ -36,32 +36,35 @@ export class AgentModeConfirmationServiceImpl implements AgentModeConfirmationSe
|
|
|
36
36
|
@inject(PreferenceService) protected readonly preferenceService: PreferenceService;
|
|
37
37
|
|
|
38
38
|
isAcknowledged(): boolean {
|
|
39
|
-
return !!this.preferenceService.get<boolean>(
|
|
39
|
+
return !!this.preferenceService.get<boolean>(PREFERENCE_NAME_AGENT_MODE_ENABLED, false);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
async requestConfirmation(request: MutableChatRequestModel): Promise<boolean> {
|
|
43
43
|
const deferred = new Deferred<boolean>();
|
|
44
44
|
|
|
45
|
-
const
|
|
46
|
-
const
|
|
45
|
+
const agentModeLabel = nls.localize('theia/ai/ide/agentModeConfirmation/continueAgentMode', 'Continue with Agent Mode');
|
|
46
|
+
const editModeLabel = nls.localize('theia/ai/ide/agentModeConfirmation/continueEditMode', 'Continue with Edit Mode');
|
|
47
47
|
|
|
48
48
|
request.response.response.addContent(new MarkdownChatResponseContentImpl(
|
|
49
49
|
nls.localize('theia/ai/ide/agentModeConfirmation/msg',
|
|
50
|
-
'
|
|
51
|
-
+ '
|
|
52
|
-
+ '
|
|
53
|
-
+ '
|
|
54
|
-
+ '
|
|
55
|
-
+ '
|
|
50
|
+
'You are about to use **Agent Mode**. In this mode, the agent can **read, create, and modify files** '
|
|
51
|
+
+ 'in your workspace autonomously, without asking for confirmation on each change.\n\n'
|
|
52
|
+
+ 'We recommend using **version control** (e.g. Git) so you can easily review and revert any changes.\n\n'
|
|
53
|
+
+ 'If you prefer more control, you can continue with **Edit Mode** instead, '
|
|
54
|
+
+ 'where changes are presented as suggestions for you to apply.\n\n'
|
|
55
|
+
+ 'How would you like to proceed?')
|
|
56
56
|
));
|
|
57
57
|
|
|
58
58
|
request.response.response.addContent(new QuestionResponseContentImpl(
|
|
59
|
-
nls.localize('theia/ai/ide/agentModeConfirmation/
|
|
60
|
-
|
|
59
|
+
nls.localize('theia/ai/ide/agentModeConfirmation/info',
|
|
60
|
+
'Continuing with Agent Mode saves your confirmation. You can revoke this later again via the `ai-features.agentMode.enabled` setting.\n\n'
|
|
61
|
+
+ 'Continuing with Edit Mode changes your default mode to Edit Mode.\n\n'
|
|
62
|
+
+ 'You can change modes anytime via the mode selector or in the AI Configuration.'),
|
|
63
|
+
[{ text: agentModeLabel }, { text: editModeLabel }],
|
|
61
64
|
request,
|
|
62
65
|
async selectedOption => {
|
|
63
|
-
if (selectedOption.text ===
|
|
64
|
-
await this.preferenceService.set(
|
|
66
|
+
if (selectedOption.text === agentModeLabel) {
|
|
67
|
+
await this.preferenceService.set(PREFERENCE_NAME_AGENT_MODE_ENABLED, true, PreferenceScope.User);
|
|
65
68
|
request.response.stopWaitingForInput();
|
|
66
69
|
deferred.resolve(true);
|
|
67
70
|
} else {
|
|
@@ -79,9 +82,7 @@ export class AgentModeConfirmationServiceImpl implements AgentModeConfirmationSe
|
|
|
79
82
|
|
|
80
83
|
return deferred.promise.then(result => {
|
|
81
84
|
request.response.updateProgressMessage({ ...progressMessage, show: 'untilFirstContent', status: 'completed' });
|
|
82
|
-
|
|
83
|
-
request.response.response.clearContent();
|
|
84
|
-
}
|
|
85
|
+
request.response.response.clearContent();
|
|
85
86
|
return result;
|
|
86
87
|
});
|
|
87
88
|
}
|
|
@@ -76,11 +76,22 @@ export class CoderAgent extends AbstractModeAwareChatAgent {
|
|
|
76
76
|
}];
|
|
77
77
|
protected override systemPromptId: string | undefined = CODER_SYSTEM_PROMPT_ID;
|
|
78
78
|
|
|
79
|
+
private useSettingsDefaultMode = false;
|
|
80
|
+
|
|
79
81
|
override async invoke(request: MutableChatRequestModel): Promise<void> {
|
|
80
82
|
if (this.isAgentModeRequest(request) && !this.agentModeConfirmation.isAcknowledged()) {
|
|
81
83
|
const confirmed = await this.agentModeConfirmation.requestConfirmation(request);
|
|
82
84
|
if (!confirmed) {
|
|
83
|
-
|
|
85
|
+
await this.switchToEditMode();
|
|
86
|
+
// Continue the same request using Edit Mode's prompt by ignoring
|
|
87
|
+
// the request's original agent mode modeId for variant resolution.
|
|
88
|
+
this.useSettingsDefaultMode = true;
|
|
89
|
+
try {
|
|
90
|
+
await super.invoke(request);
|
|
91
|
+
this.suggest(request);
|
|
92
|
+
} finally {
|
|
93
|
+
this.useSettingsDefaultMode = false;
|
|
94
|
+
}
|
|
84
95
|
return;
|
|
85
96
|
}
|
|
86
97
|
}
|
|
@@ -88,6 +99,19 @@ export class CoderAgent extends AbstractModeAwareChatAgent {
|
|
|
88
99
|
this.suggest(request);
|
|
89
100
|
}
|
|
90
101
|
|
|
102
|
+
protected override getEffectiveVariantIdWithMode(modeId?: string): string | undefined {
|
|
103
|
+
if (this.useSettingsDefaultMode) {
|
|
104
|
+
return super.getEffectiveVariantIdWithMode(undefined);
|
|
105
|
+
}
|
|
106
|
+
return super.getEffectiveVariantIdWithMode(modeId);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
protected async switchToEditMode(): Promise<void> {
|
|
110
|
+
if (this.systemPromptId) {
|
|
111
|
+
await this.promptService.updateSelectedVariantId(this.id, this.systemPromptId, CODER_EDIT_TEMPLATE_ID);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
91
115
|
protected isAgentModeRequest(request: MutableChatRequestModel): boolean {
|
|
92
116
|
const modeId = request.request.modeId;
|
|
93
117
|
if (modeId) {
|
|
@@ -74,7 +74,8 @@ describe('Workspace Task Provider Cancellation Tests', () => {
|
|
|
74
74
|
terminateTask: async (activeTaskInfo: TaskInfo) => {
|
|
75
75
|
// Track termination
|
|
76
76
|
},
|
|
77
|
-
getTerminateSignal: async () => 'SIGTERM'
|
|
77
|
+
getTerminateSignal: async () => 'SIGTERM',
|
|
78
|
+
isTaskRunning: () => false
|
|
78
79
|
} as unknown as TaskService;
|
|
79
80
|
|
|
80
81
|
mockTerminalService = {
|
|
@@ -98,6 +99,123 @@ describe('Workspace Task Provider Cancellation Tests', () => {
|
|
|
98
99
|
cancellationTokenSource.dispose();
|
|
99
100
|
});
|
|
100
101
|
|
|
102
|
+
describe('Task cancellation with completed tasks', () => {
|
|
103
|
+
it('should NOT terminate task if task has already completed (not in runningTasks)', async () => {
|
|
104
|
+
let terminateTaskCalled = false;
|
|
105
|
+
mockTaskService.terminateTask = async () => {
|
|
106
|
+
terminateTaskCalled = true;
|
|
107
|
+
};
|
|
108
|
+
// Simulate task already completed (isTaskRunning returns false)
|
|
109
|
+
mockTaskService.isTaskRunning = () => false;
|
|
110
|
+
|
|
111
|
+
// Mock getTerminateSignal to never resolve (simulates in-flight handler)
|
|
112
|
+
mockTaskService.getTerminateSignal = () => new Promise(() => { });
|
|
113
|
+
|
|
114
|
+
const taskRunnerProvider = container.get(TaskRunnerProvider);
|
|
115
|
+
const handler = taskRunnerProvider.getTool().handler;
|
|
116
|
+
|
|
117
|
+
// Start task execution (will hang on getTerminateSignal)
|
|
118
|
+
handler(JSON.stringify({ taskName: 'build' }), mockCtx);
|
|
119
|
+
|
|
120
|
+
// Give time for the handler to register the cancellation listener
|
|
121
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
122
|
+
|
|
123
|
+
// Cancel while handler is "in-flight"
|
|
124
|
+
cancellationTokenSource.cancel();
|
|
125
|
+
|
|
126
|
+
// Give time for cancellation to process
|
|
127
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
128
|
+
|
|
129
|
+
// terminateTask should NOT have been called since isTaskRunning returns false
|
|
130
|
+
expect(terminateTaskCalled).to.be.false;
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('should terminate task if task is still running', async () => {
|
|
134
|
+
let terminateTaskCalled = false;
|
|
135
|
+
mockTaskService.terminateTask = async () => {
|
|
136
|
+
terminateTaskCalled = true;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// Mock isTaskRunning to return true (task still running)
|
|
140
|
+
mockTaskService.isTaskRunning = () => true;
|
|
141
|
+
|
|
142
|
+
// Mock getTerminateSignal to never resolve (simulates in-flight task)
|
|
143
|
+
mockTaskService.getTerminateSignal = () => new Promise(() => { });
|
|
144
|
+
|
|
145
|
+
const taskRunnerProvider = container.get(TaskRunnerProvider);
|
|
146
|
+
const handler = taskRunnerProvider.getTool().handler;
|
|
147
|
+
|
|
148
|
+
// Start task execution (will hang on getTerminateSignal)
|
|
149
|
+
handler(JSON.stringify({ taskName: 'build' }), mockCtx);
|
|
150
|
+
|
|
151
|
+
// Give time for the handler to register the cancellation listener
|
|
152
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
153
|
+
|
|
154
|
+
// Cancel while task is "in-flight"
|
|
155
|
+
cancellationTokenSource.cancel();
|
|
156
|
+
|
|
157
|
+
// Give time for cancellation to process
|
|
158
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
159
|
+
|
|
160
|
+
// terminateTask SHOULD have been called since isTaskRunning returns true
|
|
161
|
+
expect(terminateTaskCalled).to.be.true;
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('should handle multiple tasks with shared cancellation token - only terminate running tasks', async () => {
|
|
165
|
+
const terminatedTasks: number[] = [];
|
|
166
|
+
mockTaskService.terminateTask = async (taskInfo: TaskInfo) => {
|
|
167
|
+
terminatedTasks.push(taskInfo.taskId);
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Mock isTaskRunning to simulate: task 0 completed, tasks 1 & 2 still running
|
|
171
|
+
mockTaskService.isTaskRunning = (taskId: number) => taskId !== 0;
|
|
172
|
+
|
|
173
|
+
// Mock getTerminateSignal to never resolve (simulates in-flight handlers)
|
|
174
|
+
mockTaskService.getTerminateSignal = () => new Promise(() => { });
|
|
175
|
+
|
|
176
|
+
// Mock runTaskByLabel to return different task IDs
|
|
177
|
+
let taskIdCounter = 0;
|
|
178
|
+
mockTaskService.runTaskByLabel = async (token: number, taskLabel: string) => ({
|
|
179
|
+
taskId: taskIdCounter++,
|
|
180
|
+
terminalId: taskIdCounter - 1,
|
|
181
|
+
config: {
|
|
182
|
+
label: taskLabel,
|
|
183
|
+
_scope: 'workspace',
|
|
184
|
+
type: 'shell'
|
|
185
|
+
}
|
|
186
|
+
} as TaskInfo);
|
|
187
|
+
|
|
188
|
+
const taskRunnerProvider = container.get(TaskRunnerProvider);
|
|
189
|
+
const handler = taskRunnerProvider.getTool().handler;
|
|
190
|
+
|
|
191
|
+
// Use ONE shared CancellationTokenSource (simulates real scenario)
|
|
192
|
+
const sharedCts = new CancellationTokenSource();
|
|
193
|
+
const sharedCtx: ToolInvocationContext = { cancellationToken: sharedCts.token };
|
|
194
|
+
|
|
195
|
+
// Call handler three times with the same shared cancellation token
|
|
196
|
+
handler(JSON.stringify({ taskName: 'build' }), sharedCtx);
|
|
197
|
+
handler(JSON.stringify({ taskName: 'test' }), sharedCtx);
|
|
198
|
+
handler(JSON.stringify({ taskName: 'lint' }), sharedCtx);
|
|
199
|
+
|
|
200
|
+
// Give time for handlers to register cancellation listeners
|
|
201
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
202
|
+
|
|
203
|
+
// Cancel the shared token once - this fires all registered listeners
|
|
204
|
+
sharedCts.cancel();
|
|
205
|
+
|
|
206
|
+
// Give time for cancellation listeners to fire
|
|
207
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
208
|
+
|
|
209
|
+
// Only task 1 and 2 should have been terminated (task 0 was completed)
|
|
210
|
+
expect(terminatedTasks).to.have.lengthOf(2);
|
|
211
|
+
expect(terminatedTasks).to.include(1);
|
|
212
|
+
expect(terminatedTasks).to.include(2);
|
|
213
|
+
expect(terminatedTasks).to.not.include(0);
|
|
214
|
+
|
|
215
|
+
sharedCts.dispose();
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
101
219
|
it('TaskListProvider should respect cancellation token', async () => {
|
|
102
220
|
const taskListProvider = container.get(TaskListProvider);
|
|
103
221
|
cancellationTokenSource.cancel();
|
|
@@ -113,7 +113,10 @@ export class TaskRunnerProvider implements ToolProvider {
|
|
|
113
113
|
return `Did not find a task for the label: '${args.taskName}'`;
|
|
114
114
|
}
|
|
115
115
|
cancellationToken?.onCancellationRequested(() => {
|
|
116
|
-
|
|
116
|
+
// Only terminate if the task is still running
|
|
117
|
+
if (this.taskService.isTaskRunning(taskInfo.taskId)) {
|
|
118
|
+
this.taskService.terminateTask(taskInfo);
|
|
119
|
+
}
|
|
117
120
|
});
|
|
118
121
|
if (cancellationToken?.isCancellationRequested) {
|
|
119
122
|
return JSON.stringify({ error: 'Operation cancelled by user' });
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { AI_CORE_PREFERENCES_TITLE } from '@theia/ai-core/lib/common';
|
|
18
|
-
import { nls, PreferenceSchema } from '@theia/core';
|
|
18
|
+
import { nls, PreferenceSchema, PreferenceScope } from '@theia/core';
|
|
19
19
|
|
|
20
20
|
// We reuse the context key for the preference name
|
|
21
21
|
export const PREFERENCE_NAME_ENABLE_AI = 'ai-features.AiEnable.enableAI';
|
|
22
22
|
export const PREFERENCE_NAME_ORCHESTRATOR_EXCLUSION_LIST = 'ai-features.orchestrator.excludedAgents';
|
|
23
|
-
export const
|
|
23
|
+
export const PREFERENCE_NAME_AGENT_MODE_ENABLED = 'ai-features.agentMode.enabled';
|
|
24
24
|
export const aiIdePreferenceSchema: PreferenceSchema = {
|
|
25
25
|
properties: {
|
|
26
26
|
[PREFERENCE_NAME_ENABLE_AI]: {
|
|
@@ -49,14 +49,14 @@ export const aiIdePreferenceSchema: PreferenceSchema = {
|
|
|
49
49
|
},
|
|
50
50
|
default: ['ClaudeCode', 'Codex'],
|
|
51
51
|
},
|
|
52
|
-
[
|
|
52
|
+
[PREFERENCE_NAME_AGENT_MODE_ENABLED]: {
|
|
53
53
|
title: AI_CORE_PREFERENCES_TITLE,
|
|
54
|
-
|
|
55
|
-
'
|
|
56
|
-
|
|
57
|
-
+ 'Set to `false` to see the confirmation again on the next agent mode request.'),
|
|
54
|
+
description: nls.localize('theia/ai/ide/agentMode/enabled/mdDescription',
|
|
55
|
+
'Enable agent mode for the Coder agent. Agent mode allows autonomous file modifications without further confirmation.\
|
|
56
|
+
A first-use confirmation dialog is shown when using agent mode until this is set to `true`.'),
|
|
58
57
|
type: 'boolean',
|
|
59
58
|
default: false,
|
|
59
|
+
scope: PreferenceScope.User
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
};
|