채널 | 라이브러리 | 위치 | 연결 방식 | 기능 |
WhatsApp | Baileys | /src/whatsapp/ | 웹 소켓 | 개인 DM, 그룹 채팅, 미디어 |
Telegram | grammY | /src/telegram/ | Bot API | DM, 그룹, 봇 명령어, 리플 |
Slack | Bolt | /src/slack/ | Bot API | 워크스페이스, DM, 채팅, 슬래시 |
Discord | discord.js | /src/discord/ | Bot API | 서버, 채널, DM, 리액션 |
Google Chat | Chat API | /src/googlechat/ | OAuth | 스페이스, DM, 미디어 |
Signal | signal-cli RPC | /src/signal/ | RPC | DM, 그룹, 미디어 |
iMessage | imsg RPC | /src/imessage/ | RPC (BlueBubbles) | DM, 그룹, 미디어 |
BlueBubbles | WebSocket | /extensions/bluebubbles/ | WebSocket | iMessage 통합 (macOS) |
Microsoft Teams | Bot Framework | /extensions/msteams/ | Bot API | 팀, 채널, DM |
Matrix | Client API | /extensions/matrix/ | Client API | 룸, DM, 미디어 |
Zalo | Bot SDK | /extensions/zalo/ | Bot API | DM, 그룹, 미디어 |
Zalo Personal | Client API | /extensions/zalouser/ | Client API | 개인 계정 |
Nextcloud Talk | Spreed | /extensions/nextcloud-talk/ | OAuth | 채팅, DM, 미디어 |
WebChat | HTTP API | /src/web/ | REST API | HTTP 요청으로 채팅 |
// 채널 공통 인터페이스
interface ChannelAdapter {
// 연결 관리
connect(): Promise<void>;
disconnect(): Promise<void>;
isConnected(): boolean;
// 메시지 처리
send(recipient: string, message: Message): Promise<void>;
onMessage(handler: (msg: InboundMessage) => void): void;
// 프레즌스
onPresence(handler: (presence: Presence) => void): void;
// 기타
typingIndicator(recipient: string, typing: boolean): void;
}// 공통 메시지 포맷
interface Message {
text?: string;
attachments?: Attachment[];
mentions?: string[];
replyTo?: MessageId;
metadata?: Record<string, unknown>;
}
interface Attachment {
type: 'image' | 'video' | 'audio' | 'file';
url: string;
filename?: string;
mimeType?: string;
}{
channels: {
whatsapp: {
enabled: true,
allowFrom: ["+1234567890", "*"], // "*": 모든 연결 허용
dmPolicy: "pairing", // 또는 "open"
groupPolicy: {
mode: "mention", // 또는 "always"
mentions: ["clawdbot", "@clawdbot"]
}
}
}
}# WhatsApp 로그인
clawdbot channels login whatsapp
# QR 코드 가져오기
clawdbot channels login whatsapp --qr-import
# 메시지 전송
clawdbot send --to whatsapp:+1234567890 --message "안녕하세요"{
channels: {
telegram: {
enabled: true,
botToken: "123456:ABCDEF1234...",
groupPolicy: {
mode: "mention", // 또는 "always"
mentions: ["clawdbot_bot", "@clawdbot_bot"]
}
}
}
}# Telegram Bot 설정
clawdbot channels login telegram
# 메시지 전송
clawdbot send --to telegram:@username --message "테스트"{
channels: {
slack: {
enabled: true,
token: "xoxb-1234567890-ABCDEF...",
dm: {
policy: "open", // 또는 "pairing"
allowFrom: ["U1234567890", "*"] // "*": 모든 DM 허용
}
}
}
}{
channels: {
discord: {
enabled: true,
token: "MTIyNzE1234...",
dm: {
policy: "open",
allowFrom: ["1234567890123456789", "*"]
}
}
}
}{
channels: {
telegram: {
groupPolicy: {
mode: "mention",
mentions: ["clawdbot_bot", "@clawdbot_bot"]
}
}
}
}# 그룹 채팅
User1: 이 데이터를 분석해줘
User2: @clawdbot_bot 이 데이터를 분석해줘
# Clawdbot 응답 (멘션된 경우에만)
Clawdbot: 데이터를 분석하겠습니다...{
channels: {
telegram: {
groupPolicy: {
mode: "always"
}
}
}
}{
channels: {
telegram: {
replyTag: "[clawdbot]"
}
}
}# 그룹 채팅
User1: 이 코드를 리뷰해줘
# DM으로 응답
Clawdbot: 리뷰 결과를 DM으로 전송합니다.
# 그룹에 리플 태그 포함
User1: [clawdbot] 코드 리뷰 완료했습니다.{
agents: {
bindings: {
// 채널:계정 → 워크스페이스
"whatsapp:+1234567890": "main",
"whatsapp:+9876543210": "personal",
"telegram:@clawdbot_bot": "main",
"discord:server:123456789": "work",
"slack:workspace:U1234567890": "main"
}
}
}인바운드 메시지
│
▼
메시징 채널 (WhatsApp, Telegram, ...)
│
│ 1. 채널 식별자 추출
▼
Gateway (메시지 라우팅)
│
│ 2. 바인딩 검색
│ - agents.bindings[채널:계정]
▼
세션 결정
│
│ 3. 세션 생성/검색
▼
Pi Agent (실행)import type { ChannelAdapter } from './channel-adapter.ts';
// 채널 구현
export class MyChannel implements ChannelAdapter {
async connect(): Promise<void> {
// 연결 로직
}
async send(recipient: string, message: Message): Promise<void> {
// 메시지 전송 로직
}
onMessage(handler: (msg: InboundMessage) => void): void {
// 메시지 수신 핸들러 등록
}
// ... 기타 메서드
}# 채널 상태 확인
clawdbot status --channels
# 채널 탐색
clawdbot status --probe
# JSON 출력
clawdbot status --json{
"channels": {
"whatsapp": {
"status": "connected",
"username": "+1234567890",
"uptime": "5h 23m"
},
"telegram": {
"status": "connected",
"username": "@clawdbot_bot",
"uptime": "2h 15m"
},
"slack": {
"status": "disconnected",
"error": "token_expired"
}
}
}