Tools
Відмінності
diffs — це необов’язковий інструмент плагіна з короткими вбудованими системними настановами та супровідною навичкою, яка перетворює вміст змін на артефакт diff лише для читання для агентів.
Він приймає або:
- текст
beforeіafter - уніфікований
patch
Він може повернути:
- URL переглядача Gateway для презентації canvas
- шлях до відрендереного файлу (PNG або PDF) для доставки повідомлення
- обидва результати в одному виклику
Коли плагін увімкнено, він додає стислі настанови з використання до простору системного промпта, а також надає детальну навичку для випадків, коли агенту потрібні повніші інструкції.
Швидкий старт
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 увімкненим, але вимкнути його вбудовані настанови системного промпта, встановіть plugins.entries.diffs.hooks.allowPromptInjection у false:
{ plugins: { entries: { diffs: { enabled: true, hooks: { allowPromptInjection: false, }, }, }, },}Це блокує хук before_prompt_build плагіна diffs, залишаючи плагін, інструмент і супровідну навичку доступними.
Якщо потрібно вимкнути і настанови, і інструмент, натомість вимкніть плагін.
Типовий робочий процес агента
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Початковий текст. Обов’язковий разом із after, якщо patch не вказано.
afterstringОновлений текст. Обов’язковий разом із before, якщо patch не вказано.
patchstringТекст уніфікованого diff. Взаємовиключний із before і after.
pathstringІм’я файлу для відображення в режимі before and after.
langstringПідказка перевизначення мови для режиму before and after. Невідомі значення та мови поза стандартним набором переглядача повертаються до звичайного тексту, якщо не встановлено плагін Diff Viewer Language Pack.
titlestringПеревизначення заголовка переглядача.
mode"view" | "file" | "both"Режим виводу. За замовчуванням використовується стандартне значення плагіна defaults.mode. Застарілий псевдонім: "image" поводиться як "file" і досі приймається для зворотної сумісності.
theme"light" | "dark"Тема переглядача. За замовчуванням використовується стандартне значення плагіна defaults.theme.
layout"unified" | "split"Макет diff. За замовчуванням використовується стандартне значення плагіна defaults.layout.
expandUnchangedbooleanРозгортати незмінені розділи, коли доступний повний контекст. Лише параметр окремого виклику (не ключ стандартних значень плагіна).
fileFormat"png" | "pdf"Формат відрендереного файлу. За замовчуванням використовується стандартне значення плагіна defaults.fileFormat.
fileQuality"standard" | "hq" | "print"Пресет якості для рендерингу PNG або PDF.
fileScalenumberПеревизначення масштабу пристрою (1-4).
fileMaxWidthnumberМаксимальна ширина рендерингу в CSS-пікселях (640-2400).
ttlSecondsnumberdefault: 1800TTL артефакту в секундах для вихідних даних переглядача та окремого файлу. Максимум 21600.
baseUrlstringПеревизначення origin URL переглядача. Перевизначає viewerBaseUrl плагіна. Має бути 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 Language Pack, щоб підсвічувати інші мови:
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 Language Pack для деталей і мови Shiki для upstream-каталогу мов і псевдонімів 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 має розгортані контекстні дані, що типово для вхідних даних до і після.
- Для багатьох вхідних даних unified patch пропущені тіла контексту недоступні в розібраних hunks патча, тому рядок може з’явитися без елементів керування розгортанням. Це очікувана поведінка.
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/plugins/diffs-language-pack/assets/viewer.js, коли diff використовує мову з Diff Viewer Language Pack
Документ переглядача розв’язує ці ресурси відносно URL переглядача, тому необов’язковий префікс шляху baseUrl також зберігається для обох запитів ресурсів.
Поведінка побудови URL:
- Якщо надано
baseUrlвиклику інструмента, він використовується після суворої перевірки. - Інакше, якщо налаштовано
viewerBaseUrlPlugin, він використовується. - Без жодного перевизначення URL переглядача типово вказує на loopback
127.0.0.1. - Якщо режим прив’язування Gateway дорівнює
customі встановленоgateway.customBindHost, використовується цей хост.
Правила 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.- Відхилення великого patch — зменште кількість файлів patch або загальну кількість рядків.
Доступність переглядача
- URL переглядача типово розв’язується в
127.0.0.1. - Для сценаріїв віддаленого доступу:
- задайте
viewerBaseUrlPlugin, або - передайте
baseUrlдля кожного виклику інструмента, або - використовуйте
gateway.bind=customіgateway.customBindHost
- задайте
- Якщо
gateway.trustedProxiesмістить loopback для проксі на тому самому хості (наприклад Tailscale Serve), прямі loopback-запити переглядача без пересланих заголовків client-IP за проєктом завершуються fail closed. - Для такої топології проксі:
- віддавайте перевагу
mode: "file"абоmode: "both", коли потрібне лише вкладення, або - навмисно ввімкніть
security.allowRemoteViewerі задайтеviewerBaseUrlPlugin або передайте проксі/публічнийbaseUrl, коли потрібен URL переглядача, яким можна поділитися
- віддавайте перевагу
- Вмикайте
security.allowRemoteViewerлише тоді, коли ви маєте намір надати зовнішній доступ до переглядача.
Рядок незмінених рядків не має кнопки розгортання
Це може статися для вводу patch, коли patch не містить контексту, який можна розгорнути. Це очікувано й не вказує на збій переглядача.
Артефакт не знайдено
- Термін дії артефакту минув через TTL.
- Токен або шлях змінився.
- Очищення видалило застарілі дані.
Операційні рекомендації
- Віддавайте перевагу
mode: "view"для локальних інтерактивних оглядів у canvas. - Віддавайте перевагу
mode: "file"для вихідних чат-каналів, яким потрібне вкладення. - Тримайте
allowRemoteViewerвимкненим, якщо ваш deployment не потребує віддалених URL переглядача. - Задавайте явний короткий
ttlSecondsдля чутливих diff. - Уникайте надсилання секретів у ввід diff, коли це не потрібно.
- Якщо ваш канал агресивно стискає зображення (наприклад Telegram або WhatsApp), віддавайте перевагу PDF-виводу (
fileFormat: "pdf").