nAIxus Docs

Architecture frontend

Vue d'ensemble des applications frontend, stack technique, patterns et structure du code.

Le monorepo contient trois applications frontend et un serveur de collaboration. Ce document couvre leur stack, leur structure et leurs patterns.

Applications

AppFrameworkPortRôle
Console AdminNext.js 16 (App Router)3000Interface d'administration principale
Web WidgetVite + React5173Widget chat embarquable
DocsTanStack Start + Fumadocs3002Site de documentation
Yjs ServerNode.js (WebSocket)1234Serveur de collaboration temps réel

Console Admin — Stack technique

Dépendances clés

BibliothèqueVersionRôle
Next.js16.1.6Framework React avec SSR/SSG
React19.2.4Bibliothèque UI
Radix UI + shadcn/uiComposants UI accessibles
Tailwind CSS4.xStyles utilitaires
Zustand5.0.11State management global
TanStack Query5.90.20Data fetching + cache
React Hook Form7.71.1Gestion de formulaires
Zod4.3.6Validation de schémas
@xyflow/react12.10.1Éditeur de flows (canvas)
Yjs13.6.29Collaboration temps réel (CRDT)
Monaco Editor0.55.1Éditeur de code (node Code)
TiptapÉditeur rich text (prompts)

Structure du code

apps/console_admin/
├── app/                    # Routes Next.js (App Router)
│   ├── layout.tsx          # Layout racine
│   ├── page.tsx            # Page d'accueil
│   ├── flows/              # Pages flows
│   ├── channels/           # Pages channels
│   ├── agents/             # Pages agents/templates
│   └── history/            # Historique des exécutions
├── components/             # Composants partagés
│   ├── ui/                 # Primitives shadcn/ui (Button, Dialog, etc.)
│   ├── app-sidebar.tsx     # Navigation principale
│   └── header.tsx          # Header de l'application
├── features/               # Code organisé par domaine
│   ├── flows/
│   │   ├── components/     # Composants spécifiques aux flows
│   │   ├── hooks/          # Hooks custom (useFlowStore, etc.)
│   │   ├── types/          # Types Flow, Node, Edge
│   │   └── utils/          # Utilitaires de manipulation de flows
│   ├── channels/
│   ├── collaboration/      # Yjs integration
│   ├── transcripts/
│   └── devtools/
├── types/                  # Types globaux
└── tests/                  # Tests (Vitest + Playwright)

Patterns de state management

L'application utilise une approche en couches :

Type d'étatOutilQuand l'utiliser
Données serveurTanStack QueryToute donnée venant de l'API (flows, runs, channels)
État global UIZustandSidebar ouverte, thème, préférences
État formulaireReact Hook Form + ZodTout formulaire (création de flow, config de node)
État collaboratifYjs (CRDT)Canvas de flow, édition collaborative
État localuseState / useReducerÉtat éphémère d'un composant
État URLuseSearchParamsFiltres, pagination, onglet actif

Arbre de décision

Data fetching

Pattern standard avec TanStack Query :

// Hook de récupération
function useFlows(tenantId: string) {
  return useQuery({
    queryKey: ['flows', tenantId],
    queryFn: () => fetchFlows(tenantId),
  });
}

// Mutation avec invalidation
function useCreateFlow() {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: createFlow,
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['flows'] });
    },
  });
}

Composants UI

Les composants suivent les patterns shadcn/ui :

  • Primitives Radix UI pour l'accessibilité (focus, keyboard, aria).
  • Tailwind pour le style via className et cn() utility.
  • Variants via class-variance-authority (cva) pour les variantes de composants.

Web Widget

Architecture

Le widget est un bundle JavaScript autonome qui s'intègre dans n'importe quel site via un tag <script>. Il utilise le Shadow DOM pour isoler ses styles du site hôte.

apps/web-widget/src/
├── widget.ts           # Point d'entrée (API d'embedding)
├── App.tsx             # Composant racine
├── api/                # Client API (connexion au Core)
├── components/         # Composants chat
├── hooks/              # Hooks custom
├── ui/                 # Composants UI de base
└── storage/            # Persistence locale (session)

Stack spécifique

  • Vercel AI SDK pour le streaming LLM côté client.
  • Shadow DOM pour l'isolation CSS totale.
  • react-markdown + remark-gfm pour le rendu Markdown des réponses.
  • jest-axe pour les tests d'accessibilité.

Collaboration temps réel (Yjs)

Comment ça fonctionne

  1. Le Yjs Server (apps/yjs_server/) maintient un Y.Doc par flow.
  2. Chaque client (navigateur) se connecte via WebSocket.
  3. Les modifications du canvas (ajout/déplacement de nodes, edges) sont synchronisées via CRDT.
  4. Les curseurs des autres utilisateurs sont visibles via le protocole Awareness de Yjs.
  5. L'état est persisté dans PostgreSQL côté serveur.

Authentification

Le Yjs Server valide les JWT dans les frames WebSocket pour s'assurer que seuls les utilisateurs autorisés accèdent aux documents.

Packages partagés

packages/shared/

Types TypeScript et utilitaires partagés entre les apps frontend :

  • Types communs (Flow, Node, Channel, etc.)
  • Client de base de données Kysely (pour le Yjs Server)
  • Exporté via @naixus/shared

Tests frontend

TypeFrameworkEmplacementCommande
UnitaireVitest + Testing Librarytests/unit/pnpm test
E2EPlaywrighttests/e2e/pnpm test:e2e
Accessibilitéjest-axe (widget)Inline avec les tests unitairespnpm test

Pour aller plus loin

On this page