From c9e5fa20d44d43f3783f45ef6f4233e9e0f4a1cb Mon Sep 17 00:00:00 2001 From: Manav <80675216+monabji@users.noreply.github.com> Date: Thu, 29 Oct 2026 22:05:20 +0530 Subject: [PATCH 1/2] fix(antigravity): explain ACP model access restrictions --- .../Adapters/AntigravityAdapterV2.test.ts | 53 +++++++++++++++++++ .../Adapters/AntigravityAdapterV2.ts | 2 + .../src/provider/acp/AntigravityAcpSupport.ts | 2 +- packages/provider-acp/src/server/adapter.ts | 12 ++++- 4 files changed, 66 insertions(+), 3 deletions(-) diff --git a/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.test.ts index 90226cc68bd2a..14bf168ac8aea 100644 --- a/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.test.ts @@ -34,6 +34,7 @@ import { resolveAttachmentPath } from "../../attachmentStore.ts"; import { normalizeAntigravitySessionUpdate } from "../../provider/acp/AntigravityProtocol.ts"; import * as IdAllocator from "@t3tools/provider-core/server/IdAllocator"; import * as ProviderAdapter from "@t3tools/provider-core/server/ProviderAdapter"; +import { makeProviderFailure } from "@t3tools/provider-core/server/failure"; import { makeAntigravityAcpAdapterFlavor, makeAntigravityAdapterV2, @@ -126,6 +127,58 @@ const layerSession = Layer.mergeAll( TestProviderHost.layer().pipe(Layer.provide(NodeServices.layer)), ); +describe("AntigravityAdapterV2 model availability", () => { + it.live("explains ACP access restrictions when the session does not offer the saved model", () => + Effect.gen(function* () { + const childProcessSpawner = yield* ChildProcessSpawner.ChildProcessSpawner; + const path = yield* Path.Path; + const crypto = yield* Crypto.Crypto; + const mockAgentPath = yield* path.fromFileUrl( + new URL("../../../scripts/acp-mock-agent.ts", import.meta.url), + ); + const instanceId = ProviderInstanceId.make("antigravity-model-access-test"); + const adapter = yield* makeAntigravityAdapterV2({ + instanceId, + selfInvocation: yield* resolveSelfInvocation(), + makeRuntime: (input) => + makeAntigravityAcpRuntime({ + ...input, + childProcessSpawner, + spawn: { + command: process.execPath, + args: [mockAgentPath], + cwd: input.cwd, + env: { T3_ACP_ANTIGRAVITY: "1" }, + }, + }).pipe(Effect.provideService(Crypto.Crypto, crypto)), + withProcess: (_stop, task) => task, + // @effect-diagnostics-next-line effectSucceedWithVoid:off - This optional result requires undefined, not the wider void type. + defaultModel: Effect.succeed(undefined), + }); + const threadId = ThreadId.make("thread-antigravity-model-access"); + const runtimePolicy = ProviderAdapter.ProviderAdapterV2RuntimePolicy.make({ + runtimeMode: "full-access", + interactionMode: "default", + cwd: process.cwd(), + }); + const open = (model: string) => + adapter.openSession({ + threadId, + providerSessionId: ProviderSessionId.make(`provider-session-${model}`), + modelSelection: { instanceId, model }, + runtimePolicy, + }); + const error = yield* open("claude-test").pipe(Effect.flip); + const failure = makeProviderFailure({ cause: error }); + assert.include(failure.message, '"claude-test"'); + assert.include(failure.message, "sign-in method and ACP client"); + assert.include(failure.message, "Antigravity app"); + assert.include(failure.message, "refresh Antigravity models"); + yield* open("gemini-test-low"); + }).pipe(Effect.provide(layerSession), Effect.scoped), + ); +}); + describe("AntigravityAdapterV2 client file system", () => { it.effect("serves confined reads and leaves edits to the agent's diff tools", () => Effect.gen(function* () { diff --git a/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts index 4d06da900f4a8..d6cf8017648ec 100644 --- a/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts @@ -202,6 +202,8 @@ export function makeAntigravityAcpAdapterFlavor( // Loading history replays tool calls; resume avoids replay. subagentsIdleOnTurnCompletion: true, ...(options.onSessionEvent === undefined ? {} : { onSessionEvent: options.onSessionEvent }), + modelSelectionGuidance: + "Antigravity model access can depend on the sign-in method and ACP client, and can differ from the Antigravity app. Update T3 Code and refresh Antigravity models, then choose an available model and retry.", applyModelSelection: Effect.fn("AntigravityAdapterV2.applyModelSelection")(function* ({ runtime, modelSelection, diff --git a/apps/server/src/provider/acp/AntigravityAcpSupport.ts b/apps/server/src/provider/acp/AntigravityAcpSupport.ts index a57fc08f9b7af..33f7c2fcf17ff 100644 --- a/apps/server/src/provider/acp/AntigravityAcpSupport.ts +++ b/apps/server/src/provider/acp/AntigravityAcpSupport.ts @@ -173,7 +173,7 @@ export const applyAntigravityAcpModelSelection = Effect.fn("applyAntigravityAcpM return yield* Effect.fail( input.mapError( EffectAcpErrors.AcpRequestError.invalidParams( - `Antigravity model '${resolved}' is unavailable for this Google account. Select an available model.`, + `Antigravity model '${resolved}' is unavailable in this ACP session. Select an available model.`, ), ), ); diff --git a/packages/provider-acp/src/server/adapter.ts b/packages/provider-acp/src/server/adapter.ts index 398eac2170e70..14156a830c806 100644 --- a/packages/provider-acp/src/server/adapter.ts +++ b/packages/provider-acp/src/server/adapter.ts @@ -209,11 +209,12 @@ class AcpModelSelectionError extends Schema.TaggedError( "AcpModelSelectionError", { model: Schema.String, + guidance: Schema.String, cause: Schema.Defect(), }, ) { override get message(): string { - return `The agent did not accept the model "${this.model}". Choose another model for this provider, then retry.`; + return `The agent did not accept the model "${this.model}". ${this.guidance}`; } } @@ -280,6 +281,7 @@ export interface AcpAdapterV2Flavor { readonly startResult: AcpSessionRuntime.AcpSessionRuntimeStartResult; readonly modelSelection: ModelSelection; }) => Effect.Effect; + readonly modelSelectionGuidance?: string; readonly sessionModeForPolicy?: ( policy: ProviderAdapter.ProviderAdapterV2RuntimePolicy, ) => string | undefined; @@ -6676,7 +6678,13 @@ export const makeAcpAdapterV2 = Effect.fn("makeAcpAdapterV2")(function* ( // own error. const rejectedModel = (error: EffectAcpErrors.AcpError) => error._tag === "AcpRequestError" && error.code === -32602 - ? new AcpModelSelectionError({ model: modelSelection.model, cause: error }) + ? new AcpModelSelectionError({ + model: modelSelection.model, + guidance: + flavor.modelSelectionGuidance ?? + "Choose another model for this provider, then retry.", + cause: error, + }) : error; let appliedModel: string | undefined; if (flavor.applyModelSelection !== undefined) { From cb45bf7cc2a95af9cb5a12d53b00f50656344ac9 Mon Sep 17 00:00:00 2001 From: maria-rcks Date: Sat, 31 Oct 2026 08:10:55 +0000 Subject: [PATCH 2/2] fix(acp): preserve default model rejection guidance --- packages/provider-acp/src/server/adapter.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/provider-acp/src/server/adapter.ts b/packages/provider-acp/src/server/adapter.ts index 2722565ae0cb8..85cfd7199cce8 100644 --- a/packages/provider-acp/src/server/adapter.ts +++ b/packages/provider-acp/src/server/adapter.ts @@ -215,12 +215,12 @@ class AcpModelSelectionError extends Schema.TaggedError( "AcpModelSelectionError", { model: Schema.String, - guidance: Schema.String, + guidance: Schema.optional(Schema.String), cause: Schema.Defect(), }, ) { override get message(): string { - return `The agent did not accept the model "${this.model}". ${this.guidance}`; + return `The agent did not accept the model "${this.model}". ${this.guidance ?? "Choose another model for this provider, then retry."}`; } } @@ -6783,9 +6783,7 @@ export const makeAcpAdapterV2 = Effect.fn("makeAcpAdapterV2")(function* ( error._tag === "AcpRequestError" && error.code === -32602 ? new AcpModelSelectionError({ model: modelSelection.model, - guidance: - flavor.modelSelectionGuidance ?? - "Choose another model for this provider, then retry.", + guidance: flavor.modelSelectionGuidance, cause: error, }) : error;