From 67619e8950bf2477415db14128eb3d2a1abb785c Mon Sep 17 00:00:00 2001 From: CD Date: Sat, 7 Mar 2026 17:39:00 +0900 Subject: [PATCH] docs: mid-session devlog + entry 002 (sendPromptToAgentPanel discovery) --- docs/devlog/2026-03-07.md | 4 + docs/devlog/entries/20260307-002.md | 27 ++ extension/gravity-bridge-0.1.0.vsix | Bin 10438 -> 16034 bytes extension/gravity-bridge-0.2.0.vsix | Bin 0 -> 20559 bytes extension/out/extension.js | 449 +++++++++++++++++++++++----- extension/out/extension.js.map | 2 +- extension/package-lock.json | 39 ++- extension/package.json | 5 +- 8 files changed, 449 insertions(+), 77 deletions(-) create mode 100644 docs/devlog/entries/20260307-002.md create mode 100644 extension/gravity-bridge-0.2.0.vsix diff --git a/docs/devlog/2026-03-07.md b/docs/devlog/2026-03-07.md index b66af2c..0039612 100644 --- a/docs/devlog/2026-03-07.md +++ b/docs/devlog/2026-03-07.md @@ -10,3 +10,7 @@ | 6 | 02:25 | Extension 스캐폴드 + VSIX 빌드 | `52fed8c`~`1af5fb7` | ✅ | | 7 | 11:40 | 전면 재설계 (채널 스팸/중복 해결) | `e32be6b`~`51ece61` | ✅ | | 8 | 12:17 | 승인 중복 전송 수정 + E2E 테스트 통과 | `ce2336c` | ✅ | +| 9 | 13:00 | 채팅 제출 탐색: clipboard paste + Enter 시뮬레이션 | `7f15e98`~`35f39ab` | 🔧 | +| 10 | 15:00 | @bridge→@gravity 이름 변경 + 슬래시 명령어 /stop /auto /send | `02e9e4d`~`0bd525a` | ✅ | +| 11 | 16:00 | sendTextToChat 탐색 → sendPromptToAgentPanel 발견 | `e4eb756`~`8d5e59c` | ✅ | +| 12 | 17:15 | 양방향 통신 완성 + 171개 명령어 문서화 + scanner 시작 수정 | `befa5d7` | ✅ | diff --git a/docs/devlog/entries/20260307-002.md b/docs/devlog/entries/20260307-002.md new file mode 100644 index 0000000..e22eb37 --- /dev/null +++ b/docs/devlog/entries/20260307-002.md @@ -0,0 +1,27 @@ +# Discord ↔ Antigravity 양방향 채팅 통합 + +- **시간**: 2026-03-07 13:00~17:15 +- **Commit**: `7f15e98`~`befa5d7` (15 commits) +- **Vikunja**: #223 → 진행중 + +## 결정 사항 + +### sendPromptToAgentPanel 발견 경위 +- clipboard paste → Enter 시뮬레이션 (`\r`, `default:Enter`, `\u000d`) → 전부 실패 +- `antigravity.sendTextToChat(true/false)` → 에러 없이 실행되지만 텍스트 표시 안 됨 +- `vscode.commands.getCommands(true)` 로 171개 내부 명령어 전수 조사 +- **`antigravity.sendPromptToAgentPanel`** 발견 → 성공 + +### Chat Snapshot 파이프라인 (응답 릴레이) +- Extension `onDidChangeTextDocument` → chat scheme 필터 → 2초 debounce → `bridge/chat_snapshots/` +- Bot `chat_snapshot_scanner` @tasks.loop(5초) → Discord embed 전송 +- **`.start()` 누락 발견** — 두 scanner 모두 정의만 되고 시작 안 됐음 + +### SDK (antigravity-sdk) +- npm 패키지 존재, README에 `sendPrompt`, `sendMessage` 등 광고 +- 실제 JS 코드에 해당 함수 미구현 (커뮤니티 프로젝트, vaporware) +- `state.vscdb` 읽기 + `vscode.commands.executeCommand` 래핑만 구현됨 + +## 미완료 +- 응답 릴레이(Antigravity→Discord) 테스트 중 +- listener leak (351개 누적) — Extension 재로드 시 dispose 문제 diff --git a/extension/gravity-bridge-0.1.0.vsix b/extension/gravity-bridge-0.1.0.vsix index 396cd0f822037345e4e78ea3f0fe5b3a00384d8d..1be984fcd2f549c573af57dac69b6e9f8f633d18 100644 GIT binary patch delta 15517 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 s2q}^~gwg)X@ZV?u-`Be~&pt_s{JA06}c2V*mgE diff --git a/extension/gravity-bridge-0.2.0.vsix b/extension/gravity-bridge-0.2.0.vsix new file mode 100644 index 0000000000000000000000000000000000000000..137f01e98d734053e66bb431ad463176c2d0413a GIT binary patch literal 20559 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 git remote repo name > workspace folder name + */ +function detectProjectName() { + const config = vscode.workspace.getConfiguration('gravityBridge'); + const configName = config.get('projectName'); + if (configName) { + return configName; + } + // Try git remote URL → extract repo name + const folders = vscode.workspace.workspaceFolders; + if (folders && folders.length > 0) { + const cwd = folders[0].uri.fsPath; + try { + const remoteUrl = cp.execSync('git remote get-url origin', { + cwd, encoding: 'utf-8', timeout: 3000 + }).trim(); + // "https://gitea.example.com/Variet/gravity_control.git" → "gravity_control" + // "git@github.com:user/repo.git" → "repo" + const match = remoteUrl.match(/\/([^\/]+?)(?:\.git)?$/); + if (match && match[1]) { + const repoName = match[1].toLowerCase().replace(/[\s\-]+/g, '_'); + console.log(`Gravity Bridge: project from git remote → "${repoName}"`); + return repoName; + } + } + catch { + // No git or no remote — fall through + } + // Fallback: workspace folder name + return folders[0].name.toLowerCase().replace(/[\s\-]+/g, '_'); + } + return 'unknown_project'; +} function activate(context) { - console.log('Gravity Bridge: activating...'); + projectName = detectProjectName(); + console.log(`Gravity Bridge: activating for project "${projectName}"...`); // Determine bridge path const config = vscode.workspace.getConfiguration('gravityBridge'); const configPath = config.get('bridgePath'); bridgePath = configPath || path.join(os.homedir(), '.gemini', 'antigravity', 'bridge'); // Ensure bridge directories exist - const dirs = ['pending', 'response', 'commands']; + const dirs = ['pending', 'response', 'commands', 'register']; for (const dir of dirs) { const dirPath = path.join(bridgePath, dir); if (!fs.existsSync(dirPath)) { @@ -76,27 +112,43 @@ function activate(context) { // Status bar statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100); statusBar.command = 'gravityBridge.start'; - statusBar.text = '$(radio-tower) Bridge: Off'; - statusBar.tooltip = 'Gravity Bridge — Click to start'; + statusBar.text = `$(radio-tower) ${projectName}: Off`; + statusBar.tooltip = `Gravity Bridge — ${projectName}`; statusBar.show(); context.subscriptions.push(statusBar); // Register commands - context.subscriptions.push(vscode.commands.registerCommand('gravityBridge.start', startBridge), vscode.commands.registerCommand('gravityBridge.stop', stopBridge), vscode.commands.registerCommand('gravityBridge.approve', () => handleManualAction(true)), vscode.commands.registerCommand('gravityBridge.reject', () => handleManualAction(false))); + context.subscriptions.push(vscode.commands.registerCommand('gravityBridge.start', startBridge), vscode.commands.registerCommand('gravityBridge.stop', stopBridge), vscode.commands.registerCommand('gravityBridge.connect', connectSession), vscode.commands.registerCommand('gravityBridge.approve', () => handleManualAction(true)), vscode.commands.registerCommand('gravityBridge.reject', () => handleManualAction(false))); + // Chat document change listener — captures AI text responses + context.subscriptions.push(vscode.workspace.onDidChangeTextDocument((event) => { + handleChatDocumentChange(event); + })); + // Register @bridge Chat Participant for history relay + try { + const participant = vscode.chat.createChatParticipant('gravity-bridge.gravity', bridgeChatHandler); + participant.iconPath = new vscode.ThemeIcon('radio-tower'); + context.subscriptions.push(participant); + console.log('Gravity Bridge: @bridge chat participant registered'); + } + catch (err) { + console.log('Gravity Bridge: chat participant API not available (OK)'); + } + // Auto-watch brain/ for new conversations → auto-register + watchBrainForNewSessions(); // Auto-start startBridge(); } function startBridge() { if (isActive) { - vscode.window.showInformationMessage('Gravity Bridge is already running'); + vscode.window.showInformationMessage(`Gravity Bridge (${projectName}): already running`); return; } isActive = true; - statusBar.text = '$(radio-tower) Bridge: On'; - statusBar.tooltip = 'Gravity Bridge — Active'; + statusBar.text = `$(radio-tower) ${projectName}: On`; + statusBar.tooltip = `Gravity Bridge — ${projectName} (Active)`; statusBar.command = 'gravityBridge.stop'; // Watch bridge/response/ for Discord user responses const responsePath = path.join(bridgePath, 'response'); - const processedFiles = new Set(); // Debounce: prevent double-processing + const processedFiles = new Set(); // Debounce try { watcher = fs.watch(responsePath, { persistent: false }, (eventType, filename) => { if (filename && filename.endsWith('.json') && !processedFiles.has(filename)) { @@ -113,7 +165,7 @@ function startBridge() { // Watch for commands (user text input from Discord) const commandsPath = path.join(bridgePath, 'commands'); try { - fs.watch(commandsPath, { persistent: false }, (eventType, filename) => { + commandsWatcher = fs.watch(commandsPath, { persistent: false }, (eventType, filename) => { if (filename && filename.endsWith('.json') && !processedFiles.has(filename)) { processedFiles.add(filename); setTimeout(() => processedFiles.delete(filename), 2000); @@ -125,30 +177,33 @@ function startBridge() { catch (err) { console.error('Gravity Bridge: failed to watch commands dir', err); } - vscode.window.showInformationMessage('Gravity Bridge: Started'); - console.log(`Gravity Bridge: started, bridge path: ${bridgePath}`); + vscode.window.showInformationMessage(`Gravity Bridge (${projectName}): Started`); + console.log(`Gravity Bridge: started for project "${projectName}", bridge: ${bridgePath}`); } function stopBridge() { if (!isActive) { return; } isActive = false; - statusBar.text = '$(radio-tower) Bridge: Off'; - statusBar.tooltip = 'Gravity Bridge — Click to start'; + statusBar.text = `$(radio-tower) ${projectName}: Off`; + statusBar.tooltip = `Gravity Bridge — ${projectName}`; statusBar.command = 'gravityBridge.start'; if (watcher) { watcher.close(); watcher = null; } - vscode.window.showInformationMessage('Gravity Bridge: Stopped'); + if (commandsWatcher) { + commandsWatcher.close(); + commandsWatcher = null; + } + vscode.window.showInformationMessage(`Gravity Bridge (${projectName}): Stopped`); } /** * Handle a response from Discord (approve/reject). - * Reads the response JSON and simulates the appropriate action. + * Only processes responses — no project filtering needed since request_id is unique. */ async function handleResponse(filePath) { try { - // Small delay to ensure file is fully written await new Promise(resolve => setTimeout(resolve, 200)); if (!fs.existsSync(filePath)) { return; @@ -158,10 +213,8 @@ async function handleResponse(filePath) { if (response.approved === undefined) { return; } - console.log(`Gravity Bridge: response received — approved=${response.approved}`); + console.log(`Gravity Bridge [${projectName}]: response — approved=${response.approved}`); if (response.approved) { - // Simulate pressing Enter or clicking approve - // Strategy: Use VS Code command to accept suggestion await simulateApproval(); vscode.window.showInformationMessage(`✅ Approved: ${response.request_id}`); } @@ -169,7 +222,6 @@ async function handleResponse(filePath) { await simulateRejection(); vscode.window.showInformationMessage(`❌ Rejected: ${response.request_id}`); } - // Cleanup: delete the response file after processing try { fs.unlinkSync(filePath); } @@ -181,7 +233,7 @@ async function handleResponse(filePath) { } /** * Handle a text command from Discord. - * Supports special commands (!auto on/off) and general text relay. + * ONLY processes commands matching this project's name. */ async function handleCommand(filePath) { try { @@ -194,28 +246,67 @@ async function handleCommand(filePath) { if (command.consumed || !command.text) { return; } + // ★ PROJECT FILTER — only process commands for THIS project + const cmdProject = command.project_name || ''; + if (cmdProject && cmdProject !== projectName) { + console.log(`Gravity Bridge [${projectName}]: skipping command for "${cmdProject}"`); + return; // Not for us — leave file for the correct Extension instance + } const text = command.text.trim(); - console.log(`Gravity Bridge: command received — "${text.substring(0, 50)}"`); - // Special command: auto-approve toggle - if (text === '!auto on' || text === '!auto off') { - const enabled = text === '!auto on'; - await toggleAutoApprove(enabled); - // Mark as consumed + console.log(`Gravity Bridge [${projectName}]: command — "${text.substring(0, 50)}"`); + // Special command: !stop — cancel AI work + if (text === '!stop') { + try { + await vscode.commands.executeCommand('workbench.action.chat.stop'); + vscode.window.showWarningMessage(`⏹️ [${projectName}] AI 작업 중지됨`); + } + catch { + vscode.window.showErrorMessage('AI 중지 명령 실행 실패'); + } command.consumed = true; fs.writeFileSync(filePath, JSON.stringify(command, null, 2), 'utf-8'); return; } - // General text: type into chat panel - await vscode.commands.executeCommand('workbench.action.chat.open'); - await new Promise(resolve => setTimeout(resolve, 500)); - const oldClipboard = await vscode.env.clipboard.readText(); - await vscode.env.clipboard.writeText(command.text); - await vscode.commands.executeCommand('editor.action.clipboardPasteAction'); - await vscode.env.clipboard.writeText(oldClipboard); - // Mark as consumed + // Special command: auto-approve toggle + if (text === '!auto on' || text === '!auto off') { + const enabled = text === '!auto on'; + await toggleAutoApprove(enabled); + command.consumed = true; + fs.writeFileSync(filePath, JSON.stringify(command, null, 2), 'utf-8'); + return; + } + // General text: send directly to Antigravity agent panel + try { + await vscode.commands.executeCommand('antigravity.sendPromptToAgentPanel', command.text); + console.log(`Gravity Bridge: ✅ sent via sendPromptToAgentPanel`); + } + catch (e1) { + console.log(`Gravity Bridge: sendPromptToAgentPanel failed: ${e1}`); + // Fallback: try sendChatActionMessage + try { + await vscode.commands.executeCommand('antigravity.sendChatActionMessage', command.text); + console.log(`Gravity Bridge: ✅ sent via sendChatActionMessage`); + } + catch (e2) { + console.log(`Gravity Bridge: sendChatActionMessage failed: ${e2}`); + // Last resort: focus panel + clipboard paste + try { + await vscode.commands.executeCommand('antigravity.agentPanel.focus'); + await new Promise(resolve => setTimeout(resolve, 300)); + const oldClip = await vscode.env.clipboard.readText(); + await vscode.env.clipboard.writeText(command.text); + await vscode.commands.executeCommand('editor.action.clipboardPasteAction'); + await vscode.env.clipboard.writeText(oldClip); + console.log('Gravity Bridge: clipboard paste fallback'); + } + catch (e3) { + console.error('Gravity Bridge: all methods failed', e3); + } + } + } + // Always mark as consumed command.consumed = true; fs.writeFileSync(filePath, JSON.stringify(command, null, 2), 'utf-8'); - vscode.window.showInformationMessage(`📨 Discord input: ${command.text.substring(0, 50)}...`); } catch (err) { console.error('Gravity Bridge: error handling command', err); @@ -227,26 +318,21 @@ async function handleCommand(filePath) { async function toggleAutoApprove(enabled) { const config = vscode.workspace.getConfiguration(); try { - // Core auto-approve settings await config.update('chat.tools.autoApprove', enabled, vscode.ConfigurationTarget.Global); await config.update('chat.agent.autoApprove', enabled, vscode.ConfigurationTarget.Global); - // Terminal auto-execution if (enabled) { await config.update('chat.tools.terminal.enableAutoApprove', true, vscode.ConfigurationTarget.Global); } - // File edits auto-accept await config.update('autoAcceptV2.autoAcceptFileEdits', enabled, vscode.ConfigurationTarget.Global); - // Update status bar statusBar.text = enabled - ? '$(radio-tower) Bridge: Auto ✅' - : '$(radio-tower) Bridge: Manual 🔒'; + ? `$(radio-tower) ${projectName}: Auto ✅` + : `$(radio-tower) ${projectName}: Manual 🔒`; const mode = enabled ? '자동 승인 ON 🟢' : '수동 승인 OFF 🔴'; - vscode.window.showInformationMessage(`Gravity Bridge: ${mode}`); - console.log(`Gravity Bridge: auto-approve set to ${enabled}`); - // Write status back to bridge for bot to report + vscode.window.showInformationMessage(`Gravity Bridge (${projectName}): ${mode}`); const statusPath = path.join(bridgePath, 'commands', `auto-status-${Date.now()}.json`); fs.writeFileSync(statusPath, JSON.stringify({ id: `auto-status-${Date.now()}`, + project_name: projectName, text: `[SYSTEM] Auto-approve: ${enabled ? 'ON' : 'OFF'}`, timestamp: Date.now() / 1000, consumed: true, @@ -255,34 +341,23 @@ async function toggleAutoApprove(enabled) { } catch (err) { console.error('Gravity Bridge: failed to toggle auto-approve', err); - vscode.window.showErrorMessage(`Auto-approve toggle failed: ${err}`); } } -/** - * Simulate approval — try multiple strategies. - */ async function simulateApproval() { try { - // Strategy 1: Try executing the accept command if available await vscode.commands.executeCommand('workbench.action.acceptSelectedCodeAction'); } catch { - // Strategy 2: Send Enter key via type command try { await vscode.commands.executeCommand('type', { text: '\n' }); } catch { - // Strategy 3: Focus terminal and send Enter await vscode.commands.executeCommand('workbench.action.terminal.focus'); } } } -/** - * Simulate rejection — try multiple strategies. - */ async function simulateRejection() { try { - // Strategy 1: Escape key await vscode.commands.executeCommand('workbench.action.closeQuickOpen'); } catch { @@ -290,14 +365,12 @@ async function simulateRejection() { await vscode.commands.executeCommand('cancelSelection'); } catch { - // Fallback: just notify console.log('Gravity Bridge: rejection sent but no active dialog found'); } } } /** * Manual approve/reject from command palette. - * Writes a pending request for testing purposes. */ function handleManualAction(approved) { const requestId = `manual-${Date.now()}`; @@ -318,6 +391,7 @@ function handleManualAction(approved) { } /** * Write a pending approval request to bridge/pending/ for Discord bot to pick up. + * Includes project_name for correct channel routing. */ function writePendingApproval(conversationId, command, description) { const requestId = `req-${Date.now()}`; @@ -325,6 +399,7 @@ function writePendingApproval(conversationId, command, description) { const request = { request_id: requestId, conversation_id: conversationId, + project_name: projectName, // ★ Project routing command: command, description: description, timestamp: Date.now() / 1000, @@ -333,9 +408,249 @@ function writePendingApproval(conversationId, command, description) { }; fs.writeFileSync(pendingPath, JSON.stringify(request, null, 2), 'utf-8'); sentPendingIds.add(requestId); - console.log(`Gravity Bridge: pending approval written — ${requestId}`); + console.log(`Gravity Bridge [${projectName}]: pending approval — ${requestId}`); return requestId; } +/** + * Register a conversation → project mapping in bridge/register/. + * The bot reads these files to route brain events to the correct channel. + */ +function registerConversation(conversationId) { + const registerDir = path.join(bridgePath, 'register'); + if (!fs.existsSync(registerDir)) { + fs.mkdirSync(registerDir, { recursive: true }); + } + const filePath = path.join(registerDir, `${conversationId}.json`); + const data = { + conversation_id: conversationId, + project_name: projectName, + timestamp: Date.now() / 1000, + }; + fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8'); + console.log(`Gravity Bridge [${projectName}]: registered ${conversationId.substring(0, 8)}`); +} +/** + * Read the title (first # heading) from a conversation's task.md or implementation_plan.md. + */ +function getConversationTitle(convDir) { + for (const fname of ['task.md', 'implementation_plan.md']) { + const fpath = path.join(convDir, fname); + if (fs.existsSync(fpath)) { + try { + const lines = fs.readFileSync(fpath, 'utf-8').split('\n').slice(0, 5); + for (const line of lines) { + const match = line.match(/^#\s+(.+)/); + if (match) { + return match[1].trim().substring(0, 50); + } + } + } + catch { /* ignore */ } + } + } + return ''; +} +/** + * Manual connect: scan brain/ for recent conversations and let user pick. + * Shows task.md titles for readability. Offers auto-connect for new projects. + */ +async function connectSession() { + const brainPath = path.join(os.homedir(), '.gemini', 'antigravity', 'brain'); + if (!fs.existsSync(brainPath)) { + vscode.window.showErrorMessage('Brain 디렉토리를 찾을 수 없습니다.'); + return; + } + // Get conversation dirs sorted by modification time (newest first) + const dirs = fs.readdirSync(brainPath) + .filter(d => { + const fullPath = path.join(brainPath, d); + return fs.statSync(fullPath).isDirectory() && d.includes('-'); + }) + .map(d => { + const fullPath = path.join(brainPath, d); + return { + name: d, + mtime: fs.statSync(fullPath).mtimeMs, + title: getConversationTitle(fullPath), + }; + }) + .sort((a, b) => b.mtime - a.mtime) + .slice(0, 10); + // Build QuickPick items + const items = []; + // Always offer auto-connect option first + items.push({ + label: '$(sync) 새 대화 자동 연결', + description: '다음에 시작하는 대화가 자동으로 이 프로젝트에 연결됩니다', + detail: `프로젝트: ${projectName}`, + }); + // Add conversation items with titles + for (const d of dirs) { + const titleLabel = d.title || '(제목 없음)'; + const timeStr = new Date(d.mtime).toLocaleString(); + items.push({ + label: `$(comment-discussion) ${titleLabel}`, + description: d.name.substring(0, 8), + detail: `${d.name} · ${timeStr}`, + convId: d.name, + }); + } + const selected = await vscode.window.showQuickPick(items, { + placeHolder: `프로젝트 "${projectName}"에 연결할 세션을 선택하세요`, + }); + if (!selected) { + return; + } + if (!('convId' in selected) || !selected.convId) { + // Auto-connect mode + vscode.window.showInformationMessage(`🔄 ${projectName}: 다음 대화가 자동으로 연결됩니다`); + return; + } + registerConversation(selected.convId); + vscode.window.showInformationMessage(`✅ ${selected.description} → ${projectName} 연결됨`); +} +/** + * Auto-watch brain/ for new conversation directories → auto-register. + */ +function watchBrainForNewSessions() { + const brainPath = path.join(os.homedir(), '.gemini', 'antigravity', 'brain'); + if (!fs.existsSync(brainPath)) { + return; + } + // Track known dirs + const knownDirs = new Set(fs.readdirSync(brainPath).filter(d => fs.statSync(path.join(brainPath, d)).isDirectory())); + try { + fs.watch(brainPath, { persistent: false }, (eventType, filename) => { + if (!filename || !filename.includes('-')) { + return; + } + const fullPath = path.join(brainPath, filename); + // Check if it's a new directory + if (!knownDirs.has(filename) && fs.existsSync(fullPath) && + fs.statSync(fullPath).isDirectory()) { + knownDirs.add(filename); + registerConversation(filename); + console.log(`Gravity Bridge [${projectName}]: auto-registered new session ${filename.substring(0, 8)}`); + } + }); + console.log(`Gravity Bridge [${projectName}]: watching brain/ for new sessions`); + } + catch (err) { + console.error('Gravity Bridge: failed to watch brain dir', err); + } +} +/** + * Monitor text document changes for chat panel content. + * VS Code chat documents have special URI schemes (vscode-chat-response, etc.). + * We capture significant changes and relay to Discord. + */ +let lastChatContent = ''; +let chatDebounceTimer = null; +function handleChatDocumentChange(event) { + const doc = event.document; + const scheme = doc.uri.scheme; + // Log ALL schemes to discover chat-related ones (debug mode) + if (scheme !== 'file' && scheme !== 'git' && scheme !== 'output' && + scheme !== 'vscode-userdata' && scheme !== 'untitled') { + console.log(`Gravity Bridge [${projectName}]: doc change scheme="${scheme}" uri="${doc.uri.toString().substring(0, 80)}"`); + } + // Capture chat-related documents + // Known chat schemes: vscode-chat-response, vscode-copilot-chat, etc. + const isChatDoc = scheme.includes('chat') || scheme.includes('copilot') || + scheme.includes('notebook') || doc.uri.path.includes('chat'); + if (!isChatDoc) { + return; + } + const content = doc.getText(); + if (!content || content === lastChatContent) { + return; + } + // Debounce: wait 2s for content to stabilize (AI streams text) + if (chatDebounceTimer) { + clearTimeout(chatDebounceTimer); + } + chatDebounceTimer = setTimeout(() => { + const finalContent = doc.getText(); + if (finalContent && finalContent !== lastChatContent && finalContent.length > 20) { + lastChatContent = finalContent; + writeChatSnapshot(finalContent); + } + }, 2000); +} +/** + * Write a chat content snapshot to bridge for the bot to relay. + */ +function writeChatSnapshot(content) { + const snapshotDir = path.join(bridgePath, 'chat_snapshots'); + if (!fs.existsSync(snapshotDir)) { + fs.mkdirSync(snapshotDir, { recursive: true }); + } + const id = `chat-${Date.now()}`; + const filePath = path.join(snapshotDir, `${id}.json`); + const data = { + id, + project_name: projectName, + content: content.substring(0, 4000), // Limit size + timestamp: Date.now() / 1000, + }; + fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8'); + console.log(`Gravity Bridge [${projectName}]: chat snapshot written (${content.length} chars)`); +} +/** + * @bridge Chat Participant handler. + * Reads conversation history and sends to Discord via bridge. + */ +const bridgeChatHandler = async (request, context, stream, token) => { + const command = request.prompt.trim().toLowerCase(); + if (command === 'stop' || command === '중지') { + // Cancel current AI work + try { + await vscode.commands.executeCommand('workbench.action.chat.stop'); + stream.markdown('⏹️ AI 작업 중지 요청을 보냈습니다.'); + } + catch { + stream.markdown('⚠️ 중지 명령을 실행할 수 없습니다.'); + } + return; + } + // Collect conversation history + const historyLines = []; + historyLines.push(`# 대화 히스토리 (${projectName})\n`); + for (const entry of context.history) { + if (entry instanceof vscode.ChatRequestTurn) { + historyLines.push(`## 👤 사용자\n${entry.prompt}\n`); + } + else if (entry instanceof vscode.ChatResponseTurn) { + let responseText = ''; + for (const part of entry.response) { + if (part instanceof vscode.ChatResponseMarkdownPart) { + responseText += part.value.value; + } + } + if (responseText) { + historyLines.push(`## 🤖 AI\n${responseText}\n`); + } + } + } + if (historyLines.length <= 1) { + stream.markdown('대화 히스토리가 비어있습니다. AI와 대화를 먼저 진행한 후 `@bridge`를 호출하세요.'); + return; + } + // Write to bridge for Discord relay + const fullHistory = historyLines.join('\n'); + const cmdId = `bridge-history-${Date.now()}`; + const cmdPath = path.join(bridgePath, 'commands', `${cmdId}.json`); + const data = { + id: cmdId, + project_name: projectName, + text: `[HISTORY]\n${fullHistory}`, + timestamp: Date.now() / 1000, + consumed: false, + }; + fs.writeFileSync(cmdPath, JSON.stringify(data, null, 2), 'utf-8'); + stream.markdown(`✅ 대화 히스토리 (${context.history.length}개 턴)를 Discord에 전송했습니다.`); + console.log(`Gravity Bridge [${projectName}]: sent ${context.history.length} turns to Discord`); +}; function deactivate() { stopBridge(); } diff --git a/extension/out/extension.js.map b/extension/out/extension.js.map index 0bd819f..06ffaef 100644 --- a/extension/out/extension.js.map +++ b/extension/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/extension/package-lock.json b/extension/package-lock.json index ed205c3..4a37c82 100644 --- a/extension/package-lock.json +++ b/extension/package-lock.json @@ -1,19 +1,22 @@ { "name": "gravity-bridge", - "version": "0.1.0", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gravity-bridge", - "version": "0.1.0", + "version": "0.2.0", + "dependencies": { + "antigravity-sdk": "^1.6.0" + }, "devDependencies": { "@types/node": "^20.0.0", - "@types/vscode": "^1.80.0", + "@types/vscode": "^1.100.0", "typescript": "^5.3.0" }, "engines": { - "vscode": "^1.80.0" + "vscode": "^1.100.0" } }, "node_modules/@types/node": { @@ -27,10 +30,30 @@ } }, "node_modules/@types/vscode": { - "version": "1.109.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.109.0.tgz", - "integrity": "sha512-0Pf95rnwEIwDbmXGC08r0B4TQhAbsHQ5UyTIgVgoieDe4cOnf92usuR5dEczb6bTKEp7ziZH4TV1TRGPPCExtw==", - "dev": true, + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.100.0.tgz", + "integrity": "sha512-4uNyvzHoraXEeCamR3+fzcBlh7Afs4Ifjs4epINyUX/jvdk0uzLnwiDY35UKDKnkCHP5Nu3dljl2H8lR6s+rQw==", + "license": "MIT" + }, + "node_modules/antigravity-sdk": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/antigravity-sdk/-/antigravity-sdk-1.6.0.tgz", + "integrity": "sha512-VdaLlSujbr+9WNCxs57N8nkuWdSmUT4tD5BsO1XGjAKD6f1aPMCtqeMBYP6iWHRUGZZjtGvSQaUGBt/WR/9iAA==", + "license": "AGPL-3.0-or-later", + "dependencies": { + "sql.js": "^1.14.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@types/vscode": "^1.85.0" + } + }, + "node_modules/sql.js": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.14.1.tgz", + "integrity": "sha512-gcj8zBWU5cFsi9WUP+4bFNXAyF1iRpA3LLyS/DP5xlrNzGmPIizUeBggKa8DbDwdqaKwUcTEnChtd2grWo/x/A==", "license": "MIT" }, "node_modules/typescript": { diff --git a/extension/package.json b/extension/package.json index e8cf0b7..a4c4642 100644 --- a/extension/package.json +++ b/extension/package.json @@ -71,5 +71,8 @@ } } } + }, + "dependencies": { + "antigravity-sdk": "^1.6.0" } -} \ No newline at end of file +}