Skip to content

Commit d231e6c

Browse files
authored
fix config-context-key handling when config isn't known yet (microsoft#239294)
* make sure to "read" when-clause of tools and agents as soon as registered * make sure to record config-context-keys that don't exist yet
1 parent 5bd0584 commit d231e6c

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

src/vs/platform/contextkey/browser/contextKeyService.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class ConfigAwareContextValuesContainer extends Context {
103103
private static readonly _keyPrefix = 'config.';
104104

105105
private readonly _values = TernarySearchTree.forConfigKeys<any>();
106+
private readonly _missed = TernarySearchTree.forConfigKeys<boolean>();
106107
private readonly _listener: IDisposable;
107108

108109
constructor(
@@ -117,7 +118,10 @@ class ConfigAwareContextValuesContainer extends Context {
117118
// new setting, reset everything
118119
const allKeys = Array.from(this._values, ([k]) => k);
119120
this._values.clear();
120-
emitter.fire(new ArrayContextKeyChangeEvent(allKeys));
121+
emitter.fire(new CompositeContextKeyChangeEvent([
122+
new ArrayContextKeyChangeEvent(allKeys),
123+
new ArrayContextKeyChangeEvent(Array.from(this._missed, ([k]) => k))
124+
]));
121125
} else {
122126
const changedKeys: string[] = [];
123127
for (const configKey of event.affectedKeys) {
@@ -172,6 +176,11 @@ class ConfigAwareContextValuesContainer extends Context {
172176
}
173177

174178
this._values.set(key, value);
179+
if (value === undefined) {
180+
this._missed.set(key, true);
181+
} else {
182+
this._missed.delete(key);
183+
}
175184
return value;
176185
}
177186

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ export class LanguageModelToolsService extends Disposable implements ILanguageMo
6767
this._tools.set(toolData.id, { data: toolData });
6868
this._onDidChangeToolsScheduler.schedule();
6969

70-
toolData.when?.keys().forEach(key => this._toolContextKeys.add(key));
70+
if (toolData.when) {
71+
this._contextKeyService.contextMatchesRules(toolData.when);
72+
toolData.when.keys().forEach(key => this._toolContextKeys.add(key));
73+
}
7174

7275
return toDisposable(() => {
7376
this._tools.delete(toolData.id);

src/vs/workbench/contrib/chat/common/chatAgents.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,8 @@ export class ChatAgentService extends Disposable implements IChatAgentService {
307307
this._agents.set(id, entry);
308308
this._updateAgentsContextKeys();
309309
this._updateContextKeys();
310+
this._agentIsEnabled(entry);
311+
310312
this._onDidChangeAgents.fire(undefined);
311313

312314
return toDisposable(() => {

0 commit comments

Comments
 (0)