Tools
Відмінності
diffs — це додатковий інструмент Plugin із короткими вбудованими системними настановами та супровідним Skill, який перетворює вміст змін на доступний лише для читання артефакт diff для агентів.
Він приймає або:
- текст
beforeіafter - уніфікований
patch
Він може повернути:
- URL переглядача Gateway для презентації на canvas
- шлях до відрендереного файла (PNG або PDF) для доставлення повідомленням
- обидва результати в одному виклику
Коли Plugin увімкнено, він додає стислі настанови з використання на початок простору системного prompt і також надає докладний Skill для випадків, коли агенту потрібні повніші інструкції.
Швидкий старт
Установіть Plugin
openclaw plugins install diffsУвімкніть Plugin
{ plugins: { entries: { diffs: { enabled: true, }, }, },}Виберіть режим
view
Потоки, орієнтовані на canvas: агенти викликають diffs з mode: "view" і відкривають details.viewerUrl через canvas present.
file
Доставлення файлів у чаті: агенти викликають diffs з mode: "file" і надсилають details.filePath через message, використовуючи path або filePath.
both
Комбіновано: агенти викликають diffs з mode: "both", щоб отримати обидва артефакти в одному виклику.
Вимкнення вбудованих системних настанов
Якщо потрібно залишити інструмент diffs увімкненим, але вимкнути його вбудовані настанови системного prompt, установіть plugins.entries.diffs.hooks.allowPromptInjection у false:
{ plugins: { entries: { diffs: { enabled: true, hooks: { allowPromptInjection: false, }, }, }, },}Це блокує хук before_prompt_build Plugin diffs, залишаючи Plugin, інструмент і супровідний Skill доступними.
Якщо потрібно вимкнути і настанови, і інструмент, вимкніть сам Plugin.
Типовий робочий процес агента
Виклик diffs
Агент викликає інструмент diffs із вхідними даними.
Читання details
Агент читає поля details з відповіді.
Презентація
Агент або відкриває details.viewerUrl через canvas present, або надсилає details.filePath через message, використовуючи path чи filePath, або робить і те, і те.
Приклади введення
До і після
{ "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Початковий текст. Обов’язковий разом з after, коли patch не вказано.
afterstringОновлений текст. Обов’язковий разом з before, коли patch не вказано.
patchstringТекст уніфікованого diff. Взаємовиключний з before і after.
pathstringВідображуване ім’я файла для режиму до і після.
langstringПідказка перевизначення мови для режиму до і після. Невідомі значення повертаються до звичайного тексту.
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Перевизначення origin URL переглядача. Перевизначає Plugin viewerBaseUrl. Має бути http або https, без query/hash.
Застарілі псевдоніми введення
Досі приймаються для зворотної сумісності:
format->fileFormatimageFormat->fileFormatimageQuality->fileQualityimageScale->fileScaleimageMaxWidth->fileMaxWidth
Валідація та обмеження
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 сторінок.
Контракт вихідних details
Інструмент повертає структуровані метадані в details.
Поля переглядача
Спільні поля для режимів, які створюють переглядач:
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmodecontext(agentId,sessionId,messageChannel,agentAccountId, коли доступні)
Поля файла
Поля файла, коли рендериться PNG або PDF:
artifactIdexpiresAtfilePathpath(те саме значення, що йfilePath, для сумісності з інструментом повідомлень)fileBytesfileFormatfileQualityfileScalefileMaxWidth
Псевдоніми сумісності
Також повертаються для наявних викликачів:
format(те саме значення, що йfileFormat)imagePath(те саме значення, що йfilePath)imageBytes(те саме значення, що йfileBytes)imageQuality(те саме значення, що йfileQuality)imageScale(те саме значення, що йfileScale)imageMaxWidth(те саме значення, що йfileMaxWidth)
Підсумок поведінки режимів:
| Режим | Що повертається |
|---|---|
"view" |
Лише поля переглядача. |
"file" |
Лише поля файла, без артефакта переглядача. |
"both" |
Поля переглядача плюс поля файла. Якщо рендеринг файла не вдається, переглядач усе одно повертається з fileError і псевдонімом imageError. |
Згорнуті незмінені розділи
- Переглядач може показувати рядки на кшталт
N unmodified lines. - Елементи керування розгортанням на цих рядках є умовними й не гарантуються для кожного типу введення.
- Елементи керування розгортанням з’являються, коли відрендерений diff має дані контексту, які можна розгорнути, що типово для введення до і після.
- Для багатьох вхідних уніфікованих patch пропущені тіла контексту недоступні в розібраних hunks patch, тому рядок може з’являтися без елементів керування розгортанням. Це очікувана поведінка.
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 переглядача
viewerBaseUrlstringРезервний варіант, керований 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. - Метадані артефакта переглядача містять:
- випадковий ID артефакта (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
Документ переглядача визначає ці ресурси відносно URL переглядача, тому необов’язковий префікс шляху baseUrl також зберігається для обох запитів ресурсів.
Поведінка побудови URL:
- Якщо надано
baseUrlвиклику інструмента, він використовується після суворої валідації. - Інакше, якщо налаштовано Plugin
viewerBaseUrl, використовується він. - Без жодного перевизначення URL переглядача за замовчуванням використовує loopback
127.0.0.1. - Якщо режим прив’язки Gateway —
customі встановленоgateway.customBindHost, використовується цей host.
Правила baseUrl:
- Має бути
http://абоhttps://. - Query і hash відхиляються.
- Дозволено origin плюс необов’язковий базовий шлях.
Модель безпеки
Зміцнення захисту переглядача
- За замовчуванням лише loopback.
- Токенізовані шляхи переглядача зі строгою перевіркою ID і токена.
- CSP відповіді переглядача:
default-src 'none'- скрипти й ресурси лише з self
- без вихідного
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
Резервний варіант платформи
Резервне виявлення команди/шляху платформи.
Поширений текст помилки:
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: ...— використовуйте originhttp(s)з необов'язковим шляхом, без query/hash.{field} exceeds maximum size (...)— зменште розмір payload.- Відхилення великого патча — зменште кількість файлів патча або загальну кількість рядків.
Доступність переглядача
- URL переглядача за замовчуванням визначається як
127.0.0.1. - Для сценаріїв віддаленого доступу:
- задайте
viewerBaseUrlPlugin, або - передайте
baseUrlдля кожного виклику інструмента, або - використовуйте
gateway.bind=customіgateway.customBindHost
- задайте
- Якщо
gateway.trustedProxiesмістить loopback для проксі на тому самому хості (наприклад Tailscale Serve), сирі loopback-запити переглядача без перенаправлених заголовків client-IP за задумом завершуються закритою відмовою. - Для такої топології проксі:
- надавайте перевагу
mode: "file"абоmode: "both", коли вам потрібне лише вкладення, або - навмисно увімкніть
security.allowRemoteViewerі задайтеviewerBaseUrlPlugin або передайте проксі/публічнийbaseUrl, коли вам потрібен URL переглядача, яким можна поділитися
- надавайте перевагу
- Увімкніть
security.allowRemoteViewerлише тоді, коли вам потрібен зовнішній доступ до переглядача.
Рядок незмінених рядків не має кнопки розгортання
Це може трапитися для введення патча, коли патч не містить розгортного контексту. Це очікувано й не вказує на збій переглядача.
Артефакт не знайдено
- Термін дії артефакту минув через TTL.
- Токен або шлях змінився.
- Очищення видалило застарілі дані.
Операційні рекомендації
- Надавайте перевагу
mode: "view"для локальних інтерактивних переглядів у полотні. - Надавайте перевагу
mode: "file"для вихідних чат-каналів, яким потрібне вкладення. - Тримайте
allowRemoteViewerвимкненим, якщо ваше розгортання не потребує віддалених URL переглядача. - Задавайте явно короткі
ttlSecondsдля чутливих diff. - Уникайте надсилання секретів у вхідних даних diff, коли це не потрібно.
- Якщо ваш канал агресивно стискає зображення (наприклад Telegram або WhatsApp), надавайте перевагу виводу PDF (
fileFormat: "pdf").