src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelQuickPickStrategy.ts/KernelPickerMRUStrategy/_calculdateKernelSources
class KernelPickerMRUStrategy:	private async _calculdateKernelSources(editor: IActiveNotebookEditor) {
		const notebook: NotebookTextModel = editor.textModel;

		const actions = await this._notebookKernelService.getKernelSourceActions2(notebook);
		const quickPickItems: QuickPickInput<KernelQuickPickItem>[] = [];
		const matchResult = this._getMatchingResult(notebook);
		const others = matchResult.all.filter(item => item.extension.value !== JUPYTER_EXTENSION_ID);

		// group controllers by extension
		for (const group of groupBy(others, (a, b) => a.extension.value === b.extension.value ? 0 : 1)) {
			const extension = this._extensionService.extensions.find(extension => extension.identifier.value === group[0].extension.value);
			const source = extension?.description ?? group[0].extension.value;
			if (group.length > 1) {
				quickPickItems.push({
					label: source,
					detail: localize('selectKernelFromExtensionDetail', "Kernels: {0}", group.map(kernel => kernel.label).join(', ')),
					kernels: group
				});
			} else {
				quickPickItems.push({
					label: group[0].label,
					detail: source,
					kernel: group[0]
				});
			}
		}

		const validActions = actions.filter(action => action.command);

		quickPickItems.push(...validActions.map(action => {
			return {
				id: typeof action.command! === 'string' ? action.command! : action.command!.id,
				label: action.label,
				detail: action.detail,
				description: action.description,
				command: action.command
			};
		}));

		const sourceActionCommands = this._notebookKernelService.getSourceActions(notebook, editor.scopedContextKeyService);
		for (const sourceAction of sourceActionCommands) {
			const res: SourcePick = {
				action: sourceAction,
				picked: false,
				label: sourceAction.action.label,
				detail: (sourceAction.action as MenuItemAction)?.item?.source
			};

			quickPickItems.push(res);
		}

		return quickPickItems;
	}