Skip to main content
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

1

Installeer de plugin

2

Schakel de plugin in

3

Kies een modus

Canvasgerichte flows: agents roepen diffs aan met mode: "view" en openen details.viewerUrl met canvas present.

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:
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.
string
Oorspronkelijke tekst. Vereist met after wanneer patch is weggelaten.
string
Bijgewerkte tekst. Vereist met before wanneer patch is weggelaten.
string
Uniforme diff-tekst. Wederzijds uitsluitend met before en after.
string
Weergavebestandsnaam voor de voor/na-modus.
string
Hint 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.
string
Overschrijving van de viewertitel.
"view" | "file" | "both"
Uitvoermodus. Standaard wordt de pluginstandaard defaults.mode (both) gebruikt. Verouderde alias: "image" gedraagt zich hetzelfde als "file".
"light" | "dark"
Viewerthema. Standaard wordt de pluginstandaard defaults.theme gebruikt.
"unified" | "split"
Diff-indeling. Standaard wordt de pluginstandaard defaults.layout gebruikt.
boolean
Vouw ongewijzigde secties uit wanneer de volledige context beschikbaar is. Alleen een optie per aanroep (geen standaardsleutel van de plugin).
"png" | "pdf"
Gerenderde bestandsindeling. Standaard wordt de pluginstandaard defaults.fileFormat gebruikt.
"standard" | "hq" | "print"
Kwaliteitsvoorinstelling voor PNG-/PDF-rendering.
number
Overschrijving van de apparaatschaal (1-4).
number
Maximale renderbreedte in CSS-pixels (640-2400).
number
standaard:"1800"
TTL van het artefact in seconden voor de viewer en zelfstandige bestandsuitvoer. Maximaal 21600.
string
Overschrijving van de oorsprong van de viewer-URL. Overschrijft pluginwaarde viewerBaseUrl. Moet http of https zijn, zonder query/hash.
  • 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.
  • patch samen met before/after wordt 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):
Zonder 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.
  • changed
  • artifactId
  • viewerUrl
  • viewerPath
  • title
  • expiresAt
  • inputKind
  • fileCount
  • mode
  • context (agentId, sessionId, messageChannel, agentAccountId indien beschikbaar)
  • changed
  • artifactId
  • expiresAt
  • filePath
  • path (dezelfde waarde als filePath, voor compatibiliteit met de berichtentool)
  • fileBytes
  • fileFormat
  • fileQuality
  • fileScale
  • fileMaxWidth

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. 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:
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

string
Door de plugin beheerde terugvalwaarde voor geretourneerde viewerlinks wanneer een toolaanroep geen baseUrl doorgeeft. Moet http of https zijn, zonder query/hash.

Beveiligingsconfiguratie

boolean
standaard:"false"
false: aanvragen naar viewerroutes die niet van loopback afkomstig zijn, worden geweigerd. true: externe viewers zijn toegestaan als het pad met token geldig is.

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.json en viewer.html worden 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

  • 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 uitgaande connect-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).
  • 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:
1

Configuratie

browser.executablePath in de OpenClaw-configuratie.
2

Omgevingsvariabelen

  • OPENCLAW_BROWSER_EXECUTABLE_PATH
  • BROWSER_EXECUTABLE_PATH
  • PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
3

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

  • Provide patch or both before and after text. — neem zowel before als after op, of geef patch op.
  • Provide either patch or before/after input, not both. — combineer geen invoermodi.
  • Invalid baseUrl: ... — gebruik een http(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.
  • De viewer-URL resolveert standaard naar 127.0.0.1.
  • Stel voor externe toegang viewerBaseUrl van de plugin in, geef baseUrl per aanroep door, of gebruik gateway.bind=custom met gateway.customBindHost.
  • Als gateway.trustedProxies loopback 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 bewust security.allowRemoteViewer in plus viewerBaseUrl van de plugin/een baseUrl van de proxy voor een deelbare viewer-link.
  • Schakel security.allowRemoteViewer alleen in wanneer externe toegang tot de viewer bedoeld is.
Dit is te verwachten bij patchinvoer zonder uitvouwbare context; het is geen viewer-fout.
  • 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 allowRemoteViewer uitgeschakeld, tenzij je implementatie externe viewer-URL’s vereist.
  • Stel voor gevoelige diffs een expliciete korte ttlSeconds in.
  • 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").
Diff-renderingengine mogelijk gemaakt door Diffs.

Gerelateerd