diff --git a/demo/src/setup.common.ts b/demo/src/setup.common.ts index 5d11ab17..9027415c 100644 --- a/demo/src/setup.common.ts +++ b/demo/src/setup.common.ts @@ -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' @@ -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 = { @@ -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(), diff --git a/src/service-override/chat.ts b/src/service-override/chat.ts index 2b7d99cf..3d1a3ad4 100644 --- a/src/service-override/chat.ts +++ b/src/service-override/chat.ts @@ -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' @@ -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 {} + 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), @@ -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), @@ -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 } diff --git a/vscode-patches/0085-fix-make-product-field-optional.patch b/vscode-patches/0085-fix-make-product-field-optional.patch index 857afc04..0b0bf186 100644 --- a/vscode-patches/0085-fix-make-product-field-optional.patch +++ b/vscode-patches/0085-fix-make-product-field-optional.patch @@ -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 @@ -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, @@ -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); + } diff --git a/vscode-patches/0092-fix-do-not-hide-copilot-ui-on-web-mode.patch b/vscode-patches/0092-fix-do-not-hide-copilot-ui-on-web-mode.patch new file mode 100644 index 00000000..864d1a9b --- /dev/null +++ b/vscode-patches/0092-fix-do-not-hide-copilot-ui-on-web-mode.patch @@ -0,0 +1,33 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= +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 + }