Change:
From ! It took me a while to be able to use Copilot again. Here are the steps I took (also captured in the attached video): Reloaded VS Code Clicked "Show Extension" from the toast above, I'm brought to Copilot Chat extension in Extensions view Clicked "Uninstall" for Chat extension, nothing would happen Decided to instead search Copilot in Extensions view (thought maybe I was having issues by trying to uninstall Chat without touching Completions, though I would've expected a toast telling me that) After searching, the Copilot extensions automatically start to update Need to restart just Copilot (not chat), so I click to restart I try to uninstall Copilot Chat again, but nothing happens again Reload VS Code again Search for Copilot again in the Extensions view I can now uninstall Copilot (though I initiated the uninstall from the Copilot extension rather than Chat)
Verification steps are in

Discussion:
} const extensionsToUninstall: UninstallExtensionInfo[] = [{ extension: extension.local }]; <del> const dependents: IExtension[] = []; for (const local of this.local) { if (local === extension) { continue; </del> <ins> for (const packExtension of this.getAllPackExtensionsToUninstall(extension.local, this.local)) { if (!extensionsToUninstall.some(e => areSameExtensions(e.extension.identifier, packExtension.identifier))) { extensionsToUninstall.push({ extension: packExtension }); </ins> } <del> if (!local.local) { continue; } if (local.dependencies.length === 0) { continue; } if (extension.extensionPack.some(id => areSameExtensions({ id }, local.identifier))) { continue; } if (dependents.some(d => d.extensionPack.some(id => areSameExtensions({ id }, local.identifier)))) { continue; } if (local.dependencies.some(dep => areSameExtensions(extension.identifier, { id: dep }))) { dependents.push(local); extensionsToUninstall.push({ extension: local.local }); </del> <ins> } const dependents: IExtension[] = []; for (const { extension } of extensionsToUninstall) { for (const local of this.local) { if (!local.local) { continue; } if (areSameExtensions(local.identifier, extension.identifier)) { continue; } if (local.dependencies.length === 0) { continue; } if (extension.manifest.extensionPack?.some(id => areSameExtensions({ id }, local.identifier))) { continue; } if (dependents.some(d => d.extensionPack.some(id => areSameExtensions({ id }, local.identifier)))) { continue; } if (local.dependencies.some(dep => areSameExtensions(extension.identifier, { id: dep }))) { dependents.push(local); extensionsToUninstall.push({ extension: local.local }); } </ins> } }

}, () => this.extensionManagementService.uninstallExtensions(extensionsToUninstall).then(() => undefined)); } <ins> private getAllPackExtensionsToUninstall(extension: ILocalExtension, installed: IExtension[], checked: ILocalExtension[] = []): ILocalExtension[] { if (checked.some(e => areSameExtensions(e.identifier, extension.identifier))) { return []; } checked.push(extension); const extensionsPack = extension.manifest.extensionPack ?? []; if (extensionsPack.length) { const packedExtensions: ILocalExtension[] = []; for (const i of installed) { if (i.local && !i.isBuiltin && extensionsPack.some(id => areSameExtensions({ id }, i.identifier))) { packedExtensions.push(i.local); } } const packOfPackedExtensions: ILocalExtension[] = []; for (const packedExtension of packedExtensions) { packOfPackedExtensions.push(...this.getAllPackExtensionsToUninstall(packedExtension, installed, checked)); } return [...packedExtensions, ...packOfPackedExtensions]; } return []; } </ins> private getErrorMessageForUninstallingAnExtensionWithDependents(extension: IExtension, dependents: IExtension[]): string { if (dependents.length === 1) { return nls.localize('singleDependentUninstallError', "Cannot uninstall '{0}' extension alone. '{1}' extension depends on this. Do you want to uninstall all these extensions?", extension.displayName, dependents[0].displayName);

promises.push(this.uninstallInServer(server, extensions)); } <del> await Promise.allSettled(promises); </del> <ins> const result = await Promise.allSettled(promises); const errors = result.filter(r => r.status === 'rejected').map(r => r.reason); if (errors.length) { throw new Error(errors.map(e => e.message).join('n')); } </ins> } private async uninstallInServer(server: IExtensionManagementServer, extensions: UninstallExtensionInfo[]): Promise<void> {