diff --git a/docs/antigravity-data-sources.md b/docs/antigravity-data-sources.md new file mode 100644 index 0000000..c3c7334 --- /dev/null +++ b/docs/antigravity-data-sources.md @@ -0,0 +1,127 @@ +# Antigravity 데이터 소스 분석 보고서 + +> Antigravity IDE의 대화 데이터에 접근할 수 있는 모든 경로를 조사한 결과입니다. + +## 1. 데이터 소스 요약 + +| 경로 | 포맷 | 읽기 | 내용 | +|------|------|:----:|------| +| `conversations/*.pb` | Protobuf (암호화) | ❌ | 대화 전체 본문 | +| `state.vscdb` → `trajectorySummaries` | base64 + protobuf | ✅ | 대화 메타 + 최근 요약 | +| `state.vscdb` → `sidebarWorkspaces` | base64 | ✅ | 열린 워크스페이스 목록 | +| `brain/{id}/*.md` | 마크다운 | ✅ | 아티팩트 (task, walkthrough 등) | +| `state.vscdb` → `antigravity.notification.*` | boolean | ✅ | 알림 확인 상태만 | + +--- + +## 2. trajectorySummaries 상세 + +### 위치 +``` +%APPDATA%\Antigravity\User\globalStorage\state.vscdb + 테이블: ItemTable (key TEXT UNIQUE, value BLOB) + 키: antigravityUnifiedStateSync.trajectorySummaries +``` + +### 접근 방법 +```javascript +const Database = require('better-sqlite3'); +const db = new Database(dbPath, { readonly: true }); +const row = db.prepare( + "SELECT value FROM ItemTable WHERE key = 'antigravityUnifiedStateSync.trajectorySummaries'" +).get(); +const decoded = Buffer.from(row.value.toString('utf8'), 'base64'); +// → 43,380 bytes protobuf binary +``` + +### 디코딩 절차 +1. SQLite에서 `value` 읽기 → **base64 문자열** (57,840 bytes) +2. `Buffer.from(value, 'base64')` → **protobuf binary** (43,380 bytes) +3. 바이너리에서 UTF-8 문자열 추출 +4. UUID 패턴으로 **대화별 경계** 분할 +5. 내부 base64 → **2차 디코딩** → 제목/요약/메시지 추출 + +### 대화별 포함 정보 + +| 필드 | 예시 | +|------|------| +| 대화 ID | `64409b3f-a1f1-4654-bac3-45b5cd45d223` | +| 제목 | `Setting Up Python Environment` | +| 워크스페이스 URI | `file:///c%3A/.../Desktop/test1` | +| 도구 호출 이름 | `notify_user`, `task_boundary` | +| 도구 파라미터명 | `BlockedOnUser`, `Message`, `PathsToReview` | +| 어시스턴트 응답 요약 | `전환사채(CB) 가격평가 엔진이 완성되었습니다!` | +| 아티팩트 경로 | `file:///...brain/.../walkthrough.md` | +| 마크다운 테이블/리스트 | 응답 내용 그대로 포함 | + +### 실제 추출 예시 (대화 `64409b3f`) +``` +📌 제목: Setting Up Python Environment +📁 워크스페이스: file:///c%3A/Users/.../Desktop/test1 + +추출된 내용: + - "전환사채(CB) 가격평가 엔진이 완성되었습니다! 🎉" + - "cb_engine.py — BS PDE + Crank-Nicolson FDM 엔진" + - "| 시나리오 | CB 가격 | 전환가치 | 프리미엄 |" + - "| ATM (50K=50K) | 115,321 | 100,000 | 15.3% |" + - "서버가 현재 실행 중이며 http://localhost:5000 에서 접속 가능" +``` + +### 통계 +- **대화 수**: 16개 +- **대화당 평균 문자열**: ~30개 +- **전체 크기**: 43 KB +- **포함 범위**: 마지막 몇 스텝의 notify_user 메시지 + task_boundary 정보 + +### 한계 + +> [!WARNING] +> - **전체 대화 기록이 아님** — 최근 스텝의 요약만 포함 +> - **사용자 메시지 미포함** — 어시스턴트 응답 + 도구 호출만 +> - **실시간 스트리밍 불가** — 파일 변경 감시 폴링만 가능 +> - **protobuf 스키마 없음** — 문자열 추출 기반 비공식 파싱 + +--- + +## 3. conversations/*.pb (암호화) + +`.pb` 파일에는 대화 전체 본문이 저장되지만 **암호화/압축**되어 있어 직접 읽을 수 없습니다. + +``` +~/.gemini/antigravity/conversations/ +├── 02ed8fa2-....pb (7.2 MB) ← 현재 대화 +├── bbda3491-....pb (137 KB) +└── ... +``` + +- 헤더에 `SQLite format 3` 없음 +- UTF-8 문자열 추출 시 무의미한 바이트만 나옴 +- protobuf 스키마리스 디코딩 시도 실패 + +--- + +## 4. state.vscdb 기타 유용 키 + +| 키 | 내용 | +|----|------| +| `google.antigravity` | `installationId` | +| `antigravityUnifiedStateSync.agentPreferences` | 에이전트 설정 (base64+pb) | +| `antigravityUnifiedStateSync.modelPreferences` | 모델 설정 | +| `antigravityUnifiedStateSync.sidebarWorkspaces` | 열린 워크스페이스 URI 목록 | +| `antigravityUnifiedStateSync.userStatus` | 사용자 인증 상태 | +| `antigravity.notification.*` | 알림 확인 여부 (true/false) | + +--- + +## 5. 결론 + +| 용도 | 가능 여부 | 데이터 소스 | +|------|:---------:|------------| +| 대화 목록 + 제목 | ✅ | trajectorySummaries | +| 최근 응답 요약 | ✅ | trajectorySummaries | +| 워크스페이스 정보 | ✅ | sidebarWorkspaces | +| 아티팩트 읽기 | ✅ | brain/{id}/*.md | +| 전체 대화 기록 | ❌ | .pb (암호화) | +| 실시간 채팅 스트림 | ❌ | Extension 필요 | +| 메시지 전송 | ❌ | Extension 필요 | +| 승인/거절 제어 | ❌ | Extension 필요 |