Compare commits

...
Author SHA1 Message Date
58189e1c05 chore: sync AI model catalog from models.dev (#19100)
Automated daily sync of `ai-providers.json` from
[models.dev](https://models.dev).

This PR updates pricing, context windows, and model availability based
on the latest data.
New models meeting inclusion criteria (tool calling, pricing data,
context limits) are added automatically.
Deprecated models are detected based on cost-efficiency within the same
model family.

**Please review before merging** — verify no critical models were
incorrectly deprecated.

Co-authored-by: FelixMalfait <6399865+FelixMalfait@users.noreply.github.com>
2026-03-30 08:31:25 +02:00
Charles BochetandGitHub a3f468ef98 chore: remove IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED and IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED feature flags (#19082)
## Summary
- Removes `IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED` feature flag,
making row-level permission predicates always enabled. Removes
early-return guards from query builders (select, update, insert) and the
shared utility, the public feature flag metadata entry, and
`updateFeatureFlag` calls from integration tests.
- Removes `IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED` feature flag, making
whole-day datetime filtering always enabled. Simplifies filter input
components and hooks to always use date-only format for `IS` operand on
`DATE_TIME` fields.
- Cleans up enum definitions, seed data, generated schema files, and
test mocks for both flags.
2026-03-29 12:26:08 +02:00
Charles BochetandGitHub 4d74cc0a28 chore: remove IS_APPLICATION_ENABLED feature flag (#19081)
## Summary
- Remove the `IS_APPLICATION_ENABLED` feature flag — application
features are now always enabled
- Remove `@RequireFeatureFlag` decorators and `FeatureFlagGuard` from 7
application resolvers (registration, development, manifest, install,
upgrade, marketplace, oauth)
- Remove frontend feature flag checks: settings navigation visibility,
route protection wrapper, side panel widget type gating, and role
permission flag filtering
- Delete the integration test for disabled-flag behavior
- Clean up seed data, test mocks, and generated schema files
2026-03-29 11:43:35 +02:00
05c0713474 i18n - translations (#19080)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-29 10:51:48 +02:00
Charles BochetandGitHub 28de34cf20 chore: remove IS_DASHBOARD_V2_ENABLED feature flag (#19079)
## Summary
- Remove the `IS_DASHBOARD_V2_ENABLED` feature flag from the codebase
- Dashboard V2 features (gauge charts, line charts, pie charts) are now
always enabled
- Remove the validator gate that blocked gauge chart creation/update
without the flag
- Clean up all related code: seed data, dev-seeder service, widget
seeds, and test mocks
2026-03-29 10:45:54 +02:00
Charles BochetandGitHub e8cb086b64 chore: remove completed migration feature flags and upgrade commands <= 1.18 (#19074)
## Summary

- Remove 3 completed migration feature flags: `IS_ATTACHMENT_MIGRATED`,
`IS_NOTE_TARGET_MIGRATED`, `IS_TASK_TARGET_MIGRATED` — these were
already enabled by default for all new workspaces via
`DEFAULT_FEATURE_FLAGS`
- Delete all upgrade command directories for versions <= 1.18 (`1-16/`,
`1-17/`, `1-18/`) along with their module registrations, removing ~6,600
lines of dead migration code
- Simplify frontend utility functions
(`getActivityTargetObjectFieldIdName`, `getActivityTargetsFilter`,
`getActivityTargetFieldNameForObject`,
`generateActivityTargetMorphFieldKeys`,
`findActivitiesOperationSignatureFactory`) by removing the
`isMorphRelation` parameter and always using the morph relation path
- Remove feature flag checks from 7 frontend hooks/components that were
gating attachment and activity target behavior behind the removed flags
- Simplify `buildDefaultRelationFlatFieldMetadatasForCustomObject`
server util to always treat attachment, noteTarget, and taskTarget as
morph relations without checking feature flags
2026-03-29 09:15:26 +02:00
f651413297 chore: sync AI model catalog from models.dev (#19078)
Automated daily sync of `ai-providers.json` from
[models.dev](https://models.dev).

This PR updates pricing, context windows, and model availability based
on the latest data.
New models meeting inclusion criteria (tool calling, pricing data,
context limits) are added automatically.
Deprecated models are detected based on cost-efficiency within the same
model family.

**Please review before merging** — verify no critical models were
incorrectly deprecated.

Co-authored-by: FelixMalfait <6399865+FelixMalfait@users.noreply.github.com>
2026-03-29 08:20:40 +02:00
ccaea1ba36 i18n - translations (#19076)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-29 07:37:29 +02:00
Félix MalfaitandGitHub a51b5ed589 fix: resolve settings/usage chart crash and add ClickHouse usage event seeds (#19039)
## Summary

- **Fix settings/usage page crash**: The `GraphWidgetLineChart`
component used on `settings/usage` was crashing with "Instance id is not
provided and cannot be found in context" because it requires
`WidgetComponentInstanceContext` (for tooltip/crosshair component
states) which is only provided inside the widget system. Wraps the
standalone chart usages with the required context provider.
- **Avoid mounting `GraphWidgetLegend` when hidden**: The legend
component calls `useIsPageLayoutInEditMode()` which requires
`PageLayoutEditModeProviderContext` — another context only available
inside the widget system. Since the settings page passes
`showLegend={false}`, the fix conditionally unmounts the legend instead
of always mounting it with a `show` prop. Applied consistently across
all four chart types (line, bar, pie, gauge).
- **Add ClickHouse usage event seeds**: Generates ~400 realistic
`usageEvent` rows spanning the past 35 days with weighted user activity,
weekday/weekend patterns, and gradual ramp-up. Enables developers to see
the usage analytics page with data locally.

## Test plan

- [ ] Navigate to `settings/usage` — page should render without errors
- [ ] Verify the daily usage line chart displays correctly
- [ ] Navigate to a user detail page from the usage list
- [ ] Verify the user detail chart renders without errors
- [ ] Run `npx nx clickhouse:seed twenty-server` and confirm usage
events are seeded
- [ ] Verify chart legend still works correctly on dashboard widgets (no
regression)


Made with [Cursor](https://cursor.com)
2026-03-29 07:31:36 +02:00
6efd9ad26e i18n - translations (#19073)
Created by Github action

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-28 22:59:16 +01:00
Charles BochetandGitHub c407341912 feat: optimize hot database queries with multi-layer caching (#19068)
## Summary

Introduces multi-layer caching for the 5 most frequent database queries
identified in production (Sentry data), targeting the JWT authentication
hot path and cron job logic.

### Problem
Our database is under heavy load from uncached queries on the auth hot
path:
- `WorkspaceEntity` lookups: **638 queries/min**
- `ApiKeyEntity` lookups: **491 queries/min**
- `UserEntity` lookups: **147 queries/min**
- `UserWorkspaceEntity` lookups: **143 queries/min**
- `LogicFunctionEntity` lookups: **1800 queries/min** (cron job)

### Solution

**1. New `CoreEntityCacheService`** for non-workspace-scoped entities
(Workspace, User, UserWorkspace):
- Mirrors `WorkspaceCacheService` architecture (in-process Map + Redis
with hash validation)
- Provider pattern with `@CoreEntityCache` decorator
- Keyed by entity primary key (not workspaceId)
- 100ms local TTL, Redis-backed hash validation for cross-instance
consistency
- Three providers: `WorkspaceEntityCacheProviderService`,
`UserEntityCacheProviderService`,
`UserWorkspaceEntityCacheProviderService`

**2. New `apiKeyMap` WorkspaceCache** for workspace-scoped API key
lookups:
- `WorkspaceApiKeyMapCacheService` loads all API keys for a workspace
into a map by ID
- Leverages existing `WorkspaceCacheService` infrastructure
- Cache invalidation on API key create/update/revoke

**3. `CronTriggerCronJob` refactored** to use existing
`flatLogicFunctionMaps` workspace cache:
- Eliminates per-workspace `LogicFunctionEntity` repository queries
(~1800/min)
- Filters cached data in-memory instead

**4. `JwtAuthStrategy` refactored** to use caches for all entity
lookups:
- Workspace, User, UserWorkspace → `CoreEntityCacheService`
- ApiKey → `WorkspaceCacheService` (`apiKeyMap`)
- Impersonation queries kept as direct DB queries (rare path, requires
relations)

**5. Cache invalidation** wired into mutation paths:
- `WorkspaceService` → invalidates `workspaceEntity` on
save/update/delete
- `ApiKeyService` → invalidates `apiKeyMap` on create/update/revoke

### Architecture

```
Request → JwtAuthStrategy
  ├── Workspace lookup → CoreEntityCacheService (in-process → Redis → DB)
  ├── User lookup → CoreEntityCacheService (in-process → Redis → DB)
  ├── UserWorkspace lookup → CoreEntityCacheService (in-process → Redis → DB)
  └── ApiKey lookup → WorkspaceCacheService (in-process → Redis → DB)

CronTriggerCronJob
  └── LogicFunction lookup → WorkspaceCacheService (flatLogicFunctionMaps)
```

### Expected Impact
| Query | Before | After |
|-------|--------|-------|
| WorkspaceEntity | 638/min | ~0 (cached) |
| ApiKeyEntity | 491/min | ~0 (cached) |
| UserEntity | 147/min | ~0 (cached) |
| UserWorkspaceEntity | 143/min | ~0 (cached) |
| LogicFunctionEntity | 1800/min | ~0 (cached) |

### Not included (ongoing separately)
- DataSourceEntity query optimization (IS_DATASOURCE_MIGRATED migration)
- ObjectMetadataEntity query optimization (already partially cached)
2026-03-28 22:53:34 +01:00
Charles BochetandGitHub 81fc960712 Deprecate dataSource table with dual-write to workspace.databaseSchema (#19059)
## Summary
- Starts deprecation of the `core.dataSource` table by introducing a
dual-write system: `DataSourceService.createDataSourceMetadata` now
writes to both `core.dataSource` and `core.workspace.databaseSchema`
- Migrates read sites (`WorkspaceDataSourceService.checkSchemaExists`,
`WorkspaceSchemaFactory`, `MiddlewareService`,
`WorkspacesMigrationCommandRunner`) to read from
`workspace.databaseSchema` instead of querying the `dataSource` table
- Removes the unused `databaseUrl` field from `WorkspaceEntity` and
drops the column via migration
- Adds a 1.20 upgrade command to backfill `workspace.databaseSchema`
from `dataSource.schema` for existing workspaces
2026-03-28 11:29:19 +01:00
Charles BochetandGitHub cb44b22e15 Fix INDEX view showing labelPlural instead of resolved view name in nav (#19049)
## Summary
- Navigation sidebar was displaying "Notes" instead of "All Notes" for
INDEX views
- `getNavigationMenuItemLabel` had a special case for INDEX views that
returned `objectMetadataItem.labelPlural` instead of the
already-resolved `view.name`
- Since `viewsSelector` already resolves `{objectLabelPlural}` templates
via `resolveViewNamePlaceholders`, the INDEX special case was redundant
and incorrect — removed it from both `getNavigationMenuItemLabel` and
`getViewNavigationMenuItemLabel`
- Added unit tests covering all navigation menu item type branches

<img width="222" height="479" alt="image"
src="https://github.com/user-attachments/assets/de6f92b1-e0c2-445a-a145-cf2820434af7"
/>
2026-03-27 17:25:52 +00:00
9498a60f74 i18n - translations (#19048)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-27 17:39:22 +01:00
Charles BochetandGitHub 191a277ddf fix: invalidate rolesPermissions cache + add Docker Hub auth to CI (#19044)
## Summary

### Cache invalidation fix
- After migrating object/field permissions to syncable entities (#18609,
#18751, #18567), changes to `flatObjectPermissionMaps`,
`flatFieldPermissionMaps`, or `flatPermissionFlagMaps` no longer
triggered `rolesPermissions` cache invalidation
- This caused stale permission data to be served, leading to flaky
`permissions-on-relations` integration tests and potentially incorrect
permission enforcement in production after object permission upserts
- Adds the three permission-related flat map keys to the condition that
triggers `rolesPermissions` cache recomputation in
`WorkspaceMigrationRunnerService.getLegacyCacheInvalidationPromises`
- Clears memoizer after recomputation to prevent concurrent
`getOrRecompute` calls from caching stale data

### Docker Hub rate limit fix
- CI service containers (postgres, redis, clickhouse) and `docker
run`/`docker build` steps were pulling from Docker Hub
**unauthenticated**, hitting the 100-pull-per-6-hour rate limit on
shared GitHub-hosted runner IPs
- Adds `credentials` blocks to all service container definitions and
`docker/login-action` steps before `docker run`/`docker compose`
commands
- Uses `vars.DOCKERHUB_USERNAME` + `secrets.DOCKERHUB_PASSWORD`
(matching the existing twenty-infra convention)
- Affected workflows: ci-server, ci-merge-queue, ci-breaking-changes,
ci-zapier, ci-sdk, ci-create-app-e2e, ci-website,
ci-test-docker-compose, preview-env-keepalive, spawn-twenty-docker-image
action
2026-03-27 17:32:53 +01:00
7f1814805d Fix backfill record page layout command (#19043)
Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
2026-03-27 16:56:30 +01:00
34b81adce8 i18n - translations (#19046)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-27 16:38:08 +01:00
Félix MalfaitandGitHub cd2e08b912 Enforce workspace count limit for multi-workspace setups (#19036)
## Summary
- Limits workspace creation to 5 workspaces per server when no valid
enterprise key is configured
- Enterprise key validity is checked first (synchronous, in-memory
cached) to avoid unnecessary DB queries on enterprise deployments
- Adds 4 unit tests covering: limit enforcement, enterprise key bypass,
below-limit creation, and performance (no enterprise check when
workspace count is zero)

## Test plan
- [x] All 11 unit tests pass (8 existing + 3 new behavioral + 1
performance assertion)
- [ ] Manual: verify workspace creation blocked at limit=5 without
enterprise key
- [ ] Manual: verify workspace creation allowed beyond limit with valid
enterprise key
- [ ] Manual: verify first workspace (bootstrap) creation is unaffected


Made with [Cursor](https://cursor.com)
2026-03-27 16:31:27 +01:00
Charles BochetandGitHub fb21f3ccf5 fix: resolve availabilityObjectMetadataUniversalIdentifier in backfill command (#19041)
## Summary

- Fixes workflow manual trigger command menu items losing their
`availabilityObjectMetadataId` during the 1-20 backfill upgrade command
- The migration runner's `transpileUniversalActionToFlatAction` resolves
`availabilityObjectMetadataId` **from**
`availabilityObjectMetadataUniversalIdentifier`, overwriting the
original value. The backfill was hardcoding the universal identifier to
`null`, causing all `RECORD_SELECTION` items to end up with `NULL`
`availabilityObjectMetadataId` after persistence.
- Now properly resolves `availabilityObjectMetadataUniversalIdentifier`
from `flatObjectMetadataMaps.universalIdentifierById` so the runner can
correctly derive the FK during INSERT.
2026-03-27 16:01:31 +01:00
Paul RastoinandGitHub 281bb6d783 Guard yarn database:migrate:prod (#19008)
## Motivations
A lot of self hosters hands up using the `yarn database:migrated:prod`
either manually or through AI assisted debug while they try to upgrade
an instance while their workspace is still blocked in a previous one
Leading to their whole database permanent corruption

## What happened
Replaced the direct call the the typeorm cli to a command calling it
programmatically, adding a layer of security in case a workspace seems
to be blocked in a previous version than the one just before the one
being installed ( e.g 1.0 when you try to upgrade from 1.1 to 1.2 )

For our cloud we still need a way to bypass this security explaining the
-f flag

## Remark
Centralized this logic and refactored creating new services
`WorkspaceVersionService` and `CoreEngineVersionService` that will
become useful for the upcoming upgrade refactor

Related to https://github.com/twentyhq/twenty-infra/pull/529
2026-03-27 14:39:18 +00:00
c96c034908 i18n - translations (#19040)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-27 14:53:33 +01:00
Abdul RahmanGitHubCopilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>Charles Bochet
5efe69f8d3 Migrate field permission to syncable entity (#18751)
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
Co-authored-by: Charles Bochet <charles@twenty.com>
2026-03-27 14:47:27 +01:00
c2b058a6a7 fix: use workspace-generated id for core dual-write in message folder save (#19038)
Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
2026-03-27 13:53:30 +01:00
Abdullah.andGitHub 22c9693ce5 First PR to bring in the new twenty website. (#19035)
This PR contains Menu, Hero, TrustedBy, Problem, ThreeCards and Footer
sections of the new website.

Most components in there match the Figma designs, except for two things.
- Zoom levels on 3D illustrations from Endless Tools.
- Menu needs to have the same color as Hero - it's not happening at the
moment since Menu is in the layout, not nested inside pages or Hero.

Images are placeholders (same as Figma).
2026-03-27 13:48:03 +01:00
50ea560e57 Seed company workflow for email upserts (#18909)
@thomtrp

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
2026-03-27 13:47:07 +01:00
EtienneandGitHub 56056b885d refacto - remove hello-pangea/dnd from navigation-menu-item module (#19033)
Removed all @hello-pangea/dnd imports from the navigation-menu-item/
module by replacing the type bridge layer with a native
NavigationMenuItemDropResult type. The dnd-kit events were already
powering all DnD — hello-pangea was only used as a type contract and one
dead <Droppable> component.
3 files deleted (dead <Droppable> wrapper, DROP_RESULT_OPTIONS shim,
toDropResult bridge), 4 files edited (handler signatures simplified,
bridge removed from orchestrator, utility type narrowed), 1 type
created. Zero behavioral changes, typecheck and tests pass.
2026-03-27 11:23:25 +00:00
Paul RastoinandGitHub db9da3194f Refactor client auto heal (#19032) 2026-03-27 09:23:26 +00:00
BugIsGodandGitHub 68f5e70ade fix: sign file URLs in timeline and file loss on click outside (#19001)
Fixes: #18943
## Problem

  Two bugs related to the Files field:

1. **File loss on click outside**: When `MultiItemFieldInput` was not in
edit mode (input hidden), clicking outside would still call
`validateInputAndComputeUpdatedItems()` with an empty `inputValue` and
`itemToEditIndex = 0`, causing the first file to be silently deleted.
<img width="624" height="332" alt="image"
src="https://github.com/user-attachments/assets/657aff2c-e497-4685-b8b7-fa22aba772f8"
/>


2. **Unsigned file URLs in timeline activity**: FileId, FileName stored
in `timelineActivity.properties.diff` (before/after values) were not
being signed (timeActivity.properties is stored as json in database),
making them inaccessible from the
frontend.

<img width="1092" height="103" alt="image"
src="https://github.com/user-attachments/assets/23d83ea3-4eb9-41ef-a99c-c4515d1cfb35"
/>


 ## Reproduction


https://github.com/user-attachments/assets/e75b842b-5cbb-46e8-a923-ac9df62deb98

## Changes
- `MultiItemFieldInput.tsx`: Wrap the validate + onChange logic in `if
(isInputDisplayed)` so it only runs when the input is actually open.
- `timeline-activity-query-result-getter.handler.ts`: New handler that
iterates over `properties.diff` fields and signs any file arrays found
in `before`/`after` values (call same method:
`fileUrlService.signFileByIdUrl` as table field view
`FilesFieldQueryResultGetterHandler`.
- `common-result-getters.service.ts`: Register the new handler for
`timelineActivity`.


## After 


https://github.com/user-attachments/assets/368c7be1-3101-43a2-ac93-fe1b0d8a7a37
2026-03-27 08:28:30 +00:00
Félix MalfaitandGitHub 08077476f3 fix: remove remaining direct cookie writes that make tokenPair a session cookie on renewal (#19031)
## Summary

- Removes two remaining direct `cookieStorage.setItem('tokenPair', ...)`
calls that were overwriting the Jotai-managed cookie (180-day expiry)
with a session cookie (no expiry) during **token renewal**
- Followup to #18795 which fixed the same issue in `handleSetAuthTokens`
but missed the renewal code paths

## Root cause

Two token renewal paths still had direct cookie writes without
`expires`:

1. **`apollo.factory.ts`** — `attemptTokenRenewal()` fires on every
`UNAUTHENTICATED` GraphQL error after a successful token refresh
2. **`useAgentChat.ts`** — `retryFetchWithRenewedToken()` fires on 401
from the AI chat endpoint

Both called `cookieStorage.setItem('tokenPair', JSON.stringify(tokens))`
without an `expires` attribute, creating a session cookie that overwrote
the Jotai-managed one. This is why the bug was **intermittent after
#18795**: it only appeared after a token renewal, not on fresh login.

The `onTokenPairChange` / `setTokenPair` calls already write through
Jotai's `atomWithStorage` → `createJotaiCookieStorage`, which always
sets `expires: 180 days`.

## Test plan

- Log in to the app
- Wait for a token renewal to occur (or force one by letting the access
token expire)
- Inspect the `tokenPair` cookie in DevTools → Application → Cookies
- Verify the cookie retains an expiration date ~180 days from now (not
"Session")
- Close and reopen the browser — confirm you remain logged in


Made with [Cursor](https://cursor.com)
2026-03-27 08:21:26 +00:00
6f0ac88e20 fix: batch viewGroup mutations sequentially to prevent race conditions (#19027)
## Bug Description

When reordering stages in the Kanban board, the frontend fires all
viewGroup update mutations concurrently via Promise.all, causing race
conditions in the workspace migration runner's cache invalidation,
database contention, and a thundering herd effect that stalls the
server.

## Changes

Changed `usePerformViewGroupAPIPersist` to execute viewGroup update
mutations sequentially instead of concurrently. The `Promise.all`
pattern fired all N mutations simultaneously, each triggering a full
workspace migration runner pipeline (transaction + cache invalidation).
The sequential `for...of` loop ensures each mutation completes
(including its cache invalidation) before the next begins, eliminating
the race condition.

## Related Issue

Fixes #18865

## Testing

This fix addresses the root cause identified in the Sonarly analysis on
the issue. The concurrent mutation pattern was causing:
- PostgreSQL row-level lock contention on viewGroup rows
- Cache thundering herd from repeated invalidation/recomputation cycles
- Server stalls requiring container restarts

The sequential approach ensures proper ordering and prevents these race
conditions.

---------

Co-authored-by: Rayan <rayan@example.com>
Co-authored-by: Charles Bochet <charles@twenty.com>
2026-03-27 08:13:51 +00:00
Charles BochetandGitHub 17424320e3 fix: gate command-menu-items query behind feature flag (#19029)
## Summary
- Gate the `FindManyCommandMenuItems` GraphQL query behind the
`IS_COMMAND_MENU_ITEM_ENABLED` feature flag on the frontend, preventing
an uncaught error when the flag is not enabled for a workspace
- Remove `IS_CONNECTED_ACCOUNT_MIGRATED` from the default feature flags
list
2026-03-27 08:11:26 +01:00
6360fb3bce chore: sync AI model catalog from models.dev (#19028)
Automated daily sync of `ai-providers.json` from
[models.dev](https://models.dev).

This PR updates pricing, context windows, and model availability based
on the latest data.
New models meeting inclusion criteria (tool calling, pricing data,
context limits) are added automatically.
Deprecated models are detected based on cost-efficiency within the same
model family.

**Please review before merging** — verify no critical models were
incorrectly deprecated.

Co-authored-by: FelixMalfait <6399865+FelixMalfait@users.noreply.github.com>
2026-03-27 07:22:18 +01:00
Baptiste DevessierandGitHub da1b1f1cbc Combine and clean upgrade commands for record page layouts (#19004)
- Remove the label identifier field for all standard objects as it's a
first-class citizen that is displayed specifically in the app; it
doesn't make a lot of sense to display it in the Fields widgets
- Disable logic that made the label identifier required and in first
position
- Add all fields for all standard objects in record page layout view
fields
- Do not include position and ts vector fields in custom objects

> [!IMPORTANT]
> The command will create Field widgets for all relations. It is
consistent to the way the frontend dynamically generates them as of
today. We will have to decide which relations we pin as individual Field
widgets before the release. (This will likely land in this command or in
another one.)
2026-03-26 17:50:29 +01:00
nitinandGitHub 31718d163c [Dashboards] fix rich text widget AGAIN (#19017) 2026-03-26 17:50:10 +01:00
Abdul RahmanandGitHub f47608de07 Clear navbar edit selection when closing the side panel (#18940)
In navbar edit mode, selecting an item for edit stored
selectedNavigationMenuItemIdInEditModeState (and related
pending-insertion state). Closing the side panel did not reset those
atoms, so the nav item stayed visually selected. Reset both when the
panel closes so the highlight matches the closed panel; reopening in
edit mode then starts from the generic “new item” entry unless the user
picks an item again.
2026-03-26 17:49:50 +01:00
Thomas des FrancsandGitHub 695518a15e Fix not shared chip height + hard coded border radius (#19020)
## Summary
- align the forbidden field "Not shared" chip with small chip dimensions
in the object table
- use the shared small border radius token instead of a hardcoded value
- add `overflow: hidden` and `user-select: none` to match chip behavior
more closely

## Testing
- Not run (not requested)
2026-03-26 17:48:20 +01:00
Thomas TrompetteandGitHub 34ab72c460 Fix: Cannot create two workflow agent nodes because these have the same name (#19015)
Currently, when trying to create a second step agent, we get the error
agent already exists because the name is using workflow id. Using step
id instead.
2026-03-26 16:00:15 +00:00
9eba54134d i18n - translations (#19019)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-26 16:50:18 +01:00
34832815e6 fix: update settings page for mobile viewport (#18991)
## Description

- This PR fixes
https://github.com/twentyhq/core-team-issues/issues/2313#issuecomment-4116380772
- Fixes Admin Panel Apps table, Data model table and Roles table
- made data model table scrollable for mobile viewport keeping name
column fixed.


## Visual Appearance

## Before

- Roles Table

<img width="636" height="1039" alt="Screenshot 2026-03-26 at 1 28 30 PM"
src="https://github.com/user-attachments/assets/fa7532bd-aeb0-4c8f-a40e-08cc976cd2c2"
/>



- Admin Apps table

<img width="610" height="998" alt="Screenshot 2026-03-26 at 1 28 12 PM"
src="https://github.com/user-attachments/assets/8712473c-350f-46f8-9e68-9cb0a5fa9d80"
/>





- Data Model table



https://github.com/user-attachments/assets/c48075c5-56dd-4b76-acd4-76330d6dab94






## After

- Roles Table

<img width="761" height="1045" alt="Screenshot 2026-03-26 at 1 23 19 PM"
src="https://github.com/user-attachments/assets/17099956-816a-4d41-b987-563f6931a995"
/>

- Admin Apps table

<img width="794" height="1044" alt="Screenshot 2026-03-26 at 1 23 34 PM"
src="https://github.com/user-attachments/assets/0463a087-2363-4192-9adb-7d27076f303a"
/>


- Data model Table


https://github.com/user-attachments/assets/fd44e353-cc7c-44cf-bda0-d2f3cd531f2e

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
2026-03-26 16:47:40 +01:00
Félix MalfaitandGitHub 7a341c6475 feat: support authType on AI providers for IAM role authentication (#19016)
## Summary
- Adds an `authType` field (`'api_key' | 'access_key' | 'iam_role'`) to
AI provider config
- Providers like Amazon Bedrock that authenticate via IAM role (instance
profile) can now be registered without explicit API keys or access keys
- Backend: `isProviderConfigured()` checks `apiKey || accessKeyId ||
authType`
- Frontend admin panel: shows green "Configured" badge and "IAM role"
description for providers with `authType: "iam_role"`
- Provider detail page shows "IAM role (instance profile)" in the
credentials row

## Companion PR
- twentyhq/twenty-infra#528 — patches `authType: "iam_role"` into
dev/staging Bedrock catalogs

## Changed files
- **Backend**: new `AiProviderAuthType` type, `isProviderConfigured`
util, updated registry + resolver
- **Frontend**: new `AiProviderAuthType` type, updated provider list
card + detail page

## Test plan
- [ ] Deploy with a Bedrock catalog that includes `"authType":
"iam_role"` — verify Bedrock shows "Configured" in admin AI panel
- [ ] Verify OpenAI/Anthropic with `apiKey` still show "Configured"
- [ ] Verify a provider with no credentials and no `authType` still
shows "No credentials"

Made with [Cursor](https://cursor.com)
2026-03-26 16:43:09 +01:00
1c297e5ace i18n - translations (#19018)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-26 16:41:17 +01:00
MarieandGitHub c3a3cf9c67 [Apps SDK] Add error message if relationType is missing (#19006)
Before
<img width="2138" height="1434" alt="image"
src="https://github.com/user-attachments/assets/23aa04ae-9994-4ff9-bac8-9f245e6ca05f"
/>


After
<img width="1029" height="610" alt="image"
src="https://github.com/user-attachments/assets/7af48bc0-678d-4451-8cfb-a5e4028f2c2d"
/>
2026-03-26 15:25:12 +00:00
Lucas BordeauandGitHub 8ef99671e2 Fix board drag and drop issues (#19005)
This PR solves multiple problems : 
- An infinite loop that was happening on board with initial and fetch
more queries
- Warning messages that get triggered when we drag and drop multiple
times in a row
- An attempt to fix an existing error in Sentry, that couldn't be
reproduced for now.
2026-03-26 15:06:20 +00:00
Lucas BordeauandGitHub e63a23ea00 Fix create new with filters (#18969)
Fixes https://github.com/twentyhq/twenty/issues/18949

## Problem
- Creating a record from filters with DATE_TIME fields produced empty
objects instead of dates — `isPlainObject` from `twenty-shared` treats
`Date` instances as plain objects, so `mergeCompositeValues` spread them
into `{}`
- `buildRecordInputFromFilter` applied composite merge logic to all
field types indiscriminately, including primitives, dates, and strings
- DATE_TIME "is before" filters produced exact boundary values instead
of subtracting a minute

## Fix
- Composite and non-composite fields are now handled in separate
branches — `buildRecordInputFromFilter` uses `isCompositeFieldType` to
decide whether to merge or assign directly
- `mergeCompositeValues` extracted to its own file with a properly typed
signature (`Record<string, unknown>`) — no more runtime type guessing
- DATE_TIME fields with `IS_BEFORE` operand subtract one minute using
`subMinutes` from `date-fns`
- 13 unit tests for `mergeCompositeValues` covering all composite field
types (currency, address, full name, links, emails, phones) and
successive sub-field accumulation
2026-03-26 15:05:35 +00:00
39b9ae6a76 i18n - translations (#19014)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-26 16:11:40 +01:00
afeef8e04a feat: add command menu item to layout customization (#18764)
figma
https://www.figma.com/design/xt8O9mFeLl46C5InWwoMrN/Twenty?node-id=93630-365000&t=QesAkY3JOyI9D3UU-0


https://github.com/user-attachments/assets/cf3b354d-0b08-41ae-91ae-386054b5cb2e



https://github.com/user-attachments/assets/73bfd676-f823-44c9-a70d-107c20523664

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
2026-03-26 16:04:03 +01:00
Paul RastoinandGitHub c7f6036a47 [SDK] twenty-ui/display selective re-export to avoid bloating icons (#19010)
<img width="1946" height="792" alt="image"
src="https://github.com/user-attachments/assets/d0abf62b-85d4-4f5f-b6dc-f2cc1c691f7e"
/>

Avoid re-exporting twenty-ui icons bundle that are massive ~4MB
As discussed with @charlesBochet the problem should rather be treated at
twenty-ui level at some point, that's quite a quick workaround in order
to avoid overloading the twenty-sdk build size

When time comes, where twenty-ui is mature enough to get published we
will work on its bundle size
2026-03-26 14:53:11 +00:00
EtienneandGitHub ec5ab2b84a Fix format result (#18975)
For a field that is not a relation and not a composite, there is no
legitimate reason to recurse into a plain object value.

The only cases where recursion makes sense are:
- Relations, the value is a nested entity record (handled at line 149)
- Composite fields - the value is being reassembled from flat columns
(handled at line 176+)

For everything else, a plain object value is just data


#### Perf testing

Compare findManyCompanies with a jsonField having same 20-level nested
value (cf quote)
- with fix
Average ≈ 75.77 ms - min 52.43 ms - max 114.99 ms.

- without
Average: ≈ 376.62 ms - Min: 194.19 ms - Max: 1183.65 ms (39 requests)

```
{
  "document": {
    "id": "doc-nested-20",
    "title": "20-level nested sample",
    "tags": ["sample", "nested", "json", "fixture", "demo"],
    "counts": [100, 200, 300, 400, 500],
    "extras": {
      "a": true,
      "b": false,
      "c": null,
      "d": 3.14159,
      "e": "unicode-测试-αβγ"
    }
  },
  "users": [
    { "id": 1, "name": "Alice", "roles": ["admin", "editor"] },
    { "id": 2, "name": "Bob", "roles": ["viewer"] },
    { "id": 3, "name": "Carol", "roles": ["editor", "viewer"] }
  ],
  "matrix": [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
  "settings": {
    "theme": "dark",
    "notifications": { "email": true, "push": false, "sms": false },
    "locale": "en-US"
  },
  "deep": {
    "level01": {
      "level02": {
        "level03": {
          "level04": {
            "level05": {
              "level06": {
                "level07": {
                  "level08": {
                    "level09": {
                      "level10": {
                        "level11": {
                          "level12": {
                            "level13": {
                              "level14": {
                                "level15": {
                                  "level16": {
                                    "level17": {
                                      "level18": {
                                        "level19": {
                                          "level20": {
                                            "leaf": true,
                                            "summary": "deepest object in this branch",
                                            "indices": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
                                            "meta": {
                                              "maxDepth": 20,
                                              "note": "Count deep.level01..level20 as 20 nested objects"
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "footer": {
    "checksum": "example-only-not-real",
    "generated": "2025-03-25"
  }
}
```
2026-03-26 14:40:36 +00:00
nitinandGitHub b171a23216 [AI] replace custom styles with MenuItem and SidePanelGroup in AI agent persmissions tab (#19003)
closes
https://discord.com/channels/1130383047699738754/1486666682553598032
2026-03-26 14:33:07 +00:00
f771b13a20 i18n - translations (#19011)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-26 15:35:49 +01:00
nitinandGitHub 92635b960b [AI] Navigation panel scroll refactor + Non chat placeholder (#18999)
<img width="374" height="1319" alt="CleanShot 2026-03-26 at 16 19 34"
src="https://github.com/user-attachments/assets/bebc7f67-3e9d-47c2-8e13-b57dab83d923"
/>

<img width="438" height="1320" alt="CleanShot 2026-03-26 at 16 19 20"
src="https://github.com/user-attachments/assets/e48ae2d2-066e-402f-a04b-aba7bae776bb"
/>


https://github.com/user-attachments/assets/64a8ad9b-0030-414c-a67d-3817ac3dd6b0
2026-03-26 14:20:48 +00:00
Thomas TrompetteandGitHub 2e015ee68d Add missing row lvl permission check on Kanban view (#19002)
The Kanban view builds a query in two layers:
- Inner query — selects actual records from the table (has all the
permission context)
- Outer query — wraps the inner query's raw SQL string to do
grouping/pagination
The problem: the inner query's SQL is copied out as a plain string
before RLS predicates are added to it. RLS predicates are normally added
lazily when you execute the query, but here the execution happens on the
outer query — which doesn't know about the entity or its RLS rules.

So RLS predicates are never applied anywhere.

The fix: explicitly apply RLS predicates to the inner query before its
SQL is extracted.

Additonnaly, fixed a temporal issue in Datetime pickers.
2026-03-26 14:20:05 +00:00
neo773andGitHub 82611de9b6 connected accounts follow up (#18998)
- Fixed group emails actions
- Fixed delta updates for folder manager
- Updated crons
2026-03-26 13:14:49 +00:00
36c7c99e34 fix: hide objects with no addable views in sidebar view picker (#18993)
Co-authored-by: Charles Bochet <charles@twenty.com>
2026-03-26 13:13:49 +00:00
Paul RastoinandGitHub 160a80cbcb Bump prelease version sdk, sdk-client, create-twenty-app (#19000) 2026-03-26 13:20:08 +01:00
Paul RastoinandGitHub 052aecccc7 Refactor dependency graph for SDK, client-sdk and create-app (#18963)
## Summary

### Externalize `twenty-client-sdk` from `twenty-sdk`

Previously, `twenty-client-sdk` was listed as a `devDependency` of
`twenty-sdk`, which caused Vite to bundle it inline into the dist
output. This meant end-user apps had two copies of `twenty-client-sdk`:
one hidden inside `twenty-sdk`'s bundle, and one installed explicitly in
their `node_modules`. These copies could drift apart since they weren't
guaranteed to be the same version.

**Change:** Moved `twenty-client-sdk` from `devDependencies` to
`dependencies` in `twenty-sdk/package.json`. Vite's `external` function
now recognizes it and keeps it as an external `require`/`import` in the
dist output. End users get a single deduplicated copy resolved by their
package manager.

### Externalize `twenty-sdk` from `create-twenty-app`

Similarly, `create-twenty-app` had `twenty-sdk` as a `devDependency`
(bundled inline). After refactoring `create-twenty-app` to
programmatically import operations from `twenty-sdk` (instead of
shelling out via `execSync`), it became a proper runtime dependency.

**Change:** Moved `twenty-sdk` from `devDependencies` to `dependencies`
in `create-twenty-app/package.json`.

### Switch E2E CI to `yarn npm publish`

The `workspace:*` protocol in `dependencies` is a Yarn-specific feature.
`npm publish` publishes it as-is (which breaks for consumers), while
`yarn npm publish` automatically replaces `workspace:*` with the
resolved version at publish time (e.g., `workspace:*` becomes `=1.2.3`).

**Change:** Replaced `npm publish` with `yarn npm publish` in
`.github/workflows/ci-create-app-e2e.yaml`.

### Replace `execSync` with programmatic SDK calls in
`create-twenty-app`

`create-twenty-app` was shelling out to `yarn twenty remote add` and
`yarn twenty server start` via `execSync`, which assumed the `twenty`
binary was already installed in the scaffolded app. This was fragile and
created an implicit circular dependency.

**Changes:**
- Replaced `execSync('yarn twenty remote add ...')` with a direct call
to `authLoginOAuth()` from `twenty-sdk/cli`
- Replaced `execSync('yarn twenty server start')` with a direct call to
`serverStart()` from `twenty-sdk/cli`
- Deleted the duplicated `setup-local-instance.ts` from
`create-twenty-app`

### Centralize `serverStart` as a dedicated operation

The Docker server start logic was previously inline in the `server
start` CLI command handler (`server.ts`), and `setup-local-instance.ts`
was shelling out to `yarn twenty server start` to invoke it -- meaning
`twenty-sdk` was calling itself via a child process.

**Changes:**
- Extracted the Docker container management logic into a new
`serverStart` operation (`cli/operations/server-start.ts`)
- Merged the detect-or-start flow from `setup-local-instance.ts` into
`serverStart` (detect across multiple ports, start Docker if needed,
poll for health)
- Deleted `setup-local-instance.ts` from `twenty-sdk`
- Added `onProgress` callback (consistent with other operations like
`appBuild`) instead of direct `console.log` calls
- Both the `server start` CLI command and `create-twenty-app` now call
`serverStart()` programmatically

related to https://github.com/twentyhq/twenty-infra/pull/525
2026-03-26 10:56:52 +00:00
Abdul RahmanandGitHub b651a74b1f fix: hide "Move to folder" when no destination folder is available (#18992) 2026-03-26 10:41:00 +00:00
nitinandGitHub 29979f535d [Ai] fix overflow on new chat button (#18996)
before - 

<img width="368" height="220" alt="CleanShot 2026-03-26 at 15 38 38"
src="https://github.com/user-attachments/assets/c3a87ffd-bd84-408e-b2fb-fd4ce3ce8d61"
/>


after - 

<img width="418" height="274" alt="CleanShot 2026-03-26 at 15 37 59"
src="https://github.com/user-attachments/assets/04d462c4-3cbc-4f9f-9ed5-8b90ae1f112c"
/>
2026-03-26 10:35:33 +00:00
nitinandGitHub b1e449d764 fix dashboard widget edit mode content (#18965) 2026-03-26 10:18:23 +00:00
Félix MalfaitandGitHub c28e637ea7 fix: prevent empty array id.in filter in single record picker (#18995)
## Summary

- Fixes intermittent `INVALID_QUERY_INPUT` errors (152 occurrences / 2
users in Sentry) caused by the single record picker sending `{ id: { in:
[] } }` to the Search query when no records are selected
- The `skip` guard is logically correct but Apollo Client v4 can briefly
fire queries during React 18 render transitions before processing the
skip flag
- Makes `selectedIdsFilter` conditional on `hasSelectedIds`, so
variables contain a safe empty filter `{}` regardless of skip behavior —
matching the existing defensive pattern used by the third query's
`notFilter`

## Test plan

- [ ] Open a relation field picker (e.g., Person on an Opportunity) with
no existing value — search should load without errors
- [ ] Open a relation field picker with an existing value — selected
record should appear and search should work
- [ ] Clear a selected relation and reopen the picker — no console
errors


Made with [Cursor](https://cursor.com)
2026-03-26 10:17:59 +00:00
b732b2efd4 i18n - translations (#18997)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-26 11:12:19 +01:00
3c5796bdb0 fix: handle dashboard filters referencing deleted fields (#18512)
closes https://github.com/twentyhq/twenty/issues/18174

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
2026-03-26 09:55:28 +00:00
Baptiste DevessierandGitHub cfefe9273b Use record page layouts in the merge records feature (#18961)
There was a design issue. It revealed that we weren't using record page
layouts in the merge records feature.

## Before

<img width="802" height="1283" alt="image"
src="https://github.com/user-attachments/assets/e4238144-e10e-47a6-83e6-7cc03ca89b15"
/>

## After


https://github.com/user-attachments/assets/c0fa9cf5-2b28-4696-bf20-8271dce9e62c
2026-03-26 09:54:33 +00:00
Félix MalfaitandGitHub d126d54bbc feat: make workflow objects searchable (#18906)
## Summary
- Adds `isSearchable: true` to the workflow standard object definition
so new workspaces get searchable workflows automatically
- Adds a `upgrade:1-20:make-workflow-searchable` migration command that
flips the `isSearchable` flag on the `objectMetadata` row for existing
workspaces, with proper cache invalidation and metadata version
increment
- Registers the command in the 1-20 upgrade module and the
`upgrade.command.ts` orchestrator

The `searchVector` stored generated column already exists on the
workflow table, so no data backfill is needed — this is purely a
metadata flag change that makes the search service include workflows in
results.

## Test plan
- [x] `--dry-run` logs what it would do without making changes
- [x] Actual run updates both workspaces and invalidates caches
- [x] Idempotent: re-running skips already-searchable workspaces
- [x] Typecheck passes
- [x] Lint passes on changed files


Made with [Cursor](https://cursor.com)
2026-03-26 07:53:11 +00:00
5041b3e14b i18n - translations (#18990)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-26 08:41:15 +01:00
BugIsGodandGitHub 1e2b31b040 fix: prevent saving API key with empty name (#18970)
Fixes: #18959 
Generally, users need to type name before they create the api key.


https://github.com/user-attachments/assets/bb3ec0ec-d05f-48a8-b762-a35288a9e111

<img width="656" height="559" alt="image"
src="https://github.com/user-attachments/assets/cb8fd461-98f0-4475-b3f0-0de1e62624e2"
/>
2026-03-26 07:25:57 +00:00
340a01567a i18n - translations (#18988)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-26 07:18:15 +01:00
nitinandGitHub 4985270e69 [AI] Refactor settings search to use SearchInput and restructure Skills tab (#18876)
closes -
https://discord.com/channels/1130383047699738754/1480980523315626178
2026-03-26 05:57:41 +00:00
b87762b1c2 i18n - translations (#18987)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-26 07:02:45 +01:00
578d990b9c [AI] Match ai chat composer to figma (#18874)
https://www.figma.com/design/xt8O9mFeLl46C5InWwoMrN/Twenty?node-id=93653-368288&t=obTG32NRidXid4lN-0

closes
https://discord.com/channels/1130383047699738754/1480990726442582086

---------

Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
Co-authored-by: Félix Malfait <felix@twenty.com>
2026-03-26 05:43:54 +00:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
dfe9cb4346 chore(deps): bump @microsoft/microsoft-graph-types from 2.40.0 to 2.43.1 (#18985)
Bumps
[@microsoft/microsoft-graph-types](https://github.com/microsoftgraph/msgraph-typescript-typings)
from 2.40.0 to 2.43.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/microsoftgraph/msgraph-typescript-typings/releases"><code>@​microsoft/microsoft-graph-types</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v2.43.1</h2>
<h2><a
href="https://github.com/microsoftgraph/msgraph-typescript-typings/compare/v2.43.0...v2.43.1">2.43.1</a>
(2025-09-30)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>moves pipeline to governed template. (<a
href="https://github.com/microsoftgraph/msgraph-typescript-typings/commit/9af5685c46beb20119409b6484fc7bd4e78e719b">9af5685</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/microsoftgraph/msgraph-typescript-typings/blob/main/CHANGELOG.md"><code>@​microsoft/microsoft-graph-types</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/microsoftgraph/msgraph-typescript-typings/compare/v2.43.0...v2.43.1">2.43.1</a>
(2025-09-30)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>moves pipeline to governed template. (<a
href="https://github.com/microsoftgraph/msgraph-typescript-typings/commit/9af5685c46beb20119409b6484fc7bd4e78e719b">9af5685</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/microsoftgraph/msgraph-typescript-typings/commits/v2.43.1">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~microsoft1es">microsoft1es</a>, a new
releaser for <code>@​microsoft/microsoft-graph-types</code> since your
current version.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@microsoft/microsoft-graph-types&package-manager=npm_and_yarn&previous-version=2.40.0&new-version=2.43.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-26 06:44:38 +01:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
91374262f2 chore(deps): bump @ai-sdk/xai from 3.0.59 to 3.0.74 (#18986)
Bumps [@ai-sdk/xai](https://github.com/vercel/ai) from 3.0.59 to 3.0.74.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/vercel/ai/commit/d0a7e0e2a0964ce2c8490995f69779627c722210"><code>d0a7e0e</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/13772">#13772</a>)</li>
<li><a
href="https://github.com/vercel/ai/commit/3caa5443f0fce84b48b752c07789b28de54f326a"><code>3caa544</code></a>
Backport: fix(xai): update model list - add GA models, remove beta
variants (...</li>
<li><a
href="https://github.com/vercel/ai/commit/c77352dd7ddae6353d5d7d265d6ff4683260ba60"><code>c77352d</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/13765">#13765</a>)</li>
<li><a
href="https://github.com/vercel/ai/commit/2e5adffb292de7c44b8bcf7c923cb9c08884549c"><code>2e5adff</code></a>
Backport: chore(provider/google): remove obsolete Google image model (<a
href="https://redirect.github.com/vercel/ai/issues/13759">#13759</a>)</li>
<li><a
href="https://github.com/vercel/ai/commit/a141a1e7b85a5d09f3ae11aad7828354c6fd2674"><code>a141a1e</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/13762">#13762</a>)</li>
<li><a
href="https://github.com/vercel/ai/commit/9c548debc505551b046cc0cd7b50c4b22538981d"><code>9c548de</code></a>
Backport: feat(openai): add additional GPT-5.4 models (<a
href="https://redirect.github.com/vercel/ai/issues/13755">#13755</a>)</li>
<li><a
href="https://github.com/vercel/ai/commit/bcb04df1e51e307aff84a953f09fa326724819b0"><code>bcb04df</code></a>
Backport: feat: add support for response.failed event type with finish
reason...</li>
<li><a
href="https://github.com/vercel/ai/commit/7f197797b9ee817baf8b59689df6bb4e3340c734"><code>7f19779</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/13740">#13740</a>)</li>
<li><a
href="https://github.com/vercel/ai/commit/763e17854f99dd49a9ff095d4dcfada0a840056e"><code>763e178</code></a>
Backport: chore(provider/gateway): update gateway model settings files
v6 (<a
href="https://redirect.github.com/vercel/ai/issues/1">#1</a>...</li>
<li><a
href="https://github.com/vercel/ai/commit/be357d5ef5e5754d2923a41f8e7b8def3436ac1b"><code>be357d5</code></a>
Version Packages (<a
href="https://redirect.github.com/vercel/ai/issues/13734">#13734</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/vercel/ai/compare/@ai-sdk/xai@3.0.59...@ai-sdk/xai@3.0.74">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@ai-sdk/xai&package-manager=npm_and_yarn&previous-version=3.0.59&new-version=3.0.74)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-26 06:44:27 +01:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
7335d352a9 chore(deps): bump @linaria/core from 6.2.0 to 6.3.0 (#18984)
Bumps [@linaria/core](https://github.com/callstack/linaria) from 6.2.0
to 6.3.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/callstack/linaria/releases"><code>@​linaria/core</code>'s
releases</a>.</em></p>
<blockquote>
<h2><code>@​linaria/core</code><a
href="https://github.com/6"><code>@​6</code></a>.3.0</h2>
<h3>Minor Changes</h3>
<ul>
<li>281ca4f5: The new version of wyw-in-js, with the support of a
configurable code remover, can help prevent compilation errors and
improve build time.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/callstack/linaria/commit/759acaf4dd611a97a2bdf612d6ff9d426885c10f"><code>759acaf</code></a>
Version Packages (<a
href="https://redirect.github.com/callstack/linaria/issues/1442">#1442</a>)</li>
<li><a
href="https://github.com/callstack/linaria/commit/281ca4f525a6e9a02e86bad29031a7215dac24a1"><code>281ca4f</code></a>
fix: bump wyw to 6.0.0 (<a
href="https://redirect.github.com/callstack/linaria/issues/1443">#1443</a>)</li>
<li><a
href="https://github.com/callstack/linaria/commit/bd8d45fd9408aad3cd863ff0f521c784707ba9f2"><code>bd8d45f</code></a>
fix: use <code>React.JSX</code> instead of <code>JSX</code> for React 19
support (<a
href="https://redirect.github.com/callstack/linaria/issues/1420">#1420</a>)</li>
<li><a
href="https://github.com/callstack/linaria/commit/3790746c6e91ce3fc069f5018865002d3df6b2f8"><code>3790746</code></a>
chore: remove node 16 and add 22</li>
<li><a
href="https://github.com/callstack/linaria/commit/a8702d9178aba16c796259a6b83b05282442ac0c"><code>a8702d9</code></a>
chore: fix pnpm version on CI</li>
<li><a
href="https://github.com/callstack/linaria/commit/74942f7ccfd7f04d4c6ac29dc4afc08906739452"><code>74942f7</code></a>
chore: update pnpm (<a
href="https://redirect.github.com/callstack/linaria/issues/1441">#1441</a>)</li>
<li><a
href="https://github.com/callstack/linaria/commit/35f42a14a3446165246f7ad0e75f57b0a047ab55"><code>35f42a1</code></a>
chore(deps-dev): bump rollup from 3.28.0 to 3.29.5 (<a
href="https://redirect.github.com/callstack/linaria/issues/1426">#1426</a>)</li>
<li><a
href="https://github.com/callstack/linaria/commit/8be3ac8e76701997a1d3a3d21f017c8316932e0f"><code>8be3ac8</code></a>
chore(deps): bump express from 4.19.2 to 4.20.0 (<a
href="https://redirect.github.com/callstack/linaria/issues/1425">#1425</a>)</li>
<li><a
href="https://github.com/callstack/linaria/commit/52ba8fdaeb3a94644d2b13f23f562965c278479c"><code>52ba8fd</code></a>
chore(deps-dev): bump vite from 3.2.7 to 3.2.11 (<a
href="https://redirect.github.com/callstack/linaria/issues/1424">#1424</a>)</li>
<li><a
href="https://github.com/callstack/linaria/commit/a6714914ed34faa89184595caef6c666417bc219"><code>a671491</code></a>
chore(deps-dev): bump webpack from 5.76.0 to 5.94.0 (<a
href="https://redirect.github.com/callstack/linaria/issues/1422">#1422</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/callstack/linaria/compare/@linaria/core@6.2.0...@linaria/core@6.3.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@linaria/core&package-manager=npm_and_yarn&previous-version=6.2.0&new-version=6.3.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-26 06:44:08 +01:00
bfdbc93b1c i18n - docs translations (#18982)
Created by Github action

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-25 21:27:47 +01:00
3abef48663 i18n - docs translations (#18981)
Created by Github action

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-25 19:35:35 +01:00
Lucas BordeauandGitHub 441a9464d1 Fixed board no value column not fetching more (#18977)
Fixes https://github.com/twentyhq/twenty/issues/18148

## Problem
- Scrolling down in the "no value" kanban column never loads additional
records when it's the only column that needs pagination
- `useTriggerRecordBoardFetchMore` — `.filter(isDefined)` removes `null`
from the list of group values to fetch, and `null` is the value used by
"no value" columns, causing early exit
- `useTriggerRecordBoardFetchMore` — the inline `{ in: [...values] }`
filter cannot express a NULL match, so even without the early exit the
query would be wrong

## Fix
- "No value" column now triggers pagination correctly —
`useTriggerRecordBoardFetchMore` (removed `.filter(isDefined)` so `null`
values pass through)
- Query filter correctly matches NULL field values —
`useTriggerRecordBoardFetchMore` (replaced inline `{ in: [...] }` with
`computeRecordGroupOptionsFilter` which generates `{ is: 'NULL' }` for
null values and `{ in: [...] }` for non-null values)
2026-03-25 17:41:37 +00:00
Charles BochetandGitHub 72dd3af155 fix SVG icon sizing broken in Chrome 142 (#18974)
## Summary
- Chrome 142 rejects `var()` references in SVG `width`/`height`
attributes, causing icons to fall back to `100%` size
- Replaced `themeCssVariables.icon.size.*` /
`themeCssVariables.icon.stroke.*` (raw `var()` strings) with resolved
`theme.icon.size.*` / `theme.icon.stroke.*` (numeric values from
`ThemeContext`) when passed as icon component props
- Affects 3 navigation menu item components: `NavigationMenuItemFolder`,
`NavigationMenuItemLinkDisplay`, `LinkIconWithLinkOverlay`

## Test plan
- [ ] Verify navigation drawer folder chevron icons render at correct
size
- [ ] Verify navigation drawer link arrow icons render at correct size
- [ ] Verify link overlay icons render at correct size
- [ ] Test in Chrome 142+ to confirm the fix
- [ ] Test in Firefox/Safari to confirm no regression
2026-03-25 17:37:16 +00:00
Thomas TrompetteandGitHub 6c1db2e7fb Do not run loop when iterator is skipped (#18964)
When an If/Else branch skips an Iterator step (because the branch wasn't
taken), the executor incorrectly entered the iterator's loop body. This
happened because getNextStepIdsToExecute checked !hasProcessedAllItems
on an undefined result, which evaluated to true, causing it to return
initialLoopStepIds instead of the post-loop nextStepIds.

Fix: Add a !executedStepOutput.shouldSkipStepExecution guard to the
iterator condition in getNextStepIdsToExecute, consistent with the
existing shouldFailSafely guard.
2026-03-25 17:35:58 +00:00
Thomas TrompetteandGitHub 511d1bd7ab Fix SSE event stream errors when impersonating users with limited permissions (#18966)
Clear the SSE client before swapping auth tokens during impersonation,
preventing a userWorkspaceId mismatch between the existing event stream
(created under the admin's identity) and the new impersonation token.
Treat NOT_AUTHORIZED event stream errors as recoverable (destroy +
recreate), matching the existing behavior for
EVENT_STREAM_DOES_NOT_EXIST and EVENT_STREAM_ALREADY_EXISTS.
2026-03-25 17:35:54 +00:00
Thomas TrompetteandGitHub d47ddad4c5 Add multiselect option to form step (#18979)
<img width="415" height="462" alt="Capture d’écran 2026-03-25 à 18 10
06"
src="https://github.com/user-attachments/assets/e5157636-25ea-41b9-ae13-8f64a24cbd5e"
/>
<img width="415" height="462" alt="Capture d’écran 2026-03-25 à 18 10
12"
src="https://github.com/user-attachments/assets/5811848f-1ce6-4c09-9563-61f906968888"
/>
2026-03-25 17:35:50 +00:00
33a474c8e6 Add record table widget feature flag (#18960)
Introduce a new feature flag for the record table widget, enabling
conditional rendering and state management based on its status. Update
related components and tests accordingly.

---------

Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
2026-03-25 16:47:20 +00:00
cc247c2e8e Fix record page layout upgrade commands (#18962)
- Fix issue with name that must be first in the view field list
- Improve dry run and logs of backfill page layouts command

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: prastoin <paul@twenty.com>
2026-03-25 16:43:54 +00:00
4d6c8db205 i18n - docs translations (#18976)
Created by Github action

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-25 17:42:31 +01:00
Charles BochetandGitHub a8dad6c882 Fix: default to allow-read when object permissions are not yet loaded (#18971)
## Summary

Fixes the merge-queue E2E failures that started after #18912 landed.

`filterReadableActiveObjectMetadataItems` (introduced in #18912) treats
a **missing** entry in the permissions map as "deny read". The previous
helper (`getObjectPermissionsFromMapByObjectMetadataId`) treated it as
**"allow read"** via a `?? { canReadObjectRecords: true, … }` fallback.

Because the permissions map is empty on initial render (before the API
round-trip completes), **every object was temporarily filtered out**.
This made `useDefaultHomePagePath` return the settings-profile path,
triggering a redirect race that broke Settings navigation in three E2E
tests:

- `signup_invite_email.spec.ts` — timed out waiting for
`getByRole('link', { name: 'Members' })`
- `create-kanban-view.spec.ts` — timed out waiting for
`getByRole('link', { name: 'Data model' })`
- `workflow-creation.spec.ts` — timed out waiting for sidebar Workflows
button

**Evidence from CI:**
- Last passing merge-queue run: base `13ea3ec75c` (before #18912)
- First failing merge-queue run: base `5f0d6553f6` (#18912)
- All individual PR CI runs continued to pass (they don't rebase on
latest main)
- Screenshot artifact shows the app stuck on the main page — the
Settings drawer never opened

## Fix

When an object has no entry in the permissions map, default to allowing
read (matching the old behavior). An empty map means permissions haven't
loaded yet, not that the user lacks access.

```diff
  objectMetadataItems.filter((objectMetadataItem) => {
+   if (!objectMetadataItem.isActive) {
+     return false;
+   }
+
    const objectPermissions =
      objectPermissionsByObjectMetadataId[objectMetadataItem.id];
-
-   return (
-     isDefined(objectPermissions) &&
-     objectPermissions.canReadObjectRecords &&
-     objectMetadataItem.isActive
-   );
+
+   if (!isDefined(objectPermissions)) {
+     return true;
+   }
+
+   return objectPermissions.canReadObjectRecords;
  });
```
2026-03-25 17:41:15 +01:00
Félix MalfaitandGitHub 895bb58fc6 feat: add S3 presigned URL redirect for file downloads (#18864)
## Summary

- When `STORAGE_S3_PRESIGNED_URL_BASE` is configured, the file
controller returns a **302 redirect** to a presigned S3 URL instead of
proxying every byte through the server. This eliminates server bandwidth
and CPU overhead for S3-backed deployments.
- For local storage or S3 without a public endpoint, behavior is
unchanged (stream + pipe with security headers).
- Added `getPresignedUrl` to the `StorageDriver` interface (required
method returning `string | null`), with implementations in S3Driver
(uses a separate presign client with the public endpoint), LocalDriver
(returns `null`), and ValidatedStorageDriver (path traversal protection
+ delegation).
- Added a unified `getFileResponseById` method in `FileService` that
performs a single DB lookup and returns either a redirect URL or a
stream, avoiding double lookups.
- Extracted `getContentDisposition` from the header util so both the
proxy path and presigned URL path share the same inline/attachment
allowlist.
- Added MinIO service to `docker-compose.dev.yml` (optional `s3`
profile) for local S3 testing.
- Documented S3 presigned URL setup, CORS, and `nosniff` requirements in
the self-hosting docs.

## Test plan

- [x] All 63 unit tests pass across 5 test suites (util, S3 driver,
validated driver, file storage service, controller)
- [x] `npx nx typecheck twenty-server` passes
- [ ] Manual E2E test with MinIO: `docker compose --profile s3 up -d`,
configure S3 env vars, verify `curl -I` returns 302 with `Location`
header pointing to MinIO
- [ ] Verify local storage (no `STORAGE_S3_PRESIGNED_URL_BASE`) still
streams files with 200 + security headers
- [ ] Verify public assets endpoint still proxies (no redirect)


Made with [Cursor](https://cursor.com)
2026-03-25 16:15:15 +01:00
4fbe0a92ae i18n - translations (#18967)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-25 16:09:33 +01:00
Félix MalfaitandGitHub 5f0d6553f6 Add object type filter dropdown to side panel record searches (#18912)
## Summary

- Adds an object type filter dropdown to the side panel, allowing users
to scope record search results to a specific object type (e.g. People,
Companies, Opportunities)
- The filter appears as a funnel icon next to the search input in both
the global search (SearchRecords page) and the "Pick a record" sidebar
flow
- Replaces the AI sparkles button on the search records page with the
filter icon
- Uses colored icons matching the navigation menu style
(NavigationMenuItemStyleIcon + getStandardObjectIconColor)

## Test plan

- [ ] Open the side panel, type something to enter SearchRecords mode,
verify the filter icon appears
- [ ] Click the filter icon, verify the dropdown opens with "Object"
header, search input, "All Objects" and individual object types with
colored icons
- [ ] Select an object type, verify only records of that type appear in
search results
- [ ] Select "All Objects", verify all record types appear again
- [ ] Verify the filter icon turns blue when a filter is active
- [ ] In layout customization mode, add a new sidebar item > Record,
verify the filter dropdown also works there
- [ ] Close and reopen the side panel, verify the filter resets to "All
Objects"
- [ ] Verify the AI sparkles button no longer appears on the command
menu root page
- [ ] Verify the AI edit icon still appears on Ask AI pages


Made with [Cursor](https://cursor.com)
2026-03-25 16:02:24 +01:00
Charles BochetandGitHub 13ea3ec75c Split command menu items backfill into separate migration runs per application (#18957)
## Summary

- The 1-20 backfill command menu items upgrade command was mixing
standard and custom application flat entities into a single
`validateBuildAndRunWorkspaceMigration` call. Since each migration run
is tied to a single application, this split the backfill into two
separate runs: standard items under `twentyStandardFlatApplication` and
workflow trigger items under `workspaceCustomFlatApplication`.
2026-03-25 13:37:58 +00:00
e25ea6069d i18n - translations (#18958)
Created by Github action

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-25 14:31:01 +01:00
f7ef41959b i18n - translations (#18956)
Created by Github action

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-25 14:23:30 +01:00
ba0108944f i18n - translations (#18955)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-25 14:11:05 +01:00
Félix MalfaitandGitHub 03c94727be fix: wrap standard object/field metadata labels in msg for i18n extraction (#18951)
## Summary

- Standard object and field metadata labels were plain strings instead
of being wrapped in Lingui `msg` template literals, which prevented
extraction into translation catalogs. This caused "Uncompiled message
detected!" warnings at runtime.
- The bug was introduced when the decorator-based approach
(`@WorkspaceEntity({ labelSingular: msg`...` })`) was replaced by flat
metadata builder utils with plain strings.
- Adds an `i18nLabel` helper to safely extract the message string from
`MessageDescriptor` objects.
- Re-runs `lingui extract` and `lingui compile` to update all locale PO
files and compiled catalogs.
- Adds an integration test that queries the metadata API with `x-locale`
headers to verify locale-aware label resolution.
- Includes a ClickHouse usage event writer integration test (small
unrelated fix noticed along the way).

## Test plan

- [ ] CI lint passes (prettier + oxlint)
- [ ] CI typecheck passes
- [ ] Server unit tests pass
- [ ] Integration tests pass (including new `object-metadata-i18n` test)
- [ ] No "Uncompiled message detected!" warnings for standard
object/field labels at runtime


Made with [Cursor](https://cursor.com)
2026-03-25 14:03:51 +01:00
MarieandGitHub bf22373315 Fix: use user role for OAuth tokens bearing user context (#18954)
see [discord
discussion](https://discord.com/channels/1130383047699738754/1486299347091198054/1486299351520383116)

## Summary

When an OAuth application token carries both `applicationId` and
`userId`/`userWorkspaceId`, the auth context now uses the **user's
role** for permissions instead of the application's `defaultRoleId`.

This fixes the case where external clients authenticating via OAuth
(e.g. a client's external AI chat) were getting the app's permissions
instead of the authenticated user's.

### What changed

- **`jwt.auth.strategy.ts`** (`validateApplicationToken`): when an
application token includes user info, also resolve `workspaceMemberId`
and `workspaceMember` from the workspace cache (same pattern as
`validateAccessToken`)
- **`workspace-auth-context.middleware.ts`** (`buildAuthContext`): when
both `application` and `user` (with
`workspaceMemberId`/`workspaceMember`) are present on the request, build
a `UserWorkspaceAuthContext` instead of
`ApplicationWorkspaceAuthContext`. Falls back to application context if
workspace member cannot be resolved.

### Places impacted by this change (no code changes, behavior changes)

These places check `isApplicationAuthContext` or resolve roles from auth
context. Since hybrid tokens (OAuth with user) now produce a
`UserWorkspaceAuthContext`, they naturally flow into the
`isUserAuthContext` branches:

| File | Impact |
|------|--------|
| `permissions.service.ts` —
`resolveRolePermissionConfigFromAuthContext` | OAuth+user now uses
user's role via `isUserAuthContext` branch instead of
`application.defaultRoleId` |
| `common-api-context-builder.service.ts` — `getObjectsPermissions` |
Same — OAuth+user falls into `isUserAuthContext` branch |
| `common-base-query-runner.service.ts` — `getRoleIdOrThrow` | Same —
OAuth+user falls into `isUserAuthContext` branch |
| `actor-from-auth-context.service.ts` — `buildActorMetadata` | Records
created via OAuth+user will show the **user's name** as actor instead of
the application's name |
| `message-find-one.post-query.hook.ts` | OAuth+user now passes the
`isUserAuthContext` check (previously would fail unless it was the
Twenty standard application) |
| `front-component.resolver.ts` | Front component tokens include
`userId` — they will now correctly use the user's role, fixing a
pre-existing permission escalation where a user could access data
through a front component's app role that exceeded their own |
| `logic-function-executor.service.ts` | **Not impacted** — only
generates tokens with `applicationId` (no `userId`) |
2026-03-25 12:38:01 +00:00
Thomas TrompetteandGitHub e1374e34a7 Fix object permission override (#18948)
Issue: https://www.loom.com/share/dd48cd509f614e51829f6a5b58d41b6b

Bug: Unsetting a revoked object permission keeps it revoked
When a role has a global permission enabled (e.g.
canReadAllObjectRecords: true) but an object-level override revokes it
(canReadObjectRecords: false), clicking to remove that override had no
effect — the permission stayed revoked after save.

Root cause:
Backend (object-permission.service.ts): The nullish coalescing operator
(??) was used to fall back to the current DB value when the input didn't
provide a value. Since ?? treats both null and undefined as nullish,
sending canReadObjectRecords: null (meaning "remove override") was
coalesced to the current value (false), silently discarding the reset.

Fix:
- Backend: Replaced ?? with explicit !== undefined checks, so null is
preserved as a meaningful value (meaning "no override / inherit from
global") while undefined (field not provided) still falls back to the
current value. This also fixes the "Reset all permissions" flow which
sends null for all permission fields.

Additional frontend fix: Changed !value to value === false so that only
an explicit false cascades revocation to write permissions. Setting null
(reset to inherit) now only affects the read permission itself.
2026-03-25 10:49:05 +00:00
Paul RastoinandGitHub 523289efad Do not rollback on cache invalidation failure in workspace migration runner (#18947) 2026-03-25 10:30:16 +00:00
neo773andGitHub e6bb39deea fix: reset throttle state on channel relaunch (#18843)
Relaunch jobs reset syncStage/syncStatus but not throttleFailureCount
2026-03-25 09:52:17 +00:00
Charles BochetandGitHub 790a58945b Migrate twenty-companion from npm to yarn workspaces (#18946)
## Summary
- Migrates twenty-companion from standalone npm to the repo yarn
workspaces
- Removes package-lock.json (resolves Oneleet security finding about npm
lifecycle scripts)
- Converts npm overrides to yarn resolutions
- Updates scripts from npm run to yarn

## Test plan
- [x] Verified yarn install succeeds at root
- [x] Verified yarn start in twenty-companion launches the Electron app
- [ ] Verify Oneleet finding is resolved after merge
2026-03-25 10:45:43 +01:00
1070 changed files with 179086 additions and 68916 deletions
+15 -2
View File
@@ -36,6 +36,9 @@ jobs:
services:
postgres:
image: twentycrm/twenty-postgres-spilo
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
PGUSER_SUPERUSER: postgres
PGPASSWORD_SUPERUSER: postgres
@@ -50,10 +53,16 @@ jobs:
--health-retries 5
redis:
image: redis
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
ports:
- 6379:6379
clickhouse:
image: clickhouse/clickhouse-server:25.8.8
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
CLICKHOUSE_PASSWORD: clickhousePassword
CLICKHOUSE_URL: "http://default:clickhousePassword@localhost:8123/twenty"
@@ -143,7 +152,6 @@ jobs:
set_env_var "CLICKHOUSE_PASSWORD" "clickhousePassword"
npx nx run twenty-server:database:init:prod
npx nx run twenty-server:database:migrate:prod
- name: Seed current branch database with test data
run: |
@@ -296,7 +304,6 @@ jobs:
set_env_var "CLICKHOUSE_PASSWORD" "clickhousePassword"
npx nx run twenty-server:database:init:prod
npx nx run twenty-server:database:migrate:prod
- name: Seed main branch database with test data
run: |
@@ -395,6 +402,12 @@ jobs:
# Clean up temp directory
rm -rf /tmp/current-branch-files
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Install OpenAPI Diff Tool
run: |
# Using the Java-based OpenAPITools/openapi-diff via Docker
+17 -7
View File
@@ -37,6 +37,9 @@ jobs:
services:
postgres:
image: twentycrm/twenty-postgres-spilo
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
PGUSER_SUPERUSER: postgres
PGPASSWORD_SUPERUSER: postgres
@@ -51,8 +54,13 @@ jobs:
--health-retries 5
redis:
image: redis
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
ports:
- 6379:6379
env:
PUBLISHABLE_PACKAGES: twenty-client-sdk twenty-sdk create-twenty-app
steps:
- name: Fetch custom Github Actions and base branch history
uses: actions/checkout@v4
@@ -66,13 +74,13 @@ jobs:
run: |
CI_VERSION="0.0.0-ci.$(date +%s)"
echo "CI_VERSION=$CI_VERSION" >> $GITHUB_ENV
npx nx run-many -t set-local-version -p twenty-sdk twenty-client-sdk create-twenty-app --releaseVersion=$CI_VERSION
npx nx run-many -t set-local-version -p $PUBLISHABLE_PACKAGES --releaseVersion=$CI_VERSION
- name: Build packages
run: |
npx nx build twenty-sdk
npx nx build twenty-client-sdk
npx nx build create-twenty-app
for pkg in $PUBLISHABLE_PACKAGES; do
npx nx build $pkg
done
- name: Install and start Verdaccio
run: |
@@ -89,11 +97,13 @@ jobs:
- name: Publish packages to local registry
run: |
npm set //localhost:4873/:_authToken "ci-auth-token"
yarn config set npmRegistryServer http://localhost:4873
yarn config set unsafeHttpWhitelist --json '["localhost"]'
yarn config set npmAuthToken ci-auth-token
for pkg in twenty-sdk twenty-client-sdk create-twenty-app; do
for pkg in $PUBLISHABLE_PACKAGES; do
cd packages/$pkg
npm publish --registry http://localhost:4873 --tag ci
yarn npm publish --tag ci
cd ../..
done
+6
View File
@@ -26,6 +26,9 @@ jobs:
services:
postgres:
image: twentycrm/twenty-postgres-spilo
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
PGUSER_SUPERUSER: postgres
PGPASSWORD_SUPERUSER: postgres
@@ -40,6 +43,9 @@ jobs:
--health-retries 5
redis:
image: redis
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
ports:
- 6379:6379
steps:
+6
View File
@@ -57,6 +57,9 @@ jobs:
services:
postgres:
image: twentycrm/twenty-postgres-spilo
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
PGUSER_SUPERUSER: postgres
PGPASSWORD_SUPERUSER: postgres
@@ -71,6 +74,9 @@ jobs:
--health-retries 5
redis:
image: redis
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
ports:
- 6379:6379
env:
+15 -1
View File
@@ -84,6 +84,9 @@ jobs:
services:
postgres:
image: twentycrm/twenty-postgres-spilo
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
PGUSER_SUPERUSER: postgres
PGPASSWORD_SUPERUSER: postgres
@@ -98,6 +101,9 @@ jobs:
--health-retries 5
redis:
image: redis
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
ports:
- 6379:6379
steps:
@@ -122,7 +128,6 @@ jobs:
PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d postgres -c 'CREATE DATABASE "default";'
PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d postgres -c 'CREATE DATABASE "test";'
npx nx run twenty-server:database:init:prod
npx nx run twenty-server:database:migrate:prod
- name: Worker / Run
run: |
timeout 30s npx nx run twenty-server:worker || exit_code=$?
@@ -227,6 +232,9 @@ jobs:
services:
postgres:
image: twentycrm/twenty-postgres-spilo
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
PGUSER_SUPERUSER: postgres
PGPASSWORD_SUPERUSER: postgres
@@ -241,10 +249,16 @@ jobs:
--health-retries 5
redis:
image: redis
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
ports:
- 6379:6379
clickhouse:
image: clickhouse/clickhouse-server:25.8.8
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
CLICKHOUSE_PASSWORD: clickhousePassword
CLICKHOUSE_URL: "http://default:clickhousePassword@localhost:8123/twenty"
@@ -27,6 +27,11 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Run compose
run: |
echo "Patching docker-compose.yml..."
@@ -97,6 +102,11 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Create frontend placeholder
run: |
mkdir -p packages/twenty-front/build
+3
View File
@@ -27,6 +27,9 @@ jobs:
services:
postgres:
image: twentycrm/twenty-postgres-spilo
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
PGUSER_SUPERUSER: postgres
PGPASSWORD_SUPERUSER: postgres
+6
View File
@@ -30,6 +30,9 @@ jobs:
services:
postgres:
image: twentycrm/twenty-postgres-spilo
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
env:
PGUSER_SUPERUSER: postgres
PGPASSWORD_SUPERUSER: postgres
@@ -44,6 +47,9 @@ jobs:
--health-retries 5
redis:
image: redis
credentials:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
ports:
- 6379:6379
steps:
@@ -17,6 +17,12 @@ jobs:
with:
ref: ${{ github.event.client_payload.pr_head_sha }}
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Run compose setup
run: |
echo "Patching docker-compose.yml..."
+940
View File
File diff suppressed because one or more lines are too long
-942
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -6,4 +6,4 @@ enableInlineHunks: true
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.9.2.cjs
yarnPath: .yarn/releases/yarn-4.13.0.cjs
+4 -2
View File
@@ -175,7 +175,7 @@
},
"license": "AGPL-3.0",
"name": "twenty",
"packageManager": "yarn@4.9.2",
"packageManager": "yarn@4.13.0",
"resolutions": {
"graphql": "16.8.1",
"type-fest": "4.10.1",
@@ -203,6 +203,7 @@
"packages/twenty-utils",
"packages/twenty-zapier",
"packages/twenty-website",
"packages/twenty-website-new",
"packages/twenty-docs",
"packages/twenty-e2e-testing",
"packages/twenty-shared",
@@ -211,7 +212,8 @@
"packages/twenty-apps",
"packages/twenty-cli",
"packages/create-twenty-app",
"packages/twenty-oxlint-rules"
"packages/twenty-oxlint-rules",
"packages/twenty-companion"
]
},
"prettier": {
+3 -11
View File
@@ -41,7 +41,7 @@ cd my-twenty-app
# Or do it manually:
yarn twenty server start # Start local Twenty server
yarn twenty remote add --local # Authenticate via OAuth
yarn twenty remote add http://localhost:2020 --as local # Authenticate via OAuth
# Start dev mode: watches, builds, and syncs local changes to your workspace
# (also auto-generates typed CoreApiClient — MetadataApiClient ships pre-built — both available via `twenty-client-sdk`)
@@ -122,18 +122,10 @@ yarn twenty server reset # Wipe all data and start fresh
The server is pre-seeded with a workspace and user (`tim@apple.dev` / `tim@apple.dev`).
### How to use a local Twenty instance
If you're already running a local Twenty instance, you can connect to it instead of using Docker. Pass the port your local server is listening on (default: `3000`):
```bash
npx create-twenty-app@latest my-app --port 3000
```
## Next steps
- Run `yarn twenty help` to see all available commands.
- Use `yarn twenty remote add --local` to authenticate with your Twenty workspace via OAuth.
- Use `yarn twenty remote add <url>` to authenticate with your Twenty workspace via OAuth.
- Explore the generated project and add your first entity with `yarn twenty add` (logic functions, front components, objects, roles, views, navigation menu items, skills).
- Use `yarn twenty dev` while you iterate — it watches, builds, and syncs changes to your workspace in real time.
- `CoreApiClient` is auto-generated by `yarn twenty dev`. `MetadataApiClient` (for workspace configuration and file uploads via `/metadata`) ships pre-built with the SDK. Both are available via `import { CoreApiClient } from 'twenty-client-sdk/core'` and `import { MetadataApiClient } from 'twenty-client-sdk/metadata'`.
@@ -177,7 +169,7 @@ Our team reviews contributions for quality, security, and reusability before mer
## Troubleshooting
- Server not starting: check Docker is running (`docker info`), then try `yarn twenty server logs`.
- Auth not working: make sure you're logged in to Twenty in the browser first, then run `yarn twenty remote add --local`.
- Auth not working: make sure you're logged in to Twenty in the browser first, then run `yarn twenty remote add <url>`.
- Types not generated: ensure `yarn twenty dev` is running — it auto-generates the typed client.
## Contributing
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "create-twenty-app",
"version": "0.8.0-canary.2",
"version": "0.8.0-canary.5",
"description": "Command-line interface to create Twenty application",
"main": "dist/cli.cjs",
"bin": "dist/cli.cjs",
@@ -36,6 +36,7 @@
"lodash.camelcase": "^4.3.0",
"lodash.kebabcase": "^4.1.1",
"lodash.startcase": "^4.4.0",
"twenty-sdk": "workspace:*",
"uuid": "^13.0.0"
},
"devDependencies": {
@@ -45,7 +46,6 @@
"@types/lodash.kebabcase": "^4.1.7",
"@types/lodash.startcase": "^4",
"@types/node": "^20.0.0",
"twenty-sdk": "workspace:*",
"twenty-shared": "workspace:*",
"typescript": "^5.9.2",
"vite": "^7.0.0",
-8
View File
@@ -31,10 +31,6 @@ const program = new Command(packageJson.name)
'--skip-local-instance',
'Skip the local Twenty instance setup prompt',
)
.option(
'-p, --port <port>',
'Port of an existing Twenty server (skips Docker setup)',
)
.helpOption('-h, --help', 'Display this help message.')
.action(
async (
@@ -46,7 +42,6 @@ const program = new Command(packageJson.name)
displayName?: string;
description?: string;
skipLocalInstance?: boolean;
port?: string;
},
) => {
const modeFlags = [options?.exhaustive, options?.minimal].filter(Boolean);
@@ -76,8 +71,6 @@ const program = new Command(packageJson.name)
const mode: ScaffoldingMode = options?.minimal ? 'minimal' : 'exhaustive';
const port = options?.port ? parseInt(options.port, 10) : undefined;
await new CreateAppCommand().execute({
directory,
mode,
@@ -85,7 +78,6 @@ const program = new Command(packageJson.name)
displayName: options?.displayName,
description: options?.description,
skipLocalInstance: options?.skipLocalInstance,
port,
});
},
);
@@ -1,18 +1,18 @@
import { basename } from 'path';
import { copyBaseApplicationProject } from '@/utils/app-template';
import { convertToLabel } from '@/utils/convert-to-label';
import { install } from '@/utils/install';
import {
type LocalInstanceResult,
setupLocalInstance,
} from '@/utils/setup-local-instance';
import { tryGitInit } from '@/utils/try-git-init';
import chalk from 'chalk';
import * as fs from 'fs-extra';
import inquirer from 'inquirer';
import kebabCase from 'lodash.kebabcase';
import { execSync } from 'node:child_process';
import * as path from 'path';
import { basename } from 'path';
import {
authLoginOAuth,
serverStart,
type ServerStartResult,
} from 'twenty-sdk/cli';
import { isDefined } from 'twenty-shared/utils';
import {
@@ -29,7 +29,6 @@ type CreateAppOptions = {
displayName?: string;
description?: string;
skipLocalInstance?: boolean;
port?: number;
};
export class CreateAppCommand {
@@ -60,17 +59,22 @@ export class CreateAppCommand {
await tryGitInit(appDirectory);
let localResult: LocalInstanceResult = { running: false };
let serverResult: ServerStartResult | undefined;
if (!options.skipLocalInstance) {
localResult = await setupLocalInstance(appDirectory, options.port);
const startResult = await serverStart({
onProgress: (message: string) => console.log(chalk.gray(message)),
});
if (localResult.running && localResult.serverUrl) {
await this.connectToLocal(appDirectory, localResult.serverUrl);
if (startResult.success) {
serverResult = startResult.data;
await this.connectToLocal(serverResult.url);
} else {
console.log(chalk.yellow(`\n${startResult.error.message}`));
}
}
this.logSuccess(appDirectory, localResult);
this.logSuccess(appDirectory, serverResult);
} catch (error) {
console.error(
chalk.red('\nCreate application failed:'),
@@ -197,15 +201,20 @@ export class CreateAppCommand {
);
}
private async connectToLocal(
appDirectory: string,
serverUrl: string,
): Promise<void> {
private async connectToLocal(serverUrl: string): Promise<void> {
try {
execSync(`yarn twenty remote add ${serverUrl} --as local`, {
cwd: appDirectory,
stdio: 'inherit',
const result = await authLoginOAuth({
apiUrl: serverUrl,
remote: 'local',
});
if (!result.success) {
console.log(
chalk.yellow(
'Authentication skipped. Run `yarn twenty remote add --local` manually.',
),
);
}
} catch {
console.log(
chalk.yellow(
@@ -217,14 +226,14 @@ export class CreateAppCommand {
private logSuccess(
appDirectory: string,
localResult: LocalInstanceResult,
serverResult?: ServerStartResult,
): void {
const dirName = basename(appDirectory);
console.log(chalk.blue('\nApplication created. Next steps:'));
console.log(chalk.gray(`- cd ${dirName}`));
if (!localResult.running) {
if (!serverResult) {
console.log(
chalk.gray(
'- yarn twenty remote add --local # Authenticate with Twenty',
@@ -1,106 +0,0 @@
import chalk from 'chalk';
import { execSync } from 'node:child_process';
const LOCAL_PORTS = [2020, 3000];
// Minimal health check — the full implementation lives in twenty-sdk
const isServerReady = async (port: number): Promise<boolean> => {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 3000);
try {
const response = await fetch(`http://localhost:${port}/healthz`, {
signal: controller.signal,
});
const body = await response.json();
return body.status === 'ok';
} catch {
return false;
} finally {
clearTimeout(timeoutId);
}
};
const detectRunningServer = async (
preferredPort?: number,
): Promise<number | null> => {
const ports = preferredPort ? [preferredPort] : LOCAL_PORTS;
for (const port of ports) {
if (await isServerReady(port)) {
return port;
}
}
return null;
};
export type LocalInstanceResult = {
running: boolean;
serverUrl?: string;
};
export const setupLocalInstance = async (
appDirectory: string,
preferredPort?: number,
): Promise<LocalInstanceResult> => {
const detectedPort = await detectRunningServer(preferredPort);
if (detectedPort) {
const serverUrl = `http://localhost:${detectedPort}`;
console.log(chalk.green(`Twenty server detected on ${serverUrl}.\n`));
return { running: true, serverUrl };
}
if (preferredPort) {
console.log(
chalk.yellow(
`No Twenty server found on port ${preferredPort}.\n` +
'Start your server and run `yarn twenty remote add --local` manually.\n',
),
);
return { running: false };
}
console.log(chalk.blue('Setting up local Twenty instance...\n'));
try {
execSync('yarn twenty server start', {
cwd: appDirectory,
stdio: 'inherit',
});
} catch {
return { running: false };
}
console.log(chalk.gray('Waiting for Twenty to be ready...\n'));
const startTime = Date.now();
const timeoutMs = 180 * 1000;
while (Date.now() - startTime < timeoutMs) {
if (await isServerReady(LOCAL_PORTS[0])) {
const serverUrl = `http://localhost:${LOCAL_PORTS[0]}`;
console.log(chalk.green(`Server running on '${serverUrl}'\n`));
return { running: true, serverUrl };
}
await new Promise((resolve) => setTimeout(resolve, 2000));
}
console.log(
chalk.yellow(
'Twenty server did not become healthy in time.\n',
"Check: 'yarn twenty server logs'\n",
),
);
return { running: false };
};
@@ -5,7 +5,7 @@ This is a [Twenty](https://twenty.com) application project bootstrapped with [`c
First, authenticate to your workspace:
```bash
yarn twenty remote add --local
yarn twenty remote add http://localhost:2020 --as local
```
Then, start development mode to sync your app and watch for changes:
@@ -22,7 +22,7 @@ Run `yarn twenty help` to list all available commands. Common commands:
```bash
# Remotes & Authentication
yarn twenty remote add --local # Authenticate with Twenty
yarn twenty remote add http://localhost:2020 --as local # Authenticate with Twenty
yarn twenty remote status # Check auth status
yarn twenty remote switch # Switch default remote
yarn twenty remote list # List all configured remotes
+2 -2
View File
@@ -5,7 +5,7 @@ This is a [Twenty](https://twenty.com) application project bootstrapped with [`c
First, authenticate to your workspace:
```bash
yarn twenty remote add --local
yarn twenty remote add http://localhost:2020 --as local
```
Then, start development mode to sync your app and watch for changes:
@@ -22,7 +22,7 @@ Run `yarn twenty help` to list all available commands. Common commands:
```bash
# Remotes & Authentication
yarn twenty remote add --local # Authenticate with Twenty
yarn twenty remote add http://localhost:2020 --as local # Authenticate with Twenty
yarn twenty remote status # Check auth status
yarn twenty remote switch # Switch default remote
yarn twenty remote list # List all configured remotes
@@ -5,7 +5,7 @@ This is a [Twenty](https://twenty.com) application project bootstrapped with [`c
First, authenticate to your workspace:
```bash
yarn twenty remote add --local
yarn twenty remote add http://localhost:2020 --as local
```
Then, start development mode to sync your app and watch for changes:
@@ -22,7 +22,7 @@ Run `yarn twenty help` to list all available commands. Common commands:
```bash
# Remotes & Authentication
yarn twenty remote add --local # Authenticate with Twenty
yarn twenty remote add http://localhost:2020 --as local # Authenticate with Twenty
yarn twenty remote status # Check auth status
yarn twenty remote switch # Switch default remote
yarn twenty remote list # List all configured remotes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "twenty-client-sdk",
"version": "0.7.0-canary.0",
"version": "0.8.0-canary.5",
"sideEffects": false,
"license": "AGPL-3.0",
"scripts": {
@@ -343,6 +343,7 @@ type Field {
defaultValue: JSON
options: JSON
settings: JSON
objectMetadataId: UUID!
isLabelSyncedWithName: Boolean
morphId: UUID
createdAt: DateTime!
@@ -540,6 +541,7 @@ input FieldFilter {
isActive: BooleanFieldComparison
isSystem: BooleanFieldComparison
isUIReadOnly: BooleanFieldComparison
objectMetadataId: UUIDFilterComparison
}
input IndexFilter {
@@ -778,8 +780,7 @@ type Workspace {
viewGroups: [ViewGroup!]
viewSorts: [ViewSort!]
metadataVersion: Float!
databaseUrl: String!
databaseSchema: String!
databaseSchema: String
subdomain: String!
customDomain: String
isGoogleAuthEnabled: Boolean!
@@ -1724,20 +1725,13 @@ enum FeatureFlagKey {
IS_UNIQUE_INDEXES_ENABLED
IS_JSON_FILTER_ENABLED
IS_AI_ENABLED
IS_APPLICATION_ENABLED
IS_MARKETPLACE_ENABLED
IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED
IS_PUBLIC_DOMAIN_ENABLED
IS_EMAILING_DOMAIN_ENABLED
IS_DASHBOARD_V2_ENABLED
IS_ATTACHMENT_MIGRATED
IS_NOTE_TARGET_MIGRATED
IS_TASK_TARGET_MIGRATED
IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED
IS_JUNCTION_RELATIONS_ENABLED
IS_COMMAND_MENU_ITEM_ENABLED
IS_NAVIGATION_MENU_ITEM_ENABLED
IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED
IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED
IS_DRAFT_EMAIL_ENABLED
IS_USAGE_ANALYTICS_ENABLED
@@ -1746,6 +1740,8 @@ enum FeatureFlagKey {
IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED
IS_CONNECTED_ACCOUNT_MIGRATED
IS_GRAPHQL_QUERY_TIMING_ENABLED
IS_RECORD_TABLE_WIDGET_ENABLED
IS_DATASOURCE_MIGRATED
}
type ClientConfig {
@@ -1778,6 +1774,12 @@ type ClientConfig {
isClickHouseConfigured: Boolean!
}
type UsageBreakdownItem {
key: String!
label: String
creditsUsed: Float!
}
type ConfigVariable {
name: String!
description: String!
@@ -2272,6 +2274,11 @@ type FieldConnection {
edges: [FieldEdge!]!
}
type LogicFunctionLogs {
"""Execution Logs"""
logs: String!
}
type DeleteTwoFactorAuthenticationMethod {
"""Boolean that confirms query was dispatched"""
success: Boolean!
@@ -2372,6 +2379,26 @@ type Impersonate {
workspace: WorkspaceUrlsAndId!
}
type UsageTimeSeries {
date: String!
creditsUsed: Float!
}
type UsageUserDaily {
userWorkspaceId: String!
dailyUsage: [UsageTimeSeries!]!
}
type UsageAnalytics {
usageByUser: [UsageBreakdownItem!]!
usageByOperationType: [UsageBreakdownItem!]!
usageByModel: [UsageBreakdownItem!]!
timeSeries: [UsageTimeSeries!]!
periodStart: DateTime!
periodEnd: DateTime!
userDailyUsage: UsageUserDaily
}
type DevelopmentApplication {
id: String!
universalIdentifier: String!
@@ -2567,36 +2594,6 @@ type PostgresCredentials {
workspaceId: UUID!
}
type UsageBreakdownItem {
key: String!
label: String
creditsUsed: Float!
}
type UsageTimeSeries {
date: String!
creditsUsed: Float!
}
type UsageUserDaily {
userWorkspaceId: String!
dailyUsage: [UsageTimeSeries!]!
}
type UsageAnalytics {
usageByUser: [UsageBreakdownItem!]!
usageByOperationType: [UsageBreakdownItem!]!
timeSeries: [UsageTimeSeries!]!
periodStart: DateTime!
periodEnd: DateTime!
userDailyUsage: UsageUserDaily
}
type LogicFunctionLogs {
"""Execution Logs"""
logs: String!
}
type FrontComponent {
id: UUID!
name: String!
@@ -3089,6 +3086,7 @@ enum AllMetadataName {
navigationMenuItem
permissionFlag
objectPermission
fieldPermission
frontComponent
webhook
}
@@ -3270,6 +3268,8 @@ type Query {
getAiProviders: JSON!
getModelsDevProviders: [ModelsDevProviderSuggestion!]!
getModelsDevSuggestions(providerType: String!): [ModelsDevModelSuggestion!]!
getAdminAiUsageByWorkspace(periodStart: DateTime, periodEnd: DateTime): [UsageBreakdownItem!]!
getUsageAnalytics(input: UsageAnalyticsInput): UsageAnalytics!
getPostgresCredentials: PostgresCredentials
findManyPublicDomains: [PublicDomain!]!
getEmailingDomains: [EmailingDomain!]!
@@ -3277,7 +3277,6 @@ type Query {
findOneMarketplaceApp(universalIdentifier: String!): MarketplaceApp!
findManyApplications: [Application!]!
findOneApplication(id: UUID, universalIdentifier: UUID): Application!
getUsageAnalytics(input: UsageAnalyticsInput): UsageAnalytics!
}
input GetApiKeyInput {
@@ -3390,6 +3389,14 @@ input UsageAnalyticsInput {
periodStart: DateTime
periodEnd: DateTime
userWorkspaceId: String
operationTypes: [UsageOperationType!]
}
enum UsageOperationType {
AI_CHAT_TOKEN
AI_WORKFLOW_TOKEN
WORKFLOW_EXECUTION
CODE_EXECUTION
}
type Mutation {
@@ -3500,6 +3507,7 @@ type Mutation {
createViewGroup(input: CreateViewGroupInput!): ViewGroup!
createManyViewGroups(inputs: [CreateViewGroupInput!]!): [ViewGroup!]!
updateViewGroup(input: UpdateViewGroupInput!): ViewGroup!
updateManyViewGroups(inputs: [UpdateViewGroupInput!]!): [ViewGroup!]!
deleteViewGroup(input: DeleteViewGroupInput!): ViewGroup!
destroyViewGroup(input: DestroyViewGroupInput!): ViewGroup!
updateMessageFolder(input: UpdateMessageFolderInput!): MessageFolder!
@@ -4089,6 +4097,7 @@ input UpdateObjectPayload {
labelIdentifierFieldMetadataId: UUID
imageIdentifierFieldMetadataId: UUID
isLabelSyncedWithName: Boolean
isSearchable: Boolean
}
input UpdateViewFieldInput {
@@ -4270,8 +4279,8 @@ input CreateFieldInput {
defaultValue: JSON
options: JSON
settings: JSON
isLabelSyncedWithName: Boolean
objectMetadataId: UUID!
isLabelSyncedWithName: Boolean
isRemoteCreation: Boolean
relationCreationPayload: JSON
morphRelationsCreationPayload: [JSON!]
@@ -4299,6 +4308,7 @@ input UpdateFieldInput {
defaultValue: JSON
options: JSON
settings: JSON
objectMetadataId: UUID
isLabelSyncedWithName: Boolean
morphRelationsUpdatePayload: [JSON!]
}
@@ -296,6 +296,7 @@ export interface Field {
defaultValue?: Scalars['JSON']
options?: Scalars['JSON']
settings?: Scalars['JSON']
objectMetadataId: Scalars['UUID']
isLabelSyncedWithName?: Scalars['Boolean']
morphId?: Scalars['UUID']
createdAt: Scalars['DateTime']
@@ -564,8 +565,7 @@ export interface Workspace {
viewGroups?: ViewGroup[]
viewSorts?: ViewSort[]
metadataVersion: Scalars['Float']
databaseUrl: Scalars['String']
databaseSchema: Scalars['String']
databaseSchema?: Scalars['String']
subdomain: Scalars['String']
customDomain?: Scalars['String']
isGoogleAuthEnabled: Scalars['Boolean']
@@ -1427,7 +1427,7 @@ export interface PublicFeatureFlag {
__typename: 'PublicFeatureFlag'
}
export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_AI_ENABLED' | 'IS_APPLICATION_ENABLED' | 'IS_MARKETPLACE_ENABLED' | 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAILING_DOMAIN_ENABLED' | 'IS_DASHBOARD_V2_ENABLED' | 'IS_ATTACHMENT_MIGRATED' | 'IS_NOTE_TARGET_MIGRATED' | 'IS_TASK_TARGET_MIGRATED' | 'IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_COMMAND_MENU_ITEM_ENABLED' | 'IS_NAVIGATION_MENU_ITEM_ENABLED' | 'IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED' | 'IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED' | 'IS_DRAFT_EMAIL_ENABLED' | 'IS_USAGE_ANALYTICS_ENABLED' | 'IS_RICH_TEXT_V1_MIGRATED' | 'IS_DIRECT_GRAPHQL_EXECUTION_ENABLED' | 'IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED' | 'IS_CONNECTED_ACCOUNT_MIGRATED' | 'IS_GRAPHQL_QUERY_TIMING_ENABLED'
export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_AI_ENABLED' | 'IS_MARKETPLACE_ENABLED' | 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAILING_DOMAIN_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_COMMAND_MENU_ITEM_ENABLED' | 'IS_NAVIGATION_MENU_ITEM_ENABLED' | 'IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED' | 'IS_DRAFT_EMAIL_ENABLED' | 'IS_USAGE_ANALYTICS_ENABLED' | 'IS_RICH_TEXT_V1_MIGRATED' | 'IS_DIRECT_GRAPHQL_EXECUTION_ENABLED' | 'IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED' | 'IS_CONNECTED_ACCOUNT_MIGRATED' | 'IS_GRAPHQL_QUERY_TIMING_ENABLED' | 'IS_RECORD_TABLE_WIDGET_ENABLED' | 'IS_DATASOURCE_MIGRATED'
export interface ClientConfig {
appVersion?: Scalars['String']
@@ -1460,6 +1460,13 @@ export interface ClientConfig {
__typename: 'ClientConfig'
}
export interface UsageBreakdownItem {
key: Scalars['String']
label?: Scalars['String']
creditsUsed: Scalars['Float']
__typename: 'UsageBreakdownItem'
}
export interface ConfigVariable {
name: Scalars['String']
description: Scalars['String']
@@ -1937,6 +1944,12 @@ export interface FieldConnection {
__typename: 'FieldConnection'
}
export interface LogicFunctionLogs {
/** Execution Logs */
logs: Scalars['String']
__typename: 'LogicFunctionLogs'
}
export interface DeleteTwoFactorAuthenticationMethod {
/** Boolean that confirms query was dispatched */
success: Scalars['Boolean']
@@ -2058,6 +2071,29 @@ export interface Impersonate {
__typename: 'Impersonate'
}
export interface UsageTimeSeries {
date: Scalars['String']
creditsUsed: Scalars['Float']
__typename: 'UsageTimeSeries'
}
export interface UsageUserDaily {
userWorkspaceId: Scalars['String']
dailyUsage: UsageTimeSeries[]
__typename: 'UsageUserDaily'
}
export interface UsageAnalytics {
usageByUser: UsageBreakdownItem[]
usageByOperationType: UsageBreakdownItem[]
usageByModel: UsageBreakdownItem[]
timeSeries: UsageTimeSeries[]
periodStart: Scalars['DateTime']
periodEnd: Scalars['DateTime']
userDailyUsage?: UsageUserDaily
__typename: 'UsageAnalytics'
}
export interface DevelopmentApplication {
id: Scalars['String']
universalIdentifier: Scalars['String']
@@ -2269,41 +2305,6 @@ export interface PostgresCredentials {
__typename: 'PostgresCredentials'
}
export interface UsageBreakdownItem {
key: Scalars['String']
label?: Scalars['String']
creditsUsed: Scalars['Float']
__typename: 'UsageBreakdownItem'
}
export interface UsageTimeSeries {
date: Scalars['String']
creditsUsed: Scalars['Float']
__typename: 'UsageTimeSeries'
}
export interface UsageUserDaily {
userWorkspaceId: Scalars['String']
dailyUsage: UsageTimeSeries[]
__typename: 'UsageUserDaily'
}
export interface UsageAnalytics {
usageByUser: UsageBreakdownItem[]
usageByOperationType: UsageBreakdownItem[]
timeSeries: UsageTimeSeries[]
periodStart: Scalars['DateTime']
periodEnd: Scalars['DateTime']
userDailyUsage?: UsageUserDaily
__typename: 'UsageAnalytics'
}
export interface LogicFunctionLogs {
/** Execution Logs */
logs: Scalars['String']
__typename: 'LogicFunctionLogs'
}
export interface FrontComponent {
id: Scalars['UUID']
name: Scalars['String']
@@ -2676,7 +2677,7 @@ export interface CollectionHash {
__typename: 'CollectionHash'
}
export type AllMetadataName = 'fieldMetadata' | 'objectMetadata' | 'view' | 'viewField' | 'viewFieldGroup' | 'viewGroup' | 'viewSort' | 'rowLevelPermissionPredicate' | 'rowLevelPermissionPredicateGroup' | 'viewFilterGroup' | 'index' | 'logicFunction' | 'viewFilter' | 'role' | 'roleTarget' | 'agent' | 'skill' | 'pageLayout' | 'pageLayoutWidget' | 'pageLayoutTab' | 'commandMenuItem' | 'navigationMenuItem' | 'permissionFlag' | 'objectPermission' | 'frontComponent' | 'webhook'
export type AllMetadataName = 'fieldMetadata' | 'objectMetadata' | 'view' | 'viewField' | 'viewFieldGroup' | 'viewGroup' | 'viewSort' | 'rowLevelPermissionPredicate' | 'rowLevelPermissionPredicateGroup' | 'viewFilterGroup' | 'index' | 'logicFunction' | 'viewFilter' | 'role' | 'roleTarget' | 'agent' | 'skill' | 'pageLayout' | 'pageLayoutWidget' | 'pageLayoutTab' | 'commandMenuItem' | 'navigationMenuItem' | 'permissionFlag' | 'objectPermission' | 'fieldPermission' | 'frontComponent' | 'webhook'
export interface MinimalObjectMetadata {
id: Scalars['UUID']
@@ -2823,6 +2824,8 @@ export interface Query {
getAiProviders: Scalars['JSON']
getModelsDevProviders: ModelsDevProviderSuggestion[]
getModelsDevSuggestions: ModelsDevModelSuggestion[]
getAdminAiUsageByWorkspace: UsageBreakdownItem[]
getUsageAnalytics: UsageAnalytics
getPostgresCredentials?: PostgresCredentials
findManyPublicDomains: PublicDomain[]
getEmailingDomains: EmailingDomain[]
@@ -2830,7 +2833,6 @@ export interface Query {
findOneMarketplaceApp: MarketplaceApp
findManyApplications: Application[]
findOneApplication: Application
getUsageAnalytics: UsageAnalytics
__typename: 'Query'
}
@@ -2846,6 +2848,8 @@ export type SortNulls = 'NULLS_FIRST' | 'NULLS_LAST'
export type EventLogTable = 'WORKSPACE_EVENT' | 'PAGEVIEW' | 'OBJECT_EVENT' | 'USAGE_EVENT'
export type UsageOperationType = 'AI_CHAT_TOKEN' | 'AI_WORKFLOW_TOKEN' | 'WORKFLOW_EXECUTION' | 'CODE_EXECUTION'
export interface Mutation {
addQueryToEventStream: Scalars['Boolean']
removeQueryFromEventStream: Scalars['Boolean']
@@ -2954,6 +2958,7 @@ export interface Mutation {
createViewGroup: ViewGroup
createManyViewGroups: ViewGroup[]
updateViewGroup: ViewGroup
updateManyViewGroups: ViewGroup[]
deleteViewGroup: ViewGroup
destroyViewGroup: ViewGroup
updateMessageFolder: MessageFolder
@@ -3360,6 +3365,7 @@ export interface FieldGenqlSelection{
defaultValue?: boolean | number
options?: boolean | number
settings?: boolean | number
objectMetadataId?: boolean | number
isLabelSyncedWithName?: boolean | number
morphId?: boolean | number
createdAt?: boolean | number
@@ -3476,7 +3482,7 @@ export interface ObjectGenqlSelection{
__scalar?: boolean | number
}
export interface FieldFilter {and?: (FieldFilter[] | null),or?: (FieldFilter[] | null),id?: (UUIDFilterComparison | null),isCustom?: (BooleanFieldComparison | null),isActive?: (BooleanFieldComparison | null),isSystem?: (BooleanFieldComparison | null),isUIReadOnly?: (BooleanFieldComparison | null)}
export interface FieldFilter {and?: (FieldFilter[] | null),or?: (FieldFilter[] | null),id?: (UUIDFilterComparison | null),isCustom?: (BooleanFieldComparison | null),isActive?: (BooleanFieldComparison | null),isSystem?: (BooleanFieldComparison | null),isUIReadOnly?: (BooleanFieldComparison | null),objectMetadataId?: (UUIDFilterComparison | null)}
export interface IndexFilter {and?: (IndexFilter[] | null),or?: (IndexFilter[] | null),id?: (UUIDFilterComparison | null),isCustom?: (BooleanFieldComparison | null)}
@@ -3653,7 +3659,6 @@ export interface WorkspaceGenqlSelection{
viewGroups?: ViewGroupGenqlSelection
viewSorts?: ViewSortGenqlSelection
metadataVersion?: boolean | number
databaseUrl?: boolean | number
databaseSchema?: boolean | number
subdomain?: boolean | number
customDomain?: boolean | number
@@ -4584,6 +4589,14 @@ export interface ClientConfigGenqlSelection{
__scalar?: boolean | number
}
export interface UsageBreakdownItemGenqlSelection{
key?: boolean | number
label?: boolean | number
creditsUsed?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface ConfigVariableGenqlSelection{
name?: boolean | number
description?: boolean | number
@@ -5096,6 +5109,13 @@ export interface FieldConnectionGenqlSelection{
__scalar?: boolean | number
}
export interface LogicFunctionLogsGenqlSelection{
/** Execution Logs */
logs?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface DeleteTwoFactorAuthenticationMethodGenqlSelection{
/** Boolean that confirms query was dispatched */
success?: boolean | number
@@ -5238,6 +5258,32 @@ export interface ImpersonateGenqlSelection{
__scalar?: boolean | number
}
export interface UsageTimeSeriesGenqlSelection{
date?: boolean | number
creditsUsed?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface UsageUserDailyGenqlSelection{
userWorkspaceId?: boolean | number
dailyUsage?: UsageTimeSeriesGenqlSelection
__typename?: boolean | number
__scalar?: boolean | number
}
export interface UsageAnalyticsGenqlSelection{
usageByUser?: UsageBreakdownItemGenqlSelection
usageByOperationType?: UsageBreakdownItemGenqlSelection
usageByModel?: UsageBreakdownItemGenqlSelection
timeSeries?: UsageTimeSeriesGenqlSelection
periodStart?: boolean | number
periodEnd?: boolean | number
userDailyUsage?: UsageUserDailyGenqlSelection
__typename?: boolean | number
__scalar?: boolean | number
}
export interface DevelopmentApplicationGenqlSelection{
id?: boolean | number
universalIdentifier?: boolean | number
@@ -5468,46 +5514,6 @@ export interface PostgresCredentialsGenqlSelection{
__scalar?: boolean | number
}
export interface UsageBreakdownItemGenqlSelection{
key?: boolean | number
label?: boolean | number
creditsUsed?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface UsageTimeSeriesGenqlSelection{
date?: boolean | number
creditsUsed?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface UsageUserDailyGenqlSelection{
userWorkspaceId?: boolean | number
dailyUsage?: UsageTimeSeriesGenqlSelection
__typename?: boolean | number
__scalar?: boolean | number
}
export interface UsageAnalyticsGenqlSelection{
usageByUser?: UsageBreakdownItemGenqlSelection
usageByOperationType?: UsageBreakdownItemGenqlSelection
timeSeries?: UsageTimeSeriesGenqlSelection
periodStart?: boolean | number
periodEnd?: boolean | number
userDailyUsage?: UsageUserDailyGenqlSelection
__typename?: boolean | number
__scalar?: boolean | number
}
export interface LogicFunctionLogsGenqlSelection{
/** Execution Logs */
logs?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface FrontComponentGenqlSelection{
id?: boolean | number
name?: boolean | number
@@ -6055,6 +6061,8 @@ export interface QueryGenqlSelection{
getAiProviders?: boolean | number
getModelsDevProviders?: ModelsDevProviderSuggestionGenqlSelection
getModelsDevSuggestions?: (ModelsDevModelSuggestionGenqlSelection & { __args: {providerType: Scalars['String']} })
getAdminAiUsageByWorkspace?: (UsageBreakdownItemGenqlSelection & { __args?: {periodStart?: (Scalars['DateTime'] | null), periodEnd?: (Scalars['DateTime'] | null)} })
getUsageAnalytics?: (UsageAnalyticsGenqlSelection & { __args?: {input?: (UsageAnalyticsInput | null)} })
getPostgresCredentials?: PostgresCredentialsGenqlSelection
findManyPublicDomains?: PublicDomainGenqlSelection
getEmailingDomains?: EmailingDomainGenqlSelection
@@ -6062,7 +6070,6 @@ export interface QueryGenqlSelection{
findOneMarketplaceApp?: (MarketplaceAppGenqlSelection & { __args: {universalIdentifier: Scalars['String']} })
findManyApplications?: ApplicationGenqlSelection
findOneApplication?: (ApplicationGenqlSelection & { __args?: {id?: (Scalars['UUID'] | null), universalIdentifier?: (Scalars['UUID'] | null)} })
getUsageAnalytics?: (UsageAnalyticsGenqlSelection & { __args?: {input?: (UsageAnalyticsInput | null)} })
__typename?: boolean | number
__scalar?: boolean | number
}
@@ -6097,7 +6104,7 @@ export interface LineChartDataInput {objectMetadataId: Scalars['UUID'],configura
export interface BarChartDataInput {objectMetadataId: Scalars['UUID'],configuration: Scalars['JSON']}
export interface UsageAnalyticsInput {periodStart?: (Scalars['DateTime'] | null),periodEnd?: (Scalars['DateTime'] | null),userWorkspaceId?: (Scalars['String'] | null)}
export interface UsageAnalyticsInput {periodStart?: (Scalars['DateTime'] | null),periodEnd?: (Scalars['DateTime'] | null),userWorkspaceId?: (Scalars['String'] | null),operationTypes?: (UsageOperationType[] | null)}
export interface MutationGenqlSelection{
addQueryToEventStream?: { __args: {input: AddQuerySubscriptionInput} }
@@ -6207,6 +6214,7 @@ export interface MutationGenqlSelection{
createViewGroup?: (ViewGroupGenqlSelection & { __args: {input: CreateViewGroupInput} })
createManyViewGroups?: (ViewGroupGenqlSelection & { __args: {inputs: CreateViewGroupInput[]} })
updateViewGroup?: (ViewGroupGenqlSelection & { __args: {input: UpdateViewGroupInput} })
updateManyViewGroups?: (ViewGroupGenqlSelection & { __args: {inputs: UpdateViewGroupInput[]} })
deleteViewGroup?: (ViewGroupGenqlSelection & { __args: {input: DeleteViewGroupInput} })
destroyViewGroup?: (ViewGroupGenqlSelection & { __args: {input: DestroyViewGroupInput} })
updateMessageFolder?: (MessageFolderGenqlSelection & { __args: {input: UpdateMessageFolderInput} })
@@ -6475,7 +6483,7 @@ export interface UpdateOneObjectInput {update: UpdateObjectPayload,
/** The id of the object to update */
id: Scalars['UUID']}
export interface UpdateObjectPayload {labelSingular?: (Scalars['String'] | null),labelPlural?: (Scalars['String'] | null),nameSingular?: (Scalars['String'] | null),namePlural?: (Scalars['String'] | null),description?: (Scalars['String'] | null),icon?: (Scalars['String'] | null),shortcut?: (Scalars['String'] | null),color?: (Scalars['String'] | null),isActive?: (Scalars['Boolean'] | null),labelIdentifierFieldMetadataId?: (Scalars['UUID'] | null),imageIdentifierFieldMetadataId?: (Scalars['UUID'] | null),isLabelSyncedWithName?: (Scalars['Boolean'] | null)}
export interface UpdateObjectPayload {labelSingular?: (Scalars['String'] | null),labelPlural?: (Scalars['String'] | null),nameSingular?: (Scalars['String'] | null),namePlural?: (Scalars['String'] | null),description?: (Scalars['String'] | null),icon?: (Scalars['String'] | null),shortcut?: (Scalars['String'] | null),color?: (Scalars['String'] | null),isActive?: (Scalars['Boolean'] | null),labelIdentifierFieldMetadataId?: (Scalars['UUID'] | null),imageIdentifierFieldMetadataId?: (Scalars['UUID'] | null),isLabelSyncedWithName?: (Scalars['Boolean'] | null),isSearchable?: (Scalars['Boolean'] | null)}
export interface UpdateViewFieldInput {
/** The id of the view field to update */
@@ -6527,7 +6535,7 @@ export interface CreateOneFieldMetadataInput {
/** The record to create */
field: CreateFieldInput}
export interface CreateFieldInput {type: FieldMetadataType,name: Scalars['String'],label: Scalars['String'],description?: (Scalars['String'] | null),icon?: (Scalars['String'] | null),isCustom?: (Scalars['Boolean'] | null),isActive?: (Scalars['Boolean'] | null),isSystem?: (Scalars['Boolean'] | null),isUIReadOnly?: (Scalars['Boolean'] | null),isNullable?: (Scalars['Boolean'] | null),isUnique?: (Scalars['Boolean'] | null),defaultValue?: (Scalars['JSON'] | null),options?: (Scalars['JSON'] | null),settings?: (Scalars['JSON'] | null),isLabelSyncedWithName?: (Scalars['Boolean'] | null),objectMetadataId: Scalars['UUID'],isRemoteCreation?: (Scalars['Boolean'] | null),relationCreationPayload?: (Scalars['JSON'] | null),morphRelationsCreationPayload?: (Scalars['JSON'][] | null)}
export interface CreateFieldInput {type: FieldMetadataType,name: Scalars['String'],label: Scalars['String'],description?: (Scalars['String'] | null),icon?: (Scalars['String'] | null),isCustom?: (Scalars['Boolean'] | null),isActive?: (Scalars['Boolean'] | null),isSystem?: (Scalars['Boolean'] | null),isUIReadOnly?: (Scalars['Boolean'] | null),isNullable?: (Scalars['Boolean'] | null),isUnique?: (Scalars['Boolean'] | null),defaultValue?: (Scalars['JSON'] | null),options?: (Scalars['JSON'] | null),settings?: (Scalars['JSON'] | null),objectMetadataId: Scalars['UUID'],isLabelSyncedWithName?: (Scalars['Boolean'] | null),isRemoteCreation?: (Scalars['Boolean'] | null),relationCreationPayload?: (Scalars['JSON'] | null),morphRelationsCreationPayload?: (Scalars['JSON'][] | null)}
export interface UpdateOneFieldMetadataInput {
/** The id of the record to update */
@@ -6535,7 +6543,7 @@ id: Scalars['UUID'],
/** The record to update */
update: UpdateFieldInput}
export interface UpdateFieldInput {universalIdentifier?: (Scalars['String'] | null),name?: (Scalars['String'] | null),label?: (Scalars['String'] | null),description?: (Scalars['String'] | null),icon?: (Scalars['String'] | null),isActive?: (Scalars['Boolean'] | null),isSystem?: (Scalars['Boolean'] | null),isUIReadOnly?: (Scalars['Boolean'] | null),isNullable?: (Scalars['Boolean'] | null),isUnique?: (Scalars['Boolean'] | null),defaultValue?: (Scalars['JSON'] | null),options?: (Scalars['JSON'] | null),settings?: (Scalars['JSON'] | null),isLabelSyncedWithName?: (Scalars['Boolean'] | null),morphRelationsUpdatePayload?: (Scalars['JSON'][] | null)}
export interface UpdateFieldInput {universalIdentifier?: (Scalars['String'] | null),name?: (Scalars['String'] | null),label?: (Scalars['String'] | null),description?: (Scalars['String'] | null),icon?: (Scalars['String'] | null),isActive?: (Scalars['Boolean'] | null),isSystem?: (Scalars['Boolean'] | null),isUIReadOnly?: (Scalars['Boolean'] | null),isNullable?: (Scalars['Boolean'] | null),isUnique?: (Scalars['Boolean'] | null),defaultValue?: (Scalars['JSON'] | null),options?: (Scalars['JSON'] | null),settings?: (Scalars['JSON'] | null),objectMetadataId?: (Scalars['UUID'] | null),isLabelSyncedWithName?: (Scalars['Boolean'] | null),morphRelationsUpdatePayload?: (Scalars['JSON'][] | null)}
export interface DeleteOneFieldInput {
/** The id of the field to delete. */
@@ -7591,6 +7599,14 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const UsageBreakdownItem_possibleTypes: string[] = ['UsageBreakdownItem']
export const isUsageBreakdownItem = (obj?: { __typename?: any } | null): obj is UsageBreakdownItem => {
if (!obj?.__typename) throw new Error('__typename is missing in "isUsageBreakdownItem"')
return UsageBreakdownItem_possibleTypes.includes(obj.__typename)
}
const ConfigVariable_possibleTypes: string[] = ['ConfigVariable']
export const isConfigVariable = (obj?: { __typename?: any } | null): obj is ConfigVariable => {
if (!obj?.__typename) throw new Error('__typename is missing in "isConfigVariable"')
@@ -8047,6 +8063,14 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const LogicFunctionLogs_possibleTypes: string[] = ['LogicFunctionLogs']
export const isLogicFunctionLogs = (obj?: { __typename?: any } | null): obj is LogicFunctionLogs => {
if (!obj?.__typename) throw new Error('__typename is missing in "isLogicFunctionLogs"')
return LogicFunctionLogs_possibleTypes.includes(obj.__typename)
}
const DeleteTwoFactorAuthenticationMethod_possibleTypes: string[] = ['DeleteTwoFactorAuthenticationMethod']
export const isDeleteTwoFactorAuthenticationMethod = (obj?: { __typename?: any } | null): obj is DeleteTwoFactorAuthenticationMethod => {
if (!obj?.__typename) throw new Error('__typename is missing in "isDeleteTwoFactorAuthenticationMethod"')
@@ -8215,6 +8239,30 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const UsageTimeSeries_possibleTypes: string[] = ['UsageTimeSeries']
export const isUsageTimeSeries = (obj?: { __typename?: any } | null): obj is UsageTimeSeries => {
if (!obj?.__typename) throw new Error('__typename is missing in "isUsageTimeSeries"')
return UsageTimeSeries_possibleTypes.includes(obj.__typename)
}
const UsageUserDaily_possibleTypes: string[] = ['UsageUserDaily']
export const isUsageUserDaily = (obj?: { __typename?: any } | null): obj is UsageUserDaily => {
if (!obj?.__typename) throw new Error('__typename is missing in "isUsageUserDaily"')
return UsageUserDaily_possibleTypes.includes(obj.__typename)
}
const UsageAnalytics_possibleTypes: string[] = ['UsageAnalytics']
export const isUsageAnalytics = (obj?: { __typename?: any } | null): obj is UsageAnalytics => {
if (!obj?.__typename) throw new Error('__typename is missing in "isUsageAnalytics"')
return UsageAnalytics_possibleTypes.includes(obj.__typename)
}
const DevelopmentApplication_possibleTypes: string[] = ['DevelopmentApplication']
export const isDevelopmentApplication = (obj?: { __typename?: any } | null): obj is DevelopmentApplication => {
if (!obj?.__typename) throw new Error('__typename is missing in "isDevelopmentApplication"')
@@ -8399,46 +8447,6 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const UsageBreakdownItem_possibleTypes: string[] = ['UsageBreakdownItem']
export const isUsageBreakdownItem = (obj?: { __typename?: any } | null): obj is UsageBreakdownItem => {
if (!obj?.__typename) throw new Error('__typename is missing in "isUsageBreakdownItem"')
return UsageBreakdownItem_possibleTypes.includes(obj.__typename)
}
const UsageTimeSeries_possibleTypes: string[] = ['UsageTimeSeries']
export const isUsageTimeSeries = (obj?: { __typename?: any } | null): obj is UsageTimeSeries => {
if (!obj?.__typename) throw new Error('__typename is missing in "isUsageTimeSeries"')
return UsageTimeSeries_possibleTypes.includes(obj.__typename)
}
const UsageUserDaily_possibleTypes: string[] = ['UsageUserDaily']
export const isUsageUserDaily = (obj?: { __typename?: any } | null): obj is UsageUserDaily => {
if (!obj?.__typename) throw new Error('__typename is missing in "isUsageUserDaily"')
return UsageUserDaily_possibleTypes.includes(obj.__typename)
}
const UsageAnalytics_possibleTypes: string[] = ['UsageAnalytics']
export const isUsageAnalytics = (obj?: { __typename?: any } | null): obj is UsageAnalytics => {
if (!obj?.__typename) throw new Error('__typename is missing in "isUsageAnalytics"')
return UsageAnalytics_possibleTypes.includes(obj.__typename)
}
const LogicFunctionLogs_possibleTypes: string[] = ['LogicFunctionLogs']
export const isLogicFunctionLogs = (obj?: { __typename?: any } | null): obj is LogicFunctionLogs => {
if (!obj?.__typename) throw new Error('__typename is missing in "isLogicFunctionLogs"')
return LogicFunctionLogs_possibleTypes.includes(obj.__typename)
}
const FrontComponent_possibleTypes: string[] = ['FrontComponent']
export const isFrontComponent = (obj?: { __typename?: any } | null): obj is FrontComponent => {
if (!obj?.__typename) throw new Error('__typename is missing in "isFrontComponent"')
@@ -9133,20 +9141,13 @@ export const enumFeatureFlagKey = {
IS_UNIQUE_INDEXES_ENABLED: 'IS_UNIQUE_INDEXES_ENABLED' as const,
IS_JSON_FILTER_ENABLED: 'IS_JSON_FILTER_ENABLED' as const,
IS_AI_ENABLED: 'IS_AI_ENABLED' as const,
IS_APPLICATION_ENABLED: 'IS_APPLICATION_ENABLED' as const,
IS_MARKETPLACE_ENABLED: 'IS_MARKETPLACE_ENABLED' as const,
IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED: 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED' as const,
IS_PUBLIC_DOMAIN_ENABLED: 'IS_PUBLIC_DOMAIN_ENABLED' as const,
IS_EMAILING_DOMAIN_ENABLED: 'IS_EMAILING_DOMAIN_ENABLED' as const,
IS_DASHBOARD_V2_ENABLED: 'IS_DASHBOARD_V2_ENABLED' as const,
IS_ATTACHMENT_MIGRATED: 'IS_ATTACHMENT_MIGRATED' as const,
IS_NOTE_TARGET_MIGRATED: 'IS_NOTE_TARGET_MIGRATED' as const,
IS_TASK_TARGET_MIGRATED: 'IS_TASK_TARGET_MIGRATED' as const,
IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED: 'IS_ROW_LEVEL_PERMISSION_PREDICATES_ENABLED' as const,
IS_JUNCTION_RELATIONS_ENABLED: 'IS_JUNCTION_RELATIONS_ENABLED' as const,
IS_COMMAND_MENU_ITEM_ENABLED: 'IS_COMMAND_MENU_ITEM_ENABLED' as const,
IS_NAVIGATION_MENU_ITEM_ENABLED: 'IS_NAVIGATION_MENU_ITEM_ENABLED' as const,
IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED: 'IS_DATE_TIME_WHOLE_DAY_FILTER_ENABLED' as const,
IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED: 'IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED' as const,
IS_DRAFT_EMAIL_ENABLED: 'IS_DRAFT_EMAIL_ENABLED' as const,
IS_USAGE_ANALYTICS_ENABLED: 'IS_USAGE_ANALYTICS_ENABLED' as const,
@@ -9154,7 +9155,9 @@ export const enumFeatureFlagKey = {
IS_DIRECT_GRAPHQL_EXECUTION_ENABLED: 'IS_DIRECT_GRAPHQL_EXECUTION_ENABLED' as const,
IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED: 'IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED' as const,
IS_CONNECTED_ACCOUNT_MIGRATED: 'IS_CONNECTED_ACCOUNT_MIGRATED' as const,
IS_GRAPHQL_QUERY_TIMING_ENABLED: 'IS_GRAPHQL_QUERY_TIMING_ENABLED' as const
IS_GRAPHQL_QUERY_TIMING_ENABLED: 'IS_GRAPHQL_QUERY_TIMING_ENABLED' as const,
IS_RECORD_TABLE_WIDGET_ENABLED: 'IS_RECORD_TABLE_WIDGET_ENABLED' as const,
IS_DATASOURCE_MIGRATED: 'IS_DATASOURCE_MIGRATED' as const
}
export const enumConfigSource = {
@@ -9424,6 +9427,7 @@ export const enumAllMetadataName = {
navigationMenuItem: 'navigationMenuItem' as const,
permissionFlag: 'permissionFlag' as const,
objectPermission: 'objectPermission' as const,
fieldPermission: 'fieldPermission' as const,
frontComponent: 'frontComponent' as const,
webhook: 'webhook' as const
}
@@ -9450,6 +9454,13 @@ export const enumEventLogTable = {
USAGE_EVENT: 'USAGE_EVENT' as const
}
export const enumUsageOperationType = {
AI_CHAT_TOKEN: 'AI_CHAT_TOKEN' as const,
AI_WORKFLOW_TOKEN: 'AI_WORKFLOW_TOKEN' as const,
WORKFLOW_EXECUTION: 'WORKFLOW_EXECUTION' as const,
CODE_EXECUTION: 'CODE_EXECUTION' as const
}
export const enumAnalyticsType = {
PAGEVIEW: 'PAGEVIEW' as const,
TRACK: 'TRACK' as const
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3 -5
View File
@@ -5,7 +5,7 @@
"description": "Twenty meeting recorder",
"main": ".webpack/main",
"scripts": {
"start": "concurrently \"npm run start:server\" \"npm run start:electron\"",
"start": "concurrently \"yarn start:server\" \"yarn start:electron\"",
"start:electron": "electron-forge start",
"package": "electron-forge package",
"make": "electron-forge make",
@@ -37,10 +37,8 @@
"node-loader": "^2.1.0",
"style-loader": "^3.3.4"
},
"overrides": {
"@electron/packager": {
"@electron/osx-sign": "github:recallai/osx-sign"
}
"resolutions": {
"@electron/packager/@electron/osx-sign": "github:recallai/osx-sign"
},
"dependencies": {
"@anthropic-ai/sdk": "^0.40.1",
+2
View File
@@ -16,3 +16,5 @@ STORAGE_TYPE=local
# STORAGE_S3_REGION=eu-west3
# STORAGE_S3_NAME=my-bucket
# STORAGE_S3_ENDPOINT=
# STORAGE_S3_ACCESS_KEY_ID=
# STORAGE_S3_SECRET_ACCESS_KEY=
@@ -32,11 +32,11 @@ has_schema=$(PGPASSWORD=twenty psql -h localhost -U twenty -d default -tAc \
if [ "$has_schema" = "f" ]; then
echo "Database appears to be empty, running initial setup..."
NODE_OPTIONS="--max-old-space-size=1500" node ./dist/scripts/setup-db.js
NODE_OPTIONS="--max-old-space-size=1500" node ./dist/database/scripts/setup-db.js
fi
# Always run migrations (idempotent — skips already-applied ones)
yarn database:migrate:prod
yarn database:migrate:prod --force
yarn command:prod cache:flush
yarn command:prod upgrade
+8 -7
View File
@@ -17,6 +17,7 @@ COPY ./packages/twenty-ui/package.json /app/packages/twenty-ui/
COPY ./packages/twenty-shared/package.json /app/packages/twenty-shared/
COPY ./packages/twenty-front/package.json /app/packages/twenty-front/
COPY ./packages/twenty-sdk/package.json /app/packages/twenty-sdk/
COPY ./packages/twenty-client-sdk/package.json /app/packages/twenty-client-sdk/
RUN yarn && yarn cache clean && npx nx reset
@@ -27,6 +28,7 @@ COPY ./packages/twenty-emails /app/packages/twenty-emails
COPY ./packages/twenty-shared /app/packages/twenty-shared
COPY ./packages/twenty-ui /app/packages/twenty-ui
COPY ./packages/twenty-sdk /app/packages/twenty-sdk
COPY ./packages/twenty-client-sdk /app/packages/twenty-client-sdk
COPY ./packages/twenty-server /app/packages/twenty-server
RUN npx nx run twenty-server:lingui:extract && \
@@ -36,18 +38,12 @@ RUN npx nx run twenty-server:lingui:extract && \
RUN npx nx run twenty-server:build
# Bundle setup-db script into a standalone JS file so the final image
# doesn't need tsx or the TypeScript source tree at runtime.
RUN npx esbuild packages/twenty-server/scripts/setup-db.ts \
--bundle --platform=node --outfile=packages/twenty-server/dist/scripts/setup-db.js \
--external:typeorm --external:dotenv --external:pg
# Clean server build output (type declarations and compiled tests are not needed at runtime;
# source maps are kept because twenty-infra extracts them from the image for Sentry uploads)
RUN find /app/packages/twenty-server/dist -name '*.d.ts' -delete \
&& rm -rf /app/packages/twenty-server/dist/packages/twenty-server/test
RUN yarn workspaces focus --production twenty-emails twenty-shared twenty-sdk twenty-server
RUN yarn workspaces focus --production twenty-emails twenty-shared twenty-sdk twenty-client-sdk twenty-server
FROM common-deps AS twenty-front-build
@@ -58,6 +54,7 @@ COPY ./packages/twenty-front /app/packages/twenty-front
COPY ./packages/twenty-ui /app/packages/twenty-ui
COPY ./packages/twenty-shared /app/packages/twenty-shared
COPY ./packages/twenty-sdk /app/packages/twenty-sdk
COPY ./packages/twenty-client-sdk /app/packages/twenty-client-sdk
RUN npx nx run twenty-front:lingui:extract && \
npx nx run twenty-front:lingui:compile
# To skip the memory-intensive frontend build, pre-build on the host:
@@ -106,6 +103,8 @@ COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-shared/dist /a
COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-emails/package.json /app/packages/twenty-emails/
COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-emails/dist /app/packages/twenty-emails/dist
COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-sdk/package.json /app/packages/twenty-sdk/
COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-client-sdk/package.json /app/packages/twenty-client-sdk/
COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-client-sdk/dist /app/packages/twenty-client-sdk/dist
COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-ui/package.json /app/packages/twenty-ui/
COPY --chown=1000 --from=twenty-server-build /app/packages/twenty-front/package.json /app/packages/twenty-front/
@@ -180,6 +179,8 @@ COPY --from=twenty-server-build /app/packages/twenty-shared/dist /app/packages/t
COPY --from=twenty-server-build /app/packages/twenty-emails/package.json /app/packages/twenty-emails/
COPY --from=twenty-server-build /app/packages/twenty-emails/dist /app/packages/twenty-emails/dist
COPY --from=twenty-server-build /app/packages/twenty-sdk/package.json /app/packages/twenty-sdk/
COPY --from=twenty-server-build /app/packages/twenty-client-sdk/package.json /app/packages/twenty-client-sdk/
COPY --from=twenty-server-build /app/packages/twenty-client-sdk/dist /app/packages/twenty-client-sdk/dist
COPY --from=twenty-server-build /app/packages/twenty-ui/package.json /app/packages/twenty-ui/
COPY --from=twenty-server-build /app/packages/twenty-front/package.json /app/packages/twenty-front/
+1 -2
View File
@@ -13,8 +13,7 @@ setup_and_migrate_db() {
has_schema=$(psql -tAc "SELECT EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = 'core')" ${PG_DATABASE_URL})
if [ "$has_schema" = "f" ]; then
echo "Database appears to be empty, running migrations."
NODE_OPTIONS="--max-old-space-size=1500" node ./dist/scripts/setup-db.js
yarn database:migrate:prod
yarn database:init:prod
fi
yarn command:prod cache:flush
@@ -289,6 +289,16 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead.
</Warning>
## S3 Storage
<Warning>
By default, Twenty stores uploaded files on the local filesystem. For production deployments, use S3 or an S3-compatible service (MinIO, DigitalOcean Spaces, etc.) to ensure files persist across container restarts and scale across multiple server instances.
</Warning>
Set `STORAGE_TYPE=S_3` and configure the `STORAGE_S3_*` variables through the admin panel or `.env`. See the [config-variables.ts reference](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) for the full list of S3 variables.
When using S3 with CORS-dependent features (e.g. in-browser file downloads), make sure your bucket allows your Twenty frontend origin in its CORS configuration.
## Logic Functions & Code Interpreter
Twenty supports logic functions for workflows and the code interpreter for AI data analysis. Both run user-provided code and require explicit configuration for security.
@@ -297,6 +297,16 @@ yarn command:prod cron:workflow:automated-cron-trigger
**وضع بيئي فقط:** إذا كنت قد ضبطت `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`، فأضف هذه المتغيرات إلى ملف `.env` الخاص بك بدلاً من ذلك.
</Warning>
## تخزين S3
<Warning>
افتراضياً، تقوم Twenty بتخزين الملفات المرفوعة على نظام الملفات المحلي. بالنسبة لعمليات النشر في بيئة الإنتاج، استخدم S3 أو خدمة متوافقة مع S3 (MinIO، DigitalOcean Spaces، إلخ) لضمان بقاء الملفات عبر إعادة تشغيل الحاويات وإتاحة التوسّع عبر مثيلات خوادم متعددة.
</Warning>
عيّن `STORAGE_TYPE=S_3` وقم بتهيئة متغيرات `STORAGE_S3_*` من خلال لوحة الإدارة أو `.env`. راجع [مرجع config-variables.ts](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) للاطلاع على القائمة الكاملة لمتغيرات S3.
عند استخدام S3 مع الميزات المعتمدة على CORS (مثل تنزيل الملفات داخل المتصفح)، تأكد من أن حاويتك تسمح بأصل واجهة Twenty الأمامية ضمن تهيئة CORS الخاصة بها.
## الوظائف المنطقية ومفسر الشيفرة
تدعم Twenty الوظائف المنطقية لعمليات سير العمل ومفسر الشيفرة لتحليل بيانات الذكاء الاصطناعي. كلاهما يقوم بتشغيل الشيفرة المقدمة من المستخدم ويتطلب تهيئة صريحة لأغراض الأمان.
@@ -297,6 +297,16 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Režim pouze s prostředím:** Pokud nastavíte `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, přidejte tyto proměnné do souboru `.env`
</Warning>
## Úložiště S3
<Warning>
Ve výchozím nastavení Twenty ukládá nahrané soubory do místního souborového systému. Pro produkční nasazení použijte S3 nebo službu kompatibilní se S3 (MinIO, DigitalOcean Spaces atd.). aby byly soubory zachovány při restartech kontejnerů a bylo možné škálovat napříč více instancemi serveru.
</Warning>
Nastavte `STORAGE_TYPE=S_3` a nakonfigurujte proměnné `STORAGE_S3_*` prostřednictvím administračního panelu nebo `.env`. Viz [referenci config-variables.ts](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) pro úplný seznam proměnných S3.
Při používání S3 s funkcemi závislými na CORS (např. stahování souborů v prohlížeči) se ujistěte, že váš bucket povoluje origin vašeho frontendu Twenty ve své konfiguraci CORS.
## Logické funkce a interpret kódu
Twenty podporuje logické funkce pro pracovní postupy a interpret kódu pro analýzu dat s využitím AI. Obě spouštějí kód poskytnutý uživatelem a z důvodu zabezpečení vyžadují explicitní konfiguraci.
@@ -297,6 +297,16 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Nur-Umgebungsmodus:** Wenn Sie `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` setzen, fügen Sie diese Variablen stattdessen Ihrer `.env`-Datei hinzu.
</Warning>
## S3-Speicher
<Warning>
Standardmäßig speichert Twenty hochgeladene Dateien auf dem lokalen Dateisystem. Für Produktionsbereitstellungen verwenden Sie S3 oder einen S3-kompatiblen Dienst (MinIO, DigitalOcean Spaces usw.). um sicherzustellen, dass Dateien Container-Neustarts überdauern und über mehrere Serverinstanzen skaliert werden können.
</Warning>
Setzen Sie `STORAGE_TYPE=S_3` und konfigurieren Sie die Variablen `STORAGE_S3_*` über das Admin-Panel oder `.env`. Siehe die [Referenz zu config-variables.ts](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) für die vollständige Liste der S3-Variablen.
Wenn Sie S3 mit CORS-abhängigen Funktionen verwenden (z. B. Dateidownloads im Browser), stellen Sie sicher, dass Ihr Bucket in seiner CORS-Konfiguration die Origin Ihres Twenty-Frontends zulässt.
## Logikfunktionen & Code-Interpreter
Twenty unterstützt Logikfunktionen für Workflows und den Code-Interpreter für KI-Datenanalyse. Beide führen vom Benutzer bereitgestellten Code aus und erfordern aus Sicherheitsgründen eine explizite Konfiguration.
@@ -296,6 +296,16 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Modalità solo ambiente:** Se imposti `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, aggiungi queste variabili al tuo file `.env` invece.
</Warning>
## Archiviazione S3
<Warning>
Per impostazione predefinita, Twenty archivia i file caricati nel file system locale. Per le distribuzioni in produzione, usa S3 o un servizio compatibile con S3 (MinIO, DigitalOcean Spaces, ecc.). per garantire che i file persistano tra i riavvii dei container e per poter scalare su più istanze server.
</Warning>
Imposta `STORAGE_TYPE=S_3` e configura le variabili `STORAGE_S3_*` tramite il pannello di amministrazione o `.env`. Consulta il [riferimento a config-variables.ts](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) per l'elenco completo delle variabili S3.
Quando si usa S3 con funzionalità che dipendono da CORS (ad esempio i download di file nel browser), assicurati che il tuo bucket consenta l'origine del tuo frontend di Twenty nella sua configurazione CORS.
## Funzioni logiche & interprete del codice
Twenty supporta le funzioni logiche per i workflow e l'interprete del codice per l'analisi dei dati con IA. Entrambi eseguono codice fornito dall'utente e richiedono una configurazione esplicita per motivi di sicurezza.
@@ -297,6 +297,16 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Mod doar pentru mediu:** Dacă setați `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, adăugați aceste variabile în fișierul dvs. `.env` în schimb.
</Warning>
## Stocare S3
<Warning>
În mod implicit, Twenty stochează fișierele încărcate în sistemul de fișiere local. Pentru implementări în producție, utilizați S3 sau un serviciu compatibil cu S3 (MinIO, DigitalOcean Spaces etc.). pentru a vă asigura că fișierele persistă între repornirile containerelor și se scalează pe mai multe instanțe de server.
</Warning>
Setați `STORAGE_TYPE=S_3` și configurați variabilele `STORAGE_S3_*` prin panoul de administrare sau `.env`. Consultați [referința config-variables.ts](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) pentru lista completă a variabilelor S3.
Când utilizați S3 cu funcționalități dependente de CORS (de ex., descărcări de fișiere în browser), asigurați-vă că bucketul permite originea frontend-ului Twenty în configurația sa CORS.
## Funcții logice și interpretor de cod
Twenty acceptă funcții logice pentru fluxuri de lucru și interpretorul de cod pentru analiza datelor cu AI. Ambele rulează cod furnizat de utilizator și necesită o configurare explicită din motive de securitate.
@@ -296,6 +296,16 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Режим только для среды:** если вы установили `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, добавьте эти переменные в свой `.env` файл вместо этого.
</Warning>
## S3 Storage
<Warning>
By default, Twenty stores uploaded files on the local filesystem. Для продакшн-развертываний используйте S3 или совместимый с S3 сервис (MinIO, DigitalOcean Spaces и т. д.). чтобы файлы сохранялись при перезапусках контейнеров и были доступны на нескольких экземплярах сервера при масштабировании.
</Warning>
Установите `STORAGE_TYPE=S_3` и настройте переменные `STORAGE_S3_*` через админ-панель или `.env`. См. [справочник config-variables.ts](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) для полного списка переменных S3.
При использовании S3 с функциями, зависящими от CORS (например, загрузки файлов в браузере), убедитесь, что в конфигурации CORS вашего бакета разрешен origin фронтенда Twenty.
## Логические функции и интерпретатор кода
Twenty поддерживает логические функции для рабочих процессов и интерпретатор кода для анализа данных ИИ. Оба запускают предоставленный пользователем код и требуют явной настройки в целях безопасности.
@@ -297,6 +297,16 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Çevre-yalnızca modu:** `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` ayarlarsanız, bu değişkenleri `.env` dosyanıza ekleyin.
</Warning>
## S3 Depolama
<Warning>
Varsayılan olarak, Twenty yüklenen dosyaları yerel dosya sisteminde depolar. Üretim dağıtımları için S3 veya S3 uyumlu bir hizmet (MinIO, DigitalOcean Spaces vb.) kullanın. dosyaların kapsayıcı yeniden başlatmaları arasında kalıcı olmasını ve birden çok sunucu örneği arasında ölçeklenmesini sağlamak için.
</Warning>
`STORAGE_TYPE=S_3` değerini ayarlayın ve `STORAGE_S3_*` değişkenlerini yönetici paneli veya `.env` üzerinden yapılandırın. S3 değişkenlerinin tam listesi için [config-variables.ts referansına](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) bakın.
S3'ü CORS'a bağlı özelliklerle kullanırken (örn. tarayıcı içi dosya indirmeleri), bucket'ınızın CORS yapılandırmasında Twenty frontend origin'inize izin verdiğinden emin olun.
## Mantıksal İşlevler ve Kod Yorumlayıcısı
Twenty, iş akışları için mantıksal işlevleri ve yapay zekâ veri analizi için kod yorumlayıcısını destekler. Her ikisi de kullanıcı tarafından sağlanan kodu çalıştırır ve güvenlik için açık bir yapılandırma gerektirir.
@@ -297,6 +297,16 @@ yarn command:prod cron:workflow:automated-cron-trigger
**仅限环境模式:** 如果你设置 `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`,请将这些变量添加到 `.env` 文件中。
</Warning>
## S3 存储
<Warning>
默认情况下,Twenty 将上传的文件存储在本地文件系统上。 对于生产环境部署,请使用 S3 或兼容 S3 的服务(MinIO、DigitalOcean Spaces 等)。 以确保文件在容器重启后仍然存在,并可在多个服务器实例间扩展。
</Warning>
设置 `STORAGE_TYPE=S_3`,并通过管理面板或 `.env` 配置 `STORAGE_S3_*` 变量。 有关 S3 变量的完整列表,请参见[config-variables.ts 参考](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)。
在将 S3 与依赖 CORS 的功能(例如浏览器内文件下载)一起使用时,请确保你的存储桶在其 CORS 配置中允许你的 Twenty 前端来源。
## 逻辑函数与代码解释器
Twenty 支持用于工作流的逻辑函数,以及用于 AI 数据分析的代码解释器。 二者都会运行用户提供的代码,并要求进行显式配置以确保安全。
+2 -2
View File
@@ -91,7 +91,7 @@ msgstr "Einladung akzeptieren"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your new email address"
msgstr ""
msgstr "Bestätige deine neue E-Mail-Adresse"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
@@ -101,7 +101,7 @@ msgstr "Bestätigen Sie Ihre E-Mail-Adresse"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm new email"
msgstr ""
msgstr "Neue E-Mail-Adresse bestätigen"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
@@ -1 +1 @@
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"Suspended Workspace\":[\"Ausgesetzter Arbeitsbereich\"],\"Dear {userName},\":[\"Sehr geehrte/r \",[\"userName\"],\",\"],\"Hello,\":[\"Hallo,\"],\"It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days.\":[\"Es scheint, dass Ihr Workspace <0>\",[\"workspaceDisplayName\"],\"</0> seit \",[\"daysSinceInactive\"],\" Tagen gesperrt ist.\"],\"The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted.\":[\"Der Workspace wird in \",[\"remainingDays\"],\" \",[\"dayOrDays\"],\" deaktiviert, und alle Daten werden gelöscht.\"],\"If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}.\":[\"Wenn Sie Twenty weiterhin nutzen möchten, aktualisieren Sie bitte Ihr Abonnement innerhalb der nächsten \",[\"remainingDays\"],\" \",[\"dayOrDays\"],\".\"],\"Update your subscription\":[\"Aktualisieren Sie Ihr Abonnement\"],\"Validate domain\":[\"Domain validieren\"],\"{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation.\":[[\"senderName\"],\" (<0>\",[\"senderEmail\"],\"</0>): Bitte validieren Sie diese Domain, damit Benutzer mit <1>@\",[\"domain\"],\"</1> E-Mail-Adressen Ihrem Arbeitsbereich beitreten können, ohne eine Einladung zu benötigen.\"],\"Test email\":[\"Test E-Mail\"],\"Join your team on Twenty\":[\"Treten Sie Ihrem Team auf Twenty bei\"],\"{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>.\":[[\"senderName\"],\" (<0>\",[\"senderEmail\"],\"</0>) hat Sie eingeladen, einem Arbeitsbereich namens <1>\",[\"workspaceName\"],\"</1> beizutreten.\"],\"Accept invite\":[\"Einladung akzeptieren\"],\"Confirm your new email address\":[\"Confirm your new email address\"],\"Confirm your email address\":[\"Bestätigen Sie Ihre E-Mail-Adresse\"],\"Confirm new email\":[\"Confirm new email\"],\"Verify Email\":[\"E-Mail verifizieren\"],\"Password updated\":[\"Passwort wurde aktualisiert\"],\"This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}.\":[\"Dies ist eine Bestätigung, dass das Passwort für Ihr Konto (\",[\"email\"],\") am \",[\"formattedDate\"],\" erfolgreich geändert wurde.\"],\"If you did not initiate this change, please contact your workspace owner immediately.\":[\"Wenn Sie diese Änderung nicht veranlasst haben, kontaktieren Sie bitte umgehend den Eigentümer Ihres Workspaces.\"],\"Connect to Twenty\":[\"Mit Twenty verbinden\"],\"Reset your password 🗝\":[\"Setzen Sie Ihr Passwort zurück 🗝\"],\"Set your password 🗝\":[\"Setze dein Passwort 🗝\"],\"Reset\":[\"Zurücksetzen\"],\"Set\":[\"Setzen\"],\"This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:\":[\"Dieser Link ist nur für die nächsten \",[\"duration\"],\" gültig. Wenn der Link nicht funktioniert, können Sie den Anmeldebestätigungslink direkt verwenden:\"],\"Deleted Workspace\":[\"Gelöschter Arbeitsbereich\"],\"Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago.\":[\"Ihr Workspace <0>\",[\"workspaceDisplayName\"],\"</0> wurde gelöscht, da Ihr Abonnement vor \",[\"daysSinceInactive\"],\" Tagen abgelaufen ist.\"],\"All data in this workspace has been permanently deleted.\":[\"Alle Daten in diesem Workspace wurden dauerhaft gelöscht.\"],\"If you wish to use Twenty again, you can create a new workspace.\":[\"Wenn Sie Twenty erneut nutzen möchten, können Sie einen neuen Workspace erstellen.\"],\"Create a new workspace\":[\"Erstellen Sie einen neuen Arbeitsbereich\"],\"What is Twenty?\":[\"Was ist Twenty?\"],\"It's a CRM, a software to help businesses manage their customer data and relationships efficiently.\":[\"Es ist ein CRM, eine Software, die Unternehmen hilft, ihre Kundendaten und -beziehungen effizient zu verwalten.\"],\"Website\":[\"Website\"],\"Visit Twenty's website\":[\"Besuchen Sie die Twenty-Website\"],\"Github\":[\"GitHub\"],\"Visit Twenty's GitHub repository\":[\"Besuchen Sie das GitHub-Repository von Twenty\"],\"User guide\":[\"Benutzerhandbuch\"],\"Read Twenty's user guide\":[\"Lesen Sie das Benutzerhandbuch von Twenty\"],\"Developers\":[\"Entwickler\"],\"Visit Twenty's developer documentation\":[\"Besuchen Sie die Entwicklerdokumentation von Twenty\"],\"Twenty.com, Public Benefit Corporation\":[\"Twenty.com, Gemeinnützige Aktiengesellschaft\"],\"San Francisco / Paris\":[\"San Francisco / Paris\"]}")as Messages;
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"Suspended Workspace\":[\"Ausgesetzter Arbeitsbereich\"],\"Dear {userName},\":[\"Sehr geehrte/r \",[\"userName\"],\",\"],\"Hello,\":[\"Hallo,\"],\"It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days.\":[\"Es scheint, dass Ihr Workspace <0>\",[\"workspaceDisplayName\"],\"</0> seit \",[\"daysSinceInactive\"],\" Tagen gesperrt ist.\"],\"The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted.\":[\"Der Workspace wird in \",[\"remainingDays\"],\" \",[\"dayOrDays\"],\" deaktiviert, und alle Daten werden gelöscht.\"],\"If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}.\":[\"Wenn Sie Twenty weiterhin nutzen möchten, aktualisieren Sie bitte Ihr Abonnement innerhalb der nächsten \",[\"remainingDays\"],\" \",[\"dayOrDays\"],\".\"],\"Update your subscription\":[\"Aktualisieren Sie Ihr Abonnement\"],\"Validate domain\":[\"Domain validieren\"],\"{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation.\":[[\"senderName\"],\" (<0>\",[\"senderEmail\"],\"</0>): Bitte validieren Sie diese Domain, damit Benutzer mit <1>@\",[\"domain\"],\"</1> E-Mail-Adressen Ihrem Arbeitsbereich beitreten können, ohne eine Einladung zu benötigen.\"],\"Test email\":[\"Test E-Mail\"],\"Join your team on Twenty\":[\"Treten Sie Ihrem Team auf Twenty bei\"],\"{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>.\":[[\"senderName\"],\" (<0>\",[\"senderEmail\"],\"</0>) hat Sie eingeladen, einem Arbeitsbereich namens <1>\",[\"workspaceName\"],\"</1> beizutreten.\"],\"Accept invite\":[\"Einladung akzeptieren\"],\"Confirm your new email address\":[\"Bestätige deine neue E-Mail-Adresse\"],\"Confirm your email address\":[\"Bestätigen Sie Ihre E-Mail-Adresse\"],\"Confirm new email\":[\"Neue E-Mail-Adresse bestätigen\"],\"Verify Email\":[\"E-Mail verifizieren\"],\"Password updated\":[\"Passwort wurde aktualisiert\"],\"This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}.\":[\"Dies ist eine Bestätigung, dass das Passwort für Ihr Konto (\",[\"email\"],\") am \",[\"formattedDate\"],\" erfolgreich geändert wurde.\"],\"If you did not initiate this change, please contact your workspace owner immediately.\":[\"Wenn Sie diese Änderung nicht veranlasst haben, kontaktieren Sie bitte umgehend den Eigentümer Ihres Workspaces.\"],\"Connect to Twenty\":[\"Mit Twenty verbinden\"],\"Reset your password 🗝\":[\"Setzen Sie Ihr Passwort zurück 🗝\"],\"Set your password 🗝\":[\"Setze dein Passwort 🗝\"],\"Reset\":[\"Zurücksetzen\"],\"Set\":[\"Setzen\"],\"This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:\":[\"Dieser Link ist nur für die nächsten \",[\"duration\"],\" gültig. Wenn der Link nicht funktioniert, können Sie den Anmeldebestätigungslink direkt verwenden:\"],\"Deleted Workspace\":[\"Gelöschter Arbeitsbereich\"],\"Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago.\":[\"Ihr Workspace <0>\",[\"workspaceDisplayName\"],\"</0> wurde gelöscht, da Ihr Abonnement vor \",[\"daysSinceInactive\"],\" Tagen abgelaufen ist.\"],\"All data in this workspace has been permanently deleted.\":[\"Alle Daten in diesem Workspace wurden dauerhaft gelöscht.\"],\"If you wish to use Twenty again, you can create a new workspace.\":[\"Wenn Sie Twenty erneut nutzen möchten, können Sie einen neuen Workspace erstellen.\"],\"Create a new workspace\":[\"Erstellen Sie einen neuen Arbeitsbereich\"],\"What is Twenty?\":[\"Was ist Twenty?\"],\"It's a CRM, a software to help businesses manage their customer data and relationships efficiently.\":[\"Es ist ein CRM, eine Software, die Unternehmen hilft, ihre Kundendaten und -beziehungen effizient zu verwalten.\"],\"Website\":[\"Website\"],\"Visit Twenty's website\":[\"Besuchen Sie die Twenty-Website\"],\"Github\":[\"GitHub\"],\"Visit Twenty's GitHub repository\":[\"Besuchen Sie das GitHub-Repository von Twenty\"],\"User guide\":[\"Benutzerhandbuch\"],\"Read Twenty's user guide\":[\"Lesen Sie das Benutzerhandbuch von Twenty\"],\"Developers\":[\"Entwickler\"],\"Visit Twenty's developer documentation\":[\"Besuchen Sie die Entwicklerdokumentation von Twenty\"],\"Twenty.com, Public Benefit Corporation\":[\"Twenty.com, Gemeinnützige Aktiengesellschaft\"],\"San Francisco / Paris\":[\"San Francisco / Paris\"]}")as Messages;
@@ -1 +1 @@
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"Suspended Workspace\":[\"Felfüggesztett munkaterület\"],\"Dear {userName},\":[\"Kedves \",[\"userName\"],\",\"],\"Hello,\":[\"Üdvözlöm,\"],\"It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days.\":[\"Úgy tűnik, hogy a munkaterülete <0>\",[\"workspaceDisplayName\"],\"</0> felfüggesztésre került \",[\"daysSinceInactive\"],\" napja.\"],\"The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted.\":[\"A munkaterület \",[\"remainingDays\"],\" \",[\"dayOrDays\"],\" múlva lesz deaktiválva, és minden adat törlésre kerül.\"],\"If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}.\":[\"Amennyiben szeretné folytatni a Twenty használatát, kérjük frissítse előfizetését a következő \",[\"remainingDays\"],\" \",[\"dayOrDays\"],\" időszakban.\"],\"Update your subscription\":[\"Előfizetés frissítése\"],\"Validate domain\":[\"Domain érvényesítése\"],\"{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation.\":[[\"senderName\"],\" (<0>\",[\"senderEmail\"],\"</0>): Kérjük, érvényesítse ezt a domaint annak érdekében, hogy az <1>@\",[\"domain\"],\"</1> e-mail címmel rendelkező felhasználók meghívó nélkül csatlakozhassanak a munkaterületéhez.\"],\"Test email\":[\"Teszt e-mail\"],\"Join your team on Twenty\":[\"Csatlakozzon a csapatához a Twentyn\"],\"{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>.\":[[\"senderName\"],\" (<0>\",[\"senderEmail\"],\"</0>) meghívta önt, hogy csatlakozzon egy <1>\",[\"workspaceName\"],\"</1> nevű munkaterülethez.\"],\"Accept invite\":[\"Meghívó elfogadása\"],\"Confirm your new email address\":[\"Confirm your new email address\"],\"Confirm your email address\":[\"Erősítse meg email címét\"],\"Confirm new email\":[\"Confirm new email\"],\"Verify Email\":[\"Email ellenőrzése\"],\"Password updated\":[\"Jelszó frissítve\"],\"This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}.\":[\"Ez egy megerősítés arról, hogy fiókja jelszavát (\",[\"email\"],\") sikeresen megváltoztatták \",[\"formattedDate\"],\" napján.\"],\"If you did not initiate this change, please contact your workspace owner immediately.\":[\"Amennyiben Ön nem kezdeményezte ezt a változtatást, kérjük azonnal lépjen kapcsolatba a munkaterület tulajdonosával.\"],\"Connect to Twenty\":[\"Csatlakozás a Twentyhez\"],\"Reset your password 🗝\":[\"Jelszó visszaállítása 🗝\"],\"Set your password 🗝\":[\"Adja meg a jelszavát 🗝\"],\"Reset\":[\"Visszaállítás\"],\"Set\":[\"Beállítás\"],\"This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:\":[\"Ez a hivatkozás csak a következő \",[\"duration\"],\" ideig érvényes. Ha a hivatkozás nem működik, használhatja közvetlenül a belépés ellenőrző hivatkozását:\"],\"Deleted Workspace\":[\"Törölt munkaterület\"],\"Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago.\":[\"Munkaterülete <0>\",[\"workspaceDisplayName\"],\"</0> törlésre került, mivel előfizetése \",[\"daysSinceInactive\"],\" nappal ezelőtt lejárt.\"],\"All data in this workspace has been permanently deleted.\":[\"A munkaterület minden adata végérvényesen törlésre került.\"],\"If you wish to use Twenty again, you can create a new workspace.\":[\"Ha újra szeretné használni a Twenty-t, létrehozhat egy új munkaterületet.\"],\"Create a new workspace\":[\"Hozzon létre új munkaterületet\"],\"What is Twenty?\":[\"Mi az a Twenty?\"],\"It's a CRM, a software to help businesses manage their customer data and relationships efficiently.\":[\"Ez egy CRM, egy szoftver, amely segíti a vállalkozásokat az ügyféladataik és kapcsolataik hatékony kezelésében.\"],\"Website\":[\"Weboldal\"],\"Visit Twenty's website\":[\"Látogasson el a Twenty weboldalára\"],\"Github\":[\"Github\"],\"Visit Twenty's GitHub repository\":[\"Látogasson el a Twenty GitHub tárházához\"],\"User guide\":[\"Felhasználói útmutató\"],\"Read Twenty's user guide\":[\"Olvassa el a Twenty felhasználói útmutatóját\"],\"Developers\":[\"Fejlesztők\"],\"Visit Twenty's developer documentation\":[\"Látogasson el a Twenty fejlesztői dokumentációjához\"],\"Twenty.com, Public Benefit Corporation\":[\"Twenty.com, Közhasznú Vállalat\"],\"San Francisco / Paris\":[\"San Francisco / Párizs\"]}")as Messages;
/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"Suspended Workspace\":[\"Felfüggesztett munkaterület\"],\"Dear {userName},\":[\"Kedves \",[\"userName\"],\",\"],\"Hello,\":[\"Üdvözlöm,\"],\"It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days.\":[\"Úgy tűnik, hogy a munkaterülete <0>\",[\"workspaceDisplayName\"],\"</0> felfüggesztésre került \",[\"daysSinceInactive\"],\" napja.\"],\"The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted.\":[\"A munkaterület \",[\"remainingDays\"],\" \",[\"dayOrDays\"],\" múlva lesz deaktiválva, és minden adat törlésre kerül.\"],\"If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}.\":[\"Amennyiben szeretné folytatni a Twenty használatát, kérjük frissítse előfizetését a következő \",[\"remainingDays\"],\" \",[\"dayOrDays\"],\" időszakban.\"],\"Update your subscription\":[\"Előfizetés frissítése\"],\"Validate domain\":[\"Domain érvényesítése\"],\"{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation.\":[[\"senderName\"],\" (<0>\",[\"senderEmail\"],\"</0>): Kérjük, érvényesítse ezt a domaint annak érdekében, hogy az <1>@\",[\"domain\"],\"</1> e-mail címmel rendelkező felhasználók meghívó nélkül csatlakozhassanak a munkaterületéhez.\"],\"Test email\":[\"Teszt e-mail\"],\"Join your team on Twenty\":[\"Csatlakozzon a csapatához a Twentyn\"],\"{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>.\":[[\"senderName\"],\" (<0>\",[\"senderEmail\"],\"</0>) meghívta önt, hogy csatlakozzon egy <1>\",[\"workspaceName\"],\"</1> nevű munkaterülethez.\"],\"Accept invite\":[\"Meghívó elfogadása\"],\"Confirm your new email address\":[\"Erősítsd meg az új e-mail címed\"],\"Confirm your email address\":[\"Erősítse meg email címét\"],\"Confirm new email\":[\"Új e-mail megerősítése\"],\"Verify Email\":[\"Email ellenőrzése\"],\"Password updated\":[\"Jelszó frissítve\"],\"This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}.\":[\"Ez egy megerősítés arról, hogy fiókja jelszavát (\",[\"email\"],\") sikeresen megváltoztatták \",[\"formattedDate\"],\" napján.\"],\"If you did not initiate this change, please contact your workspace owner immediately.\":[\"Amennyiben Ön nem kezdeményezte ezt a változtatást, kérjük azonnal lépjen kapcsolatba a munkaterület tulajdonosával.\"],\"Connect to Twenty\":[\"Csatlakozás a Twentyhez\"],\"Reset your password 🗝\":[\"Jelszó visszaállítása 🗝\"],\"Set your password 🗝\":[\"Adja meg a jelszavát 🗝\"],\"Reset\":[\"Visszaállítás\"],\"Set\":[\"Beállítás\"],\"This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:\":[\"Ez a hivatkozás csak a következő \",[\"duration\"],\" ideig érvényes. Ha a hivatkozás nem működik, használhatja közvetlenül a belépés ellenőrző hivatkozását:\"],\"Deleted Workspace\":[\"Törölt munkaterület\"],\"Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago.\":[\"Munkaterülete <0>\",[\"workspaceDisplayName\"],\"</0> törlésre került, mivel előfizetése \",[\"daysSinceInactive\"],\" nappal ezelőtt lejárt.\"],\"All data in this workspace has been permanently deleted.\":[\"A munkaterület minden adata végérvényesen törlésre került.\"],\"If you wish to use Twenty again, you can create a new workspace.\":[\"Ha újra szeretné használni a Twenty-t, létrehozhat egy új munkaterületet.\"],\"Create a new workspace\":[\"Hozzon létre új munkaterületet\"],\"What is Twenty?\":[\"Mi az a Twenty?\"],\"It's a CRM, a software to help businesses manage their customer data and relationships efficiently.\":[\"Ez egy CRM, egy szoftver, amely segíti a vállalkozásokat az ügyféladataik és kapcsolataik hatékony kezelésében.\"],\"Website\":[\"Weboldal\"],\"Visit Twenty's website\":[\"Látogasson el a Twenty weboldalára\"],\"Github\":[\"Github\"],\"Visit Twenty's GitHub repository\":[\"Látogasson el a Twenty GitHub tárházához\"],\"User guide\":[\"Felhasználói útmutató\"],\"Read Twenty's user guide\":[\"Olvassa el a Twenty felhasználói útmutatóját\"],\"Developers\":[\"Fejlesztők\"],\"Visit Twenty's developer documentation\":[\"Látogasson el a Twenty fejlesztői dokumentációjához\"],\"Twenty.com, Public Benefit Corporation\":[\"Twenty.com, Közhasznú Vállalat\"],\"San Francisco / Paris\":[\"San Francisco / Párizs\"]}")as Messages;
+2 -2
View File
@@ -91,7 +91,7 @@ msgstr "Meghívó elfogadása"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your new email address"
msgstr ""
msgstr "Erősítsd meg az új e-mail címed"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
@@ -101,7 +101,7 @@ msgstr "Erősítse meg email címét"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm new email"
msgstr ""
msgstr "Új e-mail megerősítése"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
+1 -1
View File
@@ -61,7 +61,7 @@ const jestConfig = {
extensionsToTreatAsEsm: ['.ts', '.tsx'],
coverageThreshold: {
global: {
statements: 48.5,
statements: 48.4,
lines: 47.0,
functions: 39.5,
},
Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+312 -83
View File
@@ -149,19 +149,16 @@ msgid "{0, plural, one {You do not have permission to access the {fieldsList} fi
msgstr "{0, plural, one {You do not have permission to access the {fieldsList} field} other {You do not have permission to access the {fieldsList} fields}}"
#. js-lingui-id: dNIJYp
#. placeholder {0}: formatNumber(totalCredits)
#. placeholder {0}: formatNumber(datum.value)
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/modules/settings/usage/components/UsagePieChart.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "{0} credits"
msgstr "{0} credits"
#. js-lingui-id: m8fdzW
#. placeholder {0}: formatNumber(totalCredits)
#. js-lingui-id: r4l/MK
#. placeholder {0}: formatUsageValue(totalCredits)
#: src/pages/settings/SettingsUsageUserDetail.tsx
msgid "{0} credits used"
msgstr "{0} credits used"
msgid "{0} used"
msgstr "{0} used"
#. js-lingui-id: qdQhzv
#: src/modules/views/advanced-filter-chip/components/AdvancedFilterChip.tsx
@@ -501,10 +498,10 @@ msgstr "1. Type"
msgid "10,000 workflow node executions"
msgstr "10,000 workflow node executions"
#. js-lingui-id: bM5lnW
#. js-lingui-id: rU05hS
#: src/modules/settings/experience/components/DateTimeSettingsTimeFormatSelect.tsx
msgid "12h - {hour12Label}"
msgstr "12h - {hour12Label}"
msgid "12h"
msgstr "12h"
#. js-lingui-id: 4EdXYs
#: src/pages/settings/profile/appearance/components/DateTimeSettingsTimeFormatSelect.tsx
@@ -537,10 +534,10 @@ msgstr "20,000 workflow node executions"
msgid "200 OK - {duration}ms"
msgstr "200 OK - {duration}ms"
#. js-lingui-id: mwTnop
#. js-lingui-id: W1k7eB
#: src/modules/settings/experience/components/DateTimeSettingsTimeFormatSelect.tsx
msgid "24h - {hour24Label}"
msgstr "24h - {hour24Label}"
msgid "24h"
msgstr "24h"
#. js-lingui-id: QsMprd
#: src/pages/settings/profile/appearance/components/DateTimeSettingsTimeFormatSelect.tsx
@@ -765,6 +762,7 @@ msgstr "Actions users can perform on this object"
#: src/modules/settings/security/components/SSO/SettingsSecuritySSORowDropdownMenu.tsx
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/components/SettingsEnterpriseFeatureGateCard.tsx
#: src/modules/information-banner/components/enterprise/InformationBannerLegacyEnterpriseKey.tsx
#: src/modules/command-menu-item/record/constants/WorkflowCommandMenuItemsConfig.tsx
msgid "Activate"
@@ -1323,6 +1321,7 @@ msgstr "Aggregate Chart"
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
#: src/pages/settings/ai/SettingsAgentForm.tsx
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/SettingsAIPrompts.tsx
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/SettingsAI.tsx
@@ -1341,6 +1340,16 @@ msgstr "AI"
msgid "AI Chat"
msgstr "AI Chat"
#. js-lingui-id: E/lGXl
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "AI consumption across all workspaces."
msgstr "AI consumption across all workspaces."
#. js-lingui-id: kkfXGh
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI consumption over time."
msgstr "AI consumption over time."
#. js-lingui-id: kNfr85
#: src/pages/settings/ai/forms/components/SettingsAIAgentForm.tsx
#: src/pages/settings/ai/components/SettingsAgentSettingsTab.tsx
@@ -1363,6 +1372,61 @@ msgstr "AI request prep"
msgid "AI Response Schema"
msgstr "AI Response Schema"
#. js-lingui-id: tzhisR
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI Usage"
msgstr "AI Usage"
#. js-lingui-id: Ad11E9
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "AI usage analytics across workspaces is available with an Enterprise key."
msgstr "AI usage analytics across workspaces is available with an Enterprise key."
#. js-lingui-id: zkptxb
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI usage analytics is available with an Enterprise key."
msgstr "AI usage analytics is available with an Enterprise key."
#. js-lingui-id: U2F/HK
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI usage analytics requires ClickHouse. Contact your administrator."
msgstr "AI usage analytics requires ClickHouse. Contact your administrator."
#. js-lingui-id: SknniY
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI Usage by Model"
msgstr "AI Usage by Model"
#. js-lingui-id: ehjYr9
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI Usage by Type"
msgstr "AI Usage by Type"
#. js-lingui-id: X2afmM
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI Usage by User"
msgstr "AI Usage by User"
#. js-lingui-id: jyqPfh
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "AI Usage by Workspace"
msgstr "AI Usage by Workspace"
#. js-lingui-id: KLyZ6L
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
msgid "AI User Usage"
msgstr "AI User Usage"
#. js-lingui-id: TLbVxH
#: src/modules/settings/usage/utils/getOperationTypeLabel.ts
msgid "AI Workflow"
msgstr "AI Workflow"
#. js-lingui-id: BAiyFV
#: src/pages/settings/admin-panel/SettingsAdminNewAiProvider.tsx
msgid "AKIA..."
@@ -1451,6 +1515,11 @@ msgstr "All Members"
msgid "All Metadata"
msgstr "All Metadata"
#. js-lingui-id: zIk4M6
#: src/modules/side-panel/components/SidePanelObjectFilterDropdownContent.tsx
msgid "All objects"
msgstr "All objects"
#. js-lingui-id: aFE/OW
#: src/pages/settings/security/event-logs/components/EventLogFilters.tsx
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsTableHeader.tsx
@@ -1741,6 +1810,11 @@ msgstr "API Key copied to clipboard"
msgid "API key is required"
msgstr "API key is required"
#. js-lingui-id: sb6i1L
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
msgid "API key name cannot be empty"
msgstr "API key name cannot be empty"
#. js-lingui-id: Widx6n
#: src/modules/settings/roles/components/SettingsRolesList.tsx
msgid "API key roles"
@@ -1806,10 +1880,10 @@ msgstr "APIs"
msgid "APIs & Webhooks"
msgstr "APIs & Webhooks"
#. js-lingui-id: BnUHmx
#. js-lingui-id: 0UMxlw
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
msgid "Apostrophe and dot - {apostropheAndDotExample}"
msgstr "Apostrophe and dot - {apostropheAndDotExample}"
msgid "Apostrophe and dot"
msgstr "Apostrophe and dot"
#. js-lingui-id: LMUw1U
#: src/pages/settings/data-model/SettingsObjectFieldTable.tsx
@@ -2357,6 +2431,11 @@ msgstr "Because this workflow is not using a manual trigger, the form will not o
msgid "Before"
msgstr "Before"
#. js-lingui-id: KYr9vA
#: src/pages/settings/ai/components/SettingsAIModelsTab.tsx
msgid "Best"
msgstr "Best"
#. js-lingui-id: NgFKo1
#: src/modules/workflow/workflow-trigger/utils/cron-to-human/descriptors/getMonthsDescription.ts
msgid "between {startMonth} and {endMonth}"
@@ -2378,6 +2457,8 @@ msgid "between the {startOrdinal} and {endOrdinal} of the month"
msgstr "between the {startOrdinal} and {endOrdinal} of the month"
#. js-lingui-id: R+w/Va
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
#: src/pages/settings/SettingsBilling.tsx
#: src/pages/settings/SettingsBilling.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
@@ -2440,6 +2521,12 @@ msgstr "Boolean"
msgid "Both"
msgstr "Both"
#. js-lingui-id: 1hGdwj
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "Breakdown across AI models."
msgstr "Breakdown across AI models."
#. js-lingui-id: qDsMss
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowOutputSchemaBuilder.tsx
msgid "Brief explanation of this output field"
@@ -2925,6 +3012,7 @@ msgid "Clear the field or \"X\" to revert to environment/default value."
msgstr "Clear the field or \"X\" to revert to environment/default value."
#. js-lingui-id: Gt8ndY
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "Click a user to see their daily breakdown."
msgstr "Click a user to see their daily breakdown."
@@ -2966,6 +3054,8 @@ msgstr "ClickHouse is required for audit logs. Contact your administrator."
#. js-lingui-id: CTdw8/
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "ClickHouse Not Configured"
msgstr "ClickHouse Not Configured"
@@ -3008,6 +3098,7 @@ msgstr "Close banner"
#. js-lingui-id: saip/v
#: src/modules/ui/layout/page-header/components/PageHeaderToggleSidePanelButton.tsx
#: src/modules/command-menu-item/server-items/display/components/CommandMenuItemMoreActionsButton.tsx
msgid "Close side panel"
msgstr "Close side panel"
@@ -3104,10 +3195,10 @@ msgstr "command menu item"
msgid "Commands copied to clipboard"
msgstr "Commands copied to clipboard"
#. js-lingui-id: A9u+7N
#. js-lingui-id: QeCopv
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
msgid "Commas and dot - {commasAndDotExample}"
msgstr "Commas and dot - {commasAndDotExample}"
msgid "Commas and dot"
msgstr "Commas and dot"
#. js-lingui-id: NBdIgR
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
@@ -3213,6 +3304,11 @@ msgstr "Configure default AI models and availability"
msgid "Configure fallback login methods for users with SSO bypass permissions"
msgstr "Configure fallback login methods for users with SSO bypass permissions"
#. js-lingui-id: OLqG0t
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Configure how this object appears in search results"
msgstr "Configure how this object appears in search results"
#. js-lingui-id: ghdb7+
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Configure how we should display your events in your calendar"
@@ -3377,6 +3473,7 @@ msgstr "Content"
#. js-lingui-id: M73whl
#: src/modules/side-panel/pages/root/components/SidePanelRootPage.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAiModelHoverCard.tsx
#: src/modules/command-menu-item/server-items/display/components/SidePanelCommandMenuItemDisplayPage.tsx
#: src/modules/ai/components/RoutingDebugDisplay.tsx
msgid "Context"
msgstr "Context"
@@ -3868,6 +3965,7 @@ msgstr "Creating your workspace"
#. js-lingui-id: HAzhV7
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Credentials"
msgstr "Credentials"
@@ -3896,16 +3994,9 @@ msgstr "Credit Usage"
msgid "Credit usage breakdown for your workspace."
msgstr "Credit usage breakdown for your workspace."
#. js-lingui-id: UQ4Hjl
#: src/modules/ai/components/internal/AIChatContextUsageButton.tsx
#: src/modules/ai/components/internal/AIChatContextUsageButton.tsx
msgid "credits"
msgstr "credits"
#. js-lingui-id: lDIOek
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "Credits"
msgstr "Credits"
@@ -4096,6 +4187,12 @@ msgstr "Cyan"
msgid "Czech"
msgstr "Czech"
#. js-lingui-id: ShUrwO
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "Daily AI Usage"
msgstr "Daily AI Usage"
#. js-lingui-id: KXQkvT
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
@@ -4209,6 +4306,7 @@ msgstr "Data Residency"
#. js-lingui-id: r+cVRP
#: src/pages/settings/data-model/SettingsObjectFieldTable.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/field-permissions/components/SettingsRolePermissionsObjectLevelObjectFieldPermissionTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Data type"
msgstr "Data type"
@@ -4340,7 +4438,7 @@ msgstr "Deactivate Workflow"
#. js-lingui-id: yAT3be
#: src/pages/settings/SettingsProfile.tsx
#: src/pages/settings/data-model/SettingsObjectTable.tsx
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationItemTableRow.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectItemTableRow.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldItemTableRow.tsx
@@ -4358,6 +4456,11 @@ msgstr "Debug Info"
msgid "Decide which Sub-address fields you want to display"
msgstr "Decide which Sub-address fields you want to display"
#. js-lingui-id: Bn9+El
#: src/modules/ai/components/AIChatEditorSection.tsx
msgid "default"
msgstr "default"
#. js-lingui-id: ovBPCi
#: src/modules/settings/data-model/fields/forms/date/utils/getDisplayFormatLabel.ts
#: src/modules/settings/data-model/fields/forms/address/components/MultiSelectAddressFields.tsx
@@ -4926,10 +5029,10 @@ msgstr "Don't create contacts from/to Gmail, Outlook emails"
msgid "Don't sync emails from team@ support@ noreply@..."
msgstr "Don't sync emails from team@ support@ noreply@..."
#. js-lingui-id: bd+DPX
#. js-lingui-id: Wm78zZ
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
msgid "Dots and comma - {dotsAndCommaExample}"
msgstr "Dots and comma - {dotsAndCommaExample}"
msgid "Dots and comma"
msgstr "Dots and comma"
#. js-lingui-id: LE8J+K
#: src/modules/settings/billing/components/internal/MeteredPriceSelector.tsx
@@ -5149,6 +5252,13 @@ msgstr "Edit {objectLabelPlural}"
msgid "Edit Account"
msgstr "Edit Account"
#. js-lingui-id: t1EOLt
#: src/modules/layout-customization/hooks/useEnterLayoutCustomizationMode.ts
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditButton.tsx
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditButton.tsx
msgid "Edit actions"
msgstr "Edit actions"
#. js-lingui-id: GpnfNN
#: src/modules/command-menu-item/record/constants/DashboardCommandMenuItemsConfig.tsx
msgid "Edit Dashboard"
@@ -5736,11 +5846,18 @@ msgstr "Enter your API key"
#: src/pages/settings/security/SettingsSecurity.tsx
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "Enterprise"
msgstr "Enterprise"
#. js-lingui-id: rmZVdg
#: src/modules/settings/components/SettingsEnterpriseFeatureGateCard.tsx
msgid "Enterprise feature"
msgstr "Enterprise feature"
#. js-lingui-id: Kjjkt3
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
msgid "Enterprise Feature"
@@ -6350,7 +6467,7 @@ msgid "Failed to activate enterprise license. Please check your key or contact s
msgstr "Failed to activate enterprise license. Please check your key or contact support."
#. js-lingui-id: vJiM7T
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Failed to activate skill"
msgstr "Failed to activate skill"
@@ -6375,7 +6492,7 @@ msgid "Failed to delete jobs. Please try again later."
msgstr "Failed to delete jobs. Please try again later."
#. js-lingui-id: bmwWKk
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Failed to delete skill"
msgstr "Failed to delete skill"
@@ -6645,6 +6762,11 @@ msgstr "Field Name"
msgid "Field on destination"
msgstr "Field on destination"
#. js-lingui-id: P8JCfj
#: src/modules/metadata-error-handler/hooks/useMetadataErrorHandler.ts
msgid "field permission"
msgstr "field permission"
#. js-lingui-id: RnX5oc
#: src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
msgid "fields"
@@ -6748,9 +6870,6 @@ msgid "Files"
msgstr "Files"
#. js-lingui-id: o7J4JM
#: src/pages/settings/data-model/SettingsObjectFieldTable.tsx
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAIAgentsTable.tsx
#: src/modules/workflow/workflow-steps/workflow-actions/find-records-action/components/WorkflowEditActionFindRecords.tsx
#: src/modules/views/components/ViewBarFilterDropdownFieldSelectMenu.tsx
#: src/modules/views/components/ViewBarFilterButton.tsx
@@ -6767,6 +6886,11 @@ msgstr "Filter"
msgid "Filter by event"
msgstr "Filter by event"
#. js-lingui-id: yZOiaW
#: src/modules/side-panel/components/SidePanelObjectFilterDropdown.tsx
msgid "Filter by object type"
msgstr "Filter by object type"
#. js-lingui-id: gVEHcL
#: src/pages/settings/security/event-logs/components/EventLogFilters.tsx
msgid "Filter by record ID"
@@ -7367,6 +7491,11 @@ msgstr "Hide group {groupValue}"
msgid "Hide hidden groups"
msgstr "Hide hidden groups"
#. js-lingui-id: 2ouyMV
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemOptionsDropdown.tsx
msgid "Hide label"
msgstr "Hide label"
#. js-lingui-id: i0qMbr
#: src/modules/page-layout/constants/StandardPageLayoutTabTitleTranslations.ts
#: src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx
@@ -7475,6 +7604,16 @@ msgstr "IAM credentials"
msgid "IAM credentials configured"
msgstr "IAM credentials configured"
#. js-lingui-id: LlQirF
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAiProviderListCard.tsx
msgid "IAM role"
msgstr "IAM role"
#. js-lingui-id: VjDLrJ
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "IAM role (instance profile)"
msgstr "IAM role (instance profile)"
#. js-lingui-id: wwu18a
#: src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm.tsx
msgid "Icon"
@@ -7507,6 +7646,11 @@ msgstr "Identity Provider Metadata XML"
msgid "if"
msgstr "if"
#. js-lingui-id: K6ChR5
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "If disabled, use advanced search filters to find these records"
msgstr "If disabled, use advanced search filters to find these records"
#. js-lingui-id: ZfP/Ap
#: src/modules/object-record/record-table/empty-state/components/RecordTableEmptyStateRemote.tsx
msgid "If this is unexpected, please verify your settings."
@@ -7682,6 +7826,11 @@ msgstr "Inactive Skill Options"
msgid "Inbox"
msgstr "Inbox"
#. js-lingui-id: Wyip/m
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Include in default search"
msgstr "Include in default search"
#. js-lingui-id: mtGDyy
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Incomplete"
@@ -9103,6 +9252,7 @@ msgstr "Models for this provider. Toggle to enable or disable."
#. js-lingui-id: hty0d5
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "Monday"
msgstr "Monday"
@@ -9139,10 +9289,10 @@ msgstr "Month of the year"
msgid "monthly"
msgstr "monthly"
#. js-lingui-id: Sew/cK
#. js-lingui-id: +8Nek/
#: src/modules/settings/enterprise/components/EnterprisePlanModal.tsx
msgid "Monthly subscription"
msgstr "Monthly subscription"
msgid "Monthly"
msgstr "Monthly"
#. js-lingui-id: 6jefe3
#: src/modules/side-panel/pages/page-layout/utils/getDateGranularityPluralLabel.ts
@@ -9153,6 +9303,7 @@ msgstr "months"
#. js-lingui-id: 2FYpfJ
#: src/pages/settings/ai/SettingsAI.tsx
#: src/modules/ui/layout/tab-list/components/TabMoreButton.tsx
#: src/modules/command-menu-item/server-items/display/components/CommandMenuItemMoreActionsButton.tsx
msgid "More"
msgstr "More"
@@ -9276,7 +9427,7 @@ msgstr "mySkill"
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/onboarding/CreateProfile.tsx
#: src/modules/settings/workspace/components/NameField.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
#: src/modules/settings/usage/components/UsageByUserTableSection.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/components/SettingsRolePermissionsSettingsTableHeader.tsx
@@ -9293,6 +9444,7 @@ msgstr "mySkill"
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTabEnvironmentVariableTableRow.tsx
#: src/modules/settings/developers/components/SettingsApiKeysTable.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationsTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
#: src/modules/settings/data-model/new-object/components/SettingsAvailableStandardObjectsSection.tsx
#: src/modules/settings/admin-panel/config-variables/components/SettingsAdminConfigVariablesTable.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminWorkspaceContent.tsx
@@ -9534,7 +9686,7 @@ msgstr "New record"
#. js-lingui-id: gWnSyg
#: src/pages/settings/ai/SettingsSkillForm.tsx
#: src/pages/settings/ai/SettingsSkillForm.tsx
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "New Skill"
msgstr "New Skill"
@@ -9640,6 +9792,16 @@ msgstr "No agents available"
msgid "No agents match your search"
msgstr "No agents match your search"
#. js-lingui-id: nPalt1
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
msgid "No AI consumption recorded for this user."
msgstr "No AI consumption recorded for this user."
#. js-lingui-id: 42kV9p
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "No AI usage data recorded yet."
msgstr "No AI usage data recorded yet."
#. js-lingui-id: 9mx36q
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTable.tsx
msgid "No API keys assigned"
@@ -9675,6 +9837,11 @@ msgstr "No body"
msgid "No calling code"
msgstr "No calling code"
#. js-lingui-id: d14J3J
#: src/modules/ai/components/NavigationDrawerAIChatContent.tsx
msgid "No chat"
msgstr "No chat"
#. js-lingui-id: wgUPZ1
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
msgid "No comment"
@@ -9713,11 +9880,6 @@ msgstr "No credentials"
msgid "No credit consumption recorded for this user."
msgstr "No credit consumption recorded for this user."
#. js-lingui-id: H7TRcV
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "No credit consumption recorded yet."
msgstr "No credit consumption recorded yet."
#. js-lingui-id: kxH3HO
#: src/modules/object-record/record-field/ui/form-types/components/FormCurrencyFieldInput.tsx
msgid "No currency"
@@ -9973,6 +10135,12 @@ msgstr "No permissions have been set for individual objects."
msgid "No record is required to trigger this workflow"
msgstr "No record is required to trigger this workflow"
#. js-lingui-id: aqUuQE
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditRecordSelectionDropdown.tsx
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditRecordSelectionDropdown.tsx
msgid "No record selected"
msgstr "No record selected"
#. js-lingui-id: X8wJTR
#: src/modules/object-record/record-field/ui/form-types/components/FormSingleRecordPicker.tsx
msgid "No records"
@@ -10053,7 +10221,7 @@ msgstr "No triggers configured for this function."
#. js-lingui-id: WwlPOG
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
msgid "No usage data"
msgstr "No usage data"
@@ -10258,6 +10426,7 @@ msgstr "object"
#: src/modules/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionCreateRecord.tsx
#: src/modules/side-panel/pages/root/components/SidePanelRootPage.tsx
#: src/modules/side-panel/components/SidePanelObjectViewRecordInfo.tsx
#: src/modules/side-panel/components/SidePanelObjectFilterDropdownContent.tsx
#: src/modules/settings/developers/components/WebhookEntitySelect.tsx
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
msgid "Object"
@@ -10502,6 +10671,7 @@ msgstr "Open Outlook"
#. js-lingui-id: bY2Xkv
#: src/modules/ui/layout/page-header/components/PageHeaderToggleSidePanelButton.tsx
#: src/modules/command-menu-item/server-items/display/components/CommandMenuItemMoreActionsButton.tsx
msgid "Open side panel"
msgstr "Open side panel"
@@ -10599,6 +10769,8 @@ msgstr "Organize"
#: src/modules/page-layout/widgets/fields/hooks/useFieldsWidgetGroups.ts
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
#: src/modules/navigation/components/NavigationDrawerOtherSection.tsx
#: src/modules/command-menu-item/server-items/edit/components/SidePanelCommandMenuItemEditPage.tsx
#: src/modules/command-menu-item/server-items/display/components/SidePanelCommandMenuItemDisplayPage.tsx
msgid "Other"
msgstr "Other"
@@ -10818,6 +10990,11 @@ msgstr "People Ive sent emails to and received emails from."
msgid "People Ive sent emails to."
msgstr "People Ive sent emails to."
#. js-lingui-id: qMTN0w
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
msgid "Per-day AI consumption."
msgstr "Per-day AI consumption."
#. js-lingui-id: i9iYjM
#: src/pages/settings/SettingsUsageUserDetail.tsx
msgid "Per-day credit consumption."
@@ -10973,6 +11150,12 @@ msgstr "Pie Chart"
msgid "Pink"
msgstr "Pink"
#. js-lingui-id: kNiQp6
#: src/modules/command-menu-item/server-items/edit/components/SidePanelCommandMenuItemEditPage.tsx
#: src/modules/command-menu-item/server-items/display/components/SidePanelCommandMenuItemDisplayPage.tsx
msgid "Pinned"
msgstr "Pinned"
#. js-lingui-id: hx1ePY
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowFormFieldSettingsText.tsx
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowFormFieldSettingsNumber.tsx
@@ -11519,6 +11702,12 @@ msgstr "Record-level"
msgid "Records"
msgstr "Records"
#. js-lingui-id: J+Qyf2
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditRecordSelectionDropdown.tsx
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditRecordSelectionDropdown.tsx
msgid "Records selected"
msgstr "Records selected"
#. js-lingui-id: wRTiSD
#: src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectFormOptionRow.tsx
msgid "Red"
@@ -11811,6 +12000,11 @@ msgstr "Reset"
msgid "Reset 2FA"
msgstr "Reset 2FA"
#. js-lingui-id: YdI8A2
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemOptionsDropdown.tsx
msgid "Reset label to default"
msgstr "Reset label to default"
#. js-lingui-id: 1IWc1n
#: src/modules/side-panel/pages/root/components/SidePanelResetContextToSelectionButton.tsx
msgid "Reset to"
@@ -11818,6 +12012,7 @@ msgstr "Reset to"
#. js-lingui-id: L+rMC9
#: src/modules/settings/data-model/fields/forms/address/components/SettingsDataModelFieldAddressForm.tsx
#: src/modules/command-menu-item/server-items/edit/components/SidePanelCommandMenuItemEditPage.tsx
msgid "Reset to default"
msgstr "Reset to default"
@@ -12119,6 +12314,7 @@ msgstr "Russian"
#. js-lingui-id: +5kO8P
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "Saturday"
msgstr "Saturday"
@@ -12184,6 +12380,7 @@ msgstr "SDK"
#: src/modules/sign-in-background-mock/components/SignInAppNavigationDrawerMock.tsx
#: src/modules/side-panel/hooks/useOpenRecordsSearchPageInSidePanel.ts
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentWorkspaceMemberPickerDropdown.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminGeneral.tsx
#: src/modules/command-menu-item/record-agnostic/constants/RecordAgnosticCommandMenuItemsConfig.tsx
#: src/modules/command-menu-item/record-agnostic/constants/RecordAgnosticCommandMenuItemsConfig.tsx
@@ -12243,7 +12440,7 @@ msgid "Search a role..."
msgstr "Search a role..."
#. js-lingui-id: lJNEce
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Search a skill..."
msgstr "Search a skill..."
@@ -12268,6 +12465,11 @@ msgstr "Search a type"
msgid "Search a view..."
msgstr "Search a view..."
#. js-lingui-id: N7Z3jc
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Search across indexed fields..."
msgstr "Search across indexed fields..."
#. js-lingui-id: +7s4fw
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentEntityPickerDropdown.tsx
msgid "Search agents"
@@ -12364,7 +12566,7 @@ msgid "Search folders..."
msgstr "Search folders..."
#. js-lingui-id: uHAV+O
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
#: src/modules/settings/usage/components/UsageByUserTableSection.tsx
msgid "Search for a user..."
msgstr "Search for a user..."
@@ -12437,6 +12639,8 @@ msgstr "Searching the web for {query}"
#. js-lingui-id: 8sgZS9
#: src/modules/settings/enterprise/components/EnterprisePlanModal.tsx
#: src/modules/settings/enterprise/components/EnterprisePlanModal.tsx
#: src/modules/settings/enterprise/components/EnterprisePlanModal.tsx
#: src/modules/settings/billing/components/SubscriptionPrice.tsx
msgid "seat / month"
msgstr "seat / month"
@@ -13038,6 +13242,11 @@ msgstr "Show group {groupValue}"
msgid "Show hidden groups"
msgstr "Show hidden groups"
#. js-lingui-id: eOY8jq
#: src/modules/side-panel/components/SidePanelObjectFilterDropdownContent.tsx
msgid "Show hidden objects"
msgstr "Show hidden objects"
#. js-lingui-id: qi+g0a
#: src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx
msgid "Show only rows with errors"
@@ -13117,12 +13326,12 @@ msgid "Skill"
msgstr "Skill"
#. js-lingui-id: h4t38o
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Skill activated"
msgstr "Skill activated"
#. js-lingui-id: /IoK74
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Skill deleted"
msgstr "Skill deleted"
@@ -13139,6 +13348,7 @@ msgstr "Skill not found"
#. js-lingui-id: PCSkw2
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Skills"
msgstr "Skills"
@@ -13284,10 +13494,10 @@ msgstr "Sorts"
msgid "Source"
msgstr "Source"
#. js-lingui-id: IEtmGM
#. js-lingui-id: xqlr9R
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
msgid "Spaces and comma - {spacesAndCommaExample}"
msgstr "Spaces and comma - {spacesAndCommaExample}"
msgid "Spaces and comma"
msgstr "Spaces and comma"
#. js-lingui-id: 65A04M
#: src/pages/settings/profile/appearance/components/LocalePicker.tsx
@@ -13593,6 +13803,7 @@ msgstr "Sum"
#. js-lingui-id: DBC3t5
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "Sunday"
msgstr "Sunday"
@@ -13741,43 +13952,24 @@ msgstr "System relations"
#: src/pages/settings/profile/appearance/components/SettingsExperience.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsTimeZoneSelect.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsTimeZoneSelect.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsTimeZoneSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsTimeZoneSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsTimeFormatSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsDateFormatSelect.tsx
msgid "System settings"
msgstr "System settings"
#. js-lingui-id: E3AMmw
#: src/pages/settings/profile/appearance/components/DateTimeSettingsDateFormatSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsDateFormatSelect.tsx
msgid "System settings - {systemDateFormatLabel}"
msgstr "System settings - {systemDateFormatLabel}"
#. js-lingui-id: uKM6SP
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
msgid "System Settings - {systemNumberFormatLabel}"
msgstr "System Settings - {systemNumberFormatLabel}"
#. js-lingui-id: 0ZgB1e
#: src/pages/settings/profile/appearance/components/DateTimeSettingsTimeFormatSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsTimeFormatSelect.tsx
msgid "System Settings - {systemTimeFormatLabel}"
msgstr "System Settings - {systemTimeFormatLabel}"
#. js-lingui-id: e89dEj
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "System settings - Monday"
msgstr "System settings - Monday"
#. js-lingui-id: o+Kvng
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "System settings - Saturday"
msgstr "System settings - Saturday"
#. js-lingui-id: gluMQd
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "System settings - Sunday"
msgstr "System settings - Sunday"
#. js-lingui-id: HuA3RU
#: src/modules/side-panel/components/hooks/usePageLayoutHeaderInfo.ts
msgid "Tab"
@@ -14458,6 +14650,12 @@ msgstr "Total Jobs"
msgid "Total time"
msgstr "Total time"
#. js-lingui-id: BxecEJ
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "Track AI consumption across your workspace."
msgstr "Track AI consumption across your workspace."
#. js-lingui-id: YT/cKI
#: src/modules/settings/billing/components/SettingsBillingCreditsSection.tsx
msgid "Track your {intervalLabel} workflow credit consumption."
@@ -14830,6 +15028,13 @@ msgstr "Unlisted"
msgid "Unlock enterprise features like SSO, row-level security, and audit logs."
msgstr "Unlock enterprise features like SSO, row-level security, and audit logs."
#. js-lingui-id: Te2H8x
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/modules/settings/developers/components/SettingsApiKeysFieldItemTableRow.tsx
msgid "Unnamed API Key"
msgstr "Unnamed API Key"
#. js-lingui-id: eQMhFX
#: src/modules/advanced-text-editor/extensions/slash-command/DefaultSlashCommands.ts
msgid "unordered"
@@ -14975,10 +15180,10 @@ msgstr "Upgrade to {latestAvailableVersion}"
msgid "Upgrade to access"
msgstr "Upgrade to access"
#. js-lingui-id: jmVW3I
#. js-lingui-id: Wurpq2
#: src/pages/settings/security/SettingsSecurity.tsx
msgid "Upgrade to Enterprise to access audit logs"
msgstr "Upgrade to Enterprise to access audit logs"
msgid "Upgrade to Enterprise to access audit logs."
msgstr "Upgrade to Enterprise to access audit logs."
#. js-lingui-id: +Gi3x1
#: src/pages/settings/applications/components/SettingsApplicationVersionContainer.tsx
@@ -15053,7 +15258,9 @@ msgstr "us-east-1"
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
#: src/pages/settings/SettingsUsage.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/pages/settings/ai/SettingsAI.tsx
#: src/modules/settings/usage/components/UsageByUserTableSection.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "Usage"
msgstr "Usage"
@@ -15067,6 +15274,11 @@ msgstr "Usage across all workspaces on this server"
msgid "Usage Analytics"
msgstr "Usage Analytics"
#. js-lingui-id: 7Kq6TI
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "Usage analytics requires ClickHouse. Contact your administrator."
msgstr "Usage analytics requires ClickHouse. Contact your administrator."
#. js-lingui-id: 7vRxpC
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
@@ -15099,6 +15311,11 @@ msgstr "Use authenticator apps and browser extensions like 1Password, Authy, Mic
msgid "Use best models only"
msgstr "Use best models only"
#. js-lingui-id: cVOIgV
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Use filter to see existing tools or create your own"
msgstr "Use filter to see existing tools or create your own"
#. js-lingui-id: oTTQsc
#: src/modules/settings/domains/utils/getSubdomainValidationSchema.ts
msgid "Use letter, number and dash only. Start and finish with a letter or a number"
@@ -15325,6 +15542,11 @@ msgstr "View"
msgid "View Agent"
msgstr "View Agent"
#. js-lingui-id: noHthC
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "View AI usage breakdown"
msgstr "View AI usage breakdown"
#. js-lingui-id: nK72s8
#: src/pages/settings/ai/components/SettingsAgentLogsTab.tsx
msgid "View all evaluations"
@@ -15638,6 +15860,11 @@ msgstr "Week"
msgid "weeks"
msgstr "weeks"
#. js-lingui-id: WKHqM+
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Weight"
msgstr "Weight"
#. js-lingui-id: nTuObL
#: src/pages/auth/SignInUp.tsx
msgid "Welcome to Twenty"
@@ -15800,6 +16027,7 @@ msgstr "Workflows"
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
#: src/pages/settings/ai/SettingsAgentForm.tsx
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/SettingsAIPrompts.tsx
#: src/pages/settings/ai/SettingsAI.tsx
#: src/modules/views/view-picker/components/ViewPickerListContent.tsx
@@ -15814,6 +16042,7 @@ msgstr "Workflows"
#: src/modules/settings/domains/components/SettingsCustomDomain.tsx
#: src/modules/settings/domains/components/SettingPublicDomain.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownVisibilityContent.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownCustomView.tsx
#: src/modules/navigation-menu-item/display/sections/workspace/components/WorkspaceSection.tsx
@@ -15940,10 +16169,10 @@ msgstr "Year"
msgid "yearly"
msgstr "yearly"
#. js-lingui-id: Y1GwUe
#. js-lingui-id: zkWmBh
#: src/modules/settings/enterprise/components/EnterprisePlanModal.tsx
msgid "Yearly subscription"
msgstr "Yearly subscription"
msgid "Yearly"
msgstr "Yearly"
#. js-lingui-id: +BGee5
#: src/modules/side-panel/pages/page-layout/utils/getDateGranularityPluralLabel.ts
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+302 -73
View File
@@ -149,18 +149,15 @@ msgid "{0, plural, one {You do not have permission to access the {fieldsList} fi
msgstr ""
#. js-lingui-id: dNIJYp
#. placeholder {0}: formatNumber(totalCredits)
#. placeholder {0}: formatNumber(datum.value)
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/modules/settings/usage/components/UsagePieChart.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "{0} credits"
msgstr ""
#. js-lingui-id: m8fdzW
#. placeholder {0}: formatNumber(totalCredits)
#. js-lingui-id: r4l/MK
#. placeholder {0}: formatUsageValue(totalCredits)
#: src/pages/settings/SettingsUsageUserDetail.tsx
msgid "{0} credits used"
msgid "{0} used"
msgstr ""
#. js-lingui-id: qdQhzv
@@ -501,9 +498,9 @@ msgstr ""
msgid "10,000 workflow node executions"
msgstr ""
#. js-lingui-id: bM5lnW
#. js-lingui-id: rU05hS
#: src/modules/settings/experience/components/DateTimeSettingsTimeFormatSelect.tsx
msgid "12h - {hour12Label}"
msgid "12h"
msgstr ""
#. js-lingui-id: 4EdXYs
@@ -537,9 +534,9 @@ msgstr ""
msgid "200 OK - {duration}ms"
msgstr ""
#. js-lingui-id: mwTnop
#. js-lingui-id: W1k7eB
#: src/modules/settings/experience/components/DateTimeSettingsTimeFormatSelect.tsx
msgid "24h - {hour24Label}"
msgid "24h"
msgstr ""
#. js-lingui-id: QsMprd
@@ -765,6 +762,7 @@ msgstr ""
#: src/modules/settings/security/components/SSO/SettingsSecuritySSORowDropdownMenu.tsx
#: src/modules/settings/data-model/objects/components/SettingsObjectInactiveMenuDropDown.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx
#: src/modules/settings/components/SettingsEnterpriseFeatureGateCard.tsx
#: src/modules/information-banner/components/enterprise/InformationBannerLegacyEnterpriseKey.tsx
#: src/modules/command-menu-item/record/constants/WorkflowCommandMenuItemsConfig.tsx
msgid "Activate"
@@ -1323,6 +1321,7 @@ msgstr ""
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
#: src/pages/settings/ai/SettingsAgentForm.tsx
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/SettingsAIPrompts.tsx
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/SettingsAI.tsx
@@ -1341,6 +1340,16 @@ msgstr ""
msgid "AI Chat"
msgstr ""
#. js-lingui-id: E/lGXl
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "AI consumption across all workspaces."
msgstr ""
#. js-lingui-id: kkfXGh
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI consumption over time."
msgstr ""
#. js-lingui-id: kNfr85
#: src/pages/settings/ai/forms/components/SettingsAIAgentForm.tsx
#: src/pages/settings/ai/components/SettingsAgentSettingsTab.tsx
@@ -1363,6 +1372,61 @@ msgstr ""
msgid "AI Response Schema"
msgstr ""
#. js-lingui-id: tzhisR
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI Usage"
msgstr ""
#. js-lingui-id: Ad11E9
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "AI usage analytics across workspaces is available with an Enterprise key."
msgstr ""
#. js-lingui-id: zkptxb
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI usage analytics is available with an Enterprise key."
msgstr ""
#. js-lingui-id: U2F/HK
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI usage analytics requires ClickHouse. Contact your administrator."
msgstr ""
#. js-lingui-id: SknniY
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI Usage by Model"
msgstr ""
#. js-lingui-id: ehjYr9
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI Usage by Type"
msgstr ""
#. js-lingui-id: X2afmM
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "AI Usage by User"
msgstr ""
#. js-lingui-id: jyqPfh
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "AI Usage by Workspace"
msgstr ""
#. js-lingui-id: KLyZ6L
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
msgid "AI User Usage"
msgstr ""
#. js-lingui-id: TLbVxH
#: src/modules/settings/usage/utils/getOperationTypeLabel.ts
msgid "AI Workflow"
msgstr ""
#. js-lingui-id: BAiyFV
#: src/pages/settings/admin-panel/SettingsAdminNewAiProvider.tsx
msgid "AKIA..."
@@ -1451,6 +1515,11 @@ msgstr ""
msgid "All Metadata"
msgstr ""
#. js-lingui-id: zIk4M6
#: src/modules/side-panel/components/SidePanelObjectFilterDropdownContent.tsx
msgid "All objects"
msgstr ""
#. js-lingui-id: aFE/OW
#: src/pages/settings/security/event-logs/components/EventLogFilters.tsx
#: src/modules/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsTableHeader.tsx
@@ -1741,6 +1810,11 @@ msgstr ""
msgid "API key is required"
msgstr ""
#. js-lingui-id: sb6i1L
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
msgid "API key name cannot be empty"
msgstr ""
#. js-lingui-id: Widx6n
#: src/modules/settings/roles/components/SettingsRolesList.tsx
msgid "API key roles"
@@ -1806,9 +1880,9 @@ msgstr ""
msgid "APIs & Webhooks"
msgstr ""
#. js-lingui-id: BnUHmx
#. js-lingui-id: 0UMxlw
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
msgid "Apostrophe and dot - {apostropheAndDotExample}"
msgid "Apostrophe and dot"
msgstr ""
#. js-lingui-id: LMUw1U
@@ -2357,6 +2431,11 @@ msgstr ""
msgid "Before"
msgstr ""
#. js-lingui-id: KYr9vA
#: src/pages/settings/ai/components/SettingsAIModelsTab.tsx
msgid "Best"
msgstr ""
#. js-lingui-id: NgFKo1
#: src/modules/workflow/workflow-trigger/utils/cron-to-human/descriptors/getMonthsDescription.ts
msgid "between {startMonth} and {endMonth}"
@@ -2378,6 +2457,8 @@ msgid "between the {startOrdinal} and {endOrdinal} of the month"
msgstr ""
#. js-lingui-id: R+w/Va
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
#: src/pages/settings/SettingsBilling.tsx
#: src/pages/settings/SettingsBilling.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts
@@ -2440,6 +2521,12 @@ msgstr ""
msgid "Both"
msgstr ""
#. js-lingui-id: 1hGdwj
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "Breakdown across AI models."
msgstr ""
#. js-lingui-id: qDsMss
#: src/modules/workflow/workflow-steps/workflow-actions/ai-agent-action/components/WorkflowOutputSchemaBuilder.tsx
msgid "Brief explanation of this output field"
@@ -2925,6 +3012,7 @@ msgid "Clear the field or \"X\" to revert to environment/default value."
msgstr ""
#. js-lingui-id: Gt8ndY
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "Click a user to see their daily breakdown."
msgstr ""
@@ -2966,6 +3054,8 @@ msgstr ""
#. js-lingui-id: CTdw8/
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "ClickHouse Not Configured"
msgstr ""
@@ -3008,6 +3098,7 @@ msgstr ""
#. js-lingui-id: saip/v
#: src/modules/ui/layout/page-header/components/PageHeaderToggleSidePanelButton.tsx
#: src/modules/command-menu-item/server-items/display/components/CommandMenuItemMoreActionsButton.tsx
msgid "Close side panel"
msgstr ""
@@ -3104,9 +3195,9 @@ msgstr ""
msgid "Commands copied to clipboard"
msgstr ""
#. js-lingui-id: A9u+7N
#. js-lingui-id: QeCopv
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
msgid "Commas and dot - {commasAndDotExample}"
msgid "Commas and dot"
msgstr ""
#. js-lingui-id: NBdIgR
@@ -3213,6 +3304,11 @@ msgstr ""
msgid "Configure fallback login methods for users with SSO bypass permissions"
msgstr ""
#. js-lingui-id: OLqG0t
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
msgid "Configure how this object appears in search results"
msgstr ""
#. js-lingui-id: ghdb7+
#: src/modules/settings/accounts/components/SettingsAccountsCalendarChannelsGeneral.tsx
msgid "Configure how we should display your events in your calendar"
@@ -3377,6 +3473,7 @@ msgstr ""
#. js-lingui-id: M73whl
#: src/modules/side-panel/pages/root/components/SidePanelRootPage.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAiModelHoverCard.tsx
#: src/modules/command-menu-item/server-items/display/components/SidePanelCommandMenuItemDisplayPage.tsx
#: src/modules/ai/components/RoutingDebugDisplay.tsx
msgid "Context"
msgstr ""
@@ -3868,6 +3965,7 @@ msgstr ""
#. js-lingui-id: HAzhV7
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Credentials"
msgstr ""
@@ -3896,16 +3994,9 @@ msgstr ""
msgid "Credit usage breakdown for your workspace."
msgstr ""
#. js-lingui-id: UQ4Hjl
#: src/modules/ai/components/internal/AIChatContextUsageButton.tsx
#: src/modules/ai/components/internal/AIChatContextUsageButton.tsx
msgid "credits"
msgstr ""
#. js-lingui-id: lDIOek
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "Credits"
msgstr ""
@@ -4096,6 +4187,12 @@ msgstr ""
msgid "Czech"
msgstr ""
#. js-lingui-id: ShUrwO
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "Daily AI Usage"
msgstr ""
#. js-lingui-id: KXQkvT
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
@@ -4209,6 +4306,7 @@ msgstr ""
#. js-lingui-id: r+cVRP
#: src/pages/settings/data-model/SettingsObjectFieldTable.tsx
#: src/modules/settings/roles/role-permissions/object-level-permissions/field-permissions/components/SettingsRolePermissionsObjectLevelObjectFieldPermissionTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Data type"
msgstr ""
@@ -4340,7 +4438,7 @@ msgstr ""
#. js-lingui-id: yAT3be
#: src/pages/settings/SettingsProfile.tsx
#: src/pages/settings/data-model/SettingsObjectTable.tsx
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationItemTableRow.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectItemTableRow.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectFieldItemTableRow.tsx
@@ -4358,6 +4456,11 @@ msgstr ""
msgid "Decide which Sub-address fields you want to display"
msgstr ""
#. js-lingui-id: Bn9+El
#: src/modules/ai/components/AIChatEditorSection.tsx
msgid "default"
msgstr ""
#. js-lingui-id: ovBPCi
#: src/modules/settings/data-model/fields/forms/date/utils/getDisplayFormatLabel.ts
#: src/modules/settings/data-model/fields/forms/address/components/MultiSelectAddressFields.tsx
@@ -4926,9 +5029,9 @@ msgstr ""
msgid "Don't sync emails from team@ support@ noreply@..."
msgstr ""
#. js-lingui-id: bd+DPX
#. js-lingui-id: Wm78zZ
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
msgid "Dots and comma - {dotsAndCommaExample}"
msgid "Dots and comma"
msgstr ""
#. js-lingui-id: LE8J+K
@@ -5149,6 +5252,13 @@ msgstr ""
msgid "Edit Account"
msgstr ""
#. js-lingui-id: t1EOLt
#: src/modules/layout-customization/hooks/useEnterLayoutCustomizationMode.ts
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditButton.tsx
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditButton.tsx
msgid "Edit actions"
msgstr ""
#. js-lingui-id: GpnfNN
#: src/modules/command-menu-item/record/constants/DashboardCommandMenuItemsConfig.tsx
msgid "Edit Dashboard"
@@ -5736,11 +5846,18 @@ msgstr ""
#: src/pages/settings/security/SettingsSecurity.tsx
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "Enterprise"
msgstr ""
#. js-lingui-id: rmZVdg
#: src/modules/settings/components/SettingsEnterpriseFeatureGateCard.tsx
msgid "Enterprise feature"
msgstr ""
#. js-lingui-id: Kjjkt3
#: src/pages/settings/security/event-logs/SettingsEventLogs.tsx
msgid "Enterprise Feature"
@@ -6350,7 +6467,7 @@ msgid "Failed to activate enterprise license. Please check your key or contact s
msgstr ""
#. js-lingui-id: vJiM7T
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Failed to activate skill"
msgstr ""
@@ -6375,7 +6492,7 @@ msgid "Failed to delete jobs. Please try again later."
msgstr ""
#. js-lingui-id: bmwWKk
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Failed to delete skill"
msgstr ""
@@ -6645,6 +6762,11 @@ msgstr ""
msgid "Field on destination"
msgstr ""
#. js-lingui-id: P8JCfj
#: src/modules/metadata-error-handler/hooks/useMetadataErrorHandler.ts
msgid "field permission"
msgstr ""
#. js-lingui-id: RnX5oc
#: src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
msgid "fields"
@@ -6748,9 +6870,6 @@ msgid "Files"
msgstr ""
#. js-lingui-id: o7J4JM
#: src/pages/settings/data-model/SettingsObjectFieldTable.tsx
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAIAgentsTable.tsx
#: src/modules/workflow/workflow-steps/workflow-actions/find-records-action/components/WorkflowEditActionFindRecords.tsx
#: src/modules/views/components/ViewBarFilterDropdownFieldSelectMenu.tsx
#: src/modules/views/components/ViewBarFilterButton.tsx
@@ -6767,6 +6886,11 @@ msgstr ""
msgid "Filter by event"
msgstr ""
#. js-lingui-id: yZOiaW
#: src/modules/side-panel/components/SidePanelObjectFilterDropdown.tsx
msgid "Filter by object type"
msgstr ""
#. js-lingui-id: gVEHcL
#: src/pages/settings/security/event-logs/components/EventLogFilters.tsx
msgid "Filter by record ID"
@@ -7367,6 +7491,11 @@ msgstr ""
msgid "Hide hidden groups"
msgstr ""
#. js-lingui-id: 2ouyMV
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemOptionsDropdown.tsx
msgid "Hide label"
msgstr ""
#. js-lingui-id: i0qMbr
#: src/modules/page-layout/constants/StandardPageLayoutTabTitleTranslations.ts
#: src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx
@@ -7475,6 +7604,16 @@ msgstr ""
msgid "IAM credentials configured"
msgstr ""
#. js-lingui-id: LlQirF
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAiProviderListCard.tsx
msgid "IAM role"
msgstr ""
#. js-lingui-id: VjDLrJ
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "IAM role (instance profile)"
msgstr ""
#. js-lingui-id: wwu18a
#: src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm.tsx
msgid "Icon"
@@ -7507,6 +7646,11 @@ msgstr ""
msgid "if"
msgstr ""
#. js-lingui-id: K6ChR5
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "If disabled, use advanced search filters to find these records"
msgstr ""
#. js-lingui-id: ZfP/Ap
#: src/modules/object-record/record-table/empty-state/components/RecordTableEmptyStateRemote.tsx
msgid "If this is unexpected, please verify your settings."
@@ -7682,6 +7826,11 @@ msgstr ""
msgid "Inbox"
msgstr ""
#. js-lingui-id: Wyip/m
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Include in default search"
msgstr ""
#. js-lingui-id: mtGDyy
#: src/pages/settings/enterprise/SettingsEnterprise.tsx
msgid "Incomplete"
@@ -9103,6 +9252,7 @@ msgstr ""
#. js-lingui-id: hty0d5
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "Monday"
msgstr ""
@@ -9139,9 +9289,9 @@ msgstr ""
msgid "monthly"
msgstr ""
#. js-lingui-id: Sew/cK
#. js-lingui-id: +8Nek/
#: src/modules/settings/enterprise/components/EnterprisePlanModal.tsx
msgid "Monthly subscription"
msgid "Monthly"
msgstr ""
#. js-lingui-id: 6jefe3
@@ -9153,6 +9303,7 @@ msgstr ""
#. js-lingui-id: 2FYpfJ
#: src/pages/settings/ai/SettingsAI.tsx
#: src/modules/ui/layout/tab-list/components/TabMoreButton.tsx
#: src/modules/command-menu-item/server-items/display/components/CommandMenuItemMoreActionsButton.tsx
msgid "More"
msgstr ""
@@ -9276,7 +9427,7 @@ msgstr ""
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/onboarding/CreateProfile.tsx
#: src/modules/settings/workspace/components/NameField.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
#: src/modules/settings/usage/components/UsageByUserTableSection.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/security/components/SSO/SettingsSSOIdentitiesProvidersForm.tsx
#: src/modules/settings/roles/role-permissions/permission-flags/components/SettingsRolePermissionsSettingsTableHeader.tsx
@@ -9293,6 +9444,7 @@ msgstr ""
#: src/modules/settings/logic-functions/components/tabs/SettingsLogicFunctionTabEnvironmentVariableTableRow.tsx
#: src/modules/settings/developers/components/SettingsApiKeysTable.tsx
#: src/modules/settings/data-model/object-details/components/SettingsObjectRelationsTable.tsx
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
#: src/modules/settings/data-model/new-object/components/SettingsAvailableStandardObjectsSection.tsx
#: src/modules/settings/admin-panel/config-variables/components/SettingsAdminConfigVariablesTable.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminWorkspaceContent.tsx
@@ -9534,7 +9686,7 @@ msgstr ""
#. js-lingui-id: gWnSyg
#: src/pages/settings/ai/SettingsSkillForm.tsx
#: src/pages/settings/ai/SettingsSkillForm.tsx
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "New Skill"
msgstr ""
@@ -9640,6 +9792,16 @@ msgstr ""
msgid "No agents match your search"
msgstr ""
#. js-lingui-id: nPalt1
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
msgid "No AI consumption recorded for this user."
msgstr ""
#. js-lingui-id: 42kV9p
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "No AI usage data recorded yet."
msgstr ""
#. js-lingui-id: 9mx36q
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentTable.tsx
msgid "No API keys assigned"
@@ -9675,6 +9837,11 @@ msgstr ""
msgid "No calling code"
msgstr ""
#. js-lingui-id: d14J3J
#: src/modules/ai/components/NavigationDrawerAIChatContent.tsx
msgid "No chat"
msgstr ""
#. js-lingui-id: wgUPZ1
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
msgid "No comment"
@@ -9713,11 +9880,6 @@ msgstr ""
msgid "No credit consumption recorded for this user."
msgstr ""
#. js-lingui-id: H7TRcV
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "No credit consumption recorded yet."
msgstr ""
#. js-lingui-id: kxH3HO
#: src/modules/object-record/record-field/ui/form-types/components/FormCurrencyFieldInput.tsx
msgid "No currency"
@@ -9973,6 +10135,12 @@ msgstr ""
msgid "No record is required to trigger this workflow"
msgstr ""
#. js-lingui-id: aqUuQE
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditRecordSelectionDropdown.tsx
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditRecordSelectionDropdown.tsx
msgid "No record selected"
msgstr ""
#. js-lingui-id: X8wJTR
#: src/modules/object-record/record-field/ui/form-types/components/FormSingleRecordPicker.tsx
msgid "No records"
@@ -10053,7 +10221,7 @@ msgstr ""
#. js-lingui-id: WwlPOG
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
msgid "No usage data"
msgstr ""
@@ -10258,6 +10426,7 @@ msgstr ""
#: src/modules/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionCreateRecord.tsx
#: src/modules/side-panel/pages/root/components/SidePanelRootPage.tsx
#: src/modules/side-panel/components/SidePanelObjectViewRecordInfo.tsx
#: src/modules/side-panel/components/SidePanelObjectFilterDropdownContent.tsx
#: src/modules/settings/developers/components/WebhookEntitySelect.tsx
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
msgid "Object"
@@ -10502,6 +10671,7 @@ msgstr ""
#. js-lingui-id: bY2Xkv
#: src/modules/ui/layout/page-header/components/PageHeaderToggleSidePanelButton.tsx
#: src/modules/command-menu-item/server-items/display/components/CommandMenuItemMoreActionsButton.tsx
msgid "Open side panel"
msgstr ""
@@ -10599,6 +10769,8 @@ msgstr ""
#: src/modules/page-layout/widgets/fields/hooks/useFieldsWidgetGroups.ts
#: src/modules/navigation-menu-item/edit/side-panel/components/SidePanelNewSidebarItemMainMenu.tsx
#: src/modules/navigation/components/NavigationDrawerOtherSection.tsx
#: src/modules/command-menu-item/server-items/edit/components/SidePanelCommandMenuItemEditPage.tsx
#: src/modules/command-menu-item/server-items/display/components/SidePanelCommandMenuItemDisplayPage.tsx
msgid "Other"
msgstr ""
@@ -10818,6 +10990,11 @@ msgstr ""
msgid "People Ive sent emails to."
msgstr ""
#. js-lingui-id: qMTN0w
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
msgid "Per-day AI consumption."
msgstr ""
#. js-lingui-id: i9iYjM
#: src/pages/settings/SettingsUsageUserDetail.tsx
msgid "Per-day credit consumption."
@@ -10973,6 +11150,12 @@ msgstr ""
msgid "Pink"
msgstr ""
#. js-lingui-id: kNiQp6
#: src/modules/command-menu-item/server-items/edit/components/SidePanelCommandMenuItemEditPage.tsx
#: src/modules/command-menu-item/server-items/display/components/SidePanelCommandMenuItemDisplayPage.tsx
msgid "Pinned"
msgstr ""
#. js-lingui-id: hx1ePY
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowFormFieldSettingsText.tsx
#: src/modules/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowFormFieldSettingsNumber.tsx
@@ -11519,6 +11702,12 @@ msgstr ""
msgid "Records"
msgstr ""
#. js-lingui-id: J+Qyf2
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditRecordSelectionDropdown.tsx
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemEditRecordSelectionDropdown.tsx
msgid "Records selected"
msgstr ""
#. js-lingui-id: wRTiSD
#: src/modules/settings/data-model/fields/forms/select/components/SettingsDataModelFieldSelectFormOptionRow.tsx
msgid "Red"
@@ -11811,6 +12000,11 @@ msgstr ""
msgid "Reset 2FA"
msgstr ""
#. js-lingui-id: YdI8A2
#: src/modules/command-menu-item/server-items/edit/components/CommandMenuItemOptionsDropdown.tsx
msgid "Reset label to default"
msgstr ""
#. js-lingui-id: 1IWc1n
#: src/modules/side-panel/pages/root/components/SidePanelResetContextToSelectionButton.tsx
msgid "Reset to"
@@ -11818,6 +12012,7 @@ msgstr ""
#. js-lingui-id: L+rMC9
#: src/modules/settings/data-model/fields/forms/address/components/SettingsDataModelFieldAddressForm.tsx
#: src/modules/command-menu-item/server-items/edit/components/SidePanelCommandMenuItemEditPage.tsx
msgid "Reset to default"
msgstr ""
@@ -12119,6 +12314,7 @@ msgstr ""
#. js-lingui-id: +5kO8P
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "Saturday"
msgstr ""
@@ -12184,6 +12380,7 @@ msgstr ""
#: src/modules/sign-in-background-mock/components/SignInAppNavigationDrawerMock.tsx
#: src/modules/side-panel/hooks/useOpenRecordsSearchPageInSidePanel.ts
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentWorkspaceMemberPickerDropdown.tsx
#: src/modules/settings/data-model/object-details/components/tabs/ObjectSettings.tsx
#: src/modules/settings/admin-panel/components/SettingsAdminGeneral.tsx
#: src/modules/command-menu-item/record-agnostic/constants/RecordAgnosticCommandMenuItemsConfig.tsx
#: src/modules/command-menu-item/record-agnostic/constants/RecordAgnosticCommandMenuItemsConfig.tsx
@@ -12243,7 +12440,7 @@ msgid "Search a role..."
msgstr ""
#. js-lingui-id: lJNEce
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Search a skill..."
msgstr ""
@@ -12268,6 +12465,11 @@ msgstr ""
msgid "Search a view..."
msgstr ""
#. js-lingui-id: N7Z3jc
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Search across indexed fields..."
msgstr ""
#. js-lingui-id: +7s4fw
#: src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentEntityPickerDropdown.tsx
msgid "Search agents"
@@ -12364,7 +12566,7 @@ msgid "Search folders..."
msgstr ""
#. js-lingui-id: uHAV+O
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
#: src/modules/settings/usage/components/UsageByUserTableSection.tsx
msgid "Search for a user..."
msgstr ""
@@ -12437,6 +12639,8 @@ msgstr ""
#. js-lingui-id: 8sgZS9
#: src/modules/settings/enterprise/components/EnterprisePlanModal.tsx
#: src/modules/settings/enterprise/components/EnterprisePlanModal.tsx
#: src/modules/settings/enterprise/components/EnterprisePlanModal.tsx
#: src/modules/settings/billing/components/SubscriptionPrice.tsx
msgid "seat / month"
msgstr ""
@@ -13038,6 +13242,11 @@ msgstr ""
msgid "Show hidden groups"
msgstr ""
#. js-lingui-id: eOY8jq
#: src/modules/side-panel/components/SidePanelObjectFilterDropdownContent.tsx
msgid "Show hidden objects"
msgstr ""
#. js-lingui-id: qi+g0a
#: src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx
msgid "Show only rows with errors"
@@ -13117,12 +13326,12 @@ msgid "Skill"
msgstr ""
#. js-lingui-id: h4t38o
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Skill activated"
msgstr ""
#. js-lingui-id: /IoK74
#: src/pages/settings/ai/components/SettingsSkillsTable.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Skill deleted"
msgstr ""
@@ -13139,6 +13348,7 @@ msgstr ""
#. js-lingui-id: PCSkw2
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Skills"
msgstr ""
@@ -13284,9 +13494,9 @@ msgstr ""
msgid "Source"
msgstr ""
#. js-lingui-id: IEtmGM
#. js-lingui-id: xqlr9R
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
msgid "Spaces and comma - {spacesAndCommaExample}"
msgid "Spaces and comma"
msgstr ""
#. js-lingui-id: 65A04M
@@ -13593,6 +13803,7 @@ msgstr ""
#. js-lingui-id: DBC3t5
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "Sunday"
msgstr ""
@@ -13741,43 +13952,24 @@ msgstr ""
#: src/pages/settings/profile/appearance/components/SettingsExperience.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsTimeZoneSelect.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsTimeZoneSelect.tsx
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsTimeZoneSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsTimeZoneSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsTimeFormatSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsDateFormatSelect.tsx
msgid "System settings"
msgstr ""
#. js-lingui-id: E3AMmw
#: src/pages/settings/profile/appearance/components/DateTimeSettingsDateFormatSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsDateFormatSelect.tsx
msgid "System settings - {systemDateFormatLabel}"
msgstr ""
#. js-lingui-id: uKM6SP
#: src/modules/settings/experience/components/NumberFormatSelect.tsx
msgid "System Settings - {systemNumberFormatLabel}"
msgstr ""
#. js-lingui-id: 0ZgB1e
#: src/pages/settings/profile/appearance/components/DateTimeSettingsTimeFormatSelect.tsx
#: src/modules/settings/experience/components/DateTimeSettingsTimeFormatSelect.tsx
msgid "System Settings - {systemTimeFormatLabel}"
msgstr ""
#. js-lingui-id: e89dEj
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "System settings - Monday"
msgstr ""
#. js-lingui-id: o+Kvng
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "System settings - Saturday"
msgstr ""
#. js-lingui-id: gluMQd
#: src/pages/settings/profile/appearance/components/DateTimeSettingsCalendarStartDaySelect.tsx
msgid "System settings - Sunday"
msgstr ""
#. js-lingui-id: HuA3RU
#: src/modules/side-panel/components/hooks/usePageLayoutHeaderInfo.ts
msgid "Tab"
@@ -14456,6 +14648,12 @@ msgstr ""
msgid "Total time"
msgstr ""
#. js-lingui-id: BxecEJ
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
#: src/pages/settings/ai/components/SettingsAIUsageTab.tsx
msgid "Track AI consumption across your workspace."
msgstr ""
#. js-lingui-id: YT/cKI
#: src/modules/settings/billing/components/SettingsBillingCreditsSection.tsx
msgid "Track your {intervalLabel} workflow credit consumption."
@@ -14828,6 +15026,13 @@ msgstr ""
msgid "Unlock enterprise features like SSO, row-level security, and audit logs."
msgstr ""
#. js-lingui-id: Te2H8x
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
#: src/modules/settings/developers/components/SettingsApiKeysFieldItemTableRow.tsx
msgid "Unnamed API Key"
msgstr ""
#. js-lingui-id: eQMhFX
#: src/modules/advanced-text-editor/extensions/slash-command/DefaultSlashCommands.ts
msgid "unordered"
@@ -14973,9 +15178,9 @@ msgstr ""
msgid "Upgrade to access"
msgstr ""
#. js-lingui-id: jmVW3I
#. js-lingui-id: Wurpq2
#: src/pages/settings/security/SettingsSecurity.tsx
msgid "Upgrade to Enterprise to access audit logs"
msgid "Upgrade to Enterprise to access audit logs."
msgstr ""
#. js-lingui-id: +Gi3x1
@@ -15051,7 +15256,9 @@ msgstr ""
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/pages/settings/SettingsUsage.tsx
#: src/pages/settings/SettingsUsage.tsx
#: src/modules/settings/hooks/useSettingsNavigationItems.tsx
#: src/pages/settings/ai/SettingsAI.tsx
#: src/modules/settings/usage/components/UsageByUserTableSection.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
msgid "Usage"
msgstr ""
@@ -15065,6 +15272,11 @@ msgstr ""
msgid "Usage Analytics"
msgstr ""
#. js-lingui-id: 7Kq6TI
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "Usage analytics requires ClickHouse. Contact your administrator."
msgstr ""
#. js-lingui-id: 7vRxpC
#: src/pages/settings/SettingsUsageUserDetail.tsx
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
@@ -15097,6 +15309,11 @@ msgstr ""
msgid "Use best models only"
msgstr ""
#. js-lingui-id: cVOIgV
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Use filter to see existing tools or create your own"
msgstr ""
#. js-lingui-id: oTTQsc
#: src/modules/settings/domains/utils/getSubdomainValidationSchema.ts
msgid "Use letter, number and dash only. Start and finish with a letter or a number"
@@ -15323,6 +15540,11 @@ msgstr ""
msgid "View Agent"
msgstr ""
#. js-lingui-id: noHthC
#: src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
msgid "View AI usage breakdown"
msgstr ""
#. js-lingui-id: nK72s8
#: src/pages/settings/ai/components/SettingsAgentLogsTab.tsx
msgid "View all evaluations"
@@ -15634,6 +15856,11 @@ msgstr ""
msgid "weeks"
msgstr ""
#. js-lingui-id: WKHqM+
#: src/modules/settings/data-model/object-details/components/tabs/SettingsObjectSearchSection.tsx
msgid "Weight"
msgstr ""
#. js-lingui-id: nTuObL
#: src/pages/auth/SignInUp.tsx
msgid "Welcome to Twenty"
@@ -15796,6 +16023,7 @@ msgstr ""
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
#: src/pages/settings/ai/SettingsAgentTurnDetail.tsx
#: src/pages/settings/ai/SettingsAgentForm.tsx
#: src/pages/settings/ai/SettingsAIUsageUserDetail.tsx
#: src/pages/settings/ai/SettingsAIPrompts.tsx
#: src/pages/settings/ai/SettingsAI.tsx
#: src/modules/views/view-picker/components/ViewPickerListContent.tsx
@@ -15810,6 +16038,7 @@ msgstr ""
#: src/modules/settings/domains/components/SettingsCustomDomain.tsx
#: src/modules/settings/domains/components/SettingPublicDomain.tsx
#: src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx
#: src/modules/settings/admin-panel/ai/components/SettingsAdminAI.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownVisibilityContent.tsx
#: src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownCustomView.tsx
#: src/modules/navigation-menu-item/display/sections/workspace/components/WorkspaceSection.tsx
@@ -15936,9 +16165,9 @@ msgstr ""
msgid "yearly"
msgstr ""
#. js-lingui-id: Y1GwUe
#. js-lingui-id: zkWmBh
#: src/modules/settings/enterprise/components/EnterprisePlanModal.tsx
msgid "Yearly subscription"
msgid "Yearly"
msgstr ""
#. js-lingui-id: +BGee5

Some files were not shown because too many files have changed in this diff Show More