Compare commits

..
Author SHA1 Message Date
Charles Bochet 3c2fed8232 feat: add batch updateManyViewGroups endpoint to fix Kanban reorder race conditions
Replace N sequential updateViewGroup mutations with a single
updateManyViewGroups batch mutation. The server processes all updates
in one validateBuildAndRunWorkspaceMigration call, eliminating
PostgreSQL lock contention and cache thundering herd.

- Add updateMany to ViewGroupService, refactor updateOne to delegate
- Add updateManyViewGroups mutation to ViewGroupResolver
- Create frontend GraphQL mutation and update persist hooks
- Add integration test for batch update operations

Fixes #18865

Made-with: Cursor
2026-03-27 08:32:53 +01:00
Rayan 14048f7253 fix: execute viewGroup mutations sequentially to prevent race conditions
Changes Promise.all concurrent mutations to sequential for...of loop.
This prevents race conditions in the workspace migration runner when
reordering stages in Kanban board.

Fixes #18865
2026-03-27 04:37:42 +00: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
3295f5ee07 fix logo upload during workspace onboarding (#18905)
Logo upload during onboarding failed because it required the Twenty
Standard Application, which doesn't exist yet at that point

We only need custom app's universalIdentifier
(workspace.workspaceCustomApplicationId, available from sign up) so we
can safely remove ApplicationService dependency


https://github.com/user-attachments/assets/a18599ee-0b91-4629-ad77-2f708351449a


/closes #18829

Co-authored-by: Charles Bochet <charles@twenty.com>
2026-03-25 08:02:08 +00:00
Abdul RahmanandGitHub 2bfd2f6b85 fix navigation menu item overflow issue (#18937)
Before
<img width="231" height="99" alt="Screenshot 2026-03-25 at 5 34 59 AM"
src="https://github.com/user-attachments/assets/47980a03-b2ec-47db-be16-db0a48b122dd"
/>


After
<img width="220" height="96" alt="Screenshot 2026-03-25 at 5 32 44 AM"
src="https://github.com/user-attachments/assets/5ad405c2-a697-407d-ac1e-450c4a0b9f62"
/>
2026-03-25 07:35:49 +00:00
5de269a64e i18n - docs translations (#18942)
Created by Github action

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-25 05:52:30 +01:00
cc7131b0b5 i18n - docs translations (#18941)
Created by Github action

Co-authored-by: github-actions <github-actions@twenty.com>
2026-03-25 04:18:13 +01:00
573 changed files with 157793 additions and 56388 deletions
+11 -7
View File
@@ -53,6 +53,8 @@ jobs:
image: redis
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 +68,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 +91,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
+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
+3 -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",
@@ -211,7 +211,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": {
@@ -1746,6 +1746,7 @@ enum FeatureFlagKey {
IS_RECORD_PAGE_LAYOUT_GLOBAL_EDITION_ENABLED
IS_CONNECTED_ACCOUNT_MIGRATED
IS_GRAPHQL_QUERY_TIMING_ENABLED
IS_RECORD_TABLE_WIDGET_ENABLED
}
type ClientConfig {
@@ -4089,6 +4090,7 @@ input UpdateObjectPayload {
labelIdentifierFieldMetadataId: UUID
imageIdentifierFieldMetadataId: UUID
isLabelSyncedWithName: Boolean
isSearchable: Boolean
}
input UpdateViewFieldInput {
@@ -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_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' | 'IS_RECORD_TABLE_WIDGET_ENABLED'
export interface ClientConfig {
appVersion?: Scalars['String']
@@ -6475,7 +6475,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 */
@@ -9154,7 +9154,8 @@ 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
}
export const enumConfigSource = {
@@ -10303,6 +10303,9 @@ export default {
"isLabelSyncedWithName": [
6
],
"isSearchable": [
6
],
"__typename": [
1
]
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=
+8 -1
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 && \
@@ -47,7 +49,7 @@ RUN npx esbuild packages/twenty-server/scripts/setup-db.ts \
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 +60,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 +109,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 +185,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/
@@ -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.
@@ -574,7 +574,7 @@ export default defineLogicFunction({
timeoutSeconds: 2,
handler,
triggers: [
// Public HTTP route trigger '/s/post-card/create'
// Öffentlicher HTTP-Routen-Trigger '/s/post-card/create'
{
universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6',
type: 'route',
@@ -582,13 +582,13 @@ export default defineLogicFunction({
httpMethod: 'GET',
isAuthRequired: false,
},
// Cron trigger (CRON pattern)
// Cron-Trigger (CRON-Muster)
// {
// universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2',
// type: 'cron',
// pattern: '0 0 1 1 *',
// },
// Database event trigger
// Datenbank-Ereignis-Trigger
// {
// universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156',
// type: 'databaseEvent',
@@ -804,8 +804,8 @@ const handler = async (params: { companyName: string; domain?: string }) => {
createTask: {
__args: {
data: {
title: `Enrich data for ${params.companyName}`,
body: `Domain: ${params.domain ?? 'unknown'}`,
title: `Daten für ${params.companyName} anreichern`,
body: `Domain: ${params.domain ?? 'unbekannt'}`,
},
},
id: true,
@@ -818,7 +818,7 @@ const handler = async (params: { companyName: string; domain?: string }) => {
export default defineLogicFunction({
universalIdentifier: 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
name: 'enrich-company',
description: 'Enrich a company record with external data',
description: 'Einen Unternehmensdatensatz mit externen Daten anreichern',
timeoutSeconds: 10,
handler,
isTool: true,
@@ -827,11 +827,11 @@ export default defineLogicFunction({
properties: {
companyName: {
type: 'string',
description: 'The name of the company to enrich',
description: 'Name des Unternehmens, das angereichert werden soll',
},
domain: {
type: 'string',
description: 'The company website domain (optional)',
description: 'Website-Domain des Unternehmens (optional)',
},
},
required: ['companyName'],
@@ -1221,7 +1221,7 @@ const client = new CoreApiClient();
const { me } = await client.query({ me: { id: true, displayName: true } });
const metadataClient = new MetadataApiClient();
const { currentWorkspace } = await metadataClient.query({ currentWorkspace: { id: true } });
const { currentWorkspace } = await metadataClient.query({ currentWorkspace: { id: true } });},{
```
`CoreApiClient` wird von `yarn twenty dev` automatisch neu generiert, sobald sich Ihre Objekte oder Felder ändern. `MetadataApiClient` ist im SDK bereits enthalten.
@@ -1252,10 +1252,10 @@ const metadataClient = new MetadataApiClient();
const fileBuffer = fs.readFileSync('./invoice.pdf');
const uploadedFile = await metadataClient.uploadFile(
fileBuffer, // file contents as a Buffer
'invoice.pdf', // filename
'application/pdf', // MIME type (defaults to 'application/octet-stream')
'58a0a314-d7ea-4865-9850-7fb84e72f30b', // field universal identifier
fileBuffer, // Dateiinhalte als Buffer
'invoice.pdf', // Dateiname
'application/pdf', // MIME-Typ (Standard: 'application/octet-stream')
'58a0a314-d7ea-4865-9850-7fb84e72f30b', // Universeller Feldbezeichner
);
console.log(uploadedFile);
@@ -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.
@@ -574,7 +574,7 @@ export default defineLogicFunction({
timeoutSeconds: 2,
handler,
triggers: [
// Public HTTP route trigger '/s/post-card/create'
// Trigger di route HTTP pubblica '/s/post-card/create'
{
universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6',
type: 'route',
@@ -582,13 +582,13 @@ export default defineLogicFunction({
httpMethod: 'GET',
isAuthRequired: false,
},
// Cron trigger (CRON pattern)
// Trigger Cron (pattern CRON)
// {
// universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2',
// type: 'cron',
// pattern: '0 0 1 1 *',
// },
// Database event trigger
// Trigger di evento del database
// {
// universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156',
// type: 'databaseEvent',
@@ -804,8 +804,8 @@ const handler = async (params: { companyName: string; domain?: string }) => {
createTask: {
__args: {
data: {
title: `Enrich data for ${params.companyName}`,
body: `Domain: ${params.domain ?? 'unknown'}`,
title: `Arricchisci i dati per ${params.companyName}`,
body: `Dominio: ${params.domain ?? 'sconosciuto'}`,
},
},
id: true,
@@ -818,7 +818,7 @@ const handler = async (params: { companyName: string; domain?: string }) => {
export default defineLogicFunction({
universalIdentifier: 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
name: 'enrich-company',
description: 'Enrich a company record with external data',
description: 'Arricchisci un record aziendale con dati esterni',
timeoutSeconds: 10,
handler,
isTool: true,
@@ -827,11 +827,11 @@ export default defineLogicFunction({
properties: {
companyName: {
type: 'string',
description: 'The name of the company to enrich',
description: 'Il nome dell\'azienda da arricchire',
},
domain: {
type: 'string',
description: 'The company website domain (optional)',
description: 'Il dominio del sito web dell\'azienda (facoltativo)',
},
},
required: ['companyName'],
@@ -1221,7 +1221,7 @@ const client = new CoreApiClient();
const { me } = await client.query({ me: { id: true, displayName: true } });
const metadataClient = new MetadataApiClient();
const { currentWorkspace } = await metadataClient.query({ currentWorkspace: { id: true } });
const { currentWorkspace } = await metadataClient.query({ currentWorkspace: { id: true } });},{
```
`CoreApiClient` viene rigenerato automaticamente da `yarn twenty dev` ogni volta che i tuoi oggetti o campi cambiano. `MetadataApiClient` è fornito pronto all'uso con l'SDK.
@@ -1252,10 +1252,10 @@ const metadataClient = new MetadataApiClient();
const fileBuffer = fs.readFileSync('./invoice.pdf');
const uploadedFile = await metadataClient.uploadFile(
fileBuffer, // file contents as a Buffer
'invoice.pdf', // filename
'application/pdf', // MIME type (defaults to 'application/octet-stream')
'58a0a314-d7ea-4865-9850-7fb84e72f30b', // field universal identifier
fileBuffer, // contenuto del file come Buffer
'invoice.pdf', // nome del file
'application/pdf', // Tipo MIME (predefinito: 'application/octet-stream')
'58a0a314-d7ea-4865-9850-7fb84e72f30b', // identificatore universale del campo
);
console.log(uploadedFile);
@@ -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.
@@ -596,7 +596,7 @@ export default defineLogicFunction({
// updatedFields: ['name'],
// },
],
});
});},{
```
Tipuri comune de declanșatoare:
@@ -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.
@@ -596,7 +596,7 @@ export default defineLogicFunction({
// updatedFields: ['name'],
// },
],
});
});},{
```
Распространённые типы триггеров:
@@ -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 поддерживает логические функции для рабочих процессов и интерпретатор кода для анализа данных ИИ. Оба запускают предоставленный пользователем код и требуют явной настройки в целях безопасности.
@@ -555,8 +555,8 @@ import { CoreApiClient, type Person } from 'twenty-client-sdk/core';
const handler = async (params: RoutePayload) => {
const client = new CoreApiClient();
const name = 'name' in params.queryStringParameters
? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world'
: 'Hello world';
? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Merhaba dünya'
: 'Merhaba dünya';
const result = await client.mutation({
createPostCard: {
@@ -574,7 +574,7 @@ export default defineLogicFunction({
timeoutSeconds: 2,
handler,
triggers: [
// Public HTTP route trigger '/s/post-card/create'
// Herkese açık HTTP rota tetikleyicisi '/s/post-card/create'
{
universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6',
type: 'route',
@@ -582,13 +582,13 @@ export default defineLogicFunction({
httpMethod: 'GET',
isAuthRequired: false,
},
// Cron trigger (CRON pattern)
// Cron tetikleyicisi (CRON deseni)
// {
// universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2',
// type: 'cron',
// pattern: '0 0 1 1 *',
// },
// Database event trigger
// Veritabanı olay tetikleyicisi
// {
// universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156',
// type: 'databaseEvent',
@@ -804,8 +804,8 @@ const handler = async (params: { companyName: string; domain?: string }) => {
createTask: {
__args: {
data: {
title: `Enrich data for ${params.companyName}`,
body: `Domain: ${params.domain ?? 'unknown'}`,
title: `${params.companyName} için verileri zenginleştir`,
body: `Alan adı: ${params.domain ?? 'bilinmiyor'}`,
},
},
id: true,
@@ -818,7 +818,7 @@ const handler = async (params: { companyName: string; domain?: string }) => {
export default defineLogicFunction({
universalIdentifier: 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
name: 'enrich-company',
description: 'Enrich a company record with external data',
description: 'Bir şirket kaydını harici verilerle zenginleştir',
timeoutSeconds: 10,
handler,
isTool: true,
@@ -827,11 +827,11 @@ export default defineLogicFunction({
properties: {
companyName: {
type: 'string',
description: 'The name of the company to enrich',
description: 'Zenginleştirilecek şirketin adı',
},
domain: {
type: 'string',
description: 'The company website domain (optional)',
description: 'Şirket web sitesi alan adı (isteğe bağlı)',
},
},
required: ['companyName'],
@@ -1221,7 +1221,7 @@ const client = new CoreApiClient();
const { me } = await client.query({ me: { id: true, displayName: true } });
const metadataClient = new MetadataApiClient();
const { currentWorkspace } = await metadataClient.query({ currentWorkspace: { id: true } });
const { currentWorkspace } = await metadataClient.query({ currentWorkspace: { id: true } });},{
```
`CoreApiClient`, nesneleriniz veya alanlarınız değiştiğinde `yarn twenty dev` tarafından otomatik olarak yeniden oluşturulur. `MetadataApiClient`, SDK ile birlikte önceden hazırlanmış olarak gelir.
@@ -1252,10 +1252,10 @@ const metadataClient = new MetadataApiClient();
const fileBuffer = fs.readFileSync('./invoice.pdf');
const uploadedFile = await metadataClient.uploadFile(
fileBuffer, // file contents as a Buffer
'invoice.pdf', // filename
'application/pdf', // MIME type (defaults to 'application/octet-stream')
'58a0a314-d7ea-4865-9850-7fb84e72f30b', // field universal identifier
fileBuffer, // dosya içeriği (Buffer olarak)
'invoice.pdf', // dosya adı
'application/pdf', // MIME türü (varsayılan: 'application/octet-stream')
'58a0a314-d7ea-4865-9850-7fb84e72f30b', // alanın evrensel tanımlayıcısı
);
console.log(uploadedFile);
@@ -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
+162 -51
View File
@@ -501,10 +501,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 +537,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
@@ -1451,6 +1451,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 +1746,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 +1816,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 +2367,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}"
@@ -3008,6 +3023,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 +3120,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 +3229,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 +3398,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 +3890,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"
@@ -4209,6 +4232,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 +4364,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 +4382,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 +4955,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 +5178,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"
@@ -6350,7 +6386,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 +6411,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"
@@ -6748,9 +6784,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 +6800,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 +7405,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 +7518,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 +7560,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 +7740,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 +9166,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"
@@ -9153,6 +9217,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"
@@ -9293,6 +9358,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 +9600,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"
@@ -9675,6 +9741,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"
@@ -9973,6 +10044,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"
@@ -10258,6 +10335,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 +10580,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 +10678,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"
@@ -10973,6 +11054,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 +11606,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 +11904,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 +11916,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 +12218,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 +12284,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 +12344,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 +12369,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"
@@ -13038,6 +13144,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 +13228,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 +13250,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 +13396,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 +13705,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 +13854,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"
@@ -14830,6 +14924,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"
@@ -15099,6 +15200,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"
@@ -15638,6 +15744,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"
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
+156 -45
View File
@@ -501,9 +501,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 +537,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
@@ -1451,6 +1451,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 +1746,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 +1816,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 +2367,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}"
@@ -3008,6 +3023,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 +3120,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 +3229,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 +3398,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 +3890,7 @@ msgstr ""
#. js-lingui-id: HAzhV7
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Credentials"
msgstr ""
@@ -4209,6 +4232,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 +4364,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 +4382,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 +4955,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 +5178,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"
@@ -6350,7 +6386,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 +6411,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 ""
@@ -6748,9 +6784,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 +6800,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 +7405,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 +7518,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 +7560,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 +7740,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 +9166,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 ""
@@ -9153,6 +9217,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 ""
@@ -9293,6 +9358,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 +9600,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 ""
@@ -9675,6 +9741,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"
@@ -9973,6 +10044,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"
@@ -10258,6 +10335,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 +10580,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 +10678,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 ""
@@ -10973,6 +11054,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 +11606,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 +11904,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 +11916,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 +12218,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 +12284,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 +12344,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 +12369,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"
@@ -13038,6 +13144,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 +13228,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 +13250,7 @@ msgstr ""
#. js-lingui-id: PCSkw2
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/components/SettingsAgentSkills.tsx
msgid "Skills"
msgstr ""
@@ -13284,9 +13396,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 +13705,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 +13854,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"
@@ -14828,6 +14922,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"
@@ -15097,6 +15198,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"
@@ -15634,6 +15740,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"
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
Binary file not shown.
File diff suppressed because it is too large Load Diff

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