Stockage
AISCouncil stocke toutes les données localement dans votre navigateur. Rien n'est uploadé vers aucun serveur. Le système de stockage utilise deux niveaux — localStorage pour les petites lectures synchrones nécessaires au démarrage, et IndexedDB pour les grandes données asynchrones comme les profils de bots et les historiques de chat.
Architecture de Stockage à Deux Niveaux
| Niveau | API | Capacité | Cas d'Usage |
|---|---|---|---|
| localStorage | Synchrone | ~5-10 Mo | Thème, clés API, paramètres — données nécessaires instantanément au chargement de la page |
| IndexedDB | Asynchrone | ~100 Mo - 1 Go+ | Profils de bots, historiques de chat, manifestes d'addons — grandes données |
La division existe parce que localStorage est rapide mais limité en taille, tandis qu'IndexedDB est virtuellement illimité mais nécessite un accès asynchrone. Les valeurs critiques au démarrage (thème, clés API, état de connexion) vivent dans localStorage pour que l'application puisse s'afficher immédiatement sans attendre les lectures asynchrones.
Clés localStorage
Toutes les clés localStorage utilisent le préfixe ais- :
| Clé | Type | Description |
|---|---|---|
ais-theme | string | Thème actuel (light, dark ou system) |
ais-apikey-anthropic | string | Clé API Anthropic |
ais-apikey-openai | string | Clé API OpenAI |
ais-apikey-xai | string | Clé API xAI |
ais-apikey-gemini | string | Clé API Google Gemini |
ais-apikey-openrouter | string | Clé API OpenRouter |
ais-apikey-deepseek | string | Clé API DeepSeek |
ais-apikey-groq | string | Clé API Groq |
ais-apikey-mistral | string | Clé API Mistral |
ais-user | JSON | Infos utilisateur connecté (nom, email, photo, fournisseur) |
ais-idb-migrated | string | Flag indiquant la migration localStorage-vers-IndexedDB terminée |
ais-ollama-endpoint | string | URL d'endpoint Ollama personnalisé (défaut : http://localhost:11434) |
ais-custom-providers | JSON | Tableau de configurations de fournisseurs personnalisés définis par l'utilisateur |
aiscouncil-settings | JSON | Paramètres globaux (thème, taille de police, capacités, etc.) |
aiscouncil-usage | JSON | Données de suivi d'utilisation (tokens, coûts par fournisseur) |
Les clés API dans localStorage sont accessibles à tout JavaScript s'exécutant sur la même origine. C'est standard pour les applications navigateur, mais signifie que vous ne devriez pas installer d'extensions de navigateur non fiables. Les clés ne sont jamais incluses dans les exports d'URL ou les sauvegardes de données.
Clés IndexedDB
IndexedDB stocke les données dans un object store clé-valeur dans une base de données nommée ais-db (ou une base de données par utilisateur lorsque connecté) :
| Pattern de Clé | Type | Description |
|---|---|---|
ais-bots | array | Toutes les métadonnées de session de bot (ID, nom, config, date de création) |
ais-profiles | array | Tous les profils sauvegardés (individuels et conseil) |
ais-chat-{botId} | array | Historique des messages de chat pour une session de bot spécifique |
ais-addon-manifests | array | Manifestes d'addons/plugins installés |
ais-miniprogram-* | varies | Données de mini-programmes installés |
Chaque session de bot a sa propre clé de chat (ais-chat-abc123), donc les historiques de chat sont isolés et peuvent être chargés indépendamment.
Auto-Migration
Au premier démarrage, AIS.Storage.init() vérifie si des données existent dans localStorage depuis une version plus ancienne et les migre automatiquement vers IndexedDB. Le flag ais-idb-migrated empêche la re-migration lors des chargements ultérieurs.
Si IndexedDB n'est pas disponible (certains navigateurs de confidentialité le bloquent), la couche de stockage revient à localStorage de manière transparente. L'application continue de fonctionner, mais avec la limite de stockage ~5-10 Mo.
Couche SQLite WASM Optionnelle
Pour les cas d'usage avancés impliquant de grandes données binaires (images, pièces jointes), le système de stockage peut charger un module SQLite WASM optionnel. SQLite s'exécute concurremment avec IndexedDB et stocke les données dans le Origin Private File System (OPFS) du navigateur.
SQLite est chargé à la demande — il n'est jamais chargé sauf s'il est explicitement demandé ou nécessaire pour le stockage de blobs. Pour l'activer, allez dans Settings > General > Storage Backend et sélectionnez SQLite.
| Fonctionnalité | IndexedDB | SQLite WASM |
|---|---|---|
| Stockage clé-valeur | Oui | Oui |
| Stockage de blobs binaires | Limité | Optimisé |
| Requêtes SQL | Non | Oui |
| Persistance | Gérée par le navigateur | OPFS (basé sur fichiers) |
| Chargement | Immédiat | Différé (à la première utilisation) |
API AIS.Storage
Le module AIS.Storage fournit une API unifiée qui fonctionne quel que soit le backend actif :
Opérations de Base
// Initialiser le stockage (appelé une fois au démarrage)
await AIS.Storage.init();
// Obtenir une valeur
const bots = await AIS.Storage.get("ais-bots");
// Définir une valeur
await AIS.Storage.set("ais-bots", updatedBots);
// Supprimer une clé
await AIS.Storage.delete("ais-chat-abc123");
// Lister toutes les clés
const allKeys = await AIS.Storage.keys();
// Obtenir toutes les paires clé-valeur
const everything = await AIS.Storage.getAll();
// Effacer toutes les données
await AIS.Storage.clear();
Stockage de Blobs (SQLite)
// Stocker un blob binaire
await AIS.Storage.putBlob("image-001", arrayBuffer, "image/png");
// Récupérer un blob
const blob = await AIS.Storage.getBlob("image-001");
// { data: Uint8Array, mime: 'image/png', size: 12345 }
Fonctions Utilitaires
// Helpers localStorage synchrones (pour les lectures au démarrage)
const theme = AIS.Storage.loadJSON("ais-theme");
AIS.Storage.saveJSON("ais-theme", "dark");
// Factory de cache TTL (pour le cache du registre)
const cache = AIS.Storage.cache("ais-models-cache", "ais-models-ts", 86400000); // TTL 24h
const data = cache.load(); // Lire les données en cache
cache.save(newData); // Mettre à jour le cache
const stale = cache.isStale(); // Vérifier si le cache a expiré
Propriétés de Statut
AIS.Storage.isIDB; // true si IndexedDB est actif
AIS.Storage.hasSQLite; // true si SQLite WASM est chargé
Export et Import
Exporter des Données
Allez dans Settings > Privacy > Export All Data ou utilisez l'API :
const backup = await AIS.Storage.exportData();
// Retourne : { bcz_version: "1.0.0", exported: "2026-02-19T...", data: {...} }
L'export inclut tous les profils de bots, historiques de chat, paramètres et manifestes d'addons. Il exclut explicitement :
- Les clés API (jamais exportées)
- Les clés API par membre dans les profils (réduites à juste fournisseur/modèle)
L'export est sauvegardé comme ais-backup-YYYY-MM-DD.json.
Si vous avez le stockage de blobs SQLite actif, l'export génère aussi un fichier séparé ais-blobs-YYYY-MM-DD.db contenant la base de données SQLite.
Importer des Données
Allez dans Settings > Privacy > Import Data ou utilisez l'API :
const count = await AIS.Storage.importData(jsonBackup);
// Retourne : nombre d'éléments importés
L'import accepte :
- Les fichiers
.json(format de sauvegarde standard) - Les fichiers
.db(base de données SQLite)
Les clés API ne sont jamais importées même si présentes dans le fichier.
Quotas de Stockage
Les quotas de stockage du navigateur varient par plateforme :
| Navigateur | Quota IndexedDB | Avec Stockage Persistant |
|---|---|---|
| Chrome/Edge | ~60% de l'espace disque | Pareil, mais pas évincé |
| Firefox | ~50% de l'espace disque | Demande la permission à l'utilisateur |
| Safari | ~1 Go initial, l'utilisateur peut accorder plus | Pareil |
AISCouncil demande le stockage persistant à l'initialisation via navigator.storage.persist(). Lorsqu'accordé, le navigateur n'évincera pas automatiquement vos données lorsque le stockage est bas.
Ouvrez les DevTools de votre navigateur, allez dans Application > Storage, et cherchez l'origine aiscouncil.net pour voir l'utilisation actuelle du stockage et le quota.
Confidentialité
Toutes les données restent sur votre appareil :
- Pas d'uploads serveur — les configs de bots, historiques de chat et paramètres ne sont jamais envoyés à aucun serveur
- Pas d'analytics — aucune donnée d'utilisation n'est transmise nulle part
- Pas de cookies — l'application utilise
localStorageet IndexedDB, pas de cookies de suivi (le cookieais-authest utilisé uniquement pour la détection d'auth cross-sous-domaine) - Pas de stockage tiers — les données sont stockées uniquement sous l'origine
aiscouncil.net
Effacer les Données
Pour effacer toutes les données stockées :
- Settings > Privacy > Clear All Data — supprime toutes les données IndexedDB, profils et historiques de chat
- DevTools Navigateur > Application > Clear Storage — option nucléaire, supprime tout y compris localStorage
- Suppression de chat individuelle — clic droit sur un bot dans la barre latérale et sélectionnez Delete
Effacer toutes les données est irréversible. Exportez vos données d'abord si vous voulez une sauvegarde. Les clés API stockées dans localStorage sont également supprimées lors de l'effacement via DevTools du navigateur.
Stockage Par Bot pour les Mini-Programmes
Chaque mini-programme installé obtient son propre espace de noms de stockage isolé. Les mini-programmes accèdent au stockage via l'API SDK ais.storage, qui mappe vers des clés préfixées par application dans IndexedDB. Un mini-programme ne peut pas accéder aux données d'un autre.
// À l'intérieur d'un mini-programme
await ais.storage.set("ma-cle", "ma-valeur");
const val = await ais.storage.get("ma-cle");
const keys = await ais.storage.keys();
await ais.storage.remove("ma-cle");
Le stockage d'un mini-programme est supprimé lorsque le mini-programme est désinstallé.