diff --git a/PowerToys.sln b/PowerToys.sln
index 4e42cc9e30..4d1a39dc58 100644
--- a/PowerToys.sln
+++ b/PowerToys.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.0.32014.148
+# Visual Studio Version 18
+VisualStudioVersion = 18.0.11222.15 d18.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "runner", "src\runner\runner.vcxproj", "{9412D5C6-2CF2-4FC2-A601-B55508EA9B27}"
ProjectSection(ProjectDependencies) = postProject
@@ -838,6 +838,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.Remote
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.RemoteDesktop.UnitTests", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.RemoteDesktop.UnitTests\Microsoft.CmdPal.Ext.RemoteDesktop.UnitTests.csproj", "{DB34808A-FF91-D06E-A426-AFB5A8BD583B}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Deux", "Deux", "{023C058E-537A-4AB6-900A-36437EC17410}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{4F881A97-423A-4905-B219-677AD0184059}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CommandPalette.UI", "src\modules\Deux\UI\Microsoft.CommandPalette.UI\Microsoft.CommandPalette.UI.csproj", "{9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
@@ -3056,6 +3062,18 @@ Global
{DB34808A-FF91-D06E-A426-AFB5A8BD583B}.Release|ARM64.Build.0 = Release|ARM64
{DB34808A-FF91-D06E-A426-AFB5A8BD583B}.Release|x64.ActiveCfg = Release|x64
{DB34808A-FF91-D06E-A426-AFB5A8BD583B}.Release|x64.Build.0 = Release|x64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|ARM64.Build.0 = Debug|ARM64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|x64.ActiveCfg = Debug|x64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|x64.Build.0 = Debug|x64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|x64.Deploy.0 = Debug|x64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|ARM64.ActiveCfg = Release|ARM64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|ARM64.Build.0 = Release|ARM64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|ARM64.Deploy.0 = Release|ARM64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|x64.ActiveCfg = Release|x64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|x64.Build.0 = Release|x64
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|x64.Deploy.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -3389,6 +3407,9 @@ Global
{A66E9270-5D93-EC9C-F06E-CE7295BB9A6C} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{2B3FB837-23DE-629F-82C6-42304E7083C9} = {ECB8E0D1-7603-4E5C-AB10-D1E545E6F8E2}
{DB34808A-FF91-D06E-A426-AFB5A8BD583B} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
+ {023C058E-537A-4AB6-900A-36437EC17410} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
+ {4F881A97-423A-4905-B219-677AD0184059} = {023C058E-537A-4AB6-900A-36437EC17410}
+ {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB} = {4F881A97-423A-4905-B219-677AD0184059}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml
new file mode 100644
index 0000000000..61e73ce648
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml.cs
new file mode 100644
index 0000000000..e55f07cec2
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml.cs
@@ -0,0 +1,82 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.CommandPalette.UI.Helpers;
+using Microsoft.CommandPalette.UI.Services;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.UI.Xaml;
+
+namespace Microsoft.CommandPalette.UI;
+
+///
+/// Provides application-specific behavior to supplement the default Application class.
+///
+public partial class App : Application
+{
+ private readonly ILogger logger;
+ private readonly GlobalErrorHandler _globalErrorHandler;
+
+ ///
+ /// Gets the current instance in use.
+ ///
+ public static new App Current => (App)Application.Current;
+
+ public Window? AppWindow { get; private set; }
+
+ public ETWTrace EtwTrace { get; private set; } = new ETWTrace();
+
+ ///
+ /// Gets the instance to resolve application services.
+ ///
+ public IServiceProvider Services { get; }
+
+ public App(ILogger logger)
+ {
+ this.logger = logger;
+ _globalErrorHandler = new((CmdPalLogger)logger);
+
+#if !CMDPAL_DISABLE_GLOBAL_ERROR_HANDLER
+ _globalErrorHandler.Register(this);
+#endif
+
+ Services = ConfigureServices();
+
+ this.InitializeComponent();
+
+ // Ensure types used in XAML are preserved for AOT compilation
+ TypePreservation.PreserveTypes();
+
+ NativeEventWaiter.WaitForEventLoop(
+ "Local\\PowerToysCmdPal-ExitEvent-eb73f6be-3f22-4b36-aee3-62924ba40bfd", () =>
+ {
+ EtwTrace?.Dispose();
+ AppWindow?.Close();
+ Environment.Exit(0);
+ });
+ }
+
+ private IServiceProvider ConfigureServices()
+ {
+ var services = new ServiceCollection();
+
+ // Register root services
+ services.AddSingleton(logger);
+ services.AddSingleton(TaskScheduler.FromCurrentSynchronizationContext());
+
+ // Register services
+ return services.BuildServiceProvider();
+ }
+
+ ///
+ /// Invoked when the application is launched.
+ ///
+ /// Details about the launch request and process.
+ protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
+ {
+ AppWindow = new MainWindow(logger);
+ AppWindow.Activate();
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-100.png
new file mode 100644
index 0000000000..5213f95d42
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-125.png
new file mode 100644
index 0000000000..f1a45ae53f
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-150.png
new file mode 100644
index 0000000000..47d7209367
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-200.png
new file mode 100644
index 0000000000..dc6f4c5dab
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-400.png
new file mode 100644
index 0000000000..692c4fcf44
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-100.png
new file mode 100644
index 0000000000..e1f5d4159d
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-125.png
new file mode 100644
index 0000000000..a801edaf3d
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-150.png
new file mode 100644
index 0000000000..7a8f9c5c36
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-200.png
new file mode 100644
index 0000000000..ed75eb0af6
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-400.png
new file mode 100644
index 0000000000..d0cee0b395
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-100.png
new file mode 100644
index 0000000000..e006aa9874
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-125.png
new file mode 100644
index 0000000000..9ad48f0e3f
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-150.png
new file mode 100644
index 0000000000..d21c98d8c9
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-200.png
new file mode 100644
index 0000000000..ca49b8fef3
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-400.png
new file mode 100644
index 0000000000..f4ef1f3edb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-100.png
new file mode 100644
index 0000000000..acbcca99c3
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-125.png
new file mode 100644
index 0000000000..457d0cecbc
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-150.png
new file mode 100644
index 0000000000..5eff7ac7de
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-200.png
new file mode 100644
index 0000000000..c1ccbf1c54
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-400.png
new file mode 100644
index 0000000000..ea228bd41f
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-100.png
new file mode 100644
index 0000000000..a5e5760209
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-125.png
new file mode 100644
index 0000000000..2a233b3e47
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-150.png
new file mode 100644
index 0000000000..d8c8f75d79
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-200.png
new file mode 100644
index 0000000000..87517b0e1c
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-400.png
new file mode 100644
index 0000000000..957cc5fec3
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-16.png
new file mode 100644
index 0000000000..4c8effcb66
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-16.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-24.png
new file mode 100644
index 0000000000..5213f95d42
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-24.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-256.png
new file mode 100644
index 0000000000..d03f01b191
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-256.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-32.png
new file mode 100644
index 0000000000..75dc33385b
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-32.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-48.png
new file mode 100644
index 0000000000..f203724243
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-48.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-16.png
new file mode 100644
index 0000000000..4c8effcb66
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-16.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-24.png
new file mode 100644
index 0000000000..5213f95d42
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-24.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-256.png
new file mode 100644
index 0000000000..d03f01b191
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-256.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-32.png
new file mode 100644
index 0000000000..75dc33385b
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-32.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-48.png
new file mode 100644
index 0000000000..f203724243
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-48.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-100.png
new file mode 100644
index 0000000000..0a7be045ac
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-125.png
new file mode 100644
index 0000000000..8070174a5e
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-150.png
new file mode 100644
index 0000000000..6f1b9001a3
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-200.png
new file mode 100644
index 0000000000..d341612c39
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-400.png
new file mode 100644
index 0000000000..fcfc2ebded
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-16.png
new file mode 100644
index 0000000000..4c8effcb66
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-16.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-20.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-20.png
new file mode 100644
index 0000000000..cbb36d3be0
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-20.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-24.png
new file mode 100644
index 0000000000..5213f95d42
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-24.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-256.png
new file mode 100644
index 0000000000..d03f01b191
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-256.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-32.png
new file mode 100644
index 0000000000..75dc33385b
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-32.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-48.png
new file mode 100644
index 0000000000..f203724243
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-48.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.png
new file mode 100644
index 0000000000..bfec17df63
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-100.png
new file mode 100644
index 0000000000..bfec17df63
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-125.png
new file mode 100644
index 0000000000..a073540777
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-150.png
new file mode 100644
index 0000000000..4292fb4573
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-200.png
new file mode 100644
index 0000000000..84747da37d
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-400.png
new file mode 100644
index 0000000000..bda52f8d39
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-100.png
new file mode 100644
index 0000000000..cd469a3703
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-125.png
new file mode 100644
index 0000000000..3eb277505c
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-150.png
new file mode 100644
index 0000000000..0add12322b
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-200.png
new file mode 100644
index 0000000000..403f477ac3
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-400.png
new file mode 100644
index 0000000000..03f554d54f
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.ico b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.ico
new file mode 100644
index 0000000000..ed0eedb67e
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.ico differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.svg b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.svg
new file mode 100644
index 0000000000..4ed904b502
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.svg
@@ -0,0 +1,31 @@
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-100.png
new file mode 100644
index 0000000000..79c6a4c077
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-125.png
new file mode 100644
index 0000000000..cd5e093a6c
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-150.png
new file mode 100644
index 0000000000..88fb0b9da1
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-200.png
new file mode 100644
index 0000000000..efa7567286
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-400.png
new file mode 100644
index 0000000000..28a79c917e
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LockScreenLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LockScreenLogo.scale-200.png
new file mode 100644
index 0000000000..7440f0d4bf
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LockScreenLogo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-100.png
new file mode 100644
index 0000000000..b48a90fbde
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-125.png
new file mode 100644
index 0000000000..2c07454b3a
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-150.png
new file mode 100644
index 0000000000..e2e81a4e89
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-200.png
new file mode 100644
index 0000000000..de43005787
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-400.png
new file mode 100644
index 0000000000..f6442934ed
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-100.png
new file mode 100644
index 0000000000..147cc74697
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-125.png
new file mode 100644
index 0000000000..fb12df0421
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-150.png
new file mode 100644
index 0000000000..527b0498ee
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-200.png
new file mode 100644
index 0000000000..c3faff7095
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-400.png
new file mode 100644
index 0000000000..4d5f7f8bbe
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-100.png
new file mode 100644
index 0000000000..d21724785b
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-125.png
new file mode 100644
index 0000000000..09f012d396
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-150.png
new file mode 100644
index 0000000000..79bfd3cdcd
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-200.png
new file mode 100644
index 0000000000..f7f10796e4
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-400.png
new file mode 100644
index 0000000000..937933c999
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-16.png
new file mode 100644
index 0000000000..bdba6e8bfb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-16.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-24.png
new file mode 100644
index 0000000000..902d164632
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-24.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-256.png
new file mode 100644
index 0000000000..0c0601612c
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-256.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-32.png
new file mode 100644
index 0000000000..c603fcaeeb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-32.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-48.png
new file mode 100644
index 0000000000..06491e5d51
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-48.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-16.png
new file mode 100644
index 0000000000..bdba6e8bfb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-16.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-256.png
new file mode 100644
index 0000000000..0c0601612c
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-256.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-32.png
new file mode 100644
index 0000000000..c603fcaeeb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-32.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-48.png
new file mode 100644
index 0000000000..06491e5d51
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-48.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-100.png
new file mode 100644
index 0000000000..53f75132c9
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-125.png
new file mode 100644
index 0000000000..098aadf8c5
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-150.png
new file mode 100644
index 0000000000..16916b82f5
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-200.png
new file mode 100644
index 0000000000..06e0f28497
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-400.png
new file mode 100644
index 0000000000..d31fda3de6
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-16.png
new file mode 100644
index 0000000000..bdba6e8bfb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-16.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24.png
new file mode 100644
index 0000000000..902d164632
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24_altform-unplated.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24_altform-unplated.png
new file mode 100644
index 0000000000..902d164632
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24_altform-unplated.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-256.png
new file mode 100644
index 0000000000..0c0601612c
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-256.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-32.png
new file mode 100644
index 0000000000..c603fcaeeb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-32.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-48.png
new file mode 100644
index 0000000000..06491e5d51
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-48.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.png
new file mode 100644
index 0000000000..4f25bb2252
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-100.png
new file mode 100644
index 0000000000..4f25bb2252
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-125.png
new file mode 100644
index 0000000000..a872360054
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-150.png
new file mode 100644
index 0000000000..62e4b58af5
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-200.png
new file mode 100644
index 0000000000..97126aeb92
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-400.png
new file mode 100644
index 0000000000..f21049bec0
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-100.png
new file mode 100644
index 0000000000..8b23cfc097
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-125.png
new file mode 100644
index 0000000000..718f4f4eb1
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-150.png
new file mode 100644
index 0000000000..7b5e96f4c1
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-200.png
new file mode 100644
index 0000000000..a22e20a06d
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-400.png
new file mode 100644
index 0000000000..fa4ba31e0a
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.ico b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.ico
new file mode 100644
index 0000000000..e40c7086e7
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.ico differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.svg b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.svg
new file mode 100644
index 0000000000..41bba03405
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.svg
@@ -0,0 +1,31 @@
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.dark.svg b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.dark.svg
new file mode 100644
index 0000000000..ec3cb933d8
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.dark.svg
@@ -0,0 +1,100 @@
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.light.svg b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.light.svg
new file mode 100644
index 0000000000..9d74683716
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.light.svg
@@ -0,0 +1,100 @@
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/WinGetLogo.svg b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/WinGetLogo.svg
new file mode 100644
index 0000000000..0bf3ebbaff
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/WinGetLogo.svg
@@ -0,0 +1,97 @@
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.Branding.props b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.Branding.props
new file mode 100644
index 0000000000..2d228c36bf
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.Branding.props
@@ -0,0 +1,48 @@
+
+
+
+
+ Stable
+ Stable
+ Stable
+ Dev
+
+
+
+ Assets\Stable\icon.ico
+
+
+ Assets\Stable\icon.ico
+
+
+ Assets\Stable\icon.ico
+
+
+ Assets\Dev\icon.ico
+
+
+
+
+
+
+ true
+ Assets\%(RecursiveDir)%(FileName)%(Extension)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.pre.props b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.pre.props
new file mode 100644
index 0000000000..21c2e7d8d1
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.pre.props
@@ -0,0 +1,15 @@
+
+
+
+
+
+ Release
+
+
+
+ $(SolutionDir)$(Platform)\$(Configuration)\WinUI3Apps\CmdPal
+
+ $(OutputPath)\AppPackages\
+
+
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/BeginInvokeEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/BeginInvokeEvent.cs
new file mode 100644
index 0000000000..1e86514d6d
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/BeginInvokeEvent.cs
@@ -0,0 +1,23 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CmdPal.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class BeginInvokeEvent : TelemetryEventBase, IEvent
+{
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+
+ public BeginInvokeEvent()
+ {
+ EventName = "CmdPal_BeginInvokeEvent";
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ColdLaunchEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ColdLaunchEvent.cs
new file mode 100644
index 0000000000..d1e07f78b7
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ColdLaunchEvent.cs
@@ -0,0 +1,23 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CmdPal.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class ColdLaunchEvent : TelemetryEventBase, IEvent
+{
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+
+ public ColdLaunchEvent()
+ {
+ EventName = "CmdPal_ColdLaunch";
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnEscEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnEscEvent.cs
new file mode 100644
index 0000000000..e9d6d6f60f
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnEscEvent.cs
@@ -0,0 +1,18 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CmdPal.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class DismissedOnEscEvent : TelemetryEventBase, IEvent
+{
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnLostFocusEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnLostFocusEvent.cs
new file mode 100644
index 0000000000..bc654c0e6e
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnLostFocusEvent.cs
@@ -0,0 +1,18 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CmdPal.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class DismissedOnLostFocusEvent : TelemetryEventBase, IEvent
+{
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/HotkeySummonedEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/HotkeySummonedEvent.cs
new file mode 100644
index 0000000000..3a6bce661f
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/HotkeySummonedEvent.cs
@@ -0,0 +1,25 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CmdPal.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class HotkeySummonedEvent : TelemetryEventBase, IEvent
+{
+ public bool Global { get; set; }
+
+ public HotkeySummonedEvent(bool global)
+ {
+ Global = global;
+ }
+
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenPageEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenPageEvent.cs
new file mode 100644
index 0000000000..360c8fb410
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenPageEvent.cs
@@ -0,0 +1,30 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CmdPal.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class OpenPageEvent : TelemetryEventBase, IEvent
+{
+ public int PageDepth { get; set; }
+
+ public string Id { get; set; }
+
+ public OpenPageEvent(int pageDepth, string id)
+ {
+ PageDepth = pageDepth;
+ Id = id;
+
+ EventName = "CmdPal_OpenPage";
+ }
+
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenUriEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenUriEvent.cs
new file mode 100644
index 0000000000..8bcb7f08c2
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenUriEvent.cs
@@ -0,0 +1,32 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CommandPalette.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class OpenUriEvent : TelemetryEventBase, IEvent
+{
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+
+ public string Uri { get; set; }
+
+ public bool IsWeb { get; set; }
+
+ public bool Success { get; set; }
+
+ public OpenUriEvent(string uri, bool isWeb, bool success)
+ {
+ EventName = "CmdPal_OpenUri";
+ Uri = uri;
+ IsWeb = isWeb;
+ Success = success;
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ProcessStartedEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ProcessStartedEvent.cs
new file mode 100644
index 0000000000..4b38b43b0a
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ProcessStartedEvent.cs
@@ -0,0 +1,18 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CmdPal.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class ProcessStartedEvent : TelemetryEventBase, IEvent
+{
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ReactivateInstanceEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ReactivateInstanceEvent.cs
new file mode 100644
index 0000000000..abbba6a67f
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ReactivateInstanceEvent.cs
@@ -0,0 +1,23 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CmdPal.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class ReactivateInstanceEvent : TelemetryEventBase, IEvent
+{
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+
+ public ReactivateInstanceEvent()
+ {
+ EventName = "CmdPal_ReactivateInstance";
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunCommandEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunCommandEvent.cs
new file mode 100644
index 0000000000..e100cf642f
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunCommandEvent.cs
@@ -0,0 +1,32 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CommandPalette.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class RunCommandEvent : TelemetryEventBase, IEvent
+{
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+
+ public string Command { get; set; }
+
+ public bool AsAdmin { get; set; }
+
+ public bool Success { get; set; }
+
+ public RunCommandEvent(string command, bool asAdmin, bool success)
+ {
+ EventName = "CmdPal_RunCommand";
+ Command = command;
+ AsAdmin = asAdmin;
+ Success = success;
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunQueryEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunQueryEvent.cs
new file mode 100644
index 0000000000..64c1701a63
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunQueryEvent.cs
@@ -0,0 +1,32 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.Tracing;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.PowerToys.Telemetry;
+using Microsoft.PowerToys.Telemetry.Events;
+
+namespace Microsoft.CmdPal.UI.Events;
+
+[EventData]
+[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)]
+public class RunQueryEvent : TelemetryEventBase, IEvent
+{
+ public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage;
+
+ public string Query { get; set; }
+
+ public int ResultCount { get; set; }
+
+ public ulong DurationMs { get; set; }
+
+ public RunQueryEvent(string query, int resultCount, ulong durationMs)
+ {
+ EventName = "CmdPal_RunQuery";
+ Query = query;
+ ResultCount = resultCount;
+ DurationMs = durationMs;
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/DiagnosticsHelper.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/DiagnosticsHelper.cs
new file mode 100644
index 0000000000..563ec1ba93
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/DiagnosticsHelper.cs
@@ -0,0 +1,65 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Runtime.InteropServices;
+
+namespace Microsoft.CommandPalette.UI.Helpers;
+
+///
+/// Provides utility methods for building diagnostic and error messages.
+///
+public static class DiagnosticsHelper
+{
+ ///
+ /// Builds a comprehensive exception message with timestamp and detailed diagnostic information.
+ ///
+ /// The exception that occurred.
+ /// A hint about which extension caused the exception to help with debugging.
+ /// A string containing the exception details, timestamp, and source information for diagnostic purposes.
+ public static string BuildExceptionMessage(Exception exception, string? extensionHint)
+ {
+ var locationHint = string.IsNullOrWhiteSpace(extensionHint) ? "application" : $"'{extensionHint}' extension";
+
+ // let's try to get a message from the exception or inferred it from the HRESULT
+ // to show at least something
+ var message = exception.Message;
+ if (string.IsNullOrWhiteSpace(message))
+ {
+ var temp = Marshal.GetExceptionForHR(exception.HResult)?.Message;
+ if (!string.IsNullOrWhiteSpace(temp))
+ {
+ message = temp + $" (inferred from HRESULT 0x{exception.HResult:X8})";
+ }
+ }
+
+ if (string.IsNullOrWhiteSpace(message))
+ {
+ message = "[No message available]";
+ }
+
+ // note: keep date time kind and format consistent with the log
+ return $"""
+ ============================================================
+ 😢 An unexpected error occurred in the {locationHint}.
+
+ Summary:
+ Message: {message}
+ Type: {exception.GetType().FullName}
+ Source: {exception.Source ?? "N/A"}
+ Time: {DateTimeOffset.Now:yyyy-MM-dd HH:mm:ss.fffffff}
+ HRESULT: 0x{exception.HResult:X8} ({exception.HResult})
+
+ Stack Trace:
+ {exception.StackTrace ?? "[No stack trace available]"}
+
+ ------------------ Full Exception Details ------------------
+ {exception}
+
+ ℹ️ If you need further assistance, please include this information in your support request.
+ ℹ️ Before sending, take a quick look to make sure it doesn't contain any personal or sensitive information.
+ ============================================================
+
+ """;
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GlobalErrorHandler.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GlobalErrorHandler.cs
new file mode 100644
index 0000000000..a2c405c288
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GlobalErrorHandler.cs
@@ -0,0 +1,163 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.CommandPalette.UI.Services;
+using Microsoft.Extensions.Logging;
+using Windows.Win32;
+using Windows.Win32.Foundation;
+using Windows.Win32.UI.WindowsAndMessaging;
+using SystemUnhandledExceptionEventArgs = System.UnhandledExceptionEventArgs;
+using XamlUnhandledExceptionEventArgs = Microsoft.UI.Xaml.UnhandledExceptionEventArgs;
+
+namespace Microsoft.CommandPalette.UI.Helpers;
+
+///
+/// Global error handler for Command Palette.
+///
+internal sealed partial class GlobalErrorHandler
+{
+ private readonly CmdPalLogger logger;
+
+ public GlobalErrorHandler(CmdPalLogger logger)
+ {
+ ArgumentNullException.ThrowIfNull(logger);
+ this.logger = logger;
+ }
+
+ // GlobalErrorHandler is designed to be self-contained; it can be registered and invoked before a service provider is available.
+ internal void Register(App app)
+ {
+ ArgumentNullException.ThrowIfNull(app);
+
+ app.UnhandledException += App_UnhandledException;
+ TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
+ AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
+ }
+
+ private void App_UnhandledException(object sender, XamlUnhandledExceptionEventArgs e)
+ {
+ // Exceptions thrown on the main UI thread are handled here.
+ if (e.Exception != null)
+ {
+ HandleException(e.Exception, Context.MainThreadException);
+ }
+ }
+
+ private void CurrentDomain_UnhandledException(object sender, SystemUnhandledExceptionEventArgs e)
+ {
+ // Exceptions thrown on background threads are handled here.
+ if (e.ExceptionObject is Exception ex)
+ {
+ HandleException(ex, Context.AppDomainUnhandledException);
+ }
+ }
+
+ private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e)
+ {
+ // This event is raised only when a faulted Task is garbage-collected
+ // without its exception being observed. It is NOT raised immediately
+ // when the Task faults; timing depends on GC finalization.
+ e.SetObserved();
+ HandleException(e.Exception, Context.UnobservedTaskException);
+ }
+
+ private void HandleException(Exception ex, Context context)
+ {
+ Log_UnhandledException(ex, context);
+
+ if (context == Context.MainThreadException)
+ {
+ var error = DiagnosticsHelper.BuildExceptionMessage(ex, null);
+ var report = $"""
+ This is an error report generated by Microsoft Command Palette.
+ If you are seeing this message, it means the application has encountered an unexpected issue.
+ You can help us fix it by filing a report at https://aka.ms/powerToysReportBug.
+ {error}
+ """;
+
+ StoreReport(report, storeOnDesktop: false);
+
+ string message;
+ string caption;
+ try
+ {
+ message = ResourceLoaderInstance.GetString("GlobalErrorHandler_CrashMessageBox_Message");
+ caption = ResourceLoaderInstance.GetString("GlobalErrorHandler_CrashMessageBox_Caption");
+ }
+ catch
+ {
+ // The resource loader may not be available if the exception occurred during startup.
+ // Fall back to hardcoded strings in that case.
+ message = "Command Palette has encountered a fatal error and must close.";
+ caption = "Command Palette - Fatal error";
+ }
+
+ PInvoke.MessageBox(
+ HWND.Null,
+ message,
+ caption,
+ MESSAGEBOX_STYLE.MB_ICONERROR);
+ }
+ }
+
+ private string? StoreReport(string report, bool storeOnDesktop)
+ {
+ // Generate a unique name for the report file; include timestamp and a random zero-padded number to avoid collisions
+ // in case of crash storm.
+ var name = FormattableString.Invariant($"CmdPal_ErrorReport_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{Random.Shared.Next(100000):D5}.log");
+
+ // Always store a copy in log directory, this way it is available for Bug Report Tool
+ string? reportPath = null;
+ if (logger.CurrentVersionLogDirectoryPath != null)
+ {
+ reportPath = Save(report, name, () => logger.CurrentVersionLogDirectoryPath);
+ }
+
+ // Optionally store a copy on the desktop for user (in)convenience
+ if (storeOnDesktop)
+ {
+ var path = Save(report, name, () => Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
+
+ // show the desktop copy if both succeeded
+ if (path != null)
+ {
+ reportPath = path;
+ }
+ }
+
+ return reportPath;
+
+ string? Save(string reportContent, string reportFileName, Func directory)
+ {
+ try
+ {
+ var logDirectory = directory();
+ Directory.CreateDirectory(logDirectory);
+ var reportFilePath = Path.Combine(logDirectory, reportFileName);
+ File.WriteAllText(reportFilePath, reportContent);
+ return reportFilePath;
+ }
+ catch (Exception ex)
+ {
+ Log_FailureToSaveExceptionReport(ex);
+ return null;
+ }
+ }
+ }
+
+ private enum Context
+ {
+ Unknown = 0,
+ MainThreadException,
+ BackgroundThreadException,
+ UnobservedTaskException,
+ AppDomainUnhandledException,
+ }
+
+ [LoggerMessage(Level = LogLevel.Error, Message = "Unhandled exception detected in context {context}")]
+ partial void Log_UnhandledException(Exception exception, Context context);
+
+ [LoggerMessage(Level = LogLevel.Error, Message = "Failed to save exception report")]
+ partial void Log_FailureToSaveExceptionReport(Exception exception);
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GpoValueChecker.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GpoValueChecker.cs
new file mode 100644
index 0000000000..f137e38e5a
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GpoValueChecker.cs
@@ -0,0 +1,93 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.Win32;
+
+namespace Microsoft.CommandPalette.UI.Helpers;
+
+internal enum GpoRuleConfiguredValue
+{
+ WrongValue = -3,
+ Unavailable = -2,
+ NotConfigured = -1,
+ Disabled = 0,
+ Enabled = 1,
+}
+
+/*
+ * Contains methods extracted from PowerToys gpo.h
+ * The idea is to keep CmdPal codebase take as little dependences on the PowerToys codebase as possible.
+ * Having this class to check GPO being contained in CmdPal means we don't need to depend on GPOWrapper.
+ */
+internal static class GpoValueChecker
+{
+ private const string PoliciesPath = @"SOFTWARE\Policies\PowerToys";
+ private static readonly RegistryKey PoliciesScopeMachine = Registry.LocalMachine;
+ private static readonly RegistryKey PoliciesScopeUser = Registry.CurrentUser;
+ private const string PolicyConfigureEnabledCmdPal = @"ConfigureEnabledUtilityCmdPal";
+ private const string PolicyConfigureEnabledGlobalAllUtilities = @"ConfigureGlobalUtilityEnabledState";
+
+ private static GpoRuleConfiguredValue GetConfiguredValue(string registryValueName)
+ {
+ // For GPO policies, machine scope should take precedence over user scope
+ var value = ReadRegistryValue(PoliciesScopeMachine, PoliciesPath, registryValueName);
+
+ if (!value.HasValue)
+ {
+ // If not found in machine scope, check user scope
+ value = ReadRegistryValue(PoliciesScopeUser, PoliciesPath, registryValueName);
+ if (!value.HasValue)
+ {
+ return GpoRuleConfiguredValue.NotConfigured;
+ }
+ }
+
+ return value switch
+ {
+ 0 => GpoRuleConfiguredValue.Disabled,
+ 1 => GpoRuleConfiguredValue.Enabled,
+ _ => GpoRuleConfiguredValue.WrongValue,
+ };
+ }
+
+ // Reads an integer registry value if it exists.
+ private static int? ReadRegistryValue(RegistryKey rootKey, string subKeyPath, string valueName)
+ {
+ using (RegistryKey? key = rootKey.OpenSubKey(subKeyPath, false))
+ {
+ if (key is null)
+ {
+ return null;
+ }
+
+ var value = key.GetValue(valueName);
+ if (value is int intValue)
+ {
+ return intValue;
+ }
+
+ return null;
+ }
+ }
+
+ private static GpoRuleConfiguredValue GetUtilityEnabledValue(string utilityName)
+ {
+ var individualValue = GetConfiguredValue(utilityName);
+
+ if (individualValue == GpoRuleConfiguredValue.Disabled || individualValue == GpoRuleConfiguredValue.Enabled)
+ {
+ return individualValue;
+ }
+ else
+ {
+ // If the individual utility value is not set, check the global all utilities policy value.
+ return GetConfiguredValue(PolicyConfigureEnabledGlobalAllUtilities);
+ }
+ }
+
+ internal static GpoRuleConfiguredValue GetConfiguredCmdPalEnabledValue()
+ {
+ return GetUtilityEnabledValue(PolicyConfigureEnabledCmdPal);
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/NativeEventWaiter.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/NativeEventWaiter.cs
new file mode 100644
index 0000000000..85cab883c6
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/NativeEventWaiter.cs
@@ -0,0 +1,29 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.UI.Dispatching;
+
+namespace Microsoft.CommandPalette.UI.Helpers;
+
+public static partial class NativeEventWaiter
+{
+ public static void WaitForEventLoop(string eventName, Action callback)
+ {
+ var dispatcherQueue = DispatcherQueue.GetForCurrentThread();
+ var t = new Thread(() =>
+ {
+ var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventName);
+ while (true)
+ {
+ if (eventHandle.WaitOne())
+ {
+ dispatcherQueue.TryEnqueue(() => callback());
+ }
+ }
+ });
+
+ t.IsBackground = true;
+ t.Start();
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/ResourceLoaderInstance.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/ResourceLoaderInstance.cs
new file mode 100644
index 0000000000..5cbd067a1c
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/ResourceLoaderInstance.cs
@@ -0,0 +1,19 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.Windows.ApplicationModel.Resources;
+
+namespace Microsoft.CommandPalette.UI.Helpers;
+
+internal static class ResourceLoaderInstance
+{
+ internal static ResourceLoader ResourceLoader { get; private set; }
+
+ static ResourceLoaderInstance()
+ {
+ ResourceLoader = new ResourceLoader("resources.pri");
+ }
+
+ internal static string GetString(string resourceId) => ResourceLoader.GetString(resourceId);
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/WindowExtensions.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/WindowExtensions.cs
new file mode 100644
index 0000000000..637ccbe539
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/WindowExtensions.cs
@@ -0,0 +1,85 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.UI;
+using Microsoft.UI.Windowing;
+using Microsoft.UI.Xaml;
+using Windows.Win32;
+using Windows.Win32.Foundation;
+using Windows.Win32.Graphics.Dwm;
+using Windows.Win32.UI.WindowsAndMessaging;
+
+namespace Microsoft.CommandPalette.UI.Helpers;
+
+internal static class WindowExtensions
+{
+ public static void SetIcon(this Window window)
+ {
+ var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(window);
+ WindowId windowId = Win32Interop.GetWindowIdFromWindow(hWnd);
+ AppWindow appWindow = AppWindow.GetFromWindowId(windowId);
+ appWindow.SetIcon(@"Assets\icon.ico");
+ }
+
+ public static HWND GetWindowHwnd(this Window window)
+ {
+ return window is null
+ ? throw new ArgumentNullException(nameof(window))
+ : new HWND(WinRT.Interop.WindowNative.GetWindowHandle(window));
+ }
+
+ ///
+ /// Toggles the specified extended window style on or off for the supplied .
+ ///
+ /// The whose extended window styles will be modified. Cannot be null.
+ /// The flag(s) to set or clear.
+ /// When true, the specified bit(s) will be set (added). When false, the bit(s) will be cleared (removed).
+ /// True if the call to SetWindowLong succeeded and the style was applied; otherwise false.
+ /// Thrown if is null.
+ internal static bool ToggleExtendedWindowStyle(this Window window, WINDOW_EX_STYLE style, bool isStyleSet)
+ {
+ var hWnd = GetWindowHwnd(window);
+ var currentStyle = PInvoke.GetWindowLong(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE);
+
+ if (isStyleSet)
+ {
+ currentStyle |= (int)style;
+ }
+ else
+ {
+ currentStyle &= ~(int)style;
+ }
+
+ var wasSet = PInvoke.SetWindowLong(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, currentStyle) != 0;
+
+ // SWP_FRAMECHANGED - invalidate cached window style
+ PInvoke.SetWindowPos(hWnd, new HWND(IntPtr.Zero), 0, 0, 0, 0, SET_WINDOW_POS_FLAGS.SWP_FRAMECHANGED | SET_WINDOW_POS_FLAGS.SWP_NOMOVE | SET_WINDOW_POS_FLAGS.SWP_NOSIZE | SET_WINDOW_POS_FLAGS.SWP_NOZORDER | SET_WINDOW_POS_FLAGS.SWP_NOOWNERZORDER);
+
+ return wasSet;
+ }
+
+ ///
+ /// Sets the window corner preference
+ ///
+ /// The window
+ /// The desired corner preference
+ /// True if the operation succeeded
+ public static bool SetCornerPreference(this Window window, DWM_WINDOW_CORNER_PREFERENCE cornerPreference)
+ {
+ return window.GetWindowHwnd().SetDwmWindowAttribute(DWMWINDOWATTRIBUTE.DWMWA_WINDOW_CORNER_PREFERENCE, cornerPreference);
+ }
+
+ ///
+ /// Unified wrapper for DwmSetWindowAttribute calls with enum values
+ ///
+ private static bool SetDwmWindowAttribute(this HWND hwnd, DWMWINDOWATTRIBUTE attribute, T value)
+ where T : unmanaged, Enum
+ {
+ unsafe
+ {
+ var result = PInvoke.DwmSetWindowAttribute(hwnd, attribute, &value, (uint)sizeof(T));
+ return result.Succeeded;
+ }
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/HiddenOwnerWindowBehavior.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/HiddenOwnerWindowBehavior.cs
new file mode 100644
index 0000000000..4f93e935e2
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/HiddenOwnerWindowBehavior.cs
@@ -0,0 +1,89 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.CommandPalette.UI.Helpers;
+using Microsoft.UI.Xaml;
+using Windows.Win32;
+using Windows.Win32.Foundation;
+using Windows.Win32.Graphics.Dwm;
+using Windows.Win32.UI.WindowsAndMessaging;
+
+namespace Microsoft.CommandPalette.UI;
+
+///
+/// Provides behavior to control taskbar and Alt+Tab presence by assigning a hidden owner
+/// and toggling extended window styles for a target window.
+///
+internal sealed class HiddenOwnerWindowBehavior
+{
+ private HWND _hiddenOwnerHwnd;
+ private Window? _hiddenWindow;
+
+ ///
+ /// Shows or hides a window in the taskbar (and Alt+Tab) by updating ownership and extended window styles.
+ ///
+ /// The to update.
+ /// True to show the window in the taskbar (and Alt+Tab); false to hide it from both.
+ ///
+ /// When hiding the window, a hidden owner is assigned and
+ /// is enabled to keep it out of the taskbar and Alt+Tab. When showing, the owner is cleared and
+ /// is enabled to ensure taskbar presence. Since tool
+ /// windows use smaller corner radii, the normal rounded corners are enforced via
+ /// .
+ ///
+ ///
+ public void ShowInTaskbar(Window target, bool isVisibleInTaskbar)
+ {
+ /*
+ * There are the three main ways to control whether a window appears on the taskbar:
+ * https://learn.microsoft.com/en-us/windows/win32/shell/taskbar#managing-taskbar-buttons
+ *
+ * 1. Set the window's owner. Owned windows do not appear on the taskbar:
+ * Turns out this is the most reliable way to hide a window from the taskbar and ALT+TAB. WinForms and WPF uses this method
+ * to back their ShowInTaskbar property as well.
+ *
+ * 2. Use the WS_EX_TOOLWINDOW extended window style:
+ * This mostly works, with some reports that it silently fails in some cases. The biggest issue
+ * is that for certain Windows settings (like Multitasking -> Show taskbar buttons on all displays = On all desktops),
+ * the taskbar button is always shown even for tool windows.
+ *
+ * 3. Using ITaskbarList:
+ * This is what AppWindow.IsShownInSwitchers uses, but it's COM-based and more complex, and can
+ * fail if Explorer isn't running or responding. It could be a good backup, if needed.
+ */
+
+ var visibleHwnd = target.GetWindowHwnd();
+
+ if (isVisibleInTaskbar)
+ {
+ // remove any owner window
+ PInvoke.SetWindowLongPtr(visibleHwnd, WINDOW_LONG_PTR_INDEX.GWLP_HWNDPARENT, HWND.Null);
+ }
+ else
+ {
+ // Set the hidden window as the owner of the target window
+ var hiddenHwnd = EnsureHiddenOwner();
+ PInvoke.SetWindowLongPtr(visibleHwnd, WINDOW_LONG_PTR_INDEX.GWLP_HWNDPARENT, hiddenHwnd);
+ }
+
+ // Tool windows don't show up in ALT+TAB, and don't show up in the taskbar
+ // Tool window and app window styles are mutually exclusive, change both just to be safe
+ target.ToggleExtendedWindowStyle(WINDOW_EX_STYLE.WS_EX_TOOLWINDOW, !isVisibleInTaskbar);
+ target.ToggleExtendedWindowStyle(WINDOW_EX_STYLE.WS_EX_APPWINDOW, isVisibleInTaskbar);
+
+ // Since tool windows have smaller corner radii, we need to force the normal ones
+ target.SetCornerPreference(DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_ROUND);
+ }
+
+ private HWND EnsureHiddenOwner()
+ {
+ if (_hiddenOwnerHwnd.IsNull)
+ {
+ _hiddenWindow = new Window();
+ _hiddenOwnerHwnd = _hiddenWindow.GetWindowHwnd();
+ }
+
+ return _hiddenOwnerHwnd;
+ }
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/LocalSuppressions.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/LocalSuppressions.cs
new file mode 100644
index 0000000000..1b456f66d7
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/LocalSuppressions.cs
@@ -0,0 +1,9 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+using System.Diagnostics.CodeAnalysis;
+
+[assembly: SuppressMessage("Interoperability", "CsWinRT1028: Class should be marked partial", Justification = "CsWin32 generated code; not used across WinRT boundary", Scope = "type", Target = "~T:Windows.Win32.DestroyIconSafeHandle")]
+[assembly: SuppressMessage("Interoperability", "CsWinRT1028: Class should be marked partial", Justification = "CsWin32 generated code; not used across WinRT boundary", Scope = "type", Target = "~T:Windows.Win32.DestroyMenuSafeHandle")]
+[assembly: SuppressMessage("Interoperability", "CsWinRT1028: Class should be marked partial", Justification = "CsWin32 generated code; not used across WinRT boundary", Scope = "type", Target = "~T:Windows.Win32.FreeLibrarySafeHandle")]
+[assembly: SuppressMessage("Interoperability", "CsWinRT1028: Class should be marked partial", Justification = "CsWin32 generated code; not used across WinRT boundary", Scope = "type", Target = "~T:Windows.Win32.UnhookWindowsHookExSafeHandle")]
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml
new file mode 100644
index 0000000000..61d209f7e3
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml.cs
new file mode 100644
index 0000000000..8473b4253f
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml.cs
@@ -0,0 +1,114 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Runtime.InteropServices;
+using Microsoft.Extensions.Logging;
+using Microsoft.UI.Xaml;
+using Microsoft.Windows.AppLifecycle;
+using Windows.ApplicationModel.Activation;
+
+namespace Microsoft.CommandPalette.UI;
+
+///
+/// An empty window that can be used on its own or navigated to within a Frame.
+///
+public sealed partial class MainWindow : Window
+{
+ private readonly ILogger logger;
+
+ public MainWindow(ILogger logger)
+ {
+ InitializeComponent();
+ this.logger = logger;
+ }
+
+ public void HandleLaunchNonUI(AppActivationArguments? activatedEventArgs)
+ {
+ // LOAD BEARING
+ // Any reading and processing of the activation arguments must be done
+ // synchronously in this method, before it returns. The sending instance
+ // remains blocked until this returns; afterward it may quit, causing
+ // the activation arguments to be lost.
+ if (activatedEventArgs is null)
+ {
+ // Summon(string.Empty);
+ return;
+ }
+
+ try
+ {
+ if (activatedEventArgs.Kind == ExtendedActivationKind.StartupTask)
+ {
+ return;
+ }
+
+ if (activatedEventArgs.Kind == ExtendedActivationKind.Protocol)
+ {
+ if (activatedEventArgs.Data is IProtocolActivatedEventArgs protocolArgs)
+ {
+ if (protocolArgs.Uri.ToString() is string uri)
+ {
+ // was the URI "x-cmdpal://background" ?
+ if (uri.StartsWith("x-cmdpal://background", StringComparison.OrdinalIgnoreCase))
+ {
+ // we're running, we don't want to activate our window. bail
+ return;
+ }
+ else if (uri.StartsWith("x-cmdpal://settings", StringComparison.OrdinalIgnoreCase))
+ {
+ // WeakReferenceMessenger.Default.Send(new());
+ return;
+ }
+ else if (uri.StartsWith("x-cmdpal://reload", StringComparison.OrdinalIgnoreCase))
+ {
+ // var settings = App.Current.Services.GetService();
+ // if (settings?.AllowExternalReload == true)
+ // {
+ // Logger.LogInfo("External Reload triggered");
+ // WeakReferenceMessenger.Default.Send(new());
+ // }
+ // else
+ // {
+ // Logger.LogInfo("External Reload is disabled");
+ // }
+ return;
+ }
+ }
+ }
+ }
+ }
+ catch (COMException ex)
+ {
+ // https://learn.microsoft.com/en-us/windows/win32/rpc/rpc-return-values
+ const int RPC_S_SERVER_UNAVAILABLE = -2147023174;
+ const int RPC_S_CALL_FAILED = 2147023170;
+
+ // Accessing properties activatedEventArgs.Kind and activatedEventArgs.Data might cause COMException
+ // if the args are not valid or not passed correctly.
+ if (ex.HResult is RPC_S_SERVER_UNAVAILABLE or RPC_S_CALL_FAILED)
+ {
+ // Logger.LogWarning(
+ // $"COM exception (HRESULT {ex.HResult}) when accessing activation arguments. " +
+ // $"This might be due to the calling application not passing them correctly or exiting before we could read them. " +
+ // $"The application will continue running and fall back to showing the Command Palette window.");
+ }
+ else
+ {
+ // Logger.LogError(
+ // $"COM exception (HRESULT {ex.HResult}) when activating the application. " +
+ // $"The application will continue running and fall back to showing the Command Palette window.",
+ // ex);
+ }
+ }
+
+ // Summon(string.Empty);
+ }
+
+ // public void Summon(string commandId) =>
+ // The actual showing and hiding of the window will be done by the
+ // ShellPage. This is because we don't want to show the window if the
+ // user bound a hotkey to just an invokable command, which we can't
+ // know till the message is being handled.
+ // WeakReferenceManager.Default.Send(new(commandId, _hwnd));
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Microsoft.CommandPalette.UI.csproj b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Microsoft.CommandPalette.UI.csproj
new file mode 100644
index 0000000000..5a4b0cb148
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Microsoft.CommandPalette.UI.csproj
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+ WinExe
+ Microsoft.CommandPalette.UI
+ app.manifest
+ win-$(Platform).pubxml
+ true
+ true
+ enable
+ enable
+ true
+ preview
+
+ $(CmdPalVersion)
+
+
+
+ false
+ false
+
+
+
+
+
+
+
+ true
+ false
+ false
+ true
+
+
+
+ true
+ Never
+ $(OutputPath)\AppPackages\Microsoft.CommandPalette.UI_$(Version)_Test\
+
+
+
+
+
+ DISABLE_XAML_GENERATED_MAIN
+
+
+
+
+
+
+ $(ApplicationManifest.Replace("$(MSBuildProjectDirectory)\",""))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+ PreserveNewest
+
+
+ Never
+
+
+ Never
+
+
+ Never
+
+
+
+
+
+
+ <_Parameter1>PublishTrimmed
+ <_Parameter2>$(PublishTrimmed)
+
+
+ <_Parameter1>PublishAot
+ <_Parameter2>$(PublishAot)
+
+
+ <_Parameter1>CIBuild
+ <_Parameter2>$(CIBuild)
+
+
+ <_Parameter1>CommandPaletteBranding
+ <_Parameter2>$(CommandPaletteBranding)
+
+
+
+
+
+ Never
+
+
+ Never
+
+
+ Never
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/NativeMethods.txt b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/NativeMethods.txt
new file mode 100644
index 0000000000..fc5a608199
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/NativeMethods.txt
@@ -0,0 +1,66 @@
+GetPhysicallyInstalledSystemMemory
+GlobalMemoryStatusEx
+GetSystemInfo
+GetForegroundWindow
+SetForegroundWindow
+GetWindowRect
+GetCursorPos
+SetWindowPos
+HWND_TOPMOST
+HWND_BOTTOM
+IsIconic
+RegisterHotKey
+UnregisterHotKey
+SetWindowLongPtr
+CallWindowProc
+ShowWindow
+SetForegroundWindow
+EnableWindow
+IsWindowEnabled
+SetFocus
+SetActiveWindow
+MonitorFromWindow
+GetMonitorInfo
+GetDpiForMonitor
+WM_HOTKEY
+WM_NCLBUTTONDBLCLK
+
+Shell_NotifyIcon
+LoadIcon
+WM_USER
+WM_WINDOWPOSCHANGING
+RegisterWindowMessageW
+ExtractIconEx
+TRACK_POPUP_MENU_FLAGS
+WM_COMMAND
+WM_RBUTTONUP
+WM_LBUTTONUP
+WM_LBUTTONDBLCLK
+CreatePopupMenu
+TrackPopupMenuEx
+InsertMenu
+
+MessageBox
+DwmGetWindowAttribute
+DwmSetWindowAttribute
+DWM_CLOAKED_APP
+DWM_WINDOW_CORNER_PREFERENCE
+
+CoWaitForMultipleObjects
+INFINITE
+CWMO_FLAGS
+
+GetCurrentThreadId
+SetWindowsHookEx
+UnhookWindowsHookEx
+CallNextHookEx
+GetModuleHandle
+
+GetWindowLong
+SetWindowLong
+WINDOW_EX_STYLE
+CreateWindowEx
+WNDCLASSEXW
+RegisterClassEx
+GetStockObject
+GetModuleHandle
\ No newline at end of file
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package-Dev.appxmanifest b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package-Dev.appxmanifest
new file mode 100644
index 0000000000..f8a16a433b
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package-Dev.appxmanifest
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+ ms-resource:AppNameDev
+ A Lone Developer
+ Assets\StoreLogo.png
+ disabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.microsoft.commandpalette
+
+
+
+
+
+
+
+
+
+ Assets\StoreLogo.png
+ Command Palette Dev URI scheme
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package.appxmanifest b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package.appxmanifest
new file mode 100644
index 0000000000..4020c10ead
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package.appxmanifest
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+ ms-resource:AppName
+ Microsoft Corporation
+ Assets\StoreLogo.png
+ disabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.microsoft.commandpalette
+
+
+
+
+
+
+
+
+
+
+ Assets\StoreLogo.png
+ Command Palette URI scheme
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Program.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Program.cs
new file mode 100644
index 0000000000..98e97936c5
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Program.cs
@@ -0,0 +1,140 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.CmdPal.UI.Events;
+using Microsoft.CommandPalette.UI.Services;
+using Microsoft.CommandPalette.UI.Services.Telemetry;
+using Microsoft.Extensions.Logging;
+using Microsoft.UI.Dispatching;
+using Microsoft.Windows.AppLifecycle;
+using Windows.Win32;
+using Windows.Win32.Foundation;
+using Windows.Win32.System.Com;
+
+namespace Microsoft.CommandPalette.UI;
+
+// cribbed heavily from
+//
+// https://github.com/microsoft/WindowsAppSDK-Samples/tree/main/Samples/AppLifecycle/Instancing/cs2/cs-winui-packaged/CsWinUiDesktopInstancing
+internal sealed partial class Program
+{
+ private static DispatcherQueueSynchronizationContext? uiContext;
+ private static App? app;
+ private static ILogger logger = new CmdPalLogger();
+
+ // LOAD BEARING
+ //
+ // Main cannot be async. If it is, then the clipboard won't work, and neither will narrator.
+ // That means you, the person thinking about making this a MTA thread. Don't
+ // do it. It won't work. That's not the solution.
+ [STAThread]
+ private static int Main(string[] args)
+ {
+ if (Helpers.GpoValueChecker.GetConfiguredCmdPalEnabledValue() == Helpers.GpoRuleConfiguredValue.Disabled)
+ {
+ // There's a GPO rule configured disabling CmdPal. Exit as soon as possible.
+ return 0;
+ }
+
+ Log_AppStart(logger, DateTime.UtcNow);
+ TelemetryService.WriteEvent(new ProcessStartedEvent());
+
+ WinRT.ComWrappersSupport.InitializeComWrappers();
+ var isRedirect = DecideRedirection();
+ if (!isRedirect)
+ {
+ Microsoft.UI.Xaml.Application.Start((p) =>
+ {
+ uiContext = new DispatcherQueueSynchronizationContext(DispatcherQueue.GetForCurrentThread());
+ SynchronizationContext.SetSynchronizationContext(uiContext);
+ app = new App(logger);
+ });
+ }
+
+ return 0;
+ }
+
+ private static bool DecideRedirection()
+ {
+ var isRedirect = false;
+ var args = AppInstance.GetCurrent().GetActivatedEventArgs();
+ var keyInstance = AppInstance.FindOrRegisterForKey("randomKey");
+
+ if (keyInstance.IsCurrent)
+ {
+ TelemetryService.WriteEvent(new ColdLaunchEvent());
+ keyInstance.Activated += OnActivated;
+ }
+ else
+ {
+ isRedirect = true;
+ TelemetryService.WriteEvent(new ReactivateInstanceEvent());
+ RedirectActivationTo(args, keyInstance);
+ }
+
+ return isRedirect;
+ }
+
+ private static void RedirectActivationTo(AppActivationArguments args, AppInstance keyInstance)
+ {
+ // Do the redirection on another thread, and use a non-blocking
+ // wait method to wait for the redirection to complete.
+ using var redirectSemaphore = new Semaphore(0, 1);
+ var redirectTimeout = TimeSpan.FromSeconds(32);
+
+ _ = Task.Run(() =>
+ {
+ using var cts = new CancellationTokenSource(redirectTimeout);
+ try
+ {
+ keyInstance.RedirectActivationToAsync(args)
+ .AsTask(cts.Token)
+ .GetAwaiter()
+ .GetResult();
+ }
+ catch (OperationCanceledException)
+ {
+ Log_FailedToActivateTimeout(logger, redirectTimeout);
+ }
+ catch (Exception ex)
+ {
+ Log_FailedToActivate(logger, ex);
+ }
+ finally
+ {
+ redirectSemaphore.Release();
+ }
+ });
+
+ _ = PInvoke.CoWaitForMultipleObjects(
+ (uint)CWMO_FLAGS.CWMO_DEFAULT,
+ PInvoke.INFINITE,
+ [new HANDLE(redirectSemaphore.SafeWaitHandle.DangerousGetHandle())],
+ out _);
+ }
+
+ private static void OnActivated(object? sender, AppActivationArguments args)
+ {
+ // If we already have a form, display the message now.
+ // Otherwise, add it to the collection for displaying later.
+ if (App.Current?.AppWindow is MainWindow mainWindow)
+ {
+ // LOAD BEARING
+ // This must be synchronous to ensure the method does not return
+ // before the activation is fully handled and the parameters are processed.
+ // The sending instance remains blocked until this returns; afterward it may quit,
+ // causing the activation arguments to be lost.
+ mainWindow.HandleLaunchNonUI(args);
+ }
+ }
+
+ [LoggerMessage(Level = LogLevel.Debug, Message = "Starting at {startTime}")]
+ static partial void Log_AppStart(ILogger logger, DateTime startTime);
+
+ [LoggerMessage(Level = LogLevel.Error, Message = "Failed to activate existing instance; timed out after {redirectTimeout}.")]
+ static partial void Log_FailedToActivateTimeout(ILogger logger, TimeSpan redirectTimeout);
+
+ [LoggerMessage(Level = LogLevel.Error, Message = "Failed to activate existing instance")]
+ static partial void Log_FailedToActivate(ILogger logger, Exception ex);
+}
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-100.png
new file mode 100644
index 0000000000..79c6a4c077
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-125.png
new file mode 100644
index 0000000000..cd5e093a6c
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-150.png
new file mode 100644
index 0000000000..88fb0b9da1
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-200.png
new file mode 100644
index 0000000000..efa7567286
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-400.png
new file mode 100644
index 0000000000..28a79c917e
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LockScreenLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LockScreenLogo.scale-200.png
new file mode 100644
index 0000000000..7440f0d4bf
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LockScreenLogo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-100.png
new file mode 100644
index 0000000000..b48a90fbde
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-125.png
new file mode 100644
index 0000000000..2c07454b3a
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-150.png
new file mode 100644
index 0000000000..e2e81a4e89
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-200.png
new file mode 100644
index 0000000000..de43005787
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-400.png
new file mode 100644
index 0000000000..f6442934ed
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-100.png
new file mode 100644
index 0000000000..147cc74697
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-125.png
new file mode 100644
index 0000000000..fb12df0421
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-150.png
new file mode 100644
index 0000000000..527b0498ee
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-200.png
new file mode 100644
index 0000000000..c3faff7095
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-400.png
new file mode 100644
index 0000000000..4d5f7f8bbe
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-100.png
new file mode 100644
index 0000000000..d21724785b
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-125.png
new file mode 100644
index 0000000000..09f012d396
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-150.png
new file mode 100644
index 0000000000..79bfd3cdcd
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-200.png
new file mode 100644
index 0000000000..f7f10796e4
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-400.png
new file mode 100644
index 0000000000..937933c999
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png
new file mode 100644
index 0000000000..bdba6e8bfb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png
new file mode 100644
index 0000000000..902d164632
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png
new file mode 100644
index 0000000000..0c0601612c
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png
new file mode 100644
index 0000000000..c603fcaeeb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png
new file mode 100644
index 0000000000..06491e5d51
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-16.png
new file mode 100644
index 0000000000..bdba6e8bfb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-16.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-256.png
new file mode 100644
index 0000000000..0c0601612c
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-256.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-32.png
new file mode 100644
index 0000000000..c603fcaeeb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-32.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-48.png
new file mode 100644
index 0000000000..06491e5d51
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-48.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-100.png
new file mode 100644
index 0000000000..53f75132c9
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-125.png
new file mode 100644
index 0000000000..098aadf8c5
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-150.png
new file mode 100644
index 0000000000..16916b82f5
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-200.png
new file mode 100644
index 0000000000..06e0f28497
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-400.png
new file mode 100644
index 0000000000..d31fda3de6
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-16.png
new file mode 100644
index 0000000000..bdba6e8bfb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-16.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24.png
new file mode 100644
index 0000000000..902d164632
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24_altform-unplated.png
new file mode 100644
index 0000000000..902d164632
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24_altform-unplated.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-256.png
new file mode 100644
index 0000000000..0c0601612c
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-256.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-32.png
new file mode 100644
index 0000000000..c603fcaeeb
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-32.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-48.png
new file mode 100644
index 0000000000..06491e5d51
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-48.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.png
new file mode 100644
index 0000000000..4f25bb2252
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-100.png
new file mode 100644
index 0000000000..4f25bb2252
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-125.png
new file mode 100644
index 0000000000..a872360054
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-150.png
new file mode 100644
index 0000000000..62e4b58af5
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-200.png
new file mode 100644
index 0000000000..97126aeb92
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-400.png
new file mode 100644
index 0000000000..f21049bec0
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-100.png
new file mode 100644
index 0000000000..8b23cfc097
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-100.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-125.png
new file mode 100644
index 0000000000..718f4f4eb1
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-125.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-150.png
new file mode 100644
index 0000000000..7b5e96f4c1
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-150.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-200.png
new file mode 100644
index 0000000000..a22e20a06d
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-200.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-400.png
new file mode 100644
index 0000000000..fa4ba31e0a
Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-400.png differ
diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/CmdPalLogger.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/CmdPalLogger.cs
new file mode 100644
index 0000000000..36a204b2cb
--- /dev/null
+++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/CmdPalLogger.cs
@@ -0,0 +1,167 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using ManagedCommon;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.CommandPalette.UI.Services;
+
+// Adapter implementing Microsoft.Extensions.Logging.ILogger,
+// delegating to ManagedCommon.Logger.
+internal sealed partial class CmdPalLogger : ILogger
+{
+ private static readonly AsyncLocal> _scopeStack = new();
+ private readonly LogLevel _minLevel;
+
+ public string CurrentVersionLogDirectoryPath => Logger.CurrentVersionLogDirectoryPath;
+
+ public CmdPalLogger(LogLevel minLevel = LogLevel.Information)
+ {
+ _minLevel = minLevel;
+
+ // Ensure underlying logger initialized (idempotent if already done elsewhere).
+ Logger.InitializeLogger("\\CmdPal\\Logs\\");
+ }
+
+ public bool IsEnabled(LogLevel logLevel) => logLevel != LogLevel.None && logLevel >= _minLevel;
+
+ public IDisposable? BeginScope(TState state)
+ where TState : notnull
+ {
+ var stack = _scopeStack.Value;
+ if (stack is null)
+ {
+ stack = new Stack