Prefer using{' '}
-
Secret API keys
- {' '}
+ {' '}
instead.
)}
@@ -189,12 +190,12 @@ export const DisplayApiSettings = ({
{showLegacyText && (
Prefer using{' '}
-
Publishable API keys
- {' '}
+ {' '}
instead.
)}
diff --git a/apps/studio/data/api-keys/api-keys-query.ts b/apps/studio/data/api-keys/api-keys-query.ts
index de87ed9c42b11..a78f3c031d1fc 100644
--- a/apps/studio/data/api-keys/api-keys-query.ts
+++ b/apps/studio/data/api-keys/api-keys-query.ts
@@ -2,6 +2,7 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query'
import { get, handleError } from 'data/fetchers'
import { ResponseError } from 'types'
+import { IS_PLATFORM } from 'lib/constants'
import { apiKeysKeys } from './keys'
type LegacyKeys = {
@@ -74,7 +75,7 @@ export const useAPIKeysQuery =
(
apiKeysKeys.list(projectRef),
({ signal }) => getAPIKeys({ projectRef, reveal }, signal),
{
- enabled: enabled && !!projectRef,
+ enabled: IS_PLATFORM && enabled && !!projectRef,
...options,
}
)
diff --git a/apps/studio/data/api-keys/legacy-api-keys-status-query.ts b/apps/studio/data/api-keys/legacy-api-keys-status-query.ts
index 964f2f49d5400..d768d3713e728 100644
--- a/apps/studio/data/api-keys/legacy-api-keys-status-query.ts
+++ b/apps/studio/data/api-keys/legacy-api-keys-status-query.ts
@@ -1,5 +1,6 @@
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
import { get, handleError } from 'data/fetchers'
+import { IS_PLATFORM } from 'lib/constants'
import { ResponseError } from 'types'
import { apiKeysKeys } from './keys'
@@ -29,13 +30,13 @@ type LegacyAPIKeysStatusData = Awaited
export const useLegacyAPIKeysStatusQuery = (
{ projectRef }: LegacyAPIKeysStatusVariables,
- { ...options }: UseQueryOptions = {}
+ { enabled, ...options }: UseQueryOptions = {}
) =>
useQuery(
apiKeysKeys.status(projectRef),
({ signal }) => getLegacyAPIKeysStatus({ projectRef }, signal),
{
- enabled: !!projectRef,
+ enabled: IS_PLATFORM && enabled && !!projectRef,
...options,
}
)
diff --git a/apps/studio/data/branches/branch-diff-query.ts b/apps/studio/data/branches/branch-diff-query.ts
index eba205e1908c6..bcff017beccdd 100644
--- a/apps/studio/data/branches/branch-diff-query.ts
+++ b/apps/studio/data/branches/branch-diff-query.ts
@@ -1,6 +1,7 @@
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
import { get, handleError } from 'data/fetchers'
+import { IS_PLATFORM } from 'lib/constants'
import type { ResponseError } from 'types'
import { branchKeys } from './keys'
@@ -50,7 +51,7 @@ export const useBranchDiffQuery = (
branchKeys.diff(projectRef, branchId),
() => getBranchDiff({ branchId, includedSchemas }),
{
- enabled: enabled && typeof branchId !== 'undefined' && branchId !== '',
+ enabled: IS_PLATFORM && enabled && typeof branchId !== 'undefined' && branchId !== '',
...options,
}
)
diff --git a/apps/studio/data/branches/branch-query.ts b/apps/studio/data/branches/branch-query.ts
index c4a6b6ddfbdf8..a7a5c99a66d64 100644
--- a/apps/studio/data/branches/branch-query.ts
+++ b/apps/studio/data/branches/branch-query.ts
@@ -1,6 +1,7 @@
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
import { get, handleError } from 'data/fetchers'
+import { IS_PLATFORM } from 'lib/constants'
import type { ResponseError } from 'types'
import { branchKeys } from './keys'
@@ -32,7 +33,7 @@ export const useBranchQuery = (
branchKeys.detail(projectRef, id),
({ signal }) => getBranch({ id }, signal),
{
- enabled: enabled && typeof id !== 'undefined',
+ enabled: IS_PLATFORM && enabled && typeof id !== 'undefined',
...options,
}
)
diff --git a/apps/studio/data/branches/branches-query.ts b/apps/studio/data/branches/branches-query.ts
index d83de6a6f4a91..c6c82abd22fbc 100644
--- a/apps/studio/data/branches/branches-query.ts
+++ b/apps/studio/data/branches/branches-query.ts
@@ -1,6 +1,8 @@
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
+
import type { components } from 'data/api'
import { get, handleError } from 'data/fetchers'
+import { IS_PLATFORM } from 'lib/constants'
import type { ResponseError } from 'types'
import { branchKeys } from './keys'
@@ -39,5 +41,5 @@ export const useBranchesQuery = (
useQuery(
branchKeys.list(projectRef),
({ signal }) => getBranches({ projectRef }, signal),
- { enabled: enabled && typeof projectRef !== 'undefined', ...options }
+ { enabled: IS_PLATFORM && enabled && typeof projectRef !== 'undefined', ...options }
)
diff --git a/apps/studio/lib/ai/model.ts b/apps/studio/lib/ai/model.ts
index ede4906ba93f0..e093e4702e9d0 100644
--- a/apps/studio/lib/ai/model.ts
+++ b/apps/studio/lib/ai/model.ts
@@ -14,8 +14,10 @@ export const regionMap = {
eu: 'eu',
}
-const SONNET_MODEL = 'anthropic.claude-3-7-sonnet-20250219-v1:0'
-const HAIKU_MODEL = 'anthropic.claude-3-haiku-20240307-v1:0'
+// Default behaviour here is to be throttled (e.g if this env var is not available, IS_THROTTLED should be true, unless specified 'false')
+const IS_THROTTLED = process.env.IS_THROTTLED !== 'false'
+const PRO_MODEL = process.env.AI_PRO_MODEL ?? 'anthropic.claude-3-7-sonnet-20250219-v1:0'
+const NORMAL_MODEL = process.env.AI_NORMAL_MODEL ?? 'anthropic.claude-3-5-haiku-20241022-v1:0'
const OPENAI_MODEL = 'gpt-4.1-2025-04-14'
export type ModelSuccess = {
@@ -47,7 +49,7 @@ export async function getModel(routingKey?: string, isLimited?: boolean): Promis
// Select the Bedrock region based on the routing key
const bedrockRegion: BedrockRegion = routingKey ? await selectBedrockRegion(routingKey) : 'us1'
const bedrock = bedrockForRegion(bedrockRegion)
- const model = HAIKU_MODEL
+ const model = IS_THROTTLED || isLimited ? NORMAL_MODEL : PRO_MODEL
const modelName = `${regionMap[bedrockRegion]}.${model}`
return {
diff --git a/apps/studio/lib/auth.tsx b/apps/studio/lib/auth.tsx
index e2ef0cdca9fcd..18ef96866c105 100644
--- a/apps/studio/lib/auth.tsx
+++ b/apps/studio/lib/auth.tsx
@@ -1,27 +1,41 @@
import { useQueryClient } from '@tanstack/react-query'
-import { AuthProvider as AuthProviderInternal, clearLocalStorage, gotrueClient } from 'common'
+import {
+ AuthProvider as AuthProviderInternal,
+ clearLocalStorage,
+ gotrueClient,
+ useAuthError,
+} from 'common'
import { PropsWithChildren, useCallback, useEffect } from 'react'
import { toast } from 'sonner'
import { GOTRUE_ERRORS, IS_PLATFORM } from './constants'
-export const AuthProvider = ({ children }: PropsWithChildren<{}>) => {
- // Check for unverified GitHub users after a GitHub sign in
- useEffect(() => {
- async function handleEmailVerificationError() {
- const { error } = await gotrueClient.initialize()
+const AuthErrorToaster = ({ children }: PropsWithChildren) => {
+ const error = useAuthError()
- if (error?.message === GOTRUE_ERRORS.UNVERIFIED_GITHUB_USER) {
+ useEffect(() => {
+ if (error !== null) {
+ // Check for unverified GitHub users after a GitHub sign in
+ if (error.message === GOTRUE_ERRORS.UNVERIFIED_GITHUB_USER) {
toast.error(
'Please verify your email on GitHub first, then reach out to us at support@supabase.io to log into the dashboard'
)
+ return
}
+
+ toast.error(error.message)
}
+ }, [error])
- handleEmailVerificationError()
- }, [])
+ return children
+}
- return {children}
+export const AuthProvider = ({ children }: PropsWithChildren) => {
+ return (
+
+ {children}
+
+ )
}
export { useAuth, useIsLoggedIn, useSession, useUser } from 'common'
diff --git a/apps/studio/pages/api/cli-release-version.ts b/apps/studio/pages/api/cli-release-version.ts
index 7c6ce96b38a6e..4719fcfd946d5 100644
--- a/apps/studio/pages/api/cli-release-version.ts
+++ b/apps/studio/pages/api/cli-release-version.ts
@@ -8,7 +8,7 @@ type GitHubRepositoryRelease = {
published_at: string
}
-const current = `v${process.env.CURRENT_CLI_VERSION}`
+const current = process.env.CURRENT_CLI_VERSION ? `v${process.env.CURRENT_CLI_VERSION}` : undefined
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
try {
diff --git a/apps/studio/pages/project/[ref]/merge.tsx b/apps/studio/pages/project/[ref]/merge.tsx
index 4ebd96a1fc4ce..2f8d10228cf9b 100644
--- a/apps/studio/pages/project/[ref]/merge.tsx
+++ b/apps/studio/pages/project/[ref]/merge.tsx
@@ -520,7 +520,8 @@ const MergePage: NextPageWithLayout = () => {
>
Create new branch
- ) : hasCurrentWorkflowCompleted ? (
+ ) : hasCurrentWorkflowCompleted &&
+ currentWorkflowRun?.id === parentBranchWorkflow?.id ? (
>
)
diff --git a/apps/studio/pages/sign-in-mfa.tsx b/apps/studio/pages/sign-in-mfa.tsx
index bc256f894287b..2eaa06b5dcbd4 100644
--- a/apps/studio/pages/sign-in-mfa.tsx
+++ b/apps/studio/pages/sign-in-mfa.tsx
@@ -1,3 +1,4 @@
+import * as Sentry from '@sentry/nextjs'
import { useQueryClient } from '@tanstack/react-query'
import { useRouter } from 'next/router'
import { useEffect, useState } from 'react'
@@ -65,8 +66,8 @@ const SignInMfaPage: NextPageWithLayout = () => {
await queryClient.resetQueries()
router.push(getReturnToPath())
return
- }
- if (data.currentLevel !== data.nextLevel) {
+ } else {
+ // Show the MFA form
setLoading(false)
return
}
@@ -77,7 +78,13 @@ const SignInMfaPage: NextPageWithLayout = () => {
return
}
})
- .catch(() => {}) // catch all errors thrown by auth methods
+ .catch((error) => {
+ Sentry.captureException(error)
+ console.error('Auth initialization error:', error)
+ toast.error('Failed to initialize authentication. Please try again.')
+ setLoading(false)
+ router.push({ pathname: '/sign-in', query: router.query })
+ })
}, [])
if (loading) {
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index b2f4013b0f802..0601ca8a867f9 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -79,7 +79,7 @@ services:
auth:
container_name: supabase-auth
- image: supabase/gotrue:v2.176.1
+ image: supabase/gotrue:v2.177.0
restart: unless-stopped
healthcheck:
test:
@@ -231,7 +231,7 @@ services:
# To use S3 backed storage: docker compose -f docker-compose.yml -f docker-compose.s3.yml up
storage:
container_name: supabase-storage
- image: supabase/storage-api:v1.24.7
+ image: supabase/storage-api:v1.25.7
restart: unless-stopped
volumes:
- ./volumes/storage:/var/lib/storage:z
@@ -296,7 +296,7 @@ services:
meta:
container_name: supabase-meta
- image: supabase/postgres-meta:v0.89.3
+ image: supabase/postgres-meta:v0.91.0
restart: unless-stopped
depends_on:
db:
@@ -475,7 +475,7 @@ services:
# Update the DATABASE_URL if you are using an external Postgres database
supavisor:
container_name: supabase-pooler
- image: supabase/supavisor:2.5.6
+ image: supabase/supavisor:2.5.7
restart: unless-stopped
ports:
- ${POSTGRES_PORT}:5432
diff --git a/packages/api-types/types/api.d.ts b/packages/api-types/types/api.d.ts
index 76b8ed8d8537b..0f93564023b48 100644
--- a/packages/api-types/types/api.d.ts
+++ b/packages/api-types/types/api.d.ts
@@ -514,6 +514,26 @@ export interface paths {
patch?: never
trace?: never
}
+ '/v1/projects/{ref}/branches/{name}': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /**
+ * Get a database branch
+ * @description Fetches the specified database branch by its name.
+ */
+ get: operations['v1-get-a-branch']
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
'/v1/projects/{ref}/claim-token': {
parameters: {
query?: never
@@ -3220,6 +3240,10 @@ export interface components {
max_client_conn?: number
/** @enum {string} */
pool_mode?: 'transaction' | 'session' | 'statement'
+ query_wait_timeout?: number
+ reserve_pool_size?: number
+ server_idle_timeout?: number
+ server_lifetime?: number
}
V1PostgrestConfigResponse: {
db_extra_search_path: string
@@ -4633,6 +4657,42 @@ export interface operations {
}
}
}
+ 'v1-get-a-branch': {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ name: string
+ /** @description Project ref */
+ ref: string
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['BranchResponse']
+ }
+ }
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ /** @description Failed to fetch database branch */
+ 500: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ }
+ }
'v1-get-project-claim-token': {
parameters: {
query?: never
diff --git a/packages/api-types/types/platform.d.ts b/packages/api-types/types/platform.d.ts
index be06c9dfb0ddb..090d53fbbd8e1 100644
--- a/packages/api-types/types/platform.d.ts
+++ b/packages/api-types/types/platform.d.ts
@@ -4896,7 +4896,7 @@ export interface components {
id: string
public: boolean
/** @enum {string} */
- type?: 'STANDARD' | 'ICEBERG'
+ type?: 'STANDARD' | 'ANALYTICS'
}
CreateStorageCredentialBody: {
description: string
@@ -6550,7 +6550,7 @@ export interface components {
db_port: number
db_user: string
default_pool_size?: number
- ignore_startup_parameters: string
+ ignore_startup_parameters?: string
inserted_at: string
max_client_conn?: number
pgbouncer_enabled: boolean
@@ -6558,6 +6558,10 @@ export interface components {
pgbouncer_status: 'COMING_UP' | 'COMING_DOWN' | 'RELOADING' | 'ENABLED' | 'DISABLED'
/** @enum {string} */
pool_mode: 'transaction' | 'session' | 'statement'
+ query_wait_timeout?: number
+ reserve_pool_size?: number
+ server_idle_timeout?: number
+ server_lifetime?: number
ssl_enforced: boolean
}
PgbouncerStatusResponse: {
@@ -7281,6 +7285,14 @@ export interface components {
}[]
}
}
+ RemoveProjectResponse: {
+ id: number
+ name: string
+ ref: string
+ vercel?: {
+ resourceUninstallFailure: boolean
+ }
+ }
ReplicationDestinationResponse: {
/** @description Destination config */
config: {
@@ -7385,11 +7397,38 @@ export interface components {
tenant_id: string
}[]
}
- ReplicationPipelinesStatusResponse: {
+ ReplicationPipelineStatusResponse: {
/** @description Pipeline id */
pipeline_id: number
/** @description Pipeline status */
- status: string
+ status:
+ | {
+ /** @enum {string} */
+ name: 'stopped'
+ }
+ | {
+ /** @enum {string} */
+ name: 'starting'
+ }
+ | {
+ /** @enum {string} */
+ name: 'started'
+ }
+ | {
+ /** @enum {string} */
+ name: 'stopping'
+ }
+ | {
+ /** @enum {string} */
+ name: 'unknown'
+ }
+ | {
+ exit_code?: number | null
+ message?: string | null
+ /** @enum {string} */
+ name: 'failed'
+ reason?: string | null
+ }
}
ReplicationPublicationsResponse: {
/** @description List of publications */
@@ -7631,7 +7670,7 @@ export interface components {
owner: string
public: boolean
/** @enum {string} */
- type?: 'STANDARD' | 'ICEBERG'
+ type?: 'STANDARD' | 'ANALYTICS'
updated_at: string
}
StorageConfigResponse: {
@@ -7660,7 +7699,7 @@ export interface components {
owner: string
public: boolean
/** @enum {string} */
- type?: 'STANDARD' | 'ICEBERG'
+ type?: 'STANDARD' | 'ANALYTICS'
updated_at: string
}
created_at: string
@@ -8329,7 +8368,11 @@ export interface components {
}
UpdatePgbouncerConfigBody: {
default_pool_size?: number
- ignore_startup_parameters: string
+ /**
+ * @deprecated
+ * @default options,extra_float_digits
+ */
+ ignore_startup_parameters?: string
max_client_conn?: number
/** @deprecated */
pgbouncer_enabled?: boolean
@@ -8338,6 +8381,10 @@ export interface components {
* @enum {string}
*/
pool_mode?: 'transaction' | 'session' | 'statement'
+ query_wait_timeout?: number
+ reserve_pool_size?: number
+ server_idle_timeout?: number
+ server_lifetime?: number
}
UpdatePolicyBody: {
check?: string
@@ -8359,6 +8406,8 @@ export interface components {
* @enum {string}
*/
pool_mode?: 'transaction' | 'session' | 'statement'
+ server_idle_timeout?: number
+ server_lifetime?: number
}
UpdatePostgresConfigBody: {
effective_cache_size?: string
@@ -14647,6 +14696,12 @@ export interface operations {
'application/json': components['schemas']['ProjectDetailResponse']
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
}
}
ProjectsRefController_deleteProject: {
@@ -14666,7 +14721,7 @@ export interface operations {
[name: string]: unknown
}
content: {
- 'application/json': components['schemas']['ProjectRefResponse']
+ 'application/json': components['schemas']['RemoveProjectResponse']
}
}
403: {
@@ -18498,7 +18553,7 @@ export interface operations {
[name: string]: unknown
}
content: {
- 'application/json': components['schemas']['ReplicationPipelinesStatusResponse']
+ 'application/json': components['schemas']['ReplicationPipelineStatusResponse']
}
}
403: {
diff --git a/packages/common/auth.tsx b/packages/common/auth.tsx
index 2c35f5c52adb2..661c67daac193 100644
--- a/packages/common/auth.tsx
+++ b/packages/common/auth.tsx
@@ -1,6 +1,6 @@
'use client'
-import type { Session } from '@supabase/supabase-js'
+import type { AuthError, Session } from '@supabase/supabase-js'
import {
createContext,
PropsWithChildren,
@@ -10,8 +10,8 @@ import {
useMemo,
useState,
} from 'react'
-import { gotrueClient, type User } from './gotrue'
import { clearLocalStorage } from './constants/local-storage'
+import { gotrueClient, type User } from './gotrue'
export type { User }
@@ -43,10 +43,12 @@ const DEFAULT_SESSION: any = {
type AuthState =
| {
session: Session | null
+ error: AuthError | null
isLoading: false
}
| {
session: null
+ error: AuthError | null
isLoading: true
}
@@ -54,6 +56,7 @@ export type AuthContext = { refreshSession: () => Promise
} & Au
export const AuthContext = createContext({
session: null,
+ error: null,
isLoading: true,
refreshSession: () => Promise.resolve(null),
})
@@ -66,14 +69,32 @@ export const AuthProvider = ({
alwaysLoggedIn,
children,
}: PropsWithChildren) => {
- const [state, setState] = useState({ session: null, isLoading: true })
+ const [state, setState] = useState({ session: null, error: null, isLoading: true })
+
+ useEffect(() => {
+ let mounted = true
+ gotrueClient.initialize().then(({ error }) => {
+ if (mounted && error !== null) {
+ setState((prev) => ({ ...prev, error }))
+ }
+ })
+
+ return () => {
+ mounted = false
+ }
+ }, [])
// Keep the session in sync
useEffect(() => {
const {
data: { subscription },
} = gotrueClient.onAuthStateChange((_event, session) => {
- setState({ session, isLoading: false })
+ setState((prev) => ({
+ session,
+ // If there is a session, we clear the error
+ error: session !== null ? null : prev.error,
+ isLoading: false,
+ }))
})
return subscription.unsubscribe
@@ -91,7 +112,7 @@ export const AuthProvider = ({
const value = useMemo(() => {
if (alwaysLoggedIn) {
- return { session: DEFAULT_SESSION, isLoading: false, refreshSession } as const
+ return { session: DEFAULT_SESSION, error: null, isLoading: false, refreshSession } as const
} else {
return { ...state, refreshSession } as const
}
@@ -116,6 +137,8 @@ export const useIsLoggedIn = () => {
return user !== null
}
+export const useAuthError = () => useAuth().error
+
export const useIsMFAEnabled = () => {
const user = useUser()
diff --git a/packages/common/telemetry-constants.ts b/packages/common/telemetry-constants.ts
index 763078527799f..2886475adef45 100644
--- a/packages/common/telemetry-constants.ts
+++ b/packages/common/telemetry-constants.ts
@@ -666,7 +666,7 @@ export interface CustomReportAddSQLBlockClicked {
* @source studio
* @page /dashboard/project/{ref}/reports/{id}
*/
-export interface CustomReportAssistantSQLBlockAdded {
+export interface CustomReportAssistantSQLBlockAddedEvent {
action: 'custom_report_assistant_sql_block_added'
groups: {
project: string
@@ -1325,6 +1325,44 @@ export interface SupabaseUiCommandCopyButtonClickedEvent {
}
}
+/**
+ * Triggered when the organization MFA enforcement setting is updated.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/org/{slug}/security
+ */
+export interface OrganizationMfaEnforcementUpdated {
+ action: 'organization_mfa_enforcement_updated'
+ properties: {
+ mfaEnforced: boolean
+ }
+ groups: {
+ organization: string
+ }
+}
+
+/**
+ * Triggered when a new foreign data wrapper is created in a project.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/database/integrations
+ */
+export interface ForeignDataWrapperCreatedEvent {
+ action: 'foreign_data_wrapper_created'
+ properties: {
+ /**
+ * The type of the foreign data wrapper, e.g. postgres_fdw, mysql_fdw, etc.
+ */
+ wrapperType: string
+ }
+ groups: {
+ project: string
+ organization: string
+ }
+}
+
/**
* @hidden
*/
@@ -1375,7 +1413,7 @@ export type TelemetryEvent =
| HomepageCustomerStoryCardClickedEvent
| HomepageProjectTemplateCardClickedEvent
| CustomReportAddSQLBlockClicked
- | CustomReportAssistantSQLBlockAdded
+ | CustomReportAssistantSQLBlockAddedEvent
| OpenSourceRepoCardClickedEvent
| StartProjectButtonClickedEvent
| SeeDocumentationButtonClickedEvent
@@ -1403,3 +1441,5 @@ export type TelemetryEvent =
| SupabaseUiCommandCopyButtonClickedEvent
| SupportTicketSubmittedEvent
| AiAssistantInSupportFormClickedEvent
+ | OrganizationMfaEnforcementUpdated
+ | ForeignDataWrapperCreatedEvent
diff --git a/turbo.json b/turbo.json
index b1484553135b0..fe75e665de77c 100644
--- a/turbo.json
+++ b/turbo.json
@@ -96,7 +96,10 @@
"FORCE_ASSET_CDN",
"ASSET_CDN_S3_ENDPOINT",
"SITE_NAME",
- "VERCEL_URL"
+ "VERCEL_URL",
+ "IS_THROTTLED",
+ "AI_PRO_MODEL",
+ "AI_NORMAL_MODEL"
],
"passThroughEnv": ["CURRENT_CLI_VERSION"],
"outputs": [".next/**", "!.next/cache/**"]