Skip to main content
diffs は、変更前/変更後のテキストまたは unified patch を読み取り専用の差分アーティファクトに変換する、オプションのバンドル Plugin ツールです。また、システムプロンプトの先頭にエージェント向けの短いガイダンスを追加し、より詳しい手順を提供する付属の skill も同梱されています。 入力: before + after テキスト、または unified patch(相互排他)。 出力: canvas 表示用の Gateway ビューアー URL、メッセージ配信用にレンダリングされた PNG/PDF ファイルパス、またはその両方。

クイックスタート

1

Plugin をインストール

2

Plugin を有効化

3

モードを選択

canvas 優先のフロー: エージェントは diffsmode: "view" で呼び出し、details.viewerUrlcanvas present で開きます。

組み込みのシステムガイダンスを無効化

ツールを維持したまま、先頭に追加されるシステムプロンプトのガイダンスを削除するには、plugins.entries.diffs.hooks.allowPromptInjectionfalse に設定します。
これにより、ツールと skill を利用可能な状態に保ちながら、Plugin の before_prompt_build フックがブロックされます。ガイダンスとツールの両方を無効化するには、代わりに Plugin を無効化します。

ツール入力リファレンス

特記がない限り、すべてのフィールドは任意です。
string
元のテキスト。patch を省略する場合、after とともに必須です。
string
更新後のテキスト。patch を省略する場合、before とともに必須です。
string
unified diff テキスト。before および after とは相互排他です。
string
変更前/変更後モードで表示するファイル名。
string
変更前/変更後モードの言語上書きヒント。不明な値やデフォルトのビューアーセットに含まれない言語は、Diff Viewer Language Pack Plugin がインストールされていない限り、プレーンテキストにフォールバックします。
string
ビューアータイトルの上書き。
"view" | "file" | "both"
出力モード。Plugin のデフォルト defaults.modeboth)が使用されます。非推奨のエイリアス: "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"
ビューアーおよび単独ファイル出力のアーティファクト TTL(秒単位)。最大 21600
string
ビューアー URL のオリジンの上書き。Plugin の viewerBaseUrl を上書きします。クエリ/ハッシュを含まない http または https でなければなりません。
  • before/after: それぞれ最大 512 KiB。
  • patch: 最大 2 MiB。
  • path: 最大 2048 バイト。
  • lang: 最大 128 バイト。
  • title: 最大 1024 バイト。
  • パッチ複雑度の上限: 最大 128 ファイル、合計 120000 行。
  • patchbefore/after の併用は拒否されます。
  • レンダリングされるファイルの安全制限(PNG および PDF):
    • fileQuality: "standard": 最大 8 MP(レンダリングされるピクセル数 8,000,000)。
    • fileQuality: "hq": 最大 14 MP。
    • fileQuality: "print": 最大 24 MP。
    • PDF はさらに最大 50 ページに制限されます。

構文ハイライト

組み込み言語: javascripttypescripttsxjsxjsonmarkdownyamlcsshtmlshpythongorustjavaccppcsharpphpsqldockerrubyswiftkotlinrdartluapowershellxml、および toml 一般的なエイリアス(jstsbashmdymlc++dockerfilerbktps1 など)は、これらの言語に正規化されます。 より多くの言語(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 など)に対応するには、Diff Viewer Language Pack Plugin をインストールします。
パックがなくても、未対応の言語は読みやすいプレーンテキストとしてレンダリングされます。アップストリームのカタログについては、Diffs Language Pack Plugin および Shiki の言語 を参照してください。

出力詳細のコントラクト

成功したすべての結果には changed が含まれます。変更前と変更後の入力が同一の場合、アーティファクトを作成せずに false が返され、レンダリングされた結果では true が返されます。
  • changed
  • artifactId
  • viewerUrl
  • viewerPath
  • title
  • expiresAt
  • inputKind
  • fileCount
  • mode
  • context(利用可能な場合は agentIdsessionIdmessageChannelagentAccountId
  • changed
  • artifactId
  • expiresAt
  • filePath
  • path(メッセージツールとの互換性のため、filePath と同じ値)
  • fileBytes
  • fileFormat
  • fileQuality
  • fileScale
  • fileMaxWidth

折りたたまれた未変更セクション

ビューアーには N unmodified lines のような行が表示されます。展開コントロールは、レンダリングされた差分に展開可能なコンテキストデータがある場合にのみ表示されます(通常は変更前/変更後の入力)。多くの unified patch ではハンク内のコンテキスト本体が省略されるため、展開コントロールなしで行が表示されることがあります。これは想定された動作であり、バグではありません。expandUnchanged は、展開可能なコンテキストが存在する場合にのみ適用されます。

複数ファイルのナビゲーション

複数のファイルに変更を加えるパッチは、変更されたファイルの概要カードから始まります。合計 +N / -N 件数、ファイルごとの件数、追加/削除/名前変更のバッジ、および各ファイルへ移動するアンカーリンクが表示されます。レンダリングされた PNG/PDF ファイルではファイルごとのヘッダー件数は維持されますが、静的ファイルでは機能しないため、インタラクティブな表示切り替えは削除されます。

Plugin のデフォルト

Plugin 全体のデフォルトを ~/.openclaw/openclaw.json に設定します。
対応する defaults キー: fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmodettlSeconds。明示的なツール呼び出しパラメーターは、これらを上書きします。

永続的なビューアー URL 設定

string
ツール呼び出しで baseUrl が渡されない場合に返されるビューアーリンク用の、Plugin が所有するフォールバック。クエリ/ハッシュを含まない http または https でなければなりません。

セキュリティ設定

boolean
デフォルト:"false"
false: ビューアールートへの非ループバックリクエストは拒否されます。true: トークン化されたパスが有効な場合、リモートビューアーが許可されます。

アーティファクトのライフサイクルとストレージ

  • ビューアーの HTML とメタデータは、Diffs Plugin の blob 名前空間にある共有 state/openclaw.sqlite データベース内に保存されます。HTML は gzip 圧縮されます。SQLite に保存されるのはランダムな URL トークンの SHA-256 ハッシュのみで、トークン自体は保存されません。
  • レンダリングされた PNG/PDF ファイルは、チャンネル配信にファイルパスが必要なため、$TMPDIR/openclaw-diffs 配下に一時的な実体として残ります。有効期限のメタデータは SQLite が管理し、JSON サイドカーは書き込まれません。
  • デフォルトの成果物 TTL: 30 分。受け入れ可能な最大 TTL: 6 時間。
  • クリーンアップは、成果物を作成する各呼び出しの後に随時実行されます。期限切れの SQLite 行が最初に削除され、続いて対応する PNG/PDF ディレクトリが削除されます。
  • フォールバックのスイープ処理により、対応する行がなく、24 時間を超えて古い一時フォルダーが削除されます。従来の meta.jsonfile-meta.jsonviewer.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(厳密な検証後)-> Plugin の viewerBaseUrl -> loopback のデフォルト 127.0.0.1。Gateway のバインドモードが custom で、gateway.customBindHost が設定されている場合は、loopback の代わりにそのホストが使用されます。 baseUrl のルール: http:// または https:// である必要があります。クエリとハッシュは拒否されます。オリジンにオプションのベースパスを加えた形式が許可されます。

セキュリティモデル

  • デフォルトでは loopback のみ。
  • 厳密な ID およびトークンのパターン検証を伴う、トークン化されたビューアーパス。
  • ビューアーレスポンスの CSP: default-src 'none'。スクリプトとアセットは同一オリジンからのみ許可され、外部への connect-src はありません。
  • リモートアクセスが有効な場合のリモートミスのスロットリング: 60 秒間に 40 回失敗すると、60 秒間ロックアウトされます(429 Too Many Requests)。
  • スクリーンショット用ブラウザーのリクエストルーティングは、デフォルトで拒否されます。
  • http://127.0.0.1/plugins/diffs/assets/* からのローカルビューアーアセットのみが許可されます。
  • 外部ネットワークリクエストはブロックされます。

ファイルモードのブラウザー要件

mode: "file"mode: "both" には Chromium 互換ブラウザーが必要です。 解決順序:
1

設定

OpenClaw 設定内の browser.executablePath
2

環境変数

  • OPENCLAW_BROWSER_EXECUTABLE_PATH
  • BROWSER_EXECUTABLE_PATH
  • PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
3

プラットフォームのフォールバック

Chrome、Chromium、Edge、Brave の一般的なインストールパスと PATH 検索。
一般的なエラーテキスト: Diff PNG/PDF rendering requires a Chromium-compatible browser...。Chrome、Chromium、Edge、Brave のいずれかをインストールするか、上記の実行可能ファイルパスオプションのいずれかを設定して修正します。

トラブルシューティング

  • Provide patch or both before and after text.beforeafter の両方を含めるか、patch を指定してください。
  • Provide either patch or before/after input, not both. — 入力モードを混在させないでください。
  • Invalid baseUrl: ... — オプションのパスを含む http(s) オリジンを使用し、クエリやハッシュは含めないでください。
  • {field} exceeds maximum size (...) — ペイロードサイズを減らしてください。
  • 大きなパッチの拒否 — パッチファイル数または合計行数を減らしてください。
  • ビューアー URL はデフォルトで 127.0.0.1 に解決されます。
  • リモートアクセスには、Plugin の viewerBaseUrl を設定するか、呼び出しごとに baseUrl を渡すか、gateway.bind=customgateway.customBindHost とともに使用します。
  • 同一ホスト上のプロキシ(たとえば Tailscale Serve)のために gateway.trustedProxies に loopback が含まれている場合、転送されたクライアント IP ヘッダーのない直接の loopback ビューアーリクエストは、設計上フェイルクローズします。
  • そのプロキシトポロジでは、添付ファイルには mode: "file"/"both" を優先してください。共有可能なビューアーリンクには、security.allowRemoteViewer に加えて Plugin の viewerBaseUrl/プロキシの baseUrl を意図的に有効化してください。
  • 外部からのビューアーアクセスを意図する場合にのみ、security.allowRemoteViewer を有効にしてください。
展開可能なコンテキストを含まないパッチ入力では想定どおりの動作であり、ビューアーの障害ではありません。
  • TTL により成果物の有効期限が切れました。
  • トークンまたはパスが変更されました。
  • クリーンアップにより古いデータが削除されました。

運用ガイダンス

  • キャンバスでローカルの対話型レビューを行う場合は、mode: "view" を優先してください。
  • 添付ファイルを必要とする外向きのチャットチャンネルには、mode: "file" を優先してください。
  • デプロイでリモートビューアー URL が必要な場合を除き、allowRemoteViewer は無効のままにしてください。
  • 機密性の高い diff には、明示的に短い ttlSeconds を設定してください。
  • 必要でない場合は、diff 入力にシークレットを送信しないでください。
  • チャンネルが画像を強く圧縮する場合(たとえば Telegram や WhatsApp)は、PDF 出力(fileFormat: "pdf")を優先してください。
diff レンダリングエンジンは Diffs を使用しています。

関連項目