@lobehub/lobehub 2.0.0-next.227 → 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.
- package/AGENTS.md +4 -0
- package/CHANGELOG.md +25 -0
- package/CLAUDE.md +4 -0
- package/changelog/v1.json +9 -0
- package/package.json +2 -2
- package/packages/utils/src/platform.test.ts +26 -1
- package/packages/utils/src/platform.ts +22 -0
- package/src/app/[variants]/(main)/_layout/DesktopLayoutContainer/style.ts +4 -0
- package/src/app/[variants]/(main)/_layout/DesktopLayoutContainer.tsx +8 -4
- package/src/app/[variants]/(main)/chat/_layout/Sidebar/Header/Agent/SwitchPanel.tsx +37 -23
- package/src/app/[variants]/(main)/chat/_layout/Sidebar/Topic/List/Item/Editing.tsx +4 -7
- package/src/app/[variants]/(main)/chat/_layout/Sidebar/Topic/TopicListContent/ThreadList/ThreadItem/Editing.tsx +4 -7
- package/src/app/[variants]/(main)/chat/features/Conversation/Header/HeaderActions/index.tsx +3 -13
- package/src/app/[variants]/(main)/chat/features/Conversation/Header/WorkingDirectory/index.tsx +2 -4
- package/src/app/[variants]/(main)/community/(list)/model/features/List/Item.tsx +1 -3
- package/src/app/[variants]/(main)/group/_layout/Sidebar/GroupConfig/AgentProfilePopup.tsx +3 -5
- package/src/app/[variants]/(main)/group/_layout/Sidebar/Header/Agent/SwitchPanel.tsx +4 -6
- package/src/app/[variants]/(main)/group/_layout/Sidebar/Topic/List/Item/Editing.tsx +4 -7
- package/src/app/[variants]/(main)/group/_layout/Sidebar/Topic/TopicListContent/ThreadList/ThreadItem/Editing.tsx +4 -7
- package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/AgentGroupItem/Editing.tsx +4 -7
- package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/AgentItem/Editing.tsx +4 -7
- package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/Group/Editing.tsx +4 -7
- package/src/app/[variants]/(main)/home/_layout/Body/Project/List/Editing.tsx +4 -7
- package/src/app/[variants]/(main)/image/_layout/ConfigPanel/components/ModelSelect/ImageModelItem.tsx +1 -6
- package/src/app/[variants]/(main)/image/_layout/Topics/TopicItem.tsx +3 -4
- package/src/app/[variants]/(main)/page/_layout/Body/List/Item/Editing.tsx +5 -7
- package/src/app/[variants]/(main)/resource/(home)/_layout/Body/LibraryList/List/Item/Editing.tsx +4 -7
- package/src/components/ManifestPreviewer/index.tsx +2 -5
- package/src/components/TipGuide/index.tsx +3 -4
- package/src/features/ChatInput/ActionBar/Search/index.tsx +1 -1
- package/src/features/ChatInput/ActionBar/components/Action.tsx +5 -1
- package/src/features/ChatInput/ActionBar/components/ActionPopover.tsx +27 -23
- package/src/features/ChatMiniMap/MinimapIndicator.tsx +2 -4
- package/src/features/ChatMiniMap/index.tsx +16 -14
- package/src/features/Conversation/Markdown/plugins/Mention/Render.tsx +2 -4
- package/src/features/Conversation/Messages/AssistantGroup/Tool/Render/Intervention/ApprovalActions.tsx +2 -3
- package/src/features/Conversation/Messages/components/Extras/Usage/UsageDetail/index.tsx +3 -4
- package/src/features/LocalFile/LocalFile.tsx +4 -5
- package/src/features/MCPPluginDetail/Deployment/index.tsx +13 -4
- package/src/features/MCPPluginDetail/Score/TotalScore.tsx +10 -5
- package/src/features/ModelSwitchPanel/index.tsx +2 -4
- package/src/features/PageEditor/Copilot/Toolbar.tsx +5 -8
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,31 @@
|
|
|
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
|
+
[](#readme-top)
|
|
27
|
+
|
|
28
|
+
</div>
|
|
29
|
+
|
|
5
30
|
## [Version 2.0.0-next.227](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.226...v2.0.0-next.227)
|
|
6
31
|
|
|
7
32
|
<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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/lobehub",
|
|
3
|
-
"version": "2.0.0-next.
|
|
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.
|
|
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",
|
|
@@ -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
|
|
27
|
-
typeof window !== 'undefined'
|
|
28
|
-
|
|
29
|
-
|
|
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 {
|
|
3
|
-
import
|
|
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
|
-
|
|
15
|
-
content={
|
|
16
|
-
|
|
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
|
-
|
|
47
|
+
content: {
|
|
34
48
|
padding: 0,
|
|
35
49
|
width: 240,
|
|
36
50
|
},
|
|
37
51
|
}}
|
|
38
|
-
trigger=
|
|
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=
|
|
70
|
+
placement="bottomLeft"
|
|
74
71
|
styles={{
|
|
75
|
-
|
|
72
|
+
content: {
|
|
76
73
|
padding: 4,
|
|
77
74
|
width: 320,
|
|
78
75
|
},
|
|
79
76
|
}}
|
|
80
|
-
trigger=
|
|
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=
|
|
49
|
+
placement="bottomLeft"
|
|
53
50
|
styles={{
|
|
54
|
-
|
|
51
|
+
content: {
|
|
55
52
|
padding: 4,
|
|
56
53
|
width: 320,
|
|
57
54
|
},
|
|
58
55
|
}}
|
|
59
|
-
trigger=
|
|
56
|
+
trigger="click"
|
|
60
57
|
>
|
|
61
58
|
<div />
|
|
62
59
|
</Popover>
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { ActionIcon,
|
|
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
|
-
<
|
|
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
|
-
</
|
|
17
|
+
</DropdownMenu>
|
|
28
18
|
);
|
|
29
19
|
});
|
|
30
20
|
|
package/src/app/[variants]/(main)/chat/features/Conversation/Header/WorkingDirectory/index.tsx
CHANGED
|
@@ -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=
|
|
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
|
-
|
|
174
|
+
content: { overflow: 'hidden', padding: 0 },
|
|
177
175
|
}}
|
|
178
|
-
trigger=
|
|
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=
|
|
29
|
+
placement="bottomLeft"
|
|
32
30
|
styles={{
|
|
33
|
-
|
|
31
|
+
content: {
|
|
34
32
|
padding: 0,
|
|
35
33
|
width: 240,
|
|
36
34
|
},
|
|
37
35
|
}}
|
|
38
|
-
trigger=
|
|
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=
|
|
70
|
+
placement="bottomLeft"
|
|
74
71
|
styles={{
|
|
75
|
-
|
|
72
|
+
content: {
|
|
76
73
|
padding: 4,
|
|
77
74
|
width: 320,
|
|
78
75
|
},
|
|
79
76
|
}}
|
|
80
|
-
trigger=
|
|
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=
|
|
49
|
+
placement="bottomLeft"
|
|
53
50
|
styles={{
|
|
54
|
-
|
|
51
|
+
content: {
|
|
55
52
|
padding: 4,
|
|
56
53
|
width: 320,
|
|
57
54
|
},
|
|
58
55
|
}}
|
|
59
|
-
trigger=
|
|
56
|
+
trigger="click"
|
|
60
57
|
>
|
|
61
58
|
<div />
|
|
62
59
|
</Popover>
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Flexbox, Input } from '@lobehub/ui';
|
|
2
|
-
import { Popover } from 'antd';
|
|
1
|
+
import { Flexbox, Input, Popover } from '@lobehub/ui';
|
|
3
2
|
import { memo, useCallback, useState } from 'react';
|
|
4
3
|
|
|
5
4
|
import { useHomeStore } from '@/store/home';
|
|
@@ -38,7 +37,6 @@ const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
|
|
|
38
37
|
|
|
39
38
|
return (
|
|
40
39
|
<Popover
|
|
41
|
-
arrow={false}
|
|
42
40
|
content={
|
|
43
41
|
<Flexbox gap={4} horizontal onClick={(e) => e.stopPropagation()} style={{ width: 280 }}>
|
|
44
42
|
<Input
|
|
@@ -53,19 +51,18 @@ const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
|
|
|
53
51
|
/>
|
|
54
52
|
</Flexbox>
|
|
55
53
|
}
|
|
56
|
-
destroyOnHidden
|
|
57
54
|
onOpenChange={(open) => {
|
|
58
55
|
if (!open) handleUpdate();
|
|
59
56
|
toggleEditing(open);
|
|
60
57
|
}}
|
|
61
58
|
open={editing}
|
|
62
|
-
placement=
|
|
59
|
+
placement="bottomLeft"
|
|
63
60
|
styles={{
|
|
64
|
-
|
|
61
|
+
content: {
|
|
65
62
|
padding: 4,
|
|
66
63
|
},
|
|
67
64
|
}}
|
|
68
|
-
trigger=
|
|
65
|
+
trigger="click"
|
|
69
66
|
>
|
|
70
67
|
<div />
|
|
71
68
|
</Popover>
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Avatar, Block, Flexbox, Input } from '@lobehub/ui';
|
|
2
|
-
import { Popover } from 'antd';
|
|
1
|
+
import { Avatar, Block, Flexbox, Input, Popover } from '@lobehub/ui';
|
|
3
2
|
import { memo, useCallback, useState } from 'react';
|
|
4
3
|
|
|
5
4
|
import EmojiPicker from '@/components/EmojiPicker';
|
|
@@ -55,7 +54,6 @@ const Editing = memo<EditingProps>(({ id, title, avatar, toggleEditing }) => {
|
|
|
55
54
|
|
|
56
55
|
return (
|
|
57
56
|
<Popover
|
|
58
|
-
arrow={false}
|
|
59
57
|
content={
|
|
60
58
|
<Flexbox gap={4} horizontal onClick={(e) => e.stopPropagation()} style={{ width: 320 }}>
|
|
61
59
|
<EmojiPicker
|
|
@@ -89,19 +87,18 @@ const Editing = memo<EditingProps>(({ id, title, avatar, toggleEditing }) => {
|
|
|
89
87
|
/>
|
|
90
88
|
</Flexbox>
|
|
91
89
|
}
|
|
92
|
-
destroyOnHidden
|
|
93
90
|
onOpenChange={(open) => {
|
|
94
91
|
if (!open) handleUpdate();
|
|
95
92
|
toggleEditing(open);
|
|
96
93
|
}}
|
|
97
94
|
open={editing}
|
|
98
|
-
placement=
|
|
95
|
+
placement="bottomLeft"
|
|
99
96
|
styles={{
|
|
100
|
-
|
|
97
|
+
content: {
|
|
101
98
|
padding: 4,
|
|
102
99
|
},
|
|
103
100
|
}}
|
|
104
|
-
trigger=
|
|
101
|
+
trigger="click"
|
|
105
102
|
>
|
|
106
103
|
<div />
|
|
107
104
|
</Popover>
|