docs: add SDK analysis results, revise trial plan with sendChatActionMessage discovery

This commit is contained in:
2026-03-07 21:15:19 +09:00
parent 7ba1e1b977
commit 026e7d5e33

View File

@@ -155,6 +155,51 @@
--- ---
## 🔬 SDK / Extension.js 심층 분석 결과
> extension.js (2.9MB minified) 정적 분석 (2026-03-07 20:50 KST)
### 핵심 아키텍처 발견
| 항목 | 발견 |
|------|------|
| **LS 통신** | `LanguageServerClient.getInstance().client.XXX()` — raw HTTP가 아닌 내부 client 객체 |
| **채팅 패널** | `ChatPanelProvider` 클래스 → WebView 관리 |
| **WebView 통신** | `sendActionToChatPanel()` → LS → WebView |
| **WebView → Host** | `onDidReceiveMessage({type:'update', content:...})` |
| **내보내기 API** | **없음** — exports는 npm 라이브러리뿐 |
| **명령어** | 21개 등록, 대화 접근 명령어 없음 |
### ChatActionType 열거형 (확인된 값)
| 액션 | 용도 |
|------|------|
| `toggleFocus` | 채팅 포커스 토글 |
| `openChatPanel` | 채팅 패널 열기 |
| `CodeBlockMention` | 코드 블록 멘션 |
| `FileMention` | 파일 멘션 |
| `setCascadeId` | cascade ID 설정 |
| `setApiKey` | API 키 설정 |
| `pollMcpServerStates` | MCP 서버 폴링 |
| `updateUserStatus` | 사용자 상태 업데이트 |
| `updateStateForCascadeFilesWithInIdeDiffs` | IDE diff 상태 업데이트 |
### 핵심 통신 경로 (확인됨)
```
Extension Host → LanguageServerClient.client → LS Process (ConnectRPC)
ChatPanelProvider → WebView (chat.js)
onDidReceiveMessage / postMessage
```
> ⚠️ **우리의 raw HTTP 접근이 실패한 이유**: LS Client와 raw HTTP는 **다른 인증/세션 컨텍스트**를 사용.
> LS Client는 Extension Host 프로세스 내에서 초기화되며, 자체 gRPC 채널을 가짐.
> Raw HTTP는 CSRF 토큰으로 인증하지만, trajectory 데이터 접근에는 **추가 세션 컨텍스트** 필요.
---
## 🚧 아직 시도하지 않은 접근법 ## 🚧 아직 시도하지 않은 접근법
### 1. StreamCascadeReactiveUpdates (서버 스트리밍 RPC) ### 1. StreamCascadeReactiveUpdates (서버 스트리밍 RPC)
@@ -207,56 +252,36 @@
> 아래 각 접근법을 **순서대로** 시도. 각 시도는 **별도 프로브 코드**로, 결과 로그 확인 후 다음 단계 진행. > 아래 각 접근법을 **순서대로** 시도. 각 시도는 **별도 프로브 코드**로, 결과 로그 확인 후 다음 단계 진행.
### Trial A: Extension API exports 탐색 (난이도: 낮음, 기대확률: 중) ### Trial A: Extension API exports 탐색 (난이도: 낮음)
**방법**: `vscode.extensions.getExtension('google.antigravity')``.exports` 객체 탐색 **방법**: `vscode.extensions.getExtension('google.antigravity')``.exports` 탐색
**SDK 분석 결과**: exports는 npm 라이브러리만 (63개). 유용한 API 없을 것으로 예상
**프로브 코드**: **그래도 시도하는 이유**: 런타임에서만 노출되는 API가 있을 수 있음 (minified 코드에서 못 찾은 것)
```typescript **상태**: 🔄 프로브 코드 빌드 완료, 설치 대기 중
const ext = vscode.extensions.getExtension('google.antigravity');
console.log('exports keys:', Object.keys(ext?.exports || {}));
console.log('exports:', JSON.stringify(ext?.exports, null, 2).substring(0, 2000));
```
**성공 기준**: exports에 `getConversation`, `getChatMessages`, `lspClient` 등 유용한 메서드/객체 존재
**실패 시**: Trial B 진행
--- ---
### Trial B: VS Code 채팅 내보내기/참여자 API (난이도: 낮음, 기대확률: 중) ### Trial B: `sendChatActionMessage` 명령어 활용 (난이도: 중, **새로 발견**)
**방법**: `@bridge` chat participant가 이미 등록되어 있으므로, participant의 `handleRequest`에서 AI 응답을 가로채기
**방법**: `antigravity.sendChatActionMessage` 명령어로 `SendActionToChatPanelRequest` JSON 전달
**SDK 분석 근거**: extension.js에서 `registerCommand(i.SEND_CHAT_ACTION_MESSAGE, async e => { ... sendActionToChatPanel(e) })` 확인
**프로브 코드**: **프로브 코드**:
```typescript ```typescript
// 현재 등록된 chat participant에서 응답 stream 가로채기 // SendActionToChatPanelRequest JSON 구조로 호출
// 또는 workbench.action.chat.export 같은 명령어 시도 await vscode.commands.executeCommand('antigravity.sendChatActionMessage',
const cmds = await vscode.commands.getCommands(true); JSON.stringify({ actionType: 'toggleFocus', payload: [] })
const chatCmds = cmds.filter(c => c.includes('chat')); );
console.log('Chat commands:', chatCmds.join('\n'));
``` ```
**성공 기준**: 채팅 패널 상태 변경이나 데이터 반환
**성공 기준**: 대화 내용을 반환하는 명령어 또는 stream 접근 가능 **기대**: 직접적인 대화 텍스트 접근보다는 채팅 패널 제어에 가까움
**실패 시**: Trial C 진행
--- ---
### Trial C: OutputChannel 캡처 (난이도: 중간, 기대확률: 중) ### Trial C: VS Code Chat History API (난이도: 낮음)
**방법**: Antigravity의 OutputChannel에서 AI 응답 텍스트 캡처 **방법**: `chat` 관련 내보내기/히스토리 명령어 탐색
**프로브 코드**: chat export/history/conversation 명령어 필터링 (Trial A 프로브에 포함)
**프로브 코드**: **상태**: 🔄 Trial A와 함께 프로브 중
```typescript
// Antigravity Output Channel 탐색
const channels = vscode.window.visibleTextEditors; // or output channels
// 또는 DevTools 콘솔의 Extension Host 출력에서 패턴 매칭
```
**성공 기준**: OutputChannel에 AI 응답 텍스트가 출력됨
**실패 시**: Trial D 진행
--- ---