Repository navigation
✨ feat: Features Tab Editors (Wave 2) - #168
Conversation
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).
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 843d7998a1
ℹ️ 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".
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.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 020ad7d1d0
ℹ️ 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".
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.
Spec save issues dropped every name problem, assuming the pipeline reports them. The pipeline keys entries by the name as written, so a whitespace-only name, or names differing only by surrounding spaces, showed an inline error but left Save enabled. Only the name problems the pipeline reports itself are dropped now.
Spec search indexed every prompt field, so an OpenAI spec offered a System prompt result that opened no row. The editor and the search index now share specPromptKeys: the endpoint's prompt field, the greeting, the assistants' instructions on an assistants endpoint, and any other prompt field the preset already sets (which the editor now also shows, so a stale value stays removable).
The rename warning compared with the name captured when the Name field first mounted, which a save or scope change does not reset: after renaming A to B and saving, renaming B again showed no warning. The loaded name now comes from the pending collection edit's origin (or the current name while the list has no pending edit).
…n Ends A definition chosen without values lived only in the component, so after Discard or a scope change the editor still showed Provider and model for an agent that no longer existed. The choice now resets with the edit session or scope, and the mode buttons stay controlled so none is pressed without a definition.
…s Too A service selected for one role was dropped from Show other services by name, so the settings of its other roles (Tavily's extract URL and scraper options while it only searches) appeared nowhere. A service in use now lists those settings in its own group. Under Set values only, a service group whose only value was a pending edit was hidden because its count reads saved values; pending values now keep it.
The interface groups and their flattened objects checked only saved paths, so editing an unset setting and then turning on Set values only hid the group holding the edit. Both checks now count pending values (isPathSet).
With no saved agent, entering a provider or model and then turning on Set values only hid the whole agent group, since it checked only saved paths. It now counts pending values too.
With an allowlist from the layer beneath, replacing it in a pending edit and then confirming removal of the last domain promised the lower list would apply again, but the shared clear kept the pending list (a list the layer beneath sets is never emptied) and said the last domain could not be removed. A domain allowlist is removed whole, so clearing now discards the pending own list.
|
Codex Review: Didn't find any major issues. Bravo. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
Summary
Purpose-built Features tab editors (WS13).
What changed:
Tests: RTL tests for the renderers on real schema fields and value layers, domain validation, save-pipeline ordering and validation, a reveal test, and a live Playwright spec behind E2E_LIVE.
Change Type
Testing
npx tsc --noEmit(clean),npx vitest run(2053 tests pass) andnpx eslint src/ e2e/(clean).librechat.yaml: acceptance criteria at 1440 and 390 px, light and dark, with screenshots.bun run test:lint-rulesandvite buildpass.Test Configuration:
dev(data-provider 0.8.527) with MongoDB 8.2Checklist