Commit graph

6719 commits

Author SHA1 Message Date
lia-by-librechat[bot]
e6567c7a68
📰 fix: Preview Pasted Text Without Blocking Sends (#17962)
Some checks failed
Publish `librechat-data-provider` to NPM / pack (push) Has been cancelled
Publish `@librechat/data-schemas` to NPM / pack (push) Has been cancelled
Docker Dev Images Build / publish (push) Has been cancelled
Sync Helm Chart Tags / Ignore non-main push (push) Has been cancelled
Sync Helm Chart Tags / Sync chart tags (push) Has been cancelled
Publish `librechat-data-provider` to NPM / publish-npm (push) Has been cancelled
Publish `@librechat/data-schemas` to NPM / publish-npm (push) Has been cancelled
* 📰 fix: Preview Pasted Text Without Blocking Sends

* test: Cover Paste Cleanup and Accessible Preview Text

* fix: Preserve Paste Cleanup Across Upload Races

* test: Pass Paste Identity to Draft Lock Regression

* fix: Consume Paste Replacement Chains and Enforce Upload Limits

* fix: Flatten Pending Paste Edits Onto Their Surviving Source

* fix: Transfer Recovery Ownership While Editing Pending Pastes

* fix: Persist Bounded Paste Snippets and Isolate Replay Drafts

* fix: Type File Sanitization by Its Preview Inputs

* fix: Preserve Pending Uploads Above During-Run Text Limits

* fix: Isolate Historical User Reruns From Live Paste Drafts

* fix: Restore Paste Drafts Before Persisting Composer State

* fix: Expose Paste-Only During-Run Send Controls

* test: Scope Paste Warning Assertion to Toast Viewport

---------

Co-authored-by: Lia <lia@librechat.ai>
2026-11-10 08:10:21 -05:00
Marco Beretta
fbbf343286
fix: Keep Untagged Chat Code Fences Plain (#17986)
Some checks are pending
Backend Unit Tests / Tests: api (shard 1/3) (push) Blocked by required conditions
Backend Unit Tests / Tests: api (shard 2/3) (push) Blocked by required conditions
Backend Unit Tests / Tests: api (shard 3/3) (push) Blocked by required conditions
Backend Unit Tests / Tests: data-provider (push) Blocked by required conditions
Backend Unit Tests / Tests: data-schemas (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 1/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 2/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 3/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 4/4) (push) Blocked by required conditions
Codegraph E2E Vote Gate / Gate (push) Waiting to run
Codegraph E2E Votes / vote (shard 1/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 10/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 2/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 3/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 4/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 5/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 6/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 7/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 8/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 9/10) (push) Waiting to run
Docker Dev Branch Images Build / publish (push) Waiting to run
Frontend Unit Tests / Client build recovery regression (push) Waiting to run
Frontend Unit Tests / Codegraph select (push) Waiting to run
Frontend Unit Tests / Build packages (push) Waiting to run
Frontend Unit Tests / TypeScript type checks (client) (push) Blocked by required conditions
Frontend Unit Tests / Tests: @librechat/chat (push) Blocked by required conditions
Frontend Unit Tests / Tests: @librechat/client (push) Blocked by required conditions
Frontend Unit Tests / Tests: Ubuntu (shard 1/2) (push) Blocked by required conditions
Frontend Unit Tests / Tests: Ubuntu (shard 2/2) (push) Blocked by required conditions
Frontend Unit Tests / Vite build verification (push) Blocked by required conditions
2026-11-10 13:21:24 +01:00
Marco Beretta
317dd05a82
fix: Keep Plugin Pagination Keyboard Navigation Within Bounds (#17987) 2026-11-10 13:19:55 +01:00
Marco Beretta
37f2c4e738
🌍 fix: Use Localized Button Text for Accessible Names (#17988) 2026-11-10 13:19:53 +01:00
Marco Beretta
82f30ad9bc
🟩 fix: Add Context Windows for Bedrock NVIDIA Nemotron Models (#17952)
- Map the four NVIDIA Nemotron models on Bedrock to their AWS-documented context windows (256K for Nemotron 3 Super and Nano, 128K for the Nano v2 pair), so agents stop falling back to the 32K default that MCP tool schemas exhaust once a tool result arrives.
- Price the same models at their Bedrock on-demand rates so the context and pricing maps stay in parity.
2026-11-10 09:10:41 +01:00
Marco Beretta
ac1de5a606
📎 fix: Keep Lazily Provisioned Attachments for Code Calls After read_file (#17942)
* fix: Keep Lazily Provisioned Attachments for Code Calls After read_file
* test: Scope the read-then-bash completion text to the message view
2026-11-10 09:03:47 +01:00
lia-by-librechat[bot]
cb838019a6
🛌 perf: Defer Search Key Dialog Initialization Until First Open (#17976)
Some checks are pending
Backend Unit Tests / Tests: api (shard 3/3) (push) Blocked by required conditions
Backend Unit Tests / Tests: data-provider (push) Blocked by required conditions
Backend Unit Tests / Tests: data-schemas (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 1/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 2/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 3/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 4/4) (push) Blocked by required conditions
Codegraph E2E Vote Gate / Gate (push) Waiting to run
Codegraph E2E Votes / vote (shard 1/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 10/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 2/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 3/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 4/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 5/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 6/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 7/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 8/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 9/10) (push) Waiting to run
Docker Dev Branch Images Build / publish (push) Waiting to run
Frontend Unit Tests / Client build recovery regression (push) Waiting to run
Frontend Unit Tests / Codegraph select (push) Waiting to run
Frontend Unit Tests / Build packages (push) Waiting to run
Frontend Unit Tests / TypeScript type checks (client) (push) Blocked by required conditions
Frontend Unit Tests / Tests: @librechat/chat (push) Blocked by required conditions
Frontend Unit Tests / Tests: @librechat/client (push) Blocked by required conditions
Frontend Unit Tests / Tests: Ubuntu (shard 1/2) (push) Blocked by required conditions
Frontend Unit Tests / Tests: Ubuntu (shard 2/2) (push) Blocked by required conditions
Frontend Unit Tests / Vite build verification (push) Blocked by required conditions
Sync Locize Translations & Create Translation PR / Sync Translation Keys with Locize (push) Waiting to run
Sync Locize Translations & Create Translation PR / Create Translation PR on Version Published (push) Blocked by required conditions
* 🛌 perf: Defer Search Key Dialog Initialization Until First Open

* test: Reuse the Search Dialog Trigger Label in Lifecycle Tests

---------

Co-authored-by: Lia <lia@librechat.ai>
2026-11-09 20:12:52 -05:00
Marco Beretta
0dc8571ff0
🎨 fix: Move Project and PR Icons to the Left of Conversation Rows (#17747)
* fix: Move conversation project and PR icons to the leading edge

* fix: Preserve Conversation Focus With Leading PR Icons

* test: Check Icon Order After Leaving Pinned Section

* test: Enable Project Chats Before Checking Their Badges
2026-11-10 00:01:21 +01:00
Marco Beretta
e9ab98ca46
🎛️ fix: Align Agent Instruction Controls and Theme Ownership Icon (#17730)
* fix: Align agent instruction controls and theme ownership icon

* test: Verify agent instruction header controls

* test: Match ownership filter accessible label

* test: Stabilize throttled deployment theme capture

* test: Disable video during throttled theme sampling
2026-11-10 00:01:08 +01:00
Marco Beretta
91ed9748cb
🌐 fix: Localize Citation Pagination and Source Errors
Localize source pagination labels and the default sources error fallback. Add focused regression coverage and stabilize the oversized screenshot export test.
2026-11-09 23:18:59 +01:00
dvorak33
a3868fdbe8
🖼️ fix: Bound Flux Tool Images and Preserve Original Attachments (#13749)
Bound model-facing Flux images to the 5 MiB base64 budget for standard and finetuned generation. Preserve original image data for attachment storage under the existing resolution policy.

Fixes #6954.
2026-11-09 22:41:29 +01:00
Marco Beretta
4e0f242557
⚡ fix: Parallelize Setup Cancel Lookups and Keep Attachment Drafts on Reload (#17963)
* fix: Read the Account and Session Together and Test Cancel on a Real Database

- Start the setup user and refresh session lookups together in the cancel controller instead of one after the other, as the opt-in confirmation already does
- Run the cancel controller spec on mongodb-memory-server with the real data-schemas methods, so the session and compare-and-swap predicates under test are the production ones, and add a negative case for each
- Keep only a module wiring test in the CJS controller spec, since the database behavior is now covered where it can run for real

* test: Pin the Cancel Response When the Session Lookup Fails

Both lookups now run before any cookie or write, so a failed session lookup answers 500 with the browser and the stored state untouched. Cover that on the real database.

* fix: Keep the Saved Files Draft Until the File List Loads

After a reload the live file map is empty until the server's file list arrives, and the restore that rebuilds it needs that list. The save effect rewrote the stored draft from the empty map in between, so a pasted-text chip or any other attachment was gone before it could be restored. It now waits for the list. This is what turned the composer-attachments restore scenario red on dev.
2026-11-09 21:57:01 +01:00
lia-by-librechat[bot]
29b82d7421
fix: patch glob traversal and redirect dependencies (#17964)
Co-authored-by: Lia <lia@librechat.ai>
2026-11-09 15:44:10 -05:00
Marco Beretta
576a95e220
⚓ fix: Anchor Schedule Time Popovers to Their Field (#17947)
Some checks are pending
Backend Unit Tests / Tests: api (shard 3/3) (push) Blocked by required conditions
Backend Unit Tests / Tests: data-provider (push) Blocked by required conditions
Backend Unit Tests / Tests: data-schemas (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 1/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 2/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 3/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 4/4) (push) Blocked by required conditions
Codegraph E2E Vote Gate / Gate (push) Waiting to run
Codegraph E2E Votes / vote (shard 1/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 10/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 2/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 3/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 4/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 5/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 6/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 7/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 8/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 9/10) (push) Waiting to run
Docker Dev Branch Images Build / publish (push) Waiting to run
Frontend Unit Tests / Client build recovery regression (push) Waiting to run
Frontend Unit Tests / Codegraph select (push) Waiting to run
Frontend Unit Tests / Build packages (push) Waiting to run
Frontend Unit Tests / TypeScript type checks (client) (push) Blocked by required conditions
Frontend Unit Tests / Tests: @librechat/chat (push) Blocked by required conditions
Frontend Unit Tests / Tests: @librechat/client (push) Blocked by required conditions
Frontend Unit Tests / Tests: Ubuntu (shard 1/2) (push) Blocked by required conditions
Frontend Unit Tests / Tests: Ubuntu (shard 2/2) (push) Blocked by required conditions
Frontend Unit Tests / Vite build verification (push) Blocked by required conditions
Sync Locize Translations & Create Translation PR / Sync Translation Keys with Locize (push) Waiting to run
Sync Locize Translations & Create Translation PR / Create Translation PR on Version Published (push) Blocked by required conditions
- Bump @floating-ui/utils from 0.2.8 to 0.2.9 in package-lock.json and bun.lock so isContainingBlock treats translate, scale and rotate as containing blocks
- Add schedule-time-popover scenarios: the Weekly time picker, the Hourly minute picker and a dialog scrolled by its own overflow each open against their field
2026-11-09 19:04:32 +01:00
Marco Beretta
90e236354a
🍞 fix: Hold Upload Error Toasts Open Until Dismissed (#17954)
* fix: Hold Upload Error Toasts Open Until Dismissed
2026-11-09 18:24:21 +01:00
Marco Beretta
dc646c3880
🎚️ fix: Forward Selected Gemini Thinking Levels as reasoning_effort on Custom Endpoints (#17951) 2026-11-09 17:41:23 +01:00
Marco Beretta
876f3aad1a
🪟 fix: Serve the OAuth Error Page for Connect Callback Failures (#17946) 2026-11-09 17:41:17 +01:00
Marco Beretta
7a927fb19e
🚪 fix: Let Users Sign Out of Required Two-Factor Enrollment (#17956) 2026-11-09 17:40:50 +01:00
Marco Beretta
316a9a051b
📋 fix: Detach the Original Chip After Saving a Pasted Text Edit (#17955) 2026-11-09 17:40:23 +01:00
Marco Beretta
8412506653
⚠️ fix: Keep Warnings That Follow a File Authoring Success Summary (#17953) 2026-11-09 17:40:17 +01:00
Marco Beretta
1c95034f93
🔗 fix: Encode Local Storage URLs and Reject Nested File Names (#17949) 2026-11-09 17:40:12 +01:00
Marco Beretta
83a5db0683
👥 fix: Keep Skill Call Output in Shared Transcripts (#17948) 2026-11-09 17:40:06 +01:00
Marco Beretta
7591e8319a
🔗 fix: Open the Child Run Activity Dialog From a Shared Link (#17945) 2026-11-09 17:40:01 +01:00
Marco Beretta
482aaa9167
🧠 fix: Hide the Reasoning Control for Hidden Enforced Model Specs (#17944) 2026-11-09 17:39:56 +01:00
lia-by-librechat[bot]
b4afbb3a1e
🛝 perf: Render Chats Independently of Catalog Discovery (#17692)
* 🛝 perf: Render Chats Independently of Catalog Discovery

* Preserve Target Authorization and Passive Startup Intent

* Keep Startup Selection, Readiness, and Catalog Keys Consistent

* Preserve Remembered Targets and Validate Scoped Presets

* Retain Remembered Assistant Resource Aliases Across Endpoint Switches

* Apply URL Targets Before Waiting for Send Readiness

* Fix First-Page Agent Discovery and Await Model Selection

* Preserve Spec Access and Refresh Selected Assistant State

* Preserve Builder Deletion State and Start History Reads Earlier

* fix: Preserve Startup Recovery and History Read Ownership

* fix: Retain Express Query Routing in Assistant Lookups

* fix: Prioritize Route Reads and Recover Credential Changes

* fix: Bind Credential Revocation to Its Requested Scope

* fix: Refresh Credential Metadata After Pending Key Reads

* fix: Revalidate Inactive Credential Metadata on Target Mount

* fix: Preserve Reviewed Chat Resolutions After Rebase

* fix: Resolve Dev Conflicts and Preserve Startup Boundaries

* test: Preserve the ChatView Slot Target Boundary

* fix: Defer Terminal Delivery Until Subscription Attachment Completes

* fix: Contain Deferred Terminal Callback Failures

* test: Classify Historical Tool Name Capability Reads

* fix: Activate Requested Catalogs and Isolate Provider Failures

* fix: Keep Healthy Provider Choices Available During Catalog Recovery

* test: Exclude Copied Trace Bundles From Dependency Comparison

---------

Co-authored-by: Lia <lia@librechat.ai>
2026-11-09 11:11:22 -05:00
Marco Beretta
5dcfff39dc
📱 fix: Wrap Action Auth and API Key Expiry Controls on Narrow Screens (#17943)
* fix: Let Action Auth and API Key Expiry Segmented Controls Wrap on Narrow Screens
2026-11-09 16:50:42 +01:00
Marco Beretta
c40eb522e6
⏱️ fix: Bound Generation Status Reads So a Silent Request Cannot Strand the Pane (#17927)
* fix: Bound Generation Status Reads So a Silent Request Cannot Strand the Pane
* test: Cover Status Reads That Never Answer Across Terminal, Error and Foreground Paths
* test: Match Scenario Replies Exactly
2026-11-09 16:00:45 +01:00
Marco Beretta
bffa50e7a8
🚦 fix: Keep the Gateway Message on Classified Rate Limit Errors (#17903)
* fix: Keep the Provider Message on Classified Rate Limit Errors

* fix: Honor maxProviderErrorChars for Classified Generation Errors

* test: Cover Classified Gateway Errors in the Mock Harness

* test: Cover a Zero Provider Detail Limit on Generation Errors

* refactor: Resolve Classified Provider Errors in the TypeScript Backend

* fix: Redact Provider Details Before Truncating Them
2026-11-09 15:44:02 +01:00
Marco Beretta
5e2fe5c3e6
🪢 fix: Wrap Label Text Between Words Instead of Mid-Word (#17926)
* fix: Wrap Label and Prose Text Between Words Instead of Mid-Word

* test: Cover Word Wrapping in the MCP Trust Disclosure and Bookmark Delete Dialog

* test: Reopen the MCP dialog per width and treat hyphens as break points

* test: Open the bookmark delete confirmation from the keyboard

* fix: Let the MCP Dialog Segmented Controls Wrap on Narrow Screens
2026-11-09 15:37:19 +01:00
Marco Beretta
db083e1cf3
🗑️ fix: Drain Assistants Runs Before Erasing the Account (#17937) 2026-11-09 15:35:31 +01:00
Marco Beretta
70dfb8abe0
🔒 fix: Gate GET Routes That Start OAuth Flows Behind Terms Acceptance (#17935) 2026-11-09 15:35:24 +01:00
Marco Beretta
c6c79e4ea7
🔒 fix: Return Approved Error Text From the Remaining Structured Tools (#17934) 2026-11-09 15:35:18 +01:00
Marco Beretta
9bd44801ec
⏳ fix: Bound Blob Storage Image Reads by the Image Fetch Budget (#17932) 2026-11-09 15:35:11 +01:00
Marco Beretta
2855de2637
🧷 fix: Keep Agent References to File Ids Another Record Still Holds (#17931) 2026-11-09 15:35:05 +01:00
Marco Beretta
7c92a7f7d9
📜 fix: Skip Scheduled Fires for Owners Who Have Not Accepted the Terms (#17930) 2026-11-09 15:34:59 +01:00
lia-by-librechat[bot]
907589a38c
🦦 fix: Bound Spreadsheet Text Extraction (#17824)
* 🦦 fix: Bound Spreadsheet Text Extraction

* fix: Isolate Spreadsheet Parsing From Inherited Heap Flags

* fix: Configure Spreadsheet Admission and Return Retryable Overload

* fix: Return Structured Spreadsheet Limit Rejections

* fix: Preserve Spreadsheet Date Epoch During Deferred Formatting

* fix: Preserve Bounded OpenDocument Display Text

* fix: Detect UTF-16 OpenDocument Display Text

---------

Co-authored-by: Lia <lia@librechat.ai>
2026-11-09 08:27:47 -05:00
lia-by-librechat[bot]
d3ca74605c
📪 fix: Require Email Delivery for Password Reset Links (#17823)
* 📪 fix: Require Email Delivery for Password Reset Links

* fix: Sanitize Recovery Delivery Errors and Handle Disabled Email

* test: Preserve Recovery Mutation State Types and Remove Obsolete Copy

* test: Enable Email Capability in Password Recovery Shape Fixtures

---------

Co-authored-by: Lia <lia@librechat.ai>
2026-11-09 08:27:33 -05:00
Danny Avila
57ab67cbac
📏 fix: Measure Usage Percent Against the Allowance Each Period Granted (#17850)
* 📏 fix: Measure Usage Percent Against the Allowance Each Period Granted

Store the credits granted at the start of each balance period on the record and measure the usage percent against it, so changing refillAmount or startBalance no longer moves a user's percent until their next grant. Legacy records fall back to the configured amount.

* 🕰️ fix: Ignore a Stored Allotment a Later Refill Has Replaced

Stamp each stored allotment with the time of its grant and measure against it only while no refill is more recent, so a refill by a replica that predates the field falls back to the configured amount instead of reporting usage against the prior period's allowance.

* 🔒 fix: Write the Allotment Grant Atomically and Return Its Period Start

Insert lastRefill with the credit, allotment and grant time when a balance record is created, so a racing creator never moves another's period start past its grant. Return lastRefill even without auto-refill so the client can place a stored allotment in its period, and fall back when it cannot.
2026-11-09 08:27:13 -05:00
Danny Avila
23aa0f822d
🗂️ feat: Defer System Tools Behind Tool Search (#17864)
* 🎛️ fix: Treat Model Spec Tools as Defaults, Not Mandates

* 🗂️ feat: Defer System Tools Behind Tool Search
2026-11-09 08:27:01 -05:00
Marco Beretta
4c14c1eb2c
🗃️ fix: Load Retention Config on the Archive Route Before Saving (#17929) 2026-11-09 13:40:37 +01:00
Danny Avila
d875425ed2
🔐 fix: Authorize Restored MCP Tools Before Agent Revert Writes Them (#17843)
* 🔐 fix: Authorize Restored MCP Tools Before Agent Revert Writes Them

Reverting wrote the version snapshot, including its mcpServerNames, before
filterAuthorizedTools ran. Agent-scoped MCP access is granted from that index,
so a restored server vouched for itself and an editor without access to it
could re-attach it. A snapshot without mcpServerNames also left the current
index in place, keeping agent-scoped access to servers no tool used.

The handler now authorizes the restored tools against the agent as it stands,
treating only its current tools as existing, and passes the authorized tools
and rebuilt index to revertAgentVersion so the restore is one write pinned to
the revision it was checked against. revertAgentVersion always rewrites the
index for the restored tools.

* 🔐 fix: Exclude the Target Agent's Own Grant When Authorizing a Revert

Moves the restore authorization into authorizeAgentRestore in packages/api,
leaving the revert controller as wiring.

A newly restored MCP tool whose server the user reaches only through agents
must now be reachable through an agent other than the one being reverted,
checked fresh against the database. The target's current or cached index
(including one left stale by an earlier revert) no longer vouches for it.

Prior server names are matched through their normalized aliases, and only for
tools the agent already had. When nothing resolves, the pre-restore index is
kept instead of deriving names from tool keys.

A revision-filtered restore that misses is reported as a 409 conflict.

The route spec restores the real ~/config so the MCP registry is consulted
rather than reported unavailable.

* 🔐 fix: Check Newly Restored MCP Servers Against Live Grants

The restore gate now runs for every approved MCP tool, not only consumeOnly
ones. A tool the agent doesn't already have, on a DB-backed server, is
admitted when a current tool still uses that server, or on a live direct
server grant, or through another viewable agent. A grant the registry still
caches after revocation no longer becomes durable through the restored index.

Admission is memoized per server. A snapshot tools array that sanitizes to
nothing restores an explicit empty set. Active-server matching no longer
reuses the index fallback, so a stale entry is never read as in use.

* 🔐 fix: Treat Legacy Cached DB Configs as User-Sourced in the Restore Gate

A config cached before an upgrade may carry a dbId without source. The
restore gate now uses isUserSourced, so such configs get the live access
check instead of passing as operator-managed.

* 🔐 fix: Recheck Unindexed Existing MCP Tools in the Restore Gate

Holding a tool no longer exempts it from the live check. Only a current tool
whose server the agent's index already lists skips it. Otherwise an unindexed
tool on a legacy agent could pass on a revoked grant the registry still
caches, and the restore would add its server to the index.

* ⚡ perf: Run Restore Admission Checks for Distinct Servers Concurrently

filterAuthorizedTools now starts every admission check during its single pass
and awaits them together, so each distinct DB-backed server no longer adds a
serial lookup wave to the revert. Tool order is preserved and server names
are recorded only for admitted tools.
2026-11-09 07:20:31 -05:00
Atef Bellaaj
c766d07456
🔎 fix: Align Custom Anthropic Model Discovery With Native Requests (#17881)
Some checks are pending
Backend Unit Tests / Tests: api (shard 1/3) (push) Blocked by required conditions
Backend Unit Tests / Tests: api (shard 2/3) (push) Blocked by required conditions
Backend Unit Tests / Tests: api (shard 3/3) (push) Blocked by required conditions
Backend Unit Tests / Tests: data-provider (push) Blocked by required conditions
Backend Unit Tests / Tests: data-schemas (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 1/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 2/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 3/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 4/4) (push) Blocked by required conditions
Codegraph E2E Vote Gate / Gate (push) Waiting to run
Codegraph E2E Votes / vote (shard 1/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 10/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 2/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 3/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 4/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 5/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 6/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 7/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 8/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 9/10) (push) Waiting to run
Docker Dev Branch Images Build / publish (push) Waiting to run
Frontend Unit Tests / Client build recovery regression (push) Waiting to run
Frontend Unit Tests / Codegraph select (push) Waiting to run
Frontend Unit Tests / Build packages (push) Waiting to run
Frontend Unit Tests / TypeScript type checks (client) (push) Blocked by required conditions
Frontend Unit Tests / Tests: @librechat/chat (push) Blocked by required conditions
Frontend Unit Tests / Tests: @librechat/client (push) Blocked by required conditions
Frontend Unit Tests / Tests: Ubuntu (shard 1/2) (push) Blocked by required conditions
Frontend Unit Tests / Tests: Ubuntu (shard 2/2) (push) Blocked by required conditions
Frontend Unit Tests / Vite build verification (push) Blocked by required conditions
2026-11-09 11:02:06 +01:00
Garfie Chiu
3c3be30004
🧭 chore: Bump Artifact react-router-dom to v7 (#17819)
- Bump Artifact react-router-dom to v7
2026-11-09 09:39:08 +01:00
Marco Beretta
2970e91db2
🍪 fix: Skip the Axios XSRF Cookie Read So Requests Are Not Stranded (#17925)
* fix: Skip the Axios XSRF Cookie Read So Requests Are Not Stranded Behind cookieStore
2026-11-09 09:26:32 +01:00
Marco Beretta
ca7ba6c665
📦 fix: Skip Implicit npm Audits in Docker Builds (#17924) 2026-11-09 09:21:27 +01:00
Marco Beretta
b1ff03eb67
🏎️ perf: Load Conversation Messages From the Chat Route (#17912)
Some checks are pending
Backend Unit Tests / Tests: api (shard 3/3) (push) Blocked by required conditions
Backend Unit Tests / Tests: data-provider (push) Blocked by required conditions
Backend Unit Tests / Tests: data-schemas (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 1/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 2/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 3/4) (push) Blocked by required conditions
Backend Unit Tests / Tests: @librechat/api (shard 4/4) (push) Blocked by required conditions
Codegraph E2E Vote Gate / Gate (push) Waiting to run
Codegraph E2E Votes / vote (shard 1/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 10/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 2/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 3/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 4/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 5/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 6/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 7/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 8/10) (push) Waiting to run
Codegraph E2E Votes / vote (shard 9/10) (push) Waiting to run
Docker Dev Branch Images Build / publish (push) Waiting to run
Frontend Unit Tests / Client build recovery regression (push) Waiting to run
Frontend Unit Tests / Codegraph select (push) Waiting to run
Frontend Unit Tests / Build packages (push) Waiting to run
Frontend Unit Tests / TypeScript type checks (client) (push) Blocked by required conditions
Frontend Unit Tests / Tests: @librechat/chat (push) Blocked by required conditions
Frontend Unit Tests / Tests: @librechat/client (push) Blocked by required conditions
Frontend Unit Tests / Tests: Ubuntu (shard 1/2) (push) Blocked by required conditions
Frontend Unit Tests / Tests: Ubuntu (shard 2/2) (push) Blocked by required conditions
Frontend Unit Tests / Vite build verification (push) Blocked by required conditions
Sync Locize Translations & Create Translation PR / Sync Translation Keys with Locize (push) Waiting to run
Sync Locize Translations & Create Translation PR / Create Translation PR on Version Published (push) Blocked by required conditions
* perf: Prefetch Conversation Messages From the Chat Route

The messages request started only when ChatView mounted, after startup config, roles, endpoints, models and the conversation record resolved, although it needs only the route id. ChatRoute now starts it as soon as the id is known for a conversation the cache has never held, sharing the view's query function, and the view's first mount uses that payload instead of fetching it again.

* fix: Keep the Messages Prefetch Mark for the Observer That Uses It

Child observers of the same conversation mount first and cleared the mark before the conversation view subscribed, so the view loaded the messages a second time.

* fix: Show a Failed Messages Prefetch Instead of Requesting It Again

A prefetch that failed left no data, so the view loaded the messages again on mount, and a link to a missing conversation sent two requests. The view now shows a fresh prefetch failure, and the prefetch retries like the view's own load except on a 4xx.

* test: Cover Route-Level Messages Loading on Cold Load, Sidebar Switch and Missing Conversation

* fix: Retry Rate-Limited and Timed-Out Messages Prefetches

* fix: Prove Prefetched History by Reply Identity and Honor Invalidation

A URL load's prefetch starts before the conversation record is cached, so it captured no reply stamp and the seen check loaded an unread conversation's history a second time. Once the record lands, the prefetched history is proven when it holds the exact reply the record names. The mount guards also yield to an invalidation, and the failed-prefetch guard is the default for every observer of the conversation's messages.
2026-11-09 00:54:11 +01:00
Marco Beretta
fc3b86acbc
🧩 fix: Match Vendor Chunk Rules Against the Module Path, Not the Checkout (#17921)
* fix: Match Vendor Chunk Rules Against the Module Path, Not the Checkout

The vendor chunk rules tested the absolute module path, so a repository under a directory whose name contains a rule's text (fetch, ky, zod) sent every dependency to that chunk and the PWA precache limit failed the build. The rules now see the path from the first node_modules segment on.

* test: Cover Vendor Chunk Rules Under a Hostile Checkout Path
2026-11-09 00:48:32 +01:00
Marco Beretta
d6fb39727b
🧺 refactor: Move the Composer Tray and Staged Items Into @librechat/chat (#17817)
* refactor: Move the Composer Tray and Staged Items Into @librechat/chat

* chore: Retest Against Current Dev
2026-11-08 23:46:39 +01:00
Marco Beretta
a04ab256df
🧰 refactor: Move Part Helpers and activityLabels Into the Chat Package (#17771)
* refactor: Move Part Helpers and activityLabels Into the Chat Package

activityLabels moves to packages/chat/src/core/parts and exports from
@librechat/chat. useLazyCollapseBody, useProgress and useThrottledValue move
to packages/chat/src/react/parts (@librechat/chat/react). useExpandCollapse,
CopyButton, ActionButton, LangIcon and its icon paths move to
packages/chat/src/components/parts (@librechat/chat/components), since they
read @librechat/client. Specs move with them, client importers and mocks point
at the package entries, and design-lint suppressions follow the moved files.
The fold-type set in activityLabels is built on first use so the module reads
no data-provider enum at load, with a spec pinning its members.

* test: Point the About Spec's Localize Mock at the Package's Copy Button

* chore: Retest Against Current Dev
2026-11-08 23:46:32 +01:00
Marco Beretta
4bded120a9
🛂 fix: Only Hand Out OpenID Access Tokens the Bearer Verifier Accepts (#17904)
* fix: Only Hand Out OpenID Access Tokens the Bearer Verifier Accepts

The OpenID reuse path in refreshController and the post-refresh fallback in
getOpenIDAppAuthToken returned the cached access token as the app auth token
whenever its exp was in the future. Entra issues Microsoft Graph access tokens
to sign-in clients by default; their aud names Graph, so the bearer verifier
rejects them and every protected request answers 401 until the client loops.

Both paths now require the access token's aud to name the client id or an
OPENID_AUDIENCE entry, the same audiences the verifier accepts. The reuse path
refreshes with the IdP instead, and the post-refresh fallback keeps opaque
tokens as before. Audience parsing is shared with openIdJwtStrategy.

Related to #17791

* test: Exercise Real OpenID Audience Helpers in AuthService Spec

The AuthService spec stubbed the audience helpers as pass-throughs, so it
could not catch a foreign-audience access token escaping the post-refresh
fallback. Use the real exports and cover Graph-audience, configured-audience
and opaque access tokens through setOpenIDAuthTokens.
2026-11-08 23:40:21 +01:00