nandi/oripublic Fork 0
34e69b510306161654f26903a269247aefa9c94d
Commits
Clone
git clone https://git.rickub.com/nandi/ori.git
git clone ssh://git@rickub.com/nandi/ori.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

forked from bots-garden/ori

workspace-api.md · 108 lines · 5.3 KBmarkdown
Blame HistoryOpen raw

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 --cwd du 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
# 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 `--cwd` du 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` :

```json
{ "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` :

```json
{ "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` :

```json
{ "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.