Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/chatSessions/claude/node/toolPermissionHandlers/editToolHandler.ts
13406 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { FileEditInput, FileWriteInput } from '@anthropic-ai/claude-agent-sdk/sdk-tools';
7
import { URI } from '../../../../../util/vs/base/common/uri';
8
import { IInstantiationService } from '../../../../../util/vs/platform/instantiation/common/instantiation';
9
import { isFileOkForTool } from '../../../../tools/node/toolUtils';
10
import { ClaudeToolPermissionContext, IClaudeToolPermissionHandler } from '../../common/claudeToolPermission';
11
import { registerToolPermissionHandler } from '../../common/claudeToolPermissionRegistry';
12
import { ClaudeToolNames } from '../../common/claudeTools';
13
14
type EditToolName = ClaudeToolNames.Edit | ClaudeToolNames.Write | ClaudeToolNames.MultiEdit;
15
16
/**
17
* Handler for edit tools (Edit, Write, MultiEdit).
18
* Auto-approves edits to files within the workspace, or when permission mode is 'acceptEdits'.
19
*/
20
export class EditToolHandler implements IClaudeToolPermissionHandler<EditToolName> {
21
public readonly toolNames = [ClaudeToolNames.Edit, ClaudeToolNames.Write, ClaudeToolNames.MultiEdit] as const;
22
23
constructor(
24
@IInstantiationService private readonly instantiationService: IInstantiationService,
25
) { }
26
27
public async canAutoApprove(
28
_toolName: EditToolName,
29
input: FileEditInput | FileWriteInput,
30
context: ClaudeToolPermissionContext
31
): Promise<boolean> {
32
// Auto-approve all edits in 'acceptEdits' mode
33
if (context.permissionMode === 'acceptEdits') {
34
return true;
35
} else if (context.permissionMode === 'bypassPermissions') {
36
return true;
37
} else if (context.permissionMode === 'default') {
38
return false;
39
}
40
// Otherwise, only auto-approve files within the workspace
41
return this.instantiationService.invokeFunction(isFileOkForTool, URI.file(input.file_path));
42
}
43
}
44
45
// Self-register the handler
46
registerToolPermissionHandler(
47
[ClaudeToolNames.Edit, ClaudeToolNames.Write, ClaudeToolNames.MultiEdit],
48
EditToolHandler
49
);
50
51