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

+50
View File
@@ -0,0 +1,50 @@
import { create } from "zustand";
import {
getModels,
getStatus,
type OllamaModel,
type OllamaStatus,
} from "../api/client";
interface LokiState {
status: OllamaStatus | null;
models: OllamaModel[];
selectedModel: string;
loadingModels: boolean;
setSelectedModel: (name: string) => void;
refreshStatus: () => Promise<void>;
refreshModels: () => Promise<void>;
}
export const useStore = create<LokiState>((set, get) => ({
status: null,
models: [],
selectedModel: "",
loadingModels: false,
setSelectedModel: (name) => set({ selectedModel: name }),
refreshStatus: async () => {
try {
const status = await getStatus();
set({ status });
if (!get().selectedModel && status.default_model) {
set({ selectedModel: status.default_model });
}
} catch {
set({ status: { connected: false, host: "", default_model: "" } });
}
},
refreshModels: async () => {
set({ loadingModels: true });
try {
const { models, default: def } = await getModels();
set({ models });
if (!get().selectedModel && def) set({ selectedModel: def });
} finally {
set({ loadingModels: false });
}
},
}));