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, }, }, }, },}این کار قلاب 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: درخواستهای غیرحلقهبازگشتی به مسیرهای نمایشگر رد میشوند. true: اگر مسیر توکندار معتبر باشد، نمایشگرهای راهدور مجازند.
{ plugins: { entries: { diffs: { enabled: true, config: { security: { allowRemoteViewer: false, }, }, }, }, },}چرخهٔ عمر و ذخیرهسازی مصنوع
- مصنوعها در
$TMPDIR/openclaw-diffsقرار دارند. - فرادادهٔ نمایشگر یک شناسهٔ مصنوع تصادفی 20 نویسهای هگزادسیمال، یک توکن تصادفی 48 نویسهای هگزادسیمال،
createdAt/expiresAtو مسیر ذخیرهشدهٔviewer.htmlرا نگه میدارد. - TTL پیشفرض مصنوع: 30 دقیقه. حداکثر TTL پذیرفتهشده: 6 ساعت.
- پاکسازی پس از هر فراخوانی ایجاد مصنوع و در صورت فراهمشدن فرصت اجرا میشود؛ مصنوعهای منقضیشده حذف میشوند.
- پویش جایگزین، وقتی فراداده موجود نیست، پوشههای کهنهتر از 24 ساعت را حذف میکند.
رفتار شبکه و URL نمایشگر
مسیر نمایشگر: /plugins/diffs/view/{artifactId}/{token}
داراییهای نمایشگر:
/plugins/diffs/assets/viewer.js/plugins/diffs/assets/viewer-runtime.js/plugins/diffs-language-pack/assets/viewer.js(فقط زمانی که تفاوت از زبانِ یک بستهٔ زبانی استفاده میکند)
سند نمایشگر این داراییها را نسبت به نشانی اینترنتی نمایشگر تفکیک میکند، بنابراین پیشوند مسیر اختیاری baseUrl به درخواستهای دارایی نیز منتقل میشود.
ترتیب تفکیک نشانی اینترنتی: baseUrl فراخوانی ابزار (پس از اعتبارسنجی سختگیرانه) -> viewerBaseUrl مربوط به Plugin -> پیشفرض حلقهٔ بازگشتی 127.0.0.1. اگر حالت اتصال Gateway برابر با custom باشد و gateway.customBindHost تنظیم شده باشد، بهجای حلقهٔ بازگشتی از آن میزبان استفاده میشود.
قواعد baseUrl: باید http:// یا https:// باشد؛ کوئری و هش رد میشوند؛ مبدأ بههمراه مسیر پایهٔ اختیاری مجاز است.
مدل امنیتی
سختسازی نمایشگر
- بهطور پیشفرض فقط حلقهٔ بازگشتی.
- مسیرهای توکندار نمایشگر با اعتبارسنجی سختگیرانهٔ الگوی شناسه و توکن.
- سیاست 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: ...-- از مبدأhttp(s)با مسیر اختیاری و بدون کوئری/هش استفاده کنید.{field} exceeds maximum size (...)-- اندازهٔ محموله را کاهش دهید.- رد وصلهٔ بزرگ -- تعداد فایلهای وصله یا مجموع خطوط را کاهش دهید.
دسترسپذیری نمایشگر
- نشانی اینترنتی نمایشگر بهطور پیشفرض به
127.0.0.1تفکیک میشود. - برای دسترسی از راه دور، یا
viewerBaseUrlمربوط به Plugin را تنظیم کنید، یا در هر فراخوانیbaseUrlرا ارسال کنید، یا ازgateway.bind=customهمراه باgateway.customBindHostاستفاده کنید. - اگر
gateway.trustedProxiesشامل حلقهٔ بازگشتی برای پراکسیِ همان میزبان باشد (برای مثال Tailscale Serve)، درخواستهای خام نمایشگر از حلقهٔ بازگشتی که فاقد سرآیندهای ارسالشدهٔ IP کارخواه هستند، طبق طراحی با حالت بسته شکست میخورند. - برای آن توپولوژی پراکسی، برای پیوست
mode: "file"/"both"را ترجیح دهید، یا برای پیوند قابلاشتراک نمایشگر،security.allowRemoteViewerرا بهعمد همراه باviewerBaseUrlمربوط به Plugin/یکbaseUrlپراکسی فعال کنید. - فقط زمانی
security.allowRemoteViewerرا فعال کنید که دسترسی خارجی به نمایشگر موردنظر باشد.
ردیف خطوط تغییریافته دکمهٔ بازکردن ندارد
این رفتار برای ورودی وصلهای که فاقد بافت قابلگسترش است مورد انتظار است؛ خطای نمایشگر نیست.
مصنوع یافت نشد
- مصنوع بهدلیل TTL منقضی شده است.
- توکن یا مسیر تغییر کرده است.
- پاکسازی دادههای کهنه را حذف کرده است.
راهنمای عملیاتی
- برای بازبینیهای تعاملی محلی در بوم،
mode: "view"را ترجیح دهید. - برای کانالهای گفتوگوی خروجی که به پیوست نیاز دارند،
mode: "file"را ترجیح دهید. - مگر اینکه استقرار شما به نشانیهای اینترنتی نمایشگر راه دور نیاز داشته باشد،
allowRemoteViewerرا غیرفعال نگه دارید. - برای تفاوتهای حساس، یک
ttlSecondsکوتاه و صریح تنظیم کنید. - اگر لازم نیست، از ارسال اسرار در ورودی تفاوت خودداری کنید.
- اگر کانال شما تصاویر را بهشدت فشرده میکند (برای مثال Telegram یا WhatsApp)، خروجی PDF را ترجیح دهید (
fileFormat: "pdf").