Commit graph

6709 commits

Author SHA1 Message Date
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
Marco Beretta
337c566dc3
📬 fix: Require a Click to Submit Email Verification Links (#17905)
* fix: Require a Click to Submit Email Verification Links

Mail security scanners (Microsoft Defender Safe Links, Sophos, Hornetsecurity)
open links in incoming mail and run the page's scripts, so the verify page
submitted the single-use token on load and the user's own click then failed.
The page now waits for an explicit confirm button for both sign-up
verification and email-change confirmation.

* test: Cover verification links opened before the user clicks

* test: Isolate the verify click scenario from the submission limiter

* test: Confirm the sign-up link in the email e2e setup

* test: Exercise the shared Button in the verify page spec
2026-11-08 23:39:26 +01:00
Marco Beretta
654ce897e9
🗄️ fix: Skip Attachments Deleted by Storage Retention Instead of Failing the Turn (#17910)
* fix: Skip Attachments Deleted by Storage Retention Instead of Failing the Turn

A file that storage retention removed from an earlier message made every
later turn of the conversation fail, because the encoders rethrew the
storage miss and the user has no way to remove an attachment from history.

History replay now passes a handler to the encoders, which leave missing
files out of the request and report them; the message's file context tells
the model which files were deleted and were not read. Current-turn
attachments keep the strict error, since the user can remove and re-upload
them. Code Interpreter priming names files missing from storage in the
tool context and only requires resource recovery for other failures.

* refactor: Keep Code Reupload Failure Policy in packages/api

Tally priming reupload failures in createCodeReuploadFailures so the
decision that a file deleted from storage is named instead of requiring
resource recovery lives in TypeScript, and add mock e2e scenarios for a
follow-up after an attachment is deleted from storage.

* fix: Classify Code Files as Deleted Only at the Storage Read

A 404 from the Code API upload was counted as a source file deleted from
storage, which skipped resource recovery. openCodeFileSource marks a miss
where the stored object is read, and only that error counts as deleted.

Move the history replay of attachments with tolerated misses into
replayMessageAttachments so BaseClient only calls it.

* fix: Name Local Code Files Whose Stream Reports a Missing Object

Local storage returns a read stream that raises ENOENT only once read, so
openCodeFileSource now holds a stream until its first chunk or error and
names a miss there. The missing-files context assignment moves into
setMissingCodeFilesContext so both tool loaders only call it.

* fix: Close a Held Code File Stream When Priming Is Cancelled

openCodeFileSource waits for a source stream's first chunk; when that
wait fails, as on cancellation, the caller never receives the stream, so
destroy it before rethrowing instead of leaking its file descriptor.
2026-11-08 23:38:47 +01:00
Marco Beretta
b97a973d42
📦 fix: Treat Empty Sandpack Bundler URLs as Unset (#17901)
* fix: Treat Empty Sandpack Bundler URLs as Unset

An empty SANDPACK_BUNDLER_URL or SANDPACK_STATIC_BUNDLER_URL (common with
${VAR:-} passthrough in Docker Compose) was handed to Sandpack as the
bundler URL, leaving artifact panels blank. buildSandpackOptions now falls
back to the default bundler for an empty value, and the shared-link startup
payload omits empty bundler URLs.

Related to #17790

* test: Cover Empty Sandpack Bundler URLs in Artifact Previews
2026-11-08 22:34:17 +01:00
Marco Beretta
ca013bb229
🌐 fix: Default the Flux Tool to the Global BFL Endpoint (#17909) 2026-11-08 22:28:16 +01:00
Marco Beretta
c3d5815d50
🛰️ fix: Poll the Flux Cluster Returned by the Global Endpoint (#17907)
* fix: Poll the Flux Cluster polling_url Returned by the Global Endpoint

* fix: Only Forward the Flux Key to Same-Origin or BFL Polling URLs

* test: Cover Flux polling_url Routing in the Mock Harness
2026-11-08 22:25:36 +01:00
Marco Beretta
d3de8a4801
🧩 fix: Match mcp:<server>:<tool> Tool Approval Patterns Against MCP Tool Keys (#17902)
* fix: Match mcp:<server>:<tool> Tool Approval Patterns Against MCP Tool Keys

* fix: Normalize Globbed MCP Server Names in Tool Approval Patterns

* fix: Keep Colons Inside MCP Server Names in Tool Approval Patterns

* test: Submit the Scoped Approval and Give the Control Agent remember_fact

* fix: Match mcp:<server>:<tool> Rules Per Segment Instead of Rewriting Them

* fix: Match Glob-Free mcp: Approval Rules Against Their Exact Key

* fix: Never Grant Through a Server Glob That Normalization Widened

* fix: Never Grant a Globbed mcp: Rule on an Ambiguous Tool Key

* fix: Mirror Both Server Name Normalization Branches in mcp: Server Globs

* fix: Treat Boundary Underscores in mcp: Server Globs as Optional
2026-11-08 20:53:08 +01:00
Marco Beretta
69d5eca048
🕰️ fix: Refresh Copied Client Bundle Timestamps After Build (#17906)
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
* fix: Refresh Copied Client Bundle Files After Build

fs.cp keeps the source mtime on Windows, so dist/tokens.css and the other
copied theme files never looked newer than packages/client inputs written
later by a checkout, and the pre-commit freshness check failed after every
rebuild. Stamp the copied outputs in tsdown's build:done hook.

Related to #17731

* test: Cover copied client bundle freshness where cp keeps mtimes
2026-11-08 19:31:55 +01:00
Marco Beretta
d0d9a30327
🧩 fix: Accept Content-Array Tool Outputs in the Responses API (#17900)
* fix: Accept Content-Array Outputs in Responses function_call_output

The Open Responses spec allows function_call_output.output to be a string or
an array of input_text, input_image and input_file parts, but request
validation refused anything that was not a string. Validate the array parts
and convert them with the same part mapping the message path uses, so the
replayed tool result keeps its text and images in order.

* fix: Inspect Tool-Output Media Against File Policies

Image URLs and file names in a function_call_output content array reached the
model without the file-policy fragments the same parts get in a message.
Collect those fragments for both item types in packages/api and call that
from the Responses controller.

* test: Cover Content-Array Tool Outputs in the Responses API
2026-11-08 19:22:29 +01:00
Marco Beretta
bfd66f7669
🦙 fix: Use an Available OpenRouter Title Model in the Example Config (#17899) 2026-11-08 18:04:31 +01:00
Marco Beretta
5a633524a2
🔑 fix: Remember Tool Approvals for MCP Servers Using Env References (#17889)
* fix: Remember Tool Approvals for MCP Servers Using Env References

* fix: Resolve Approval Env Only for Tiers That Expand It, Add E2E Scenarios

* fix: Reject User Placeholders in Resolved Env Values and Take the Env Source as a Parameter

* test: Expect the Resume Reply After Approving the Env MCP Tool

* fix: Check Fully Expanded Config Values for User Placeholders

* fix: Resolve Approval Env Into a Prototype-Free Map From Own Properties
2026-11-08 16:58:10 +01:00