graph TB
subgraph External["외부 시스템"]
WA[WhatsApp]
TG[Telegram]
SL[Slack]
DC[Discord]
GC[Google Chat]
SIG[Signal]
IM[iMessage]
BC[BlueBubbles]
MT[Microsoft Teams]
MX[Matrix]
ZA[Zalo]
ZP[Zalo Personal]
NC[Nextcloud Talk]
WC[WebChat]
end
subgraph Clients["제어 평면"]
MA[macOS App]
CL[CLI]
WB[Web UI]
TUI[Terminal UI]
EXT[Extensions]
end
subgraph Nodes["디바이스 노드"]
iOS[iOS Node]
AND[Android Node]
HEAD[Headless Node]
end
GW[Gateway Daemon<br/>WS:18789]
PI[Pi Agent Runtime<br/>RPC Mode]
subgraph Tools["도구 시스템"]
BR[Browser Control<br/>Playwright]
CV[Canvas/A2UI<br/>HTML+React]
CR[Cron & Webhooks]
NT[Device Nodes<br/>Camera/Screen/Location]
ST[Sessions Tool<br/>Agent-to-Agent]
FS[File System<br/>Read/Write/Edit]
end
subgraph Storage["저장소"]
WS[Workspace<br/>~/clawd]
DB[Session DB<br/>SQLite]
MEM[Memory<br/>Contexts+Embeddings]
LOG[Logs<br/>~/.clawdbot/logs]
end
subgraph Security["보안 계층"]
AUTH[Gateway Authentication]
PAIR[DM Pairing]
SB[Docker Sandbox]
PERM[Permission Model]
TLS[TLS Encryption]
end
External -->|WebSocket| GW
Clients -->|WebSocket| GW
Nodes -->|WebSocket| GW
GW -->|RPC| PI
PI -->|Tool Calls| Tools
PI -->|Storage| WS
GW -->|Sessions| DB
GW -->|Logging| LOG
GW -->|Security| AUTHflowchart LR
A[외부 메신저<br/>WhatsApp, Telegram] -->|WebSocket| B[Gateway]
B --> C[메시지 라우팅]
C --> D{세션 결정}
D -->|바인딩 검색| E[agents.bindings]
E --> F{세션 생성/검색}
F --> G[session.create/find]
G --> H[세션 초기화]
H --> I{세션 컨텍스트 로드}
I --> J[memory/conversations<br/>memory/context]
J --> K[Pi Agent]
K --> L{도구 실행 룹}
L --> M[browser, canvas, nodes]
M --> N[결과 수집]
N --> O[Pi Agent]
O --> P[응답 생성]
P --> Q[결과 저장]
Q --> R[memory.save]
R --> S{아웃바운드 라우팅}
S -->|채널 결정| T[original channel]
T --> U[메시지 전송]
U --> Aflowchart LR
A[macOS App/CLI/Web UI] -->|WebSocket| B[Gateway]
B --> C[요청 라우팅]
C --> D[Pi Agent]
D --> E{도구 룹}
E --> F[browser_navigate]
E --> G[camera_snap]
E --> H[screen_record]
E --> I[location_get]
F --> J[브라우저 제어]
G --> K[카메라/스크린]
H --> L[화면 녹화]
I --> M[위치 정보]
M --> N[결과 수집]
N --> O[Pi Agent]
O --> P[응답 생성]
P --> Q[결과 저장]
Q --> R[memory/context]
R --> S{아웃바운드 라우팅}
S -->|결과 반환| T[original client]
T --> AsequenceDiagram
participant U as 알 수 없는 사용자
participant C as 채널 (WhatsApp/Telegram)
participant G as Gateway
participant O as 사용자 (Owner)
U->>C: 메시지 전송
C->>G: 인바운드 메시지
G->>G: 세션 결정<br/DM Policy 확인
G->>G: 페어링 필요?
alt 페어링 필요
G->>O: 페어링 코드 생성<br/QR 코드 스캔
O->>G: 페어링 승인<br/approve <code>
G->>G: allowlist에 추가
G->>C: 메시지 정상 처리
end
alt 페어링 불필요
G->>C: 메시지 정상 처리
Note over C: 오픈 모드 또는 이미 승인된 사용자
endflowchart TB
A[에이전트 요청] -->|tool call| B{session.isMain?}
B -->|true| C[호스트에서 직접 실행]
B -->|false| D[Docker 컨테이너 실행]
C --> E[호스트 파일 시스템]
E --> F[결과 반환]
D --> G[도구 권한 체크]
G --> H[sandbox.allowlist?]
H -->|true| I[도구 실행]
H -->|false| J[거부: Permission Denied]
I --> K[결과 수집]
J --> L[Docker 컨테이너 외부로 반환]graph LR
A[Gateway] --> B[WebSocket Server<br/>:18789]
B --> C[채널 연결들]
C --> D[Pi Agent]
B --> E[클라이언트 연결들]
B --> F[Node 연결들]
A --> G[TLS/인증]
A --> H[Logging]
A --> I[Health Monitor]
subgraph 채널 상태
WA[WhatsApp: Connected]
TG[Telegram: Connected]
SL[Slack: Disconnected]
DC[Discord: Connected]
end
subgraph 클라이언트 상태
MA[macOS: Connected]
CL[CLI: Connected]
WB[Web: 3 connections]
EXT[Extensions: 2 connections]
end
subgraph 노드 상태
IOS[iOS: Connected]
AND[Android: Connected]
HEAD[Headless: 2 nodes]
endstateDiagram-v2
[*] --> 세션_생성: 인바운드 메시지
세션_생성 --> 세션_바인딩_검색: agents.bindings
세션_바인딩_검색 --> 세션_존재?: 세션.find()
alt 세션_존재?
yes --> 세션_기록_로드: memory/conversations
no --> 세션_초기화: 기본 설정 로드
end
세션_기록_로드 --> 세션_컨텍스트_로드: memory/context
세션_초기화 --> 세션_컨텍스트_로드: memory/context
세션_컨텍스트_로드 --> 에이전트_실행: Pi Agent
에이전트_실행 --> 도구_실행: tool calls
도구_실행 --> 결과_수집: tool results
결과_수집 --> 응답_생성: generate response
응답_생성 --> 세션_기록_저장: memory.save
세션_기록_저장 --> [*]
alt 비정상_종료
에이전트_실행 --> 에러: tool error
에러 --> [*]
end
alt 사용자_요청_중지
에이전트_실행 --> 사용자_취소: user abort
사용자_취소 --> [*]
endflowchart LR
A[Pi Agent] -->|event| B[WebSocket 이벤트]
B --> C{이벤트 타입}
C -->|agent| D[agent 이벤트]
C -->|chat| E[chat 이벤트]
C -->|presence| F[presence 이벤트]
C -->|health| G[health 이벤트]
C -->|tick| H[tick 이벤트]
C -->|heartbeat| I[heartbeat 이벤트]
C -->|shutdown| J[shutdown 이벤트]
D -->|stream| K[클라이언트로 스트리밍]
E -->|route| L[채널별 라우팅]
F --> M[macOS App]
E --> N[CLI]
D --> O[Web UI]
F --> P[Extensions]
E --> Q[Nodes]
subgraph 이벤트 처리
K --> MA[메시지 업데이트]
N --> SL[WebSocket 업데이트]
O --> CL[상태 표시 업데이트]
endgraph TB
subgraph 현재_상태["현재 상태"]
GW1[Gateway x 1]
CH1[채널 x 13]
WS1[Workspace x 3]
end
subgraph 확장_옵션["확장 옵션"]
MG[멀티 Gateway]
CH[채널 확장]
MS[멀티 Workspace]
PL[플러그인 시스템]
SK[스킬 시스템]
end
현재_상태 --> MG
현재_상태 --> CH
현재_상태 --> WS1
현재_상태 --> MS
현재_상태 --> PL
subgraph 확장_결과["확장 후"]
GW2[Gateway x N]
CH2[채널 x 13+K]
WS2[Workspace x N+K]
AG[스킬 x N]
end
MG --> GW2
CH --> CH2
WS1 --> WS2
MS --> AG