Extracted ChatMessageManager from MainWindow — message storage, formatting, and mutation logic now in a dedicated class, reducing MainWindow complexity
Extracted ConnectionManager from AppOrchestrator — connection lifecycle, authentication, SignalR event wiring, and channel tracking now in a dedicated service
Extracted AvatarHelper — deduplicated avatar upload logic previously duplicated in /avatar command and profile edit dialog
Consolidated ProfileEditDialog.ParseHexToTrueColor into shared ColorHelper.ParseHexToColor
Extracted UserSession — session state (Username, Status, StatusMessage) now in a dedicated class instead of scattered fields
Replaced 21 inline command handler lambdas with named HandleCmd* methods for improved readability
Extracted shared CleanupConnectionAsync to deduplicate disconnect/logout cleanup logic
Reorganized flat UI/ folder (19 files) into subfolders: Chat/, Dialogs/, ListSources/, Helpers/ with matching namespaces
Moved AsyncRunner from project root to Services/ with updated namespace
Renamed ColorHelper → HexColorHelper to avoid namespace collision with Terminal.Gui's ColorHelper NuGet dependency
Moved hue_icon.ico to Client/Assets/, removed duplicate from Server (Server now references shared icon via relative path)
Add hex color parsing helper and implement custom list sources for channels and users
Add dialogs for connection, channel creation, profile editing, and status management
Infrastructure
Release workflow: use --notes-file instead of inline --notes interpolation to prevent shell expansion of special characters in commit messages