| 💾 Saved. d722711 k33g 5h ago | 1 | # Référence : surface Agent Client Protocol |
| 2 | |
| 3 | > Description neutre de ce que `mm -acp` expose en JSON-RPC 2.0 sur stdio, via `github.com/coder/acp-go-sdk` v0.13.5. |
| 4 | |
| 5 | ## Transport |
| 6 | |
| 7 | | Aspect | Valeur | |
| 8 | |--------|--------| |
| 9 | | Entrée | stdin, un message JSON-RPC par ligne. | |
| 10 | | Sortie | stdout, messages JSON-RPC uniquement. | |
| 11 | | Journaux | stderr : bannière, avertissements, lignes `[acp] …`, logger du SDK. | |
| 12 | | Durée de vie | Jusqu'à ce que le client ferme stdin ou que le contexte du processus soit annulé. | |
| 13 | |
| 14 | ## Réponse à `initialize` |
| 15 | |
| 16 | | Champ | Valeur | |
| 17 | |-------|--------| |
| 18 | | `protocolVersion` | `1` | |
| 19 | | `agentCapabilities` | Toutes absentes (false) : pas de `loadSession`, pas de prompts image ou audio, pas de MCP HTTP. | |
| 20 | | `agentInfo.name` | `bob` | |
| 21 | | `agentInfo.title` | `Bob (bash-first agent)` | |
| 22 | | `agentInfo.version` | `0.11.0` | |
| 23 | | `authMethods` | `[]` | |
| 24 | |
| 25 | ## Méthodes |
| 26 | |
| 27 | | Méthode | Comportement | |
| 28 | |---------|--------------| |
| 29 | | `initialize` | Journalise le nom du client et la version du protocole sur stderr ; renvoie les valeurs ci-dessus. | |
| 30 | | `authenticate` | Renvoie une réponse vide. | |
| 31 | | `session/new` | Crée une session `bob-<pid>-<n>` avec le `cwd` de la requête, un historique neuf contenant le prompt système et un ensemble « toujours autoriser » vide. Les `mcpServers` sont comptés dans le journal et ignorés. Une fois la réponse écrite, envoie une notification `available_commands_update` listant les commandes slash (voir plus bas). | |
| 32 | | `session/prompt` | Exécute une génération sur l'historique de la session, ou exécute une commande slash sans consulter le modèle. Les tours sont sérialisés à l'échelle du processus. | |
| 33 | | `session/cancel` | Annule le tour en cours pour cette session. | |
| 34 | | `session/set_mode`, `session/set_config_option`, `session/list`, `session/resume`, `session/close`, `logout` | `method not found`. | |
| 35 | |
| 36 | ## `session/prompt` |
| 37 | |
| 38 | | Aspect | Comportement | |
| 39 | |--------|--------------| |
| 40 | | `sessionId` inconnu | Erreur `invalid params` portant le `sessionId`. | |
| 41 | | Contenu du prompt | Blocs `text` concaténés ; un `resource_link` devient `\n[attached file: <chemin sans file://>]` ; les autres types de blocs sont ignorés. Ensuite, chaque `@chemin` du texte qui désigne un fichier ou un répertoire existant sous le `cwd` de la session (ou un chemin absolu / `~`) ajoute `\n[attached file: <chemin absolu>]` ou `\n[attached directory: …]`, une fois par chemin, et est journalisé comme `[acp] session <id>: attached <chemin>`. | |
| 42 | | Commande slash | Quand le texte aplati, débarrassé de ses espaces, est exactement `/new` ou `/compact`, aucune génération n'a lieu ; la commande répond par un `agent_message_chunk` et `stopReason: end_turn`. | |
| 43 | | `/new` | L'historique de la session revient au seul prompt système, le dernier compte de tokens d'entrée du moteur est oublié, le fragment est `🆕 New session: N message(s) forgotten.`. L'identifiant de session, le `cwd` et les autorisations « toujours autoriser » sont conservés. Journalisé comme `[acp] session <id>: new session, N message(s) forgotten`. | |
| 44 | | `/compact` | L'historique est compressé avec les réglages `context`, en mode forcé (le seuil est ignoré, `keepLastTurns` est respecté). Le fragment est `🗜️ compressed N messages → 1 summary + N kept (… tokens, …s)`, ou `🗜️ nothing to compact: N message(s), no turn older than the last K` (historique inchangé), ou `[compact: failed, history kept: <explication>]` (historique inchangé). Le compte de tokens n'est oublié que si l'historique a changé. Attend la fin d'un tour en cours : les tours sont sérialisés. Journalisé comme `[acp] session <id>: /compact — <ligne>`. | |
| 45 | | Historique | L'historique complet renvoyé par le moteur est conservé, même après un échec ou une annulation ; une question restée sans aucune réponse est retirée. | |
| 46 | | Succès | `stopReason: end_turn`. | |
| 47 | | Annulé | `stopReason: cancelled`. | |
| 48 | | Échec | `internal error` avec `error: <explication en une ligne>`. | |
| 49 | | Ligne de journal | `[acp] turn done: N command(s) · N file op(s) · N skill(s)` sur stderr. | |
| 50 | |
| 51 | ## Notifications `session/update` envoyées |
| 52 | |
| 53 | | Mise à jour | Quand | |
| 54 | |-------------|-------| |
| 55 | | `available_commands_update` | Une fois par session, juste après l'écriture de la réponse à `session/new` (l'éditeur doit d'abord connaître l'identifiant de session, sinon il ignore la mise à jour). Liste les commandes slash que `session/prompt` intercepte. | |
| 56 | | `agent_message_chunk` (texte) | Chaque fragment diffusé de la réponse du modèle, espaces préservés ; aussi la ligne de confirmation d'une commande slash. | |
| 57 | | `tool_call` statut `pending` | Avant l'exécution d'un outil ; porte `title`, `kind`, `rawInput`, et `locations` avec le chemin absolu quand un fichier est concerné. | |
| 58 | | `tool_call_update` statut `in_progress` | Permission accordée, outil en cours d'exécution. | |
| 59 | | `tool_call_update` statut `completed` ou `failed` | Outil terminé ; `content` est un `diff` pour les changements de fichier, sinon un bloc `text` avec la sortie ; `rawOutput.output` porte toujours la sortie. | |
| 60 | |
| 61 | ## Commandes disponibles |
| 62 | |
| 63 | | `name` | `description` | `input` | |
| 64 | |--------|---------------|---------| |
| 65 | | `new` | `Clear the history and start a new session` | aucun | |
| 66 | | `compact` | `Compress the history now, keeping the last turns` | aucun | |
| 67 | |
| 68 | Les clients affichent le nom précédé d'une barre oblique et le renvoient comme texte d'un `session/prompt`. |
| 69 | |
| 70 | ## Requêtes `session/request_permission` envoyées |
| 71 | |
| 72 | Envoyées avant l'exécution de `bash`, `read_file`, `write_file` et `edit_file` ; jamais pour `read_skill`. |
| 73 | |
| 74 | | Identifiant d'option | Genre | Effet | |
| 75 | |----------------------|-------|-------| |
| 76 | | `allow` | `allow_once` | Exécute l'outil. | |
| 77 | | `allow_always` | `allow_always` | Exécute l'outil et supprime le dialogue pour ce nom d'outil jusqu'à la fin de la session. | |
| 78 | | `reject` | `reject_once` | N'exécute pas ; le modèle reçoit `[command rejected by the user]`. | |
| 79 | |
| 80 | Une erreur de transport ou un résultat `cancelled` compte comme un refus. |
| 81 | |
| 82 | ## Genres d'outils |
| 83 | |
| 84 | | Genre `mm` | `ToolKind` ACP | Outils | |
| 85 | |------------|----------------|--------| |
| 86 | | `execute` | `execute` | `bash` (et tout genre inconnu) | |
| 87 | | `read` | `read` | `read_skill`, `read_file` | |
| 88 | | `edit` | `edit` | `write_file`, `edit_file` | |
| 89 | |
| 90 | ## Identifiants d'appel d'outil |
| 91 | |
| 92 | `call_1`, `call_2`, … numérotés par processus et jamais remis à zéro. |