Swift 100%
1# Architecture de KA23## Vue d'ensemble45```6KA/7 App/ KAApp (racine 5 onglets + bulle KA Agent), OnboardingView8 Core/ Ecosystem (les univers + mapping JSON), Services (APIClient cache9 disque, UniverseService, AgentService SSE), FavoritesStore10 Design/ KATheme (papier/encre, accents), composants (KACard ombre décalée,11 KAWordmark, KAChip, KAItemRow, états vides), Haptics12 Features/ Home, Search (universelle), Universes (grille + explorateur +13 fiche), MapView (carte unifiée), Favorites, Profile, AgentChat14KAWidgets/ widget « Le pouls » (WidgetKit, timeline réseau 30 min)15KATests/ tests des adaptateurs / favoris / URL (hors réseau)16project.yml XcodeGen — source de vérité du projet17```1819## Le principe : tout est configuration2021Un univers = une entrée `Universe` dans `Ecosystem.all` :22identité (wordmark, accent, SF Symbol, tagline, domaine) + API (`listPath`,23`itemsKey`, `searchParam`, clés du total dans /api/stats) + un **mapping**24`[String: JSONValue] → KAItem`. TOUTES les vues (grille, explorateur, fiche,25recherche universelle, carte, accueil, favoris) consomment le `KAItem`26universel — aucune vue par univers.2728### Ajouter un futur univers (ex. Ora·Ka)29301. Ajouter l'entrée dans `Ecosystem.all` (accent officiel d'ecosystem.json du31 design system ka-ui, mapping calqué sur un adaptateur voisin).322. C'est tout : grille, recherche, carte (si lat/lng), accueil et favoris le33 prennent en charge automatiquement. Ajouter un test de mapping dans34 `KATests` avec un échantillon JSON réel de son API.3536## Connexion aux API3738- **Listes/recherche** : les API publiques des plateformes39 (`/api/listings|vehicles|jobs|products|restaurants|events|creators`,40 `?q=&limit=`), JSON décodé en `JSONValue` (forme libre) puis mappé.41- **Compteurs live** : `/api/stats` de chaque plateforme (`/api/status` pour42 Trouve·Ka).43- **KA Agent** : `POST https://www.api-ka.com/api/agent/chat` (SSE — events44 delta/tool/done/error), parsé par `AgentService.stream` (URLSession.bytes).45 La clé Anthropic vit côté serveur, jamais dans l'app.46- **Cache/hors ligne** : `APIClient` écrit chaque réponse sur disque ; TTL47 120 s (300 s pour les stats) ; en cas d'échec réseau, la dernière copie est48 servie. Les favoris sont persistés localement (Application Support).4950## Conventions5152- Swift 5, zéro dépendance externe. Couleurs par univers via `--accent` du53 design system web (mêmes hex que ka-ui/ecosystem.json).54- Sombre = papier/encre inversés (`KATheme.paper/ink(scheme)`), cartes avec55 bordure encre + ombre décalée (signature Groupe-KA), coins continus.56- Aucune donnée inventée : prix placeholders (≤ 0,2 $ épicerie, ≤ 50 $ loyers,57 ≤ 1 000 $ propriétés) masqués ; états vides propres partout.58- Haptique sur les gestes clés (favori, recherche, envoi agent).59