Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/microsoft/vscode.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/vs/workbench')
-rw-r--r--src/vs/workbench/api/browser/extensionHost.contribution.ts1
-rw-r--r--src/vs/workbench/api/browser/mainThreadNotebookKernels.ts5
-rw-r--r--src/vs/workbench/api/browser/mainThreadNotebookProxyKernels.ts122
-rw-r--r--src/vs/workbench/api/common/extHost.api.impl.ts6
-rw-r--r--src/vs/workbench/api/common/extHost.protocol.ts23
-rw-r--r--src/vs/workbench/api/common/extHostNotebookKernels.ts17
-rw-r--r--src/vs/workbench/api/common/extHostNotebookProxyKernels.ts157
-rw-r--r--src/vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar.ts5
-rw-r--r--src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts6
-rw-r--r--src/vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl.ts24
-rw-r--r--src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts3
-rw-r--r--src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts12
-rw-r--r--src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorWidgetContextKeys.ts4
-rw-r--r--src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem.ts27
-rw-r--r--src/vs/workbench/contrib/notebook/common/notebookKernelService.ts35
-rw-r--r--src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts5
-rw-r--r--src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts5
-rw-r--r--src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts5
-rw-r--r--src/vs/workbench/services/extensions/common/extensionsApiProposals.ts1
19 files changed, 434 insertions, 29 deletions
diff --git a/src/vs/workbench/api/browser/extensionHost.contribution.ts b/src/vs/workbench/api/browser/extensionHost.contribution.ts
index 37afee52e07..2fa247a959b 100644
--- a/src/vs/workbench/api/browser/extensionHost.contribution.ts
+++ b/src/vs/workbench/api/browser/extensionHost.contribution.ts
@@ -64,6 +64,7 @@ import './mainThreadWorkspace';
import './mainThreadComments';
import './mainThreadNotebook';
import './mainThreadNotebookKernels';
+import './mainThreadNotebookProxyKernels';
import './mainThreadNotebookDocumentsAndEditors';
import './mainThreadNotebookRenderers';
import './mainThreadInteractive';
diff --git a/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts b/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts
index 46febd36991..a8809c58016 100644
--- a/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts
+++ b/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts
@@ -15,11 +15,12 @@ import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/ext
import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser';
import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/notebookEditorService';
import { INotebookCellExecution, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService';
-import { INotebookKernel, INotebookKernelChangeEvent, INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
+import { IResolvedNotebookKernel, INotebookKernelChangeEvent, INotebookKernelService, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier';
import { ExtHostContext, ExtHostNotebookKernelsShape, ICellExecuteUpdateDto, ICellExecutionCompleteDto, INotebookKernelDto2, MainContext, MainThreadNotebookKernelsShape } from '../common/extHost.protocol';
-abstract class MainThreadKernel implements INotebookKernel {
+abstract class MainThreadKernel implements IResolvedNotebookKernel {
+ readonly type: NotebookKernelType.Resolved = NotebookKernelType.Resolved;
private readonly _onDidChange = new Emitter<INotebookKernelChangeEvent>();
private readonly preloads: { uri: URI; provides: string[] }[];
diff --git a/src/vs/workbench/api/browser/mainThreadNotebookProxyKernels.ts b/src/vs/workbench/api/browser/mainThreadNotebookProxyKernels.ts
new file mode 100644
index 00000000000..3db46989937
--- /dev/null
+++ b/src/vs/workbench/api/browser/mainThreadNotebookProxyKernels.ts
@@ -0,0 +1,122 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import { Emitter, Event } from 'vs/base/common/event';
+import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
+import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
+import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers';
+import { INotebookKernelService, INotebookProxyKernel, INotebookProxyKernelChangeEvent, ProxyKernelState, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
+import { ExtHostContext, ExtHostNotebookProxyKernelsShape, INotebookProxyKernelDto, MainContext, MainThreadNotebookProxyKernelsShape } from '../common/extHost.protocol';
+
+abstract class MainThreadProxyKernel implements INotebookProxyKernel {
+ readonly type: NotebookKernelType.Proxy = NotebookKernelType.Proxy;
+ protected readonly _onDidChange = new Emitter<INotebookProxyKernelChangeEvent>();
+ readonly onDidChange: Event<INotebookProxyKernelChangeEvent> = this._onDidChange.event;
+ readonly id: string;
+ readonly viewType: string;
+ readonly extension: ExtensionIdentifier;
+ readonly preloadProvides: string[] = [];
+ label: string;
+ description?: string;
+ detail?: string;
+ kind?: string;
+ supportedLanguages: string[] = [];
+ connectionState: ProxyKernelState;
+
+ constructor(data: INotebookProxyKernelDto) {
+ this.id = data.id;
+ this.viewType = data.notebookType;
+ this.extension = data.extensionId;
+
+ this.label = data.label;
+ this.description = data.description;
+ this.detail = data.detail;
+ this.kind = data.kind;
+
+ this.connectionState = ProxyKernelState.Disconnected;
+ }
+
+ update(data: Partial<INotebookProxyKernel>) {
+ const event: INotebookProxyKernelChangeEvent = Object.create(null);
+ if (data.label !== undefined) {
+ this.label = data.label;
+ event.label = true;
+ }
+ if (data.description !== undefined) {
+ this.description = data.description;
+ event.description = true;
+ }
+ if (data.detail !== undefined) {
+ this.detail = data.detail;
+ event.detail = true;
+ }
+ if (data.kind !== undefined) {
+ this.kind = data.kind;
+ event.kind = true;
+ }
+
+ this._onDidChange.fire(event);
+ }
+
+ abstract resolveKernel(): Promise<string | null>;
+}
+
+@extHostNamedCustomer(MainContext.MainThreadNotebookProxyKernels)
+export class MainThreadNotebookProxyKernels implements MainThreadNotebookProxyKernelsShape {
+
+ private readonly _disposables = new DisposableStore();
+
+ private readonly _proxyKernels = new Map<number, [kernel: MainThreadProxyKernel, registraion: IDisposable]>();
+ private readonly _proxyKernelProxy: ExtHostNotebookProxyKernelsShape;
+
+ constructor(
+ extHostContext: IExtHostContext,
+ @INotebookKernelService private readonly _notebookKernelService: INotebookKernelService,
+ ) {
+ this._proxyKernelProxy = extHostContext.getProxy(ExtHostContext.ExtHostNotebookProxyKernels);
+ }
+
+ dispose(): void {
+ this._disposables.dispose();
+
+ for (let [, registration] of this._proxyKernels.values()) {
+ registration.dispose();
+ }
+ }
+
+ // -- Proxy kernel
+
+ async $addProxyKernel(handle: number, data: INotebookProxyKernelDto): Promise<void> {
+ const that = this;
+ const proxyKernel = new class extends MainThreadProxyKernel {
+ async resolveKernel(): Promise<string | null> {
+ this.connectionState = ProxyKernelState.Initializing;
+ this._onDidChange.fire({ connectionState: true });
+ const delegateKernel = await that._proxyKernelProxy.$resolveKernel(handle);
+ this.connectionState = ProxyKernelState.Connected;
+ this._onDidChange.fire({ connectionState: true });
+ return delegateKernel;
+ }
+ }(data);
+
+ const registration = this._notebookKernelService.registerKernel(proxyKernel);
+ this._proxyKernels.set(handle, [proxyKernel, registration]);
+ }
+
+ $updateProxyKernel(handle: number, data: Partial<INotebookProxyKernelDto>): void {
+ const tuple = this._proxyKernels.get(handle);
+ if (tuple) {
+ tuple[0].update(data);
+ }
+ }
+
+ $removeProxyKernel(handle: number): void {
+ const tuple = this._proxyKernels.get(handle);
+ if (tuple) {
+ tuple[1].dispose();
+ this._proxyKernels.delete(handle);
+ }
+ }
+}
diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts
index 42f84709fbe..668f8eb02c6 100644
--- a/src/vs/workbench/api/common/extHost.api.impl.ts
+++ b/src/vs/workbench/api/common/extHost.api.impl.ts
@@ -94,6 +94,7 @@ import { ExtHostInteractive } from 'vs/workbench/api/common/extHostInteractive';
import { combinedDisposable } from 'vs/base/common/lifecycle';
import { checkProposedApiEnabled, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions';
import { DebugConfigurationProviderTriggerKind } from 'vs/workbench/contrib/debug/common/debug';
+import { ExtHostNotebookProxyKernels } from 'vs/workbench/api/common/extHostNotebookProxyKernels';
export interface IExtensionApiFactory {
(extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode;
@@ -156,6 +157,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
const extHostNotebookDocuments = rpcProtocol.set(ExtHostContext.ExtHostNotebookDocuments, new ExtHostNotebookDocuments(extHostNotebook));
const extHostNotebookEditors = rpcProtocol.set(ExtHostContext.ExtHostNotebookEditors, new ExtHostNotebookEditors(extHostLogService, rpcProtocol, extHostNotebook));
const extHostNotebookKernels = rpcProtocol.set(ExtHostContext.ExtHostNotebookKernels, new ExtHostNotebookKernels(rpcProtocol, initData, extHostNotebook, extHostCommands, extHostLogService));
+ const extHostNotebookProxyKernels = rpcProtocol.set(ExtHostContext.ExtHostNotebookProxyKernels, new ExtHostNotebookProxyKernels(rpcProtocol, extHostNotebookKernels, extHostLogService));
const extHostNotebookRenderers = rpcProtocol.set(ExtHostContext.ExtHostNotebookRenderers, new ExtHostNotebookRenderers(rpcProtocol, extHostNotebook));
const extHostEditors = rpcProtocol.set(ExtHostContext.ExtHostEditors, new ExtHostEditors(rpcProtocol, extHostDocumentsAndEditors));
const extHostTreeViews = rpcProtocol.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(rpcProtocol.getProxy(MainContext.MainThreadTreeViews), extHostCommands, extHostLogService));
@@ -1133,6 +1135,10 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
extHostApiDeprecation.report('notebookConcatTextDocument', extension, 'This proposal is not on track for finalization and will be removed.');
return new ExtHostNotebookConcatDocument(extHostNotebookDocuments, extHostDocuments, notebook, selector);
},
+ createNotebookProxyController(id: string, notebookType: string, label: string, handler: () => vscode.NotebookController | string | Thenable<vscode.NotebookController | string>) {
+ checkProposedApiEnabled(extension, 'notebookProxyController');
+ return extHostNotebookProxyKernels.createNotebookProxyController(extension, id, notebookType, label, handler);
+ }
};
return <typeof vscode>{
diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts
index 5b80a5ac3a7..8ccdce38e97 100644
--- a/src/vs/workbench/api/common/extHost.protocol.ts
+++ b/src/vs/workbench/api/common/extHost.protocol.ts
@@ -982,6 +982,17 @@ export interface INotebookKernelDto2 {
preloads?: { uri: UriComponents; provides: string[] }[];
}
+export interface INotebookProxyKernelDto {
+ id: string;
+ notebookType: string;
+ extensionId: ExtensionIdentifier;
+ extensionLocation: UriComponents;
+ label: string;
+ detail?: string;
+ description?: string;
+ kind?: string;
+}
+
export interface ICellExecuteOutputEditDto {
editType: CellExecutionUpdateType.Output;
append?: boolean;
@@ -1015,6 +1026,12 @@ export interface MainThreadNotebookKernelsShape extends IDisposable {
$completeExecution(handle: number, data: SerializableObjectWithBuffers<ICellExecutionCompleteDto>): void;
}
+export interface MainThreadNotebookProxyKernelsShape extends IDisposable {
+ $addProxyKernel(handle: number, data: INotebookProxyKernelDto): Promise<void>;
+ $updateProxyKernel(handle: number, data: Partial<INotebookProxyKernelDto>): void;
+ $removeProxyKernel(handle: number): void;
+}
+
export interface MainThreadNotebookRenderersShape extends IDisposable {
$postMessage(editorId: string | undefined, rendererId: string, message: unknown): Promise<boolean>;
}
@@ -2103,6 +2120,10 @@ export interface ExtHostNotebookKernelsShape {
$cellExecutionChanged(uri: UriComponents, cellHandle: number, state: notebookCommon.NotebookCellExecutionState | undefined): void;
}
+export interface ExtHostNotebookProxyKernelsShape {
+ $resolveKernel(handle: number): Promise<string | null>;
+}
+
export interface ExtHostInteractiveShape {
$willAddInteractiveDocument(uri: UriComponents, eol: string, languageId: string, notebookUri: UriComponents): void;
$willRemoveInteractiveDocument(uri: UriComponents, notebookUri: UriComponents): void;
@@ -2279,6 +2300,7 @@ export const MainContext = {
MainThreadNotebookDocuments: createProxyIdentifier<MainThreadNotebookDocumentsShape>('MainThreadNotebookDocumentsShape'),
MainThreadNotebookEditors: createProxyIdentifier<MainThreadNotebookEditorsShape>('MainThreadNotebookEditorsShape'),
MainThreadNotebookKernels: createProxyIdentifier<MainThreadNotebookKernelsShape>('MainThreadNotebookKernels'),
+ MainThreadNotebookProxyKernels: createProxyIdentifier<MainThreadNotebookProxyKernelsShape>('MainThreadNotebookProxyKernels'),
MainThreadNotebookRenderers: createProxyIdentifier<MainThreadNotebookRenderersShape>('MainThreadNotebookRenderers'),
MainThreadInteractive: createProxyIdentifier<MainThreadInteractiveShape>('MainThreadInteractive'),
MainThreadTheming: createProxyIdentifier<MainThreadThemingShape>('MainThreadTheming'),
@@ -2331,6 +2353,7 @@ export const ExtHostContext = {
ExtHostNotebookDocuments: createProxyIdentifier<ExtHostNotebookDocumentsShape>('ExtHostNotebookDocuments'),
ExtHostNotebookEditors: createProxyIdentifier<ExtHostNotebookEditorsShape>('ExtHostNotebookEditors'),
ExtHostNotebookKernels: createProxyIdentifier<ExtHostNotebookKernelsShape>('ExtHostNotebookKernels'),
+ ExtHostNotebookProxyKernels: createProxyIdentifier<ExtHostNotebookProxyKernelsShape>('ExtHostNotebookProxyKernels'),
ExtHostNotebookRenderers: createProxyIdentifier<ExtHostNotebookRenderersShape>('ExtHostNotebookRenderers'),
ExtHostInteractive: createProxyIdentifier<ExtHostInteractiveShape>('ExtHostInteractive'),
ExtHostTheming: createProxyIdentifier<ExtHostThemingShape>('ExtHostTheming'),
diff --git a/src/vs/workbench/api/common/extHostNotebookKernels.ts b/src/vs/workbench/api/common/extHostNotebookKernels.ts
index 05550b53475..f99ead59ac7 100644
--- a/src/vs/workbench/api/common/extHostNotebookKernels.ts
+++ b/src/vs/workbench/api/common/extHostNotebookKernels.ts
@@ -108,7 +108,7 @@ export class ExtHostNotebookKernels implements ExtHostNotebookKernelsShape {
const onDidReceiveMessage = new Emitter<{ editor: vscode.NotebookEditor; message: any }>();
const data: INotebookKernelDto2 = {
- id: createKernelId(extension, id),
+ id: createKernelId(extension.identifier, id),
notebookType: viewType,
extensionId: extension.identifier,
extensionLocation: extension.extensionLocation,
@@ -218,7 +218,7 @@ export class ExtHostNotebookKernels implements ExtHostNotebookKernelsShape {
that._logService.trace(`NotebookController[${handle}] NOT associated to notebook, associated to THESE notebooks:`, Array.from(associatedNotebooks.keys()).map(u => u.toString()));
throw new Error(`notebook controller is NOT associated to notebook: ${cell.notebook.uri.toString()}`);
}
- return that._createNotebookCellExecution(cell, createKernelId(extension, this.id));
+ return that._createNotebookCellExecution(cell, createKernelId(extension.identifier, this.id));
},
dispose: () => {
if (!isDisposed) {
@@ -257,6 +257,15 @@ export class ExtHostNotebookKernels implements ExtHostNotebookKernelsShape {
return controller;
}
+ getIdByController(controller: vscode.NotebookController) {
+ for (const [_, candidate] of this._kernelData) {
+ if (candidate.controller === controller) {
+ return createKernelId(candidate.extensionId, controller.id);
+ }
+ }
+ return null;
+ }
+
$acceptNotebookAssociation(handle: number, uri: UriComponents, value: boolean): void {
const obj = this._kernelData.get(handle);
if (obj) {
@@ -583,6 +592,6 @@ class TimeoutBasedCollector<T> {
}
}
-function createKernelId(extension: IExtensionDescription, id: string): string {
- return `${extension.identifier.value}/${id}`;
+export function createKernelId(extensionIdentifier: ExtensionIdentifier, id: string): string {
+ return `${extensionIdentifier.value}/${id}`;
}
diff --git a/src/vs/workbench/api/common/extHostNotebookProxyKernels.ts b/src/vs/workbench/api/common/extHostNotebookProxyKernels.ts
new file mode 100644
index 00000000000..786101bf360
--- /dev/null
+++ b/src/vs/workbench/api/common/extHostNotebookProxyKernels.ts
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import { Emitter } from 'vs/base/common/event';
+import { DisposableStore } from 'vs/base/common/lifecycle';
+import { ResourceMap } from 'vs/base/common/map';
+import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions';
+import { ILogService } from 'vs/platform/log/common/log';
+import { ExtHostNotebookProxyKernelsShape, IMainContext, INotebookProxyKernelDto, MainContext, MainThreadNotebookProxyKernelsShape } from 'vs/workbench/api/common/extHost.protocol';
+import { createKernelId, ExtHostNotebookKernels } from 'vs/workbench/api/common/extHostNotebookKernels';
+import { checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions';
+import * as vscode from 'vscode';
+
+interface IProxyKernelData {
+ extensionId: ExtensionIdentifier;
+ controller: vscode.NotebookProxyController;
+ onDidChangeSelection: Emitter<{ selected: boolean; notebook: vscode.NotebookDocument }>;
+ associatedNotebooks: ResourceMap<boolean>;
+}
+
+export type SelectKernelReturnArgs = ControllerInfo | { notebookEditorId: string } | ControllerInfo & { notebookEditorId: string } | undefined;
+type ControllerInfo = { id: string; extension: string };
+
+
+export class ExtHostNotebookProxyKernels implements ExtHostNotebookProxyKernelsShape {
+
+ private readonly _proxy: MainThreadNotebookProxyKernelsShape;
+
+ private readonly _proxyKernelData: Map<number, IProxyKernelData> = new Map<number, IProxyKernelData>();
+ private _handlePool: number = 0;
+
+ private readonly _onDidChangeCellExecutionState = new Emitter<vscode.NotebookCellExecutionStateChangeEvent>();
+ readonly onDidChangeNotebookCellExecutionState = this._onDidChangeCellExecutionState.event;
+
+ constructor(
+ mainContext: IMainContext,
+ private readonly extHostNotebook: ExtHostNotebookKernels,
+ @ILogService private readonly _logService: ILogService
+ ) {
+ this._proxy = mainContext.getProxy(MainContext.MainThreadNotebookProxyKernels);
+ }
+
+ createNotebookProxyController(extension: IExtensionDescription, id: string, viewType: string, label: string, handler: () => vscode.NotebookController | string | Thenable<vscode.NotebookController | string>): vscode.NotebookProxyController {
+ const handle = this._handlePool++;
+
+ let isDisposed = false;
+ const commandDisposables = new DisposableStore();
+ const onDidChangeSelection = new Emitter<{ selected: boolean; notebook: vscode.NotebookDocument }>();
+
+ const data: INotebookProxyKernelDto = {
+ id: createKernelId(extension.identifier, id),
+ notebookType: viewType,
+ extensionId: extension.identifier,
+ extensionLocation: extension.extensionLocation,
+ label: label || extension.identifier.value,
+ };
+
+ let _resolveHandler = handler;
+
+ this._proxy.$addProxyKernel(handle, data).catch(err => {
+ // this can happen when a kernel with that ID is already registered
+ console.log(err);
+ isDisposed = true;
+ });
+
+ let tokenPool = 0;
+ const _update = () => {
+ if (isDisposed) {
+ return;
+ }
+ const myToken = ++tokenPool;
+ Promise.resolve().then(() => {
+ if (myToken === tokenPool) {
+ this._proxy.$updateProxyKernel(handle, data);
+ }
+ });
+ };
+
+ // notebook documents that are associated to this controller
+ const associatedNotebooks = new ResourceMap<boolean>();
+
+ const controller: vscode.NotebookProxyController = {
+ get id() { return id; },
+ get notebookType() { return data.notebookType; },
+ onDidChangeSelectedNotebooks: onDidChangeSelection.event,
+ get label() {
+ return data.label;
+ },
+ set label(value) {
+ data.label = value ?? extension.displayName ?? extension.name;
+ _update();
+ },
+ get detail() {
+ return data.detail ?? '';
+ },
+ set detail(value) {
+ data.detail = value;
+ _update();
+ },
+ get description() {
+ return data.description ?? '';
+ },
+ set description(value) {
+ data.description = value;
+ _update();
+ },
+ get kind() {
+ checkProposedApiEnabled(extension, 'notebookControllerKind');
+ return data.kind ?? '';
+ },
+ set kind(value) {
+ checkProposedApiEnabled(extension, 'notebookControllerKind');
+ data.kind = value;
+ _update();
+ },
+ get resolveHandler() {
+ return _resolveHandler;
+ },
+ dispose: () => {
+ if (!isDisposed) {
+ this._logService.trace(`NotebookProxyController[${handle}], DISPOSED`);
+ isDisposed = true;
+ this._proxyKernelData.delete(handle);
+ commandDisposables.dispose();
+ onDidChangeSelection.dispose();
+ this._proxy.$removeProxyKernel(handle);
+ }
+ }
+ };
+
+ this._proxyKernelData.set(handle, {
+ extensionId: extension.identifier,
+ controller,
+ onDidChangeSelection,
+ associatedNotebooks
+ });
+ return controller;
+ }
+
+ async $resolveKernel(handle: number): Promise<string | null> {
+ const obj = this._proxyKernelData.get(handle);
+ if (!obj) {
+ // extension can dispose kernels in the meantime
+ return null;
+ }
+
+ const controller = await obj.controller.resolveHandler();
+ if (typeof controller === 'string') {
+ return controller;
+ } else {
+ return this.extHostNotebook.getIdByController(controller);
+ }
+ }
+}
+
diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar.ts b/src/vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar.ts
index 83b35ce916d..c93c6b17ba2 100644
--- a/src/vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar.ts
+++ b/src/vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar.ts
@@ -197,6 +197,11 @@ registerAction2(class extends Action2 {
quickPickItems.push(...suggestions.map(toQuickPick));
}
+ quickPickItems.push({
+ id: 'install',
+ label: nls.localize('installKernels', "Install kernels from the marketplace"),
+ });
+
// Next display all of the kernels grouped by categories or extensions.
// If we don't have a kind, always display those at the bottom.
const picks = all.filter(item => !suggestions.includes(item)).map(toQuickPick);
diff --git a/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts
index d0c6379a54b..68d9d0f8dcc 100644
--- a/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts
+++ b/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts
@@ -7,7 +7,7 @@ import * as glob from 'vs/base/common/glob';
import { URI, UriComponents } from 'vs/base/common/uri';
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
import { isDocumentExcludePattern, TransientCellMetadata, TransientDocumentMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon';
-import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
+import { INotebookKernelService, IResolvedNotebookKernel, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
CommandsRegistry.registerCommand('_resolveNotebookContentProvider', (accessor): {
@@ -66,13 +66,13 @@ CommandsRegistry.registerCommand('_resolveNotebookKernels', async (accessor, arg
const uri = URI.revive(args.uri as UriComponents);
const kernels = notebookKernelService.getMatchingKernel({ uri, viewType: args.viewType });
- return kernels.all.map(provider => ({
+ return kernels.all.filter(kernel => kernel.type === NotebookKernelType.Resolved).map((provider) => ({
id: provider.id,
label: provider.label,
kind: provider.kind,
description: provider.description,
detail: provider.detail,
isPreferred: false, // todo@jrieken,@rebornix
- preloads: provider.preloadUris,
+ preloads: (provider as IResolvedNotebookKernel).preloadUris,
}));
});
diff --git a/src/vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl.ts
index 000c7b3b72c..b8877a553a2 100644
--- a/src/vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl.ts
+++ b/src/vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl.ts
@@ -12,7 +12,7 @@ import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/mode
import { CellKind, INotebookTextModel, NotebookCellExecutionState } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { INotebookExecutionService } from 'vs/workbench/contrib/notebook/common/notebookExecutionService';
import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService';
-import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
+import { INotebookKernelService, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
export class NotebookExecutionService implements INotebookExecutionService {
declare _serviceBrand: undefined;
@@ -45,6 +45,23 @@ export class NotebookExecutionService implements INotebookExecutionService {
return;
}
+ if (kernel.type === NotebookKernelType.Proxy) {
+ // we should actually resolve the kernel
+ const resolved = await kernel.resolveKernel(notebook.uri);
+ let kernels = this._notebookKernelService.getMatchingKernel(notebook);
+ const newlyMatchedKernel = kernels.all.find(k => k.id === resolved);
+
+ if (!newlyMatchedKernel) {
+ return;
+ }
+
+ kernel = newlyMatchedKernel;
+ }
+
+ if (kernel.type === NotebookKernelType.Proxy) {
+ return;
+ }
+
const executeCells: NotebookCellTextModel[] = [];
for (const cell of cellsArr) {
const cellExe = this._notebookExecutionStateService.getCellExecution(cell.uri);
@@ -75,6 +92,11 @@ export class NotebookExecutionService implements INotebookExecutionService {
this._logService.debug(`NotebookExecutionService#cancelNotebookCellHandles ${JSON.stringify(cellsArr)}`);
const kernel = this._notebookKernelService.getSelectedOrSuggestedKernel(notebook);
if (kernel) {
+ if (kernel.type === NotebookKernelType.Proxy) {
+ // we should handle cancelling proxy kernel too
+ return;
+ }
+
await kernel.cancelNotebookCellExecution(notebook.uri, cellsArr);
}
}
diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts
index d4745c02a43..eb6e260ec10 100644
--- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts
+++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts
@@ -9,6 +9,7 @@ import { ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/no
import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents';
import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart';
import { NotebookCellInternalMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon';
+import { NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
export class CellExecutionPart extends CellPart {
private kernelDisposables = this._register(new DisposableStore());
@@ -41,7 +42,7 @@ export class CellExecutionPart extends CellPart {
}
private updateExecutionOrder(internalMetadata: NotebookCellInternalMetadata): void {
- if (this._notebookEditor.activeKernel?.implementsExecutionOrder) {
+ if (this._notebookEditor.activeKernel?.type === NotebookKernelType.Resolved && this._notebookEditor.activeKernel?.implementsExecutionOrder) {
const executionOrderLabel = typeof internalMetadata.executionOrder === 'number' ?
`[${internalMetadata.executionOrder}]` :
'[ ]';
diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts
index f5b40f97620..f7a64b5b596 100644
--- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts
+++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts
@@ -37,7 +37,7 @@ import { preloadsScriptStr, RendererMetadata } from 'vs/workbench/contrib/notebo
import { transformWebviewThemeVars } from 'vs/workbench/contrib/notebook/browser/view/renderers/webviewThemeMapping';
import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel';
import { CellUri, INotebookRendererInfo, NotebookSetting, RendererMessagingSpec } from 'vs/workbench/contrib/notebook/common/notebookCommon';
-import { INotebookKernel } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
+import { INotebookKernel, IResolvedNotebookKernel, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { IScopedRendererMessaging } from 'vs/workbench/contrib/notebook/common/notebookRendererMessagingService';
import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
import { IWebviewElement, IWebviewService, WebviewContentPurpose } from 'vs/workbench/contrib/webview/browser/webview';
@@ -904,7 +904,7 @@ var requirejs = (function() {
}
this._preloadsCache.clear();
- if (this._currentKernel) {
+ if (this._currentKernel && this._currentKernel.type === NotebookKernelType.Resolved) {
this._updatePreloadsFromKernel(this._currentKernel);
}
@@ -1401,14 +1401,14 @@ var requirejs = (function() {
const previousKernel = this._currentKernel;
this._currentKernel = kernel;
- if (previousKernel && previousKernel.preloadUris.length > 0) {
+ if (previousKernel && previousKernel.type === NotebookKernelType.Resolved && previousKernel.preloadUris.length > 0) {
this.webview?.reload(); // preloads will be restored after reload
- } else if (kernel) {
+ } else if (kernel?.type === NotebookKernelType.Resolved) {
this._updatePreloadsFromKernel(kernel);
}
}
- private _updatePreloadsFromKernel(kernel: INotebookKernel) {
+ private _updatePreloadsFromKernel(kernel: IResolvedNotebookKernel) {
const resources: IControllerPreload[] = [];
for (const preload of kernel.preloadUris) {
const uri = this.environmentService.isExtensionDevelopment && (preload.scheme === 'http' || preload.scheme === 'https')
@@ -1434,7 +1434,7 @@ var requirejs = (function() {
const mixedResourceRoots = [
...(this.localResourceRootsCache || []),
- ...(this._currentKernel ? [this._currentKernel.localResourceRoot] : []),
+ ...(this._currentKernel && this._currentKernel.type === NotebookKernelType.Resolved ? [this._currentKernel.localResourceRoot] : []),
];
this.webview.localResourcesRoot = mixedResourceRoots;
diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorWidgetContextKeys.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorWidgetContextKeys.ts
index a90477db542..b1cf70a4946 100644
--- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorWidgetContextKeys.ts
+++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorWidgetContextKeys.ts
@@ -8,7 +8,7 @@ import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/c
import { ICellViewModel, INotebookEditorDelegate, KERNEL_EXTENSIONS } from 'vs/workbench/contrib/notebook/browser/notebookBrowser';
import { NOTEBOOK_CELL_TOOLBAR_LOCATION, NOTEBOOK_HAS_OUTPUTS, NOTEBOOK_HAS_RUNNING_CELL, NOTEBOOK_INTERRUPTIBLE_KERNEL, NOTEBOOK_KERNEL, NOTEBOOK_KERNEL_COUNT, NOTEBOOK_KERNEL_SELECTED, NOTEBOOK_MISSING_KERNEL_EXTENSION, NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON, NOTEBOOK_VIEW_TYPE } from 'vs/workbench/contrib/notebook/common/notebookContextKeys';
import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService';
-import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
+import { INotebookKernelService, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
export class NotebookEditorContextKeys {
@@ -148,7 +148,7 @@ export class NotebookEditorContextKeys {
const { selected, all } = this._notebookKernelService.getMatchingKernel(this._editor.textModel);
this._notebookKernelCount.set(all.length);
- this._interruptibleKernel.set(selected?.implementsInterrupt ?? false);
+ this._interruptibleKernel.set((selected?.type === NotebookKernelType.Resolved && selected.implementsInterrupt) ?? false);
this._notebookKernelSelected.set(Boolean(selected));
this._notebookKernel.set(selected?.id ?? '');
}
diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem.ts
index dc9a494193e..a4060aaa62e 100644
--- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem.ts
+++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem.ts
@@ -6,10 +6,11 @@
import 'vs/css!./notebookKernelActionViewItem';
import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems';
import { Action, IAction } from 'vs/base/common/actions';
+import { DisposableStore } from 'vs/base/common/lifecycle';
import { localize } from 'vs/nls';
import { ThemeIcon } from 'vs/platform/theme/common/themeService';
import { selectKernelIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons';
-import { INotebookKernelMatchResult, INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
+import { INotebookKernelMatchResult, INotebookKernelService, NotebookKernelType, ProxyKernelState } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { Event } from 'vs/base/common/event';
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser';
@@ -17,6 +18,7 @@ import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookB
export class NotebooKernelActionViewItem extends ActionViewItem {
private _kernelLabel?: HTMLAnchorElement;
+ private _kernelDisposable: DisposableStore;
constructor(
actualAction: IAction,
@@ -31,6 +33,7 @@ export class NotebooKernelActionViewItem extends ActionViewItem {
this._register(_editor.onDidChangeModel(this._update, this));
this._register(_notebookKernelService.onDidChangeNotebookAffinity(this._update, this));
this._register(_notebookKernelService.onDidChangeSelectedNotebooks(this._update, this));
+ this._kernelDisposable = this._register(new DisposableStore());
}
override render(container: HTMLElement): void {
@@ -63,9 +66,9 @@ export class NotebooKernelActionViewItem extends ActionViewItem {
}
private _updateActionFromKernelInfo(info: INotebookKernelMatchResult): void {
-
+ this._kernelDisposable.clear();
this._action.enabled = true;
- const selectedOrSuggested = info.selected ?? (info.all.length === 1 && info.suggestions.length === 1 ? info.suggestions[0] : undefined);
+ const selectedOrSuggested = info.selected ?? ((info.all.length === 1 && info.suggestions.length === 1 && !('resolveKernel' in info.suggestions[0])) ? info.suggestions[0] : undefined);
if (selectedOrSuggested) {
// selected or suggested kernel
this._action.label = selectedOrSuggested.label;
@@ -74,6 +77,24 @@ export class NotebooKernelActionViewItem extends ActionViewItem {
// special UI for selected kernel?
}
+ if (selectedOrSuggested.type === NotebookKernelType.Proxy) {
+ if (selectedOrSuggested.connectionState === ProxyKernelState.Initializing) {
+ this._action.label = localize('initializing', "Initializing...");
+ } else {
+ this._action.label = selectedOrSuggested.label;
+ }
+
+ this._kernelDisposable.add(selectedOrSuggested.onDidChange(e => {
+ if (e.connectionState) {
+ if (selectedOrSuggested.connectionState === ProxyKernelState.Initializing) {
+ this._action.label = localize('initializing', "Initializing...");
+ } else {
+ this._action.label = selectedOrSuggested.label;
+ }
+ }
+ }));
+ }
+
} else {
// many kernels or no kernels
this._action.label = localize('select', "Select Kernel");
diff --git a/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts b/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts
index 6610fe7177d..4f5304600b0 100644
--- a/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts
+++ b/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts
@@ -31,8 +31,13 @@ export interface INotebookKernelChangeEvent {
hasExecutionOrder?: true;
}
-export interface INotebookKernel {
+export const enum NotebookKernelType {
+ Resolved,
+ Proxy = 1
+}
+export interface IResolvedNotebookKernel {
+ readonly type: NotebookKernelType.Resolved;
readonly id: string;
readonly viewType: string;
readonly onDidChange: Event<Readonly<INotebookKernelChangeEvent>>;
@@ -54,6 +59,34 @@ export interface INotebookKernel {
cancelNotebookCellExecution(uri: URI, cellHandles: number[]): Promise<void>;
}
+export const enum ProxyKernelState {
+ Disconnected = 1,
+ Connected = 2,
+ Initializing = 3
+}
+
+export interface INotebookProxyKernelChangeEvent extends INotebookKernelChangeEvent {
+ connectionState?: true;
+}
+
+export interface INotebookProxyKernel {
+ readonly type: NotebookKernelType.Proxy;
+ readonly id: string;
+ readonly viewType: string;
+ readonly extension: ExtensionIdentifier;
+ readonly preloadProvides: string[];
+ readonly onDidChange: Event<Readonly<INotebookProxyKernelChangeEvent>>;
+ label: string;
+ description?: string;
+ detail?: string;
+ kind?: string;
+ supportedLanguages: string[];
+ connectionState: ProxyKernelState;
+ resolveKernel(uri: URI): Promise<string | null>;
+}
+
+export type INotebookKernel = IResolvedNotebookKernel | INotebookProxyKernel;
+
export interface INotebookTextModelLike { uri: URI; viewType: string }
export const INotebookKernelService = createDecorator<INotebookKernelService>('INotebookKernelService');
diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts
index 6f65268830f..8d3bff7a83a 100644
--- a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts
+++ b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts
@@ -20,7 +20,7 @@ import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewMod
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
import { CellKind, IOutputDto, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService';
-import { INotebookKernel, INotebookKernelService, ISelectedNotebooksChangeEvent } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
+import { INotebookKernelService, IResolvedNotebookKernel, ISelectedNotebooksChangeEvent, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
import { setupInstantiationService, withTestNotebook as _withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor';
@@ -166,7 +166,8 @@ suite('NotebookExecutionService', () => {
});
});
-class TestNotebookKernel implements INotebookKernel {
+class TestNotebookKernel implements IResolvedNotebookKernel {
+ type: NotebookKernelType.Resolved = NotebookKernelType.Resolved;
id: string = 'test';
label: string = '';
viewType = '*';
diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts
index 887a4a05443..e5b7f84b8bf 100644
--- a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts
+++ b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts
@@ -21,7 +21,7 @@ import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/no
import { CellEditType, CellKind, CellUri, IOutputDto, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { INotebookExecutionService } from 'vs/workbench/contrib/notebook/common/notebookExecutionService';
import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService';
-import { INotebookKernel, INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
+import { INotebookKernelService, IResolvedNotebookKernel, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
import { setupInstantiationService, withTestNotebook as _withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor';
@@ -170,7 +170,8 @@ suite('NotebookExecutionStateService', () => {
});
});
-class TestNotebookKernel implements INotebookKernel {
+class TestNotebookKernel implements IResolvedNotebookKernel {
+ type: NotebookKernelType.Resolved = NotebookKernelType.Resolved;
id: string = 'test';
label: string = '';
viewType = '*';
diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts
index b1ebabc1db2..62d6afecb8b 100644
--- a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts
+++ b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts
@@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri';
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
import { setupInstantiationService, withTestNotebook as _withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor';
import { Emitter, Event } from 'vs/base/common/event';
-import { INotebookKernel, INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
+import { INotebookKernelService, IResolvedNotebookKernel, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { NotebookKernelService } from 'vs/workbench/contrib/notebook/browser/notebookKernelServiceImpl';
import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
import { mock } from 'vs/base/test/common/mock';
@@ -159,7 +159,8 @@ suite('NotebookKernelService', () => {
});
});
-class TestNotebookKernel implements INotebookKernel {
+class TestNotebookKernel implements IResolvedNotebookKernel {
+ type: NotebookKernelType.Resolved = NotebookKernelType.Resolved;
id: string = Math.random() + 'kernel';
label: string = 'test-label';
viewType = '*';
diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts
index 0a1e93cded5..4bb2426b9a3 100644
--- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts
+++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts
@@ -42,6 +42,7 @@ export const allApiProposals = Object.freeze({
notebookLiveShare: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookLiveShare.d.ts',
notebookMessaging: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookMessaging.d.ts',
notebookMime: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookMime.d.ts',
+ notebookProxyController: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookProxyController.d.ts',
portsAttributes: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.portsAttributes.d.ts',
quickPickSortByLabel: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.quickPickSortByLabel.d.ts',
resolvers: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.resolvers.d.ts',