From f8b277ac5b42720b04718e9c124aaea127ff5a99 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 7 Jul 2021 10:57:12 -0700 Subject: [PATCH] refactor(dependency): vscode-exthost -> 1.56.2 (#3744) Upgrade the extension host to 1.56.2, and fix #3737 --- CHANGES_CURRENT.md | 1 + .../out/features/hoverProvider.js | 2 +- .../out/features/phpGlobalFunctions.js | 2 +- .../out/features/validationProvider.js | 172 ++++++++++------ extensions/php-language-features/package.json | 187 ++++++++++-------- .../php-language-features/package.nls.json | 5 +- .../php-language-features/tsconfig.json | 4 +- extensions/php-language-features/yarn.lock | 25 ++- node/package.json | 2 +- node/yarn.lock | 8 +- src/Exthost/Handlers.re | 6 +- 11 files changed, 257 insertions(+), 157 deletions(-) diff --git a/CHANGES_CURRENT.md b/CHANGES_CURRENT.md index c6a930a99e..db18e5510e 100644 --- a/CHANGES_CURRENT.md +++ b/CHANGES_CURRENT.md @@ -55,6 +55,7 @@ - #3639 - Dependency: Sparkle -> 1.26.0 - #3653 - Dependency: revery -> 9ec44ff (fixes #3646) - #3688 - Dependency: esy-skia -> 1c81aac +- #3744 - Dependency: vscode-exthost -> 1.56.2 (fixes #3737) ### Infrastructure diff --git a/extensions/php-language-features/out/features/hoverProvider.js b/extensions/php-language-features/out/features/hoverProvider.js index 3dec421c5f..bc0a4adaf4 100644 --- a/extensions/php-language-features/out/features/hoverProvider.js +++ b/extensions/php-language-features/out/features/hoverProvider.js @@ -22,7 +22,7 @@ class PHPHoverProvider { let entry = phpGlobalFunctions.globalfunctions[name] || phpGlobals.compiletimeconstants[name] || phpGlobals.globalvariables[name] || phpGlobals.keywords[name]; if (entry && entry.description) { let signature = name + (entry.signature || ''); - let contents = [markedTextUtil_1.textToMarkedString(entry.description), { language: 'php', value: signature }]; + let contents = [(0, markedTextUtil_1.textToMarkedString)(entry.description), { language: 'php', value: signature }]; return new vscode_1.Hover(contents, wordRange); } return undefined; diff --git a/extensions/php-language-features/out/features/phpGlobalFunctions.js b/extensions/php-language-features/out/features/phpGlobalFunctions.js index bbe87c4a08..0ad6d72a5d 100644 --- a/extensions/php-language-features/out/features/phpGlobalFunctions.js +++ b/extensions/php-language-features/out/features/phpGlobalFunctions.js @@ -1414,7 +1414,7 @@ exports.globalfunctions = { }, date_format: { description: 'Returns date formatted according to given format', - signature: '( string $format , DateTimeInterface $object ): string' + signature: '( DateTimeInterface $object , string $format ): string' }, date_offset_get: { description: 'Returns the timezone offset', diff --git a/extensions/php-language-features/out/features/validationProvider.js b/extensions/php-language-features/out/features/validationProvider.js index 5b5a861da5..c45ce37b26 100644 --- a/extensions/php-language-features/out/features/validationProvider.js +++ b/extensions/php-language-features/out/features/validationProvider.js @@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.LineDecoder = void 0; const cp = require("child_process"); const string_decoder_1 = require("string_decoder"); +const which = require("which"); +const path = require("path"); const vscode = require("vscode"); const async_1 = require("./utils/async"); const nls = require("vscode-nls"); @@ -75,16 +77,14 @@ class PHPValidationProvider { constructor(workspaceStore) { this.workspaceStore = workspaceStore; this.documentListener = null; - this.executable = undefined; this.validationEnabled = true; - this.trigger = RunTrigger.onSave; this.pauseValidation = false; + this.loadConfigP = this.loadConfiguration(); } activate(subscriptions) { this.diagnosticCollection = vscode.languages.createDiagnosticCollection(); subscriptions.push(this); - vscode.workspace.onDidChangeConfiguration(this.loadConfiguration, this, subscriptions); - this.loadConfiguration(); + subscriptions.push(vscode.workspace.onDidChangeConfiguration(() => this.loadConfigP = this.loadConfiguration())); vscode.workspace.onDidOpenTextDocument(this.triggerValidate, this, subscriptions); vscode.workspace.onDidCloseTextDocument((textDocument) => { this.diagnosticCollection.delete(textDocument.uri); @@ -102,32 +102,22 @@ class PHPValidationProvider { this.documentListener = null; } } - loadConfiguration() { - let section = vscode.workspace.getConfiguration(); - let oldExecutable = this.executable; - if (section) { - this.validationEnabled = section.get("php.validate.enable" /* Enable */, true); - let inspect = section.inspect("php.validate.executablePath" /* ExecutablePath */); - if (inspect && inspect.workspaceValue) { - this.executable = inspect.workspaceValue; - this.executableIsUserDefined = false; - } - else if (inspect && inspect.globalValue) { - this.executable = inspect.globalValue; - this.executableIsUserDefined = true; - } - else { - this.executable = undefined; - this.executableIsUserDefined = undefined; - } - this.trigger = RunTrigger.from(section.get("php.validate.run" /* Run */, RunTrigger.strings.onSave)); - } - if (this.executableIsUserDefined !== true && this.workspaceStore.get("php.validate.checkedExecutablePath" /* CheckedExecutablePath */, undefined) !== undefined) { + async loadConfiguration() { + var _a; + const section = vscode.workspace.getConfiguration(); + const oldExecutable = (_a = this.config) === null || _a === void 0 ? void 0 : _a.executable; + this.validationEnabled = section.get("php.validate.enable" /* Enable */, true); + this.config = await getConfig(); + if (this.config.executableIsUserDefined !== true && this.workspaceStore.get("php.validate.checkedExecutablePath" /* CheckedExecutablePath */, undefined) !== undefined) { vscode.commands.executeCommand('setContext', 'php.untrustValidationExecutableContext', true); } + const trustEnabled = vscode.workspace.getConfiguration().get('security.workspace.trust.enabled'); + if (trustEnabled) { + vscode.workspace.requestWorkspaceTrust(); + } this.delayers = Object.create(null); if (this.pauseValidation) { - this.pauseValidation = oldExecutable === this.executable; + this.pauseValidation = oldExecutable === this.config.executable; } if (this.documentListener) { this.documentListener.dispose(); @@ -135,7 +125,7 @@ class PHPValidationProvider { } this.diagnosticCollection.clear(); if (this.validationEnabled) { - if (this.trigger === RunTrigger.onType) { + if (this.config.trigger === RunTrigger.onType) { this.documentListener = vscode.workspace.onDidChangeTextDocument((e) => { this.triggerValidate(e.document); }); @@ -151,47 +141,70 @@ class PHPValidationProvider { this.workspaceStore.update("php.validate.checkedExecutablePath" /* CheckedExecutablePath */, undefined); vscode.commands.executeCommand('setContext', 'php.untrustValidationExecutableContext', false); } - triggerValidate(textDocument) { + async triggerValidate(textDocument) { + await this.loadConfigP; if (textDocument.languageId !== 'php' || this.pauseValidation || !this.validationEnabled) { return; } let trigger = () => { + var _a; let key = textDocument.uri.toString(); let delayer = this.delayers[key]; if (!delayer) { - delayer = new async_1.ThrottledDelayer(this.trigger === RunTrigger.onType ? 250 : 0); + delayer = new async_1.ThrottledDelayer(((_a = this.config) === null || _a === void 0 ? void 0 : _a.trigger) === RunTrigger.onType ? 250 : 0); this.delayers[key] = delayer; } delayer.trigger(() => this.doValidate(textDocument)); }; - if (this.executableIsUserDefined !== undefined && !this.executableIsUserDefined) { - let checkedExecutablePath = this.workspaceStore.get("php.validate.checkedExecutablePath" /* CheckedExecutablePath */, undefined); - if (!checkedExecutablePath || checkedExecutablePath !== this.executable) { - vscode.window.showInformationMessage(localize('php.useExecutablePath', 'Do you allow {0} (defined as a workspace setting) to be executed to lint PHP files?', this.executable), { - title: localize('php.yes', 'Allow'), - id: 'yes' - }, { - title: localize('php.no', 'Disallow'), - isCloseAffordance: true, - id: 'no' - }).then(selected => { - if (!selected || selected.id === 'no') { - this.pauseValidation = true; - } - else if (selected.id === 'yes') { - this.workspaceStore.update("php.validate.checkedExecutablePath" /* CheckedExecutablePath */, this.executable); - vscode.commands.executeCommand('setContext', 'php.untrustValidationExecutableContext', true); - trigger(); - } - }); - return; + const trustEnabled = vscode.workspace.getConfiguration().get('security.workspace.trust.enabled'); + if (trustEnabled) { + if (vscode.workspace.isTrusted) { + trigger(); } } - trigger(); + else if (this.config.executableIsUserDefined !== undefined && !this.config.executableIsUserDefined) { + const checkedExecutablePath = this.workspaceStore.get("php.validate.checkedExecutablePath" /* CheckedExecutablePath */, undefined); + if (!checkedExecutablePath || checkedExecutablePath !== this.config.executable) { + if (await this.showCustomTrustDialog()) { + this.workspaceStore.update("php.validate.checkedExecutablePath" /* CheckedExecutablePath */, this.config.executable); + vscode.commands.executeCommand('setContext', 'php.untrustValidationExecutableContext', true); + } + else { + this.pauseValidation = true; + return; + } + } + trigger(); + } + } + async showCustomTrustDialog() { + const selected = await vscode.window.showInformationMessage(localize('php.useExecutablePath', 'Do you allow {0} (defined as a workspace setting) to be executed to lint PHP files?', this.config.executable), { + title: localize('php.yes', 'Allow'), + id: 'yes' + }, { + title: localize('php.no', 'Disallow'), + isCloseAffordance: true, + id: 'no' + }); + if (selected && selected.id === 'yes') { + return true; + } + return false; } doValidate(textDocument) { - return new Promise((resolve) => { - let executable = this.executable || 'php'; + return new Promise(async (resolve) => { + const executable = this.config.executable; + if (!executable) { + this.showErrorMessage(localize('noPhp', 'Cannot validate since a PHP installation could not be found. Use the setting \'php.validate.executablePath\' to configure the PHP executable.')); + this.pauseValidation = true; + resolve(); + return; + } + if (!path.isAbsolute(executable)) { + // executable should either be resolved to an absolute path or undefined. + // This is just to be sure. + return; + } let decoder = new LineDecoder(); let diagnostics = []; let processLine = (line) => { @@ -205,7 +218,7 @@ class PHPValidationProvider { }; let options = (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]) ? { cwd: vscode.workspace.workspaceFolders[0].uri.fsPath } : undefined; let args; - if (this.trigger === RunTrigger.onSave) { + if (this.config.trigger === RunTrigger.onSave) { args = PHPValidationProvider.FileArgs.slice(0); args.push(textDocument.fileName); } @@ -224,7 +237,7 @@ class PHPValidationProvider { resolve(); }); if (childProcess.pid) { - if (this.trigger === RunTrigger.onType) { + if (this.config.trigger === RunTrigger.onType) { childProcess.stdin.write(textDocument.getText()); childProcess.stdin.end(); } @@ -252,7 +265,7 @@ class PHPValidationProvider { async showError(error, executable) { let message = null; if (error.code === 'ENOENT') { - if (this.executable) { + if (this.config.executable) { message = localize('wrongExecutable', 'Cannot validate since {0} is not a valid php executable. Use the setting \'php.validate.executablePath\' to configure the PHP executable.', executable); } else { @@ -265,6 +278,9 @@ class PHPValidationProvider { if (!message) { return; } + return this.showErrorMessage(message); + } + async showErrorMessage(message) { const openSettings = localize('goToSetting', 'Open Settings'); if (await vscode.window.showInformationMessage(message, openSettings) === openSettings) { vscode.commands.executeCommand('workbench.action.openSettings', "php.validate.executablePath" /* ExecutablePath */); @@ -275,4 +291,48 @@ exports.default = PHPValidationProvider; PHPValidationProvider.MatchExpression = /(?:(?:Parse|Fatal) error): (.*)(?: in )(.*?)(?: on line )(\d+)/; PHPValidationProvider.BufferArgs = ['-l', '-n', '-d', 'display_errors=On', '-d', 'log_errors=Off']; PHPValidationProvider.FileArgs = ['-l', '-n', '-d', 'display_errors=On', '-d', 'log_errors=Off', '-f']; +async function getConfig() { + const section = vscode.workspace.getConfiguration(); + let executable; + let executableIsUserDefined; + const inspect = section.inspect("php.validate.executablePath" /* ExecutablePath */); + if (inspect && inspect.workspaceValue) { + executable = inspect.workspaceValue; + executableIsUserDefined = false; + } + else if (inspect && inspect.globalValue) { + executable = inspect.globalValue; + executableIsUserDefined = true; + } + else { + executable = undefined; + executableIsUserDefined = undefined; + } + if (executable && !path.isAbsolute(executable)) { + const first = vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]; + if (first) { + executable = vscode.Uri.joinPath(first.uri, executable).fsPath; + } + else { + executable = undefined; + } + } + else if (!executable) { + executable = await getPhpPath(); + } + const trigger = RunTrigger.from(section.get("php.validate.run" /* Run */, RunTrigger.strings.onSave)); + return { + executable, + executableIsUserDefined, + trigger + }; +} +async function getPhpPath() { + try { + return await which('php'); + } + catch (e) { + return undefined; + } +} //# sourceMappingURL=validationProvider.js.map \ No newline at end of file diff --git a/extensions/php-language-features/package.json b/extensions/php-language-features/package.json index 2856782f54..3763949d64 100644 --- a/extensions/php-language-features/package.json +++ b/extensions/php-language-features/package.json @@ -1,87 +1,104 @@ { - "name": "php-language-features", - "displayName": "%displayName%", - "description": "%description%", - "version": "1.0.0", - "publisher": "vscode", - "license": "MIT", - "icon": "icons/logo.png", - "engines": { - "vscode": "0.10.x" - }, - "activationEvents": [ - "onLanguage:php" - ], - "main": "./out/phpMain", - "categories": [ - "Programming Languages" - ], - "contributes": { - "configuration": { - "title": "%configuration.title%", - "type": "object", - "order": 20, - "properties": { - "php.suggest.basic": { - "type": "boolean", - "default": true, - "description": "%configuration.suggest.basic%" - }, - "php.validate.enable": { - "type": "boolean", - "default": true, - "description": "%configuration.validate.enable%" - }, - "php.validate.executablePath": { - "type": [ - "string", - "null" - ], - "default": null, - "description": "%configuration.validate.executablePath%", - "scope": "machine-overridable" - }, - "php.validate.run": { - "type": "string", - "enum": [ - "onSave", - "onType" - ], - "default": "onSave", - "description": "%configuration.validate.run%" - } - } - }, - "jsonValidation": [ - { - "fileMatch": "composer.json", - "url": "https://getcomposer.org/schema.json" - } - ], - "commands": [ - { - "title": "%command.untrustValidationExecutable%", - "category": "%commands.categroy.php%", - "command": "php.untrustValidationExecutable" - } - ], - "menus": { - "commandPalette": [ - { - "command": "php.untrustValidationExecutable", - "when": "php.untrustValidationExecutableContext" - } - ] - } - }, - "scripts": { - "compile": "npx gulp compile-extension:php-language-features", - "watch": "npx gulp watch-extension:php-language-features" - }, - "dependencies": { - "vscode-nls": "^4.0.0" - }, - "devDependencies": { - "@types/node": "^12.11.7" - } + "name": "php-language-features", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "icon": "icons/logo.png", + "engines": { + "vscode": "0.10.x" + }, + "enableProposedApi": true, + "activationEvents": [ + "onLanguage:php" + ], + "main": "./out/phpMain", + "categories": [ + "Programming Languages" + ], + "capabilities": { + "virtualWorkspaces": false, + "untrustedWorkspaces": { + "supported": "limited", + "description": "%workspaceTrust%", + "restrictedConfigurations": [ + "php.validate.executablePath" + ] + } + }, + "contributes": { + "configuration": { + "title": "%configuration.title%", + "type": "object", + "order": 20, + "properties": { + "php.suggest.basic": { + "type": "boolean", + "default": true, + "description": "%configuration.suggest.basic%" + }, + "php.validate.enable": { + "type": "boolean", + "default": true, + "description": "%configuration.validate.enable%" + }, + "php.validate.executablePath": { + "type": [ + "string", + "null" + ], + "default": null, + "description": "%configuration.validate.executablePath%", + "scope": "machine-overridable" + }, + "php.validate.run": { + "type": "string", + "enum": [ + "onSave", + "onType" + ], + "default": "onSave", + "description": "%configuration.validate.run%" + } + } + }, + "jsonValidation": [ + { + "fileMatch": "composer.json", + "url": "https://getcomposer.org/schema.json" + } + ], + "commands": [ + { + "title": "%command.untrustValidationExecutable%", + "category": "%commands.categroy.php%", + "command": "php.untrustValidationExecutable" + } + ], + "menus": { + "commandPalette": [ + { + "command": "php.untrustValidationExecutable", + "when": "php.untrustValidationExecutableContext" + } + ] + } + }, + "scripts": { + "compile": "npx gulp compile-extension:php-language-features", + "watch": "npx gulp watch-extension:php-language-features" + }, + "dependencies": { + "vscode-nls": "^4.0.0", + "which": "^2.0.2" + }, + "devDependencies": { + "@types/node": "^12.19.9", + "@types/which": "^2.0.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } } diff --git a/extensions/php-language-features/package.nls.json b/extensions/php-language-features/package.nls.json index 3920760d1d..1ebf76ea85 100644 --- a/extensions/php-language-features/package.nls.json +++ b/extensions/php-language-features/package.nls.json @@ -7,5 +7,6 @@ "commands.categroy.php": "PHP", "command.untrustValidationExecutable": "Disallow PHP validation executable (defined as workspace setting)", "displayName": "PHP Language Features", - "description": "Provides rich language support for PHP files." -} \ No newline at end of file + "description": "Provides rich language support for PHP files.", + "workspaceTrust": "The extension requires workspace trust when the `php.validate.executablePath` setting will load a version of PHP in the workspace." +} diff --git a/extensions/php-language-features/tsconfig.json b/extensions/php-language-features/tsconfig.json index 296ddb38fc..070854d691 100644 --- a/extensions/php-language-features/tsconfig.json +++ b/extensions/php-language-features/tsconfig.json @@ -1,9 +1,9 @@ { - "extends": "../shared.tsconfig.json", + "extends": "../tsconfig.base.json", "compilerOptions": { "outDir": "./out" }, "include": [ "src/**/*" ] -} \ No newline at end of file +} diff --git a/extensions/php-language-features/yarn.lock b/extensions/php-language-features/yarn.lock index 7af62a72ce..b0fa5625a6 100644 --- a/extensions/php-language-features/yarn.lock +++ b/extensions/php-language-features/yarn.lock @@ -2,12 +2,29 @@ # yarn lockfile v1 -"@types/node@^12.11.7": - version "12.11.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.11.7.tgz#57682a9771a3f7b09c2497f28129a0462966524a" - integrity sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA== +"@types/node@^12.19.9": + version "12.19.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.9.tgz#990ad687ad8b26ef6dcc34a4f69c33d40c95b679" + integrity sha512-yj0DOaQeUrk3nJ0bd3Y5PeDRJ6W0r+kilosLA+dzF3dola/o9hxhMSg2sFvVcA2UHS5JSOsZp4S0c1OEXc4m1Q== + +"@types/which@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/which/-/which-2.0.0.tgz#446d35586611dee657120de8e0457382a658fc25" + integrity sha512-JHTNOEpZnACQdsTojWggn+SQ8IucfqEhtz7g8Z0G67WdSj4x3F0X5I2c/CVcl8z/QukGrIHeQ/N49v1au74XFQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= vscode-nls@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.0.0.tgz#4001c8a6caba5cedb23a9c5ce1090395c0e44002" integrity sha512-qCfdzcH+0LgQnBpZA53bA32kzp9rpq/f66Som577ObeuDlFIrtbEJ+A/+CCxjIh4G8dpJYNCKIsxpRAHIfsbNw== + +which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" diff --git a/node/package.json b/node/package.json index fbd7dfb569..e2b4156e04 100644 --- a/node/package.json +++ b/node/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@onivim/request-light": "0.4.1", - "@onivim/vscode-exthost": "1.55.2000", + "@onivim/vscode-exthost": "1.56.2000", "fs-extra": "^8.1.0", "node-pty": "0.11.0-beta5", "sudo-prompt": "^9.0.0", diff --git a/node/yarn.lock b/node/yarn.lock index 3db4eb7025..70f05c31fd 100644 --- a/node/yarn.lock +++ b/node/yarn.lock @@ -11,10 +11,10 @@ https-proxy-agent "^2.2.4" vscode-nls "^4.1.2" -"@onivim/vscode-exthost@1.55.2000": - version "1.55.2000" - resolved "https://registry.yarnpkg.com/@onivim/vscode-exthost/-/vscode-exthost-1.55.2000.tgz#a5c87c534c00f5a92da840ced2dd08386553237f" - integrity sha512-RjC6yoe1YtjiTKlY1j38jZddjGnaD9p7ck4xrn0x8IWIbMztDD8/LxBXCjZglvWrwnZA7Q5rUR29m7+sP04ZIQ== +"@onivim/vscode-exthost@1.56.2000": + version "1.56.2000" + resolved "https://registry.yarnpkg.com/@onivim/vscode-exthost/-/vscode-exthost-1.56.2000.tgz#de61de6ff2a4087c7c3e102301bcdf9c61755a13" + integrity sha512-IpjyA3tqlFYsfkKobEabE0zX3BoxaCTHGl7av5BwrB4g0cuSzgYzz5zdjV+80Wduu7MbHrhPfcPXVy/ykv2DWQ== dependencies: graceful-fs "4.2.3" iconv-lite-umd "0.6.8" diff --git a/src/Exthost/Handlers.re b/src/Exthost/Handlers.re index c1a9737e58..f463da023e 100644 --- a/src/Exthost/Handlers.re +++ b/src/Exthost/Handlers.re @@ -167,7 +167,7 @@ let handlers = ~mapper=msg => Msg.StatusBar(msg), "MainThreadStatusBar", ), - mainNotImplemented("MainThreadSecretStaet"), + mainNotImplemented("MainThreadSecretState"), main( ~handler=Msg.Storage.handle, ~mapper=msg => Msg.Storage(msg), @@ -218,6 +218,9 @@ let handlers = ), mainNotImplemented("MainThreadLabelService"), mainNotImplemented("MainThreadNotebook"), + mainNotImplemented("MainThreadNotebookDocuments"), + mainNotImplemented("MainThreadNotebookEditors"), + mainNotImplemented("MainThreadNotebookKernels"), mainNotImplemented("MainThreadTheming"), mainNotImplemented("MainThreadTunnelService"), mainNotImplemented("MainThreadTimeline"), @@ -261,6 +264,7 @@ let handlers = ext("ExtHostOutputService"), ext("ExtHosLabelService"), // SIC ext("ExtHostNotebook"), + ext("ExtHostNotebookKernels"), ext("ExtHostTheming"), ext("ExtHostTunnelService"), ext("ExtHostAuthentication"),