@codingame/monaco-vscode-extensions-service-override 8.0.4 → 9.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/assets/{webWorkerExtensionHostIframe.html → webWorkerExtensionHostIframe.esm.html} +51 -15
  2. package/extensions.js +15 -41
  3. package/package.json +3 -3
  4. package/vscode/src/vs/platform/extensionManagement/common/extensionManagementCLI.js +28 -28
  5. package/vscode/src/vs/workbench/api/browser/mainThreadAuthentication.js +42 -10
  6. package/vscode/src/vs/workbench/api/browser/mainThreadCLICommands.js +1 -1
  7. package/vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.js +17 -2
  8. package/vscode/src/vs/workbench/api/browser/mainThreadComments.js +5 -2
  9. package/vscode/src/vs/workbench/api/browser/mainThreadCustomEditors.js +2 -2
  10. package/vscode/src/vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant.js +1 -1
  11. package/vscode/src/vs/workbench/api/browser/mainThreadExtensionService.js +11 -11
  12. package/vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService.js +20 -20
  13. package/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures.js +1 -2
  14. package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModelTools.js +19 -5
  15. package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModels.js +1 -1
  16. package/vscode/src/vs/workbench/api/browser/mainThreadMessageService.js +4 -4
  17. package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDocuments.js +19 -8
  18. package/vscode/src/vs/workbench/api/browser/mainThreadNotebookEditors.js +1 -0
  19. package/vscode/src/vs/workbench/api/browser/mainThreadNotebookSaveParticipant.js +1 -1
  20. package/vscode/src/vs/workbench/api/browser/mainThreadProgress.js +1 -1
  21. package/vscode/src/vs/workbench/api/browser/mainThreadQuickOpen.js +23 -16
  22. package/vscode/src/vs/workbench/api/browser/mainThreadSCM.js +3 -0
  23. package/vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant.js +1 -1
  24. package/vscode/src/vs/workbench/api/browser/mainThreadTask.js +1 -1
  25. package/vscode/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.js +1 -1
  26. package/vscode/src/vs/workbench/api/browser/mainThreadTesting.js +10 -2
  27. package/vscode/src/vs/workbench/api/browser/mainThreadTunnelService.js +2 -2
  28. package/vscode/src/vs/workbench/api/browser/mainThreadUriOpeners.js +2 -2
  29. package/vscode/src/vs/workbench/api/browser/mainThreadWebviews.js +1 -1
  30. package/vscode/src/vs/workbench/api/browser/mainThreadWorkspace.js +8 -7
  31. package/vscode/src/vs/workbench/services/extensionManagement/browser/extensionBisect.js +23 -23
  32. package/vscode/src/vs/workbench/services/extensions/browser/extensionService.js +1 -1
  33. package/vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.js +9 -6
  34. package/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService.js +42 -28
  35. package/vscode/src/vs/workbench/services/extensions/common/extensionHostManager.js +6 -7
  36. package/vscode/src/vs/workbench/services/extensions/common/extensionsProposedApi.js +1 -1
  37. package/vscode/src/vs/workbench/services/extensions/common/extensionsUtil.js +4 -4
  38. package/vscode/src/vs/workbench/services/extensions/common/lazyCreateExtensionHostManager.js +3 -0
  39. package/vscode/src/vs/workbench/services/extensions/common/remoteExtensionHost.js +11 -5
@@ -4,21 +4,19 @@
4
4
  <meta http-equiv="Content-Security-Policy" content="
5
5
  default-src 'none';
6
6
  child-src 'self' data: blob:;
7
- script-src 'self' 'unsafe-eval' 'sha256-OTnWt0xD0mDGlMgzQref1DqApnE9MipgFz2t0Q/3vcE=' https:;
7
+ script-src 'self' 'unsafe-eval' 'sha256-8MVeUdk5qF4PxUj/3OPSsosE9rIR9mo+m5ulCU+h+VI=' https: http://localhost:* blob:;
8
8
  connect-src 'self' https: wss: http://localhost:* http://127.0.0.1:* ws://localhost:* ws://127.0.0.1:*;"/>
9
9
  </head>
10
10
  <body>
11
11
  <script>
12
- (function() {
12
+ (function () {
13
13
  const searchParams = new URL(document.location.href).searchParams;
14
14
  const vscodeWebWorkerExtHostId = searchParams.get('vscodeWebWorkerExtHostId') || '';
15
- const name = searchParams.get('debugged') ? 'DebugWorkerExtensionHost' : 'WorkerExtensionHost';
15
+ const name = searchParams.get('debugged') ? 'DebugExtensionHostWorker' : 'ExtensionHostWorker';
16
16
  const parentOrigin = searchParams.get('parentOrigin') || window.origin;
17
17
  const salt = searchParams.get('salt');
18
- const vscodeExtHostWorkerSrc = searchParams.get('vscodeExtHostWorkerSrc');
19
- const vscodeExtHostWorkerOptions = JSON.parse(searchParams.get('vscodeExtHostWorkerOptions') ?? '{}');
20
18
 
21
- (async function() {
19
+ (async function () {
22
20
  const hostnameValidationMarker = 'v--';
23
21
  const hostname = location.hostname;
24
22
  if (!hostname.startsWith(hostnameValidationMarker)) {
@@ -30,8 +28,9 @@
30
28
  return sendError(new Error(`Cannot validate in current context!`));
31
29
  }
32
30
 
33
- // Here the `parentOriginHash()` function from `src/vs/workbench/common/webview.ts` is inlined
31
+ // Here the `parentOriginHash()` function from `src/vs/base/browser/iframe.ts` is inlined
34
32
  // compute a sha-256 composed of `parentOrigin` and `salt` converted to base 32
33
+ /** @type {string} */
35
34
  let parentOriginHash;
36
35
  try {
37
36
  const strData = JSON.stringify({ parentOrigin, salt });
@@ -42,7 +41,7 @@
42
41
  const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
43
42
  // sha256 has 256 bits, so we need at most ceil(lg(2^256-1)/lg(32)) = 52 chars to represent it in base 32
44
43
  parentOriginHash = BigInt(`0x${hashHex}`).toString(32).padStart(52, '0');
45
- } catch(err) {
44
+ } catch (err) {
46
45
  return sendError(err instanceof Error ? err : new Error(String(err)));
47
46
  }
48
47
 
@@ -67,13 +66,50 @@
67
66
  }
68
67
 
69
68
  function start() {
69
+
70
+ // Before we can load the worker, we need to get the current set of NLS
71
+ // configuration into this iframe. We ask the parent window to send it
72
+ // together with the necessary information to load the worker via Blob.
73
+
74
+ const bootstrapNlsType = 'vscode.bootstrap.nls';
75
+
76
+ self.onmessage = (event) => {
77
+ if (event.origin !== parentOrigin || event.data.type !== bootstrapNlsType) {
78
+ return;
79
+ }
80
+ const { data } = event.data;
81
+ createWorker(data.baseUrl, data.workerUrl, data.fileRoot, data.nls.messages, data.nls.language);
82
+ };
83
+
84
+ window.parent.postMessage({
85
+ vscodeWebWorkerExtHostId,
86
+ type: bootstrapNlsType
87
+ }, '*');
88
+ }
89
+
90
+ function createWorker(baseUrl, workerUrl, fileRoot, nlsMessages, nlsLanguage) {
70
91
  try {
71
- let workerUrl = vscodeExtHostWorkerSrc
72
- if(globalThis.crossOriginIsolated) {
92
+ if (globalThis.crossOriginIsolated) {
73
93
  workerUrl += '?vscode-coi=2'; // COEP
74
94
  }
75
95
 
76
- const worker = new Worker(workerUrl, Object.assign({ name }, vscodeExtHostWorkerOptions));
96
+ const isESM = true;
97
+
98
+ const blob = new Blob([[
99
+ `/*extensionHostWorker*/`,
100
+ `globalThis.MonacoEnvironment = { baseUrl: '${baseUrl}' };`,
101
+ `globalThis._VSCODE_NLS_MESSAGES = ${JSON.stringify(nlsMessages)};`,
102
+ `globalThis._VSCODE_NLS_LANGUAGE = ${JSON.stringify(nlsLanguage)};`,
103
+ `globalThis._VSCODE_FILE_ROOT = '${fileRoot}';`,
104
+ isESM ? `await import('${workerUrl}');` : `importScripts('${workerUrl}');`,
105
+ `/*extensionHostWorker*/`
106
+ ].join('')], { type: 'application/javascript' });
107
+
108
+ const worker = new Worker(URL.createObjectURL(blob), { name, type: isESM ? 'module' : undefined });
109
+ if (!isESM) {
110
+ // Note: cannot postMessage into a worker that is ESM because imports are async
111
+ worker.postMessage('vs/workbench/api/worker/extensionHostWorker');
112
+ }
77
113
  const nestedWorkers = new Map();
78
114
 
79
115
  worker.onmessage = (event) => {
@@ -83,12 +119,12 @@
83
119
  const { id, port, url, options } = data;
84
120
  const newWorker = new Worker(url, options);
85
121
  newWorker.postMessage(port, [port]);
86
- worker.onerror = console.error.bind(console);
122
+ newWorker.onerror = console.error.bind(console);
87
123
  nestedWorkers.set(id, newWorker);
88
124
 
89
125
  } else if (data?.type === '_terminateWorker') {
90
126
  const { id } = data;
91
- if(nestedWorkers.has(id)) {
127
+ if (nestedWorkers.has(id)) {
92
128
  nestedWorkers.get(id).terminate();
93
129
  nestedWorkers.delete(id);
94
130
  }
@@ -111,8 +147,8 @@
111
147
  return;
112
148
  }
113
149
  worker.postMessage(event.data, event.ports);
114
- }
115
- } catch(err) {
150
+ };
151
+ } catch (err) {
116
152
  console.error(err);
117
153
  sendError(err);
118
154
  }
package/extensions.js CHANGED
@@ -2,7 +2,7 @@ import { __decorate, __param } from 'vscode/external/tslib/tslib.es6.js';
2
2
  import { IFileService } from 'vscode/vscode/vs/platform/files/common/files.service';
3
3
  import { ILifecycleService } from 'vscode/vscode/vs/workbench/services/lifecycle/common/lifecycle.service';
4
4
  import { IExtensionService } from 'vscode/vscode/vs/workbench/services/extensions/common/extensions.service';
5
- import { ILogService, ILoggerService } from 'vscode/vscode/vs/platform/log/common/log.service';
5
+ import { ILogService } from 'vscode/vscode/vs/platform/log/common/log.service';
6
6
  import { IWorkspaceContextService } from 'vscode/vscode/vs/platform/workspace/common/workspace.service';
7
7
  import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
8
8
  import { INotificationService } from 'vscode/vscode/vs/platform/notification/common/notification.service';
@@ -24,10 +24,6 @@ import { ExtensionsProposedApi } from './vscode/src/vs/workbench/services/extens
24
24
  import { BrowserExtensionHostFactory, BrowserExtensionHostKindPicker, ExtensionService } from './vscode/src/vs/workbench/services/extensions/browser/extensionService.js';
25
25
  export { ExtensionHostKind } from 'vscode/vscode/vs/workbench/services/extensions/common/extensionHostKind';
26
26
  import { WebWorkerExtensionHost } from './vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.js';
27
- import { IUserDataProfilesService } from 'vscode/vscode/vs/platform/userDataProfile/common/userDataProfile.service';
28
- import { ILayoutService } from 'vscode/vscode/vs/platform/layout/browser/layoutService.service';
29
- import { IStorageService } from 'vscode/vscode/vs/platform/storage/common/storage.service';
30
- import { ILabelService } from 'vscode/vscode/vs/platform/label/common/label.service';
31
27
  import { IUserDataProfileService } from 'vscode/vscode/vs/workbench/services/userDataProfile/common/userDataProfile.service';
32
28
  import { IWorkspaceTrustManagementService } from 'vscode/vscode/vs/platform/workspace/common/workspaceTrust.service';
33
29
  import { IRemoteExplorerService } from 'vscode/vscode/vs/workbench/services/remote/common/remoteExplorerService.service';
@@ -122,41 +118,14 @@ import './vscode/src/vs/workbench/api/browser/mainThreadProfileContentHandlers.j
122
118
  import './vscode/src/vs/workbench/api/browser/mainThreadAiRelatedInformation.js';
123
119
  import './vscode/src/vs/workbench/api/browser/mainThreadAiEmbeddingVector.js';
124
120
 
125
- let EsmWebWorkerExtensionHost = class EsmWebWorkerExtensionHost extends WebWorkerExtensionHost {
126
- constructor(workerConfig, runningLocation, startup, _initDataProvider, _telemetryService, _contextService, _labelService, _logService, _loggerService, _environmentService, _userDataProfilesService, _productService, _layoutService, _storageService) {
127
- super(runningLocation, startup, _initDataProvider, _telemetryService, _contextService, _labelService, _logService, _loggerService, _environmentService, _userDataProfilesService, _productService, _layoutService, _storageService);
128
- this.workerConfig = workerConfig;
129
- }
130
- async _getWebWorkerExtensionHostIframeSrc() {
131
- const url = new URL(await super._getWebWorkerExtensionHostIframeSrc(), window.location.href);
132
- url.searchParams.set('vscodeExtHostWorkerSrc', this.workerConfig.url);
133
- if (this.workerConfig.options != null) {
134
- url.searchParams.set('vscodeExtHostWorkerOptions', JSON.stringify(this.workerConfig.options));
135
- }
136
- url.searchParams.set('parentOrigin', window.origin);
137
- return ( url.toString());
138
- }
139
- };
140
- EsmWebWorkerExtensionHost = __decorate([
141
- ( __param(4, ITelemetryService)),
142
- ( __param(5, IWorkspaceContextService)),
143
- ( __param(6, ILabelService)),
144
- ( __param(7, ILogService)),
145
- ( __param(8, ILoggerService)),
146
- ( __param(9, IBrowserWorkbenchEnvironmentService)),
147
- ( __param(10, IUserDataProfilesService)),
148
- ( __param(11, IProductService)),
149
- ( __param(12, ILayoutService)),
150
- ( __param(13, IStorageService))
151
- ], EsmWebWorkerExtensionHost);
152
121
  let localExtensionHost;
153
122
  function setLocalExtensionHost(_localExtensionHost) {
154
123
  localExtensionHost = _localExtensionHost;
155
124
  }
156
125
  let BrowserExtensionHostFactoryOverride = class BrowserExtensionHostFactoryOverride extends BrowserExtensionHostFactory {
157
- constructor(workerConfig, _extensionsProposedApi, _scanWebExtensions, _getExtensionRegistrySnapshotWhenReady, _instantiationService, _remoteAgentService, _remoteAuthorityResolverService, _extensionEnablementService, _logService) {
126
+ constructor(workerExtHostEnabled, _extensionsProposedApi, _scanWebExtensions, _getExtensionRegistrySnapshotWhenReady, _instantiationService, _remoteAgentService, _remoteAuthorityResolverService, _extensionEnablementService, _logService) {
158
127
  super(_extensionsProposedApi, _scanWebExtensions, _getExtensionRegistrySnapshotWhenReady, _instantiationService, _remoteAgentService, _remoteAuthorityResolverService, _extensionEnablementService, _logService);
159
- this.workerConfig = workerConfig;
128
+ this.workerExtHostEnabled = workerExtHostEnabled;
160
129
  }
161
130
  createExtensionHost(runningLocations, runningLocation, isInitialStart) {
162
131
  switch (runningLocation.kind) {
@@ -167,11 +136,11 @@ let BrowserExtensionHostFactoryOverride = class BrowserExtensionHostFactoryOverr
167
136
  return this._instantiationService.createInstance(localExtensionHost, runningLocation, 1 , this._createLocalExtensionHostDataProvider(runningLocations, runningLocation, isInitialStart));
168
137
  }
169
138
  case 2 : {
170
- if (this.workerConfig == null) {
139
+ if (!this.workerExtHostEnabled) {
171
140
  return null;
172
141
  }
173
142
  const startup = ((isInitialStart ? 2 : 1) );
174
- return this._instantiationService.createInstance(EsmWebWorkerExtensionHost, this.workerConfig, runningLocation, startup, this._createLocalExtensionHostDataProvider(runningLocations, runningLocation, isInitialStart));
143
+ return this._instantiationService.createInstance(WebWorkerExtensionHost, runningLocation, startup, this._createLocalExtensionHostDataProvider(runningLocations, runningLocation, isInitialStart));
175
144
  }
176
145
  case 3 : {
177
146
  return super.createExtensionHost(runningLocations, runningLocation, isInitialStart);
@@ -207,10 +176,10 @@ LocalBrowserExtensionHostKindPicker = __decorate([
207
176
  ( __param(1, ILogService))
208
177
  ], LocalBrowserExtensionHostKindPicker);
209
178
  let ExtensionServiceOverride = class ExtensionServiceOverride extends ExtensionService {
210
- constructor(workerConfig, instantiationService, notificationService, browserEnvironmentService, telemetryService, extensionEnablementService, fileService, productService, extensionManagementService, contextService, configurationService, extensionManifestPropertiesService, webExtensionsScannerService, logService, remoteAgentService, remoteExtensionsScannerService, lifecycleService, remoteAuthorityResolverService, userDataInitializationService, userDataProfileService, workspaceTrustManagementService, remoteExplorerService, dialogService) {
179
+ constructor(workerExtHostEnabled, instantiationService, notificationService, browserEnvironmentService, telemetryService, extensionEnablementService, fileService, productService, extensionManagementService, contextService, configurationService, extensionManifestPropertiesService, webExtensionsScannerService, logService, remoteAgentService, remoteExtensionsScannerService, lifecycleService, remoteAuthorityResolverService, userDataInitializationService, userDataProfileService, workspaceTrustManagementService, remoteExplorerService, dialogService) {
211
180
  const extensionsProposedApi = instantiationService.createInstance(ExtensionsProposedApi);
212
- const extensionHostFactory = new BrowserExtensionHostFactoryOverride(workerConfig, extensionsProposedApi, async () => this._scanWebExtensions(), () => this._getExtensionRegistrySnapshotWhenReady(), instantiationService, remoteAgentService, remoteAuthorityResolverService, extensionEnablementService, logService);
213
- super(extensionsProposedApi, extensionHostFactory, new LocalBrowserExtensionHostKindPicker(workerConfig != null ? [2 , 1 , 3 ] : [1 , 3 ], logService), instantiationService, notificationService, browserEnvironmentService, telemetryService, extensionEnablementService, fileService, productService, extensionManagementService, contextService, configurationService, extensionManifestPropertiesService, webExtensionsScannerService, logService, remoteAgentService, remoteExtensionsScannerService, lifecycleService, remoteAuthorityResolverService, userDataInitializationService, userDataProfileService, workspaceTrustManagementService, remoteExplorerService, dialogService);
181
+ const extensionHostFactory = new BrowserExtensionHostFactoryOverride(workerExtHostEnabled, extensionsProposedApi, async () => await this._scanWebExtensions(), () => this._getExtensionRegistrySnapshotWhenReady(), instantiationService, remoteAgentService, remoteAuthorityResolverService, extensionEnablementService, logService);
182
+ super(extensionsProposedApi, extensionHostFactory, new LocalBrowserExtensionHostKindPicker(workerExtHostEnabled ? [2 , 1 , 3 ] : [1 , 3 ], logService), instantiationService, notificationService, browserEnvironmentService, telemetryService, extensionEnablementService, fileService, productService, extensionManagementService, contextService, configurationService, extensionManifestPropertiesService, webExtensionsScannerService, logService, remoteAgentService, remoteExtensionsScannerService, lifecycleService, remoteAuthorityResolverService, userDataInitializationService, userDataProfileService, workspaceTrustManagementService, remoteExplorerService, dialogService);
214
183
  }
215
184
  async deltaExtensions(toAdd, toRemove) {
216
185
  await this._handleDeltaExtensions(new DeltaExtensionsQueueItem(toAdd, toRemove));
@@ -246,12 +215,12 @@ class ExtensionResourceLoaderServiceOverride extends ExtensionResourceLoaderServ
246
215
  const result = await this._fileService.readFile(uri);
247
216
  return ( result.value.toString());
248
217
  }
249
- return super.readExtensionResource(uri);
218
+ return await super.readExtensionResource(uri);
250
219
  }
251
220
  }
252
221
  let iframeAlternateDomains;
253
222
  registerAssets({
254
- 'vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html': () => changeUrlDomain(new URL('./assets/webWorkerExtensionHostIframe.html', import.meta.url).href, iframeAlternateDomains)
223
+ 'vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html': () => changeUrlDomain(new URL('./assets/webWorkerExtensionHostIframe.esm.html', import.meta.url).href, iframeAlternateDomains)
255
224
  });
256
225
  function getServiceOverride(workerConfig, _iframeAlternateDomains) {
257
226
  if (_iframeAlternateDomains != null) {
@@ -263,6 +232,11 @@ function getServiceOverride(workerConfig, _iframeAlternateDomains) {
263
232
  url: changeUrlDomain(workerConfig.url, iframeAlternateDomains)
264
233
  }
265
234
  : undefined;
235
+ if (workerConfig != null) {
236
+ registerAssets({
237
+ 'vs/workbench/api/worker/extensionHostWorker.esm.js': () => workerConfig.url
238
+ });
239
+ }
266
240
  return {
267
241
  [( IExtensionService.toString())]: new SyncDescriptor(ExtensionServiceOverride, [_workerConfig], false),
268
242
  [( IExtensionManifestPropertiesService.toString())]: new SyncDescriptor(ExtensionManifestPropertiesService, [], true),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codingame/monaco-vscode-extensions-service-override",
3
- "version": "8.0.4",
3
+ "version": "9.0.2",
4
4
  "keywords": [],
5
5
  "author": {
6
6
  "name": "CodinGame",
@@ -26,7 +26,7 @@
26
26
  }
27
27
  },
28
28
  "dependencies": {
29
- "vscode": "npm:@codingame/monaco-vscode-api@8.0.4",
30
- "@codingame/monaco-vscode-files-service-override": "8.0.4"
29
+ "vscode": "npm:@codingame/monaco-vscode-api@9.0.2",
30
+ "@codingame/monaco-vscode-files-service-override": "9.0.2"
31
31
  }
32
32
  }
@@ -11,9 +11,9 @@ import { IExtensionManagementService, IExtensionGalleryService } from 'vscode/vs
11
11
  import { getIdAndVersion, areSameExtensions, getGalleryExtensionId, getExtensionId } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagementUtil';
12
12
  import { ExtensionType, EXTENSION_CATEGORIES } from 'vscode/vscode/vs/platform/extensions/common/extensions';
13
13
 
14
- const notFound = (id) => ( localize(9800, "Extension '{0}' not found.", id));
14
+ const notFound = (id) => ( localize(9830, "Extension '{0}' not found.", id));
15
15
  const useId = ( localize(
16
- 9801,
16
+ 9831,
17
17
  "Make sure you use the full extension ID, including the publisher, e.g.: {0}",
18
18
  'ms-dotnettools.csharp'
19
19
  ));
@@ -50,7 +50,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
50
50
  return;
51
51
  }
52
52
  if (this.location) {
53
- this.logger.info(( localize(9802, "Extensions installed on {0}:", this.location)));
53
+ this.logger.info(( localize(9832, "Extensions installed on {0}:", this.location)));
54
54
  }
55
55
  extensions = extensions.sort((e1, e2) => e1.identifier.id.localeCompare(e2.identifier.id));
56
56
  let lastId = undefined;
@@ -65,7 +65,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
65
65
  const failed = [];
66
66
  try {
67
67
  if (extensions.length) {
68
- this.logger.info(this.location ? ( localize(9803, "Installing extensions on {0}...", this.location)) : ( localize(9804, "Installing extensions...")));
68
+ this.logger.info(this.location ? ( localize(9833, "Installing extensions on {0}...", this.location)) : ( localize(9834, "Installing extensions...")));
69
69
  }
70
70
  const installVSIXInfos = [];
71
71
  const installExtensionInfos = [];
@@ -108,11 +108,11 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
108
108
  }
109
109
  }
110
110
  catch (error) {
111
- this.logger.error(( localize(9805, "Error while installing extensions: {0}", getErrorMessage(error))));
111
+ this.logger.error(( localize(9835, "Error while installing extensions: {0}", getErrorMessage(error))));
112
112
  throw error;
113
113
  }
114
114
  if (failed.length) {
115
- throw ( (new Error(localize(9806, "Failed Installing Extensions: {0}", failed.join(', ')))));
115
+ throw ( (new Error(localize(9836, "Failed Installing Extensions: {0}", failed.join(', ')))));
116
116
  }
117
117
  }
118
118
  async updateExtensions(profileLocation) {
@@ -124,7 +124,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
124
124
  }
125
125
  }
126
126
  this.logger.trace(( localize(
127
- 9807,
127
+ 9837,
128
128
  "Fetching latest versions for {0} extensions",
129
129
  installedExtensionsQuery.length
130
130
  )));
@@ -141,11 +141,11 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
141
141
  }
142
142
  }
143
143
  if (!extensionsToUpdate.length) {
144
- this.logger.info(( localize(9808, "No extension to update")));
144
+ this.logger.info(( localize(9838, "No extension to update")));
145
145
  return;
146
146
  }
147
147
  this.logger.info(( localize(
148
- 9809,
148
+ 9839,
149
149
  "Updating extensions: {0}",
150
150
  ( (extensionsToUpdate.map(ext => ext.extension.identifier.id))).join(', ')
151
151
  )));
@@ -153,7 +153,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
153
153
  for (const extensionResult of installationResult) {
154
154
  if (extensionResult.error) {
155
155
  this.logger.error(( localize(
156
- 9810,
156
+ 9840,
157
157
  "Error while updating extension {0}: {1}",
158
158
  extensionResult.identifier.id,
159
159
  getErrorMessage(extensionResult.error)
@@ -161,7 +161,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
161
161
  }
162
162
  else {
163
163
  this.logger.info(( localize(
164
- 9811,
164
+ 9841,
165
165
  "Extension '{0}' v{1} was successfully updated.",
166
166
  extensionResult.identifier.id,
167
167
  extensionResult.local?.manifest.version
@@ -175,7 +175,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
175
175
  if (installedExtension) {
176
176
  if (!force && (!version || (version === 'prerelease' && installedExtension.preRelease))) {
177
177
  this.logger.info(( localize(
178
- 9812,
178
+ 9842,
179
179
  "Extension '{0}' v{1} is already installed. Use '--force' option to update to latest version or provide '@<version>' to install a specific version, for example: '{2}@1.2.3'.",
180
180
  id,
181
181
  installedExtension.manifest.version,
@@ -184,7 +184,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
184
184
  return false;
185
185
  }
186
186
  if (version && installedExtension.manifest.version === version) {
187
- this.logger.info(( localize(9813, "Extension '{0}' is already installed.", `${id}@${version}`)));
187
+ this.logger.info(( localize(9843, "Extension '{0}' is already installed.", `${id}@${version}`)));
188
188
  return false;
189
189
  }
190
190
  }
@@ -218,24 +218,24 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
218
218
  if (installedExtension) {
219
219
  if (gallery.version === installedExtension.manifest.version) {
220
220
  this.logger.info(( localize(
221
- 9813,
221
+ 9843,
222
222
  "Extension '{0}' is already installed.",
223
223
  version ? `${id}@${version}` : id
224
224
  )));
225
225
  return;
226
226
  }
227
227
  this.logger.info(( localize(
228
- 9814,
228
+ 9844,
229
229
  "Updating the extension '{0}' to the version {1}",
230
230
  id,
231
231
  gallery.version
232
232
  )));
233
233
  }
234
234
  if (installOptions.isBuiltin) {
235
- this.logger.info(version ? ( localize(9815, "Installing builtin extension '{0}' v{1}...", id, version)) : ( localize(9816, "Installing builtin extension '{0}'...", id)));
235
+ this.logger.info(version ? ( localize(9845, "Installing builtin extension '{0}' v{1}...", id, version)) : ( localize(9846, "Installing builtin extension '{0}'...", id)));
236
236
  }
237
237
  else {
238
- this.logger.info(version ? ( localize(9817, "Installing extension '{0}' v{1}...", id, version)) : ( localize(9818, "Installing extension '{0}'...", id)));
238
+ this.logger.info(version ? ( localize(9847, "Installing extension '{0}' v{1}...", id, version)) : ( localize(9848, "Installing extension '{0}'...", id)));
239
239
  }
240
240
  extensionsToInstall.push({
241
241
  extension: gallery,
@@ -247,7 +247,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
247
247
  for (const extensionResult of installationResult) {
248
248
  if (extensionResult.error) {
249
249
  this.logger.error(( localize(
250
- 9819,
250
+ 9849,
251
251
  "Error while installing extension {0}: {1}",
252
252
  extensionResult.identifier.id,
253
253
  getErrorMessage(extensionResult.error)
@@ -256,7 +256,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
256
256
  }
257
257
  else {
258
258
  this.logger.info(( localize(
259
- 9820,
259
+ 9850,
260
260
  "Extension '{0}' v{1} was successfully installed.",
261
261
  extensionResult.identifier.id,
262
262
  extensionResult.local?.manifest.version
@@ -275,11 +275,11 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
275
275
  if (valid) {
276
276
  try {
277
277
  await this.extensionManagementService.install(vsix, { ...installOptions, installGivenVersion: true });
278
- this.logger.info(( localize(9821, "Extension '{0}' was successfully installed.", basename(vsix))));
278
+ this.logger.info(( localize(9851, "Extension '{0}' was successfully installed.", basename(vsix))));
279
279
  }
280
280
  catch (error) {
281
281
  if (isCancellationError(error)) {
282
- this.logger.info(( localize(9822, "Cancelled installing extension '{0}'.", basename(vsix))));
282
+ this.logger.info(( localize(9852, "Cancelled installing extension '{0}'.", basename(vsix))));
283
283
  }
284
284
  else {
285
285
  throw error;
@@ -314,7 +314,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
314
314
  const newer = installedExtensions.find(local => areSameExtensions(extensionIdentifier, local.identifier) && semverExports.gt(local.manifest.version, manifest.version));
315
315
  if (newer) {
316
316
  this.logger.info(( localize(
317
- 9823,
317
+ 9853,
318
318
  "A newer version of extension '{0}' v{1} is already installed. Use '--force' option to downgrade to older version.",
319
319
  newer.identifier.id,
320
320
  newer.manifest.version,
@@ -342,7 +342,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
342
342
  }
343
343
  if (( (extensionsToUninstall.some(e => e.type === ExtensionType.System)))) {
344
344
  this.logger.info(( localize(
345
- 9824,
345
+ 9854,
346
346
  "Extension '{0}' is a Built-in extension and cannot be uninstalled",
347
347
  id
348
348
  )));
@@ -350,26 +350,26 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
350
350
  }
351
351
  if (!force && ( (extensionsToUninstall.some(e => e.isBuiltin)))) {
352
352
  this.logger.info(( localize(
353
- 9825,
353
+ 9855,
354
354
  "Extension '{0}' is marked as a Built-in extension by user. Please use '--force' option to uninstall it.",
355
355
  id
356
356
  )));
357
357
  return;
358
358
  }
359
- this.logger.info(( localize(9826, "Uninstalling {0}...", id)));
359
+ this.logger.info(( localize(9856, "Uninstalling {0}...", id)));
360
360
  for (const extensionToUninstall of extensionsToUninstall) {
361
361
  await this.extensionManagementService.uninstall(extensionToUninstall, { profileLocation });
362
362
  }
363
363
  if (this.location) {
364
364
  this.logger.info(( localize(
365
- 9827,
365
+ 9857,
366
366
  "Extension '{0}' was successfully uninstalled from {1}!",
367
367
  id,
368
368
  this.location
369
369
  )));
370
370
  }
371
371
  else {
372
- this.logger.info(( localize(9828, "Extension '{0}' was successfully uninstalled!", id)));
372
+ this.logger.info(( localize(9858, "Extension '{0}' was successfully uninstalled!", id)));
373
373
  }
374
374
  }
375
375
  }
@@ -387,7 +387,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
387
387
  });
388
388
  }
389
389
  notInstalled(id) {
390
- return this.location ? ( localize(9829, "Extension '{0}' is not installed on {1}.", id, this.location)) : ( localize(9830, "Extension '{0}' is not installed.", id));
390
+ return this.location ? ( localize(9859, "Extension '{0}' is not installed on {1}.", id, this.location)) : ( localize(9860, "Extension '{0}' is not installed.", id));
391
391
  }
392
392
  };
393
393
  ExtensionManagementCLI = ( (__decorate([
@@ -17,6 +17,7 @@ import { IAuthenticationUsageService } from 'vscode/vscode/vs/workbench/services
17
17
  import { getAuthenticationProviderActivationEvent } from 'vscode/vscode/vs/workbench/services/authentication/browser/authenticationService';
18
18
  import { URI } from 'vscode/vscode/vs/base/common/uri';
19
19
  import { IOpenerService } from 'vscode/vscode/vs/platform/opener/common/opener.service';
20
+ import { CancellationError } from 'vscode/vscode/vs/base/common/errors';
20
21
 
21
22
  class MainThreadAuthenticationProvider extends Disposable {
22
23
  constructor(_proxy, id, label, supportsMultipleAccounts, notificationService, onDidChangeSessionsEmitter) {
@@ -36,7 +37,7 @@ class MainThreadAuthenticationProvider extends Disposable {
36
37
  }
37
38
  async removeSession(sessionId) {
38
39
  await this._proxy.$removeSession(this.id, sessionId);
39
- this.notificationService.info(( localize(4878, "Successfully signed out.")));
40
+ this.notificationService.info(( localize(4852, "Successfully signed out.")));
40
41
  }
41
42
  }
42
43
  let MainThreadAuthentication = class MainThreadAuthentication extends Disposable {
@@ -92,7 +93,7 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
92
93
  let message;
93
94
  if (provider.id.startsWith(INTERNAL_AUTH_PROVIDER_PREFIX)) {
94
95
  message = ( localize(
95
- 4879,
96
+ 4853,
96
97
  "The extension '{0}' wants to access the language models provided by {1}.",
97
98
  extensionName,
98
99
  provider.label
@@ -101,13 +102,13 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
101
102
  else {
102
103
  message = recreatingSession
103
104
  ? ( localize(
104
- 4880,
105
+ 4854,
105
106
  "The extension '{0}' wants you to sign in again using {1}.",
106
107
  extensionName,
107
108
  provider.label
108
109
  ))
109
110
  : ( localize(
110
- 4881,
111
+ 4855,
111
112
  "The extension '{0}' wants to sign in using {1}.",
112
113
  extensionName,
113
114
  provider.label
@@ -115,7 +116,7 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
115
116
  }
116
117
  const buttons = [
117
118
  {
118
- label: ( localize(4882, "&&Allow")),
119
+ label: ( localize(4856, "&&Allow")),
119
120
  run() {
120
121
  return true;
121
122
  },
@@ -123,7 +124,7 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
123
124
  ];
124
125
  if (options?.learnMore) {
125
126
  buttons.push({
126
- label: ( localize(4883, "Learn more")),
127
+ label: ( localize(4857, "Learn more")),
127
128
  run: async () => {
128
129
  const result = this.loginPrompt(provider, extensionName, recreatingSession, options);
129
130
  await this.openerService.open(URI.revive(options.learnMore), { allowCommands: true });
@@ -140,6 +141,33 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
140
141
  });
141
142
  return result ?? false;
142
143
  }
144
+ async continueWithIncorrectAccountPrompt(chosenAccountLabel, requestedAccountLabel) {
145
+ const result = await this.dialogService.prompt({
146
+ message: ( localize(4858, "Incorrect account detected")),
147
+ detail: ( localize(
148
+ 4859,
149
+ "The chosen account, {0}, does not match the requested account, {1}.",
150
+ chosenAccountLabel,
151
+ requestedAccountLabel
152
+ )),
153
+ type: Severity$1.Warning,
154
+ cancelButton: true,
155
+ buttons: [
156
+ {
157
+ label: ( localize(4860, 'Keep {0}', chosenAccountLabel)),
158
+ run: () => chosenAccountLabel
159
+ },
160
+ {
161
+ label: ( localize(4861, 'Login with {0}', requestedAccountLabel)),
162
+ run: () => requestedAccountLabel
163
+ }
164
+ ],
165
+ });
166
+ if (!result.result) {
167
+ throw ( (new CancellationError()));
168
+ }
169
+ return result.result === chosenAccountLabel;
170
+ }
143
171
  async doGetSession(providerId, scopes, extensionId, extensionName, options) {
144
172
  const sessions = await this.authenticationService.getSessions(providerId, scopes, options.account, true);
145
173
  const provider = this.authenticationService.getProvider(providerId);
@@ -192,12 +220,16 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
192
220
  : sessions[0];
193
221
  }
194
222
  else {
195
- let account = options.account;
196
- if (!account) {
223
+ let accountToCreate = options.account;
224
+ if (!accountToCreate) {
197
225
  const sessionIdToRecreate = this.authenticationExtensionsService.getSessionPreference(providerId, extensionId, scopes);
198
- account = sessionIdToRecreate ? sessions.find(session => session.id === sessionIdToRecreate)?.account : undefined;
226
+ accountToCreate = sessionIdToRecreate ? sessions.find(session => session.id === sessionIdToRecreate)?.account : undefined;
199
227
  }
200
- session = await this.authenticationService.createSession(providerId, scopes, { activateImmediate: true, account });
228
+ do {
229
+ session = await this.authenticationService.createSession(providerId, scopes, { activateImmediate: true, account: accountToCreate });
230
+ } while (accountToCreate
231
+ && accountToCreate.label !== session.account.label
232
+ && !(await this.continueWithIncorrectAccountPrompt(session.account.label, accountToCreate.label)));
201
233
  }
202
234
  this.authenticationAccessService.updateAllowedExtensions(providerId, session.account.label, [{ id: extensionId, name: extensionName, allowed: true }]);
203
235
  this.authenticationExtensionsService.updateSessionPreference(providerId, extensionId, session);
@@ -85,7 +85,7 @@ let RemoteExtensionManagementCLI = class RemoteExtensionManagementCLI extends Ex
85
85
  if (!this._extensionManifestPropertiesService.canExecuteOnWorkspace(manifest)
86
86
  && !(isWeb && this._extensionManifestPropertiesService.canExecuteOnWeb(manifest))) {
87
87
  this.logger.info(( localize(
88
- 4829,
88
+ 4803,
89
89
  "Cannot install the '{0}' extension because it is declared to not run in this setup.",
90
90
  getExtensionId(manifest.publisher, manifest.name)
91
91
  )));