From 498683c977c121e5a72324d5d3e408eeb8228a89 Mon Sep 17 00:00:00 2001 From: Variet Worker Date: Sun, 19 Apr 2026 07:32:49 +0900 Subject: [PATCH] =?UTF-8?q?fix(approval):=20=5Ffrom=5Fws=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=2060=EC=B4=88=20TTL=20=EC=9E=90=EB=8F=99=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=E2=80=94=20stale=20SKIP=20=EC=8A=A4=ED=8C=B8=20?= =?UTF-8?q?=EB=B0=A9=EC=A7=80=20(v0.5.85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extension/package-lock.json | 4 ++-- extension/package.json | 2 +- extension/src/approval-handler.ts | 8 ++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/extension/package-lock.json b/extension/package-lock.json index 7dc275c..d5e8804 100644 --- a/extension/package-lock.json +++ b/extension/package-lock.json @@ -1,12 +1,12 @@ { "name": "gravity-bridge", - "version": "0.5.84", + "version": "0.5.85", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gravity-bridge", - "version": "0.5.84", + "version": "0.5.85", "dependencies": { "cheerio": "^1.2.0", "ws": "^8.19.0" diff --git a/extension/package.json b/extension/package.json index ecbd161..6d16503 100644 --- a/extension/package.json +++ b/extension/package.json @@ -2,7 +2,7 @@ "name": "gravity-bridge", "displayName": "Gravity Bridge", "description": "Discord-based unified approval system for Antigravity AI interactions.", - "version": "0.5.84", + "version": "0.5.85", "publisher": "variet", "engines": { "vscode": "^1.100.0" diff --git a/extension/src/approval-handler.ts b/extension/src/approval-handler.ts index 4ab84e0..52c43ac 100644 --- a/extension/src/approval-handler.ts +++ b/extension/src/approval-handler.ts @@ -212,6 +212,14 @@ async function processResponseFile(filePath: string) { // Without this skip, the watcher deletes the file before Observer can poll it // (since no pending file exists for the isDomObserver check). if (resp._from_ws) { + // v26: TTL — delete stale _from_ws files after 60s to prevent infinite SKIP spam + const wsRidTs = parseInt((resp.request_id || '').split('_')[0], 10); + const wsAge = isNaN(wsRidTs) ? 999999 : Date.now() - wsRidTs; + if (wsAge > 60_000) { + ctx.logToFile(`[RESPONSE] CLEANUP stale _from_ws file: ${resp.request_id} age=${Math.round(wsAge / 1000)}s`); + try { fs.unlinkSync(filePath); } catch { } + return; + } ctx.logToFile(`[RESPONSE] SKIP _from_ws file (for Observer pollResponseGroup): ${resp.request_id}`); return; }