Diff’ler
diffs, kısa yerleşik sistem yönlendirmesine ve değişiklik içeriğini ajanlar için salt okunur bir diff yapıtına dönüştüren yardımcı bir Skill’e sahip isteğe bağlı bir eklenti aracıdır.
Şunlardan birini kabul eder:
beforeveaftermetni- birleşik bir
patch
- canvas sunumu için bir gateway görüntüleyici URL’si
- mesaj teslimi için oluşturulmuş bir dosya yolu (PNG veya PDF)
- tek çağrıda her iki çıktı
Hızlı başlangıç
- Eklentiyi etkinleştirin.
- Önce canvas akışları için
mode: "view"ilediffsçağırın. - Sohbet dosyası teslim akışları için
mode: "file"ilediffsçağırın. - Her iki yapıtı da gerektiğinde
mode: "both"ilediffsçağırın.
Eklentiyi etkinleştirme
Yerleşik sistem yönlendirmesini devre dışı bırakma
diffs aracını etkin tutup yerleşik sistem istemi yönlendirmesini devre dışı bırakmak istiyorsanız plugins.entries.diffs.hooks.allowPromptInjection değerini false olarak ayarlayın:
before_prompt_build kancasını engeller.
Hem yönlendirmeyi hem de aracı devre dışı bırakmak istiyorsanız bunun yerine eklentiyi devre dışı bırakın.
Tipik ajan iş akışı
- Ajan
diffsçağırır. - Ajan
detailsalanlarını okur. - Ajan şunlardan birini yapar:
canvas presentiledetails.viewerUrlaçarpathveyafilePathkullanarakmessageiledetails.filePathgönderir- ikisini de yapar
Girdi örnekleri
Önce ve sonra:Araç girdi başvurusu
Aksi belirtilmedikçe tüm alanlar isteğe bağlıdır:before(string): özgün metin.patchverilmemişseafterile birlikte gereklidir.after(string): güncellenmiş metin.patchverilmemişsebeforeile birlikte gereklidir.patch(string): birleşik diff metni.beforeveafterile birlikte kullanılamaz.path(string): önce/sonra modu için görüntüleme dosya adı.lang(string): önce/sonra modu için dil geçersiz kılma ipucu. Bilinmeyen değerler düz metne geri döner.title(string): görüntüleyici başlığını geçersiz kılma.mode("view" | "file" | "both"): çıktı modu. Varsayılan olarak eklenti varsayılanıdefaults.modekullanılır. Kullanımdan kaldırılmış takma ad:"image","file"gibi davranır ve geriye dönük uyumluluk için hâlâ kabul edilir.theme("light" | "dark"): görüntüleyici teması. Varsayılan olarak eklenti varsayılanıdefaults.themekullanılır.layout("unified" | "split"): diff düzeni. Varsayılan olarak eklenti varsayılanıdefaults.layoutkullanılır.expandUnchanged(boolean): tam bağlam mevcut olduğunda değişmemiş bölümleri genişletir. Yalnızca çağrı başına seçenektir (eklenti varsayılan anahtarı değildir).fileFormat("png" | "pdf"): oluşturulan dosya biçimi. Varsayılan olarak eklenti varsayılanıdefaults.fileFormatkullanılır.fileQuality("standard" | "hq" | "print"): PNG veya PDF oluşturma için kalite ön ayarı.fileScale(number): cihaz ölçeği geçersiz kılma (1-4).fileMaxWidth(number): CSS pikseli cinsinden azami oluşturma genişliği (640-2400).ttlSeconds(number): görüntüleyici ve bağımsız dosya çıktıları için yapıt TTL’si saniye cinsinden. Varsayılan 1800, azami 21600.baseUrl(string): görüntüleyici URL kaynağını geçersiz kılma. EklentiviewerBaseUrldeğerini geçersiz kılar.httpveyahttpsolmalıdır; sorgu/hash içeremez.
format->fileFormatimageFormat->fileFormatimageQuality->fileQualityimageScale->fileScaleimageMaxWidth->fileMaxWidth
beforeveafteriçin azami boyut ayrı ayrı 512 KiB.patchiçin azami boyut 2 MiB.pathiçin azami boyut 2048 bayt.langiçin azami boyut 128 bayt.titleiçin azami boyut 1024 bayt.- Patch karmaşıklık sınırı: azami 128 dosya ve toplam 120000 satır.
patchile birliktebeforeveyaafterverilmesi reddedilir.- Oluşturulan dosya güvenlik sınırları (PNG ve PDF için geçerlidir):
fileQuality: "standard": azami 8 MP (8.000.000 oluşturulmuş piksel).fileQuality: "hq": azami 14 MP (14.000.000 oluşturulmuş piksel).fileQuality: "print": azami 24 MP (24.000.000 oluşturulmuş piksel).- PDF için ayrıca azami 50 sayfa sınırı vardır.
Çıktı ayrıntıları sözleşmesi
Araç, yapılandırılmış meta verileridetails altında döndürür.
Görüntüleyici oluşturan modlar için ortak alanlar:
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(mevcutsaagentId,sessionId,messageChannel,agentAccountId)
artifactIdexpiresAtfilePathpath(filePathile aynı değer; message aracı uyumluluğu için)fileBytesfileFormatfileQualityfileScalefileMaxWidth
format(fileFormatile aynı değer)imagePath(filePathile aynı değer)imageBytes(fileBytesile aynı değer)imageQuality(fileQualityile aynı değer)imageScale(fileScaleile aynı değer)imageMaxWidth(fileMaxWidthile aynı değer)
mode: "view": yalnızca görüntüleyici alanları.mode: "file": yalnızca dosya alanları, görüntüleyici yapıtı yok.mode: "both": görüntüleyici alanları + dosya alanları. Dosya oluşturma başarısız olursa görüntüleyici yinefileErrorve uyumluluk takma adıimageErrorile döner.
Daraltılmış değişmemiş bölümler
- Görüntüleyici
N unmodified linesgibi satırlar gösterebilir. - Bu satırlardaki genişletme denetimleri koşulludur ve her girdi türü için garanti edilmez.
- Genişletme denetimleri, oluşturulan diff genişletilebilir bağlam verisi içerdiğinde görünür; bu durum genellikle before/after girdisi için tipiktir.
- Birçok birleşik patch girdisinde, atlanan bağlam gövdeleri çözümlenen patch hunk’larında bulunmaz; bu yüzden satır genişletme denetimleri olmadan görünebilir. Bu beklenen davranıştır.
expandUnchangedyalnızca genişletilebilir bağlam mevcut olduğunda uygulanır.
Eklenti varsayılanları
Eklenti genelindeki varsayılanları~/.openclaw/openclaw.json içinde ayarlayın:
fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmode
viewerBaseUrl(string, isteğe bağlı)- Araç çağrısı
baseUrlgeçmediğinde döndürülen görüntüleyici bağlantıları için eklentiye ait geri dönüş değeri. httpveyahttpsolmalıdır; sorgu/hash içeremez.
- Araç çağrısı
Güvenlik yapılandırması
security.allowRemoteViewer(boolean, varsayılanfalse)false: görüntüleyici yollarına yapılan loopback dışı istekler reddedilir.true: belirteçli yol geçerliyse uzak görüntüleyicilere izin verilir.
Yapıt yaşam döngüsü ve depolama
- Yapıtlar temp alt klasörü altında saklanır:
$TMPDIR/openclaw-diffs. - Görüntüleyici yapıt meta verileri şunları içerir:
- rastgele yapıt kimliği (20 hex karakter)
- rastgele token (48 hex karakter)
createdAtveexpiresAt- saklanan
viewer.htmlyolu
- Belirtilmediğinde varsayılan yapıt TTL’si 30 dakikadır.
- Kabul edilen azami görüntüleyici TTL’si 6 saattir.
- Temizleme, yapıt oluşturulduktan sonra fırsatçı biçimde çalışır.
- Süresi dolmuş yapıtlar silinir.
- Meta veriler eksik olduğunda geri dönüş temizliği 24 saatten eski bayat klasörleri kaldırır.
Görüntüleyici URL’si ve ağ davranışı
Görüntüleyici yolu:/plugins/diffs/view/{artifactId}/{token}
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js
baseUrl yol öneki bu varlık isteklerinde de korunur.
URL oluşturma davranışı:
- Araç çağrısı
baseUrlsağlanırsa, katı doğrulamadan sonra kullanılır. - Aksi hâlde eklenti
viewerBaseUrlyapılandırılmışsa kullanılır. - Bu geçersiz kılmalardan hiçbiri yoksa görüntüleyici URL’si varsayılan olarak loopback
127.0.0.1kullanır. - Gateway bind modu
customise vegateway.customBindHostayarlıysa o host kullanılır.
baseUrl kuralları:
http://veyahttps://olmalıdır.- Sorgu ve hash reddedilir.
- Kaynak artı isteğe bağlı temel yola izin verilir.
Güvenlik modeli
Görüntüleyici güçlendirmesi:- Varsayılan olarak yalnızca loopback.
- Katı kimlik ve token doğrulaması ile belirteçli görüntüleyici yolları.
- Görüntüleyici yanıt CSP’si:
default-src 'none'- script’ler ve varlıklar yalnızca self’den
- dışa dönük
connect-srcyok
- Uzak erişim etkinleştirildiğinde uzak hata sınırlaması:
- 60 saniyede 40 başarısız istek
- 60 saniyelik kilitleme (
429 Too Many Requests)
- Ekran görüntüsü tarayıcı istek yönlendirmesi varsayılan olarak reddeder.
- Yalnızca
http://127.0.0.1/plugins/diffs/assets/*altındaki yerel görüntüleyici varlıklarına izin verilir. - Harici ağ istekleri engellenir.
Dosya modu için tarayıcı gereksinimleri
mode: "file" ve mode: "both" için Chromium uyumlu bir tarayıcı gerekir.
Çözümleme sırası:
- OpenClaw yapılandırmasında
browser.executablePath. - Ortam değişkenleri:
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
- Platform komutu/yolu keşfi geri dönüşü.
Diff PNG/PDF rendering requires a Chromium-compatible browser...
Sorun giderme
Girdi doğrulama hataları:Provide patch or both before and after text.- Hem
beforehemafterekleyin veyapatchsağlayın.
- Hem
Provide either patch or before/after input, not both.- Girdi modlarını karıştırmayın.
Invalid baseUrl: ...- İsteğe bağlı yola sahip
http(s)kaynak kullanın; sorgu/hash yok.
- İsteğe bağlı yola sahip
{field} exceeds maximum size (...)- Yük boyutunu azaltın.
- Büyük patch reddi
- Patch dosya sayısını veya toplam satır sayısını azaltın.
- Görüntüleyici URL’si varsayılan olarak
127.0.0.1çözülür. - Uzak erişim senaryoları için şunlardan birini yapın:
- eklenti
viewerBaseUrlayarlayın veya - araç çağrısı başına
baseUrlgeçin veya gateway.bind=customvegateway.customBindHostkullanın
- eklenti
gateway.trustedProxies, aynı host üzerindeki bir proxy için loopback içeriyorsa (örneğin Tailscale Serve), yönlendirilmiş istemci IP başlıkları olmayan ham loopback görüntüleyici istekleri tasarım gereği kapalı biçimde başarısız olur.- Bu proxy topolojisi için:
- yalnızca bir ek gerekiyorsa
mode: "file"veyamode: "both"tercih edin ya da - paylaşılabilir bir görüntüleyici URL’sine ihtiyacınız varsa bilerek
security.allowRemoteVieweretkinleştirin ve eklentiviewerBaseUrlayarlayın veya bir proxy/publicbaseUrlgeçin
- yalnızca bir ek gerekiyorsa
security.allowRemoteVieweryalnızca harici görüntüleyici erişimi amaçladığınızda etkinleştirin.
- Bu, patch genişletilebilir bağlam taşımadığında patch girdisi için gerçekleşebilir.
- Bu beklenen bir durumdur ve görüntüleyici arızası anlamına gelmez.
- Yapıt TTL nedeniyle süresi doldu.
- Token veya yol değişti.
- Temizleme bayat verileri kaldırdı.
Operasyonel yönlendirme
- Canvas içindeki yerel etkileşimli incelemeler için
mode: "view"tercih edin. - Ek gerektiren dış sohbet kanalları için
mode: "file"tercih edin. - Dağıtımınız uzak görüntüleyici URL’leri gerektirmedikçe
allowRemoteViewerdevre dışı kalsın. - Hassas diff’ler için açık kısa
ttlSecondsayarlayın. - Gerekmediğinde diff girdisinde sırları göndermekten kaçının.
- Kanalınız görselleri agresif biçimde sıkıştırıyorsa (örneğin Telegram veya WhatsApp), PDF çıktıyı tercih edin (
fileFormat: "pdf").
- Diffs tarafından desteklenir.