Skip to content

Commit 86271d4

Browse files
authored
Avoid recreating deriveds (microsoft#262150)
1 parent db81937 commit 86271d4

File tree

1 file changed

+58
-60
lines changed

1 file changed

+58
-60
lines changed

src/vs/workbench/contrib/chat/browser/chatSelectedTools.ts

Lines changed: 58 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -64,76 +64,74 @@ export class ChatSelectedTools extends Disposable {
6464
/**
6565
* All tools and tool sets with their enabled state.
6666
*/
67-
get entriesMap(): IObservable<IToolAndToolSetEnablementMap> {
68-
return derived(r => {
69-
const map = new Map<IToolData | ToolSet, boolean>();
67+
public readonly entriesMap: IObservable<IToolAndToolSetEnablementMap> = derived(r => {
68+
const map = new Map<IToolData | ToolSet, boolean>();
7069

71-
const currentMode = this._mode.read(r);
70+
const currentMode = this._mode.read(r);
7271

73-
let currentMap = this._sessionStates.observable.read(r).get(currentMode.id);
74-
const modeTools = currentMode.customTools?.read(r);
75-
if (!currentMap && currentMode.kind === ChatModeKind.Agent && modeTools) {
76-
currentMap = this._toolsService.toToolAndToolSetEnablementMap(modeTools);
77-
}
78-
if (currentMap) {
79-
for (const tool of this._allTools.read(r)) {
80-
if (tool.canBeReferencedInPrompt) {
81-
map.set(tool, currentMap.get(tool) === true); // false if not present
82-
}
83-
}
84-
for (const toolSet of this._toolsService.toolSets.read(r)) {
85-
map.set(toolSet, currentMap.get(toolSet) === true); // false if not present
86-
}
87-
} else {
88-
const currData = this._selectedTools.read(r);
89-
const disabledToolSets = new Set(currData.disabledToolSets ?? []);
90-
const disabledTools = new Set(currData.disabledTools ?? []);
91-
92-
for (const tool of this._allTools.read(r)) {
93-
if (tool.canBeReferencedInPrompt) {
94-
map.set(tool, !disabledTools.has(tool.id));
95-
}
72+
let currentMap = this._sessionStates.observable.read(r).get(currentMode.id);
73+
const modeTools = currentMode.customTools?.read(r);
74+
if (!currentMap && currentMode.kind === ChatModeKind.Agent && modeTools) {
75+
currentMap = this._toolsService.toToolAndToolSetEnablementMap(modeTools);
76+
}
77+
if (currentMap) {
78+
for (const tool of this._allTools.read(r)) {
79+
if (tool.canBeReferencedInPrompt) {
80+
map.set(tool, currentMap.get(tool) === true); // false if not present
9681
}
97-
for (const toolSet of this._toolsService.toolSets.read(r)) {
98-
map.set(toolSet, !disabledToolSets.has(toolSet.id));
82+
}
83+
for (const toolSet of this._toolsService.toolSets.read(r)) {
84+
map.set(toolSet, currentMap.get(toolSet) === true); // false if not present
85+
}
86+
} else {
87+
const currData = this._selectedTools.read(r);
88+
const disabledToolSets = new Set(currData.disabledToolSets ?? []);
89+
const disabledTools = new Set(currData.disabledTools ?? []);
90+
91+
for (const tool of this._allTools.read(r)) {
92+
if (tool.canBeReferencedInPrompt) {
93+
map.set(tool, !disabledTools.has(tool.id));
9994
}
10095
}
101-
return map;
102-
});
103-
}
96+
for (const toolSet of this._toolsService.toolSets.read(r)) {
97+
map.set(toolSet, !disabledToolSets.has(toolSet.id));
98+
}
99+
}
100+
return map;
101+
});
104102

105-
get userSelectedTools(): IObservable<UserSelectedTools> {
106-
return derived(r => {
107-
const result: UserSelectedTools = {};
108103

109-
const _set = (tool: IToolData, enabled: boolean) => {
110-
// ONLY disable a tool that isn't enabled yet
111-
const enabledNow = result[tool.id];
112-
if (enabled || !enabledNow) {
113-
result[tool.id] = enabled;
114-
}
115-
};
104+
public readonly userSelectedTools: IObservable<UserSelectedTools> = derived(r => {
105+
const result: UserSelectedTools = {};
116106

117-
const map = this.entriesMap.read(r);
118-
for (const [item, enabled] of map) {
119-
if (item instanceof ToolSet) {
120-
for (const tool of item.getTools(r)) {
121-
// Tools from an mcp tool set are explicitly enabled/disabled under the tool set.
122-
// Other toolsets don't show individual tools under the tool set and enablement just follows the toolset.
123-
const toolEnabled = item.source.type === 'mcp' ?
124-
map.get(tool) ?? enabled :
125-
enabled;
126-
_set(tool, toolEnabled);
127-
}
128-
} else {
129-
if (item.canBeReferencedInPrompt) {
130-
_set(item, enabled);
131-
}
107+
const _set = (tool: IToolData, enabled: boolean) => {
108+
// ONLY disable a tool that isn't enabled yet
109+
const enabledNow = result[tool.id];
110+
if (enabled || !enabledNow) {
111+
result[tool.id] = enabled;
112+
}
113+
};
114+
115+
const map = this.entriesMap.read(r);
116+
for (const [item, enabled] of map) {
117+
if (item instanceof ToolSet) {
118+
for (const tool of item.getTools(r)) {
119+
// Tools from an mcp tool set are explicitly enabled/disabled under the tool set.
120+
// Other toolsets don't show individual tools under the tool set and enablement just follows the toolset.
121+
const toolEnabled = item.source.type === 'mcp' ?
122+
map.get(tool) ?? enabled :
123+
enabled;
124+
_set(tool, toolEnabled);
125+
}
126+
} else {
127+
if (item.canBeReferencedInPrompt) {
128+
_set(item, enabled);
132129
}
133130
}
134-
return result;
135-
});
136-
}
131+
}
132+
return result;
133+
});
134+
137135

138136
get entriesScope() {
139137
const mode = this._mode.get();

0 commit comments

Comments
 (0)