Page:
Architecture
Clone
3
Architecture
Variet Main Worker edited this page 2026-04-09 12:58:46 +00:00
Table of Contents
- Architecture
- 1. 프로젝트 개요
- 2. 디렉토리 구조
- 3. 핵심 모듈 상세
- 3.1 Hub (hub.py) — WebSocket 메시지 허브
- 3.2 Auth (auth.py) — 인증 관리
- 3.3 Bot (bot.py) — Discord 인터페이스
- 3.4 Extension (extension.ts) — VS Code 확장
- 3.5 Step Probe (step-probe.ts) — 상태 폴링
- 3.6 WS Client (ws-client.ts) — Hub 클라이언트
- 3.7 Observer Script (observer-script.ts)
- 3.8 Step Utils (step-utils.ts)
- 4. 데이터 흐름
- 5. 통신 프로토콜
- 6. 보안
- 7. Extension 설정 (VS Code)
Architecture
AI 에이전트는 구현 전 이 문서를 반드시 확인합니다.
1. 프로젝트 개요
Gravity Control은 Antigravity AI 코딩 에이전트와 Discord를 실시간으로 연결하는 브릿지 시스템이다.
핵심 목적
- AI 에이전트의 승인 요청(코드 실행, 파일 수정 등)을 Discord로 전달하고 사용자 응답을 반환
- AI 에이전트의 작업 스냅샷(대화 요약, 진행 상황)을 Discord에 실시간 표시
- 코드 리뷰(diff review) accept/reject을 Discord에서 처리
- 사용자의 Discord 명령어(!approve, !reject, !auto 등)를 AG Extension으로 전달
- Auto-approve 모드로 무인 작업 지원
시스템 구성
┌────────────────┐ WebSocket ┌──────────────┐ Discord API ┌─────────┐
│ VS Code │◄──────────────────►│ Hub Server │◄───────────────────►│ Discord │
│ AG Extension │ type:auth/chat │ (hub.py + │ discord.py bot │ 서버 │
│ (TypeScript) │ /pending/resp │ gateway.py)│ │ │
└────────────────┘ └──────────────┘ └─────────┘
↕ AG SDK (RPC) ↕
┌────────────────┐ ┌──────────────┐
│ Antigravity │ │ 파일 bridge │ ← 레거시 fallback
│ AI Engine │ │ (bridge.py) │ (WS 미사용 시)
└────────────────┘ └──────────────┘
2. 디렉토리 구조
gravity_control/
├── main.py # 진입점: Bot + Hub + Watcher 통합 시작
├── config.py # 환경변수 + .env 로드 (66줄)
│
├── ── 서버 측 (Python) ──
├── bot.py # Discord 봇: 승인 UI, 채널 관리, Hub 핸들러 (1,286줄)
├── hub.py # WebSocket Hub: 연결 관리, 메시지 라우팅 (580줄)
├── auth.py # JWT 토큰 + registration code 인증 (127줄)
├── gateway.py # HTTP REST API + /ws endpoint (310줄)
├── bridge.py # 파일 기반 IPC (레거시 fallback) (479줄)
├── watcher.py # Brain 디렉토리 변경 감시 (290줄)
├── parser.py # Markdown → Discord 변환 (245줄)
├── collector.py # 원격 파일→HTTP 릴레이 (Phase 2 삭제 예정) (517줄)
│
├── ── Extension 측 (TypeScript) ──
├── extension/src/
│ ├── extension.ts # 메인: SDK init, activate, HTTP bridge (1,290줄)
│ ├── step-probe.ts # 폴링 + 응답 처리 + 승인 전략 (1,435줄)
│ │ # setupMonitor(), processResponseFile(),
│ │ # writePendingApproval(), tryApprovalStrategies()
│ ├── observer-script.ts # DOM Observer 스크립트 생성 (698줄)
│ │ # generateApprovalObserverScript()
│ ├── ws-client.ts # WSBridgeClient: Hub 연결, 재연결, 큐 (505줄)
│ ├── step-utils.ts # Step 파싱 순수 함수 4개 (114줄)
│ │ # extractPlannerText, filterEphemeral,
│ │ # extractToolCommand, extractToolDescription
│ └── sdk/ # Antigravity SDK 로컬 임베드
│ ├── index.js # SDK 런타임 (4,014줄)
│ └── index.d.ts # SDK 타입 정의 (2,297줄)
│
├── ── 테스트 ──
├── tests/
│ ├── test_ws_hub.py # Hub WS 연결 테스트
│ └── test_syntax.py # Python 구문 검증
│
├── ── 문서 / 설정 ──
├── .env # 환경변수 (git 제외)
├── .agents/references/ # AI 에이전트 레퍼런스
├── docs/devlog/ # 작업 로그
└── start_bot.bat # 윈도우용 봇 시작 스크립트
3. 핵심 모듈 상세
3.1 Hub (hub.py) — WebSocket 메시지 허브
역할: Extension ↔ Bot 간 실시간 양방향 통신 중계
| 기능 | 설명 |
|---|---|
| 연결 관리 | 프로젝트별 다중 인스턴스, 인스턴스 번호 자동 부여 |
| JWT 인증 | registration_code → JWT 발급 → 이후 토큰 재인증 |
| 메시지 라우팅 | pending, chat, register, auto_resolve, brain_event |
| 응답 역라우팅 | request_id → pending_owners → 원본 Extension으로 전달 |
| Rate limiting | per-connection 100msg/10s |
| Dedup | msg_id 기반 60s TTL 중복 제거 |
| Heartbeat | 30s 간격 ping/pong |
프로토콜:
1. Client → Server: {type:"auth", registration_code/token, project, pc}
2. Server → Client: {type:"auth_ok", conn_id, instance_number, session_token}
3. 양방향 메시지 교환:
- Extension→Hub: pending, chat, register, auto_resolve, brain_event
- Hub→Extension: response, command, instance_update, error
3.2 Auth (auth.py) — 인증 관리
| 기능 | 설명 |
|---|---|
| Registration Code | 사전 공유 코드로 최초 인증 |
| JWT 발급 | HMAC-SHA256, 24시간 유효 |
| 토큰 검증 | 만료/위조 감지, 프로젝트+PC 메타데이터 포함 |
3.3 Bot (bot.py) — Discord 인터페이스
| 기능 | 설명 |
|---|---|
| 승인 UI | Approve/Reject 버튼, diff_review Accept/Reject |
| Auto-approve | !auto 토글, 세션 간 초기화 |
| 채널 관리 | #ag-{project} 자동 채널 매칭 |
| 스냅샷 전달 | 2000자 초과 시 파일 첨부 |
| 명령어 | !approve, !reject, !auto, !status, !send |
| Hub 연동 | on_hub_pending, on_hub_chat, on_hub_register 핸들러 |
| IDLE 알림 | AI step 종료 시 Discord 알림 |
3.4 Extension (extension.ts) — VS Code 확장
| 기능 | 설명 |
|---|---|
| AG SDK 연동 | getCascadeStatus, getAllTrajectories RPC |
| 세션 감지 | activeSessionId 자동 추적 |
| 프로젝트 자동 감지 | git remote URL 기반 |
| HTTP bridge | 파일 기반 pending/response 읽기쓰기 (레거시) |
| WS bridge | WSBridgeClient 통한 Hub 연결 (우선) |
| Status bar | SDK 상태 + 연결 상태 표시 |
3.5 Step Probe (step-probe.ts) — 상태 폴링
BridgeContext 인터페이스로 extension.ts와 상태 공유:
| 기능 | 설명 |
|---|---|
| setupMonitor | 3초 간격 SDK 폴링, 세션/step 변화 감지 |
| processResponseFile | Discord 응답 → AG RPC 실행 |
| writePendingApproval | 승인 요청 파일/WS 전송 |
| tryApprovalStrategies | 다단계 승인: DOM click → VS Code command → RPC |
| setupResponseWatcher | response/ 디렉토리 파일 감시 |
BridgeContext 필드 (14개):
bridgePath, projectName, sdk, wsBridge, logToFile, autoApproveEnabled, activeSessionId, sentPendingIds, deterministicPort, recentDiscordSentTexts, writeChatSnapshot, writeChatSnapshotWithFiles, workspaceUri, diffReviewMetadata
3.6 WS Client (ws-client.ts) — Hub 클라이언트
| 기능 | 설명 |
|---|---|
| 연결 관리 | WebSocket + 자동 재연결 |
| Backoff | 1s→60s 지수 백오프 + ±30% jitter |
| 메시지 큐 | 200개 버퍼, 재연결 시 자동 flush |
| Heartbeat | 25s 간격 ping |
| 인증 | registration_code 또는 session_token |
| API | sendPending, sendChat, sendRegister, sendAutoResolve |
3.7 Observer Script (observer-script.ts)
AG Webview의 DOM을 관찰하여 승인 버튼을 자동 감지/클릭:
- MutationObserver로
.actions-container감시 - 버튼 텍스트 매칭으로 Approve/Reject 자동 실행
postMessage로 Extension과 통신
3.8 Step Utils (step-utils.ts)
순수 함수 4개:
extractPlannerText(content)— AI 응답 텍스트 추출filterEphemeral(text)— 시스템 메시지 필터링extractToolCommand(content)— 도구 명령어 추출extractToolDescription(content)— 도구 설명 추출
4. 데이터 흐름
4.1 승인 요청 플로우
AG Engine → SDK RPC → Extension(step-probe.ts)
→ setupMonitor: WAITING step 감지
→ writePendingApproval: pending 데이터 생성
→ [WS] wsBridge.sendPending() → Hub → Bot → Discord (버튼 UI)
→ [파일] bridge/pending/{id}.json (fallback)
4.2 승인 응답 플로우
Discord (사용자 버튼 클릭) → Bot
→ [Hub connected] Hub.route_response() → WS → Extension
→ [File fallback] bridge/response/{id}.json → setupResponseWatcher
→ processResponseFile → tryApprovalStrategies
1차: DOM observer script (webview inject)
2차: VS Code command (cascade.approveCurrentStep)
3차: Direct RPC (acknowledgeCodeActionStep)
4.3 채팅 스냅샷 플로우
Extension(step-probe.ts) → 새 step 텍스트 감지
→ writeChatSnapshot(text) → truncation + dedup
→ [WS] wsBridge.sendChat() → Hub → Bot → Discord (#ag-{project})
→ [파일] bridge/pending/ snapshot 파일 (fallback)
4.4 Diff Review 플로우
AG Engine → 파일 수정 → Extension(step-probe.ts)
→ edit_step_indices + modified_files 메타데이터 수집
→ writePendingApproval (step_type="diff_review")
→ Discord (Accept all / Reject all 버튼)
→ 응답 → acknowledgeCodeActionStep RPC
5. 통신 프로토콜
5.1 WebSocket 메시지 타입
Extension → Hub (upstream):
| type | data 필드 | 설명 |
|---|---|---|
auth |
registration_code/token, project, pc | 최초 인증 |
pending |
request_id, command, description, buttons | 승인 요청 |
chat |
content, attached_files, conversation_id | 채팅 스냅샷 |
register |
conversation_id, project_name | 세션 등록 |
auto_resolve |
request_id | 자동 해결 알림 |
brain_event |
(payload) | 브레인 이벤트 |
heartbeat |
- | 연결 유지 |
Hub → Extension (downstream):
| type | data 필드 | 설명 |
|---|---|---|
auth_ok |
conn_id, instance_number, session_token | 인증 성공 |
auth_fail |
reason | 인증 실패 |
response |
request_id, approved, button_index | 승인 응답 |
command |
text, action | Discord 명령어 |
instance_update |
active_count, instances[] | 인스턴스 변경 |
error |
error | 에러 |
5.2 BOT_MODE 동작 차이
| 모드 | Watcher | Hub/Gateway | 용도 |
|---|---|---|---|
local |
✅ (brain 감시) | ❌ | 로컬 개발 (Extension과 같은 PC) |
gateway |
❌ | ✅ (port 8585) | 서버 배포 (WS Hub + Gateway) |
remote |
✅ | ❌ | 원격 브릿지 (레거시 Collector) |
6. 보안
| 항목 | 구현 |
|---|---|
| WS 인증 | Registration Code → JWT (HMAC-SHA256, 24h) |
| Gateway API | API Key 헤더 (X-API-Key) |
| Rate limit | per-connection 100msg/10s |
| 메시지 dedup | msg_id 기반 60s TTL |
| Discord | Bot 토큰 + Guild ID 제한 |
7. Extension 설정 (VS Code)
| 설정 키 | 설명 | 기본값 |
|---|---|---|
gravityBridge.bridgePath |
Bridge 디렉토리 경로 | ~/.gemini/antigravity/bridge |
gravityBridge.projectName |
프로젝트 이름 | git remote 자동 감지 |
gravityBridge.hubUrl |
WebSocket Hub URL | (비어있으면 WS 비활성) |
gravityBridge.registrationCode |
Hub 등록 코드 | (서버에서 발급) |
3.6 DOM Observer (observer-script.ts)
역할: Antigravity Native UI를 식별하여 버튼 승인 요청을 가로채고 자동 클릭을 제어합니다.
- Native / Tailwind 대응: Webview가 아닌 VS Code 메인 렌더러에 네이티브로 직접 렌더링된 Agent 패널을 감지하기 위해 루트 바디 스캔과
.monaco-editor내부 배제 로직(CodeLens 방어)을 활용합니다. - 다중 프레임 스캔: MainDocument 외에도 iframe, webview, shadow DOM을 재귀적으로 순회하여 격리된 컨텍스트 내의 요소도 탐지합니다.