forked from bots-garden/ori
Référence : API workspace
Description neutre et exhaustive des endpoints derrière le panneau workspace et les sélecteurs du composer : l'API fichiers, l'endpoint des skills et le WebSocket du terminal. Les chemins relatifs se résolvent contre le
--cwddu serveur ; les chemins absolus sont utilisés tels quels (accès volontairement non restreint — ori vise des sandboxes déjà isolées).
GET /api/files
Liste un répertoire.
| Paramètre de requête | Type | Défaut | Description |
|---|---|---|---|
path |
chaîne | la racine du workspace | Répertoire à lister. |
Réponse 200 :
{ "path": "/travail", "entries": [ { "name": "src", "path": "/travail/src", "isDir": true, "size": 0 } ] }
Les entrées sont triées répertoires d'abord, puis fichiers, chaque groupe par ordre alphabétique.
GET /api/files/search
Recherche des fichiers récursivement sous la racine du workspace, pour le sélecteur @ du composer.
| Paramètre de requête | Type | Défaut | Description |
|---|---|---|---|
q |
chaîne | "" |
Sous-chaîne, insensible à la casse, cherchée dans le chemin relatif à la racine. Vide renvoie les premiers fichiers. |
limit |
entier | 50 | Nombre maximal de résultats ; plafonné à 500. |
Réponse 200 :
{ "root": "/travail", "files": [ { "name": "main.go", "path": "/travail/src/main.go", "relPath": "src/main.go" } ] }
path est absolu (utilisable dans les autres endpoints), relPath utilise des barres obliques. Les résultats sont classés : d'abord les fichiers dont le nom de base contient la requête, puis les chemins relatifs les plus courts, puis l'ordre alphabétique. Le parcours n'entre jamais dans .git ni node_modules, ignore les entrées illisibles et s'arrête après 50 000 entrées de répertoire. files est toujours un tableau ([] sans correspondance). Une racine absente donne un 404.
GET /api/file
Lit un fichier texte.
| Paramètre de requête | Type | Défaut | Description |
|---|---|---|---|
path |
chaîne | — | Fichier à lire. |
Réponse 200 : { "path": "/travail/README.md", "content": "…" }
PUT /api/file
Écrit un fichier texte, en créant les répertoires parents si besoin.
| Paramètre de requête | Type | Défaut | Description |
|---|---|---|---|
path |
chaîne | — (requis) | Fichier à écrire. |
Corps : { "content": "…" } — réponse 200 : { "path": "…", "status": "saved" }
GET /api/raw
Diffuse les octets d'un fichier tels quels — c'est ainsi que la preview affiche les images. Pas de plafond de taille, pas d'exigence de texte ; les requêtes Range sont honorées (http.ServeContent).
| Paramètre de requête | Type | Défaut | Description |
|---|---|---|---|
path |
chaîne | — (requis) | Fichier à diffuser. |
Réponse 200 avec les octets du fichier, X-Content-Type-Options: nosniff, et un Content-Type choisi dans cet ordre :
| Extension | Content-Type |
|---|---|
.png .jpg .jpeg .gif .webp .svg .bmp .ico .avif |
types image figés (image/png, image/jpeg, image/gif, image/webp, image/svg+xml, image/bmp, image/x-icon, image/avif) |
| toute autre extension connue | la table mime de l'hôte (p. ex. text/markdown; charset=utf-8) |
| inconnue | détecté sur les 512 premiers octets |
GET /api/skills
Liste les skills Claude Code disponibles pour la session, pour le sélecteur / du composer.
Réponse 200 :
{ "skills": [ { "name": "quality", "description": "Audit code quality with qlty.", "path": "/travail/.claude/skills/quality/SKILL.md", "source": "project" } ] }
Un skill est un répertoire contenant un SKILL.md, cherché dans <cwd>/.claude/skills/*/ (source: "project") et ~/.claude/skills/*/ (source: "user"). name et description viennent du frontmatter YAML du fichier (clé: valeur, valeurs entre guillemets et scalaires bloc > / | compris) ; un nom absent est remplacé par le nom du répertoire, une description absente par "". Un skill projet masque un skill utilisateur du même nom. Résultats triés par nom ; skills est toujours un tableau.
Erreurs de l'API fichiers
Toutes les erreurs sont en JSON : { "error": "message" }.
| Statut | Cause |
|---|---|
| 400 | path manquant sur PUT ou GET /api/raw, corps JSON invalide, ou lecture d'un répertoire. |
| 403 | Permission refusée par le système de fichiers. |
| 404 | Le chemin (ou la racine du workspace, pour la recherche) n'existe pas. |
| 413 | Fichier de plus de 5 Mio (GET /api/file seulement ; /api/raw n'a pas de plafond). |
| 415 | Le fichier n'est pas du texte UTF-8 valide (GET /api/file seulement). |
GET /ws/terminal
Bascule en WebSocket et démarre un shell (depuis $SHELL, repli sur bash puis sh, avec TERM=xterm-256color) dans un pseudo-terminal, dans le --cwd du serveur.
| Direction | Type de trame | Contenu |
|---|---|---|
| serveur → client | binaire | Octets bruts de la sortie du terminal. |
| client → serveur | texte | {"type":"input","data":"…"} — frappes écrites dans le pty. |
| client → serveur | texte | {"type":"resize","cols":N,"rows":N} — changement de taille. |
Le socket se ferme avec un statut de fermeture normale quand le shell se termine ; fermer le socket tue le shell. Les trames texte malformées sont ignorées.
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 103 104 105 106 107 108 |
|