@lobehub/lobehub 2.0.0-next.226 → 2.0.0-next.228

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +50 -0
  3. package/CLAUDE.md +4 -0
  4. package/changelog/v1.json +18 -0
  5. package/docs/self-hosting/server-database/docker-compose.mdx +11 -0
  6. package/docs/self-hosting/server-database/docker-compose.zh-CN.mdx +11 -0
  7. package/package.json +2 -2
  8. package/packages/model-bank/src/aiModels/lobehub.ts +28 -0
  9. package/packages/utils/src/platform.test.ts +26 -1
  10. package/packages/utils/src/platform.ts +22 -0
  11. package/src/app/[variants]/(main)/_layout/DesktopLayoutContainer/style.ts +4 -0
  12. package/src/app/[variants]/(main)/_layout/DesktopLayoutContainer.tsx +8 -4
  13. package/src/app/[variants]/(main)/chat/_layout/Sidebar/Header/Agent/SwitchPanel.tsx +37 -23
  14. package/src/app/[variants]/(main)/chat/_layout/Sidebar/Topic/List/Item/Editing.tsx +4 -7
  15. package/src/app/[variants]/(main)/chat/_layout/Sidebar/Topic/TopicListContent/ThreadList/ThreadItem/Editing.tsx +4 -7
  16. package/src/app/[variants]/(main)/chat/features/Conversation/Header/HeaderActions/index.tsx +3 -13
  17. package/src/app/[variants]/(main)/chat/features/Conversation/Header/WorkingDirectory/index.tsx +2 -4
  18. package/src/app/[variants]/(main)/community/(list)/model/features/List/Item.tsx +1 -3
  19. package/src/app/[variants]/(main)/group/_layout/Sidebar/GroupConfig/AgentProfilePopup.tsx +3 -5
  20. package/src/app/[variants]/(main)/group/_layout/Sidebar/Header/Agent/SwitchPanel.tsx +4 -6
  21. package/src/app/[variants]/(main)/group/_layout/Sidebar/Topic/List/Item/Editing.tsx +4 -7
  22. package/src/app/[variants]/(main)/group/_layout/Sidebar/Topic/TopicListContent/ThreadList/ThreadItem/Editing.tsx +4 -7
  23. package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/AgentGroupItem/Editing.tsx +4 -7
  24. package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/AgentItem/Editing.tsx +4 -7
  25. package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/Group/Editing.tsx +4 -7
  26. package/src/app/[variants]/(main)/home/_layout/Body/Project/List/Editing.tsx +4 -7
  27. package/src/app/[variants]/(main)/image/_layout/ConfigPanel/components/ModelSelect/ImageModelItem.tsx +1 -6
  28. package/src/app/[variants]/(main)/image/_layout/Topics/TopicItem.tsx +3 -4
  29. package/src/app/[variants]/(main)/page/_layout/Body/List/Item/Editing.tsx +5 -7
  30. package/src/app/[variants]/(main)/resource/(home)/_layout/Body/LibraryList/List/Item/Editing.tsx +4 -7
  31. package/src/business/client/hooks/useBusinessErrorAlertConfig.ts +9 -0
  32. package/src/business/client/hooks/useBusinessErrorContent.ts +13 -0
  33. package/src/business/server/lambda-routers/file.ts +12 -0
  34. package/src/components/ManifestPreviewer/index.tsx +2 -5
  35. package/src/components/TipGuide/index.tsx +3 -4
  36. package/src/features/ChatInput/ActionBar/Search/index.tsx +1 -1
  37. package/src/features/ChatInput/ActionBar/components/Action.tsx +5 -1
  38. package/src/features/ChatInput/ActionBar/components/ActionPopover.tsx +27 -23
  39. package/src/features/ChatMiniMap/MinimapIndicator.tsx +2 -4
  40. package/src/features/ChatMiniMap/index.tsx +16 -14
  41. package/src/features/Conversation/Error/index.tsx +13 -3
  42. package/src/features/Conversation/Markdown/plugins/Mention/Render.tsx +2 -4
  43. package/src/features/Conversation/Messages/AssistantGroup/Tool/Render/Intervention/ApprovalActions.tsx +2 -3
  44. package/src/features/Conversation/Messages/components/Extras/Usage/UsageDetail/index.tsx +3 -4
  45. package/src/features/LocalFile/LocalFile.tsx +4 -5
  46. package/src/features/MCPPluginDetail/Deployment/index.tsx +13 -4
  47. package/src/features/MCPPluginDetail/Score/TotalScore.tsx +10 -5
  48. package/src/features/ModelSwitchPanel/index.tsx +2 -4
  49. package/src/features/PageEditor/Copilot/Toolbar.tsx +5 -8
  50. package/src/server/routers/lambda/__tests__/file.test.ts +7 -7
  51. package/src/server/routers/lambda/file.ts +12 -3
package/AGENTS.md CHANGED
@@ -74,6 +74,10 @@ The project follows a well-organized monorepo structure:
74
74
  - **Dev**: Translate `locales/zh-CN/namespace.json` locale file only for preview
75
75
  - DON'T run `pnpm i18n`, let CI auto handle it
76
76
 
77
+ ## Linear Issue Management
78
+
79
+ Follow [Linear rules in CLAUDE.md](CLAUDE.md#linear-issue-management-ignore-if-not-installed-linear-mcp) when working with Linear issues.
80
+
77
81
  ## Project Rules Index
78
82
 
79
83
  All following rules are saved under `.cursor/rules/` directory:
package/CHANGELOG.md CHANGED
@@ -2,6 +2,56 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## [Version 2.0.0-next.228](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.227...v2.0.0-next.228)
6
+
7
+ <sup>Released on **2026-01-06**</sup>
8
+
9
+ #### 🐛 Bug Fixes
10
+
11
+ - **misc**: Add separate border-radius for bottom-right corner on macOS 26 Chrome.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### What's fixed
19
+
20
+ - **misc**: Add separate border-radius for bottom-right corner on macOS 26 Chrome, closes [#11287](https://github.com/lobehub/lobe-chat/issues/11287) ([544931a](https://github.com/lobehub/lobe-chat/commit/544931a))
21
+
22
+ </details>
23
+
24
+ <div align="right">
25
+
26
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
27
+
28
+ </div>
29
+
30
+ ## [Version 2.0.0-next.227](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.226...v2.0.0-next.227)
31
+
32
+ <sup>Released on **2026-01-06**</sup>
33
+
34
+ #### 🐛 Bug Fixes
35
+
36
+ - **misc**: Allow zero-byte files and add business hooks for error handling.
37
+
38
+ <br/>
39
+
40
+ <details>
41
+ <summary><kbd>Improvements and Fixes</kbd></summary>
42
+
43
+ #### What's fixed
44
+
45
+ - **misc**: Allow zero-byte files and add business hooks for error handling, closes [#11283](https://github.com/lobehub/lobe-chat/issues/11283) ([38f5b78](https://github.com/lobehub/lobe-chat/commit/38f5b78))
46
+
47
+ </details>
48
+
49
+ <div align="right">
50
+
51
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
52
+
53
+ </div>
54
+
5
55
  ## [Version 2.0.0-next.226](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.225...v2.0.0-next.226)
6
56
 
7
57
  <sup>Released on **2026-01-06**</sup>
package/CLAUDE.md CHANGED
@@ -78,6 +78,10 @@ When creating new Linear issues using `mcp__linear-server__create_issue`, **MUST
78
78
  - Code review context
79
79
  - Future reference and debugging
80
80
 
81
+ ### PR Linear Issue Association (REQUIRED)
82
+
83
+ **When creating PRs for Linear issues, MUST include magic keywords in PR body:** `Fixes LOBE-123`, `Closes LOBE-123`, or `Resolves LOBE-123`
84
+
81
85
  ### IMPORTANT: Per-Issue Completion Rule
82
86
 
83
87
  **When working on multiple issues (e.g., parent issue with sub-issues), you MUST update status and add comment for EACH issue IMMEDIATELY after completing it.** Do NOT wait until all issues are done to update them in batch.
package/changelog/v1.json CHANGED
@@ -1,4 +1,22 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "fixes": [
5
+ "Add separate border-radius for bottom-right corner on macOS 26 Chrome."
6
+ ]
7
+ },
8
+ "date": "2026-01-06",
9
+ "version": "2.0.0-next.228"
10
+ },
11
+ {
12
+ "children": {
13
+ "fixes": [
14
+ "Allow zero-byte files and add business hooks for error handling."
15
+ ]
16
+ },
17
+ "date": "2026-01-06",
18
+ "version": "2.0.0-next.227"
19
+ },
2
20
  {
3
21
  "children": {
4
22
  "improvements": [
@@ -440,6 +440,17 @@ Solutions:
440
440
 
441
441
  - A straightforward troubleshooting method is to use the `curl` command in the LobeChat container terminal to access your authentication service at `https://auth.example.com/.well-known/openid-configuration`. If JSON format data is returned, it indicates your authentication service is functioning correctly.
442
442
 
443
+ #### OAuth Token Exchange Failures with Reverse Proxy
444
+
445
+ If OAuth authentication fails during the token exchange phase when using Docker behind a reverse proxy, this is typically caused by the default `MIDDLEWARE_REWRITE_THROUGH_LOCAL=1` setting which rewrites URLs to `127.0.0.1:3210`.
446
+
447
+ **Solution**: Set `MIDDLEWARE_REWRITE_THROUGH_LOCAL=0` in your `.env` file and restart Docker containers:
448
+
449
+ ```bash
450
+ docker compose down
451
+ docker compose up -d
452
+ ```
453
+
443
454
  ````markdown
444
455
  ## Extended Configuration
445
456
 
@@ -421,6 +421,17 @@ lobe-chat | [auth][error] TypeError: fetch failed
421
421
 
422
422
  - 一个直接的排查方式,你可以在 LobeChat 容器的终端中,使用 `curl` 命令访问你的鉴权服务 `https://auth.example.com/.well-known/openid-configuration`,如果返回了 JSON 格式的数据,则说明你的鉴权服务正常运行。
423
423
 
424
+ #### 反向代理下 OAuth 令牌交换失败
425
+
426
+ 如果在反向代理后使用 Docker 时 OAuth 认证在令牌交换阶段失败,这通常是由默认的 `MIDDLEWARE_REWRITE_THROUGH_LOCAL=1` 设置引起的,该设置会将 URL 重写为 `127.0.0.1:3210`。
427
+
428
+ **解决方案**: 在 `.env` 文件中设置 `MIDDLEWARE_REWRITE_THROUGH_LOCAL=0` 并重启 Docker 容器:
429
+
430
+ ```bash
431
+ docker compose down
432
+ docker compose up -d
433
+ ```
434
+
424
435
  ## 拓展配置
425
436
 
426
437
  为了完善你的 LobeChat 服务,你可以根据你的需求进行以下拓展配置。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/lobehub",
3
- "version": "2.0.0-next.226",
3
+ "version": "2.0.0-next.228",
4
4
  "description": "LobeHub - an open-source,comprehensive AI Agent framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
5
5
  "keywords": [
6
6
  "framework",
@@ -206,7 +206,7 @@
206
206
  "@lobehub/icons": "^4.0.2",
207
207
  "@lobehub/market-sdk": "^0.27.1",
208
208
  "@lobehub/tts": "^4.0.2",
209
- "@lobehub/ui": "^4.9.3",
209
+ "@lobehub/ui": "^4.11.5",
210
210
  "@modelcontextprotocol/sdk": "^1.25.1",
211
211
  "@neondatabase/serverless": "^1.0.2",
212
212
  "@next/third-parties": "^16.1.1",
@@ -860,6 +860,34 @@ const lobehubChatModels: AIChatModelCard[] = [
860
860
  releasedAt: '2025-08-26',
861
861
  type: 'chat',
862
862
  },
863
+ {
864
+ abilities: {
865
+ functionCall: true,
866
+ reasoning: true,
867
+ search: true,
868
+ vision: true,
869
+ },
870
+ contextWindowTokens: 256_000,
871
+ description:
872
+ 'Our newest and strongest flagship model, excelling in NLP, math, and reasoning—an ideal all-rounder.',
873
+ displayName: 'Grok 4',
874
+ enabled: true,
875
+ id: 'grok-4',
876
+ pricing: {
877
+ units: [
878
+ { name: 'textInput_cacheRead', rate: 0.75, strategy: 'fixed', unit: 'millionTokens' },
879
+ { name: 'textInput', rate: 3, strategy: 'fixed', unit: 'millionTokens' },
880
+ { name: 'textOutput', rate: 15, strategy: 'fixed', unit: 'millionTokens' },
881
+ ],
882
+ },
883
+ releasedAt: '2025-07-09',
884
+ settings: {
885
+ // reasoning_effort is not supported by grok-4. Specifying reasoning_effort parameter will get an error response.
886
+ // extendParams: ['reasoningEffort'],
887
+ searchImpl: 'params',
888
+ },
889
+ type: 'chat',
890
+ },
863
891
  {
864
892
  abilities: {
865
893
  imageOutput: true,
@@ -1,6 +1,6 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
2
 
3
- import { isArc, isSonomaOrLaterSafari } from './platform';
3
+ import { isArc, isMacOSWithLargeWindowBorders, isSonomaOrLaterSafari } from './platform';
4
4
 
5
5
  describe('isSonomaOrLaterSafari', () => {
6
6
  beforeEach(() => {
@@ -12,6 +12,31 @@ describe('isSonomaOrLaterSafari', () => {
12
12
  });
13
13
  });
14
14
 
15
+ describe('isMacOSWithLargeWindowBorders', () => {
16
+ it('should return true for macOS 10.15+', () => {
17
+ vi.stubGlobal('navigator', {
18
+ userAgent:
19
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
20
+ });
21
+
22
+ expect(isMacOSWithLargeWindowBorders()).toBe(true);
23
+ });
24
+
25
+ it('should return false for non-macOS userAgent', () => {
26
+ vi.stubGlobal('navigator', { userAgent: 'Windows NT 10.0; Win64; x64' });
27
+ expect(isMacOSWithLargeWindowBorders()).toBe(false);
28
+ });
29
+
30
+ it('should return false in Electron', () => {
31
+ vi.stubGlobal('navigator', {
32
+ userAgent:
33
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Electron/30.0.0 Safari/537.36',
34
+ });
35
+
36
+ expect(isMacOSWithLargeWindowBorders()).toBe(false);
37
+ });
38
+ });
39
+
15
40
  it('should return false when userAgent is not Macintosh', () => {
16
41
  vi.stubGlobal('navigator', { userAgent: 'Windows NT 10.0; Win64; x64' });
17
42
  expect(isSonomaOrLaterSafari()).toBe(false);
@@ -25,6 +25,28 @@ export const browserInfo = {
25
25
 
26
26
  export const isMacOS = () => getPlatform() === 'Mac OS';
27
27
 
28
+ /**
29
+ *
30
+ * We can't use it to detect the macOS real version, and we also don't know if it's macOS 26, only an estimated value.
31
+ * @returns true if the current browser is macOS and the version is 10.15 or later
32
+ */
33
+ export const isMacOSWithLargeWindowBorders = () => {
34
+ if (isOnServerSide || typeof navigator === 'undefined') return false;
35
+
36
+ // keep consistent with the original logic: only for macOS on web (exclude Electron)
37
+ const isElectron =
38
+ /Electron\//.test(navigator.userAgent) || Boolean((window as any)?.process?.type);
39
+ if (isElectron || !isMacOS()) return false;
40
+
41
+ const match = navigator.userAgent.match(/Mac OS X (\d+)[._](\d+)/);
42
+ if (!match) return false;
43
+
44
+ const majorVersion = parseInt(match[1], 10);
45
+ const minorVersion = parseInt(match[2], 10);
46
+
47
+ return majorVersion >= 10 && minorVersion >= 15;
48
+ };
49
+
28
50
  export const isArc = () => {
29
51
  if (isOnServerSide) return false;
30
52
  return (
@@ -11,6 +11,10 @@ export const styles = createStaticStyles(({ css, cssVar }) => ({
11
11
 
12
12
  border: 1px solid var(--container-border-color, ${cssVar.colorBorder});
13
13
  border-radius: var(--container-border-radius, ${cssVar.borderRadius});
14
+ border-end-end-radius: var(
15
+ --container-border-bottom-right-radius,
16
+ var(--container-border-radius, ${cssVar.borderRadius})
17
+ );
14
18
 
15
19
  background: ${cssVar.colorBgContainer};
16
20
  `,
@@ -6,6 +6,7 @@ import { isDesktop } from '@/const/version';
6
6
  import { useIsDark } from '@/hooks/useIsDark';
7
7
  import { useGlobalStore } from '@/store/global';
8
8
  import { systemStatusSelectors } from '@/store/global/selectors';
9
+ import { isMacOSWithLargeWindowBorders } from '@/utils/platform';
9
10
 
10
11
  import { styles } from './DesktopLayoutContainer/style';
11
12
 
@@ -23,12 +24,15 @@ const DesktopLayoutContainer: FC<PropsWithChildren> = ({ children }) => {
23
24
  );
24
25
 
25
26
  const innerCssVariables = useMemo<Record<string, string>>(() => {
26
- const borderRadius =
27
- typeof window !== 'undefined' && (window.lobeEnv?.darwinMajorVersion ?? 0) >= 25
28
- ? '12px'
29
- : cssVar.borderRadius;
27
+ const darwinMajorVersion =
28
+ typeof window !== 'undefined' ? (window.lobeEnv?.darwinMajorVersion ?? 0) : 0;
29
+
30
+ const borderRadius = darwinMajorVersion >= 25 ? '12px' : cssVar.borderRadius;
31
+ const borderBottomRightRadius =
32
+ darwinMajorVersion >= 26 || isMacOSWithLargeWindowBorders() ? '12px' : borderRadius;
30
33
 
31
34
  return {
35
+ '--container-border-bottom-right-radius': borderBottomRightRadius,
32
36
  '--container-border-color': isDarkMode ? cssVar.colorBorderSecondary : cssVar.colorBorder,
33
37
  '--container-border-radius': borderRadius,
34
38
  };
@@ -1,41 +1,55 @@
1
- import { Flexbox } from '@lobehub/ui';
2
- import { Popover } from 'antd';
3
- import React, { type PropsWithChildren, Suspense, memo } from 'react';
1
+ import { Flexbox, Popover } from '@lobehub/ui';
2
+ import { createStaticStyles } from 'antd-style';
3
+ import { type PropsWithChildren, Suspense, memo, useMemo } from 'react';
4
4
  import { useNavigate } from 'react-router-dom';
5
5
 
6
6
  import List from '@/app/[variants]/(main)/home/_layout/Body/Agent/List';
7
7
  import { AgentModalProvider } from '@/app/[variants]/(main)/home/_layout/Body/Agent/ModalProvider';
8
8
  import SkeletonList from '@/features/NavPanel/components/SkeletonList';
9
9
 
10
+ const styles = createStaticStyles(({ cssVar, css }) => ({
11
+ trigger: css`
12
+ &[data-popup-open] {
13
+ background: ${cssVar.colorFillTertiary};
14
+ }
15
+ `,
16
+ }));
17
+
10
18
  const SwitchPanel = memo<PropsWithChildren>(({ children }) => {
11
19
  const navigate = useNavigate();
20
+
21
+ const content = useMemo(
22
+ () => (
23
+ <Suspense fallback={<SkeletonList rows={6} />}>
24
+ <AgentModalProvider>
25
+ <Flexbox
26
+ gap={4}
27
+ padding={8}
28
+ style={{
29
+ maxHeight: '50vh',
30
+ overflowY: 'auto',
31
+ }}
32
+ >
33
+ <List onMoreClick={() => navigate('/')} />
34
+ </Flexbox>
35
+ </AgentModalProvider>
36
+ </Suspense>
37
+ ),
38
+ [navigate],
39
+ );
40
+
12
41
  return (
13
42
  <Popover
14
- arrow={false}
15
- content={
16
- <Suspense fallback={<SkeletonList rows={6} />}>
17
- <AgentModalProvider>
18
- <Flexbox
19
- gap={4}
20
- padding={8}
21
- style={{
22
- maxHeight: '50vh',
23
- overflowY: 'auto',
24
- }}
25
- >
26
- <List onMoreClick={() => navigate('/')} />
27
- </Flexbox>
28
- </AgentModalProvider>
29
- </Suspense>
30
- }
31
- placement={'bottomLeft'}
43
+ classNames={{ trigger: styles.trigger }}
44
+ content={content}
45
+ placement="bottomLeft"
32
46
  styles={{
33
- container: {
47
+ content: {
34
48
  padding: 0,
35
49
  width: 240,
36
50
  },
37
51
  }}
38
- trigger={['click']}
52
+ trigger="click"
39
53
  >
40
54
  {children}
41
55
  </Popover>
@@ -1,5 +1,4 @@
1
- import { Input } from '@lobehub/ui';
2
- import { Popover } from 'antd';
1
+ import { Input, Popover } from '@lobehub/ui';
3
2
  import { memo, useCallback, useState } from 'react';
4
3
 
5
4
  import { useChatStore } from '@/store/chat';
@@ -47,7 +46,6 @@ const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
47
46
 
48
47
  return (
49
48
  <Popover
50
- arrow={false}
51
49
  content={
52
50
  <Input
53
51
  autoFocus
@@ -64,20 +62,19 @@ const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
64
62
  }}
65
63
  />
66
64
  }
67
- destroyOnHidden
68
65
  onOpenChange={(open) => {
69
66
  if (!open) handleUpdate();
70
67
  toggleEditing(open);
71
68
  }}
72
69
  open={editing}
73
- placement={'bottomLeft'}
70
+ placement="bottomLeft"
74
71
  styles={{
75
- container: {
72
+ content: {
76
73
  padding: 4,
77
74
  width: 320,
78
75
  },
79
76
  }}
80
- trigger={['click']}
77
+ trigger="click"
81
78
  >
82
79
  <div />
83
80
  </Popover>
@@ -1,5 +1,4 @@
1
- import { Input } from '@lobehub/ui';
2
- import { Popover } from 'antd';
1
+ import { Input, Popover } from '@lobehub/ui';
3
2
  import { memo, useCallback, useState } from 'react';
4
3
 
5
4
  import { useChatStore } from '@/store/chat';
@@ -26,7 +25,6 @@ const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
26
25
 
27
26
  return (
28
27
  <Popover
29
- arrow={false}
30
28
  content={
31
29
  <Input
32
30
  autoFocus
@@ -43,20 +41,19 @@ const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
43
41
  }}
44
42
  />
45
43
  }
46
- destroyOnHidden
47
44
  onOpenChange={(open) => {
48
45
  if (!open) handleUpdate();
49
46
  toggleEditing(open);
50
47
  }}
51
48
  open={editing}
52
- placement={'bottomLeft'}
49
+ placement="bottomLeft"
53
50
  styles={{
54
- container: {
51
+ content: {
55
52
  padding: 4,
56
53
  width: 320,
57
54
  },
58
55
  }}
59
- trigger={['click']}
56
+ trigger="click"
60
57
  >
61
58
  <div />
62
59
  </Popover>
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { ActionIcon, Dropdown } from '@lobehub/ui';
4
- import type { MenuProps } from '@lobehub/ui';
3
+ import { ActionIcon, DropdownMenu } from '@lobehub/ui';
5
4
  import { MoreHorizontal } from 'lucide-react';
6
5
  import { memo } from 'react';
7
6
 
@@ -13,18 +12,9 @@ const HeaderActions = memo(() => {
13
12
  const { menuItems } = useMenu();
14
13
 
15
14
  return (
16
- <Dropdown
17
- arrow={false}
18
- menu={{
19
- items: menuItems as MenuProps['items'],
20
- onClick: ({ domEvent }) => {
21
- domEvent.stopPropagation();
22
- },
23
- }}
24
- trigger={['click']}
25
- >
15
+ <DropdownMenu items={menuItems}>
26
16
  <ActionIcon icon={MoreHorizontal} size={DESKTOP_HEADER_ICON_SIZE} />
27
- </Dropdown>
17
+ </DropdownMenu>
28
18
  );
29
19
  });
30
20
 
@@ -1,6 +1,5 @@
1
1
  import { LocalSystemManifest } from '@lobechat/builtin-tool-local-system';
2
- import { Flexbox, Icon, Tooltip } from '@lobehub/ui';
3
- import { Popover } from 'antd';
2
+ import { Flexbox, Icon, Popover, Tooltip } from '@lobehub/ui';
4
3
  import { createStaticStyles, cx } from 'antd-style';
5
4
  import { LaptopIcon, SquircleDashed } from 'lucide-react';
6
5
  import { memo, useMemo, useState } from 'react';
@@ -90,12 +89,11 @@ const WorkingDirectory = memo(() => {
90
89
  );
91
90
  return (
92
91
  <Popover
93
- arrow={false}
94
92
  content={<WorkingDirectoryContent agentId={agentId} onClose={() => setOpen(false)} />}
95
93
  onOpenChange={setOpen}
96
94
  open={open}
97
95
  placement="bottomRight"
98
- trigger={['click']}
96
+ trigger="click"
99
97
  >
100
98
  <div>
101
99
  {open ? (
@@ -1,8 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { ModelIcon, ProviderIcon } from '@lobehub/icons';
4
- import { Block, Flexbox, Icon, Tag, Text } from '@lobehub/ui';
5
- import { Popover } from 'antd';
4
+ import { Block, Flexbox, Icon, Popover, Tag, Text } from '@lobehub/ui';
6
5
  import { createStaticStyles } from 'antd-style';
7
6
  import dayjs from 'dayjs';
8
7
  import { ClockIcon } from 'lucide-react';
@@ -155,7 +154,6 @@ const ModelItem = memo<DiscoverModelItem>(
155
154
  />
156
155
  </Flexbox>
157
156
  <Popover
158
- arrow={false}
159
157
  content={
160
158
  <Flexbox
161
159
  gap={6}
@@ -1,8 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import type { AgentItem } from '@lobechat/types';
4
- import { Avatar, Center, Flexbox, Text, Tooltip } from '@lobehub/ui';
5
- import { Popover } from 'antd';
4
+ import { Avatar, Center, Flexbox, Popover, Text, Tooltip } from '@lobehub/ui';
6
5
  import { createStaticStyles, cssVar } from 'antd-style';
7
6
  import { type PropsWithChildren, memo, useState } from 'react';
8
7
  import { useTranslation } from 'react-i18next';
@@ -167,15 +166,14 @@ const AgentProfilePopup = memo<AgentProfilePopupProps>(({ agent, groupId, childr
167
166
 
168
167
  return (
169
168
  <Popover
170
- arrow={false}
171
169
  content={content}
172
170
  onOpenChange={setOpen}
173
171
  open={open}
174
172
  placement="right"
175
173
  styles={{
176
- container: { overflow: 'hidden', padding: 0 },
174
+ content: { overflow: 'hidden', padding: 0 },
177
175
  }}
178
- trigger={['click']}
176
+ trigger="click"
179
177
  >
180
178
  {children}
181
179
  </Popover>
@@ -1,5 +1,4 @@
1
- import { Flexbox } from '@lobehub/ui';
2
- import { Popover } from 'antd';
1
+ import { Flexbox, Popover } from '@lobehub/ui';
3
2
  import React, { type PropsWithChildren, Suspense, memo } from 'react';
4
3
  import { useNavigate } from 'react-router-dom';
5
4
 
@@ -11,7 +10,6 @@ const SwitchPanel = memo<PropsWithChildren>(({ children }) => {
11
10
  const navigate = useNavigate();
12
11
  return (
13
12
  <Popover
14
- arrow={false}
15
13
  content={
16
14
  <Suspense fallback={<SkeletonList rows={6} />}>
17
15
  <AgentModalProvider>
@@ -28,14 +26,14 @@ const SwitchPanel = memo<PropsWithChildren>(({ children }) => {
28
26
  </AgentModalProvider>
29
27
  </Suspense>
30
28
  }
31
- placement={'bottomLeft'}
29
+ placement="bottomLeft"
32
30
  styles={{
33
- container: {
31
+ content: {
34
32
  padding: 0,
35
33
  width: 240,
36
34
  },
37
35
  }}
38
- trigger={['click']}
36
+ trigger="click"
39
37
  >
40
38
  {children}
41
39
  </Popover>
@@ -1,5 +1,4 @@
1
- import { Input } from '@lobehub/ui';
2
- import { Popover } from 'antd';
1
+ import { Input, Popover } from '@lobehub/ui';
3
2
  import { memo, useCallback, useState } from 'react';
4
3
 
5
4
  import { useChatStore } from '@/store/chat';
@@ -47,7 +46,6 @@ const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
47
46
 
48
47
  return (
49
48
  <Popover
50
- arrow={false}
51
49
  content={
52
50
  <Input
53
51
  autoFocus
@@ -64,20 +62,19 @@ const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
64
62
  }}
65
63
  />
66
64
  }
67
- destroyOnHidden
68
65
  onOpenChange={(open) => {
69
66
  if (!open) handleUpdate();
70
67
  toggleEditing(open);
71
68
  }}
72
69
  open={editing}
73
- placement={'bottomLeft'}
70
+ placement="bottomLeft"
74
71
  styles={{
75
- container: {
72
+ content: {
76
73
  padding: 4,
77
74
  width: 320,
78
75
  },
79
76
  }}
80
- trigger={['click']}
77
+ trigger="click"
81
78
  >
82
79
  <div />
83
80
  </Popover>