@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.
- package/AGENTS.md +4 -0
- package/CHANGELOG.md +50 -0
- package/CLAUDE.md +4 -0
- package/changelog/v1.json +18 -0
- package/docs/self-hosting/server-database/docker-compose.mdx +11 -0
- package/docs/self-hosting/server-database/docker-compose.zh-CN.mdx +11 -0
- package/package.json +2 -2
- package/packages/model-bank/src/aiModels/lobehub.ts +28 -0
- 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/business/client/hooks/useBusinessErrorAlertConfig.ts +9 -0
- package/src/business/client/hooks/useBusinessErrorContent.ts +13 -0
- package/src/business/server/lambda-routers/file.ts +12 -0
- 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/Error/index.tsx +13 -3
- 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/src/server/routers/lambda/__tests__/file.test.ts +7 -7
- 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
|
+
[](#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
|
+
[](#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.
|
|
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",
|
|
@@ -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
|
|
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>
|