diff --git a/open-sse/executors/antigravity.ts b/open-sse/executors/antigravity.ts index 43ad96c103..132c066ec3 100644 --- a/open-sse/executors/antigravity.ts +++ b/open-sse/executors/antigravity.ts @@ -437,9 +437,17 @@ export class AntigravityExecutor extends BaseExecutor { // TODO: Consider removing project override like gemini-cli.ts — stored projectId // can become stale for Cloud Code accounts, causing 403 "has not been used in project X". // Antigravity accounts may have more stable project IDs, but the risk exists. + const normalizeProjectId = (value: unknown): string | null => { + if (typeof value !== "string") return null; + const trimmedValue = value.trim(); + return trimmedValue ? trimmedValue : null; + }; const bodyRecord = asRecord(body) ?? {}; - const bodyProjectId = typeof bodyRecord.project === "string" ? bodyRecord.project : undefined; - const credentialsProjectId = credentials?.projectId; + const bodyProjectId = normalizeProjectId(bodyRecord.project); + const credentialsProjectId = normalizeProjectId(credentials?.projectId); + const providerSpecificProjectId = normalizeProjectId( + (credentials?.providerSpecificData as Record | undefined)?.projectId + ); const allowBodyProjectOverride = process.env.OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE === "1"; // Default: prefer OAuth-stored projectId over incoming body.project to avoid @@ -448,7 +456,7 @@ export class AntigravityExecutor extends BaseExecutor { const projectId = allowBodyProjectOverride && bodyProjectId ? bodyProjectId - : credentialsProjectId || bodyProjectId; + : credentialsProjectId || providerSpecificProjectId || bodyProjectId; if (!projectId) { // (#489) Return a structured error instead of throwing — gives the client a clear signal diff --git a/open-sse/executors/base.ts b/open-sse/executors/base.ts index 0fa829c7bb..e9750e2dc5 100644 --- a/open-sse/executors/base.ts +++ b/open-sse/executors/base.ts @@ -69,6 +69,7 @@ export type ProviderCredentials = { accessToken?: string; refreshToken?: string; apiKey?: string; + projectId?: string | null; expiresAt?: string; connectionId?: string; // T07: used for API key rotation index maxConcurrent?: number | null; diff --git a/open-sse/handlers/chatCore.ts b/open-sse/handlers/chatCore.ts index bd8b4dd33b..921c914fa7 100644 --- a/open-sse/handlers/chatCore.ts +++ b/open-sse/handlers/chatCore.ts @@ -3029,11 +3029,7 @@ export async function handleChatCore({ } } - if ( - isModelScope() && - res.response.status === 429 && - attempts < maxAttempts - 1 - ) { + if (isModelScope() && res.response.status === 429 && attempts < maxAttempts - 1) { const bodyPeek = await res.response .clone() .text() diff --git a/open-sse/utils/requestLogger.ts b/open-sse/utils/requestLogger.ts index b145bcb3e6..5845d87213 100644 --- a/open-sse/utils/requestLogger.ts +++ b/open-sse/utils/requestLogger.ts @@ -111,11 +111,7 @@ function truncateLogString(value: string, maxLength = MAX_LOG_STRING_LENGTH): st * recursing into an object's values, enabling the per-field exemption above. * Top-level arrays (no key context) remain subject to truncation. */ -export function cloneBoundedForLog( - value: unknown, - depth = 0, - key: string | null = null -): unknown { +export function cloneBoundedForLog(value: unknown, depth = 0, key: string | null = null): unknown { if (value === null || value === undefined) return value; if (typeof value === "string") return truncateLogString(value); if (typeof value !== "object") return value; diff --git a/src/app/(dashboard)/dashboard/providers/[id]/page.tsx b/src/app/(dashboard)/dashboard/providers/[id]/page.tsx index 7efdb38ebb..e80c848b38 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/page.tsx +++ b/src/app/(dashboard)/dashboard/providers/[id]/page.tsx @@ -597,6 +597,7 @@ interface EditConnectionModalConnection { provider?: string; providerSpecificData?: Record; healthCheckInterval?: number; + projectId?: string | null; } interface EditConnectionModalProps { @@ -6707,7 +6708,7 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec codexOpenaiStoreEnabled: false, consoleApiKey: "", ccCompatibleContext1m: false, - geminiProjectId: "", + cloudCodeProjectId: "", blockExtraUsage: connection?.provider === "claude" ? isClaudeExtraUsageBlockEnabled(connection?.provider, connection?.providerSpecificData) @@ -6734,6 +6735,8 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec const isCodex = connection?.provider === "codex"; const isClaude = connection?.provider === "claude"; const isGeminiCli = connection?.provider === "gemini-cli"; + const isAntigravity = connection?.provider === "antigravity"; + const supportsGoogleProjectId = isGeminiCli || isAntigravity; const localProviderMetadata = getLocalProviderMetadata(connection?.provider); const isLocalSelfHostedProvider = !!localProviderMetadata; const isGooglePse = connection?.provider === "google-pse-search"; @@ -6794,7 +6797,8 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec codexOpenaiStoreEnabled: connection.providerSpecificData?.openaiStoreEnabled === true, consoleApiKey: existingConsoleApiKey, ccCompatibleContext1m: ccRequestDefaults.context1m, - geminiProjectId: (connection.providerSpecificData?.projectId as string) || "", + cloudCodeProjectId: + (connection.providerSpecificData?.projectId as string) || connection.projectId || "", blockExtraUsage: isClaudeExtraUsageBlockEnabled( connection.provider, connection.providerSpecificData @@ -6884,6 +6888,7 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec setSaveError(null); try { const trimmedMaxConcurrent = formData.maxConcurrent.trim(); + const trimmedCloudCodeProjectId = formData.cloudCodeProjectId.trim(); let parsedMaxConcurrent: number | null = null; if (trimmedMaxConcurrent) { const numericMaxConcurrent = Number(trimmedMaxConcurrent); @@ -6901,8 +6906,8 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec healthCheckInterval: formData.healthCheckInterval, }; - if (isGeminiCli) { - updates.projectId = formData.geminiProjectId.trim() || null; + if (supportsGoogleProjectId) { + updates.projectId = trimmedCloudCodeProjectId || null; } if (isGooglePse && !formData.cx.trim()) { @@ -6992,6 +6997,9 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec } else if (isCloudflare && formData.accountId.trim()) { updates.providerSpecificData.accountId = formData.accountId.trim(); } + if (supportsGoogleProjectId) { + updates.providerSpecificData.projectId = trimmedCloudCodeProjectId || null; + } if (isCcCompatible) { const currentRequestDefaults = updates.providerSpecificData.requestDefaults && @@ -7026,8 +7034,8 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec updates.providerSpecificData.openaiStoreEnabled = formData.codexOpenaiStoreEnabled === true; } - if (isGeminiCli) { - updates.providerSpecificData.projectId = formData.geminiProjectId.trim() || undefined; + if (supportsGoogleProjectId) { + updates.providerSpecificData.projectId = trimmedCloudCodeProjectId || null; } } const error = (await onSave(updates)) as void | unknown; @@ -7123,14 +7131,18 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }: EditConnec /> )} - {isGeminiCli && ( + {supportsGoogleProjectId && (
setFormData({ ...formData, geminiProjectId: e.target.value })} - placeholder={t("geminiCliProjectIdPlaceholder")} - hint={t("geminiCliProjectIdHint")} + label={isAntigravity ? t("antigravityProjectIdLabel") : t("geminiCliProjectIdLabel")} + value={formData.cloudCodeProjectId} + onChange={(e) => setFormData({ ...formData, cloudCodeProjectId: e.target.value })} + placeholder={ + isAntigravity + ? t("antigravityProjectIdPlaceholder") + : t("geminiCliProjectIdPlaceholder") + } + hint={isAntigravity ? t("antigravityProjectIdHint") : t("geminiCliProjectIdHint")} className="font-mono text-xs" />
diff --git a/src/app/api/model-combo-mappings/[id]/route.ts b/src/app/api/model-combo-mappings/[id]/route.ts index 0b23e41d64..33393201f8 100644 --- a/src/app/api/model-combo-mappings/[id]/route.ts +++ b/src/app/api/model-combo-mappings/[id]/route.ts @@ -60,10 +60,7 @@ export async function PUT(request: Request, { params }: { params: Promise<{ id: return NextResponse.json({ mapping }); } catch (error: any) { console.error("Failed to update mapping:", error); - return NextResponse.json( - { error: "Failed to update mapping" }, - { status: 500 } - ); + return NextResponse.json({ error: "Failed to update mapping" }, { status: 500 }); } } @@ -82,9 +79,6 @@ export async function DELETE(request: Request, { params }: { params: Promise<{ i return NextResponse.json({ success: true }); } catch (error: any) { console.error("Failed to delete mapping:", error); - return NextResponse.json( - { error: "Failed to delete mapping" }, - { status: 500 } - ); + return NextResponse.json({ error: "Failed to delete mapping" }, { status: 500 }); } } diff --git a/src/app/api/model-combo-mappings/route.ts b/src/app/api/model-combo-mappings/route.ts index 0a55fa0875..eb8b7d23f4 100644 --- a/src/app/api/model-combo-mappings/route.ts +++ b/src/app/api/model-combo-mappings/route.ts @@ -27,10 +27,7 @@ export async function GET(request: Request) { return NextResponse.json({ mappings }); } catch (error: any) { console.error("Failed to list model-combo mappings:", error); - return NextResponse.json( - { error: "Failed to list model-combo mappings" }, - { status: 500 } - ); + return NextResponse.json({ error: "Failed to list model-combo mappings" }, { status: 500 }); } } @@ -57,9 +54,6 @@ export async function POST(request: Request) { return NextResponse.json({ mapping }, { status: 201 }); } catch (error: any) { console.error("Failed to create model-combo mapping:", error); - return NextResponse.json( - { error: "Failed to create model-combo mapping" }, - { status: 500 } - ); + return NextResponse.json({ error: "Failed to create model-combo mapping" }, { status: 500 }); } } diff --git a/src/app/api/providers/[id]/sync-models/route.ts b/src/app/api/providers/[id]/sync-models/route.ts index 3ff89b1ce9..036a627477 100644 --- a/src/app/api/providers/[id]/sync-models/route.ts +++ b/src/app/api/providers/[id]/sync-models/route.ts @@ -187,9 +187,12 @@ export async function ensureLoopbackServerReady(opts: EnsureReadyOptions = {}): // ECONNREFUSED). Using a synthetic connection id so no real DB lookup // is needed; the 404 is sufficient proof the server is dispatching. const probePort = process.env.OMNIROUTE_PORT || process.env.PORT || "20128"; - const res = await f(`http://127.0.0.1:${probePort}/api/providers/__readiness_probe__/models`, { - signal: AbortSignal.timeout(2_000), - }); + const res = await f( + `http://127.0.0.1:${probePort}/api/providers/__readiness_probe__/models`, + { + signal: AbortSignal.timeout(2_000), + } + ); if (res.status >= 200 && res.status < 600) return; } catch (err) { lastErr = err; diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json index 20a156725d..48e0325baf 100644 --- a/src/i18n/messages/ar.json +++ b/src/i18n/messages/ar.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/bg.json b/src/i18n/messages/bg.json index 82ba6f93a8..fb6dd2717f 100644 --- a/src/i18n/messages/bg.json +++ b/src/i18n/messages/bg.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/bn.json b/src/i18n/messages/bn.json index 940ae57c6a..fce2f806bd 100644 --- a/src/i18n/messages/bn.json +++ b/src/i18n/messages/bn.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/cs.json b/src/i18n/messages/cs.json index 20b9ce93c5..1de4cae2fd 100644 --- a/src/i18n/messages/cs.json +++ b/src/i18n/messages/cs.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/da.json b/src/i18n/messages/da.json index f4a6d34262..618f341594 100644 --- a/src/i18n/messages/da.json +++ b/src/i18n/messages/da.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json index abf7361c44..fe08b20e88 100644 --- a/src/i18n/messages/de.json +++ b/src/i18n/messages/de.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 584b277d02..7955339c41 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "my-gcp-project-id", + "antigravityProjectIdHint": "Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json index c5dbac64a5..f87e193b96 100644 --- a/src/i18n/messages/es.json +++ b/src/i18n/messages/es.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/fa.json b/src/i18n/messages/fa.json index 41c6741782..276141ef2f 100644 --- a/src/i18n/messages/fa.json +++ b/src/i18n/messages/fa.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/fi.json b/src/i18n/messages/fi.json index b83b47595f..675ce2f8d1 100644 --- a/src/i18n/messages/fi.json +++ b/src/i18n/messages/fi.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json index 970be23e12..74da22fe37 100644 --- a/src/i18n/messages/fr.json +++ b/src/i18n/messages/fr.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/gu.json b/src/i18n/messages/gu.json index f1556c651c..ebb57ba3c2 100644 --- a/src/i18n/messages/gu.json +++ b/src/i18n/messages/gu.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/he.json b/src/i18n/messages/he.json index 75b4ee03de..011e932f49 100644 --- a/src/i18n/messages/he.json +++ b/src/i18n/messages/he.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json index fb54032746..cd871ae469 100644 --- a/src/i18n/messages/hi.json +++ b/src/i18n/messages/hi.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/hu.json b/src/i18n/messages/hu.json index d40483084a..66f53c6956 100644 --- a/src/i18n/messages/hu.json +++ b/src/i18n/messages/hu.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/id.json b/src/i18n/messages/id.json index 7db4dab701..57c1d31f96 100644 --- a/src/i18n/messages/id.json +++ b/src/i18n/messages/id.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/in.json b/src/i18n/messages/in.json index 80802ed127..aa1c2b04ec 100644 --- a/src/i18n/messages/in.json +++ b/src/i18n/messages/in.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json index bb61dd1b25..f0da07454f 100644 --- a/src/i18n/messages/it.json +++ b/src/i18n/messages/it.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json index 999c81d5ab..506cf845ab 100644 --- a/src/i18n/messages/ja.json +++ b/src/i18n/messages/ja.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json index 6614896912..79cefdd283 100644 --- a/src/i18n/messages/ko.json +++ b/src/i18n/messages/ko.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/mr.json b/src/i18n/messages/mr.json index 755e9e2257..59ba9e74fd 100644 --- a/src/i18n/messages/mr.json +++ b/src/i18n/messages/mr.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/ms.json b/src/i18n/messages/ms.json index 816b354715..e400b0b48f 100644 --- a/src/i18n/messages/ms.json +++ b/src/i18n/messages/ms.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/nl.json b/src/i18n/messages/nl.json index a65a714bce..937568c659 100644 --- a/src/i18n/messages/nl.json +++ b/src/i18n/messages/nl.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/no.json b/src/i18n/messages/no.json index 193abf0d1b..15eeb4e0f0 100644 --- a/src/i18n/messages/no.json +++ b/src/i18n/messages/no.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/phi.json b/src/i18n/messages/phi.json index 26192401bf..6e204ad13b 100644 --- a/src/i18n/messages/phi.json +++ b/src/i18n/messages/phi.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json index afe5931ff6..1a027a1839 100644 --- a/src/i18n/messages/pl.json +++ b/src/i18n/messages/pl.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json index 03f3d71c43..1ba4beb70a 100644 --- a/src/i18n/messages/pt-BR.json +++ b/src/i18n/messages/pt-BR.json @@ -2706,7 +2706,6 @@ "allModelsNormal": "Todos os modelos estão respondendo normalmente.", "cooldownCleared": "Cooldown limpo para {model}", "failedClearCooldown": "Falha ao limpar cooldown", - "freeTier": "Plano gratuito", "loadingAvailability": "Carregando disponibilidade dos modelos...", "clearCooldown": "Limpar", "clearing": "Limpando...", @@ -3044,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Cole o cookie sso do grok.com. Um valor completo `sso=...` também funciona.", "grokWebCookiePlaceholder": "Cole o valor do cookie sso do grok.com", "herokuBaseUrlHint": "Obrigatório: cole a URL base do Heroku Inference. O app adicionará /v1/chat/completions.", diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index 693258138b..edc6ea8c8d 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -2706,7 +2706,6 @@ "allModelsNormal": "Todos os modelos estão respondendo normalmente.", "cooldownCleared": "Tempo de espera liberado para {model}", "failedClearCooldown": "Falha ao limpar o tempo de espera", - "freeTier": "Plano gratuito", "loadingAvailability": "Carregando disponibilidade do modelo...", "clearCooldown": "Limpar", "clearing": "Limpando...", @@ -3044,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/ro.json b/src/i18n/messages/ro.json index 497f876896..51b4a5fb30 100644 --- a/src/i18n/messages/ro.json +++ b/src/i18n/messages/ro.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index 2587bdf32e..ffa9c981ea 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/sk.json b/src/i18n/messages/sk.json index 291a6d32d2..646552c467 100644 --- a/src/i18n/messages/sk.json +++ b/src/i18n/messages/sk.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/sv.json b/src/i18n/messages/sv.json index 2463616cdf..453568ad97 100644 --- a/src/i18n/messages/sv.json +++ b/src/i18n/messages/sv.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/sw.json b/src/i18n/messages/sw.json index 80802ed127..aa1c2b04ec 100644 --- a/src/i18n/messages/sw.json +++ b/src/i18n/messages/sw.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/ta.json b/src/i18n/messages/ta.json index 4f852c5050..33d14d538c 100644 --- a/src/i18n/messages/ta.json +++ b/src/i18n/messages/ta.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/te.json b/src/i18n/messages/te.json index c8429246e4..48c3728cab 100644 --- a/src/i18n/messages/te.json +++ b/src/i18n/messages/te.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/th.json b/src/i18n/messages/th.json index 8ccad44fbb..1085ad5766 100644 --- a/src/i18n/messages/th.json +++ b/src/i18n/messages/th.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/tr.json b/src/i18n/messages/tr.json index 4830475f97..bcdcf044c2 100644 --- a/src/i18n/messages/tr.json +++ b/src/i18n/messages/tr.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json index 3a01f899e5..f1675ca8b9 100644 --- a/src/i18n/messages/uk-UA.json +++ b/src/i18n/messages/uk-UA.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/ur.json b/src/i18n/messages/ur.json index 4260d73c0c..2a8afe0085 100644 --- a/src/i18n/messages/ur.json +++ b/src/i18n/messages/ur.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/vi.json b/src/i18n/messages/vi.json index afa6f62391..e7acba5a9c 100644 --- a/src/i18n/messages/vi.json +++ b/src/i18n/messages/vi.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json index bcd779b59c..fbb466f3f8 100644 --- a/src/i18n/messages/zh-CN.json +++ b/src/i18n/messages/zh-CN.json @@ -3043,6 +3043,9 @@ "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", "grokWebCookieHint": "从 Grok Web 会话复制 Cookie。", "grokWebCookiePlaceholder": "Grok Web Cookie", "herokuBaseUrlHint": "Heroku 部署的 Base URL。", diff --git a/tests/unit/antigravity-projectid.test.ts b/tests/unit/antigravity-projectid.test.ts new file mode 100644 index 0000000000..b888f0e24a --- /dev/null +++ b/tests/unit/antigravity-projectid.test.ts @@ -0,0 +1,26 @@ +import { describe, it } from "node:test"; +import assert from "node:assert"; +import { updateProviderConnectionSchema } from "../../src/shared/validation/schemas.js"; + +describe("Antigravity Project ID Schema Validation", () => { + it("should accept projectId and providerSpecificData.projectId", () => { + const result = updateProviderConnectionSchema.safeParse({ + projectId: "anti-project", + providerSpecificData: { projectId: "anti-project" }, + }); + assert.strictEqual(result.success, true); + }); + + it("should accept null projectId and preserve nested null through JSON serialization", () => { + const payload = { + projectId: null, + providerSpecificData: { projectId: null }, + }; + + const serialized = JSON.stringify(payload); + assert.match(serialized, /"projectId":null/); + + const result = updateProviderConnectionSchema.safeParse(payload); + assert.strictEqual(result.success, true); + }); +}); diff --git a/tests/unit/error-message-sanitization.test.ts b/tests/unit/error-message-sanitization.test.ts index ac2496fc47..b304d1ec55 100644 --- a/tests/unit/error-message-sanitization.test.ts +++ b/tests/unit/error-message-sanitization.test.ts @@ -14,12 +14,8 @@ process.env.API_KEY_SECRET = "test-api-key-secret-32chars-long!!"; const core = await import("../../src/lib/db/core.ts"); const combosDb = await import("../../src/lib/db/combos.ts"); -const mappingsRoute = await import( - "../../src/app/api/model-combo-mappings/route.ts" -); -const mappingsIdRoute = await import( - "../../src/app/api/model-combo-mappings/[id]/route.ts" -); +const mappingsRoute = await import("../../src/app/api/model-combo-mappings/route.ts"); +const mappingsIdRoute = await import("../../src/app/api/model-combo-mappings/[id]/route.ts"); const syncTokens = await import("../../src/lib/sync/tokens.ts"); function makeRequest(url: string, options: { method?: string; body?: unknown } = {}) { @@ -60,7 +56,7 @@ async function createCombo(name: string, model: string) { test("GET /model-combo-mappings returns empty list on fresh DB", async () => { const res = await mappingsRoute.GET(); assert.equal(res.status, 200); - const body = await res.json() as any; + const body = (await res.json()) as any; assert.ok(Array.isArray(body.mappings), "body.mappings must be an array"); assert.equal(body.mappings.length, 0); assert.ok(!("error" in body), "success response must not contain error field"); @@ -69,7 +65,7 @@ test("GET /model-combo-mappings returns empty list on fresh DB", async () => { test("GET /model-combo-mappings error response never leaks raw error.message", async () => { const res = await mappingsRoute.GET(); // In the success case, there is no error field at all - const body = await res.json() as any; + const body = (await res.json()) as any; if (res.status >= 500) { assert.equal(body.error, "Failed to list model-combo mappings"); assert.ok(!("stack" in body), "stack trace must not be present in response"); @@ -84,7 +80,7 @@ test("POST /model-combo-mappings returns 400 for empty pattern", async () => { }) ); assert.equal(res.status, 400); - const body = await res.json() as any; + const body = (await res.json()) as any; assert.ok("error" in body); assert.ok(!("stack" in body), "400 response must not contain stack trace"); }); @@ -108,7 +104,7 @@ test("POST /model-combo-mappings creates a mapping and response has no error fie }) ); assert.equal(res.status, 201); - const body = await res.json() as any; + const body = (await res.json()) as any; assert.ok("mapping" in body, "response must have mapping field"); assert.ok(!("error" in body), "success response must not contain error field"); assert.ok(!("stack" in body)); @@ -121,7 +117,7 @@ test("GET /model-combo-mappings/[id] returns 404 for non-existent id", async () { params: Promise.resolve({ id: "nonexistent" }) } ); assert.equal(res.status, 404); - const body = await res.json() as any; + const body = (await res.json()) as any; assert.equal(body.error, "Mapping not found"); assert.ok(!("stack" in body), "404 response must not contain stack trace"); }); @@ -131,7 +127,7 @@ test("GET /model-combo-mappings/[id] error response never leaks internal details makeRequest("http://localhost/api/model-combo-mappings/some-id"), { params: Promise.resolve({ id: "some-id" }) } ); - const body = await res.json() as any; + const body = (await res.json()) as any; if (res.status >= 500) { assert.equal(body.error, "Failed to get mapping"); assert.ok(!body.error.includes("SQLITE"), "SQLite internals must not be exposed"); @@ -145,7 +141,7 @@ test("DELETE /model-combo-mappings/[id] returns 404 for non-existent mapping", a { params: Promise.resolve({ id: "nonexistent" }) } ); assert.equal(res.status, 404); - const body = await res.json() as any; + const body = (await res.json()) as any; assert.equal(body.error, "Mapping not found"); assert.ok(!("stack" in body)); }); @@ -159,7 +155,7 @@ test("PUT /model-combo-mappings/[id] returns 404 for non-existent mapping", asyn { params: Promise.resolve({ id: "nonexistent" }) } ); assert.equal(res.status, 404); - const body = await res.json() as any; + const body = (await res.json()) as any; assert.equal(body.error, "Mapping not found"); assert.ok(!("stack" in body)); }); @@ -193,7 +189,10 @@ test("hashSyncToken produces different hashes for different tokens", () => { test("generatePlaintextSyncToken starts with osync_ prefix", () => { const token = syncTokens.generatePlaintextSyncToken(); - assert.ok(token.startsWith("osync_"), `token must start with 'osync_', got: ${token.slice(0, 10)}`); + assert.ok( + token.startsWith("osync_"), + `token must start with 'osync_', got: ${token.slice(0, 10)}` + ); }); test("hashSyncToken output is never the plain token (not stored in clear text)", () => { diff --git a/tests/unit/executor-antigravity.test.ts b/tests/unit/executor-antigravity.test.ts index ab2898dc9a..b0e89c155f 100644 --- a/tests/unit/executor-antigravity.test.ts +++ b/tests/unit/executor-antigravity.test.ts @@ -9,6 +9,32 @@ import { seedAntigravityVersionCache, } from "../../open-sse/services/antigravityVersion.ts"; +type AntigravityTransformResult = Exclude< + Awaited>, + Response +>; + +type ErrorPayload = { + error: { + code?: string; + message: string; + }; + retryAfterMs?: number; +}; + +type ChatCompletionPayload = { + object?: string; + choices: Array<{ + message: { content: string }; + finish_reason: string; + }>; + usage?: { + prompt_tokens: number; + completion_tokens: number; + total_tokens: number; + }; +}; + async function withEnv( name: string, value: string | undefined, @@ -115,8 +141,10 @@ test("AntigravityExecutor.transformRequest normalizes model, project and content assert.match(result.requestId, /^agent\/\d+\/[0-9a-f]{8}$/); assert.deepEqual(result.enabledCreditTypes, ["GOOGLE_ONE_AI"]); assert.ok(result.request.sessionId); - assert.equal(result.request.generationConfig.topK, 40); - assert.equal(result.request.generationConfig.topP, 1.0); + const request = result.request as { generationConfig?: { topK?: number; topP?: number } }; + const generationConfig = request.generationConfig || {}; + assert.equal(generationConfig.topK, 40); + assert.equal(generationConfig.topP, 1.0); assert.deepEqual(result.request.toolConfig, { functionCallingConfig: { mode: "VALIDATED" }, }); @@ -198,13 +226,96 @@ test("AntigravityExecutor.transformRequest returns a structured error response w true, {} ); - const payload = (await result.json()) as any; + if (!(result instanceof Response)) throw new Error("Expected Response from transformRequest"); + const payload = (await result.json()) as ErrorPayload; assert.equal(result.status, 422); assert.equal(payload.error.code, "missing_project_id"); assert.match(payload.error.message, /Missing Google projectId/); }); +test("AntigravityExecutor.transformRequest prefers top-level credentials projectId over nested providerSpecificData", async () => { + const executor = new AntigravityExecutor(); + const result = await executor.transformRequest( + "antigravity/gemini-2.5-pro", + { + project: "body-project", + request: { + contents: [{ role: "user", parts: [{ text: "Hello" }] }], + }, + }, + true, + { + projectId: "credential-project", + providerSpecificData: { projectId: "nested-project" }, + } + ); + + if (result instanceof Response) throw new Error("Unexpected Response from transformRequest"); + assert.equal(result.project, "credential-project"); +}); + +test("AntigravityExecutor.transformRequest uses nested providerSpecificData projectId when top-level is absent", async () => { + const executor = new AntigravityExecutor(); + const result = await executor.transformRequest( + "antigravity/gemini-2.5-pro", + { + request: { + contents: [{ role: "user", parts: [{ text: "Hello" }] }], + }, + }, + true, + { + providerSpecificData: { projectId: "nested-project" }, + } + ); + + if (result instanceof Response) throw new Error("Unexpected Response from transformRequest"); + assert.equal(result.project, "nested-project"); +}); + +test("AntigravityExecutor.transformRequest treats whitespace-only project values as missing", async () => { + const executor = new AntigravityExecutor(); + + const nestedFallback = await executor.transformRequest( + "antigravity/gemini-2.5-pro", + { + project: " ", + request: { + contents: [{ role: "user", parts: [{ text: "Hello" }] }], + }, + }, + true, + { + projectId: " ", + providerSpecificData: { projectId: " nested-project " }, + } + ); + + if (nestedFallback instanceof Response) + throw new Error("Unexpected Response from transformRequest"); + assert.equal(nestedFallback.project, "nested-project"); + + const bodyFallback = await executor.transformRequest( + "antigravity/gemini-2.5-pro", + { + project: " body-project ", + request: { + contents: [{ role: "user", parts: [{ text: "Hello" }] }], + }, + }, + true, + { + projectId: " ", + providerSpecificData: { projectId: " " }, + } + ); + + if (bodyFallback instanceof Response) + throw new Error("Unexpected Response from transformRequest"); + assert.equal(bodyFallback.project, "body-project"); +}); + test("AntigravityExecutor.transformRequest allows body project overrides when the env flag is enabled", async () => { const executor = new AntigravityExecutor(); @@ -277,7 +388,7 @@ test("AntigravityExecutor.collectStreamToResponse turns SSE Gemini chunks into a { Authorization: "Bearer ag-token" }, { request: {} } ); - const payload = (await result.response.json()) as any; + const payload = (await result.response.json()) as ChatCompletionPayload; assert.equal(result.response.status, 200); assert.equal(payload.object, "chat.completion"); @@ -343,7 +454,7 @@ test("AntigravityExecutor.collectStreamToResponse parses fragmented SSE lines in { Authorization: "Bearer ag-token" }, { request: {} } ); - const payload = (await result.response.json()) as any; + const payload = (await result.response.json()) as ChatCompletionPayload; assert.equal(payload.choices[0].message.content, "Fragmented"); assert.equal(payload.choices[0].finish_reason, "stop"); @@ -423,10 +534,10 @@ test("AntigravityExecutor.execute auto-retries short 429 responses and collects model: "antigravity/gemini-2.5-flash", body: { request: { contents: [] } }, stream: false, - credentials: { accessToken: "token", projectId: "project-1" } as any, + credentials: { accessToken: "token", projectId: "project-1" }, log: { debug() {}, warn() {} }, }); - const payload = (await result.response.json()) as any; + const payload = (await result.response.json()) as ChatCompletionPayload; assert.equal(calls.length, 2); assert.equal(result.response.status, 200); @@ -465,10 +576,10 @@ test("AntigravityExecutor.execute embeds retryAfterMs when the upstream asks for model: "antigravity/gemini-2.5-flash", body: { request: { contents: [] } }, stream: true, - credentials: { accessToken: "token", projectId: "project-1" } as any, + credentials: { accessToken: "token", projectId: "project-1" }, log: { debug() {}, warn() {} }, }); - const payload = (await result.response.json()) as any; + const payload = (await result.response.json()) as ErrorPayload; assert.equal(result.response.status, 429); assert.equal(payload.retryAfterMs, 7_200_000); @@ -519,7 +630,7 @@ test("AntigravityExecutor.execute applies CLI fingerprint when enabled", async ( model: "antigravity/gemini-2.5-flash", body: { request: { contents: [] } }, stream: false, - credentials: { accessToken: "token", projectId: "project-1" } as any, + credentials: { accessToken: "token", projectId: "project-1" }, log: { debug() {}, warn() {}, info() {} }, }) ); @@ -556,7 +667,7 @@ test("AntigravityExecutor.transformRequest maps Claude models through Gemini con const result = (await executor.transformRequest("antigravity/claude-sonnet-4-6", body, true, { projectId: "project-1", - })) as any; + })) as AntigravityTransformResult; assert.equal(result.project, "project-1"); assert.equal(result.model, "claude-sonnet-4-6"); diff --git a/tests/unit/proxyfetch-undici-retry.test.ts b/tests/unit/proxyfetch-undici-retry.test.ts index f5a0e91d19..e78e9acd40 100644 --- a/tests/unit/proxyfetch-undici-retry.test.ts +++ b/tests/unit/proxyfetch-undici-retry.test.ts @@ -21,18 +21,12 @@ test("undici is called exactly twice then native fallback fires once (both undic let undiciCalls = 0; let nativeCalls = 0; - const mockUndici = async ( - _input: RequestInfo | URL, - _init?: RequestInit - ): Promise => { + const mockUndici = async (_input: RequestInfo | URL, _init?: RequestInit): Promise => { undiciCalls++; throw makeUndiciError("fetch failed"); }; - const mockNative = async ( - _input: RequestInfo | URL, - _init?: RequestInit - ): Promise => { + const mockNative = async (_input: RequestInfo | URL, _init?: RequestInit): Promise => { nativeCalls++; return new Response("native-fallback-body", { status: 200 }); }; @@ -56,10 +50,7 @@ test("retry-succeeds: undici fails once then succeeds, native fallback is NOT in let undiciCalls = 0; let nativeCalls = 0; - const mockUndici = async ( - _input: RequestInfo | URL, - _init?: RequestInit - ): Promise => { + const mockUndici = async (_input: RequestInfo | URL, _init?: RequestInit): Promise => { undiciCalls++; if (undiciCalls === 1) { throw makeUndiciError("fetch failed"); @@ -67,10 +58,7 @@ test("retry-succeeds: undici fails once then succeeds, native fallback is NOT in return new Response("undici-retry-success", { status: 200 }); }; - const mockNative = async ( - _input: RequestInfo | URL, - _init?: RequestInit - ): Promise => { + const mockNative = async (_input: RequestInfo | URL, _init?: RequestInit): Promise => { nativeCalls++; return new Response("should-not-be-called", { status: 200 }); }; @@ -94,18 +82,12 @@ test("does not retry when body is a ReadableStream (non-replayable body)", async let undiciCalls = 0; let nativeCalls = 0; - const mockUndici = async ( - _input: RequestInfo | URL, - _init?: RequestInit - ): Promise => { + const mockUndici = async (_input: RequestInfo | URL, _init?: RequestInit): Promise => { undiciCalls++; throw makeUndiciError("fetch failed"); }; - const mockNative = async ( - _input: RequestInfo | URL, - _init?: RequestInit - ): Promise => { + const mockNative = async (_input: RequestInfo | URL, _init?: RequestInit): Promise => { nativeCalls++; return new Response("native-stream-fallback", { status: 200 }); }; diff --git a/tests/unit/request-logger-bounded-clone.test.ts b/tests/unit/request-logger-bounded-clone.test.ts index 5603479a0d..bcaa8b6cc4 100644 --- a/tests/unit/request-logger-bounded-clone.test.ts +++ b/tests/unit/request-logger-bounded-clone.test.ts @@ -1,9 +1,8 @@ import test from "node:test"; import assert from "node:assert/strict"; -const { cloneBoundedForLog, MAX_LOG_ARRAY_ITEMS } = await import( - "../../open-sse/utils/requestLogger.ts" -); +const { cloneBoundedForLog, MAX_LOG_ARRAY_ITEMS } = + await import("../../open-sse/utils/requestLogger.ts"); test("cloneBoundedForLog: tools array is exempt from truncation (debug-critical)", () => { const tools = Array.from({ length: 45 }, (_, i) => ({ diff --git a/tests/unit/search-handler-extended.test.ts b/tests/unit/search-handler-extended.test.ts index 4402b3c205..cab4159653 100644 --- a/tests/unit/search-handler-extended.test.ts +++ b/tests/unit/search-handler-extended.test.ts @@ -6,9 +6,7 @@ import { join } from "node:path"; process.env.DATA_DIR = mkdtempSync(join(tmpdir(), "omniroute-search-")); -const { handleSearch } = await import( - "../../open-sse/handlers/search.ts" -); +const { handleSearch } = await import("../../open-sse/handlers/search.ts"); test("handleSearch builds Serper web requests and normalizes organic results", async () => { const originalFetch = globalThis.fetch; @@ -794,8 +792,14 @@ test("handleSearch normalizes Ollama response fields and full_text content", asy assert.equal(result.data.results[0].title, "Ollama Web Search"); assert.equal(result.data.results[0].url, "https://ollama.com/blog/web-search"); - assert.equal(result.data.results[0].snippet, "Ollama now supports native web search capabilities"); - assert.equal(result.data.results[0].content.text, "Ollama now supports native web search capabilities"); + assert.equal( + result.data.results[0].snippet, + "Ollama now supports native web search capabilities" + ); + assert.equal( + result.data.results[0].content.text, + "Ollama now supports native web search capabilities" + ); assert.equal(result.data.results[0].content.format, "text"); assert.equal(result.data.results[0].position, 1); assert.equal(result.data.results[0].citation.provider, "ollama-search"); @@ -813,10 +817,10 @@ test("handleSearch handles empty Ollama results array", async () => { const originalFetch = globalThis.fetch; globalThis.fetch = async () => { - return new Response( - JSON.stringify({ results: [] }), - { status: 200, headers: { "content-type": "application/json" } } - ); + return new Response(JSON.stringify({ results: [] }), { + status: 200, + headers: { "content-type": "application/json" }, + }); }; try { @@ -841,10 +845,10 @@ test("handleSearch handles Ollama response with missing results field", async () const originalFetch = globalThis.fetch; globalThis.fetch = async () => { - return new Response( - JSON.stringify({ unrelated: "data" }), - { status: 200, headers: { "content-type": "application/json" } } - ); + return new Response(JSON.stringify({ unrelated: "data" }), { + status: 200, + headers: { "content-type": "application/json" }, + }); }; try {