Release notes preview
🌟 Highlights
- Call kv.get, kv.set, and kv.delete in logic functions to store and retrieve per-app key-value data scoped to the installing workspace. (#23089)
- defineUninstallLogicFunction runs your cleanup logic before app entities are deleted, while app objects and records are still queryable. (#23227)
- Server route resolvers can now return a value synchronously to the HTTP caller, unblocking webhook handshakes like Slack's url_verification challenge. (#23233)
- Set onConnectLogicFunctionUniversalIdentifier on a connection provider manifest to fire a logic function immediately after an OAuth connection succeeds. (#23167)
- roleUniversalIdentifier on AgentManifest assigns a role to an agent at install time without writing a post-install hook. (#23206)
✨ New features
- Use kv.get, kv.set, and kv.delete from twenty-sdk/logic-function to read and write key-value pairs scoped to your app and the installing workspace; entries require an APPLICATION_ACCESS token and apps cannot access each other's pairs. (#23089) by @abdulrahmancodes
- Add onConnectLogicFunctionUniversalIdentifier to your connection provider manifest to trigger a named logic function immediately after an OAuth connection is established for that provider. (#23167) by @abdulrahmancodes
- Set roleUniversalIdentifier on defineAgent or AgentManifest to declaratively assign a role to your agent at install time, eliminating the need for a manual post-install hook. (#23206) by @abdulrahmancodes
- Export defineUninstallLogicFunction to register a logic function that runs before your app's entities are deleted on uninstall — the handler can still query app objects and records at that point; failures are best-effort and do not block uninstall. (#23227) by @martmull
- Server route resolvers can now return a plain object directly to the caller instead of always receiving a queued 202; use this for integrations that require a synchronous response such as Slack's url_verification handshake. (#23233) by @abdulrahmancodes
- settingsCustomTabFrontComponentUniversalIdentifier is restored on ApplicationManifest; apps can again declare a custom settings tab rendered via a front component, reversing the removal from a prior release. (#23256) by @martmull
💅 Improvements & UX
- workspace.metadataVersion is now marked deprecated in the GraphQL schema; remove it from workspace queries in your client code. (#23189) by @Weiko
🐛 Bug fixes
- Installed application icons now display correctly across the workspace UI; logoUrl is fetched properly in the application fragment rather than relying solely on the bootstrap user query. (#23411) by @martmull
🔧 Developer & API
- A new twenty-sdk env var disables the provider check; useful when running the SDK in environments where provider validation should be skipped. (#23155) by @prastoin
- Use the new upgrade-application CLI command to roll out app upgrades across workspaces; the admin UI rollout buttons for install-on-all and upgrade-existing have been removed. (#23212) by @martmull
🏗️ Internal changes (8)
- Fix dashboard record table widget aggregate persistence (#23008) by @scarab-systems
- Stop leaking the refresh token in the social SSO redirect URL (#23061) by @bosiraphael
- Make solo tabs first-class: derived presentation, native editing, unified widget header (#23109) by @FelixMalfait
- Add post-onboarding AI chat setup behind a feature flag (#23120) by @bosiraphael
- Feat/email settings v2 (#23180) by @neo773
- Feat/email composer improvements (#23188) by @neo773
- Enrich workspace company via People Data Labs during onboarding (#23199) by @bosiraphael
- Replace the onboarding AI chat feature flag with an environment variable (#23439) by @bosiraphael
🎉 New contributors
- @scarab-systems made their first contribution in #23008
- @Rehansanjay made their first contribution in #22885
- @djadji-gueye made their first contribution in #23287
- @eeshsaxena made their first contribution in #23293
- @guillaume-flambard made their first contribution in #23325
- @Shinu-Cherian made their first contribution in #23343
Full changelog (20 PRs)
- Fix dashboard record table widget aggregate persistence (#23008) by @scarab-systems
- Stop leaking the refresh token in the social SSO redirect URL (#23061) by @bosiraphael
- key-value storage for applications (#23089) by @abdulrahmancodes
- Make solo tabs first-class: derived presentation, native editing, unified widget header (#23109) by @FelixMalfait
- Add post-onboarding AI chat setup behind a feature flag (#23120) by @bosiraphael
- chore: bump version to 2.24.0 (#23152) by @twenty-pr
- twenty-sdk env var to disable prov check (#23155) by @prastoin
- feat(connections): run a logic function on connection provider connect (#23167) by @abdulrahmancodes
- Feat/email settings v2 (#23180) by @neo773
- Feat/email composer improvements (#23188) by @neo773
- Deprecate workspace metadataVersion and stop consuming it in the frontend (#23189) by @Weiko
- Enrich workspace company via People Data Labs during onboarding (#23199) by @bosiraphael
- feat: agent roleUniversalIdentifier for manifest-driven role assignment (#23206) by @abdulrahmancodes
- Replace admin app rollout buttons with upgrade-application CLI command (#23212) by @martmull
- chore: bump version to 2.25.0 (#23221) by @twenty-pr
- Add defineUninstallLogicFunction hook for applications (#23227) by @martmull
- Let server route resolvers answer the caller synchronously (#23233) by @abdulrahmancodes
- feat(applications): restore the application custom settings tab (#23256) by @martmull
- fix(applications): display the installed application icon (#23411) by @martmull
- Replace the onboarding AI chat feature flag with an environment variable (#23439) by @bosiraphael
Full Changelog: sdk/v2.23.0...sdk/v2.25.0