Replace the onboarding AI chat feature flag with an environment variable (#23439)

Follow-up to #23199.

The AI-chat onboarding is an instance-level rollout decision, not a
per-workspace experiment, so `IS_ONBOARDING_AI_CHAT_ENABLED` becomes an
instance config variable (default `false`, editable from the admin
panel) exposed to the frontend through `ClientConfig`. The workspace
feature flag is deleted; leftover `featureFlag` rows are inert since the
column is plain text.

`IS_WORKSPACE_COMPANY_ENRICHMENT_ENABLED` is removed as redundant: the
PDL client already skips everything when no API key is set. Enrichment
now runs when the AI chat is on and `PEOPLE_DATA_LABS_API_KEY` is
configured.

<!-- This is an auto-generated description by cubic. -->
<a
href="https://cubic.dev/pr/twentyhq/twenty/pull/23439?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
This commit is contained in:
Raphaël Bosi
2026-07-28 16:46:52 +02:00
committed by GitHub
parent 884f470982
commit 9509c737e0
30 changed files with 85 additions and 122 deletions
@@ -24,6 +24,7 @@ import { maintenanceModeState } from '@/client-config/states/maintenanceModeStat
import { isMicrosoftCalendarEnabledState } from '@/client-config/states/isMicrosoftCalendarEnabledState';
import { isMicrosoftMessagingEnabledState } from '@/client-config/states/isMicrosoftMessagingEnabledState';
import { isMultiWorkspaceEnabledState } from '@/client-config/states/isMultiWorkspaceEnabledState';
import { isOnboardingAiChatEnabledState } from '@/client-config/states/isOnboardingAiChatEnabledState';
import { labPublicFeatureFlagsState } from '@/client-config/states/labPublicFeatureFlagsState';
import { sentryConfigState } from '@/client-config/states/sentryConfigState';
import { supportChatState } from '@/client-config/states/supportChatState';
@@ -126,6 +127,10 @@ export const useClientConfig = (): UseClientConfigResult => {
const setIsDDLLocked = useSetAtomState(isDDLLockedState);
const setIsOnboardingAiChatEnabled = useSetAtomState(
isOnboardingAiChatEnabledState,
);
const setMaintenanceMode = useSetAtomState(maintenanceModeState);
const setEnterpriseInstanceType = useSetAtomState(
@@ -215,6 +220,9 @@ export const useClientConfig = (): UseClientConfigResult => {
);
setIsClickHouseConfigured(clientConfig?.isClickHouseConfigured ?? false);
setIsDDLLocked(clientConfig?.isWorkspaceSchemaDDLLocked ?? false);
setIsOnboardingAiChatEnabled(
clientConfig?.isOnboardingAiChatEnabled ?? false,
);
setMaintenanceMode(clientConfig?.maintenance ?? null);
setEnterpriseInstanceType(
clientConfig?.enterpriseInstanceType ??
@@ -256,6 +264,7 @@ export const useClientConfig = (): UseClientConfigResult => {
setIsClickHouseConfigured,
setIsCloudflareIntegrationEnabled,
setIsDDLLocked,
setIsOnboardingAiChatEnabled,
setLabPublicFeatureFlags,
setMaintenanceMode,
setEnterpriseInstanceType,
@@ -0,0 +1,6 @@
import { createAtomState } from '@/ui/utilities/state/jotai/utils/createAtomState';
export const isOnboardingAiChatEnabledState = createAtomState<boolean>({
key: 'isOnboardingAiChatEnabledState',
defaultValue: false,
});
@@ -38,6 +38,7 @@ export type ClientConfig = {
isCloudflareIntegrationEnabled: boolean;
isClickHouseConfigured: boolean;
isWorkspaceSchemaDDLLocked: boolean;
isOnboardingAiChatEnabled: boolean;
onboarding: OnboardingConfig;
publicFeatureFlags: Array<PublicFeatureFlag>;
sentry: Sentry;