mirror of
https://github.com/supabase/supabase.git
synced 2026-05-09 02:09:50 -04:00
180ce515f6
* **Chores** * Updated internal module import paths across hook files to use standardized path aliases for improved code consistency and maintainability.
85 lines
3.1 KiB
TypeScript
85 lines
3.1 KiB
TypeScript
import { z } from 'zod'
|
|
|
|
import { subscriptionHasHipaaAddon } from '@/components/interfaces/Billing/Subscription/Subscription.utils'
|
|
import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query'
|
|
import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query'
|
|
import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
|
|
import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
|
|
import { IS_PLATFORM, OPT_IN_TAGS } from '@/lib/constants'
|
|
|
|
export const aiOptInLevelSchema = z.enum([
|
|
'disabled',
|
|
'schema',
|
|
'schema_and_log',
|
|
'schema_and_log_and_data',
|
|
])
|
|
|
|
export type AiOptInLevel = z.infer<typeof aiOptInLevelSchema>
|
|
|
|
export const getAiOptInLevel = (tags: string[] | undefined): AiOptInLevel => {
|
|
const hasSql = tags?.includes(OPT_IN_TAGS.AI_SQL)
|
|
const hasData = tags?.includes(OPT_IN_TAGS.AI_DATA)
|
|
const hasLog = tags?.includes(OPT_IN_TAGS.AI_LOG)
|
|
|
|
if (hasData) {
|
|
return 'schema_and_log_and_data'
|
|
} else if (hasLog) {
|
|
return 'schema_and_log'
|
|
} else if (hasSql) {
|
|
return 'schema'
|
|
} else {
|
|
return 'disabled'
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Determines if the organization has opted into *any* level of AI features (schema or schema_and_log or schema_and_log_and_data).
|
|
* This is primarily for backward compatibility.
|
|
* @returns boolean (true if opted into schema or schema_and_log or schema_and_log_and_data, false otherwise)
|
|
*/
|
|
export function useOrgOptedIntoAi(): boolean {
|
|
const { aiOptInLevel } = useOrgAiOptInLevel()
|
|
return !IS_PLATFORM || aiOptInLevel !== 'disabled'
|
|
}
|
|
|
|
/**
|
|
* Determines the organization's specific AI opt-in level and whether schema metadata should be included.
|
|
* @returns Object with aiOptInLevel and includeSchemaMetadata
|
|
*/
|
|
export function useOrgAiOptInLevel(): {
|
|
aiOptInLevel: AiOptInLevel
|
|
includeSchemaMetadata: boolean
|
|
isHipaaProjectDisallowed: boolean
|
|
} {
|
|
const { data: selectedProject } = useSelectedProjectQuery()
|
|
const { data: selectedOrganization } = useSelectedOrganizationQuery()
|
|
|
|
// [Joshen] Default to disabled until migration to clean up existing opt in tags are completed
|
|
// Once toggled on, then we can default to their set opt in level and clean up feature flag
|
|
const optInTags = selectedOrganization?.opt_in_tags
|
|
const level = getAiOptInLevel(optInTags)
|
|
const isOptedIntoAI = level !== 'disabled'
|
|
|
|
const { data: subscription } = useOrgSubscriptionQuery({ orgSlug: selectedOrganization?.slug })
|
|
const hasHipaaAddon = subscriptionHasHipaaAddon(subscription)
|
|
|
|
const { data: projectSettings } = useProjectSettingsV2Query({ projectRef: selectedProject?.ref })
|
|
const isProjectSensitive = !!projectSettings?.is_sensitive
|
|
|
|
const preventProjectFromUsingAI = hasHipaaAddon && isProjectSensitive
|
|
|
|
// [Joshen] For CLI / self-host, we'd default to 'schema' as opt in level
|
|
const aiOptInLevel = !IS_PLATFORM
|
|
? 'schema'
|
|
: (isOptedIntoAI && !selectedProject) || (isOptedIntoAI && !preventProjectFromUsingAI)
|
|
? level
|
|
: 'disabled'
|
|
const includeSchemaMetadata = !IS_PLATFORM || aiOptInLevel !== 'disabled'
|
|
|
|
return {
|
|
aiOptInLevel,
|
|
includeSchemaMetadata,
|
|
isHipaaProjectDisallowed: preventProjectFromUsingAI,
|
|
}
|
|
}
|