Skip to content

Commit 8bb2ad3

Browse files
authored
Merge pull request #781 from CodinGame/lmn/fix-chat-context-keys
Fix chat context keys
2 parents 38d762f + 8daf3aa commit 8bb2ad3

4 files changed

Lines changed: 87 additions & 63 deletions

File tree

demo/src/setup.common.ts

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,7 @@ import getWorkspaceTrustOverride from '@codingame/monaco-vscode-workspace-trust-
5252
import getLogServiceOverride from '@codingame/monaco-vscode-log-service-override'
5353
import getWorkingCopyServiceOverride from '@codingame/monaco-vscode-working-copy-service-override'
5454
import getTestingServiceOverride from '@codingame/monaco-vscode-testing-service-override'
55-
import getChatServiceOverride, {
56-
ChatEntitlement
57-
} from '@codingame/monaco-vscode-chat-service-override'
55+
import getChatServiceOverride from '@codingame/monaco-vscode-chat-service-override'
5856
import getNotebookServiceOverride from '@codingame/monaco-vscode-notebook-service-override'
5957
import getWelcomeServiceOverride from '@codingame/monaco-vscode-welcome-service-override'
6058
import getWalkThroughServiceOverride from '@codingame/monaco-vscode-walkthrough-service-override'
@@ -400,7 +398,7 @@ export const constructOptions: IWorkbenchConstructionOptions = {
400398
export const envOptions: EnvironmentOverride = {
401399
// Otherwise, VSCode detect it as the first open workspace folder
402400
// which make the search result extension fail as it's not able to know what was detected by VSCode
403-
// userHome: vscode.Uri.file('/')
401+
userHome: vscode.Uri.file('/')
404402
}
405403

406404
export const commonServices: IEditorOverrideServices = {
@@ -446,18 +444,23 @@ export const commonServices: IEditorOverrideServices = {
446444
...getScmServiceOverride(),
447445
...getTestingServiceOverride(),
448446
...getChatServiceOverride({
449-
customEntitlement: {
450-
anonymous: false,
451-
entitlement: ChatEntitlement.Enterprise,
452-
previewFeaturesDisabled: false,
453-
quotas: {},
454-
sentiment: {
455-
installed: true,
456-
hidden: false,
457-
disabled: false,
458-
untrusted: false,
459-
registered: false
460-
}
447+
defaultAccount: {
448+
entitlementsData: {
449+
access_type_sku: 'unused',
450+
assigned_date: 'unused',
451+
can_signup_for_limited: false,
452+
copilot_plan: 'enterprise',
453+
organization_login_list: [],
454+
analytics_tracking_id: 'unused'
455+
},
456+
accountName: 'unused',
457+
authenticationProvider: {
458+
id: 'unused',
459+
name: 'unused',
460+
enterprise: true
461+
},
462+
enterprise: true,
463+
sessionId: 'unused'
461464
}
462465
}),
463466
...getNotebookServiceOverride(),

src/service-override/chat.ts

Lines changed: 32 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,7 @@ import { ILanguageModelIgnoredFilesService } from 'vs/workbench/contrib/chat/com
4141
import { IChatMarkdownAnchorService } from 'vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownAnchorService.service'
4242
import { ChatMarkdownAnchorService } from 'vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownAnchorService'
4343
import { ChatEditingService } from 'vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl'
44-
import {
45-
ChatEntitlement,
46-
ChatEntitlementService,
47-
type IChatSentiment,
48-
type IQuotas
49-
} from 'vs/workbench/services/chat/common/chatEntitlementService'
44+
import { ChatEntitlementService } from 'vs/workbench/services/chat/common/chatEntitlementService'
5045
import { PromptsService } from 'vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl'
5146
import { IChatEntitlementService } from 'vs/workbench/services/chat/common/chatEntitlementService.service'
5247
import { IPromptsService } from 'vs/workbench/contrib/chat/common/promptSyntax/service/promptsService.service'
@@ -120,50 +115,42 @@ import { ChatDebugServiceImpl } from 'vs/workbench/contrib/chat/common/chatDebug
120115
import { IChatResponseResourceFileSystemProvider } from 'vs/workbench/contrib/chat/common/widget/chatResponseResourceFileSystemProvider.service'
121116
import { ChatResponseResourceFileSystemProvider } from 'vs/workbench/contrib/chat/common/widget/chatResponseResourceFileSystemProvider'
122117
import { Event } from 'vs/base/common/event'
123-
import { constObservable } from 'vs/base/common/observable'
118+
import type { IDefaultAccount } from 'vs/base/common/defaultAccount'
119+
import { IDefaultAccountService } from 'vs/platform/defaultAccount/common/defaultAccount.service'
124120
import 'vs/workbench/contrib/chat/browser/chat.contribution'
125121
import 'vs/workbench/contrib/terminal/terminal.chat.contribution'
126122
import 'vs/workbench/contrib/inlineChat/browser/inlineChat.contribution'
127123
import 'vs/workbench/contrib/remoteCodingAgents/browser/remoteCodingAgents.contribution'
128124

129-
export interface CustomEntitlement {
130-
entitlement: ChatEntitlement
131-
sentiment: IChatSentiment
132-
anonymous: boolean
133-
quotas: IQuotas
134-
previewFeaturesDisabled: boolean
135-
}
125+
class DefaultAccountService implements IDefaultAccountService {
126+
declare _serviceBrand: undefined
127+
constructor(private defaultAccount: IDefaultAccount | null) {}
128+
129+
onDidChangePolicyData: IDefaultAccountService['onDidChangePolicyData'] = Event.None
130+
policyData: IDefaultAccountService['policyData'] = null
131+
132+
getDefaultAccountAuthenticationProvider: IDefaultAccountService['getDefaultAccountAuthenticationProvider'] =
133+
() => ({ id: 'default', name: 'Default', enterprise: false })
134+
setDefaultAccountProvider: IDefaultAccountService['setDefaultAccountProvider'] = () => {}
135+
refresh: IDefaultAccountService['refresh'] = async () => null
136+
signIn: IDefaultAccountService['signIn'] = async () => null
136137

137-
class CustomEntitlementService implements IChatEntitlementService {
138-
constructor(private customEntitlement: CustomEntitlement) {}
139-
_serviceBrand: undefined
140-
onDidChangeEntitlement = Event.None
141-
entitlement = this.customEntitlement.entitlement
142-
entitlementObs = constObservable(this.entitlement)
143-
previewFeaturesDisabled = this.customEntitlement.previewFeaturesDisabled
144-
organisations = undefined
145-
isInternal = true
146-
sku = undefined
147-
copilotTrackingId = undefined
148-
onDidChangeQuotaExceeded = Event.None
149-
onDidChangeQuotaRemaining = Event.None
150-
quotas = this.customEntitlement.quotas
151-
onDidChangeSentiment = Event.None
152-
sentiment = this.customEntitlement.sentiment
153-
sentimentObs = constObservable(this.sentiment)
154-
onDidChangeAnonymous = Event.None
155-
anonymous = this.customEntitlement.anonymous
156-
anonymousObs = constObservable(this.anonymous)
157-
markAnonymousRateLimited(): void {}
158-
async update(): Promise<void> {}
138+
readonly onDidChangeDefaultAccount: IDefaultAccountService['onDidChangeDefaultAccount'] =
139+
Event.None
140+
141+
getDefaultAccount: IDefaultAccountService['getDefaultAccount'] = async () => this.defaultAccount
142+
143+
copilotTokenInfo: IDefaultAccountService['copilotTokenInfo'] = null
144+
onDidChangeCopilotTokenInfo: IDefaultAccountService['onDidChangeCopilotTokenInfo'] = Event.None
145+
signOut: IDefaultAccountService['signOut'] = async () => {}
159146
}
160147

161148
export interface ChatServiceOverrideOptions {
162-
customEntitlement?: CustomEntitlement
149+
defaultAccount?: IDefaultAccount
163150
}
164151

165152
export default function getServiceOverride({
166-
customEntitlement
153+
defaultAccount
167154
}: ChatServiceOverrideOptions = {}): IEditorOverrideServices {
168155
return {
169156
[IChatService.toString()]: new SyncDescriptor(ChatService, [], true),
@@ -209,10 +196,7 @@ export default function getServiceOverride({
209196
[],
210197
true
211198
),
212-
[IChatEntitlementService.toString()]:
213-
customEntitlement != null
214-
? new SyncDescriptor(CustomEntitlementService, [customEntitlement], true)
215-
: new SyncDescriptor(ChatEntitlementService, [], true),
199+
[IChatEntitlementService.toString()]: new SyncDescriptor(ChatEntitlementService, [], true),
216200
[IPromptsService.toString()]: new SyncDescriptor(PromptsService, [], true),
217201
[IChatStatusItemService.toString()]: new SyncDescriptor(ChatStatusItemService, [], true),
218202
[IChatContextPickService.toString()]: new SyncDescriptor(ChatContextPickService, [], true),
@@ -302,9 +286,13 @@ export default function getServiceOverride({
302286
ChatResponseResourceFileSystemProvider,
303287
[],
304288
true
289+
),
290+
[IDefaultAccountService.toString()]: new SyncDescriptor(
291+
DefaultAccountService,
292+
[defaultAccount],
293+
true
305294
)
306295
}
307296
}
308297

309-
export { ChatEntitlement }
310-
export type { IChatSentiment, IQuotas }
298+
export type { IDefaultAccount }

vscode-patches/0085-fix-make-product-field-optional.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ index cc2445e006f..c61c32ec51d 100644
135135
if (packExtension.local && !extensionsToUninstall.some(e => areSameExtensions(e.extension.identifier, packExtension.identifier))) {
136136
extensionsToUninstall.push({ extension: packExtension.local });
137137
diff --git a/src/vs/workbench/services/accounts/browser/defaultAccount.ts b/src/vs/workbench/services/accounts/browser/defaultAccount.ts
138-
index 3e2724e96a5..294611c513e 100644
138+
index 3e2724e96a5..cf93bc4c6b8 100644
139139
--- a/src/vs/workbench/services/accounts/browser/defaultAccount.ts
140140
+++ b/src/vs/workbench/services/accounts/browser/defaultAccount.ts
141141
@@ -128,14 +128,16 @@ export class DefaultAccountService extends Disposable implements IDefaultAccount
@@ -163,7 +163,7 @@ index 3e2724e96a5..294611c513e 100644
163163
}
164164
+
165165
+ if (!this.defaultAccountConfig) {
166-
+ throw new Error('Not default account configured')
166+
+ throw new Error('Not default account configured');
167167
+ }
168168
return {
169169
...this.defaultAccountConfig.authenticationProvider.default,
@@ -175,7 +175,7 @@ index 3e2724e96a5..294611c513e 100644
175175
- const defaultAccountProvider = this._register(instantiationService.createInstance(DefaultAccountProvider, toDefaultAccountConfig(productService.defaultChatAgent)));
176176
- defaultAccountService.setDefaultAccountProvider(defaultAccountProvider);
177177
+
178-
+ if (productService.defaultChatAgent != null) {
178+
+ if (productService.defaultChatAgent) {
179179
+ const defaultAccountProvider = this._register(instantiationService.createInstance(DefaultAccountProvider, toDefaultAccountConfig(productService.defaultChatAgent)));
180180
+ defaultAccountService.setDefaultAccountProvider(defaultAccountProvider);
181181
+ }
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= <loic@coderpad.io>
3+
Date: Wed, 18 Mar 2026 15:39:13 +0100
4+
Subject: [PATCH] fix: do not hide copilot ui on web mode
5+
6+
---
7+
.../services/chat/common/chatEntitlementService.ts | 6 ------
8+
1 file changed, 6 deletions(-)
9+
10+
diff --git a/src/vs/workbench/services/chat/common/chatEntitlementService.ts b/src/vs/workbench/services/chat/common/chatEntitlementService.ts
11+
index 919d79dc291..34629458e1e 100644
12+
--- a/src/vs/workbench/services/chat/common/chatEntitlementService.ts
13+
+++ b/src/vs/workbench/services/chat/common/chatEntitlementService.ts
14+
@@ -25,7 +25,6 @@ import { IOpenerService } from '../../../../platform/opener/common/opener.js';
15+
import { URI } from '../../../../base/common/uri.js';
16+
import Severity from '../../../../base/common/severity.js';
17+
import { IWorkbenchEnvironmentService } from '../../environment/common/environmentService.js';
18+
-import { isWeb } from '../../../../base/common/platform.js';
19+
import { ILifecycleService } from '../../lifecycle/common/lifecycle.js';
20+
import { Mutable } from '../../../../base/common/types.js';
21+
import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';
22+
@@ -318,11 +317,6 @@ export class ChatEntitlementService extends Disposable implements IChatEntitleme
23+
);
24+
this.sentimentObs = observableFromEvent(this.onDidChangeSentiment, () => this.sentiment);
25+
26+
- if ((isWeb && !environmentService.remoteAuthority)) {
27+
- ChatEntitlementContextKeys.Setup.hidden.bindTo(this.contextKeyService).set(true); // hide copilot UI on web if unsupported
28+
- return;
29+
- }
30+
-
31+
if (!productService.defaultChatAgent) {
32+
return; // we need a default chat agent configured going forward from here
33+
}

0 commit comments

Comments
 (0)