Aller au contenu

Stockage

arka-deck stocke localement trois types de données : des fichiers (sessions, mémoire, ArkaDoc, marker projet), des bases SQLite (sessions chat, provider instances, ArkaDoc manifest), et des secrets chiffrés (clés provider, OAuth tokens).

Aucune donnée utilisateur ne quitte la machine sauf trafic explicite vers le Cortex public (catalogue) ou le provider IA configuré.


Le port Filesystem applique une allowlist au boot :

  • ~/.arka-deck/ (arkaHome global)
  • <projectPath>/.arka-deck/ (pour chaque projet ouvert)
  • Les chemins de pièces jointes explicitement importées via l’UI

Toute écriture en dehors de l’allowlist est refusée. La protection inclut le realpath avant matching, pour éviter les contournements via symlinks.

Voir ADR 0001 pour la décision globale et adapters/outbound/system/preferences-path-policy.ts pour l’impl.


BaseCheminContenu
chat.db~/.arka-deck/chat/chat.dbSessions et messages chat (timeline complète)
providers.db~/.arka-deck/providers/providers.dbInstances providers (clés chiffrées)
Per-project<projet>/.arka-deck/squad/missions.sqliteMissions multi-agents (Squad Orchestration)

Le moteur est better-sqlite3 (synchrone, performant, sans dépendance native compliquée). Toutes les écritures critiques sont atomiques (transaction).


Les secrets (clés API, tokens OAuth) sont chiffrés via le port SecretCipher :

ÉlémentDétail
AlgorithmeAES-256-GCM
Formatv1:<iv-base64>:<tag-base64>:<encrypted-base64>
Clé maître~/.arka-deck/secrets/secrets.key, mode 600, créée au 1er boot
Auth tag16 octets — flip de bit → SecretCipherFailedError visible
MigrationPort swappable vers Keychain macOS / libsecret Linux

Si secrets.key est supprimé, une nouvelle clé est générée au prochain boot. Les anciennes instances chiffrées deviennent irrécupérables — c’est volontaire (aucune voie de récupération externe).

Voir ADR 0005.


~/.arka-deck/ ← arkaHome (override par env ARKA_DECK_HOME)
index/
workspaces.json
projects.json
preferences/
user.json
security.json ← allowlist user
cache/
catalogue/...
providers/
providers.db ← SQLite instances provider
secrets/
secrets.key ← clé maître (mode 600)
chat/
chat.db ← SQLite sessions chat
<projectPath>/ ← n'importe où sur disque
.arka-deck/
project/marker.json ← marker projet (source de vérité)
agents/installed.json ← agents installés (Materializer track)
hooks/installed.json
skills/installed.json
memory/ ← mémoire locale (memory-local)
addons/<addon>/... ← données par addon
cortex-actions/... ← logs cortex-actions
squad/missions.sqlite ← SQLite missions Squad
arkadoc/ ← documents projet
.claude/ ← matérialisations Claude Code
agents/<slug>/
hooks/<name>.json
skills/<name>/
settings.json ← JAMAIS touché par arka-deck

Les opérations critiques (marker projet, index, providers SQLite) suivent un pattern tmp + rename POSIX :

  1. Écrire dans un fichier temporaire (marker.json.tmp)
  2. fs.rename(tmp, final) atomique
  3. En cas d’échec, le fichier final reste intact

Cela garantit qu’un crash en milieu d’écriture ne corrompt jamais une donnée critique.