Skip to content

C++ Upload as Text fix - #17038

Closed
jacksonriding wants to merge 106 commits into
LibreChat-AI:mainfrom
jacksonriding:fix/default-text-mime-plus
Closed

jacksonriding wants to merge 106 commits into
LibreChat-AI:mainfrom
jacksonriding:fix/default-text-mime-plus

Conversation

@jacksonriding

Copy link
Copy Markdown
Contributor

Summary

With the default fileConfig, uploading main.cpp as text fails because defaultTextMimeTypes excludes + from MIME tokens. Allow + so the inferred text/x-c++ type passes the default text matcher.

Fixes #17037.

Type of change

  • Bug fix

Testing

Added a defaultTextMimeTypes block in packages/data-provider/src/file-config.spec.ts covering C++ and other + MIME types, the type inferred for .cpp, previously accepted types, malformed strings, and permissive classification under isPermissiveMimeConfig.

Automated tests:

  • cd packages/data-provider && ./node_modules/.bin/jest src/file-config.spec.ts --runInBand — 265 tests passed.
  • cd packages/data-provider && ./node_modules/.bin/tsc --noEmit — passed.
  • git diff --check — passed.

Manual test — pending:

Use default fileConfig with no text override and no RAG_API_URL (native text parsing). On an agents endpoint, attach main.cpp using Upload as Text. Confirm that the file attaches as text rather than displaying Error processing file. This UI test has not been performed; the PR should remain a draft until verified. Lighthouse and the repository-wide static checks have not been run.

Screenshots / recordings

Pending manual UI verification. No layout or component changes.

Risk / compatibility

The default matcher still passes the isPermissiveMimeConfig probe, preserving the existing permissive classification used by RAG upload routing. Custom text allowlists are unaffected. No dependency or configuration changes.

Checklist

  • I reviewed my own changes
  • Relevant tests have been added or updated
  • Local unit tests pass with my changes
  • Package TypeScript check passes
  • Manual UI test passes
  • Repository static checks and Lighthouse pass

…hat-AI#16794)

* feat: Show the Conversation Pull Request in the Chat Header

A header chip shows the pull request a code conversation opened: the agent picture with a CI status dot, the pull request icon and a truncated title. It opens a card with the number, added and removed lines, a link to GitHub, and state and checks badges. The chip renders nothing while loading, when there is no pull request, or when the first lookup fails.

* feat: Place the Pull Request Chip Beside the Model Controls and Move It to the Overflow Menu on Small Screens

On desktop the chip sits with the left header controls and its card opens to the right as an Ariakit hovercard that slides in from the left, on hover or keyboard focus. Small screens offer the same card from the header overflow menu through a dialog, following the dialog-item contract.

* fix: Address Review Findings on Pull Request Polling, Badges and Tooltip Layering

Advertise pullRequestsEnabled in the startup config and skip the lookup without it, keep polling a finished pull request while its checks run, render the card badges with the shared Chip, and portal the GitHub tooltip into the card's own layer.

* fix: Address Second Round Review Findings on the Pull Request Dialog and Chip

Scope the mobile dialog to the conversation it opened for and expose dialog semantics on its menu entry, only use the chat agent's avatar for the routed conversation, and make the hover tests move the pointer the way a browser does so they pass under NODE_ENV=development as CI runs them.
…LibreChat-AI#16817)

* fix: Make DataTable Row Estimates Breakpoint- and Leaf-Column-Aware

* test: Cover the Compact Row Estimate Against the Rendered Cell

* test: Tag the Row Estimate Scenarios Literally
…t-AI#16820)

* fix: Dim a Disabled InputNumber Through Its Nested Input

* test: Cover the Disabled InputNumber Wrapper in the Browser

* test: Tag the InputNumber Scenarios Literally
…Chat-AI#16822)

* refactor: Clear Chat Design Suppressions That Render Nothing

* test: Tag the Steer Render Spec as a Scenario
…eChat-AI#16826)

* refactor: Mark Message Text Containers With a Data Attribute

* test: Tag the Private Text Spec as a Scenario

* test: Cover Message Text Containers in a Mobile-Safe Scenario
…LibreChat-AI#16825)

* refactor: Clear the Raw-Color and Unknown-Class Design Suppressions

* fix: Keep the Prose Classes style.css Still Reads

* fix: Keep the split-parent Marker the Screenshot Spec Waits On

* chore: Prune the Recorded Suppressions the Rebase Cleared
…ibreChat-AI#16828)

* refactor: Give Sign-In Controls Button, Input and Alert Variants

* fix: Load the Field Stylesheet From SecretInput

* fix: Default the Floating Fields to the Placeholder Sentinel

* test: Cover the Sign-In Control Roles in the Default Theme

* test: Wait for the Floating Label Transition Before Reading It

* test: Read the Floating Label Scale Property

* fix: Keep Button Heights on Theme Roles and Honor Reduced Motion in Floating Fields
* feat: Show Lia on the Welcome Screen

Adds the opt-in Show Lia setting (off by default) and the interface.mascot deployment flag (allowed by default). Lia mounts only on the landing page, loads lazily after first paint, stands on the composer's top edge clear of the greeting, reacts to typing, files and theme changes, and speaks through localized bubbles. She is decorative and hidden from assistive technology.

* fix: Keep Lia's Long-Message Reaction Re-Armed and Pointer Reads Per Frame

Deleting a message back under 280 characters now re-arms the long-message reaction, pointer handling reads layout at most once per animation frame, and the ChatView specs stub Lia like their other children.

* test: Open Settings from the Phone Drawer in the Lia Scenarios

The opt-in scenario no longer resets the stored preference on reload, and both Settings scenarios open the account menu from the mobile drawer on phones.

* fix: Measure Lia's Caret Like the Composer and Label Her When Idle

The caret mirror copies direction, alignment, indentation, wrapping and box sizing, so right-to-left and wrapped text measure like the composer. Hovering Lia between activities now says she is hanging out instead of showing nothing.

* fix: Wave Off Assistants Sends and Keep Lia's Canvas and Bubble Off Welcome Content

* fix: Keep Lia's Speech Bubble Inside Her Stage

* fix: Wrap Long Translations in Lia's Speech Bubble

* fix: Keep Lia's Long-Message Reaction Until It Plays and Pin the Scenario Greeting

* fix: Make Only Lia's Body Clickable So She Fits Beside Long Greetings

* fix: Let Lia Stand Beside the Composer When the Greeting Fills Its Top

* feat: Let Users Drag Lia Around and Keep Her Near the Composer

* test: Cover Picking Lia Up and Setting Her Down on the Composer

* refactor: Keep Lia's Preference Inside Her Feature

* fix: Let Keyboard Users Pet Lia and Move Her With the Arrow Keys

* test: Shift Only the Wall Clock for Lia's Morning Greeting

* test: Measure Lia's Keyboard Walk Both Ways So the Greeting's Width Cannot Pin Her

* fix: Bring Lia Back When a New Chat Opens During Her Farewell

* fix: Start Lia's Reactions on Her Own Clock After a Pause Without Room

* fix: Load Lia Through Stale-Asset Recovery and Skip the Farewell Before She Appears

* feat: Mark the Lia Settings Toggle as Beta
…Chat-AI#16815)

* feat: Show the Conversation Pull Request in the Sidebar List

Add a batch lookup route and a sidebar row mark: the state icon with the CI dot, opening the same card beside the row on hover. The row keeps the conversation's own title.

* fix: Address Review Findings on the Sidebar Pull Request Batch and Row Mark

Cap the whole batch with a configurable deadline, make the row mark a keyboard-reachable button that opens the card on focus, refresh rows when the window regains focus through the shared batch, and show a retryable failure state instead of treating a failed first lookup as no pull request.

* fix: Send Sidebar Pull Request Batches One at a Time

Queue every batch request behind the one before it, so an oversized list or an overlapping flush cannot multiply the server's configured lookup concurrency, and bound how long one request may hold the queue so a request that never answers cannot stop the rest.

* fix: Keep the Batch Request Timeout Above the Server Deadline

Default the client's request timeout to just past the longest batchTimeoutSeconds a deployment may configure, so a queued request never starts while the previous request's server-side lookups are still running.

* fix: Keep Batch Lookups Inside the Concurrency Limit and Per-Entry Failures Per Entry

Share one lookup limiter across every batch request so lookups that outlive a request's deadline keep their slot, answer a missing token only for the conversations that needed it, and point the row at its pull request description only while that text is in the page.

* fix: Bound Batch Reads, Scope Concurrency Per Credential, and Gate the Sidebar on the Batch Version

Start the batch deadline when the request arrives and bound the config and lane reads, count lookup slots per credential, advertise a batch route version and ask only a server that has it, take no row space for an absent mark, show a failed refresh over a cached empty answer, keep a malformed response from stalling the request queue, and repair the lane recording tests that still used a mock removed on dev.

* fix: Move Capability Resolution Into the Package and Harden the Batch Route and Queue

Resolve the pull request startup capabilities in packages/api so the route stays wiring only, bound the config and lane reads by the configured deadline, merge identical lanes before taking limiter slots, fall back to the single route when a replica has no batch route, and dispose the batch queue when the signed-in user changes.

* fix: Abort the Batch Fallback With Its Request So the Queue Never Overlaps It

Give the batch fetcher the request's abort signal and pass it to every single-route call, abort a request that times out or is disposed, and stop the fallback workers from starting more calls once it has.

* fix: Forward the Abort Signal to the Batch POST

Pass the request's abort signal through the batch fetcher, the data-provider call and Axios, so a batch request that times out or is disposed is cancelled instead of continuing beside the next one, and settle a request promptly when it is aborted.

* fix: Close the Pull Request Lookup Follow-Ups and Cancel Abandoned Sidebar Rows
…-Chrome Themes (LibreChat-AI#16833)

* fix: Keep Chrome Surfaces and Destructive Confirms Legible in a Quiet-Chrome Theme

* fix: Soften Remaining Inline Destructive Triggers and Canonicalize Zero Chrome Alpha

* fix: Keep Pressed Feedback on the Quiet-Chrome Floating Control and Cover the Quiet Surfaces

* test: Scope the Quiet Surface Scenarios to the Header

* fix: Keep the Two-Factor Disable Trigger on the Soft Destructive Variant
…hat-AI#16827)

* feat: Add 10, 11, 13 and 15px Steps to the Theme Type Scale

* test: Prove the Off-Scale Type Steps in the Mock Harness

* style: Sort cn Imports

* refactor: Name the 13 and 15px Steps 1xs and 1sm

* test: Probe the Type Step Roles Instead of Unused Utilities
…at-AI#16823)

* refactor: Route Stylesheet Colours Through Theme Variables and Gate CSS Literals

* fix: Run the Colour Check Through Its Own Script

* fix: Read Numeric Fallbacks Inside Colour Function var() in the Colour Literal Check
)

* fix: Polish the Pull Request Chip and Card Header

Shrink the GitHub link icon and keep its hover on the icon only, drop the agent avatar from the chip so only the pull request icon remains, and open the hover card below the chip.

* fix: Scale the GitHub Icon With a viewBox and Rebase the Card Placement onto the Shared Panel
…ssions (LibreChat-AI#16829)

* refactor: Clear Raw-Color, Unknown-Class and Arbitrary-Value Suppressions in Auth, Nav and Endpoints

* refactor: Use the Registry Type Steps in the Nav Shortcut Chrome

* refactor: Prune Recorded Suppressions the Registry Type Steps Clear
…iants (LibreChat-AI#16863)

* refactor: Clear Chat Input Design Suppressions Through Existing Variants

* test: Cover the Chat Composer Send Path After the Suppression Cleanup

* refactor: Keep the FileUpload Action on Its Ghost Pressed Fill
…16861)

* a11y: Ring Tabs, Table, Dropdown and Menu Items in the Focus Control Role

* test: Tag the Focus Primitives Scenarios Literally

* test: Match the Dark Focus Rule That Yields to Outline Utilities

* refactor: Keep Menu Items and Table Rows on Their Existing Focus Treatment

* refactor: Leave Tabs and Dropdown on the Global Focus Outline

* test: Assert Both Outline Utility Exclusions in the Dark Focus Rule
…at-AI#16819)

* feat: Derive the Theme Cache Version and Close the Color Token Drift

* feat: Add a Button Padding Role for the Default Size

* test: Run the Boot Script Through the Version Injection

* fix: Retain Signed-Out Provenance and Tighten Token Declarations
…, Skills and Prompts (LibreChat-AI#16868)

* refactor: Use Existing Variants and Drop Redundant Overrides in Nav, Skills, Prompts and Endpoints

* test: Cover the Header Menu Trigger in the Default Theme

* chore: Prune Design Suppressions After the Rebase
…t-AI#16969)

* fix: Clear queued attachments and clarify steer receipt

* style: Match steer controls to message actions

* style: Sort pending steer imports
…-AI#16960)

* fix: Resolve useChat Tool Parts Against Live Attachments

* test: Cover useChat Live Attachment Scenarios
…hat-AI#16975)

* refactor: Judge chat imports on the resolved target with one boundary rule

scripts/eslint/chat.mjs replaces the import patterns and load selectors: every
specifier is normalized (extension, trailing slash, /index, package name)
before it is judged, across static imports, re-exports, import(), require(),
import-equals and import types, so any spelling of the /react or /components
entry or a UI package is rejected from core. A RuleTester table and a
table-driven scenario cover the spellings.

* fix: Anchor the chat boundary root to the config directory

* fix: Keep bare app paths and bare core entries behind the chat boundary

* fix: Treat aliased react paths in core as the /react entry
…I#16959)

* feat: Animate background tasks and add tool navigation

* fix: Focus background task navigation destinations directly

* style: Refine background task controls and navigation icons

* style: Place task stop controls after navigation

* fix: Address background task navigation and rendering findings

* fix: Fence task navigation and animate first detail reveal

* fix: Prefer exact subagent thread navigation targets

* fix: Preserve tool card hydration without navigation wrappers

* fix: Scope task destinations and reveal event subagents

* fix: Protect navigation focus and use theme focus roles
* fix: Use Dropdown for Code Execution Settings So Menus Stay Open

* fix: Describe the Workspace Dropdown and Move Select Scenarios to the Code Tool Picker

* fix: Keep a Disallowed Saved Workspace Disabled in the Dropdown
… to Jotai (LibreChat-AI#16968)

* refactor: Move Stop Button, Abort Scroll and Submission Start State to Jotai

* fix: Clear the Elapsed Baseline With the Other Per-Pane Run State
…ibreChat-AI#16979)

The step appliers, frame normalizer and SSE transport move from client/src/hooks/SSE into packages/chat/src/core with their specs, and the client imports them from @librechat/chat. The ask-user-question predicates the content applier reads move with them, and the client's approval module re-exports them so its consumers are unchanged.
…anes (LibreChat-AI#16982)

A conversation's pull request was found only by searching its branch for a PR whose head
contains the recorded commit, so a single unpushed local commit hid an existing PR.

The attached bash tool now hands its output to the lane recorder, which records a
github.com pull request link to the lane's repository with the lane state. The link is kept
across later reports on the same branch and repository and dropped when either changes. The
GitHub source reads a linked PR directly and accepts it when its head is the lane branch in
the lane repository; a fork's PR must carry the recorded commit. The single and batch routes
both pass the link, and the batch route keys lanes by it.
…AI#16985)

* feat: Look Up Pull Requests on a Configured GitHub Enterprise Host

* fix: Normalize and Range-Check the Pull Request Host Port
…eChat-AI#16986)

* feat: Look Up GitLab Merge Requests Behind a Provider Setting

* fix: Revalidate GitLab Merge Requests and Read a Full History Page
* feat: Look Up Bitbucket Cloud Pull Requests

* fix: Keep the Pull Request Host Out of Overrides and Per-Host Keys

A role, group, user or tenant override can no longer change or remove pullRequests.host, so feature gating and link recording see the operator's host. Links are recorded only from the configured host, and the batch share key and the rate limit cooldown are scoped by host.

* fix: Compare Pull Request Link Hosts Through the Host Resolver

* test: Add Pull Request Scenarios Against a Fake GitHub Enterprise Host

* fix: Keep the Pull Request Provider Out of Overrides and the Batch Share Key

A role, group, user or tenant override can no longer change pullRequests.provider, so feature gating and link recording agree with the lookup, and a batch lookup for one provider is never joined by a request for another.

* fix: Read GitLab History Apart From Open Merge Requests

Merged and closed merge requests are listed on their own, so open fork merge requests on the branch name cannot crowd them out. Rate limit cooldowns are scoped by provider, and a workspace repository with a dot segment is rejected.

* fix: Revalidate Bitbucket Pull Requests and Skip Ones Without a Source Commit

Read a full closed page so a newer closed fork cannot hide an older pull request from the repository, recheck the source branch and fork status on the detail, and treat a pull request without a source commit as unmatchable instead of failing the lookup.

* fix: Follow Bitbucket's Next Link When Listing Pull Requests

* fix: Record the Lane Pull Request Without an Aggregation Pipeline Update

* fix: Match an Empty Lane Repository as Unknown

* fix: List Locked GitLab Merge Requests With the Open Ones

* fix: Replace an Expiring Fake Git Host Certificate
…breChat-AI#16988)

* feat: Share Pull Request Lookups Across Replicas Through Redis

* fix: Bound the Shared Pull Request Cache and Drop Commands at Their Deadline

* fix: Pass the Cache Config to the Pull Request Store and Check It Before a Local Cooldown

* fix: Keep Batch Lookups Apart by Cache and Sharing Policy

* fix: Share Only Found Pull Requests and Rate Limits, Never Moving Them Backwards
* ci: Type-Check Workspaces with bun check

Make every workspace tsconfig valid under TypeScript 7 semantics while
staying clean on the installed tsc 5.9: explicit types arrays (TS 7 no
longer auto-includes node_modules/@types), es2017 target for
data-provider, rootDir for api specs that import client contracts, and
noUncheckedSideEffectImports off for the CSS and matchMedia mock imports.

Fix the four client type errors newer DOM and Intl libs expose, and drop
the fetch.preconnect copy in useRum that only existed to satisfy the
leaked @types/bun globals.

Switch the client typecheck script and the CI type-check steps to
bun check (Bun 1.4.3); tsc --noEmit stays available as typecheck:tsc.

* chore: Fall Back to tsc When bun check Is Unavailable

Add scripts/typecheck.mts, which runs bun check when the installed Bun
provides it and the repository's tsc otherwise, so contributors without
Bun can still type-check. The client typecheck script and the
static-checks TypeScript gate both resolve their checker through it,
keeping local runs on the same checker CI uses whenever Bun is present.

* ci: Type-Check the Chat Package Through the Shared Checker

* ci: Run the Type Check When Only the Shared Checker Changes

A change to scripts/typecheck.mts alone started neither frontend review
nor the static-checks TypeScript gate, so a broken resolver could merge
unexercised. Add it to the frontend-review triggers and to every
typecheck project's paths.

The suppression-baseline scenarios copy static-checks.mts into synthetic
roots; copy its new typecheck.mts import alongside i18n.mts so the runner
loads there. Add scenarios for the checker choice and its fallback.
…ibreChat-AI#16989)

* feat: Let Users Connect Their Own Account for Pull Request Lookups

* fix: Refuse Cross-Tenant Pull Request Callbacks and Surface Key Failures

* fix: Keep Pull Request Grants Through Outages and Remove Them on Disconnect

A token endpoint server error is an outage even with an OAuth error body, so
it no longer deletes the grant, and a refresh outage reaches the lookup as
unavailable instead of falling back to no token. Disconnect removes every
pr_oauth row of the user, whatever app or host is configured now. A grant that
never expires extends its retention when used, and the flow, request and
retention limits are configurable. The connection routes are built in
packages/api, mounted behind the pre-auth tenant middleware in both servers,
and answer failures with stable codes.

* fix: Keep the Pull Request OAuth App Out of Overrides

A role, group, user or tenant override can no longer change or remove pullRequests.oauth, so the connect capability and the callback see the operator's app.

* fix: Read a User's Pull Request Token Only With the Feature On

* fix: Report a Malformed Stored Pull Request Grant as a Failure

* fix: Remove a User's Stored Tokens When an Administrator Deletes the User

* fix: Answer No Pull Request for a Conversation Without a Lane When the User Token Fails

* fix: Share One Grant Read Between Concurrent Callers and Report an Expired Grant Disconnected

* fix: Remove a Pull Request Grant Only on a Definite Refusal and Past Its Retention

* fix: Version Pull Request Grants and Coordinate Refresh, Refusal and Retention Through Them

* fix: Invalidate a Refused User Token and Read It Only for a Lane That Needs It

* fix: Finish a Pull Request Connection Under the User's Effective Config Behind the Login Limiter

* fix: Type the Pull Request User Token for Isolated Declarations and Settle Retention Before Answering

* fix: Bind a Pull Request Connection Flow to the Generation a Disconnect Replaces

* fix: Start a Batch's User Token Read Only Within Its Deadline

* fix: Fence Pull Request Token Reads Against a Disconnect and Report a Failed Retention Cleanup

* fix: Fence Connection Status Like Token Reads and Keep a Newer Read Joinable

* fix: Report a Pull Request Grant Without Its App and Name the Sign-In That Made It

* fix: Read a User's Unexpired Pull Request Grants Newest First

* fix: Mark the Connection Callback as an OAuth Navigation and Report a Failed Extension

* fix: Name the Pull Request Sign-In Flow on Its Landing Page

* fix: Remove a Pull Request Grant of a Replaced App When It Is Read

* fix: Keep a Replaced App's Grant Untouched and Extend Retention From Each Day's Use

* fix: Accept a Pull Request Grant Only Under the User's Current Connection Generation

* fix: Renew the Connection Generation With a Grant Still in Use

* fix: Restore the Previous Connection When a Sign-In Cannot Store Its Grant

* fix: Decide a Sign-In by What Was Stored When a Write Does Not Answer

* fix: Roll Back a Sign-In's Generation Along With a Grant It Must Remove

* fix: Refresh an Access Token a Lookup Was Refused With Before Ending the Connection

* fix: Undo a Sign-In Only for a Confirmed Fence, Not a Failed Check

* fix: Read a User Token Again When the Connection Changes Under the Read

* fix: Apply the Current Retention Again When Another Replica Changed the Grant First

* test: Answer Each Concurrent Sign-In by Its Own Code

* fix: Skip Retention Rewrites for Grants That Expire Without a Refresh Token

* fix: Retry a Token Rejection That Loses to a Concurrent Grant Write

* fix: Skip User Token Reads for Lanes Without a Commit and Reread Status After a Reconnect
…-AI#16995)

* fix: Stop Cache Audit From Logging Cache Keys and Values

* fix: Keep Cache Audit Output to Counts and TTL

* fix: Log Cache Audit at Info So the Debug Toggle Still Emits

* test: Cover Cache Audit Redaction in the Mock Lane

* test: Run Cache Audit Scenario Against In-Memory Stores

* test: Parse Cache Audit Probe Output Before Asserting

* fix: Render Cache Audit Statistics in the Message and Move Formatting to packages/api
…cts Channel (LibreChat-AI#17000)

* refactor: Lift the step handler branches into a core reduceStep

The stepHandler branches move to @librechat/chat as reduceStep(state, event, ctx), with the per-run maps in a StreamState and every write outside the message list returned as a StepEffect. useStepHandler keeps the frame coalescing and applies the effects to the Jotai and Recoil stores.

The equivalence spec runs a frozen copy of the previous hook against the new binding on each recorded sequence and compares every channel they write.

* test: Pin the step reducer equivalence digests and drop the frozen handler

* test: Load the step reducer from the built chat core

* test: Type the equivalence fixtures to the event unions
…UI Message View (LibreChat-AI#16961)

* feat: Add Approval-Responded, Output-Denied and Ask-User Parts to the UI Message View

* refactor: Accept the Ask-User Pause in the Part Mapper Input Type

* fix: Keep the Reviewer's Output on a Respond Decision

* fix: Keep a Respond Decision's Output Successful When It Reads Like an Error
…eChat-AI#16996)

* fix: Encrypt User Plugin Credentials With Random-IV v3 Format

* test: Cover Credential Encryption Formats in Mock E2E Scenarios

* test: Round-Trip Real Credential Helpers in PluginService Spec

* 🙈 fix: Remove SharePoint Picker Payload Logging (LibreChat-AI#16997)

* fix: Add credentials.writeFormat to Gate v3 Credential Writes During Rollouts

* test: Expect 201 When the Legacy Write Format Override Is Created

* 🔊 fix: Clear TTS Audio Cache On Session End and Hash Its Keys (LibreChat-AI#16998)

* fix: Clear TTS Audio Cache On Session End and Hash Its Keys

* fix: Read Manual TTS Replays From the Hashed Cache Key

* fix: Purge Legacy TTS Cache Keys and Fence Writes Across Logout

* fix: Keep TTS Cache Writes Off the Playback Path

* test: Expect Hashed Keys in the StreamAudio Cache Lookup

* test: Use a Single-Token Reply Label in the TTS Cache Scenario

* fix: Settle TTS Cache Clear Before IdP Logout and Across Tabs

* test: Cover the TTS Cache Fence When Another Tab Logs Out

* test: Wait for the Second Tab Before Logging Out in the TTS Scenario

* fix: Latch TTS Cache Writes Shut Until the Tab Authenticates Again

* fix: Reopen TTS Cache Writes When Authentication Completes In Place

* fix: Leave for the IdP Even When TTS Cache Cleanup Fails

* fix: Retry a Failed Legacy TTS Purge and Fence Other Tabs on Manual Clear

* fix: Rerun the Legacy TTS Purge After Each Clear and Sign-In

* fix: Rerun the Legacy TTS Purge When Another Tab Clears

* fix: Fence Pre-Auth TTS Writes, Retry Failed Clears, and Fall Back to Storage Events

* fix: Version the Hashed TTS Cache Key Path

* fix: Move TTS Audio to a New Cache and Keep It Closed Until a Failed Clear Succeeds

* fix: Persist a Pending TTS Cache Delete Across Navigation

* fix: Reopen TTS Caching Only on Session Start and Fence Cache Reads

* fix: Keep the TTS Delete Fence in Cache Storage and Close Reads After Logout

* refactor: Keep Read-Aloud Audio in Tab Memory Instead of Cache Storage

* test: Return to the Conversation After Re-Login in the TTS Logout Scenario

* test: Close the Phone Sidebar Before Replaying in the TTS Logout Scenario

* fix: Bound the In-Memory TTS Cache by Size as Well as Count

* fix: Scope Cached TTS Audio to the Signed-In User

* fix: Keep the Settings Cache Delete Available While Legacy Audio Remains

* fix: Recheck Legacy TTS Audio After a Settings Clear and on Unowned Handoff

* fix: Fence TTS Writes Started Before an Account Signs In

* test: Opt the Fresh TTS Account Into Enter-to-Send
…t-AI#16999)

* fix: Stop Cache Audit From Logging Cache Keys and Values

* fix: Keep Cache Audit Output to Counts and TTL

* fix: Log Cache Audit at Info So the Debug Toggle Still Emits

* test: Cover Cache Audit Redaction in the Mock Lane

* test: Run Cache Audit Scenario Against In-Memory Stores

* test: Parse Cache Audit Probe Output Before Asserting

* fix: Render Cache Audit Statistics in the Message and Move Formatting to packages/api

* fix: Encrypt User Plugin Credentials With Random-IV v3 Format

* test: Cover Credential Encryption Formats in Mock E2E Scenarios

* test: Round-Trip Real Credential Helpers in PluginService Spec

* 🙈 fix: Remove SharePoint Picker Payload Logging (LibreChat-AI#16997)

* fix: Add credentials.writeFormat to Gate v3 Credential Writes During Rollouts

* test: Expect 201 When the Legacy Write Format Override Is Created

* fix: Clear TTS Audio Cache On Session End and Hash Its Keys

* fix: Read Manual TTS Replays From the Hashed Cache Key

* fix: Purge Legacy TTS Cache Keys and Fence Writes Across Logout

* fix: Keep TTS Cache Writes Off the Playback Path

* test: Expect Hashed Keys in the StreamAudio Cache Lookup

* test: Use a Single-Token Reply Label in the TTS Cache Scenario

* fix: Settle TTS Cache Clear Before IdP Logout and Across Tabs

* test: Cover the TTS Cache Fence When Another Tab Logs Out

* test: Wait for the Second Tab Before Logging Out in the TTS Scenario

* fix: Latch TTS Cache Writes Shut Until the Tab Authenticates Again

* fix: Reopen TTS Cache Writes When Authentication Completes In Place

* fix: Leave for the IdP Even When TTS Cache Cleanup Fails

* fix: Retry a Failed Legacy TTS Purge and Fence Other Tabs on Manual Clear

* fix: Rerun the Legacy TTS Purge After Each Clear and Sign-In

* fix: Rerun the Legacy TTS Purge When Another Tab Clears

* fix: Fence Pre-Auth TTS Writes, Retry Failed Clears, and Fall Back to Storage Events

* fix: Version the Hashed TTS Cache Key Path

* fix: Move TTS Audio to a New Cache and Keep It Closed Until a Failed Clear Succeeds

* fix: Persist a Pending TTS Cache Delete Across Navigation

* fix: Reopen TTS Caching Only on Session Start and Fence Cache Reads

* fix: Keep the TTS Delete Fence in Cache Storage and Close Reads After Logout

* refactor: Keep Read-Aloud Audio in Tab Memory Instead of Cache Storage

* test: Return to the Conversation After Re-Login in the TTS Logout Scenario

* test: Close the Phone Sidebar Before Replaying in the TTS Logout Scenario

* fix: Bound the In-Memory TTS Cache by Size as Well as Count

* fix: Scope Cached TTS Audio to the Signed-In User

* fix: Keep the Settings Cache Delete Available While Legacy Audio Remains

* fix: Recheck Legacy TTS Audio After a Settings Clear and on Unowned Handoff

* fix: Fence TTS Writes Started Before an Account Signs In

* test: Opt the Fresh TTS Account Into Enter-to-Send

* fix: Load Google Tag Manager Only After Analytics Consent

Google Tag Manager initialized as soon as the chat footer or the chat route mounted whenever ANALYTICS_GTM_ID was set, for signed-in users and shared-link viewers alike, with no consent check. A single useAnalytics hook now owns initialization and loads the container only after the viewer grants consent, recorded in a persisted Jotai atom. A non-modal banner asks for that consent in the signed-in layout and on shared links, and a Data controls toggle changes it later; withdrawing consent pushes a consent mode update to a loaded container and completes on reload.

* fix: Restore Analytics Consent to a Container Still on the Page

* test: Cover Analytics Consent Scenarios

* test: Observe Missing Tag Manager Requests Over a Bounded Window

* fix: Recognize Only the Configured Tag Manager Container

* fix: Send Consent Withdrawal Only to the Configured Container

* fix: Describe the Consent Withdrawal Guard Accurately

* fix: Keep Advertising Consent Denied When Analytics Is Allowed

* fix: Let Shared-Link Viewers Change Analytics Consent

* fix: Retry a Tag Manager Container That Never Registered

* fix: Treat a Loading Container as Present and Drop It When It Fails

* fix: Drop a Failed Tag Manager Attempt's Start Event Before Retrying
…AI#16990)

* feat: Add a Connected Account Setting for Pull Requests

* fix: Watch an Open Account Sign-In and Keep the Retry Button Named

* fix: Name the Disconnect Confirmation and Show the Provider the Server Reports

* feat: Tell the Client How Long a Pull Request Account Sign-In Lasts

* fix: Follow the Sign-In Lifetime and Keep Account Actions Settled Past Settings

* fix: Watch an Account Sign-In Until Its Window Closes, Even After Settings Closes

* fix: Refresh Pull Requests Once per Change of the Credential They Were Fetched With

* fix: Record Every Status the Sign-In Watch Reads

* fix: Keep Watching a Severed Sign-In Through Its Landing Page and End Watches With the Session

* fix: Drop a Sign-In Begun Before the Session Ended

* fix: Keep a Surviving Grant Removable and Tie a Sign-In Watch to Its Own Flow

* fix: Ask for the Pull Request Account Wherever Pull Requests Are On

* fix: Refresh Pull Requests on a Session's First Status and End a Failed Sign-In's Watch

* fix: Ignore an OAuth Failure That Names No Sign-In Flow

* fix: Start No Sign-In for a Window Closed Before the Server Answered

* fix: Keep a Known Grant Removable While the Status Check Fails

* fix: Name a Grant Without a Current App Only as an Account

* fix: Keep the Pull Request Account Row Readable on a Phone

* fix: Show a Grant Whose App Is Off as Not in Use

* fix: Apply a Sign-In Status Asked For Before the Flow Expired

* fix: Keep Focus When Removing the Last Pull Request Grant and Reuse Its Status

* fix: Resync Pull Request Credentials After Failed Sign-Ins and Disconnects

* fix: Ask for the Connection Status Afresh Once a Sign-In Settles

* fix: Resync Pull Requests From the Settings Visibility Status

* fix: Reconcile Pull Request Credentials Until a Status Read Succeeds

* fix: Keep Pull Request Sign-In State Accurate Across Failures and Account Switches

* fix: Drop Replaced Sign-In Answers and Reset Status When the Account Changes

* fix: Reset Unwatched Connection Status and Keep Focus When a Retry Hides the Row

* fix: Hear Late Sign-In Settlements and Explain Connect Failures After Settings Closes

* fix: Listen Until a Sign-In Settles and Keep Focus After a Dismissed Disconnect
…-AI#17031)

* fix: Stop Logging Action Auth Credentials to the Console

* test: Assert Saving an Action Writes No Secret to the Console
…hat-AI#16953)

* refactor: Draw Composer Controls With the Shared Button

* test: Pin the Composer Controls' Look Through the Shared Button
… 24px Target (LibreChat-AI#16928)

* fix: Hold Button Heights and the Dialog Close Button at the 24px Target

* fix: Write a Zero Button Height as a Length the Target Floor Can Compare

* test: Let the Delete Dialog Settle Before Measuring Its Close Glyph

* test: Pin the Theme Cache Digest the Rebased Resolver Emits
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.

[Bug]: v0.8.8 rejects C++ files with Upload as Text

3 participants