Diffs
diffs ist ein optionales Plugin-Tool mit kurzer integrierter Systemanleitung und einem begleitenden Skill, der Änderungsinhalte in ein schreibgeschütztes Diff-Artefakt für Agenten umwandelt.
Es akzeptiert entweder:
before- undafter-Text- ein vereinheitlichtes
patch
- eine Gateway-Viewer-URL für die Darstellung in Canvas
- einen gerenderten Dateipfad (PNG oder PDF) für die Nachrichtenzustellung
- beide Ausgaben in einem Aufruf
Schnellstart
- Aktiviere das Plugin.
- Rufe
diffsmitmode: "view"für Canvas-first-Abläufe auf. - Rufe
diffsmitmode: "file"für Chat-Dateizustellungsabläufe auf. - Rufe
diffsmitmode: "both"auf, wenn du beide Artefakte brauchst.
Das Plugin aktivieren
Integrierte Systemanleitung deaktivieren
Wenn du dasdiffs-Tool aktiviert lassen, aber seine integrierte System-Prompt-Anleitung deaktivieren möchtest, setze plugins.entries.diffs.hooks.allowPromptInjection auf false:
before_prompt_build des Diffs-Plugins blockiert, während Plugin, Tool und begleitender Skill weiterhin verfügbar bleiben.
Wenn du sowohl die Anleitung als auch das Tool deaktivieren möchtest, deaktiviere stattdessen das Plugin.
Typischer Agent-Workflow
- Der Agent ruft
diffsauf. - Der Agent liest die Felder in
details. - Der Agent:
- öffnet
details.viewerUrlmitcanvas present - sendet
details.filePathmitmessageunter Verwendung vonpathoderfilePath - oder tut beides
- öffnet
Eingabebeispiele
Before und after:Referenz für Tool-Eingaben
Alle Felder sind optional, sofern nicht anders angegeben:before(string): ursprünglicher Text. Erforderlich zusammen mitafter, wennpatchweggelassen wird.after(string): aktualisierter Text. Erforderlich zusammen mitbefore, wennpatchweggelassen wird.patch(string): vereinheitlichter Diff-Text. Gegenseitig ausschließend mitbeforeundafter.path(string): angezeigter Dateiname für den Modus with before/after.lang(string): Sprach-Override-Hinweis für den Modus with before/after. Unbekannte Werte fallen auf Klartext zurück.title(string): Override für den Viewer-Titel.mode("view" | "file" | "both"): Ausgabemodus. Standard ist der Plugin-Standarddefaults.mode. Veralteter Alias:"image"verhält sich wie"file"und wird aus Gründen der Abwärtskompatibilität weiterhin akzeptiert.theme("light" | "dark"): Viewer-Theme. Standard ist der Plugin-Standarddefaults.theme.layout("unified" | "split"): Diff-Layout. Standard ist der Plugin-Standarddefaults.layout.expandUnchanged(boolean): unveränderte Abschnitte erweitern, wenn vollständiger Kontext verfügbar ist. Nur Aufrufoption (kein Plugin-Standardschlüssel).fileFormat("png" | "pdf"): gerendertes Dateiformat. Standard ist der Plugin-Standarddefaults.fileFormat.fileQuality("standard" | "hq" | "print"): Qualitäts-Preset für PNG- oder PDF-Rendering.fileScale(number): Override für Geräteskalierung (1-4).fileMaxWidth(number): maximale Renderbreite in CSS-Pixeln (640-2400).ttlSeconds(number): Artefakt-TTL in Sekunden für Viewer- und eigenständige Dateiausgaben. Standard 1800, Maximum 21600.baseUrl(string): Override für den Ursprung der Viewer-URL. Überschreibt das Plugin-viewerBaseUrl. Musshttpoderhttpssein, ohne Query/Hash.
format->fileFormatimageFormat->fileFormatimageQuality->fileQualityimageScale->fileScaleimageMaxWidth->fileMaxWidth
beforeundafterjeweils max. 512 KiB.patchmax. 2 MiB.pathmax. 2048 Bytes.langmax. 128 Bytes.titlemax. 1024 Bytes.- Begrenzung der Patch-Komplexität: max. 128 Dateien und 120000 Gesamtzeilen.
patchzusammen mitbeforeoderafterwird abgelehnt.- Sicherheitsgrenzen für gerenderte Dateien (gelten für PNG und PDF):
fileQuality: "standard": max. 8 MP (8.000.000 gerenderte Pixel).fileQuality: "hq": max. 14 MP (14.000.000 gerenderte Pixel).fileQuality: "print": max. 24 MP (24.000.000 gerenderte Pixel).- PDF hat außerdem ein Maximum von 50 Seiten.
Vertrag für Ausgabedetails
Das Tool gibt strukturierte Metadaten unterdetails zurück.
Gemeinsame Felder für Modi, die einen Viewer erzeugen:
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountId, wenn verfügbar)
artifactIdexpiresAtfilePathpath(derselbe Wert wiefilePath, für Kompatibilität mit dem Message-Tool)fileBytesfileFormatfileQualityfileScalefileMaxWidth
format(derselbe Wert wiefileFormat)imagePath(derselbe Wert wiefilePath)imageBytes(derselbe Wert wiefileBytes)imageQuality(derselbe Wert wiefileQuality)imageScale(derselbe Wert wiefileScale)imageMaxWidth(derselbe Wert wiefileMaxWidth)
mode: "view": nur Viewer-Felder.mode: "file": nur Dateifelder, kein Viewer-Artefakt.mode: "both": Viewer-Felder plus Dateifelder. Wenn das Dateirendering fehlschlägt, wird der Viewer trotzdem mitfileErrorund dem KompatibilitätsaliasimageErrorzurückgegeben.
Eingeklappte unveränderte Abschnitte
- Der Viewer kann Zeilen wie
N unmodified linesanzeigen. - Bedienelemente zum Erweitern in diesen Zeilen sind bedingt und nicht für jede Eingabeart garantiert.
- Bedienelemente zum Erweitern erscheinen, wenn der gerenderte Diff erweiterbare Kontextdaten enthält, was typisch für before-/after-Eingaben ist.
- Bei vielen vereinheitlichten Patch-Eingaben sind ausgelassene Kontextkörper in den geparsten Patch-Hunks nicht verfügbar, sodass die Zeile ohne Bedienelemente zum Erweitern erscheinen kann. Das ist erwartetes Verhalten.
expandUnchangedgilt nur, wenn erweiterbarer Kontext existiert.
Plugin-Standardeinstellungen
Setze pluginweite Standardwerte in~/.openclaw/openclaw.json:
fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmode
viewerBaseUrl(string, optional)- Plugin-eigener Fallback für zurückgegebene Viewer-Links, wenn ein Tool-Aufruf kein
baseUrlübergibt. - Muss
httpoderhttpssein, ohne Query/Hash.
- Plugin-eigener Fallback für zurückgegebene Viewer-Links, wenn ein Tool-Aufruf kein
Sicherheitskonfiguration
security.allowRemoteViewer(boolean, Standardfalse)false: Anfragen ohne loopback an Viewer-Routen werden abgelehnt.true: Remote-Viewer sind erlaubt, wenn der tokenisierte Pfad gültig ist.
Artefakt-Lebenszyklus und Speicherung
- Artefakte werden unter dem temp-Unterordner gespeichert:
$TMPDIR/openclaw-diffs. - Viewer-Artefakt-Metadaten enthalten:
- zufällige Artefakt-ID (20 Hex-Zeichen)
- zufälliges Token (48 Hex-Zeichen)
createdAtundexpiresAt- gespeicherten Pfad
viewer.html
- Die Standard-Artefakt-TTL beträgt 30 Minuten, wenn nichts angegeben ist.
- Die maximal akzeptierte Viewer-TTL beträgt 6 Stunden.
- Das Bereinigen läuft opportunistisch nach der Artefakterstellung.
- Abgelaufene Artefakte werden gelöscht.
- Fallback-Bereinigung entfernt veraltete Ordner, die älter als 24 Stunden sind, wenn Metadaten fehlen.
Viewer-URL- und Netzwerkverhalten
Viewer-Route:/plugins/diffs/view/{artifactId}/{token}
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js
baseUrl-Pfadpräfix auch für diese Asset-Anfragen erhalten bleibt.
Verhalten beim URL-Aufbau:
- Wenn
baseUrlim Tool-Aufruf angegeben ist, wird es nach strikter Validierung verwendet. - Sonst wird, falls das Plugin-
viewerBaseUrlkonfiguriert ist, dieses verwendet. - Ohne eines dieser Overrides ist die Viewer-URL standardmäßig auf loopback
127.0.0.1. - Wenn der Gateway-Bind-Modus
customist undgateway.customBindHostgesetzt ist, wird dieser Host verwendet.
baseUrl:
- Muss
http://oderhttps://sein. - Query und Hash werden abgelehnt.
- Origin plus optionaler Basispfad sind erlaubt.
Sicherheitsmodell
Härtung des Viewers:- Standardmäßig nur loopback.
- Tokenisierte Viewer-Pfade mit strikter ID- und Token-Validierung.
- CSP der Viewer-Antwort:
default-src 'none'- Skripte und Assets nur von self
- kein ausgehendes
connect-src
- Drosselung bei Remote-Fehlschlägen, wenn Remote-Zugriff aktiviert ist:
- 40 Fehler pro 60 Sekunden
- 60 Sekunden Sperre (
429 Too Many Requests)
- Request-Routing des Screenshot-Browsers ist standardmäßig deny-by-default.
- Nur lokale Viewer-Assets von
http://127.0.0.1/plugins/diffs/assets/*sind erlaubt. - Externe Netzwerkanfragen werden blockiert.
Browser-Anforderungen für Dateimodus
mode: "file" und mode: "both" benötigen einen Chromium-kompatiblen Browser.
Reihenfolge der Auflösung:
browser.executablePathin der OpenClaw-Konfiguration.- Umgebungsvariablen:
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
- Plattformweites Fallback für Befehls-/Pfaderkennung.
Diff PNG/PDF rendering requires a Chromium-compatible browser...
Fehlerbehebung
Eingabevalidierungsfehler:Provide patch or both before and after text.- Gib sowohl
beforeals auchafteran oder stellepatchbereit.
- Gib sowohl
Provide either patch or before/after input, not both.- Mische die Eingabemodi nicht.
Invalid baseUrl: ...- Verwende einen
http(s)-Origin mit optionalem Pfad, ohne Query/Hash.
- Verwende einen
{field} exceeds maximum size (...)- Reduziere die Größe des Payloads.
- Ablehnung wegen großem Patch
- Reduziere die Anzahl der Dateien oder die Gesamtzeilen im Patch.
- Viewer-URLs werden standardmäßig zu
127.0.0.1aufgelöst. - Für Remote-Zugriffsszenarien gilt entweder:
- setze das Plugin-
viewerBaseUrl, oder - übergib
baseUrlpro Tool-Aufruf, oder - verwende
gateway.bind=customundgateway.customBindHost
- setze das Plugin-
- Wenn
gateway.trustedProxiesloopback für einen Proxy auf demselben Host enthält (zum Beispiel Tailscale Serve), schlagen rohe loopback-Viewer-Anfragen ohne weitergeleitete Client-IP-Header konstruktionsbedingt fail-closed fehl. - Für diese Proxy-Topologie:
- bevorzuge
mode: "file"odermode: "both", wenn du nur einen Anhang brauchst, oder - aktiviere absichtlich
security.allowRemoteViewerund setze das Plugin-viewerBaseUrloder übergib ein Proxy-/öffentlichesbaseUrl, wenn du eine teilbare Viewer-URL brauchst
- bevorzuge
- Aktiviere
security.allowRemoteViewernur, wenn du externen Viewer-Zugriff beabsichtigst.
- Das kann bei Patch-Eingabe passieren, wenn der Patch keinen erweiterbaren Kontext enthält.
- Das ist erwartet und weist nicht auf einen Fehler des Viewers hin.
- Artefakt ist wegen TTL abgelaufen.
- Token oder Pfad wurde geändert.
- Die Bereinigung hat veraltete Daten entfernt.
Betriebshinweise
- Bevorzuge
mode: "view"für lokale interaktive Prüfungen in Canvas. - Bevorzuge
mode: "file"für ausgehende Chat-Channels, die einen Anhang benötigen. - Lasse
allowRemoteViewerdeaktiviert, es sei denn, dein Deployment benötigt Remote-Viewer-URLs. - Setze explizite kurze
ttlSecondsfür sensible Diffs. - Vermeide es, Secrets in Diff-Eingaben zu senden, wenn dies nicht erforderlich ist.
- Wenn dein Channel Bilder stark komprimiert (zum Beispiel Telegram oder WhatsApp), bevorzuge PDF-Ausgabe (
fileFormat: "pdf").
- Bereitgestellt von Diffs.