Diffs
diffs est un tool de plugin optionnel avec une guidance système intégrée courte et une compétence associée qui transforme le contenu des modifications en un artefact de diff en lecture seule pour les agents.
Il accepte :
- texte
beforeetafter - unifié
patch
Il peut retourner :
- une URL de visionneuse de passerelle pour la présentation sur canevas
- un chemin de fichier rendu (PNG ou PDF) pour la livraison de messages
- les deux sorties en un seul appel
Lorsqu’il est activé, le plugin prépend des directives d’utilisation concises dans l’espace du système de prompt (system-prompt) et expose également une compétence détaillée pour les cas où l’agent a besoin d’instructions plus complètes.
Quick start
Section intitulée « Quick start »Installer le plugin
Fenêtre de terminal openclaw plugins install diffsActiver le plugin
{plugins: {entries: {diffs: {enabled: true,},},},}Choisir un mode
Flux privilégiant Canvas : les agents appellent
diffsavecmode: "view"et ouvrentdetails.viewerUrlaveccanvas present.Livraison de fichier de chat : les agents appellent
diffsavecmode: "file"et envoientdetails.filePathavecmessageen utilisantpathoufilePath.Combiné : les agents appellent
diffsavecmode: "both"pour obtenir les deux artefacts en un seul appel.
Désactiver les instructions système intégrées
Section intitulée « Désactiver les instructions système intégrées »Si vous souhaitez garder le tool diffs activé mais désactiver sa guidance système intégrée (system-prompt), 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 le plugin, le tool et la compétence associée disponibles.
Si vous souhaitez désactiver à la fois les instructions et le tool, désactivez plutôt le plugin.
Workflow typeique de l’agent
Section intitulée « Workflow typeique de l’agent »Appeler diffs
L’agent appelle le tool
diffsavec des entrées.Lire les détails
L’agent lit les champs
detailsde la réponse.Présenter
L’agent ouvre
details.viewerUrlaveccanvas present, envoiedetails.filePathavecmessageen utilisantpathoufilePath, ou fait les deux.
Exemples d’entrée
Section intitulée « Exemples d’entrée »{ "before": "# Hello\n\nOne", "after": "# Hello\n\nTwo", "path": "docs/example.md", "mode": "view"}{ "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’outil d’entrée
Section intitulée « Référence de l’outil d’entrée »Tous les champs sont facultatifs sauf indication contraire.
Anciens alias d'entrée
Toujours acceptés pour la rétrocompatibilité :
format->fileFormatimageFormat->fileFormatimageQuality->fileQualityimageScale->fileScaleimageMaxWidth->fileMaxWidth
Validation et limites
beforeetafterchacun max 512 KiB.patchmax 2 MiB.pathmax 2048 octets.langmax 128 octets.titlemax 1024 octets.- Plafond de complexité du correctif : max 128 fichiers et 120 000 lignes au total.
patchetbeforeouafterensemble sont rejetés.- Limites de sécurité des fichiers rendus (s’appliquent à PNG et PDF) :
fileQuality: "standard": max 8 MP (8 000 000 pixels rendus).fileQuality: "hq": max 14 MP (14 000 000 pixels rendus).fileQuality: "print": max 24 MP (24 000 000 pixels rendus).- Le PDF a également un maximum de 50 pages.
Contrat de détails de sortie
Section intitulée « Contrat de détails de sortie »L’outil renvoie des métadonnées structurées sous details.
Champs de la visionneuse
Champs partagés pour les modes qui créent une visionneuse :
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountIdsi disponible)
Champs de fichier
Champs de fichier lorsqu’un PNG ou PDF est rendu :
artifactIdexpiresAtfilePathpath(même valeur quefilePath, pour compatibilité avec l’outil de message)fileBytesfileFormatfileQualityfileScalefileMaxWidth
Alias de compatibilité
Également renvoyé 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 du mode :
| Mode | Ce qui est renvoyé |
|---|---|
"view" | Champs de la visionneuse uniquement. |
"file" | Champs de fichier uniquement, aucun artefact de visionneuse. |
"both" | Champs du visualiseur plus champs de fichier. Si le rendu du fichier échoue, le visualiseur renvoie tout de même avec les alias fileError et imageError. |
Sections inchangées réduites
Section intitulée « Sections inchangées réduites »- Le visualiseur peut afficher des lignes telles que
N unmodified lines. - Les commandes d’extension sur ces lignes sont conditionnelles et ne sont pas garanties pour chaque type d’entrée.
- Les commandes d’extension apparaissent lorsque le diff rendu contient des données de contexte extensibles, ce qui est typique pour les entrées avant et après.
- Pour de nombreuses entrées de correctif unifié, les corps de contexte omis ne sont pas disponibles dans les blocs de correctif analysés, la ligne peut donc apparaître sans commandes d’extension. Ce comportement est normal.
expandUnchangeds’applique uniquement lorsqu’un contexte extensible existe.
Valeurs par défaut du plugin
Section intitulée « Valeurs par défaut du plugin »Définissez les valeurs par défaut de l’ensemble 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 persistante du visualiseur
Section intitulée « Configuration de l’URL persistante du visualiseur »{ plugins: { entries: { diffs: { enabled: true, config: { viewerBaseUrl: "https://gateway.example.com/openclaw", }, }, }, },}Configuration de sécurité
Section intitulée « Configuration de sécurité »{ plugins: { entries: { diffs: { enabled: true, config: { security: { allowRemoteViewer: false, }, }, }, }, },}Cycle de vie et stockage des artefacts
Section intitulée « Cycle de vie et stockage des artefacts »- Les artefacts sont stockés dans le sous-dossier temporaire :
$TMPDIR/openclaw-diffs. - Les métadonnées de l’artefact du visualiseur contiennent :
- ID d’artefact aléatoire (20 caractères hexadécimaux)
- jeton aléatoire (48 caractères hexadécimaux)
createdAtetexpiresAt- chemin
viewer.htmlstocké
- Le TTL par défaut de l’artefact est de 30 minutes lorsqu’il n’est pas spécifié.
- La durée de vie (TTL) maximale acceptée pour le visualiseur est de 6 heures.
- Le nettoyage s’exécute de manière opportuniste après la création de l’artefact.
- Les artefacts expirés sont supprimés.
- Le nettoyage de secours supprime les dossiers périmés de plus de 24 heures lorsque les métadonnées sont manquantes.
URL du visualiseur et comportement réseau
Section intitulée « URL du visualiseur et comportement réseau »Route du visualiseur :
/plugins/diffs/view/{artifactId}/{token}
Actifs du visualiseur :
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js
Le document du visualiseur résout ces actifs par rapport à l’URL du visualiseur, donc un préfixe de chemin baseUrl optionnel est préservé pour les demandes d’actifs également.
Comportement de construction de l’URL :
- Si le
baseUrlde l’appel d’outil est fourni, il est utilisé après validation stricte. - Sinon, si le
viewerBaseUrldu plugin est configuré, il est utilisé. - Sans aucune de ces substitutions, l’URL du visualiseur par défaut est
127.0.0.1en boucle locale. - Si le mode de liaison de la passerelle est
customet quegateway.customBindHostest défini, cet hôte est utilisé.
Règles baseUrl :
- Doit être
http://ouhttps://. - La requête et le hachage sont rejetés.
- L’origine plus le chemin de base optionnel sont autorisés.
Modèle de sécurité
Section intitulée « Modèle de sécurité »Durcissement du visualiseur
- Bouclage local (loopback) uniquement par défaut.
- Chemins du visualiseur tokenisés avec validation stricte de l’ID et du jeton.
- CSP de réponse du visualiseur :
default-src 'none'- scripts et ressources provenant uniquement de self
- aucune connexion sortante
connect-src
- Limitation des échecs à distance lorsque l’accès à distance est activé :
- 40 échecs par 60 secondes
- verrouillage de 60 secondes (
429 Too Many Requests)
Durcissement du rendu de fichiers
- Le routage des demandes du navigateur de capture d’écran est interdit par défaut.
- Seules les ressources locales du visualiseur provenant de
http://127.0.0.1/plugins/diffs/assets/*sont autorisées. - Les requêtes réseau externes sont bloquées.
Configuration requise du navigateur pour le mode fichier
Section intitulée « Configuration requise du navigateur pour le mode fichier »mode: "file" et mode: "both" nécessitent un navigateur compatible Chromium.
Ordre de résolution :
Config
browser.executablePathdans la configuration OpenClaw.Variables d'environnement
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
Repli de la plateforme
Repli pour la découverte de commande/chemin de la plateforme.
Texte d’échec courant :
Diff PNG/PDF rendering requires a Chromium-compatible browser...
Résolvez le problème en installant Chrome, Chromium, Edge ou Brave, ou en définissant l’une des options de chemin exécutable ci-dessus.
Dépannage
Section intitulée « Dépannage »Erreurs de validation d'entrée
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 l’originehttp(s)avec un chemin optionnel, sans requête/hash.{field} exceeds maximum size (...)— réduisez la taille de la charge utile.- Rejet de correctif volumineux — réduisez le nombre de fichiers de correctif ou le nombre total de lignes.
Accessibilité de la visionneuse
- L’URL de la visionneuse résout vers
127.0.0.1par défaut. - Pour les scénarios d’accès à distance, vous pouvez soit :
- définir le
viewerBaseUrldu plugin, ou - passer
baseUrlpar appel d’outil, ou - utiliser
gateway.bind=custometgateway.customBindHost
- définir le
- Si
gateway.trustedProxiesTailscale inclut une boucle locale pour un proxy sur le même hôte (par exemple Tailscale Serve), les requêtes brutes de visionneuse en boucle locale sans en-têtes d’IP client transférés é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 intentionnellement
security.allowRemoteVieweret définissez leviewerBaseUrldu plugin ou passez unbaseUrlproxy/public lorsque vous avez besoin d’une URL de visionneuse partageable
- préférez
- N’activez
security.allowRemoteViewerque lorsque vous envisagez un accès externe à la visionneuse.
La ligne des lignes non modifiées n'a pas de bouton d'extension
Cela peut arriver pour l’entrée de correctif lorsque le correctif ne contient pas de contexte extensible. C’est normal et n’indique pas un échec de la visionneuse.
Artefact introuvable
- L’artefact a expiré en raison du TTL.
- Le jeton ou le chemin a changé.
- Le nettoyage a supprimé les données obsolètes.
Conseils opérationnels
Section intitulée « Conseils opérationnels »- Privilégiez
mode: "view"pour les révisions interactives locales dans le canvas. - Privilégiez
mode: "file"pour les canaux de conversation sortants qui nécessitent une pièce jointe. - Gardez
allowRemoteViewerdésactivé, sauf si votre déploiement nécessite des URL de visionneuse à distance. - Définissez un
ttlSecondscourt et 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 agressivement les images (par exemple Telegram ou WhatsApp), préférez la sortie PDF (TelegramWhatsApp
fileFormat: "pdf").