From de6f1c7ffdbd208de8bfbe938d9d940520bda9da Mon Sep 17 00:00:00 2001 From: CD Date: Sat, 7 Mar 2026 13:01:07 +0900 Subject: [PATCH] =?UTF-8?q?feat(phase4):=20!auto=20on/off=20=EB=AA=85?= =?UTF-8?q?=EB=A0=B9=EC=96=B4=20-=20Discord=EC=97=90=EC=84=9C=20Antigravit?= =?UTF-8?q?y=20=EC=9E=90=EB=8F=99=EC=8A=B9=EC=9D=B8=20=ED=86=A0=EA=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 26 ++++++++++- extension/gravity-bridge-0.1.0.vsix | Bin 9918 -> 10438 bytes extension/src/extension.ts | 64 +++++++++++++++++++++++++--- 3 files changed, 83 insertions(+), 7 deletions(-) diff --git a/bot.py b/bot.py index 9c902cf..78abf22 100644 --- a/bot.py +++ b/bot.py @@ -445,8 +445,30 @@ class GravityBot(commands.Bot): conv_id = cid break - if conv_id and message.content.strip(): - self.bridge.write_command(conv_id, message.content.strip()) + text = message.content.strip() + + # Special command: !auto on/off + if text in ("!auto on", "!auto off"): + if conv_id: + self.bridge.write_command(conv_id, text) + enabled = text == "!auto on" + emoji = "🟒" if enabled else "πŸ”΄" + mode = "μžλ™ 승인" if enabled else "μˆ˜λ™ 승인" + embed = discord.Embed( + title=f"{emoji} {mode} λͺ¨λ“œ", + description=f"Antigravity IDE 섀정이 λ³€κ²½λ©λ‹ˆλ‹€.\n" + f"`chat.tools.autoApprove = {enabled}`\n" + f"`chat.agent.autoApprove = {enabled}`", + color=discord.Color.green() if enabled else discord.Color.red(), + ) + await message.channel.send(embed=embed) + else: + await message.reply("⚠️ 채널에 μ—°κ²°λœ μ„Έμ…˜μ΄ μ—†μŠ΅λ‹ˆλ‹€.") + return + + # General text relay + if conv_id and text: + self.bridge.write_command(conv_id, text) await message.add_reaction("πŸ“¨") await self.process_commands(message) diff --git a/extension/gravity-bridge-0.1.0.vsix b/extension/gravity-bridge-0.1.0.vsix index da54b23004134287366730f4557f98b69ed2d951..396cd0f822037345e4e78ea3f0fe5b3a00384d8d 100644 GIT binary patch delta 3303 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 delta 2795 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 diff --git a/extension/src/extension.ts b/extension/src/extension.ts index bafcf85..e2526c9 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -157,7 +157,7 @@ async function handleResponse(filePath: string) { /** * Handle a text command from Discord. - * Types the text into the active editor or chat input. + * Supports special commands (!auto on/off) and general text relay. */ async function handleCommand(filePath: string) { try { @@ -170,14 +170,24 @@ async function handleCommand(filePath: string) { if (command.consumed || !command.text) { return; } - console.log(`Gravity Bridge: command received β€” "${command.text.substring(0, 50)}..."`); + const text = command.text.trim(); + console.log(`Gravity Bridge: command received β€” "${text.substring(0, 50)}"`); - // Type into the active text input (chat panel) + // Special command: auto-approve toggle + if (text === '!auto on' || text === '!auto off') { + const enabled = text === '!auto on'; + await toggleAutoApprove(enabled); + + // Mark as consumed + 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'); - // Small delay for chat panel to open await new Promise(resolve => setTimeout(resolve, 500)); - // Type the text using clipboard const oldClipboard = await vscode.env.clipboard.readText(); await vscode.env.clipboard.writeText(command.text); await vscode.commands.executeCommand('editor.action.clipboardPasteAction'); @@ -193,6 +203,50 @@ async function handleCommand(filePath: string) { } } +/** + * Toggle Antigravity's auto-approve settings. + */ +async function toggleAutoApprove(enabled: boolean) { + 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 πŸ”’'; + + 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 + const statusPath = path.join(bridgePath, 'commands', `auto-status-${Date.now()}.json`); + fs.writeFileSync(statusPath, JSON.stringify({ + id: `auto-status-${Date.now()}`, + text: `[SYSTEM] Auto-approve: ${enabled ? 'ON' : 'OFF'}`, + timestamp: Date.now() / 1000, + consumed: true, + auto_approve: enabled, + }, null, 2), 'utf-8'); + + } 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. */