Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
12 changes: 12 additions & 0 deletions src/vs/workbench/api/common/extHostTypeConverters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2961,6 +2961,18 @@ export namespace ChatToolInvocationPart {
status: todoStatusEnumToString(todo.status)
}))
};
} else if (data && Array.isArray(data) || (data.some((v: any) => v instanceof types.Location || URI.isUri(v)))) {
// Convert extension API resources tool data to internal format
return {
kind: 'resources',
values: data.map((v: any) => {
if (v instanceof types.Location) {
return Location.from(v);
} else {
return URI.revive(v);
}
})
};
}
return data;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { ServicesAccessor } from '../../../../../platform/instantiation/common/i
import { AccessibilityVerbositySettingId } from '../../../accessibility/browser/accessibilityConfiguration.js';
import { migrateLegacyTerminalToolSpecificData } from '../../common/chat.js';
import { ChatContextKeys } from '../../common/actions/chatContextKeys.js';
import { IChatExtensionsContent, IChatPullRequestContent, IChatSubagentToolInvocationData, IChatTerminalToolInvocationData, IChatTodoListContent, IChatToolInputInvocationData, IChatToolInvocation, ILegacyChatTerminalToolInvocationData, IToolResultOutputDetailsSerialized, isLegacyChatTerminalToolInvocationData } from '../../common/chatService/chatService.js';
import { IChatExtensionsContent, IChatPullRequestContent, IChatSubagentToolInvocationData, IChatTerminalToolInvocationData, IChatTodoListContent, IChatToolInputInvocationData, IChatToolInvocation, IChatToolResourcesInvocationData, ILegacyChatTerminalToolInvocationData, IToolResultOutputDetailsSerialized, isLegacyChatTerminalToolInvocationData } from '../../common/chatService/chatService.js';
import { isResponseVM } from '../../common/model/chatViewModel.js';
import { IToolResultInputOutputDetails, IToolResultOutputDetails, isToolResultInputOutputDetails, isToolResultOutputDetails, toolContentToA11yString } from '../../common/tools/languageModelToolsService.js';
import { ChatTreeItem, IChatWidget, IChatWidgetService } from '../chat.js';
Expand Down Expand Up @@ -48,7 +48,7 @@ export class ChatResponseAccessibleView implements IAccessibleViewImplementation
}
}

type ToolSpecificData = IChatTerminalToolInvocationData | ILegacyChatTerminalToolInvocationData | IChatToolInputInvocationData | IChatExtensionsContent | IChatPullRequestContent | IChatTodoListContent | IChatSubagentToolInvocationData;
type ToolSpecificData = IChatTerminalToolInvocationData | ILegacyChatTerminalToolInvocationData | IChatToolInputInvocationData | IChatExtensionsContent | IChatPullRequestContent | IChatTodoListContent | IChatSubagentToolInvocationData | IChatToolResourcesInvocationData;
type ResultDetails = Array<URI | Location> | IToolResultInputOutputDetails | IToolResultOutputDetails | IToolResultOutputDetailsSerialized;

function isOutputDetailsSerialized(obj: unknown): obj is IToolResultOutputDetailsSerialized {
Expand Down Expand Up @@ -102,6 +102,22 @@ export function getToolSpecificDataDescription(toolSpecificData: ToolSpecificDat
return typeof toolSpecificData.rawInput === 'string'
? toolSpecificData.rawInput
: JSON.stringify(toolSpecificData.rawInput);
case 'resources': {
const values = toolSpecificData.values;
if (values.length === 0) {
return '';
}
const paths = values.map(v => {
if ('uri' in v && 'range' in v) {
// Location
return `${v.uri.fsPath || v.uri.path}:${v.range.startLineNumber}`;
} else {
// URI
return v.fsPath || v.path;
}
}).join(', ');
return localize('resourcesList', "Resources: {0}", paths);
}
default:
return '';
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,10 @@ export class ChatToolInvocationPart extends Disposable implements IChatContentPa
return this.instantiationService.createInstance(ChatTerminalToolProgressPart, this.toolInvocation, this.toolInvocation.toolSpecificData, this.context, this.renderer, this.editorPool, this.currentWidthDelegate, this.codeBlockStartIndex, this.codeBlockModelCollection);
}

if (this.toolInvocation.toolSpecificData?.kind === 'resources' && this.toolInvocation.toolSpecificData.values.length > 0) {
return this.instantiationService.createInstance(ChatResultListSubPart, this.toolInvocation, this.context, this.toolInvocation.pastTenseMessage ?? this.toolInvocation.invocationMessage, this.toolInvocation.toolSpecificData.values, this.listPool);
}

const resultDetails = IChatToolInvocation.resultDetails(this.toolInvocation);
if (Array.isArray(resultDetails) && resultDetails.length) {
return this.instantiationService.createInstance(ChatResultListSubPart, this.toolInvocation, this.context, this.toolInvocation.pastTenseMessage ?? this.toolInvocation.invocationMessage, resultDetails, this.listPool);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -535,7 +535,7 @@ export type ConfirmedReason =

export interface IChatToolInvocation {
readonly presentation: IPreparedToolInvocation['presentation'];
readonly toolSpecificData?: IChatTerminalToolInvocationData | ILegacyChatTerminalToolInvocationData | IChatToolInputInvocationData | IChatExtensionsContent | IChatPullRequestContent | IChatTodoListContent | IChatSubagentToolInvocationData;
readonly toolSpecificData?: IChatTerminalToolInvocationData | ILegacyChatTerminalToolInvocationData | IChatToolInputInvocationData | IChatExtensionsContent | IChatPullRequestContent | IChatTodoListContent | IChatSubagentToolInvocationData | IChatToolResourcesInvocationData;
readonly originMessage: string | IMarkdownString | undefined;
readonly invocationMessage: string | IMarkdownString;
readonly pastTenseMessage: string | IMarkdownString | undefined;
Expand Down Expand Up @@ -793,7 +793,7 @@ export interface IToolResultOutputDetailsSerialized {
*/
export interface IChatToolInvocationSerialized {
presentation: IPreparedToolInvocation['presentation'];
toolSpecificData?: IChatTerminalToolInvocationData | IChatToolInputInvocationData | IChatExtensionsContent | IChatPullRequestContent | IChatTodoListContent | IChatSubagentToolInvocationData;
toolSpecificData?: IChatTerminalToolInvocationData | IChatToolInputInvocationData | IChatExtensionsContent | IChatPullRequestContent | IChatTodoListContent | IChatSubagentToolInvocationData | IChatToolResourcesInvocationData;
invocationMessage: string | IMarkdownString;
originMessage: string | IMarkdownString | undefined;
pastTenseMessage: string | IMarkdownString | undefined;
Expand Down Expand Up @@ -840,6 +840,11 @@ export interface IChatTodoListContent {
}>;
}

export interface IChatToolResourcesInvocationData {
readonly kind: 'resources';
readonly values: Array<URI | Location>;
}

export interface IChatMcpServersStarting {
readonly kind: 'mcpServersStarting';
readonly state?: IObservable<IAutostartResult>; // not hydrated when serialized
Expand Down
9 changes: 8 additions & 1 deletion src/vscode-dts/vscode.proposed.chatParticipantAdditions.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,13 @@ declare module 'vscode' {
}>;
}

export interface ChatToolResourcesInvocationData {
/**
* Array of file URIs or locations to display as a collapsible list
*/
values: Array<Uri | Location>;
}

export class ChatToolInvocationPart {
toolName: string;
toolCallId: string;
Expand All @@ -289,7 +296,7 @@ declare module 'vscode' {
pastTenseMessage?: string | MarkdownString;
isConfirmed?: boolean;
isComplete?: boolean;
toolSpecificData?: ChatTerminalToolInvocationData | ChatMcpToolInvocationData | ChatTodoToolInvocationData;
toolSpecificData?: ChatTerminalToolInvocationData | ChatMcpToolInvocationData | ChatTodoToolInvocationData | ChatToolResourcesInvocationData;
subAgentInvocationId?: string;
presentation?: 'hidden' | 'hiddenAfterComplete' | undefined;

Expand Down
Loading