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
50 lines
1.5 KiB
C#
50 lines
1.5 KiB
C#
using Luna.Channels.Abstractions;
|
|
using Luna.Channels.Cli;
|
|
using Luna.Channels.Web;
|
|
using Luna.Core.Abstractions;
|
|
using Luna.Shared;
|
|
using Microsoft.AspNetCore.SignalR;
|
|
|
|
namespace Luna.Core.Hubs;
|
|
|
|
public class ChatHub(IChannelManager channelManager, IChatHubContext hubContext) : Hub
|
|
{
|
|
public override Task OnConnectedAsync()
|
|
{
|
|
var clientType = Context.GetHttpContext()?.Request.Query["clientType"].ToString();
|
|
|
|
IChannel channel = clientType switch
|
|
{
|
|
"web" => new WebChannel(Context.ConnectionId, hubContext),
|
|
_ => new CliChannel(Context.ConnectionId, hubContext)
|
|
};
|
|
|
|
channelManager.RegisterChannel(channel);
|
|
return base.OnConnectedAsync();
|
|
}
|
|
|
|
public override Task OnDisconnectedAsync(Exception? exception)
|
|
{
|
|
channelManager.UnregisterChannel(Context.ConnectionId);
|
|
return base.OnDisconnectedAsync(exception);
|
|
}
|
|
|
|
public void OnMessageReceived(ChannelMessage message)
|
|
{
|
|
var channel = channelManager.GetChannel(Context.ConnectionId);
|
|
|
|
switch (channel)
|
|
{
|
|
case CliChannel cli:
|
|
cli.RaiseMessageReceived(this, message);
|
|
break;
|
|
case WebChannel web:
|
|
web.RaiseMessageReceived(this, message);
|
|
break;
|
|
default:
|
|
throw new InvalidOperationException(
|
|
$"ChannelManager returned channel of unexpected type: {channel?.GetType().Name ?? "null"}");
|
|
}
|
|
}
|
|
}
|