fix(extension): v0.3.16 — diff_review duplicate approval filter + IDLE notification + !auto echo removal
This commit is contained in:
@@ -592,3 +592,15 @@
|
||||
- **파일 위치**: `%LOCALAPPDATA%\Programs\Antigravity\resources\app\out\jetskiAgent\main.js` (LS 메서드 정의), `vs\workbench\workbench.desktop.main.js` (UI 커맨드 + 핸들러)
|
||||
- **주의**: Python `re.finditer`로 대용량 JS 검색 시 PowerShell `IndexOf`보다 안정적. minified JS에서 변수명(`vKa`, `QLc` 등)은 버전마다 변경됨
|
||||
|
||||
### [2026-03-16] diff_review 이중 승인 요청 — DOM observer가 Accept/Reject 버튼 캡처
|
||||
- **증상**: Discord에 diff_review 승인 요청(Accept all/Reject all)과 별도로 "Accept" / "Reject" 단독 pending이 1건 더 도착
|
||||
- **원인**: diff_review 처리 시 `openReviewChanges` 커맨드가 diff UI 패널을 열면 Accept/Reject 버튼이 DOM에 렌더링됨. DOM observer가 이 버튼을 감지하여 별도 pending 생성 (`cmd="Accept" btns=2 ctx="RejectShift+Alt+⌫"`)
|
||||
- **해결**: `FALSE_POSITIVE_RE`에 `Accept|Reject|Accept all|Reject all` 추가 (v0.3.16)
|
||||
- **주의**: diff review bar 버튼은 전용 `diff_review` pending 시스템에서 처리하므로 DOM observer가 별도로 캡처할 필요 없음
|
||||
|
||||
### [2026-03-16] !auto 이중 메시지 — Extension echo + Bot embed
|
||||
- **증상**: `!auto` 토글 시 Discord에 Auto 모드 변경 메시지가 2개 표시 (Bot embed + Extension echo)
|
||||
- **원인**: Bot이 embed를 전송하고 + `!auto on/off` command를 Extension에 전달 → Extension이 `writeChatSnapshot()`으로 확인 메시지를 다시 Discord에 전송 → Bot의 `chat_snapshot_scanner`가 이것을 읽어 또 전송
|
||||
- **해결**: Extension의 `!auto` command handler에서 `writeChatSnapshot()` echo 제거 (v0.3.16). Bot의 embed 1개만 표시
|
||||
- **주의**: Extension 측 `autoApproveEnabled` 변수는 여전히 정상 토글됨 (로그에 기록). 단, Bot 재시작 시 `auto_approve_projects` set은 초기화되므로 Extension은 auto 상태여도 Bot이 auto-approve를 실행하지 않음 → 사실상 수동 모드로 복귀
|
||||
|
||||
|
||||
@@ -6,4 +6,5 @@
|
||||
| 002 | 13:25~14:20 | diff_review 핸들러 2-strategy 리팩토링 + 배포 불일치 발견/수정 + pending 순서 8초 지연 + 1차 테스트 (버튼 OK, RPC 미배포→재배포) + known-issues 2건 | `f302984` | ✅ |
|
||||
| 003 | 15:18~16:55 | diff_review steps=[] 근본 원인 분석 + 인메모리 캐시 (v0.3.13) + 3차 E2E (RPC SUCCESS but no-op) + 4가지 파라미터 실험 배포 | `00b9491` | ✅ |
|
||||
| 004 | 17:05~18:00 | AG 소스 역분석 — `AcknowledgeCascadeCodeEdit`→`acknowledgeCodeActionStep` 메서드명 오류 발견 + v0.3.14 3단계 전략 배포 + known-issues 2건 업데이트 | `5a1d4f0` | ✅ |
|
||||
| 005 | 18:13~18:43 | v0.3.14 E2E 테스트 → RPC 3개 전략 모두 실패 확인 + v0.3.15 agentAcceptAllInFile 전환 배포 + known-issues 업데이트 | `0fdf668` | 🔧 |
|
||||
| 005 | 18:13~18:43 | v0.3.14 E2E 테스트 → RPC 3개 전략 모두 실패 확인 + v0.3.15 agentAcceptAllInFile 전환 배포 + known-issues 업데이트 | `0fdf668` | ✅ |
|
||||
| 006 | 18:47~19:09 | v0.3.15 diff_review E2E 2회 성공 + 이중 승인 수정 + IDLE 종료 알림 + !auto 이중 메시지 수정 (v0.3.16) + known-issues 2건 | `3cd7122` | ✅ |
|
||||
|
||||
@@ -231,10 +231,6 @@ function processCommandFile(filePath) {
|
||||
autoApproveEnabled = !autoApproveEnabled;
|
||||
}
|
||||
logToFile(`[AUTO] auto-approve toggled → ${autoApproveEnabled}`);
|
||||
// Confirm back to Discord
|
||||
const emoji = autoApproveEnabled ? '🟢' : '🔴';
|
||||
const mode = autoApproveEnabled ? '자동 승인 활성' : '수동 승인 모드';
|
||||
writeChatSnapshot(`${emoji} **Extension 확인**: ${mode} (project=${projectName})`);
|
||||
}
|
||||
else if (text) {
|
||||
// Send message to Antigravity — use VS Code command (most reliable)
|
||||
@@ -751,7 +747,7 @@ function startObserverHttpBridge() {
|
||||
const data = JSON.parse(body);
|
||||
// ── Server-side false positive filter ──
|
||||
const cmd = (data.command || '').trim();
|
||||
const FALSE_POSITIVE_RE = /^(Proceed|Continue|Open|Close|OK|Yes|No|Save|Undo|Redo|Back|Next|More|Less|Got it|Deny|Allow Once|Allow This Conversation|Dismiss|Decline)$/i;
|
||||
const FALSE_POSITIVE_RE = /^(Proceed|Continue|Open|Close|OK|Yes|No|Save|Undo|Redo|Back|Next|More|Less|Got it|Deny|Allow Once|Allow This Conversation|Dismiss|Decline|Accept|Reject|Accept all|Reject all)$/i;
|
||||
if (FALSE_POSITIVE_RE.test(cmd)) {
|
||||
logToFile(`[HTTP] filtered false positive: "${cmd}"`);
|
||||
res.writeHead(200, { 'Content-Type': 'application/json' });
|
||||
@@ -2431,6 +2427,8 @@ function setupMonitor() {
|
||||
catch (re) {
|
||||
logToFile(`[RESPONSE-CAPTURE] error: ${re.message.substring(0, 100)}`);
|
||||
}
|
||||
// Send explicit IDLE notification so user knows the step is done
|
||||
writeChatSnapshot(`✅ **Step ${currentCount} 작업 종료**`);
|
||||
}
|
||||
// ── Diff review detection: if session just went IDLE and files were modified ──
|
||||
if (wasRunning && !isRunning && pendingModifiedFiles.length > 0) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -2,7 +2,7 @@
|
||||
"name": "gravity-bridge",
|
||||
"displayName": "Gravity Bridge",
|
||||
"description": "Antigravity ↔ Discord 브리지 연동 확장",
|
||||
"version": "0.3.15",
|
||||
"version": "0.3.16",
|
||||
"publisher": "variet",
|
||||
"engines": {
|
||||
"vscode": "^1.100.0"
|
||||
|
||||
@@ -196,10 +196,6 @@ function processCommandFile(filePath: string) {
|
||||
autoApproveEnabled = !autoApproveEnabled;
|
||||
}
|
||||
logToFile(`[AUTO] auto-approve toggled → ${autoApproveEnabled}`);
|
||||
// Confirm back to Discord
|
||||
const emoji = autoApproveEnabled ? '🟢' : '🔴';
|
||||
const mode = autoApproveEnabled ? '자동 승인 활성' : '수동 승인 모드';
|
||||
writeChatSnapshot(`${emoji} **Extension 확인**: ${mode} (project=${projectName})`);
|
||||
} else if (text) {
|
||||
// Send message to Antigravity — use VS Code command (most reliable)
|
||||
recentDiscordSentTexts.set(text.trim(), Date.now());
|
||||
@@ -748,7 +744,7 @@ function startObserverHttpBridge(): Promise<number> {
|
||||
|
||||
// ── Server-side false positive filter ──
|
||||
const cmd = (data.command || '').trim();
|
||||
const FALSE_POSITIVE_RE = /^(Proceed|Continue|Open|Close|OK|Yes|No|Save|Undo|Redo|Back|Next|More|Less|Got it|Deny|Allow Once|Allow This Conversation|Dismiss|Decline)$/i;
|
||||
const FALSE_POSITIVE_RE = /^(Proceed|Continue|Open|Close|OK|Yes|No|Save|Undo|Redo|Back|Next|More|Less|Got it|Deny|Allow Once|Allow This Conversation|Dismiss|Decline|Accept|Reject|Accept all|Reject all)$/i;
|
||||
if (FALSE_POSITIVE_RE.test(cmd)) {
|
||||
logToFile(`[HTTP] filtered false positive: "${cmd}"`);
|
||||
res.writeHead(200, { 'Content-Type': 'application/json' });
|
||||
@@ -2399,6 +2395,8 @@ function setupMonitor() {
|
||||
} catch (re: any) {
|
||||
logToFile(`[RESPONSE-CAPTURE] error: ${re.message.substring(0, 100)}`);
|
||||
}
|
||||
// Send explicit IDLE notification so user knows the step is done
|
||||
writeChatSnapshot(`✅ **Step ${currentCount} 작업 종료**`);
|
||||
}
|
||||
|
||||
// ── Diff review detection: if session just went IDLE and files were modified ──
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
def test_function():
|
||||
"""This function exists solely to trigger a diff review."""
|
||||
return "diff_review_test_v0.3.14"
|
||||
return "diff_review_test_v0.3.15_round2_18:54"
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(test_function())
|
||||
|
||||
Reference in New Issue
Block a user