diffs هي أداة Plugin مضمّنة اختيارية تحوّل نص ما قبل/ما بعد أو تصحيحًا موحّدًا إلى ناتج فرق للقراءة فقط. كما تضيف إرشادات موجزة للوكيل في بداية مطالبة النظام، وتأتي مع مهارة مصاحبة لتوفير تعليمات أشمل.
الإدخال: نص before + after، أو patch موحّد (وهما متنافيان).
الإخراج: عنوان URL لعارض Gateway للعرض على اللوحة، أو مسار ملف PNG/PDF معروض لتسليمه في رسالة، أو كلاهما.
البدء السريع
1
تثبيت Plugin
2
تمكين Plugin
3
اختيار وضع
- view
- file
- both
تدفقات تفضّل اللوحة: تستدعي الوكلاء
diffs باستخدام mode: "view" وتفتح details.viewerUrl باستخدام canvas present.تعطيل إرشادات النظام المضمّنة
للاحتفاظ بالأداة مع حذف الإرشادات المضافة في بداية مطالبة النظام، اضبطplugins.entries.diffs.hooks.allowPromptInjection على false:
before_prompt_build الخاص بالـPlugin مع إبقاء الأداة والمهارة متاحتين. لتعطيل الإرشادات والأداة معًا، عطّل Plugin بدلًا من ذلك.
مرجع إدخال الأداة
جميع الحقول اختيارية ما لم يُذكر خلاف ذلك.string
النص الأصلي. مطلوب مع
after عند إغفال patch.string
النص المحدّث. مطلوب مع
before عند إغفال patch.string
نص فرق موحّد. يتنافى مع
before وafter.string
اسم الملف المعروض لوضع ما قبل/ما بعد.
string
تلميح لتجاوز اللغة في وضع ما قبل/ما بعد. تعود القيم غير المعروفة واللغات الخارجة عن مجموعة العارض الافتراضية إلى النص العادي ما لم يكن Plugin حزمة لغات عارض الفروق مثبتًا.
string
تجاوز عنوان العارض.
"view" | "file" | "both"
وضع الإخراج. يستخدم افتراضيًا إعداد Plugin الافتراضي
defaults.mode (both). اسم بديل مهمل: يتصرف "image" بالطريقة نفسها تمامًا مثل "file"."light" | "dark"
سمة العارض. تستخدم افتراضيًا إعداد Plugin الافتراضي
defaults.theme."unified" | "split"
تخطيط الفرق. يستخدم افتراضيًا إعداد Plugin الافتراضي
defaults.layout.boolean
توسيع الأقسام غير المتغيرة عند توفر السياق الكامل. خيار لكل استدعاء فقط (وليس مفتاحًا افتراضيًا للـPlugin).
"png" | "pdf"
تنسيق الملف المعروض. يستخدم افتراضيًا إعداد Plugin الافتراضي
defaults.fileFormat."standard" | "hq" | "print"
إعداد مسبق للجودة لعرض PNG/PDF.
number
تجاوز مقياس الجهاز (
1-4).number
أقصى عرض للتصيير بوحدات بكسل CSS (
640-2400).number
افتراضي:"1800"
مدة بقاء الناتج بالثواني لمخرجات العارض والملفات المستقلة. الحد الأقصى
21600.string
تجاوز أصل عنوان 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، إلخ) إلى تلك اللغات.
ثبّت Plugin حزمة لغات عارض الفروق لمزيد من اللغات (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 والمزيد):
عقد تفاصيل الإخراج
تتضمن جميع النتائج الناجحةchanged: يعيد إدخال ما قبل/ما بعد المتطابق false من دون إنشاء ناتج؛ وتعيد النتائج المعروضة true.
حقول العارض (وضعا view وboth)
حقول العارض (وضعا view وboth)
changedartifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId،sessionId،messageChannel،agentAccountIdعند توفرها)
حقول الملف (وضعا file وboth)
حقول الملف (وضعا file وboth)
changedartifactIdexpiresAtfilePathpath(القيمة نفسها لـfilePath، للتوافق مع أداة الرسائل)fileBytesfileFormatfileQualityfileScalefileMaxWidth
الأقسام غير المتغيرة المطوية
يعرض العارض صفوفًا مثلN unmodified lines. لا تظهر عناصر تحكم التوسيع إلا عندما يحتوي الفرق المعروض على بيانات سياق قابلة للتوسيع (وهو المعتاد لإدخال ما قبل/ما بعد). تحذف كثير من التصحيحات الموحّدة نصوص السياق من مقاطعها، لذلك قد يظهر الصف من دون عنصر تحكم للتوسيع؛ وهذا متوقع وليس خطأ. لا ينطبق expandUnchanged إلا عند وجود سياق قابل للتوسيع.
التنقل بين ملفات متعددة
تبدأ التصحيحات التي تمس أكثر من ملف ببطاقة ملخص للملفات المتغيرة: إجمالي أعداد+N / -N، والأعداد لكل ملف، وشارات الإضافة/الحذف/إعادة التسمية، وروابط ارتساء تنتقل إلى كل ملف. تحتفظ ملفات PNG/PDF المعروضة بأعداد ترويسة كل ملف، لكنها تحذف مفاتيح تبديل العرض التفاعلية لأنها عناصر تحكم غير فعالة في ملف ثابت.
الإعدادات الافتراضية للـPlugin
عيّن الإعدادات الافتراضية على مستوى Plugin في~/.openclaw/openclaw.json:
defaults المدعومة: fontFamily، fontSize، lineSpacing، layout، showLineNumbers، diffIndicators، wordWrap، background، theme، fileFormat، fileQuality، fileScale، fileMaxWidth، mode، ttlSeconds. تتجاوز معاملات استدعاء الأداة الصريحة هذه الإعدادات.
إعداد عنوان URL الدائم للعارض
string
الخيار الاحتياطي المملوك للـPlugin لروابط العارض المعادة عندما لا يمرر استدعاء الأداة
baseUrl. يجب أن يكون http أو https، من دون استعلام/تجزئة.إعداد الأمان
boolean
افتراضي:"false"
false: تُرفض الطلبات الواردة إلى مسارات العارض من عناوين غير الاسترجاع المحلي. true: يُسمح بالعارضات البعيدة إذا كان المسار المرمّز صالحًا.دورة حياة الناتج وتخزينه
- توجد النواتج ضمن
$TMPDIR/openclaw-diffs. - تخزّن بيانات العارض الوصفية معرّف ناتج عشوائيًا من 20 محرفًا سداسيًا عشريًا، ورمزًا عشوائيًا من 48 محرفًا سداسيًا عشريًا، و
createdAt/expiresAt، ومسارviewer.htmlالمخزّن. - مدة بقاء الناتج الافتراضية: 30 دقيقة. أقصى مدة بقاء مقبولة: 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 على طلبات الأصول.
ترتيب حل عنوان URL: 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.
ترتيب الحل:
1
الإعداد
browser.executablePath في إعداد OpenClaw.2
متغيرات البيئة
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
3
الخيار الاحتياطي للنظام الأساسي
مسارات التثبيت الشائعة وعمليات البحث عبر
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 (...)— قلّل حجم الحمولة.- رفض التصحيح الكبير — قلّل عدد ملفات التصحيح أو إجمالي الأسطر.
إمكانية الوصول إلى العارض
إمكانية الوصول إلى العارض
- يُحل عنوان URL للعارض إلى
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إلا عندما يكون الوصول الخارجي إلى العارض مقصودًا.
لا يحتوي صف الأسطر غير المعدّلة على زر توسيع
لا يحتوي صف الأسطر غير المعدّلة على زر توسيع
هذا متوقع لإدخال تصحيح يفتقر إلى سياق قابل للتوسيع؛ وليس إخفاقًا في العارض.
لم يتم العثور على الأثر
لم يتم العثور على الأثر
- انتهت صلاحية الأثر بسبب مدة البقاء.
- تغيّر الرمز المميز أو المسار.
- أزالت عملية التنظيف البيانات القديمة.
إرشادات التشغيل
- يُفضّل
mode: "view"للمراجعات التفاعلية المحلية في اللوحة. - يُفضّل
mode: "file"لقنوات الدردشة الصادرة التي تحتاج إلى مرفق. - أبقِ
allowRemoteViewerمعطّلة ما لم يتطلب نشرك عناوين URL بعيدة للعارض. - اضبط مدة
ttlSecondsقصيرة وصريحة للفروق الحساسة. - تجنّب إرسال الأسرار في إدخال الفرق عندما لا تكون مطلوبة.
- إذا كانت قناتك تضغط الصور بشدة (مثل Telegram أو WhatsApp)، فيُفضّل إخراج PDF (
fileFormat: "pdf").
يعمل محرك عرض الفروق بواسطة Diffs.