Skip to content
Merged
Show file tree
Hide file tree
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
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { AcceptToolConfirmationActionId } from './actions/chatToolActions.js';
import { CancelChatActionId } from './actions/chatExecuteActions.js';
import { IInstantiationService, ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
import { IChatToolInvocation } from '../common/chatService.js';
import { migrateLegacyTerminalToolSpecificData } from '../common/chat.js';

export const getToolConfirmationAlert = (accessor: ServicesAccessor, toolInvocation: IChatToolInvocation[]) => {
const keybindingService = accessor.get(IKeybindingService);
Expand All @@ -28,7 +29,8 @@ export const getToolConfirmationAlert = (accessor: ServicesAccessor, toolInvocat
let input = '';
if (v.toolSpecificData) {
if (v.toolSpecificData.kind === 'terminal') {
input = v.toolSpecificData.commandLine.toolEdited ?? v.toolSpecificData.commandLine.original;
const terminalData = migrateLegacyTerminalToolSpecificData(v.toolSpecificData);
input = terminalData.commandLine.toolEdited ?? terminalData.commandLine.original;
} else if (v.toolSpecificData.kind === 'extensions') {
input = JSON.stringify(v.toolSpecificData.extensions);
} else if (v.toolSpecificData.kind === 'input') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import { MarkdownString } from '../../../../../../base/common/htmlContent.js';
import { ThemeIcon } from '../../../../../../base/common/themables.js';
import { MarkdownRenderer } from '../../../../../../editor/browser/widget/markdownRenderer/browser/markdownRenderer.js';
import { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';
import { IChatMarkdownContent, IChatToolInvocation, IChatToolInvocationSerialized, type IChatTerminalToolInvocationData } from '../../../common/chatService.js';
import { migrateLegacyTerminalToolSpecificData } from '../../../common/chat.js';
import { IChatMarkdownContent, IChatToolInvocation, IChatToolInvocationSerialized, type IChatTerminalToolInvocationData, type ILegacyChatTerminalToolInvocationData } from '../../../common/chatService.js';
import { CodeBlockModelCollection } from '../../../common/codeBlockModelCollection.js';
import { IChatCodeBlockInfo } from '../../chat.js';
import { ICodeBlockRenderOptions } from '../../codeBlockPart.js';
Expand All @@ -27,7 +28,7 @@ export class ChatTerminalMarkdownProgressPart extends BaseChatToolInvocationSubP

constructor(
toolInvocation: IChatToolInvocation | IChatToolInvocationSerialized,
terminalData: IChatTerminalToolInvocationData,
terminalData: IChatTerminalToolInvocationData | ILegacyChatTerminalToolInvocationData,
context: IChatContentPartRenderContext,
renderer: MarkdownRenderer,
editorPool: EditorPool,
Expand All @@ -38,6 +39,8 @@ export class ChatTerminalMarkdownProgressPart extends BaseChatToolInvocationSubP
) {
super(toolInvocation);

terminalData = migrateLegacyTerminalToolSpecificData(terminalData);

const command = terminalData.commandLine.userEdited ?? terminalData.commandLine.toolEdited ?? terminalData.commandLine.original;

let content = `\`\`\`${terminalData.language}\n${command}\n\`\`\``;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ import { localize } from '../../../../../../nls.js';
import { IContextKeyService } from '../../../../../../platform/contextkey/common/contextkey.js';
import { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';
import { IKeybindingService } from '../../../../../../platform/keybinding/common/keybinding.js';
import { migrateLegacyTerminalToolSpecificData } from '../../../common/chat.js';
import { ChatContextKeys } from '../../../common/chatContextKeys.js';
import { IChatToolInvocation, type IChatTerminalToolInvocationData } from '../../../common/chatService.js';
import { IChatToolInvocation, type IChatTerminalToolInvocationData, type ILegacyChatTerminalToolInvocationData } from '../../../common/chatService.js';
import { CancelChatActionId } from '../../actions/chatExecuteActions.js';
import { AcceptToolConfirmationActionId } from '../../actions/chatToolActions.js';
import { IChatCodeBlockInfo, IChatWidgetService } from '../../chat.js';
Expand All @@ -27,16 +28,6 @@ import { IChatContentPartRenderContext } from '../chatContentParts.js';
import { EditorPool } from '../chatMarkdownContentPart.js';
import { BaseChatToolInvocationSubPart } from './chatToolInvocationSubPart.js';

/**
* @deprecated This is the old API shape, we should support this for a while before removing it so
* we don't break existing chats
*/
interface ILegacyChatTerminalToolInvocationData {
kind: 'terminal';
command: string;
language: string;
}

export class TerminalConfirmationWidgetSubPart extends BaseChatToolInvocationSubPart {
public readonly domNode: HTMLElement;
public readonly codeblocks: IChatCodeBlockInfo[] = [];
Expand All @@ -62,18 +53,7 @@ export class TerminalConfirmationWidgetSubPart extends BaseChatToolInvocationSub
throw new Error('Confirmation messages are missing');
}

// Migrate forward the old tool data format
if ('command' in terminalData) {
terminalData = {
kind: 'terminal',
commandLine: {
original: terminalData.command,
toolEdited: undefined,
userEdited: undefined
},
language: terminalData.language
} satisfies IChatTerminalToolInvocationData;
}
terminalData = migrateLegacyTerminalToolSpecificData(terminalData);

const title = toolInvocation.confirmationMessages.title;
const message = toolInvocation.confirmationMessages.message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { AccessibleViewProviderId, AccessibleViewType, IAccessibleViewContentPro
import { IAccessibleViewImplementation } from '../../../../platform/accessibility/browser/accessibleViewRegistry.js';
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
import { AccessibilityVerbositySettingId } from '../../accessibility/browser/accessibilityConfiguration.js';
import { migrateLegacyTerminalToolSpecificData } from '../common/chat.js';
import { ChatContextKeys } from '../common/chatContextKeys.js';
import { isResponseVM } from '../common/chatViewModel.js';
import { ChatTreeItem, IChatWidget, IChatWidgetService } from './chat.js';
Expand Down Expand Up @@ -87,15 +88,18 @@ class ChatResponseAccessibleProvider extends Disposable implements IAccessibleVi
const message = typeof toolInvocation.confirmationMessages.message === 'string' ? toolInvocation.confirmationMessages.message : stripIcons(renderAsPlaintext(toolInvocation.confirmationMessages.message));
let input = '';
if (toolInvocation.toolSpecificData) {
input = toolInvocation.toolSpecificData?.kind === 'terminal'
? toolInvocation.toolSpecificData.commandLine.userEdited ?? toolInvocation.toolSpecificData.commandLine.toolEdited ?? toolInvocation.toolSpecificData.commandLine.original
: toolInvocation.toolSpecificData?.kind === 'extensions'
if (toolInvocation.toolSpecificData?.kind === 'terminal') {
const terminalData = migrateLegacyTerminalToolSpecificData(toolInvocation.toolSpecificData);
input = terminalData.commandLine.userEdited ?? terminalData.commandLine.toolEdited ?? terminalData.commandLine.original;
} else {
input = toolInvocation.toolSpecificData?.kind === 'extensions'
? JSON.stringify(toolInvocation.toolSpecificData.extensions)
: toolInvocation.toolSpecificData?.kind === 'todoList'
? JSON.stringify(toolInvocation.toolSpecificData.todoList)
: toolInvocation.toolSpecificData?.kind === 'pullRequest'
? JSON.stringify(toolInvocation.toolSpecificData)
: JSON.stringify(toolInvocation.toolSpecificData.rawInput);
}
}
responseContent += `${title}`;
if (input) {
Expand Down
20 changes: 20 additions & 0 deletions src/vs/workbench/contrib/chat/common/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import type { IChatTerminalToolInvocationData, ILegacyChatTerminalToolInvocationData } from './chatService.js';
import { ChatModeKind } from './constants.js';

export function checkModeOption(mode: ChatModeKind, option: boolean | ((mode: ChatModeKind) => boolean) | undefined): boolean | undefined {
Expand All @@ -14,3 +15,22 @@ export function checkModeOption(mode: ChatModeKind, option: boolean | ((mode: Ch
}
return option;
}

/**
* @deprecated This is the old API shape, we should support this for a while before removing it so
* we don't break existing chats
*/
export function migrateLegacyTerminalToolSpecificData(data: IChatTerminalToolInvocationData | ILegacyChatTerminalToolInvocationData): IChatTerminalToolInvocationData {
if ('command' in data) {
data = {
kind: 'terminal',
commandLine: {
original: data.command,
toolEdited: undefined,
userEdited: undefined
},
language: data.language
} satisfies IChatTerminalToolInvocationData;
}
return data;
}
12 changes: 11 additions & 1 deletion src/vs/workbench/contrib/chat/common/chatService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,14 +280,24 @@ export interface IChatTerminalToolInvocationData {
language: string;
}

/**
* @deprecated This is the old API shape, we should support this for a while before removing it so
* we don't break existing chats
*/
export interface ILegacyChatTerminalToolInvocationData {
kind: 'terminal';
command: string;
language: string;
}

export interface IChatToolInputInvocationData {
kind: 'input';
rawInput: any;
}

export interface IChatToolInvocation {
presentation: IPreparedToolInvocation['presentation'];
toolSpecificData?: IChatTerminalToolInvocationData | IChatToolInputInvocationData | IChatExtensionsContent | IChatPullRequestContent | IChatTodoListContent;
toolSpecificData?: IChatTerminalToolInvocationData | ILegacyChatTerminalToolInvocationData | IChatToolInputInvocationData | IChatExtensionsContent | IChatPullRequestContent | IChatTodoListContent;
/** Presence of this property says that confirmation is required */
confirmationMessages?: IToolConfirmationMessages;
confirmed: DeferredPromise<boolean>;
Expand Down
Loading