Releases: mdesalvo/Morgana
v0.17.0
🔄 Changed
PluginLoaderServicenow follows directories-to-scan paradigm instead of assemblies-to-scan. Morgana gains a true plugin system!- Updated
Akka.NETdependency to 1.5.60
🐛 Fixed
- Arguments of
SummarizingChatReducerinSummarizingChatReducerService.CreateReducerwere swapped - Conversation history is now fully preserved after refresh: reducer applies only to LLM view, never to the storage
🚀 What this unlocks
- Extensibility: Foundation for industrial evolution of the plugin system (e.g:
MorganaLLMmay also be plugged)
📝 For full details, see the CHANGELOG:
https://github.com/mdesalvo/Morgana/blob/main/CHANGELOG.md
v0.16.0
🎯 Major Feature: Rich Card System for Structured Data Visualization
This release introduces Rich Cards, a compositional visual presentation system that complements Quick Replies by transforming unstructured tool outputs into scannable, elegantly organized visual cards. LLMs can now construct sophisticated data presentations using 8 semantic building blocks (text_block, key_value, divider, list, section, grid, badge, image) instead of overwhelming users with walls of text.
✨ Highlights
SetRichCard System Tool
- New LLM-callable system tool
SetRichCardfor creating structured visual cards from tool outputs - Compositional design: 8 basic component types combine like LEGO blocks to create complex layouts
- Component dictionary: text_block (narrative), key_value (labeled data), divider (separation), list (enumeration), section (nestable grouping), grid (multi-column), badge (status indicators), image (multimedia)
Rich Card Architecture
- Backend: Complete type hierarchy with
JsonPolymorphicserialization for 8 component types - Frontend: 9 Razor components (RichCard.razor dispatcher + 8 type-specific renderers)
🔄 Changed
🐛 Fixed
🚀 What this unlocks
- Tool output standardization - Rich Cards establish a pattern for tool developers: return structured JSON, let LLM handle presentation through SetRichCard, separating data retrieval from visualization concerns
- Advanced visualizations - Foundation for future component types (charts, timelines, progress indicators, interactive forms) while maintaining compositional architecture
- Cross-agent consistency - All agents now present complex data using same visual language, creating cohesive UX across domain boundaries (billing, contracts, support tickets, analytics)
📝 For full details, see the CHANGELOG:
https://github.com/mdesalvo/Morgana/blob/main/CHANGELOG.md
v0.15.0
🎯 Major Feature: Intelligent Context Window Management
This release introduces automatic conversation history management through LLM-based summarization, dramatically reducing token costs (60%+ savings) for long conversations while maintaining complete transparency for users and seamless agent handoffs through incremental summary generation.
✨ Highlights
Context Window Management via SummarizingChatReducer
- Built on Microsoft's default
SummarizingChatReducerfromMicrosoft.Extensions.AI - Automatic conversation summarization when message count exceeds configurable threshold (default: 20 messages)
- Intelligent message preservation: never splits tool call sequences, always cuts at user message boundaries
- Incremental summarization: new summaries incorporate previous summaries (no information drift)
- Full transparency: UI and persistence always show complete history (reduction only affects LLM context)
- Customizable summarization prompts for domain-specific data preservation (invoice numbers, customer IDs, etc.)
Enhanced MorganaChatHistoryProvider
- Reducer applies before LLM receives messages (immediate cost savings)
- Full history always stored in
InMemoryChatHistoryProvider(reducer never modifies storage)
Configuration Section: HistoryReducer
{
"Morgana": {
"HistoryReducer": {
"Enabled": true,
"SummarizationThreshold": 20,
"SummarizationTargetCount": 8,
"SummarizationPrompt": "Generate a concise summary in 3-4 sentences. ALWAYS preserve: user IDs..."
}
}
}🔄 Changed
- Updated
Microsoft.Agents.AIdependency to 1.0.0-preview.260205.1 (BREAKING CHANGES:AIAgent.GetNewSessionAsync->AIAgent.CreateSessionAsync,AgentSession.Serialize->AIAgent.SerializeSession) - Updated
ModelContextProtocol.Coredependency to 0.8.0-preview.1
🐛 Fixed
🚀 What this unlocks
- Production cost predictability - 60%+ token reduction enables sustainable deployment of long-running customer service conversations without budget concerns, transforming Morgana from prototype to production-ready platform
- Enhanced domain customization - Custom
IChatReducerimplementations can add business-specific summarization strategies (e.g., always preserve compliance data, legal citations, or audit trails) while maintaining Microsoft's proven architecture - Token budget enforcement - Foundation for implementing
ITokenBudgetServiceto track cumulative token usage per user/day, enabling tiered pricing models and fine-grained cost control beyond message-based rate limiting
📝 For full details, see the CHANGELOG:
https://github.com/mdesalvo/Morgana/blob/main/CHANGELOG.md
v0.14.0
🎯 Major Feature: Real-Time Streaming Responses
This release introduces native streaming response delivery, providing immediate visual feedback and progressive content rendering with generative AI typewriter effects, dramatically improving perceived responsiveness and user engagement.
✨ Highlights
Streaming Response Architecture
- End-to-end streaming pipeline from LLM to UI using
Microsoft.Agents.AI.RunStreamingAsync() - Progressive chunk delivery through Akka.NET actor system using
Tell-based message passing - Real-time SignalR bridge for streaming chunks:
SendStreamChunkAsync()method - Frontend typewriter effect (fine-tuneable via
appsettings.json)
Enhanced Typing Indicator
- Replaced bouncing dots with animated sparkle stars (✨ theme)
- SVG-based stars with pulse, rotation and glow effects
- Color-coded indicators:
- Violet stars (primary color) for base Morgana agent
- Pink stars (secondary color) for specialized agents
🔄 Changed
🐛 Fixed
🚀 What this unlocks
- Token-level analytics and optimization - Streaming architecture enables precise measurement of time-to-first-token (TTFT) and tokens-per-second (TPS) metrics, unlocking data-driven LLM provider selection and cost-per-performance optimization
- Progressive UI enhancements - Platform for implementing streaming citations, dynamic content formatting (code blocks, tables), and live preview rendering as structured content arrives from LLMs
📝 For full details, see the CHANGELOG:
https://github.com/mdesalvo/Morgana/blob/main/CHANGELOG.md
v0.13.0
🎯 Major Feature: Conversation Rate Limiting Protection
This release introduces intelligent conversation rate limiting, protecting Morgana from excessive usage and token consumption while maintaining excellent user experience through configurable limits, graceful degradation, and user-friendly feedback.
✨ Highlights
IRateLimitService
- Abstraction for pluggable rate limiting strategies (in-memory, Redis, distributed, ...)
- Sliding window algorithm for accurate request counting over time periods
- Support for multiple concurrent limits: per-minute, per-hour, per-day
SQLiteRateLimitService
- Sliding window implementation: counts requests in last N seconds/hours/days
- Automatic cleanup of expired records (>24 hours old) to prevent database bloat
Rate Limiting Configuration
"Morgana": {
"RateLimiting": {
"MaxMessagesPerMinute": 5,
"MaxMessagesPerHour": 30,
"MaxMessagesPerDay": 100
}
}🔄 Changed
- Standardized failure handling across all actors using
Records.FailureContextwrapper for consistent error routing - Unified error and warning handling in Cauldron: all runtime errors and system warnings now use auto-dismissing
FadingMessagecomponent with severity-appropriate durations, replacing scattered error banner implementations - Updated
Microsoft.Agents.AIdependency to 1.0.0-preview.260128.1 (BREAKING CHANGES:AgentThread->AgentSession) - Updated
ModelContextProtocol.Coredependency to 0.7.0-preview.1
🐛 Fixed
- Certain LLM providers (like OpenAI) generate response messages with Unix timestamps (without milliseconds component)
- Fixed dead letter issues in actor error handling by implementing unified
FailureContextpattern to preserve sender references - Fixed residual dead letter in
ConversationManagerActorwhich still responded to conversation creation or resume
🚀 What this unlocks
- Operational cost control and budget predictability - Direct protection against uncontrolled token and API resource consumption, enabling production deployment of Morgana with predictable and sustainable costs, even with large user bases
- Tiered monetization and premium models - Foundation for your commercial strategies based on usage limits (e.g: freemium with basic thresholds, premium tiers with higher limits, enterprise with custom quotas), transforming rate limiting from pure cost protection into a revenue driver
📝 For full details, see the CHANGELOG:
https://github.com/mdesalvo/Morgana/blob/main/CHANGELOG.md
v0.12.1
🎯 Major Feature: Production-Ready Docker Deployment
This release introduces complete Docker containerization of both Morgana (backend) and Cauldron (frontend), enabling single-command deployment, reproducible builds, and seamless distribution via Docker Hub with automated CI/CD pipelines.
✨ Highlights
Docker Multi-Stage Builds
Morgana.Dockerfile: Optimized 3-stage build (SDK → Publish → Runtime) for backend containerizationCauldron.Dockerfile: Optimized 3-stage build (SDK → Publish → Runtime) for frontend containerization- Multi-platform support:
linux/amd64andlinux/arm64(Apple Silicon, Raspberry Pi) - Layer caching optimized for faster rebuilds (dependencies cached separately from source code)
- Runtime images based on
mcr.microsoft.com/dotnet/aspnet:10.0(~200MB final size)
Docker Compose Orchestration
docker-compose.yml: Single-file orchestration for Morgana + Cauldron with dedicated bridge network- Automatic service dependency management (Cauldron waits for Morgana startup)
- Persistent volume for SQLite conversation databases (
morgana-data) - Environment-based configuration via
.envfile (secrets externalized from images)
Automated Versioning from Single Source of Truth
Directory.Build.targets: MSBuild integration for automatic.env.versionsgeneration during build- Extracts versions from
Directory.Build.propsvia XmlPeek and populatesMORGANA_VERSION/CAULDRON_VERSION - Eliminates manual version management across Docker files (ARG-based propagation)
- OCI-compliant image labels with dynamic version injection (
org.opencontainers.image.version)
GitHub Actions CI/CD Pipeline
.github/workflows/docker-publish.yml: Fully automated build and publish workflow- Triggered when publishing a GitHub Release (GitHub creates the version tag at publication time)
- Version extraction directly from
Directory.Build.props(single source of truth validation) - Multi-platform image builds with Docker Buildx
- Automated push to Docker Hub:
mdesalvo/morgana:X.Y.Zandmdesalvo/cauldron:X.Y.Z - Workflow validates successful publication and build completion
Security & Configuration
- Secrets externalized via environment variables (no hardcoded API keys in images)
- AES-256 encryption key generation documented (OpenSSL/PowerShell commands)
- LLM provider configuration: Anthropic Claude or Azure OpenAI (runtime-switchable)
- Network isolation: Dedicated Docker bridge network for internal service communication
🔄 Changed
🐛 Fixed
🚀 What this unlocks:
- Docker Hub distribution: Public images available at
mdesalvo/morganaandmdesalvo/cauldron - Cloud deployment readiness: Azure Container Instances, AWS ECS, Google Cloud Run
- CI/CD integration: Automated testing, security scanning, and deployment pipelines
📝 For full details, see the CHANGELOG:
https://github.com/mdesalvo/Morgana/blob/main/CHANGELOG.md
v0.11.0
🎯 Major Feature: Multi-Agent Conversation History
This release introduces virtual unified conversation timeline, enabling Cauldron to display the complete chronological message flow across all agents by reconciling agent-isolated storage at startup.
✨ Highlights
IConversationHistoryService
- HTTP-based abstraction for retrieving complete conversation history from Morgana
MorganaConversationHistoryService
- Default implementation calling
GET /api/conversation/{conversationId}/historyMorgana endpoint - Enables magical loader to remain active until history is fully populated
ConversationController: GetConversationHistory Endpoint
- New REST endpoint:
GET /api/conversation/{conversationId}/history - Delegates to
IConversationPersistenceService.GetConversationHistoryAsync()for data retrieval
SqliteConversationPersistenceService: History Reconciliation
GetConversationHistoryAsync(conversationId)method for cross-agent message reconstruction- Decrypts and deserializes
AgentThreadBLOBs from each agent's SQLite row
Cauldron: Conversation Resume Flow
Index.razorenhanced with automatic history loading on conversation resume
🔄 Changed
- Updated
Microsoft.Agents.AIdependency to 1.0.0-preview.260121.1 - Enhanced
MorganaAIContextProviderto handle context data as thread-safe and immutable collections
🐛 Fixed
- User messages were sent to the agent's thread without timestamp
- Concurrent agent responses were displayed out of order due to processing time differences
🚀 What this unlocks:
- Cross-session continuity for users returning to active conversations
- Multi-device sync potential (history accessible from any client with valid
conversationId)
📝 For full details, see the CHANGELOG:
https://github.com/mdesalvo/Morgana/blob/main/CHANGELOG.md
v0.10.0
🎯 Major Feature: Conversation Persistence
This release introduces persistent conversation storage, enabling Morgana to resume conversations across application restarts while maintaining full context and message history.
✨ Highlights
IConversationPersistenceService
- Abstraction for pluggable persistence strategies (SQLite, PostgreSQL, SQL Server, etc.)
SaveConversationAsync()andLoadConversationAsync()for AgentThread serialization/deserialization- Full integration with Microsoft.Agents.AI framework for automatic state management (context + messages)
SqliteConversationPersistenceService
- Default implementation storing conversations in SQLite databases
- One database per conversation:
morgana-{conversationId}.db - Table schema with agent-specific rows containing encrypted AgentThread BLOBs
MorganaAgent Persistence Integration
- Automatic thread loading on first agent invocation via
LoadConversationAsync() - Automatic thread saving after each turn via
SaveConversationAsync() - Seamless serialization of both ChatMessageStore (conversation history) and AIContextProvider (context variables)
- Each agent maintains isolated thread storage per conversation
🔄 Changed
- AgentName is now contextualized to color scheme of the current agent for better usabilty (instead of white)
- Status of SignalR connection is now green or red for better usabilty (instead of white)
- Refactored RouterActor from eager to lazy agent creation (Akka.NET best practice for hierarchical actor systems)
🐛 Fixed
🚀 What this unlocks:
- Enterprise-grade persistence with any server or cloud solution by implementing custom
IConversationPersistenceService - Conversation analytics and auditing through database queries
📝 For full details, see the CHANGELOG:
https://github.com/mdesalvo/Morgana/blob/main/CHANGELOG.md
v0.9.0
🎯 Major Feature: ConversationClosure Policy
This release introduces a new critical global policy ConversationClosure exploiting quick replies to give the user explicit control over whether to continue with the current agent or return to Morgana.
🎯 Major Feature: QuickReplyEscapeOptions Policy
This release introduces a new critical global policy QuickReplyEscapeOptions enriching quick replies coming from tools with 2 additional options letting the user decide whether to continue with the current agent by asking something else or return to Morgana.
🎯 Major Feature: ToolGrounding Policy
This release introduces a new critical global policy ToolGrounding enforcing quick replies emission rules to be tied to effective agent's capabilities.
✨ Highlights
ConversationClosure
- When LLM decides to not emit #INT# token for conversation continuation, it is now instructed to generate a soft-continuation set of quick replies engaging the user in the choice of staying in the active conversation with the agent or exiting to Morgana. This should significantly drop occurrence of unexpected agent exits.
QuickReplyEscapeOptions
- When LLM generates quick replies coming from tool's analysis, it is now instructed to include 2 additional entries to give the user the chance to continue the active conversation with the agent by asking something more or returning back to Morgana. The last one has a primary color scheme indicating Morgana. This should enhance usability of quick replies by offering an early exit-strategy to change the active agent.
ToolGrounding
- When LLM generates quick replies coming from tool's analysis, it is now instructed to not invent capabilities or support paths which are not expressely encoded in the tools. This should reduce the surface of AI hallucinations which could lead before to unpredictable conversation paths.
🔄 Changed
- Supervisor now works more strictly with Guard, ensuring every user message is checked for language safety and policy compliance
🐛 Fixed
Index.razorwas not rendering quick replies viaQuickReplyButtoncomponent- Global policy "InteractiveToken" should have Type="Critical"
🚀 What this unlocks:
- LLM access now trigger before/after hooks, which enables initiatives like context injection and token analysis
- Termination of an agent's conversation can now be given a custom LLM-driven behavior (e.g: triggering a NPS)
- Morgana has become a language-safe and policy-compliant conversational environment
📝 For full details, see the CHANGELOG:
https://github.com/mdesalvo/Morgana/blob/master/CHANGELOG.md
v0.8.2
🐛 Fixed
- FSM behavior of supervisor caused unregistration of timeout handler, leading to dead-letters at timeout
- Typing bubble color was always tied to color scheme of "Morgana" agent
- Textarea border color was always tied to color scheme of "Morgana" agent
- Send button color was always tied to color scheme of "Morgana" agent
📝 For full details, see the CHANGELOG:
https://github.com/mdesalvo/Morgana/blob/master/CHANGELOG.md