feat(assistant): implement spec 021 chat assistant flow with semantic contracts

This commit is contained in:
2026-02-23 19:37:56 +03:00
parent 83e4875097
commit 18e96a58bc
27 changed files with 4029 additions and 20 deletions

View File

@@ -12,6 +12,8 @@
* @UX_STATE: SearchFocused -> Search input expands
* @UX_FEEDBACK: Activity badge shows count of running tasks
* @UX_RECOVERY: Click outside closes dropdowns
* @UX_TEST: SearchFocused -> {focus: search input, expected: focused style class applied}
* @UX_TEST: ActivityClick -> {click: activity button, expected: task drawer opens}
*/
import { createEventDispatcher } from "svelte";
@@ -25,6 +27,7 @@
import { sidebarStore, toggleMobileSidebar } from "$lib/stores/sidebar.js";
import { t } from "$lib/i18n";
import { auth } from "$lib/auth/store.js";
import { toggleAssistantChat } from "$lib/stores/assistantChat.js";
import Icon from "$lib/ui/Icon.svelte";
const dispatch = createEventDispatcher();
@@ -64,6 +67,10 @@
dispatch("activityClick");
}
function handleAssistantClick() {
toggleAssistantChat();
}
function handleSearchFocus() {
isSearchFocused = true;
}
@@ -129,6 +136,16 @@
<!-- Nav Actions -->
<div class="flex items-center gap-3 md:gap-4">
<!-- Assistant -->
<button
class="rounded-lg p-2 text-slate-600 transition-colors hover:bg-slate-100"
on:click={handleAssistantClick}
aria-label={$t.assistant?.open || "Open assistant"}
title={$t.assistant?.title || "AI Assistant"}
>
<Icon name="activity" size={22} />
</button>
<!-- Activity Indicator -->
<div
class="relative cursor-pointer rounded-lg p-2 text-slate-600 transition-colors hover:bg-slate-100"