@lobehub/lobehub 2.0.0-next.13 → 2.0.0-next.15

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 (219) hide show
  1. package/.github/workflows/desktop-pr-build.yml +6 -6
  2. package/.github/workflows/release-desktop-beta.yml +4 -4
  3. package/.github/workflows/release.yml +1 -2
  4. package/.github/workflows/test.yml +4 -5
  5. package/.nvmrc +1 -1
  6. package/CHANGELOG.md +42 -0
  7. package/apps/desktop/tsconfig.json +0 -1
  8. package/changelog/v1.json +14 -0
  9. package/e2e/tsconfig.json +0 -1
  10. package/package.json +58 -58
  11. package/packages/const/src/version.ts +3 -3
  12. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  13. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  14. package/packages/web-crawler/tsconfig.json +0 -1
  15. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  16. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  17. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  18. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  19. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  20. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  21. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  22. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  23. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  24. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  25. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  26. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  27. package/src/app/[variants]/loading/index.tsx +1 -10
  28. package/src/components/Link.tsx +12 -0
  29. package/src/envs/app.ts +5 -8
  30. package/src/features/DataImporter/index.tsx +15 -60
  31. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  32. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  33. package/src/libs/trpc/client/index.ts +0 -1
  34. package/src/libs/trpc/client/lambda.ts +8 -5
  35. package/src/server/routers/desktop/mcp.ts +1 -3
  36. package/src/server/routers/lambda/config/index.test.ts +2 -2
  37. package/src/server/routers/tools/mcp.ts +2 -3
  38. package/src/server/routers/tools/search.test.ts +1 -7
  39. package/src/server/routers/tools/search.ts +1 -4
  40. package/src/services/__tests__/tool.test.ts +0 -3
  41. package/src/services/aiModel/index.test.ts +0 -3
  42. package/src/services/aiModel/index.ts +1 -7
  43. package/src/services/aiProvider/index.test.ts +0 -3
  44. package/src/services/aiProvider/index.ts +1 -7
  45. package/src/services/chatGroup/index.ts +1 -10
  46. package/src/services/config.ts +1 -65
  47. package/src/services/export/index.ts +1 -4
  48. package/src/services/file/index.ts +1 -11
  49. package/src/services/import/index.ts +1 -7
  50. package/src/services/message/index.ts +1 -11
  51. package/src/services/plugin/index.ts +1 -11
  52. package/src/services/session/index.ts +1 -11
  53. package/src/services/tableViewer/client.ts +12 -15
  54. package/src/services/thread/index.ts +1 -7
  55. package/src/services/topic/index.ts +1 -11
  56. package/src/services/user/index.ts +1 -13
  57. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  58. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  59. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  60. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
  61. package/src/store/user/slices/common/action.test.ts +1 -4
  62. package/tsconfig.json +0 -1
  63. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  64. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  65. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  66. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  67. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  68. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  69. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  70. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  71. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  72. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  73. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  74. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  75. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  76. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  77. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  78. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  79. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  80. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  81. package/src/components/InnerLink.tsx +0 -20
  82. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  83. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  84. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  85. package/src/database/_deprecated/core/db.ts +0 -246
  86. package/src/database/_deprecated/core/index.ts +0 -2
  87. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  88. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  89. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  90. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  91. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  92. package/src/database/_deprecated/core/model.ts +0 -218
  93. package/src/database/_deprecated/core/schemas.ts +0 -88
  94. package/src/database/_deprecated/core/types/db.ts +0 -15
  95. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  96. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  97. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  98. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  99. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  100. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  101. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  102. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  103. package/src/database/_deprecated/models/file.ts +0 -51
  104. package/src/database/_deprecated/models/message.ts +0 -277
  105. package/src/database/_deprecated/models/plugin.ts +0 -62
  106. package/src/database/_deprecated/models/session.ts +0 -271
  107. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  108. package/src/database/_deprecated/models/topic.ts +0 -250
  109. package/src/database/_deprecated/models/user.ts +0 -69
  110. package/src/database/_deprecated/schemas/files.ts +0 -39
  111. package/src/database/_deprecated/schemas/message.ts +0 -50
  112. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  113. package/src/database/_deprecated/schemas/session.ts +0 -54
  114. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  115. package/src/database/_deprecated/schemas/topic.ts +0 -12
  116. package/src/database/_deprecated/schemas/user.ts +0 -40
  117. package/src/features/DataImporter/_deprecated.ts +0 -43
  118. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  119. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  120. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  121. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  122. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  123. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  124. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  125. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  126. package/src/features/InitClientDB/index.tsx +0 -37
  127. package/src/libs/trpc/client/edge.ts +0 -26
  128. package/src/libs/trpc/edge/context.ts +0 -71
  129. package/src/libs/trpc/edge/index.ts +0 -45
  130. package/src/libs/trpc/edge/init.ts +0 -26
  131. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  132. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  133. package/src/migrations/FromV0ToV1.ts +0 -10
  134. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  135. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  136. package/src/migrations/FromV1ToV2/index.ts +0 -82
  137. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  138. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  139. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  140. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  141. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  142. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  143. package/src/migrations/FromV2ToV3/index.ts +0 -30
  144. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  145. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  146. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  147. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  148. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  149. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  150. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  151. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  152. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  153. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  154. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  155. package/src/migrations/FromV3ToV4/index.ts +0 -102
  156. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  157. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  158. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  159. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  160. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  161. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  162. package/src/migrations/FromV4ToV5/index.ts +0 -58
  163. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  164. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  165. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  166. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  167. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  168. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  169. package/src/migrations/FromV5ToV6/index.ts +0 -61
  170. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  171. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  172. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  173. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  174. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  175. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  176. package/src/migrations/FromV6ToV7/index.ts +0 -101
  177. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  178. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  179. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  180. package/src/migrations/VersionController.test.ts +0 -88
  181. package/src/migrations/VersionController.ts +0 -67
  182. package/src/migrations/index.ts +0 -61
  183. package/src/server/routers/edge/appStatus.ts +0 -3
  184. package/src/server/routers/edge/index.ts +0 -14
  185. package/src/server/routers/edge/upload.ts +0 -16
  186. package/src/services/aiModel/client.ts +0 -70
  187. package/src/services/aiProvider/client.ts +0 -58
  188. package/src/services/baseClientService/index.ts +0 -9
  189. package/src/services/chatGroup/client.ts +0 -63
  190. package/src/services/export/_deprecated.ts +0 -155
  191. package/src/services/export/client.ts +0 -15
  192. package/src/services/file/_deprecated.test.ts +0 -119
  193. package/src/services/file/_deprecated.ts +0 -80
  194. package/src/services/file/client.test.ts +0 -199
  195. package/src/services/file/client.ts +0 -85
  196. package/src/services/import/_deprecated.ts +0 -115
  197. package/src/services/import/client.test.ts +0 -1015
  198. package/src/services/import/client.ts +0 -64
  199. package/src/services/message/_deprecated.test.ts +0 -398
  200. package/src/services/message/_deprecated.ts +0 -168
  201. package/src/services/message/client.test.ts +0 -410
  202. package/src/services/message/client.ts +0 -192
  203. package/src/services/plugin/_deprecated.test.ts +0 -162
  204. package/src/services/plugin/_deprecated.ts +0 -42
  205. package/src/services/plugin/client.test.ts +0 -177
  206. package/src/services/plugin/client.ts +0 -46
  207. package/src/services/session/_deprecated.test.ts +0 -440
  208. package/src/services/session/_deprecated.ts +0 -190
  209. package/src/services/session/client.test.ts +0 -413
  210. package/src/services/session/client.ts +0 -193
  211. package/src/services/thread/client.ts +0 -51
  212. package/src/services/topic/_deprecated.test.ts +0 -245
  213. package/src/services/topic/_deprecated.ts +0 -75
  214. package/src/services/topic/client.ts +0 -89
  215. package/src/services/topic/pglite.test.ts +0 -212
  216. package/src/services/user/_deprecated.test.ts +0 -101
  217. package/src/services/user/_deprecated.ts +0 -70
  218. package/src/services/user/client.test.ts +0 -111
  219. package/src/services/user/client.ts +0 -104
@@ -1,120 +0,0 @@
1
- import { Alert, Button, Highlighter, Icon } from '@lobehub/ui';
2
- import { Popconfirm, Result } from 'antd';
3
- import { useTheme } from 'antd-style';
4
- import { createStore, del, get, set } from 'idb-keyval';
5
- import { ShieldAlert } from 'lucide-react';
6
- import Link from 'next/link';
7
- import { lighten } from 'polished';
8
- import { memo } from 'react';
9
- import { Trans, useTranslation } from 'react-i18next';
10
- import { Flexbox } from 'react-layout-kit';
11
- import Balancer from 'react-wrap-balancer';
12
-
13
- import { GITHUB_ISSUES } from '@/const/url';
14
- import { githubService } from '@/services/github';
15
-
16
- import ExportConfigButton from './ExportConfigButton';
17
- import UpgradeButton from './UpgradeButton';
18
- import { MigrationError, UpgradeStatus, V1DB_NAME, V1DB_TABLE_NAME } from './const';
19
-
20
- const clearLocal = async () => {
21
- const store = createStore(V1DB_NAME, V1DB_TABLE_NAME);
22
- // delete the state key and back it up to state_backup for reproduce
23
- const state = await get('state', store);
24
- await del('state');
25
- await set('state_backup', state, store);
26
- location.reload();
27
- };
28
-
29
- interface FailedProps {
30
- error?: MigrationError;
31
- setError: (error: MigrationError) => void;
32
- setUpgradeStatus: (status: UpgradeStatus) => void;
33
- state: any;
34
- upgradeStatus: UpgradeStatus;
35
- }
36
- const Failed = memo<FailedProps>(({ error, state, setUpgradeStatus, setError, upgradeStatus }) => {
37
- const { t } = useTranslation('migration');
38
- const theme = useTheme();
39
-
40
- return (
41
- <Result
42
- extra={
43
- <Flexbox gap={24}>
44
- {!!error && (
45
- <Alert
46
- extra={
47
- <Highlighter actionIconSize={'small'} language={'json'}>
48
- {JSON.stringify(error)}
49
- </Highlighter>
50
- }
51
- message={error.message}
52
- style={{ flex: 1 }}
53
- type={'error'}
54
- />
55
- )}
56
- <Flexbox
57
- gap={16}
58
- horizontal
59
- justify={'center'}
60
- style={{
61
- alignSelf: 'center',
62
- flexWrap: 'wrap',
63
- }}
64
- >
65
- <ExportConfigButton primary state={state} />
66
- <Popconfirm
67
- arrow={false}
68
- okButtonProps={{
69
- danger: true,
70
- type: 'primary',
71
- }}
72
- onConfirm={clearLocal}
73
- styles={{
74
- body: { background: lighten(0.03, theme.colorBgElevated) },
75
- root: { width: 340 },
76
- }}
77
- title={t('dbV1.clear.confirm')}
78
- >
79
- <Button size={'large'}>{t('dbV1.action.clearDB')}</Button>
80
- </Popconfirm>
81
- <UpgradeButton
82
- primary={false}
83
- setError={setError}
84
- setUpgradeStatus={setUpgradeStatus}
85
- state={state}
86
- upgradeStatus={upgradeStatus}
87
- >
88
- {t('dbV1.action.reUpgrade')}
89
- </UpgradeButton>
90
- </Flexbox>
91
- </Flexbox>
92
- }
93
- icon={<Icon icon={ShieldAlert} />}
94
- status={'error'}
95
- style={{ paddingBlock: 24, width: 450 }}
96
- subTitle={
97
- <Balancer>
98
- <Trans i18nKey="dbV1.upgrade.error.subTitle" ns={'migration'}>
99
- 非常抱歉,数据库升级过程发生异常。请重试升级,或
100
- <Link
101
- aria-label={'issue'}
102
- href={GITHUB_ISSUES}
103
- onClick={(e) => {
104
- e.preventDefault();
105
- githubService.submitDBV1UpgradeError(1, error!);
106
- }}
107
- target="_blank"
108
- >
109
- 提交问题
110
- </Link>
111
- 我们将会第一时间帮你排查问题。
112
- </Trans>
113
- </Balancer>
114
- }
115
- title={t('dbV1.upgrade.error.title')}
116
- />
117
- );
118
- });
119
-
120
- export default Failed;
@@ -1,81 +0,0 @@
1
- import { Button, Icon } from '@lobehub/ui';
2
- import { Result } from 'antd';
3
- import { CheckCircle, CpuIcon } from 'lucide-react';
4
- import { memo, useState } from 'react';
5
- import { useTranslation } from 'react-i18next';
6
- import { Center } from 'react-layout-kit';
7
-
8
- import DataStyleModal from '@/components/DataStyleModal';
9
- import { BRANDING_NAME } from '@/const/branding';
10
-
11
- import Failed from './Failed';
12
- import MigrationStart from './Start';
13
- import { MigrationError, UpgradeStatus } from './const';
14
-
15
- interface MigrationModalProps {
16
- open: boolean;
17
- setOpen: (open: boolean) => void;
18
- state: any;
19
- }
20
-
21
- const MigrationModal = memo<MigrationModalProps>(({ setOpen, open, state: dbState }) => {
22
- const { t } = useTranslation('migration');
23
- const [upgradeStatus, setUpgradeStatus] = useState<UpgradeStatus>(UpgradeStatus.START);
24
-
25
- const [error, setError] = useState<MigrationError>();
26
-
27
- const close = () => {
28
- setOpen(false);
29
- };
30
-
31
- const renderContent = () => {
32
- switch (upgradeStatus) {
33
- case UpgradeStatus.START:
34
- case UpgradeStatus.UPGRADING: {
35
- return (
36
- <MigrationStart
37
- setError={setError}
38
- setUpgradeStatus={setUpgradeStatus}
39
- state={dbState}
40
- upgradeStatus={upgradeStatus}
41
- />
42
- );
43
- }
44
- case UpgradeStatus.UPGRADED: {
45
- return (
46
- <Result
47
- extra={
48
- <Button onClick={close} size={'large'} type={'primary'}>
49
- {t('dbV1.action.start')}
50
- </Button>
51
- }
52
- icon={<Icon icon={CheckCircle} />}
53
- status={'success'}
54
- style={{ paddingBlock: 24 }}
55
- subTitle={t('dbV1.upgrade.success.subTitle', { appName: BRANDING_NAME })}
56
- title={t('dbV1.upgrade.success.title')}
57
- />
58
- );
59
- }
60
- case UpgradeStatus.UPGRADE_FAILED: {
61
- return (
62
- <Failed
63
- error={error}
64
- setError={setError}
65
- setUpgradeStatus={setUpgradeStatus}
66
- state={dbState}
67
- upgradeStatus={upgradeStatus}
68
- />
69
- );
70
- }
71
- }
72
- };
73
-
74
- return (
75
- <DataStyleModal icon={CpuIcon} open={open} title={t('dbV1.title', { appName: BRANDING_NAME })}>
76
- <Center gap={48}>{renderContent()}</Center>
77
- </DataStyleModal>
78
- );
79
- });
80
-
81
- export default MigrationModal;
@@ -1,108 +0,0 @@
1
- import { Icon } from '@lobehub/ui';
2
- import { createStyles } from 'antd-style';
3
- import { Database, SearchCheck, Zap } from 'lucide-react';
4
- import { memo } from 'react';
5
- import { useTranslation } from 'react-i18next';
6
- import { Center, Flexbox } from 'react-layout-kit';
7
- import Balancer from 'react-wrap-balancer';
8
-
9
- import { BRANDING_NAME } from '@/const/branding';
10
-
11
- import ExportConfigButton from './ExportConfigButton';
12
- import UpgradeButton, { UpgradeButtonProps } from './UpgradeButton';
13
-
14
- const useStyles = createStyles(({ css, token, isDarkMode, responsive }) => ({
15
- desc: css`
16
- width: 280px;
17
- color: ${token.colorTextSecondary};
18
-
19
- ${responsive.mobile} {
20
- line-height: ${token.lineHeight};
21
- }
22
- `,
23
- hint: css`
24
- font-size: ${token.fontSizeSM}px;
25
- color: ${token.colorTextTertiary};
26
- text-align: center;
27
- `,
28
- icon: css`
29
- color: ${isDarkMode ? token.blue : token.geekblue};
30
- `,
31
- iconCtn: css`
32
- width: 72px;
33
- height: 72px;
34
- border-radius: 50%;
35
- background: ${isDarkMode ? token.blue1 : token.geekblue1};
36
- `,
37
- intro: css`
38
- ${responsive.mobile} {
39
- width: 350px;
40
- margin-block-start: 24px;
41
- line-height: ${token.lineHeight};
42
- }
43
- `,
44
-
45
- title: css`
46
- font-size: ${token.fontSizeLG}px;
47
- font-weight: bold;
48
- `,
49
- }));
50
-
51
- const MigrationStart = memo<UpgradeButtonProps>((props) => {
52
- const { t } = useTranslation('migration');
53
- const { styles } = useStyles();
54
-
55
- const features = [
56
- {
57
- avatar: Database,
58
- desc: t('dbV1.features.capability.desc'),
59
- title: t('dbV1.features.capability.title'),
60
- },
61
- {
62
- avatar: Zap,
63
- desc: t('dbV1.features.performance.desc'),
64
- title: t('dbV1.features.performance.title'),
65
- },
66
- {
67
- avatar: SearchCheck,
68
- desc: t('dbV1.features.use.desc'),
69
- title: t('dbV1.features.use.title'),
70
- },
71
- ];
72
-
73
- return (
74
- <>
75
- <Flexbox>
76
- <Flexbox className={styles.intro} style={{ textAlign: 'center' }} width={460}>
77
- {t('dbV1.description', { appName: BRANDING_NAME })}
78
- </Flexbox>
79
- </Flexbox>
80
- <Flexbox gap={32}>
81
- {features.map((item) => {
82
- return (
83
- <Flexbox align={'flex-start'} gap={24} horizontal key={item.title}>
84
- <Center className={styles.iconCtn}>
85
- <Icon className={styles.icon} icon={item.avatar} size={36} />
86
- </Center>
87
- <Flexbox gap={8}>
88
- <p className={styles.title}>{item.title}</p>
89
- <p className={styles.desc}>{item.desc}</p>
90
- </Flexbox>
91
- </Flexbox>
92
- );
93
- })}
94
- </Flexbox>
95
- <Flexbox align={'center'} gap={16} style={{ paddingBottom: 16 }}>
96
- <Flexbox gap={16} horizontal justify={'center'} style={{ flexWrap: 'wrap' }}>
97
- <ExportConfigButton state={props.state} />
98
- <UpgradeButton {...props} />
99
- </Flexbox>
100
- <Flexbox align={'center'} className={styles.hint}>
101
- <Balancer>{t('dbV1.upgradeTip', { appName: BRANDING_NAME })}</Balancer>
102
- </Flexbox>
103
- </Flexbox>
104
- </>
105
- );
106
- });
107
-
108
- export default MigrationStart;
@@ -1,71 +0,0 @@
1
- import { Button } from '@lobehub/ui';
2
- import { ReactNode, memo } from 'react';
3
- import { useTranslation } from 'react-i18next';
4
-
5
- import { ClientService } from '@/services/import/_deprecated';
6
- import { useChatStore } from '@/store/chat';
7
- import { useSessionStore } from '@/store/session';
8
-
9
- import { MigrationError, UpgradeStatus } from './const';
10
-
11
- export interface UpgradeButtonProps {
12
- children?: ReactNode;
13
- primary?: boolean;
14
- setError: (error: MigrationError) => void;
15
- setUpgradeStatus: (status: UpgradeStatus) => void;
16
- state: any;
17
- upgradeStatus: UpgradeStatus;
18
- }
19
-
20
- const UpgradeButton = memo<UpgradeButtonProps>(
21
- ({ setUpgradeStatus, upgradeStatus, state, setError, primary = true, children }) => {
22
- const { t } = useTranslation('migration');
23
-
24
- const refreshSession = useSessionStore((s) => s.refreshSessions);
25
- const [refreshMessages, refreshTopic] = useChatStore((s) => [
26
- s.refreshMessages,
27
- s.refreshTopic,
28
- ]);
29
-
30
- const upgrade = async () => {
31
- try {
32
- setUpgradeStatus(UpgradeStatus.UPGRADING);
33
-
34
- const configService = new ClientService();
35
- await configService.importConfigState({
36
- exportType: 'sessions',
37
- state: state,
38
- version: 7,
39
- });
40
-
41
- await refreshSession();
42
- await refreshMessages();
43
- await refreshTopic();
44
-
45
- localStorage.setItem('V2DB_IS_MIGRATED', '1');
46
-
47
- setUpgradeStatus(UpgradeStatus.UPGRADED);
48
-
49
- return { success: true };
50
- } catch (error) {
51
- setUpgradeStatus(UpgradeStatus.UPGRADE_FAILED);
52
- const err = error as { message: string; stack: string };
53
-
54
- setError({ message: err.message, stack: err.stack });
55
- }
56
- };
57
-
58
- return (
59
- <Button
60
- color={primary ? undefined : 'default'}
61
- loading={upgradeStatus === UpgradeStatus.UPGRADING}
62
- onClick={upgrade}
63
- size={'large'}
64
- >
65
- {children ?? t('dbV1.action.upgrade')}
66
- </Button>
67
- );
68
- },
69
- );
70
-
71
- export default UpgradeButton;
@@ -1,15 +0,0 @@
1
- export const MIGRATE_KEY = 'migrated';
2
- export enum UpgradeStatus {
3
- START,
4
- UPGRADING,
5
- UPGRADED,
6
- UPGRADE_FAILED,
7
- }
8
-
9
- export const V1DB_NAME = 'LobeHub';
10
- export const V1DB_TABLE_NAME = 'LOBE_CHAT';
11
-
12
- export interface MigrationError {
13
- message: string;
14
- stack: string;
15
- }
@@ -1,50 +0,0 @@
1
- 'use client';
2
-
3
- import { Spin } from 'antd';
4
- import dynamic from 'next/dynamic';
5
- import { memo, useEffect, useState } from 'react';
6
-
7
- import { isServerMode } from '@/const/version';
8
- import { useGlobalStore } from '@/store/global';
9
- import { systemStatusSelectors } from '@/store/global/selectors';
10
-
11
- import { V2DBReader } from './DBReader';
12
-
13
- const Modal = dynamic(() => import('./Modal'), { loading: () => <Spin fullscreen />, ssr: false });
14
-
15
- const Migration = memo(() => {
16
- const [dbState, setDbState] = useState(null);
17
- const [open, setOpen] = useState(false);
18
-
19
- const isPgliteInited = useGlobalStore(systemStatusSelectors.isPgliteInited);
20
-
21
- const checkMigration = async () => {
22
- const isMigrated = localStorage.getItem('V2DB_IS_MIGRATED');
23
- // if db have migrated already, don't show modal
24
- if (isMigrated || isServerMode) return;
25
-
26
- const dbReader = new V2DBReader([
27
- 'messages',
28
- 'files',
29
- 'plugins',
30
- 'sessionGroups',
31
- 'sessions',
32
- 'topics',
33
- 'users',
34
- ]);
35
- const data = await dbReader.readAllData();
36
- console.log('migration data:', data);
37
- const state = await dbReader.convertToImportData(data);
38
- console.log('import state', state);
39
- setDbState(state as any);
40
- setOpen(true);
41
- };
42
-
43
- useEffect(() => {
44
- if (isPgliteInited) checkMigration();
45
- }, [isPgliteInited]);
46
-
47
- return open && <Modal open={open} setOpen={setOpen} state={dbState} />;
48
- });
49
-
50
- export default Migration;
@@ -1,48 +0,0 @@
1
- import dynamic from 'next/dynamic';
2
- import React, { memo } from 'react';
3
- import { useTranslation } from 'react-i18next';
4
-
5
- import FullscreenLoading from '@/components/Loading/FullscreenLoading';
6
- import { useGlobalStore } from '@/store/global';
7
- import { systemStatusSelectors } from '@/store/global/selectors';
8
- import { DatabaseLoadingState } from '@/types/clientDB';
9
-
10
- import { CLIENT_LOADING_STAGES } from '../stage';
11
-
12
- const InitError = dynamic(() => import('./Error'), { ssr: false });
13
-
14
- interface InitProps {
15
- setActiveStage: (value: string) => void;
16
- }
17
-
18
- const Init = memo<InitProps>(({ setActiveStage }) => {
19
- const useInitClientDB = useGlobalStore((s) => s.useInitClientDB);
20
-
21
- useInitClientDB({ onStateChange: setActiveStage });
22
-
23
- return null;
24
- });
25
-
26
- interface ContentProps {
27
- loadingStage: string;
28
- setActiveStage: (value: string) => void;
29
- }
30
-
31
- const Content = memo<ContentProps>(({ loadingStage, setActiveStage }) => {
32
- const { t } = useTranslation('common');
33
- const isPgliteNotInited = useGlobalStore(systemStatusSelectors.isPgliteNotInited);
34
- const isError = useGlobalStore((s) => s.initClientDBStage === DatabaseLoadingState.Error);
35
-
36
- return (
37
- <>
38
- {isPgliteNotInited && <Init setActiveStage={setActiveStage} />}
39
- <FullscreenLoading
40
- activeStage={CLIENT_LOADING_STAGES.indexOf(loadingStage)}
41
- contentRender={isError && <InitError />}
42
- stages={CLIENT_LOADING_STAGES.map((key) => t(`appLoading.${key}` as any))}
43
- />
44
- </>
45
- );
46
- });
47
-
48
- export default Content;
@@ -1,27 +0,0 @@
1
- import { Button } from '@lobehub/ui';
2
- import React from 'react';
3
- import { useTranslation } from 'react-i18next';
4
- import { Center } from 'react-layout-kit';
5
-
6
- import ErrorResult from '@/features/InitClientDB/ErrorResult';
7
-
8
- const InitError = () => {
9
- const { t } = useTranslation('common');
10
-
11
- return (
12
- <ErrorResult>
13
- {({ setOpen }) => (
14
- <Center gap={8}>
15
- {t('appLoading.failed')}
16
- <div>
17
- <Button onClick={() => setOpen(true)} type={'primary'}>
18
- {t('appLoading.showDetail')}
19
- </Button>
20
- </div>
21
- </Center>
22
- )}
23
- </ErrorResult>
24
- );
25
- };
26
-
27
- export default InitError;
@@ -1,47 +0,0 @@
1
- 'use client';
2
-
3
- import { useRouter } from 'next/navigation';
4
- import { memo, useEffect } from 'react';
5
-
6
- import { useGlobalStore } from '@/store/global';
7
- import { systemStatusSelectors } from '@/store/global/selectors';
8
- import { useUserStore } from '@/store/user';
9
-
10
- import { AppLoadingStage } from '../stage';
11
-
12
- interface RedirectProps {
13
- setActiveStage: (value: AppLoadingStage) => void;
14
- }
15
-
16
- const Redirect = memo<RedirectProps>(({ setActiveStage }) => {
17
- const router = useRouter();
18
- const isUserStateInit = useUserStore((s) => s.isUserStateInit);
19
-
20
- const isPgliteNotEnabled = useGlobalStore(systemStatusSelectors.isPgliteNotEnabled);
21
-
22
- const navToChat = () => {
23
- setActiveStage(AppLoadingStage.GoToChat);
24
- router.replace('/chat');
25
- };
26
-
27
- useEffect(() => {
28
- // if pglite is not enabled, redirect to chat
29
- if (isPgliteNotEnabled) {
30
- navToChat();
31
- return;
32
- }
33
-
34
- // if user state not init, wait for loading
35
- if (!isUserStateInit) {
36
- setActiveStage(AppLoadingStage.InitUser);
37
- return;
38
- }
39
-
40
- // finally check the conversation status
41
- navToChat();
42
- }, [isUserStateInit, isPgliteNotEnabled]);
43
-
44
- return null;
45
- });
46
-
47
- export default Redirect;
@@ -1,22 +0,0 @@
1
- 'use client';
2
-
3
- import { useState } from 'react';
4
-
5
- import { AppLoadingStage } from '../stage';
6
- import Content from './Content';
7
- import Redirect from './Redirect';
8
-
9
- const ClientMode = () => {
10
- const [activeStage, setActiveStage] = useState<string>(AppLoadingStage.Initializing);
11
-
12
- return (
13
- <>
14
- <Content loadingStage={activeStage} setActiveStage={setActiveStage} />
15
- <Redirect setActiveStage={setActiveStage} />
16
- </>
17
- );
18
- };
19
-
20
- ClientMode.displayName = 'ClientMode';
21
-
22
- export default ClientMode;
@@ -1,20 +0,0 @@
1
- 'use client';
2
-
3
- import Link, { LinkProps } from 'next/link';
4
- import { AnchorHTMLAttributes, ReactNode } from 'react';
5
-
6
- import { useServerConfigStore } from '@/store/serverConfig';
7
-
8
- interface InnerLinkProps
9
- extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, keyof LinkProps>,
10
- LinkProps {
11
- children?: ReactNode | undefined;
12
- }
13
-
14
- const InnerLink = ({ href, ...props }: InnerLinkProps) => {
15
- const variants = useServerConfigStore((s) => s.segmentVariants);
16
-
17
- return <Link {...props} as={href} href={`/${variants}${href}`} />;
18
- };
19
-
20
- export default InnerLink;
@@ -1,42 +0,0 @@
1
- import Dexie from 'dexie';
2
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
3
-
4
- import { BrowserDB } from '../db';
5
- import { dbSchemaV3 } from '../schemas';
6
- import { LOBE_CHAT_LOCAL_DB_NAME } from '../types/db';
7
-
8
- beforeEach(async () => {
9
- // 确保在测试开始前删除数据库
10
- await Dexie.delete(LOBE_CHAT_LOCAL_DB_NAME);
11
- });
12
-
13
- afterEach(async () => {
14
- // 确保在测试结束后删除数据库
15
- await Dexie.delete(LOBE_CHAT_LOCAL_DB_NAME);
16
- });
17
-
18
- describe('LocalDB migration', () => {
19
- it('should upgrade from version 3 to version 4 correctly', async () => {
20
- // 使用版本3的schema创建数据库实例并填充测试数据
21
- const dbV3 = new Dexie(LOBE_CHAT_LOCAL_DB_NAME);
22
- dbV3.version(3).stores(dbSchemaV3);
23
- await dbV3.open();
24
- await dbV3.table('sessions').bulkAdd([
25
- { id: 's1', group: 'pinned' },
26
- { id: 's2', group: 'default' },
27
- ]);
28
- dbV3.close();
29
-
30
- // 创建新的数据库实例,包含版本4的迁移逻辑
31
- const dbV4 = new BrowserDB();
32
- await dbV4.open();
33
-
34
- // 验证迁移后的数据
35
- const updatedSession1 = await dbV4.sessions.get('s1');
36
- const updatedSession2 = await dbV4.sessions.get('s2');
37
- expect(updatedSession1).toEqual({ id: 's1', pinned: 1, group: 'default' });
38
- expect(updatedSession2).toEqual({ id: 's2', pinned: 0, group: 'default' });
39
-
40
- dbV4.close();
41
- });
42
- });