Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
35 changes: 19 additions & 16 deletions demo/src/setup.common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,7 @@ import getWorkspaceTrustOverride from '@codingame/monaco-vscode-workspace-trust-
import getLogServiceOverride from '@codingame/monaco-vscode-log-service-override'
import getWorkingCopyServiceOverride from '@codingame/monaco-vscode-working-copy-service-override'
import getTestingServiceOverride from '@codingame/monaco-vscode-testing-service-override'
import getChatServiceOverride, {
ChatEntitlement
} from '@codingame/monaco-vscode-chat-service-override'
import getChatServiceOverride from '@codingame/monaco-vscode-chat-service-override'
import getNotebookServiceOverride from '@codingame/monaco-vscode-notebook-service-override'
import getWelcomeServiceOverride from '@codingame/monaco-vscode-welcome-service-override'
import getWalkThroughServiceOverride from '@codingame/monaco-vscode-walkthrough-service-override'
Expand Down Expand Up @@ -400,7 +398,7 @@ export const constructOptions: IWorkbenchConstructionOptions = {
export const envOptions: EnvironmentOverride = {
// Otherwise, VSCode detect it as the first open workspace folder
// which make the search result extension fail as it's not able to know what was detected by VSCode
// userHome: vscode.Uri.file('/')
userHome: vscode.Uri.file('/')
}

export const commonServices: IEditorOverrideServices = {
Expand Down Expand Up @@ -446,18 +444,23 @@ export const commonServices: IEditorOverrideServices = {
...getScmServiceOverride(),
...getTestingServiceOverride(),
...getChatServiceOverride({
customEntitlement: {
anonymous: false,
entitlement: ChatEntitlement.Enterprise,
previewFeaturesDisabled: false,
quotas: {},
sentiment: {
installed: true,
hidden: false,
disabled: false,
untrusted: false,
registered: false
}
defaultAccount: {
entitlementsData: {
access_type_sku: 'unused',
assigned_date: 'unused',
can_signup_for_limited: false,
copilot_plan: 'enterprise',
organization_login_list: [],
analytics_tracking_id: 'unused'
},
accountName: 'unused',
authenticationProvider: {
id: 'unused',
name: 'unused',
enterprise: true
},
enterprise: true,
sessionId: 'unused'
}
}),
...getNotebookServiceOverride(),
Expand Down
76 changes: 32 additions & 44 deletions src/service-override/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,7 @@ import { ILanguageModelIgnoredFilesService } from 'vs/workbench/contrib/chat/com
import { IChatMarkdownAnchorService } from 'vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownAnchorService.service'
import { ChatMarkdownAnchorService } from 'vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownAnchorService'
import { ChatEditingService } from 'vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl'
import {
ChatEntitlement,
ChatEntitlementService,
type IChatSentiment,
type IQuotas
} from 'vs/workbench/services/chat/common/chatEntitlementService'
import { ChatEntitlementService } from 'vs/workbench/services/chat/common/chatEntitlementService'
import { PromptsService } from 'vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl'
import { IChatEntitlementService } from 'vs/workbench/services/chat/common/chatEntitlementService.service'
import { IPromptsService } from 'vs/workbench/contrib/chat/common/promptSyntax/service/promptsService.service'
Expand Down Expand Up @@ -120,50 +115,42 @@ import { ChatDebugServiceImpl } from 'vs/workbench/contrib/chat/common/chatDebug
import { IChatResponseResourceFileSystemProvider } from 'vs/workbench/contrib/chat/common/widget/chatResponseResourceFileSystemProvider.service'
import { ChatResponseResourceFileSystemProvider } from 'vs/workbench/contrib/chat/common/widget/chatResponseResourceFileSystemProvider'
import { Event } from 'vs/base/common/event'
import { constObservable } from 'vs/base/common/observable'
import type { IDefaultAccount } from 'vs/base/common/defaultAccount'
import { IDefaultAccountService } from 'vs/platform/defaultAccount/common/defaultAccount.service'
import 'vs/workbench/contrib/chat/browser/chat.contribution'
import 'vs/workbench/contrib/terminal/terminal.chat.contribution'
import 'vs/workbench/contrib/inlineChat/browser/inlineChat.contribution'
import 'vs/workbench/contrib/remoteCodingAgents/browser/remoteCodingAgents.contribution'

export interface CustomEntitlement {
entitlement: ChatEntitlement
sentiment: IChatSentiment
anonymous: boolean
quotas: IQuotas
previewFeaturesDisabled: boolean
}
class DefaultAccountService implements IDefaultAccountService {
declare _serviceBrand: undefined
constructor(private defaultAccount: IDefaultAccount | null) {}

onDidChangePolicyData: IDefaultAccountService['onDidChangePolicyData'] = Event.None
policyData: IDefaultAccountService['policyData'] = null

getDefaultAccountAuthenticationProvider: IDefaultAccountService['getDefaultAccountAuthenticationProvider'] =
() => ({ id: 'default', name: 'Default', enterprise: false })
setDefaultAccountProvider: IDefaultAccountService['setDefaultAccountProvider'] = () => {}
refresh: IDefaultAccountService['refresh'] = async () => null
signIn: IDefaultAccountService['signIn'] = async () => null

class CustomEntitlementService implements IChatEntitlementService {
constructor(private customEntitlement: CustomEntitlement) {}
_serviceBrand: undefined
onDidChangeEntitlement = Event.None
entitlement = this.customEntitlement.entitlement
entitlementObs = constObservable(this.entitlement)
previewFeaturesDisabled = this.customEntitlement.previewFeaturesDisabled
organisations = undefined
isInternal = true
sku = undefined
copilotTrackingId = undefined
onDidChangeQuotaExceeded = Event.None
onDidChangeQuotaRemaining = Event.None
quotas = this.customEntitlement.quotas
onDidChangeSentiment = Event.None
sentiment = this.customEntitlement.sentiment
sentimentObs = constObservable(this.sentiment)
onDidChangeAnonymous = Event.None
anonymous = this.customEntitlement.anonymous
anonymousObs = constObservable(this.anonymous)
markAnonymousRateLimited(): void {}
async update(): Promise<void> {}
readonly onDidChangeDefaultAccount: IDefaultAccountService['onDidChangeDefaultAccount'] =
Event.None

getDefaultAccount: IDefaultAccountService['getDefaultAccount'] = async () => this.defaultAccount

copilotTokenInfo: IDefaultAccountService['copilotTokenInfo'] = null
onDidChangeCopilotTokenInfo: IDefaultAccountService['onDidChangeCopilotTokenInfo'] = Event.None
signOut: IDefaultAccountService['signOut'] = async () => {}
}

export interface ChatServiceOverrideOptions {
customEntitlement?: CustomEntitlement
defaultAccount?: IDefaultAccount
}

export default function getServiceOverride({
customEntitlement
defaultAccount
}: ChatServiceOverrideOptions = {}): IEditorOverrideServices {
return {
[IChatService.toString()]: new SyncDescriptor(ChatService, [], true),
Expand Down Expand Up @@ -209,10 +196,7 @@ export default function getServiceOverride({
[],
true
),
[IChatEntitlementService.toString()]:
customEntitlement != null
? new SyncDescriptor(CustomEntitlementService, [customEntitlement], true)
: new SyncDescriptor(ChatEntitlementService, [], true),
[IChatEntitlementService.toString()]: new SyncDescriptor(ChatEntitlementService, [], true),
[IPromptsService.toString()]: new SyncDescriptor(PromptsService, [], true),
[IChatStatusItemService.toString()]: new SyncDescriptor(ChatStatusItemService, [], true),
[IChatContextPickService.toString()]: new SyncDescriptor(ChatContextPickService, [], true),
Expand Down Expand Up @@ -302,9 +286,13 @@ export default function getServiceOverride({
ChatResponseResourceFileSystemProvider,
[],
true
),
[IDefaultAccountService.toString()]: new SyncDescriptor(
DefaultAccountService,
[defaultAccount],
true
)
}
}

export { ChatEntitlement }
export type { IChatSentiment, IQuotas }
export type { IDefaultAccount }
6 changes: 3 additions & 3 deletions vscode-patches/0085-fix-make-product-field-optional.patch
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ index cc2445e006f..c61c32ec51d 100644
if (packExtension.local && !extensionsToUninstall.some(e => areSameExtensions(e.extension.identifier, packExtension.identifier))) {
extensionsToUninstall.push({ extension: packExtension.local });
diff --git a/src/vs/workbench/services/accounts/browser/defaultAccount.ts b/src/vs/workbench/services/accounts/browser/defaultAccount.ts
index 3e2724e96a5..294611c513e 100644
index 3e2724e96a5..cf93bc4c6b8 100644
--- a/src/vs/workbench/services/accounts/browser/defaultAccount.ts
+++ b/src/vs/workbench/services/accounts/browser/defaultAccount.ts
@@ -128,14 +128,16 @@ export class DefaultAccountService extends Disposable implements IDefaultAccount
Expand Down Expand Up @@ -163,7 +163,7 @@ index 3e2724e96a5..294611c513e 100644
}
+
+ if (!this.defaultAccountConfig) {
+ throw new Error('Not default account configured')
+ throw new Error('Not default account configured');
+ }
return {
...this.defaultAccountConfig.authenticationProvider.default,
Expand All @@ -175,7 +175,7 @@ index 3e2724e96a5..294611c513e 100644
- const defaultAccountProvider = this._register(instantiationService.createInstance(DefaultAccountProvider, toDefaultAccountConfig(productService.defaultChatAgent)));
- defaultAccountService.setDefaultAccountProvider(defaultAccountProvider);
+
+ if (productService.defaultChatAgent != null) {
+ if (productService.defaultChatAgent) {
+ const defaultAccountProvider = this._register(instantiationService.createInstance(DefaultAccountProvider, toDefaultAccountConfig(productService.defaultChatAgent)));
+ defaultAccountService.setDefaultAccountProvider(defaultAccountProvider);
+ }
Expand Down
33 changes: 33 additions & 0 deletions vscode-patches/0092-fix-do-not-hide-copilot-ui-on-web-mode.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= <loic@coderpad.io>
Date: Wed, 18 Mar 2026 15:39:13 +0100
Subject: [PATCH] fix: do not hide copilot ui on web mode

---
.../services/chat/common/chatEntitlementService.ts | 6 ------
1 file changed, 6 deletions(-)

diff --git a/src/vs/workbench/services/chat/common/chatEntitlementService.ts b/src/vs/workbench/services/chat/common/chatEntitlementService.ts
index 919d79dc291..34629458e1e 100644
--- a/src/vs/workbench/services/chat/common/chatEntitlementService.ts
+++ b/src/vs/workbench/services/chat/common/chatEntitlementService.ts
@@ -25,7 +25,6 @@ import { IOpenerService } from '../../../../platform/opener/common/opener.js';
import { URI } from '../../../../base/common/uri.js';
import Severity from '../../../../base/common/severity.js';
import { IWorkbenchEnvironmentService } from '../../environment/common/environmentService.js';
-import { isWeb } from '../../../../base/common/platform.js';
import { ILifecycleService } from '../../lifecycle/common/lifecycle.js';
import { Mutable } from '../../../../base/common/types.js';
import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';
@@ -318,11 +317,6 @@ export class ChatEntitlementService extends Disposable implements IChatEntitleme
);
this.sentimentObs = observableFromEvent(this.onDidChangeSentiment, () => this.sentiment);

- if ((isWeb && !environmentService.remoteAuthority)) {
- ChatEntitlementContextKeys.Setup.hidden.bindTo(this.contextKeyService).set(true); // hide copilot UI on web if unsupported
- return;
- }
-
if (!productService.defaultChatAgent) {
return; // we need a default chat agent configured going forward from here
}
Loading