Files
Loki/rust/loki-rs/tests/parity_tools/outils.json
T
Claude a739534104 Lot 7 : outils fichiers et shell exécutés par la façade
Quand la façade tient la conversation (LOKI_CHAT=rust), read, grep, glob,
write, edit, bash et ask s'exécutent dans rust/loki-rs/src/tools au lieu de
repartir au Go par /internal/v1/tool/exec : mêmes garde-fous dans le même
ordre (commande catastrophique, « & » final en mode Code, bac à sable du
mode Code, dossier mémoire interdit, lu avant d'écrire), même diff pour
l'UI, même nettoyage de la sortie du shell. Le jeton de l'API interne est
retiré de l'environnement du shell de l'agent.

L'état partagé reste au Go, en un seul exemplaire (sous-agents et tâches
le lisent aussi) : POST /internal/v1/tool/context (dossier de travail,
dossier mémoire, cible distante), /tool/tracker (lecture notée, contrôle
avant écriture), /tool/wrote (note après écriture, diagnostics LSP).
Repli sur le Go pour une cible distante ou un contexte indisponible.

Parité : internal/loki/parity_tools_test.go passe 58 appels à execTool sur
une arborescence de test et range le journal dans tests/parity_tools ;
tests/tools.rs le retrouve à l'identique avec exec_local. Écarts assumés
consignés dans docs/superpowers/specs/2026-10-15-rust-migration-lot7-outils-design.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
2026-10-15 11:51:20 +00:00

768 lines
33 KiB
JSON

{
"cwd": "ws",
"memory_dir": "memory/generale",
"files": [
{
"path": "ws/a.txt",
"content": "ligne 1\nligne 2\nligne 3\n",
"age": 50
},
{
"path": "ws/b.txt",
"content": "alpha\nbeta\n",
"age": 40
},
{
"path": "ws/vide.txt",
"content": "",
"age": 30
},
{
"path": "ws/long.txt",
"content": "éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé\nfin\n",
"age": 20
},
{
"path": "ws/crlf.txt",
"content": "un\r\ndeux\r\ntrois\r\n",
"age": 10
},
{
"path": "ws/bin.dat",
"content": "PK\u0000\u0001binaire",
"age": 60
},
{
"path": "ws/src/main.go",
"content": "package main\n\nfunc main() { x := 1 }\n",
"age": 5
},
{
"path": "ws/src/lib/util.go",
"content": "package lib\n// x marque\n",
"age": 3
},
{
"path": "ws/src/lib/notes.md",
"content": "x dans les notes\n",
"age": 4
},
{
"path": "ws/node_modules/dep/index.js",
"content": "ligne cachée\n",
"age": 70
},
{
"path": "ws/beaucoup.txt",
"content": "aiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\n",
"age": 80
},
{
"path": "dehors.txt",
"content": "hors du dossier\n",
"age": 90
}
],
"cases": [
{
"name": "lecture",
"tool": "read",
"args": {
"file": "a.txt"
},
"label": "a.txt",
"result": "1: ligne 1\n2: ligne 2\n3: ligne 3"
},
{
"name": "lecture_fenetre",
"tool": "read",
"args": {
"file": "a.txt",
"limit": 1,
"offset": 2
},
"label": "a.txt",
"result": "2: ligne 2\n… (1 lignes restantes — relis avec offset=3)"
},
{
"name": "lecture_fenetre_decimale",
"tool": "read",
"args": {
"file": "a.txt",
"limit": "3",
"offset": 2.7
},
"label": "a.txt",
"result": "2: ligne 2\n3: ligne 3"
},
{
"name": "lecture_chemin_vide",
"tool": "read",
"args": {
"file": " "
},
"label": " ",
"result": "[erreur] chemin vide"
},
{
"name": "lecture_absent",
"tool": "read",
"args": {
"file": "absent.txt"
},
"label": "absent.txt",
"result": "[erreur] open {{ROOT}}/ws/absent.txt: no such file or directory"
},
{
"name": "lecture_dossier",
"tool": "read",
"args": {
"file": "src"
},
"label": "src",
"result": "[erreur] read {{ROOT}}/ws/src: is a directory"
},
{
"name": "lecture_binaire",
"tool": "read",
"args": {
"file": "bin.dat"
},
"label": "bin.dat",
"result": "[binaire] bin.dat (11 octets) — pas un fichier texte"
},
{
"name": "lecture_au_dela",
"tool": "read",
"args": {
"file": "a.txt",
"offset": 99
},
"label": "a.txt",
"result": "[erreur] offset 99 > 3 lignes"
},
{
"name": "lecture_ligne_longue",
"tool": "read",
"args": {
"file": "long.txt"
},
"label": "long.txt",
"result": "1: éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé…\n2: fin"
},
{
"name": "lecture_fichier_vide",
"tool": "read",
"args": {
"file": "vide.txt"
},
"label": "vide.txt",
"result": "[erreur] offset 1 > 0 lignes"
},
{
"name": "lecture_absolue",
"tool": "read",
"args": {
"file": "{{ROOT}}/dehors.txt"
},
"label": "{{ROOT}}/dehors.txt",
"result": "1: hors du dossier"
},
{
"name": "lecture_relative_sortante",
"tool": "read",
"args": {
"file": "src/../../dehors.txt"
},
"label": "src/../../dehors.txt",
"result": "1: hors du dossier"
},
{
"name": "lecture_code_hors_dossier",
"tool": "read",
"args": {
"file": "../dehors.txt"
},
"code": true,
"label": "../dehors.txt",
"result": "[refusé] ../dehors.txt est hors du dossier de cette discussion. En mode code, tous les fichiers vivent dans le dossier de travail — utilise des chemins relatifs."
},
{
"name": "lecture_code",
"tool": "read",
"args": {
"file": "b.txt"
},
"code": true,
"label": "b.txt",
"result": "1: alpha\n2: beta"
},
{
"name": "grep",
"tool": "grep",
"args": {
"pattern": "ligne [12]"
},
"label": "ligne [12]",
"result": "a.txt:1: ligne 1\na.txt:2: ligne 2"
},
{
"name": "grep_filtre",
"tool": "grep",
"args": {
"glob": "*.go",
"pattern": "x"
},
"label": "x",
"result": "src/lib/util.go:2: // x marque\nsrc/main.go:3: func main() { x := 1 }"
},
{
"name": "grep_filtre_classe",
"tool": "grep",
"args": {
"glob": "[mn]*",
"pattern": "x"
},
"label": "x",
"result": "src/lib/notes.md:1: x dans les notes\nsrc/main.go:3: func main() { x := 1 }"
},
{
"name": "grep_fichier",
"tool": "grep",
"args": {
"path": "b.txt",
"pattern": "beta"
},
"label": "beta",
"result": ".:2: beta"
},
{
"name": "grep_sous_dossier",
"tool": "grep",
"args": {
"path": "src/lib",
"pattern": "package"
},
"label": "package",
"result": "util.go:1: package lib"
},
{
"name": "grep_point",
"tool": "grep",
"args": {
"path": ".",
"pattern": "alpha"
},
"label": "alpha",
"result": "b.txt:1: alpha"
},
{
"name": "grep_aucun",
"tool": "grep",
"args": {
"pattern": "zzz"
},
"label": "zzz",
"result": "[aucun résultat]"
},
{
"name": "grep_motif_vide",
"tool": "grep",
"args": {
"pattern": " "
},
"label": " ",
"result": "[erreur] motif vide"
},
{
"name": "grep_plafond",
"tool": "grep",
"args": {
"pattern": "aiguille"
},
"label": "aiguille",
"result": "beaucoup.txt:1: aiguille\nbeaucoup.txt:2: aiguille\nbeaucoup.txt:3: aiguille\nbeaucoup.txt:4: aiguille\nbeaucoup.txt:5: aiguille\nbeaucoup.txt:6: aiguille\nbeaucoup.txt:7: aiguille\nbeaucoup.txt:8: aiguille\nbeaucoup.txt:9: aiguille\nbeaucoup.txt:10: aiguille\nbeaucoup.txt:11: aiguille\nbeaucoup.txt:12: aiguille\nbeaucoup.txt:13: aiguille\nbeaucoup.txt:14: aiguille\nbeaucoup.txt:15: aiguille\nbeaucoup.txt:16: aiguille\nbeaucoup.txt:17: aiguille\nbeaucoup.txt:18: aiguille\nbeaucoup.txt:19: aiguille\nbeaucoup.txt:20: aiguille\nbeaucoup.txt:21: aiguille\nbeaucoup.txt:22: aiguille\nbeaucoup.txt:23: aiguille\nbeaucoup.txt:24: aiguille\nbeaucoup.txt:25: aiguille\nbeaucoup.txt:26: aiguille\nbeaucoup.txt:27: aiguille\nbeaucoup.txt:28: aiguille\nbeaucoup.txt:29: aiguille\nbeaucoup.txt:30: aiguille\nbeaucoup.txt:31: aiguille\nbeaucoup.txt:32: aiguille\nbeaucoup.txt:33: aiguille\nbeaucoup.txt:34: aiguille\nbeaucoup.txt:35: aiguille\nbeaucoup.txt:36: aiguille\nbeaucoup.txt:37: aiguille\nbeaucoup.txt:38: aiguille\nbeaucoup.txt:39: aiguille\nbeaucoup.txt:40: aiguille\nbeaucoup.txt:41: aiguille\nbeaucoup.txt:42: aiguille\nbeaucoup.txt:43: aiguille\nbeaucoup.txt:44: aiguille\nbeaucoup.txt:45: aiguille\nbeaucoup.txt:46: aiguille\nbeaucoup.txt:47: aiguille\nbeaucoup.txt:48: aiguille\nbeaucoup.txt:49: aiguille\nbeaucoup.txt:50: aiguille\nbeaucoup.txt:51: aiguille\nbeaucoup.txt:52: aiguille\nbeaucoup.txt:53: aiguille\nbeaucoup.txt:54: aiguille\nbeaucoup.txt:55: aiguille\nbeaucoup.txt:56: aiguille\nbeaucoup.txt:57: aiguille\nbeaucoup.txt:58: aiguille\nbeaucoup.txt:59: aiguille\nbeaucoup.txt:60: aiguille\n… (plafond de 60 résultats atteint — affine le motif)"
},
{
"name": "grep_absent",
"tool": "grep",
"args": {
"path": "nulle-part",
"pattern": "a"
},
"label": "a",
"result": "[aucun résultat]"
},
{
"name": "grep_code_hors_dossier",
"tool": "grep",
"args": {
"path": "{{ROOT}}",
"pattern": "a"
},
"code": true,
"label": "a",
"result": "[refusé] {{ROOT}} est hors du dossier de cette discussion. En mode code, tous les fichiers vivent dans le dossier de travail — utilise des chemins relatifs."
},
{
"name": "glob_go",
"tool": "glob",
"args": {
"pattern": "**/*.go"
},
"label": "**/*.go",
"result": "src/lib/util.go\nsrc/main.go"
},
{
"name": "glob_racine",
"tool": "glob",
"args": {
"pattern": "*.txt"
},
"label": "*.txt",
"result": "crlf.txt\nlong.txt\nvide.txt\nb.txt\na.txt\nbeaucoup.txt"
},
{
"name": "glob_point",
"tool": "glob",
"args": {
"pattern": "./src/*"
},
"label": "./src/*",
"result": "src/main.go"
},
{
"name": "glob_aucun",
"tool": "glob",
"args": {
"pattern": "*.rs"
},
"label": "*.rs",
"result": "[aucun fichier]"
},
{
"name": "glob_vide",
"tool": "glob",
"args": {
"pattern": ""
},
"label": "",
"result": "[erreur] motif vide"
},
{
"name": "question",
"tool": "ask",
"args": {
"options": [
"a",
" ",
"b",
"c",
"d",
"e"
],
"question": "Lequel ?"
},
"label": "Lequel ?",
"result": "[question posée à l'utilisateur] Termine ton tour MAINTENANT sans appeler d'autre outil : sa réponse arrivera comme prochain message.",
"ask": {
"question": "Lequel ?",
"options": [
"a",
"b",
"c",
"d"
]
}
},
{
"name": "question_vide",
"tool": "ask",
"args": {
"question": ""
},
"label": "",
"result": "[erreur] question vide"
},
{
"name": "ecriture_neuve",
"tool": "write",
"args": {
"content": "un\ndeux\n",
"file": "neuf/n.txt"
},
"label": "neuf/n.txt",
"result": "[ok] {{ROOT}}/ws/neuf/n.txt créé (8 octets)",
"diff": [
{
"op": "+",
"text": "un"
},
{
"op": "+",
"text": "deux"
}
],
"added": 2
},
{
"name": "ecriture_existant",
"tool": "write",
"args": {
"content": "remplacé\n",
"file": "b.txt"
},
"label": "b.txt",
"result": "[ok] {{ROOT}}/ws/b.txt réécrit (10 octets)",
"diff": [
{
"op": "+",
"text": "remplacé"
}
],
"added": 1
},
{
"name": "ecriture_memoire",
"tool": "write",
"args": {
"content": "x\n",
"file": "{{MEM}}/x.md"
},
"label": "{{ROOT}}/memory/generale/x.md",
"result": "[refusé] pas d'accès direct au dossier {{ROOT}}/memory/generale. Utilise les outils mem_* (mem_search/mem_read/mem_add/mem_edit/mem_delete).",
"diff": [
{
"op": "+",
"text": "x"
}
],
"added": 1
},
{
"name": "ecriture_chemin_vide",
"tool": "write",
"args": {
"content": "x",
"file": ""
},
"label": "",
"result": "[erreur] chemin vide"
},
{
"name": "ecriture_code_non_lu",
"tool": "write",
"args": {
"content": "x\n",
"file": "src/lib/notes.md"
},
"code": true,
"label": "src/lib/notes.md",
"result": "[refusé] {{ROOT}}/ws/src/lib/notes.md existe mais tu ne l'as pas lu dans cette discussion. Lis-le d'abord (outil read), puis modifie-le."
},
{
"name": "ecriture_code_hors_dossier",
"tool": "write",
"args": {
"content": "x\n",
"file": "../evade.txt"
},
"code": true,
"label": "../evade.txt",
"result": "[refusé] ../evade.txt est hors du dossier de cette discussion. En mode code, tous les fichiers vivent dans le dossier de travail — utilise des chemins relatifs."
},
{
"name": "ecriture_code_neuve",
"tool": "write",
"args": {
"content": "c\n",
"file": "code.txt"
},
"code": true,
"label": "code.txt",
"result": "[ok] {{ROOT}}/ws/code.txt créé (2 octets)",
"diff": [
{
"op": "+",
"text": "c"
}
],
"added": 1
},
{
"name": "edition",
"tool": "edit",
"args": {
"file": "a.txt",
"new": "ligne deux",
"old": "ligne 2"
},
"label": "a.txt",
"result": "[ok] {{ROOT}}/ws/a.txt modifié (1 remplacement)",
"diff": [
{
"op": "-",
"text": "ligne 2"
},
{
"op": "+",
"text": "ligne deux"
}
],
"added": 1,
"removed": 1
},
{
"name": "edition_deja_faite",
"tool": "edit",
"args": {
"file": "a.txt",
"new": "ligne deux",
"old": "ligne 2"
},
"label": "a.txt",
"result": "[ok] déjà à jour — le fichier contient déjà cette modification",
"diff": [
{
"op": "-",
"text": "ligne 2"
},
{
"op": "+",
"text": "ligne deux"
}
],
"added": 1,
"removed": 1
},
{
"name": "edition_introuvable",
"tool": "edit",
"args": {
"file": "a.txt",
"new": "y",
"old": "zzz"
},
"label": "a.txt",
"result": "[erreur] old introuvable dans le fichier"
},
{
"name": "edition_ambigue",
"tool": "edit",
"args": {
"file": "a.txt",
"new": "l",
"old": "ligne"
},
"label": "a.txt",
"result": "[erreur] old apparaît 3 fois — ajoute du contexte pour le rendre unique"
},
{
"name": "edition_crlf",
"tool": "edit",
"args": {
"file": "crlf.txt",
"new": "2\n3",
"old": "deux\ntrois"
},
"label": "crlf.txt",
"result": "[ok] {{ROOT}}/ws/crlf.txt modifié (1 remplacement)",
"diff": [
{
"op": "-",
"text": "deux"
},
{
"op": "-",
"text": "trois"
},
{
"op": "+",
"text": "2"
},
{
"op": "+",
"text": "3"
}
],
"added": 2,
"removed": 2
},
{
"name": "edition_old_vide",
"tool": "edit",
"args": {
"file": "a.txt",
"new": "y",
"old": ""
},
"label": "a.txt",
"result": "[erreur] old vide"
},
{
"name": "edition_fichier_absent",
"tool": "edit",
"args": {
"file": "absent.txt",
"new": "b",
"old": "a"
},
"label": "absent.txt",
"result": "[erreur] open {{ROOT}}/ws/absent.txt: no such file or directory"
},
{
"name": "edition_code_non_lu",
"tool": "edit",
"args": {
"file": "src/main.go",
"new": "x := 2",
"old": "x := 1"
},
"code": true,
"label": "src/main.go",
"result": "[refusé] {{ROOT}}/ws/src/main.go existe mais tu ne l'as pas lu dans cette discussion. Lis-le d'abord (outil read), puis modifie-le."
},
{
"name": "edition_code_apres_lecture",
"tool": "edit",
"args": {
"file": "b.txt",
"new": "rem",
"old": "remplacé"
},
"code": true,
"label": "b.txt",
"result": "[ok] {{ROOT}}/ws/b.txt modifié (1 remplacement)",
"diff": [
{
"op": "-",
"text": "remplacé"
},
{
"op": "+",
"text": "rem"
}
],
"added": 1,
"removed": 1
},
{
"name": "shell",
"tool": "bash",
"args": {
"command": "echo bonjour"
},
"unix": true,
"label": "echo bonjour",
"result": "exit: 0 · {{DUR}}\n\nstdout:\nbonjour\n"
},
{
"name": "shell_sortie_et_erreurs",
"tool": "bash",
"args": {
"command": "echo out; echo err >&2; exit 3"
},
"unix": true,
"label": "echo out; echo err >&2; exit 3",
"result": "exit: 3 · {{DUR}}\n\nstdout:\nout\n\n\nstderr:\nerr\n"
},
{
"name": "shell_tail",
"tool": "bash",
"args": {
"command": "printf 'a\\nb\\nc\\n' | tail -2"
},
"unix": true,
"label": "printf 'a\\nb\\nc\\n' | tail -2",
"result": "exit: 0 · {{DUR}}\n\nstdout:\nb\nc"
},
{
"name": "shell_ansi",
"tool": "bash",
"args": {
"command": "printf '\\033[31mrouge\\033[0m\\n'"
},
"unix": true,
"label": "printf '\\033[31mrouge\\033[0m\\n'",
"result": "exit: 0 · {{DUR}}\n\nstdout:\nrouge\n"
},
{
"name": "shell_dossier",
"tool": "bash",
"args": {
"command": "ls src"
},
"unix": true,
"label": "ls src",
"result": "exit: 0 · {{DUR}}\n\nstdout:\nlib\nmain.go\n"
},
{
"name": "shell_longue_sortie",
"tool": "bash",
"args": {
"command": "seq 1 3000"
},
"unix": true,
"label": "seq 1 3000",
"result": "exit: 0 · {{DUR}}\n\nstdout:\n[sortie tronquée : 13893 caractères au total, seuls les 8000 derniers sont gardés]\n1401\n1402\n1403\n1404\n1405\n1406\n1407\n1408\n1409\n1410\n1411\n1412\n1413\n1414\n1415\n1416\n1417\n1418\n1419\n1420\n1421\n1422\n1423\n1424\n1425\n1426\n1427\n1428\n1429\n1430\n1431\n1432\n1433\n1434\n1435\n1436\n1437\n1438\n1439\n1440\n1441\n1442\n1443\n1444\n1445\n1446\n1447\n1448\n1449\n1450\n1451\n1452\n1453\n1454\n1455\n1456\n1457\n1458\n1459\n1460\n1461\n1462\n1463\n1464\n1465\n1466\n1467\n1468\n1469\n1470\n1471\n1472\n1473\n1474\n1475\n1476\n1477\n1478\n1479\n1480\n1481\n1482\n1483\n1484\n1485\n1486\n1487\n1488\n1489\n1490\n1491\n1492\n1493\n1494\n1495\n1496\n1497\n1498\n1499\n1500\n1501\n1502\n1503\n1504\n1505\n1506\n1507\n1508\n1509\n1510\n1511\n1512\n1513\n1514\n1515\n1516\n1517\n1518\n1519\n1520\n1521\n1522\n1523\n1524\n1525\n1526\n1527\n1528\n1529\n1530\n1531\n1532\n1533\n1534\n1535\n1536\n1537\n1538\n1539\n1540\n1541\n1542\n1543\n1544\n1545\n1546\n1547\n1548\n1549\n1550\n1551\n1552\n1553\n1554\n1555\n1556\n1557\n1558\n1559\n1560\n1561\n1562\n1563\n1564\n1565\n1566\n1567\n1568\n1569\n1570\n1571\n1572\n1573\n1574\n1575\n1576\n1577\n1578\n1579\n1580\n1581\n1582\n1583\n1584\n1585\n1586\n1587\n1588\n1589\n1590\n1591\n1592\n1593\n1594\n1595\n1596\n1597\n1598\n1599\n1600\n1601\n1602\n1603\n1604\n1605\n1606\n1607\n1608\n1609\n1610\n1611\n1612\n1613\n1614\n1615\n1616\n1617\n1618\n1619\n1620\n1621\n1622\n1623\n1624\n1625\n1626\n1627\n1628\n1629\n1630\n1631\n1632\n1633\n1634\n1635\n1636\n1637\n1638\n1639\n1640\n1641\n1642\n1643\n1644\n1645\n1646\n1647\n1648\n1649\n1650\n1651\n1652\n1653\n1654\n1655\n1656\n1657\n1658\n1659\n1660\n1661\n1662\n1663\n1664\n1665\n1666\n1667\n1668\n1669\n1670\n1671\n1672\n1673\n1674\n1675\n1676\n1677\n1678\n1679\n1680\n1681\n1682\n1683\n1684\n1685\n1686\n1687\n1688\n1689\n1690\n1691\n1692\n1693\n1694\n1695\n1696\n1697\n1698\n1699\n1700\n1701\n1702\n1703\n1704\n1705\n1706\n1707\n1708\n1709\n1710\n1711\n1712\n1713\n1714\n1715\n1716\n1717\n1718\n1719\n1720\n1721\n1722\n1723\n1724\n1725\n1726\n1727\n1728\n1729\n1730\n1731\n1732\n1733\n1734\n1735\n1736\n1737\n1738\n1739\n1740\n1741\n1742\n1743\n1744\n1745\n1746\n1747\n1748\n1749\n1750\n1751\n1752\n1753\n1754\n1755\n1756\n1757\n1758\n1759\n1760\n1761\n1762\n1763\n1764\n1765\n1766\n1767\n1768\n1769\n1770\n1771\n1772\n1773\n1774\n1775\n1776\n1777\n1778\n1779\n1780\n1781\n1782\n1783\n1784\n1785\n1786\n1787\n1788\n1789\n1790\n1791\n1792\n1793\n1794\n1795\n1796\n1797\n1798\n1799\n1800\n1801\n1802\n1803\n1804\n1805\n1806\n1807\n1808\n1809\n1810\n1811\n1812\n1813\n1814\n1815\n1816\n1817\n1818\n1819\n1820\n1821\n1822\n1823\n1824\n1825\n1826\n1827\n1828\n1829\n1830\n1831\n1832\n1833\n1834\n1835\n1836\n1837\n1838\n1839\n1840\n1841\n1842\n1843\n1844\n1845\n1846\n1847\n1848\n1849\n1850\n1851\n1852\n1853\n1854\n1855\n1856\n1857\n1858\n1859\n1860\n1861\n1862\n1863\n1864\n1865\n1866\n1867\n1868\n1869\n1870\n1871\n1872\n1873\n1874\n1875\n1876\n1877\n1878\n1879\n1880\n1881\n1882\n1883\n1884\n1885\n1886\n1887\n1888\n1889\n1890\n1891\n1892\n1893\n1894\n1895\n1896\n1897\n1898\n1899\n1900\n1901\n1902\n1903\n1904\n1905\n1906\n1907\n1908\n1909\n1910\n1911\n1912\n1913\n1914\n1915\n1916\n1917\n1918\n1919\n1920\n1921\n1922\n1923\n1924\n1925\n1926\n1927\n1928\n1929\n1930\n1931\n1932\n1933\n1934\n1935\n1936\n1937\n1938\n1939\n1940\n1941\n1942\n1943\n1944\n1945\n1946\n1947\n1948\n1949\n1950\n1951\n1952\n1953\n1954\n1955\n1956\n1957\n1958\n1959\n1960\n1961\n1962\n1963\n1964\n1965\n1966\n1967\n1968\n1969\n1970\n1971\n1972\n1973\n1974\n1975\n1976\n1977\n1978\n1979\n1980\n1981\n1982\n1983\n1984\n1985\n1986\n1987\n1988\n1989\n1990\n1991\n1992\n1993\n1994\n1995\n1996\n1997\n1998\n1999\n2000\n2001\n2002\n2003\n2004\n2005\n2006\n2007\n2008\n2009\n2010\n2011\n2012\n2013\n2014\n2015\n2016\n2017\n2018\n2019\n2020\n2021\n2022\n2023\n2024\n2025\n2026\n2027\n2028\n2029\n2030\n2031\n2032\n2033\n2034\n2035\n2036\n2037\n2038\n2039\n2040\n2041\n2042\n2043\n2044\n2045\n2046\n2047\n2048\n2049\n2050\n2051\n2052\n2053\n2054\n2055\n2056\n2057\n2058\n2059\n2060\n2061\n2062\n2063\n2064\n2065\n2066\n2067\n2068\n2069\n2070\n2071\n2072\n2073\n2074\n2075\n2076\n2077\n2078\n2079\n2080\n2081\n2082\n2083\n2084\n2085\n2086\n2087\n2088\n2089\n2090\n2091\n2092\n2093\n2094\n2095\n2096\n2097\n2098\n2099\n2100\n2101\n2102\n2103\n2104\n2105\n2106\n2107\n2108\n2109\n2110\n2111\n2112\n2113\n2114\n2115\n2116\n2117\n2118\n2119\n2120\n2121\n2122\n2123\n2124\n2125\n2126\n2127\n2128\n2129\n2130\n2131\n2132\n2133\n2134\n2135\n2136\n2137\n2138\n2139\n2140\n2141\n2142\n2143\n2144\n2145\n2146\n2147\n2148\n2149\n2150\n2151\n2152\n2153\n2154\n2155\n2156\n2157\n2158\n2159\n2160\n2161\n2162\n2163\n2164\n2165\n2166\n2167\n2168\n2169\n2170\n2171\n2172\n2173\n2174\n2175\n2176\n2177\n2178\n2179\n2180\n2181\n2182\n2183\n2184\n2185\n2186\n2187\n2188\n2189\n2190\n2191\n2192\n2193\n2194\n2195\n2196\n2197\n2198\n2199\n2200\n2201\n2202\n2203\n2204\n2205\n2206\n2207\n2208\n2209\n2210\n2211\n2212\n2213\n2214\n2215\n2216\n2217\n2218\n2219\n2220\n2221\n2222\n2223\n2224\n2225\n2226\n2227\n2228\n2229\n2230\n2231\n2232\n2233\n2234\n2235\n2236\n2237\n2238\n2239\n2240\n2241\n2242\n2243\n2244\n2245\n2246\n2247\n2248\n2249\n2250\n2251\n2252\n2253\n2254\n2255\n2256\n2257\n2258\n2259\n2260\n2261\n2262\n2263\n2264\n2265\n2266\n2267\n2268\n2269\n2270\n2271\n2272\n2273\n2274\n2275\n2276\n2277\n2278\n2279\n2280\n2281\n2282\n2283\n2284\n2285\n2286\n2287\n2288\n2289\n2290\n2291\n2292\n2293\n2294\n2295\n2296\n2297\n2298\n2299\n2300\n2301\n2302\n2303\n2304\n2305\n2306\n2307\n2308\n2309\n2310\n2311\n2312\n2313\n2314\n2315\n2316\n2317\n2318\n2319\n2320\n2321\n2322\n2323\n2324\n2325\n2326\n2327\n2328\n2329\n2330\n2331\n2332\n2333\n2334\n2335\n2336\n2337\n2338\n2339\n2340\n2341\n2342\n2343\n2344\n2345\n2346\n2347\n2348\n2349\n2350\n2351\n2352\n2353\n2354\n2355\n2356\n2357\n2358\n2359\n2360\n2361\n2362\n2363\n2364\n2365\n2366\n2367\n2368\n2369\n2370\n2371\n2372\n2373\n2374\n2375\n2376\n2377\n2378\n2379\n2380\n2381\n2382\n2383\n2384\n2385\n2386\n2387\n2388\n2389\n2390\n2391\n2392\n2393\n2394\n2395\n2396\n2397\n2398\n2399\n2400\n2401\n2402\n2403\n2404\n2405\n2406\n2407\n2408\n2409\n2410\n2411\n2412\n2413\n2414\n2415\n2416\n2417\n2418\n2419\n2420\n2421\n2422\n2423\n2424\n2425\n2426\n2427\n2428\n2429\n2430\n2431\n2432\n2433\n2434\n2435\n2436\n2437\n2438\n2439\n2440\n2441\n2442\n2443\n2444\n2445\n2446\n2447\n2448\n2449\n2450\n2451\n2452\n2453\n2454\n2455\n2456\n2457\n2458\n2459\n2460\n2461\n2462\n2463\n2464\n2465\n2466\n2467\n2468\n2469\n2470\n2471\n2472\n2473\n2474\n2475\n2476\n2477\n2478\n2479\n2480\n2481\n2482\n2483\n2484\n2485\n2486\n2487\n2488\n2489\n2490\n2491\n2492\n2493\n2494\n2495\n2496\n2497\n2498\n2499\n2500\n2501\n2502\n2503\n2504\n2505\n2506\n2507\n2508\n2509\n2510\n2511\n2512\n2513\n2514\n2515\n2516\n2517\n2518\n2519\n2520\n2521\n2522\n2523\n2524\n2525\n2526\n2527\n2528\n2529\n2530\n2531\n2532\n2533\n2534\n2535\n2536\n2537\n2538\n2539\n2540\n2541\n2542\n2543\n2544\n2545\n2546\n2547\n2548\n2549\n2550\n2551\n2552\n2553\n2554\n2555\n2556\n2557\n2558\n2559\n2560\n2561\n2562\n2563\n2564\n2565\n2566\n2567\n2568\n2569\n2570\n2571\n2572\n2573\n2574\n2575\n2576\n2577\n2578\n2579\n2580\n2581\n2582\n2583\n2584\n2585\n2586\n2587\n2588\n2589\n2590\n2591\n2592\n2593\n2594\n2595\n2596\n2597\n2598\n2599\n2600\n2601\n2602\n2603\n2604\n2605\n2606\n2607\n2608\n2609\n2610\n2611\n2612\n2613\n2614\n2615\n2616\n2617\n2618\n2619\n2620\n2621\n2622\n2623\n2624\n2625\n2626\n2627\n2628\n2629\n2630\n2631\n2632\n2633\n2634\n2635\n2636\n2637\n2638\n2639\n2640\n2641\n2642\n2643\n2644\n2645\n2646\n2647\n2648\n2649\n2650\n2651\n2652\n2653\n2654\n2655\n2656\n2657\n2658\n2659\n2660\n2661\n2662\n2663\n2664\n2665\n2666\n2667\n2668\n2669\n2670\n2671\n2672\n2673\n2674\n2675\n2676\n2677\n2678\n2679\n2680\n2681\n2682\n2683\n2684\n2685\n2686\n2687\n2688\n2689\n2690\n2691\n2692\n2693\n2694\n2695\n2696\n2697\n2698\n2699\n2700\n2701\n2702\n2703\n2704\n2705\n2706\n2707\n2708\n2709\n2710\n2711\n2712\n2713\n2714\n2715\n2716\n2717\n2718\n2719\n2720\n2721\n2722\n2723\n2724\n2725\n2726\n2727\n2728\n2729\n2730\n2731\n2732\n2733\n2734\n2735\n2736\n2737\n2738\n2739\n2740\n2741\n2742\n2743\n2744\n2745\n2746\n2747\n2748\n2749\n2750\n2751\n2752\n2753\n2754\n2755\n2756\n2757\n2758\n2759\n2760\n2761\n2762\n2763\n2764\n2765\n2766\n2767\n2768\n2769\n2770\n2771\n2772\n2773\n2774\n2775\n2776\n2777\n2778\n2779\n2780\n2781\n2782\n2783\n2784\n2785\n2786\n2787\n2788\n2789\n2790\n2791\n2792\n2793\n2794\n2795\n2796\n2797\n2798\n2799\n2800\n2801\n2802\n2803\n2804\n2805\n2806\n2807\n2808\n2809\n2810\n2811\n2812\n2813\n2814\n2815\n2816\n2817\n2818\n2819\n2820\n2821\n2822\n2823\n2824\n2825\n2826\n2827\n2828\n2829\n2830\n2831\n2832\n2833\n2834\n2835\n2836\n2837\n2838\n2839\n2840\n2841\n2842\n2843\n2844\n2845\n2846\n2847\n2848\n2849\n2850\n2851\n2852\n2853\n2854\n2855\n2856\n2857\n2858\n2859\n2860\n2861\n2862\n2863\n2864\n2865\n2866\n2867\n2868\n2869\n2870\n2871\n2872\n2873\n2874\n2875\n2876\n2877\n2878\n2879\n2880\n2881\n2882\n2883\n2884\n2885\n2886\n2887\n2888\n2889\n2890\n2891\n2892\n2893\n2894\n2895\n2896\n2897\n2898\n2899\n2900\n2901\n2902\n2903\n2904\n2905\n2906\n2907\n2908\n2909\n2910\n2911\n2912\n2913\n2914\n2915\n2916\n2917\n2918\n2919\n2920\n2921\n2922\n2923\n2924\n2925\n2926\n2927\n2928\n2929\n2930\n2931\n2932\n2933\n2934\n2935\n2936\n2937\n2938\n2939\n2940\n2941\n2942\n2943\n2944\n2945\n2946\n2947\n2948\n2949\n2950\n2951\n2952\n2953\n2954\n2955\n2956\n2957\n2958\n2959\n2960\n2961\n2962\n2963\n2964\n2965\n2966\n2967\n2968\n2969\n2970\n2971\n2972\n2973\n2974\n2975\n2976\n2977\n2978\n2979\n2980\n2981\n2982\n2983\n2984\n2985\n2986\n2987\n2988\n2989\n2990\n2991\n2992\n2993\n2994\n2995\n2996\n2997\n2998\n2999\n3000\n"
},
{
"name": "shell_delai",
"tool": "bash",
"args": {
"command": "echo avant; sleep 3",
"timeout": 1
},
"unix": true,
"label": "echo avant; sleep 3",
"result": "[timeout après 1s — commande arrêtée ; pour un serveur ou une tâche longue, utilise bash_bg]\n\nstdout (partiel):\navant\n"
},
{
"name": "shell_dangereux",
"tool": "bash",
"args": {
"command": "rm -rf /"
},
"label": "rm -rf /",
"result": "[refusé] Commande bloquée par la politique de sécurité : efface la racine du disque ou le home. Ne la réessaie pas, même reformulée. Si l'utilisateur la veut vraiment, dis-lui de la lancer lui-même dans un terminal."
},
{
"name": "shell_memoire",
"tool": "bash",
"args": {
"command": "cat {{MEM}}/x.md"
},
"unix": true,
"label": "cat {{ROOT}}/memory/generale/x.md",
"result": "[refusé] pas d'accès direct au dossier {{ROOT}}/memory/generale via le shell. Utilise les outils mem_* (mem_search/mem_read/mem_add/mem_edit/mem_delete)."
},
{
"name": "shell_code_arriere_plan",
"tool": "bash",
"args": {
"command": "sleep 1 &"
},
"code": true,
"unix": true,
"label": "sleep 1 &",
"result": "[refusé] commande terminée par « & » : lance-la avec bash_bg (sortie consultable avec bash_tail), pas en arrière-plan dans bash."
}
],
"after": {
"dehors.txt": "hors du dossier\n",
"ws/a.txt": "ligne 1\nligne deux\nligne 3\n",
"ws/b.txt": "rem\n",
"ws/beaucoup.txt": "aiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\naiguille\n",
"ws/bin.dat": "PK\u0000\u0001binaire",
"ws/code.txt": "c\n",
"ws/crlf.txt": "un\r\n2\r\n3\r\n",
"ws/long.txt": "éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé\nfin\n",
"ws/neuf/n.txt": "un\ndeux\n",
"ws/node_modules/dep/index.js": "ligne cachée\n",
"ws/src/lib/notes.md": "x dans les notes\n",
"ws/src/lib/util.go": "package lib\n// x marque\n",
"ws/src/main.go": "package main\n\nfunc main() { x := 1 }\n",
"ws/vide.txt": ""
}
}