Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Notebook kernel source menu contribution #150146

Merged
merged 14 commits into from
May 24, 2022
Next Next commit
prepare for removing proxy kernel.
  • Loading branch information
rebornix committed May 11, 2022
commit 7e34708dcccfbec7837c825ed85cc470ec20df89
8 changes: 7 additions & 1 deletion src/vs/workbench/api/browser/mainThreadNotebookKernels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/no
import { INotebookCellExecution, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService';
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';
import { ExtHostContext, ExtHostNotebookKernelsShape, ICellExecuteUpdateDto, ICellExecutionCompleteDto, INotebookKernelDto2, MainContext, MainThreadNotebookKernelsShape, NotebookControllerState } from '../common/extHost.protocol';

abstract class MainThreadKernel implements IResolvedNotebookKernel {
readonly type: NotebookKernelType.Resolved = NotebookKernelType.Resolved;
Expand All @@ -35,6 +35,7 @@ abstract class MainThreadKernel implements IResolvedNotebookKernel {
description?: string;
detail?: string;
kind?: string;
state?: NotebookControllerState;
supportedLanguages: string[];
implementsExecutionOrder: boolean;
localResourceRoot: URI;
Expand All @@ -57,6 +58,7 @@ abstract class MainThreadKernel implements IResolvedNotebookKernel {
this.description = data.description;
this.detail = data.detail;
this.kind = data.kind;
this.state = data.state;
this.supportedLanguages = isNonEmptyArray(data.supportedLanguages) ? data.supportedLanguages : _languageService.getRegisteredLanguageIds();
this.implementsExecutionOrder = data.supportsExecutionOrder ?? false;
this.localResourceRoot = URI.revive(data.extensionLocation);
Expand All @@ -83,6 +85,10 @@ abstract class MainThreadKernel implements IResolvedNotebookKernel {
this.kind = data.kind;
event.kind = true;
}
if (data.state !== undefined) {
this.state = data.state;
event.state = true;
}
if (data.supportedLanguages !== undefined) {
this.supportedLanguages = isNonEmptyArray(data.supportedLanguages) ? data.supportedLanguages : this._languageService.getRegisteredLanguageIds();
event.supportedLanguages = true;
Expand Down
10 changes: 9 additions & 1 deletion src/vs/workbench/api/browser/mainThreadNotebookProxyKernels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ 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 { INotebookKernelService, INotebookProxyKernel, INotebookProxyKernelChangeEvent, ProxyKernelState, NotebookKernelType, NotebookControllerState } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { ExtHostContext, ExtHostNotebookProxyKernelsShape, INotebookProxyKernelDto, MainContext, MainThreadNotebookProxyKernelsShape } from '../common/extHost.protocol';
import { onUnexpectedError } from 'vs/base/common/errors';
import { URI } from 'vs/base/common/uri';

abstract class MainThreadProxyKernel implements INotebookProxyKernel {
readonly type: NotebookKernelType.Proxy = NotebookKernelType.Proxy;
Expand All @@ -19,11 +20,16 @@ abstract class MainThreadProxyKernel implements INotebookProxyKernel {
readonly viewType: string;
readonly extension: ExtensionIdentifier;
readonly preloadProvides: string[] = [];
readonly preloadUris: URI[] = [];
label: string;
description?: string;
detail?: string;
kind?: string;
supportedLanguages: string[] = [];
localResourceRoot: URI;
state?: NotebookControllerState | undefined;
implementsInterrupt?: boolean | undefined;
implementsExecutionOrder?: boolean | undefined;
connectionState: ProxyKernelState;

constructor(data: INotebookProxyKernelDto) {
Expand All @@ -35,10 +41,12 @@ abstract class MainThreadProxyKernel implements INotebookProxyKernel {
this.description = data.description;
this.detail = data.detail;
this.kind = data.kind;
this.localResourceRoot = URI.revive(data.extensionLocation);

this.connectionState = ProxyKernelState.Disconnected;
}


update(data: Partial<INotebookProxyKernel>) {
const event: INotebookProxyKernelChangeEvent = Object.create(null);
if (data.label !== undefined) {
Expand Down
1 change: 1 addition & 0 deletions src/vs/workbench/api/common/extHost.api.impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1320,6 +1320,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
NotebookCellOutputItem: extHostTypes.NotebookCellOutputItem,
NotebookCellStatusBarItem: extHostTypes.NotebookCellStatusBarItem,
NotebookControllerAffinity: extHostTypes.NotebookControllerAffinity,
NotebookControllerState: extHostTypes.NotebookControllerState,
PortAttributes: extHostTypes.PortAttributes,
LinkedEditingRanges: extHostTypes.LinkedEditingRanges,
TestResultState: extHostTypes.TestResultState,
Expand Down
6 changes: 6 additions & 0 deletions src/vs/workbench/api/common/extHost.protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -970,6 +970,11 @@ export interface MainThreadNotebookDocumentsShape extends IDisposable {
$trySaveNotebook(uri: UriComponents): Promise<boolean>;
}

export enum NotebookControllerState {
Idle = 1,
Connecting = 2
}

export interface INotebookKernelDto2 {
id: string;
notebookType: string;
Expand All @@ -979,6 +984,7 @@ export interface INotebookKernelDto2 {
detail?: string;
description?: string;
kind?: string;
state?: NotebookControllerState;
supportedLanguages?: string[];
supportsInterrupt?: boolean;
supportsExecutionOrder?: boolean;
Expand Down
9 changes: 9 additions & 0 deletions src/vs/workbench/api/common/extHostNotebookKernels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,15 @@ export class ExtHostNotebookKernels implements ExtHostNotebookKernelsShape {
get rendererScripts() {
return data.preloads ? data.preloads.map(extHostTypeConverters.NotebookRendererScript.to) : [];
},
get state() {
checkProposedApiEnabled(extension, 'notebookProxyController');
return data.state;
},
set state(value) {
checkProposedApiEnabled(extension, 'notebookProxyController');
data.state = value;
_update();
},
get executeHandler() {
return _executeHandler;
},
Expand Down
5 changes: 5 additions & 0 deletions src/vs/workbench/api/common/extHostTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3369,6 +3369,11 @@ export class NotebookRendererScript {
}
}

export enum NotebookControllerState {
Idle = 1,
Connecting = 2
}

//#endregion

//#region Timeline
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/note
import { configureKernelIcon, selectKernelIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons';
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
import { NotebookCellsChangeType } from 'vs/workbench/contrib/notebook/common/notebookCommon';
import { INotebookKernel, INotebookKernelService, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { INotebookKernel, INotebookKernelService, NotebookControllerState } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle';
import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite';
Expand Down Expand Up @@ -205,8 +205,8 @@ registerAction2(class extends Action2 {
});
}

if (!all.find(item => item.type === NotebookKernelType.Resolved)) {
// there is no resolved kernel, show the install from marketplace
if (!all.length) {
// there is no kernel, show the install from marketplace
quickPickItems.push({
id: 'install',
label: nls.localize('installKernels', "Install kernels from the marketplace"),
Expand Down Expand Up @@ -379,7 +379,7 @@ export class KernelStatus extends Disposable implements IWorkbenchContribution {
this._kernelInfoElement.add(this._statusbarService.addEntry(
{
name: nls.localize('notebook.info', "Notebook Kernel Info"),
text: `$(notebook-kernel-select) ${kernel.label}`,
text: `$(notebook-kernel-select) ${kernel.label}` + (kernel.state === NotebookControllerState.Idle ? '' : ' Connecting...'),
ariaLabel: kernel.label,
tooltip: isSuggested ? nls.localize('tooltop', "{0} (suggestion)", tooltip) : tooltip,
command: SELECT_KERNEL_ID,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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, IResolvedNotebookKernel, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';

CommandsRegistry.registerCommand('_resolveNotebookContentProvider', (accessor): {
Expand Down Expand Up @@ -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.filter(kernel => kernel.type === NotebookKernelType.Resolved).map((provider) => ({
return kernels.all.map(provider => ({
id: provider.id,
label: provider.label,
kind: provider.kind,
description: provider.description,
detail: provider.detail,
isPreferred: false, // todo@jrieken,@rebornix
preloads: (provider as IResolvedNotebookKernel).preloadUris,
preloads: provider.preloadUris,
}));
});
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ 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());
Expand Down Expand Up @@ -42,7 +41,7 @@ export class CellExecutionPart extends CellPart {
}

private updateExecutionOrder(internalMetadata: NotebookCellInternalMetadata): void {
if (this._notebookEditor.activeKernel?.type === NotebookKernelType.Resolved && this._notebookEditor.activeKernel?.implementsExecutionOrder) {
if (this._notebookEditor.activeKernel?.implementsExecutionOrder) {
const executionOrderLabel = typeof internalMetadata.executionOrder === 'number' ?
`[${internalMetadata.executionOrder}]` :
'[ ]';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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, IResolvedNotebookKernel, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { INotebookKernel } 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';
Expand Down Expand Up @@ -907,7 +907,7 @@ var requirejs = (function() {
}

this._preloadsCache.clear();
if (this._currentKernel?.type === NotebookKernelType.Resolved) {
if (this._currentKernel) {
this._updatePreloadsFromKernel(this._currentKernel);
}

Expand Down Expand Up @@ -1407,14 +1407,14 @@ var requirejs = (function() {
const previousKernel = this._currentKernel;
this._currentKernel = kernel;

if (previousKernel?.type === NotebookKernelType.Resolved && previousKernel.preloadUris.length > 0) {
if (previousKernel && previousKernel.preloadUris.length > 0) {
this.webview?.reload(); // preloads will be restored after reload
} else if (kernel?.type === NotebookKernelType.Resolved) {
} else if (kernel) {
this._updatePreloadsFromKernel(kernel);
}
}

private _updatePreloadsFromKernel(kernel: IResolvedNotebookKernel) {
private _updatePreloadsFromKernel(kernel: INotebookKernel) {
const resources: IControllerPreload[] = [];
for (const preload of kernel.preloadUris) {
const uri = this.environmentService.isExtensionDevelopment && (preload.scheme === 'http' || preload.scheme === 'https')
Expand All @@ -1440,7 +1440,7 @@ var requirejs = (function() {

const mixedResourceRoots = [
...(this.localResourceRootsCache || []),
...(this._currentKernel?.type === NotebookKernelType.Resolved ? [this._currentKernel.localResourceRoot] : []),
...(this._currentKernel ? [this._currentKernel.localResourceRoot] : []),
];

this.webview.localResourcesRoot = mixedResourceRoots;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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, NotebookKernelType } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';

export class NotebookEditorContextKeys {
Expand Down Expand Up @@ -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?.type === NotebookKernelType.Resolved && selected.implementsInterrupt) ?? false);
this._interruptibleKernel.set(selected?.implementsInterrupt ?? false);
this._notebookKernelSelected.set(Boolean(selected));
this._notebookKernel.set(selected?.id ?? '');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ 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, NotebookKernelType, ProxyKernelState } from 'vs/workbench/contrib/notebook/common/notebookKernelService';
import { INotebookKernel, INotebookKernelMatchResult, INotebookKernelService, NotebookControllerState } 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';
Expand Down Expand Up @@ -68,39 +68,35 @@ export class NotebooKernelActionViewItem extends ActionViewItem {
private _updateActionFromKernelInfo(info: INotebookKernelMatchResult): void {
this._kernelDisposable.clear();
this._action.enabled = true;
const selectedOrSuggested = info.selected ?? ((info.suggestions.length === 1 && info.suggestions[0].type === NotebookKernelType.Resolved) ? info.suggestions[0] : undefined);
const selectedOrSuggested = info.selected ?? (info.suggestions.length === 1 ? info.suggestions[0] : undefined);
if (selectedOrSuggested) {
// selected or suggested kernel
this._action.label = selectedOrSuggested.label;
this._action.label = this._generateKenrelLabel(selectedOrSuggested);
this._action.tooltip = selectedOrSuggested.description ?? selectedOrSuggested.detail ?? '';
if (!info.selected) {
// 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.state) {
this._action.label = this._generateKenrelLabel(selectedOrSuggested);
}

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");
this._action.tooltip = '';
}
}

private _generateKenrelLabel(kernel: INotebookKernel) {
if (kernel.state === NotebookControllerState.Connecting) {
return localize('kernelconnecting', "Connecting...");
} else {
return kernel.label;
}
}

private _resetAction(): void {
this._action.enabled = false;
this._action.label = '';
Expand Down
13 changes: 13 additions & 0 deletions src/vs/workbench/contrib/notebook/common/notebookKernelService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export interface INotebookKernelChangeEvent {
description?: true;
detail?: true;
kind?: true;
state?: true;
supportedLanguages?: true;
hasExecutionOrder?: true;
}
Expand All @@ -36,6 +37,11 @@ export const enum NotebookKernelType {
Proxy = 1
}

export enum NotebookControllerState {
Idle = 1,
Connecting = 2
}

export interface IResolvedNotebookKernel {
readonly type: NotebookKernelType.Resolved;
readonly id: string;
Expand All @@ -51,6 +57,7 @@ export interface IResolvedNotebookKernel {
description?: string;
detail?: string;
kind?: string;
state?: NotebookControllerState;
supportedLanguages: string[];
implementsInterrupt?: boolean;
implementsExecutionOrder?: boolean;
Expand All @@ -74,13 +81,19 @@ export interface INotebookProxyKernel {
readonly id: string;
readonly viewType: string;
readonly extension: ExtensionIdentifier;
readonly localResourceRoot: URI;
readonly preloadUris: URI[];
readonly preloadProvides: string[];

readonly onDidChange: Event<Readonly<INotebookProxyKernelChangeEvent>>;
label: string;
description?: string;
detail?: string;
kind?: string;
state?: NotebookControllerState;
supportedLanguages: string[];
implementsInterrupt?: boolean;
implementsExecutionOrder?: boolean;
connectionState: ProxyKernelState;
resolveKernel(uri: URI): Promise<string | null>;
}
Expand Down
8 changes: 8 additions & 0 deletions src/vscode-dts/vscode.proposed.notebookProxyController.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@

declare module 'vscode' {

export enum NotebookControllerState {
Idle = 1,
Connecting = 2
}

export interface NotebookController {
state?: NotebookControllerState;
}

export interface NotebookProxyController {
/**
Expand Down