Skip to content

♻️ refactor(ModelSwitchPanel): migrate from Popover to DropdownMenu with virtual scrolling#11663

Merged
Innei merged 3 commits intonextfrom
refactor/model-switch-panel-dropdown
Jan 20, 2026
Merged

♻️ refactor(ModelSwitchPanel): migrate from Popover to DropdownMenu with virtual scrolling#11663
Innei merged 3 commits intonextfrom
refactor/model-switch-panel-dropdown

Conversation

@Innei
Copy link
Copy Markdown
Member

@Innei Innei commented Jan 20, 2026

💻 Change Type

  • ♻️ refactor

🔗 Related Issue

Resolves LOBE-3844

🔀 Description of Change

This PR refactors the ModelSwitchPanel component to use DropdownMenu atom components from @lobehub/ui instead of Popover, and implements proper virtual scrolling with react-virtuoso.

Key Changes:

  • DropdownMenu Migration: Replace Popover with DropdownMenuRoot, DropdownMenuTrigger, DropdownMenuPortal, DropdownMenuPositioner, DropdownMenuPopup atom components
  • Virtual Scrolling: Implement proper virtual scrolling using react-virtuoso for the model list
  • Scroll-to-close Submenu: Auto-close nested submenus when scrolling to prevent position offset issues
  • Naming Cleanup: Rename misleading "Virtual*" prefixes to "List*" for clarity (the "Virtual" was not indicating virtual scrolling)

Files Changed:

  • index.tsx - Main component using DropdownMenu atoms
  • components/List/index.tsx - Virtuoso integration with scroll state tracking
  • components/List/ListItemRenderer.tsx - Renamed from VirtualItemRenderer
  • components/List/MultipleProvidersModelItem.tsx - Controlled submenu with scroll-close
  • hooks/useBuildListItems.ts - Renamed from useBuildVirtualItems
  • types.ts - ListItem type (renamed from VirtualItem)
  • utils.ts - getListItemKey function (renamed)
  • styles.ts - Added menuItemActive style

🧪 How to Test

  • Tested locally
  • Added/updated tests
  • No tests needed
  1. Open the model switch panel in chat input area
  2. Verify the dropdown menu opens/closes correctly
  3. Test scrolling through the model list (should be smooth with virtual scrolling)
  4. For models with multiple providers, hover to open submenu
  5. Scroll quickly while submenu is open - it should auto-close to prevent position offset

📝 Additional Information

This refactor maintains the same visual layout and functionality while improving:

  • Performance with virtual scrolling for large model lists
  • UX by fixing the submenu position offset issue during scrolling
  • Code clarity by removing misleading naming conventions

Summary by Sourcery

Refactor the ModelSwitchPanel to use DropdownMenu-based menus with virtualized scrolling and improved multi-provider handling.

Enhancements:

  • Replace the Popover-based ModelSwitchPanel with DropdownMenu components, including submenu support for multi-provider models.
  • Introduce react-virtuoso-based virtual scrolling for the model list to efficiently render large datasets.
  • Track scrolling state to automatically close open submenus and prevent position offset issues while scrolling.
  • Simplify and clarify list-related naming by renaming Virtual* types, hooks, and renderers to List* equivalents and aligning DropdownPlacement with the UI library type.
  • Highlight active menu items with a new menuItemActive style for better visual feedback.

Tests:

  • Add mock enabled chat models data to support testing of grouped model list behavior, including single- and multi-provider scenarios.

…ith virtual scrolling

- Replace Popover with DropdownMenu atom components from @lobehub/ui
- Add react-virtuoso for proper virtual scrolling implementation
- Auto-close submenu when scrolling to prevent position offset issues
- Rename misleading "Virtual*" naming to "List*" for clarity

LOBE-3844
@vercel
Copy link
Copy Markdown

vercel bot commented Jan 20, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
lobehub Ready Ready Preview, Comment Jan 20, 2026 4:37pm

Request Review

@sourcery-ai
Copy link
Copy Markdown
Contributor

sourcery-ai bot commented Jan 20, 2026

Reviewer's Guide

Refactors ModelSwitchPanel to use @lobehub/ui DropdownMenu components with react-virtuoso-based virtual scrolling, adds scroll-aware submenu behavior, and cleans up "Virtual*" naming to more accurately reflect list semantics.

Class diagram for updated ModelSwitchPanel list structure and types

classDiagram
  class ModelSwitchPanel {
    +children ReactNode
    +placement DropdownPlacement
    +model string
    +provider string
    +onModelChange(params)
    +onOpenChange(open)
  }

  class DropdownMenuRoot {
    +open boolean
    +onOpenChange(open)
  }

  class DropdownMenuTrigger {
    +nativeButton boolean
    +openOnHover boolean
  }

  class DropdownMenuPortal
  class DropdownMenuPositioner {
    +hoverTrigger boolean
    +placement DropdownMenuPlacement
  }

  class DropdownMenuPopup

  class PanelContent {
    +model string
    +provider string
    +onModelChange(params)
    +onOpenChange(open)
  }

  class List {
    +groupMode GroupMode
    +model string
    +provider string
    +onModelChange(params)
    +onOpenChange(open)
    -enabledList EnabledProviderWithModels[]
    -listItems ListItem[]
    -isScrolling boolean
    -panelHeight number
    +handleModelChange(params)
    +handleClose()
  }

  class Virtuoso {
    +totalCount number
    +itemContent(index)
    +overscan number
    +isScrolling(scrolling)
  }

  class ListItemRenderer {
    +activeKey string
    +isScrolling boolean
    +item ListItem
    +newLabel string
    +onModelChange(modelId, providerId)
    +onClose()
  }

  class MultipleProvidersModelItem {
    +activeKey string
    +data ModelWithProviders
    +isScrolling boolean
    +newLabel string
    +onModelChange(modelId, providerId)
    +onClose()
    -submenuOpen boolean
  }

  class SingleProviderModelItem {
    +activeKey string
    +data ModelWithProviders
    +newLabel string
    +onModelChange(modelId, providerId)
    +onClose()
  }

  class DropdownMenuSubmenuRoot {
    +open boolean
    +onOpenChange(open)
  }

  class DropdownMenuSubmenuTrigger
  class DropdownMenuGroup
  class DropdownMenuGroupLabel
  class DropdownMenuItem {
    +onClick()
  }
  class DropdownMenuItemIcon
  class DropdownMenuItemLabel
  class DropdownMenuItemExtra

  class useBuildListItems {
    +useBuildListItems(enabledList, groupMode, searchKeyword) ListItem[]
  }

  class ModelWithProviders {
    +model AiModelForSelect
    +providers ProviderInfo[]
  }

  class ProviderInfo {
    +id string
    +logo string
    +name string
    +source string
  }

  class ListItem {
  }
  class ListItemModelItemSingle {
    +type string
    +data ModelWithProviders
  }
  class ListItemModelItemMultiple {
    +type string
    +data ModelWithProviders
  }
  class ListItemGroupTitle {
    +type string
    +title string
  }
  class ListItemDivider {
    +type string
  }
  class ListItemNoProvider {
    +type string
  }

  class utils {
    +menuKey(provider, model) string
    +getListItemKey(item) string
  }

  ModelSwitchPanel --> DropdownMenuRoot
  DropdownMenuRoot --> DropdownMenuTrigger
  DropdownMenuRoot --> DropdownMenuPortal
  DropdownMenuPortal --> DropdownMenuPositioner
  DropdownMenuPositioner --> DropdownMenuPopup
  DropdownMenuPopup --> PanelContent

  PanelContent --> List
  List --> Virtuoso
  List --> useBuildListItems
  useBuildListItems --> ListItem

  Virtuoso --> ListItemRenderer
  ListItemRenderer --> MultipleProvidersModelItem
  ListItemRenderer --> SingleProviderModelItem

  MultipleProvidersModelItem --> DropdownMenuSubmenuRoot
  DropdownMenuSubmenuRoot --> DropdownMenuSubmenuTrigger
  MultipleProvidersModelItem --> DropdownMenuPortal
  MultipleProvidersModelItem --> DropdownMenuPositioner
  MultipleProvidersModelItem --> DropdownMenuPopup
  DropdownMenuPopup --> DropdownMenuGroup
  DropdownMenuGroup --> DropdownMenuGroupLabel
  DropdownMenuGroup --> DropdownMenuItem
  DropdownMenuItem --> DropdownMenuItemIcon
  DropdownMenuItem --> DropdownMenuItemLabel
  DropdownMenuItem --> DropdownMenuItemExtra

  ListItem <|-- ListItemModelItemSingle
  ListItem <|-- ListItemModelItemMultiple
  ListItem <|-- ListItemGroupTitle
  ListItem <|-- ListItemDivider
  ListItem <|-- ListItemNoProvider

  MultipleProvidersModelItem --> ModelWithProviders
  SingleProviderModelItem --> ModelWithProviders
  ModelWithProviders --> ProviderInfo

  List --> utils
  ListItemRenderer --> utils
Loading

File-Level Changes

Change Details Files
Replace Popover-based panel with DropdownMenu-based architecture, including nested submenus for multi-provider models.
  • Swap ModelSwitchPanel root from Popover to DropdownMenuRoot/Trigger/Portal/Positioner/Popup while preserving placement and content wiring.
  • Refactor MultipleProvidersModelItem from a generic DropdownMenu with items array to a controlled DropdownMenuSubmenuRoot/Trigger/Popup with explicit item markup and active-state styling.
  • Update DropdownPlacement type to rely on DropdownMenuPlacement from @lobehub/ui instead of a local union type.
src/features/ModelSwitchPanel/index.tsx
src/features/ModelSwitchPanel/components/List/MultipleProvidersModelItem.tsx
src/features/ModelSwitchPanel/types.ts
Introduce proper virtual scrolling for the model list using react-virtuoso and simplify list rendering.
  • Replace custom virtual list logic and delayed initial render with Virtuoso, wiring itemContent, totalCount, overscan, and dynamic height.
  • Rename VirtualItemRenderer to ListItemRenderer and adjust it to consume ListItem instead of VirtualItem.
  • Remove useDelayedRender and INITIAL_RENDER_COUNT-based slicing in favor of Virtuoso-driven rendering.
src/features/ModelSwitchPanel/components/List/index.tsx
src/features/ModelSwitchPanel/components/List/ListItemRenderer.tsx
src/features/ModelSwitchPanel/hooks/useBuildListItems.ts
src/features/ModelSwitchPanel/components/PanelContent.tsx
Track scroll state to auto-close multi-provider submenus and highlight active multi-provider entries.
  • Add isScrolling state in List and propagate it into ListItemRenderer and MultipleProvidersModelItem.
  • Use useEffect in MultipleProvidersModelItem to close the submenu whenever scrolling starts.
  • Derive isActive for multi-provider models via menuKey comparison and apply a new menuItemActive style when active.
src/features/ModelSwitchPanel/components/List/index.tsx
src/features/ModelSwitchPanel/components/List/ListItemRenderer.tsx
src/features/ModelSwitchPanel/components/List/MultipleProvidersModelItem.tsx
src/features/ModelSwitchPanel/styles.ts
Standardize naming from Virtual* to List* and align list utilities with the new types.
  • Rename VirtualItem type to ListItem and propagate the new name throughout list-related components and utilities.
  • Rename useBuildVirtualItems to useBuildListItems and getVirtualItemKey to getListItemKey to match the updated type naming.
  • Adjust imports/exports across the ModelSwitchPanel feature to use the new list-oriented names.
src/features/ModelSwitchPanel/hooks/useBuildListItems.ts
src/features/ModelSwitchPanel/components/List/ListItemRenderer.tsx
src/features/ModelSwitchPanel/utils.ts
src/features/ModelSwitchPanel/types.ts
src/features/ModelSwitchPanel/components/List/index.tsx
Add mock data to support testing of grouped models and multi-provider scenarios in ModelSwitchPanel.
  • Introduce mockEnabledChatModels with multiple providers and overlapping model display names to exercise model-item-single vs model-item-multiple cases.
  • Document expected grouping behavior in comments for groupMode = 'byModel' to guide tests and future changes.
src/features/ModelSwitchPanel/__mocks__/mockEnabledChatModels.ts

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@dosubot dosubot bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Jan 20, 2026
@gru-agent
Copy link
Copy Markdown
Contributor

gru-agent bot commented Jan 20, 2026

TestGru Assignment

Summary

Link CommitId Status Reason
Detail 3db188d 🚫 Skipped No files need to be tested {"src/features/ModelSwitchPanel/mocks/mockEnabledChatModels.ts":"File path does not match include patterns.","src/features/ModelSwitchPanel/components/List/ListItemRenderer.tsx":"File path does not match include patterns.","src/features/ModelSwitchPanel/components/List/MultipleProvidersModelItem.tsx":"File path does not match include patterns.","src/features/ModelSwitchPanel/components/List/index.tsx":"File path does not match include patterns.","src/features/ModelSwitchPanel/components/PanelContent.tsx":"File path does not match include patterns.","src/features/ModelSwitchPanel/hooks/useBuildListItems.ts":"File path does not match include patterns.","src/features/ModelSwitchPanel/index.tsx":"File path does not match include patterns.","src/features/ModelSwitchPanel/styles.ts":"File path does not match include patterns.","src/features/ModelSwitchPanel/types.ts":"File path does not match include patterns.","src/features/ModelSwitchPanel/utils.ts":"File pat…

History Assignment

Tip

You can @gru-agent and leave your feedback. TestGru will make adjustments based on your input

Copy link
Copy Markdown
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 1 issue, and left some high level feedback:

  • In List, the Virtuoso usage wires isScrolling={handleScrollingStateChange}, but isScrolling is a boolean in the render context rather than a callback prop—consider switching to the appropriate scroll state callback (e.g., scrollStateChange or similar) from the Virtuoso API and passing that boolean down to ListItemRenderer instead.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In `List`, the `Virtuoso` usage wires `isScrolling={handleScrollingStateChange}`, but `isScrolling` is a boolean in the render context rather than a callback prop—consider switching to the appropriate scroll state callback (e.g., `scrollStateChange` or similar) from the Virtuoso API and passing that boolean down to `ListItemRenderer` instead.

## Individual Comments

### Comment 1
<location> `src/features/ModelSwitchPanel/index.tsx:38-47` </location>
<code_context>
-      >
-        {children}
-      </Popover>
+      <DropdownMenuRoot onOpenChange={handleOpenChange} open={isOpen}>
+        <DropdownMenuTrigger nativeButton={false} openOnHover>
+          {children}
+        </DropdownMenuTrigger>
+        <DropdownMenuPortal>
+          <DropdownMenuPositioner hoverTrigger placement={placement}>
+            <DropdownMenuPopup className={styles.container}>
+              <PanelContent
+                model={modelProp}
+                onModelChange={onModelChange}
+                onOpenChange={handleOpenChange}
+                provider={providerProp}
+              />
+            </DropdownMenuPopup>
+          </DropdownMenuPositioner>
+        </DropdownMenuPortal>
+      </DropdownMenuRoot>
     );
   },
</code_context>

<issue_to_address>
**question (bug_risk):** Switching from click-based Popover to hover-based DropdownMenu may change UX expectations.

This shifts the interaction from a likely click/controlled Popover to a hover-triggered dropdown, which alters how the panel opens/closes and may impact keyboard accessibility, focus behavior, and accidental hover opens. Please confirm this hover-based behavior is intentional and consistent with the rest of the app; otherwise consider disabling `openOnHover` or using a click-driven pattern instead.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3db188d683

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +100 to +105
<Virtuoso
isScrolling={handleScrollingStateChange}
itemContent={itemContent}
overscan={200}
style={{ height: listHeight }}
totalCount={listItems.length}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Provide stable item keys to avoid state leakage

The new Virtuoso usage keys rows by index because neither data nor computeItemKey is provided. When listItems changes order/length (e.g., search keyword or group mode changes), React will reuse row components by index, so stateful rows like MultipleProvidersModelItem (which tracks submenuOpen) can carry their open state to a different model after filtering or regrouping. This can surface as the wrong submenu opening automatically or stale visual state. Consider supplying data={listItems} and computeItemKey (e.g., using getListItemKey) so row identity follows the model/provider, not the index.

Useful? React with 👍 / 👎.

@codecov
Copy link
Copy Markdown

codecov bot commented Jan 20, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 74.55%. Comparing base (47fd5e6) to head (25add9f).
⚠️ Report is 8 commits behind head on next.

Additional details and impacted files
@@            Coverage Diff             @@
##             next   #11663      +/-   ##
==========================================
+ Coverage   73.04%   74.55%   +1.51%     
==========================================
  Files        1155     1187      +32     
  Lines       86727    93729    +7002     
  Branches     9493    10378     +885     
==========================================
+ Hits        63348    69880    +6532     
- Misses      23289    23759     +470     
  Partials       90       90              
Flag Coverage Δ
app 67.60% <ø> (ø)
database 93.28% <ø> (?)
packages/agent-runtime 89.18% <ø> (ø)
packages/context-engine 85.29% <ø> (ø)
packages/conversation-flow 92.41% <ø> (ø)
packages/file-loaders 88.66% <ø> (ø)
packages/memory-user-memory 69.75% <ø> (ø)
packages/model-bank 100.00% <ø> (ø)
packages/model-runtime 86.70% <ø> (ø)
packages/prompts 79.33% <ø> (ø)
packages/python-interpreter 92.90% <ø> (ø)
packages/ssrf-safe-fetch 0.00% <ø> (ø)
packages/utils 93.25% <ø> (ø)
packages/web-crawler 95.62% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
Store 68.52% <ø> (ø)
Services 50.84% <ø> (ø)
Server 68.16% <ø> (ø)
Libs 41.13% <ø> (ø)
Utils 93.82% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Innei Innei merged commit c9d9dff into next Jan 20, 2026
35 checks passed
@Innei Innei deleted the refactor/model-switch-panel-dropdown branch January 20, 2026 15:07
@lobehubbot
Copy link
Copy Markdown
Member

❤️ Great PR @Innei ❤️

The growth of project is inseparable from user feedback and contribution, thanks for your contribution! If you are interesting with the lobehub developer community, please join our discord and then dm @arvinxx or @canisminor1990. They will invite you to our private developer channel. We are talking about the lobe-chat development or sharing ai newsletter around the world.

lobehubbot pushed a commit that referenced this pull request Jan 20, 2026
## [Version&nbsp;2.0.0-next.325](v2.0.0-next.324...v2.0.0-next.325)
<sup>Released on **2026-01-20**</sup>

#### ♻ Code Refactoring

- **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling.

#### 🐛 Bug Fixes

- **sidebar-drawer**: Fix drawer positioning and title style.

<br/>

<details>
<summary><kbd>Improvements and Fixes</kbd></summary>

#### Code refactoring

* **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling, closes [#11663](#11663) ([c9d9dff](c9d9dff))

#### What's fixed

* **sidebar-drawer**: Fix drawer positioning and title style, closes [#11655](#11655) ([cf5320e](cf5320e))

</details>

<div align="right">

[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)

</div>
@lobehubbot
Copy link
Copy Markdown
Member

🎉 This PR is included in version 2.0.0-next.325 🎉

The release is available on:

Your semantic-release bot 📦🚀

JamieStivala pushed a commit to jaworldwideorg/OneJA-Bot that referenced this pull request Jan 23, 2026
## [Version&nbsp;1.153.0](v1.152.0...v1.153.0)
<sup>Released on **2026-01-23**</sup>

#### ♻ Code Refactoring

- **auth**: Remove NEXT_PUBLIC_AUTH_URL env variable.
- **model-select**: Migrate FunctionCallingModelSelect to LobeSelect.
- **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling.
- **userMemories**: Removed un-used code.
- **misc**: Improve memory data with experience and identity, move vercel-react-best-practices skills to .agents directory.

#### ✨ Features

- **database**: Added user memory activity.
- **desktop**: Add legacy local database detection and migration guidance.
- **misc**: Add platform-aware download client menu option, add server version check for desktop app, remove Clerk authentication code, skill setting page and skill store, support agent group unpublish agents, support client tasks mode, update the sandbox preinstall libs in sys role.

#### 🐛 Bug Fixes

- **copilot**: Pass correct scope when creating new session in PageEditor.
- **desktop**: Gracefully handle missing update manifest 404 errors.
- **model-runtime**: Filter unsupported image types (SVG) before sending to vision models.
- **pdf**: Upgrade pdfjs-dist and react-pdf to v5.x.
- **sidebar-drawer**: Fix drawer positioning and title style.
- **misc**: Fix group broadcast trigger tool use, fix local system tools, fix memory schema, fix multi agent tasks issue, fix multi tasks no summary issue, fix scope issue, fix tool argument scape and improve multi task run, fixed the sandbox tools call when error should use right callback, improve e2e server and complete i18n resources, slove the agent group editor not focus in editdata area, slove the agents header switch agents the lobeAI not show problem, sloved the old removeSessionTopics not work, TypewriterEffect not refreshing on language change, updata cron job ui & fixed commnuity pagenation goto error, update the agentbuilder tools not always use humanIntervention.

#### 💄 Styles

- **misc**: Improve auto scroll and group profile, update og, update share style.

<br/>

<details>
<summary><kbd>Improvements and Fixes</kbd></summary>

#### Code refactoring

* **auth**: Remove NEXT_PUBLIC_AUTH_URL env variable, closes [lobehub#11658](https://github.com/jaworldwideorg/OneJA-Bot/issues/11658) ([c0f9875](c0f9875))
* **model-select**: Migrate FunctionCallingModelSelect to LobeSelect, closes [lobehub#11664](https://github.com/jaworldwideorg/OneJA-Bot/issues/11664) ([ad51305](ad51305))
* **ModelSwitchPanel**: Migrate from Popover to DropdownMenu with virtual scrolling, closes [lobehub#11663](https://github.com/jaworldwideorg/OneJA-Bot/issues/11663) ([c9d9dff](c9d9dff))
* **userMemories**: Removed un-used code, closes [lobehub#11713](https://github.com/jaworldwideorg/OneJA-Bot/issues/11713) ([89750fc](89750fc))
* **misc**: Improve memory data with experience and identity, closes [lobehub#11717](https://github.com/jaworldwideorg/OneJA-Bot/issues/11717) ([bdb3eb4](bdb3eb4))
* **misc**: Move vercel-react-best-practices skills to .agents directory, closes [lobehub#11703](https://github.com/jaworldwideorg/OneJA-Bot/issues/11703) ([6df7731](6df7731))

#### What's improved

* **database**: Added user memory activity, closes [lobehub#11680](https://github.com/jaworldwideorg/OneJA-Bot/issues/11680) ([0160fbd](0160fbd))
* **desktop**: Add legacy local database detection and migration guidance, closes [lobehub#11682](https://github.com/jaworldwideorg/OneJA-Bot/issues/11682) ([5664b84](5664b84))
* **misc**: Add platform-aware download client menu option, closes [lobehub#11676](https://github.com/jaworldwideorg/OneJA-Bot/issues/11676) ([55abddc](55abddc))
* **misc**: Add server version check for desktop app, closes [lobehub#11710](https://github.com/jaworldwideorg/OneJA-Bot/issues/11710) ([0cf2723](0cf2723))
* **misc**: Remove Clerk authentication code, closes [lobehub#11711](https://github.com/jaworldwideorg/OneJA-Bot/issues/11711) ([395595a](395595a))
* **misc**: Skill setting page and skill store, closes [lobehub#11665](https://github.com/jaworldwideorg/OneJA-Bot/issues/11665) ([d8c0c26](d8c0c26))
* **misc**: Support agent group unpublish agents, closes [lobehub#11687](https://github.com/jaworldwideorg/OneJA-Bot/issues/11687) ([4e060be](4e060be))
* **misc**: Support client tasks mode, closes [lobehub#11666](https://github.com/jaworldwideorg/OneJA-Bot/issues/11666) ([98cf57b](98cf57b))
* **misc**: Update the sandbox preinstall libs in sys role, closes [lobehub#11688](https://github.com/jaworldwideorg/OneJA-Bot/issues/11688) ([404c577](404c577))

#### What's fixed

* **copilot**: Pass correct scope when creating new session in PageEditor, closes [lobehub#11714](https://github.com/jaworldwideorg/OneJA-Bot/issues/11714) ([0259270](0259270))
* **desktop**: Gracefully handle missing update manifest 404 errors, closes [lobehub#11625](https://github.com/jaworldwideorg/OneJA-Bot/issues/11625) ([13e95b9](13e95b9))
* **model-runtime**: Filter unsupported image types (SVG) before sending to vision models, closes [lobehub#11698](https://github.com/jaworldwideorg/OneJA-Bot/issues/11698) ([c0c99a7](c0c99a7))
* **pdf**: Upgrade pdfjs-dist and react-pdf to v5.x, closes [lobehub#11686](https://github.com/jaworldwideorg/OneJA-Bot/issues/11686) ([2b620df](2b620df))
* **sidebar-drawer**: Fix drawer positioning and title style, closes [lobehub#11655](https://github.com/jaworldwideorg/OneJA-Bot/issues/11655) ([cf5320e](cf5320e))
* **misc**: Fix group broadcast trigger tool use, closes [lobehub#11646](https://github.com/jaworldwideorg/OneJA-Bot/issues/11646) ([831a9b3](831a9b3))
* **misc**: Fix local system tools, closes [lobehub#11702](https://github.com/jaworldwideorg/OneJA-Bot/issues/11702) ([6548fc7](6548fc7))
* **misc**: Fix memory schema, closes [lobehub#11645](https://github.com/jaworldwideorg/OneJA-Bot/issues/11645) ([3baf780](3baf780))
* **misc**: Fix multi agent tasks issue, closes [lobehub#11672](https://github.com/jaworldwideorg/OneJA-Bot/issues/11672) ([9de773b](9de773b))
* **misc**: Fix multi tasks no summary issue, closes [lobehub#11685](https://github.com/jaworldwideorg/OneJA-Bot/issues/11685) ([26ce317](26ce317))
* **misc**: Fix scope issue, closes [lobehub#11719](https://github.com/jaworldwideorg/OneJA-Bot/issues/11719) ([17adde8](17adde8))
* **misc**: Fix tool argument scape and improve multi task run, closes [lobehub#11691](https://github.com/jaworldwideorg/OneJA-Bot/issues/11691) ([b13bb8a](b13bb8a))
* **misc**: Fixed the sandbox tools call when error should use right callback, closes [lobehub#11721](https://github.com/jaworldwideorg/OneJA-Bot/issues/11721) ([e8fce68](e8fce68))
* **misc**: Improve e2e server and complete i18n resources, closes [lobehub#11678](https://github.com/jaworldwideorg/OneJA-Bot/issues/11678) ([d450dd9](d450dd9))
* **misc**: Slove the agent group editor not focus in editdata area, closes [lobehub#11677](https://github.com/jaworldwideorg/OneJA-Bot/issues/11677) ([9ac84e6](9ac84e6))
* **misc**: Slove the agents header switch agents the lobeAI not show problem, closes [lobehub#11726](https://github.com/jaworldwideorg/OneJA-Bot/issues/11726) ([f45f508](f45f508))
* **misc**: Sloved the old removeSessionTopics not work, closes [lobehub#11671](https://github.com/jaworldwideorg/OneJA-Bot/issues/11671) ([06d41e5](06d41e5))
* **misc**: TypewriterEffect not refreshing on language change, closes [lobehub#11657](https://github.com/jaworldwideorg/OneJA-Bot/issues/11657) ([ba30f46](ba30f46))
* **misc**: Updata cron job ui & fixed commnuity pagenation goto error, closes [lobehub#11700](https://github.com/jaworldwideorg/OneJA-Bot/issues/11700) ([42ad2a0](42ad2a0))
* **misc**: Update the agentbuilder tools not always use humanIntervention, closes [lobehub#11696](https://github.com/jaworldwideorg/OneJA-Bot/issues/11696) ([0d3017b](0d3017b))

#### Styles

* **misc**: Improve auto scroll and group profile, closes [lobehub#11725](https://github.com/jaworldwideorg/OneJA-Bot/issues/11725) ([550acc2](550acc2))
* **misc**: Update og, closes [lobehub#11709](https://github.com/jaworldwideorg/OneJA-Bot/issues/11709) ([01cf4e4](01cf4e4))
* **misc**: Update share style, closes [lobehub#11716](https://github.com/jaworldwideorg/OneJA-Bot/issues/11716) ([3c70dfa](3c70dfa))

</details>

<div align="right">

[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)

</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

released on @next size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants