Aller au contenu principal

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

NiveauAPICapacitéCas d'Usage
localStorageSynchrone~5-10 MoThème, clés API, paramètres — données nécessaires instantanément au chargement de la page
IndexedDBAsynchrone~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éTypeDescription
ais-themestringThème actuel (light, dark ou system)
ais-apikey-anthropicstringClé API Anthropic
ais-apikey-openaistringClé API OpenAI
ais-apikey-xaistringClé API xAI
ais-apikey-geministringClé API Google Gemini
ais-apikey-openrouterstringClé API OpenRouter
ais-apikey-deepseekstringClé API DeepSeek
ais-apikey-groqstringClé API Groq
ais-apikey-mistralstringClé API Mistral
ais-userJSONInfos utilisateur connecté (nom, email, photo, fournisseur)
ais-idb-migratedstringFlag indiquant la migration localStorage-vers-IndexedDB terminée
ais-ollama-endpointstringURL d'endpoint Ollama personnalisé (défaut : http://localhost:11434)
ais-custom-providersJSONTableau de configurations de fournisseurs personnalisés définis par l'utilisateur
aiscouncil-settingsJSONParamètres globaux (thème, taille de police, capacités, etc.)
aiscouncil-usageJSONDonnées de suivi d'utilisation (tokens, coûts par fournisseur)
avertissement

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éTypeDescription
ais-botsarrayToutes les métadonnées de session de bot (ID, nom, config, date de création)
ais-profilesarrayTous les profils sauvegardés (individuels et conseil)
ais-chat-{botId}arrayHistorique des messages de chat pour une session de bot spécifique
ais-addon-manifestsarrayManifestes d'addons/plugins installés
ais-miniprogram-*variesDonné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éIndexedDBSQLite WASM
Stockage clé-valeurOuiOui
Stockage de blobs binairesLimitéOptimisé
Requêtes SQLNonOui
PersistanceGérée par le navigateurOPFS (basé sur fichiers)
ChargementImmédiatDiffé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.

Blobs SQLite

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 :

NavigateurQuota IndexedDBAvec Stockage Persistant
Chrome/Edge~60% de l'espace disquePareil, mais pas évincé
Firefox~50% de l'espace disqueDemande la permission à l'utilisateur
Safari~1 Go initial, l'utilisateur peut accorder plusPareil

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.

Vérifier l'Utilisation du Stockage

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 localStorage et IndexedDB, pas de cookies de suivi (le cookie ais-auth est 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 :

  1. Settings > Privacy > Clear All Data — supprime toutes les données IndexedDB, profils et historiques de chat
  2. DevTools Navigateur > Application > Clear Storage — option nucléaire, supprime tout y compris localStorage
  3. Suppression de chat individuelle — clic droit sur un bot dans la barre latérale et sélectionnez Delete
danger

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é.