Sessions: edit form, soft-delete, lazy creation, chat as separate page

- Session click opens edit form (name, description, image, agent) instead of chat
- Chat is now a separate route (#chat/{id}), opened via button
- Sessions created on save, not on click
- Soft-delete for sessions (is_deleted flag)
- Delete button in session form
- Removed title double-click editing from chat
- Card images now square (aspect-ratio: 1)
- New Session as placeholder card
This commit is contained in:
Meleki committed 2026-02-26 21:25:35 +01:00
1 parent 449c872296
commit a90b9427a5
10 files changed
+340 -188

No files matched your search

+26 -12
View File
@@ -99,6 +99,9 @@ public class DatabaseService
// Migrations
TryAddColumn(conn, "sessions", "agent_id", "TEXT");
TryAddColumn(conn, "sessions", "description", "TEXT");
TryAddColumn(conn, "sessions", "image", "TEXT");
TryAddColumn(conn, "sessions", "is_deleted", "INTEGER NOT NULL DEFAULT 0");
TryAddColumn(conn, "chains", "agent_id", "TEXT");
}
@@ -159,7 +162,7 @@ public class DatabaseService
// ── Sessions ──
public async Task<SessionRecord> CreateSession(string name = null)
public async Task<SessionRecord> CreateSession(string name = null, string description = null, string image = null, string agentId = null)
{
using var conn = CreateConnection();
var now = DateTime.UtcNow.ToString("o");
@@ -167,12 +170,15 @@ public class DatabaseService
{
SessionId = Guid.NewGuid().ToString("N"),
Name = name,
Description = description,
Image = image,
AgentId = agentId,
CreatedAt = now,
UpdatedAt = now
};
await conn.ExecuteAsync(@"
INSERT INTO sessions (session_id, name, created_at, updated_at)
VALUES (@SessionId, @Name, @CreatedAt, @UpdatedAt)
INSERT INTO sessions (session_id, name, description, image, agent_id, created_at, updated_at)
VALUES (@SessionId, @Name, @Description, @Image, @AgentId, @CreatedAt, @UpdatedAt)
", session);
return session;
}
@@ -181,14 +187,14 @@ public class DatabaseService
{
using var conn = CreateConnection();
return await conn.QueryAsync<SessionRecord>(
"SELECT * FROM sessions ORDER BY updated_at DESC");
"SELECT * FROM sessions WHERE is_deleted = 0 ORDER BY updated_at DESC");
}
public async Task<SessionRecord> GetSession(string sessionId)
{
using var conn = CreateConnection();
return await conn.QuerySingleOrDefaultAsync<SessionRecord>(
"SELECT * FROM sessions WHERE session_id = @sessionId", new { sessionId });
"SELECT * FROM sessions WHERE session_id = @sessionId AND is_deleted = 0", new { sessionId });
}
public async Task UpdateSessionTimestamp(string sessionId)
@@ -199,20 +205,28 @@ public class DatabaseService
new { sessionId, now = DateTime.UtcNow.ToString("o") });
}
public async Task UpdateSessionName(string sessionId, string name)
public async Task UpdateSession(string sessionId, System.Text.Json.JsonElement body)
{
using var conn = CreateConnection();
await conn.ExecuteAsync(
"UPDATE sessions SET name = @name, updated_at = @now WHERE session_id = @sessionId",
new { sessionId, name, now = DateTime.UtcNow.ToString("o") });
var sets = new List<string> { "updated_at = @now" };
var p = new Dapper.DynamicParameters();
p.Add("sessionId", sessionId);
p.Add("now", DateTime.UtcNow.ToString("o"));
if (body.TryGetProperty("name", out var n)) { sets.Add("name = @name"); p.Add("name", n.GetString()); }
if (body.TryGetProperty("description", out var d)) { sets.Add("description = @desc"); p.Add("desc", d.GetString()); }
if (body.TryGetProperty("image", out var img)) { sets.Add("image = @image"); p.Add("image", img.GetString()); }
if (body.TryGetProperty("agentId", out var a)) { sets.Add("agent_id = @agentId2"); p.Add("agentId2", a.GetString()); }
await conn.ExecuteAsync($"UPDATE sessions SET {string.Join(", ", sets)} WHERE session_id = @sessionId", p);
}
public async Task UpdateSessionAgent(string sessionId, string agentId)
public async Task DeleteSession(string sessionId)
{
using var conn = CreateConnection();
await conn.ExecuteAsync(
"UPDATE sessions SET agent_id = @agentId, updated_at = @now WHERE session_id = @sessionId",
new { sessionId, agentId, now = DateTime.UtcNow.ToString("o") });
"UPDATE sessions SET is_deleted = 1, updated_at = @now WHERE session_id = @sessionId",
new { sessionId, now = DateTime.UtcNow.ToString("o") });
}
// ── Archives ──