Compare commits

...
Author SHA1 Message Date
neo773 57fd9fe2b6 changes 2026-06-02 14:54:05 +05:30
neo773andGitHub 46a7c7595f Merge branch 'main' into microsoft-batching 2026-06-02 14:46:59 +05:30
neo773 0def017060 revert unintended file 2026-06-02 14:46:46 +05:30
neo773 6dfb1af261 Update microsoft-message-list-fetch-error-handler.service.ts 2026-06-02 14:26:34 +05:30
neo773 f438658b6b messaging: Microsoft driver Migrate p-limit to native batching
This PR migrates the p-limit library to Native graph SDK batching fixing the concurrency and rate limit issues in production seen for some larger accounts.
2026-06-02 14:25:38 +05:30
5f0096c464 i18n - website translations (#21088)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-06-02 10:45:36 +02:00
6ac797a69c fix: REST cursor encoding for nested order_by composite fields (#20974)
## Summary

fix: REST cursor encoding for nested order_by composite fields

Closes #20109

---
AI was used for assistance.

---------

Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: Etienne <45695613+etiennejouan@users.noreply.github.com>
2026-06-02 07:10:20 +00:00
3d6bcc3102 i18n - translations (#21128)
Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
2026-06-02 07:30:02 +02:00
Félix MalfaitandGitHub 75df1f3997 chore(settings): address review comments from PR 21072 (#21121)
## Summary

Round through bosiraphael's 31 review threads on the merged PR #21072
(discovery hero + ephemeral playground token). The user asked to apply
each suggestion only where it adds value, so this PR is split into three
buckets.

### Comments (~17 threads)

- Tightened security-rationale / CSS-gotcha / API-doc comments to one or
two factual lines
- Kept (shortened) the comments above `RequireAccessTokenGuard` call
sites — without them a future reader could remove the guard and silently
reopen the escalation hole
- Kept (shortened) the in-memory-only rationale on
`playgroundApiKeyState` for the same reason
- Kept `flex: 1 + min-height: 0` CSS gotcha on `SubMenuTopBarContainer`
— non-obvious and easy to break

### Structure / extraction

- Move `WEBHOOK_TABLE_ROW_GRID_TEMPLATE_COLUMNS` to its own constants
file (one-export-per-file)
- Split `SettingsAgentToolsTab` and `SettingsAgentToolsTable` across
queries/, hooks/, types/, utils/:
  - `graphql/queries/findManyApplicationsForToolTable.ts`
  - `graphql/queries/findManyMarketplaceAppsForToolTable.ts`
  - `hooks/useSettingsAgentToolsTable.ts` (data loading + index merging)
  - `types/SettingsAgentToolItem|Application|MarketplaceApp`
  - `utils/getToolApplicationId|getToolLink`
- Extract `SettingsAiModelsTab` optimistic mutations into
`hooks/useSettingsAiModelsActions` (handleModelFieldChange,
handleUseRecommendedToggle, handleModelToggle,
handleToggleAllVisibleModels)
- Extract `SettingsAI.handleCreateTool` into `hooks/useCreateTool`
- Drop unnecessary `useMemo` wrappers on `heroTabs` arrays
(SettingsObjects, SettingsLayout)
- Simplify `MenuItemToggle` handler in SettingsAgentSkillsTab:
`onToggleChange={setShowDeactivated}` (no longer wrapping with arrow +
read of stale `!showDeactivated`)

### Hero assets

- Replace placeholder `customize-illustration` with per-page exports
- Rename `layout/customize-illustration-{light,dark}.png` →
`layout/cover-{light,dark}.png`
- Add `cover-{light,dark}.png` for **applications** and **members**
(they were both pointing at the layout placeholder as a TODO)
- Overwrite `data-model/cover-*.png`, `playground/cover-*.png`,
`ai/ai-tools-cover-*.png` with the new exports

## Test plan

- [ ] `npx nx typecheck twenty-front` 
- [ ] `npx nx typecheck twenty-server` 
- [ ] `npx nx lint twenty-front`  (oxlint + oxfmt, 0 warnings/errors)
- [ ] `/settings/layout`, `/settings/data-model`,
`/settings/applications`, `/settings/ai`, `/settings/api-webhooks`,
`/settings/members` each render the new hero illustration (light + dark)
- [ ] AI tab: tool list still loads, search + Custom/Managed/Standard
filters still work, "New Tool" still navigates to detail
- [ ] AI tab: Models tab — smart/fast model select, "Use best models
only" toggle, per-model checkboxes, toggle-all all still
optimistic+revert on error
- [ ] Skills tab: "Deactivated" toggle still flips show/hide
- [ ] Webhooks table still uses the 1fr 28px grid
2026-06-02 07:23:14 +02:00
147 changed files with 2261 additions and 2462 deletions
@@ -1779,6 +1779,7 @@ enum FeatureFlagKey {
IS_EMAIL_GROUP_ENABLED
IS_JUNCTION_RELATIONS_ENABLED
IS_REST_METADATA_API_NEW_FORMAT_DIRECT
IS_SETTINGS_DISCOVERY_HERO_ENABLED
}
type WorkspaceUrls {
@@ -1411,7 +1411,7 @@ export interface FeatureFlag {
__typename: 'FeatureFlag'
}
export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_MARKETPLACE_SETTING_TAB_VISIBLE' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAIL_GROUP_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_REST_METADATA_API_NEW_FORMAT_DIRECT'
export type FeatureFlagKey = 'IS_UNIQUE_INDEXES_ENABLED' | 'IS_JSON_FILTER_ENABLED' | 'IS_MARKETPLACE_SETTING_TAB_VISIBLE' | 'IS_PUBLIC_DOMAIN_ENABLED' | 'IS_EMAIL_GROUP_ENABLED' | 'IS_JUNCTION_RELATIONS_ENABLED' | 'IS_REST_METADATA_API_NEW_FORMAT_DIRECT' | 'IS_SETTINGS_DISCOVERY_HERO_ENABLED'
export interface WorkspaceUrls {
customUrl?: Scalars['String']
@@ -8732,7 +8732,8 @@ export const enumFeatureFlagKey = {
IS_PUBLIC_DOMAIN_ENABLED: 'IS_PUBLIC_DOMAIN_ENABLED' as const,
IS_EMAIL_GROUP_ENABLED: 'IS_EMAIL_GROUP_ENABLED' as const,
IS_JUNCTION_RELATIONS_ENABLED: 'IS_JUNCTION_RELATIONS_ENABLED' as const,
IS_REST_METADATA_API_NEW_FORMAT_DIRECT: 'IS_REST_METADATA_API_NEW_FORMAT_DIRECT' as const
IS_REST_METADATA_API_NEW_FORMAT_DIRECT: 'IS_REST_METADATA_API_NEW_FORMAT_DIRECT' as const,
IS_SETTINGS_DISCOVERY_HERO_ENABLED: 'IS_SETTINGS_DISCOVERY_HERO_ENABLED' as const
}
export const enumIdentityProviderType = {
Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 70 KiB

@@ -289,6 +289,7 @@ export enum FeatureFlagKey {
IS_MARKETPLACE_SETTING_TAB_VISIBLE = 'IS_MARKETPLACE_SETTING_TAB_VISIBLE',
IS_PUBLIC_DOMAIN_ENABLED = 'IS_PUBLIC_DOMAIN_ENABLED',
IS_REST_METADATA_API_NEW_FORMAT_DIRECT = 'IS_REST_METADATA_API_NEW_FORMAT_DIRECT',
IS_SETTINGS_DISCOVERY_HERO_ENABLED = 'IS_SETTINGS_DISCOVERY_HERO_ENABLED',
IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED'
}
@@ -1641,6 +1641,7 @@ export enum FeatureFlagKey {
IS_MARKETPLACE_SETTING_TAB_VISIBLE = 'IS_MARKETPLACE_SETTING_TAB_VISIBLE',
IS_PUBLIC_DOMAIN_ENABLED = 'IS_PUBLIC_DOMAIN_ENABLED',
IS_REST_METADATA_API_NEW_FORMAT_DIRECT = 'IS_REST_METADATA_API_NEW_FORMAT_DIRECT',
IS_SETTINGS_DISCOVERY_HERO_ENABLED = 'IS_SETTINGS_DISCOVERY_HERO_ENABLED',
IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED'
}
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Kon nie verskaffer byvoeg nie"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Kon nie hulpmiddel skep nie"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Kon nie verstekmodel opdateer nie"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Kon nie model opdateer nie"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Kon nie modelkeusemodus opdateer nie"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Gereedskap-oproepe gemaak"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Hulpmiddel geskep"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "فشل في إضافة المزود"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "فشل إنشاء الأداة"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "فشل في تحديث النموذج الافتراضي"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "فشل في تحديث النموذج"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "فشل في تحديث وضع اختيار النموذج"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "عمليات استدعاء الأدوات المنفذة"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "تم إنشاء الأداة"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "No s'ha pogut afegir el proveïdor"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "No s'ha pogut crear l'eina"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "No s'ha pogut actualitzar el model predeterminat"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "No s'ha pogut actualitzar el model"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "No s'ha pogut actualitzar el mode de selecció de models"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Crides a eines efectuades"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Eina creada"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Nepodařilo se přidat poskytovatele"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Nepodařilo se vytvořit nástroj"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Nepodařilo se aktualizovat výchozí model"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Nepodařilo se aktualizovat model"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Nepodařilo se aktualizovat režim výběru modelu"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Provedená volání nástrojů"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Nástroj byl vytvořen"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Kunne ikke tilføje udbyder"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Kunne ikke oprette værktøj"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Kunne ikke opdatere standardmodellen"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Kunne ikke opdatere modellen"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Kunne ikke opdatere tilstand for modelvalg"
@@ -16015,7 +16010,7 @@ msgid "Tool calls made"
msgstr "Værktøjskald foretaget"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Værktøj oprettet"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Fehler beim Hinzufügen des Anbieters"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Erstellen des Tools fehlgeschlagen"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Standardmodell konnte nicht aktualisiert werden"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Fehler beim Aktualisieren des Modells"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Fehler beim Aktualisieren des Modellauswahlmodus"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Getätigte Tool-Aufrufe"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Tool erstellt"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Αποτυχία προσθήκης παρόχου"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Αποτυχία δημιουργίας εργαλείου"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Αποτυχία ενημέρωσης προεπιλεγμένου μοντέλου"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Αποτυχία ενημέρωσης μοντέλου"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Αποτυχία ενημέρωσης λειτουργίας επιλογής μοντέλου"
@@ -16017,7 +16012,7 @@ msgid "Tool calls made"
msgstr "Κλήσεις εργαλείων που έγιναν"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Το εργαλείο δημιουργήθηκε"
+5 -10
View File
@@ -7053,11 +7053,6 @@ msgstr "Failed to add provider"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr "Failed to create email handle. Email handles may not be configured on this server."
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Failed to create tool"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7198,13 +7193,13 @@ msgid "Failed to update default model"
msgstr "Failed to update default model"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Failed to update model"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7221,7 +7216,7 @@ msgid "Failed to update model recommendations"
msgstr "Failed to update model recommendations"
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Failed to update model selection mode"
@@ -16063,7 +16058,7 @@ msgid "Tool calls made"
msgstr "Tool calls made"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Tool created"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Error al añadir el proveedor"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "No se pudo crear la herramienta"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "No se pudo actualizar el modelo predeterminado"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Error al actualizar el modelo"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Error al actualizar el modo de selección de modelos"
@@ -16015,7 +16010,7 @@ msgid "Tool calls made"
msgstr "Llamadas a herramientas realizadas"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Herramienta creada"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Tarjoajan lisääminen epäonnistui"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Työkalun luominen epäonnistui"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Oletusmallin päivittäminen epäonnistui"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Mallin päivittäminen epäonnistui"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Mallin valintatilan päivittäminen epäonnistui"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Työkalukutsuja tehty"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Työkalu luotu"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Échec de l'ajout du fournisseur"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Échec de la création de l'outil"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Échec de la mise à jour du modèle par défaut"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Échec de la mise à jour du modèle"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Échec de la mise à jour du mode de sélection des modèles"
@@ -16015,7 +16010,7 @@ msgid "Tool calls made"
msgstr "Appels d'outils effectués"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Outil créé"
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
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "הוספת הספק נכשלה"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "יצירת הכלי נכשלה"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "עדכון מודל ברירת המחדל נכשל"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "העדכון של המודל נכשל"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "העדכון של מצב בחירת המודל נכשל"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "קריאות לכלים שבוצעו"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "הכלי נוצר"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Nem sikerült hozzáadni a szolgáltatót"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Nem sikerült létrehozni az eszközt"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Az alapértelmezett modell frissítése nem sikerült"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Nem sikerült frissíteni a modellt"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Nem sikerült frissíteni a modell kiválasztási módját"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Végrehajtott eszközhívások"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Eszköz létrehozva"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Impossibile aggiungere il provider"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Impossibile creare lo strumento"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Impossibile aggiornare il modello predefinito"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Impossibile aggiornare il modello"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Impossibile aggiornare la modalità di selezione del modello"
@@ -16015,7 +16010,7 @@ msgid "Tool calls made"
msgstr "Chiamate agli strumenti effettuate"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Strumento creato"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "プロバイダーの追加に失敗しました"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "ツールの作成に失敗しました"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "デフォルトモデルの更新に失敗しました"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "モデルの更新に失敗しました"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "モデル選択モードの更新に失敗しました"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "ツール呼び出しの回数"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "ツールが作成されました"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "공급자를 추가하지 못했습니다"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "도구 생성 실패"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "기본 모델 업데이트 실패"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "모델을 업데이트하지 못했습니다"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "모델 선택 모드를 업데이트하지 못했습니다"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "실행된 도구 호출"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "도구 생성됨"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Het toevoegen van de aanbieder is mislukt"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Aanmaken van tool mislukt"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Fout bij het bijwerken van het standaardmodel"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Fout bij het bijwerken van het model"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Fout bij het bijwerken van de modus voor modelselectie"
@@ -16015,7 +16010,7 @@ msgid "Tool calls made"
msgstr "Uitgevoerde toolaanroepen"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Tool aangemaakt"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Kunne ikke legge til tilbyder"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Kunne ikke opprette verktøy"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Kunne ikke oppdatere standardmodellen"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Kunne ikke oppdatere modell"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Kunne ikke oppdatere modus for modellvalg"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Verktøykall utført"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Verktøy opprettet"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Nie udało się dodać dostawcy"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Nie udało się utworzyć narzędzia"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Nie udało się zaktualizować modelu domyślnego"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Nie udało się zaktualizować modelu"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Nie udało się zaktualizować trybu wyboru modelu"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Wykonane wywołania narzędzi"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Utworzono narzędzie"
+5 -10
View File
@@ -7053,11 +7053,6 @@ msgstr ""
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr ""
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7198,13 +7193,13 @@ msgid "Failed to update default model"
msgstr ""
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr ""
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7221,7 +7216,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr ""
@@ -16008,7 +16003,7 @@ msgid "Tool calls made"
msgstr ""
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr ""
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Falha ao adicionar o provedor"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Falha ao criar a ferramenta"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Falha ao atualizar o modelo padrão"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Falha ao atualizar o modelo"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Falha ao atualizar o modo de seleção de modelos"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Chamadas de ferramentas realizadas"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Ferramenta criada"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Falha ao adicionar o provedor"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Falha ao criar ferramenta"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Falha ao atualizar o modelo padrão"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Falha ao atualizar o modelo"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Falha ao atualizar o modo de seleção de modelo"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Chamadas de ferramentas efetuadas"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Ferramenta criada"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Eroare la adăugarea furnizorului"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Crearea instrumentului a eșuat"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Eroare la actualizarea modelului implicit"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Eroare la actualizarea modelului"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Eroare la actualizarea modului de selecție a modelului"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Apeluri de instrumente efectuate"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Instrument creat"
Binary file not shown.
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Није успело додавање провајдера"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Није успело креирање алата"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Није успело ажурирање подразумеваног модела"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Није успело ажурирање модела"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Није успело ажурирање режима избора модела"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Остварени позиви алата"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Алат је креиран"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Det gick inte att lägga till leverantören"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Det gick inte att skapa verktyg"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Det gick inte att uppdatera standardmodellen"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr ""
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr ""
@@ -16021,7 +16016,7 @@ msgid "Tool calls made"
msgstr "Verktygsanrop gjorda"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Verktyg skapat"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Sağlayıcı eklenemedi"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Araç oluşturulamadı"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Varsayılan model güncellenemedi"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Model güncellenemedi"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Model seçim modu güncellenemedi"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Gerçekleştirilen araç çağrıları"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Araç oluşturuldu"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Не вдалося додати провайдера"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Не вдалося створити інструмент"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Не вдалося оновити модель за замовчуванням"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Не вдалося оновити модель"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Не вдалося оновити режим вибору моделі"
@@ -16015,7 +16010,7 @@ msgid "Tool calls made"
msgstr "Здійснено викликів інструментів"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Інструмент створено"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "Thêm nhà cung cấp thất bại"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "Tạo công cụ thất bại"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "Cập nhật mô hình mặc định thất bại"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "Cập nhật mô hình thất bại"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "Cập nhật chế độ chọn mô hình thất bại"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "Số lần gọi công cụ"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "Đã tạo công cụ"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "添加提供商失败"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "创建工具失败"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "更新默认模型失败"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "更新模型失败"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "更新模型选择模式失败"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "工具调用次数"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "工具已创建"
+5 -10
View File
@@ -7058,11 +7058,6 @@ msgstr "新增供應商失敗"
msgid "Failed to create email handle. Email handles may not be configured on this server."
msgstr ""
#. js-lingui-id: WM7GKt
#: src/pages/settings/ai/SettingsAI.tsx
msgid "Failed to create tool"
msgstr "建立工具失敗"
#. js-lingui-id: lWoewm
#: src/pages/settings/workspace/SettingsWorkspaceEmailGroupChannelDetail.tsx
msgid "Failed to delete email handle."
@@ -7203,13 +7198,13 @@ msgid "Failed to update default model"
msgstr "更新預設模型失敗"
#. js-lingui-id: 1R13Ov
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model"
msgstr "更新模型失敗"
#. js-lingui-id: W7Ff/4
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
#: src/pages/settings/admin-panel/SettingsAdminAiProviderDetail.tsx
msgid "Failed to update model availability"
@@ -7226,7 +7221,7 @@ msgid "Failed to update model recommendations"
msgstr ""
#. js-lingui-id: rCUG3c
#: src/pages/settings/ai/components/SettingsAiModelsTab.tsx
#: src/pages/settings/ai/hooks/useSettingsAiModelsActions.ts
msgid "Failed to update model selection mode"
msgstr "更新模型選擇模式失敗"
@@ -16013,7 +16008,7 @@ msgid "Tool calls made"
msgstr "已進行的工具呼叫"
#. js-lingui-id: SrWh42
#: src/pages/settings/ai/SettingsAI.tsx
#: src/pages/settings/ai/hooks/useCreateTool.ts
msgid "Tool created"
msgstr "工具已建立"
@@ -24,9 +24,6 @@ export const useEnterLayoutCustomizationMode = () => {
const { navigateSidePanel } = useNavigateSidePanel();
const { enqueueWarningSnackBar } = useSnackBar();
// Returns whether customization mode is active afterward, so callers that
// navigate on entry can skip navigation when entry was blocked (e.g. a
// dashboard is mid-edit).
const enterLayoutCustomizationMode = useCallback((): boolean => {
const isLayoutCustomizationModeAlreadyEnabled = store.get(
isLayoutCustomizationModeEnabledState.atom,
@@ -4,11 +4,13 @@ import {
} from '@/settings/components/SettingsCustomizeVideoModal';
import { HeroPlayButton } from '@/ui/layout/hero/components/HeroPlayButton';
import { useModal } from '@/ui/layout/modal/hooks/useModal';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { styled } from '@linaria/react';
import { useLingui } from '@lingui/react/macro';
import { useContext } from 'react';
import { Card } from 'twenty-ui/layout';
import { ThemeContext, themeCssVariables } from 'twenty-ui/theme-constants';
import { FeatureFlagKey } from '~/generated-metadata/graphql';
const COVER_HEIGHT = 150;
@@ -56,6 +58,9 @@ export const SettingsDiscoveryHeroCard = ({
const { t } = useLingui();
const { colorScheme } = useContext(ThemeContext);
const { openModal } = useModal();
const isDiscoveryVideoEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_SETTINGS_DISCOVERY_HERO_ENABLED,
);
const modalInstanceId = `${instanceIdPrefix}-modal`;
const tabsInstanceId = `${instanceIdPrefix}-tabs`;
@@ -67,19 +72,23 @@ export const SettingsDiscoveryHeroCard = ({
<Card rounded>
<StyledCoverContainer>
<StyledImage src={src} alt="" aria-hidden />
<StyledOverlay>
<HeroPlayButton
onClick={() => openModal(modalInstanceId)}
ariaLabel={playButtonAriaLabel ?? t`Watch demo`}
/>
</StyledOverlay>
{isDiscoveryVideoEnabled && (
<StyledOverlay>
<HeroPlayButton
onClick={() => openModal(modalInstanceId)}
ariaLabel={playButtonAriaLabel ?? t`Watch demo`}
/>
</StyledOverlay>
)}
</StyledCoverContainer>
</Card>
<SettingsCustomizeVideoModal
modalInstanceId={modalInstanceId}
tabsInstanceId={tabsInstanceId}
tabs={tabs}
/>
{isDiscoveryVideoEnabled && (
<SettingsCustomizeVideoModal
modalInstanceId={modalInstanceId}
tabsInstanceId={tabsInstanceId}
tabs={tabs}
/>
)}
</>
);
};
@@ -6,15 +6,10 @@ import { ThemeContext, themeCssVariables } from 'twenty-ui/theme-constants';
export type SettingsStatRow = {
Icon: IconComponent;
label: string;
// String so callers can render a placeholder (e.g. "—") while async counts
// are still loading. Layout stats just pass `count.toString()`.
value: string;
};
type SettingsStatsGridProps = {
// Each inner array is one column rendered top-to-bottom; columns are
// separated by a vertical divider. Pass [[a, b], [c, d]] for a 2x2 layout
// or [[a, b, c]] for a single column.
columns: SettingsStatRow[][];
};
Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 40 KiB

@@ -3,12 +3,8 @@ import { styled } from '@linaria/react';
import { MOBILE_VIEWPORT, themeCssVariables } from 'twenty-ui/theme-constants';
import React from 'react';
// Column width used by the Applications data tables (Instances column).
export const SETTINGS_OBJECT_TABLE_COLUMN_WIDTH = '98.7px';
// Relative grid: Name takes all remaining space (with a floor); App / Fields /
// Instances get fixed minimums so short text columns don't collapse; trailing
// 36 px holds the chevron / action cell.
export const SETTINGS_OBJECT_TABLE_ROW_GRID_TEMPLATE_COLUMNS = `minmax(180px, 1fr) 140px 80px 100px 36px`;
export const SETTINGS_OBJECT_TABLE_ROW_MOBILE_MIN_WIDTH = '520px';
@@ -58,7 +58,6 @@ export const ObjectLayout = ({ objectMetadataItem }: ObjectLayoutProps) => {
return;
}
// Skip navigation when entry was blocked (e.g. a dashboard is mid-edit).
if (!enterLayoutCustomizationMode()) {
return;
}
@@ -1,5 +1,6 @@
import { styled } from '@linaria/react';
import { WEBHOOK_TABLE_ROW_GRID_TEMPLATE_COLUMNS } from '@/settings/developers/constants/WebhookTableRowGridTemplateColumns';
import { TableCell } from '@/ui/layout/table/components/TableCell';
import { TableRow } from '@/ui/layout/table/components/TableRow';
import { getUrlHostnameOrThrow, isValidUrl } from 'twenty-shared/utils';
@@ -11,8 +12,6 @@ import { useContext } from 'react';
import { ThemeContext, themeCssVariables } from 'twenty-ui/theme-constants';
import { type Webhook } from '~/generated-metadata/graphql';
export const WEBHOOK_TABLE_ROW_GRID_TEMPLATE_COLUMNS = '1fr 28px';
const StyledIconChevronRightContainer = styled.span`
align-items: center;
color: ${themeCssVariables.font.color.tertiary};
@@ -1,9 +1,7 @@
import { styled } from '@linaria/react';
import {
SettingsDevelopersWebhookTableRow,
WEBHOOK_TABLE_ROW_GRID_TEMPLATE_COLUMNS,
} from '@/settings/developers/components/SettingsDevelopersWebhookTableRow';
import { SettingsDevelopersWebhookTableRow } from '@/settings/developers/components/SettingsDevelopersWebhookTableRow';
import { WEBHOOK_TABLE_ROW_GRID_TEMPLATE_COLUMNS } from '@/settings/developers/constants/WebhookTableRowGridTemplateColumns';
import { Table } from '@/ui/layout/table/components/Table';
import { TableBody } from '@/ui/layout/table/components/TableBody';
import { TableHeader } from '@/ui/layout/table/components/TableHeader';
@@ -0,0 +1 @@
export const WEBHOOK_TABLE_ROW_GRID_TEMPLATE_COLUMNS = '1fr 28px';
Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 KiB

After

Width:  |  Height:  |  Size: 111 KiB

@@ -19,9 +19,6 @@ const playgroundSetupFormSchema = z.object({
type PlaygroundSetupFormValues = z.infer<typeof playgroundSetupFormSchema>;
// Last column shrinks to the Launch button's content width so its right
// edge sits at the form's right edge. The two select columns share the
// remaining space equally.
const StyledForm = styled.form`
align-items: end;
display: grid;
@@ -1,11 +1,12 @@
import { PlaygroundSetupForm } from '@/settings/playground/components/PlaygroundSetupForm';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { type Meta, type StoryObj } from '@storybook/react-vite';
import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing';
const meta: Meta<typeof PlaygroundSetupForm> = {
title: 'Modules/Settings/Playground/PlaygroundSetupForm',
component: PlaygroundSetupForm,
decorators: [ComponentDecorator, RouterDecorator],
decorators: [ComponentDecorator, RouterDecorator, SnackBarDecorator],
parameters: {
docs: {
description: {
@@ -2,17 +2,13 @@ import { createAtomState } from '@/ui/utilities/state/jotai/utils/createAtomStat
import { isDefined } from 'twenty-shared/utils';
import { type AuthToken } from '~/generated-metadata/graphql';
// In-memory only: a short-lived, full-permission bearer token. Keeping it out of
// localStorage bounds the exfiltration window to the current tab and leaves no
// usable credential at rest after the tab closes.
// In-memory only — never persist this bearer token to localStorage.
export const playgroundApiKeyState = createAtomState<AuthToken | null>({
key: 'playgroundApiKeyState',
defaultValue: null,
});
// Usable only while it stays valid for at least `bufferMs` longer. Consumers pass
// no buffer (reject the moment it expires); the launcher passes a buffer so it
// re-mints before a near-expired token can fail mid-session.
// Returns true when the token is still valid `bufferMs` from now.
export const isPlaygroundApiKeyFresh = (
token: AuthToken | null,
bufferMs = 0,
@@ -20,9 +20,6 @@ type SubMenuTopBarContainerProps = {
tag?: JSX.Element;
};
// Cards, forms, and tables inside the white panel are centered in a fixed
// max-width column so they don't sprawl on large displays. The white panel
// itself spans edge-to-edge; only the content is constrained.
const SETTINGS_CONTENT_MAX_WIDTH = 760;
const StyledContainer = styled.div`
@@ -31,10 +28,8 @@ const StyledContainer = styled.div`
width: 100%;
`;
// flex: 1 + min-height: 0 keep the vertical-scroll chain intact: PagePanel's
// own overflow handling sits one level up and depends on its children
// participating in the flex height calculation rather than collapsing to
// content height.
// flex: 1 + min-height: 0 are required for PagePanel's overflow chain — the
// child must participate in the flex height calc rather than collapse to content.
const StyledBodyContentWrapper = styled.div`
display: flex;
flex: 1;
@@ -72,12 +67,6 @@ export const SubMenuTopBarContainer = ({
<PageHeader title={<Breadcrumb links={links} />}>
{actionButton}
</PageHeader>
{/*
MainContainerLayoutWithSidePanel is the same wrapper the App's record
pages use: it renders the page body on the left and SidePanelForDesktop
on the right. Hosting it here lets the AI chat side panel (and any
other side-panel page) open in settings exactly as it does in the App.
*/}
<MainContainerLayoutWithSidePanel>
<StyledBodyContentWrapper>
<InformationBannerWrapper />
@@ -5,24 +5,13 @@ import { type ReactNode } from 'react';
import { AnimatedExpandableContainer } from 'twenty-ui/layout';
type CollapsibleNavigationDrawerSectionProps = {
// Unique id used to persist the open/closed state in localStorage. Pass
// a namespaced value (e.g. 'settings/User') so unrelated sections in
// different drawers don't share state.
// Namespaced id (e.g. 'settings/User') used to persist open/closed state.
sectionId: string;
label: string;
children: ReactNode;
// Optional wrapper around the section title (e.g. AdvancedSettingsWrapper
// for advanced-mode-only sections). Receives the title node and returns
// the wrapped node.
wrapTitle?: (titleNode: ReactNode) => ReactNode;
};
// One-stop section component for any drawer that wants the main-app's
// collapsible section behavior: click the title to collapse / expand,
// animated height transition, persisted open state, chevron-on-hover.
// Use this instead of stitching together NavigationDrawerSection +
// NavigationDrawerSectionTitle + AnimatedExpandableContainer by hand at
// every call site.
export const CollapsibleNavigationDrawerSection = ({
sectionId,
label,
@@ -5,8 +5,6 @@ import { styled } from '@linaria/react';
import { useIsMobile } from 'twenty-ui/utilities';
import { themeCssVariables } from 'twenty-ui/theme-constants';
// Mobile keeps the touch-friendly horizontal padding; on desktop the container
// is edge-to-edge and the child supplies its own padding.
const StyledFixedContainer = styled.div<{ isMobile?: boolean }>`
padding-left: ${({ isMobile }) =>
isMobile ? themeCssVariables.spacing[5] : '0'};
@@ -52,9 +52,6 @@ export type NavigationDrawerItemProps = {
onClick?: () => void;
Icon?: IconComponent | ((props: TablerIconsProps) => JSX.Element);
iconColor?: string | null;
// Wrap the plain icon in a soft grey tile (no border) — used by the
// settings drawer so its icons read as a uniform group without picking
// up TintedIconTile's bordered colored treatment.
withIconBackground?: boolean;
active?: boolean;
modifier?: NavigationDrawerItemModifier;
@@ -206,10 +203,6 @@ const StyledIcon = styled.div`
margin-right: ${themeCssVariables.spacing[2]};
`;
// Soft grey background-only tile (no border) used by the settings drawer.
// Sized one step larger than the icon so the icon sits with a couple of
// pixels of breathing room on every side. radius.md matches the rest of
// the App's small-card / tile language; radius.sm read as sharp squares.
const StyledIconBackgroundTile = styled.div`
align-items: center;
background-color: ${themeCssVariables.background.tertiary};
@@ -1,16 +1,11 @@
import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { usePersistLogicFunction } from '@/logic-functions/hooks/usePersistLogicFunction';
import { SettingsDiscoveryHeroCard } from '@/settings/components/SettingsDiscoveryHeroCard';
import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer';
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer';
import { TabList } from '@/ui/layout/tab-list/components/TabList';
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { SettingsPath } from 'twenty-shared/types';
import { getSettingsPath, isDefined } from 'twenty-shared/utils';
import { getSettingsPath } from 'twenty-shared/utils';
import { t } from '@lingui/core/macro';
import {
@@ -30,6 +25,7 @@ import { SettingsAiModelsTab } from '~/pages/settings/ai/components/SettingsAiMo
import { SettingsAiOverviewTab } from '~/pages/settings/ai/components/SettingsAiOverviewTab';
import { SettingsAiUsageTab } from '~/pages/settings/ai/components/SettingsAiUsageTab';
import { SETTINGS_AI_TABS } from '~/pages/settings/ai/constants/SettingsAiTabs';
import { useCreateTool } from '~/pages/settings/ai/hooks/useCreateTool';
const AI_HERO_LIGHT = '/images/ai/ai-tools-cover-light.png';
const AI_HERO_DARK = '/images/ai/ai-tools-cover-dark.png';
@@ -37,55 +33,13 @@ const AI_HERO_DARK = '/images/ai/ai-tools-cover-dark.png';
const SETTINGS_AI_HERO_INSTANCE_ID_PREFIX = 'settings-ai-hero';
export const SettingsAI = () => {
const navigate = useNavigate();
const { enqueueSuccessSnackBar, enqueueErrorSnackBar } = useSnackBar();
const { createLogicFunction } = usePersistLogicFunction();
const [isCreatingTool, setIsCreatingTool] = useState(false);
const { handleCreateTool, isCreatingTool } = useCreateTool();
const activeTabId = useAtomComponentStateValue(
activeTabIdComponentState,
SETTINGS_AI_TABS.COMPONENT_INSTANCE_ID,
);
const handleCreateTool = async () => {
setIsCreatingTool(true);
try {
const result = await createLogicFunction({
input: {
name: 'new-tool',
toolTriggerSettings: {
inputSchema: { type: 'object', properties: {} },
},
},
});
if (result.status === 'successful' && isDefined(result.response?.data)) {
const newLogicFunction = result.response.data.createOneLogicFunction;
enqueueSuccessSnackBar({ message: t`Tool created` });
const applicationId = newLogicFunction.applicationId;
if (isDefined(applicationId)) {
navigate(
getSettingsPath(SettingsPath.ApplicationLogicFunctionDetail, {
applicationId,
logicFunctionId: newLogicFunction.id,
}),
);
} else {
navigate(
getSettingsPath(SettingsPath.LogicFunctionDetail, {
logicFunctionId: newLogicFunction.id,
}),
);
}
} else {
enqueueErrorSnackBar({ message: t`Failed to create tool` });
}
} finally {
setIsCreatingTool(false);
}
};
const tabs = [
{
id: SETTINGS_AI_TABS.TABS_IDS.OVERVIEW,
@@ -104,7 +104,7 @@ export const SettingsAgentSkillsTab = () => {
<DropdownMenuItemsContainer>
<MenuItemToggle
LeftIcon={IconArchive}
onToggleChange={() => setShowDeactivated(!showDeactivated)}
onToggleChange={setShowDeactivated}
toggled={showDeactivated}
text={t`Deactivated`}
toggleSize="small"
@@ -1,80 +1,35 @@
import { gql } from '@apollo/client';
import { useQuery } from '@apollo/client/react';
import { styled } from '@linaria/react';
import { useLingui } from '@lingui/react/macro';
import { type ReactNode, useMemo, useState } from 'react';
import { type ReactNode, useState } from 'react';
import { useGetToolIndex } from '@/ai/hooks/useGetToolIndex';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { logicFunctionsSelector } from '@/logic-functions/states/logicFunctionsSelector';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { ToolCategory } from 'twenty-shared/ai';
import { isDefined } from 'twenty-shared/utils';
import { H2Title, IconLock, IconPuzzle, IconTool } from 'twenty-ui/display';
import { SearchInput } from 'twenty-ui/input';
import { Section } from 'twenty-ui/layout';
import { MenuItemToggle } from 'twenty-ui/navigation';
import { themeCssVariables } from 'twenty-ui/theme-constants';
import {
type SettingsAgentToolItem,
SettingsAgentToolsTable,
} from '~/pages/settings/ai/components/SettingsAgentToolsTable';
import { SettingsAgentToolsTable } from '~/pages/settings/ai/components/SettingsAgentToolsTable';
import { useSettingsAgentToolsTable } from '~/pages/settings/ai/hooks/useSettingsAgentToolsTable';
import { type SettingsAgentToolItem } from '~/pages/settings/ai/types/SettingsAgentToolItem';
import { normalizeSearchText } from '~/utils/normalizeSearchText';
const FIND_MANY_APPLICATIONS_FOR_TOOL_TABLE = gql`
query FindManyApplicationsForToolTable {
findManyApplications {
id
name
universalIdentifier
logo
}
}
`;
const FIND_MANY_MARKETPLACE_APPS_FOR_TOOL_TABLE = gql`
query FindManyMarketplaceAppsForToolTable {
findManyMarketplaceApps {
id
universalIdentifier
icon
logo
}
}
`;
const StyledSearchContainer = styled.div`
padding-bottom: ${themeCssVariables.spacing[2]};
`;
export const SettingsAgentToolsTab = () => {
const logicFunctions = useAtomStateValue(logicFunctionsSelector);
const currentWorkspace = useAtomStateValue(currentWorkspaceState);
const {
toolIndex,
loading: toolIndexLoading,
error: toolIndexError,
} = useGetToolIndex();
const { data: applicationsData } = useQuery<{
findManyApplications: Array<{
id: string;
name: string;
universalIdentifier: string;
logo?: string | null;
}>;
}>(FIND_MANY_APPLICATIONS_FOR_TOOL_TABLE);
const { data: marketplaceAppsData } = useQuery<{
findManyMarketplaceApps: Array<{
id: string;
universalIdentifier: string;
icon: string;
logo?: string | null;
}>;
}>(FIND_MANY_MARKETPLACE_APPS_FOR_TOOL_TABLE);
const { t } = useLingui();
const {
allTools,
applicationById,
marketplaceAppByUniversalIdentifier,
currentWorkspace,
isLoading,
} = useSettingsAgentToolsTable();
const [searchTerm, setSearchTerm] = useState('');
const [showCustomTools, setShowCustomTools] = useState(true);
const [showManagedTools, setShowManagedTools] = useState(true);
@@ -89,42 +44,6 @@ export const SettingsAgentToolsTab = () => {
const isCustom = (tool: SettingsAgentToolItem) =>
isDefined(tool.applicationId);
const allTools: SettingsAgentToolItem[] = useMemo(
() => [
...logicFunctions
.filter((fn) => isDefined(fn.toolTriggerSettings))
.map((fn) => ({
identifier: fn.id,
name: fn.name,
description: fn.description,
applicationId: fn.applicationId,
})),
...toolIndex
.filter((tool) => tool.category !== ToolCategory.LOGIC_FUNCTION)
.map((tool) => ({
identifier: tool.name,
name: tool.name,
description: tool.description,
category: tool.category,
objectName: tool.objectName,
icon: tool.icon,
})),
],
[logicFunctions, toolIndex],
);
const applicationById = new Map(
(applicationsData?.findManyApplications ?? []).map((application) => [
application.id,
application,
]),
);
const marketplaceAppByUniversalIdentifier = new Map(
(marketplaceAppsData?.findManyMarketplaceApps ?? []).map(
(marketplaceApp) => [marketplaceApp.universalIdentifier, marketplaceApp],
),
);
const filteredTools = allTools
.filter((tool) => {
const searchNormalized = normalizeSearchText(searchTerm);
@@ -149,8 +68,6 @@ export const SettingsAgentToolsTab = () => {
})
.sort((a, b) => a.name.localeCompare(b.name));
const isLoading = toolIndexLoading && !toolIndexError;
return (
<Section>
<H2Title
@@ -173,27 +90,21 @@ export const SettingsAgentToolsTab = () => {
<DropdownMenuItemsContainer>
<MenuItemToggle
LeftIcon={IconTool}
onToggleChange={() =>
setShowCustomTools(!showCustomTools)
}
onToggleChange={setShowCustomTools}
toggled={showCustomTools}
text={t`Custom`}
toggleSize="small"
/>
<MenuItemToggle
LeftIcon={IconLock}
onToggleChange={() =>
setShowManagedTools(!showManagedTools)
}
onToggleChange={setShowManagedTools}
toggled={showManagedTools}
text={t`Managed`}
toggleSize="small"
/>
<MenuItemToggle
LeftIcon={IconPuzzle}
onToggleChange={() =>
setShowStandardTools(!showStandardTools)
}
onToggleChange={setShowStandardTools}
toggled={showStandardTools}
text={t`Standard`}
toggleSize="small"
@@ -1,53 +1,34 @@
import { useContext } from 'react';
import Skeleton, { SkeletonTheme } from 'react-loading-skeleton';
import { type CurrentWorkspace } from '@/auth/states/currentWorkspaceState';
import { Table } from '@/ui/layout/table/components/Table';
import { TableHeader } from '@/ui/layout/table/components/TableHeader';
import { TableRow } from '@/ui/layout/table/components/TableRow';
import { styled } from '@linaria/react';
import { useLingui } from '@lingui/react/macro';
import { TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER } from 'twenty-shared/application';
import { SettingsPath } from 'twenty-shared/types';
import { getSettingsPath, isDefined } from 'twenty-shared/utils';
import { isDefined } from 'twenty-shared/utils';
import { IconChevronRight } from 'twenty-ui/display';
import { ThemeContext, themeCssVariables } from 'twenty-ui/theme-constants';
import { type CurrentWorkspace } from '@/auth/states/currentWorkspaceState';
import { SettingsToolIcon } from '~/pages/settings/ai/components/SettingsToolIcon';
import {
SettingsToolTableRow,
TOOL_TABLE_ROW_GRID_TEMPLATE_COLUMNS,
} from '~/pages/settings/ai/components/SettingsToolTableRow';
export type SettingsAgentToolItem = {
identifier: string;
name: string;
description?: string | null;
category?: string;
objectName?: string | null;
icon?: string | null;
applicationId?: string | null;
};
type Application = {
id: string;
name: string;
universalIdentifier: string;
logo?: string | null;
};
type MarketplaceApp = {
id: string;
universalIdentifier: string;
icon: string;
logo?: string | null;
};
import { type SettingsAgentToolApplication } from '~/pages/settings/ai/types/SettingsAgentToolApplication';
import { type SettingsAgentToolItem } from '~/pages/settings/ai/types/SettingsAgentToolItem';
import { type SettingsAgentToolMarketplaceApp } from '~/pages/settings/ai/types/SettingsAgentToolMarketplaceApp';
import { getToolApplicationId } from '~/pages/settings/ai/utils/getToolApplicationId';
import { getToolLink } from '~/pages/settings/ai/utils/getToolLink';
type SettingsAgentToolsTableProps = {
tools: SettingsAgentToolItem[];
isLoading: boolean;
applicationById: Map<string, Application>;
marketplaceAppByUniversalIdentifier: Map<string, MarketplaceApp>;
applicationById: Map<string, SettingsAgentToolApplication>;
marketplaceAppByUniversalIdentifier: Map<
string,
SettingsAgentToolMarketplaceApp
>;
currentWorkspace: CurrentWorkspace | null;
};
@@ -55,28 +36,6 @@ const StyledTableHeaderRowContainer = styled.div`
margin-bottom: ${themeCssVariables.spacing[2]};
`;
const getToolApplicationId = (
tool: SettingsAgentToolItem,
currentWorkspace: CurrentWorkspace | null,
): string => {
if (isDefined(tool.applicationId)) {
return tool.applicationId;
}
return (
currentWorkspace?.installedApplications?.find(
(app) =>
app.universalIdentifier ===
TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER,
)?.id ?? ''
);
};
const getToolLink = (tool: SettingsAgentToolItem): string =>
getSettingsPath(SettingsPath.AiToolDetail, {
toolIdentifier: tool.identifier,
});
export const SettingsAgentToolsTable = ({
tools,
isLoading,
@@ -10,17 +10,17 @@ import { getModelIcon } from '@/settings/ai/utils/getModelIcon';
import { SettingsCard } from '@/settings/components/SettingsCard';
import { SettingsOptionCardContentSelect } from '@/settings/components/SettingsOptions/SettingsOptionCardContentSelect';
import { SettingsOptionCardContentToggle } from '@/settings/components/SettingsOptions/SettingsOptionCardContentToggle';
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { Select } from '@/ui/input/components/Select';
import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth';
import { useAtomState } from '@/ui/utilities/state/jotai/hooks/useAtomState';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { useMutation, useQuery } from '@apollo/client/react';
import { useQuery } from '@apollo/client/react';
import { t } from '@lingui/core/macro';
import {
AUTO_SELECT_FAST_MODEL_ID,
AUTO_SELECT_SMART_MODEL_ID,
} from 'twenty-shared/constants';
import { SettingsPath } from 'twenty-shared/types';
import { getSettingsPath, isDefined } from 'twenty-shared/utils';
import {
H2Title,
IconBolt,
@@ -32,12 +32,8 @@ import { SearchInput } from 'twenty-ui/input';
import { Card, Section } from 'twenty-ui/layout';
import { UndecoratedLink } from 'twenty-ui/navigation';
import { ThemeContext, themeCssVariables } from 'twenty-ui/theme-constants';
import { SettingsPath } from 'twenty-shared/types';
import { getSettingsPath, isDefined } from 'twenty-shared/utils';
import {
GetAiSystemPromptPreviewDocument,
UpdateWorkspaceDocument,
} from '~/generated-metadata/graphql';
import { GetAiSystemPromptPreviewDocument } from '~/generated-metadata/graphql';
import { useSettingsAiModelsActions } from '~/pages/settings/ai/hooks/useSettingsAiModelsActions';
import { formatNumber } from '~/utils/format/formatNumber';
const StyledCustomModelsContainer = styled.div`
@@ -49,14 +45,19 @@ const StyledCustomModelsContainer = styled.div`
export const SettingsAiModelsTab = () => {
const { theme } = useContext(ThemeContext);
const { enqueueErrorSnackBar } = useSnackBar();
const [currentWorkspace, setCurrentWorkspace] = useAtomState(
currentWorkspaceState,
);
const [updateWorkspace] = useMutation(UpdateWorkspaceDocument);
const currentWorkspace = useAtomStateValue(currentWorkspaceState);
const [searchQuery, setSearchQuery] = useState('');
const { data: previewData } = useQuery(GetAiSystemPromptPreviewDocument);
const aiModels = useAtomStateValue(aiModelsState);
const { useRecommendedModels, realModels, enabledModels } =
useWorkspaceAiModelAvailability();
const {
handleModelFieldChange,
handleUseRecommendedToggle,
handleModelToggle,
handleToggleAllVisibleModels,
} = useSettingsAiModelsActions();
const systemPromptTokenCount =
previewData?.getAiSystemPromptPreview.estimatedTokenCount;
@@ -67,9 +68,6 @@ export const SettingsAiModelsTab = () => {
)} tokens)`
: t`Read the system prompts to understand how the AI works`;
const { useRecommendedModels, realModels, enabledModels } =
useWorkspaceAiModelAvailability();
const currentSmartModel = currentWorkspace?.smartModel;
const currentFastModel = currentWorkspace?.fastModel;
@@ -103,110 +101,11 @@ export const SettingsAiModelsTab = () => {
};
});
const handleModelFieldChange = async (
field: 'smartModel' | 'fastModel',
value: string,
) => {
if (!currentWorkspace?.id) return;
const previousValue = currentWorkspace[field];
try {
setCurrentWorkspace({ ...currentWorkspace, [field]: value });
await updateWorkspace({ variables: { input: { [field]: value } } });
} catch {
setCurrentWorkspace({ ...currentWorkspace, [field]: previousValue });
enqueueErrorSnackBar({ message: t`Failed to update model` });
}
};
const enabledModelIdSet = new Set(currentWorkspace?.enabledAiModelIds ?? []);
const handleUseRecommendedToggle = async (checked: boolean) => {
if (!currentWorkspace?.id) {
return;
}
const previousValue = currentWorkspace.useRecommendedModels;
let newEnabledIds = currentWorkspace.enabledAiModelIds ?? [];
if (!checked && previousValue) {
const recommendedModelIds = realModels
.filter((model) => model.isRecommended)
.map((model) => model.modelId);
newEnabledIds = recommendedModelIds;
}
try {
setCurrentWorkspace({
...currentWorkspace,
useRecommendedModels: checked,
enabledAiModelIds: newEnabledIds,
});
await updateWorkspace({
variables: {
input: {
useRecommendedModels: checked,
enabledAiModelIds: newEnabledIds,
},
},
});
} catch {
setCurrentWorkspace({
...currentWorkspace,
useRecommendedModels: previousValue,
});
enqueueErrorSnackBar({
message: t`Failed to update model selection mode`,
});
}
};
const handleModelToggle = async (
modelId: string,
isCurrentlyEnabled: boolean,
) => {
if (!currentWorkspace?.id) {
return;
}
const previousEnabled = currentWorkspace.enabledAiModelIds ?? [];
const newEnabledIds = isCurrentlyEnabled
? previousEnabled.filter((id) => id !== modelId)
: [...previousEnabled, modelId];
try {
setCurrentWorkspace({
...currentWorkspace,
enabledAiModelIds: newEnabledIds,
});
await updateWorkspace({
variables: {
input: {
enabledAiModelIds: newEnabledIds,
},
},
});
} catch {
setCurrentWorkspace({
...currentWorkspace,
enabledAiModelIds: previousEnabled,
});
enqueueErrorSnackBar({
message: t`Failed to update model availability`,
});
}
};
const filteredModels = searchQuery.trim()
? realModels.filter((model) => {
const query = searchQuery.toLowerCase();
return (
model.label.toLowerCase().includes(query) ||
(model.modelFamily?.toLowerCase().includes(query) ?? false) ||
@@ -284,34 +183,12 @@ export const SettingsAiModelsTab = () => {
models={filteredModels}
isChecked={(model) => enabledModelIdSet.has(model.modelId)}
onToggle={handleModelToggle}
onToggleAll={async (shouldCheckAll) => {
const previousIds = currentWorkspace?.enabledAiModelIds ?? [];
const visibleModelIds = new Set(
filteredModels.map((m) => m.modelId),
);
const newEnabledIds = shouldCheckAll
? [...new Set([...previousIds, ...visibleModelIds])]
: previousIds.filter((id) => !visibleModelIds.has(id));
try {
setCurrentWorkspace({
...currentWorkspace!,
enabledAiModelIds: newEnabledIds,
});
await updateWorkspace({
variables: { input: { enabledAiModelIds: newEnabledIds } },
});
} catch {
setCurrentWorkspace({
...currentWorkspace!,
enabledAiModelIds: previousIds,
});
enqueueErrorSnackBar({
message: t`Failed to update model availability`,
});
}
}}
onToggleAll={(shouldCheckAll) =>
handleToggleAllVisibleModels(
shouldCheckAll,
new Set(filteredModels.map((m) => m.modelId)),
)
}
anchorPrefix="workspace-model-row"
/>
</StyledCustomModelsContainer>
@@ -22,7 +22,6 @@ type ApplicationInfo = {
};
type MarketplaceAppInfo = {
icon: string;
logo?: string | null;
};
@@ -109,11 +108,6 @@ export const SettingsToolIcon = ({
);
}
if (isDefined(marketplaceApp)) {
const MarketplaceIcon = getIcon(marketplaceApp.icon);
return <MarketplaceIcon size={16} />;
}
if (isDefined(application)) {
return (
<Avatar
@@ -0,0 +1,12 @@
import { gql } from '@apollo/client';
export const FIND_MANY_APPLICATIONS_FOR_TOOL_TABLE = gql`
query FindManyApplicationsForToolTable {
findManyApplications {
id
name
universalIdentifier
logo
}
}
`;
@@ -0,0 +1,10 @@
import { gql } from '@apollo/client';
export const FIND_MANY_MARKETPLACE_APPS_FOR_TOOL_TABLE = gql`
query FindManyMarketplaceAppsForToolTable {
findManyMarketplaceApps {
id
logo
}
}
`;
@@ -0,0 +1,58 @@
import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { t } from '@lingui/core/macro';
import { SettingsPath } from 'twenty-shared/types';
import { getSettingsPath, isDefined } from 'twenty-shared/utils';
import { usePersistLogicFunction } from '@/logic-functions/hooks/usePersistLogicFunction';
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
export const useCreateTool = () => {
const navigate = useNavigate();
const { enqueueSuccessSnackBar } = useSnackBar();
const { createLogicFunction } = usePersistLogicFunction();
const [isCreatingTool, setIsCreatingTool] = useState(false);
const handleCreateTool = async () => {
setIsCreatingTool(true);
try {
const result = await createLogicFunction({
input: {
name: 'new-tool',
toolTriggerSettings: {
inputSchema: { type: 'object', properties: {} },
},
},
});
// Failure path already surfaces its own snackbar from usePersistLogicFunction.
if (result.status !== 'successful' || !isDefined(result.response?.data)) {
return;
}
const newLogicFunction = result.response.data.createOneLogicFunction;
enqueueSuccessSnackBar({ message: t`Tool created` });
const applicationId = newLogicFunction.applicationId;
if (isDefined(applicationId)) {
navigate(
getSettingsPath(SettingsPath.ApplicationLogicFunctionDetail, {
applicationId,
logicFunctionId: newLogicFunction.id,
}),
);
} else {
navigate(
getSettingsPath(SettingsPath.LogicFunctionDetail, {
logicFunctionId: newLogicFunction.id,
}),
);
}
} finally {
setIsCreatingTool(false);
}
};
return { handleCreateTool, isCreatingTool };
};
@@ -0,0 +1,81 @@
import { useQuery } from '@apollo/client/react';
import { useMemo } from 'react';
import { useGetToolIndex } from '@/ai/hooks/useGetToolIndex';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { logicFunctionsSelector } from '@/logic-functions/states/logicFunctionsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { ToolCategory } from 'twenty-shared/ai';
import { isDefined } from 'twenty-shared/utils';
import { FIND_MANY_APPLICATIONS_FOR_TOOL_TABLE } from '~/pages/settings/ai/graphql/queries/findManyApplicationsForToolTable';
import { FIND_MANY_MARKETPLACE_APPS_FOR_TOOL_TABLE } from '~/pages/settings/ai/graphql/queries/findManyMarketplaceAppsForToolTable';
import { type SettingsAgentToolApplication } from '~/pages/settings/ai/types/SettingsAgentToolApplication';
import { type SettingsAgentToolItem } from '~/pages/settings/ai/types/SettingsAgentToolItem';
import { type SettingsAgentToolMarketplaceApp } from '~/pages/settings/ai/types/SettingsAgentToolMarketplaceApp';
export const useSettingsAgentToolsTable = () => {
const logicFunctions = useAtomStateValue(logicFunctionsSelector);
const currentWorkspace = useAtomStateValue(currentWorkspaceState);
const {
toolIndex,
loading: toolIndexLoading,
error: toolIndexError,
} = useGetToolIndex();
const { data: applicationsData } = useQuery<{
findManyApplications: SettingsAgentToolApplication[];
}>(FIND_MANY_APPLICATIONS_FOR_TOOL_TABLE);
const { data: marketplaceAppsData } = useQuery<{
findManyMarketplaceApps: SettingsAgentToolMarketplaceApp[];
}>(FIND_MANY_MARKETPLACE_APPS_FOR_TOOL_TABLE);
const allTools: SettingsAgentToolItem[] = useMemo(
() => [
...logicFunctions
.filter((fn) => isDefined(fn.toolTriggerSettings))
.map((fn) => ({
identifier: fn.id,
name: fn.name,
description: fn.description,
applicationId: fn.applicationId,
})),
...toolIndex
.filter((tool) => tool.category !== ToolCategory.LOGIC_FUNCTION)
.map((tool) => ({
identifier: tool.name,
name: tool.name,
description: tool.description,
category: tool.category,
objectName: tool.objectName,
icon: tool.icon,
})),
],
[logicFunctions, toolIndex],
);
const applicationById = new Map(
(applicationsData?.findManyApplications ?? []).map((application) => [
application.id,
application,
]),
);
// MarketplaceApp.id IS the universal identifier — see
// marketplace-query.service.ts where `id: registration.universalIdentifier`.
const marketplaceAppByUniversalIdentifier = new Map(
(marketplaceAppsData?.findManyMarketplaceApps ?? []).map(
(marketplaceApp) => [marketplaceApp.id, marketplaceApp],
),
);
const isLoading = toolIndexLoading && !toolIndexError;
return {
allTools,
applicationById,
marketplaceAppByUniversalIdentifier,
currentWorkspace,
isLoading,
};
};
@@ -0,0 +1,137 @@
import { useMutation } from '@apollo/client/react';
import { t } from '@lingui/core/macro';
import { useWorkspaceAiModelAvailability } from '@/ai/hooks/useWorkspaceAiModelAvailability';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { useAtomState } from '@/ui/utilities/state/jotai/hooks/useAtomState';
import { UpdateWorkspaceDocument } from '~/generated-metadata/graphql';
export const useSettingsAiModelsActions = () => {
const { enqueueErrorSnackBar } = useSnackBar();
const [currentWorkspace, setCurrentWorkspace] = useAtomState(
currentWorkspaceState,
);
const [updateWorkspace] = useMutation(UpdateWorkspaceDocument);
const { realModels } = useWorkspaceAiModelAvailability();
const handleModelFieldChange = async (
field: 'smartModel' | 'fastModel',
value: string,
) => {
if (!currentWorkspace?.id) return;
const previousValue = currentWorkspace[field];
try {
setCurrentWorkspace({ ...currentWorkspace, [field]: value });
await updateWorkspace({ variables: { input: { [field]: value } } });
} catch {
setCurrentWorkspace({ ...currentWorkspace, [field]: previousValue });
enqueueErrorSnackBar({ message: t`Failed to update model` });
}
};
const handleUseRecommendedToggle = async (checked: boolean) => {
if (!currentWorkspace?.id) return;
const previousValue = currentWorkspace.useRecommendedModels;
let newEnabledIds = currentWorkspace.enabledAiModelIds ?? [];
if (!checked && previousValue) {
newEnabledIds = realModels
.filter((model) => model.isRecommended)
.map((model) => model.modelId);
}
try {
setCurrentWorkspace({
...currentWorkspace,
useRecommendedModels: checked,
enabledAiModelIds: newEnabledIds,
});
await updateWorkspace({
variables: {
input: {
useRecommendedModels: checked,
enabledAiModelIds: newEnabledIds,
},
},
});
} catch {
setCurrentWorkspace({
...currentWorkspace,
useRecommendedModels: previousValue,
});
enqueueErrorSnackBar({
message: t`Failed to update model selection mode`,
});
}
};
const handleModelToggle = async (
modelId: string,
isCurrentlyEnabled: boolean,
) => {
if (!currentWorkspace?.id) return;
const previousEnabled = currentWorkspace.enabledAiModelIds ?? [];
const newEnabledIds = isCurrentlyEnabled
? previousEnabled.filter((id) => id !== modelId)
: [...previousEnabled, modelId];
try {
setCurrentWorkspace({
...currentWorkspace,
enabledAiModelIds: newEnabledIds,
});
await updateWorkspace({
variables: { input: { enabledAiModelIds: newEnabledIds } },
});
} catch {
setCurrentWorkspace({
...currentWorkspace,
enabledAiModelIds: previousEnabled,
});
enqueueErrorSnackBar({
message: t`Failed to update model availability`,
});
}
};
const handleToggleAllVisibleModels = async (
shouldCheckAll: boolean,
visibleModelIds: Set<string>,
) => {
if (!currentWorkspace?.id) return;
const previousIds = currentWorkspace.enabledAiModelIds ?? [];
const newEnabledIds = shouldCheckAll
? [...new Set([...previousIds, ...visibleModelIds])]
: previousIds.filter((id) => !visibleModelIds.has(id));
try {
setCurrentWorkspace({
...currentWorkspace,
enabledAiModelIds: newEnabledIds,
});
await updateWorkspace({
variables: { input: { enabledAiModelIds: newEnabledIds } },
});
} catch {
setCurrentWorkspace({
...currentWorkspace,
enabledAiModelIds: previousIds,
});
enqueueErrorSnackBar({
message: t`Failed to update model availability`,
});
}
};
return {
handleModelFieldChange,
handleUseRecommendedToggle,
handleModelToggle,
handleToggleAllVisibleModels,
};
};
@@ -0,0 +1,6 @@
export type SettingsAgentToolApplication = {
id: string;
name: string;
universalIdentifier: string;
logo?: string | null;
};
@@ -0,0 +1,9 @@
export type SettingsAgentToolItem = {
identifier: string;
name: string;
description?: string | null;
category?: string;
objectName?: string | null;
icon?: string | null;
applicationId?: string | null;
};

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