Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
e751bc4
feat: profiling wizard UI, integrated --dsrouter, and pipeline model
Redth Mar 9, 2026
c74dda0
Change profiling artifact output dirs from GUIDs to project-name/date…
Redth Mar 9, 2026
32f32ed
feat: pipeline runner service, capture & results step UI
Redth Mar 9, 2026
a93f214
fix: register IProfilingSessionRunner in macOS DI, change IProcessExe…
Redth Mar 9, 2026
aad1e73
Fix dsrouter conflict: use standalone dsrouter when both trace+gcdump…
Redth Mar 9, 2026
d4d0fe5
Fix IPC socket path too long for macOS domain sockets
Redth Mar 9, 2026
9ef2ef6
Fix diagnostic-port to use connect mode for standalone dsrouter
Redth Mar 10, 2026
094c1cb
Set ANDROID_SERIAL env var for dsrouter device targeting
Redth Mar 10, 2026
450345b
Add auto-scroll to pipeline log output and fix app launch hang
Redth Mar 10, 2026
3bde068
Fix stop capture to cleanly shut down and show results
Redth Mar 10, 2026
f0f34e1
Convert profiling sample to native MAUI with Blazor fallback
Redth Mar 10, 2026
acc1864
Fix artifact discovery: remove speedscope format, fix path nesting
Redth Mar 10, 2026
a7ad162
Fix artifact paths and add per-step log files
Redth Mar 10, 2026
1688de5
Fix artifact flush: wait for process exit after SIGINT
Redth Mar 10, 2026
749af8e
Fix process shutdown: let SIGINT'd processes exit naturally
Redth Mar 10, 2026
0c0a9df
Fix Android profiling: use AndroidEnableProfiler and adb setprop
Redth Mar 10, 2026
5413778
Fix Stop Capture button visibility during active recording
Redth Mar 10, 2026
63d3021
Add profiling results visualization: speedscope viewer, GC dump table…
Redth Mar 10, 2026
9e0d39e
Add profiling session library: persistent sessions, session list UI, …
Redth Mar 10, 2026
6f9e853
Extract profiling wizard steps 0-4 into modal dialog
Redth Mar 10, 2026
3b4f558
Fix stray closing brace rendered on profiling session list page
Redth Mar 10, 2026
3d5bb4c
Fix 10 profiling UI polish issues
Redth Mar 10, 2026
aca2624
Split artifacts into profiling and log file sections
Redth Mar 10, 2026
675324c
Reorganize wizard: move Scenario & Suspend to Capture Kinds step
Redth Mar 10, 2026
35dce8e
Remove inline New Profiling Session button and reduce wizard padding
Redth Mar 10, 2026
3e91b43
Remove scenario summary from Target step
Redth Mar 10, 2026
6e9cf7c
Polish wizard: compact prerequisites, plan summary, and commands
Redth Mar 10, 2026
292f784
Simplify expected artifacts to flat inline list
Redth Mar 10, 2026
6a7e393
Show managed session storage path in plan preview
Redth Mar 10, 2026
ab53792
Wrap output directory path on its own line in capture plan
Redth Mar 10, 2026
c610ce7
Flatten nested panel cards across all wizard steps
Redth Mar 10, 2026
70eb4ad
Fix input/select background to contrast with dialog
Redth Mar 10, 2026
b92ce2e
Fix section header background and remove unused panel CSS
Redth Mar 10, 2026
5cf1d49
Show section headers with inline loading on Review & Plan step
Redth Mar 10, 2026
b7c43b6
Hide section header badges while loading
Redth Mar 10, 2026
5e73572
Simplify prerequisites to chips + chevron toggle
Redth Mar 10, 2026
0b144ed
Redesign capture plan: squircle card, artifact chips, unified command…
Redth Mar 10, 2026
1e8efda
Stop duplicating prerequisite warnings in capture plan
Redth Mar 10, 2026
ae9661f
Reduce input/select and Browse button sizing in wizard
Redth Mar 10, 2026
fd47cdd
Move Stop Capture and Cancel to native footer buttons
Redth Mar 10, 2026
c554429
Fix trace files going to wrong directory
Redth Mar 10, 2026
6f951e9
Compact artifact list: rows with inline actions
Redth Mar 10, 2026
0bb2cd7
Fix Stop Capture closing modal before session is saved
Redth Mar 10, 2026
a803ab8
Fix GC dump running before app is ready
Redth Mar 10, 2026
8cb7d8a
Open artifact viewers in separate windows
Redth Mar 10, 2026
ddb39fa
Fix GC dump deadlock: add ReadyOutputPattern to dsrouter step
Redth Mar 10, 2026
139a619
Make GC dump on-demand instead of automatic pipeline step
Redth Mar 10, 2026
0257ad3
Add macOS AppKit implementation for ShowInputDialogAsync
Redth Mar 10, 2026
42a5ded
Fix cloud keystore deletion silently failing
Redth Mar 10, 2026
b5c9b5b
Fix cloud keystore delete using wrong alias for names with underscores
Redth Mar 10, 2026
0db3813
Enable MauiDevFlow profiling in sample app
Redth Mar 10, 2026
e4ac6a3
Require MauiDevFlow 0.20.0 for profiling, show version message
Redth Mar 11, 2026
d600c92
Fix dotnet-trace to capture useful CPU sampling data for speedscope
Redth Mar 11, 2026
ee56052
Fix dotnet-trace profile: use dotnet-sampled-thread-time (cross-platf…
Redth Mar 11, 2026
5942c42
Remove --format Speedscope from dotnet-trace collect
Redth Mar 11, 2026
5222f2b
Make trace on-demand with Start/Stop buttons alongside GC Dump
Redth Mar 11, 2026
8f7a3d5
Fix session artifacts, speedscope loading, and nettrace View button
Redth Mar 11, 2026
772649a
Fix speedscope and gcdump viewer content loading
Redth Mar 11, 2026
3e1948f
Fix speedscope viewer: force hash before bundle init + localStorage f…
Redth Mar 11, 2026
c081eb7
Show platform-specific native memory labels from MauiDevFlow
Redth Mar 11, 2026
d04319a
Add Platform Features tab to MauiDevFlow inspector
Redth Mar 11, 2026
c3e6702
Fix platform tab: permissions parsing, error display, battery N/A
Redth Mar 11, 2026
2f52f50
Upgrade MauiDevFlow NuGet packages to 0.23.0
Redth Mar 11, 2026
4b862f1
Fix sensor reading display: match actual property names from agent
Redth Mar 11, 2026
9dcbbab
Improve platform tab error handling: user-friendly messages and warni…
Redth Mar 11, 2026
cb0f713
Support multiple concurrent sensor streams and add Stop All button
Redth Mar 11, 2026
7f2deef
Move sensor readings inline into card row
Redth Mar 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions MauiSherpa.sln
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MauiSherpa.LinuxGtk", "src\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MauiSherpa.Cli", "src\MauiSherpa.Cli\MauiSherpa.Cli.csproj", "{5BD8CEB8-EC58-47DE-9C52-1E0BB078B268}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MauiSherpa.ProfilingSample", "src\MauiSherpa.ProfilingSample\MauiSherpa.ProfilingSample.csproj", "{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -129,6 +131,18 @@ Global
{5BD8CEB8-EC58-47DE-9C52-1E0BB078B268}.Release|x64.Build.0 = Release|Any CPU
{5BD8CEB8-EC58-47DE-9C52-1E0BB078B268}.Release|x86.ActiveCfg = Release|Any CPU
{5BD8CEB8-EC58-47DE-9C52-1E0BB078B268}.Release|x86.Build.0 = Release|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Debug|x64.ActiveCfg = Debug|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Debug|x64.Build.0 = Debug|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Debug|x86.ActiveCfg = Debug|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Debug|x86.Build.0 = Debug|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Release|Any CPU.Build.0 = Release|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Release|x64.ActiveCfg = Release|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Release|x64.Build.0 = Release|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Release|x86.ActiveCfg = Release|Any CPU
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -142,5 +156,6 @@ Global
{7F4B08C8-EC1E-4C00-9F0E-6CFF4169F36B} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{985FC27D-16D3-4858-9F6C-4F8E1B76893F} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{5BD8CEB8-EC58-47DE-9C52-1E0BB078B268} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{465A3EFF-F52C-42AB-A4FE-3C6C7600DE9A} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using MauiSherpa.Core.Interfaces;
using MauiSherpa.Core.Models.Profiling;
using MauiSherpa.Core.Requests.Profiling;
using Shiny.Mediator;

namespace MauiSherpa.Core.Handlers.Profiling;

public partial class AnalyzeProfilingArtifactHandler : IRequestHandler<AnalyzeProfilingArtifactRequest, ProfilingArtifactAnalysisResult>
{
private readonly IProfilingArtifactAnalysisService _profilingArtifactAnalysisService;

public AnalyzeProfilingArtifactHandler(IProfilingArtifactAnalysisService profilingArtifactAnalysisService)
{
_profilingArtifactAnalysisService = profilingArtifactAnalysisService;
}

public async Task<ProfilingArtifactAnalysisResult> Handle(
AnalyzeProfilingArtifactRequest request,
IMediatorContext context,
CancellationToken ct)
{
return await _profilingArtifactAnalysisService.AnalyzeArtifactAsync(request.ArtifactId, ct);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using MauiSherpa.Core.Interfaces;
using MauiSherpa.Core.Models.Profiling;
using MauiSherpa.Core.Requests.Profiling;
using Shiny.Mediator;
using Shiny.Mediator.Caching;

namespace MauiSherpa.Core.Handlers.Profiling;

/// <summary>
/// Handler for retrieving platform-specific profiling capabilities with medium-lived caching.
/// </summary>
public partial class GetProfilingCapabilitiesHandler : IRequestHandler<GetProfilingCapabilitiesRequest, ProfilingPlatformCapabilities>
{
private readonly IProfilingCatalogService _profilingCatalogService;

public GetProfilingCapabilitiesHandler(IProfilingCatalogService profilingCatalogService)
{
_profilingCatalogService = profilingCatalogService;
}

[Cache(AbsoluteExpirationSeconds = 300)]
[OfflineAvailable]
public async Task<ProfilingPlatformCapabilities> Handle(
GetProfilingCapabilitiesRequest request,
IMediatorContext context,
CancellationToken ct)
{
return await _profilingCatalogService.GetCapabilitiesAsync(request.Platform, ct);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using MauiSherpa.Core.Interfaces;
using MauiSherpa.Core.Models.Profiling;
using MauiSherpa.Core.Requests.Profiling;
using Shiny.Mediator;
using Shiny.Mediator.Caching;

namespace MauiSherpa.Core.Handlers.Profiling;

/// <summary>
/// Handler for retrieving the built-in profiling catalog with medium-lived caching.
/// </summary>
public partial class GetProfilingCatalogHandler : IRequestHandler<GetProfilingCatalogRequest, ProfilingCatalog>
{
private readonly IProfilingCatalogService _profilingCatalogService;

public GetProfilingCatalogHandler(IProfilingCatalogService profilingCatalogService)
{
_profilingCatalogService = profilingCatalogService;
}

[Cache(AbsoluteExpirationSeconds = 300)]
[OfflineAvailable]
public async Task<ProfilingCatalog> Handle(
GetProfilingCatalogRequest request,
IMediatorContext context,
CancellationToken ct)
{
return await _profilingCatalogService.GetCatalogAsync(ct);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using MauiSherpa.Core.Interfaces;
using MauiSherpa.Core.Models.Profiling;
using MauiSherpa.Core.Requests.Profiling;
using Shiny.Mediator;
using Shiny.Mediator.Caching;

namespace MauiSherpa.Core.Handlers.Profiling;

public partial class GetProfilingPrerequisitesHandler : IRequestHandler<GetProfilingPrerequisitesRequest, ProfilingPrerequisiteReport>
{
private readonly IProfilingPrerequisitesService _profilingPrerequisitesService;

public GetProfilingPrerequisitesHandler(IProfilingPrerequisitesService profilingPrerequisitesService)
{
_profilingPrerequisitesService = profilingPrerequisitesService;
}

[Cache(AbsoluteExpirationSeconds = 120)]
[OfflineAvailable]
public async Task<ProfilingPrerequisiteReport> Handle(
GetProfilingPrerequisitesRequest request,
IMediatorContext context,
CancellationToken ct)
{
return await _profilingPrerequisitesService.GetPrerequisitesAsync(
request.Platform,
request.CaptureKinds,
ct: ct);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using MauiSherpa.Core.Interfaces;
using MauiSherpa.Core.Models.Profiling;
using MauiSherpa.Core.Requests.Profiling;
using Shiny.Mediator;

namespace MauiSherpa.Core.Handlers.Profiling;

/// <summary>
/// Handler for building validation-friendly profiling capture command plans.
/// </summary>
public partial class PlanProfilingCaptureHandler : IRequestHandler<PlanProfilingCaptureRequest, ProfilingCapturePlan>
{
private readonly IProfilingCaptureOrchestrationService _profilingCaptureOrchestrationService;

public PlanProfilingCaptureHandler(IProfilingCaptureOrchestrationService profilingCaptureOrchestrationService)
{
_profilingCaptureOrchestrationService = profilingCaptureOrchestrationService;
}

public async Task<ProfilingCapturePlan> Handle(
PlanProfilingCaptureRequest request,
IMediatorContext context,
CancellationToken ct)
{
return await _profilingCaptureOrchestrationService.PlanCaptureAsync(request.Definition, request.Options, ct);
}
}
Loading
Loading