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

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 (591) 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/desktop-pr-build.yml +18 -16
  5. package/.github/workflows/docker.yml +25 -20
  6. package/.github/workflows/e2e.yml +17 -3
  7. package/.github/workflows/release-desktop-beta.yml +12 -12
  8. package/.github/workflows/release.yml +2 -4
  9. package/.github/workflows/test.yml +8 -10
  10. package/.nvmrc +1 -1
  11. package/CHANGELOG.md +459 -0
  12. package/Dockerfile +1 -3
  13. package/README.md +2 -45
  14. package/README.zh-CN.md +2 -45
  15. package/apps/desktop/src/main/utils/next-electron-rsc.ts +7 -5
  16. package/apps/desktop/tsconfig.json +0 -1
  17. package/changelog/v1.json +150 -0
  18. package/docs/development/database-schema.dbml +11 -1
  19. package/docs/self-hosting/advanced/auth/next-auth/auth0.mdx +2 -2
  20. package/docs/self-hosting/advanced/auth/next-auth/auth0.zh-CN.mdx +2 -2
  21. package/docs/self-hosting/advanced/auth/next-auth/authelia.mdx +2 -2
  22. package/docs/self-hosting/advanced/auth/next-auth/authelia.zh-CN.mdx +2 -2
  23. package/docs/self-hosting/advanced/auth/next-auth/authentik.mdx +2 -2
  24. package/docs/self-hosting/advanced/auth/next-auth/authentik.zh-CN.mdx +2 -2
  25. package/docs/self-hosting/advanced/auth/next-auth/casdoor.mdx +2 -2
  26. package/docs/self-hosting/advanced/auth/next-auth/casdoor.zh-CN.mdx +2 -2
  27. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.mdx +2 -2
  28. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.zh-CN.mdx +2 -2
  29. package/docs/self-hosting/advanced/auth/next-auth/github.mdx +2 -2
  30. package/docs/self-hosting/advanced/auth/next-auth/github.zh-CN.mdx +2 -2
  31. package/docs/self-hosting/advanced/auth/next-auth/google.mdx +32 -29
  32. package/docs/self-hosting/advanced/auth/next-auth/keycloak.mdx +2 -2
  33. package/docs/self-hosting/advanced/auth/next-auth/keycloak.zh-CN.mdx +2 -2
  34. package/docs/self-hosting/advanced/auth/next-auth/logto.mdx +5 -3
  35. package/docs/self-hosting/advanced/auth/next-auth/logto.zh-CN.mdx +5 -3
  36. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.mdx +2 -2
  37. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.zh-CN.mdx +2 -2
  38. package/docs/self-hosting/advanced/auth/next-auth/okta.mdx +2 -2
  39. package/docs/self-hosting/advanced/auth/next-auth/okta.zh-CN.mdx +2 -2
  40. package/docs/self-hosting/advanced/auth/next-auth/wechat.mdx +2 -2
  41. package/docs/self-hosting/advanced/auth/next-auth/wechat.zh-CN.mdx +2 -2
  42. package/docs/self-hosting/advanced/auth/next-auth/zitadel.mdx +2 -2
  43. package/docs/self-hosting/advanced/auth/next-auth/zitadel.zh-CN.mdx +2 -2
  44. package/docs/self-hosting/advanced/auth.mdx +32 -21
  45. package/docs/self-hosting/advanced/auth.zh-CN.mdx +30 -19
  46. package/docs/self-hosting/advanced/feature-flags.mdx +0 -1
  47. package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +0 -1
  48. package/docs/self-hosting/advanced/online-search.mdx +30 -25
  49. package/docs/self-hosting/advanced/online-search.zh-CN.mdx +25 -23
  50. package/e2e/src/features/discover/smoke.feature +34 -1
  51. package/e2e/src/steps/discover/smoke.steps.ts +116 -4
  52. package/e2e/tsconfig.json +0 -1
  53. package/locales/ar/models.json +15 -6
  54. package/locales/ar/oauth.json +1 -0
  55. package/locales/bg-BG/models.json +15 -6
  56. package/locales/bg-BG/oauth.json +1 -0
  57. package/locales/de-DE/models.json +15 -6
  58. package/locales/de-DE/oauth.json +1 -0
  59. package/locales/en-US/models.json +15 -6
  60. package/locales/en-US/oauth.json +1 -0
  61. package/locales/es-ES/models.json +15 -6
  62. package/locales/es-ES/oauth.json +1 -0
  63. package/locales/fa-IR/models.json +15 -6
  64. package/locales/fa-IR/oauth.json +1 -0
  65. package/locales/fr-FR/models.json +15 -6
  66. package/locales/fr-FR/oauth.json +1 -0
  67. package/locales/it-IT/models.json +15 -6
  68. package/locales/it-IT/oauth.json +1 -0
  69. package/locales/ja-JP/models.json +15 -6
  70. package/locales/ja-JP/oauth.json +1 -0
  71. package/locales/ko-KR/models.json +21 -12
  72. package/locales/ko-KR/oauth.json +1 -0
  73. package/locales/nl-NL/models.json +15 -6
  74. package/locales/nl-NL/oauth.json +1 -0
  75. package/locales/pl-PL/models.json +15 -6
  76. package/locales/pl-PL/oauth.json +1 -0
  77. package/locales/pt-BR/models.json +15 -6
  78. package/locales/pt-BR/oauth.json +1 -0
  79. package/locales/ru-RU/models.json +15 -6
  80. package/locales/ru-RU/oauth.json +1 -0
  81. package/locales/tr-TR/models.json +15 -6
  82. package/locales/tr-TR/oauth.json +1 -0
  83. package/locales/vi-VN/models.json +15 -6
  84. package/locales/vi-VN/oauth.json +1 -0
  85. package/locales/zh-CN/models.json +15 -6
  86. package/locales/zh-CN/oauth.json +1 -0
  87. package/locales/zh-TW/models.json +15 -6
  88. package/locales/zh-TW/oauth.json +1 -0
  89. package/next.config.ts +2 -3
  90. package/package.json +74 -80
  91. package/packages/const/src/index.ts +0 -1
  92. package/packages/const/src/models.ts +13 -0
  93. package/packages/const/src/url.ts +1 -4
  94. package/packages/const/src/version.ts +3 -3
  95. package/packages/context-engine/src/index.ts +1 -6
  96. package/packages/context-engine/src/processors/GroupMessageFlatten.ts +12 -2
  97. package/packages/context-engine/src/processors/__tests__/GroupMessageFlatten.test.ts +73 -9
  98. package/packages/context-engine/src/providers/index.ts +0 -2
  99. package/packages/database/migrations/0041_improve_index.sql +10 -0
  100. package/packages/database/migrations/meta/0041_snapshot.json +7784 -0
  101. package/packages/database/migrations/meta/_journal.json +7 -0
  102. package/packages/database/package.json +1 -1
  103. package/packages/database/src/core/migrations.json +17 -0
  104. package/packages/database/src/core/web-server.ts +2 -1
  105. package/packages/database/src/models/__tests__/message.grouping.test.ts +812 -0
  106. package/packages/database/src/models/__tests__/message.test.ts +322 -170
  107. package/packages/database/src/models/message.ts +62 -24
  108. package/packages/database/src/models/session.ts +60 -19
  109. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  110. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  111. package/packages/database/src/schemas/agent.ts +10 -11
  112. package/packages/database/src/schemas/message.ts +5 -1
  113. package/packages/database/src/schemas/relations.ts +6 -4
  114. package/packages/database/src/schemas/session.ts +2 -0
  115. package/packages/database/src/schemas/topic.ts +6 -1
  116. package/packages/database/src/utils/__tests__/groupMessages.test.ts +145 -2
  117. package/packages/database/src/utils/groupMessages.ts +7 -5
  118. package/packages/electron-client-ipc/package.json +4 -1
  119. package/packages/file-loaders/package.json +1 -0
  120. package/packages/memory-extract/package.json +1 -1
  121. package/packages/model-bank/src/aiModels/anthropic.ts +0 -63
  122. package/packages/model-bank/src/aiModels/azure.ts +155 -0
  123. package/packages/model-bank/src/aiModels/bedrock.ts +44 -0
  124. package/packages/model-bank/src/aiModels/higress.ts +0 -55
  125. package/packages/model-bank/src/aiModels/infiniai.ts +21 -0
  126. package/packages/model-bank/src/aiModels/ollamacloud.ts +13 -0
  127. package/packages/model-bank/src/aiModels/siliconcloud.ts +19 -0
  128. package/packages/model-runtime/src/core/parameterResolver.ts +3 -0
  129. package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +0 -38
  130. package/packages/model-runtime/src/providers/azureOpenai/index.ts +2 -1
  131. package/packages/model-runtime/src/providers/minimax/index.ts +5 -5
  132. package/packages/model-runtime/src/providers/search1api/index.test.ts +2 -2
  133. package/packages/model-runtime/src/utils/googleErrorParser.test.ts +125 -0
  134. package/packages/model-runtime/src/utils/googleErrorParser.ts +103 -77
  135. package/packages/types/src/message/common/base.ts +13 -0
  136. package/packages/types/src/message/common/image.ts +8 -0
  137. package/packages/types/src/message/common/metadata.ts +39 -0
  138. package/packages/types/src/message/common/tools.ts +10 -0
  139. package/packages/types/src/message/db/params.ts +47 -1
  140. package/packages/types/src/message/ui/chat.ts +4 -1
  141. package/packages/types/src/message/ui/params.ts +98 -4
  142. package/packages/types/src/search.ts +16 -0
  143. package/packages/types/src/serverConfig.ts +2 -6
  144. package/packages/types/src/user/index.ts +13 -1
  145. package/packages/types/src/user/settings/index.ts +22 -0
  146. package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
  147. package/packages/web-crawler/tsconfig.json +0 -1
  148. package/scripts/migrateServerDB/errorHint.js +1 -7
  149. package/scripts/migrateServerDB/index.ts +2 -1
  150. package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
  151. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
  152. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  153. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
  154. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  155. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
  156. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
  157. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
  158. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
  159. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  160. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
  161. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  162. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  163. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  164. package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
  165. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
  166. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
  167. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
  168. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
  169. package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
  170. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
  171. package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
  172. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  173. package/src/app/[variants]/(main)/labs/components/LabCard.tsx +3 -1
  174. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  175. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  176. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  177. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  178. package/src/app/[variants]/(main)/settings/_layout/SettingsContent.tsx +0 -3
  179. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  180. package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +5 -7
  181. package/src/app/[variants]/layout.tsx +1 -0
  182. package/src/app/[variants]/loading/index.tsx +1 -10
  183. package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
  184. package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
  185. package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
  186. package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
  187. package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
  188. package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
  189. package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +9 -1
  190. package/src/app/sitemap.tsx +7 -1
  191. package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
  192. package/src/components/Link.tsx +12 -0
  193. package/src/components/Thinking/index.tsx +4 -3
  194. package/src/config/db.ts +0 -5
  195. package/src/config/featureFlags/schema.test.ts +0 -2
  196. package/src/config/featureFlags/schema.ts +0 -6
  197. package/src/config/modelProviders/ai21.ts +1 -16
  198. package/src/config/modelProviders/ai302.ts +1 -128
  199. package/src/config/modelProviders/ai360.ts +1 -32
  200. package/src/config/modelProviders/anthropic.ts +1 -94
  201. package/src/config/modelProviders/azure.ts +1 -51
  202. package/src/config/modelProviders/baichuan.ts +1 -57
  203. package/src/config/modelProviders/bedrock.ts +1 -276
  204. package/src/config/modelProviders/cloudflare.ts +1 -64
  205. package/src/config/modelProviders/deepseek.ts +1 -19
  206. package/src/config/modelProviders/fireworksai.ts +1 -174
  207. package/src/config/modelProviders/giteeai.ts +1 -135
  208. package/src/config/modelProviders/github.ts +1 -254
  209. package/src/config/modelProviders/google.ts +1 -130
  210. package/src/config/modelProviders/groq.ts +1 -119
  211. package/src/config/modelProviders/higress.ts +1 -1736
  212. package/src/config/modelProviders/huggingface.ts +1 -54
  213. package/src/config/modelProviders/hunyuan.ts +1 -83
  214. package/src/config/modelProviders/infiniai.ts +1 -74
  215. package/src/config/modelProviders/internlm.ts +1 -20
  216. package/src/config/modelProviders/minimax.ts +1 -1
  217. package/src/config/modelProviders/mistral.ts +1 -95
  218. package/src/config/modelProviders/modelscope.ts +1 -27
  219. package/src/config/modelProviders/moonshot.ts +1 -29
  220. package/src/config/modelProviders/novita.ts +1 -105
  221. package/src/config/modelProviders/ollama.ts +1 -325
  222. package/src/config/modelProviders/openai.ts +1 -242
  223. package/src/config/modelProviders/openrouter.ts +1 -240
  224. package/src/config/modelProviders/perplexity.ts +1 -45
  225. package/src/config/modelProviders/ppio.ts +1 -152
  226. package/src/config/modelProviders/qiniu.ts +2 -19
  227. package/src/config/modelProviders/qwen.ts +1 -245
  228. package/src/config/modelProviders/search1api.ts +1 -34
  229. package/src/config/modelProviders/sensenova.ts +1 -69
  230. package/src/config/modelProviders/siliconcloud.ts +1 -417
  231. package/src/config/modelProviders/spark.ts +1 -59
  232. package/src/config/modelProviders/stepfun.ts +1 -98
  233. package/src/config/modelProviders/taichu.ts +1 -18
  234. package/src/config/modelProviders/togetherai.ts +1 -274
  235. package/src/config/modelProviders/upstage.ts +1 -28
  236. package/src/config/modelProviders/wenxin.ts +1 -140
  237. package/src/config/modelProviders/xai.ts +1 -38
  238. package/src/config/modelProviders/zeroone.ts +1 -81
  239. package/src/config/modelProviders/zhipu.ts +1 -108
  240. package/src/envs/app.ts +5 -8
  241. package/src/envs/auth.ts +0 -179
  242. package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
  243. package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
  244. package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
  245. package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
  246. package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
  247. package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
  248. package/src/features/Conversation/Error/index.tsx +15 -5
  249. package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
  250. package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
  251. package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
  252. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
  253. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
  254. package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
  255. package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
  256. package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
  257. package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
  258. package/src/features/Conversation/Messages/Default.tsx +2 -2
  259. package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
  260. package/src/features/Conversation/Messages/User/index.tsx +4 -4
  261. package/src/features/Conversation/Messages/index.tsx +3 -3
  262. package/src/features/Conversation/components/AutoScroll.tsx +2 -2
  263. package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
  264. package/src/features/DataImporter/index.tsx +15 -60
  265. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  266. package/src/features/PluginTag/index.tsx +1 -3
  267. package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
  268. package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
  269. package/src/helpers/isCanUseFC.ts +0 -8
  270. package/src/hooks/useEnabledChatModels.ts +0 -8
  271. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  272. package/src/hooks/useModelContextWindowTokens.ts +0 -8
  273. package/src/hooks/useModelHasContextWindowToken.ts +1 -10
  274. package/src/hooks/useModelSupportFiles.ts +1 -11
  275. package/src/hooks/useModelSupportReasoning.ts +1 -11
  276. package/src/hooks/useModelSupportToolUse.ts +1 -11
  277. package/src/hooks/useModelSupportVision.ts +1 -11
  278. package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
  279. package/src/libs/next-auth/auth.config.ts +3 -6
  280. package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
  281. package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
  282. package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
  283. package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
  284. package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
  285. package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
  286. package/src/libs/next-auth/sso-providers/github.ts +0 -6
  287. package/src/libs/next-auth/sso-providers/google.ts +0 -2
  288. package/src/libs/next-auth/sso-providers/index.ts +0 -2
  289. package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
  290. package/src/libs/next-auth/sso-providers/logto.ts +3 -5
  291. package/src/libs/next-auth/sso-providers/okta.ts +0 -4
  292. package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
  293. package/src/libs/oidc-provider/provider.ts +1 -1
  294. package/src/libs/trpc/client/index.ts +0 -1
  295. package/src/libs/trpc/client/lambda.ts +8 -5
  296. package/src/libs/trpc/lambda/context.ts +4 -1
  297. package/src/locales/default/oauth.ts +1 -0
  298. package/src/server/globalConfig/index.ts +0 -23
  299. package/src/server/modules/AssistantStore/index.ts +1 -1
  300. package/src/server/modules/ModelRuntime/trace.ts +11 -4
  301. package/src/server/routers/desktop/mcp.ts +1 -3
  302. package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +0 -41
  303. package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
  304. package/src/server/routers/lambda/config/index.test.ts +38 -30
  305. package/src/server/routers/lambda/message.ts +17 -13
  306. package/src/server/routers/lambda/session.ts +8 -5
  307. package/src/server/routers/lambda/user.ts +24 -25
  308. package/src/server/routers/tools/mcp.ts +2 -3
  309. package/src/server/routers/tools/search.test.ts +1 -7
  310. package/src/server/routers/tools/search.ts +1 -4
  311. package/src/server/services/search/impls/firecrawl/index.ts +51 -11
  312. package/src/server/services/search/impls/firecrawl/type.ts +60 -9
  313. package/src/services/__tests__/tool.test.ts +0 -3
  314. package/src/services/aiModel/index.test.ts +0 -3
  315. package/src/services/aiModel/index.ts +1 -7
  316. package/src/services/aiProvider/index.test.ts +0 -3
  317. package/src/services/aiProvider/index.ts +1 -7
  318. package/src/services/chat/chat.test.ts +13 -40
  319. package/src/services/chat/contextEngineering.test.ts +0 -30
  320. package/src/services/chat/contextEngineering.ts +1 -12
  321. package/src/services/chat/helper.ts +7 -31
  322. package/src/services/chat/index.ts +2 -7
  323. package/src/services/chat/types.ts +1 -1
  324. package/src/services/chatGroup/index.ts +1 -10
  325. package/src/services/config.ts +1 -65
  326. package/src/services/export/index.ts +1 -4
  327. package/src/services/file/index.ts +1 -11
  328. package/src/services/import/index.ts +1 -7
  329. package/src/services/message/index.ts +1 -11
  330. package/src/services/message/server.ts +7 -6
  331. package/src/services/message/type.ts +6 -3
  332. package/src/services/models.ts +2 -11
  333. package/src/services/plugin/index.ts +1 -11
  334. package/src/services/session/index.ts +1 -11
  335. package/src/services/tableViewer/client.ts +12 -15
  336. package/src/services/thread/index.ts +1 -7
  337. package/src/services/topic/index.ts +1 -11
  338. package/src/services/user/index.ts +1 -13
  339. package/src/store/chat/helpers.test.ts +99 -0
  340. package/src/store/chat/helpers.ts +21 -2
  341. package/src/store/chat/selectors.ts +1 -1
  342. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  343. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  344. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  345. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +45 -155
  346. package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
  347. package/src/store/chat/slices/message/action.test.ts +5 -1
  348. package/src/store/chat/slices/message/action.ts +102 -14
  349. package/src/store/chat/slices/message/reducer.test.ts +363 -5
  350. package/src/store/chat/slices/message/reducer.ts +87 -3
  351. package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
  352. package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
  353. package/src/store/chat/slices/message/selectors/index.ts +2 -0
  354. package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
  355. package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
  356. package/src/store/chat/slices/plugin/action.test.ts +34 -132
  357. package/src/store/chat/slices/plugin/action.ts +1 -44
  358. package/src/store/global/store.ts +1 -7
  359. package/src/store/tool/selectors/tool.test.ts +1 -1
  360. package/src/store/tool/selectors/tool.ts +6 -8
  361. package/src/store/tool/slices/builtin/action.test.ts +83 -35
  362. package/src/store/tool/slices/builtin/action.ts +0 -9
  363. package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
  364. package/src/store/tool/slices/builtin/selectors.ts +15 -21
  365. package/src/store/user/initialState.ts +1 -7
  366. package/src/store/user/selectors.ts +1 -5
  367. package/src/store/user/slices/common/action.test.ts +1 -4
  368. package/src/store/user/slices/common/action.ts +5 -4
  369. package/src/store/user/slices/settings/selectors/index.ts +1 -0
  370. package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
  371. package/src/store/user/store.ts +0 -3
  372. package/src/tools/index.ts +0 -6
  373. package/src/tools/renders.ts +0 -3
  374. package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
  375. package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
  376. package/tsconfig.json +9 -3
  377. package/packages/const/src/guide.ts +0 -89
  378. package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
  379. package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
  380. package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
  381. package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
  382. package/packages/utils/src/_deprecated/parseModels.ts +0 -165
  383. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  384. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  385. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  386. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  387. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  388. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  389. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  390. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  391. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  392. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  393. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  394. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  395. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  396. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  397. package/src/app/[variants]/(main)/settings/llm/ProviderList/Azure/index.tsx +0 -93
  398. package/src/app/[variants]/(main)/settings/llm/ProviderList/Bedrock/index.tsx +0 -70
  399. package/src/app/[variants]/(main)/settings/llm/ProviderList/Cloudflare/index.tsx +0 -39
  400. package/src/app/[variants]/(main)/settings/llm/ProviderList/Github/index.tsx +0 -52
  401. package/src/app/[variants]/(main)/settings/llm/ProviderList/HuggingFace/index.tsx +0 -52
  402. package/src/app/[variants]/(main)/settings/llm/ProviderList/Ollama/index.tsx +0 -20
  403. package/src/app/[variants]/(main)/settings/llm/ProviderList/OpenAI/index.tsx +0 -17
  404. package/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx +0 -132
  405. package/src/app/[variants]/(main)/settings/llm/components/Checker.tsx +0 -118
  406. package/src/app/[variants]/(main)/settings/llm/components/ProviderConfig/index.tsx +0 -303
  407. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/CustomModelOption.tsx +0 -98
  408. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/Form.tsx +0 -104
  409. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/index.tsx +0 -77
  410. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelFetcher.tsx +0 -105
  411. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/Option.tsx +0 -68
  412. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/index.tsx +0 -146
  413. package/src/app/[variants]/(main)/settings/llm/const.ts +0 -20
  414. package/src/app/[variants]/(main)/settings/llm/features/Footer.tsx +0 -35
  415. package/src/app/[variants]/(main)/settings/llm/index.tsx +0 -30
  416. package/src/app/[variants]/(main)/settings/llm/type.ts +0 -5
  417. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  418. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  419. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  420. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  421. package/src/components/InnerLink.tsx +0 -20
  422. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  423. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  424. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  425. package/src/database/_deprecated/core/db.ts +0 -246
  426. package/src/database/_deprecated/core/index.ts +0 -2
  427. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  428. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  429. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  430. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  431. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  432. package/src/database/_deprecated/core/model.ts +0 -218
  433. package/src/database/_deprecated/core/schemas.ts +0 -88
  434. package/src/database/_deprecated/core/types/db.ts +0 -15
  435. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  436. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  437. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  438. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  439. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  440. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  441. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  442. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  443. package/src/database/_deprecated/models/file.ts +0 -51
  444. package/src/database/_deprecated/models/message.ts +0 -277
  445. package/src/database/_deprecated/models/plugin.ts +0 -62
  446. package/src/database/_deprecated/models/session.ts +0 -271
  447. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  448. package/src/database/_deprecated/models/topic.ts +0 -250
  449. package/src/database/_deprecated/models/user.ts +0 -69
  450. package/src/database/_deprecated/schemas/files.ts +0 -39
  451. package/src/database/_deprecated/schemas/message.ts +0 -50
  452. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  453. package/src/database/_deprecated/schemas/session.ts +0 -54
  454. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  455. package/src/database/_deprecated/schemas/topic.ts +0 -12
  456. package/src/database/_deprecated/schemas/user.ts +0 -40
  457. package/src/envs/__tests__/auth.test.ts +0 -200
  458. package/src/features/DataImporter/_deprecated.ts +0 -43
  459. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  460. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  461. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  462. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  463. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  464. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  465. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  466. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  467. package/src/features/InitClientDB/index.tsx +0 -37
  468. package/src/hooks/_header.ts +0 -23
  469. package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
  470. package/src/libs/trpc/client/edge.ts +0 -26
  471. package/src/libs/trpc/edge/context.ts +0 -71
  472. package/src/libs/trpc/edge/index.ts +0 -45
  473. package/src/libs/trpc/edge/init.ts +0 -26
  474. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  475. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  476. package/src/migrations/FromV0ToV1.ts +0 -10
  477. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  478. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  479. package/src/migrations/FromV1ToV2/index.ts +0 -82
  480. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  481. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  482. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  483. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  484. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  485. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  486. package/src/migrations/FromV2ToV3/index.ts +0 -30
  487. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  488. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  489. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  490. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  491. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  492. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  493. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  494. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  495. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  496. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  497. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  498. package/src/migrations/FromV3ToV4/index.ts +0 -102
  499. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  500. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  501. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  502. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  503. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  504. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  505. package/src/migrations/FromV4ToV5/index.ts +0 -58
  506. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  507. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  508. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  509. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  510. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  511. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  512. package/src/migrations/FromV5ToV6/index.ts +0 -61
  513. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  514. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  515. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  516. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  517. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  518. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  519. package/src/migrations/FromV6ToV7/index.ts +0 -101
  520. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  521. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  522. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  523. package/src/migrations/VersionController.test.ts +0 -88
  524. package/src/migrations/VersionController.ts +0 -67
  525. package/src/migrations/index.ts +0 -61
  526. package/src/server/globalConfig/_deprecated.test.ts +0 -92
  527. package/src/server/globalConfig/_deprecated.ts +0 -41
  528. package/src/server/routers/edge/appStatus.ts +0 -3
  529. package/src/server/routers/edge/index.ts +0 -14
  530. package/src/server/routers/edge/upload.ts +0 -16
  531. package/src/services/aiModel/client.ts +0 -70
  532. package/src/services/aiProvider/client.ts +0 -58
  533. package/src/services/baseClientService/index.ts +0 -9
  534. package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
  535. package/src/services/chatGroup/client.ts +0 -63
  536. package/src/services/export/_deprecated.ts +0 -155
  537. package/src/services/export/client.ts +0 -15
  538. package/src/services/file/_deprecated.test.ts +0 -119
  539. package/src/services/file/_deprecated.ts +0 -80
  540. package/src/services/file/client.test.ts +0 -199
  541. package/src/services/file/client.ts +0 -85
  542. package/src/services/import/_deprecated.ts +0 -115
  543. package/src/services/import/client.test.ts +0 -1015
  544. package/src/services/import/client.ts +0 -64
  545. package/src/services/message/_deprecated.test.ts +0 -398
  546. package/src/services/message/_deprecated.ts +0 -168
  547. package/src/services/message/client.test.ts +0 -410
  548. package/src/services/message/client.ts +0 -186
  549. package/src/services/plugin/_deprecated.test.ts +0 -162
  550. package/src/services/plugin/_deprecated.ts +0 -42
  551. package/src/services/plugin/client.test.ts +0 -177
  552. package/src/services/plugin/client.ts +0 -46
  553. package/src/services/session/_deprecated.test.ts +0 -440
  554. package/src/services/session/_deprecated.ts +0 -190
  555. package/src/services/session/client.test.ts +0 -413
  556. package/src/services/session/client.ts +0 -193
  557. package/src/services/thread/client.ts +0 -51
  558. package/src/services/topic/_deprecated.test.ts +0 -245
  559. package/src/services/topic/_deprecated.ts +0 -75
  560. package/src/services/topic/client.ts +0 -89
  561. package/src/services/topic/pglite.test.ts +0 -212
  562. package/src/services/user/_deprecated.test.ts +0 -101
  563. package/src/services/user/_deprecated.ts +0 -70
  564. package/src/services/user/client.test.ts +0 -108
  565. package/src/services/user/client.ts +0 -104
  566. package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
  567. package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
  568. package/src/store/global/actions/clientDb.ts +0 -67
  569. package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
  570. package/src/store/user/slices/modelList/action.test.ts +0 -359
  571. package/src/store/user/slices/modelList/action.ts +0 -223
  572. package/src/store/user/slices/modelList/initialState.ts +0 -15
  573. package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
  574. package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
  575. package/src/store/user/slices/modelList/selectors/index.ts +0 -3
  576. package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
  577. package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
  578. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
  579. package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
  580. package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
  581. package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
  582. package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
  583. package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
  584. package/src/tools/dalle/Render/Item/Error.tsx +0 -49
  585. package/src/tools/dalle/Render/Item/Image.tsx +0 -44
  586. package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
  587. package/src/tools/dalle/Render/Item/index.tsx +0 -88
  588. package/src/tools/dalle/Render/ToolBar.tsx +0 -56
  589. package/src/tools/dalle/Render/index.tsx +0 -52
  590. package/src/tools/dalle/index.ts +0 -92
  591. /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();