From 4ba2673557c7cfd0bc31b03e2c35ab5e1efe60e7 Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Thu, 21 May 2026 19:52:35 +0900 Subject: feat: tab system with per-tab agents, DB persistence, and DaisyUI tabs-lift UI - Add tabs, messages, and settings tables to SQLite database - Backend: refactor AgentManager to manage per-tab Agent instances via Map - Backend: WebSocket events tagged with tabId for multiplexing - Backend: tab CRUD routes (create, list, update, archive, messages) - Backend: persist user and assistant messages to DB during chat - Frontend: new tabStore replaces single chatStore with multi-tab reactive state - Frontend: TabBar component using DaisyUI tabs-lift style with status dots - Frontend: Settings sidebar panel for title generation model selection - Frontend: wire ChatPanel, ChatInput, Header to use tabStore - Fix HMR listener accumulation via wsClient.clearCallbacks() - Delete old single-chat chatStore (chat.svelte.ts) --- .../frontend/src/lib/components/ChatInput.svelte | 6 +- .../frontend/src/lib/components/ChatPanel.svelte | 33 +----- packages/frontend/src/lib/components/Header.svelte | 12 +- .../src/lib/components/SettingsPanel.svelte | 128 +++++++++++++++++++++ .../src/lib/components/SidebarPanel.svelte | 5 +- packages/frontend/src/lib/components/TabBar.svelte | 47 ++++++++ 6 files changed, 195 insertions(+), 36 deletions(-) create mode 100644 packages/frontend/src/lib/components/SettingsPanel.svelte create mode 100644 packages/frontend/src/lib/components/TabBar.svelte (limited to 'packages/frontend/src/lib/components') diff --git a/packages/frontend/src/lib/components/ChatInput.svelte b/packages/frontend/src/lib/components/ChatInput.svelte index 92c78b9..9563a9f 100644 --- a/packages/frontend/src/lib/components/ChatInput.svelte +++ b/packages/frontend/src/lib/components/ChatInput.svelte @@ -1,9 +1,9 @@ diff --git a/packages/frontend/src/lib/components/ChatPanel.svelte b/packages/frontend/src/lib/components/ChatPanel.svelte index 11c3b5d..24d8c7f 100644 --- a/packages/frontend/src/lib/components/ChatPanel.svelte +++ b/packages/frontend/src/lib/components/ChatPanel.svelte @@ -1,13 +1,14 @@
- -
- - - {wsClient.connectionStatus} - - | - - Agent: - - {chatStore.agentStatus === "running" ? "running..." : chatStore.agentStatus} - - -
-
- {#if chatStore.messages.length === 0} + {#if messages.length === 0}
Send a message to start a conversation
{/if} - {#each chatStore.messages as message (message.id)} + {#each messages as message (message.id)} {/each}
diff --git a/packages/frontend/src/lib/components/Header.svelte b/packages/frontend/src/lib/components/Header.svelte index 721a773..ada5500 100644 --- a/packages/frontend/src/lib/components/Header.svelte +++ b/packages/frontend/src/lib/components/Header.svelte @@ -1,5 +1,6 @@ + +
+
Settings
+ +
+

Title Generation Model

+

Used to generate short titles for new tabs after the first message.

+ + + + + + + + +
+
diff --git a/packages/frontend/src/lib/components/SidebarPanel.svelte b/packages/frontend/src/lib/components/SidebarPanel.svelte index e5536de..7e71bd5 100644 --- a/packages/frontend/src/lib/components/SidebarPanel.svelte +++ b/packages/frontend/src/lib/components/SidebarPanel.svelte @@ -7,6 +7,7 @@ import PermissionLog from "./PermissionLog.svelte"; import KeyUsage from "./KeyUsage.svelte"; import ClaudeReset from "./ClaudeReset.svelte"; + import SettingsPanel from "./SettingsPanel.svelte"; import type { TaskItem, LogEntry, KeyInfo } from "../types.js"; const { @@ -41,7 +42,7 @@ let nextId = 0; let panels = $state([{ id: nextId++, selected: "Current Model" }]); - const viewOptions = ["Select a view", "Current Model", "Key Usage", "Claude Reset", "Model Status", "Tasks", "Config", "Skills", "Permission Log"]; + const viewOptions = ["Select a view", "Current Model", "Key Usage", "Claude Reset", "Model Status", "Tasks", "Config", "Skills", "Permission Log", "Settings"]; function addPanel() { panels = [...panels, { id: nextId++, selected: "Select a view" }]; @@ -114,6 +115,8 @@ {:else if panel.selected === "Permission Log"} + {:else if panel.selected === "Settings"} + {/if}
diff --git a/packages/frontend/src/lib/components/TabBar.svelte b/packages/frontend/src/lib/components/TabBar.svelte new file mode 100644 index 0000000..d1a3936 --- /dev/null +++ b/packages/frontend/src/lib/components/TabBar.svelte @@ -0,0 +1,47 @@ + + +
+
+ + + + {#each tabStore.tabs as tab (tab.id)} + + + {/each} +
+
-- cgit v1.2.3