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 도구입니다.
다음 중 하나를 입력으로 받을 수 있습니다.
before및after텍스트- 통합
patch
- 캔버스 표시용 Gateway 뷰어 URL
- 메시지 전달용 렌더링된 파일 경로(PNG 또는 PDF)
- 한 번의 호출로 두 출력 모두
빠른 시작
내장 시스템 지침 비활성화
diffs 도구는 활성화한 상태로 유지하되 내장 시스템 프롬프트 지침을 비활성화하려면 plugins.entries.diffs.hooks.allowPromptInjection을 false로 설정합니다.
before_prompt_build 훅이 차단되지만 Plugin, 도구, 동반 Skills는 계속 사용할 수 있습니다.
지침과 도구를 모두 비활성화하려면 대신 Plugin을 비활성화합니다.
일반적인 에이전트 워크플로
입력 예시
- 이전 및 이후
- 패치
도구 입력 참조
별도로 명시되지 않은 모든 필드는 선택 사항입니다.원본 텍스트입니다.
patch가 생략된 경우 after와 함께 필요합니다.업데이트된 텍스트입니다.
patch가 생략된 경우 before와 함께 필요합니다.통합 diff 텍스트입니다.
before 및 after와 함께 사용할 수 없습니다.이전 및 이후 모드에 표시할 파일 이름입니다.
이전 및 이후 모드의 언어 재정의 힌트입니다. 알 수 없는 값은 일반 텍스트로 대체됩니다.
뷰어 제목 재정의입니다.
출력 모드입니다. 기본값은 Plugin 기본값
defaults.mode입니다. 사용 중단된 별칭: "image"는 "file"처럼 동작하며 하위 호환성을 위해 계속 허용됩니다.뷰어 테마입니다. 기본값은 Plugin 기본값
defaults.theme입니다.diff 레이아웃입니다. 기본값은 Plugin 기본값
defaults.layout입니다.전체 컨텍스트를 사용할 수 있을 때 변경되지 않은 섹션을 확장합니다. 호출별 옵션만 해당합니다(Plugin 기본 키가 아님).
렌더링된 파일 형식입니다. 기본값은 Plugin 기본값
defaults.fileFormat입니다.PNG 또는 PDF 렌더링용 품질 프리셋입니다.
디바이스 배율 재정의입니다(
1-4).CSS 픽셀 단위의 최대 렌더링 너비입니다(
640-2400).뷰어 및 독립 실행형 파일 출력의 아티팩트 TTL(초)입니다. 최대값은 21600입니다.
뷰어 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바이트입니다.- 패치 복잡도 상한: 최대 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에 확장 가능한 컨텍스트 데이터가 있을 때 나타나며, 이는 이전 및 이후 입력에서 일반적입니다.
- 많은 통합 패치 입력의 경우 생략된 컨텍스트 본문을 파싱된 패치 hunk에서 사용할 수 없으므로, 확장 컨트롤 없이 행이 나타날 수 있습니다. 이는 예상된 동작입니다.
expandUnchanged는 확장 가능한 컨텍스트가 있을 때만 적용됩니다.
Plugin 기본값
~/.openclaw/openclaw.json에서 Plugin 전체 기본값을 설정합니다.
fontFamilyfontSizelineSpacinglayoutshowLineNumbersdiffIndicatorswordWrapbackgroundthemefileFormatfileQualityfileScalefileMaxWidthmodettlSeconds
영구 뷰어 URL 설정
도구 호출에서
baseUrl을 전달하지 않을 때 반환되는 뷰어 링크에 대한 Plugin 소유 fallback입니다. http 또는 https여야 하며 query/hash가 없어야 합니다.보안 설정
false: 뷰어 경로에 대한 non-loopback 요청이 거부됩니다. true: 토큰화된 경로가 유효하면 원격 뷰어가 허용됩니다.아티팩트 수명 주기 및 저장소
- 아티팩트는 임시 하위 폴더
$TMPDIR/openclaw-diffs아래에 저장됩니다. - 뷰어 아티팩트 메타데이터에는 다음이 포함됩니다.
- 임의 아티팩트 ID(20개의 16진수 문자)
- 임의 토큰(48개의 16진수 문자)
createdAt및expiresAt- 저장된
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
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 호환 브라우저가 필요합니다.
해결 순서:
일반적인 실패 텍스트:
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로 확인됩니다. - 원격 액세스 시나리오에서는 다음 중 하나를 사용하세요.
- Plugin
viewerBaseUrl설정, 또는 - 도구 호출마다
baseUrl전달, 또는 gateway.bind=custom및gateway.customBindHost사용
- Plugin
gateway.trustedProxies에 동일 호스트 프록시(예: Tailscale Serve)에 대한 루프백이 포함된 경우, 전달된 클라이언트 IP 헤더가 없는 원시 루프백 뷰어 요청은 설계상 실패하도록 닫힙니다.- 해당 프록시 토폴로지의 경우:
- 첨부 파일만 필요한 경우
mode: "file"또는mode: "both"를 선호하거나, - 공유 가능한 뷰어 URL이 필요한 경우 의도적으로
security.allowRemoteViewer를 활성화하고 PluginviewerBaseUrl을 설정하거나 프록시/공개baseUrl을 전달하세요.
- 첨부 파일만 필요한 경우
- 외부 뷰어 액세스를 의도하는 경우에만
security.allowRemoteViewer를 활성화하세요.
수정되지 않은 줄 행에 펼치기 버튼이 없음
수정되지 않은 줄 행에 펼치기 버튼이 없음
패치 입력에서 패치가 펼칠 수 있는 컨텍스트를 포함하지 않을 때 발생할 수 있습니다. 이는 예상된 동작이며 뷰어 실패를 의미하지 않습니다.
아티팩트를 찾을 수 없음
아티팩트를 찾을 수 없음
- TTL로 인해 아티팩트가 만료되었습니다.
- 토큰 또는 경로가 변경되었습니다.
- 정리가 오래된 데이터를 제거했습니다.
운영 지침
- 캔버스에서 로컬 대화형 검토에는
mode: "view"를 선호하세요. - 첨부 파일이 필요한 아웃바운드 채팅 채널에는
mode: "file"을 선호하세요. - 배포에 원격 뷰어 URL이 필요하지 않으면
allowRemoteViewer를 비활성화 상태로 유지하세요. - 민감한 diff에는 명시적으로 짧은
ttlSeconds를 설정하세요. - 필요하지 않은 경우 diff 입력에 비밀 정보를 보내지 마세요.
- 채널이 이미지를 강하게 압축하는 경우(예: Telegram 또는 WhatsApp) PDF 출력(
fileFormat: "pdf")을 선호하세요.
Diff 렌더링 엔진은 Diffs에서 제공합니다.