6117a1d6c0
## Summary
The "AI" acronym was rendered inconsistently across the codebase. The
backend AI module had settled on PascalCase `Ai` (`AiAgentModule`,
`AiBillingService`, `AiChatModule`, `AiModelRegistryService`, etc.),
while frontend components, several DTOs, a few types, and shared
identifiers still used all-caps `AI` (`AIChatTab`,
`AISystemPromptPreviewDTO`, `SettingsPath.AIPrompts`, ...). CLAUDE.md
specifies PascalCase for classes; this PR normalizes everything internal
to `Ai`.
**This is a pure internal rename.** The GraphQL schema is untouched —
`@ObjectType` decorator string arguments, resolver method names (which
become Query/Mutation field names), gql template contents, and the
`generated-metadata/graphql.ts` file are preserved verbatim. The only
visible change is TypeScript identifiers and file names.
## Also folded in (adjacent cleanups)
- **`AgentModelConfigService` → `AiModelConfigService`**. Lives in
`ai-models/` and is used by multiple AI code paths, not just the Agent
entity. The "Agent" prefix was misleading.
- **`generate-text-input.dto.ts` → `generate-text.input.ts`**. The
`ai-agent/dtos/` folder already uses `<entity>.input.ts` convention for
Input classes (`create-agent.input.ts` etc.); the old path mixed
`.dto.ts` file extension with a class that has no DTO suffix. File
rename only; class stays `GenerateTextInput`.
- **Removed stale TODO** in `ai-model-config.type.ts` that asked for the
`AiModelConfig` rename that this PR performs.
## Rename methodology
Bulk rename via perl with anchored regex
`(?<!['"])(?<![A-Z.])AI([A-Z])(?=[a-z])/Ai$1/g`:
- **Lookbehind for non-uppercase** skips adjacent acronyms (`MOSAIC`,
`OIDCSSO`) and leaves `AIRBNB_ID` alone.
- **Lookbehind for non-quote** protects most string literals.
- **Lookahead for lowercase** restricts matches to PascalCase
identifiers (`AIChatTab`), leaving SCREAMING_SNAKE constants untouched.
Strict file-scope exclusions: `generated-metadata/**`, `generated/**`,
`locales/**`, `migrations/**`, `illustrations/**`, `halftone/**`, and
the two gql template files (`queries/getAISystemPromptPreview.ts`,
`mutations/uploadAIChatFile.ts`).
Post-rename reverts for identifiers where the regex was too eager:
- Backend resolver method names kept: `getAISystemPromptPreview`,
`uploadAIChatFile` (they are GraphQL field names).
- `@ObjectType('AdminAIModels')` / `('AISystemPromptPreview')` /
`('AISystemPromptSection')` kept as-is.
- Backend classes `ClientAIModelConfig` / `AdminAIModelConfig` kept
as-is (they use `@ObjectType()` with no argument, so the class name IS
the schema name).
- External-library symbols restored: `OpenAIProvider`,
`createOpenAICompatible`, `vercelAIIntegration`.
File renames use a two-step rename to work on macOS case-insensitive
filesystems: `git mv X.tsx X.tsx.tmp && git mv X.tsx.tmp renamed.tsx`.
## Diff audit
- 0 changes to migrations
- 0 changes to locale `.po` / `.ts` files
- 0 changes to `generated-metadata/graphql.ts`
- 0 changes to website illustration files (base64 blobs preserved)
- 0 renames inside user-facing translation strings (`t\`…\``,
`msg\`…\``, `<Trans>…</Trans>`)
## Test plan
- [x] `npx nx typecheck twenty-server` — PASS
- [x] `npx nx typecheck twenty-front` — PASS
- [x] `npx jest ai-model admin agent-role` — 79/79 PASS
- [x] `npx oxlint --type-aware` on 118 changed files — 0 errors
- [x] `npx prettier --check` on 118 changed files — clean
- [ ] CI
93 lines
5.9 KiB
TypeScript
93 lines
5.9 KiB
TypeScript
import { SidePanelCommandMenuItemDisplayPage } from '@/command-menu-item/display/components/SidePanelCommandMenuItemDisplayPage';
|
|
import { SidePanelCommandMenuItemEditPage } from '@/command-menu-item/edit/components/SidePanelCommandMenuItemEditPage';
|
|
import { SidePanelNavigationMenuItemEditPage } from '@/navigation-menu-item/edit/side-panel/components/SidePanelNavigationMenuItemEditPage';
|
|
import { SidePanelNewSidebarItemPage } from '@/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemPage';
|
|
import { SidePanelAiChatThreadsPage } from '@/side-panel/pages/ai-chat-threads/components/SidePanelAiChatThreadsPage';
|
|
import { SidePanelAskAiPage } from '@/side-panel/pages/ask-ai/components/SidePanelAskAiPage';
|
|
import { SidePanelCalendarEventPage } from '@/side-panel/pages/calendar-event/components/SidePanelCalendarEventPage';
|
|
import { SidePanelComposeEmailPage } from '@/side-panel/pages/compose-email/components/SidePanelComposeEmailPage';
|
|
import { SidePanelFrontComponentPage } from '@/side-panel/pages/front-component/components/SidePanelFrontComponentPage';
|
|
import { SidePanelDashboardChartSettings } from '@/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardChartSettings';
|
|
import { SidePanelDashboardIframeSettings } from '@/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardIframeSettings';
|
|
import { SidePanelDashboardRecordTableSettings } from '@/side-panel/pages/page-layout/components/dashboard/SidePanelDashboardRecordTableSettings';
|
|
import { SidePanelRecordPageFieldSettings } from '@/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldSettings';
|
|
import { SidePanelRecordPageFieldsSettings } from '@/side-panel/pages/page-layout/components/record-page/SidePanelRecordPageFieldsSettings';
|
|
import { SidePanelPageLayoutDashboardWidgetTypeSelect } from '@/side-panel/pages/page-layout/components/SidePanelPageLayoutDashboardWidgetTypeSelect';
|
|
import { SidePanelPageLayoutRecordPageWidgetTypeSelect } from '@/side-panel/pages/page-layout/components/SidePanelPageLayoutRecordPageWidgetTypeSelect';
|
|
import { SidePanelPageLayoutTabSettings } from '@/side-panel/pages/page-layout/components/SidePanelPageLayoutTabSettings';
|
|
import { SidePanelMergeRecordPage } from '@/side-panel/pages/record-page/components/SidePanelMergeRecordPage';
|
|
import { SidePanelRecordPage } from '@/side-panel/pages/record-page/components/SidePanelRecordPage';
|
|
import { SidePanelUpdateMultipleRecords } from '@/side-panel/pages/record-page/components/SidePanelUpdateMultipleRecords';
|
|
import { SidePanelEditRichTextPage } from '@/side-panel/pages/rich-text-page/components/SidePanelEditRichTextPage';
|
|
import { SidePanelSearchRecordsPage } from '@/side-panel/pages/search/components/SidePanelSearchRecordsPage';
|
|
import { SidePanelWorkflowCreateStep } from '@/side-panel/pages/workflow/step/create/components/SidePanelWorkflowCreateStep';
|
|
import { SidePanelWorkflowEditStep } from '@/side-panel/pages/workflow/step/edit/components/SidePanelWorkflowEditStep';
|
|
import { SidePanelWorkflowEditStepType } from '@/side-panel/pages/workflow/step/edit/components/SidePanelWorkflowEditStepType';
|
|
import { SidePanelWorkflowRunViewStep } from '@/side-panel/pages/workflow/step/view-run/components/SidePanelWorkflowRunViewStep';
|
|
import { SidePanelWorkflowViewStep } from '@/side-panel/pages/workflow/step/view/components/SidePanelWorkflowViewStep';
|
|
import { SidePanelWorkflowSelectTriggerType } from '@/side-panel/pages/workflow/trigger-type/components/SidePanelWorkflowSelectTriggerType';
|
|
import { SidePanelPages } from 'twenty-shared/types';
|
|
|
|
export const SIDE_PANEL_PAGES_CONFIG = new Map<SidePanelPages, React.ReactNode>(
|
|
[
|
|
[
|
|
SidePanelPages.CommandMenuDisplay,
|
|
<SidePanelCommandMenuItemDisplayPage />,
|
|
],
|
|
[SidePanelPages.ViewRecord, <SidePanelRecordPage />],
|
|
[SidePanelPages.MergeRecords, <SidePanelMergeRecordPage />],
|
|
[SidePanelPages.UpdateRecords, <SidePanelUpdateMultipleRecords />],
|
|
[SidePanelPages.ViewCalendarEvent, <SidePanelCalendarEventPage />],
|
|
[SidePanelPages.EditRichText, <SidePanelEditRichTextPage />],
|
|
[
|
|
SidePanelPages.WorkflowTriggerSelectType,
|
|
<SidePanelWorkflowSelectTriggerType />,
|
|
],
|
|
[SidePanelPages.WorkflowStepCreate, <SidePanelWorkflowCreateStep />],
|
|
[SidePanelPages.WorkflowStepEditType, <SidePanelWorkflowEditStepType />],
|
|
[SidePanelPages.WorkflowStepEdit, <SidePanelWorkflowEditStep />],
|
|
[SidePanelPages.WorkflowStepView, <SidePanelWorkflowViewStep />],
|
|
[SidePanelPages.WorkflowRunStepView, <SidePanelWorkflowRunViewStep />],
|
|
[SidePanelPages.SearchRecords, <SidePanelSearchRecordsPage />],
|
|
[SidePanelPages.AskAI, <SidePanelAskAiPage />],
|
|
[SidePanelPages.ViewPreviousAiChats, <SidePanelAiChatThreadsPage />],
|
|
[
|
|
SidePanelPages.PageLayoutDashboardWidgetTypeSelect,
|
|
<SidePanelPageLayoutDashboardWidgetTypeSelect />,
|
|
],
|
|
[
|
|
SidePanelPages.DashboardChartSettings,
|
|
<SidePanelDashboardChartSettings />,
|
|
],
|
|
[
|
|
SidePanelPages.DashboardIframeSettings,
|
|
<SidePanelDashboardIframeSettings />,
|
|
],
|
|
[SidePanelPages.PageLayoutTabSettings, <SidePanelPageLayoutTabSettings />],
|
|
[
|
|
SidePanelPages.DashboardRecordTableSettings,
|
|
<SidePanelDashboardRecordTableSettings />,
|
|
],
|
|
[
|
|
SidePanelPages.RecordPageFieldsSettings,
|
|
<SidePanelRecordPageFieldsSettings />,
|
|
],
|
|
[
|
|
SidePanelPages.RecordPageFieldSettings,
|
|
<SidePanelRecordPageFieldSettings />,
|
|
],
|
|
[SidePanelPages.ViewFrontComponent, <SidePanelFrontComponentPage />],
|
|
[
|
|
SidePanelPages.PageLayoutRecordPageWidgetTypeSelect,
|
|
<SidePanelPageLayoutRecordPageWidgetTypeSelect />,
|
|
],
|
|
[
|
|
SidePanelPages.NavigationMenuItemEdit,
|
|
<SidePanelNavigationMenuItemEditPage />,
|
|
],
|
|
[SidePanelPages.NavigationMenuAddItem, <SidePanelNewSidebarItemPage />],
|
|
[SidePanelPages.CommandMenuEdit, <SidePanelCommandMenuItemEditPage />],
|
|
[SidePanelPages.ComposeEmail, <SidePanelComposeEmailPage />],
|
|
],
|
|
);
|