From 7c8891b99cac078426d5abc6a9367e962734ce1f Mon Sep 17 00:00:00 2001 From: Variet Worker Date: Mon, 20 Apr 2026 04:43:56 +0900 Subject: [PATCH] =?UTF-8?q?fix(bridge):=20v38=20auto-approve=20response?= =?UTF-8?q?=EC=97=90=20=5Ffrom=5Fws=20=EB=A7=88=EC=BB=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=E2=80=94=20Observer=20polling=20=EC=8B=A4=ED=8C=A8?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20(v0.5.103)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 근본 원인: auto-approve response 파일에 _from_ws 마커 없음. processResponseFile(response watcher)이 Observer보다 먼저 파일을 읽고 삭제. Observer의 GET /response/{rid} polling이 항상 {waiting:true} 반환. known-issues [2026-04-18] WS response 파일 삭제 버그와 동일 패턴. --- extension/package-lock.json | 4 ++-- extension/package.json | 2 +- extension/src/http-bridge.ts | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/extension/package-lock.json b/extension/package-lock.json index c0bd0af..d327453 100644 --- a/extension/package-lock.json +++ b/extension/package-lock.json @@ -1,12 +1,12 @@ { "name": "gravity-bridge", - "version": "0.5.102", + "version": "0.5.103", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gravity-bridge", - "version": "0.5.102", + "version": "0.5.103", "dependencies": { "cheerio": "^1.2.0", "ws": "^8.19.0" diff --git a/extension/package.json b/extension/package.json index 8c04dc5..e3be207 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.102", + "version": "0.5.103", "publisher": "variet", "engines": { "vscode": "^1.100.0" diff --git a/extension/src/http-bridge.ts b/extension/src/http-bridge.ts index 62c1118..8cd4c5e 100644 --- a/extension/src/http-bridge.ts +++ b/extension/src/http-bridge.ts @@ -379,6 +379,8 @@ function _handlePending(req: any, res: any, ctx: HttpBridgeContext) { button_index: alwaysRunBtnIndex >= 0 ? alwaysRunBtnIndex : 0, step_type: data.step_type || 'command', project_name: ctx.projectName, + _from_ws: true, // v38: prevent processResponseFile from consuming before Observer polls + _auto_approve_ttl: Date.now() + 60_000, // auto-expire after 60s }; fs.writeFileSync( path.join(responseDir, `${rid}.json`),