CmdPal: Refactor TopLevelCommandManager to use IExtensionService implementations#48417
CmdPal: Refactor TopLevelCommandManager to use IExtensionService implementations#48417michaeljolley wants to merge 9 commits into
Conversation
Extract extension loading from TopLevelCommandManager into separate IExtensionService implementations: - BuiltInExtensionService: wraps in-proc ICommandProvider instances from DI - WinRTExtensionService: manages out-of-process WinRT AppExtension providers TLCM now receives IEnumerable<IExtensionService> and orchestrates them uniformly. This reduces TLCM from ~900 to ~700 lines and separates provider-specific concerns (timeout, retry, catalog events) from command orchestration. Additional fixes: - Break circular DI dependency: BuiltInsCommandProvider no longer needs IRootPageService. Uses GoHomeDockCommand (returns CommandResult.GoHome()) with onBeforeShowConfirmation callback to show palette at dock position. - Restore two-phase loading: PreLoadAsync loads only built-ins (instant), PostLoadRootPageAsync loads WinRT extensions on background thread. - Add try/finally around IsLoading to prevent stuck loading indicator. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…lass - Use IExtensionWrapper directly (with existing using) in ExtensionGalleryViewModel instead of fully-qualified name - Replace ct.ThrowIfCancellationRequested() with graceful early return in BuiltInExtensionService.LoadProvidersAsync - Extract ExtensionStartResult into its own file - Restore 'Go back to the main page, but keep it open' comment Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
Pull request was converted to draft
@check-spelling-bot Report🔴 Please reviewSee the 📂 files view, the 📜action log, 👼 SARIF report, or 📝 job summary for details.
See ❌ Event descriptions for more information. These words are not needed and should be removednullabilitySome files were automatically ignored 🙈These sample patterns would exclude them: You should consider adding them to: File matching is via Perl regular expressions. To check these files, more of their words need to be in the dictionary than not. You can use To update file exclusions and remove the previously acknowledged and now absent words, you could run the following commands... in a clone of the git@github.com:microsoft/PowerToys.git repository curl -s -S -L 'https://raw.githubusercontent.com/check-spelling/check-spelling/cfb6f7e75bbfc89c71eaa30366d0c166f1bd9c8c/apply.pl' |
perl - 'https://github.com/microsoft/PowerToys/actions/runs/27454773407/attempts/1' &&
git commit -m 'Update check-spelling metadata'OR To have the bot accept them for you, comment in the PR quoting the following line: Forbidden patterns 🙅 (1)In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves. These forbidden patterns matched content: Should be
|
Summary
The
TopLevelCommandManagerhandles alot. And by "alot" I mean too much. In preparation for future types of extensions, this PR attempts to pull out the methods for loading/managing extensions to individualIExtensionServices.These
ExtensionServices will be injected theTopLevelCommandManagervia dependency injection. It will iterate through them asking them to load their extensions. During that process, they will surfaceICommandProviders back to theTopLevelCommandManagerfor display in Command Palette.Currently, there are two types of
IExtensionServices:BuiltInExtensionServiceandWinRTExtensionService.BuiltInExtensionServicereceives allICommandProviders registered with DI.WinRTExtensionServicemanages out-of-process WinRT AppExtension providers.Additional Changes
BuiltInsCommandProviderno longer depends onIRootPageService.Previously, it required the
IRootPageServicesolely for the dock command to open Command Palette (using the RootPage as its command.) Now, it uses a newGoHomeDockCommandwhich returnsCommandResult.GoHome()with the existingonBeforeShowConfirmationcallback to show the palette at the dock button position.