diff --git a/.mcp.json b/.mcp.json
index 87f9ad1..0a6328c 100644
--- a/.mcp.json
+++ b/.mcp.json
@@ -1,8 +1,10 @@
{
"mcpServers": {
"vibecockpit": {
- "command": "vibecockpit",
- "args": ["--mcp"]
+ "args": [
+ "--mcp"
+ ],
+ "command": "vibecockpit"
}
}
}
diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte
index 27bcc74..f53858b 100644
--- a/frontend/src/App.svelte
+++ b/frontend/src/App.svelte
@@ -23,10 +23,11 @@
import BoardView from "./components/BoardView.svelte";
import AgentMonitor from "./components/AgentMonitor.svelte";
import Scheduler from "./components/Scheduler.svelte";
+ import ChatView from "./components/ChatView.svelte";
// ─── Reactive State (Svelte 5 runes) ───
- const validPages = ["dashboard", "planner", "agents", "scheduler", "sessions", "costs", "inventory", "settings"];
+ const validPages = ["dashboard", "planner", "agents", "scheduler", "chat", "sessions", "costs", "inventory", "settings"];
const redirects = { stats: "dashboard", security: "inventory", mcp: "settings", boards: "planner" };
function pageFromPath() {
const p = window.location.pathname.replace(/^\/+/, "").split("/")[0];
@@ -127,6 +128,7 @@
unsubGroup();
unsubActiveFilters();
stopAutoRefresh();
+ if (notifTimer) clearInterval(notifTimer);
window.removeEventListener("popstate", handlePopState);
});
@@ -163,6 +165,24 @@
page = pageFromPath();
}
+ let notifTimer;
+
+ function startNotificationPolling() {
+ notifTimer = setInterval(async () => {
+ try {
+ const r = await fetch("/api/notifications");
+ if (!r.ok) return;
+ const notifs = await r.json();
+ for (const n of notifs) {
+ showToast(n.message, n.type === "completed" ? "success" : "error");
+ if (Notification.permission === "granted") {
+ new Notification(n.title, { body: n.message });
+ }
+ }
+ } catch { /* ignore */ }
+ }, 5000);
+ }
+
onMount(async () => {
window.addEventListener("popstate", handlePopState);
await loadConfig();
@@ -174,6 +194,8 @@
}
await refresh(false);
startAutoRefresh();
+ if (Notification.permission === "default") Notification.requestPermission();
+ startNotificationPolling();
});
function wizardToggle(id) {
@@ -731,6 +753,10 @@
+