Tools
تفاوتها
diffs یک ابزار اختیاری Plugin با راهنمای سیستم داخلی کوتاه و یک Skill همراه است که محتوای تغییرات را به یک مصنوع diff فقطخواندنی برای عاملها تبدیل میکند.
یا اینها را میپذیرد:
- متن
beforeوafter - یک
patchیکپارچه
میتواند اینها را برگرداند:
- یک URL نمایشگر Gateway برای ارائه روی canvas
- یک مسیر فایل رندرشده (PNG یا PDF) برای تحویل پیام
- هر دو خروجی در یک فراخوانی
وقتی فعال باشد، Plugin راهنمای کاربردی مختصر را به فضای system-prompt اضافه میکند و همچنین برای مواردی که عامل به دستورالعملهای کاملتر نیاز دارد، یک Skill تفصیلی ارائه میدهد.
شروع سریع
Install the plugin
openclaw plugins install diffsEnable the plugin
{ plugins: { entries: { diffs: { enabled: true, }, }, },}Pick a mode
view
جریانهای canvas-محور: عاملها diffs را با mode: "view" فراخوانی میکنند و details.viewerUrl را با canvas present باز میکنند.
file
تحویل فایل در چت: عاملها diffs را با mode: "file" فراخوانی میکنند و details.filePath را با message با استفاده از path یا filePath ارسال میکنند.
both
ترکیبی: عاملها diffs را با mode: "both" فراخوانی میکنند تا هر دو مصنوع را در یک فراخوانی دریافت کنند.
غیرفعالکردن راهنمای سیستم داخلی
اگر میخواهید ابزار diffs فعال بماند اما راهنمای system-prompt داخلی آن را غیرفعال کنید، plugins.entries.diffs.hooks.allowPromptInjection را روی false تنظیم کنید:
{ plugins: { entries: { diffs: { enabled: true, hooks: { allowPromptInjection: false, }, }, }, },}این کار hookِ before_prompt_build مربوط به Plugin diffs را مسدود میکند، در حالی که خود Plugin، ابزار و Skill همراه همچنان در دسترس میمانند.
اگر میخواهید هم راهنما و هم ابزار را غیرفعال کنید، بهجای آن Plugin را غیرفعال کنید.
گردشکار معمول عامل
Call diffs
عامل ابزار diffs را با ورودی فراخوانی میکند.
Read details
عامل فیلدهای details را از پاسخ میخواند.
Present
عامل یا details.viewerUrl را با canvas present باز میکند، یا details.filePath را با message با استفاده از path یا filePath ارسال میکند، یا هر دو کار را انجام میدهد.
نمونههای ورودی
Before and after
{ "before": "# Hello\n\nOne", "after": "# Hello\n\nTwo", "path": "docs/example.md", "mode": "view"}Patch
{ "patch": "diff --git a/src/example.ts b/src/example.ts\n--- a/src/example.ts\n+++ b/src/example.ts\n@@ -1 +1 @@\n-const x = 1;\n+const x = 2;\n", "mode": "both"}مرجع ورودی ابزار
همه فیلدها اختیاریاند، مگر خلاف آن ذکر شده باشد.
beforestringمتن اصلی. وقتی patch حذف شده باشد، همراه با after الزامی است.
afterstringمتن بهروزشده. وقتی patch حذف شده باشد، همراه با before الزامی است.
patchstringمتن diff یکپارچه. با before و after ناسازگار است.
pathstringنام فایل نمایشی برای حالت قبل و بعد.
langstringراهنمای بازنویسی زبان برای حالت قبل و بعد. مقدارهای ناشناخته و زبانهای خارج از مجموعه پیشفرض نمایشگر، به متن ساده برمیگردند مگر اینکه Plugin Diff Viewer Language Pack نصب شده باشد.
titlestringبازنویسی عنوان نمایشگر.
mode"view" | "file" | "both"حالت خروجی. مقدار پیشفرض آن پیشفرض Plugin یعنی defaults.mode است. نام مستعار منسوخ: "image" مانند "file" رفتار میکند و هنوز برای سازگاری عقبرو پذیرفته میشود.
theme"light" | "dark"تم نمایشگر. مقدار پیشفرض آن پیشفرض Plugin یعنی defaults.theme است.
layout"unified" | "split"چیدمان diff. مقدار پیشفرض آن پیشفرض Plugin یعنی defaults.layout است.
expandUnchangedbooleanوقتی زمینه کامل در دسترس باشد، بخشهای بدون تغییر را گسترش میدهد. فقط گزینه هر فراخوانی است (کلید پیشفرض Plugin نیست).
fileFormat"png" | "pdf"قالب فایل رندرشده. مقدار پیشفرض آن پیشفرض Plugin یعنی defaults.fileFormat است.
fileQuality"standard" | "hq" | "print"پیشتنظیم کیفیت برای رندر PNG یا PDF.
fileScalenumberبازنویسی مقیاس دستگاه (1-4).
fileMaxWidthnumberحداکثر عرض رندر بر حسب پیکسل CSS (640-2400).
ttlSecondsnumberdefault: 1800TTL مصنوع بر حسب ثانیه برای خروجیهای نمایشگر و فایل مستقل. حداکثر 21600.
baseUrlstringبازنویسی مبدا URL نمایشگر. viewerBaseUrl مربوط به Plugin را بازنویسی میکند. باید http یا https باشد، بدون query/hash.
Legacy input aliases
همچنان برای سازگاری عقبرو پذیرفته میشوند:
format->fileFormatimageFormat->fileFormatimageQuality->fileQualityimageScale->fileScaleimageMaxWidth->fileMaxWidth
Validation and limits
beforeوafterهرکدام حداکثر 512 KiB.patchحداکثر 2 MiB.pathحداکثر 2048 بایت.langحداکثر 128 بایت.titleحداکثر 1024 بایت.- سقف پیچیدگی patch: حداکثر 128 فایل و 120000 خط در مجموع.
- ترکیب
patchباbeforeیاafterرد میشود. - محدودیتهای ایمنی فایل رندرشده (برای PNG و PDF اعمال میشود):
fileQuality: "standard": حداکثر 8 MP (8,000,000 پیکسل رندرشده).fileQuality: "hq": حداکثر 14 MP (14,000,000 پیکسل رندرشده).fileQuality: "print": حداکثر 24 MP (24,000,000 پیکسل رندرشده).- PDF همچنین حداکثر 50 صفحه دارد.
برجستهسازی نحو
OpenClaw شامل برجستهسازی نحو برای زبانهای رایج سورس، پیکربندی و مستندات است:
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, و toml.
نامهای مستعار رایجی مانند js, ts, bash, md, yml, c++, dockerfile, rb, kt, و ps1 به آن زبانهای پیشفرض نرمالسازی میشوند.
Plugin بسته زبانی Diff Viewer را نصب کنید تا زبانهای دیگر برجستهسازی شوند:
openclaw plugins install clawhub:@openclaw/diffs-language-packبا در دسترس بودن بسته زبانی، OpenClaw میتواند زبانهای بسیار بیشتری را برجستهسازی کند. اگر بسته نصب نشده باشد، فایلهای خارج از فهرست پیشفرض همچنان بهصورت متن ساده و خوانا رندر میشوند. نمونهها شامل 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 هستند.
برای جزئیات، Plugin بسته زبانی Diffs و برای کاتالوگ زبانها و نامهای مستعار بالادستی Shiki، زبانهای Shiki را ببینید.
قرارداد جزئیات خروجی
این ابزار فراداده ساختاریافته را زیر details برمیگرداند.
Viewer fields
فیلدهای مشترک برای حالتهایی که یک نمایشگر ایجاد میکنند:
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId،sessionId،messageChannel،agentAccountIdدر صورت در دسترس بودن)
File fields
فیلدهای فایل هنگامی که PNG یا PDF رندر میشود:
artifactIdexpiresAtfilePathpath(همان مقدارfilePath، برای سازگاری با ابزار پیام)fileBytesfileFormatfileQualityfileScalefileMaxWidth
Compatibility aliases
همچنین برای فراخوانندههای موجود برگردانده میشود:
format(همان مقدارfileFormat)imagePath(همان مقدارfilePath)imageBytes(همان مقدارfileBytes)imageQuality(همان مقدارfileQuality)imageScale(همان مقدارfileScale)imageMaxWidth(همان مقدارfileMaxWidth)
خلاصه رفتار حالتها:
| حالت | آنچه برگردانده میشود |
|---|---|
"view" |
فقط فیلدهای نمایشگر. |
"file" |
فقط فیلدهای فایل، بدون آرتیفکت نمایشگر. |
"both" |
فیلدهای نمایشگر بههمراه فیلدهای فایل. اگر رندر فایل ناموفق باشد، نمایشگر همچنان با fileError و نام مستعار imageError برمیگردد. |
بخشهای بدون تغییر جمعشده
- نمایشگر میتواند ردیفهایی مانند
N unmodified linesرا نشان دهد. - کنترلهای باز کردن روی آن ردیفها شرطی هستند و برای هر نوع ورودی تضمین نمیشوند.
- کنترلهای باز کردن زمانی ظاهر میشوند که diff رندرشده داده زمینه قابل گسترش داشته باشد؛ این حالت برای ورودیهای قبل و بعد معمول است.
- برای بسیاری از ورودیهای وصله یکپارچه، بدنههای زمینه حذفشده در hunkهای وصله تجزیهشده در دسترس نیستند، بنابراین ردیف میتواند بدون کنترلهای باز کردن ظاهر شود. این رفتار مورد انتظار است.
expandUnchangedفقط زمانی اعمال میشود که زمینه قابل گسترش وجود داشته باشد.
پیشفرضهای Plugin
پیشفرضهای سراسری Plugin را در ~/.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, }, }, }, }, },}پیشفرضهای پشتیبانیشده:
fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmodettlSeconds
پارامترهای صریح ابزار این پیشفرضها را بازنویسی میکنند.
پیکربندی URL پایدار نمایشگر
viewerBaseUrlstringfallback تحت مالکیت Plugin برای لینکهای نمایشگر برگشتی، زمانی که فراخوانی ابزار baseUrl را ارسال نمیکند. باید http یا https باشد، بدون query/hash.
{ plugins: { entries: { diffs: { enabled: true, config: { viewerBaseUrl: "https://gateway.example.com/openclaw", }, }, }, },}پیکربندی امنیتی
security.allowRemoteViewerbooleandefault: falsefalse: درخواستهای غیر-loopback به مسیرهای نمایشگر رد میشوند. true: اگر مسیر توکندار معتبر باشد، نمایشگرهای راهدور مجاز هستند.
{ plugins: { entries: { diffs: { enabled: true, config: { security: { allowRemoteViewer: false, }, }, }, }, },}چرخه عمر و ذخیرهسازی آرتیفکت
- آرتیفکتها در زیرپوشه موقت ذخیره میشوند:
$TMPDIR/openclaw-diffs. - فراداده آرتیفکت نمایشگر شامل موارد زیر است:
- شناسه تصادفی آرتیفکت (۲۰ نویسه hex)
- توکن تصادفی (۴۸ نویسه hex)
createdAtوexpiresAt- مسیر ذخیرهشده
viewer.html
- TTL پیشفرض آرتیفکت، وقتی مشخص نشده باشد، ۳۰ دقیقه است.
- بیشترین TTL پذیرفتهشده برای نمایشگر ۶ ساعت است.
- پاکسازی پس از ایجاد آرتیفکت بهصورت فرصتطلبانه اجرا میشود.
- آرتیفکتهای منقضیشده حذف میشوند.
- پاکسازی جایگزین، وقتی فراداده وجود ندارد، پوشههای کهنهتر از ۲۴ ساعت را حذف میکند.
URL نمایشگر و رفتار شبکه
مسیر نمایشگر:
/plugins/diffs/view/{artifactId}/{token}
داراییهای نمایشگر:
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js/plugins/diffs-language-pack/assets/viewer.jsوقتی diff از زبانی در Diff Viewer Language Pack استفاده میکند
سند نمایشگر این داراییها را نسبت به URL نمایشگر resolve میکند، بنابراین پیشوند مسیر اختیاری baseUrl برای هر دو درخواست دارایی نیز حفظ میشود.
رفتار ساخت URL:
- اگر
baseUrlفراخوانی ابزار ارائه شده باشد، پس از اعتبارسنجی سختگیرانه استفاده میشود. - در غیر این صورت، اگر
viewerBaseUrlمربوط به Plugin پیکربندی شده باشد، استفاده میشود. - بدون هیچکدام از این overrideها، URL نمایشگر بهصورت پیشفرض روی loopback یعنی
127.0.0.1قرار میگیرد. - اگر حالت bind مربوط به Gateway برابر
customباشد وgateway.customBindHostتنظیم شده باشد، از همان host استفاده میشود.
قواعد baseUrl:
- باید
http://یاhttps://باشد. - query و hash رد میشوند.
- origin بههمراه مسیر پایه اختیاری مجاز است.
مدل امنیتی
Viewer hardening
- بهصورت پیشفرض فقط loopback.
- مسیرهای نمایشگر توکندار با اعتبارسنجی سختگیرانه شناسه و توکن.
- CSP پاسخ نمایشگر:
default-src 'none'- اسکریپتها و داراییها فقط از self
- بدون
connect-srcخروجی
- محدودسازی miss راه دور وقتی دسترسی راه دور فعال است:
- ۴۰ شکست در هر ۶۰ ثانیه
- قفل ۶۰ ثانیهای (
429 Too Many Requests)
File rendering hardening
- مسیریابی درخواست مرورگر اسکرینشات بهصورت پیشفرض deny است.
- فقط داراییهای محلی نمایشگر از
http://127.0.0.1/plugins/diffs/assets/*مجاز هستند. - درخواستهای شبکه خارجی مسدود میشوند.
نیازمندیهای مرورگر برای حالت فایل
mode: "file" و mode: "both" به مرورگر سازگار با Chromium نیاز دارند.
ترتیب resolve:
Config
browser.executablePath در پیکربندی OpenClaw.
Environment variables
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
Platform fallback
fallback کشف فرمان/مسیر پلتفرم.
متن رایج خطا:
Diff PNG/PDF rendering requires a Chromium-compatible browser...
برای رفع، Chrome، Chromium، Edge یا Brave را نصب کنید، یا یکی از گزینههای مسیر executable بالا را تنظیم کنید.
عیبیابی
Input validation errors
Provide patch or both before and after text.— هر دوbeforeوafterرا وارد کنید، یاpatchارائه دهید.Provide either patch or before/after input, not both.— حالتهای ورودی را ترکیب نکنید.Invalid baseUrl: ...— از origin نوعhttp(s)با مسیر اختیاری استفاده کنید، بدون query/hash.{field} exceeds maximum size (...)— اندازه payload را کاهش دهید.- رد patch بزرگ — تعداد فایلهای patch یا مجموع خطوط را کاهش دهید.
Viewer accessibility
- URL نمایشگر بهصورت پیشفرض به
127.0.0.1resolve میشود. - برای سناریوهای دسترسی راه دور، یکی از این کارها را انجام دهید:
viewerBaseUrlمربوط به Plugin را تنظیم کنید، یا- در هر فراخوانی ابزار
baseUrlپاس دهید، یا - از
gateway.bind=customوgateway.customBindHostاستفاده کنید
- اگر
gateway.trustedProxiesبرای یک پروکسی هممیزبان شامل loopback باشد (برای مثال Tailscale Serve)، درخواستهای خام نمایشگر روی loopback بدون هدرهای client-IP فورواردشده طبق طراحی fail closed میشوند. - برای آن توپولوژی پروکسی:
- وقتی فقط به یک پیوست نیاز دارید،
mode: "file"یاmode: "both"را ترجیح دهید، یا - وقتی به URL نمایشگر قابل اشتراکگذاری نیاز دارید، عمداً
security.allowRemoteViewerرا فعال کنید وviewerBaseUrlمربوط به Plugin را تنظیم کنید یا یکbaseUrlپروکسی/عمومی پاس دهید
- وقتی فقط به یک پیوست نیاز دارید،
security.allowRemoteViewerرا فقط زمانی فعال کنید که قصد دسترسی خارجی به نمایشگر را دارید.
Unmodified-lines row has no expand button
این حالت برای ورودی patch میتواند زمانی رخ دهد که patch زمینه قابل گسترش همراه نداشته باشد. این مورد مورد انتظار است و نشاندهنده خرابی نمایشگر نیست.
Artifact not found
- آرتیفکت بهدلیل TTL منقضی شده است.
- توکن یا مسیر تغییر کرده است.
- پاکسازی دادههای کهنه را حذف کرده است.
راهنمای عملیاتی
- برای بازبینیهای تعاملی محلی در canvas،
mode: "view"را ترجیح دهید. - برای کانالهای چت خروجی که به پیوست نیاز دارند،
mode: "file"را ترجیح دهید. allowRemoteViewerرا غیرفعال نگه دارید، مگر اینکه استقرار شما به URLهای نمایشگر راه دور نیاز داشته باشد.- برای diffهای حساس،
ttlSecondsکوتاه و صریح تنظیم کنید. - وقتی لازم نیست، از ارسال secrets در ورودی diff خودداری کنید.
- اگر کانال شما تصاویر را بهشدت فشرده میکند (برای مثال Telegram یا WhatsApp)، خروجی PDF را ترجیح دهید (
fileFormat: "pdf").