🛟 Updated.
1ea7eb9 parent: 88031eb added
03-decision-models/.mm/decider/20261024-101623.098-spell.json +27 -0 | new file mode 100644 | ||
| @@ -0,0 +1,27 @@ | ||
| 1 | +{ | |
| 2 | + "time": "2026-10-24T10:16:23.098066+02:00", | |
| 3 | + "decider": "spell.yaml", | |
| 4 | + "prompt": "un loup garou en tutu rose s'approche de moi", | |
| 5 | + "response": { | |
| 6 | + "model": "hf.co/LiquidAI/d1-3B-GGUF:Q4_K_M", | |
| 7 | + "answers": { | |
| 8 | + "spell": { | |
| 9 | + "type": "choice", | |
| 10 | + "choice": "shield", | |
| 11 | + "probabilities": { | |
| 12 | + "fireball": 0.17568969425560138, | |
| 13 | + "arcane_bolt": 0.12788671552558184, | |
| 14 | + "shield": 0.34417338683216175, | |
| 15 | + "misty_step": 0.2747498330018602, | |
| 16 | + "sleep": 0.07750037038479486 | |
| 17 | + }, | |
| 18 | + "confidence": 0.18021673354020218 | |
| 19 | + } | |
| 20 | + }, | |
| 21 | + "usage": { | |
| 22 | + "input_tokens": 111, | |
| 23 | + "output_tokens": 0 | |
| 24 | + } | |
| 25 | + }, | |
| 26 | + "context": "spell: shield (confidence 0.18)" | |
| 27 | +} | |
| new file mode 100644 | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | +{ | ||
| 2 | + "time": "2026-10-24T10:16:23.098066+02:00", | ||
| 3 | + "decider": "spell.yaml", | ||
| 4 | + "prompt": "un loup garou en tutu rose s'approche de moi", | ||
| 5 | + "response": { | ||
| 6 | + "model": "hf.co/LiquidAI/d1-3B-GGUF:Q4_K_M", | ||
| 7 | + "answers": { | ||
| 8 | + "spell": { | ||
| 9 | + "type": "choice", | ||
| 10 | + "choice": "shield", | ||
| 11 | + "probabilities": { | ||
| 12 | + "fireball": 0.17568969425560138, | ||
| 13 | + "arcane_bolt": 0.12788671552558184, | ||
| 14 | + "shield": 0.34417338683216175, | ||
| 15 | + "misty_step": 0.2747498330018602, | ||
| 16 | + "sleep": 0.07750037038479486 | ||
| 17 | + }, | ||
| 18 | + "confidence": 0.18021673354020218 | ||
| 19 | + } | ||
| 20 | + }, | ||
| 21 | + "usage": { | ||
| 22 | + "input_tokens": 111, | ||
| 23 | + "output_tokens": 0 | ||
| 24 | + } | ||
| 25 | + }, | ||
| 26 | + "context": "spell: shield (confidence 0.18)" | ||
| 27 | +} | ||
added
03-decision-models/.mm/decider/20261024-101704.858-spell.json +27 -0 | new file mode 100644 | ||
| @@ -0,0 +1,27 @@ | ||
| 1 | +{ | |
| 2 | + "time": "2026-10-24T10:17:04.858962+02:00", | |
| 3 | + "decider": "spell.yaml", | |
| 4 | + "prompt": "je vais l'attaquer à coup de sac à main", | |
| 5 | + "response": { | |
| 6 | + "model": "hf.co/LiquidAI/d1-3B-GGUF:Q4_K_M", | |
| 7 | + "answers": { | |
| 8 | + "spell": { | |
| 9 | + "type": "choice", | |
| 10 | + "choice": "arcane_bolt", | |
| 11 | + "probabilities": { | |
| 12 | + "fireball": 0.15569653823233248, | |
| 13 | + "arcane_bolt": 0.33806895344532073, | |
| 14 | + "shield": 0.25798423258461595, | |
| 15 | + "misty_step": 0.12754081329484873, | |
| 16 | + "sleep": 0.12070946244288222 | |
| 17 | + }, | |
| 18 | + "confidence": 0.17258619180665088 | |
| 19 | + } | |
| 20 | + }, | |
| 21 | + "usage": { | |
| 22 | + "input_tokens": 109, | |
| 23 | + "output_tokens": 0 | |
| 24 | + } | |
| 25 | + }, | |
| 26 | + "context": "spell: arcane_bolt (confidence 0.17)" | |
| 27 | +} | |
| new file mode 100644 | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | +{ | ||
| 2 | + "time": "2026-10-24T10:17:04.858962+02:00", | ||
| 3 | + "decider": "spell.yaml", | ||
| 4 | + "prompt": "je vais l'attaquer à coup de sac à main", | ||
| 5 | + "response": { | ||
| 6 | + "model": "hf.co/LiquidAI/d1-3B-GGUF:Q4_K_M", | ||
| 7 | + "answers": { | ||
| 8 | + "spell": { | ||
| 9 | + "type": "choice", | ||
| 10 | + "choice": "arcane_bolt", | ||
| 11 | + "probabilities": { | ||
| 12 | + "fireball": 0.15569653823233248, | ||
| 13 | + "arcane_bolt": 0.33806895344532073, | ||
| 14 | + "shield": 0.25798423258461595, | ||
| 15 | + "misty_step": 0.12754081329484873, | ||
| 16 | + "sleep": 0.12070946244288222 | ||
| 17 | + }, | ||
| 18 | + "confidence": 0.17258619180665088 | ||
| 19 | + } | ||
| 20 | + }, | ||
| 21 | + "usage": { | ||
| 22 | + "input_tokens": 109, | ||
| 23 | + "output_tokens": 0 | ||
| 24 | + } | ||
| 25 | + }, | ||
| 26 | + "context": "spell: arcane_bolt (confidence 0.17)" | ||
| 27 | +} | ||
added
04-memory/.mm/sessions/20261005-091500-a1b2c3d4.json +48 -0 | new file mode 100644 | ||
| @@ -0,0 +1,48 @@ | ||
| 1 | +{ | |
| 2 | + "id": "20261005-091500-a1b2c3d4", | |
| 3 | + "cwd": ".", | |
| 4 | + "createdAt": "2026-10-05T09:15:00Z", | |
| 5 | + "updatedAt": "2026-10-05T09:40:00Z", | |
| 6 | + "messages": [ | |
| 7 | + { | |
| 8 | + "role": "system", | |
| 9 | + "content": [ | |
| 10 | + { | |
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | |
| 12 | + } | |
| 13 | + ] | |
| 14 | + }, | |
| 15 | + { | |
| 16 | + "role": "user", | |
| 17 | + "content": [ | |
| 18 | + { | |
| 19 | + "text": "We start bookshelf, a small Go web app to track the books I read. Which port should the API server listen on?" | |
| 20 | + } | |
| 21 | + ] | |
| 22 | + }, | |
| 23 | + { | |
| 24 | + "role": "model", | |
| 25 | + "content": [ | |
| 26 | + { | |
| 27 | + "text": "Let's use port 8417 for the API server: 8080 is already taken by the admin UI on your machine, and 8417 is free and easy to remember." | |
| 28 | + } | |
| 29 | + ] | |
| 30 | + }, | |
| 31 | + { | |
| 32 | + "role": "user", | |
| 33 | + "content": [ | |
| 34 | + { | |
| 35 | + "text": "ok, keep 8417. And the module name?" | |
| 36 | + } | |
| 37 | + ] | |
| 38 | + }, | |
| 39 | + { | |
| 40 | + "role": "model", | |
| 41 | + "content": [ | |
| 42 | + { | |
| 43 | + "text": "Module `github.com/k33g/bookshelf`, Go 1.26, standard library only for the HTTP side (net/http with the 1.22 routing patterns)." | |
| 44 | + } | |
| 45 | + ] | |
| 46 | + } | |
| 47 | + ] | |
| 48 | +} | |
| new file mode 100644 | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | +{ | ||
| 2 | + "id": "20261005-091500-a1b2c3d4", | ||
| 3 | + "cwd": ".", | ||
| 4 | + "createdAt": "2026-10-05T09:15:00Z", | ||
| 5 | + "updatedAt": "2026-10-05T09:40:00Z", | ||
| 6 | + "messages": [ | ||
| 7 | + { | ||
| 8 | + "role": "system", | ||
| 9 | + "content": [ | ||
| 10 | + { | ||
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | ||
| 12 | + } | ||
| 13 | + ] | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "role": "user", | ||
| 17 | + "content": [ | ||
| 18 | + { | ||
| 19 | + "text": "We start bookshelf, a small Go web app to track the books I read. Which port should the API server listen on?" | ||
| 20 | + } | ||
| 21 | + ] | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "role": "model", | ||
| 25 | + "content": [ | ||
| 26 | + { | ||
| 27 | + "text": "Let's use port 8417 for the API server: 8080 is already taken by the admin UI on your machine, and 8417 is free and easy to remember." | ||
| 28 | + } | ||
| 29 | + ] | ||
| 30 | + }, | ||
| 31 | + { | ||
| 32 | + "role": "user", | ||
| 33 | + "content": [ | ||
| 34 | + { | ||
| 35 | + "text": "ok, keep 8417. And the module name?" | ||
| 36 | + } | ||
| 37 | + ] | ||
| 38 | + }, | ||
| 39 | + { | ||
| 40 | + "role": "model", | ||
| 41 | + "content": [ | ||
| 42 | + { | ||
| 43 | + "text": "Module `github.com/k33g/bookshelf`, Go 1.26, standard library only for the HTTP side (net/http with the 1.22 routing patterns)." | ||
| 44 | + } | ||
| 45 | + ] | ||
| 46 | + } | ||
| 47 | + ] | ||
| 48 | +} | ||
added
04-memory/.mm/sessions/20261008-140000-b2c3d4e5.json +48 -0 | new file mode 100644 | ||
| @@ -0,0 +1,48 @@ | ||
| 1 | +{ | |
| 2 | + "id": "20261008-140000-b2c3d4e5", | |
| 3 | + "cwd": ".", | |
| 4 | + "createdAt": "2026-10-08T14:00:00Z", | |
| 5 | + "updatedAt": "2026-10-08T14:35:00Z", | |
| 6 | + "messages": [ | |
| 7 | + { | |
| 8 | + "role": "system", | |
| 9 | + "content": [ | |
| 10 | + { | |
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | |
| 12 | + } | |
| 13 | + ] | |
| 14 | + }, | |
| 15 | + { | |
| 16 | + "role": "user", | |
| 17 | + "content": [ | |
| 18 | + { | |
| 19 | + "text": "Postgres or SQLite for the storage?" | |
| 20 | + } | |
| 21 | + ] | |
| 22 | + }, | |
| 23 | + { | |
| 24 | + "role": "model", | |
| 25 | + "content": [ | |
| 26 | + { | |
| 27 | + "text": "SQLite: one user, nothing to run beside the app. The file is data/bookshelf.db, opened with modernc.org/sqlite (pure Go, no cgo)." | |
| 28 | + } | |
| 29 | + ] | |
| 30 | + }, | |
| 31 | + { | |
| 32 | + "role": "user", | |
| 33 | + "content": [ | |
| 34 | + { | |
| 35 | + "text": "How do we handle schema changes?" | |
| 36 | + } | |
| 37 | + ] | |
| 38 | + }, | |
| 39 | + { | |
| 40 | + "role": "model", | |
| 41 | + "content": [ | |
| 42 | + { | |
| 43 | + "text": "Plain SQL files in migrations/, numbered: 001_init.sql, 002_add_rating.sql… applied in order at start-up, the last one applied stored in a schema_version table." | |
| 44 | + } | |
| 45 | + ] | |
| 46 | + } | |
| 47 | + ] | |
| 48 | +} | |
| new file mode 100644 | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | +{ | ||
| 2 | + "id": "20261008-140000-b2c3d4e5", | ||
| 3 | + "cwd": ".", | ||
| 4 | + "createdAt": "2026-10-08T14:00:00Z", | ||
| 5 | + "updatedAt": "2026-10-08T14:35:00Z", | ||
| 6 | + "messages": [ | ||
| 7 | + { | ||
| 8 | + "role": "system", | ||
| 9 | + "content": [ | ||
| 10 | + { | ||
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | ||
| 12 | + } | ||
| 13 | + ] | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "role": "user", | ||
| 17 | + "content": [ | ||
| 18 | + { | ||
| 19 | + "text": "Postgres or SQLite for the storage?" | ||
| 20 | + } | ||
| 21 | + ] | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "role": "model", | ||
| 25 | + "content": [ | ||
| 26 | + { | ||
| 27 | + "text": "SQLite: one user, nothing to run beside the app. The file is data/bookshelf.db, opened with modernc.org/sqlite (pure Go, no cgo)." | ||
| 28 | + } | ||
| 29 | + ] | ||
| 30 | + }, | ||
| 31 | + { | ||
| 32 | + "role": "user", | ||
| 33 | + "content": [ | ||
| 34 | + { | ||
| 35 | + "text": "How do we handle schema changes?" | ||
| 36 | + } | ||
| 37 | + ] | ||
| 38 | + }, | ||
| 39 | + { | ||
| 40 | + "role": "model", | ||
| 41 | + "content": [ | ||
| 42 | + { | ||
| 43 | + "text": "Plain SQL files in migrations/, numbered: 001_init.sql, 002_add_rating.sql… applied in order at start-up, the last one applied stored in a schema_version table." | ||
| 44 | + } | ||
| 45 | + ] | ||
| 46 | + } | ||
| 47 | + ] | ||
| 48 | +} | ||
added
04-memory/.mm/sessions/20261012-101000-c3d4e5f6.json +48 -0 | new file mode 100644 | ||
| @@ -0,0 +1,48 @@ | ||
| 1 | +{ | |
| 2 | + "id": "20261012-101000-c3d4e5f6", | |
| 3 | + "cwd": ".", | |
| 4 | + "createdAt": "2026-10-12T10:10:00Z", | |
| 5 | + "updatedAt": "2026-10-12T10:30:00Z", | |
| 6 | + "messages": [ | |
| 7 | + { | |
| 8 | + "role": "system", | |
| 9 | + "content": [ | |
| 10 | + { | |
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | |
| 12 | + } | |
| 13 | + ] | |
| 14 | + }, | |
| 15 | + { | |
| 16 | + "role": "user", | |
| 17 | + "content": [ | |
| 18 | + { | |
| 19 | + "text": "Quel format pour les logs ?" | |
| 20 | + } | |
| 21 | + ] | |
| 22 | + }, | |
| 23 | + { | |
| 24 | + "role": "model", | |
| 25 | + "content": [ | |
| 26 | + { | |
| 27 | + "text": "log/slog en JSON sur la sortie standard, niveau info par défaut ; BOOKSHELF_DEBUG=1 passe au niveau debug. Pas de fichier de log : c'est systemd qui les garde." | |
| 28 | + } | |
| 29 | + ] | |
| 30 | + }, | |
| 31 | + { | |
| 32 | + "role": "user", | |
| 33 | + "content": [ | |
| 34 | + { | |
| 35 | + "text": "Et les erreurs HTTP ?" | |
| 36 | + } | |
| 37 | + ] | |
| 38 | + }, | |
| 39 | + { | |
| 40 | + "role": "model", | |
| 41 | + "content": [ | |
| 42 | + { | |
| 43 | + "text": "Toujours un corps JSON {\"error\": \"…\"} avec le bon code ; jamais le texte d'une erreur Go interne vers le client — on la journalise, on renvoie un message générique." | |
| 44 | + } | |
| 45 | + ] | |
| 46 | + } | |
| 47 | + ] | |
| 48 | +} | |
| new file mode 100644 | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | +{ | ||
| 2 | + "id": "20261012-101000-c3d4e5f6", | ||
| 3 | + "cwd": ".", | ||
| 4 | + "createdAt": "2026-10-12T10:10:00Z", | ||
| 5 | + "updatedAt": "2026-10-12T10:30:00Z", | ||
| 6 | + "messages": [ | ||
| 7 | + { | ||
| 8 | + "role": "system", | ||
| 9 | + "content": [ | ||
| 10 | + { | ||
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | ||
| 12 | + } | ||
| 13 | + ] | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "role": "user", | ||
| 17 | + "content": [ | ||
| 18 | + { | ||
| 19 | + "text": "Quel format pour les logs ?" | ||
| 20 | + } | ||
| 21 | + ] | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "role": "model", | ||
| 25 | + "content": [ | ||
| 26 | + { | ||
| 27 | + "text": "log/slog en JSON sur la sortie standard, niveau info par défaut ; BOOKSHELF_DEBUG=1 passe au niveau debug. Pas de fichier de log : c'est systemd qui les garde." | ||
| 28 | + } | ||
| 29 | + ] | ||
| 30 | + }, | ||
| 31 | + { | ||
| 32 | + "role": "user", | ||
| 33 | + "content": [ | ||
| 34 | + { | ||
| 35 | + "text": "Et les erreurs HTTP ?" | ||
| 36 | + } | ||
| 37 | + ] | ||
| 38 | + }, | ||
| 39 | + { | ||
| 40 | + "role": "model", | ||
| 41 | + "content": [ | ||
| 42 | + { | ||
| 43 | + "text": "Toujours un corps JSON {\"error\": \"…\"} avec le bon code ; jamais le texte d'une erreur Go interne vers le client — on la journalise, on renvoie un message générique." | ||
| 44 | + } | ||
| 45 | + ] | ||
| 46 | + } | ||
| 47 | + ] | ||
| 48 | +} | ||
added
04-memory/.mm/sessions/20261015-163000-d4e5f6a7.json +54 -0 | new file mode 100644 | ||
| @@ -0,0 +1,54 @@ | ||
| 1 | +{ | |
| 2 | + "id": "20261015-163000-d4e5f6a7", | |
| 3 | + "cwd": ".", | |
| 4 | + "createdAt": "2026-10-15T16:30:00Z", | |
| 5 | + "updatedAt": "2026-10-15T17:20:00Z", | |
| 6 | + "messages": [ | |
| 7 | + { | |
| 8 | + "role": "system", | |
| 9 | + "content": [ | |
| 10 | + { | |
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | |
| 12 | + } | |
| 13 | + ] | |
| 14 | + }, | |
| 15 | + { | |
| 16 | + "role": "user", | |
| 17 | + "metadata": { | |
| 18 | + "compact": "summary" | |
| 19 | + }, | |
| 20 | + "content": [ | |
| 21 | + { | |
| 22 | + "text": "[Context summary — the 6 earlier messages of this session (3 question(s), 0 command(s)) were compressed into the notes below. Treat them as notes, not as observations: re-read a file or re-run a command before relying on its content.]\n\n- Deployment: one static binary (CGO_ENABLED=0), copied to the VPS with scp, run by the systemd unit bookshelf.service.\n- Caddy in front, TLS automatic, reverse proxy to 127.0.0.1:8417.\n- Backups: a nightly cron copies data/bookshelf.db with `sqlite3 .backup` to /var/backups/bookshelf/, 14 days kept." | |
| 23 | + } | |
| 24 | + ] | |
| 25 | + }, | |
| 26 | + { | |
| 27 | + "role": "model", | |
| 28 | + "metadata": { | |
| 29 | + "compact": "summary" | |
| 30 | + }, | |
| 31 | + "content": [ | |
| 32 | + { | |
| 33 | + "text": "Understood — I will re-check files before editing them." | |
| 34 | + } | |
| 35 | + ] | |
| 36 | + }, | |
| 37 | + { | |
| 38 | + "role": "user", | |
| 39 | + "content": [ | |
| 40 | + { | |
| 41 | + "text": "Should the release be tagged?" | |
| 42 | + } | |
| 43 | + ] | |
| 44 | + }, | |
| 45 | + { | |
| 46 | + "role": "model", | |
| 47 | + "content": [ | |
| 48 | + { | |
| 49 | + "text": "Yes: tag vX.Y.Z on main, and the binary's version stamped with -ldflags \"-X main.version=vX.Y.Z\"." | |
| 50 | + } | |
| 51 | + ] | |
| 52 | + } | |
| 53 | + ] | |
| 54 | +} | |
| new file mode 100644 | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | +{ | ||
| 2 | + "id": "20261015-163000-d4e5f6a7", | ||
| 3 | + "cwd": ".", | ||
| 4 | + "createdAt": "2026-10-15T16:30:00Z", | ||
| 5 | + "updatedAt": "2026-10-15T17:20:00Z", | ||
| 6 | + "messages": [ | ||
| 7 | + { | ||
| 8 | + "role": "system", | ||
| 9 | + "content": [ | ||
| 10 | + { | ||
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | ||
| 12 | + } | ||
| 13 | + ] | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "role": "user", | ||
| 17 | + "metadata": { | ||
| 18 | + "compact": "summary" | ||
| 19 | + }, | ||
| 20 | + "content": [ | ||
| 21 | + { | ||
| 22 | + "text": "[Context summary — the 6 earlier messages of this session (3 question(s), 0 command(s)) were compressed into the notes below. Treat them as notes, not as observations: re-read a file or re-run a command before relying on its content.]\n\n- Deployment: one static binary (CGO_ENABLED=0), copied to the VPS with scp, run by the systemd unit bookshelf.service.\n- Caddy in front, TLS automatic, reverse proxy to 127.0.0.1:8417.\n- Backups: a nightly cron copies data/bookshelf.db with `sqlite3 .backup` to /var/backups/bookshelf/, 14 days kept." | ||
| 23 | + } | ||
| 24 | + ] | ||
| 25 | + }, | ||
| 26 | + { | ||
| 27 | + "role": "model", | ||
| 28 | + "metadata": { | ||
| 29 | + "compact": "summary" | ||
| 30 | + }, | ||
| 31 | + "content": [ | ||
| 32 | + { | ||
| 33 | + "text": "Understood — I will re-check files before editing them." | ||
| 34 | + } | ||
| 35 | + ] | ||
| 36 | + }, | ||
| 37 | + { | ||
| 38 | + "role": "user", | ||
| 39 | + "content": [ | ||
| 40 | + { | ||
| 41 | + "text": "Should the release be tagged?" | ||
| 42 | + } | ||
| 43 | + ] | ||
| 44 | + }, | ||
| 45 | + { | ||
| 46 | + "role": "model", | ||
| 47 | + "content": [ | ||
| 48 | + { | ||
| 49 | + "text": "Yes: tag vX.Y.Z on main, and the binary's version stamped with -ldflags \"-X main.version=vX.Y.Z\"." | ||
| 50 | + } | ||
| 51 | + ] | ||
| 52 | + } | ||
| 53 | + ] | ||
| 54 | +} | ||
added
04-memory/README.md +27 -0 | new file mode 100644 | ||
| @@ -0,0 +1,27 @@ | ||
| 1 | +# mini-me demo: searching earlier sessions | |
| 2 | + | |
| 3 | +Bob helps build **bookshelf**, a small Go web app. The project already has four earlier conversations, in which the API port, the storage, the logs and the deployment were decided. Bob does not remember them — each start is a new session — but he can search them: you with `/memory <words>`, Bob himself with the `search_memory` tool. The model is Qwen3.5 4B, served by [llmman](https://github.com/llmmanorg/llmman). | |
| 4 | + | |
| 5 | +## Run the demo | |
| 6 | + | |
| 7 | +```bash | |
| 8 | +llmman pull hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M | |
| 9 | +./reset.sh | |
| 10 | +mm -tui agent.yaml | |
| 11 | +# or mm tui agent.yaml | |
| 12 | +# or mm tui | |
| 13 | +``` | |
| 14 | + | |
| 15 | +Then ask Bob, who searches by himself: | |
| 16 | + | |
| 17 | +```text | |
| 18 | +Which port did we choose for the API? | |
| 19 | +Write config.go with the constants we decided before: the API port and the database file. | |
| 20 | +How do we deploy bookshelf, and where are the backups? | |
| 21 | +``` | |
| 22 | + | |
| 23 | +In the terminal each search shows as `🔎 search_memory: "<words>"` followed by its hits. | |
| 24 | + | |
| 25 | +## Good to know | |
| 26 | + | |
| 27 | +- **The search matches words, not meanings.** A question in another language than the session, or with other words for the same thing, finds nothing. | |
| \ No newline at end of file | ||
| new file mode 100644 | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | +# mini-me demo: searching earlier sessions | ||
| 2 | + | ||
| 3 | +Bob helps build **bookshelf**, a small Go web app. The project already has four earlier conversations, in which the API port, the storage, the logs and the deployment were decided. Bob does not remember them — each start is a new session — but he can search them: you with `/memory <words>`, Bob himself with the `search_memory` tool. The model is Qwen3.5 4B, served by [llmman](https://github.com/llmmanorg/llmman). | ||
| 4 | + | ||
| 5 | +## Run the demo | ||
| 6 | + | ||
| 7 | +```bash | ||
| 8 | +llmman pull hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M | ||
| 9 | +./reset.sh | ||
| 10 | +mm -tui agent.yaml | ||
| 11 | +# or mm tui agent.yaml | ||
| 12 | +# or mm tui | ||
| 13 | +``` | ||
| 14 | + | ||
| 15 | +Then ask Bob, who searches by himself: | ||
| 16 | + | ||
| 17 | +```text | ||
| 18 | +Which port did we choose for the API? | ||
| 19 | +Write config.go with the constants we decided before: the API port and the database file. | ||
| 20 | +How do we deploy bookshelf, and where are the backups? | ||
| 21 | +``` | ||
| 22 | + | ||
| 23 | +In the terminal each search shows as `🔎 search_memory: "<words>"` followed by its hits. | ||
| 24 | + | ||
| 25 | +## Good to know | ||
| 26 | + | ||
| 27 | +- **The search matches words, not meanings.** A question in another language than the session, or with other words for the same thing, finds nothing. | ||
| \ No newline at end of file | \ No newline at end of file | ||
added
04-memory/agent.yaml +79 -0 | new file mode 100644 | ||
| @@ -0,0 +1,79 @@ | ||
| 1 | +# Memory search — an assistant that remembers what was decided in the | |
| 2 | +# project's earlier conversations: | |
| 3 | +# | |
| 4 | +# /memory <words> the user's search through the stored sessions | |
| 5 | +# (sessions.searchMemory) | |
| 6 | +# search_memory the same search, called by the model when a question | |
| 7 | +# refers to something decided before | |
| 8 | +# (sessions.autoSearchMemory) | |
| 9 | +# | |
| 10 | +# The project is "bookshelf", a small Go web app; seed/ holds four earlier | |
| 11 | +# sessions (the API port, the storage, the logs — in French —, the | |
| 12 | +# deployment as a /compact summary). reset.sh copies them to .mm/sessions. | |
| 13 | +# | |
| 14 | +# llmman pull hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M | |
| 15 | +# llmman serve | |
| 16 | +# | |
| 17 | +# cd demos/memory-search | |
| 18 | +# ./reset.sh | |
| 19 | +# mm -tui agent.yaml or mm -p "…" agent.yaml | |
| 20 | + | |
| 21 | +provider: llmman | |
| 22 | +model: hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M | |
| 23 | +baseUrl: http://127.0.0.1:17434/v1 | |
| 24 | +fallback: http://host.docker.internal:17434/v1 | |
| 25 | +contextWindow: 16384 | |
| 26 | + | |
| 27 | +sessions: | |
| 28 | + enabled: true | |
| 29 | + dir: .mm/sessions | |
| 30 | + # /memory <words>, for you. | |
| 31 | + searchMemory: true | |
| 32 | + # search_memory, for the model. | |
| 33 | + autoSearchMemory: true | |
| 34 | + | |
| 35 | +# Writing files (config.go…) is enough to show the decisions being used; no | |
| 36 | +# bash, so the model cannot wander off grepping the session files. | |
| 37 | +yolo: true | |
| 38 | +bashTool: false | |
| 39 | +editTools: true | |
| 40 | +planTool: false | |
| 41 | +askUserTool: false | |
| 42 | +skillsDir: no-skills | |
| 43 | + | |
| 44 | +agentsMd: | |
| 45 | + enabled: false | |
| 46 | + | |
| 47 | +sampling: | |
| 48 | + temperature: 0.0 | |
| 49 | + parallel_tool_calls: false | |
| 50 | + max_tokens: 2048 | |
| 51 | + chat_template_kwargs: | |
| 52 | + enable_thinking: false | |
| 53 | + | |
| 54 | +maxTurns: 8 | |
| 55 | +watchdogTimeout: 2m | |
| 56 | +firstTokenTimeout: 3m | |
| 57 | +displayCommands: true | |
| 58 | + | |
| 59 | +acp: | |
| 60 | + name: bob | |
| 61 | + title: 📚 Bob (bookshelf, with a memory) | |
| 62 | + | |
| 63 | +system: | | |
| 64 | + Your name is Bob. You help build bookshelf, a small Go web app, in this | |
| 65 | + directory. When the user asks you to write or create a file, call | |
| 66 | + write_file with the whole content; do not only show the code. | |
| 67 | + | |
| 68 | + Earlier conversations about this project are stored. When the user refers | |
| 69 | + to something decided or said before ("the port we chose", "like last | |
| 70 | + time", "what did we decide for…"), or asks how THIS project does | |
| 71 | + something ("how do we handle…", "where are…", "which … do we use"), the | |
| 72 | + answer is a choice made for this project (port, storage, schema, logs, | |
| 73 | + errors, deployment…): call search_memory first with the key words, then | |
| 74 | + answer from what it found and name the session it came from. Never | |
| 75 | + invent a decision: if search_memory finds nothing, try other words once, | |
| 76 | + then say you do not know. | |
| 77 | + | |
| 78 | + For anything else (a greeting, a general Go question), answer directly, | |
| 79 | + in the user's language, without search_memory. | |
| new file mode 100644 | |||
| @@ -0,0 +1,79 @@ | |||
| 1 | +# Memory search — an assistant that remembers what was decided in the | ||
| 2 | +# project's earlier conversations: | ||
| 3 | +# | ||
| 4 | +# /memory <words> the user's search through the stored sessions | ||
| 5 | +# (sessions.searchMemory) | ||
| 6 | +# search_memory the same search, called by the model when a question | ||
| 7 | +# refers to something decided before | ||
| 8 | +# (sessions.autoSearchMemory) | ||
| 9 | +# | ||
| 10 | +# The project is "bookshelf", a small Go web app; seed/ holds four earlier | ||
| 11 | +# sessions (the API port, the storage, the logs — in French —, the | ||
| 12 | +# deployment as a /compact summary). reset.sh copies them to .mm/sessions. | ||
| 13 | +# | ||
| 14 | +# llmman pull hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M | ||
| 15 | +# llmman serve | ||
| 16 | +# | ||
| 17 | +# cd demos/memory-search | ||
| 18 | +# ./reset.sh | ||
| 19 | +# mm -tui agent.yaml or mm -p "…" agent.yaml | ||
| 20 | + | ||
| 21 | +provider: llmman | ||
| 22 | +model: hf.co/unsloth/Qwen3.5-4B-GGUF:Q4_K_M | ||
| 23 | +baseUrl: http://127.0.0.1:17434/v1 | ||
| 24 | +fallback: http://host.docker.internal:17434/v1 | ||
| 25 | +contextWindow: 16384 | ||
| 26 | + | ||
| 27 | +sessions: | ||
| 28 | + enabled: true | ||
| 29 | + dir: .mm/sessions | ||
| 30 | + # /memory <words>, for you. | ||
| 31 | + searchMemory: true | ||
| 32 | + # search_memory, for the model. | ||
| 33 | + autoSearchMemory: true | ||
| 34 | + | ||
| 35 | +# Writing files (config.go…) is enough to show the decisions being used; no | ||
| 36 | +# bash, so the model cannot wander off grepping the session files. | ||
| 37 | +yolo: true | ||
| 38 | +bashTool: false | ||
| 39 | +editTools: true | ||
| 40 | +planTool: false | ||
| 41 | +askUserTool: false | ||
| 42 | +skillsDir: no-skills | ||
| 43 | + | ||
| 44 | +agentsMd: | ||
| 45 | + enabled: false | ||
| 46 | + | ||
| 47 | +sampling: | ||
| 48 | + temperature: 0.0 | ||
| 49 | + parallel_tool_calls: false | ||
| 50 | + max_tokens: 2048 | ||
| 51 | + chat_template_kwargs: | ||
| 52 | + enable_thinking: false | ||
| 53 | + | ||
| 54 | +maxTurns: 8 | ||
| 55 | +watchdogTimeout: 2m | ||
| 56 | +firstTokenTimeout: 3m | ||
| 57 | +displayCommands: true | ||
| 58 | + | ||
| 59 | +acp: | ||
| 60 | + name: bob | ||
| 61 | + title: 📚 Bob (bookshelf, with a memory) | ||
| 62 | + | ||
| 63 | +system: | | ||
| 64 | + Your name is Bob. You help build bookshelf, a small Go web app, in this | ||
| 65 | + directory. When the user asks you to write or create a file, call | ||
| 66 | + write_file with the whole content; do not only show the code. | ||
| 67 | + | ||
| 68 | + Earlier conversations about this project are stored. When the user refers | ||
| 69 | + to something decided or said before ("the port we chose", "like last | ||
| 70 | + time", "what did we decide for…"), or asks how THIS project does | ||
| 71 | + something ("how do we handle…", "where are…", "which … do we use"), the | ||
| 72 | + answer is a choice made for this project (port, storage, schema, logs, | ||
| 73 | + errors, deployment…): call search_memory first with the key words, then | ||
| 74 | + answer from what it found and name the session it came from. Never | ||
| 75 | + invent a decision: if search_memory finds nothing, try other words once, | ||
| 76 | + then say you do not know. | ||
| 77 | + | ||
| 78 | + For anything else (a greeting, a general Go question), answer directly, | ||
| 79 | + in the user's language, without search_memory. | ||
added
04-memory/reset.sh +12 -0 | new file mode 100755 | ||
| @@ -0,0 +1,12 @@ | ||
| 1 | +#!/bin/sh | |
| 2 | +# reset.sh — puts the demo back as it ships: the four sessions of seed/ as the | |
| 3 | +# project's history, nothing else. Run it before the demo, and again to | |
| 4 | +# start over: every run adds its own session file, and the files the agent | |
| 5 | +# writes (*.go) are removed. | |
| 6 | +set -eu | |
| 7 | +cd "$(dirname "$0")" | |
| 8 | +rm -rf .mm | |
| 9 | +mkdir -p .mm/sessions | |
| 10 | +cp seed/*.json .mm/sessions/ | |
| 11 | +rm -f ./*.go | |
| 12 | +echo "history reset: $(ls .mm/sessions | wc -l | tr -d ' ') stored session(s) in .mm/sessions" | |
| new file mode 100755 | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | +#!/bin/sh | ||
| 2 | +# reset.sh — puts the demo back as it ships: the four sessions of seed/ as the | ||
| 3 | +# project's history, nothing else. Run it before the demo, and again to | ||
| 4 | +# start over: every run adds its own session file, and the files the agent | ||
| 5 | +# writes (*.go) are removed. | ||
| 6 | +set -eu | ||
| 7 | +cd "$(dirname "$0")" | ||
| 8 | +rm -rf .mm | ||
| 9 | +mkdir -p .mm/sessions | ||
| 10 | +cp seed/*.json .mm/sessions/ | ||
| 11 | +rm -f ./*.go | ||
| 12 | +echo "history reset: $(ls .mm/sessions | wc -l | tr -d ' ') stored session(s) in .mm/sessions" | ||
added
04-memory/seed/20261005-091500-a1b2c3d4.json +48 -0 | new file mode 100644 | ||
| @@ -0,0 +1,48 @@ | ||
| 1 | +{ | |
| 2 | + "id": "20261005-091500-a1b2c3d4", | |
| 3 | + "cwd": ".", | |
| 4 | + "createdAt": "2026-10-05T09:15:00Z", | |
| 5 | + "updatedAt": "2026-10-05T09:40:00Z", | |
| 6 | + "messages": [ | |
| 7 | + { | |
| 8 | + "role": "system", | |
| 9 | + "content": [ | |
| 10 | + { | |
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | |
| 12 | + } | |
| 13 | + ] | |
| 14 | + }, | |
| 15 | + { | |
| 16 | + "role": "user", | |
| 17 | + "content": [ | |
| 18 | + { | |
| 19 | + "text": "We start bookshelf, a small Go web app to track the books I read. Which port should the API server listen on?" | |
| 20 | + } | |
| 21 | + ] | |
| 22 | + }, | |
| 23 | + { | |
| 24 | + "role": "model", | |
| 25 | + "content": [ | |
| 26 | + { | |
| 27 | + "text": "Let's use port 8417 for the API server: 8080 is already taken by the admin UI on your machine, and 8417 is free and easy to remember." | |
| 28 | + } | |
| 29 | + ] | |
| 30 | + }, | |
| 31 | + { | |
| 32 | + "role": "user", | |
| 33 | + "content": [ | |
| 34 | + { | |
| 35 | + "text": "ok, keep 8417. And the module name?" | |
| 36 | + } | |
| 37 | + ] | |
| 38 | + }, | |
| 39 | + { | |
| 40 | + "role": "model", | |
| 41 | + "content": [ | |
| 42 | + { | |
| 43 | + "text": "Module `github.com/k33g/bookshelf`, Go 1.26, standard library only for the HTTP side (net/http with the 1.22 routing patterns)." | |
| 44 | + } | |
| 45 | + ] | |
| 46 | + } | |
| 47 | + ] | |
| 48 | +} | |
| new file mode 100644 | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | +{ | ||
| 2 | + "id": "20261005-091500-a1b2c3d4", | ||
| 3 | + "cwd": ".", | ||
| 4 | + "createdAt": "2026-10-05T09:15:00Z", | ||
| 5 | + "updatedAt": "2026-10-05T09:40:00Z", | ||
| 6 | + "messages": [ | ||
| 7 | + { | ||
| 8 | + "role": "system", | ||
| 9 | + "content": [ | ||
| 10 | + { | ||
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | ||
| 12 | + } | ||
| 13 | + ] | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "role": "user", | ||
| 17 | + "content": [ | ||
| 18 | + { | ||
| 19 | + "text": "We start bookshelf, a small Go web app to track the books I read. Which port should the API server listen on?" | ||
| 20 | + } | ||
| 21 | + ] | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "role": "model", | ||
| 25 | + "content": [ | ||
| 26 | + { | ||
| 27 | + "text": "Let's use port 8417 for the API server: 8080 is already taken by the admin UI on your machine, and 8417 is free and easy to remember." | ||
| 28 | + } | ||
| 29 | + ] | ||
| 30 | + }, | ||
| 31 | + { | ||
| 32 | + "role": "user", | ||
| 33 | + "content": [ | ||
| 34 | + { | ||
| 35 | + "text": "ok, keep 8417. And the module name?" | ||
| 36 | + } | ||
| 37 | + ] | ||
| 38 | + }, | ||
| 39 | + { | ||
| 40 | + "role": "model", | ||
| 41 | + "content": [ | ||
| 42 | + { | ||
| 43 | + "text": "Module `github.com/k33g/bookshelf`, Go 1.26, standard library only for the HTTP side (net/http with the 1.22 routing patterns)." | ||
| 44 | + } | ||
| 45 | + ] | ||
| 46 | + } | ||
| 47 | + ] | ||
| 48 | +} | ||
added
04-memory/seed/20261008-140000-b2c3d4e5.json +48 -0 | new file mode 100644 | ||
| @@ -0,0 +1,48 @@ | ||
| 1 | +{ | |
| 2 | + "id": "20261008-140000-b2c3d4e5", | |
| 3 | + "cwd": ".", | |
| 4 | + "createdAt": "2026-10-08T14:00:00Z", | |
| 5 | + "updatedAt": "2026-10-08T14:35:00Z", | |
| 6 | + "messages": [ | |
| 7 | + { | |
| 8 | + "role": "system", | |
| 9 | + "content": [ | |
| 10 | + { | |
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | |
| 12 | + } | |
| 13 | + ] | |
| 14 | + }, | |
| 15 | + { | |
| 16 | + "role": "user", | |
| 17 | + "content": [ | |
| 18 | + { | |
| 19 | + "text": "Postgres or SQLite for the storage?" | |
| 20 | + } | |
| 21 | + ] | |
| 22 | + }, | |
| 23 | + { | |
| 24 | + "role": "model", | |
| 25 | + "content": [ | |
| 26 | + { | |
| 27 | + "text": "SQLite: one user, nothing to run beside the app. The file is data/bookshelf.db, opened with modernc.org/sqlite (pure Go, no cgo)." | |
| 28 | + } | |
| 29 | + ] | |
| 30 | + }, | |
| 31 | + { | |
| 32 | + "role": "user", | |
| 33 | + "content": [ | |
| 34 | + { | |
| 35 | + "text": "How do we handle schema changes?" | |
| 36 | + } | |
| 37 | + ] | |
| 38 | + }, | |
| 39 | + { | |
| 40 | + "role": "model", | |
| 41 | + "content": [ | |
| 42 | + { | |
| 43 | + "text": "Plain SQL files in migrations/, numbered: 001_init.sql, 002_add_rating.sql… applied in order at start-up, the last one applied stored in a schema_version table." | |
| 44 | + } | |
| 45 | + ] | |
| 46 | + } | |
| 47 | + ] | |
| 48 | +} | |
| new file mode 100644 | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | +{ | ||
| 2 | + "id": "20261008-140000-b2c3d4e5", | ||
| 3 | + "cwd": ".", | ||
| 4 | + "createdAt": "2026-10-08T14:00:00Z", | ||
| 5 | + "updatedAt": "2026-10-08T14:35:00Z", | ||
| 6 | + "messages": [ | ||
| 7 | + { | ||
| 8 | + "role": "system", | ||
| 9 | + "content": [ | ||
| 10 | + { | ||
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | ||
| 12 | + } | ||
| 13 | + ] | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "role": "user", | ||
| 17 | + "content": [ | ||
| 18 | + { | ||
| 19 | + "text": "Postgres or SQLite for the storage?" | ||
| 20 | + } | ||
| 21 | + ] | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "role": "model", | ||
| 25 | + "content": [ | ||
| 26 | + { | ||
| 27 | + "text": "SQLite: one user, nothing to run beside the app. The file is data/bookshelf.db, opened with modernc.org/sqlite (pure Go, no cgo)." | ||
| 28 | + } | ||
| 29 | + ] | ||
| 30 | + }, | ||
| 31 | + { | ||
| 32 | + "role": "user", | ||
| 33 | + "content": [ | ||
| 34 | + { | ||
| 35 | + "text": "How do we handle schema changes?" | ||
| 36 | + } | ||
| 37 | + ] | ||
| 38 | + }, | ||
| 39 | + { | ||
| 40 | + "role": "model", | ||
| 41 | + "content": [ | ||
| 42 | + { | ||
| 43 | + "text": "Plain SQL files in migrations/, numbered: 001_init.sql, 002_add_rating.sql… applied in order at start-up, the last one applied stored in a schema_version table." | ||
| 44 | + } | ||
| 45 | + ] | ||
| 46 | + } | ||
| 47 | + ] | ||
| 48 | +} | ||
added
04-memory/seed/20261012-101000-c3d4e5f6.json +48 -0 | new file mode 100644 | ||
| @@ -0,0 +1,48 @@ | ||
| 1 | +{ | |
| 2 | + "id": "20261012-101000-c3d4e5f6", | |
| 3 | + "cwd": ".", | |
| 4 | + "createdAt": "2026-10-12T10:10:00Z", | |
| 5 | + "updatedAt": "2026-10-12T10:30:00Z", | |
| 6 | + "messages": [ | |
| 7 | + { | |
| 8 | + "role": "system", | |
| 9 | + "content": [ | |
| 10 | + { | |
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | |
| 12 | + } | |
| 13 | + ] | |
| 14 | + }, | |
| 15 | + { | |
| 16 | + "role": "user", | |
| 17 | + "content": [ | |
| 18 | + { | |
| 19 | + "text": "Quel format pour les logs ?" | |
| 20 | + } | |
| 21 | + ] | |
| 22 | + }, | |
| 23 | + { | |
| 24 | + "role": "model", | |
| 25 | + "content": [ | |
| 26 | + { | |
| 27 | + "text": "log/slog en JSON sur la sortie standard, niveau info par défaut ; BOOKSHELF_DEBUG=1 passe au niveau debug. Pas de fichier de log : c'est systemd qui les garde." | |
| 28 | + } | |
| 29 | + ] | |
| 30 | + }, | |
| 31 | + { | |
| 32 | + "role": "user", | |
| 33 | + "content": [ | |
| 34 | + { | |
| 35 | + "text": "Et les erreurs HTTP ?" | |
| 36 | + } | |
| 37 | + ] | |
| 38 | + }, | |
| 39 | + { | |
| 40 | + "role": "model", | |
| 41 | + "content": [ | |
| 42 | + { | |
| 43 | + "text": "Toujours un corps JSON {\"error\": \"…\"} avec le bon code ; jamais le texte d'une erreur Go interne vers le client — on la journalise, on renvoie un message générique." | |
| 44 | + } | |
| 45 | + ] | |
| 46 | + } | |
| 47 | + ] | |
| 48 | +} | |
| new file mode 100644 | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | +{ | ||
| 2 | + "id": "20261012-101000-c3d4e5f6", | ||
| 3 | + "cwd": ".", | ||
| 4 | + "createdAt": "2026-10-12T10:10:00Z", | ||
| 5 | + "updatedAt": "2026-10-12T10:30:00Z", | ||
| 6 | + "messages": [ | ||
| 7 | + { | ||
| 8 | + "role": "system", | ||
| 9 | + "content": [ | ||
| 10 | + { | ||
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | ||
| 12 | + } | ||
| 13 | + ] | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "role": "user", | ||
| 17 | + "content": [ | ||
| 18 | + { | ||
| 19 | + "text": "Quel format pour les logs ?" | ||
| 20 | + } | ||
| 21 | + ] | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "role": "model", | ||
| 25 | + "content": [ | ||
| 26 | + { | ||
| 27 | + "text": "log/slog en JSON sur la sortie standard, niveau info par défaut ; BOOKSHELF_DEBUG=1 passe au niveau debug. Pas de fichier de log : c'est systemd qui les garde." | ||
| 28 | + } | ||
| 29 | + ] | ||
| 30 | + }, | ||
| 31 | + { | ||
| 32 | + "role": "user", | ||
| 33 | + "content": [ | ||
| 34 | + { | ||
| 35 | + "text": "Et les erreurs HTTP ?" | ||
| 36 | + } | ||
| 37 | + ] | ||
| 38 | + }, | ||
| 39 | + { | ||
| 40 | + "role": "model", | ||
| 41 | + "content": [ | ||
| 42 | + { | ||
| 43 | + "text": "Toujours un corps JSON {\"error\": \"…\"} avec le bon code ; jamais le texte d'une erreur Go interne vers le client — on la journalise, on renvoie un message générique." | ||
| 44 | + } | ||
| 45 | + ] | ||
| 46 | + } | ||
| 47 | + ] | ||
| 48 | +} | ||
added
04-memory/seed/20261015-163000-d4e5f6a7.json +54 -0 | new file mode 100644 | ||
| @@ -0,0 +1,54 @@ | ||
| 1 | +{ | |
| 2 | + "id": "20261015-163000-d4e5f6a7", | |
| 3 | + "cwd": ".", | |
| 4 | + "createdAt": "2026-10-15T16:30:00Z", | |
| 5 | + "updatedAt": "2026-10-15T17:20:00Z", | |
| 6 | + "messages": [ | |
| 7 | + { | |
| 8 | + "role": "system", | |
| 9 | + "content": [ | |
| 10 | + { | |
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | |
| 12 | + } | |
| 13 | + ] | |
| 14 | + }, | |
| 15 | + { | |
| 16 | + "role": "user", | |
| 17 | + "metadata": { | |
| 18 | + "compact": "summary" | |
| 19 | + }, | |
| 20 | + "content": [ | |
| 21 | + { | |
| 22 | + "text": "[Context summary — the 6 earlier messages of this session (3 question(s), 0 command(s)) were compressed into the notes below. Treat them as notes, not as observations: re-read a file or re-run a command before relying on its content.]\n\n- Deployment: one static binary (CGO_ENABLED=0), copied to the VPS with scp, run by the systemd unit bookshelf.service.\n- Caddy in front, TLS automatic, reverse proxy to 127.0.0.1:8417.\n- Backups: a nightly cron copies data/bookshelf.db with `sqlite3 .backup` to /var/backups/bookshelf/, 14 days kept." | |
| 23 | + } | |
| 24 | + ] | |
| 25 | + }, | |
| 26 | + { | |
| 27 | + "role": "model", | |
| 28 | + "metadata": { | |
| 29 | + "compact": "summary" | |
| 30 | + }, | |
| 31 | + "content": [ | |
| 32 | + { | |
| 33 | + "text": "Understood — I will re-check files before editing them." | |
| 34 | + } | |
| 35 | + ] | |
| 36 | + }, | |
| 37 | + { | |
| 38 | + "role": "user", | |
| 39 | + "content": [ | |
| 40 | + { | |
| 41 | + "text": "Should the release be tagged?" | |
| 42 | + } | |
| 43 | + ] | |
| 44 | + }, | |
| 45 | + { | |
| 46 | + "role": "model", | |
| 47 | + "content": [ | |
| 48 | + { | |
| 49 | + "text": "Yes: tag vX.Y.Z on main, and the binary's version stamped with -ldflags \"-X main.version=vX.Y.Z\"." | |
| 50 | + } | |
| 51 | + ] | |
| 52 | + } | |
| 53 | + ] | |
| 54 | +} | |
| new file mode 100644 | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | +{ | ||
| 2 | + "id": "20261015-163000-d4e5f6a7", | ||
| 3 | + "cwd": ".", | ||
| 4 | + "createdAt": "2026-10-15T16:30:00Z", | ||
| 5 | + "updatedAt": "2026-10-15T17:20:00Z", | ||
| 6 | + "messages": [ | ||
| 7 | + { | ||
| 8 | + "role": "system", | ||
| 9 | + "content": [ | ||
| 10 | + { | ||
| 11 | + "text": "You are Bob, the assistant of the bookshelf project." | ||
| 12 | + } | ||
| 13 | + ] | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "role": "user", | ||
| 17 | + "metadata": { | ||
| 18 | + "compact": "summary" | ||
| 19 | + }, | ||
| 20 | + "content": [ | ||
| 21 | + { | ||
| 22 | + "text": "[Context summary — the 6 earlier messages of this session (3 question(s), 0 command(s)) were compressed into the notes below. Treat them as notes, not as observations: re-read a file or re-run a command before relying on its content.]\n\n- Deployment: one static binary (CGO_ENABLED=0), copied to the VPS with scp, run by the systemd unit bookshelf.service.\n- Caddy in front, TLS automatic, reverse proxy to 127.0.0.1:8417.\n- Backups: a nightly cron copies data/bookshelf.db with `sqlite3 .backup` to /var/backups/bookshelf/, 14 days kept." | ||
| 23 | + } | ||
| 24 | + ] | ||
| 25 | + }, | ||
| 26 | + { | ||
| 27 | + "role": "model", | ||
| 28 | + "metadata": { | ||
| 29 | + "compact": "summary" | ||
| 30 | + }, | ||
| 31 | + "content": [ | ||
| 32 | + { | ||
| 33 | + "text": "Understood — I will re-check files before editing them." | ||
| 34 | + } | ||
| 35 | + ] | ||
| 36 | + }, | ||
| 37 | + { | ||
| 38 | + "role": "user", | ||
| 39 | + "content": [ | ||
| 40 | + { | ||
| 41 | + "text": "Should the release be tagged?" | ||
| 42 | + } | ||
| 43 | + ] | ||
| 44 | + }, | ||
| 45 | + { | ||
| 46 | + "role": "model", | ||
| 47 | + "content": [ | ||
| 48 | + { | ||
| 49 | + "text": "Yes: tag vX.Y.Z on main, and the binary's version stamped with -ldflags \"-X main.version=vX.Y.Z\"." | ||
| 50 | + } | ||
| 51 | + ] | ||
| 52 | + } | ||
| 53 | + ] | ||
| 54 | +} | ||