Phase 1-2 : socle Loki, design system et connexion Ollama

- Scaffold full-stack : backend FastAPI + frontend React/Vite/TS/Tailwind
- Design system fidèle au thème (palette ambre/café, JetBrains Mono, tokens Tailwind)
- Layout 3 panneaux : activity bar, historique/fichiers, chat, aperçu
- Connexion Ollama : statut live, liste des modèles, pull avec progression SSE, sélecteur de modèle
- Vue Configuration (Frame 2) : modèles, génération, outils, invite système
- Dockerfile multi-stage + docker-compose (Ollama externe par défaut, profil ollama optionnel)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
This commit is contained in:
MichaelandClaude Opus 4.8 committed 2026-06-29 16:51:25 +00:00
commit 3ad37ae2c7
34 files changed
+4343

No files matched your search

+40
View File
@@ -0,0 +1,40 @@
import { useEffect, useState } from "react";
import { ActivityBar, type View } from "./components/ActivityBar";
import { TopBar } from "./components/TopBar";
import { LeftPanel } from "./panels/LeftPanel";
import { ChatPanel } from "./panels/ChatPanel";
import { PreviewPanel } from "./panels/PreviewPanel";
import { SettingsView } from "./panels/SettingsView";
import { useStore } from "./store/useStore";
export default function App() {
const [view, setView] = useState<View>("chat");
const { refreshStatus, refreshModels } = useStore();
// Au démarrage : statut Ollama + liste des modèles. Poll du statut.
useEffect(() => {
refreshStatus();
refreshModels();
const id = setInterval(refreshStatus, 10000);
return () => clearInterval(id);
}, [refreshStatus, refreshModels]);
return (
<div className="flex h-full flex-col bg-base text-ink">
<TopBar />
<div className="flex min-h-0 flex-1">
<ActivityBar active={view} onChange={setView} />
{view === "settings" ? (
<SettingsView />
) : (
<>
<LeftPanel />
<ChatPanel />
<PreviewPanel />
</>
)}
</div>
</div>
);
}