Tools
Verschillen
diffs is een optionele gebundelde plugintool die voor-/natekst of een uniforme patch omzet in een alleen-lezen diff-artefact. De tool voegt ook korte instructies voor agents vooraan toe aan de systeemprompt en wordt geleverd met een bijbehorende skill voor uitgebreidere instructies.
Invoer: before- en after-tekst, of een uniforme patch (wederzijds uitsluitend).
Uitvoer: een Gateway-viewer-URL voor canvasweergave, een gerenderd PNG-/PDF-bestandspad voor berichtbezorging, of beide.
Snel aan de slag
Installeer de plugin
openclaw plugins install diffsSchakel de plugin in
{ plugins: { entries: { diffs: { enabled: true, }, }, },}Kies een modus
view
Canvasgerichte flows: agents roepen diffs aan met mode: "view" en openen details.viewerUrl met canvas present.
file
Bestandsbezorging via chat: agents roepen diffs aan met mode: "file" en verzenden details.filePath met message via path of filePath.
both
Gecombineerd (standaard): agents roepen diffs aan met mode: "both" om beide artefacten in één aanroep te verkrijgen.
Ingebouwde systeeminstructies uitschakelen
Stel plugins.entries.diffs.hooks.allowPromptInjection in op false om de tool te behouden, maar de vooraan toegevoegde systeempromptinstructies weg te laten:
{ plugins: { entries: { diffs: { enabled: true, hooks: { allowPromptInjection: false, }, }, }, },}Hiermee wordt de before_prompt_build-hook van de plugin geblokkeerd, terwijl de tool en skill beschikbaar blijven. Schakel in plaats daarvan de plugin uit om zowel de instructies als de tool uit te schakelen.
Naslag voor toolinvoer
Alle velden zijn optioneel, tenzij anders vermeld.
beforestringOorspronkelijke tekst. Vereist met after wanneer patch is weggelaten.
afterstringBijgewerkte tekst. Vereist met before wanneer patch is weggelaten.
patchstringUniforme diff-tekst. Wederzijds uitsluitend met before en after.
pathstringWeergavebestandsnaam voor de voor/na-modus.
langstringHint om de taal voor de voor/na-modus te overschrijven. Onbekende waarden en talen buiten de standaardset van de viewer vallen terug op platte tekst, tenzij de plugin Diff Viewer Language Pack is geïnstalleerd.
titlestringOverschrijving van de viewertitel.
mode"view" | "file" | "both"Uitvoermodus. Standaard wordt de pluginstandaard defaults.mode (both) gebruikt. Verouderde alias: "image" gedraagt zich hetzelfde als "file".
theme"light" | "dark"Viewerthema. Standaard wordt de pluginstandaard defaults.theme gebruikt.
layout"unified" | "split"Diff-indeling. Standaard wordt de pluginstandaard defaults.layout gebruikt.
expandUnchangedbooleanVouw ongewijzigde secties uit wanneer de volledige context beschikbaar is. Alleen een optie per aanroep (geen standaardsleutel van de plugin).
fileFormat"png" | "pdf"Gerenderde bestandsindeling. Standaard wordt de pluginstandaard defaults.fileFormat gebruikt.
fileQuality"standard" | "hq" | "print"Kwaliteitsvoorinstelling voor PNG-/PDF-rendering.
fileScalenumberOverschrijving van de apparaatschaal (1-4).
fileMaxWidthnumberMaximale renderbreedte in CSS-pixels (640-2400).
ttlSecondsnumberdefault: 1800TTL van het artefact in seconden voor de viewer en zelfstandige bestandsuitvoer. Maximaal 21600.
baseUrlstringOverschrijving van de oorsprong van de viewer-URL. Overschrijft pluginwaarde viewerBaseUrl. Moet http of https zijn, zonder query/hash.
Validatie en limieten
before/after: elk maximaal 512 KiB.patch: maximaal 2 MiB.path: maximaal 2048 bytes.lang: maximaal 128 bytes.title: maximaal 1024 bytes.- Limiet voor patchcomplexiteit: maximaal 128 bestanden en in totaal 120000 regels.
patchsamen metbefore/afterwordt geweigerd.- Veiligheidslimieten voor gerenderde bestanden (PNG en PDF):
fileQuality: "standard": maximaal 8 MP (8,000,000 gerenderde pixels).fileQuality: "hq": maximaal 14 MP.fileQuality: "print": maximaal 24 MP.- PDF is daarnaast beperkt tot 50 pagina's.
Syntaxismarkering
Ingebouwde talen:
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 en toml.
Veelgebruikte aliassen (js, ts, bash, md, yml, c++, dockerfile, rb, kt, ps1, enzovoort) worden naar die talen genormaliseerd.
Installeer de plugin Diff Viewer Language Pack voor meer talen (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 en meer):
openclaw plugins install clawhub:@openclaw/diffs-language-packZonder het pakket worden niet-ondersteunde talen nog steeds als leesbare platte tekst gerenderd. Zie plugin Diffs Language Pack en Shiki-talen voor de upstreamcatalogus.
Contract voor uitvoerdetails
Alle geslaagde resultaten bevatten changed: identieke voor-/nainvoer retourneert false zonder een artefact te maken; gerenderde resultaten retourneren true.
Viewervelden (modi view en both)
changedartifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountIdindien beschikbaar)
Bestandsvelden (modi file en both)
changedartifactIdexpiresAtfilePathpath(dezelfde waarde alsfilePath, voor compatibiliteit met de berichtentool)fileBytesfileFormatfileQualityfileScalefileMaxWidth
| Modus | Retourneert |
|---|---|
"view" |
Alleen viewervelden. |
"file" |
Alleen bestandsvelden, geen viewerartefact. |
"both" |
Viewervelden plus bestandsvelden. Als het renderen van het bestand mislukt, wordt de viewer nog steeds geretourneerd met fileError. |
Samengevouwen ongewijzigde secties
De viewer toont rijen zoals N unmodified lines. Uitvouwbediening verschijnt alleen wanneer de gerenderde diff uitvouwbare contextgegevens bevat (gebruikelijk bij voor-/nainvoer). Bij veel uniforme patches ontbreken contextblokken in de hunks, waardoor de rij zonder uitvouwbediening kan verschijnen -- dit is verwacht en geen fout. expandUnchanged is alleen van toepassing wanneer uitvouwbare context bestaat.
Navigatie tussen meerdere bestanden
Patches die meer dan één bestand wijzigen, beginnen met een overzichtskaart van gewijzigde bestanden: totale aantallen +N / -N, aantallen per bestand, badges voor toegevoegd/verwijderd/hernoemd en ankerlinks die naar elk bestand springen. Gerenderde PNG-/PDF-bestanden behouden de aantallen in de bestandskoppen, maar laten de interactieve weergaveschakelaars weg, omdat die bedieningselementen in een statisch bestand niet werken.
Pluginstandaarden
Stel pluginbrede standaardwaarden in via ~/.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, }, }, }, }, },}Ondersteunde defaults-sleutels: fontFamily, fontSize, lineSpacing, layout, showLineNumbers, diffIndicators, wordWrap, background, theme, fileFormat, fileQuality, fileScale, fileMaxWidth, mode, ttlSeconds. Expliciete parameters van toolaanroepen overschrijven deze.
Configuratie voor permanente viewer-URL
viewerBaseUrlstringDoor de plugin beheerde terugvalwaarde voor geretourneerde viewerlinks wanneer een toolaanroep geen baseUrl doorgeeft. Moet http of https zijn, zonder query/hash.
{ plugins: { entries: { diffs: { enabled: true, config: { viewerBaseUrl: "https://gateway.example.com/openclaw", }, }, }, },}Beveiligingsconfiguratie
security.allowRemoteViewerbooleandefault: falsefalse: aanvragen naar viewerroutes die niet van loopback afkomstig zijn, worden geweigerd. true: externe viewers zijn toegestaan als het pad met token geldig is.
{ plugins: { entries: { diffs: { enabled: true, config: { security: { allowRemoteViewer: false, }, }, }, }, },}Levenscyclus en opslag van artefacten
- Viewer-HTML en metadata bevinden zich in de gedeelde
state/openclaw.sqlite-database onder de blobnaamruimte van de Diffs-plugin. HTML wordt met gzip gecomprimeerd; SQLite slaat alleen een SHA-256-hash van het willekeurige URL-token op, niet het token zelf. - Gerenderde PNG-/PDF-bestanden blijven tijdelijke materialisaties onder
$TMPDIR/openclaw-diffs, omdat levering via een kanaal een bestandspad vereist. SQLite beheert de metadata over hun vervaldatum; er worden geen JSON-nevenbestanden geschreven. - Standaard-TTL voor artefacten: 30 minuten. Maximaal geaccepteerde TTL: 6 uur.
- Opschoning wordt opportunistisch uitgevoerd na elke aanroep voor het maken van een artefact. Verlopen SQLite-rijen worden eerst verwijderd, gevolgd door de bijbehorende PNG-/PDF-map.
- Een fallback-scan verwijdert tijdelijke mappen zonder rij die ouder zijn dan 24 uur. Verouderde caches van
meta.json,file-meta.jsonenviewer.htmlworden niet geïmporteerd of gelezen.
Viewer-URL en netwerkgedrag
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(alleen wanneer de diff een taal uit een taalpakket gebruikt)
Het viewer-document resolveert deze assets relatief ten opzichte van de viewer-URL, zodat een optioneel padvoorvoegsel baseUrl ook wordt toegepast op assetaanvragen.
Volgorde voor URL-resolutie: baseUrl van de toolaanroep (na strikte validatie) -> viewerBaseUrl van de plugin -> standaard loopback 127.0.0.1. Als de bindmodus van de Gateway custom is en gateway.customBindHost is ingesteld, wordt die host gebruikt in plaats van loopback.
Regels voor baseUrl: moet http:// of https:// zijn; query en hash worden geweigerd; een origin met een optioneel basispad is toegestaan.
Beveiligingsmodel
Viewer-beveiliging
- Standaard alleen via loopback.
- Viewer-paden met tokens en strikte validatie van ID- en tokenpatronen.
- CSP van de viewer-respons:
default-src 'none'; scripts/assets alleen van dezelfde bron; geen uitgaandeconnect-src. - Beperking van externe mislukte pogingen wanneer externe toegang is ingeschakeld: 40 mislukte pogingen binnen 60 seconden activeren een blokkering van 60 seconden (
429 Too Many Requests).
Beveiliging van bestandsrendering
- Routering van browseraanvragen voor schermafbeeldingen weigert standaard alles.
- Alleen lokale viewer-assets van
http://127.0.0.1/plugins/diffs/assets/*zijn toegestaan. - Externe netwerkaanvragen worden geblokkeerd.
Browservereisten voor de bestandsmodus
mode: "file" en mode: "both" vereisen een Chromium-compatibele browser.
Resolutievolgorde:
Configuratie
browser.executablePath in de OpenClaw-configuratie.
Omgevingsvariabelen
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
Platformfallback
Gebruikelijke installatiepaden en PATH-zoekacties voor Chrome, Chromium, Edge en Brave.
Veelvoorkomende fouttekst: Diff PNG/PDF rendering requires a Chromium-compatible browser.... Los dit op door Chrome, Chromium, Edge of Brave te installeren, of door een van de bovenstaande opties voor het pad naar het uitvoerbare bestand in te stellen.
Probleemoplossing
Invoervalidatiefouten
Provide patch or both before and after text.-- neem zowelbeforealsafterop, of geefpatchop.Provide either patch or before/after input, not both.-- combineer geen invoermodi.Invalid baseUrl: ...-- gebruik eenhttp(s)-origin met een optioneel pad, zonder query/hash.{field} exceeds maximum size (...)-- verklein de payload.- Grote patch geweigerd -- verminder het aantal patchbestanden of het totale aantal regels.
Toegankelijkheid van de viewer
- De viewer-URL resolveert standaard naar
127.0.0.1. - Stel voor externe toegang
viewerBaseUrlvan de plugin in, geefbaseUrlper aanroep door, of gebruikgateway.bind=custommetgateway.customBindHost. - Als
gateway.trustedProxiesloopback bevat voor een proxy op dezelfde host (bijvoorbeeld Tailscale Serve), mislukken directe loopback-aanvragen aan de viewer zonder doorgestuurde headers met het client-IP standaard volgens het fail-closed-principe. - Geef voor die proxytopologie de voorkeur aan
mode: "file"/"both"voor een bijlage, of schakel bewustsecurity.allowRemoteViewerin plusviewerBaseUrlvan de plugin/eenbaseUrlvan de proxy voor een deelbare viewer-link. - Schakel
security.allowRemoteVieweralleen in wanneer externe toegang tot de viewer bedoeld is.
Rij met ongewijzigde regels heeft geen uitvouwknop
Dit is te verwachten bij patchinvoer zonder uitvouwbare context; het is geen viewer-fout.
Artefact niet gevonden
- Artefact is vanwege de TTL verlopen.
- Token of pad is gewijzigd.
- De opschoning heeft verouderde gegevens verwijderd.
Operationele richtlijnen
- Geef de voorkeur aan
mode: "view"voor lokale interactieve reviews in canvas. - Geef de voorkeur aan
mode: "file"voor uitgaande chatkanalen die een bijlage nodig hebben. - Houd
allowRemoteVieweruitgeschakeld, tenzij je implementatie externe viewer-URL's vereist. - Stel voor gevoelige diffs een expliciete korte
ttlSecondsin. - Vermijd het verzenden van geheimen in diffinvoer wanneer dat niet nodig is.
- Als je kanaal afbeeldingen sterk comprimeert (bijvoorbeeld Telegram of WhatsApp), geef dan de voorkeur aan PDF-uitvoer (
fileFormat: "pdf").