메인 콘텐츠로 건너뛰기

Documentation Index

Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

diffs는 짧은 내장 시스템 지침과 변경 내용을 에이전트를 위한 읽기 전용 diff 아티팩트로 변환하는 동반 Skills를 제공하는 선택적 Plugin 도구입니다. 다음 중 하나를 입력으로 받을 수 있습니다.
  • beforeafter 텍스트
  • 통합 patch
다음을 반환할 수 있습니다.
  • 캔버스 표시용 Gateway 뷰어 URL
  • 메시지 전달용 렌더링된 파일 경로(PNG 또는 PDF)
  • 한 번의 호출로 두 출력 모두
활성화되면 Plugin은 간결한 사용 지침을 시스템 프롬프트 공간 앞에 추가하고, 에이전트가 더 자세한 지침이 필요할 때 사용할 수 있는 상세 Skills도 노출합니다.

빠른 시작

1

Plugin 설치

openclaw plugins install diffs
2

Plugin 활성화

{
  plugins: {
    entries: {
      diffs: {
        enabled: true,
      },
    },
  },
}
3

모드 선택

캔버스 우선 플로우: 에이전트는 mode: "view"diffs를 호출하고 canvas presentdetails.viewerUrl을 엽니다.

내장 시스템 지침 비활성화

diffs 도구는 활성화한 상태로 유지하되 내장 시스템 프롬프트 지침을 비활성화하려면 plugins.entries.diffs.hooks.allowPromptInjectionfalse로 설정합니다.
{
  plugins: {
    entries: {
      diffs: {
        enabled: true,
        hooks: {
          allowPromptInjection: false,
        },
      },
    },
  },
}
이렇게 하면 diffs Plugin의 before_prompt_build 훅이 차단되지만 Plugin, 도구, 동반 Skills는 계속 사용할 수 있습니다. 지침과 도구를 모두 비활성화하려면 대신 Plugin을 비활성화합니다.

일반적인 에이전트 워크플로

1

diffs 호출

에이전트가 입력으로 diffs 도구를 호출합니다.
2

details 읽기

에이전트가 응답에서 details 필드를 읽습니다.
3

표시

에이전트는 canvas presentdetails.viewerUrl을 열거나, path 또는 filePath를 사용해 messagedetails.filePath를 보내거나, 둘 다 수행합니다.

입력 예시

{
  "before": "# Hello\n\nOne",
  "after": "# Hello\n\nTwo",
  "path": "docs/example.md",
  "mode": "view"
}

도구 입력 참조

별도로 명시되지 않은 모든 필드는 선택 사항입니다.
before
string
원본 텍스트입니다. patch가 생략된 경우 after와 함께 필요합니다.
after
string
업데이트된 텍스트입니다. patch가 생략된 경우 before와 함께 필요합니다.
patch
string
통합 diff 텍스트입니다. beforeafter와 함께 사용할 수 없습니다.
path
string
이전 및 이후 모드에 표시할 파일 이름입니다.
lang
string
이전 및 이후 모드의 언어 재정의 힌트입니다. 알 수 없는 값은 일반 텍스트로 대체됩니다.
title
string
뷰어 제목 재정의입니다.
mode
"view" | "file" | "both"
출력 모드입니다. 기본값은 Plugin 기본값 defaults.mode입니다. 사용 중단된 별칭: "image""file"처럼 동작하며 하위 호환성을 위해 계속 허용됩니다.
theme
"light" | "dark"
뷰어 테마입니다. 기본값은 Plugin 기본값 defaults.theme입니다.
layout
"unified" | "split"
diff 레이아웃입니다. 기본값은 Plugin 기본값 defaults.layout입니다.
expandUnchanged
boolean
전체 컨텍스트를 사용할 수 있을 때 변경되지 않은 섹션을 확장합니다. 호출별 옵션만 해당합니다(Plugin 기본 키가 아님).
fileFormat
"png" | "pdf"
렌더링된 파일 형식입니다. 기본값은 Plugin 기본값 defaults.fileFormat입니다.
fileQuality
"standard" | "hq" | "print"
PNG 또는 PDF 렌더링용 품질 프리셋입니다.
fileScale
number
디바이스 배율 재정의입니다(1-4).
fileMaxWidth
number
CSS 픽셀 단위의 최대 렌더링 너비입니다(640-2400).
ttlSeconds
number
기본값:"1800"
뷰어 및 독립 실행형 파일 출력의 아티팩트 TTL(초)입니다. 최대값은 21600입니다.
baseUrl
string
뷰어 URL 원본 재정의입니다. Plugin viewerBaseUrl을 재정의합니다. http 또는 https여야 하며 query/hash가 없어야 합니다.
하위 호환성을 위해 계속 허용됩니다.
  • format -> fileFormat
  • imageFormat -> fileFormat
  • imageQuality -> fileQuality
  • imageScale -> fileScale
  • imageMaxWidth -> fileMaxWidth
  • beforeafter는 각각 최대 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(렌더링된 픽셀 14,000,000개).
    • fileQuality: "print": 최대 24 MP(렌더링된 픽셀 24,000,000개).
    • PDF는 최대 50페이지 제한도 있습니다.

출력 details 계약

도구는 details 아래에 구조화된 메타데이터를 반환합니다.
뷰어를 생성하는 모드의 공유 필드:
  • artifactId
  • viewerUrl
  • viewerPath
  • title
  • expiresAt
  • inputKind
  • fileCount
  • mode
  • context(사용 가능한 경우 agentId, sessionId, messageChannel, agentAccountId)
PNG 또는 PDF가 렌더링될 때의 파일 필드:
  • artifactId
  • expiresAt
  • filePath
  • path(메시지 도구 호환성을 위해 filePath와 같은 값)
  • fileBytes
  • fileFormat
  • fileQuality
  • fileScale
  • fileMaxWidth
기존 호출자용으로도 반환됩니다.
  • format(fileFormat과 같은 값)
  • imagePath(filePath와 같은 값)
  • imageBytes(fileBytes와 같은 값)
  • imageQuality(fileQuality와 같은 값)
  • imageScale(fileScale과 같은 값)
  • imageMaxWidth(fileMaxWidth와 같은 값)
모드 동작 요약:
모드반환되는 항목
"view"뷰어 필드만 반환됩니다.
"file"파일 필드만 반환되며, 뷰어 아티팩트는 없습니다.
"both"뷰어 필드와 파일 필드를 함께 반환합니다. 파일 렌더링이 실패하면 뷰어는 fileErrorimageError 별칭과 함께 계속 반환됩니다.

접힌 변경되지 않은 섹션

  • 뷰어는 N unmodified lines와 같은 행을 표시할 수 있습니다.
  • 해당 행의 확장 컨트롤은 조건부이며 모든 입력 종류에서 보장되지는 않습니다.
  • 확장 컨트롤은 렌더링된 diff에 확장 가능한 컨텍스트 데이터가 있을 때 나타나며, 이는 이전 및 이후 입력에서 일반적입니다.
  • 많은 통합 패치 입력의 경우 생략된 컨텍스트 본문을 파싱된 패치 hunk에서 사용할 수 없으므로, 확장 컨트롤 없이 행이 나타날 수 있습니다. 이는 예상된 동작입니다.
  • expandUnchanged는 확장 가능한 컨텍스트가 있을 때만 적용됩니다.

Plugin 기본값

~/.openclaw/openclaw.json에서 Plugin 전체 기본값을 설정합니다.
{
  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,
          },
        },
      },
    },
  },
}
지원되는 기본값:
  • fontFamily
  • fontSize
  • lineSpacing
  • layout
  • showLineNumbers
  • diffIndicators
  • wordWrap
  • background
  • theme
  • fileFormat
  • fileQuality
  • fileScale
  • fileMaxWidth
  • mode
  • ttlSeconds
명시적 도구 매개변수는 이러한 기본값을 재정의합니다.

영구 뷰어 URL 설정

viewerBaseUrl
string
도구 호출에서 baseUrl을 전달하지 않을 때 반환되는 뷰어 링크에 대한 Plugin 소유 fallback입니다. http 또는 https여야 하며 query/hash가 없어야 합니다.
{
  plugins: {
    entries: {
      diffs: {
        enabled: true,
        config: {
          viewerBaseUrl: "https://gateway.example.com/openclaw",
        },
      },
    },
  },
}

보안 설정

security.allowRemoteViewer
boolean
기본값:"false"
false: 뷰어 경로에 대한 non-loopback 요청이 거부됩니다. true: 토큰화된 경로가 유효하면 원격 뷰어가 허용됩니다.
{
  plugins: {
    entries: {
      diffs: {
        enabled: true,
        config: {
          security: {
            allowRemoteViewer: false,
          },
        },
      },
    },
  },
}

아티팩트 수명 주기 및 저장소

  • 아티팩트는 임시 하위 폴더 $TMPDIR/openclaw-diffs 아래에 저장됩니다.
  • 뷰어 아티팩트 메타데이터에는 다음이 포함됩니다.
    • 임의 아티팩트 ID(20개의 16진수 문자)
    • 임의 토큰(48개의 16진수 문자)
    • createdAtexpiresAt
    • 저장된 viewer.html 경로
  • 지정하지 않으면 기본 아티팩트 TTL은 30분입니다.
  • 허용되는 최대 뷰어 TTL은 6시간입니다.
  • 정리는 아티팩트 생성 후 기회적으로 실행됩니다.
  • 만료된 아티팩트는 삭제됩니다.
  • 메타데이터가 없는 경우 fallback 정리는 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은 local loopback 127.0.0.1을 기본값으로 사용합니다.
  • Gateway 바인드 모드가 custom이고 gateway.customBindHost가 설정되어 있으면 해당 호스트가 사용됩니다.
baseUrl 규칙:
  • http:// 또는 https://여야 합니다.
  • Query와 hash는 거부됩니다.
  • Origin과 선택적 기본 경로가 허용됩니다.

보안 모델

  • 기본적으로 루프백 전용입니다.
  • 엄격한 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

플랫폼 대체 경로

플랫폼 명령/경로 검색 대체 경로입니다.
일반적인 실패 텍스트:
  • 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 사용
  • gateway.trustedProxies에 동일 호스트 프록시(예: Tailscale Serve)에 대한 루프백이 포함된 경우, 전달된 클라이언트 IP 헤더가 없는 원시 루프백 뷰어 요청은 설계상 실패하도록 닫힙니다.
  • 해당 프록시 토폴로지의 경우:
    • 첨부 파일만 필요한 경우 mode: "file" 또는 mode: "both"를 선호하거나,
    • 공유 가능한 뷰어 URL이 필요한 경우 의도적으로 security.allowRemoteViewer를 활성화하고 Plugin viewerBaseUrl을 설정하거나 프록시/공개 baseUrl을 전달하세요.
  • 외부 뷰어 액세스를 의도하는 경우에만 security.allowRemoteViewer를 활성화하세요.
패치 입력에서 패치가 펼칠 수 있는 컨텍스트를 포함하지 않을 때 발생할 수 있습니다. 이는 예상된 동작이며 뷰어 실패를 의미하지 않습니다.
  • TTL로 인해 아티팩트가 만료되었습니다.
  • 토큰 또는 경로가 변경되었습니다.
  • 정리가 오래된 데이터를 제거했습니다.

운영 지침

  • 캔버스에서 로컬 대화형 검토에는 mode: "view"를 선호하세요.
  • 첨부 파일이 필요한 아웃바운드 채팅 채널에는 mode: "file"을 선호하세요.
  • 배포에 원격 뷰어 URL이 필요하지 않으면 allowRemoteViewer를 비활성화 상태로 유지하세요.
  • 민감한 diff에는 명시적으로 짧은 ttlSeconds를 설정하세요.
  • 필요하지 않은 경우 diff 입력에 비밀 정보를 보내지 마세요.
  • 채널이 이미지를 강하게 압축하는 경우(예: Telegram 또는 WhatsApp) PDF 출력(fileFormat: "pdf")을 선호하세요.
Diff 렌더링 엔진은 Diffs에서 제공합니다.

관련 항목