diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 5eda9075136..6816c1730b0 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1747,14 +1747,26 @@ declare module 'vscode' { executeCell(document: NotebookDocument, cell: NotebookCell | undefined, token: CancellationToken): Promise; } + export interface NotebookKernel { + preloads?: Uri[]; + executeCell(document: NotebookDocument, cell: NotebookCell, token: CancellationToken): Promise; + executeAllCells(document: NotebookDocument, token: CancellationToken): Promise; + } + export namespace notebook { export function registerNotebookContentProvider( notebookType: string, provider: NotebookContentProvider ): Disposable; + export function registerNotebookKernel( + id: string, + selectors: GlobPattern[], + kernel: NotebookKernel + ): Disposable; + export function registerNotebookOutputRenderer( - type: string, + id: string, outputSelector: NotebookOutputSelector, renderer: NotebookOutputRenderer ): Disposable; diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index 4a922ceb819..d4bdc4310f0 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -8,13 +8,15 @@ import { MainContext, MainThreadNotebookShape, NotebookExtensionDescription, IEx import { Disposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { INotebookService, IMainNotebookController } from 'vs/workbench/contrib/notebook/common/notebookService'; -import { INotebookTextModel, INotebookMimeTypeSelector, NOTEBOOK_DISPLAY_ORDER, NotebookCellOutputsSplice, NotebookDocumentMetadata, NotebookCellMetadata, ICellEditOperation, ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, CellEditType, CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookTextModel, INotebookMimeTypeSelector, NOTEBOOK_DISPLAY_ORDER, NotebookCellOutputsSplice, NotebookDocumentMetadata, NotebookCellMetadata, ICellEditOperation, ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, CellEditType, CellKind, INotebookKernelInfo } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; +import { IRelativePattern } from 'vs/base/common/glob'; +import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; export class MainThreadNotebookDocument extends Disposable { private _textModel: NotebookTextModel; @@ -57,6 +59,7 @@ export class MainThreadNotebookDocument extends Disposable { @extHostNamedCustomer(MainContext.MainThreadNotebook) export class MainThreadNotebooks extends Disposable implements MainThreadNotebookShape { private readonly _notebookProviders = new Map(); + private readonly _notebookKernels = new Map(); private readonly _proxy: ExtHostNotebookShape; constructor( @@ -131,6 +134,19 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo return; } + async $registerNotebookKernel(extension: NotebookExtensionDescription, id: string, selectors: (string | IRelativePattern)[], preloads: UriComponents[]): Promise { + const kernel = new MainThreadNotebookKernel(this._proxy, id, selectors, extension.id, URI.revive(extension.location), preloads.map(preload => URI.revive(preload))); + this._notebookKernels.set(id, kernel); + this._notebookService.registerNotebookKernel(kernel); + return; + } + + async $unregisterNotebookKernel(id: string): Promise { + this._notebookKernels.delete(id); + this._notebookService.unregisterNotebookKernel(id); + return; + } + async $updateNotebookLanguages(viewType: string, resource: UriComponents, languages: string[]): Promise { let controller = this._notebookProviders.get(viewType); @@ -321,3 +337,19 @@ export class MainThreadNotebookController implements IMainNotebookController { } } + +export class MainThreadNotebookKernel implements INotebookKernelInfo { + constructor( + private readonly _proxy: ExtHostNotebookShape, + readonly id: string, + readonly selectors: (string | IRelativePattern)[], + readonly extension: ExtensionIdentifier, + readonly extensionLocation: URI, + readonly preloads: URI[] + ) { + } + + async executeNotebook(viewType: string, uri: URI, handle: number | undefined, token: CancellationToken): Promise { + return this._proxy.$executeNotebook2(this.id, viewType, uri, handle, token); + } +} diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 1f0e0c5bc3b..d7acec22c23 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -920,6 +920,10 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I checkProposedApiEnabled(extension); return extHostNotebook.registerNotebookContentProvider(extension, viewType, provider); }, + registerNotebookKernel: (id: string, selector: vscode.GlobPattern[], kernel: vscode.NotebookKernel) => { + checkProposedApiEnabled(extension); + return extHostNotebook.registerNotebookKernel(extension, id, selector, kernel); + }, registerNotebookOutputRenderer: (type: string, outputFilter: vscode.NotebookOutputSelector, renderer: vscode.NotebookOutputRenderer) => { checkProposedApiEnabled(extension); return extHostNotebook.registerNotebookOutputRenderer(type, extension, outputFilter, renderer); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 0ccb615eb42..066b3cb24e5 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -693,6 +693,8 @@ export interface MainThreadNotebookShape extends IDisposable { $unregisterNotebookProvider(viewType: string): Promise; $registerNotebookRenderer(extension: NotebookExtensionDescription, type: string, selectors: INotebookMimeTypeSelector, handle: number, preloads: UriComponents[]): Promise; $unregisterNotebookRenderer(handle: number): Promise; + $registerNotebookKernel(extension: NotebookExtensionDescription, id: string, selectors: (string | IRelativePattern)[], preloads: UriComponents[]): Promise; + $unregisterNotebookKernel(id: string): Promise; $tryApplyEdits(viewType: string, resource: UriComponents, modelVersionId: number, edits: ICellEditOperation[], renderers: number[]): Promise; $updateNotebookLanguages(viewType: string, resource: UriComponents, languages: string[]): Promise; $updateNotebookMetadata(viewType: string, resource: UriComponents, metadata: NotebookDocumentMetadata): Promise; @@ -1557,6 +1559,7 @@ export interface INotebookDocumentsAndEditorsDelta { export interface ExtHostNotebookShape { $resolveNotebookData(viewType: string, uri: UriComponents): Promise; $executeNotebook(viewType: string, uri: UriComponents, cellHandle: number | undefined, token: CancellationToken): Promise; + $executeNotebook2(kernelId: string, viewType: string, uri: UriComponents, cellHandle: number | undefined, token: CancellationToken): Promise; $saveNotebook(viewType: string, uri: UriComponents, token: CancellationToken): Promise; $saveNotebookAs(viewType: string, uri: UriComponents, target: UriComponents, token: CancellationToken): Promise; $acceptDisplayOrder(displayOrder: INotebookDisplayOrder): void; diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 66dba087614..f8b29fd0fa7 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -18,6 +18,7 @@ import { Disposable as VSCodeDisposable } from './extHostTypes'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtHostDocumentData } from 'vs/workbench/api/common/extHostDocumentData'; import { NotImplementedProxy } from 'vs/base/common/types'; +import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; interface IObservable { proxy: T; @@ -624,6 +625,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN private readonly _proxy: MainThreadNotebookShape; private readonly _notebookContentProviders = new Map(); + private readonly _notebookKernels = new Map(); private readonly _documents = new Map(); private readonly _editors = new Map; }>(); private readonly _notebookOutputRenderers = new Map(); @@ -721,6 +723,21 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN }); } + registerNotebookKernel(extension: IExtensionDescription, id: string, selectors: vscode.GlobPattern[], kernel: vscode.NotebookKernel): vscode.Disposable { + if (this._notebookKernels.has(id)) { + throw new Error(`Notebook kernel for '${id}' already registered`); + } + + this._notebookKernels.set(id, { kernel, extension }); + const transformedSelectors = selectors.map(selector => typeConverters.GlobPattern.from(selector)); + + this._proxy.$registerNotebookKernel({ id: extension.identifier, location: extension.extensionLocation }, id, transformedSelectors, kernel.preloads || []); + return new VSCodeDisposable(() => { + this._notebookKernels.delete(id); + this._proxy.$unregisterNotebookKernel(id); + }); + } + async $resolveNotebookData(viewType: string, uri: UriComponents): Promise { let provider = this._notebookContentProviders.get(viewType); let document = this._documents.get(URI.revive(uri).toString()); @@ -830,6 +847,28 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } } + async $executeNotebook2(kernelId: string, viewType: string, uri: UriComponents, cellHandle: number | undefined, token: CancellationToken): Promise { + let document = this._documents.get(URI.revive(uri).toString()); + + if (!document || document.viewType !== viewType) { + return; + } + + let kernelInfo = this._notebookKernels.get(kernelId); + + if (!kernelInfo) { + return; + } + + let cell = cellHandle !== undefined ? document.getCell(cellHandle) : undefined; + + if (cell) { + return kernelInfo.kernel.executeCell(document, cell, token); + } else { + return kernelInfo.kernel.executeAllCells(document, token); + } + } + async $saveNotebook(viewType: string, uri: UriComponents, token: CancellationToken): Promise { let document = this._documents.get(URI.revive(uri).toString()); if (!document) { diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts index 815c2e919fc..93173d625e2 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts @@ -120,7 +120,7 @@ export class NotebookEditor extends BaseEditor { const model = await input.resolve(); const viewState = this.loadTextEditorViewState(input); - this._widget.setModel(model, viewState, options); + this._widget.setModel(model.notebook, viewState, options); } clearInput(): void { diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index 544eb1be04d..b4cc5e0527a 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -39,8 +39,7 @@ import { CellDragAndDropController, CodeCellRenderer, MarkdownCellRenderer, Note import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { NotebookEventDispatcher, NotebookLayoutChangedEvent } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher'; import { CellViewModel, IModelDecorationsChangeAccessor, INotebookEditorViewState, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; -import { CellKind, IOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { NotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; +import { CellKind, IOutput, INotebookKernelInfo } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { Webview } from 'vs/workbench/contrib/webview/browser/webview'; import { getExtraColor } from 'vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils'; @@ -48,6 +47,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { generateUuid } from 'vs/base/common/uuid'; import { Memento, MementoObject } from 'vs/workbench/common/memento'; +import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; const $ = DOM.$; @@ -131,6 +131,19 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor return this.notebookViewModel; } + private _activeKernel: INotebookKernelInfo | undefined = undefined; + private readonly _onDidChangeKernel = new Emitter(); + readonly onDidChangeKernel: Event = this._onDidChangeKernel.event; + + get activeKernel() { + return this._activeKernel; + } + + set activeKernel(kernel: INotebookKernelInfo | undefined) { + this._activeKernel = kernel; + this._onDidChangeKernel.fire(); + } + private readonly _onDidChangeActiveEditor = this._register(new Emitter()); readonly onDidChangeActiveEditor: Event = this._onDidChangeActiveEditor.event; @@ -342,12 +355,22 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor this.list?.domFocus(); } - async setModel(model: NotebookEditorModel, viewState: INotebookEditorViewState | undefined, options: EditorOptions | undefined): Promise { - if (this.notebookViewModel === undefined || !this.notebookViewModel.equal(model.notebook) || this.webview === null) { + async setModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined, options: EditorOptions | undefined): Promise { + if (this.notebookViewModel === undefined || !this.notebookViewModel.equal(textModel) || this.webview === null) { this.detachModel(); - await this.attachModel(model, viewState); + await this.attachModel(textModel, viewState); } + const availableKernels = this.notebookService.getContributedNotebookKernels(textModel.viewType, textModel.uri); + this.activeKernel = availableKernels[0]; + + this.localStore.add(this.notebookService.onDidChangeKernels(() => { + if (this.activeKernel === undefined) { + const availableKernels = this.notebookService.getContributedNotebookKernels(textModel.viewType, textModel.uri); + this.activeKernel = availableKernels[0]; + } + })); + // reveal cell if editor options tell to do so if (options instanceof NotebookEditorOptions && options.cellOptions) { const cellOptions = options.cellOptions; @@ -391,7 +414,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor DOM.toggleClass(this.getDomNode(), 'notebook-editor-editable', !!this.viewModel!.metadata?.editable); } - private async attachModel(model: NotebookEditorModel, viewState: INotebookEditorViewState | undefined) { + private async attachModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined) { if (!this.webview) { this.webview = this.instantiationService.createInstance(BackLayerWebView, this); this.list?.rowsContainer.insertAdjacentElement('afterbegin', this.webview!.element); @@ -400,7 +423,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor await this.webview.waitForInitialization(); this.eventDispatcher = new NotebookEventDispatcher(); - this.viewModel = this.instantiationService.createInstance(NotebookViewModel, model.viewType, model.notebook, this.eventDispatcher, this.getLayoutInfo()); + this.viewModel = this.instantiationService.createInstance(NotebookViewModel, textModel.viewType, textModel, this.eventDispatcher, this.getLayoutInfo()); this.eventDispatcher.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); this.updateForMetadata(); @@ -992,12 +1015,17 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor this.editorExecutingNotebook!.set(true); this.notebookViewModel!.currentTokenSource = tokenSource; - const provider = this.notebookService.getContributedNotebookProviders(this.viewModel!.uri)[0]; - if (provider) { - const viewType = provider.id; - const notebookUri = this.notebookViewModel!.uri; - return await this.notebookService.executeNotebook(viewType, notebookUri, tokenSource.token); + if (this._activeKernel) { + await this.notebookService.executeNotebook2(this.notebookViewModel!.viewType, this.notebookViewModel!.uri, this._activeKernel.id, tokenSource.token); + } else { + const provider = this.notebookService.getContributedNotebookProviders(this.viewModel!.uri)[0]; + if (provider) { + const viewType = provider.id; + const notebookUri = this.notebookViewModel!.uri; + return await this.notebookService.executeNotebook(viewType, notebookUri, tokenSource.token); + } } + } finally { this.editorExecutingNotebook!.set(false); this.notebookViewModel!.currentTokenSource = undefined; @@ -1035,7 +1063,11 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor if (provider) { const viewType = provider.id; const notebookUri = this.notebookViewModel!.uri; - return await this.notebookService.executeNotebookCell(viewType, notebookUri, cell.handle, tokenSource.token); + if (this._activeKernel) { + return await this.notebookService.executeNotebookCell2(viewType, notebookUri, cell.handle, this._activeKernel.id, tokenSource.token); + } else { + return await this.notebookService.executeNotebookCell(viewType, notebookUri, cell.handle, tokenSource.token); + } } } finally { cell.currentTokenSource = undefined; diff --git a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts index 5b6e38f822c..f8bc6c5e8e6 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts @@ -11,7 +11,7 @@ import { notebookProviderExtensionPoint, notebookRendererExtensionPoint } from ' import { NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider'; import { NotebookExtensionDescription } from 'vs/workbench/api/common/extHost.protocol'; import { Emitter, Event } from 'vs/base/common/event'; -import { INotebookTextModel, INotebookMimeTypeSelector, INotebookRendererInfo, NotebookDocumentMetadata, CellEditType, ICellDto2 } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookTextModel, INotebookMimeTypeSelector, INotebookRendererInfo, NotebookDocumentMetadata, CellEditType, ICellDto2, INotebookKernelInfo } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { NotebookOutputRendererInfo } from 'vs/workbench/contrib/notebook/common/notebookOutputRenderer'; import { Iterable } from 'vs/base/common/iterator'; @@ -21,6 +21,8 @@ import { IEditorService, ICustomEditorViewTypesHandler, ICustomEditorInfo } from import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookEditorModelManager } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; import { INotebookService, IMainNotebookController } from 'vs/workbench/contrib/notebook/common/notebookService'; +import * as glob from 'vs/base/common/glob'; +import { basename } from 'vs/base/common/resources'; function MODEL_ID(resource: URI): string { return resource.toString(); @@ -97,6 +99,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu _serviceBrand: undefined; private readonly _notebookProviders = new Map(); private readonly _notebookRenderers = new Map(); + private readonly _notebookKernels = new Map(); notebookProviderInfoStore: NotebookProviderInfoStore = new NotebookProviderInfoStore(); notebookRenderersInfoStore: NotebookOutputRendererInfoStore = new NotebookOutputRendererInfoStore(); private readonly _models: { [modelId: string]: ModelData; }; @@ -105,6 +108,9 @@ export class NotebookService extends Disposable implements INotebookService, ICu private readonly _onDidChangeViewTypes = new Emitter(); onDidChangeViewTypes: Event = this._onDidChangeViewTypes.event; + + private readonly _onDidChangeKernels = new Emitter(); + onDidChangeKernels: Event = this._onDidChangeKernels.event; private cutItems: NotebookCellTextModel[] | undefined; modelManager: NotebookEditorModelManager; @@ -188,6 +194,56 @@ export class NotebookService extends Disposable implements INotebookService, ICu this._notebookRenderers.delete(handle); } + registerNotebookKernel(notebook: INotebookKernelInfo): void { + this._notebookKernels.set(notebook.id, notebook); + this._onDidChangeKernels.fire(); + } + + unregisterNotebookKernel(id: string): void { + this._notebookKernels.delete(id); + this._onDidChangeKernels.fire(); + } + + getContributedNotebookKernels(viewType: string, resource: URI): INotebookKernelInfo[] { + let kernelInfos: INotebookKernelInfo[] = []; + this._notebookKernels.forEach(kernel => { + if (this._notebookKernelMatch(resource, kernel!.selectors)) { + kernelInfos.push(kernel!); + } + }); + + // sort by extensions + + const notebookContentProvider = this._notebookProviders.get(viewType); + + if (!notebookContentProvider) { + return kernelInfos; + } + + kernelInfos = kernelInfos.sort((a, b) => { + if (a.extension.value === notebookContentProvider!.extensionData.id.value) { + return -1; + } else if (b.extension.value === notebookContentProvider!.extensionData.id.value) { + return 1; + } else { + return 0; + } + }); + + return kernelInfos; + } + + private _notebookKernelMatch(resource: URI, selectors: (string | glob.IRelativePattern)[]): boolean { + for (let i = 0; i < selectors.length; i++) { + const pattern = typeof selectors[i] !== 'string' ? selectors[i] : selectors[i].toString(); + if (glob.match(pattern, basename(resource).toLowerCase())) { + return true; + } + } + + return false; + } + getRendererInfo(handle: number): INotebookRendererInfo | undefined { const renderer = this._notebookRenderers.get(handle); @@ -273,6 +329,20 @@ export class NotebookService extends Disposable implements INotebookService, ICu } } + async executeNotebook2(viewType: string, uri: URI, kernelId: string, token: CancellationToken): Promise { + const kernel = this._notebookKernels.get(kernelId); + if (kernel) { + kernel.executeNotebook(viewType, uri, undefined, token); + } + } + + async executeNotebookCell2(viewType: string, uri: URI, handle: number, kernelId: string, token: CancellationToken): Promise { + const kernel = this._notebookKernels.get(kernelId); + if (kernel) { + kernel.executeNotebook(viewType, uri, handle, token); + } + } + getContributedNotebookProviders(resource: URI): readonly NotebookProviderInfo[] { return this.notebookProviderInfoStore.getContributedNotebook(resource); } diff --git a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts index 90006f52f2a..d26706c8f48 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts @@ -15,6 +15,7 @@ import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IEditorModel } from 'vs/platform/editor/common/editor'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { GlobPattern } from 'vs/workbench/api/common/extHost.protocol'; +import { CancellationToken } from 'vs/base/common/cancellation'; export enum CellKind { Markdown = 1, @@ -97,6 +98,15 @@ export interface INotebookRendererInfo { preloads: URI[] } +export interface INotebookKernelInfo { + id: string; + selectors: (string | glob.IRelativePattern)[], + extension: ExtensionIdentifier; + extensionLocation: URI, + preloads: URI[]; + executeNotebook(viewType: string, uri: URI, handle: number | undefined, token: CancellationToken): Promise; +} + export interface INotebookSelectors { readonly filenamePattern?: string; } diff --git a/src/vs/workbench/contrib/notebook/common/notebookService.ts b/src/vs/workbench/contrib/notebook/common/notebookService.ts index 6261eb78862..74a4bd3d1a9 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookService.ts @@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri'; import { NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider'; import { NotebookExtensionDescription } from 'vs/workbench/api/common/extHost.protocol'; import { Event } from 'vs/base/common/event'; -import { INotebookTextModel, INotebookMimeTypeSelector, INotebookRendererInfo, NotebookDocumentMetadata, ICellDto2 } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookTextModel, INotebookMimeTypeSelector, INotebookRendererInfo, NotebookDocumentMetadata, ICellDto2, INotebookKernelInfo } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CancellationToken } from 'vs/base/common/cancellation'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; @@ -31,16 +31,21 @@ export interface INotebookService { modelManager: INotebookEditorModelManager; canResolve(viewType: string): Promise; onDidChangeActiveEditor: Event<{ viewType: string, uri: URI }>; + onDidChangeKernels: Event; registerNotebookController(viewType: string, extensionData: NotebookExtensionDescription, controller: IMainNotebookController): void; unregisterNotebookProvider(viewType: string): void; registerNotebookRenderer(handle: number, extensionData: NotebookExtensionDescription, type: string, selectors: INotebookMimeTypeSelector, preloads: URI[]): void; unregisterNotebookRenderer(handle: number): void; + registerNotebookKernel(kernel: INotebookKernelInfo): void; + unregisterNotebookKernel(id: string): void; + getContributedNotebookKernels(viewType: string, resource: URI): readonly INotebookKernelInfo[]; getRendererInfo(handle: number): INotebookRendererInfo | undefined; resolveNotebook(viewType: string, uri: URI, forceReload: boolean): Promise; createNotebookFromBackup(viewType: string, uri: URI, metadata: NotebookDocumentMetadata, languages: string[], cells: ICellDto2[]): Promise; executeNotebook(viewType: string, uri: URI, token: CancellationToken): Promise; executeNotebookCell(viewType: string, uri: URI, handle: number, token: CancellationToken): Promise; - + executeNotebook2(viewType: string, uri: URI, kernelId: string, token: CancellationToken): Promise; + executeNotebookCell2(viewType: string, uri: URI, handle: number, kernelId: string, token: CancellationToken): Promise; getContributedNotebookProviders(resource: URI): readonly NotebookProviderInfo[]; getContributedNotebookProvider(viewType: string): NotebookProviderInfo | undefined; getNotebookProviderResourceRoots(): URI[];