Tools
Différences
diffs est un outil de Plugin optionnel avec de brèves instructions système intégrées et un Skills compagnon qui transforme le contenu de changements en artefact diff en lecture seule pour les agents.
Il accepte soit :
- du texte
beforeetafter - un
patchunifié
Il peut renvoyer :
- une URL de visualiseur Gateway pour une présentation canvas
- un chemin de fichier rendu (PNG ou PDF) pour l’envoi par message
- les deux sorties en un seul appel
Lorsqu’il est activé, le Plugin ajoute des instructions d’utilisation concises dans l’espace du prompt système et expose aussi un Skills détaillé pour les cas où l’agent a besoin d’instructions plus complètes.
Démarrage rapide
Installer le Plugin
openclaw plugins install diffsActiver le Plugin
{ plugins: { entries: { diffs: { enabled: true, }, }, },}Choisir un mode
view
Flux centrés sur canvas : les agents appellent diffs avec mode: "view" et ouvrent details.viewerUrl avec canvas present.
file
Envoi de fichier dans le chat : les agents appellent diffs avec mode: "file" et envoient details.filePath avec message en utilisant path ou filePath.
both
Combiné : les agents appellent diffs avec mode: "both" pour obtenir les deux artefacts en un seul appel.
Désactiver les instructions système intégrées
Si vous souhaitez garder l’outil diffs activé mais désactiver ses instructions intégrées de prompt système, définissez plugins.entries.diffs.hooks.allowPromptInjection sur false :
{ plugins: { entries: { diffs: { enabled: true, hooks: { allowPromptInjection: false, }, }, }, },}Cela bloque le hook before_prompt_build du plugin diffs tout en gardant disponibles le Plugin, l’outil et le Skills compagnon.
Si vous souhaitez désactiver à la fois les instructions et l’outil, désactivez plutôt le Plugin.
Flux de travail typique de l’agent
Appeler diffs
L’agent appelle l’outil diffs avec une entrée.
Lire details
L’agent lit les champs details dans la réponse.
Présenter
L’agent ouvre details.viewerUrl avec canvas present, envoie details.filePath avec message en utilisant path ou filePath, ou fait les deux.
Exemples d’entrée
Avant et après
{ "before": "# Hello\n\nOne", "after": "# Hello\n\nTwo", "path": "docs/example.md", "mode": "view"}Patch
{ "patch": "diff --git a/src/example.ts b/src/example.ts\n--- a/src/example.ts\n+++ b/src/example.ts\n@@ -1 +1 @@\n-const x = 1;\n+const x = 2;\n", "mode": "both"}Référence de l’entrée de l’outil
Tous les champs sont optionnels, sauf indication contraire.
beforestringTexte d’origine. Requis avec after lorsque patch est omis.
afterstringTexte mis à jour. Requis avec before lorsque patch est omis.
patchstringTexte de diff unifié. Mutuellement exclusif avec before et after.
pathstringNom de fichier affiché pour le mode avant et après.
langstringIndice de remplacement de langue pour le mode avant et après. Les valeurs inconnues et les langues en dehors de l’ensemble par défaut du visualiseur reviennent au texte brut, sauf si le Plugin Diff Viewer Language Pack est installé.
titlestringRemplacement du titre du visualiseur.
mode"view" | "file" | "both"Mode de sortie. Utilise par défaut la valeur par défaut du Plugin defaults.mode. Alias obsolète : "image" se comporte comme "file" et reste accepté pour la rétrocompatibilité.
theme"light" | "dark"Thème du visualiseur. Utilise par défaut la valeur par défaut du Plugin defaults.theme.
layout"unified" | "split"Disposition du diff. Utilise par défaut la valeur par défaut du Plugin defaults.layout.
expandUnchangedbooleanDéveloppe les sections inchangées lorsque le contexte complet est disponible. Option uniquement par appel (pas une clé par défaut du Plugin).
fileFormat"png" | "pdf"Format de fichier rendu. Utilise par défaut la valeur par défaut du Plugin defaults.fileFormat.
fileQuality"standard" | "hq" | "print"Préréglage de qualité pour le rendu PNG ou PDF.
fileScalenumberRemplacement de l’échelle de l’appareil (1-4).
fileMaxWidthnumberLargeur de rendu maximale en pixels CSS (640-2400).
ttlSecondsnumberdefault: 1800TTL de l’artefact en secondes pour les sorties du visualiseur et des fichiers autonomes. Maximum 21600.
baseUrlstringRemplacement de l’origine de l’URL du visualiseur. Remplace le viewerBaseUrl du Plugin. Doit être http ou https, sans requête ni fragment.
Alias d’entrée hérités
Toujours acceptés pour la rétrocompatibilité :
format->fileFormatimageFormat->fileFormatimageQuality->fileQualityimageScale->fileScaleimageMaxWidth->fileMaxWidth
Validation et limites
beforeetafterfont chacun au maximum 512 Kio.patchfait au maximum 2 Mio.pathfait au maximum 2048 octets.langfait au maximum 128 octets.titlefait au maximum 1024 octets.- Plafond de complexité du patch : maximum 128 fichiers et 120000 lignes au total.
patchetbeforeouafterensemble sont rejetés.- Limites de sécurité des fichiers rendus (s’appliquent au PNG et au PDF) :
fileQuality: "standard": maximum 8 MP (8 000 000 pixels rendus).fileQuality: "hq": maximum 14 MP (14 000 000 pixels rendus).fileQuality: "print": maximum 24 MP (24 000 000 pixels rendus).- Le PDF a également un maximum de 50 pages.
Coloration syntaxique
OpenClaw inclut la coloration syntaxique pour les langages courants de code source, de configuration et de documentation :
javascript, typescript, tsx, jsx, json, markdown, yaml, css, html, sh, python, go, rust, java, c, cpp, csharp, php, sql, docker, ruby, swift, kotlin, r, dart, lua, powershell, xml et toml.
Les alias courants tels que js, ts, bash, md, yml, c++, dockerfile, rb, kt et ps1 sont normalisés vers ces langages par défaut.
Installez le plugin Diff Viewer Language Pack pour mettre en évidence d’autres langages :
openclaw plugins install clawhub:@openclaw/diffs-language-packAvec le pack de langage disponible, OpenClaw peut mettre en évidence beaucoup plus de langages. Si le pack n’est pas installé, les fichiers hors de la liste par défaut sont tout de même affichés sous forme de texte brut lisible. Exemples : Astro, Vue, Svelte, MDX, GraphQL, Terraform/HCL, Nix, Clojure, Elixir, Haskell, OCaml, Scala, Zig, Solidity, Verilog/VHDL, Fortran, MATLAB, LaTeX, Mermaid, Sass/Less/SCSS, Nginx, Apache, CSV, dotenv, INI et fichiers diff.
Consultez le plugin Diffs Language Pack pour plus de détails et les langages Shiki pour le catalogue amont des langages et alias de Shiki.
Contrat des détails de sortie
L’outil renvoie des métadonnées structurées sous details.
Viewer fields
Champs partagés pour les modes qui créent une visionneuse :
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountIdlorsque disponible)
File fields
Champs de fichier lorsqu’un PNG ou un PDF est généré :
artifactIdexpiresAtfilePathpath(même valeur quefilePath, pour la compatibilité avec l’outil de messages)fileBytesfileFormatfileQualityfileScalefileMaxWidth
Compatibility aliases
Également renvoyés pour les appelants existants :
format(même valeur quefileFormat)imagePath(même valeur quefilePath)imageBytes(même valeur quefileBytes)imageQuality(même valeur quefileQuality)imageScale(même valeur quefileScale)imageMaxWidth(même valeur quefileMaxWidth)
Résumé du comportement des modes :
| Mode | Ce qui est renvoyé |
|---|---|
"view" |
Champs de visionneuse uniquement. |
"file" |
Champs de fichier uniquement, sans artefact de visionneuse. |
"both" |
Champs de visionneuse plus champs de fichier. Si le rendu du fichier échoue, la visionneuse est tout de même renvoyée avec l’alias fileError et imageError. |
Sections inchangées réduites
- La visionneuse peut afficher des lignes comme
N unmodified lines. - Les contrôles d’expansion sur ces lignes sont conditionnels et ne sont pas garantis pour chaque type d’entrée.
- Les contrôles d’expansion apparaissent lorsque le diff généré dispose de données de contexte extensibles, ce qui est typique pour une entrée avant/après.
- Pour de nombreuses entrées de correctif unifié, les corps de contexte omis ne sont pas disponibles dans les hunks du correctif analysé ; la ligne peut donc apparaître sans contrôles d’expansion. C’est le comportement attendu.
expandUnchangeds’applique uniquement lorsqu’un contexte extensible existe.
Valeurs par défaut du plugin
Définissez les valeurs par défaut à l’échelle du plugin dans ~/.openclaw/openclaw.json :
{ plugins: { entries: { diffs: { enabled: true, config: { defaults: { fontFamily: "Fira Code", fontSize: 15, lineSpacing: 1.6, layout: "unified", showLineNumbers: true, diffIndicators: "bars", wordWrap: true, background: true, theme: "dark", fileFormat: "png", fileQuality: "standard", fileScale: 2, fileMaxWidth: 960, mode: "both", ttlSeconds: 21600, }, }, }, }, },}Valeurs par défaut prises en charge :
fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmodettlSeconds
Les paramètres explicites de l’outil remplacent ces valeurs par défaut.
Configuration de l’URL de visionneuse persistante
viewerBaseUrlstringSolution de repli détenue par le plugin pour les liens de visionneuse renvoyés lorsqu’un appel d’outil ne transmet pas baseUrl. Doit être http ou https, sans requête ni hash.
{ plugins: { entries: { diffs: { enabled: true, config: { viewerBaseUrl: "https://gateway.example.com/openclaw", }, }, }, },}Configuration de sécurité
security.allowRemoteViewerbooleandefault: falsefalse : les requêtes non local loopback vers les routes de visionneuse sont refusées. true : les visionneuses distantes sont autorisées si le chemin tokenisé est valide.
{ plugins: { entries: { diffs: { enabled: true, config: { security: { allowRemoteViewer: false, }, }, }, }, },}Cycle de vie et stockage des artefacts
- Les artefacts sont stockés dans le sous-dossier temporaire :
$TMPDIR/openclaw-diffs. - Les métadonnées d’artefact de la visionneuse contiennent :
- un ID d’artefact aléatoire (20 caractères hexadécimaux)
- un jeton aléatoire (48 caractères hexadécimaux)
createdAtetexpiresAt- le chemin
viewer.htmlstocké
- La TTL d’artefact par défaut est de 30 minutes lorsqu’elle n’est pas spécifiée.
- La TTL maximale acceptée pour la visionneuse est de 6 heures.
- Le nettoyage s’exécute de manière opportuniste après la création d’un artefact.
- Les artefacts expirés sont supprimés.
- Le nettoyage de secours supprime les dossiers obsolètes de plus de 24 heures lorsque les métadonnées sont manquantes.
URL de la visionneuse et comportement réseau
Route de la visionneuse :
/plugins/diffs/view/{artifactId}/{token}
Ressources de la visionneuse :
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js/plugins/diffs-language-pack/assets/viewer.jslorsque le diff utilise une langue du pack de langue de la visionneuse de diff
Le document de la visionneuse résout ces ressources relativement à l’URL de la visionneuse ; un préfixe de chemin baseUrl facultatif est donc également conservé pour les deux requêtes de ressources.
Comportement de construction d’URL :
- Si le
baseUrld’appel d’outil est fourni, il est utilisé après validation stricte. - Sinon, si le
viewerBaseUrldu Plugin est configuré, il est utilisé. - Sans l’une ou l’autre surcharge, l’URL de la visionneuse utilise par défaut le bouclage
127.0.0.1. - Si le mode de liaison du Gateway est
customet quegateway.customBindHostest défini, cet hôte est utilisé.
Règles de baseUrl :
- Doit être
http://ouhttps://. - Les requêtes et les fragments sont rejetés.
- L’origine avec un chemin de base facultatif est autorisée.
Modèle de sécurité
Durcissement de la visionneuse
- Bouclage uniquement par défaut.
- Chemins de visionneuse avec jeton et validation stricte de l’ID et du jeton.
- CSP de réponse de la visionneuse :
default-src 'none'- scripts et ressources uniquement depuis self
- pas de
connect-srcsortant
- Limitation des échecs distants lorsque l’accès distant est activé :
- 40 échecs par 60 secondes
- verrouillage de 60 secondes (
429 Too Many Requests)
Durcissement du rendu de fichiers
- Le routage des requêtes du navigateur de capture d’écran refuse tout par défaut.
- Seules les ressources locales de la visionneuse provenant de
http://127.0.0.1/plugins/diffs/assets/*sont autorisées. - Les requêtes réseau externes sont bloquées.
Exigences du navigateur pour le mode fichier
mode: "file" et mode: "both" nécessitent un navigateur compatible Chromium.
Ordre de résolution :
Configuration
browser.executablePath dans la configuration OpenClaw.
Variables d’environnement
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
Secours de plateforme
Découverte de commande/chemin de plateforme en secours.
Texte d’erreur courant :
Diff PNG/PDF rendering requires a Chromium-compatible browser...
Corrigez en installant Chrome, Chromium, Edge ou Brave, ou en définissant l’une des options de chemin d’exécutable ci-dessus.
Dépannage
Erreurs de validation des entrées
Provide patch or both before and after text.— incluez à la foisbeforeetafter, ou fournissezpatch.Provide either patch or before/after input, not both.— ne mélangez pas les modes d’entrée.Invalid baseUrl: ...— utilisez une originehttp(s)avec un chemin facultatif, sans requête ni fragment.{field} exceeds maximum size (...)— réduisez la taille de la charge utile.- Rejet d’un patch volumineux — réduisez le nombre de fichiers du patch ou le nombre total de lignes.
Accessibilité de la visionneuse
- L’URL de la visionneuse se résout par défaut en
127.0.0.1. - Pour les scénarios d’accès distant, vous pouvez :
- définir le
viewerBaseUrldu Plugin, ou - passer
baseUrlpar appel d’outil, ou - utiliser
gateway.bind=custometgateway.customBindHost
- définir le
- Si
gateway.trustedProxiesinclut le bouclage pour un proxy sur le même hôte (par exemple Tailscale Serve), les requêtes brutes de visionneuse en bouclage sans en-têtes d’IP client transférée échouent en mode fermé par conception. - Pour cette topologie de proxy :
- préférez
mode: "file"oumode: "both"lorsque vous avez seulement besoin d’une pièce jointe, ou - activez volontairement
security.allowRemoteVieweret définissez leviewerBaseUrldu Plugin ou passez unbaseUrlde proxy/public lorsque vous avez besoin d’une URL de visionneuse partageable
- préférez
- Activez
security.allowRemoteVieweruniquement lorsque vous souhaitez un accès externe à la visionneuse.
La ligne des lignes non modifiées n’a pas de bouton de développement
Cela peut se produire pour une entrée de patch lorsque le patch ne contient pas de contexte extensible. C’est attendu et n’indique pas un échec de la visionneuse.
Artefact introuvable
- L’artefact a expiré en raison de la TTL.
- Le jeton ou le chemin a changé.
- Le nettoyage a supprimé les données obsolètes.
Conseils opérationnels
- Préférez
mode: "view"pour les revues interactives locales dans le canvas. - Préférez
mode: "file"pour les canaux de discussion sortants qui nécessitent une pièce jointe. - Gardez
allowRemoteViewerdésactivé sauf si votre déploiement nécessite des URL de visionneuse distantes. - Définissez un
ttlSecondscourt explicite pour les diffs sensibles. - Évitez d’envoyer des secrets dans l’entrée de diff lorsque ce n’est pas nécessaire.
- Si votre canal compresse les images de manière agressive (par exemple Telegram ou WhatsApp), préférez la sortie PDF (
fileFormat: "pdf").