Skip to content

Commit a61e381

Browse files
authored
Disable get_task_output and run_task tools when no tasks are available in workspace (microsoft#261677)
1 parent f6cf585 commit a61e381

File tree

5 files changed

+17
-4
lines changed

5 files changed

+17
-4
lines changed

src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ import { ITerminalGroupService, ITerminalService } from '../../terminal/browser/
4848
import { ITerminalProfileResolverService } from '../../terminal/common/terminal.js';
4949

5050
import { ConfiguringTask, ContributedTask, CustomTask, ExecutionEngine, InMemoryTask, ITaskEvent, ITaskIdentifier, ITaskSet, JsonSchemaVersion, KeyedTaskIdentifier, RuntimeType, Task, TASK_RUNNING_STATE, TaskDefinition, TaskGroup, TaskRunSource, TaskSettingId, TaskSorter, TaskSourceKind, TasksSchemaProperties, USER_TASKS_GROUP_KEY, TaskEventKind, InstancePolicy, RerunAllRunningTasksCommandId } from '../common/tasks.js';
51-
import { CustomExecutionSupportedContext, ICustomizationProperties, IProblemMatcherRunOptions, ITaskFilter, ITaskProvider, ITaskService, IWorkspaceFolderTaskResult, ProcessExecutionSupportedContext, ServerlessWebContext, ShellExecutionSupportedContext, TaskCommandsRegistered, TaskExecutionSupportedContext } from '../common/taskService.js';
51+
import { CustomExecutionSupportedContext, ICustomizationProperties, IProblemMatcherRunOptions, ITaskFilter, ITaskProvider, ITaskService, IWorkspaceFolderTaskResult, ProcessExecutionSupportedContext, ServerlessWebContext, ShellExecutionSupportedContext, TaskCommandsRegistered, TaskExecutionSupportedContext, TasksAvailableContext } from '../common/taskService.js';
5252
import { ITaskExecuteResult, ITaskResolver, ITaskSummary, ITaskSystem, ITaskSystemInfo, ITaskTerminateResponse, TaskError, TaskErrors, TaskExecuteKind, Triggers, VerifiedTask } from '../common/taskSystem.js';
5353
import { getTemplates as getTaskTemplates } from '../common/taskTemplates.js';
5454

@@ -231,6 +231,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
231231
private _persistentTasks: LRUCache<string, string> | undefined;
232232

233233
protected _taskRunningState: IContextKey<boolean>;
234+
protected _tasksAvailableState: IContextKey<boolean>;
234235

235236
protected _outputChannel: IOutputChannel;
236237
protected readonly _onDidStateChange: Emitter<ITaskEvent>;
@@ -347,6 +348,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
347348

348349
}));
349350
this._taskRunningState = TASK_RUNNING_STATE.bindTo(_contextKeyService);
351+
this._tasksAvailableState = TasksAvailableContext.bindTo(_contextKeyService);
350352
this._onDidStateChange = this._register(new Emitter());
351353
this._registerCommands().then(() => TaskCommandsRegistered.bindTo(this._contextKeyService).set(true));
352354
ServerlessWebContext.bindTo(this._contextKeyService).set(Platform.isWeb && !remoteAgentService.getConnection()?.remoteAuthority);
@@ -2467,6 +2469,14 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
24672469
if (userTasks) {
24682470
result.set(USER_TASKS_GROUP_KEY, userTasks);
24692471
}
2472+
2473+
// Update tasks available context key
2474+
const hasAnyTasks = Array.from(result.values()).some(folderResult =>
2475+
(folderResult.set?.tasks && folderResult.set.tasks.length > 0) ||
2476+
(folderResult.configurations?.byIdentifier && Object.keys(folderResult.configurations.byIdentifier).length > 0)
2477+
);
2478+
this._tasksAvailableState.set(hasAnyTasks);
2479+
24702480
return result;
24712481
}
24722482

src/vs/workbench/contrib/tasks/common/taskService.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const ShellExecutionSupportedContext = new RawContextKey<boolean>('shellE
2020
export const TaskCommandsRegistered = new RawContextKey<boolean>('taskCommandsRegistered', false, nls.localize('tasks.taskCommandsRegistered', "Whether the task commands have been registered yet"));
2121
export const ProcessExecutionSupportedContext = new RawContextKey<boolean>('processExecutionSupported', false, nls.localize('tasks.processExecutionSupported', "Whether ProcessExecution tasks are supported. Consider using in the when clause of a \'taskDefinition\' contribution."));
2222
export const ServerlessWebContext = new RawContextKey<boolean>('serverlessWebContext', false, nls.localize('tasks.serverlessWebContext', "True when in the web with no remote authority."));
23+
export const TasksAvailableContext = new RawContextKey<boolean>('tasksAvailable', false, nls.localize('tasks.tasksAvailable', "Whether any tasks are available in the workspace."));
2324
export const TaskExecutionSupportedContext = ContextKeyExpr.or(ContextKeyExpr.and(ShellExecutionSupportedContext, ProcessExecutionSupportedContext), CustomExecutionSupportedContext);
2425

2526
export const ITaskService = createDecorator<ITaskService>('taskService');

src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class ChatAgentToolsContribution extends Disposable implements IWorkbenchContrib
8282
this._register(toolsService.registerToolImplementation(CreateAndRunTaskToolData.id, createAndRunTaskTool));
8383

8484
const runTasksToolSet = this._register(toolsService.createToolSet(ToolDataSource.Internal, 'runTasks', 'runTasks', {
85-
description: localize('toolset.runTasks', 'Runs tasks and gets their output for your workspace')
85+
description: localize('toolset.runTasks', 'Runs tasks and gets their output for your workspace'),
8686
}));
8787
runTasksToolSet.addTool(RunTaskToolData);
8888
runTasksToolSet.addTool(GetTaskOutputToolData);

src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/getTaskOutputTool.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { IMarkerService } from '../../../../../../../platform/markers/common/mar
1212
import { IChatService } from '../../../../../chat/common/chatService.js';
1313
import { ILanguageModelsService } from '../../../../../chat/common/languageModels.js';
1414
import { ToolDataSource, type CountTokensCallback, type IPreparedToolInvocation, type IToolData, type IToolImpl, type IToolInvocation, type IToolInvocationPreparationContext, type IToolResult, type ToolProgress } from '../../../../../chat/common/languageModelToolsService.js';
15-
import { ITaskService } from '../../../../../tasks/common/taskService.js';
15+
import { ITaskService, TasksAvailableContext } from '../../../../../tasks/common/taskService.js';
1616
import { ITerminalService } from '../../../../../terminal/browser/terminal.js';
1717
import { collectTerminalResults, getTaskDefinition, getTaskForTool, resolveDependencyTasks } from '../../taskHelpers.js';
1818

@@ -22,6 +22,7 @@ export const GetTaskOutputToolData: IToolData = {
2222
displayName: localize('getTaskOutputTool.displayName', 'Get Task Output'),
2323
modelDescription: 'Get the output of a task',
2424
source: ToolDataSource.Internal,
25+
when: TasksAvailableContext,
2526
inputSchema: {
2627
type: 'object',
2728
properties: {

src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/runTaskTool.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { ITelemetryService } from '../../../../../../../platform/telemetry/commo
1010
import { IChatService } from '../../../../../chat/common/chatService.js';
1111
import { ILanguageModelsService } from '../../../../../chat/common/languageModels.js';
1212
import { CountTokensCallback, IPreparedToolInvocation, IToolData, IToolImpl, IToolInvocation, IToolInvocationPreparationContext, IToolResult, ToolDataSource, ToolProgress } from '../../../../../chat/common/languageModelToolsService.js';
13-
import { ITaskService, ITaskSummary, Task } from '../../../../../tasks/common/taskService.js';
13+
import { ITaskService, ITaskSummary, Task, TasksAvailableContext } from '../../../../../tasks/common/taskService.js';
1414
import { ITerminalService } from '../../../../../terminal/browser/terminal.js';
1515
import { collectTerminalResults, getTaskDefinition, getTaskForTool, resolveDependencyTasks } from '../../taskHelpers.js';
1616
import { MarkdownString } from '../../../../../../../base/common/htmlContent.js';
@@ -169,6 +169,7 @@ export const RunTaskToolData: IToolData = {
169169
userDescription: localize('runInTerminalTool.userDescription', 'Tool for running tasks in the workspace'),
170170
icon: Codicon.tools,
171171
source: ToolDataSource.Internal,
172+
when: TasksAvailableContext,
172173
inputSchema: {
173174
'type': 'object',
174175
'properties': {

0 commit comments

Comments
 (0)