diff --git a/docs/approach-history.md b/docs/approach-history.md index affa6ec..7363134 100644 --- a/docs/approach-history.md +++ b/docs/approach-history.md @@ -123,9 +123,9 @@ - `.system_generated/click_feedback/` → 브라우저 스크린샷만 - **결론**: Brain 디렉토리에는 AI 대화 텍스트가 저장되지 않음 -### ❌ 시도 14: `getDiagnostics.extensionLogs`에서 AI 텍스트 추출 (현재, 미검증) +### ❌ 시도 14: `getDiagnostics.extensionLogs`에서 AI 텍스트 추출 - extensionLogs에서 notify_user 패턴, content 블록, 한국어 텍스트 검색 -- **결과**: 미검증 상태 +- **결과**: ❌ 실패 — summary fallback 트리거됨, extensionLogs에 AI 응답 텍스트 없음 - **커밋**: `0d90b25` --- @@ -200,3 +200,98 @@ 3. **Brain 디렉토리 = artifacts만**: 실제 AI 대화 텍스트는 brain에 저장되지 않음 4. **summary = 영어 대화 제목**: `getDiagnostics.recentTrajectories.summary`는 AI가 자동 생성한 제목이지 실제 응답이 아님 5. **반복 실수**: 같은 RPC를 다른 필드명으로 반복 시도 (trajectoryId, cascadeId, googleAgentId, conversationId → 모두 실패) + +--- + +## 🎯 체계적 시도 계획 (우선순위순) + +> 아래 각 접근법을 **순서대로** 시도. 각 시도는 **별도 프로브 코드**로, 결과 로그 확인 후 다음 단계 진행. + +### 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 진행 + +--- + +### Trial B: VS Code 채팅 내보내기/참여자 API (난이도: 낮음, 기대확률: 중) + +**방법**: `@bridge` chat participant가 이미 등록되어 있으므로, participant의 `handleRequest`에서 AI 응답을 가로채기 + +**프로브 코드**: +```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')); +``` + +**성공 기준**: 대화 내용을 반환하는 명령어 또는 stream 접근 가능 + +**실패 시**: Trial C 진행 + +--- + +### Trial C: OutputChannel 캡처 (난이도: 중간, 기대확률: 중) + +**방법**: Antigravity의 OutputChannel에서 AI 응답 텍스트 캡처 + +**프로브 코드**: +```typescript +// Antigravity Output Channel 탐색 +const channels = vscode.window.visibleTextEditors; // or output channels +// 또는 DevTools 콘솔의 Extension Host 출력에서 패턴 매칭 +``` + +**성공 기준**: OutputChannel에 AI 응답 텍스트가 출력됨 + +**실패 시**: Trial D 진행 + +--- + +### Trial D: StreamCascadeReactiveUpdates (난이도: 높음, 기대확률: 높) + +**방법**: ConnectRPC 서버-사이드 스트리밍으로 실시간 업데이트 구독 + +**프로브 코드**: +```typescript +// ConnectRPC streaming: POST + Transfer-Encoding: chunked +// 또는 SSE endpoint +const streamRes = await fetch(`http://127.0.0.1:3274/exa.language_server_pb.LanguageServerService/StreamCascadeReactiveUpdates`, { + method: 'POST', + headers: { 'Content-Type': 'application/connect+proto', 'x-codeium-csrf-token': csrfToken }, + body: Buffer.from([0, 0, 0, 0, 0]) // empty protobuf message +}); +// Read streaming response chunks +``` + +**성공 기준**: 스트림에서 AI 응답 텍스트가 실시간으로 수신됨 + +**실패 시**: Trial E 진행 + +--- + +### Trial E: Electron IPC / DevTools Protocol 인터셉트 (난이도: 높음, 기대확률: 높) + +**방법**: Electron의 IPC 또는 Chrome DevTools Protocol로 WebView 메시지 캡처 + +**프로브 코드**: +```typescript +// DevTools Protocol로 WebView의 console.log/network 캡처 +// 또는 Electron의 webContents.getAllWebContents()로 채팅 패널 접근 +``` + +**성공 기준**: WebView ↔ Extension Host 사이 메시지에서 AI 텍스트 추출 + +**실패 시**: 완전히 다른 아키텍처 접근 필요 (예: 화면 OCR, Accessibility API 등)