Repository navigation
⛴️ chore: Bring Canary Up to Date With Dev - #16457
Conversation
* 🥤 fix: Keep Pending Code Steers Within the Composer * 🧪 test: Keep Pending Code Steer Preview Controls Visible * 🧪 test: Prove Pending Code Starts Inside the Composer --------- Co-authored-by: Lia <lia@librechat.ai>
Co-authored-by: Lia <lia@librechat.ai>
Co-authored-by: Lia <lia@librechat.ai>
Co-authored-by: Lia <lia@librechat.ai>
Route modules build their rate limiters while they load, and both server entries required them before startup checks copied rateLimits from librechat.yaml into the environment. The conversationsImport, tts, stt and route-scoped fileUploads budgets therefore ignored the yaml unless the matching environment variable was also set. Require the routes only after performStartupChecks in index.js and experimental.js.
…16439) * 🔒 fix: Guard 2FA Deep-Link Redirects Against Blocked Session Storage The post-login redirect store was the one session-storage consumer in the client that reached for it bare-handed: a context where storage access throws crashed the login screen's persist effect and the post-challenge boot instead of dropping the destination. Route every access through throwing-safe helpers so a blocked store costs the deep link, never the sign-in, and pin the ordinary 2FA challenge's deep-link survival and consumption with mock-harness scenarios plus blocked-storage unit tests. The challenge screen's code inputs also gain accessible names. * ♿ fix: Name the 2FA Verify Button by Its Visible Text The challenge submit button carried aria-label 'Continue' over the visible text 'Verify', so its accessible name did not contain the visible label (WCAG 2.5.3). The visible text names the button on its own; the label is dropped. * 🧪 test: Keep the 2FA Mock Harness From Re-Declaring Destinations The shell's authenticated queries 401 against the real backend under the stand-in bearer, and the auth-recovery login bounce carries the current URL as redirect_to, re-persisting the deep link mid-test. Answer those queries empty and leave /api/config real. * 🧪 test: Answer the Shell's Empty Shapes in the 2FA Deep-Link Harness The composer and its selectors iterate their query results, so the stand-in session's shell queries need per-endpoint empty payloads rather than a blank object; the destination's marker rides the query string so no conversation has to exist for the landing to hold; and the second sign-in declares its own destination, which is the deterministic form of consumption-across-sign-ins. * 🧪 test: Assert the 2FA Shell Across Viewports The account button hides in the mobile drawer and the drawer never satisfies a pointer click's stability check, so the shell assertion polls for whichever marker the viewport shows and the session ends through an in-page logout request, which the route mocks can actually see. * 🧪 test: Locate the Login Password Field by Label * 🧪 test: Let the CI Storage Polyfill Replace the Blocked Store The CI-mode build ships a storage polyfill that answers a broken sessionStorage by installing its own in-memory shim with defineProperty, which crashed against a non-configurable blocker and took the app boot with it. The blocker stays configurable: the shim is per-document, so the challenge's document swap still empties it and the landing contract is the same either way.
|
Review handoff for exact head |
|
Review handoff for exact head |
|
Review handoff for exact head |
Sonnet 5.5 (`claude-sonnet-5-5`) rejects `thinking.type: disabled` and takes `between_tools` as its lowest thinking setting, binds thinking blocks to the conversation prefix, caps effort at `high` while thinking is off, rejects sampling parameters, supports the `updates` thinking display, and ships with 128k output / 1M context at Sonnet 5 pricing. Family gates in data-provider now use "5.5 or later" semantics so Opus 5.6+, Sonnet 5.6+ and the Mythos-class line (Fable) inherit the newest contract instead of falling back to the Opus 5 / Sonnet 5 paths.
… Starts (#16453) * 🔁 fix: Retry Code API Rate Limits That Reject Before a Workspace Call Starts * 🔁 fix: Bound Workspace Rate Limit Retries by Code API Budget * 🔗 fix: Isolate Code API Retry Default from Utility Graph * 🧩 fix: Type the Shared Code API Retry Default * 🔁 fix: Keep Workspace Admission Retry Budgets Independent --------- Co-authored-by: Lia <lia@librechat.ai>
* 🔲 fix: Anchor Quote Popup to Visible Selection * 🔲 fix: Keep Cross-Container Quotes Anchored to Visible Text * 🔲 perf: Bound Quote Geometry Walk to Selected Text --------- Co-authored-by: Lia <lia@librechat.ai>
* fix: validate principal config overrides against configSchema Reject admin config writes whose fields fail configSchema, and drop invalid fields from stored overrides at merge time so the base value from librechat.yaml survives. * fix: require the merge key on partial custom endpoint overrides * test: register a dedicated user for config override scenarios * test: log in once per worker in config override scenarios * fix: strip invalid overrides under dotted record keys * fix: ignore a stored overrides document that is not an object * fix: reject indexed patches into merged-by-name override arrays * fix: match union options by shape, apply supplied-value refinements, reject paths past scalars * refactor: validate config overrides on the merged result instead of the patch * test: cover record refinements on written config fields * fix: validate config field writes on top of the stored override * fix: attribute id-addressed issues to their item and keep valid sections after repairs * fix: judge field writes by what they change, over the principal's tombstoned base * fix: validate whole-document config writes on the principal's tombstoned base * fix: report config override issues as stable codes instead of schema messages * fix: reject indexed writes into keyed arrays and keep filtered MCP servers out of validation state * fix: judge each override layer only on the values it supplies * fix: reject merged-by-key array items that are not objects * fix: report repeated merge keys on the items the keyed merge discards * fix: reject keys a union option drops when another option defines them
* ⏩ fix: Clarify Steering Timing and First-Response Fallback * style: Format First-Response Tooltip Choice * 💬 fix: Avoid Implying the First Conversation Has Not Started * fix: Explain the Steer Sooner Enter Override --------- Co-authored-by: Lia <lia@librechat.ai>
Co-authored-by: Lia <lia@librechat.ai>
* 🥧 fix: Show Failed Call Fractions and Preview Age * 🗑️ chore: Remove Unused Failure Labels * 🕒 test: Verify Live Failure Close Times * 🧵 fix: Select Accessible Badge Labels Without Nested Ternaries * 🪆 fix: Show One Failure Pill for Live Phase Groups --------- Co-authored-by: Lia <lia@librechat.ai>
* 🔀 fix: Resolve SplitText Direction From Its Own Text Under RTL SplitText wraps every grapheme and every word in its own inline-block box, so the bidi algorithm never sees the text as one run. Under an RTL document the boxes lay out right to left, and a Latin greeting or agent name on the landing page renders mirrored, letter by letter and word by word. The paragraph and each word box now carry dir="auto", so direction resolves from the first strong character of the text itself: the paragraph decides word order and each word decides its own letter order. RTL text still lays out right to left, and mixed greetings render each part correctly. Claude-Session: https://claude.ai/code/session_01EhJ8HUVBZ53ArUzgXDnxom * 🐛 fix: Preserve RTL Greeting Word Order --------- Co-authored-by: Lia <lia@librechat.ai>
Co-authored-by: Lia <lia@librechat.ai>
…Budget (#16464) * ⏱️ fix: Fit Workspace Command Timeouts Inside the Configured Request Budget * ⏱️ fix: Make Workspace Command Admission Reserve Configurable * 🧪 test: Match Steering E2E Labels on Dev * ⏱️ fix: Reject Impossible Workspace Command Admission Reserves * 🧪 test: Match Failed Call Count in Dev E2E * ⏱️ fix: Bound Workspace Admission Headroom and Document Its Budget * ⏱️ fix: Validate Default Workspace Command Admission Reserve --------- Co-authored-by: Lia <lia@librechat.ai>
* 🕘 feat: Distinguish Tool Preparation From Tool Call Time * 🎞️ fix: Format timing specs and flatten phase labels * 🧷 fix: Narrow Tool-Step Timing Before Stream Callback * ⏱️ fix: Show Measured Subsecond Tool Calls * 🧮 fix: Attribute Earliest Tool Fragment to Its Call * 🧵 fix: Preserve Tool Timing Across Replay and Parallel Calls * 📦 chore: Upgrade Agents SDK To 3.9.8 * 🧭 fix: Restore Tool Timing Across Redis And Child Activity --------- Co-authored-by: Lia <lia@librechat.ai>
* feat: Route Linked Worktree Requests into Per-Worktree Lanes Workers that advertise the git_linked_worktree workspace scope run each .worktrees/<name> of a registered checkout in its own scheduling lane. Accept the scope in worker status, map worktree-scoped paths and command working directories onto the worktree field, and restore the prefix on returned paths so tool output stays relative to the checkout. * fix: Advertise Worktree cwd Routing in Model-Facing Bash Definitions * refactor: Normalize the Lane Flag in TypeScript, Pass It Through /api Unchanged * feat: Gate Linked Worktree Lanes Behind an Environment configSchema Toggle * test: Give the Lane Toggle Fixture a Default Environment
|
Review handoff for exact final head |
|
Independent bounded source review completed for exact head |
Co-authored-by: Lia <lia@librechat.ai>
Co-authored-by: Lia <lia@librechat.ai>
|
Review handoff for exact head |
* chore: bump dompurify * chore: bump agents sdk to v4.0.1
Co-authored-by: lia-by-librechat[bot] <328778573+lia-by-librechat[bot]@users.noreply.github.com>
Co-authored-by: Lia <lia@librechat.ai>
|
Review handoff for exact head |
|
Final exact-head handoff for |
(cherry picked from commit e20558b) Original-PR: LibreChat-AI#16457
(cherry picked from commit d8b9371) Original-PR: LibreChat-AI#16457
(cherry picked from commit b881b83) Original-PR: LibreChat-AI#16457
(cherry picked from commit 5bd84bb) Original-PR: LibreChat-AI#16457
(cherry picked from commit e4f10b6) Original-PR: LibreChat-AI#16457
(cherry picked from commit 47b3b9b) Original-PR: LibreChat-AI#16457
(cherry picked from commit fd510aa) Original-PR: LibreChat-AI#16457
(cherry picked from commit 67e4609) Original-PR: LibreChat-AI#16457
Retain the tracked-file integration outcomes recorded by original canary sync PR LibreChat-AI#16457. No new implementation is introduced. Shared and ambiguous corrections are carried by the final sync-resolution commit so the resulting tracked tree equals frozen canary f66ad88. Original-PR: LibreChat-AI#16457 Resolution-Sources: ffa54e0, 7fe6eab, 8f64336, 207ee8b, 7f3f82f, e9e5b36, ff3f0f8, 6bd6577, 84a53a4, f66ad88
Summary
This PR joins current canary
ef1aa668126d1d7604519d21aa31b098bb24407dand deve8f3be08623663d4ad7f7241e693c94469b63bb0without rebasing, squashing, forcing refs or moving either base branch. Both tips are ancestors of the current PR head,f66ad88e1c29836c2b7d580f8931872b5e8f8bef.How It Works
Includes the latest dev dependency audit/agents SDK 4.0.1 update, paused in-process LibreOffice previews, and security-release package/Helm bumps. These three commits merged cleanly.
Preserves canary's composer/palette, theme control and label roles, forced-temporary ephemeral retention, in-thread steering, command output/verdicts and MCP Apps alongside dev's fixes and release tooling. The callback test conflict retains the real identity, timing and executor helpers, not just one branch's mock exports.
Reconciles earlier timing/verdict, approval, theme validation/tenant isolation, and imported approval/reader-state paths. Focused coverage remains in place for those integration boundaries.
Fixes a reproducible agent-picker bug: the select owns its popover, so combobox
resetValueOnHidealone did not clear the controlled search. Closing the select now resets the search and reopening lists the full configured cap while keeping the selected agent. The new regression failed on the preceding implementation and passes after the fix.The large Mermaid export test now waits for durable generation completion before opening a rendered preview. Its failed trace showed the expected streaming Code tab, not a missing completed graph. SVG/PNG validation, dimensions/pixel caps, five repeated exports, and no-browser-crash assertions are unchanged. No performance threshold or export assertion is weakened.
Type of Change
Verification
f66ad88e1c29836c2b7d580f8931872b5e8f8bef. At 2026-10-01 03:00 UTC, all 41 CI checks passed, with no failures or pending checks. This includes the formerly failing agent-picker and large Mermaid-export browser scenarios, both TypeScript gates, static checks, Lighthouse, MCP Apps, runtime smoke and browser shards.ef1aa668126d1d7604519d21aa31b098bb24407d. Full browser/Lighthouse checks ran in GitHub CI, not locally; no Chrome/Chromium is installed in the worker. Mixed-version deployments and LibreOffice-present runtime scenarios were not independently reproduced. No GitHub maintainer approval is recorded.Landing
Keep this PR targeted at canary. After exact-head checks and review settle, prefer a non-forced fast-forward of canary to the approved head. The sync branch contains the required integration merges, so this adds no extra outer merge commit. If branch protection requires the GitHub merge UI, use Create a merge commit, never squash or rebase. If either base advances, refresh and validate again before landing. No main/dev promotion or deployment is included.