diff --git a/src/vs/workbench/contrib/chat/browser/widget/input/chatSelectedTools.ts b/src/vs/workbench/contrib/chat/browser/widget/input/chatSelectedTools.ts index 6479ada11b6..0c15407e636 100644 --- a/src/vs/workbench/contrib/chat/browser/widget/input/chatSelectedTools.ts +++ b/src/vs/workbench/contrib/chat/browser/widget/input/chatSelectedTools.ts @@ -20,19 +20,15 @@ import { ILanguageModelToolsService, IToolAndToolSetEnablementMap, IToolData, IT import { PromptFileRewriter } from '../../promptSyntax/promptFileRewriter.js'; +// todo@connor4312/bhavyaus: make tools key off displayName so model-specific tool +// enablement can stick between models with different underlying tool definitions type ToolEnablementStates = { - /** - * Whether tools are keyed by their reference name. This is a new format to - * work with model-specific tools that may have different underlying names. - */ - readonly keyedByRefName: boolean; readonly toolSets: ReadonlyMap; readonly tools: ReadonlyMap; }; type StoredDataV2 = { readonly version: 2; - readonly keyedByRefName?: boolean; readonly toolSetEntries: [string, boolean][]; readonly toolEntries: [string, boolean][]; }; @@ -50,10 +46,10 @@ namespace ToolEnablementStates { if (isToolSet(entry)) { toolSets.set(entry.id, enabled); } else { - tools.set(entry.toolReferenceName || entry.id, enabled); + tools.set(entry.id, enabled); } } - return { keyedByRefName: true, toolSets, tools }; + return { toolSets, tools }; } function isStoredDataV1(data: StoredDataV1 | StoredDataV2 | undefined): data is StoredDataV1 { @@ -70,17 +66,17 @@ namespace ToolEnablementStates { try { const parsed = JSON.parse(storage); if (isStoredDataV2(parsed)) { - return { keyedByRefName: !!parsed.keyedByRefName, toolSets: new Map(parsed.toolSetEntries), tools: new Map(parsed.toolEntries) }; + return { toolSets: new Map(parsed.toolSetEntries), tools: new Map(parsed.toolEntries) }; } else if (isStoredDataV1(parsed)) { const toolSetEntries = parsed.disabledToolSets?.map(id => [id, false] as [string, boolean]); const toolEntries = parsed.disabledTools?.map(id => [id, false] as [string, boolean]); - return { keyedByRefName: false, toolSets: new Map(toolSetEntries), tools: new Map(toolEntries) }; + return { toolSets: new Map(toolSetEntries), tools: new Map(toolEntries) }; } } catch { // ignore } // invalid data - return { keyedByRefName: true, toolSets: new Map(), tools: new Map() }; + return { toolSets: new Map(), tools: new Map() }; } export function toStorage(state: ToolEnablementStates): string { @@ -118,7 +114,7 @@ export class ChatSelectedTools extends Disposable { const globalStateMemento = observableMemento({ key: 'chat/selectedTools', - defaultValue: { keyedByRefName: true, toolSets: new Map(), tools: new Map() }, + defaultValue: { toolSets: new Map(), tools: new Map() }, fromStorage: ToolEnablementStates.fromStorage, toStorage: ToolEnablementStates.toStorage }); @@ -152,16 +148,14 @@ export class ChatSelectedTools extends Disposable { // Use getTools with contextKeyService to filter tools by current model for (const tool of this._currentTools.read(r)) { if (tool.canBeReferencedInPrompt) { - const key = currentMap.keyedByRefName ? (tool.toolReferenceName || tool.id) : tool.id; - map.set(tool, currentMap.tools.get(key) !== false); // if unknown, it's enabled + map.set(tool, currentMap.tools.get(tool.id) !== false); // if unknown, it's enabled } } for (const toolSet of this._toolsService.getToolSetsForModel(lm, r)) { const toolSetEnabled = currentMap.toolSets.get(toolSet.id) !== false; // if unknown, it's enabled map.set(toolSet, toolSetEnabled); for (const tool of toolSet.getTools(r)) { - const key = currentMap.keyedByRefName ? (tool.toolReferenceName || tool.id) : tool.id; - map.set(tool, toolSetEnabled || currentMap.tools.get(key) === true); // if unknown, use toolSetEnabled + map.set(tool, toolSetEnabled || currentMap.tools.get(tool.id) === true); // if unknown, use toolSetEnabled } } return map;