diffs は、短い組み込みシステム ガイダンスと、変更内容をエージェント向けの読み取り専用の差分アーティファクトに変換するコンパニオン スキルを備えたオプションのプラグイン ツールです。
次のいずれかを受け入れます。
beforeおよびafterテキスト- 統一された
patch
- キャンバス プレゼンテーション用のゲートウェイ ビューア URL
- メッセージ配信用にレンダリングされたファイル パス (PNG または PDF)
- 1 回の呼び出しで両方の出力
クイックスタート
- プラグインを有効にします。
- キャンバスファーストフローの場合は、
diffsをmode: "view"とともに呼び出します。 - チャット ファイル配信フローのために、
diffsをmode: "file"とともに呼び出します。 - 両方のアーティファクトが必要な場合は、
diffsをmode: "both"とともに呼び出します。
プラグインを有効にする
組み込みのシステム ガイダンスを無効にする
diffs ツールを有効にしたまま、組み込みのシステム プロンプト ガイダンスを無効にする場合は、 plugins.entries.diffs.hooks.allowPromptInjection を false に設定します。
before_prompt_build フックがブロックされます。
ガイダンスとツールの両方を無効にしたい場合は、代わりにプラグインを無効にしてください。
一般的なエージェントのワークフロー1. エージェントが diffs に電話します
- エージェントは
detailsフィールドを読み取ります。 - エージェントは次のいずれかを行います。
details.viewerUrlをcanvas presentで開きますpathまたはfilePathを使用して、details.filePathをmessageとともに送信します- 両方を行います
入力例
前後:ツール入力リファレンス
注記がない限り、すべてのフィールドはオプションです。-before (string): オリジナルのテキスト。 patch が省略された場合は、after で必須です。
after(string): テキストを更新しました。patchが省略された場合は、beforeで必須です。patch(string): 統合された差分テキスト。beforeおよびafterとは相互に排他的です。path(string): モード前後のファイル名を表示します。lang(string): モードの前後の言語オーバーライドのヒント。title(string): ビューアのタイトルの上書き。mode("view" | "file" | "both"): 出力モード。デフォルトはプラグインのデフォルトdefaults.modeです。theme("light" | "dark"): ビューアのテーマ。デフォルトはプラグインのデフォルトdefaults.themeです。layout("unified" | "split"): 差分レイアウト。デフォルトはプラグインのデフォルトdefaults.layoutです。expandUnchanged(boolean): 完全なコンテキストが利用可能な場合、未変更のセクションを展開します。呼び出しごとのオプションのみ (プラグインのデフォルト キーではありません)。fileFormat("png" | "pdf"): レンダリングされたファイル形式。デフォルトはプラグインのデフォルトdefaults.fileFormatです。fileQuality("standard" | "hq" | "print"): PNG または PDF レンダリング用の品質プリセット。fileScale(number): デバイス スケール オーバーライド (1-4)。-fileMaxWidth(number): CSS ピクセル単位の最大レンダリング幅 (640-2400)。ttlSeconds(number): 秒単位のビューア アーティファクト TTL。デフォルトは 1800、最大は 21600。baseUrl(string): ビューア URL オリジン オーバーライド。httpまたはhttpsである必要があり、クエリ/ハッシュはありません。
beforeおよびafterはそれぞれ最大 512 KiB。patch最大 2 MiB。path最大 2048 バイト。lang最大 128 バイト。title最大 1024 バイト。- パッチの複雑さの上限: 最大 128 ファイル、合計 120,000 行。
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 の下に構造化メタデータを返します。
ビューアを作成するモードの共有フィールド:
artifactIdviewerUrlviewerPathtitleexpiresAtinputKindfileCountmode
filePath
path(メッセージ ツールの互換性のため、filePathと同じ値)fileBytesfileFormatfileQualityfileScalefileMaxWidth
mode: "view": ビューア フィールドのみ。mode: "file": ファイル フィールドのみ。ビューア アーティファクトなし。mode: "both": ビューア フィールドとファイル フィールド。ファイルのレンダリングが失敗した場合でも、ビューアはfileErrorを返します。
未変更のセクションを折りたたんだ
- ビューアは
N unmodified linesのような行を表示できます。 - これらの行の展開コントロールは条件付きであり、すべての入力種類に対して保証されているわけではありません。
- レンダリングされた差分に展開可能なコンテキスト データがある場合、展開コントロールが表示されます。これは入力の前後で一般的です。
- 多くの統合パッチ入力では、解析されたパッチ ハンクでは省略されたコンテキスト本体を使用できないため、展開コントロールなしで行が表示されることがあります。これは予期された動作です。
expandUnchangedは、拡張可能なコンテキストが存在する場合にのみ適用されます。
プラグインのデフォルト
~/.openclaw/openclaw.json でプラグイン全体のデフォルトを設定します。
fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmode
security.allowRemoteViewer(boolean、デフォルトfalse)false: ビューア ルートへの非ループバック リクエストは拒否されます。true: トークン化されたパスが有効な場合、リモート ビューアが許可されます。
アーティファクトのライフサイクルとストレージ
- アーティファクトは、temp サブフォルダー
$TMPDIR/openclaw-diffsに保存されます。 - ビューア アーティファクト メタデータには次のものが含まれます。
- ランダムなアーティファクト ID (20 の 16 進数文字)
- ランダムなトークン (48 個の 16 進数文字)
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
baseUrlが指定された場合は、厳密な検証後に使用されます。baseUrlを使用しない場合、ビューア URL はデフォルトでループバック127.0.0.1になります。- ゲートウェイ バインド モードが
customで、gateway.customBindHostが設定されている場合、そのホストが使用されます。
baseUrl ルール:
http://またはhttps://である必要があります。- クエリとハッシュは拒否されます。
- 原点とオプションのベース パスが許可されます。
セキュリティモデルビューアの強化
- デフォルトではループバックのみ。
- 厳密な 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 互換のブラウザが必要です。
解決順序:
- OpenClaw 構成の
browser.executablePath。 - 環境変数:
OPENCLAW_BROWSER_EXECUTABLE_PATHBROWSER_EXECUTABLE_PATHPLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH
- プラットフォーム コマンド/パス検出フォールバック。
Diff PNG/PDF rendering requires a Chromium-compatible browser...
トラブルシューティング
入力検証エラー:-
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に解決されます。 -
リモート アクセス シナリオの場合は、次のいずれかを実行します。
- ツール呼び出しごとに
baseUrlを渡す、または gateway.bind=customおよびgateway.customBindHostを使用します
- ツール呼び出しごとに
-
外部ビューア アクセスを目的とする場合にのみ、
security.allowRemoteViewerを有効にします。
- これは、パッチが展開可能なコンテキストを持たないパッチ入力で発生する可能性があります。
- これは予期されたものであり、ビューアの障害を示すものではありません。
- TTL によりアーティファクトの有効期限が切れました。
- トークンまたはパスが変更されました。
- クリーンアップにより古いデータが削除されました。
操作ガイド
- キャンバスでのローカルのインタラクティブなレビューには
mode: "view"を優先します。 - 添付ファイルが必要なアウトバウンド チャット チャネルには
mode: "file"を優先します。 - 展開でリモート ビューア URL が必要な場合を除き、
allowRemoteViewerを無効にしておきます。 - 機密差分には明示的な短い
ttlSecondsを設定します。 - 必要がない場合は、差分入力でシークレットを送信しないようにします。
- チャネルが画像を積極的に圧縮する場合 (Telegram や WhatsApp など)、PDF 出力 (
fileFormat: "pdf") を優先します。
- 差分 を利用しています。