Studio: bulk export and import in Settings Chat Data, MCP pill off switch (#6141)

* Studio: bulk export and import in Settings Chat Data, MCP pill off switch

- Settings -> Chat -> Data gains Export Recents and Projects (Recents or
  Recents + Projects, Raw JSONL / CSV / ShareGPT, combined or per chat)
  and Import chats, reusing the sidebar Recents menu actions
- Extract bulkExportConversationsByScope so the sidebar and Settings share
  one implementation; expose the export and import helpers via the chat
  feature index
- MCP composer pill icon now swaps to an X on hover like Search, Code and
  RAG; clicking it turns MCP off without opening the server menu
- en and zh-CN locale strings added (parity check passes)

* Reveal the pill X on hover for off-switch icons regardless of active look

The X was gated on data-active, so an MCP pill with no servers enabled
(or a RAG pill without a model) closed on icon click but never showed
the affordance. Off-switch pills only render while their feature is on,
so hover now always reveals the X.

* Replace the Recents hamburger menu with an Export all chats link to Settings

Bulk export and import now live in Settings -> Chat -> Data, so the
sidebar Recents header menu is gone. Each chat's Export submenu gains
Export all chats, which opens Settings on the Chat tab.
This commit is contained in:
Daniel Han 2026-06-10 05:11:15 -07:00 committed by GitHub
commit dfb49fd2cb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 233 additions and 115 deletions

View file

@ -1077,6 +1077,20 @@
@apply opacity-100;
}
/* Pills whose icon is an off switch (RAG, MCP) only render while the
feature is on, so reveal the X on hover even when the pill is not in
its active look (MCP with no servers enabled, RAG without a model). */
.composer-pill-btn:has(> .composer-pill-glyph[role="button"]):hover
.composer-pill-glyph
> :not(.composer-pill-x) {
@apply opacity-0;
}
.composer-pill-btn:has(> .composer-pill-glyph[role="button"]):hover
.composer-pill-x {
@apply opacity-100;
}
.composer-input {
@apply mt-2 mb-1 mx-3 min-h-12 w-[calc(100%-1.5rem)] resize-none overflow-y-auto bg-transparent pl-2 pr-4 pt-2 pb-3 text-sm font-[450] outline-none placeholder:text-muted-foreground focus-visible:ring-0;
}