From adc8bd185b54935e7a31aae04da3175b7989927a Mon Sep 17 00:00:00 2001
From: Adam Malczewski <github@tradam.dev>
Date: Wed, 20 May 2026 15:04:26 +0900
Subject: feat: phase 3 — config, skills, model groups, task list, and sidebar
 UI
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- Config system: TOML-based dispatch.toml with hot-reload via chokidar
- Model/key resolution: tag-based model selection, key fallback chains
- Skills system: directory loader with TOML frontmatter, agent mappings
- Task list tool: add/update/list/get operations with WebSocket events
- API routes: GET /config, /skills, /skills/:name, /models, /models/resolve
- Frontend: sidebar with model status, task list, config viewer, skills browser, permission log
- Sliding sidebar animation using CSS transitions (not Svelte transitions)
---
 .../src/lib/components/HotReloadIndicator.svelte   | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 packages/frontend/src/lib/components/HotReloadIndicator.svelte

(limited to 'packages/frontend/src/lib/components/HotReloadIndicator.svelte')

diff --git a/packages/frontend/src/lib/components/HotReloadIndicator.svelte b/packages/frontend/src/lib/components/HotReloadIndicator.svelte
new file mode 100644
index 0000000..3e34d3b
--- /dev/null
+++ b/packages/frontend/src/lib/components/HotReloadIndicator.svelte
@@ -0,0 +1,35 @@
+<script lang="ts">
+	const { active }: { active: boolean } = $props();
+
+	let visible = $state(false);
+	let timer: ReturnType<typeof setTimeout> | null = null;
+
+	$effect(() => {
+		if (active) {
+			visible = true;
+			if (timer !== null) clearTimeout(timer);
+			timer = setTimeout(() => {
+				visible = false;
+				timer = null;
+			}, 2000);
+		}
+		return () => {
+			if (timer !== null) {
+				clearTimeout(timer);
+				timer = null;
+			}
+			visible = false;
+		};
+	});
+</script>
+
+{#if visible}
+	<div
+		class="flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-info/20 text-info text-xs font-medium animate-pulse"
+		role="status"
+		aria-live="polite"
+	>
+		<span class="status status-xs status-info"></span>
+		<span>Config reloaded</span>
+	</div>
+{/if}
-- 
cgit v1.2.3

