diff --git a/bot.py b/bot.py index f67b24c..6754e74 100644 --- a/bot.py +++ b/bot.py @@ -579,7 +579,16 @@ class GravityBot(commands.Bot): color=discord.Color.purple(), timestamp=datetime.now(timezone.utc), ) - await channel.send(embed=embed) + try: + await channel.send(embed=embed) + except discord.NotFound: + # Channel was deleted — invalidate cache and retry once + logger.warning(f"Channel deleted for {project}, re-creating...") + self.project_channels.pop(project, None) + channel = await self._get_channel(project) + if channel: + await channel.send(embed=embed) + break f.unlink() # Cleanup except (json.JSONDecodeError, OSError) as e: diff --git a/docs/devlog/2026-03-08.md b/docs/devlog/2026-03-08.md index 0138a41..7691b06 100644 --- a/docs/devlog/2026-03-08.md +++ b/docs/devlog/2026-03-08.md @@ -3,3 +3,4 @@ | # | 시간 | 작업 | 커밋 | 상태 | |---|------|------|------|------| | 1 | 01:00 | Extension↔Bot 프로토콜 불일치 3건 수정 + sql-wasm 번들링 | `e4dc1b1` | 🔧 | +| 2 | 01:45~02:25 | Discord Bridge 디버깅: step 구조 파악, 승인 버튼, AI 텍스트 릴레이 | TBD | ✅ | diff --git a/docs/devlog/entries/20260308-002.md b/docs/devlog/entries/20260308-002.md new file mode 100644 index 0000000..ca6ff1d --- /dev/null +++ b/docs/devlog/entries/20260308-002.md @@ -0,0 +1,47 @@ +# Discord Bridge — Step 구조 파악 및 3대 기능 수정 + +- **시간**: 2026-03-08 01:45~02:25 +- **Commit**: TBD (이 파일과 함께 커밋) + +## 결정 사항 + +### plannerResponse 구조 (확정) +`GetCascadeTrajectorySteps` RPC가 반환하는 `PLANNER_RESPONSE` step의 실제 구조: +``` +plannerResponse: { + response: "사용자 대면 텍스트", ← 핵심 필드 + modifiedResponse: "수정된 버전", + thinking: "내부 사고 (SKIP)", + thinkingSignature: "암호화 해시 (SKIP)", + messageId: "bot-xxx", + toolCalls: [{name, argumentsJson}], + thinkingDuration: "0.9s", + stopReason: "STOP_REASON_STOP_PATTERN" +} +``` + +### RUN_COMMAND 구조 (확정) +``` +step.runCommand: { + commandLine: "echo ...", ← 핵심 필드 + proposedCommandLine: "echo ...", + cwd: "c:\\Users\\...", + waitMsBeforeAsync: "10000", + blocking: true, + autoRunDecision: "AUTO_RUN_DECISION_DEFAULT_DENY" +} +``` +- `step.toolCall`은 존재하지 않음 — `step.runCommand`에 직접 필드 + +### startStepIndex 무시 문제 +`GetCascadeTrajectorySteps({ startStepIndex })` — API가 파라미터를 무시하고 전체 step 반환. +워크어라운드: `allSteps.slice(-e.delta)`로 마지막 N개만 처리. + +### 승인 RPC +- `HandleCascadeUserInteraction` → `socket hang up` (실패) +- `ResolveOutstandingSteps` → 성공 (폴백으로 사용) + +## 미완료 +- 승인 버튼 Discord→Extension→LS 경로: `HandleCascadeUserInteraction` 파라미터 정확히 확인 필요 +- AI 텍스트: 긴 응답(4000자+)의 Discord 분할 표시 테스트 안됨 +- 대화형 짧은 응답이 정상 전달되는지 최종 확인 필요 diff --git a/extension/out/extension.js b/extension/out/extension.js index 97121aa..ba2bb9d 100644 --- a/extension/out/extension.js +++ b/extension/out/extension.js @@ -117,13 +117,6 @@ function writeChatSnapshot(text) { console.log(`Gravity Bridge: snapshot write error: ${e.message}`); } } -function writePendingApproval(data) { - try { - const filePath = path.join(bridgePath, 'response', 'pending_approval.json'); - fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8'); - } - catch { } -} // ─── Command File Watcher (Discord → Antigravity) ─── function processCommandFile(filePath) { try { @@ -227,6 +220,7 @@ async function initSDK(context) { } // Track last seen step per session to avoid re-fetching const lastSeenStep = new Map(); +const lastSnapshotText = new Map(); // dedup: last written text per session function setupMonitor() { if (!sdk) { return; @@ -235,54 +229,67 @@ function setupMonitor() { sdk.monitor.onStepCountChanged(async (e) => { console.log(`Gravity Bridge: [SDK] step changed: "${e.title}" step ${e.newCount} (+${e.delta})`); try { - // Use the correct LS RPC: GetCascadeTrajectorySteps (not GetConversation which doesn't exist) - const fromStep = lastSeenStep.get(e.sessionId) ?? Math.max(0, e.newCount - e.delta); + // IMPORTANT: Only fetch NEW steps, never re-fetch history + const fromStep = Math.max(lastSeenStep.get(e.sessionId) ?? e.newCount - e.delta, e.newCount - e.delta); const stepsData = await sdk.ls.rawRPC('GetCascadeTrajectorySteps', { - cascadeId: e.sessionId, - startStepIndex: fromStep + cascadeId: e.sessionId, startStepIndex: fromStep }); lastSeenStep.set(e.sessionId, e.newCount); - if (stepsData) { - // Try to extract AI text from the steps response - const aiText = extractAIText(stepsData); - if (aiText) { - const text = `🤖 **${e.title}**\n\n${aiText}`; - writeChatSnapshot(text); - console.log(`Gravity Bridge: [SDK] relayed AI response (${aiText.length} chars)`); - return; + if (stepsData && Array.isArray(stepsData.steps)) { + // API may ignore startStepIndex — only process the last e.delta steps + const allSteps = stepsData.steps; + const newSteps = allSteps.slice(-e.delta); + console.log(`Gravity Bridge: [SDK] processing ${newSteps.length} of ${allSteps.length} steps`); + let lastPlannerText = ''; + for (const step of newSteps) { + const sType = step.type || ''; + const sStatus = step.status || ''; + // ── RUN_COMMAND + WAITING → Pending Approval ── + if (sType.includes('RUN_COMMAND') && sStatus.includes('WAITING')) { + const rc = step.runCommand || {}; + const cmdLine = rc.commandLine || rc.proposedCommandLine || ''; + writePendingApproval({ + conversation_id: e.sessionId, + command: cmdLine, + description: `💻 ${e.title}\n\`\`\`\n${cmdLine}\n\`\`\`\ncwd: ${rc.cwd || ''}`, + }); + console.log(`Gravity Bridge: [SDK] ⏳ pending: "${cmdLine.substring(0, 100)}"`); + continue; + } + // ── PLANNER_RESPONSE → collect AI text (COMPLETED/DONE only) ── + if (sType.includes('PLANNER_RESPONSE')) { + if (!sStatus.includes('COMPLETED') && !sStatus.includes('DONE')) { + continue; + } + const pr = step.plannerResponse; + // Use confirmed field: plannerResponse.response or .modifiedResponse + const responseText = pr?.modifiedResponse || pr?.response || ''; + if (responseText && typeof responseText === 'string' && responseText.length > 0) { + lastPlannerText = responseText; // Overwrite — last one wins + console.log(`Gravity Bridge: [SDK] 📝 planner response found (${responseText.length} chars)`); + } + continue; + } } - // Log the raw structure for debugging - console.log(`Gravity Bridge: [SDK] steps data keys: ${JSON.stringify(Object.keys(stepsData))}`); + // Write the LAST planner response as snapshot (with dedup) + if (lastPlannerText && lastPlannerText !== lastSnapshotText.get(e.sessionId)) { + lastSnapshotText.set(e.sessionId, lastPlannerText); + writeChatSnapshot(`🤖 **${e.title}**\n\n${lastPlannerText}`); + console.log(`Gravity Bridge: [SDK] 💬 snapshot written (${lastPlannerText.length} chars)`); + } + return; } } catch (err) { - console.log(`Gravity Bridge: [SDK] GetCascadeTrajectorySteps error: ${err.message}`); - // Fallback: try GetCascadeTrajectory (full trajectory, heavier) - try { - const fullTraj = await sdk.ls.rawRPC('GetCascadeTrajectory', { - cascadeId: e.sessionId - }); - if (fullTraj) { - const aiText = extractAIText(fullTraj); - if (aiText) { - writeChatSnapshot(`🤖 **${e.title}**\n\n${aiText}`); - console.log(`Gravity Bridge: [SDK] relayed via GetCascadeTrajectory (${aiText.length} chars)`); - return; - } - console.log(`Gravity Bridge: [SDK] trajectory keys: ${JSON.stringify(Object.keys(fullTraj))}`); - } - } - catch (err2) { - console.log(`Gravity Bridge: [SDK] GetCascadeTrajectory also failed: ${err2.message}`); - } + console.log(`Gravity Bridge: [SDK] steps error: ${err.message}`); } - // Fallback: just send the title + step info + // Fallback lastSeenStep.set(e.sessionId, e.newCount); - writeChatSnapshot(`🤖 **${e.title}**\n\n(step ${e.newCount}, +${e.delta})`); }); // New conversation started - sdk.monitor.onNewConversation(() => { - console.log('Gravity Bridge: [SDK] new conversation detected'); + sdk.monitor.onNewConversation((e) => { + console.log(`Gravity Bridge: [SDK] new conversation: ${e.title}`); + writeChatSnapshot(`🚀 **${e.title}** — 새 대화 시작`); }); // Active session changed sdk.monitor.onActiveSessionChanged((e) => { @@ -296,50 +303,182 @@ function setupMonitor() { sdk.monitor.start(3000, 2000); console.log('Gravity Bridge: [SDK] monitor started (USS 3s, trajectory 2s)'); } +// ─── Response Watcher (Discord approval → Antigravity RPC) ─── +let responseWatcher = null; +function setupResponseWatcher() { + const responseDir = path.join(bridgePath, 'response'); + if (!fs.existsSync(responseDir)) { + fs.mkdirSync(responseDir, { recursive: true }); + } + try { + responseWatcher = fs.watch(responseDir, (event, filename) => { + if (filename && filename.endsWith('.json') && event === 'rename') { + const fp = path.join(responseDir, filename); + if (fs.existsSync(fp)) { + setTimeout(() => processResponseFile(fp), 300); + } + } + }); + console.log('Gravity Bridge: response watcher started'); + } + catch (e) { + console.log(`Gravity Bridge: response watcher failed: ${e.message}`); + } +} +async function processResponseFile(filePath) { + try { + const content = fs.readFileSync(filePath, 'utf-8'); + const resp = JSON.parse(content); + console.log(`Gravity Bridge: [RESPONSE] request_id=${resp.request_id} approved=${resp.approved}`); + if (!sdk) { + console.log('Gravity Bridge: [RESPONSE] SDK not available'); + return; + } + // Find matching pending request for session_id + const pendingDir = path.join(bridgePath, 'pending'); + const pendingFile = path.join(pendingDir, `${resp.request_id}.json`); + let sessionId = ''; + if (fs.existsSync(pendingFile)) { + try { + const pending = JSON.parse(fs.readFileSync(pendingFile, 'utf-8')); + sessionId = pending.conversation_id || ''; + } + catch { } + } + if (sessionId && resp.approved) { + try { + await sdk.ls.rawRPC('HandleCascadeUserInteraction', { + cascadeId: sessionId, + approved: true, + }); + console.log('Gravity Bridge: [RESPONSE] ✅ approved via HandleCascadeUserInteraction'); + } + catch (e) { + console.log(`Gravity Bridge: [RESPONSE] HandleCascadeUserInteraction failed: ${e.message}`); + try { + await sdk.ls.rawRPC('ResolveOutstandingSteps', { cascadeId: sessionId }); + console.log('Gravity Bridge: [RESPONSE] ✅ approved via ResolveOutstandingSteps'); + } + catch (e2) { + console.log(`Gravity Bridge: [RESPONSE] ResolveOutstandingSteps also failed: ${e2.message}`); + } + } + } + else { + console.log(`Gravity Bridge: [RESPONSE] ${resp.approved ? '✅' : '❌'} (session=${sessionId || 'unknown'})`); + } + try { + fs.unlinkSync(filePath); + } + catch { } + } + catch (e) { + console.log(`Gravity Bridge: [RESPONSE] error: ${e.message}`); + } +} /** - * Extract AI response text from LS RPC step/trajectory data. - * The exact structure depends on the protobuf schema — we try multiple paths. + * Extract AI text from a PLANNER_RESPONSE step. + * Known structure: {type, status, metadata, plannerResponse, ephemeralMessage, ...} + * ephemeralMessage = system prompt (SKIP), plannerResponse = AI content */ -function extractAIText(data) { - if (!data) { +function extractPlannerText(step) { + if (!step) { return null; } - // Try common protobuf response patterns - // Pattern 1: steps array with content - const steps = data.steps || data.trajectorySteps || data.cascadeSteps; - if (Array.isArray(steps) && steps.length > 0) { - // Find the last step with AI content - for (let i = steps.length - 1; i >= 0; i--) { - const step = steps[i]; - // PlannerResponse / assistant content - const content = step.content || step.text || step.summary || - step.plannerResponse || step.assistantMessage || - step.response?.content || step.response?.text; - if (typeof content === 'string' && content.length > 10) { - return content; + // Fields to SKIP — not user-facing content + const SKIP_FIELDS = new Set([ + 'thinking', 'thinkingSignature', 'stopReason', 'type', 'status', 'metadata', + 'ephemeralMessage', 'generatorModel', 'requestedModel', + 'executionId', 'sourceTrajectoryStepInfo', 'stepIndex', + 'viewableAt', 'createdAt', 'finishedGeneratingAt', + 'lastCompletedChunkAt', 'source', 'stepGenerationVersion' + ]); + // plannerResponse can be string or object + const pr = step.plannerResponse; + if (typeof pr === 'string' && pr.length > 10) { + return filterEphemeral(pr); + } + if (pr && typeof pr === 'object') { + // Try known content fields first (NOT thinking/stopReason) + const text = pr.content || pr.text || pr.summary || pr.message || pr.response || pr.output; + if (typeof text === 'string' && text.length > 10) { + return filterEphemeral(text); + } + // Search other fields, but skip non-content ones + for (const key of Object.keys(pr)) { + if (SKIP_FIELDS.has(key)) + continue; + const val = pr[key]; + if (typeof val === 'string' && val.length > 50) { // Higher threshold + const filtered = filterEphemeral(val); + if (filtered) { + console.log(`Gravity Bridge: [DEBUG] planner text in plannerResponse.${key} (${filtered.length} chars)`); + return filtered; + } } } } - // Pattern 2: messages array - const messages = data.messages || data.chatMessages; - if (Array.isArray(messages) && messages.length > 0) { - for (let i = messages.length - 1; i >= 0; i--) { - const msg = messages[i]; - if ((msg.role === 'assistant' || msg.type === 'assistant') && msg.content) { - return msg.content; + // Try other step fields (skip known non-content) + for (const key of Object.keys(step)) { + if (SKIP_FIELDS.has(key) || key === 'plannerResponse') + continue; + const val = step[key]; + if (typeof val === 'string' && val.length > 50) { + const filtered = filterEphemeral(val); + if (filtered) { + console.log(`Gravity Bridge: [DEBUG] planner text in step.${key}`); + return filtered; } } } - // Pattern 3: nested trajectory object - if (data.trajectory) { - return extractAIText(data.trajectory); - } - // Pattern 4: single step response - if (data.content && typeof data.content === 'string') { - return data.content; - } return null; } +/** Filter out system ephemeral messages and non-content strings. */ +function filterEphemeral(text) { + if (!text || text.length < 10) { + return null; + } + // Skip system prompt metadata + if (text.includes('') || text.includes('')) { + return null; + } + if (text.includes('artifact_reminder') || text.includes('active_task_reminder')) { + return null; + } + if (text.includes('no_active_task_reminder')) { + return null; + } + // Skip base64/crypto strings (no spaces, mostly alphanumeric) + if (!text.includes(' ') && /^[A-Za-z0-9+/=_\-]{50,}$/.test(text)) { + return null; + } + return text; +} +/** Write a pending approval file matching Bot's ApprovalRequest dataclass. */ +function writePendingApproval(data) { + try { + const pendingDir = path.join(bridgePath, 'pending'); + if (!fs.existsSync(pendingDir)) { + fs.mkdirSync(pendingDir, { recursive: true }); + } + const id = Date.now().toString(); + const payload = { + request_id: id, + conversation_id: data.conversation_id, + command: data.command, + description: data.description, + timestamp: Date.now() / 1000, + status: 'pending', + discord_message_id: 0, + project_name: projectName, + }; + fs.writeFileSync(path.join(pendingDir, `${id}.json`), JSON.stringify(payload, null, 2), 'utf-8'); + console.log(`Gravity Bridge: pending approval written → ${id}.json`); + } + catch (e) { + console.log(`Gravity Bridge: pending write error: ${e.message}`); + } +} // ─── Activation ─── async function activate(context) { console.log('Gravity Bridge: activating...'); @@ -389,6 +528,8 @@ async function activate(context) { } // Watch commands directory watchCommandsDir(); + // Watch response directory for approval interactions + setupResponseWatcher(); // Register basic commands context.subscriptions.push(vscode.commands.registerCommand('gravityBridge.start', () => { isActive = true; diff --git a/extension/out/extension.js.map b/extension/out/extension.js.map index 0e11e4b..40bc63a 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/src/extension.ts b/extension/src/extension.ts index e560e8b..c43fa18 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -83,12 +83,6 @@ function writeChatSnapshot(text: string) { } } -function writePendingApproval(data: any) { - try { - const filePath = path.join(bridgePath, 'response', 'pending_approval.json'); - fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8'); - } catch { } -} // ─── Command File Watcher (Discord → Antigravity) ─── @@ -199,6 +193,7 @@ async function initSDK(context: vscode.ExtensionContext): Promise { // Track last seen step per session to avoid re-fetching const lastSeenStep = new Map(); +const lastSnapshotText = new Map(); // dedup: last written text per session function setupMonitor() { if (!sdk) { return; } @@ -208,58 +203,75 @@ function setupMonitor() { console.log(`Gravity Bridge: [SDK] step changed: "${e.title}" step ${e.newCount} (+${e.delta})`); try { - // Use the correct LS RPC: GetCascadeTrajectorySteps (not GetConversation which doesn't exist) - const fromStep = lastSeenStep.get(e.sessionId) ?? Math.max(0, e.newCount - e.delta); - + // IMPORTANT: Only fetch NEW steps, never re-fetch history + const fromStep = Math.max( + lastSeenStep.get(e.sessionId) ?? e.newCount - e.delta, + e.newCount - e.delta + ); const stepsData = await sdk.ls.rawRPC('GetCascadeTrajectorySteps', { - cascadeId: e.sessionId, - startStepIndex: fromStep + cascadeId: e.sessionId, startStepIndex: fromStep }); - lastSeenStep.set(e.sessionId, e.newCount); - if (stepsData) { - // Try to extract AI text from the steps response - const aiText = extractAIText(stepsData); - if (aiText) { - const text = `🤖 **${e.title}**\n\n${aiText}`; - writeChatSnapshot(text); - console.log(`Gravity Bridge: [SDK] relayed AI response (${aiText.length} chars)`); - return; + if (stepsData && Array.isArray(stepsData.steps)) { + // API may ignore startStepIndex — only process the last e.delta steps + const allSteps = stepsData.steps; + const newSteps = allSteps.slice(-e.delta); + console.log(`Gravity Bridge: [SDK] processing ${newSteps.length} of ${allSteps.length} steps`); + + let lastPlannerText = ''; + for (const step of newSteps) { + const sType = step.type || ''; + const sStatus = step.status || ''; + + // ── RUN_COMMAND + WAITING → Pending Approval ── + if (sType.includes('RUN_COMMAND') && sStatus.includes('WAITING')) { + const rc = step.runCommand || {}; + const cmdLine = rc.commandLine || rc.proposedCommandLine || ''; + writePendingApproval({ + conversation_id: e.sessionId, + command: cmdLine, + description: `💻 ${e.title}\n\`\`\`\n${cmdLine}\n\`\`\`\ncwd: ${rc.cwd || ''}`, + }); + console.log(`Gravity Bridge: [SDK] ⏳ pending: "${cmdLine.substring(0, 100)}"`); + continue; + } + + // ── PLANNER_RESPONSE → collect AI text (COMPLETED/DONE only) ── + if (sType.includes('PLANNER_RESPONSE')) { + if (!sStatus.includes('COMPLETED') && !sStatus.includes('DONE')) { + continue; + } + const pr = step.plannerResponse; + // Use confirmed field: plannerResponse.response or .modifiedResponse + const responseText = pr?.modifiedResponse || pr?.response || ''; + if (responseText && typeof responseText === 'string' && responseText.length > 0) { + lastPlannerText = responseText; // Overwrite — last one wins + console.log(`Gravity Bridge: [SDK] 📝 planner response found (${responseText.length} chars)`); + } + continue; + } } - // Log the raw structure for debugging - console.log(`Gravity Bridge: [SDK] steps data keys: ${JSON.stringify(Object.keys(stepsData))}`); + + // Write the LAST planner response as snapshot (with dedup) + if (lastPlannerText && lastPlannerText !== lastSnapshotText.get(e.sessionId)) { + lastSnapshotText.set(e.sessionId, lastPlannerText); + writeChatSnapshot(`🤖 **${e.title}**\n\n${lastPlannerText}`); + console.log(`Gravity Bridge: [SDK] 💬 snapshot written (${lastPlannerText.length} chars)`); + } + return; } } catch (err: any) { - console.log(`Gravity Bridge: [SDK] GetCascadeTrajectorySteps error: ${err.message}`); - - // Fallback: try GetCascadeTrajectory (full trajectory, heavier) - try { - const fullTraj = await sdk.ls.rawRPC('GetCascadeTrajectory', { - cascadeId: e.sessionId - }); - if (fullTraj) { - const aiText = extractAIText(fullTraj); - if (aiText) { - writeChatSnapshot(`🤖 **${e.title}**\n\n${aiText}`); - console.log(`Gravity Bridge: [SDK] relayed via GetCascadeTrajectory (${aiText.length} chars)`); - return; - } - console.log(`Gravity Bridge: [SDK] trajectory keys: ${JSON.stringify(Object.keys(fullTraj))}`); - } - } catch (err2: any) { - console.log(`Gravity Bridge: [SDK] GetCascadeTrajectory also failed: ${err2.message}`); - } + console.log(`Gravity Bridge: [SDK] steps error: ${err.message}`); } - - // Fallback: just send the title + step info + // Fallback lastSeenStep.set(e.sessionId, e.newCount); - writeChatSnapshot(`🤖 **${e.title}**\n\n(step ${e.newCount}, +${e.delta})`); }); // New conversation started - sdk.monitor.onNewConversation(() => { - console.log('Gravity Bridge: [SDK] new conversation detected'); + sdk.monitor.onNewConversation((e: any) => { + console.log(`Gravity Bridge: [SDK] new conversation: ${e.title}`); + writeChatSnapshot(`🚀 **${e.title}** — 새 대화 시작`); }); // Active session changed @@ -277,54 +289,171 @@ function setupMonitor() { console.log('Gravity Bridge: [SDK] monitor started (USS 3s, trajectory 2s)'); } +// ─── Response Watcher (Discord approval → Antigravity RPC) ─── + +let responseWatcher: fs.FSWatcher | null = null; + +function setupResponseWatcher() { + const responseDir = path.join(bridgePath, 'response'); + if (!fs.existsSync(responseDir)) { + fs.mkdirSync(responseDir, { recursive: true }); + } + + try { + responseWatcher = fs.watch(responseDir, (event, filename) => { + if (filename && filename.endsWith('.json') && event === 'rename') { + const fp = path.join(responseDir, filename); + if (fs.existsSync(fp)) { + setTimeout(() => processResponseFile(fp), 300); + } + } + }); + console.log('Gravity Bridge: response watcher started'); + } catch (e: any) { + console.log(`Gravity Bridge: response watcher failed: ${e.message}`); + } +} + +async function processResponseFile(filePath: string) { + try { + const content = fs.readFileSync(filePath, 'utf-8'); + const resp = JSON.parse(content); + console.log(`Gravity Bridge: [RESPONSE] request_id=${resp.request_id} approved=${resp.approved}`); + + if (!sdk) { + console.log('Gravity Bridge: [RESPONSE] SDK not available'); + return; + } + + // Find matching pending request for session_id + const pendingDir = path.join(bridgePath, 'pending'); + const pendingFile = path.join(pendingDir, `${resp.request_id}.json`); + let sessionId = ''; + if (fs.existsSync(pendingFile)) { + try { + const pending = JSON.parse(fs.readFileSync(pendingFile, 'utf-8')); + sessionId = pending.conversation_id || ''; + } catch { } + } + + if (sessionId && resp.approved) { + try { + await sdk.ls.rawRPC('HandleCascadeUserInteraction', { + cascadeId: sessionId, + approved: true, + }); + console.log('Gravity Bridge: [RESPONSE] ✅ approved via HandleCascadeUserInteraction'); + } catch (e: any) { + console.log(`Gravity Bridge: [RESPONSE] HandleCascadeUserInteraction failed: ${e.message}`); + try { + await sdk.ls.rawRPC('ResolveOutstandingSteps', { cascadeId: sessionId }); + console.log('Gravity Bridge: [RESPONSE] ✅ approved via ResolveOutstandingSteps'); + } catch (e2: any) { + console.log(`Gravity Bridge: [RESPONSE] ResolveOutstandingSteps also failed: ${e2.message}`); + } + } + } else { + console.log(`Gravity Bridge: [RESPONSE] ${resp.approved ? '✅' : '❌'} (session=${sessionId || 'unknown'})`); + } + + try { fs.unlinkSync(filePath); } catch { } + } catch (e: any) { + console.log(`Gravity Bridge: [RESPONSE] error: ${e.message}`); + } +} + /** - * Extract AI response text from LS RPC step/trajectory data. - * The exact structure depends on the protobuf schema — we try multiple paths. + * Extract AI text from a PLANNER_RESPONSE step. + * Known structure: {type, status, metadata, plannerResponse, ephemeralMessage, ...} + * ephemeralMessage = system prompt (SKIP), plannerResponse = AI content */ -function extractAIText(data: any): string | null { - if (!data) { return null; } +function extractPlannerText(step: any): string | null { + if (!step) { return null; } - // Try common protobuf response patterns - // Pattern 1: steps array with content - const steps = data.steps || data.trajectorySteps || data.cascadeSteps; - if (Array.isArray(steps) && steps.length > 0) { - // Find the last step with AI content - for (let i = steps.length - 1; i >= 0; i--) { - const step = steps[i]; - // PlannerResponse / assistant content - const content = step.content || step.text || step.summary || - step.plannerResponse || step.assistantMessage || - step.response?.content || step.response?.text; - if (typeof content === 'string' && content.length > 10) { - return content; + // Fields to SKIP — not user-facing content + const SKIP_FIELDS = new Set([ + 'thinking', 'thinkingSignature', 'stopReason', 'type', 'status', 'metadata', + 'ephemeralMessage', 'generatorModel', 'requestedModel', + 'executionId', 'sourceTrajectoryStepInfo', 'stepIndex', + 'viewableAt', 'createdAt', 'finishedGeneratingAt', + 'lastCompletedChunkAt', 'source', 'stepGenerationVersion' + ]); + + // plannerResponse can be string or object + const pr = step.plannerResponse; + if (typeof pr === 'string' && pr.length > 10) { + return filterEphemeral(pr); + } + if (pr && typeof pr === 'object') { + // Try known content fields first (NOT thinking/stopReason) + const text = pr.content || pr.text || pr.summary || pr.message || pr.response || pr.output; + if (typeof text === 'string' && text.length > 10) { + return filterEphemeral(text); + } + // Search other fields, but skip non-content ones + for (const key of Object.keys(pr)) { + if (SKIP_FIELDS.has(key)) continue; + const val = pr[key]; + if (typeof val === 'string' && val.length > 50) { // Higher threshold + const filtered = filterEphemeral(val); + if (filtered) { + console.log(`Gravity Bridge: [DEBUG] planner text in plannerResponse.${key} (${filtered.length} chars)`); + return filtered; + } } } } - // Pattern 2: messages array - const messages = data.messages || data.chatMessages; - if (Array.isArray(messages) && messages.length > 0) { - for (let i = messages.length - 1; i >= 0; i--) { - const msg = messages[i]; - if ((msg.role === 'assistant' || msg.type === 'assistant') && msg.content) { - return msg.content; + // Try other step fields (skip known non-content) + for (const key of Object.keys(step)) { + if (SKIP_FIELDS.has(key) || key === 'plannerResponse') continue; + const val = step[key]; + if (typeof val === 'string' && val.length > 50) { + const filtered = filterEphemeral(val); + if (filtered) { + console.log(`Gravity Bridge: [DEBUG] planner text in step.${key}`); + return filtered; } } } - - // Pattern 3: nested trajectory object - if (data.trajectory) { - return extractAIText(data.trajectory); - } - - // Pattern 4: single step response - if (data.content && typeof data.content === 'string') { - return data.content; - } - return null; } +/** Filter out system ephemeral messages and non-content strings. */ +function filterEphemeral(text: string): string | null { + if (!text || text.length < 10) { return null; } + // Skip system prompt metadata + if (text.includes('') || text.includes('')) { return null; } + if (text.includes('artifact_reminder') || text.includes('active_task_reminder')) { return null; } + if (text.includes('no_active_task_reminder')) { return null; } + // Skip base64/crypto strings (no spaces, mostly alphanumeric) + if (!text.includes(' ') && /^[A-Za-z0-9+/=_\-]{50,}$/.test(text)) { return null; } + return text; +} + +/** Write a pending approval file matching Bot's ApprovalRequest dataclass. */ +function writePendingApproval(data: { conversation_id: string; command: string; description: string }) { + try { + const pendingDir = path.join(bridgePath, 'pending'); + if (!fs.existsSync(pendingDir)) { fs.mkdirSync(pendingDir, { recursive: true }); } + const id = Date.now().toString(); + const payload = { + request_id: id, + conversation_id: data.conversation_id, + command: data.command, + description: data.description, + timestamp: Date.now() / 1000, + status: 'pending', + discord_message_id: 0, + project_name: projectName, + }; + fs.writeFileSync(path.join(pendingDir, `${id}.json`), JSON.stringify(payload, null, 2), 'utf-8'); + console.log(`Gravity Bridge: pending approval written → ${id}.json`); + } catch (e: any) { + console.log(`Gravity Bridge: pending write error: ${e.message}`); + } +} + // ─── Activation ─── export async function activate(context: vscode.ExtensionContext) { @@ -383,6 +512,8 @@ export async function activate(context: vscode.ExtensionContext) { // Watch commands directory watchCommandsDir(); + // Watch response directory for approval interactions + setupResponseWatcher(); // Register basic commands context.subscriptions.push( vscode.commands.registerCommand('gravityBridge.start', () => {