⚠️ Breaking changes
- feat(sharing): reshape record sharing API and share panel (#27121) by @FelixMalfait
- feat(usage-limit): replace the limit meter with a usage unit (#27124) by @etiennejouan
- refactor(ai): drop unused agent history repository registrations and errorDetails field (#27197) by @FelixMalfait
- Remove the install apps onboarding step and rely on pre-installed apps (#27374) by @etiennejouan
- Track application upgrade as a queued job with progress (#27526) by @martmull
- sendInboxMessage takes workspaceMemberIds; one thread key is one conversation (#27615) by @FelixMalfait
- [BREAKING_CHANGE] Ship the Conversations tab and workflow inbox messages under the inbox flag (#27830) by @FelixMalfait
- [BREAKING_CHANGE] Unpin chat Share and drop the AI chat sharing dropdown flag (#27832) by @FelixMalfait
- Add widgetAvailability to front components (#27841) by @martmull
✨ New features
- feat(campaigns): add selected people or a whole People view to a campaign list (#26823) by @neo773
- feat: admin-issued two-factor authentication recovery codes (#26933) by @abdulrahmancodes
- feat(ai): let runAgent continue a conversation by thread key (#27135) by @FelixMalfait
- feat(ai): let agents and workflows propose tool calls for approval (#27169) by @FelixMalfait
- feat(permissions): add a workspace flag to turn off record share visibility gating (#27177) by @charlesBochet
- feat(ai): ask one question per call and step through every pending request (#27206) by @FelixMalfait
- feat(ai): unread badge on the inbox, with inbox state sent as record events (#27221) by @FelixMalfait
- feat(ai-chat): # to reference records, @ to bring teammates into a chat (#27234) by @FelixMalfait
- feat(applications): show install and uninstall progress in the action buttons (#27357) by @martmull
💅 Improvements & UX
- Forward typed events with React compatibility to front component workers (#26356) by @bosiraphael
- [1/3] Let apps declare user-scoped application variables (#26868) by @ehconitin
- [2/3] Let each member set their own value of a user application variable (#26869) by @ehconitin
- Track campaign opens (#26938) by @neo773
- Chat inbox: read cursor, unread line, done and snooze per member (#27046) by @FelixMalfait
- Migrate field input pickers and row menus (#27061) by @bosiraphael
- Migrate navigation menus and icon pickers (#27064) by @bosiraphael
- Migrate address and email autocompletes (#27065) by @bosiraphael
- Migrate record and tab dropdown menus (#27070) by @bosiraphael
- Unify resizing with ResizeHandle (#27083) by @bosiraphael
- Migrate phone country picker to Twenty UI (#27125) by @bosiraphael
- Migrate currency picker to Twenty UI (#27127) by @bosiraphael
- Migrate country selection in Twenty UI (#27128) by @bosiraphael
- Keep the first keystroke typed into a dropdown search (#27148) by @bosiraphael
- Replace hidden chat messages with system messages (#27207) by @FelixMalfait
- Load a member's chat inbox state with its threads (#27219) by @FelixMalfait
- Refuse administration operations to installed application tokens (#27241) by @prastoin
- Add isSystem to agents and workflows (#27252) by @FelixMalfait
- Upgrade Preact to 11 for React 19 refs (#27271) by @bosiraphael
- Add people to a campaign list with a background job (#27276) by @neo773
- Remove agent evaluations and the agent Logs tab (#27320) by @FelixMalfait
- Add triggers to agents (1/3) (#27322) by @FelixMalfait
- Record runAgent calls made without a thread (#27337) by @FelixMalfait
- Remove dead AI code and unused module imports (#27339) by @FelixMalfait
- Organize Twenty UI components by family (#27354) by @bosiraphael
- Keep JSX handlers when a clone replaces a remote element ref (#27366) by @bosiraphael
- Align settings switches and complete feature flag labels (#27370) by @Bonapara
- Ground the scaffolded AGENTS.md in what the build enforces and fix dev:add output (#27371) by @ijreilly
- Complete ColorSample and Loader APIs (#27381) by @bosiraphael
- Accept isActive when updating a page layout widget (#27389) by @thomtrp
- Use node slots for icon presentation (#27393) by @bosiraphael
- Align Banner and InlineBanner feedback APIs (#27396) by @bosiraphael
- Let agent triggers and runAgent calls wait on events and durations (#27403) by @FelixMalfait
- Expose the selected records filter to front components (#27404) by @charlesBochet
- Stop agent code from depending on workflow code (#27407) by @FelixMalfait
- Inbox: chat subscriptions and server-side mentions (#27430) by @FelixMalfait
- Remove unused NestJS module imports in twenty-server (#27434) by @FelixMalfait
- Inbox: assign chats to a member (#27442) by @FelixMalfait
- Move skeleton placeholders into twenty-ui (#27481) by @bosiraphael
- Make Callout dismissal caller-owned (#27485) by @bosiraphael
- Align Tooltip shorthand and parts (#27488) by @bosiraphael
- Add loading positions to Button (#27496) by @bosiraphael
- Write the front component JSX runtime in TypeScript (#27497) by @bosiraphael
- Make typography composition explicit (#27504) by @bosiraphael
- Expose Collapsible parts (#27507) by @bosiraphael
- Block uninstalling a server route app from its owner workspace while installed elsewhere (#27510) by @martmull
- Gate the AI chat inbox behind a feature flag (#27552) by @FelixMalfait
- Remove the unused addAgentChatThreadParticipants mutation (#27557) by @FelixMalfait
- Compute the inbox counts on the server over all of a member's chats (#27570) by @FelixMalfait
- Replace the seven AI chat inbox mutations with one batched mutation (#27576) by @FelixMalfait
- Represent a paused agent run as a pending wake-up (#27579) by @FelixMalfait
- Complete Field and Slider anatomy (#27583) by @bosiraphael
- Align Section and CommandBlock composition (#27584) by @bosiraphael
- Expose Checkbox and Switch parts (#27587) by @bosiraphael
- Align input and textarea integration (#27589) by @bosiraphael
- Expose complete Popover parts (#27590) by @bosiraphael
- Complete AlertDialog parts (#27605) by @bosiraphael
- Expose complete Dialog parts (#27606) by @bosiraphael
- Complete Button and IconButton contracts (#27609) by @bosiraphael
- Fix oversized icon in InlineBanner (#27624) by @FelixMalfait
- Lighter shortcut hint in buttons and new snooze/done icons in the AI inbox (#27626) by @FelixMalfait
- Complete Card composition (#27632) by @bosiraphael
- Preserve native Breadcrumb links (#27636) by @bosiraphael
- Expose Avatar parts and explicit interaction (#27640) by @bosiraphael
- Stabilize Dropdown trailing action story (#27641) by @bosiraphael
- Derive AvatarGroup overflow (#27646) by @bosiraphael
- Simplify Chip content and interaction (#27648) by @bosiraphael
- Simplify Tag and Status composition (#27681) by @bosiraphael
- Keep ListItem presentational (#27683) by @bosiraphael
- Clarify SettingsRow control integration (#27686) by @bosiraphael
- Replace Pill and NotificationCounter with Badge (#27702) by @bosiraphael
- Clarify ImageInput file selection (#27706) by @bosiraphael
- Complete radio and segmented selection (#27707) by @bosiraphael
- Replace Accounts with App preferences behind a feature flag (#27708) by @ehconitin
- Align Tabs with Base UI (#27732) by @bosiraphael
- Expose NumberField and retain NumberStepper (#27734) by @bosiraphael
- Complete Select public parts (#27741) by @bosiraphael
- Wait for popup visibility in disabled item stories (#27766) by @FelixMalfait
- Identify chat owners and senders by workspace member, and drop the legacy chat columns (#27783) by @FelixMalfait
- Complete Autocomplete parts (#27806) by @bosiraphael
- Gate validation rules behind the Organization plan (#27818) by @thomtrp
- Let invoice-paying customers end their trial without a card (#27827) by @ijreilly
- Unify Progress semantics and move onboarding motion (#27831) by @bosiraphael
- feat(billing) : store the ?partner= sign-up attribution on the Stripe customer (#27836) by @etiennejouan
- Order application workflow steps by application and label (#27839) by @martmull
- Ask consent to bill credits when installing an app (#27844) by @martmull
- Add Toast updates and status naming (#27846) by @bosiraphael
- Make workflow commands, navigation and pages core-only (#27853) by @thomtrp
- Show application logo on fields, views, widgets and created-by actor (#27876) by @martmull
- Put twenty-ui styles in a cascade layer (#27899) by @bosiraphael
- Only measure overflowing lists while their count can show (#27923) by @charlesBochet
- Make Toast timing deterministic (#27930) by @bosiraphael
- Make table cell and skeleton styles static and add a block Skeleton layout (#27957) by @charlesBochet
🐛 Bug fixes
- fix(front): preserve multi-record selection in side-panel components (#27041) by @waelantar
- fix(ui): truncate LTR values at their end in RTL layouts (#27059) by @almoghazaz-cell
- fix(cli): remove legacy CLI config migration (#27085) by @Sameer7-s
- fix(calendar): stop re-saving unchanged calendar events and participants on sync (#27151) by @charlesBochet
- fix(twenty-sdk): only remove dist/sdk before bundling declarations (#27261) by @PINYOPATTANAWASANPORN
- fix(usage-limit): keep the limits form off scopes only an operator can set (#27373) by @etiennejouan
- fix(auth): trust the identity provider's email for SSO sign-ups and show the real SAML/OIDC URLs (#27486) by @ijreilly
⚡ Performance
- perf(roles): batch role relation resolvers and add a getRole query (#27118) by @FelixMalfait
🔧 Developer & API
- Accept enum string values in twenty-sdk inputs (#27193) by @prastoin
- Clean up CodeEditorHeader API (#27376) by @bosiraphael
- Normalize Separator API (#27383) by @bosiraphael
- Run workflow, API and trigger agent turns through one engine runner (#27385) by @FelixMalfait
- Normalize DirectionProvider API (#27387) by @bosiraphael
- Normalize VisuallyHidden API (#27388) by @bosiraphael
- Regenerate the SDK metadata client (#27544) by @FelixMalfait
- Remove unused Menu API (#27815) by @bosiraphael
- Deprecate the SDK CLI and create-twenty-app (#27862) by @Weiko
🏗️ Internal changes (8)
- refactor(shared): expose universal identifier validation (#27140) by @Weiko
- refactor(ai): simplify and unify AI chat code on server and front (#27192) by @FelixMalfait
- chore(usage-limit): remove the webhook rate limit and execution quota feature flags (#27278) by @etiennejouan
- refactor(usage-limit): charge usage rows through one call that debits then records (#27286) by @etiennejouan
- chore(logic-function): remove the IS_LOGIC_FUNCTION_PREBUILT_MODE_ENABLED feature flag (#27307) by @martmull
- docs(sdk): point to the twenty CLI package from the SDK README (#27512) by @Weiko
- chore(twenty-ui): declare storybook as a devDependency (#27697) by @abdulrahmancodes
- chore(security): bump oxfmt to 0.72.0 and reformat (#27772) by @mabdullahabaid
🎉 New contributors
- @PINYOPATTANAWASANPORN made their first contribution in #26742
- @glitchedmob made their first contribution in #27226
- @okxint made their first contribution in #27232
- @YadurajManu made their first contribution in #27248
- @omlahore made their first contribution in #26759
- @sarmah-rup made their first contribution in #26880
- @pranav440 made their first contribution in #26929
- @evanliuuu made their first contribution in #27018
- @hussnainahmedd made their first contribution in #27112
- @Sameer7-s made their first contribution in #27085
- @slavarosin made their first contribution in #27245
Full changelog (138 PRs)
- Forward typed events with React compatibility to front component workers (#26356) by @bosiraphael
- feat(campaigns): add selected people or a whole People view to a campaign list (#26823) by @neo773
- [1/3] Let apps declare user-scoped application variables (#26868) by @ehconitin
- [2/3] Let each member set their own value of a user application variable (#26869) by @ehconitin
- feat: admin-issued two-factor authentication recovery codes (#26933) by @abdulrahmancodes
- Track campaign opens (#26938) by @neo773
- fix(front): preserve multi-record selection in side-panel components (#27041) by @waelantar
- Chat inbox: read cursor, unread line, done and snooze per member (#27046) by @FelixMalfait
- fix(ui): truncate LTR values at their end in RTL layouts (#27059) by @almoghazaz-cell
- Migrate field input pickers and row menus (#27061) by @bosiraphael
- Migrate navigation menus and icon pickers (#27064) by @bosiraphael
- Migrate address and email autocompletes (#27065) by @bosiraphael
- Migrate record and tab dropdown menus (#27070) by @bosiraphael
- Unify resizing with ResizeHandle (#27083) by @bosiraphael
- fix(cli): remove legacy CLI config migration (#27085) by @Sameer7-s
- perf(roles): batch role relation resolvers and add a getRole query (#27118) by @FelixMalfait
- feat(sharing): reshape record sharing API and share panel (#27121) by @FelixMalfait
- feat(usage-limit): replace the limit meter with a usage unit (#27124) by @etiennejouan
- Migrate phone country picker to Twenty UI (#27125) by @bosiraphael
- chore: bump version to 2.46.0 (#27126) by @twenty-pr
- Migrate currency picker to Twenty UI (#27127) by @bosiraphael
- Migrate country selection in Twenty UI (#27128) by @bosiraphael
- feat(ai): let runAgent continue a conversation by thread key (#27135) by @FelixMalfait
- refactor(shared): expose universal identifier validation (#27140) by @Weiko
- Keep the first keystroke typed into a dropdown search (#27148) by @bosiraphael
- fix(calendar): stop re-saving unchanged calendar events and participants on sync (#27151) by @charlesBochet
- feat(ai): let agents and workflows propose tool calls for approval (#27169) by @FelixMalfait
- feat(permissions): add a workspace flag to turn off record share visibility gating (#27177) by @charlesBochet
- refactor(ai): simplify and unify AI chat code on server and front (#27192) by @FelixMalfait
- Accept enum string values in twenty-sdk inputs (#27193) by @prastoin
- refactor(ai): drop unused agent history repository registrations and errorDetails field (#27197) by @FelixMalfait
- feat(ai): ask one question per call and step through every pending request (#27206) by @FelixMalfait
- Replace hidden chat messages with system messages (#27207) by @FelixMalfait
- Load a member's chat inbox state with its threads (#27219) by @FelixMalfait
- feat(ai): unread badge on the inbox, with inbox state sent as record events (#27221) by @FelixMalfait
- feat(ai-chat): # to reference records, @ to bring teammates into a chat (#27234) by @FelixMalfait
- Refuse administration operations to installed application tokens (#27241) by @prastoin
- Add isSystem to agents and workflows (#27252) by @FelixMalfait
- fix(twenty-sdk): only remove dist/sdk before bundling declarations (#27261) by @PINYOPATTANAWASANPORN
- Upgrade Preact to 11 for React 19 refs (#27271) by @bosiraphael
- Add people to a campaign list with a background job (#27276) by @neo773
- chore(usage-limit): remove the webhook rate limit and execution quota feature flags (#27278) by @etiennejouan
- refactor(usage-limit): charge usage rows through one call that debits then records (#27286) by @etiennejouan
- chore(logic-function): remove the IS_LOGIC_FUNCTION_PREBUILT_MODE_ENABLED feature flag (#27307) by @martmull
- Remove agent evaluations and the agent Logs tab (#27320) by @FelixMalfait
- Add triggers to agents (1/3) (#27322) by @FelixMalfait
- Record runAgent calls made without a thread (#27337) by @FelixMalfait
- Remove dead AI code and unused module imports (#27339) by @FelixMalfait
- Organize Twenty UI components by family (#27354) by @bosiraphael
- feat(applications): show install and uninstall progress in the action buttons (#27357) by @martmull
- Keep JSX handlers when a clone replaces a remote element ref (#27366) by @bosiraphael
- Align settings switches and complete feature flag labels (#27370) by @Bonapara
- Ground the scaffolded AGENTS.md in what the build enforces and fix dev:add output (#27371) by @ijreilly
- fix(usage-limit): keep the limits form off scopes only an operator can set (#27373) by @etiennejouan
- Remove the install apps onboarding step and rely on pre-installed apps (#27374) by @etiennejouan
- Clean up CodeEditorHeader API (#27376) by @bosiraphael
- Complete ColorSample and Loader APIs (#27381) by @bosiraphael
- Normalize Separator API (#27383) by @bosiraphael
- Run workflow, API and trigger agent turns through one engine runner (#27385) by @FelixMalfait
- Normalize DirectionProvider API (#27387) by @bosiraphael
- Normalize VisuallyHidden API (#27388) by @bosiraphael
- Accept isActive when updating a page layout widget (#27389) by @thomtrp
- Use node slots for icon presentation (#27393) by @bosiraphael
- Align Banner and InlineBanner feedback APIs (#27396) by @bosiraphael
- Let agent triggers and runAgent calls wait on events and durations (#27403) by @FelixMalfait
- Expose the selected records filter to front components (#27404) by @charlesBochet
- Stop agent code from depending on workflow code (#27407) by @FelixMalfait
- Inbox: chat subscriptions and server-side mentions (#27430) by @FelixMalfait
- Remove unused NestJS module imports in twenty-server (#27434) by @FelixMalfait
- Inbox: assign chats to a member (#27442) by @FelixMalfait
- Move skeleton placeholders into twenty-ui (#27481) by @bosiraphael
- Make Callout dismissal caller-owned (#27485) by @bosiraphael
- fix(auth): trust the identity provider's email for SSO sign-ups and show the real SAML/OIDC URLs (#27486) by @ijreilly
- Align Tooltip shorthand and parts (#27488) by @bosiraphael
- Add loading positions to Button (#27496) by @bosiraphael
- Write the front component JSX runtime in TypeScript (#27497) by @bosiraphael
- Make typography composition explicit (#27504) by @bosiraphael
- Expose Collapsible parts (#27507) by @bosiraphael
- Block uninstalling a server route app from its owner workspace while installed elsewhere (#27510) by @martmull
- docs(sdk): point to the twenty CLI package from the SDK README (#27512) by @Weiko
- Track application upgrade as a queued job with progress (#27526) by @martmull
- Regenerate the SDK metadata client (#27544) by @FelixMalfait
- Gate the AI chat inbox behind a feature flag (#27552) by @FelixMalfait
- Remove the unused addAgentChatThreadParticipants mutation (#27557) by @FelixMalfait
- Compute the inbox counts on the server over all of a member's chats (#27570) by @FelixMalfait
- Replace the seven AI chat inbox mutations with one batched mutation (#27576) by @FelixMalfait
- Represent a paused agent run as a pending wake-up (#27579) by @FelixMalfait
- Complete Field and Slider anatomy (#27583) by @bosiraphael
- Align Section and CommandBlock composition (#27584) by @bosiraphael
- Expose Checkbox and Switch parts (#27587) by @bosiraphael
- Align input and textarea integration (#27589) by @bosiraphael
- Expose complete Popover parts (#27590) by @bosiraphael
- Complete AlertDialog parts (#27605) by @bosiraphael
- Expose complete Dialog parts (#27606) by @bosiraphael
- Complete Button and IconButton contracts (#27609) by @bosiraphael
- sendInboxMessage takes workspaceMemberIds; one thread key is one conversation (#27615) by @FelixMalfait
- Fix oversized icon in InlineBanner (#27624) by @FelixMalfait
- Lighter shortcut hint in buttons and new snooze/done icons in the AI inbox (#27626) by @FelixMalfait
- Complete Card composition (#27632) by @bosiraphael
- Preserve native Breadcrumb links (#27636) by @bosiraphael
- Expose Avatar parts and explicit interaction (#27640) by @bosiraphael
- Stabilize Dropdown trailing action story (#27641) by @bosiraphael
- Derive AvatarGroup overflow (#27646) by @bosiraphael
- Simplify Chip content and interaction (#27648) by @bosiraphael
- Simplify Tag and Status composition (#27681) by @bosiraphael
- Keep ListItem presentational (#27683) by @bosiraphael
- Clarify SettingsRow control integration (#27686) by @bosiraphael
- chore(twenty-ui): declare storybook as a devDependency (#27697) by @abdulrahmancodes
- Replace Pill and NotificationCounter with Badge (#27702) by @bosiraphael
- Clarify ImageInput file selection (#27706) by @bosiraphael
- Complete radio and segmented selection (#27707) by @bosiraphael
- Replace Accounts with App preferences behind a feature flag (#27708) by @ehconitin
- Align Tabs with Base UI (#27732) by @bosiraphael
- Expose NumberField and retain NumberStepper (#27734) by @bosiraphael
- chore: bump version to 2.47.0 (#27735) by @twenty-pr
- Complete Select public parts (#27741) by @bosiraphael
- Wait for popup visibility in disabled item stories (#27766) by @FelixMalfait
- chore(security): bump oxfmt to 0.72.0 and reformat (#27772) by @mabdullahabaid
- Identify chat owners and senders by workspace member, and drop the legacy chat columns (#27783) by @FelixMalfait
- Complete Autocomplete parts (#27806) by @bosiraphael
- Remove unused Menu API (#27815) by @bosiraphael
- Gate validation rules behind the Organization plan (#27818) by @thomtrp
- Let invoice-paying customers end their trial without a card (#27827) by @ijreilly
- [BREAKING_CHANGE] Ship the Conversations tab and workflow inbox messages under the inbox flag (#27830) by @FelixMalfait
- Unify Progress semantics and move onboarding motion (#27831) by @bosiraphael
- [BREAKING_CHANGE] Unpin chat Share and drop the AI chat sharing dropdown flag (#27832) by @FelixMalfait
- feat(billing) : store the ?partner= sign-up attribution on the Stripe customer (#27836) by @etiennejouan
- Order application workflow steps by application and label (#27839) by @martmull
- Add widgetAvailability to front components (#27841) by @martmull
- Ask consent to bill credits when installing an app (#27844) by @martmull
- Add Toast updates and status naming (#27846) by @bosiraphael
- Make workflow commands, navigation and pages core-only (#27853) by @thomtrp
- Deprecate the SDK CLI and create-twenty-app (#27862) by @Weiko
- Show application logo on fields, views, widgets and created-by actor (#27876) by @martmull
- Put twenty-ui styles in a cascade layer (#27899) by @bosiraphael
- Only measure overflowing lists while their count can show (#27923) by @charlesBochet
- Make Toast timing deterministic (#27930) by @bosiraphael
- Make table cell and skeleton styles static and add a block Skeleton layout (#27957) by @charlesBochet
Full Changelog: sdk/v2.45.0...sdk/v2.47.0