feat(desktop): persist agent window history locally across app restarts (T-124) #115
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/T-124-agent-window-history-persistence"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Tâche
T-xxx — (titre dans docs/STATUS.md)
Changements
Contrat modifié ?
packages/contract/supabase/migrations—docs/API.md/docs/DATA.mdmis à jour, labelcontract, approbation humaine requiseTests
scripts/check.shvertImpacts cross-domaine
Fichiers hors périmètre de l'agent (et pourquoi) :
Suivi
docs/STATUS.mdmis à jour (ligne de la tâche)docs/CHANGELOG.md: entrée ajoutée sous Unreleaseddocs/DECISIONS.md/docs/ECARTS.mdmis à jour si décision ou écartTâche
T-124 — Réactiver la récupération de l'historique de la fenêtre agent après une vraie fermeture/relance (demande directe de l'humain, après clarification : le mode agent d'Aria, pas Claude Code)
Changements
apps/desktop/src/agent/historyStore.ts: persistance locale desturnsd'AgentWindow.tsxviatauri-plugin-store(agent-history.json), avec un TTL de 2h (HISTORY_TTL_MS) miroir de la fenêtre de continuité Hermes (ADR-012).AgentWindow.tsx: restaure l'historique au montage si assez frais, persiste à chaque changement deturns, et efface aussi le persisté surEsc(en plus de l'affiché, comportement existant inchangé).store:defaultétait déjà accordé à la fenêtreagent(capabilities/default.json), le plugin JS@tauri-apps/plugin-storeétait déjà une dépendance.Piste écartée (documentée pour ne pas être réinvestiguée)
Lire l'historique directement depuis l'API Hermes plutôt que le persister côté client :
GET /v1/responses/{id}ne renvoie que le tour final (pas d'équivalentinput_itemsfaçon OpenAI pour dérouler la chaîneprevious_response_id) ; un mécanisme de « sessions » Hermes existe (GET /api/sessions/{id}/messages) mais est un concept distinct qu'Aria n'utilise pas aujourd'hui (ADR-012/hermes.pyutilisentprevious_response_id, pas desession_id) — y basculer changerait le contrat serveur et potentiellement le schéma Supabase (approbation humaine bloquante, règle 1/3b), hors scope d'une tâche purement client. Hermes borne en plus son stockage à 100 réponses en LRU, sans garantie de rétention dans le temps.Contrat modifié ?
Tests
scripts/check.shvert (--desktop:tsc --noEmit+eslint;--rust:cargo clippy -D warnings+cargo test, 133/133, aucun changement Rust donc résultat identique à avant)docs/STATUS.md→ Vérifications manuelles en attente (T-124) — crash/Cmd+Qréel puis relance dans/hors la fenêtre de 2h, non simulable dans cet environnement agent.Impacts cross-domaine
Aucun — uniquement
apps/desktop/src+apps/desktop/CLAUDE.md(périmètreapp-front), et les fichiers de suivi (docs/STATUS.md,docs/CHANGELOG.md).Suivi
docs/STATUS.mdmis à jour (T-124, done)docs/CHANGELOG.md: entrée ajoutée sous UnreleasedReview qa-regression — T-124
Diff relu en entier (
scripts/pr.sh --diff 115),scripts/check.sh --desktopet--rustrevérifiés dans ce même worktree (133/133 tests Rust,tsc/eslintverts) — aucun changement Rust, résultat attendu identique à avant la PR.Points vérifiés :
historyStore.tsne stocke que lesturnsdéjà affichés à l'écran (texte transcrit + réponses agent + noms d'outils utilisés), rien qui ne soit déjà visible/copiable dans l'UI. Stocké en clair dansagent_data_dir/agent-history.json, cohérent avec le reste de la persistance locale existante (aria.config.json, non chiffré non plus) — pas une régression de sécurité, mais bien une donnée conversationnelle qui reste désormais sur disque au lieu de purement en mémoire ; TTL de 2h limite la fenêtre d'exposition, cohérent avec l'objectif (éviter d'afficher un historique visuel qui ne correspond plus à une conversation réellement poursuivie côté Hermes).HISTORY_TTL_MS = 2 * 60 * 60 * 1000= 2h, documenté comme politique miroir côté client (le client ne lit jamaisaria_agent_sessions, RLS deny-all) — pas une lecture de la table serveur, bien précisé dans les 3 endroits (en-têteAgentWindow.tsx,historyStore.ts,apps/desktop/CLAUDE.md).Esctoujours prioritaire : efface l'affiché et le persisté (clearPersistedTurns), comportement UX existant non contourné.agentétant créée eagerly (visible: falsedanstauri.conf.json) et jamais détruite par la croix (install_agent_close_guard), le composant ne remonte pas sur un simple hide/show — l'hydratation ne s'exécute qu'une fois par vrai cycle de vie du process, pas de double-restauration ni d'écrasement d'un historique en cours.store:defaultdéjà accordé à la fenêtreagent,@tauri-apps/plugin-storedéjà une dépendance — confirmé en relisantcapabilities/default.json/package.jsonavant la review, pas seulement pris pour argent comptant depuis la description de la PR.Esc,setTurns([])déclenche aussi l'effet de persistance générique (écrit{turns: [], updatedAt: now}) en plus de l'appel expliciteclearPersistedTurns()— ordre d'exécution non garanti entre les deux, mais convergent (les deux aboutissent à "pas d'historique à restaurer"), aucun comportement utilisateur incorrect dans aucun entrelacement. Pas de correctif demandé.Vérification manuelle réelle (crash/
Cmd+Qpuis relance dans/hors la fenêtre de 2h) non exécutable dans cet environnement — correctement consignée dansdocs/STATUS.md→ Vérifications manuelles en attente, ne bloque pas (CLAUDE.md règle 3b).Verdict : APPROVE