Matrix (플러그인)
Matrix는 개방형 탈중앙화 메시징 프로토콜입니다. OpenClaw는 모든 홈서버에서 Matrix 사용자로 연결되므로, 봇을 위한 Matrix 계정이 필요합니다. 로그인하면, 봇에게 직접 DM을 보내거나 방(Matrix "그룹")에 초대할 수 있습니다. Beeper도 유효한 클라이언트 옵션이지만, E2EE를 활성화해야 합니다.
상태: 플러그인을 통해 지원됩니다(@vector-im/matrix-bot-sdk). 다이렉트 메시지, 방, 스레드, 미디어, 반응, 투표(전송 + poll-start를 텍스트로), 위치, E2EE(암호화 지원 포함)가 지원됩니다.
플러그인 필요
Matrix는 플러그인으로 제공되며 코어 설치에 번들되지 않습니다.
CLI를 통해 설치 (npm 레지스트리):
openclaw plugins install @openclaw/matrix
로컬 체크아웃 (git 저장소에서 실행 시):
openclaw plugins install ./extensions/matrix
구성/온보딩 중에 Matrix를 선택하고 git 체크아웃이 감지되면, OpenClaw가 자동으로 로컬 설치 경로를 제공합니다.
자세한 내용: Plugins
설정
-
Matrix 플러그인을 설치합니다:
- npm에서: openclaw plugins install @openclaw/matrix
- 로컬 체크아웃에서: openclaw plugins install ./extensions/matrix
-
홈서버에서 Matrix 계정을 생성합니다:
- https://matrix.org/ecosystem/hosting/에서 호스팅 옵션을 찾아보세요
- 또는 직접 호스팅하세요.
-
봇 계정의 액세스 토큰을 가져옵니다:
- 홈서버에서 curl로 Matrix 로그인 API를 사용합니다:
curl --request POST \ --url https://matrix.example.org/_matrix/client/v3/login \ --header 'Content-Type: application/json' \ --data '{ "type": "m.login.password", "identifier": { "type": "m.id.user", "user": "your-user-name" }, "password": "your-password" }'- matrix.example.org를 홈서버 URL로 교체합니다.
- 또는 channels.matrix.userId + channels.matrix.password를 설정합니다: OpenClaw가 동일한 로그인 엔드포인트를 호출하여 액세스 토큰을 ~/.openclaw/credentials/matrix/credentials.json에 저장하고, 다음 시작 시 재사용합니다.
-
자격 증명을 구성합니다:
- 환경 변수: MATRIX_HOMESERVER, MATRIX_ACCESS_TOKEN (또는 MATRIX_USER_ID + MATRIX_PASSWORD)
- 또는 설정: channels.matrix.*
- 둘 다 설정되면, 설정이 우선합니다.
- 액세스 토큰 사용 시: 사용자 ID는 /whoami를 통해 자동으로 가져옵니다.
- 설정 시, channels.matrix.userId는 전체 Matrix ID여야 합니다(예: @bot:example.org).
-
Gateway를 재시작합니다(또는 온보딩을 완료합니다).
-
모든 Matrix 클라이언트(Element, Beeper 등; https://matrix.org/ecosystem/clients/ 참조)에서 봇과 DM을 시작하거나 방에 초대합니다. Beeper는 E2EE가 필요하므로, channels.matrix.encryption: true로 설정하고 디바이스를 검증합니다.
최소 설정 (액세스 토큰, 사용자 ID 자동 가져오기):
{
channels: {
matrix: {
enabled: true,
homeserver: "https://matrix.example.org",
accessToken: "syt_***",
dm: { policy: "pairing" }
}
}
}
E2EE 설정 (종단간 암호화 활성화):
{
channels: {
matrix: {
enabled: true,
homeserver: "https://matrix.example.org",
accessToken: "syt_***",
encryption: true,
dm: { policy: "pairing" }
}
}
}
암호화 (E2EE)
종단간 암호화는 Rust crypto SDK를 통해 지원됩니다.
channels.matrix.encryption: true로 활성화:
- crypto 모듈이 로드되면, 암호화된 방이 자동으로 복호화됩니다.
- 암호화된 방으로 전송 시 아웃바운드 미디어가 암호화됩니다.
- 첫 연결 시, OpenClaw는 다른 세션에서 디바이스 검증을 요청합니다.
- 키 공유를 활성화하려면 다른 Matrix 클라이언트(Element 등)에서 디바이스를 검증합니다.
- crypto 모듈을 로드할 수 없으면, E2EE가 비활성화되고 암호화된 방이 복호화되지 않으며, OpenClaw가 경고를 로깅합니다.
- crypto 모듈 누락 오류가 표시되면(예: @matrix-org/matrix-sdk-crypto-nodejs-*), @matrix-org/matrix-sdk-crypto-nodejs에 대한 빌드 스크립트를 허용하고 pnpm rebuild @matrix-org/matrix-sdk-crypto-nodejs를 실행하거나 node node_modules/@matrix-org/matrix-sdk-crypto-nodejs/download-lib.js로 바이너리를 가져옵니다.
Crypto 상태는 계정 + 액세스 토큰별로 ~/.openclaw/matrix/accounts/<account>/<homeserver>__<user>/<token-hash>/crypto/ (SQLite 데이터베이스)에 저장됩니다. 동기화 상태는 그 옆의 bot-storage.json에 있습니다. 액세스 토큰(디바이스)이 변경되면, 새 저장소가 생성되고 암호화된 방에 대해 봇을 다시 검증해야 합니다.
디바이스 검증: E2EE가 활성화되면, 봇은 시작 시 다른 세션에서 검증을 요청합니다. Element(또는 다른 클라이언트)를 열고 검증 요청을 승인하여 신뢰를 설정합니다. 검증되면, 봇이 암호화된 방에서 메시지를 복호화할 수 있습니다.
라우팅 모델
- 응답은 항상 Matrix로 돌아갑니다.
- DM은 에이전트의 메인 세션을 공유하며, 방은 그룹 세션으로 매핑됩니다.
접근 제어 (DM)
- 기본값: channels.matrix.dm.policy = "pairing". 알 수 없는 발신자는 페어링 코드를 받습니다.
- 승인 방법:
- openclaw pairing list matrix
- openclaw pairing approve matrix <CODE>
- 공개 DM: channels.matrix.dm.policy="open" 및 channels.matrix.dm.allowFrom=["*"].
- channels.matrix.dm.allowFrom은 사용자 ID 또는 표시 이름을 허용합니다. 마법사는 디렉토리 검색이 가능한 경우 표시 이름을 사용자 ID로 해석합니다.
방 (그룹)
- 기본값: channels.matrix.groupPolicy = "allowlist" (멘션 게이팅). 설정되지 않은 경우 channels.defaults.groupPolicy로 기본값을 재정의합니다.
- channels.matrix.groups로 방을 허용목록에 추가합니다(방 ID, 별칭 또는 이름):
{
channels: {
matrix: {
groupPolicy: "allowlist",
groups: {
"!roomId:example.org": { allow: true },
"#alias:example.org": { allow: true }
},
groupAllowFrom: ["@owner:example.org"]
}
}
}
- requireMention: false는 해당 방에서 자동 응답을 활성화합니다.
- groups."*"는 방 전체에 걸쳐 멘션 게이팅의 기본값을 설정할 수 있습니다.
- groupAllowFrom은 방에서 누가 봇을 트리거할 수 있는지 제한합니다(선택사항).
- 방별 users 허용목록은 특정 방 내의 발신자를 추가로 제한할 수 있습니다.
- 구성 마법사는 방 허용목록(방 ID, 별칭 또는 이름)을 요청하고 가능한 경우 이름을 해석합니다.
- 시작 시, OpenClaw는 허용목록의 방/사용자 이름을 ID로 해석하고 매핑을 로깅합니다. 해석되지 않은 항목은 입력한 그대로 유지됩니다.
- 초대는 기본적으로 자동 참여합니다. channels.matrix.autoJoin 및 channels.matrix.autoJoinAllowlist로 제어합니다.
- 방을 허용하지 않으려면, channels.matrix.groupPolicy: "disabled"로 설정합니다(또는 빈 허용목록 유지).
- 레거시 키: channels.matrix.rooms (groups와 동일한 형태).
스레드
- 답장 스레딩이 지원됩니다.
- channels.matrix.threadReplies는 답장이 스레드에 머무를지 제어합니다:
- off, inbound (기본값), always
- channels.matrix.replyToMode는 스레드에서 답장하지 않을 때 reply-to 메타데이터를 제어합니다:
- off (기본값), first, all
기능
| 기능 | 상태 |
|---|---|
| 다이렉트 메시지 | ✅ 지원됨 |
| 방 | ✅ 지원됨 |
| 스레드 | ✅ 지원됨 |
| 미디어 | ✅ 지원됨 |
| E2EE | ✅ 지원됨 (crypto 모듈 필요) |
| 반응 | ✅ 지원됨 (도구를 통한 전송/읽기) |
| 투표 | ✅ 전송 지원; 인바운드 poll start는 텍스트로 변환됨 (응답/종료는 무시됨) |
| 위치 | ✅ 지원됨 (geo URI; 고도 무시됨) |
| 네이티브 명령 | ✅ 지원됨 |
설정 참조 (Matrix)
전체 설정: Configuration
제공자 옵션:
- channels.matrix.enabled: 채널 시작 활성화/비활성화.
- channels.matrix.homeserver: 홈서버 URL.
- channels.matrix.userId: Matrix 사용자 ID (액세스 토큰과 함께 선택사항).
- channels.matrix.accessToken: 액세스 토큰.
- channels.matrix.password: 로그인용 비밀번호 (토큰 저장됨).
- channels.matrix.deviceName: 디바이스 표시 이름.
- channels.matrix.encryption: E2EE 활성화 (기본값: false).
- channels.matrix.initialSyncLimit: 초기 동기화 제한.
- channels.matrix.threadReplies: off | inbound | always (기본값: inbound).
- channels.matrix.textChunkLimit: 아웃바운드 텍스트 청크 크기 (문자).
- channels.matrix.chunkMode: length (기본값) 또는 newline으로 길이 청킹 전에 빈 줄(단락 경계)로 분할.
- channels.matrix.dm.policy: pairing | allowlist | open | disabled (기본값: pairing).
- channels.matrix.dm.allowFrom: DM 허용목록 (사용자 ID 또는 표시 이름). open은 "*"가 필요합니다. 마법사는 가능한 경우 이름을 ID로 해석합니다.
- channels.matrix.groupPolicy: allowlist | open | disabled (기본값: allowlist).
- channels.matrix.groupAllowFrom: 그룹 메시지용 허용목록에 있는 발신자.
- channels.matrix.allowlistOnly: DM + 방에 대한 허용목록 규칙 강제.
- channels.matrix.groups: 그룹 허용목록 + 방별 설정 맵.
- channels.matrix.rooms: 레거시 그룹 허용목록/설정.
- channels.matrix.replyToMode: 스레드/태그용 reply-to 모드.
- channels.matrix.mediaMaxMb: 인바운드/아웃바운드 미디어 제한 (MB).
- channels.matrix.autoJoin: 초대 처리 (always | allowlist | off, 기본값: always).
- channels.matrix.autoJoinAllowlist: 자동 참여를 위한 허용된 방 ID/별칭.
- channels.matrix.actions: 액션별 도구 게이팅 (reactions/messages/pins/memberInfo/channelInfo).