Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 24 additions & 9 deletions src/vs/platform/agentHost/node/copilot/copilotToolDisplay.ts
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,8 @@ export interface ITypedPermissionRequest extends PermissionRequest {
toolName?: string;
/** Tool arguments — set for `custom-tool` permission requests. */
args?: Record<string, unknown>;
/** URL — set for `url` permission requests. */
url?: string;
/** Unified diff of the proposed change — set for `write` permission requests. */
diff?: string;
/** New file contents that will be written — set for `write` permission requests. */
Expand Down Expand Up @@ -457,7 +459,7 @@ export function getPermissionDisplay(request: ITypedPermissionRequest): {
switch (request.kind) {
case 'shell':
return {
confirmationTitle: localize('copilot.permission.shell.title', "Run in terminal"),
confirmationTitle: localize('copilot.permission.shell.title', "Run in terminal?"),
invocationMessage: intention ?? getInvocationMessage(CopilotToolName.Bash, getToolDisplayName(CopilotToolName.Bash), fullCommandText ? { command: fullCommandText } : undefined),
toolInput: fullCommandText,
permissionKind: 'shell',
Expand All @@ -471,24 +473,24 @@ export function getPermissionDisplay(request: ITypedPermissionRequest): {
const sdkToolName = str(request.toolName);
if (command && sdkToolName && isShellTool(sdkToolName)) {
return {
confirmationTitle: localize('copilot.permission.shell.title', "Run in terminal"),
confirmationTitle: localize('copilot.permission.shell.title', "Run in terminal?"),
invocationMessage: getInvocationMessage(sdkToolName, getToolDisplayName(sdkToolName), { command }),
toolInput: command,
permissionKind: 'shell',
permissionPath: path,
};
}
return {
confirmationTitle: toolName ?? localize('copilot.permission.default.title', "Permission request"),
invocationMessage: localize('copilot.permission.default.message', "Permission request"),
confirmationTitle: localize('copilot.permission.default.title', "Allow tool call?"),
invocationMessage: md(localize('copilot.permission.default.message', "Allow the model to call {0}?", appendEscapedMarkdownInlineCode(toolName ?? request.kind))),
toolInput: args ? tryStringify(args) : tryStringify(request),
Comment thread
connor4312 marked this conversation as resolved.
permissionKind: request.kind,
permissionPath: path,
};
}
case 'write':
return {
confirmationTitle: localize('copilot.permission.write.title', "Write file"),
confirmationTitle: localize('copilot.permission.write.title', "Write file?"),
invocationMessage: getInvocationMessage(CopilotToolName.Edit, getToolDisplayName(CopilotToolName.Edit), path ? { path } : undefined),
toolInput: tryStringify(path ? { path } : request) ?? undefined,
permissionKind: 'write',
Expand All @@ -497,7 +499,9 @@ export function getPermissionDisplay(request: ITypedPermissionRequest): {
case 'mcp': {
const title = toolName ?? localize('copilot.permission.mcp.defaultTool', "MCP Tool");
return {
confirmationTitle: serverName ? `${serverName}: ${title}` : title,
confirmationTitle: serverName
? localize('copilot.permission.mcp.title', "Allow tool from {0}?", serverName)
: localize('copilot.permission.default.title', "Allow tool call?"),
invocationMessage: serverName ? `${serverName}: ${title}` : title,
toolInput: tryStringify({ serverName, toolName }) ?? undefined,
permissionKind: 'mcp',
Expand All @@ -506,16 +510,27 @@ export function getPermissionDisplay(request: ITypedPermissionRequest): {
}
case 'read':
return {
confirmationTitle: localize('copilot.permission.read.title', "Read file"),
confirmationTitle: localize('copilot.permission.read.title', "Read file?"),
invocationMessage: intention ?? getInvocationMessage(CopilotToolName.View, getToolDisplayName(CopilotToolName.View), path ? { path } : undefined),
toolInput: tryStringify(path ? { path, intention } : request) ?? undefined,
permissionKind: 'read',
permissionPath: path,
};
case 'url': {
const url = str(request.url);
// Parse through URL for punycode escaping, but preserve the raw value if parsing fails.
const normalizedUrl = url ? (URL.canParse(url) ? new URL(url).href : url) : undefined;
return {
confirmationTitle: localize('copilot.permission.url.title', "Fetch URL?"),
invocationMessage: md(localize('copilot.permission.url.message', "Allow fetching web content?")),
toolInput: normalizedUrl ? JSON.stringify({ url: normalizedUrl }) : undefined,
permissionKind: 'url',
};
}
default:
return {
confirmationTitle: localize('copilot.permission.default.title', "Permission request"),
invocationMessage: localize('copilot.permission.default.message', "Permission request"),
confirmationTitle: localize('copilot.permission.default.title', "Allow tool call?"),
invocationMessage: md(localize('copilot.permission.default.message', "Allow the model to call {0}?", appendEscapedMarkdownInlineCode(toolName ?? request.kind))),
toolInput: tryStringify(request) ?? undefined,
permissionKind: request.kind,
permissionPath: path,
Expand Down
Loading