Change:
Steps to Reproduce: remote explorer and view help links ( etc) under the viewlet for existing remote extensions. additional remote extensions and view the help link options again. Expected: links for the newer extensions show up in the lists. Actual: does not change. and reopening updates the list.

Discussion:
import { ITreeRenderer, ITreeNode, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree'; import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; <del> import { Event } from 'vs/base/common/event'; </del> <ins> import { Event, Emitter } from 'vs/base/common/event'; </ins> import { ExtensionsRegistry, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import * as icons from 'vs/workbench/contrib/remote/browser/remoteIcons';

}); interface IViewModel { <ins> onDidChangeHelpInformation: Event<void>; </ins> helpInformation: HelpInformation[]; }

icon: ThemeIcon; iconClasses: string[]; label: string; <ins> values: HelpItemValue[]; </ins> handleClick(): Promise<void>; }

items: IHelpItem[] | undefined; constructor( <del> viewModel: IViewModel, openerService: IOpenerService, quickInputService: IQuickInputService, commandService: ICommandService, remoteExplorerService: IRemoteExplorerService, environmentService: IWorkbenchEnvironmentService, workspaceContextService: IWorkspaceContextService, walkthroughsService: IWalkthroughsService </del> <ins> private viewModel: IViewModel, private openerService: IOpenerService, private quickInputService: IQuickInputService, private commandService: ICommandService, private remoteExplorerService: IRemoteExplorerService, private environmentService: IWorkbenchEnvironmentService, private workspaceContextService: IWorkspaceContextService, private walkthroughsService: IWalkthroughsService </ins> ) { <ins> this.updateItems(); viewModel.onDidChangeHelpInformation(() => this.updateItems()); } private createHelpItemValue(info: HelpInformation, infoKey: Exclude<keyof HelpInformation, 'extensionDescription' | 'remoteName' | 'virtualWorkspace'>) { return new HelpItemValue(this.commandService, this.walkthroughsService, info.extensionDescription, (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName, info.virtualWorkspace, info[infoKey]); } private updateItems() { </ins> const helpItems: IHelpItem[] = []; <del> const getStarted = viewModel.helpInformation.filter(info => info.getStarted); </del> <ins> const getStarted = this.viewModel.helpInformation.filter(info => info.getStarted); </ins> if (getStarted.length) { <del> helpItems.push(new GetStartedHelpItem( </del> <ins> const helpItemValues = getStarted.map((info: HelpInformation) => this.createHelpItemValue(info, 'getStarted')); const getStartedHelpItem = this.items?.find(item => item.icon === icons.getStartedIcon) ?? new GetStartedHelpItem( </ins> icons.getStartedIcon, nls.localize('remote.help.getStarted', "Get Started"), <del> getStarted.map((info: HelpInformation) => (new HelpItemValue(commandService, walkthroughsService, info.extensionDescription, (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName, info.virtualWorkspace, info.getStarted) )), quickInputService, environmentService, openerService, remoteExplorerService, workspaceContextService, commandService )); </del> <ins> helpItemValues, this.quickInputService, this.environmentService, this.openerService, this.remoteExplorerService, this.workspaceContextService, this.commandService ); getStartedHelpItem.values = helpItemValues; helpItems.push(getStartedHelpItem); </ins> } <del> const documentation = viewModel.helpInformation.filter(info => info.documentation); </del> <ins> const documentation = this.viewModel.helpInformation.filter(info => info.documentation); </ins> if (documentation.length) { <del> helpItems.push(new HelpItem( </del> <ins> const helpItemValues = documentation.map((info: HelpInformation) => this.createHelpItemValue(info, 'documentation')); const documentationHelpItem = this.items?.find(item => item.icon === icons.documentationIcon) ?? new HelpItem( </ins> icons.documentationIcon, nls.localize('remote.help.documentation', "Read Documentation"), <del> documentation.map((info: HelpInformation) => (new HelpItemValue(commandService, walkthroughsService, info.extensionDescription, (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName, info.virtualWorkspace, info.documentation!) )), quickInputService, environmentService, openerService, remoteExplorerService, workspaceContextService )); </del> <ins> helpItemValues, this.quickInputService, this.environmentService, this.openerService, this.remoteExplorerService, this.workspaceContextService ); documentationHelpItem.values = helpItemValues; helpItems.push(documentationHelpItem); </ins> } <del> const issues = viewModel.helpInformation.filter(info => info.issues); </del> <ins> const issues = this.viewModel.helpInformation.filter(info => info.issues); </ins> if (issues.length) { <del> helpItems.push(new HelpItem( </del> <ins> const helpItemValues = issues.map((info: HelpInformation) => this.createHelpItemValue(info, 'issues')); const reviewIssuesHelpItem = this.items?.find(item => item.icon === icons.reviewIssuesIcon) ?? new HelpItem( </ins> icons.reviewIssuesIcon, nls.localize('remote.help.issues', "Review Issues"), <del> issues.map((info: HelpInformation) => (new HelpItemValue(commandService, walkthroughsService, info.extensionDescription, (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName, info.virtualWorkspace, info.issues!) )), quickInputService, environmentService, openerService, remoteExplorerService, workspaceContextService )); </del> <ins> helpItemValues, this.quickInputService, this.environmentService, this.openerService, this.remoteExplorerService, this.workspaceContextService ); reviewIssuesHelpItem.values = helpItemValues; helpItems.push(reviewIssuesHelpItem); </ins> } if (helpItems.length) { <del> helpItems.push(new IssueReporterItem( </del> <ins> const helpItemValues = this.viewModel.helpInformation.map(info => this.createHelpItemValue(info, 'reportIssue')); const issueReporterItem = this.items?.find(item => item.icon === icons.reportIssuesIcon) ?? new IssueReporterItem( </ins> icons.reportIssuesIcon, nls.localize('remote.help.report', "Report Issue"), <del> viewModel.helpInformation.map(info => (new HelpItemValue(commandService, walkthroughsService, info.extensionDescription, (typeof info.remoteName === 'string') ? [info.remoteName] : info.remoteName, info.virtualWorkspace, info.reportIssue ))), quickInputService, environmentService, commandService, openerService, remoteExplorerService, workspaceContextService )); </del> <ins> helpItemValues, this.quickInputService, this.environmentService, this.commandService, this.openerService, this.remoteExplorerService, this.workspaceContextService ); issueReporterItem.values = helpItemValues; helpItems.push(issueReporterItem); </ins> } if (helpItems.length) {

class RemoteViewPaneContainer extends FilterViewPaneContainer implements IViewModel { private helpPanelDescriptor = new HelpPanelDescriptor(this); helpInformation: HelpInformation[] = []; <ins> private _onDidChangeHelpInformation = new Emitter<void>(); public onDidChangeHelpInformation: Event<void> = this._onDidChangeHelpInformation.event; </ins> private hasSetSwitchForConnection: boolean = false; constructor(

} this.helpInformation = helpInformation; <ins> this._onDidChangeHelpInformation.fire(); </ins> const viewsRegistry = Registry.as<IViewsRegistry>(Extensions.ViewsRegistry); if (this.helpInformation.length) {