diff --git a/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts b/apps/server/src/textGeneration/AntigravityTextGeneration.test.ts index 7e1f1446d1a55..62205d2835985 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.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, errorMessage: "Raw provider failure text." })), + }); + const error = yield* fixture.textGeneration + .generateThreadTitle(fixture.titleInput) + .pipe(Effect.flip); + expect(error.detail).toBe(detail); + expect(error.detail).not.toContain("Raw provider failure text."); + yield* fixture.assertCleaned; + }).pipe(Effect.scoped), + ); + it.effect.each([ { relativePath: "unexpected.txt", kind: "file" }, { relativePath: ".agents/skills/unexpected.txt", kind: "file" }, @@ -551,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 22fce172b1836..b7e7cfaeb40e8 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"; @@ -13,12 +13,17 @@ 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 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)); @@ -322,7 +327,11 @@ export const makeAntigravityTextGeneration = Effect.fn("makeAntigravityTextGener ? cause : new TextGenerationError({ operation: input.operation, - detail: "Antigravity text generation failed.", + detail: isProviderSetupError(cause) + ? cause.detail + : isAntigravitySignInRequiredError(cause) + ? ANTIGRAVITY_SIGN_IN_REQUIRED_MESSAGE + : "Antigravity text generation failed.", cause, }), ),