Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
},
"dependencies": {
"@clickhouse/click-ui": "0.2.0-rc.4",
"@librechat/data-schemas": "^0.0.48",
"@librechat/data-schemas": "^0.0.51",
"@tailwindcss/vite": "^4.1.18",
"@tanstack/react-devtools": "0.10.0",
"@tanstack/react-query": "5.95.2",
Expand All @@ -41,7 +41,7 @@
"i18next-browser-languagedetector": "^8.2.1",
"input-otp": "^1.4.2",
"js-yaml": "^4.1.1",
"librechat-data-provider": "^0.8.407",
"librechat-data-provider": "^0.8.502",
"lucide-react": "^0.545.0",
"prom-client": "^15.1.3",
"react": "^19.2.0",
Expand Down
1 change: 1 addition & 0 deletions src/components/access/RolePermissionsPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const PERMISSION_TYPE_ORDER: PermissionTypes[] = [
PermissionTypes.MEMORIES,
PermissionTypes.MCP_SERVERS,
PermissionTypes.REMOTE_AGENTS,
PermissionTypes.SKILLS,
PermissionTypes.BOOKMARKS,
PermissionTypes.MULTI_CONVO,
PermissionTypes.TEMPORARY_CHAT,
Expand Down
5 changes: 5 additions & 0 deletions src/components/configuration/configMeta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,11 @@ export const SECTION_META: Record<
descriptionKey: 'com_config_section_fileStrategies_desc',
tab: 'files',
},
cloudfront: {
titleKey: 'com_config_section_cloudfront',
descriptionKey: 'com_config_section_cloudfront_desc',
tab: 'files',
},
imageOutputType: {
titleKey: 'com_config_section_imageOutputType',
descriptionKey: 'com_config_section_imageOutputType_desc',
Expand Down
6 changes: 6 additions & 0 deletions src/constants/role.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ export const PERMISSION_TYPE_SCHEMA: Record<PermissionTypes, Permissions[]> = {
Permissions.SHARE,
Permissions.SHARE_PUBLIC,
],
[PermissionTypes.SKILLS]: [
Permissions.USE,
Permissions.CREATE,
Permissions.SHARE,
Permissions.SHARE_PUBLIC,
],
};

export function defaultPermissions(): t.RolePermissions {
Expand Down
52 changes: 52 additions & 0 deletions src/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,8 @@
"com_config_field_firecrawlVersion": "Firecrawl version",
"com_config_field_jinaApiKey": "Jina API key",
"com_config_field_jinaApiUrl": "Jina API URL",
"com_config_field_tavilyApiKey": "Tavily API key",
"com_config_field_tavilySearchUrl": "Tavily search URL",
"com_config_field_cohereApiKey": "Cohere API key",
"com_config_field_searchProvider": "Search provider",
"com_config_field_scraperProvider": "Scraper provider",
Expand Down Expand Up @@ -606,8 +608,52 @@
"com_config_field_mcpServers_item": "server",
"com_config_field_default_item": "item",
"com_config_field_capabilities_item": "capability",
"com_config_field_tavilyExtractUrl": "Tavily extract URL",
"com_config_field_tavilySearchOptions": "Tavily search options",
"com_config_field_tavilyScraperOptions": "Tavily scraper options",
"com_config_field_searchDepth": "Search depth",
"com_config_field_extractDepth": "Extract depth",
"com_config_field_maxResults": "Max results",
"com_config_field_includeImages": "Include images",
"com_config_field_includeImageDescriptions": "Include image descriptions",
"com_config_field_includeFavicon": "Include favicon",
"com_config_field_includeAnswer": "Include answer",
"com_config_field_includeRawContent": "Include raw content",
"com_config_field_includeDomains": "Include domains",
"com_config_field_excludeDomains": "Exclude domains",
"com_config_field_topic": "Topic",
"com_config_field_timeRange": "Time range",
"com_config_field_chunksPerSource": "Chunks per source",
"com_config_field_format": "Format",
"com_config_field_allowedAddresses": "Allowed addresses",
"com_config_field_autoSubmitFromUrl": "Auto-submit from URL",
"com_config_field_skills": "Skills",
"com_config_field_defaultActiveOnShare": "Default active on share",
"com_config_field_thinkingDisplay": "Thinking display",
"com_config_field_cloudfront": "CloudFront",
"com_config_field_domain": "Domain",
"com_config_field_distributionId": "Distribution ID",
"com_config_field_invalidateOnDelete": "Invalidate on delete",
"com_config_field_imageSigning": "Image signing",
"com_config_field_urlExpiry": "URL expiry",
"com_config_field_cookieExpiry": "Cookie expiry",
"com_config_field_cookieDomain": "Cookie domain",
"com_config_field_storageRegion": "Storage region",
"com_config_field_includeRegionInPath": "Include region in path",
"com_config_field_requireSignedAccess": "Require signed access",
"com_config_field_remoteApi": "Remote API",
"com_config_field_auth": "Auth",
"com_config_field_oidc": "OIDC",
"com_config_field_issuer": "Issuer",
"com_config_field_audience": "Audience",
"com_config_field_jwksUri": "JWKS URI",
"com_config_field_allowedAddresses_item": "address",
"com_config_field_includeDomains_item": "domain",
"com_config_field_excludeDomains_item": "domain",
"com_config_section_fileStrategies": "File strategies",
"com_config_section_fileStrategies_desc": "Configure file handling strategies per endpoint",
"com_config_section_cloudfront": "CloudFront",
"com_config_section_cloudfront_desc": "Serve files through an Amazon CloudFront distribution",
"com_config_section_filteredTools": "Filtered tools",
"com_config_section_filteredTools_desc": "Tools excluded from availability",
"com_config_section_imageOutputType": "Image output type",
Expand Down Expand Up @@ -852,6 +898,7 @@
"com_perm_desc_MEMORIES": "Manage persistent memory across conversations",
"com_perm_desc_MCP_SERVERS": "Connect and manage MCP tool servers",
"com_perm_desc_REMOTE_AGENTS": "Connect and manage remote agent endpoints",
"com_perm_desc_SKILLS": "Create, share, and use agent skills",
"com_perm_desc_PEOPLE_PICKER": "Control visibility of users, groups, and roles",
"com_perm_type_BOOKMARKS": "Bookmarks",
"com_perm_type_PROMPTS": "Prompts",
Expand All @@ -867,6 +914,7 @@
"com_perm_type_FILE_CITATIONS": "File citations",
"com_perm_type_MCP_SERVERS": "MCP servers",
"com_perm_type_REMOTE_AGENTS": "Remote agents",
"com_perm_type_SKILLS": "Skills",
"com_perm_USE": "Use",
"com_perm_CREATE": "Create",
"com_perm_UPDATE": "Update",
Expand Down Expand Up @@ -946,6 +994,8 @@
"com_cap_manage_mcpservers": "Manage MCP servers",
"com_cap_read_prompts": "Read prompts",
"com_cap_manage_prompts": "Manage prompts",
"com_cap_read_skills": "Read skills",
"com_cap_manage_skills": "Manage skills",
"com_cap_read_assistants": "Read assistants",
"com_cap_manage_assistants": "Manage assistants",
"com_cap_desc_access_admin": "Full admin panel access",
Expand All @@ -964,6 +1014,8 @@
"com_cap_desc_manage_mcpservers": "Manage MCP server connections",
"com_cap_desc_read_prompts": "View prompt library",
"com_cap_desc_manage_prompts": "Create, edit, and delete prompts",
"com_cap_desc_read_skills": "View skill configurations",
"com_cap_desc_manage_skills": "Create, edit, and delete skills",
"com_cap_desc_read_assistants": "View assistant configurations",
"com_cap_desc_manage_assistants": "Create, edit, and delete assistants",
"com_access_denied_title": "Access denied",
Expand Down
18 changes: 16 additions & 2 deletions src/server/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -634,8 +634,22 @@ describe('validateFieldValue', () => {
* that LibreChat would reject at startup
* -----------------------------------------------------------------------*/

/** Per-path sample overrides for fields whose schema applies stricter
* validation than the generic control sample (URLs, host:port, etc.). */
const SAMPLE_OVERRIDES: Record<string, unknown> = {
'cloudfront.domain': 'https://example.com',
'cloudfront.cookieDomain': '.example.com',
'mcpSettings.allowedAddresses': ['localhost:11434'],
'actions.allowedAddresses': ['localhost:11434'],
'endpoints.allowedAddresses': ['localhost:11434'],
'endpoints.agents.remoteApi.auth.oidc.issuer': 'https://example.com',
'endpoints.agents.remoteApi.auth.oidc.jwksUri': 'https://example.com/.well-known/jwks.json',
'summarization.trigger': { type: 'token_ratio', value: 0.5 },
};

/** Generates a representative value that a given UI control would produce. */
function sampleValueForControl(field: t.SchemaField): unknown {
function sampleValueForControl(field: t.SchemaField, path?: string): unknown {
if (path && path in SAMPLE_OVERRIDES) return SAMPLE_OVERRIDES[path];
const control = getControlType(field);
switch (control) {
case 'toggle':
Expand Down Expand Up @@ -733,7 +747,7 @@ describe('control β†’ value β†’ safeParse round-trip (real configSchema)', () =>
const control = getControlType(field);

it(`${path} (${field.type} β†’ ${control}): sample value passes safeParse`, () => {
const value = sampleValueForControl(field);
const value = sampleValueForControl(field, path);

const sub = resolveSubSchema(realConfigSchema, path.split('.'));
if (!sub) return;
Expand Down