@lobehub/lobehub 2.0.0-next.240 → 2.0.0-next.241
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/CHANGELOG.md +25 -0
- package/apps/desktop/resources/locales/ar/menu.json +5 -1
- package/apps/desktop/resources/locales/bg-BG/menu.json +5 -1
- package/apps/desktop/resources/locales/de-DE/menu.json +5 -1
- package/apps/desktop/resources/locales/es-ES/menu.json +5 -1
- package/apps/desktop/resources/locales/fa-IR/menu.json +5 -1
- package/apps/desktop/resources/locales/fr-FR/menu.json +5 -1
- package/apps/desktop/resources/locales/it-IT/menu.json +5 -1
- package/apps/desktop/resources/locales/ja-JP/menu.json +5 -1
- package/apps/desktop/resources/locales/ko-KR/menu.json +5 -1
- package/apps/desktop/resources/locales/nl-NL/menu.json +5 -1
- package/apps/desktop/resources/locales/pl-PL/menu.json +5 -1
- package/apps/desktop/resources/locales/pt-BR/menu.json +5 -1
- package/apps/desktop/resources/locales/ru-RU/menu.json +5 -1
- package/apps/desktop/resources/locales/tr-TR/menu.json +5 -1
- package/apps/desktop/resources/locales/vi-VN/menu.json +5 -1
- package/apps/desktop/resources/locales/zh-CN/menu.json +5 -1
- package/apps/desktop/resources/locales/zh-TW/menu.json +5 -1
- package/apps/desktop/src/main/locales/default/menu.ts +5 -1
- package/apps/desktop/src/main/menus/impls/linux.ts +30 -0
- package/apps/desktop/src/main/menus/impls/macOS.test.ts +17 -0
- package/apps/desktop/src/main/menus/impls/macOS.ts +33 -0
- package/apps/desktop/src/main/menus/impls/windows.ts +30 -0
- package/changelog/v1.json +5 -0
- package/locales/ar/electron.json +24 -0
- package/locales/bg-BG/electron.json +24 -0
- package/locales/de-DE/electron.json +24 -0
- package/locales/en-US/electron.json +24 -0
- package/locales/es-ES/electron.json +24 -0
- package/locales/fa-IR/electron.json +24 -0
- package/locales/fr-FR/electron.json +24 -0
- package/locales/it-IT/electron.json +24 -0
- package/locales/ja-JP/electron.json +24 -0
- package/locales/ko-KR/electron.json +24 -0
- package/locales/nl-NL/electron.json +24 -0
- package/locales/pl-PL/electron.json +24 -0
- package/locales/pt-BR/electron.json +24 -0
- package/locales/ru-RU/electron.json +24 -0
- package/locales/tr-TR/electron.json +24 -0
- package/locales/vi-VN/electron.json +24 -0
- package/locales/zh-CN/electron.json +24 -0
- package/locales/zh-TW/electron.json +24 -0
- package/package.json +1 -1
- package/packages/electron-client-ipc/src/events/navigation.ts +12 -0
- package/src/components/PageTitle/index.tsx +11 -1
- package/src/features/ElectronTitlebar/NavigationBar/RecentlyViewed.tsx +137 -0
- package/src/features/ElectronTitlebar/NavigationBar/index.tsx +86 -0
- package/src/features/ElectronTitlebar/helpers/routeMetadata.ts +214 -0
- package/src/features/ElectronTitlebar/hooks/useNavigationHistory.ts +152 -0
- package/src/features/ElectronTitlebar/index.tsx +13 -5
- package/src/features/NavHeader/index.tsx +4 -2
- package/src/features/NavPanel/components/NavPanelDraggable.tsx +174 -0
- package/src/features/NavPanel/hooks/useNavPanel.ts +11 -35
- package/src/features/NavPanel/index.tsx +2 -126
- package/src/hooks/useTypeScriptHappyCallback.ts +7 -0
- package/src/locales/default/electron.ts +24 -0
- package/src/store/electron/actions/navigationHistory.ts +247 -0
- package/src/store/electron/initialState.ts +7 -1
- package/src/store/electron/store.ts +9 -2
- package/src/store/global/selectors/systemStatus.ts +4 -1
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "چت",
|
|
3
|
+
"navigation.discover": "کشف",
|
|
4
|
+
"navigation.discoverAssistants": "کشف دستیاران",
|
|
5
|
+
"navigation.discoverMcp": "کشف MCP",
|
|
6
|
+
"navigation.discoverModels": "کشف مدلها",
|
|
7
|
+
"navigation.discoverProviders": "کشف ارائهدهندگان",
|
|
8
|
+
"navigation.group": "گروه",
|
|
9
|
+
"navigation.groupChat": "چت گروهی",
|
|
10
|
+
"navigation.home": "خانه",
|
|
11
|
+
"navigation.image": "تصویر",
|
|
12
|
+
"navigation.knowledgeBase": "پایگاه دانش",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "حافظه",
|
|
15
|
+
"navigation.memoryContexts": "حافظه - زمینهها",
|
|
16
|
+
"navigation.memoryExperiences": "حافظه - تجربیات",
|
|
17
|
+
"navigation.memoryIdentities": "حافظه - هویتها",
|
|
18
|
+
"navigation.memoryPreferences": "حافظه - ترجیحات",
|
|
19
|
+
"navigation.onboarding": "راهاندازی",
|
|
20
|
+
"navigation.page": "صفحه",
|
|
21
|
+
"navigation.pages": "صفحات",
|
|
22
|
+
"navigation.provider": "ارائهدهنده",
|
|
23
|
+
"navigation.recentView": "مشاهدات اخیر",
|
|
24
|
+
"navigation.resources": "منابع",
|
|
25
|
+
"navigation.settings": "تنظیمات",
|
|
2
26
|
"notification.finishChatGeneration": "تولید پیام توسط هوش مصنوعی به پایان رسید",
|
|
3
27
|
"proxy.auth": "احراز هویت لازم است",
|
|
4
28
|
"proxy.authDesc": "در صورتی که سرور پروکسی نیاز به نام کاربری و رمز عبور داشته باشد",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "Chat",
|
|
3
|
+
"navigation.discover": "Découvrir",
|
|
4
|
+
"navigation.discoverAssistants": "Découvrir les Assistants",
|
|
5
|
+
"navigation.discoverMcp": "Découvrir MCP",
|
|
6
|
+
"navigation.discoverModels": "Découvrir les Modèles",
|
|
7
|
+
"navigation.discoverProviders": "Découvrir les Fournisseurs",
|
|
8
|
+
"navigation.group": "Groupe",
|
|
9
|
+
"navigation.groupChat": "Chat de Groupe",
|
|
10
|
+
"navigation.home": "Accueil",
|
|
11
|
+
"navigation.image": "Image",
|
|
12
|
+
"navigation.knowledgeBase": "Base de Connaissances",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "Mémoire",
|
|
15
|
+
"navigation.memoryContexts": "Mémoire - Contextes",
|
|
16
|
+
"navigation.memoryExperiences": "Mémoire - Expériences",
|
|
17
|
+
"navigation.memoryIdentities": "Mémoire - Identités",
|
|
18
|
+
"navigation.memoryPreferences": "Mémoire - Préférences",
|
|
19
|
+
"navigation.onboarding": "Intégration",
|
|
20
|
+
"navigation.page": "Page",
|
|
21
|
+
"navigation.pages": "Pages",
|
|
22
|
+
"navigation.provider": "Fournisseur",
|
|
23
|
+
"navigation.recentView": "Vues récentes",
|
|
24
|
+
"navigation.resources": "Ressources",
|
|
25
|
+
"navigation.settings": "Paramètres",
|
|
2
26
|
"notification.finishChatGeneration": "Génération du message par l'IA terminée",
|
|
3
27
|
"proxy.auth": "Authentification requise",
|
|
4
28
|
"proxy.authDesc": "Si le serveur proxy nécessite un nom d'utilisateur et un mot de passe",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "Chat",
|
|
3
|
+
"navigation.discover": "Scopri",
|
|
4
|
+
"navigation.discoverAssistants": "Scopri Assistenti",
|
|
5
|
+
"navigation.discoverMcp": "Scopri MCP",
|
|
6
|
+
"navigation.discoverModels": "Scopri Modelli",
|
|
7
|
+
"navigation.discoverProviders": "Scopri Provider",
|
|
8
|
+
"navigation.group": "Gruppo",
|
|
9
|
+
"navigation.groupChat": "Chat di Gruppo",
|
|
10
|
+
"navigation.home": "Home",
|
|
11
|
+
"navigation.image": "Immagine",
|
|
12
|
+
"navigation.knowledgeBase": "Base di Conoscenza",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "Memoria",
|
|
15
|
+
"navigation.memoryContexts": "Memoria - Contesti",
|
|
16
|
+
"navigation.memoryExperiences": "Memoria - Esperienze",
|
|
17
|
+
"navigation.memoryIdentities": "Memoria - Identità",
|
|
18
|
+
"navigation.memoryPreferences": "Memoria - Preferenze",
|
|
19
|
+
"navigation.onboarding": "Onboarding",
|
|
20
|
+
"navigation.page": "Pagina",
|
|
21
|
+
"navigation.pages": "Pagine",
|
|
22
|
+
"navigation.provider": "Provider",
|
|
23
|
+
"navigation.recentView": "Visualizzazioni recenti",
|
|
24
|
+
"navigation.resources": "Risorse",
|
|
25
|
+
"navigation.settings": "Impostazioni",
|
|
2
26
|
"notification.finishChatGeneration": "Generazione del messaggio AI completata",
|
|
3
27
|
"proxy.auth": "Autenticazione richiesta",
|
|
4
28
|
"proxy.authDesc": "Se il server proxy richiede nome utente e password",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "チャット",
|
|
3
|
+
"navigation.discover": "発見",
|
|
4
|
+
"navigation.discoverAssistants": "アシスタントを発見",
|
|
5
|
+
"navigation.discoverMcp": "MCP を発見",
|
|
6
|
+
"navigation.discoverModels": "モデルを発見",
|
|
7
|
+
"navigation.discoverProviders": "プロバイダーを発見",
|
|
8
|
+
"navigation.group": "グループ",
|
|
9
|
+
"navigation.groupChat": "グループチャット",
|
|
10
|
+
"navigation.home": "ホーム",
|
|
11
|
+
"navigation.image": "画像",
|
|
12
|
+
"navigation.knowledgeBase": "ナレッジベース",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "メモリ",
|
|
15
|
+
"navigation.memoryContexts": "メモリ - コンテキスト",
|
|
16
|
+
"navigation.memoryExperiences": "メモリ - 経験",
|
|
17
|
+
"navigation.memoryIdentities": "メモリ - アイデンティティ",
|
|
18
|
+
"navigation.memoryPreferences": "メモリ - 設定",
|
|
19
|
+
"navigation.onboarding": "オンボーディング",
|
|
20
|
+
"navigation.page": "ページ",
|
|
21
|
+
"navigation.pages": "ページ",
|
|
22
|
+
"navigation.provider": "プロバイダー",
|
|
23
|
+
"navigation.recentView": "最近の閲覧",
|
|
24
|
+
"navigation.resources": "リソース",
|
|
25
|
+
"navigation.settings": "設定",
|
|
2
26
|
"notification.finishChatGeneration": "AI メッセージの生成が完了しました",
|
|
3
27
|
"proxy.auth": "認証が必要",
|
|
4
28
|
"proxy.authDesc": "プロキシサーバーがユーザー名とパスワードを必要とする場合",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "채팅",
|
|
3
|
+
"navigation.discover": "발견",
|
|
4
|
+
"navigation.discoverAssistants": "어시스턴트 발견",
|
|
5
|
+
"navigation.discoverMcp": "MCP 발견",
|
|
6
|
+
"navigation.discoverModels": "모델 발견",
|
|
7
|
+
"navigation.discoverProviders": "프로바이더 발견",
|
|
8
|
+
"navigation.group": "그룹",
|
|
9
|
+
"navigation.groupChat": "그룹 채팅",
|
|
10
|
+
"navigation.home": "홈",
|
|
11
|
+
"navigation.image": "이미지",
|
|
12
|
+
"navigation.knowledgeBase": "지식 베이스",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "메모리",
|
|
15
|
+
"navigation.memoryContexts": "메모리 - 컨텍스트",
|
|
16
|
+
"navigation.memoryExperiences": "메모리 - 경험",
|
|
17
|
+
"navigation.memoryIdentities": "메모리 - 신원",
|
|
18
|
+
"navigation.memoryPreferences": "메모리 - 선호도",
|
|
19
|
+
"navigation.onboarding": "온보딩",
|
|
20
|
+
"navigation.page": "페이지",
|
|
21
|
+
"navigation.pages": "페이지",
|
|
22
|
+
"navigation.provider": "프로바이더",
|
|
23
|
+
"navigation.recentView": "최근 조회",
|
|
24
|
+
"navigation.resources": "리소스",
|
|
25
|
+
"navigation.settings": "설정",
|
|
2
26
|
"notification.finishChatGeneration": "AI 메시지 생성이 완료되었습니다",
|
|
3
27
|
"proxy.auth": "인증 필요",
|
|
4
28
|
"proxy.authDesc": "프록시 서버가 사용자 이름과 비밀번호를 요구하는 경우",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "Chat",
|
|
3
|
+
"navigation.discover": "Ontdekken",
|
|
4
|
+
"navigation.discoverAssistants": "Assistenten Ontdekken",
|
|
5
|
+
"navigation.discoverMcp": "MCP Ontdekken",
|
|
6
|
+
"navigation.discoverModels": "Modellen Ontdekken",
|
|
7
|
+
"navigation.discoverProviders": "Providers Ontdekken",
|
|
8
|
+
"navigation.group": "Groep",
|
|
9
|
+
"navigation.groupChat": "Groepschat",
|
|
10
|
+
"navigation.home": "Startpagina",
|
|
11
|
+
"navigation.image": "Afbeelding",
|
|
12
|
+
"navigation.knowledgeBase": "Kennisbank",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "Geheugen",
|
|
15
|
+
"navigation.memoryContexts": "Geheugen - Contexten",
|
|
16
|
+
"navigation.memoryExperiences": "Geheugen - Ervaringen",
|
|
17
|
+
"navigation.memoryIdentities": "Geheugen - Identiteiten",
|
|
18
|
+
"navigation.memoryPreferences": "Geheugen - Voorkeuren",
|
|
19
|
+
"navigation.onboarding": "Onboarding",
|
|
20
|
+
"navigation.page": "Pagina",
|
|
21
|
+
"navigation.pages": "Pagina's",
|
|
22
|
+
"navigation.provider": "Provider",
|
|
23
|
+
"navigation.recentView": "Recente weergaven",
|
|
24
|
+
"navigation.resources": "Bronnen",
|
|
25
|
+
"navigation.settings": "Instellingen",
|
|
2
26
|
"notification.finishChatGeneration": "AI-berichtgeneratie voltooid",
|
|
3
27
|
"proxy.auth": "Authenticatie vereist",
|
|
4
28
|
"proxy.authDesc": "Indien de proxyserver een gebruikersnaam en wachtwoord vereist",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "Czat",
|
|
3
|
+
"navigation.discover": "Odkryj",
|
|
4
|
+
"navigation.discoverAssistants": "Odkryj Asystentów",
|
|
5
|
+
"navigation.discoverMcp": "Odkryj MCP",
|
|
6
|
+
"navigation.discoverModels": "Odkryj Modele",
|
|
7
|
+
"navigation.discoverProviders": "Odkryj Dostawców",
|
|
8
|
+
"navigation.group": "Grupa",
|
|
9
|
+
"navigation.groupChat": "Czat Grupowy",
|
|
10
|
+
"navigation.home": "Strona główna",
|
|
11
|
+
"navigation.image": "Obraz",
|
|
12
|
+
"navigation.knowledgeBase": "Baza Wiedzy",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "Pamięć",
|
|
15
|
+
"navigation.memoryContexts": "Pamięć - Konteksty",
|
|
16
|
+
"navigation.memoryExperiences": "Pamięć - Doświadczenia",
|
|
17
|
+
"navigation.memoryIdentities": "Pamięć - Tożsamości",
|
|
18
|
+
"navigation.memoryPreferences": "Pamięć - Preferencje",
|
|
19
|
+
"navigation.onboarding": "Wprowadzenie",
|
|
20
|
+
"navigation.page": "Strona",
|
|
21
|
+
"navigation.pages": "Strony",
|
|
22
|
+
"navigation.provider": "Dostawca",
|
|
23
|
+
"navigation.recentView": "Ostatnie wyświetlenia",
|
|
24
|
+
"navigation.resources": "Zasoby",
|
|
25
|
+
"navigation.settings": "Ustawienia",
|
|
2
26
|
"notification.finishChatGeneration": "Generowanie wiadomości AI zakończone",
|
|
3
27
|
"proxy.auth": "Wymagana autoryzacja",
|
|
4
28
|
"proxy.authDesc": "Jeśli serwer proxy wymaga nazwy użytkownika i hasła",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "Chat",
|
|
3
|
+
"navigation.discover": "Descobrir",
|
|
4
|
+
"navigation.discoverAssistants": "Descobrir Assistentes",
|
|
5
|
+
"navigation.discoverMcp": "Descobrir MCP",
|
|
6
|
+
"navigation.discoverModels": "Descobrir Modelos",
|
|
7
|
+
"navigation.discoverProviders": "Descobrir Provedores",
|
|
8
|
+
"navigation.group": "Grupo",
|
|
9
|
+
"navigation.groupChat": "Chat em Grupo",
|
|
10
|
+
"navigation.home": "Início",
|
|
11
|
+
"navigation.image": "Imagem",
|
|
12
|
+
"navigation.knowledgeBase": "Base de Conhecimento",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "Memória",
|
|
15
|
+
"navigation.memoryContexts": "Memória - Contextos",
|
|
16
|
+
"navigation.memoryExperiences": "Memória - Experiências",
|
|
17
|
+
"navigation.memoryIdentities": "Memória - Identidades",
|
|
18
|
+
"navigation.memoryPreferences": "Memória - Preferências",
|
|
19
|
+
"navigation.onboarding": "Integração",
|
|
20
|
+
"navigation.page": "Página",
|
|
21
|
+
"navigation.pages": "Páginas",
|
|
22
|
+
"navigation.provider": "Provedor",
|
|
23
|
+
"navigation.recentView": "Visualizações recentes",
|
|
24
|
+
"navigation.resources": "Recursos",
|
|
25
|
+
"navigation.settings": "Configurações",
|
|
2
26
|
"notification.finishChatGeneration": "Geração de mensagem pela IA concluída",
|
|
3
27
|
"proxy.auth": "Autenticação necessária",
|
|
4
28
|
"proxy.authDesc": "Se o servidor proxy exigir nome de usuário e senha",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "Чат",
|
|
3
|
+
"navigation.discover": "Открыть",
|
|
4
|
+
"navigation.discoverAssistants": "Открыть Ассистентов",
|
|
5
|
+
"navigation.discoverMcp": "Открыть MCP",
|
|
6
|
+
"navigation.discoverModels": "Открыть Модели",
|
|
7
|
+
"navigation.discoverProviders": "Открыть Провайдеров",
|
|
8
|
+
"navigation.group": "Группа",
|
|
9
|
+
"navigation.groupChat": "Групповой Чат",
|
|
10
|
+
"navigation.home": "Главная",
|
|
11
|
+
"navigation.image": "Изображение",
|
|
12
|
+
"navigation.knowledgeBase": "База Знаний",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "Память",
|
|
15
|
+
"navigation.memoryContexts": "Память - Контексты",
|
|
16
|
+
"navigation.memoryExperiences": "Память - Опыт",
|
|
17
|
+
"navigation.memoryIdentities": "Память - Идентичности",
|
|
18
|
+
"navigation.memoryPreferences": "Память - Предпочтения",
|
|
19
|
+
"navigation.onboarding": "Введение",
|
|
20
|
+
"navigation.page": "Страница",
|
|
21
|
+
"navigation.pages": "Страницы",
|
|
22
|
+
"navigation.provider": "Провайдер",
|
|
23
|
+
"navigation.recentView": "Недавние просмотры",
|
|
24
|
+
"navigation.resources": "Ресурсы",
|
|
25
|
+
"navigation.settings": "Настройки",
|
|
2
26
|
"notification.finishChatGeneration": "Генерация сообщения ИИ завершена",
|
|
3
27
|
"proxy.auth": "Требуется аутентификация",
|
|
4
28
|
"proxy.authDesc": "Если прокси-сервер требует имя пользователя и пароль",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "Sohbet",
|
|
3
|
+
"navigation.discover": "Keşfet",
|
|
4
|
+
"navigation.discoverAssistants": "Asistanları Keşfet",
|
|
5
|
+
"navigation.discoverMcp": "MCP'yi Keşfet",
|
|
6
|
+
"navigation.discoverModels": "Modelleri Keşfet",
|
|
7
|
+
"navigation.discoverProviders": "Sağlayıcıları Keşfet",
|
|
8
|
+
"navigation.group": "Grup",
|
|
9
|
+
"navigation.groupChat": "Grup Sohbeti",
|
|
10
|
+
"navigation.home": "Ana Sayfa",
|
|
11
|
+
"navigation.image": "Görsel",
|
|
12
|
+
"navigation.knowledgeBase": "Bilgi Bankası",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "Bellek",
|
|
15
|
+
"navigation.memoryContexts": "Bellek - Bağlamlar",
|
|
16
|
+
"navigation.memoryExperiences": "Bellek - Deneyimler",
|
|
17
|
+
"navigation.memoryIdentities": "Bellek - Kimlikler",
|
|
18
|
+
"navigation.memoryPreferences": "Bellek - Tercihler",
|
|
19
|
+
"navigation.onboarding": "Hoş Geldiniz",
|
|
20
|
+
"navigation.page": "Sayfa",
|
|
21
|
+
"navigation.pages": "Sayfalar",
|
|
22
|
+
"navigation.provider": "Sağlayıcı",
|
|
23
|
+
"navigation.recentView": "Son görüntülemeler",
|
|
24
|
+
"navigation.resources": "Kaynaklar",
|
|
25
|
+
"navigation.settings": "Ayarlar",
|
|
2
26
|
"notification.finishChatGeneration": "Yapay zeka mesaj oluşturma tamamlandı",
|
|
3
27
|
"proxy.auth": "Kimlik Doğrulama Gerekli",
|
|
4
28
|
"proxy.authDesc": "Proxy sunucusu kullanıcı adı ve şifre gerektiriyorsa",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "Trò chuyện",
|
|
3
|
+
"navigation.discover": "Khám phá",
|
|
4
|
+
"navigation.discoverAssistants": "Khám phá Trợ lý",
|
|
5
|
+
"navigation.discoverMcp": "Khám phá MCP",
|
|
6
|
+
"navigation.discoverModels": "Khám phá Mô hình",
|
|
7
|
+
"navigation.discoverProviders": "Khám phá Nhà cung cấp",
|
|
8
|
+
"navigation.group": "Nhóm",
|
|
9
|
+
"navigation.groupChat": "Trò chuyện Nhóm",
|
|
10
|
+
"navigation.home": "Trang chủ",
|
|
11
|
+
"navigation.image": "Hình ảnh",
|
|
12
|
+
"navigation.knowledgeBase": "Cơ sở Tri thức",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "Bộ nhớ",
|
|
15
|
+
"navigation.memoryContexts": "Bộ nhớ - Ngữ cảnh",
|
|
16
|
+
"navigation.memoryExperiences": "Bộ nhớ - Trải nghiệm",
|
|
17
|
+
"navigation.memoryIdentities": "Bộ nhớ - Danh tính",
|
|
18
|
+
"navigation.memoryPreferences": "Bộ nhớ - Tùy chọn",
|
|
19
|
+
"navigation.onboarding": "Giới thiệu",
|
|
20
|
+
"navigation.page": "Trang",
|
|
21
|
+
"navigation.pages": "Trang",
|
|
22
|
+
"navigation.provider": "Nhà cung cấp",
|
|
23
|
+
"navigation.recentView": "Đã xem gần đây",
|
|
24
|
+
"navigation.resources": "Tài nguyên",
|
|
25
|
+
"navigation.settings": "Cài đặt",
|
|
2
26
|
"notification.finishChatGeneration": "Đã hoàn tất tạo tin nhắn AI",
|
|
3
27
|
"proxy.auth": "Yêu cầu xác thực",
|
|
4
28
|
"proxy.authDesc": "Nếu máy chủ proxy yêu cầu tên người dùng và mật khẩu",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "对话",
|
|
3
|
+
"navigation.discover": "发现",
|
|
4
|
+
"navigation.discoverAssistants": "发现助理",
|
|
5
|
+
"navigation.discoverMcp": "发现 MCP",
|
|
6
|
+
"navigation.discoverModels": "发现模型",
|
|
7
|
+
"navigation.discoverProviders": "发现模型服务商",
|
|
8
|
+
"navigation.group": "群组",
|
|
9
|
+
"navigation.groupChat": "群组对话",
|
|
10
|
+
"navigation.home": "首页",
|
|
11
|
+
"navigation.image": "图像",
|
|
12
|
+
"navigation.knowledgeBase": "知识库",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "记忆",
|
|
15
|
+
"navigation.memoryContexts": "记忆 - 上下文",
|
|
16
|
+
"navigation.memoryExperiences": "记忆 - 经历",
|
|
17
|
+
"navigation.memoryIdentities": "记忆 - 身份",
|
|
18
|
+
"navigation.memoryPreferences": "记忆 - 偏好",
|
|
19
|
+
"navigation.onboarding": "引导",
|
|
20
|
+
"navigation.page": "文稿",
|
|
21
|
+
"navigation.pages": "文稿",
|
|
22
|
+
"navigation.provider": "模型服务商",
|
|
23
|
+
"navigation.recentView": "最近访问",
|
|
24
|
+
"navigation.resources": "资源",
|
|
25
|
+
"navigation.settings": "设置",
|
|
2
26
|
"notification.finishChatGeneration": "AI 消息已生成完毕",
|
|
3
27
|
"proxy.auth": "需要认证",
|
|
4
28
|
"proxy.authDesc": "如果代理服务器需要用户名和密码",
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
+
"navigation.chat": "對話",
|
|
3
|
+
"navigation.discover": "發現",
|
|
4
|
+
"navigation.discoverAssistants": "發現助理",
|
|
5
|
+
"navigation.discoverMcp": "發現 MCP",
|
|
6
|
+
"navigation.discoverModels": "發現模型",
|
|
7
|
+
"navigation.discoverProviders": "發現模型服務商",
|
|
8
|
+
"navigation.group": "群組",
|
|
9
|
+
"navigation.groupChat": "群組對話",
|
|
10
|
+
"navigation.home": "首頁",
|
|
11
|
+
"navigation.image": "圖像",
|
|
12
|
+
"navigation.knowledgeBase": "知識庫",
|
|
13
|
+
"navigation.lobehub": "LobeHub",
|
|
14
|
+
"navigation.memory": "記憶",
|
|
15
|
+
"navigation.memoryContexts": "記憶 - 上下文",
|
|
16
|
+
"navigation.memoryExperiences": "記憶 - 經歷",
|
|
17
|
+
"navigation.memoryIdentities": "記憶 - 身份",
|
|
18
|
+
"navigation.memoryPreferences": "記憶 - 偏好",
|
|
19
|
+
"navigation.onboarding": "引導",
|
|
20
|
+
"navigation.page": "文稿",
|
|
21
|
+
"navigation.pages": "文稿",
|
|
22
|
+
"navigation.provider": "模型服務商",
|
|
23
|
+
"navigation.recentView": "最近訪問",
|
|
24
|
+
"navigation.resources": "資源",
|
|
25
|
+
"navigation.settings": "設定",
|
|
2
26
|
"notification.finishChatGeneration": "AI 訊息已生成完畢",
|
|
3
27
|
"proxy.auth": "需要認證",
|
|
4
28
|
"proxy.authDesc": "如果代理伺服器需要使用者名稱和密碼",
|
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.241",
|
|
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",
|
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
export interface NavigationBroadcastEvents {
|
|
2
|
+
/**
|
|
3
|
+
* Ask renderer to go back in navigation history.
|
|
4
|
+
* Triggered from the main process menu.
|
|
5
|
+
*/
|
|
6
|
+
historyGoBack: () => void;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Ask renderer to go forward in navigation history.
|
|
10
|
+
* Triggered from the main process menu.
|
|
11
|
+
*/
|
|
12
|
+
historyGoForward: () => void;
|
|
13
|
+
|
|
2
14
|
/**
|
|
3
15
|
* Ask renderer to navigate within the SPA without reloading the whole page.
|
|
4
16
|
*/
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import { BRANDING_NAME } from '@lobechat/business-const';
|
|
2
2
|
import { memo, useEffect } from 'react';
|
|
3
3
|
|
|
4
|
+
import { isDesktop } from '@/const/version';
|
|
5
|
+
import { useElectronStore } from '@/store/electron';
|
|
6
|
+
|
|
4
7
|
const PageTitle = memo<{ title: string }>(({ title }) => {
|
|
8
|
+
const setCurrentPageTitle = useElectronStore((s) => s.setCurrentPageTitle);
|
|
9
|
+
|
|
5
10
|
useEffect(() => {
|
|
6
11
|
document.title = title ? `${title} · ${BRANDING_NAME}` : BRANDING_NAME;
|
|
7
|
-
|
|
12
|
+
|
|
13
|
+
// Sync title to electron store for navigation history
|
|
14
|
+
if (isDesktop) {
|
|
15
|
+
setCurrentPageTitle(title);
|
|
16
|
+
}
|
|
17
|
+
}, [title, setCurrentPageTitle]);
|
|
8
18
|
|
|
9
19
|
return null;
|
|
10
20
|
});
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { Flexbox, Icon } from '@lobehub/ui';
|
|
4
|
+
import { createStaticStyles } from 'antd-style';
|
|
5
|
+
import { memo } from 'react';
|
|
6
|
+
import { useTranslation } from 'react-i18next';
|
|
7
|
+
import { useNavigate } from 'react-router-dom';
|
|
8
|
+
|
|
9
|
+
import { useElectronStore } from '@/store/electron';
|
|
10
|
+
import type { HistoryEntry } from '@/store/electron/actions/navigationHistory';
|
|
11
|
+
|
|
12
|
+
import { getRouteIcon } from '../helpers/routeMetadata';
|
|
13
|
+
|
|
14
|
+
const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
15
|
+
container: css`
|
|
16
|
+
overflow-y: auto;
|
|
17
|
+
width: 260px;
|
|
18
|
+
max-height: 320px;
|
|
19
|
+
padding: 4px;
|
|
20
|
+
`,
|
|
21
|
+
empty: css`
|
|
22
|
+
padding-block: 16px;
|
|
23
|
+
padding-inline: 12px;
|
|
24
|
+
|
|
25
|
+
font-size: 12px;
|
|
26
|
+
color: ${cssVar.colorTextTertiary};
|
|
27
|
+
text-align: center;
|
|
28
|
+
`,
|
|
29
|
+
icon: css`
|
|
30
|
+
flex-shrink: 0;
|
|
31
|
+
color: ${cssVar.colorTextSecondary};
|
|
32
|
+
`,
|
|
33
|
+
item: css`
|
|
34
|
+
cursor: pointer;
|
|
35
|
+
|
|
36
|
+
overflow: hidden;
|
|
37
|
+
|
|
38
|
+
padding-block: 6px;
|
|
39
|
+
padding-inline: 8px;
|
|
40
|
+
border-radius: ${cssVar.borderRadiusSM};
|
|
41
|
+
|
|
42
|
+
transition: background-color 0.15s ${cssVar.motionEaseInOut};
|
|
43
|
+
|
|
44
|
+
&:hover {
|
|
45
|
+
background-color: ${cssVar.colorFillSecondary};
|
|
46
|
+
}
|
|
47
|
+
`,
|
|
48
|
+
itemActive: css`
|
|
49
|
+
background-color: ${cssVar.colorFillTertiary};
|
|
50
|
+
`,
|
|
51
|
+
itemTitle: css`
|
|
52
|
+
overflow: hidden;
|
|
53
|
+
flex: 1;
|
|
54
|
+
|
|
55
|
+
font-size: 12px;
|
|
56
|
+
color: ${cssVar.colorText};
|
|
57
|
+
text-overflow: ellipsis;
|
|
58
|
+
white-space: nowrap;
|
|
59
|
+
`,
|
|
60
|
+
title: css`
|
|
61
|
+
padding-block: 4px;
|
|
62
|
+
padding-inline: 8px;
|
|
63
|
+
|
|
64
|
+
font-size: 11px;
|
|
65
|
+
font-weight: 500;
|
|
66
|
+
color: ${cssVar.colorTextTertiary};
|
|
67
|
+
text-transform: uppercase;
|
|
68
|
+
letter-spacing: 0.5px;
|
|
69
|
+
`,
|
|
70
|
+
}));
|
|
71
|
+
|
|
72
|
+
interface RecentlyViewedProps {
|
|
73
|
+
onClose: () => void;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const RecentlyViewed = memo<RecentlyViewedProps>(({ onClose }) => {
|
|
77
|
+
const { t } = useTranslation('electron');
|
|
78
|
+
const navigate = useNavigate();
|
|
79
|
+
const historyEntries = useElectronStore((s) => s.historyEntries);
|
|
80
|
+
const historyCurrentIndex = useElectronStore((s) => s.historyCurrentIndex);
|
|
81
|
+
const setIsNavigatingHistory = useElectronStore((s) => s.setIsNavigatingHistory);
|
|
82
|
+
|
|
83
|
+
const handleClick = (entry: HistoryEntry, index: number) => {
|
|
84
|
+
// Set flag to prevent adding duplicate history entry
|
|
85
|
+
setIsNavigatingHistory(true);
|
|
86
|
+
|
|
87
|
+
// Update the current index in store
|
|
88
|
+
useElectronStore.setState({ historyCurrentIndex: index });
|
|
89
|
+
|
|
90
|
+
// Navigate to the selected entry
|
|
91
|
+
navigate(entry.url);
|
|
92
|
+
|
|
93
|
+
// Close the popover
|
|
94
|
+
onClose();
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// Show entries in reverse order (most recent first), excluding current
|
|
98
|
+
const recentEntries = [...historyEntries]
|
|
99
|
+
.map((entry, index) => ({ entry, originalIndex: index }))
|
|
100
|
+
.reverse();
|
|
101
|
+
|
|
102
|
+
if (recentEntries.length === 0) {
|
|
103
|
+
return (
|
|
104
|
+
<div className={styles.container}>
|
|
105
|
+
<div className={styles.empty}>{t('navigation.recentView')}</div>
|
|
106
|
+
</div>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return (
|
|
111
|
+
<Flexbox className={styles.container}>
|
|
112
|
+
<div className={styles.title}>{t('navigation.recentView')}</div>
|
|
113
|
+
{recentEntries.map(({ entry, originalIndex }) => {
|
|
114
|
+
const isActive = originalIndex === historyCurrentIndex;
|
|
115
|
+
const RouteIcon = getRouteIcon(entry.url);
|
|
116
|
+
|
|
117
|
+
return (
|
|
118
|
+
<Flexbox
|
|
119
|
+
align="center"
|
|
120
|
+
className={`${styles.item} ${isActive ? styles.itemActive : ''}`}
|
|
121
|
+
gap={8}
|
|
122
|
+
horizontal
|
|
123
|
+
key={`${entry.url}-${originalIndex}`}
|
|
124
|
+
onClick={() => handleClick(entry, originalIndex)}
|
|
125
|
+
>
|
|
126
|
+
{RouteIcon && <Icon className={styles.icon} icon={RouteIcon} size="small" />}
|
|
127
|
+
<span className={styles.itemTitle}>{entry.title}</span>
|
|
128
|
+
</Flexbox>
|
|
129
|
+
);
|
|
130
|
+
})}
|
|
131
|
+
</Flexbox>
|
|
132
|
+
);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
RecentlyViewed.displayName = 'RecentlyViewed';
|
|
136
|
+
|
|
137
|
+
export default RecentlyViewed;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { ActionIcon, Flexbox, Popover, Tooltip } from '@lobehub/ui';
|
|
4
|
+
import { ArrowLeft, ArrowRight, Clock } from 'lucide-react';
|
|
5
|
+
import { memo, useCallback, useEffect, useState } from 'react';
|
|
6
|
+
import { useTranslation } from 'react-i18next';
|
|
7
|
+
|
|
8
|
+
import { useGlobalStore } from '@/store/global';
|
|
9
|
+
import { systemStatusSelectors } from '@/store/global/selectors';
|
|
10
|
+
import { electronStylish } from '@/styles/electron';
|
|
11
|
+
import { isMacOS } from '@/utils/platform';
|
|
12
|
+
|
|
13
|
+
import { useNavigationHistory } from '../hooks/useNavigationHistory';
|
|
14
|
+
import RecentlyViewed from './RecentlyViewed';
|
|
15
|
+
|
|
16
|
+
const isMac = isMacOS();
|
|
17
|
+
|
|
18
|
+
const useNavPanelWidth = () => {
|
|
19
|
+
return useGlobalStore(systemStatusSelectors.leftPanelWidth);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const NavigationBar = memo(() => {
|
|
23
|
+
const { t } = useTranslation('electron');
|
|
24
|
+
const { canGoBack, canGoForward, goBack, goForward } = useNavigationHistory();
|
|
25
|
+
const [historyOpen, setHistoryOpen] = useState(false);
|
|
26
|
+
// Use ResizeObserver for real-time width updates during resize
|
|
27
|
+
const leftPanelWidth = useNavPanelWidth();
|
|
28
|
+
|
|
29
|
+
// Toggle history popover
|
|
30
|
+
const toggleHistoryOpen = useCallback(() => {
|
|
31
|
+
setHistoryOpen((prev) => !prev);
|
|
32
|
+
}, []);
|
|
33
|
+
|
|
34
|
+
// Listen for keyboard shortcut ⌘Y / Ctrl+Y
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
const handleKeyDown = (event: KeyboardEvent) => {
|
|
37
|
+
const isCmdOrCtrl = isMac ? event.metaKey : event.ctrlKey;
|
|
38
|
+
if (isCmdOrCtrl && event.key.toLowerCase() === 'y') {
|
|
39
|
+
event.preventDefault();
|
|
40
|
+
toggleHistoryOpen();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
45
|
+
return () => {
|
|
46
|
+
window.removeEventListener('keydown', handleKeyDown);
|
|
47
|
+
};
|
|
48
|
+
}, [toggleHistoryOpen]);
|
|
49
|
+
|
|
50
|
+
// Tooltip content for the clock button
|
|
51
|
+
const tooltipContent = t('navigation.recentView');
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<Flexbox
|
|
55
|
+
align="center"
|
|
56
|
+
className={electronStylish.nodrag}
|
|
57
|
+
data-width={leftPanelWidth}
|
|
58
|
+
horizontal
|
|
59
|
+
justify="end"
|
|
60
|
+
style={{ width: `${leftPanelWidth - 12}px` }}
|
|
61
|
+
>
|
|
62
|
+
<Flexbox align="center" gap={2} horizontal>
|
|
63
|
+
<ActionIcon disabled={!canGoBack} icon={ArrowLeft} onClick={goBack} size="small" />
|
|
64
|
+
<ActionIcon disabled={!canGoForward} icon={ArrowRight} onClick={goForward} size="small" />
|
|
65
|
+
<Popover
|
|
66
|
+
content={<RecentlyViewed onClose={() => setHistoryOpen(false)} />}
|
|
67
|
+
onOpenChange={setHistoryOpen}
|
|
68
|
+
open={historyOpen}
|
|
69
|
+
placement="bottomLeft"
|
|
70
|
+
styles={{ content: { padding: 0 } }}
|
|
71
|
+
trigger="click"
|
|
72
|
+
>
|
|
73
|
+
<div>
|
|
74
|
+
<Tooltip open={historyOpen ? false : undefined} title={tooltipContent}>
|
|
75
|
+
<ActionIcon icon={Clock} size="small" />
|
|
76
|
+
</Tooltip>
|
|
77
|
+
</div>
|
|
78
|
+
</Popover>
|
|
79
|
+
</Flexbox>
|
|
80
|
+
</Flexbox>
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
NavigationBar.displayName = 'NavigationBar';
|
|
85
|
+
|
|
86
|
+
export default NavigationBar;
|