diff options
Diffstat (limited to 'src/Agent.Core/Sessions')
| -rw-r--r-- | src/Agent.Core/Sessions/AgentSession.cs | 26 | ||||
| -rw-r--r-- | src/Agent.Core/Sessions/ConversationMessage.cs | 3 | ||||
| -rw-r--r-- | src/Agent.Core/Sessions/SessionStore.cs | 19 |
3 files changed, 48 insertions, 0 deletions
diff --git a/src/Agent.Core/Sessions/AgentSession.cs b/src/Agent.Core/Sessions/AgentSession.cs new file mode 100644 index 0000000..d561c8d --- /dev/null +++ b/src/Agent.Core/Sessions/AgentSession.cs @@ -0,0 +1,26 @@ +namespace Agent.Core.Sessions; + +public sealed class AgentSession(Guid sessionId) +{ + private readonly object _sync = new(); + private readonly List<ConversationMessage> _conversation = []; + + public Guid SessionId { get; } = sessionId; + public DateTimeOffset CreatedAt { get; } = DateTimeOffset.UtcNow; + public DateTimeOffset LastAccessAt { get; private set; } = DateTimeOffset.UtcNow; + + public IReadOnlyList<ConversationMessage> Conversation + { + get { lock (_sync) return _conversation.ToArray(); } + } + + public void Append(ConversationMessage message) + { + ArgumentNullException.ThrowIfNull(message); + lock (_sync) + { + _conversation.Add(message); + LastAccessAt = DateTimeOffset.UtcNow; + } + } +} diff --git a/src/Agent.Core/Sessions/ConversationMessage.cs b/src/Agent.Core/Sessions/ConversationMessage.cs new file mode 100644 index 0000000..9d48747 --- /dev/null +++ b/src/Agent.Core/Sessions/ConversationMessage.cs @@ -0,0 +1,3 @@ +namespace Agent.Core.Sessions; + +public sealed record ConversationMessage(string Role, string Content); diff --git a/src/Agent.Core/Sessions/SessionStore.cs b/src/Agent.Core/Sessions/SessionStore.cs new file mode 100644 index 0000000..59ea02c --- /dev/null +++ b/src/Agent.Core/Sessions/SessionStore.cs @@ -0,0 +1,19 @@ +using System.Collections.Concurrent; + +namespace Agent.Core.Sessions; + +public sealed class SessionStore +{ + private readonly ConcurrentDictionary<Guid, AgentSession> _sessions = new(); + + public AgentSession Create() + { + while (true) + { + var session = new AgentSession(Guid.NewGuid()); + if (_sessions.TryAdd(session.SessionId, session)) return session; + } + } + + public bool TryGet(Guid sessionId, out AgentSession? session) => _sessions.TryGetValue(sessionId, out session); +} |
