diff --git a/docs/approach-history.md b/docs/approach-history.md index 7363134..bde17e6 100644 --- a/docs/approach-history.md +++ b/docs/approach-history.md @@ -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์™€ ํ•จ๊ป˜ ํ”„๋กœ๋ธŒ ์ค‘ ---