Tools
Differenzen
diffs ist ein optionales gebündeltes Plugin-Tool, das Vorher-/Nachher-Text oder einen vereinheitlichten Patch in ein schreibgeschütztes Diff-Artefakt umwandelt. Es stellt dem System-Prompt außerdem kurze Agent-Anweisungen voran und enthält ein begleitendes Skill mit ausführlicheren Anweisungen.
Eingabe: before- und after-Text oder ein vereinheitlichter patch (schließen sich gegenseitig aus).
Ausgabe: eine Gateway-Viewer-URL für die Canvas-Darstellung, ein gerenderter PNG-/PDF-Dateipfad für die Nachrichtenzustellung oder beides.
Schnellstart
Plugin installieren
openclaw plugins install diffsPlugin aktivieren
{ plugins: { entries: { diffs: { enabled: true, }, }, },}Modus auswählen
view
Canvas-orientierte Abläufe: Agenten rufen diffs mit mode: "view" auf und öffnen details.viewerUrl mit canvas present.
file
Zustellung von Chat-Dateien: Agenten rufen diffs mit mode: "file" auf und senden details.filePath mit message unter Verwendung von path oder filePath.
both
Kombiniert (Standard): Agenten rufen diffs mit mode: "both" auf, um beide Artefakte mit einem einzigen Aufruf abzurufen.
Integrierte Systemanweisungen deaktivieren
Um das Tool beizubehalten, aber die vorangestellten System-Prompt-Anweisungen zu entfernen, setzen Sie plugins.entries.diffs.hooks.allowPromptInjection auf false:
{ plugins: { entries: { diffs: { enabled: true, hooks: { allowPromptInjection: false, }, }, }, },}Dadurch wird der before_prompt_build-Hook des Plugins blockiert, während das Tool und das Skill verfügbar bleiben. Um sowohl die Anweisungen als auch das Tool zu deaktivieren, deaktivieren Sie stattdessen das Plugin.
Referenz der Tool-Eingaben
Alle Felder sind optional, sofern nicht anders angegeben.
beforestringUrsprünglicher Text. Zusammen mit after erforderlich, wenn patch ausgelassen wird.
afterstringAktualisierter Text. Zusammen mit before erforderlich, wenn patch ausgelassen wird.
patchstringVereinheitlichter Diff-Text. Schließt sich mit before und after gegenseitig aus.
pathstringAngezeigter Dateiname für den Vorher-/Nachher-Modus.
langstringHinweis zum Überschreiben der Sprache für den Vorher-/Nachher-Modus. Unbekannte Werte und Sprachen außerhalb des standardmäßigen Viewer-Satzes greifen auf Klartext zurück, sofern das Diff Viewer Language Pack-Plugin nicht installiert ist.
titlestringÜberschreibung des Viewer-Titels.
mode"view" | "file" | "both"Ausgabemodus. Standardmäßig wird der Plugin-Standardwert defaults.mode (both) verwendet. Veralteter Alias: "image" verhält sich identisch zu "file".
theme"light" | "dark"Viewer-Theme. Standardmäßig wird der Plugin-Standardwert defaults.theme verwendet.
layout"unified" | "split"Diff-Layout. Standardmäßig wird der Plugin-Standardwert defaults.layout verwendet.
expandUnchangedbooleanUnveränderte Abschnitte erweitern, wenn der vollständige Kontext verfügbar ist. Nur Option pro Aufruf (kein Plugin-Standardschlüssel).
fileFormat"png" | "pdf"Gerendertes Dateiformat. Standardmäßig wird der Plugin-Standardwert defaults.fileFormat verwendet.
fileQuality"standard" | "hq" | "print"Qualitätsvoreinstellung für das PNG-/PDF-Rendering.
fileScalenumberÜberschreibung der Geräteskalierung (1-4).
fileMaxWidthnumberMaximale Rendering-Breite in CSS-Pixeln (640-2400).
ttlSecondsnumberdefault: 1800Artefakt-TTL in Sekunden für Viewer- und eigenständige Dateiausgaben. Maximal 21600.
baseUrlstringÜberschreibung des Ursprungs der Viewer-URL. Überschreibt Plugin-viewerBaseUrl. Muss http oder https sein, ohne Abfrage/Hash.
Validierung und Grenzwerte
before/after: jeweils maximal 512 KiB.patch: maximal 2 MiB.path: maximal 2048 Byte.lang: maximal 128 Byte.title: maximal 1024 Byte.- Komplexitätsgrenze für Patches: maximal 128 Dateien und insgesamt 120000 Zeilen.
patchzusammen mitbefore/afterwird abgelehnt.- Sicherheitsgrenzen für gerenderte Dateien (PNG und PDF):
fileQuality: "standard": maximal 8 MP (8,000,000 gerenderte Pixel).fileQuality: "hq": maximal 14 MP.fileQuality: "print": maximal 24 MP.- PDF ist außerdem auf 50 Seiten begrenzt.
Syntaxhervorhebung
Integrierte Sprachen:
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 und toml.
Gängige Aliasse (js, ts, bash, md, yml, c++, dockerfile, rb, kt, ps1 usw.) werden auf diese Sprachen normalisiert.
Installieren Sie das Diff Viewer Language Pack-Plugin für weitere Sprachen (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, diff und weitere):
openclaw plugins install clawhub:@openclaw/diffs-language-packOhne das Pack werden nicht unterstützte Sprachen weiterhin als lesbarer Klartext gerendert. Den vorgelagerten Katalog finden Sie unter Diffs Language Pack-Plugin und Shiki-Sprachen.
Vertrag für Ausgabedetails
Alle erfolgreichen Ergebnisse enthalten changed: Bei identischen Vorher-/Nachher-Eingaben wird false zurückgegeben, ohne ein Artefakt zu erstellen; gerenderte Ergebnisse geben true zurück.
Viewer-Felder (Modi view und both)
changedartifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountId, sofern verfügbar)
Dateifelder (Modi file und both)
changedartifactIdexpiresAtfilePathpath(derselbe Wert wiefilePath, für die Kompatibilität mit dem Nachrichten-Tool)fileBytesfileFormatfileQualityfileScalefileMaxWidth
| Modus | Rückgabe |
|---|---|
"view" |
Nur Viewer-Felder. |
"file" |
Nur Dateifelder, kein Viewer-Artefakt. |
"both" |
Viewer-Felder plus Dateifelder. Wenn das Datei-Rendering fehlschlägt, wird der Viewer dennoch mit fileError zurückgegeben. |
Reduzierte unveränderte Abschnitte
Der Viewer zeigt Zeilen wie N unmodified lines. Steuerelemente zum Erweitern werden nur angezeigt, wenn das gerenderte Diff erweiterbare Kontextdaten enthält (typischerweise bei Vorher-/Nachher-Eingaben). Bei vielen vereinheitlichten Patches fehlen die Kontextinhalte in den Hunk-Abschnitten, sodass die Zeile ohne Steuerelement zum Erweitern erscheinen kann – dies ist erwartetes Verhalten und kein Fehler. expandUnchanged gilt nur, wenn erweiterbarer Kontext vorhanden ist.
Navigation zwischen mehreren Dateien
Patches, die mehr als eine Datei betreffen, beginnen mit einer Übersichtskarte der geänderten Dateien: Gesamtzahlen für +N / -N, Zahlen pro Datei, Kennzeichnungen für hinzugefügt/gelöscht/umbenannt und Ankerlinks, die zu jeder Datei springen. Gerenderte PNG-/PDF-Dateien behalten die Zahlen in den Dateikopfzeilen bei, lassen jedoch die interaktiven Ansichtsumschalter weg, da diese in einer statischen Datei funktionslose Steuerelemente wären.
Plugin-Standardwerte
Legen Sie Plugin-weite Standardwerte in ~/.openclaw/openclaw.json fest:
{ 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, }, }, }, }, },}Unterstützte defaults-Schlüssel: fontFamily, fontSize, lineSpacing, layout, showLineNumbers, diffIndicators, wordWrap, background, theme, fileFormat, fileQuality, fileScale, fileMaxWidth, mode, ttlSeconds. Explizite Parameter des Tool-Aufrufs überschreiben diese Werte.
Konfiguration einer dauerhaften Viewer-URL
viewerBaseUrlstringPlugin-eigener Rückfallwert für zurückgegebene Viewer-Links, wenn ein Tool-Aufruf baseUrl nicht übergibt. Muss http oder https sein, ohne Abfrage/Hash.
{ plugins: { entries: { diffs: { enabled: true, config: { viewerBaseUrl: "https://gateway.example.com/openclaw", }, }, }, },}Sicherheitskonfiguration
security.allowRemoteViewerbooleandefault: falsefalse: Anfragen von Adressen außerhalb der Loopback-Schnittstelle an Viewer-Routen werden abgelehnt. true: Remote-Viewer sind zulässig, wenn der tokenisierte Pfad gültig ist.
{ plugins: { entries: { diffs: { enabled: true, config: { security: { allowRemoteViewer: false, }, }, }, }, },}Lebenszyklus und Speicherung von Artefakten
- Viewer-HTML und Metadaten befinden sich in der gemeinsam genutzten
state/openclaw.sqlite-Datenbank im Blob-Namespace des Diffs-Plugins. HTML wird mit gzip komprimiert; SQLite speichert nur einen SHA-256-Hash des zufälligen URL-Tokens, nicht das Token selbst. - Gerenderte PNG-/PDF-Dateien bleiben temporäre Materialisierungen unter
$TMPDIR/openclaw-diffs, da die Zustellung über Kanäle einen Dateipfad erfordert. SQLite verwaltet ihre Ablaufmetadaten; es werden keine JSON-Sidecar-Dateien geschrieben. - Standardmäßige TTL für Artefakte: 30 Minuten. Maximal akzeptierte TTL: 6 Stunden.
- Die Bereinigung wird opportunistisch nach jedem Aufruf zur Artefakterstellung ausgeführt. Abgelaufene SQLite-Zeilen werden zuerst gelöscht, gefolgt von den entsprechenden PNG-/PDF-Verzeichnissen.
- Ein zusätzlicher Bereinigungsdurchlauf entfernt zeilenlose temporäre Ordner, die älter als 24 Stunden sind. Veraltete Caches unter
meta.json,file-meta.jsonundviewer.htmlwerden weder importiert noch gelesen.
Viewer-URL und Netzwerkverhalten
Viewer-Route: /plugins/diffs/view/{artifactId}/{token}
Viewer-Assets:
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js/plugins/diffs-language-pack/assets/viewer.js(nur wenn der Diff eine Sprache aus einem Sprachpaket verwendet)
Das Viewer-Dokument löst diese Assets relativ zur Viewer-URL auf, sodass ein optionales Pfadpräfix baseUrl auch für Asset-Anfragen übernommen wird.
Reihenfolge der URL-Auflösung: baseUrl des Tool-Aufrufs (nach strenger Validierung) -> viewerBaseUrl des Plugins -> standardmäßig Loopback 127.0.0.1. Wenn der Gateway-Bindungsmodus custom ist und gateway.customBindHost festgelegt wurde, wird dieser Host anstelle von Loopback verwendet.
Regeln für baseUrl: muss http:// oder https:// sein; Abfrageparameter und Hash werden abgelehnt; der Ursprung mit optionalem Basispfad ist zulässig.
Sicherheitsmodell
Absicherung des Viewers
- Standardmäßig nur über Loopback zugänglich.
- Tokenisierte Viewer-Pfade mit strenger Validierung der ID- und Token-Muster.
- CSP der Viewer-Antwort:
default-src 'none'; Skripte/Assets nur aus derselben Quelle; keine ausgehendenconnect-src. - Drosselung fehlgeschlagener Remote-Zugriffe, wenn der Remote-Zugriff aktiviert ist: 40 Fehlschläge innerhalb von 60 Sekunden lösen eine 60-sekündige Sperre aus (
429 Too Many Requests).
Absicherung des Datei-Renderings
- Das Routing von Browseranfragen für Screenshots verweigert standardmäßig alle Anfragen.
- Nur lokale Viewer-Assets aus
http://127.0.0.1/plugins/diffs/assets/*sind zulässig. - Externe Netzwerkanfragen werden blockiert.
Browseranforderungen für den Dateimodus
mode: "file" und mode: "both" benötigen einen Chromium-kompatiblen Browser.
Auflösungsreihenfolge:
Konfiguration
browser.executablePath in der OpenClaw-Konfiguration.
Umgebungsvariablen
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
Plattform-Fallback
Übliche Installationspfade und PATH-Suchvorgänge für Chrome, Chromium, Edge und Brave.
Häufige Fehlermeldung: Diff PNG/PDF rendering requires a Chromium-compatible browser.... Installieren Sie zur Behebung Chrome, Chromium, Edge oder Brave, oder legen Sie eine der oben genannten Optionen für den Pfad zur ausführbaren Datei fest.
Fehlerbehebung
Fehler bei der Eingabevalidierung
Provide patch or both before and after text.-- geben Sie sowohlbeforeals auchafteran oder stellen Siepatchbereit.Provide either patch or before/after input, not both.-- kombinieren Sie keine Eingabemodi.Invalid baseUrl: ...-- verwenden Sie einenhttp(s)-Ursprung mit optionalem Pfad, ohne Abfrageparameter/Hash.{field} exceeds maximum size (...)-- reduzieren Sie die Nutzlastgröße.- Ablehnung eines großen Patches -- reduzieren Sie die Anzahl der Patch-Dateien oder die Gesamtzahl der Zeilen.
Erreichbarkeit des Viewers
- Die Viewer-URL wird standardmäßig zu
127.0.0.1aufgelöst. - Legen Sie für den Remote-Zugriff entweder
viewerBaseUrldes Plugins fest, übergeben Sie bei jedem AufrufbaseUrl, oder verwenden Siegateway.bind=custommitgateway.customBindHost. - Wenn
gateway.trustedProxiesLoopback für einen Proxy auf demselben Host umfasst (beispielsweise Tailscale Serve), werden direkte Loopback-Anfragen an den Viewer ohne weitergeleitete Header mit der Client-IP absichtlich nach dem Fail-Closed-Prinzip abgelehnt. - Bevorzugen Sie für diese Proxy-Topologie
mode: "file"/"both"für einen Anhang, oder aktivieren Sie für einen teilbaren Viewer-Link gezieltsecurity.allowRemoteViewerzusammen mitviewerBaseUrldes Plugins/einem Proxy-baseUrl. - Aktivieren Sie
security.allowRemoteViewernur, wenn ein externer Viewer-Zugriff vorgesehen ist.
Die Zeile für unveränderte Zeilen hat keine Schaltfläche zum Erweitern
Dies ist bei Patch-Eingaben ohne erweiterbaren Kontext zu erwarten und kein Viewer-Fehler.
Artefakt nicht gefunden
- Das Artefakt ist aufgrund der TTL abgelaufen.
- Token oder Pfad wurde geändert.
- Die Bereinigung hat veraltete Daten entfernt.
Betriebshinweise
- Bevorzugen Sie
mode: "view"für lokale interaktive Reviews in Canvas. - Bevorzugen Sie
mode: "file"für ausgehende Chatkanäle, die einen Anhang benötigen. - Lassen Sie
allowRemoteViewerdeaktiviert, sofern Ihre Bereitstellung keine Remote-Viewer-URLs erfordert. - Legen Sie für vertrauliche Diffs ausdrücklich eine kurze
ttlSecondsfest. - Vermeiden Sie es, Geheimnisse in der Diff-Eingabe zu senden, wenn dies nicht erforderlich ist.
- Wenn Ihr Kanal Bilder stark komprimiert (beispielsweise Telegram oder WhatsApp), bevorzugen Sie die PDF-Ausgabe (
fileFormat: "pdf").