Diffs
diffs adalah tool plugin opsional dengan panduan sistem bawaan singkat dan skill pendamping yang mengubah konten perubahan menjadi artefak diff baca-saja untuk agen.
Tool ini menerima salah satu dari:
- teks
beforedanafter patchterpadu
- URL penampil gateway untuk presentasi canvas
- jalur file hasil render (PNG atau PDF) untuk pengiriman pesan
- kedua output dalam satu pemanggilan
Mulai cepat
- Aktifkan plugin.
- Panggil
diffsdenganmode: "view"untuk alur yang mengutamakan canvas. - Panggil
diffsdenganmode: "file"untuk alur pengiriman file via chat. - Panggil
diffsdenganmode: "both"saat Anda memerlukan kedua artefak.
Aktifkan plugin
Nonaktifkan panduan sistem bawaan
Jika Anda ingin tetap mengaktifkan tooldiffs tetapi menonaktifkan panduan system prompt bawaannya, setel plugins.entries.diffs.hooks.allowPromptInjection ke false:
before_prompt_build milik plugin diffs sambil tetap menjaga plugin, tool, dan skill pendamping tetap tersedia.
Jika Anda ingin menonaktifkan panduan dan tool sekaligus, nonaktifkan plugin saja.
Alur kerja agen yang umum
- Agen memanggil
diffs. - Agen membaca bidang
details. - Agen kemudian:
- membuka
details.viewerUrldengancanvas present - mengirim
details.filePathdenganmessagemenggunakanpathataufilePath - melakukan keduanya
- membuka
Contoh input
Before dan after:Referensi input tool
Semua bidang bersifat opsional kecuali jika disebutkan:before(string): teks asli. Wajib bersamaaftersaatpatchdihilangkan.after(string): teks yang diperbarui. Wajib bersamabeforesaatpatchdihilangkan.patch(string): teks diff terpadu. Saling eksklusif denganbeforedanafter.path(string): nama file tampilan untuk mode before dan after.lang(string): petunjuk penimpaan bahasa untuk mode before dan after. Nilai yang tidak dikenal kembali ke teks biasa.title(string): penimpaan judul penampil.mode("view" | "file" | "both"): mode output. Default ke plugin defaultdefaults.mode. Alias lama:"image"berperilaku seperti"file"dan masih diterima untuk kompatibilitas mundur.theme("light" | "dark"): tema penampil. Default ke plugin defaultdefaults.theme.layout("unified" | "split"): tata letak diff. Default ke plugin defaultdefaults.layout.expandUnchanged(boolean): perluas bagian yang tidak berubah ketika konteks penuh tersedia. Opsi ini hanya per pemanggilan (bukan kunci default plugin).fileFormat("png" | "pdf"): format file hasil render. Default ke plugin defaultdefaults.fileFormat.fileQuality("standard" | "hq" | "print"): preset kualitas untuk render PNG atau PDF.fileScale(number): penimpaan skala perangkat (1-4).fileMaxWidth(number): lebar render maksimum dalam piksel CSS (640-2400).ttlSeconds(number): TTL artefak dalam detik untuk penampil dan output file mandiri. Default 1800, maksimum 21600.baseUrl(string): penimpaan origin URL penampil. Menimpa pluginviewerBaseUrl. Harushttpatauhttps, tanpa query/hash.
format->fileFormatimageFormat->fileFormatimageQuality->fileQualityimageScale->fileScaleimageMaxWidth->fileMaxWidth
beforedanaftermasing-masing maksimum 512 KiB.patchmaksimum 2 MiB.pathmaksimum 2048 byte.langmaksimum 128 byte.titlemaksimum 1024 byte.- Batas kompleksitas patch: maksimum 128 file dan 120000 total baris.
patchdanbeforeatauaftersecara bersamaan akan ditolak.- Batas keamanan file hasil render (berlaku untuk PNG dan PDF):
fileQuality: "standard": maksimum 8 MP (8.000.000 piksel hasil render).fileQuality: "hq": maksimum 14 MP (14.000.000 piksel hasil render).fileQuality: "print": maksimum 24 MP (24.000.000 piksel hasil render).- PDF juga memiliki maksimum 50 halaman.
Kontrak detail output
Tool ini mengembalikan metadata terstruktur di bawahdetails.
Bidang bersama untuk mode yang membuat penampil:
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountIdjika tersedia)
artifactIdexpiresAtfilePathpath(nilai yang sama denganfilePath, untuk kompatibilitas tool message)fileBytesfileFormatfileQualityfileScalefileMaxWidth
format(nilai yang sama denganfileFormat)imagePath(nilai yang sama denganfilePath)imageBytes(nilai yang sama denganfileBytes)imageQuality(nilai yang sama denganfileQuality)imageScale(nilai yang sama denganfileScale)imageMaxWidth(nilai yang sama denganfileMaxWidth)
mode: "view": hanya bidang penampil.mode: "file": hanya bidang file, tanpa artefak penampil.mode: "both": bidang penampil plus bidang file. Jika render file gagal, penampil tetap dikembalikan denganfileErrordan alias kompatibilitasimageError.
Bagian yang tidak berubah dan diciutkan
- Penampil dapat menampilkan baris seperti
N unmodified lines. - Kontrol perluas pada baris tersebut bersifat kondisional dan tidak dijamin untuk setiap jenis input.
- Kontrol perluas muncul saat diff yang dirender memiliki data konteks yang dapat diperluas, yang umum untuk input before dan after.
- Untuk banyak input patch terpadu, isi konteks yang dihilangkan tidak tersedia dalam hunk patch yang diparsing, sehingga baris tersebut dapat muncul tanpa kontrol perluas. Ini adalah perilaku yang diharapkan.
expandUnchangedhanya berlaku saat konteks yang dapat diperluas memang ada.
Default plugin
Setel default tingkat plugin di~/.openclaw/openclaw.json:
fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmode
viewerBaseUrl(string, opsional)- Fallback milik plugin untuk tautan penampil yang dikembalikan ketika pemanggilan tool tidak meneruskan
baseUrl. - Harus
httpatauhttps, tanpa query/hash.
- Fallback milik plugin untuk tautan penampil yang dikembalikan ketika pemanggilan tool tidak meneruskan
Konfigurasi keamanan
security.allowRemoteViewer(boolean, defaultfalse)false: permintaan non-loopback ke rute penampil ditolak.true: penampil jarak jauh diizinkan jika jalur bertoken valid.
Siklus hidup dan penyimpanan artefak
- Artefak disimpan di bawah subfolder temp:
$TMPDIR/openclaw-diffs. - Metadata artefak penampil berisi:
- ID artefak acak (20 karakter heksadesimal)
- token acak (48 karakter heksadesimal)
createdAtdanexpiresAt- jalur
viewer.htmlyang disimpan
- TTL artefak default adalah 30 menit jika tidak ditentukan.
- TTL penampil maksimum yang diterima adalah 6 jam.
- Pembersihan berjalan secara oportunistik setelah pembuatan artefak.
- Artefak yang kedaluwarsa dihapus.
- Pembersihan fallback menghapus folder basi yang lebih lama dari 24 jam saat metadata tidak ada.
URL penampil dan perilaku jaringan
Rute penampil:/plugins/diffs/view/{artifactId}/{token}
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js
baseUrl opsional juga dipertahankan untuk kedua permintaan aset.
Perilaku pembentukan URL:
- Jika
baseUrlpada pemanggilan tool diberikan, nilainya digunakan setelah validasi ketat. - Jika tidak, dan plugin
viewerBaseUrldikonfigurasi, maka itu yang digunakan. - Tanpa salah satu penimpaan tersebut, URL penampil default ke loopback
127.0.0.1. - Jika mode bind gateway adalah
customdangateway.customBindHostdisetel, host tersebut digunakan.
baseUrl:
- Harus
http://atauhttps://. - Query dan hash ditolak.
- Origin ditambah path dasar opsional diperbolehkan.
Model keamanan
Penguatan penampil:- Hanya loopback secara default.
- Jalur penampil bertoken dengan validasi ID dan token yang ketat.
- CSP respons penampil:
default-src 'none'- skrip dan aset hanya dari self
- tidak ada
connect-srckeluar
- Pembatasan miss jarak jauh saat akses jarak jauh diaktifkan:
- 40 kegagalan per 60 detik
- lockout 60 detik (
429 Too Many Requests)
- Perutean permintaan browser screenshot 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:
browser.executablePathdi konfigurasi OpenClaw.- Variabel lingkungan:
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
- Fallback penemuan perintah/path platform.
Diff PNG/PDF rendering requires a Chromium-compatible browser...
Pemecahan masalah
Error validasi input:Provide patch or both before and after text.- Sertakan
beforedanafter, atau berikanpatch.
- Sertakan
Provide either patch or before/after input, not both.- Jangan mencampur mode input.
Invalid baseUrl: ...- Gunakan origin
http(s)dengan path opsional, tanpa query/hash.
- Gunakan origin
{field} exceeds maximum size (...)- Kurangi ukuran payload.
- Penolakan patch besar
- Kurangi jumlah file patch atau total baris.
- URL penampil secara default mengarah ke
127.0.0.1. - Untuk skenario akses jarak jauh, lakukan salah satu dari:
- setel plugin
viewerBaseUrl, atau - teruskan
baseUrlper pemanggilan tool, atau - gunakan
gateway.bind=customdangateway.customBindHost
- setel plugin
- Jika
gateway.trustedProxiesmencakup loopback untuk proxy host yang sama (misalnya Tailscale Serve), permintaan penampil loopback mentah tanpa header forwarded client-IP gagal tertutup secara desain. - Untuk topologi proxy tersebut:
- utamakan
mode: "file"ataumode: "both"saat Anda hanya memerlukan lampiran, atau - aktifkan
security.allowRemoteViewersecara sengaja dan setel pluginviewerBaseUrlatau teruskanbaseUrlproxy/publik saat Anda memerlukan URL penampil yang dapat dibagikan
- utamakan
- Aktifkan
security.allowRemoteViewerhanya jika Anda memang menginginkan akses penampil eksternal.
- Ini dapat terjadi untuk input patch saat patch tidak membawa konteks yang dapat diperluas.
- Ini adalah perilaku yang diharapkan dan tidak menunjukkan kegagalan penampil.
- Artefak kedaluwarsa karena TTL.
- Token atau jalur berubah.
- Pembersihan menghapus data basi.
Panduan operasional
- Utamakan
mode: "view"untuk peninjauan interaktif lokal di canvas. - Utamakan
mode: "file"untuk channel chat keluar yang memerlukan lampiran. - Biarkan
allowRemoteViewertetap nonaktif kecuali deployment Anda memerlukan URL penampil jarak jauh. - Setel
ttlSecondspendek yang eksplisit untuk diff sensitif. - Hindari mengirim rahasia dalam input diff jika tidak diperlukan.
- Jika channel Anda mengompresi gambar secara agresif (misalnya Telegram atau WhatsApp), utamakan output PDF (
fileFormat: "pdf").
- Didukung oleh Diffs.