@lobehub/lobehub 2.0.0-next.2 → 2.0.0-next.21

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 (603) hide show
  1. package/.env.desktop +1 -2
  2. package/.env.example +0 -3
  3. package/.env.example.development +0 -2
  4. package/.github/workflows/claude-auto-testing.yml +73 -0
  5. package/.github/workflows/claude-translate-comments.yml +67 -0
  6. package/.github/workflows/desktop-pr-build.yml +18 -16
  7. package/.github/workflows/docker.yml +25 -20
  8. package/.github/workflows/e2e.yml +17 -3
  9. package/.github/workflows/release-desktop-beta.yml +12 -12
  10. package/.github/workflows/release.yml +3 -5
  11. package/.github/workflows/test.yml +47 -12
  12. package/.nvmrc +1 -1
  13. package/CHANGELOG.md +484 -0
  14. package/Dockerfile +1 -3
  15. package/README.md +2 -45
  16. package/README.zh-CN.md +2 -45
  17. package/apps/desktop/src/main/controllers/AuthCtr.ts +53 -39
  18. package/apps/desktop/src/main/controllers/__tests__/AuthCtr.test.ts +706 -0
  19. package/apps/desktop/src/main/utils/next-electron-rsc.ts +7 -5
  20. package/apps/desktop/tsconfig.json +0 -1
  21. package/changelog/v1.json +159 -0
  22. package/docs/development/database-schema.dbml +11 -1
  23. package/docs/self-hosting/advanced/auth/next-auth/auth0.mdx +2 -2
  24. package/docs/self-hosting/advanced/auth/next-auth/auth0.zh-CN.mdx +2 -2
  25. package/docs/self-hosting/advanced/auth/next-auth/authelia.mdx +2 -2
  26. package/docs/self-hosting/advanced/auth/next-auth/authelia.zh-CN.mdx +2 -2
  27. package/docs/self-hosting/advanced/auth/next-auth/authentik.mdx +2 -2
  28. package/docs/self-hosting/advanced/auth/next-auth/authentik.zh-CN.mdx +2 -2
  29. package/docs/self-hosting/advanced/auth/next-auth/casdoor.mdx +2 -2
  30. package/docs/self-hosting/advanced/auth/next-auth/casdoor.zh-CN.mdx +2 -2
  31. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.mdx +2 -2
  32. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.zh-CN.mdx +2 -2
  33. package/docs/self-hosting/advanced/auth/next-auth/github.mdx +2 -2
  34. package/docs/self-hosting/advanced/auth/next-auth/github.zh-CN.mdx +2 -2
  35. package/docs/self-hosting/advanced/auth/next-auth/google.mdx +32 -29
  36. package/docs/self-hosting/advanced/auth/next-auth/keycloak.mdx +2 -2
  37. package/docs/self-hosting/advanced/auth/next-auth/keycloak.zh-CN.mdx +2 -2
  38. package/docs/self-hosting/advanced/auth/next-auth/logto.mdx +5 -3
  39. package/docs/self-hosting/advanced/auth/next-auth/logto.zh-CN.mdx +5 -3
  40. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.mdx +2 -2
  41. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.zh-CN.mdx +2 -2
  42. package/docs/self-hosting/advanced/auth/next-auth/okta.mdx +2 -2
  43. package/docs/self-hosting/advanced/auth/next-auth/okta.zh-CN.mdx +2 -2
  44. package/docs/self-hosting/advanced/auth/next-auth/wechat.mdx +2 -2
  45. package/docs/self-hosting/advanced/auth/next-auth/wechat.zh-CN.mdx +2 -2
  46. package/docs/self-hosting/advanced/auth/next-auth/zitadel.mdx +2 -2
  47. package/docs/self-hosting/advanced/auth/next-auth/zitadel.zh-CN.mdx +2 -2
  48. package/docs/self-hosting/advanced/auth.mdx +32 -21
  49. package/docs/self-hosting/advanced/auth.zh-CN.mdx +30 -19
  50. package/docs/self-hosting/advanced/feature-flags.mdx +0 -1
  51. package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +0 -1
  52. package/docs/self-hosting/advanced/online-search.mdx +30 -25
  53. package/docs/self-hosting/advanced/online-search.zh-CN.mdx +25 -23
  54. package/e2e/src/features/discover/smoke.feature +34 -1
  55. package/e2e/src/steps/discover/smoke.steps.ts +116 -4
  56. package/e2e/tsconfig.json +0 -1
  57. package/locales/ar/models.json +15 -6
  58. package/locales/ar/oauth.json +1 -0
  59. package/locales/bg-BG/models.json +15 -6
  60. package/locales/bg-BG/oauth.json +1 -0
  61. package/locales/de-DE/models.json +15 -6
  62. package/locales/de-DE/oauth.json +1 -0
  63. package/locales/en-US/models.json +15 -6
  64. package/locales/en-US/oauth.json +1 -0
  65. package/locales/es-ES/models.json +15 -6
  66. package/locales/es-ES/oauth.json +1 -0
  67. package/locales/fa-IR/models.json +15 -6
  68. package/locales/fa-IR/oauth.json +1 -0
  69. package/locales/fr-FR/models.json +15 -6
  70. package/locales/fr-FR/oauth.json +1 -0
  71. package/locales/it-IT/models.json +15 -6
  72. package/locales/it-IT/oauth.json +1 -0
  73. package/locales/ja-JP/models.json +15 -6
  74. package/locales/ja-JP/oauth.json +1 -0
  75. package/locales/ko-KR/models.json +21 -12
  76. package/locales/ko-KR/oauth.json +1 -0
  77. package/locales/nl-NL/models.json +15 -6
  78. package/locales/nl-NL/oauth.json +1 -0
  79. package/locales/pl-PL/models.json +15 -6
  80. package/locales/pl-PL/oauth.json +1 -0
  81. package/locales/pt-BR/models.json +15 -6
  82. package/locales/pt-BR/oauth.json +1 -0
  83. package/locales/ru-RU/models.json +15 -6
  84. package/locales/ru-RU/oauth.json +1 -0
  85. package/locales/tr-TR/models.json +15 -6
  86. package/locales/tr-TR/oauth.json +1 -0
  87. package/locales/vi-VN/models.json +15 -6
  88. package/locales/vi-VN/oauth.json +1 -0
  89. package/locales/zh-CN/models.json +15 -6
  90. package/locales/zh-CN/oauth.json +1 -0
  91. package/locales/zh-TW/models.json +15 -6
  92. package/locales/zh-TW/oauth.json +1 -0
  93. package/next.config.ts +2 -3
  94. package/package.json +74 -80
  95. package/packages/const/src/index.ts +0 -1
  96. package/packages/const/src/models.ts +13 -0
  97. package/packages/const/src/url.ts +1 -4
  98. package/packages/const/src/version.ts +3 -3
  99. package/packages/context-engine/src/index.ts +1 -6
  100. package/packages/context-engine/src/processors/GroupMessageFlatten.ts +12 -2
  101. package/packages/context-engine/src/processors/__tests__/GroupMessageFlatten.test.ts +73 -9
  102. package/packages/context-engine/src/providers/index.ts +0 -2
  103. package/packages/database/migrations/0041_improve_index.sql +10 -0
  104. package/packages/database/migrations/meta/0041_snapshot.json +7784 -0
  105. package/packages/database/migrations/meta/_journal.json +7 -0
  106. package/packages/database/package.json +1 -1
  107. package/packages/database/src/core/migrations.json +17 -0
  108. package/packages/database/src/core/web-server.ts +2 -1
  109. package/packages/database/src/models/__tests__/message.grouping.test.ts +812 -0
  110. package/packages/database/src/models/__tests__/message.test.ts +322 -170
  111. package/packages/database/src/models/message.ts +62 -24
  112. package/packages/database/src/models/session.ts +60 -19
  113. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  114. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  115. package/packages/database/src/schemas/agent.ts +10 -11
  116. package/packages/database/src/schemas/message.ts +5 -1
  117. package/packages/database/src/schemas/relations.ts +6 -4
  118. package/packages/database/src/schemas/session.ts +2 -0
  119. package/packages/database/src/schemas/topic.ts +6 -1
  120. package/packages/database/src/utils/__tests__/groupMessages.test.ts +145 -2
  121. package/packages/database/src/utils/groupMessages.ts +7 -5
  122. package/packages/electron-client-ipc/package.json +4 -1
  123. package/packages/file-loaders/package.json +1 -0
  124. package/packages/memory-extract/package.json +1 -1
  125. package/packages/model-bank/src/aiModels/anthropic.ts +0 -63
  126. package/packages/model-bank/src/aiModels/azure.ts +155 -0
  127. package/packages/model-bank/src/aiModels/bedrock.ts +44 -0
  128. package/packages/model-bank/src/aiModels/higress.ts +0 -55
  129. package/packages/model-bank/src/aiModels/infiniai.ts +21 -0
  130. package/packages/model-bank/src/aiModels/ollamacloud.ts +13 -0
  131. package/packages/model-bank/src/aiModels/siliconcloud.ts +19 -0
  132. package/packages/model-runtime/src/core/parameterResolver.ts +3 -0
  133. package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +0 -38
  134. package/packages/model-runtime/src/providers/azureOpenai/index.ts +2 -1
  135. package/packages/model-runtime/src/providers/minimax/index.ts +5 -5
  136. package/packages/model-runtime/src/providers/search1api/index.test.ts +2 -2
  137. package/packages/model-runtime/src/utils/googleErrorParser.test.ts +125 -0
  138. package/packages/model-runtime/src/utils/googleErrorParser.ts +103 -77
  139. package/packages/types/src/message/common/base.ts +13 -0
  140. package/packages/types/src/message/common/image.ts +8 -0
  141. package/packages/types/src/message/common/metadata.ts +39 -0
  142. package/packages/types/src/message/common/tools.ts +10 -0
  143. package/packages/types/src/message/db/params.ts +47 -1
  144. package/packages/types/src/message/ui/chat.ts +4 -1
  145. package/packages/types/src/message/ui/params.ts +98 -4
  146. package/packages/types/src/search.ts +16 -0
  147. package/packages/types/src/serverConfig.ts +2 -6
  148. package/packages/types/src/user/index.ts +13 -1
  149. package/packages/types/src/user/settings/index.ts +22 -0
  150. package/packages/utils/src/apiKey.test.ts +139 -0
  151. package/packages/utils/src/client/clipboard.ts +2 -2
  152. package/packages/utils/src/client/exportFile.ts +10 -10
  153. package/packages/utils/src/client/parserPlaceholder.ts +18 -18
  154. package/packages/utils/src/client/topic.ts +10 -10
  155. package/packages/utils/src/client/xor-obfuscation.ts +11 -11
  156. package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
  157. package/packages/web-crawler/tsconfig.json +0 -1
  158. package/renovate.json +20 -3
  159. package/scripts/migrateServerDB/errorHint.js +1 -7
  160. package/scripts/migrateServerDB/index.ts +2 -1
  161. package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
  162. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
  163. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  164. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
  165. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  166. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
  167. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
  168. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
  169. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
  170. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  171. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
  172. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  173. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  174. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  175. package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
  176. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
  177. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
  178. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
  179. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
  180. package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
  181. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
  182. package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
  183. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  184. package/src/app/[variants]/(main)/labs/components/LabCard.tsx +3 -1
  185. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  186. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  187. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  188. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  189. package/src/app/[variants]/(main)/settings/_layout/SettingsContent.tsx +0 -3
  190. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  191. package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +5 -7
  192. package/src/app/[variants]/layout.tsx +1 -0
  193. package/src/app/[variants]/loading/index.tsx +1 -10
  194. package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
  195. package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
  196. package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
  197. package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
  198. package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
  199. package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
  200. package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +19 -2
  201. package/src/app/sitemap.tsx +7 -1
  202. package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
  203. package/src/components/Link.tsx +12 -0
  204. package/src/components/Thinking/index.tsx +4 -3
  205. package/src/config/db.ts +0 -5
  206. package/src/config/featureFlags/schema.test.ts +0 -2
  207. package/src/config/featureFlags/schema.ts +0 -6
  208. package/src/config/modelProviders/ai21.ts +1 -16
  209. package/src/config/modelProviders/ai302.ts +1 -128
  210. package/src/config/modelProviders/ai360.ts +1 -32
  211. package/src/config/modelProviders/anthropic.ts +1 -94
  212. package/src/config/modelProviders/azure.ts +1 -51
  213. package/src/config/modelProviders/baichuan.ts +1 -57
  214. package/src/config/modelProviders/bedrock.ts +1 -276
  215. package/src/config/modelProviders/cloudflare.ts +1 -64
  216. package/src/config/modelProviders/deepseek.ts +1 -19
  217. package/src/config/modelProviders/fireworksai.ts +1 -174
  218. package/src/config/modelProviders/giteeai.ts +1 -135
  219. package/src/config/modelProviders/github.ts +1 -254
  220. package/src/config/modelProviders/google.ts +1 -130
  221. package/src/config/modelProviders/groq.ts +1 -119
  222. package/src/config/modelProviders/higress.ts +1 -1736
  223. package/src/config/modelProviders/huggingface.ts +1 -54
  224. package/src/config/modelProviders/hunyuan.ts +1 -83
  225. package/src/config/modelProviders/infiniai.ts +1 -74
  226. package/src/config/modelProviders/internlm.ts +1 -20
  227. package/src/config/modelProviders/minimax.ts +1 -1
  228. package/src/config/modelProviders/mistral.ts +1 -95
  229. package/src/config/modelProviders/modelscope.ts +1 -27
  230. package/src/config/modelProviders/moonshot.ts +1 -29
  231. package/src/config/modelProviders/novita.ts +1 -105
  232. package/src/config/modelProviders/ollama.ts +1 -325
  233. package/src/config/modelProviders/openai.ts +1 -242
  234. package/src/config/modelProviders/openrouter.ts +1 -240
  235. package/src/config/modelProviders/perplexity.ts +1 -45
  236. package/src/config/modelProviders/ppio.ts +1 -152
  237. package/src/config/modelProviders/qiniu.ts +2 -19
  238. package/src/config/modelProviders/qwen.ts +1 -245
  239. package/src/config/modelProviders/search1api.ts +1 -34
  240. package/src/config/modelProviders/sensenova.ts +1 -69
  241. package/src/config/modelProviders/siliconcloud.ts +1 -417
  242. package/src/config/modelProviders/spark.ts +1 -59
  243. package/src/config/modelProviders/stepfun.ts +1 -98
  244. package/src/config/modelProviders/taichu.ts +1 -18
  245. package/src/config/modelProviders/togetherai.ts +1 -274
  246. package/src/config/modelProviders/upstage.ts +1 -28
  247. package/src/config/modelProviders/wenxin.ts +1 -140
  248. package/src/config/modelProviders/xai.ts +1 -38
  249. package/src/config/modelProviders/zeroone.ts +1 -81
  250. package/src/config/modelProviders/zhipu.ts +1 -108
  251. package/src/envs/app.ts +5 -8
  252. package/src/envs/auth.ts +0 -179
  253. package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
  254. package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
  255. package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
  256. package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
  257. package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
  258. package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
  259. package/src/features/Conversation/Error/index.tsx +15 -5
  260. package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
  261. package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
  262. package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
  263. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
  264. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
  265. package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
  266. package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
  267. package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
  268. package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
  269. package/src/features/Conversation/Messages/Default.tsx +2 -2
  270. package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
  271. package/src/features/Conversation/Messages/User/index.tsx +4 -4
  272. package/src/features/Conversation/Messages/index.tsx +3 -3
  273. package/src/features/Conversation/components/AutoScroll.tsx +2 -2
  274. package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
  275. package/src/features/DataImporter/index.tsx +15 -60
  276. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  277. package/src/features/PluginTag/index.tsx +1 -3
  278. package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
  279. package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
  280. package/src/helpers/isCanUseFC.ts +0 -8
  281. package/src/hooks/useEnabledChatModels.ts +0 -8
  282. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  283. package/src/hooks/useModelContextWindowTokens.ts +0 -8
  284. package/src/hooks/useModelHasContextWindowToken.ts +1 -10
  285. package/src/hooks/useModelSupportFiles.ts +1 -11
  286. package/src/hooks/useModelSupportReasoning.ts +1 -11
  287. package/src/hooks/useModelSupportToolUse.ts +1 -11
  288. package/src/hooks/useModelSupportVision.ts +1 -11
  289. package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
  290. package/src/libs/next-auth/auth.config.ts +3 -6
  291. package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
  292. package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
  293. package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
  294. package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
  295. package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
  296. package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
  297. package/src/libs/next-auth/sso-providers/github.ts +0 -6
  298. package/src/libs/next-auth/sso-providers/google.ts +0 -2
  299. package/src/libs/next-auth/sso-providers/index.ts +0 -2
  300. package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
  301. package/src/libs/next-auth/sso-providers/logto.ts +3 -5
  302. package/src/libs/next-auth/sso-providers/okta.ts +0 -4
  303. package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
  304. package/src/libs/oidc-provider/provider.ts +1 -1
  305. package/src/libs/trpc/client/index.ts +0 -1
  306. package/src/libs/trpc/client/lambda.ts +8 -5
  307. package/src/libs/trpc/lambda/context.ts +4 -1
  308. package/src/locales/default/oauth.ts +1 -0
  309. package/src/server/globalConfig/index.ts +0 -23
  310. package/src/server/modules/AssistantStore/index.ts +1 -1
  311. package/src/server/modules/ModelRuntime/trace.ts +11 -4
  312. package/src/server/routers/desktop/mcp.ts +1 -3
  313. package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +0 -41
  314. package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
  315. package/src/server/routers/lambda/config/index.test.ts +38 -30
  316. package/src/server/routers/lambda/message.ts +17 -13
  317. package/src/server/routers/lambda/session.ts +8 -5
  318. package/src/server/routers/lambda/user.ts +24 -25
  319. package/src/server/routers/tools/mcp.ts +2 -3
  320. package/src/server/routers/tools/search.test.ts +1 -7
  321. package/src/server/routers/tools/search.ts +1 -4
  322. package/src/server/services/search/impls/firecrawl/index.ts +51 -11
  323. package/src/server/services/search/impls/firecrawl/type.ts +60 -9
  324. package/src/services/__tests__/tool.test.ts +0 -3
  325. package/src/services/aiModel/index.test.ts +0 -3
  326. package/src/services/aiModel/index.ts +1 -7
  327. package/src/services/aiProvider/index.test.ts +0 -3
  328. package/src/services/aiProvider/index.ts +1 -7
  329. package/src/services/chat/chat.test.ts +13 -40
  330. package/src/services/chat/contextEngineering.test.ts +0 -30
  331. package/src/services/chat/contextEngineering.ts +1 -12
  332. package/src/services/chat/helper.ts +7 -31
  333. package/src/services/chat/index.ts +5 -10
  334. package/src/services/chat/types.ts +1 -1
  335. package/src/services/chatGroup/index.ts +1 -10
  336. package/src/services/config.ts +1 -65
  337. package/src/services/export/index.ts +1 -4
  338. package/src/services/file/index.ts +1 -11
  339. package/src/services/import/index.ts +1 -7
  340. package/src/services/mcp.test.ts +777 -0
  341. package/src/services/message/index.ts +1 -11
  342. package/src/services/message/server.ts +7 -6
  343. package/src/services/message/type.ts +6 -3
  344. package/src/services/models.ts +2 -11
  345. package/src/services/plugin/index.ts +1 -11
  346. package/src/services/session/index.ts +1 -11
  347. package/src/services/tableViewer/client.ts +12 -15
  348. package/src/services/thread/index.ts +1 -7
  349. package/src/services/topic/index.ts +1 -11
  350. package/src/services/user/index.ts +1 -13
  351. package/src/store/chat/helpers.test.ts +99 -0
  352. package/src/store/chat/helpers.ts +21 -2
  353. package/src/store/chat/selectors.ts +1 -1
  354. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  355. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  356. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  357. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +45 -155
  358. package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
  359. package/src/store/chat/slices/message/action.test.ts +5 -1
  360. package/src/store/chat/slices/message/action.ts +102 -14
  361. package/src/store/chat/slices/message/reducer.test.ts +363 -5
  362. package/src/store/chat/slices/message/reducer.ts +87 -3
  363. package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
  364. package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
  365. package/src/store/chat/slices/message/selectors/index.ts +2 -0
  366. package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
  367. package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
  368. package/src/store/chat/slices/plugin/action.test.ts +34 -132
  369. package/src/store/chat/slices/plugin/action.ts +1 -44
  370. package/src/store/global/store.ts +1 -7
  371. package/src/store/tool/selectors/tool.test.ts +1 -1
  372. package/src/store/tool/selectors/tool.ts +6 -8
  373. package/src/store/tool/slices/builtin/action.test.ts +83 -35
  374. package/src/store/tool/slices/builtin/action.ts +0 -9
  375. package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
  376. package/src/store/tool/slices/builtin/selectors.ts +15 -21
  377. package/src/store/user/initialState.ts +1 -7
  378. package/src/store/user/selectors.ts +1 -5
  379. package/src/store/user/slices/common/action.test.ts +1 -4
  380. package/src/store/user/slices/common/action.ts +5 -4
  381. package/src/store/user/slices/settings/selectors/index.ts +1 -0
  382. package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
  383. package/src/store/user/store.ts +0 -3
  384. package/src/tools/index.ts +0 -6
  385. package/src/tools/renders.ts +0 -3
  386. package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
  387. package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
  388. package/tsconfig.json +9 -3
  389. package/packages/const/src/guide.ts +0 -89
  390. package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
  391. package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
  392. package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
  393. package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
  394. package/packages/utils/src/_deprecated/parseModels.ts +0 -165
  395. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  396. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  397. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  398. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  399. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  400. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  401. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  402. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  403. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  404. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  405. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  406. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  407. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  408. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  409. package/src/app/[variants]/(main)/settings/llm/ProviderList/Azure/index.tsx +0 -93
  410. package/src/app/[variants]/(main)/settings/llm/ProviderList/Bedrock/index.tsx +0 -70
  411. package/src/app/[variants]/(main)/settings/llm/ProviderList/Cloudflare/index.tsx +0 -39
  412. package/src/app/[variants]/(main)/settings/llm/ProviderList/Github/index.tsx +0 -52
  413. package/src/app/[variants]/(main)/settings/llm/ProviderList/HuggingFace/index.tsx +0 -52
  414. package/src/app/[variants]/(main)/settings/llm/ProviderList/Ollama/index.tsx +0 -20
  415. package/src/app/[variants]/(main)/settings/llm/ProviderList/OpenAI/index.tsx +0 -17
  416. package/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx +0 -132
  417. package/src/app/[variants]/(main)/settings/llm/components/Checker.tsx +0 -118
  418. package/src/app/[variants]/(main)/settings/llm/components/ProviderConfig/index.tsx +0 -303
  419. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/CustomModelOption.tsx +0 -98
  420. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/Form.tsx +0 -104
  421. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/index.tsx +0 -77
  422. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelFetcher.tsx +0 -105
  423. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/Option.tsx +0 -68
  424. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/index.tsx +0 -146
  425. package/src/app/[variants]/(main)/settings/llm/const.ts +0 -20
  426. package/src/app/[variants]/(main)/settings/llm/features/Footer.tsx +0 -35
  427. package/src/app/[variants]/(main)/settings/llm/index.tsx +0 -30
  428. package/src/app/[variants]/(main)/settings/llm/type.ts +0 -5
  429. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  430. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  431. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  432. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  433. package/src/components/InnerLink.tsx +0 -20
  434. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  435. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  436. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  437. package/src/database/_deprecated/core/db.ts +0 -246
  438. package/src/database/_deprecated/core/index.ts +0 -2
  439. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  440. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  441. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  442. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  443. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  444. package/src/database/_deprecated/core/model.ts +0 -218
  445. package/src/database/_deprecated/core/schemas.ts +0 -88
  446. package/src/database/_deprecated/core/types/db.ts +0 -15
  447. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  448. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  449. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  450. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  451. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  452. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  453. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  454. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  455. package/src/database/_deprecated/models/file.ts +0 -51
  456. package/src/database/_deprecated/models/message.ts +0 -277
  457. package/src/database/_deprecated/models/plugin.ts +0 -62
  458. package/src/database/_deprecated/models/session.ts +0 -271
  459. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  460. package/src/database/_deprecated/models/topic.ts +0 -250
  461. package/src/database/_deprecated/models/user.ts +0 -69
  462. package/src/database/_deprecated/schemas/files.ts +0 -39
  463. package/src/database/_deprecated/schemas/message.ts +0 -50
  464. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  465. package/src/database/_deprecated/schemas/session.ts +0 -54
  466. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  467. package/src/database/_deprecated/schemas/topic.ts +0 -12
  468. package/src/database/_deprecated/schemas/user.ts +0 -40
  469. package/src/envs/__tests__/auth.test.ts +0 -200
  470. package/src/features/DataImporter/_deprecated.ts +0 -43
  471. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  472. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  473. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  474. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  475. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  476. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  477. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  478. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  479. package/src/features/InitClientDB/index.tsx +0 -37
  480. package/src/hooks/_header.ts +0 -23
  481. package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
  482. package/src/libs/trpc/client/edge.ts +0 -26
  483. package/src/libs/trpc/edge/context.ts +0 -71
  484. package/src/libs/trpc/edge/index.ts +0 -45
  485. package/src/libs/trpc/edge/init.ts +0 -26
  486. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  487. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  488. package/src/migrations/FromV0ToV1.ts +0 -10
  489. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  490. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  491. package/src/migrations/FromV1ToV2/index.ts +0 -82
  492. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  493. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  494. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  495. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  496. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  497. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  498. package/src/migrations/FromV2ToV3/index.ts +0 -30
  499. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  500. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  501. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  502. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  503. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  504. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  505. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  506. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  507. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  508. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  509. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  510. package/src/migrations/FromV3ToV4/index.ts +0 -102
  511. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  512. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  513. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  514. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  515. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  516. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  517. package/src/migrations/FromV4ToV5/index.ts +0 -58
  518. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  519. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  520. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  521. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  522. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  523. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  524. package/src/migrations/FromV5ToV6/index.ts +0 -61
  525. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  526. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  527. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  528. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  529. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  530. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  531. package/src/migrations/FromV6ToV7/index.ts +0 -101
  532. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  533. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  534. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  535. package/src/migrations/VersionController.test.ts +0 -88
  536. package/src/migrations/VersionController.ts +0 -67
  537. package/src/migrations/index.ts +0 -61
  538. package/src/server/globalConfig/_deprecated.test.ts +0 -92
  539. package/src/server/globalConfig/_deprecated.ts +0 -41
  540. package/src/server/routers/edge/appStatus.ts +0 -3
  541. package/src/server/routers/edge/index.ts +0 -14
  542. package/src/server/routers/edge/upload.ts +0 -16
  543. package/src/services/aiModel/client.ts +0 -70
  544. package/src/services/aiProvider/client.ts +0 -58
  545. package/src/services/baseClientService/index.ts +0 -9
  546. package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
  547. package/src/services/chatGroup/client.ts +0 -63
  548. package/src/services/export/_deprecated.ts +0 -155
  549. package/src/services/export/client.ts +0 -15
  550. package/src/services/file/_deprecated.test.ts +0 -119
  551. package/src/services/file/_deprecated.ts +0 -80
  552. package/src/services/file/client.test.ts +0 -199
  553. package/src/services/file/client.ts +0 -85
  554. package/src/services/import/_deprecated.ts +0 -115
  555. package/src/services/import/client.test.ts +0 -1015
  556. package/src/services/import/client.ts +0 -64
  557. package/src/services/message/_deprecated.test.ts +0 -398
  558. package/src/services/message/_deprecated.ts +0 -168
  559. package/src/services/message/client.test.ts +0 -410
  560. package/src/services/message/client.ts +0 -186
  561. package/src/services/plugin/_deprecated.test.ts +0 -162
  562. package/src/services/plugin/_deprecated.ts +0 -42
  563. package/src/services/plugin/client.test.ts +0 -177
  564. package/src/services/plugin/client.ts +0 -46
  565. package/src/services/session/_deprecated.test.ts +0 -440
  566. package/src/services/session/_deprecated.ts +0 -190
  567. package/src/services/session/client.test.ts +0 -413
  568. package/src/services/session/client.ts +0 -193
  569. package/src/services/thread/client.ts +0 -51
  570. package/src/services/topic/_deprecated.test.ts +0 -245
  571. package/src/services/topic/_deprecated.ts +0 -75
  572. package/src/services/topic/client.ts +0 -89
  573. package/src/services/topic/pglite.test.ts +0 -212
  574. package/src/services/user/_deprecated.test.ts +0 -101
  575. package/src/services/user/_deprecated.ts +0 -70
  576. package/src/services/user/client.test.ts +0 -108
  577. package/src/services/user/client.ts +0 -104
  578. package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
  579. package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
  580. package/src/store/global/actions/clientDb.ts +0 -67
  581. package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
  582. package/src/store/user/slices/modelList/action.test.ts +0 -359
  583. package/src/store/user/slices/modelList/action.ts +0 -223
  584. package/src/store/user/slices/modelList/initialState.ts +0 -15
  585. package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
  586. package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
  587. package/src/store/user/slices/modelList/selectors/index.ts +0 -3
  588. package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
  589. package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
  590. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
  591. package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
  592. package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
  593. package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
  594. package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
  595. package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
  596. package/src/tools/dalle/Render/Item/Error.tsx +0 -49
  597. package/src/tools/dalle/Render/Item/Image.tsx +0 -44
  598. package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
  599. package/src/tools/dalle/Render/Item/index.tsx +0 -88
  600. package/src/tools/dalle/Render/ToolBar.tsx +0 -56
  601. package/src/tools/dalle/Render/index.tsx +0 -52
  602. package/src/tools/dalle/index.ts +0 -92
  603. /package/src/{middleware.ts → proxy.ts} +0 -0
@@ -1,523 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
-
3
- import { DBModel } from '@/database/_deprecated/core/types/db';
4
- import { CreateMessageParams, MessageModel } from '@/database/_deprecated/models/message';
5
- import { DB_Message } from '@/database/_deprecated/schemas/message';
6
- import { DB_Topic } from '@/database/_deprecated/schemas/topic';
7
- import { nanoid } from '@/utils/uuid';
8
- import * as uuidUtils from '@/utils/uuid';
9
-
10
- import { CreateTopicParams, QueryTopicParams, TopicModel } from '../topic';
11
-
12
- describe('TopicModel', () => {
13
- let topicData: CreateTopicParams;
14
- const currentSessionId = 'session1';
15
- beforeEach(() => {
16
- // Set up topic data with the correct structure
17
- topicData = {
18
- sessionId: currentSessionId,
19
- title: 'Test Topic',
20
- favorite: false,
21
- };
22
- });
23
-
24
- afterEach(async () => {
25
- // Clean up the database after each test
26
- await TopicModel.clearTable();
27
- });
28
-
29
- describe('create', () => {
30
- it('should create a topic record', async () => {
31
- const result = await TopicModel.create(topicData);
32
-
33
- expect(result).toHaveProperty('id');
34
- // Verify that the topic has been added to the database
35
- const topicInDb = await TopicModel.findById(result.id);
36
-
37
- expect(topicInDb).toEqual(
38
- expect.objectContaining({
39
- title: topicData.title,
40
- favorite: topicData.favorite ? 1 : 0,
41
- sessionId: topicData.sessionId,
42
- }),
43
- );
44
- });
45
-
46
- it('should create a topic with favorite set to true', async () => {
47
- const favoriteTopicData: CreateTopicParams = {
48
- ...topicData,
49
- favorite: true,
50
- };
51
- const result = await TopicModel.create(favoriteTopicData);
52
-
53
- expect(result).toHaveProperty('id');
54
- const topicInDb = await TopicModel.findById(result.id);
55
- expect(topicInDb).toEqual(
56
- expect.objectContaining({
57
- title: favoriteTopicData.title,
58
- favorite: 1,
59
- sessionId: favoriteTopicData.sessionId,
60
- }),
61
- );
62
- });
63
-
64
- it('should update messages with the new topic id when messages are provided', async () => {
65
- const messagesToUpdate = [nanoid(), nanoid()];
66
- // 假设这些消息存在于数据库中
67
- for (const messageId of messagesToUpdate) {
68
- await MessageModel.table.add({ id: messageId, text: 'Sample message', topicId: null });
69
- }
70
-
71
- const topicDataWithMessages = {
72
- ...topicData,
73
- messages: messagesToUpdate,
74
- };
75
-
76
- const topic = await TopicModel.create(topicDataWithMessages);
77
- expect(topic).toHaveProperty('id');
78
-
79
- // 验证数据库中的消息是否已更新
80
- const updatedMessages: DB_Message[] = await MessageModel.table
81
- .where('id')
82
- .anyOf(messagesToUpdate)
83
- .toArray();
84
-
85
- expect(updatedMessages).toHaveLength(messagesToUpdate.length);
86
- for (const message of updatedMessages) {
87
- expect(message.topicId).toEqual(topic.id);
88
- }
89
- });
90
-
91
- it('should create a topic with a unique id when no id is provided', async () => {
92
- const spy = vi.spyOn(uuidUtils, 'nanoid'); // 使用 Vitest 的 spy 功能来监视 nanoid 调用
93
- const result = await TopicModel.create(topicData);
94
-
95
- expect(spy).toHaveBeenCalled(); // 验证 nanoid 被调用来生成 id
96
- expect(result).toHaveProperty('id');
97
- expect(typeof result.id).toBe('string');
98
- spy.mockRestore(); // 测试结束后恢复原始行为
99
- });
100
- });
101
- describe('batch create', () => {
102
- it('should batch create topic records', async () => {
103
- const topicsToCreate = [topicData, topicData];
104
- const results = await TopicModel.batchCreate(topicsToCreate);
105
-
106
- expect(results.ids).toHaveLength(topicsToCreate.length);
107
- // Verify that the topics have been added to the database
108
- for (const result of results.ids!) {
109
- const topicInDb = await TopicModel.findById(result);
110
- expect(topicInDb).toEqual(
111
- expect.objectContaining({
112
- title: topicData.title,
113
- favorite: topicData.favorite ? 1 : 0,
114
- sessionId: topicData.sessionId,
115
- }),
116
- );
117
- }
118
- });
119
-
120
- it('should batch create topics with mixed favorite values', async () => {
121
- const mixedTopicsData: CreateTopicParams[] = [
122
- { ...topicData, favorite: true },
123
- { ...topicData, favorite: false },
124
- ];
125
-
126
- const results = await TopicModel.batchCreate(mixedTopicsData);
127
-
128
- expect(results.ids).toHaveLength(mixedTopicsData.length);
129
- for (const id of results.ids!) {
130
- const topicInDb = await TopicModel.findById(id);
131
- expect(topicInDb).toBeDefined();
132
- expect(topicInDb.favorite).toBeGreaterThanOrEqual(0);
133
- expect(topicInDb.favorite).toBeLessThanOrEqual(1);
134
- }
135
- });
136
- });
137
-
138
- it('should query topics with pagination', async () => {
139
- // Create multiple topics to test the query method
140
- await TopicModel.batchCreate([topicData, topicData]);
141
-
142
- const queryParams: QueryTopicParams = { pageSize: 1, current: 0, containerId: 'session1' };
143
- const queriedTopics = await TopicModel.query(queryParams);
144
-
145
- expect(queriedTopics).toHaveLength(1);
146
- });
147
-
148
- it('should find topics by session id', async () => {
149
- // Create multiple topics to test the findBySessionId method
150
- await TopicModel.batchCreate([topicData, topicData]);
151
-
152
- const topicsBySessionId = await TopicModel.findBySessionId(topicData.sessionId);
153
-
154
- expect(topicsBySessionId).toHaveLength(2);
155
- expect(topicsBySessionId.every((i) => i.sessionId === topicData.sessionId)).toBeTruthy();
156
- });
157
-
158
- it('should delete a topic and its associated messages', async () => {
159
- const createdTopic = await TopicModel.create(topicData);
160
-
161
- await TopicModel.delete(createdTopic.id);
162
-
163
- // Verify the topic and its related messages are deleted
164
- const topicInDb = await TopicModel.findById(createdTopic.id);
165
- expect(topicInDb).toBeUndefined();
166
-
167
- // You need to verify that messages related to the topic are also deleted
168
- // This would require additional setup to create messages associated with the topic
169
- // and then assertions to check that they're deleted after the topic itself is deleted
170
- });
171
-
172
- it('should batch delete topics by session id', async () => {
173
- // Create multiple topics to test the batchDeleteBySessionId method
174
- await TopicModel.batchCreate([topicData, topicData]);
175
-
176
- await TopicModel.batchDeleteBySessionId(topicData.sessionId);
177
-
178
- // Verify that all topics with the given session id are deleted
179
- const topicsInDb = await TopicModel.findBySessionId(topicData.sessionId);
180
- expect(topicsInDb).toHaveLength(0);
181
- });
182
-
183
- it('should update a topic', async () => {
184
- const createdTopic = await TopicModel.create(topicData);
185
- const updateData = { title: 'New Title' };
186
-
187
- await TopicModel.update(createdTopic.id, updateData);
188
- const updatedTopic = await TopicModel.findById(createdTopic.id);
189
-
190
- expect(updatedTopic).toHaveProperty('title', 'New Title');
191
- });
192
-
193
- describe('toggleFavorite', () => {
194
- it('should toggle favorite status of a topic', async () => {
195
- const createdTopic = await TopicModel.create(topicData);
196
-
197
- const newState = await TopicModel.toggleFavorite(createdTopic.id);
198
-
199
- expect(newState).toBe(true);
200
- const topicInDb = await TopicModel.findById(createdTopic.id);
201
- expect(topicInDb).toHaveProperty('favorite', 1);
202
- });
203
-
204
- it('should handle toggleFavorite when topic does not exist', async () => {
205
- const nonExistentTopicId = 'non-existent-id';
206
- await expect(TopicModel.toggleFavorite(nonExistentTopicId)).rejects.toThrow(
207
- `Topic with id ${nonExistentTopicId} not found`,
208
- );
209
- });
210
-
211
- it('should set favorite to specific state using toggleFavorite', async () => {
212
- const createdTopic = await TopicModel.create(topicData);
213
-
214
- // Set favorite to true regardless of current state
215
- await TopicModel.toggleFavorite(createdTopic.id, true);
216
- let topicInDb = await TopicModel.findById(createdTopic.id);
217
- expect(topicInDb.favorite).toBe(1);
218
-
219
- // Set favorite to false regardless of current state
220
- await TopicModel.toggleFavorite(createdTopic.id, false);
221
- topicInDb = await TopicModel.findById(createdTopic.id);
222
- expect(topicInDb.favorite).toBe(0);
223
- });
224
- });
225
-
226
- it('should delete a topic and its associated messages', async () => {
227
- // 创建话题和相关联的消息
228
- const createdTopic = await TopicModel.create(topicData);
229
- const messageData: CreateMessageParams = {
230
- content: 'Test Message',
231
- topicId: createdTopic.id,
232
- sessionId: topicData.sessionId,
233
- role: 'user',
234
- };
235
- await MessageModel.create(messageData);
236
-
237
- // 删除话题
238
- await TopicModel.delete(createdTopic.id);
239
-
240
- // 验证话题是否被删除
241
- const topicInDb = await TopicModel.findById(createdTopic.id);
242
- expect(topicInDb).toBeUndefined();
243
-
244
- // 验证与话题关联的消息是否也被删除
245
- const messagesInDb = await MessageModel.query({
246
- sessionId: topicData.sessionId,
247
- topicId: createdTopic.id,
248
- });
249
- expect(messagesInDb).toHaveLength(0);
250
- });
251
-
252
- it('should batch delete topics and their associated messages', async () => {
253
- // 创建多个话题和相关联的消息
254
- const createdTopic1 = await TopicModel.create(topicData);
255
- const createdTopic2 = await TopicModel.create(topicData);
256
-
257
- const messageData1: CreateMessageParams = {
258
- content: 'Test Message 1',
259
- topicId: createdTopic1.id,
260
- sessionId: topicData.sessionId,
261
- role: 'user',
262
- };
263
- const messageData2: CreateMessageParams = {
264
- content: 'Test Message 2',
265
- topicId: createdTopic2.id,
266
- sessionId: topicData.sessionId,
267
- role: 'user',
268
- };
269
- await MessageModel.create(messageData1);
270
- await MessageModel.create(messageData2);
271
-
272
- // 执行批量删除
273
- await TopicModel.batchDelete([createdTopic1.id, createdTopic2.id]);
274
-
275
- // 验证话题是否被删除
276
- const topicInDb1 = await TopicModel.findById(createdTopic1.id);
277
- const topicInDb2 = await TopicModel.findById(createdTopic2.id);
278
- expect(topicInDb1).toBeUndefined();
279
- expect(topicInDb2).toBeUndefined();
280
-
281
- // 验证与话题关联的消息是否也被删除
282
- const messagesInDb1 = await MessageModel.query({
283
- sessionId: topicData.sessionId,
284
- topicId: createdTopic1.id,
285
- });
286
- const messagesInDb2 = await MessageModel.query({
287
- sessionId: topicData.sessionId,
288
- topicId: createdTopic2.id,
289
- });
290
- expect(messagesInDb1).toHaveLength(0);
291
- expect(messagesInDb2).toHaveLength(0);
292
- });
293
-
294
- describe('duplicateTopic', () => {
295
- let originalTopic: DBModel<DB_Topic>;
296
- let originalMessages: any[];
297
-
298
- beforeEach(async () => {
299
- // 创建一个原始主题
300
- const { id } = await TopicModel.create({
301
- title: 'Original Topic',
302
- sessionId: 'session1',
303
- favorite: false,
304
- });
305
- originalTopic = await TopicModel.findById(id);
306
-
307
- // 创建一些关联到原始主题的消息
308
- originalMessages = await Promise.all(
309
- ['Message 1', 'Message 2'].map((text) =>
310
- MessageModel.create({
311
- content: text,
312
- topicId: originalTopic.id,
313
- sessionId: originalTopic.sessionId!,
314
- role: 'user',
315
- }),
316
- ),
317
- );
318
- });
319
-
320
- afterEach(async () => {
321
- // 清理数据库中的所有主题和消息
322
- await TopicModel.clearTable();
323
- await MessageModel.clearTable();
324
- });
325
-
326
- it('should duplicate a topic with all associated messages', async () => {
327
- // 执行复制操作
328
- await TopicModel.duplicateTopic(originalTopic.id);
329
-
330
- // 验证复制后的主题是否存在
331
- const duplicatedTopic = await TopicModel.findBySessionId(originalTopic.sessionId!);
332
- expect(duplicatedTopic).toHaveLength(2);
333
-
334
- // 验证复制后的消息是否存在
335
- const duplicatedMessages = await MessageModel.query({
336
- sessionId: originalTopic.sessionId!,
337
- topicId: duplicatedTopic[1].id, // 假设复制的主题是第二个
338
- });
339
- expect(duplicatedMessages).toHaveLength(originalMessages.length);
340
- });
341
-
342
- it('should throw an error if the topic does not exist', async () => {
343
- // 尝试复制一个不存在的主题
344
- const nonExistentTopicId = nanoid();
345
- await expect(TopicModel.duplicateTopic(nonExistentTopicId)).rejects.toThrow(
346
- `Topic with id ${nonExistentTopicId} not found`,
347
- );
348
- });
349
-
350
- it('should preserve the properties of the duplicated topic', async () => {
351
- // 执行复制操作
352
- await TopicModel.duplicateTopic(originalTopic.id);
353
-
354
- // 获取复制的主题
355
- const topics = await TopicModel.findBySessionId(originalTopic.sessionId!);
356
- const duplicatedTopic = topics.find((topic) => topic.id !== originalTopic.id);
357
-
358
- // 验证复制的主题是否保留了原始主题的属性
359
- expect(duplicatedTopic).toBeDefined();
360
- expect(duplicatedTopic).toMatchObject({
361
- title: originalTopic.title,
362
- favorite: originalTopic.favorite,
363
- sessionId: originalTopic.sessionId,
364
- });
365
- // 确保生成了新的 ID
366
- expect(duplicatedTopic.id).not.toBe(originalTopic.id);
367
- });
368
-
369
- it('should properly handle the messages hierarchy when duplicating', async () => {
370
- // 创建一个子消息关联到其中一个原始消息
371
- const { id } = await MessageModel.create({
372
- content: 'Child Message',
373
- topicId: originalTopic.id,
374
- parentId: originalMessages[0].id,
375
- sessionId: originalTopic.sessionId!,
376
- role: 'user',
377
- });
378
- const childMessage = await MessageModel.findById(id);
379
-
380
- // 执行复制操作
381
- await TopicModel.duplicateTopic(originalTopic.id);
382
-
383
- // 获取复制的消息
384
- const duplicatedMessages = await MessageModel.queryBySessionId(originalTopic.sessionId!);
385
-
386
- // 验证复制的子消息是否存在并且 parentId 已更新
387
- const duplicatedChildMessage = duplicatedMessages.find(
388
- (message) => message.content === childMessage.content && message.id !== childMessage.id,
389
- );
390
-
391
- expect(duplicatedChildMessage).toBeDefined();
392
- expect(duplicatedChildMessage.parentId).not.toBe(childMessage.parentId);
393
- expect(duplicatedChildMessage.parentId).toBeDefined();
394
- });
395
-
396
- it('should fail if the database transaction fails', async () => {
397
- // 强制数据库事务失败,例如通过在复制过程中抛出异常
398
- const dbTransactionFailedError = new Error('DB transaction failed');
399
- const spyOn = vi.spyOn(TopicModel['db'], 'transaction').mockImplementation((async () => {
400
- throw dbTransactionFailedError;
401
- }) as any);
402
-
403
- // 尝试复制主题并捕捉期望的错误
404
- await expect(TopicModel.duplicateTopic(originalTopic.id)).rejects.toThrow(
405
- dbTransactionFailedError,
406
- );
407
- spyOn.mockRestore();
408
- });
409
-
410
- it('should not create partial duplicates if the process fails at some point', async () => {
411
- // 假设复制消息的过程中发生了错误
412
- vi.spyOn(MessageModel, 'duplicateMessages').mockImplementation(async () => {
413
- throw new Error('Failed to duplicate messages');
414
- });
415
-
416
- // 尝试复制主题,期望会抛出错误
417
- await expect(TopicModel.duplicateTopic(originalTopic.id)).rejects.toThrow();
418
-
419
- // 确保没有创建任何副本
420
- const topics = await TopicModel.findBySessionId(originalTopic.sessionId!);
421
- expect(topics).toHaveLength(1); // 只有原始主题
422
-
423
- const messages = await MessageModel.queryBySessionId(originalTopic.sessionId!);
424
- expect(messages).toHaveLength(originalMessages.length); // 只有原始消息
425
- });
426
- });
427
-
428
- describe('clearTable', () => {
429
- it('should clear the table', async () => {
430
- // Create a topic to ensure the table is not empty
431
- await TopicModel.create(topicData);
432
-
433
- // Clear the table
434
- await TopicModel.clearTable();
435
-
436
- // Verify the table is empty
437
- const topics = await TopicModel.queryAll();
438
- expect(topics).toHaveLength(0);
439
- });
440
- });
441
-
442
- describe('update', () => {
443
- it('should update a topic', async () => {
444
- // Create a topic
445
- const createdTopic = await TopicModel.create(topicData);
446
-
447
- // Update the topic
448
- const newTitle = 'Updated Title';
449
- await TopicModel.update(createdTopic.id, { title: newTitle });
450
-
451
- // Verify the topic is updated
452
- const updatedTopic = await TopicModel.findById(createdTopic.id);
453
- expect(updatedTopic.title).toBe(newTitle);
454
- });
455
- });
456
-
457
- describe('batchDelete', () => {
458
- it('should batch delete topics', async () => {
459
- // Create multiple topics
460
- const topic1 = await TopicModel.create(topicData);
461
- const topic2 = await TopicModel.create(topicData);
462
-
463
- await TopicModel.create(topicData);
464
-
465
- const ids = [topic1.id, topic2.id];
466
- // Batch delete the topics
467
- await TopicModel.batchDelete(ids);
468
-
469
- expect(await TopicModel.table.count()).toEqual(1);
470
- });
471
- });
472
-
473
- describe('queryAll', () => {
474
- it('should query all topics', async () => {
475
- // Create multiple topics
476
- await TopicModel.batchCreate([topicData, topicData]);
477
-
478
- // Query all topics
479
- const topics = await TopicModel.queryAll();
480
-
481
- // Verify all topics are queried
482
- expect(topics).toHaveLength(2);
483
- });
484
- });
485
-
486
- describe('queryByKeyword', () => {
487
- it('should query global topics by keyword', async () => {
488
- // Create a topic with a unique title
489
- const uniqueTitle = 'Unique Title';
490
- await TopicModel.create({ ...topicData, title: uniqueTitle });
491
-
492
- // Query topics by the unique title
493
- const topics = await TopicModel.queryByKeyword(uniqueTitle);
494
-
495
- // Verify the correct topic is queried
496
- expect(topics).toHaveLength(1);
497
- expect(topics[0].title).toBe(uniqueTitle);
498
- });
499
- it('should query topics in current session by keyword', async () => {
500
- // Create a topic with a unique title
501
- const uniqueTitle = 'Unique Title';
502
- await TopicModel.create({ ...topicData, title: uniqueTitle });
503
-
504
- // Query topics by the unique title
505
- const topics = await TopicModel.queryByKeyword(uniqueTitle, currentSessionId);
506
-
507
- // Verify the correct topic is queried
508
- expect(topics).toHaveLength(1);
509
- expect(topics[0].title).toBe(uniqueTitle);
510
- });
511
- it('should not query any topic in other session by keyword', async () => {
512
- // Create a topic with a unique title
513
- const uniqueTitle = 'Unique Title';
514
- await TopicModel.create({ ...topicData, title: uniqueTitle });
515
-
516
- // Query topics by the unique title
517
- const topics = await TopicModel.queryByKeyword(uniqueTitle, 'session-id-2');
518
-
519
- // Verify the correct topic is queried
520
- expect(topics).toHaveLength(0);
521
- });
522
- });
523
- });
@@ -1,82 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
-
3
- import { UserModel } from '../user';
4
-
5
- describe('UserModel', () => {
6
- let userData: any;
7
-
8
- beforeEach(() => {
9
- // Set up user data with the correct structure
10
- userData = {
11
- uuid: 'user1',
12
- settings: {},
13
- avatar: 'avatar.png',
14
- };
15
- });
16
-
17
- afterEach(async () => {
18
- // Clean up the database after each test
19
- await UserModel.clear();
20
- });
21
-
22
- it('should create a user record', async () => {
23
- const result = await UserModel.create(userData);
24
-
25
- expect(result).toEqual(1);
26
- // Verify that the user has been added to the database
27
- const userInDb = await UserModel.getUser();
28
-
29
- expect(userInDb).toEqual(
30
- expect.objectContaining({
31
- uuid: userData.uuid,
32
- settings: userData.settings,
33
- avatar: userData.avatar,
34
- }),
35
- );
36
- });
37
-
38
- it('should update a user record', async () => {
39
- const result = await UserModel.create(userData);
40
-
41
- const newAvatar = 'new_avatar.png';
42
- await UserModel.updateAvatar(newAvatar);
43
-
44
- const userInDb = await UserModel.getUser();
45
-
46
- expect(userInDb).toHaveProperty('avatar', newAvatar);
47
- });
48
-
49
- it('should update user settings', async () => {
50
- await UserModel.create(userData);
51
-
52
- await UserModel.updateSettings({ general: { themeMode: 'dark' } });
53
-
54
- const userInDb = await UserModel.getUser();
55
-
56
- expect(userInDb).toHaveProperty('settings', {
57
- general: { themeMode: 'dark' },
58
- });
59
- });
60
-
61
- it('should reset user settings', async () => {
62
- await UserModel.create(userData);
63
-
64
- await UserModel.updateSettings({ general: { themeMode: 'dark' } });
65
-
66
- await UserModel.resetSettings();
67
-
68
- const userInDb = await UserModel.getUser();
69
-
70
- expect(userInDb.settings).toBeUndefined();
71
- });
72
-
73
- it('should clear the user table', async () => {
74
- await UserModel.create(userData);
75
-
76
- await UserModel.clear();
77
-
78
- const userInDb = await UserModel.table.count();
79
-
80
- expect(userInDb).toEqual(0);
81
- });
82
- });
@@ -1,51 +0,0 @@
1
- import { DBModel } from '@/database/_deprecated/core/types/db';
2
- import { DB_File, DB_FileSchema } from '@/database/_deprecated/schemas/files';
3
- import { clientS3Storage } from '@/services/file/ClientS3';
4
- import { nanoid } from '@/utils/uuid';
5
-
6
- import { BaseModel } from '../core';
7
-
8
- class _FileModel extends BaseModel<'files'> {
9
- constructor() {
10
- super('files', DB_FileSchema);
11
- }
12
-
13
- async create(file: DB_File) {
14
- const id = nanoid();
15
-
16
- return this._addWithSync(file, `file-${id}`);
17
- }
18
-
19
- async findById(id: string): Promise<DBModel<DB_File> | undefined> {
20
- const item = await this.table.get(id);
21
- if (!item) return;
22
-
23
- // arrayBuffer to url
24
- let base64;
25
- if (!item.data) {
26
- const hash = (item.url as string).replace('client-s3://', '');
27
- base64 = await this.getBase64ByFileHash(hash);
28
- } else {
29
- base64 = Buffer.from(item.data).toString('base64');
30
- }
31
-
32
- return { ...item, base64, url: `data:${item.fileType};base64,${base64}` };
33
- }
34
-
35
- async delete(id: string) {
36
- return this.table.delete(id);
37
- }
38
-
39
- async clear() {
40
- return this.table.clear();
41
- }
42
-
43
- private async getBase64ByFileHash(hash: string) {
44
- const fileItem = await clientS3Storage.getObject(hash);
45
- if (!fileItem) throw new Error('file not found');
46
-
47
- return Buffer.from(await fileItem.arrayBuffer()).toString('base64');
48
- }
49
- }
50
-
51
- export const FileModel = new _FileModel();