From f500f4c81039f237f9536c7a2ca3d9b12bb8d1de Mon Sep 17 00:00:00 2001 From: VitaCodez Date: Tue, 18 Aug 2026 14:35:47 +0200 Subject: [PATCH] fixed some bugs --- .../src/provider/Layers/AntigravityAdapter.ts | 122 ++++++++++++------ .../provider/scripts/antigravity_bridge.py | 5 + pnpm-lock.yaml | 3 + 3 files changed, 92 insertions(+), 38 deletions(-) diff --git a/apps/server/src/provider/Layers/AntigravityAdapter.ts b/apps/server/src/provider/Layers/AntigravityAdapter.ts index dfa2320a8..7a0373413 100644 --- a/apps/server/src/provider/Layers/AntigravityAdapter.ts +++ b/apps/server/src/provider/Layers/AntigravityAdapter.ts @@ -55,6 +55,7 @@ export function resolveAntigravitySpawnCommand( if (!binary.includes("\\") && !binary.includes("/")) { const localAppData = env.LOCALAPPDATA?.trim(); const userProfile = env.USERPROFILE?.trim(); + const appData = env.APPDATA?.trim(); if (localAppData && NodeFS.existsSync(`${localAppData}\\agy\\bin\\agy.exe`)) { resolvedBinary = `${localAppData}\\agy\\bin\\agy.exe`; } else if ( @@ -62,6 +63,15 @@ export function resolveAntigravitySpawnCommand( NodeFS.existsSync(`${userProfile}\\.gemini\\antigravity\\bin\\agy.exe`) ) { resolvedBinary = `${userProfile}\\.gemini\\antigravity\\bin\\agy.exe`; + } else if ( + localAppData && + NodeFS.existsSync(`${localAppData}\\Programs\\Antigravity\\bin\\agy.exe`) + ) { + resolvedBinary = `${localAppData}\\Programs\\Antigravity\\bin\\agy.exe`; + } else if (appData && NodeFS.existsSync(`${appData}\\Antigravity\\bin\\agy.exe`)) { + resolvedBinary = `${appData}\\Antigravity\\bin\\agy.exe`; + } else if (appData && NodeFS.existsSync(`${appData}\\Roaming\\Antigravity\\bin\\agy.exe`)) { + resolvedBinary = `${appData}\\Roaming\\Antigravity\\bin\\agy.exe`; } } @@ -279,7 +289,10 @@ export function makeAntigravityAdapter( const selectedModel = input.modelSelection?.model ?? ctx.currentModelId ?? "gemini-3.7-flash"; const effortOption = input.modelSelection?.options?.find((opt) => opt.id === "effort"); - const effortValue = typeof effortOption?.value === "string" ? effortOption.value : "medium"; + const rawEffort = + typeof effortOption?.value === "string" ? effortOption.value.trim().toLowerCase() : ""; + const validEfforts = ["low", "medium", "high"]; + const effortValue = validEfforts.includes(rawEffort) ? rawEffort : "medium"; let spawnCommand: { command: string; args: Array; shell: boolean }; @@ -475,7 +488,28 @@ export function makeAntigravityAdapter( conversationId: ctx.agyConversationId, }; } - if (typeof res.response === "string" && !fullText) { + if (res.status === "ERROR" || res.error) { + const errorMsg = String( + res.error || res.response || "Antigravity turn error", + ); + if (!fullText) { + fullText = `Error: ${errorMsg}`; + yield* emitEvent({ + eventId: makeEventId("content.delta", input.threadId, turnId), + provider: PROVIDER, + providerInstanceId: instanceId, + threadId: input.threadId, + turnId, + itemId, + createdAt: new Date().toISOString(), + type: "content.delta", + payload: { + streamKind: "assistant_text", + delta: `\n\n**Error:** ${errorMsg}\n`, + }, + }); + } + } else if (typeof res.response === "string" && !fullText) { fullText = res.response; yield* emitEvent({ eventId: makeEventId("content.delta", input.threadId, turnId), @@ -546,26 +580,30 @@ export function makeAntigravityAdapter( yield* Effect.all( [ - Stream.runForEach(child.stdout, (chunk) => - Effect.gen(function* () { - const text = new TextDecoder().decode(chunk); - yield* Effect.logInfo("antigravity.stdout.chunk", { textLength: text.length }); - stdoutBuffer += text; - - const lines = stdoutBuffer.split("\n"); - stdoutBuffer = lines.pop() ?? ""; - - for (const line of lines) { - yield* processLine(line); - } - }), + child.stdout.pipe( + Stream.decodeText(), + Stream.runForEach((text) => + Effect.gen(function* () { + yield* Effect.logInfo("antigravity.stdout.chunk", { textLength: text.length }); + stdoutBuffer += text; + + const lines = stdoutBuffer.split("\n"); + stdoutBuffer = lines.pop() ?? ""; + + for (const line of lines) { + yield* processLine(line); + } + }), + ), ), - Stream.runForEach(child.stderr, (chunk) => - Effect.gen(function* () { - const errChunk = new TextDecoder().decode(chunk); - stderrText += errChunk; - yield* Effect.logWarning("antigravity.stderr.chunk", { text: errChunk }); - }), + child.stderr.pipe( + Stream.decodeText(), + Stream.runForEach((errChunk) => + Effect.gen(function* () { + stderrText += errChunk; + yield* Effect.logWarning("antigravity.stderr.chunk", { text: errChunk }); + }), + ), ), ], { concurrency: "unbounded" }, @@ -583,23 +621,30 @@ export function makeAntigravityAdapter( agyConversationId: ctx.agyConversationId, }); - if (exitCode !== 0 && stderrText.trim() && !fullText) { - const errMessage = stderrText.trim(); - fullText = `Error: ${errMessage}`; - yield* emitEvent({ - eventId: makeEventId("content.delta", input.threadId, turnId), - provider: PROVIDER, - providerInstanceId: instanceId, - threadId: input.threadId, - turnId, - itemId, - createdAt: new Date().toISOString(), - type: "content.delta", - payload: { - streamKind: "assistant_text", - delta: fullText, - }, - }); + let errorMessage: string | undefined; + if (exitCode !== 0) { + errorMessage = + stderrText.trim() || + (fullText.startsWith("Error:") + ? fullText + : `Antigravity process exited with non-zero status (${exitCode}).`); + if (!fullText) { + fullText = `Error: ${errorMessage}`; + yield* emitEvent({ + eventId: makeEventId("content.delta", input.threadId, turnId), + provider: PROVIDER, + providerInstanceId: instanceId, + threadId: input.threadId, + turnId, + itemId, + createdAt: new Date().toISOString(), + type: "content.delta", + payload: { + streamKind: "assistant_text", + delta: `\n\n**Error:** ${errorMessage}\n`, + }, + }); + } } ctx.turns.push({ id: turnId, items: [{ prompt: textPrompt, response: fullText }] }); @@ -631,6 +676,7 @@ export function makeAntigravityAdapter( type: "turn.completed", payload: { state: exitCode === 0 ? "completed" : "failed", + ...(errorMessage ? { errorMessage } : {}), ...(ctx.agyConversationId ? { providerThreadId: ctx.agyConversationId } : {}), ...(ctx.session.resumeCursor !== undefined ? { resumeCursor: ctx.session.resumeCursor } diff --git a/apps/server/src/provider/scripts/antigravity_bridge.py b/apps/server/src/provider/scripts/antigravity_bridge.py index edf91a13d..c9983bd3b 100644 --- a/apps/server/src/provider/scripts/antigravity_bridge.py +++ b/apps/server/src/provider/scripts/antigravity_bridge.py @@ -8,6 +8,11 @@ import os import sys +if hasattr(sys.stdout, "reconfigure"): + sys.stdout.reconfigure(encoding="utf-8") +if hasattr(sys.stderr, "reconfigure"): + sys.stderr.reconfigure(encoding="utf-8") + def emit_event(event_type: str, data: dict): payload = {"type": event_type, **data} sys.stdout.write(json.dumps(payload) + "\n") diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9fbeefd99..c3e91fc61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5166,10 +5166,12 @@ packages: '@xmldom/xmldom@0.8.13': resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} + deprecated: this version has critical issues, please update to the latest version '@xmldom/xmldom@0.9.10': resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} engines: {node: '>=14.6'} + deprecated: this version has critical issues, please update to the latest version '@xterm/addon-fit@0.11.0': resolution: {integrity: sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==} @@ -5992,6 +5994,7 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + deprecated: Active development of CryptoJS has been discontinued. This library is no longer maintained. css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}