Add Luna.Core server with SignalR hub, session management, and tool system

Implement the core application server as an ASP.NET web host with:
- SignalR ChatHub for real-time client communication
- Session management with token estimation for context windowing
- Extensible tool system with attribute-based tool discovery
- Chat stream update builder for streaming AI responses
- App configuration with appsettings for development and production
This commit is contained in:
2026-04-04 04:10:58 +02:00
parent 29eb3851c9
commit 2f5841a1b9
23 changed files with 586 additions and 0 deletions
@@ -0,0 +1,29 @@
using Luna.Shared;
using Microsoft.Extensions.AI;
namespace Luna.Core.Services;
public class ChatStreamUpdateBuilder : IChatStreamUpdateBuilder
{
public ChatStreamUpdate FromAiContent(AIContent content, string messageId)
=> content switch
{
TextReasoningContent reasoning
=> new ChatStreamUpdate(ChatStreamUpdateType.Text, reasoning.Text, "assistant", false, messageId),
TextContent text
=> new ChatStreamUpdate(ChatStreamUpdateType.Text, text.Text, "assistant", false, messageId),
ToolCallContent toolCall
=> new ChatStreamUpdate(ChatStreamUpdateType.ToolCall, toolCall.ToString(), "assistant", false, messageId),
ToolResultContent toolResult
=> new ChatStreamUpdate(ChatStreamUpdateType.ToolResult, toolResult.ToString(), "assistant", false, messageId),
UsageContent usage
=> new ChatStreamUpdate(ChatStreamUpdateType.Usage, usage.ToString(), "system", false, messageId),
_ => throw new NotSupportedException($"Unsupported content type: {content.GetType().Name}")
};
public ChatStreamUpdate FromString(string content, string messageId)
=> new(ChatStreamUpdateType.Text, content, "assistant", false, messageId);
public ChatStreamUpdate CreateCompleteUpdate(string messageId)
=> new(ChatStreamUpdateType.Complete, null, null, true, messageId);
}
@@ -0,0 +1,21 @@
using Luna.Configuration.Extensions;
using Luna.Core.Abstractions;
using Luna.Core.Session;
namespace Luna.Core.Services.Extensions;
public static class ServiceCollectionExtensions
{
extension(IServiceCollection services)
{
public IServiceCollection AddSessionManager()
{
services.AddTransient<IChatStreamUpdateBuilder, ChatStreamUpdateBuilder>();
services.AddSessionOptions();
services.AddSingleton<ISessionManager, SessionManager>();
return services;
}
}
}
@@ -0,0 +1,11 @@
using Luna.Shared;
using Microsoft.Extensions.AI;
namespace Luna.Core.Services;
public interface IChatStreamUpdateBuilder
{
ChatStreamUpdate FromAiContent(AIContent content, string messageId);
ChatStreamUpdate FromString(string content, string messageId);
ChatStreamUpdate CreateCompleteUpdate(string messageId);
}