Conserver les sessions et les reprendre
Ce guide montre comment faire enregistrer par mm chaque conversation d'un projet et en retrouver une plus tard, dans le terminal et depuis un éditeur. Il suppose que mm tourne avec un fichier de configuration que vous pouvez modifier.
Étapes
-
Activez la fonctionnalité dans le fichier YAML :
sessions: enabled: true dir: .mm/sessionsdirest relatif au projet : le répertoire d'où vous lancezmmdans le terminal, le projet ouvert dans l'éditeur en mode ACP. Ajoutez.mm/au.gitignoredu projet : un fichier de session contient toutes les sorties de commandes que le modèle a lues. -
Lancez
mmdepuis le répertoire du projet. La bannière se termine maintenant par une lignesessions::sessions: saved under /work/project/.mm/sessions · 2 earlier — /resume to continue the latest, /sessions to listCe lancement est une nouvelle session. Son fichier apparaît avec la première question et est réécrit après chaque tour, après
/compactet après/new. -
Listez les sessions du projet quand vous en cherchez une :
> /sessions 3 session(s) in /work/project/.mm/sessions — /resume <id> to continue one, /resume for the latest * 20260916-101530-4f2a9c1e 2026-09-16 10:15 2 turn(s) add a /new command 20260916-093012-77be01d3 2026-09-16 09:41 5 turn(s) fix the skills loader 20260915-181200-0a1b2c3d 2026-09-15 18:20 1 turn(s) list the filesLe
*marque la session courante. Les identifiants se trient par date de création. -
Reprenez-en une :
> /resume ↩️ resumed 20260916-093012-77be01d3 — 14 message(s), started with "fix the skills loader"Un
/resumeseul prend la conversation la plus récemment mise à jour autre que la courante, en ignorant les sessions vides ;/resume <id>en désigne une. À partir de là, le modèle voit l'historique repris — sous le prompt système actuel — et chaque nouveau tour est enregistré dans le fichier de cette session. Rien n'est rejoué à l'écran : la ligne dit ce qui est revenu.
Comprendre pourquoi une exécution a échoué
-
Repérez la session dans la liste : une session qui a affiché au moins une erreur termine sa ligne par
· ⚠️ N error(s). La même queue apparaît dans le compte rendu↩️ resumed ….> /sessions 2 session(s) in /work/project/.mm/sessions — /resume <id> to continue one, /resume for the latest * 20260918-141321-db582a3d 2026-09-18 16:13 1 turn(s) say just: ok 20260918-141225-02790c82 2026-09-18 16:12 0 turn(s) · ⚠️ 1 error(s) -
Lisez le tableau
errorsde son fichier. Chaque enregistrement dit quand, à quel tour, sur quelle question, ce que l'écran a montré (message), quand l'erreur brute en dit plus, ce qu'elle était (detail), et quelmodela échoué ;wherevautgeneration,compactionouresume:jq .errors .mm/sessions/20260918-141225-02790c82.json[ { "at": "2026-09-18T14:12:25Z", "turn": 1, "where": "generation", "message": "dmr: \"no/such-model:none\" not found at http://localhost:12434/engines/v1 — docker model pull no/such-model:none", "detail": "failed to create completion: POST \"http://localhost:12434/engines/v1/chat/completions\": 404 Not Found", "question": "hello", "model": "no/such-model:none" } ] -
Pour faire analyser l'échec, confiez le fichier à un agent de code (Claude Code, ou
mmlui-même dans un autre projet) et demandez ce qui s'est passé et quoi changer — dans le code, ou dansagent.yaml(watchdogTimeout,maxOutput,model,context.*). L'historique du même fichier donne le contexte qu'avait le modèle ; le tableauerrorsdonne ce qu'il n'a jamais vu.Une session dont le seul contenu est une erreur n'a aucun tour : un
/resumeseul la saute,/resume <id>l'atteint.
Depuis un éditeur (ACP)
-
Gardez
sessions.enabled: truedans le fichier désigné parAGENT_CONFIG. Chaque fil ouvert par l'éditeur est une session, enregistrée sous<projet>/.mm/sessions/<id>.jsondès sa création. -
Utilisez Reload Agent (Zed) quand l'agent a redémarré ou que vous avez changé sa configuration. L'éditeur envoie
session/loadavec l'identifiant du fil ;mmrelit le fichier et rejoue toute la conversation — vos questions, les réponses, chaque appel d'outil avec l'entrée qu'il a reçue et la sortie qu'il a renvoyée à l'époque. Rien n'est réexécuté. Le fil continue ensuite comme avant. -
/newdans un fil garde le fil (l'identifiant de session de l'éditeur), mais la conversation écoulée est conservée sur disque sous un nouvel identifiant, et le fichier du fil repart vide./sessionset/resumen'existent pas en ACP : c'est l'éditeur qui liste les fils.
Variantes
- Un seul dépôt pour tous les projets. Donnez un chemin absolu à
dir. Les sessions de différents projets partagent alors un répertoire ; chaque fichier enregistre soncwd. - Un projet en lecture seule. La bannière ou le journal
[acp]indiquenot savedavec la raison ; la conversation continue sans être enregistrée. - Compression. Un
/compactou une compression automatique réécrit le fichier avec l'historique raccourci ; une session reprise ou rechargée repart du résumé, comme la session en direct. Le tableauerrorsreste tel quel. - Erreurs en ACP. L'éditeur montre l'échec à sa manière ; l'enregistrement va quand même dans le fichier du fil, et
/newle déplace dans la conversation archivée avec l'historique auquel il appartient. - Repartir de zéro volontairement. Rien à faire : chaque lancement est une nouvelle session. Les anciennes ne reviennent que sur
/resumeou sur un rechargement depuis l'éditeur.
Voir aussi
- Référence de la configuration — les clés
sessions - Référence des commandes slash —
/sessions,/resume,/new - Référence ACP —
session/loadet ce qu'il rejoue - Pourquoi les sessions fonctionnent ainsi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
|