From db0f6ddc151d4e8a76c81f2a943b4aee81bdc147 Mon Sep 17 00:00:00 2001 From: Alex Southwell <4596216+saphid@users.noreply.github.com> Date: Tue, 3 Nov 2026 12:27:01 +1100 Subject: [PATCH 1/3] fix(server): Antigravity commit and title generation keep the provider's error message Co-Authored-By: Claude Opus 5.5 --- .../AntigravityTextGeneration.test.ts | 23 ++++++++++++++++++- .../AntigravityTextGeneration.ts | 5 +++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts b/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts index 7e1f1446d1a55..3b81dcd282ab2 100644 --- a/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts +++ b/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts @@ -16,7 +16,7 @@ import * as Queue from "effect/Queue"; import * as Schema from "effect/Schema"; import * as Scope from "effect/Scope"; import * as Stream from "effect/Stream"; -import { type AcpError } from "effect-acp/errors"; +import { type AcpError, AcpRequestError } from "effect-acp/errors"; import type * as AcpSchema from "effect-acp/compat"; import { expect } from "vite-plus/test"; @@ -452,6 +452,27 @@ it.layer(NodeServices.layer)("AntigravityTextGeneration", (it) => { }).pipe(Effect.scoped), ); + it.effect("keeps Antigravity's error message when the prompt request fails", () => + Effect.gen(function* () { + const fixture = yield* makeFixture({ + prompt: () => + Effect.fail( + new AcpRequestError({ + code: -32603, + errorMessage: "Model is temporarily unavailable.", + }), + ), + }); + const error = yield* fixture.textGeneration + .generateThreadTitle(fixture.titleInput) + .pipe(Effect.flip); + expect(error.detail).toBe( + "Antigravity text generation failed: Model is temporarily unavailable.", + ); + yield* fixture.assertCleaned; + }).pipe(Effect.scoped), + ); + it.effect.each([ { relativePath: "unexpected.txt", kind: "file" }, { relativePath: ".agents/skills/unexpected.txt", kind: "file" }, diff --git a/apps/server/src/textGeneration/AntigravityTextGeneration.ts b/apps/server/src/textGeneration/AntigravityTextGeneration.ts index 22fce172b1836..427d9064d0b94 100644 --- a/apps/server/src/textGeneration/AntigravityTextGeneration.ts +++ b/apps/server/src/textGeneration/AntigravityTextGeneration.ts @@ -19,6 +19,7 @@ import * as TextGenerationOperations from "@t3tools/provider-core/server/textGen const ANTIGRAVITY_TIMEOUT_MS = 180_000; const MAX_OUTPUT_CHARS = 128_000; const isTextGenerationError = Schema.is(TextGenerationError); +const isAcpRequestError = Schema.is(AcpRequestError); const isNativeSessionId = Schema.is(Schema.String.check(Schema.isUUID(4))); const Configuration = Schema.Record(Schema.String, Schema.Unknown); const decodeConfiguration = Schema.decodeEffect(Schema.fromJsonString(Configuration)); @@ -322,7 +323,9 @@ export const makeAntigravityTextGeneration = Effect.fn("makeAntigravityTextGener ? cause : new TextGenerationError({ operation: input.operation, - detail: "Antigravity text generation failed.", + detail: isAcpRequestError(cause) + ? `Antigravity text generation failed: ${cause.errorMessage}` + : "Antigravity text generation failed.", cause, }), ), From a87d9a9d7af1848cd9c1e1a1d0f323774ef995ab Mon Sep 17 00:00:00 2001 From: Alex Southwell <4596216+saphid@users.noreply.github.com> Date: Tue, 3 Nov 2026 13:10:01 +1100 Subject: [PATCH 2/3] fix(server): Antigravity text generation shows the sign-in error instead of a generic failure Co-Authored-By: Claude Opus 5.5 --- .../textGeneration/AntigravityTextGeneration.test.ts | 1 + .../src/textGeneration/AntigravityTextGeneration.ts | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts b/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts index 3b81dcd282ab2..93619a8c915c0 100644 --- a/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts +++ b/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts @@ -572,6 +572,7 @@ it.layer(NodeServices.layer)("AntigravityTextGeneration", (it) => { .generateThreadTitle(fixture.titleInput) .pipe(Effect.flip); expect(error._tag).toBe("TextGenerationError"); + expect(error.detail).toBe("Sign in before starting Antigravity."); expect(fixture.state.workspaces).toEqual([]); yield* fixture.assertCleaned; }).pipe(Effect.scoped), diff --git a/apps/server/src/textGeneration/AntigravityTextGeneration.ts b/apps/server/src/textGeneration/AntigravityTextGeneration.ts index 427d9064d0b94..ca23ed5b7e0c0 100644 --- a/apps/server/src/textGeneration/AntigravityTextGeneration.ts +++ b/apps/server/src/textGeneration/AntigravityTextGeneration.ts @@ -1,4 +1,4 @@ -import { type ProviderSetupError, TextGenerationError } from "@t3tools/contracts"; +import { ProviderSetupError, TextGenerationError } from "@t3tools/contracts"; import * as Deferred from "effect/Deferred"; import * as Effect from "effect/Effect"; import * as Exit from "effect/Exit"; @@ -20,6 +20,7 @@ const ANTIGRAVITY_TIMEOUT_MS = 180_000; const MAX_OUTPUT_CHARS = 128_000; const isTextGenerationError = Schema.is(TextGenerationError); const isAcpRequestError = Schema.is(AcpRequestError); +const isProviderSetupError = Schema.is(ProviderSetupError); const isNativeSessionId = Schema.is(Schema.String.check(Schema.isUUID(4))); const Configuration = Schema.Record(Schema.String, Schema.Unknown); const decodeConfiguration = Schema.decodeEffect(Schema.fromJsonString(Configuration)); @@ -323,9 +324,11 @@ export const makeAntigravityTextGeneration = Effect.fn("makeAntigravityTextGener ? cause : new TextGenerationError({ operation: input.operation, - detail: isAcpRequestError(cause) - ? `Antigravity text generation failed: ${cause.errorMessage}` - : "Antigravity text generation failed.", + detail: isProviderSetupError(cause) + ? cause.detail + : isAcpRequestError(cause) + ? `Antigravity text generation failed: ${cause.errorMessage}` + : "Antigravity text generation failed.", cause, }), ), From 8c8252834c7bec72a21d8c171a1389e94cc20589 Mon Sep 17 00:00:00 2001 From: Alex Southwell <4596216+saphid@users.noreply.github.com> Date: Tue, 3 Nov 2026 15:07:03 +1100 Subject: [PATCH 3/3] fix(server): Antigravity text generation maps agent errors to fixed text Copying the ACP error message into TextGenerationError.detail broke the error rule in docs/internals/effect-services.md. A sign-in-required error (ACP code -32000) now shows the fixed Antigravity sign-in text; other agent failures keep the generic detail. The agent's message stays in cause. Co-Authored-By: Claude Opus 5.5 --- .../AntigravityTextGeneration.test.ts | 20 +++++++++---------- .../AntigravityTextGeneration.ts | 9 ++++++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts b/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts index 93619a8c915c0..62205d2835985 100644 --- a/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts +++ b/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts @@ -452,23 +452,23 @@ it.layer(NodeServices.layer)("AntigravityTextGeneration", (it) => { }).pipe(Effect.scoped), ); - it.effect("keeps Antigravity's error message when the prompt request fails", () => + it.effect.each([ + { + code: -32000, + detail: "Sign in to Antigravity in Settings before you continue.", + }, + { code: -32603, detail: "Antigravity text generation failed." }, + ])("maps ACP error $code from the prompt request to a fixed detail", ({ code, detail }) => Effect.gen(function* () { const fixture = yield* makeFixture({ prompt: () => - Effect.fail( - new AcpRequestError({ - code: -32603, - errorMessage: "Model is temporarily unavailable.", - }), - ), + Effect.fail(new AcpRequestError({ code, errorMessage: "Raw provider failure text." })), }); const error = yield* fixture.textGeneration .generateThreadTitle(fixture.titleInput) .pipe(Effect.flip); - expect(error.detail).toBe( - "Antigravity text generation failed: Model is temporarily unavailable.", - ); + expect(error.detail).toBe(detail); + expect(error.detail).not.toContain("Raw provider failure text."); yield* fixture.assertCleaned; }).pipe(Effect.scoped), ); diff --git a/apps/server/src/textGeneration/AntigravityTextGeneration.ts b/apps/server/src/textGeneration/AntigravityTextGeneration.ts index ca23ed5b7e0c0..b7e7cfaeb40e8 100644 --- a/apps/server/src/textGeneration/AntigravityTextGeneration.ts +++ b/apps/server/src/textGeneration/AntigravityTextGeneration.ts @@ -13,13 +13,16 @@ import { type AcpError, AcpRequestError } from "effect-acp/errors"; import { applyAntigravityAcpModelSelection } from "../provider/acp/AntigravityAcpSupport.ts"; import { removeAntigravitySessionFiles } from "../provider/acp/AntigravitySessionFiles.ts"; +import { + ANTIGRAVITY_SIGN_IN_REQUIRED_MESSAGE, + isAntigravitySignInRequiredError, +} from "../provider/antigravityAuthSupport.ts"; import type * as AcpSessionRuntime from "@t3tools/provider-acp/server/AcpSessionRuntime"; import * as TextGenerationOperations from "@t3tools/provider-core/server/textGenerationOperations"; const ANTIGRAVITY_TIMEOUT_MS = 180_000; const MAX_OUTPUT_CHARS = 128_000; const isTextGenerationError = Schema.is(TextGenerationError); -const isAcpRequestError = Schema.is(AcpRequestError); const isProviderSetupError = Schema.is(ProviderSetupError); const isNativeSessionId = Schema.is(Schema.String.check(Schema.isUUID(4))); const Configuration = Schema.Record(Schema.String, Schema.Unknown); @@ -326,8 +329,8 @@ export const makeAntigravityTextGeneration = Effect.fn("makeAntigravityTextGener operation: input.operation, detail: isProviderSetupError(cause) ? cause.detail - : isAcpRequestError(cause) - ? `Antigravity text generation failed: ${cause.errorMessage}` + : isAntigravitySignInRequiredError(cause) + ? ANTIGRAVITY_SIGN_IN_REQUIRED_MESSAGE : "Antigravity text generation failed.", cause, }),