Tools
Differenze
diffs è uno strumento opzionale di un plugin incluso che trasforma un testo precedente/successivo o una patch unificata in un artefatto diff di sola lettura. Anteposta inoltre brevi indicazioni per l'agente al prompt di sistema e include una skill complementare con istruzioni più complete.
Input: testo before + after, oppure una patch unificata (opzioni mutuamente esclusive).
Output: un URL del visualizzatore del Gateway per la presentazione su canvas, un percorso di file PNG/PDF sottoposto a rendering per la consegna tramite messaggio, oppure entrambi.
Avvio rapido
Installare il plugin
openclaw plugins install diffsAbilitare il plugin
{ plugins: { entries: { diffs: { enabled: true, }, }, },}Scegliere una modalità
view
Flussi che privilegiano il canvas: gli agenti chiamano diffs con mode: "view" e aprono details.viewerUrl con canvas present.
file
Consegna di file in chat: gli agenti chiamano diffs con mode: "file" e inviano details.filePath con message usando path o filePath.
both
Modalità combinata (predefinita): gli agenti chiamano diffs con mode: "both" per ottenere entrambi gli artefatti con una sola chiamata.
Disabilitare le indicazioni di sistema integrate
Per mantenere lo strumento ma rimuovere le indicazioni anteposte al prompt di sistema, impostare plugins.entries.diffs.hooks.allowPromptInjection su false:
{ plugins: { entries: { diffs: { enabled: true, hooks: { allowPromptInjection: false, }, }, }, },}Questa impostazione blocca l'hook before_prompt_build del plugin, mantenendo disponibili lo strumento e la skill. Per disabilitare sia le indicazioni sia lo strumento, disabilitare invece il plugin.
Riferimento per l'input dello strumento
Tutti i campi sono facoltativi, salvo diversa indicazione.
beforestringTesto originale. Obbligatorio con after quando patch viene omesso.
afterstringTesto aggiornato. Obbligatorio con before quando patch viene omesso.
patchstringTesto del diff unificato. Mutuamente esclusivo con before e after.
pathstringNome file visualizzato per la modalità precedente/successivo.
langstringIndicazione per ignorare la lingua rilevata nella modalità precedente/successivo. I valori sconosciuti e le lingue non incluse nel gruppo predefinito del visualizzatore ricorrono al testo normale, a meno che non sia installato il plugin Diff Viewer Language Pack.
titlestringTitolo alternativo del visualizzatore.
mode"view" | "file" | "both"Modalità di output. Il valore predefinito è quello del plugin defaults.mode (both). Alias deprecato: "image" si comporta in modo identico a "file".
theme"light" | "dark"Tema del visualizzatore. Il valore predefinito è quello del plugin defaults.theme.
layout"unified" | "split"Layout del diff. Il valore predefinito è quello del plugin defaults.layout.
expandUnchangedbooleanEspande le sezioni invariate quando è disponibile il contesto completo. Opzione disponibile solo per singola chiamata (non è una chiave predefinita del plugin).
fileFormat"png" | "pdf"Formato del file sottoposto a rendering. Il valore predefinito è quello del plugin defaults.fileFormat.
fileQuality"standard" | "hq" | "print"Preimpostazione di qualità per il rendering PNG/PDF.
fileScalenumberValore alternativo per la scala del dispositivo (1-4).
fileMaxWidthnumberLarghezza massima di rendering in pixel CSS (640-2400).
ttlSecondsnumberdefault: 1800TTL dell'artefatto in secondi per il visualizzatore e gli output di file autonomi. Valore massimo: 21600.
baseUrlstringOrigine alternativa dell'URL del visualizzatore. Sostituisce il valore viewerBaseUrl del plugin. Deve essere http o https, senza query/hash.
Convalida e limiti
before/after: massimo 512 KiB ciascuno.patch: massimo 2 MiB.path: massimo 2048 byte.lang: massimo 128 byte.title: massimo 1024 byte.- Limite di complessità della patch: massimo 128 file e 120000 righe totali.
patchinsieme abefore/afterviene rifiutato.- Limiti di sicurezza dei file sottoposti a rendering (PNG e PDF):
fileQuality: "standard": massimo 8 MP (8,000,000 pixel sottoposti a rendering).fileQuality: "hq": massimo 14 MP.fileQuality: "print": massimo 24 MP.- Anche i PDF sono limitati a 50 pagine.
Evidenziazione della sintassi
Linguaggi integrati:
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 e toml.
Gli alias comuni (js, ts, bash, md, yml, c++, dockerfile, rb, kt, ps1 e così via) vengono normalizzati in questi linguaggi.
Installare il plugin Diff Viewer Language Pack per ulteriori linguaggi (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 e altri):
openclaw plugins install clawhub:@openclaw/diffs-language-packSenza il pacchetto, i linguaggi non supportati vengono comunque visualizzati come testo normale leggibile. Consultare il plugin Diffs Language Pack e i linguaggi Shiki per il catalogo upstream.
Contratto dei dettagli di output
Tutti i risultati riusciti includono changed: un input precedente/successivo identico restituisce false senza creare un artefatto; i risultati sottoposti a rendering restituiscono true.
Campi del visualizzatore (modalità view e both)
changedartifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountIdquando disponibili)
Campi del file (modalità file e both)
changedartifactIdexpiresAtfilePathpath(stesso valore difilePath, per la compatibilità con lo strumento per i messaggi)fileBytesfileFormatfileQualityfileScalefileMaxWidth
| Modalità | Restituisce |
|---|---|
"view" |
Solo i campi del visualizzatore. |
"file" |
Solo i campi del file, senza alcun artefatto del visualizzatore. |
"both" |
I campi del visualizzatore e quelli del file. Se il rendering del file non riesce, il visualizzatore viene comunque restituito con fileError. |
Sezioni invariate compresse
Il visualizzatore mostra righe come N unmodified lines. I controlli di espansione vengono visualizzati solo quando il diff sottoposto a rendering dispone di dati contestuali espandibili (in genere per l'input precedente/successivo). Molte patch unificate omettono i corpi del contesto nei rispettivi hunk, quindi la riga può essere visualizzata senza un controllo di espansione: è il comportamento previsto, non un bug. expandUnchanged si applica solo quando esiste un contesto espandibile.
Navigazione tra più file
Le patch che interessano più di un file iniziano con una scheda riepilogativa dei file modificati: conteggi totali di +N / -N, conteggi per file, badge per file aggiunti/eliminati/rinominati e link di ancoraggio per passare direttamente a ciascun file. I file PNG/PDF sottoposti a rendering mantengono i conteggi nelle intestazioni dei singoli file, ma omettono i selettori interattivi della visualizzazione, poiché in un file statico non sono operativi.
Valori predefiniti del plugin
Impostare i valori predefiniti per l'intero plugin in ~/.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, }, }, }, }, },}Chiavi defaults supportate: fontFamily, fontSize, lineSpacing, layout, showLineNumbers, diffIndicators, wordWrap, background, theme, fileFormat, fileQuality, fileScale, fileMaxWidth, mode, ttlSeconds. I parametri espliciti della chiamata allo strumento hanno la precedenza su questi valori.
Configurazione persistente dell'URL del visualizzatore
viewerBaseUrlstringValore di ripiego gestito dal plugin per i link del visualizzatore restituiti quando una chiamata allo strumento non passa baseUrl. Deve essere http o https, senza query/hash.
{ plugins: { entries: { diffs: { enabled: true, config: { viewerBaseUrl: "https://gateway.example.com/openclaw", }, }, }, },}Configurazione di sicurezza
security.allowRemoteViewerbooleandefault: falsefalse: le richieste non loopback alle route del visualizzatore vengono negate. true: i visualizzatori remoti sono consentiti se il percorso con token è valido.
{ plugins: { entries: { diffs: { enabled: true, config: { security: { allowRemoteViewer: false, }, }, }, }, },}Ciclo di vita e archiviazione degli artefatti
- Gli artefatti si trovano in
$TMPDIR/openclaw-diffs. - I metadati del visualizzatore memorizzano un ID artefatto casuale di 20 caratteri esadecimali, un token casuale di 48 caratteri esadecimali,
createdAt/expiresAte il percorsoviewer.htmlmemorizzato. - TTL predefinito degli artefatti: 30 minuti. TTL massimo accettato: 6 ore.
- La pulizia viene eseguita in modo opportunistico dopo ogni chiamata di creazione di un artefatto; gli artefatti scaduti vengono eliminati.
- La scansione di ripiego rimuove le cartelle obsolete più vecchie di 24 ore quando mancano i metadati.
Comportamento dell'URL del visualizzatore e della rete
Route del visualizzatore: /plugins/diffs/view/{artifactId}/{token}
Risorse del visualizzatore:
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js/plugins/diffs-language-pack/assets/viewer.js(solo quando il diff usa la lingua di un language pack)
Il documento del visualizzatore risolve queste risorse rispetto all'URL del visualizzatore, quindi anche un prefisso di percorso facoltativo baseUrl viene applicato alle richieste delle risorse.
Ordine di risoluzione dell'URL: baseUrl della chiamata allo strumento (dopo una convalida rigorosa) -> viewerBaseUrl del Plugin -> valore predefinito di loopback 127.0.0.1. Se la modalità di associazione del Gateway è custom ed è impostato gateway.customBindHost, viene usato tale host anziché il loopback.
Regole di baseUrl: deve essere http:// o https://; query e hash vengono rifiutati; sono consentiti un'origine e un percorso base facoltativo.
Modello di sicurezza
Protezione del visualizzatore
- Per impostazione predefinita, solo loopback.
- Percorsi del visualizzatore con token e convalida rigorosa dei formati di ID e token.
- CSP della risposta del visualizzatore:
default-src 'none'; script e risorse solo dall'origine stessa; nessuna richiestaconnect-srcin uscita. - Limitazione dei tentativi remoti non riusciti quando è abilitato l'accesso remoto: 40 errori in 60 secondi attivano un blocco di 60 secondi (
429 Too Many Requests).
Protezione del rendering dei file
- L'instradamento delle richieste del browser per gli screenshot nega tutto per impostazione predefinita.
- Sono consentite solo le risorse locali del visualizzatore provenienti da
http://127.0.0.1/plugins/diffs/assets/*. - Le richieste di rete esterne vengono bloccate.
Requisiti del browser per la modalità file
mode: "file" e mode: "both" richiedono un browser compatibile con Chromium.
Ordine di risoluzione:
Configurazione
browser.executablePath nella configurazione di OpenClaw.
Variabili d'ambiente
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
Fallback della piattaforma
Percorsi di installazione comuni e ricerche PATH per Chrome, Chromium, Edge e Brave.
Testo di errore comune: Diff PNG/PDF rendering requires a Chromium-compatible browser.... Per risolvere, installare Chrome, Chromium, Edge o Brave oppure impostare una delle opzioni del percorso dell'eseguibile indicate sopra.
Risoluzione dei problemi
Errori di convalida dell'input
Provide patch or both before and after text.-- includere siabeforesiaafteroppure fornirepatch.Provide either patch or before/after input, not both.-- non combinare modalità di input diverse.Invalid baseUrl: ...-- usare un'originehttp(s)con un percorso facoltativo, senza query/hash.{field} exceeds maximum size (...)-- ridurre le dimensioni del payload.- Rifiuto di una patch di grandi dimensioni -- ridurre il numero di file della patch o il totale delle righe.
Accessibilità del visualizzatore
- Per impostazione predefinita, l'URL del visualizzatore viene risolto in
127.0.0.1. - Per l'accesso remoto, impostare
viewerBaseUrldel Plugin, passarebaseUrla ogni chiamata oppure usaregateway.bind=customcongateway.customBindHost. - Se
gateway.trustedProxiesinclude il loopback per un proxy sullo stesso host (ad esempio Tailscale Serve), le richieste dirette al visualizzatore tramite loopback prive di intestazioni inoltrate con l'IP del client vengono rifiutate per impostazione predefinita, come previsto. - Per questa topologia proxy, è preferibile usare
mode: "file"/"both"per un allegato oppure abilitare intenzionalmentesecurity.allowRemoteViewerinsieme aviewerBaseUrldel Plugin/unbaseUrldel proxy per ottenere un link condivisibile al visualizzatore. - Abilitare
security.allowRemoteViewersolo quando si intende consentire l'accesso esterno al visualizzatore.
La riga delle righe non modificate non presenta alcun pulsante di espansione
Comportamento previsto per un input patch privo di contesto espandibile; non si tratta di un errore del visualizzatore.
Artefatto non trovato
- L'artefatto è scaduto a causa del TTL.
- Il token o il percorso è cambiato.
- La pulizia ha rimosso i dati obsoleti.
Indicazioni operative
- Preferire
mode: "view"per le revisioni interattive locali nel canvas. - Preferire
mode: "file"per i canali di chat in uscita che richiedono un allegato. - Mantenere
allowRemoteViewerdisabilitato, a meno che la distribuzione non richieda URL remoti del visualizzatore. - Impostare esplicitamente un
ttlSecondsbreve per i diff sensibili. - Evitare di inviare segreti nell'input del diff quando non è necessario.
- Se il canale comprime le immagini in modo aggressivo (ad esempio Telegram o WhatsApp), preferire l'output PDF (
fileFormat: "pdf").