diffs adalah alat plugin bundel opsional yang mengubah teks sebelum/sesudah atau patch terpadu menjadi artefak diff hanya-baca. Alat ini juga menambahkan panduan singkat untuk agen di awal prompt sistem dan menyertakan skill pendamping untuk petunjuk yang lebih lengkap.
Input: teks before + after, atau patch terpadu (saling eksklusif).
Output: URL penampil Gateway untuk penyajian kanvas, jalur file PNG/PDF yang dirender untuk pengiriman pesan, atau keduanya.
Mulai cepat
1
Instal plugin
2
Aktifkan plugin
3
Pilih mode
- view
- file
- both
Alur yang mengutamakan kanvas: agen memanggil
diffs dengan mode: "view" dan membuka details.viewerUrl dengan canvas present.Nonaktifkan panduan sistem bawaan
Untuk mempertahankan alat tetapi menghapus panduan yang ditambahkan di awal prompt sistem, aturplugins.entries.diffs.hooks.allowPromptInjection ke false:
before_prompt_build milik plugin sambil tetap menyediakan alat dan skill. Untuk menonaktifkan panduan sekaligus alat, nonaktifkan pluginnya.
Referensi input alat
Semua bidang bersifat opsional kecuali dinyatakan lain.string
Teks asli. Wajib bersama
after ketika patch tidak diberikan.string
Teks yang diperbarui. Wajib bersama
before ketika patch tidak diberikan.string
Teks diff terpadu. Saling eksklusif dengan
before dan after.string
Nama file tampilan untuk mode sebelum/sesudah.
string
Petunjuk penggantian bahasa untuk mode sebelum/sesudah. Nilai yang tidak dikenal dan bahasa di luar kumpulan default penampil akan kembali ke teks biasa kecuali
plugin Diff Viewer Language Pack telah diinstal.
string
Penggantian judul penampil.
"view" | "file" | "both"
Mode output. Secara default menggunakan
defaults.mode default plugin (both). Alias yang tidak digunakan lagi: "image" berperilaku sama persis dengan "file"."light" | "dark"
Tema penampil. Secara default menggunakan
defaults.theme default plugin."unified" | "split"
Tata letak diff. Secara default menggunakan
defaults.layout default plugin.boolean
Perluas bagian yang tidak berubah ketika konteks lengkap tersedia. Hanya opsi per panggilan (bukan kunci default plugin).
"png" | "pdf"
Format file yang dirender. Secara default menggunakan
defaults.fileFormat default plugin."standard" | "hq" | "print"
Prasetel kualitas untuk rendering PNG/PDF.
number
Penggantian skala perangkat (
1-4).number
Lebar rendering maksimum dalam piksel CSS (
640-2400).number
default:"1800"
TTL artefak dalam detik untuk output penampil dan file mandiri. Maksimum
21600.string
Penggantian asal URL penampil. Menggantikan
viewerBaseUrl plugin. Harus berupa http atau https, tanpa kueri/hash.Validasi dan batas
Validasi dan batas
before/after: masing-masing maksimum 512 KiB.patch: maksimum 2 MiB.path: maksimum 2048 byte.lang: maksimum 128 byte.title: maksimum 1024 byte.- Batas kompleksitas patch: maksimum 128 file dan total 120000 baris.
patchbersamabefore/afterditolak.- Batas keamanan file yang dirender (PNG dan PDF):
fileQuality: "standard": maksimum 8 MP (8,000,000 piksel yang dirender).fileQuality: "hq": maksimum 14 MP.fileQuality: "print": maksimum 24 MP.- PDF juga dibatasi hingga 50 halaman.
Penyorotan sintaks
Bahasa bawaan: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, dan toml.
Alias umum (js, ts, bash, md, yml, c++, dockerfile, rb, kt, ps1, dan sebagainya) dinormalisasi ke bahasa tersebut.
Instal plugin Diff Viewer Language Pack untuk bahasa lainnya (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, dan lainnya):
Kontrak detail output
Semua hasil yang berhasil menyertakanchanged: input sebelum/sesudah yang identik mengembalikan false tanpa membuat artefak; hasil yang dirender mengembalikan true.
Bidang penampil (mode view dan both)
Bidang penampil (mode view dan both)
changedartifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountIdjika tersedia)
Bidang file (mode file dan both)
Bidang file (mode file dan both)
changedartifactIdexpiresAtfilePathpath(nilai yang sama denganfilePath, untuk kompatibilitas alat pesan)fileBytesfileFormatfileQualityfileScalefileMaxWidth
Bagian tidak berubah yang diciutkan
Penampil menampilkan baris sepertiN unmodified lines. Kontrol perluasan hanya muncul ketika diff yang dirender memiliki data konteks yang dapat diperluas (umumnya untuk input sebelum/sesudah). Banyak patch terpadu tidak menyertakan isi konteks dalam hunk-nya, sehingga baris dapat muncul tanpa kontrol perluasan — hal ini sesuai harapan, bukan bug. expandUnchanged hanya berlaku ketika tersedia konteks yang dapat diperluas.
Navigasi multi-file
Patch yang menyentuh lebih dari satu file dimulai dengan kartu ringkasan file yang berubah: jumlah total+N / -N, jumlah per file, lencana ditambahkan/dihapus/diubah namanya, dan tautan jangkar yang melompat ke setiap file. File PNG/PDF yang dirender mempertahankan jumlah pada header per file, tetapi menghapus tombol pengalih tampilan interaktif karena kontrol tersebut tidak berfungsi dalam file statis.
Default plugin
Tetapkan default untuk seluruh plugin di~/.openclaw/openclaw.json:
defaults yang didukung: fontFamily, fontSize, lineSpacing, layout, showLineNumbers, diffIndicators, wordWrap, background, theme, fileFormat, fileQuality, fileScale, fileMaxWidth, mode, ttlSeconds. Parameter panggilan alat yang eksplisit menggantikan nilai-nilai ini.
Konfigurasi URL penampil persisten
string
Fallback milik plugin untuk tautan penampil yang dikembalikan ketika panggilan alat tidak meneruskan
baseUrl. Harus berupa http atau https, tanpa kueri/hash.Konfigurasi keamanan
boolean
default:"false"
false: permintaan non-loopback ke rute penampil ditolak. true: penampil jarak jauh diizinkan jika jalur bertoken valid.Siklus hidup dan penyimpanan artefak
- HTML penampil dan metadata berada di database
state/openclaw.sqlitebersama dalam namespace blob plugin Diffs. HTML dikompresi dengan gzip; SQLite hanya menyimpan hash SHA-256 dari token URL acak, bukan token itu sendiri. - File PNG/PDF yang dirender tetap menjadi materialisasi sementara di bawah
$TMPDIR/openclaw-diffskarena pengiriman melalui kanal memerlukan jalur file. SQLite menyimpan metadata kedaluwarsanya; tidak ada file pendamping JSON yang ditulis. - TTL artefak default: 30 menit. TTL maksimum yang diterima: 6 jam.
- Pembersihan dijalankan secara oportunistis setelah setiap panggilan pembuatan artefak. Baris SQLite yang kedaluwarsa dihapus terlebih dahulu, diikuti oleh direktori PNG/PDF terkait.
- Penyapuan cadangan menghapus folder sementara tanpa baris yang berusia lebih dari 24 jam. Cache lama
meta.json,file-meta.json, danviewer.htmltidak diimpor atau dibaca.
URL penampil dan perilaku jaringan
Rute penampil:/plugins/diffs/view/{artifactId}/{token}
Aset penampil:
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js/plugins/diffs-language-pack/assets/viewer.js(hanya ketika diff menggunakan bahasa paket bahasa)
baseUrl juga diterapkan pada permintaan aset.
Urutan resolusi URL: baseUrl panggilan alat (setelah validasi ketat) -> viewerBaseUrl plugin -> default loopback 127.0.0.1. Jika mode bind gateway adalah custom dan gateway.customBindHost ditetapkan, host tersebut digunakan sebagai pengganti loopback.
Aturan baseUrl: harus berupa http:// atau https://; kueri dan hash ditolak; origin dengan jalur dasar opsional diizinkan.
Model keamanan
Penguatan penampil
Penguatan penampil
- Secara default hanya untuk loopback.
- Jalur penampil bertoken dengan validasi pola ID dan token yang ketat.
- CSP respons penampil:
default-src 'none'; skrip/aset hanya dari sumber sendiri; tidak adaconnect-srckeluar. - Pembatasan kegagalan akses jarak jauh saat akses jarak jauh diaktifkan: 40 kegagalan per 60 detik memicu penguncian selama 60 detik (
429 Too Many Requests).
Penguatan perenderan file
Penguatan perenderan file
- Perutean permintaan browser tangkapan layar secara default menolak semua.
- Hanya aset penampil lokal dari
http://127.0.0.1/plugins/diffs/assets/*yang diizinkan. - Permintaan jaringan eksternal diblokir.
Persyaratan browser untuk mode file
mode: "file" dan mode: "both" memerlukan browser yang kompatibel dengan Chromium.
Urutan resolusi:
1
Konfigurasi
browser.executablePath dalam konfigurasi OpenClaw.2
Variabel lingkungan
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
3
Fallback platform
Jalur instalasi umum dan pencarian
PATH untuk Chrome, Chromium, Edge, dan Brave.Diff PNG/PDF rendering requires a Chromium-compatible browser.... Perbaiki dengan menginstal Chrome, Chromium, Edge, atau Brave, atau menetapkan salah satu opsi jalur executable di atas.
Pemecahan masalah
Kesalahan validasi input
Kesalahan validasi input
Provide patch or both before and after text.— sertakanbeforedanafter, atau berikanpatch.Provide either patch or before/after input, not both.— jangan mencampur mode input.Invalid baseUrl: ...— gunakan originhttp(s)dengan jalur opsional, tanpa kueri/hash.{field} exceeds maximum size (...)— kurangi ukuran payload.- Penolakan patch besar — kurangi jumlah file patch atau jumlah total baris.
Aksesibilitas penampil
Aksesibilitas penampil
- Secara default, URL penampil me-resolve ke
127.0.0.1. - Untuk akses jarak jauh, tetapkan
viewerBaseUrlplugin, teruskanbaseUrlpada setiap panggilan, atau gunakangateway.bind=customdengangateway.customBindHost. - Jika
gateway.trustedProxiesmencakup loopback untuk proxy pada host yang sama (misalnya Tailscale Serve), permintaan mentah penampil loopback tanpa header IP klien yang diteruskan akan ditolak secara default sesuai rancangan. - Untuk topologi proxy tersebut, pilih
mode: "file"/"both"untuk lampiran, atau aktifkansecurity.allowRemoteViewersecara sengaja besertaviewerBaseUrlplugin/baseUrlproxy untuk tautan penampil yang dapat dibagikan. - Aktifkan
security.allowRemoteViewerhanya jika akses penampil eksternal memang dimaksudkan.
Baris yang tidak dimodifikasi tidak memiliki tombol perluas
Baris yang tidak dimodifikasi tidak memiliki tombol perluas
Ini memang diharapkan untuk input patch yang tidak memiliki konteks yang dapat diperluas; bukan kegagalan penampil.
Artefak tidak ditemukan
Artefak tidak ditemukan
- Artefak kedaluwarsa karena TTL.
- Token atau jalur berubah.
- Pembersihan menghapus data usang.
Panduan operasional
- Pilih
mode: "view"untuk review interaktif lokal di kanvas. - Pilih
mode: "file"untuk kanal obrolan keluar yang memerlukan lampiran. - Biarkan
allowRemoteViewerdinonaktifkan kecuali deployment Anda memerlukan URL penampil jarak jauh. - Tetapkan
ttlSecondssingkat secara eksplisit untuk diff sensitif. - Hindari mengirim rahasia dalam input diff jika tidak diperlukan.
- Jika kanal Anda mengompresi gambar secara agresif (misalnya Telegram atau WhatsApp), pilih output PDF (
fileFormat: "pdf").
Mesin perenderan diff didukung oleh Diffs.