Skip to content

tenon dans votre éditeur

tenon acp fait de tenon un agent Agent Client Protocol (ACP). L'éditeur lance tenon acp en sous-processus et lui parle sur l'entrée et la sortie standard (JSON-RPC 2.0, un message par ligne). Vous discutez avec tenon dans le panneau de l'éditeur ; tenon travaille avec ses propres outils et ses propres règles.

Sommaire

Avant de commencer

  1. Installez tenon et vérifiez que tenon config check réussit dans votre projet.
  2. Enregistrez la clé du fournisseur avec tenon key set <fournisseur> ou dans sa variable d'environnement. L'éditeur ne voit jamais la clé : tenon n'annonce aucune méthode d'authentification (authMethods: []).
  3. Indiquez le chemin complet du binaire si l'éditeur ne voit pas le PATH de votre shell (par exemple /opt/homebrew/bin/tenon). which tenon l'affiche.

L'éditeur transmet le dossier du projet (cwd). tenon démarre alors exactement comme tenon lancé dans ce dossier : configuration globale et projet, politique signée, profil, listes blanches, sonde d'isolation, routage, serveurs MCP. Un refus au démarrage (par exemple [sandbox] mode = "required" sans isolation disponible) s'affiche dans l'éditeur comme une erreur, avec le message de tenon.

Zed

Ajoutez tenon sous agent_servers dans le settings.json de Zed :

{
  "agent_servers": {
    "tenon": {
      "type": "custom",
      "command": "tenon",
      "args": ["acp"],
      "env": {}
    }
  }
}

Ouvrez ensuite le panneau Agent et démarrez une conversation avec tenon.

Source : Zed, External Agents (section « Custom Agents »).

IDE JetBrains

AI Assistant lit les agents personnalisés dans ~/.jetbrains/acp.json. Dans la fenêtre AI Chat, cliquez sur le bouton « plus » (⋯), puis Add Custom Agent : l'IDE crée et ouvre le fichier. Ajoutez tenon sous agent_servers :

{
  "agent_servers": {
    "tenon": {
      "command": "/chemin/complet/vers/tenon",
      "args": ["acp"],
      "env": {}
    }
  }
}

La clé (tenon) est le nom affiché dans AI Chat. Redémarrez l'IDE si l'agent n'apparaît pas.

Source : JetBrains AI Assistant, Agent Client Protocol.

Neovim

Deux extensions jouent le rôle de client ACP.

avante.nvim lit les agents ACP dans acp_providers :

vim.g.avante = {
  acp_providers = {
    ["tenon"] = {
      command = "tenon",
      args = { "acp" },
      env = {},
    },
  },
}

Choisissez-le avec :AvanteSwitchProvider.

Source : README d'avante.nvim (section ACP) et l'exemple acp_providers de lua/avante/config.lua.

CodeCompanion.nvim définit les adaptateurs ACP sous adapters.acp. Un adaptateur personnalisé a type = "acp", la commande dans commands.default et defaults.mcpServers ; il lui faut aussi le bloc handlers du modèle documenté, que nous ne recopions pas ici. Partez de l'exemple d'adaptateur personnalisé de la page ci-dessous, avec :

-- extrait ; voir le modèle complet dans la documentation de CodeCompanion
name = "tenon",
formatted_name = "tenon",
type = "acp",
commands = {
  default = { "tenon", "acp" },
},
defaults = {
  mcpServers = {},
},

Choisissez-le ensuite avec interactions = { chat = { adapter = "tenon" } }.

Source : CodeCompanion, Configuring ACP adapters.

VS Code

L'extension tenon

Installation. Cherchez tenon dans la vue Extensions, ou installez tenon-code-eu.tenon depuis le Marketplace VS Code. VSCodium, Cursor et les autres éditeurs qui utilisent Open VSX : téléchargez le .vsix de votre plateforme depuis la release GitHub, vérifiez-le avec le SHA256SUMS signé, puis lancez Extensions : Installer depuis un VSIX…. Il existe un paquet par plateforme : macOS et Linux, arm64 et x64. Chaque paquet contient le binaire tenon : rien d'autre à installer. Windows n'est pas pris en charge.

Le binaire. L'extension cherche tenon dans cet ordre :

  1. le réglage tenon.path (un chemin absolu, dans vos réglages utilisateur) ;
  2. le binaire fourni avec l'extension ;
  3. tenon dans votre PATH.

tenon 0.9.0 ou plus récent est requis. Si tenon est absent ou trop ancien, une notification propose de l'installer ou de choisir le binaire.

Le panneau. Cliquez sur l'icône tenon de la barre d'activité, ou lancez tenon : Ouvrir la discussion. Ouvrez d'abord un dossier : tenon travaille dans le dossier. Tapez votre demande et appuyez sur Entrée (Maj+Entrée pour un saut de ligne). Arrêter met fin au tour. Tapez / pour voir les skills et commandes du projet. La liste Sessions reprend une session précédente du dossier. Le bouton + ouvre une nouvelle session.

Contexte. Sélectionnez du code et appuyez sur Cmd+Option+K (Ctrl+Alt+K sous Linux), ou faites un clic droit puis Joindre la sélection à la discussion. La sélection part avec votre prochain message, avec ses lignes. Joindre le fichier à la discussion, dans l'éditeur ou sur un fichier de l'explorateur, envoie un lien vers un fichier ; tenon le lit avec ses outils, sous accord.

Accords. Quand tenon veut écrire un fichier, lancer une commande ou appeler un outil MCP, une carte apparaît dans la discussion. Cliquez sur l'une des options de tenon : Autoriser, Toujours pour cette session, Refuser, et Autoriser avec réseau pour une commande isolée. Si le panneau est masqué, une notification pose la question. Fermer la notification vaut refus. Arrêter refuse toutes les demandes en attente. L'extension ne répond jamais d'elle-même.

Diffs. Un appel d'outil qui modifie un fichier affiche Voir le diff. Le diff s'ouvre dans l'éditeur de diff de VS Code, titré <fichier> (tenon), en lecture seule. Le texte est celui de tenon, secrets masqués.

Barre d'état. La barre d'état affiche tenon · <fournisseur> · <UE|hors UE|local> · <isolé|non isolé>. Un fournisseur hors UE, ou une juridiction inconnue, s'affiche en couleur d'avertissement. Après un repli du routage, la barre montre le fournisseur qui a répondu. « isolé » signifie que tenon confine les commandes shell ; avec [sandbox] mode = "off", ou sans isolation sur la machine, la barre affiche « non isolé ». Quand tenon s'arrête, la barre affiche tenon seul. Un clic ouvre la discussion.

Mode terminal. Lancez tenon : Ouvrir dans le terminal (Cmd+Échap, Ctrl+Échap sous Linux). L'interface terminal de tenon s'ouvre dans un terminal nommé « tenon », à droite de l'éditeur, dans le dossier de l'espace de travail. La même commande le réaffiche tant qu'il est ouvert. Quand ce terminal est visible, Cmd+Option+K (Ctrl+Alt+K) y tape une référence à la sélection : @src/a.go#L10-20, @src/a.go#L5 pour une ligne, @src/a.go sans sélection. La touche n'agit que si le terminal tenon est le terminal actif. L'extension ajoute tenon.insertReference à terminal.integrated.commandsToSkipShell, pour que le terminal ne capte pas la touche. Si vous définissez terminal.integrated.commandsToSkipShell dans vos propres réglages, ajoutez-y tenon.insertReference.

Langue. L'extension suit la langue de VS Code : anglais ou français.

Journaux. tenon : Voir les journaux ouvre le canal de sortie « tenon ». tenon : Relancer redémarre tenon acp.

Fonctionnement. Pour lister et reprendre les sessions du dossier ouvert, l'extension utilise session/list et les métadonnées _meta.tenon (fournisseur, nom du fournisseur, modèle, juridiction, isolation avec son indicateur confined, profil, politique) que tenon acp renvoie pour session/new et session/load. Chaque usage_update porte le fournisseur, le nom et la juridiction de l'appel, si bien qu'un repli s'affiche aussitôt. L'extension ne fait aucun appel réseau et n'envoie aucune télémétrie.

Client tiers

VS Code n'a pas de client ACP intégré. L'extension tierce ACP Client for VS Code (formulahendry/vscode-acp) en est un. Elle lit les agents dans le réglage acp.agents : chaque clé est le nom de l'agent, avec command, args et env. Dans settings.json :

{
  "acp.agents": {
    "tenon": {
      "command": "tenon",
      "args": ["acp"],
      "env": {}
    }
  }
}

Définir acp.agents remplace la liste par défaut de l'extension. Recopiez d'abord les valeurs par défaut si vous voulez les garder.

Source : le réglage acp.agents dans le package.json de l'extension. Nous n'avons pas testé d'autres extensions VS Code.

Ce qui reste appliqué

L'éditeur ne fait qu'afficher. tenon garde toutes ses garanties :

  • Permissions. Les écritures, commandes et appels MCP soumis à validation sont demandés dans l'éditeur : Autoriser, Toujours pour cette session, Refuser, et Autoriser avec réseau pour une commande isolée. « Toujours pour cette session » n'accorde jamais le réseau. Une demande annulée ou une erreur du client vaut refus.
  • Isolation. Les commandes s'exécutent dans l'isolation système de tenon, comme dans le terminal.
  • Masquage. Les secrets sont masqués avant d'atteindre le modèle, le journal d'audit et l'éditeur (arguments, résultats, diffs).
  • Routage. La classification, le routage local et les replis s'appliquent. Un envoi à un fournisseur hors UE demande un consentement dans l'éditeur ; le refus est la valeur par défaut.
  • Audit. Chaque session écrit le même journal d'audit chaîné. SessionStarted enregistre l'éditeur (client: {name, version}) et transport: "acp". L'export de conformité affiche l'éditeur de chaque session.

tenon n'utilise que ses propres outils. Il n'appelle jamais les méthodes fs/* ni terminal/* de l'éditeur.

Serveurs MCP de l'éditeur

Certains éditeurs transmettent leurs propres serveurs MCP à l'ouverture d'une session. tenon les ignore par défaut et affiche l'avis serveurs MCP de l'éditeur ignorés ([acp] accept_editor_mcp).

Pour les accepter, réglez dans la configuration globale (refusé dans une configuration projet ; une politique d'organisation peut l'imposer à false) :

[acp]
accept_editor_mcp = true

Les serveurs acceptés passent par les mêmes filtres que ceux de votre configuration : profil, politique, consentement de juridiction, isolation, audit. Valeurs par défaut :

  • serveur stdio : jurisdiction = "local", sans risk déclaré (pas de réseau, projet en lecture seule dans l'isolation) ;
  • serveur http : jurisdiction = "non-eu" (consentement demandé), ou local pour localhost, 127.0.0.1 et ::1 ;
  • les serveurs sse ne sont pas pris en charge ;
  • un serveur de même identifiant qu'un serveur de votre configuration est ignoré : votre configuration l'emporte.

Les variables d'environnement et en-têtes HTTP fournis par l'éditeur sont ignorés, avec un avis. tenon n'en conserve ni n'en journalise jamais les valeurs. Un serveur qui a besoin d'un secret doit être déclaré dans la configuration de tenon (env_from, bearer_env).

Limites

  • Ni image ni audio dans les prompts : l'éditeur reçoit une erreur « invalid params ».
  • tenon ne lit pas les tampons de l'éditeur. Il lit les fichiers sur le disque avec ses outils. Enregistrez vos fichiers avant de demander.
  • Les fichiers joints (blocs resource) sont ajoutés au message : ils sont masqués et classés comme un texte saisi. Les liens de fichiers (resource_link) sont cités par leur chemin ; tenon les lit avec ses outils, sous permission.
  • Un seul tour à la fois par session. Un second prompt pendant un tour reçoit turn in progress.
  • tenon envoie ses avis (avis du démarrage, arrêts par hook) comme pensées de l'agent (agent_thought_chunk, préfixe tenon:), et les jetons en usage_update (used : jetons d'entrée du dernier appel, size : fenêtre de contexte de son fournisseur). Certains clients ignorent usage_update.
  • session/load rejoue les messages et les appels d'outils sous forme de texte. Les diffs ne sont pas rejoués.
  • Pas de modes ACP (session/set_mode), pas de transport distant.