chore: remove IS_AI_ENABLED feature flag (#19916)

## Summary
- AI is now GA, so the public/lab `IS_AI_ENABLED` flag is removed from
`FeatureFlagKey`, the public flag catalog, and the dev seeder.
- Drops every backend `@RequireFeatureFlag(IS_AI_ENABLED)` guard (agent,
agent chat, chat subscription, role-to-agent assignment, workflow AI
step creation) and the now-unused `FeatureFlagModule`/`FeatureFlagGuard`
wiring in the AI and workflow modules.
- Removes frontend gating from settings nav, role
permissions/assignment/applicability, command menu hotkeys, side panel,
mobile/drawer nav, and the agent chat provider so AI UI is always on.
Tests and generated GraphQL/SDK schemas updated accordingly.

## Test plan
- [x] `npx nx typecheck twenty-shared`
- [x] `npx nx typecheck twenty-server`
- [x] `npx nx typecheck twenty-front`
- [x] `npx nx lint:diff-with-main twenty-server`
- [x] `npx nx lint:diff-with-main twenty-front`
- [x] `npx jest --config=packages/twenty-server/jest.config.mjs
feature-flag`
- [x] `npx jest --config=packages/twenty-server/jest.config.mjs
workspace-entity-manager`
- [ ] Manual smoke test: AI features still accessible without any flag
row in `featureFlag`

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Félix Malfait
2026-04-21 09:49:46 +02:00
committed by GitHub
parent 69868a0ab6
commit 30b8663a74
32 changed files with 73 additions and 240 deletions
@@ -10,6 +10,7 @@ export default defineFrontComponent({
universalIdentifier: 'feature-flag-gated-cmd',
label: 'Feature Flag Gated',
conditionalAvailabilityExpression:
featureFlags.IS_AI_ENABLED && objectPermissions.canReadObjectRecords,
featureFlags.IS_JUNCTION_RELATIONS_ENABLED &&
objectPermissions.canReadObjectRecords,
},
});
@@ -274,7 +274,7 @@ describe('transformConditionalAvailabilityExpressionsForEsBuildPlugin', () => {
describe('feature-flag-gated-front-component', () => {
it('should allow when feature flag is enabled', () => {
const context = buildMockCommandMenuContextApi({
featureFlags: { IS_AI_ENABLED: true },
featureFlags: { IS_JUNCTION_RELATIONS_ENABLED: true },
});
expect(
@@ -287,7 +287,7 @@ describe('transformConditionalAvailabilityExpressionsForEsBuildPlugin', () => {
it('should deny when feature flag is disabled', () => {
const context = buildMockCommandMenuContextApi({
featureFlags: { IS_AI_ENABLED: false },
featureFlags: { IS_JUNCTION_RELATIONS_ENABLED: false },
});
expect(