diff --git a/interface/web/src/App.jsx b/interface/web/src/App.jsx
index 45e8637..e2c39e3 100644
--- a/interface/web/src/App.jsx
+++ b/interface/web/src/App.jsx
@@ -154,6 +154,21 @@ function App() {
}
};
+ // Bulk delete of everything currently listed (respects the search filter).
+ const clearConversations = async () => {
+ const n = conversations.length;
+ if (!n) return;
+ const what = search ? `${n} matching conversation${n > 1 ? "s" : ""}` : `all ${n} conversation${n > 1 ? "s" : ""}`;
+ if (!window.confirm(`Delete ${what}? This cannot be undone.`)) return;
+ const ids = conversations.map(c => c.id);
+ await Promise.all(
+ ids.map(id => fetch(`${API_BASE}/conversations/${id}`, { method: "DELETE" }).catch(err =>
+ console.error("Failed to delete conversation:", err)))
+ );
+ if (ids.includes(activeConversationId)) setActiveConversationId(crypto.randomUUID());
+ loadConversations(search);
+ };
+
const navItems = [
{ key: "chatbot", icon: "đź’¬", label: "Chat" },
{ key: "playbook", icon: "đź“–", label: "Playbooks" },
@@ -168,7 +183,7 @@ function App() {
{/* Sidebar */}
{
@@ -209,7 +224,11 @@ function App() {
setShowStatusTooltip(true);
}}
onMouseLeave={() => setShowStatusTooltip(false)}
- title="Hover to refresh"
+ onClick={() => {
+ if (ollamaBusy || ollamaStatus === "unavailable" || status === "Offline") return;
+ toggleOllama();
+ }}
+ title={ollamaStatus === "unavailable" ? "Ollama binary not found" : "Click to start/stop the AI"}
/>
{showStatusTooltip && (
{status}
- Ollama: {ollamaStatus}
+ {/* Naming the phase matters: nearly all of the wait is the model
+ being read off disk (GBs), not the server booting. */}
+ Ollama: {ollamaBusy ? (ollamaStatus === "running" ? "stopping…" : "loading model…") : ollamaStatus}
)}
- {/* Manual AI start/stop — Ollama is off until the user turns it on */}
-
- {/* Naming the phase matters: nearly all of the wait is the model
- being read off disk (GBs), not the server booting. "…" for a
- minute reads as hung. */}
- {ollamaBusy ? (ollamaStatus === "running" ? "Stopping…" : "Loading model…")
- : ollamaStatus === "running" ? "⏹ Stop AI" : "▶ Start AI"}
-
+ {/* Start/Stop AI moved onto the status dot above — click it to toggle. */}
{navItems.map(item => {
@@ -269,9 +268,11 @@ function App() {
onClick={() => setCurrentPage(item.key)}
style={{
padding: "0.32rem 0.5rem",
- background: isActive ? "#1c2733" : "transparent",
- color: isActive ? "#fff" : "#bbb",
+ background: "transparent",
+ color: isActive ? "#4aa3e0" : "#bbb",
+ fontWeight: isActive ? 600 : 400,
border: "none",
+ borderLeft: `2px solid ${isActive ? "#007acc" : "transparent"}`,
borderRadius: "5px",
cursor: "pointer",
fontSize: "0.8rem",
@@ -330,6 +331,22 @@ function App() {
>
⤓ Export
+
+ đź—‘ Clear
+