Tools
تفاوتها
diffs یک ابزار اختیاریِ Plugin همراه است که متن قبل/بعد یا یک وصلهٔ یکپارچه را به یک مصنوع diff فقطخواندنی تبدیل میکند. همچنین راهنمایی کوتاهی برای عامل به ابتدای اعلان سیستمی میافزاید و یک Skill همراه برای دستورالعملهای کاملتر ارائه میکند.
ورودی: متن before + after، یا یک patch یکپارچه (مانعةالجمع).
خروجی: یک نشانی URL نمایشگر Gateway برای ارائه در بوم، مسیر فایل PNG/PDF رندرشده برای تحویل در پیام، یا هر دو.
شروع سریع
نصب Plugin
openclaw plugins install diffsفعالسازی Plugin
{ plugins: { entries: { diffs: { enabled: true, }, }, },}انتخاب یک حالت
view
جریانهای بوممحور: عاملها diffs را با mode: "view" فراخوانی میکنند و details.viewerUrl را با canvas present باز میکنند.
file
تحویل فایل در گفتوگو: عاملها diffs را با mode: "file" فراخوانی میکنند و details.filePath را با message، با استفاده از path یا filePath، ارسال میکنند.
both
ترکیبی (پیشفرض): عاملها diffs را با mode: "both" فراخوانی میکنند تا هر دو مصنوع را در یک فراخوانی دریافت کنند.
غیرفعالسازی راهنمای سیستمی داخلی
برای نگهداشتن ابزار و حذف راهنمای افزودهشده به اعلان سیستمی، plugins.entries.diffs.hooks.allowPromptInjection را روی false تنظیم کنید:
{ plugins: { entries: { diffs: { enabled: true, hooks: { allowPromptInjection: false, }, }, }, },}این کار hook مربوط به before_prompt_build در Plugin را مسدود میکند و در عین حال ابزار و Skill را در دسترس نگه میدارد. برای غیرفعالسازی هم راهنما و هم ابزار، خود Plugin را غیرفعال کنید.
مرجع ورودی ابزار
همهٔ فیلدها اختیاریاند، مگر آنکه خلافش ذکر شده باشد.
beforestringمتن اصلی. هنگامی که patch حذف شده باشد، همراه با after الزامی است.
afterstringمتن بهروزشده. هنگامی که patch حذف شده باشد، همراه با before الزامی است.
patchstringمتن diff یکپارچه. با before و after مانعةالجمع است.
pathstringنام فایل نمایشی برای حالت قبل/بعد.
langstringراهنمای بازنویسی زبان برای حالت قبل/بعد. مقادیر ناشناخته و زبانهای خارج از مجموعهٔ پیشفرض نمایشگر، مگر آنکه Plugin بستهٔ زبان نمایشگر Diff نصب شده باشد، به متن ساده بازمیگردند.
titlestringبازنویسی عنوان نمایشگر.
mode"view" | "file" | "both"حالت خروجی. مقدار پیشفرض، مقدار پیشفرض Plugin یعنی defaults.mode (both) است. نام مستعار منسوخ: "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 و بدون پرسوجو/هش باشد.
اعتبارسنجی و محدودیتها
before/after: حداکثر 512 KiB برای هرکدام.patch: حداکثر 2 MiB.path: حداکثر 2048 بایت.lang: حداکثر 128 بایت.title: حداکثر 1024 بایت.- سقف پیچیدگی وصله: حداکثر 128 فایل و در مجموع 120000 خط.
- استفادهٔ همزمان از
patchباbefore/afterرد میشود. - محدودیتهای ایمنی فایل رندرشده (PNG و PDF):
fileQuality: "standard": حداکثر 8 MP (8,000,000 پیکسل رندرشده).fileQuality: "hq": حداکثر 14 MP.fileQuality: "print": حداکثر 24 MP.- PDF همچنین به 50 صفحه محدود است.
برجستهسازی نحو
زبانهای داخلی:
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 و غیره) به آن زبانها نرمالسازی میشوند.
برای زبانهای بیشتر (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 بستهٔ زبان نمایشگر Diff را نصب کنید:
openclaw plugins install clawhub:@openclaw/diffs-language-packبدون این بسته، زبانهای پشتیبانینشده همچنان بهصورت متن ساده و خوانا رندر میشوند. برای فهرست بالادستی، به Plugin بستهٔ زبان Diffs و زبانهای Shiki مراجعه کنید.
قرارداد جزئیات خروجی
همهٔ نتایج موفق شامل changed هستند: ورودی یکسان قبل/بعد، بدون ایجاد مصنوع، false را برمیگرداند؛ نتایج رندرشده true را برمیگردانند.
فیلدهای نمایشگر (حالتهای view و both)
changedartifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId،sessionId،messageChannel،agentAccountIdدر صورت وجود)
فیلدهای فایل (حالتهای file و both)
changedartifactIdexpiresAtfilePathpath(همان مقدارfilePath، برای سازگاری با ابزار پیام)fileBytesfileFormatfileQualityfileScalefileMaxWidth
| حالت | موارد بازگشتی |
|---|---|
"view" |
فقط فیلدهای نمایشگر. |
"file" |
فقط فیلدهای فایل، بدون مصنوع نمایشگر. |
"both" |
فیلدهای نمایشگر بههمراه فیلدهای فایل. اگر رندر فایل ناموفق باشد، نمایشگر همچنان با fileError بازگردانده میشود. |
بخشهای بدون تغییرِ جمعشده
نمایشگر ردیفهایی مانند N unmodified lines نشان میدهد. کنترلهای بازکردن فقط زمانی ظاهر میشوند که diff رندرشده دادهٔ زمینهٔ قابلبازشدن داشته باشد (معمولاً برای ورودی قبل/بعد). بسیاری از وصلههای یکپارچه بدنهٔ زمینه را در قطعههای خود حذف میکنند؛ بنابراین ممکن است ردیف بدون کنترل بازکردن ظاهر شود -- این رفتار مورد انتظار است، نه یک اشکال. expandUnchanged فقط زمانی اعمال میشود که زمینهٔ قابلبازشدن وجود داشته باشد.
پیمایش چندفایلی
وصلههایی که بیش از یک فایل را تغییر میدهند، با یک کارت خلاصهٔ فایلهای تغییرکرده آغاز میشوند: تعداد کل +N / -N، تعداد هر فایل، نشانهای افزودهشده/حذفشده/تغییرنامیافته و پیوندهای لنگری که به هر فایل میپرند. فایلهای PNG/PDF رندرشده تعدادهای سربرگ هر فایل را حفظ میکنند، اما کلیدهای تغییر نمای تعاملی را حذف میکنند؛ زیرا این کنترلها در یک فایل ایستا کارایی ندارند.
مقادیر پیشفرض 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, }, }, }, }, },}کلیدهای پشتیبانیشدهٔ defaults: fontFamily، fontSize، lineSpacing، layout، showLineNumbers، diffIndicators، wordWrap، background، theme، fileFormat، fileQuality، fileScale، fileMaxWidth، mode، ttlSeconds. پارامترهای صریح فراخوانی ابزار این موارد را بازنویسی میکنند.
پیکربندی پایدار نشانی URL نمایشگر
viewerBaseUrlstringمقدار جایگزین تحت مالکیت Plugin برای پیوندهای نمایشگر بازگشتی، هنگامی که فراخوانی ابزار baseUrl را ارسال نمیکند. باید http یا https و بدون پرسوجو/هش باشد.
{ 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, }, }, }, }, },}چرخهٔ عمر و ذخیرهسازی مصنوع
- HTML نمایشگر و فرادادهها در پایگاه دادهٔ مشترک
state/openclaw.sqliteدر فضای نام blob افزونهٔ Diffs نگهداری میشوند. HTML با gzip فشرده میشود؛ SQLite فقط هش SHA-256 توکن تصادفی URL را ذخیره میکند، نه خود توکن را. - فایلهای PNG/PDF رندرشده بهصورت نمونههای موقت در
$TMPDIR/openclaw-diffsباقی میمانند، زیرا تحویل از طریق کانال به مسیر فایل نیاز دارد. SQLite مالک فرادادهٔ انقضای آنهاست؛ هیچ فایل جانبی JSON نوشته نمیشود. - TTL پیشفرض آرتیفکت: 30 دقیقه. حداکثر TTL پذیرفتهشده: 6 ساعت.
- پاکسازی پس از هر فراخوانی ایجاد آرتیفکت، در صورت فراهمبودن فرصت اجرا میشود. ابتدا ردیفهای منقضیشدهٔ SQLite حذف میشوند و سپس هر دایرکتوری PNG/PDF متناظر حذف میشود.
- یک پیمایش پشتیبان، پوشههای موقت بدون ردیف را که بیش از 24 ساعت قدمت دارند حذف میکند. کشهای قدیمی
meta.json،file-meta.jsonوviewer.htmlوارد یا خوانده نمیشوند.
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 از یکی از زبانهای بستهٔ زبانی استفاده میکند)
سند نمایشگر این داراییها را نسبت به URL نمایشگر تفکیک میکند، بنابراین پیشوند اختیاری مسیر baseUrl به درخواستهای دارایی نیز منتقل میشود.
ترتیب تفکیک URL: baseUrl در فراخوانی ابزار (پس از اعتبارسنجی سختگیرانه) -> viewerBaseUrl افزونه -> پیشفرض loopback یعنی 127.0.0.1. اگر حالت bind در Gateway برابر custom باشد و gateway.customBindHost تنظیم شده باشد، بهجای loopback از آن میزبان استفاده میشود.
قواعد baseUrl: باید http:// یا https:// باشد؛ query و hash رد میشوند؛ origin بههمراه مسیر پایهٔ اختیاری مجاز است.
مدل امنیتی
سختسازی نمایشگر
- بهطور پیشفرض فقط loopback.
- مسیرهای توکندار نمایشگر با اعتبارسنجی سختگیرانهٔ الگوی شناسه و توکن.
- سیاست CSP پاسخ نمایشگر:
default-src 'none'؛ اسکریپتها/داراییها فقط از خود مبدأ؛ بدونconnect-srcخروجی. - محدودسازی خطاهای دسترسی راه دور در صورت فعالبودن دسترسی راه دور: 40 خطا در هر 60 ثانیه، قفلشدن 60ثانیهای را فعال میکند (
429 Too Many Requests).
سختسازی رندر فایل
- مسیریابی درخواست مرورگر برای ثبت تصویر، بهطور پیشفرض همهچیز را رد میکند.
- فقط داراییهای محلی نمایشگر از
http://127.0.0.1/plugins/diffs/assets/*مجاز هستند. - درخواستهای شبکهٔ خارجی مسدود میشوند.
الزامات مرورگر برای حالت فایل
mode: "file" و mode: "both" به مرورگری سازگار با Chromium نیاز دارند.
ترتیب تفکیک:
پیکربندی
browser.executablePath در پیکربندی OpenClaw.
متغیرهای محیطی
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
راهکار جایگزین پلتفرم
مسیرهای رایج نصب و جستوجوهای PATH برای Chrome، Chromium، Edge و Brave.
متن رایج خطا: Diff PNG/PDF rendering requires a Chromium-compatible browser.... برای رفع آن، Chrome، Chromium، Edge یا Brave را نصب کنید یا یکی از گزینههای مسیر فایل اجرایی بالا را تنظیم کنید.
عیبیابی
خطاهای اعتبارسنجی ورودی
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 یا مجموع خطوط را کاهش دهید.
دسترسیپذیری نمایشگر
- URL نمایشگر بهطور پیشفرض به
127.0.0.1تفکیک میشود. - برای دسترسی راه دور، یا
viewerBaseUrlافزونه را تنظیم کنید، در هر فراخوانیbaseUrlرا ارسال کنید، یا ازgateway.bind=customهمراه باgateway.customBindHostاستفاده کنید. - اگر
gateway.trustedProxiesشامل loopback برای پراکسی روی همان میزبان باشد (برای مثال Tailscale Serve)، درخواستهای مستقیم نمایشگر روی loopback که هدرهای ارسالشدهٔ IP کارخواه را ندارند، بنا بر طراحی بهصورت امن رد میشوند. - برای این توپولوژی پراکسی، برای پیوست
mode: "file"/"both"را ترجیح دهید، یا برای پیوند نمایشگر قابلاشتراک، عمداًsecurity.allowRemoteViewerرا بههمراهviewerBaseUrlافزونه/یکbaseUrlپراکسی فعال کنید. -
security.allowRemoteViewerرا فقط زمانی فعال کنید که دسترسی خارجی به نمایشگر مدنظر است.
ردیف خطوط تغییریافتهنشده دکمهٔ بازکردن ندارد
این رفتار برای ورودی patch فاقد محتوای زمینهای قابلگسترش مورد انتظار است؛ خطای نمایشگر نیست.
آرتیفکت یافت نشد
- آرتیفکت بهدلیل TTL منقضی شده است.
- توکن یا مسیر تغییر کرده است.
- پاکسازی دادههای قدیمی را حذف کرده است.
راهنمای عملیاتی
- برای بازبینیهای تعاملی محلی در canvas،
mode: "view"را ترجیح دهید. - برای کانالهای چت خروجی که به پیوست نیاز دارند،
mode: "file"را ترجیح دهید. -
allowRemoteViewerرا غیرفعال نگه دارید، مگر اینکه استقرار شما به URLهای راه دور نمایشگر نیاز داشته باشد. - برای diffهای حساس، یک
ttlSecondsکوتاه و صریح تنظیم کنید. - در صورت عدم نیاز، از ارسال اطلاعات محرمانه در ورودی diff خودداری کنید.
- اگر کانال شما تصاویر را بهشدت فشرده میکند (برای مثال Telegram یا WhatsApp)، خروجی PDF را ترجیح دهید (
fileFormat: "pdf").