Skip to content

🗂️ feat: Files & Storage and System Editors (Wave 2) - #169

Merged
danny-avila merged 73 commits into
mainfrom
feat/config-w2-6-filesys
Oct 23, 2026
Merged

danny-avila merged 73 commits into
mainfrom
feat/config-w2-6-filesys

Conversation

@danny-avila

Copy link
Copy Markdown
Contributor

Stack 6/7 of the Wave 2 Configuration-page editors. Based on the previous PR in the stack (feat/config-w2-5-features). Merge the stack bottom-up, or all at once with the GitHub stack merge.

Summary

Purpose-built editors for the Files & storage and System tabs (WS14: FX-6 to FX-13, FX-15).

Files & storage

  • Storage card. fileStrategy, fileStrategies and cloudfront become one card through a new section-group renderer hook.
    • Backend names are plain, and each backend lists the env vars it needs on the server.
    • Per-type rows read 'Inherit (Amazon S3)', resolved the way getFileStrategy resolves them.
    • Every change to where files go asks first. The dialog says it applies on save with no restart and that existing files stay where they are.
    • CloudFront can only be picked if librechat.yaml set it up at startup, and its read-only panel shows only while it is in use.
  • MIME list editor, for text extraction, OCR and per-endpoint uploads.
    • It shows the list in effect and where it comes from (LibreChat default, librechat.yaml, Base, or the Default entry), matching LibreChat's merge rules.
    • Customize starts from that list, so adding a type extends the defaults instead of silently replacing them.
    • It adds presets, checks each pattern as a regex the server accepts (no lookarounds or backreferences), and asks before a pattern that matches every type or an empty list. A 'Test a MIME type' box shows which pattern matches.
  • Upload limits per endpoint. Keys come from a combobox of the keys LibreChat looks up plus custom endpoint names. Unknown, wrongly-cased and duplicate keys are refused inline.
  • Plainer names. 'Text-extraction MIME types' and 'OCR-eligible MIME types', with LibreChat's defaults shown for the size limits.

System

  • Registration.
    • Social logins are shown by provider name and read-only, because the sign-in page reads them only from librechat.yaml.
    • Allowed domains are validated chips. An empty list shows 'Anyone can sign up', opening sign-up asks first, and the review now warns about open sign-up instead of 'allows nothing'.
    • OAuth state TTL and OpenID discovery are read-only, because they are set up at startup from librechat.yaml.
  • Balance & credits is one card covering balance and transactions.
    • Credits show thousands separators and their dollar value, and auto-refill reads as 'Add [N] credits every [4] [hours]'.
    • Reservation TTL sits under Advanced, and a warning appears when balance is on but transactions are off (LibreChat records them anyway).
  • Rate limits become one read-only table of per-IP and per-user limits with LibreChat's .env defaults, agent events included.
  • Skill sync sources become owner/repo cards with branch and folder summaries and an 'Add source' button. Their help text matches LibreChat's validation rules.

YAML-only settings (FX-10)
Verified in LibreChat source: permissions and openapi are read only from librechat.yaml. They were editable and showed 'Changes saved' but never took effect. Both are now read-only, with explanations that say they are never applied, even after a restart.

Tests

  • New RTL tests run through a harness that renders the real ConfigTabContent with real value layers.
  • Unit tests check the MIME helpers against LibreChat's own mergeFileConfig and getEndpointFileConfig.
  • New live Playwright journeys (E2E_LIVE=1).
  • Existing tests were updated for the new labels and credit formatting, and the System visual baselines were refreshed.

Change Type

  • New feature (non-breaking change which adds functionality)
  • Bug fix (non-breaking change which fixes an issue)

Testing

  • At this stack level: npx tsc --noEmit (clean), npx vitest run (2097 tests pass) and npx eslint src/ e2e/ (clean).
  • Built in a dedicated worktree and verified live against a real LibreChat backend and MongoDB with a production-like librechat.yaml: acceptance criteria at 1440 and 390 px, light and dark, with screenshots.
  • The full stack was integrated and passed three rounds of independent live verification (functional with DB checks, UX/visual/axe, code review) plus the schema-coverage suite. At the top of the stack: 2400 tests, bun run test:lint-rules and vite build pass.

Test Configuration:

  • Bun 1.4.0; LibreChat dev (data-provider 0.8.527) with MongoDB 8.2

Checklist

  • My code adheres to this project's style guidelines
  • I have performed a self-review of my own code
  • My changes do not introduce new warnings
  • I have written tests demonstrating that my changes are effective or that my feature works
  • Local unit tests pass with my changes

Purpose-built AI providers editor (WS9, AP-1…AP-10).
## MCP servers: purpose-built editor (WS12, MCP-1…MCP-14)
Custom endpoints editor (Wave 2, WS10).
Model specs editor (WS11, Wave 2)
Purpose-built Features tab editors (WS13).
Purpose-built editors for the Files & storage and System tabs (WS14: FX-6 to FX-13, FX-15).
@danny-avila
danny-avila added this pull request to stack #171 October 20, 2026 07:38
@danny-avila

Copy link
Copy Markdown
Contributor Author

@codex review

Pass 1. Head: 2455ccf

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-22T16:14:28.239830Z 11caaa1 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2455ccfd86

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/components/configuration/sections/files/StorageRenderer.tsx Outdated
Comment thread src/components/configuration/sections/system/RegistrationRenderer.tsx Outdated
Comment thread src/components/configuration/review/diff.ts
Comment thread src/components/configuration/sections/system/CreditsRenderer.tsx
Comment thread src/components/configuration/sections/system/SkillSyncRenderer.tsx Outdated
Comment thread src/components/configuration/sections/system/RateLimitsRenderer.tsx Outdated
The configured-only filter now treats a path holding an unsaved value as set: provider groups, generic rows, sections and table-of-contents entries stay shown, so a pending edit of an unset setting never disappears behind the filter. isPathSet moves to counts.ts as the single rule.
- An inherited requiresOAuth: false no longer locks the API key and On-behalf-of methods.
- Deleting a server renamed in this session lists the saved server as pending deletion, with Undo bringing the rename back.
- The review pairs a removed and an added server as a rename only when the panel recorded the rename (or the values are identical), not because they share a URL or command.
- Duplicate skips masked secret previews, notes which stored secrets must be entered again, and Save requires a key for an admin-provided API key.
- A transport switch waiting for confirmation is planned from the current entry and dropped when the edit session ends.
# Conflicts:
#	src/components/configuration/ConfigTabContent.tsx
- Switching the memory agent back to an existing agent unhides a saved librechat.yaml ID tombstone, so the restored ID applies again.
- Enable memory defaults to On once a pending edit adds the first memory setting, and reads inverted when shown read-only.
- The domain list gives its row id to the text input, so the row label focuses it.
# Conflicts:
#	src/components/configuration/ConfigTabContent.tsx
…imit Editors

- Skill files inherit the image and document backends, so moving them off either backend is confirmed, naming both.
- Social sign-in providers are read from librechat.yaml (else LibreChat's default list), never from a stale Base override.
- Resetting a sign-up domain restriction to a layer without one warns that registration opens.
- Credits lists balance and transactions settings the card does not place (schema rows, then unknown keys).
- "Set values only" leaves out unset skill sync sources and keeps rows that hold an unsaved value.
- Rate limits say which number librechat.yaml sets when it sets only one of the pair.
@danny-avila

Copy link
Copy Markdown
Contributor Author

@codex review

Pass 2. Head: 348b6f2

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 348b6f212a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/components/configuration/sections/files/FileConfigRenderer.tsx Outdated
Comment thread src/components/configuration/sections/system/RegistrationRenderer.tsx Outdated
Comment thread src/components/configuration/sections/system/RateLimitsRenderer.tsx Outdated
Comment thread src/components/configuration/sections/files/StorageRenderer.tsx
Comment thread src/components/configuration/sections/system/RateLimitsRenderer.tsx Outdated
Collapsed provider cards and groups summarized a pending API key as plain text. Secret fields (as the field renderer detects them) now show the masked placeholder; environment references stay visible.
Undo inserted a removed endpoint at its loaded position in the shortened pending list, so undoing B after deleting A and B from [A, B, C] gave [C, B]. It now goes back before the first surviving endpoint that was loaded after it.
…ues Only

In a profile, the first pending edit of an inherited endpoint is not yet a stored override, so the set-values-only filter hid the row as soon as its drawer closed. Edited rows now stay listed.
Override a built-in parameter appended only { key, default }. LibreChat expands librechat.yaml definitions at startup but serves an override's as stored, and its client replaces the built-in definition with it whole, so the parameter lost its type, component and label. The full built-in definition is now stored (optionType custom, as LibreChat expands it), and a definition that differs from its built-in only in its default still opens as a default override.
The headers editor remembered every focused text input, header names included, so picking a placeholder after focusing a name wrote it into the name. Key/value inputs now carry data-kv-part, only value inputs are tracked, and with no value focused the placeholder is copied instead.
Entry ops placed removes after upserts, so a new spec's index counted entries that were about to be removed: deleting A and appending X to [A, B, C] stored [B, X, C]. Removes now come first, so every index counts only the entries that stay.
With Set values only on, a new spec ({}) hid Basics and the empty Endpoint and Model rows, so it could not be completed. A required field that is still empty (it has a required error) now stays visible.
@danny-avila

Copy link
Copy Markdown
Contributor Author

@codex review

Pass 3. Head: dad24c5

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: dad24c5d27

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/components/configuration/sections/system/RateLimitsRenderer.tsx
Comment thread src/components/configuration/sections/system/SkillSyncRenderer.tsx
Comment thread src/components/configuration/sections/system/Yaml.tsx
Comment thread src/components/configuration/sections/files/BackendRow.tsx Outdated
Comment thread src/components/configuration/fields/MimeListField.tsx
# Conflicts:
#	src/components/configuration/review/review.test.ts
@danny-avila

Copy link
Copy Markdown
Contributor Author

@codex review

Pass 4 of 4 (final review). Head: 11caaa1

This is the final review: please flag only blocking issues.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 👍

Reviewed commit: 11caaa10f7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@danny-avila
danny-avila removed this pull request from stack #171 October 23, 2026 04:44
@danny-avila
danny-avila changed the base branch from feat/config-w2-5-features to main October 23, 2026 04:53
@danny-avila
danny-avila merged commit abeed9b into main Oct 23, 2026
3 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant