docs: add SDK analysis results, revise trial plan with sendChatActionMessage discovery
This commit is contained in:
@@ -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)
|
||||
@@ -207,56 +252,36 @@
|
||||
|
||||
> 아래 각 접근법을 **순서대로** 시도. 각 시도는 **별도 프로브 코드**로, 결과 로그 확인 후 다음 단계 진행.
|
||||
|
||||
### Trial A: Extension API exports 탐색 (난이도: 낮음, 기대확률: 중)
|
||||
### Trial A: Extension API exports 탐색 (난이도: 낮음)
|
||||
|
||||
**방법**: `vscode.extensions.getExtension('google.antigravity')` → `.exports` 객체 탐색
|
||||
|
||||
**프로브 코드**:
|
||||
```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 진행
|
||||
**방법**: `vscode.extensions.getExtension('google.antigravity')` → `.exports` 탐색
|
||||
**SDK 분석 결과**: exports는 npm 라이브러리만 (63개). 유용한 API 없을 것으로 예상
|
||||
**그래도 시도하는 이유**: 런타임에서만 노출되는 API가 있을 수 있음 (minified 코드에서 못 찾은 것)
|
||||
**상태**: 🔄 프로브 코드 빌드 완료, 설치 대기 중
|
||||
|
||||
---
|
||||
|
||||
### Trial B: VS Code 채팅 내보내기/참여자 API (난이도: 낮음, 기대확률: 중)
|
||||
|
||||
**방법**: `@bridge` chat participant가 이미 등록되어 있으므로, participant의 `handleRequest`에서 AI 응답을 가로채기
|
||||
### Trial B: `sendChatActionMessage` 명령어 활용 (난이도: 중, **새로 발견**)
|
||||
|
||||
**방법**: `antigravity.sendChatActionMessage` 명령어로 `SendActionToChatPanelRequest` JSON 전달
|
||||
**SDK 분석 근거**: extension.js에서 `registerCommand(i.SEND_CHAT_ACTION_MESSAGE, async e => { ... sendActionToChatPanel(e) })` 확인
|
||||
**프로브 코드**:
|
||||
```typescript
|
||||
// 현재 등록된 chat participant에서 응답 stream 가로채기
|
||||
// 또는 workbench.action.chat.export 같은 명령어 시도
|
||||
const cmds = await vscode.commands.getCommands(true);
|
||||
const chatCmds = cmds.filter(c => c.includes('chat'));
|
||||
console.log('Chat commands:', chatCmds.join('\n'));
|
||||
// SendActionToChatPanelRequest JSON 구조로 호출
|
||||
await vscode.commands.executeCommand('antigravity.sendChatActionMessage',
|
||||
JSON.stringify({ actionType: 'toggleFocus', payload: [] })
|
||||
);
|
||||
```
|
||||
|
||||
**성공 기준**: 대화 내용을 반환하는 명령어 또는 stream 접근 가능
|
||||
|
||||
**실패 시**: Trial C 진행
|
||||
**성공 기준**: 채팅 패널 상태 변경이나 데이터 반환
|
||||
**기대**: 직접적인 대화 텍스트 접근보다는 채팅 패널 제어에 가까움
|
||||
|
||||
---
|
||||
|
||||
### Trial C: OutputChannel 캡처 (난이도: 중간, 기대확률: 중)
|
||||
### Trial C: VS Code Chat History API (난이도: 낮음)
|
||||
|
||||
**방법**: Antigravity의 OutputChannel에서 AI 응답 텍스트 캡처
|
||||
|
||||
**프로브 코드**:
|
||||
```typescript
|
||||
// Antigravity Output Channel 탐색
|
||||
const channels = vscode.window.visibleTextEditors; // or output channels
|
||||
// 또는 DevTools 콘솔의 Extension Host 출력에서 패턴 매칭
|
||||
```
|
||||
|
||||
**성공 기준**: OutputChannel에 AI 응답 텍스트가 출력됨
|
||||
|
||||
**실패 시**: Trial D 진행
|
||||
**방법**: `chat` 관련 내보내기/히스토리 명령어 탐색
|
||||
**프로브 코드**: chat export/history/conversation 명령어 필터링 (Trial A 프로브에 포함)
|
||||
**상태**: 🔄 Trial A와 함께 프로브 중
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user