@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,413 +0,0 @@
1
- import { eq, not } from 'drizzle-orm';
2
- import { Mock, beforeEach, describe, expect, it, vi } from 'vitest';
3
-
4
- import { INBOX_SESSION_ID } from '@/const/session';
5
- import { clientDB, initializeDB } from '@/database/client/db';
6
- import {
7
- NewSession,
8
- SessionItem,
9
- agents,
10
- agentsToSessions,
11
- sessionGroups,
12
- sessions,
13
- users,
14
- } from '@/database/schemas';
15
- import { LobeAgentChatConfig, LobeAgentConfig } from '@/types/agent';
16
- import { LobeAgentSession, LobeSessionType, SessionGroups } from '@/types/session';
17
-
18
- import { ClientService } from './client';
19
-
20
- const userId = 'message-db';
21
- const sessionService = new ClientService(userId);
22
-
23
- const mockSessionId = 'mock-session-id';
24
- const mockAgentId = 'agent-id';
25
-
26
- // Mock data
27
- beforeEach(async () => {
28
- await initializeDB();
29
-
30
- // 在每个测试用例之前,清空表
31
- await clientDB.transaction(async (trx) => {
32
- await trx.insert(users).values([{ id: userId }, { id: '456' }]);
33
- await trx.insert(sessions).values([{ id: mockSessionId, userId }]);
34
- await trx.insert(agents).values([{ id: mockAgentId, userId }]);
35
- await trx
36
- .insert(agentsToSessions)
37
- .values([{ agentId: mockAgentId, sessionId: mockSessionId, userId }]);
38
- await trx.insert(sessionGroups).values([
39
- { id: 'group-1', name: 'group-A', sort: 2, userId },
40
- { id: 'group-2', name: 'group-B', sort: 1, userId },
41
- { id: 'group-4', name: 'group-C', sort: 1, userId: '456' },
42
- ]);
43
- });
44
- });
45
-
46
- afterEach(async () => {
47
- // 在每个测试用例之后,清空表
48
- await clientDB.delete(users);
49
- });
50
-
51
- describe('SessionService', () => {
52
- const mockSession = {
53
- id: mockSessionId,
54
- type: 'agent',
55
- meta: { title: 'Mock Session' },
56
- } as LobeAgentSession;
57
-
58
- describe('createSession', () => {
59
- it('should create a new session and return its id', async () => {
60
- // Setup
61
- const sessionType = LobeSessionType.Agent;
62
- const defaultValue = { meta: { title: 'New Session' } } as Partial<LobeAgentSession>;
63
-
64
- // Execute
65
- const sessionId = await sessionService.createSession(sessionType, defaultValue);
66
-
67
- // Assert
68
- expect(sessionId).toMatch(/^ssn_/);
69
- });
70
- });
71
-
72
- describe('removeSession', () => {
73
- it('should remove a session by its id', async () => {
74
- // Execute
75
- await sessionService.removeSession(mockSessionId);
76
-
77
- // Assert
78
-
79
- const result = await clientDB.query.sessions.findFirst({
80
- where: eq(sessions.id, mockSessionId),
81
- });
82
- // Assert
83
- expect(result).toBeUndefined();
84
- });
85
- });
86
-
87
- describe('removeAllSessions', () => {
88
- it('should clear all sessions from the table', async () => {
89
- // Setup
90
- await clientDB
91
- .insert(sessions)
92
- .values([{ userId: userId }, { userId: userId }, { userId: userId }]);
93
-
94
- // Execute
95
- await sessionService.removeAllSessions();
96
-
97
- // Assert
98
- const result = await clientDB.query.sessions.findMany({
99
- where: eq(sessionGroups.userId, userId),
100
- });
101
-
102
- expect(result.length).toBe(0);
103
- });
104
- });
105
-
106
- describe('updateSession', () => {
107
- it('should update the group of a session', async () => {
108
- // Setup
109
- const groupId = 'group-1';
110
-
111
- // Execute
112
- await sessionService.updateSession(mockSessionId, { group: groupId });
113
-
114
- // Assert
115
- const result = await clientDB.query.sessions.findFirst({
116
- where: eq(sessions.id, mockSessionId),
117
- });
118
- expect(result).toMatchObject({ groupId });
119
- });
120
-
121
- it('should update the pinned status of a session', async () => {
122
- // Setup
123
- const pinned = true;
124
-
125
- // Execute
126
- await sessionService.updateSession(mockSessionId, { pinned });
127
-
128
- // Assert
129
- const result = await clientDB.query.sessions.findFirst({
130
- where: eq(sessions.id, mockSessionId),
131
- });
132
-
133
- expect(result!.pinned).toBeTruthy();
134
- });
135
- });
136
-
137
- describe('updateSessionConfig', () => {
138
- it('should update the config of a session', async () => {
139
- // Setup
140
- const newConfig = { model: 'abc' } as LobeAgentConfig;
141
-
142
- // Execute
143
- await sessionService.updateSessionConfig(mockSessionId, newConfig);
144
-
145
- // Assert
146
- const result = await sessionService.getSessionConfig(mockSessionId);
147
- expect(result).toMatchObject(newConfig);
148
- });
149
- });
150
-
151
- describe('countSessions', () => {
152
- it('should return false if no sessions exist', async () => {
153
- await clientDB.delete(sessions);
154
-
155
- // Execute
156
- const result = await sessionService.countSessions();
157
-
158
- // Assert
159
- expect(result).toBe(0);
160
- });
161
-
162
- it('should return true if sessions exist', async () => {
163
- // Setup
164
- await clientDB.delete(sessions);
165
- await clientDB.insert(sessions).values([{ userId }]);
166
-
167
- // Execute
168
- const result = await sessionService.countSessions();
169
-
170
- // Assert
171
- expect(result).toBe(1);
172
- });
173
- });
174
-
175
- describe('searchSessions', () => {
176
- it('should return sessions that match the keyword', async () => {
177
- // Setup
178
- await clientDB.insert(agents).values({ userId, id: 'agent-1', title: 'Session Name' });
179
- await clientDB
180
- .insert(agentsToSessions)
181
- .values({ agentId: 'agent-1', sessionId: mockSessionId, userId });
182
-
183
- // Execute
184
- const keyword = 'Name';
185
- const result = await sessionService.searchSessions(keyword);
186
-
187
- // Assert
188
- // TODO: 后续需要把这个搜索的标题和描述都加上,现在这个 client 搜索会有问题
189
- expect(result).toMatchObject([{ id: mockSessionId }]);
190
- });
191
- });
192
-
193
- describe('cloneSession', () => {
194
- it('should duplicate a session and return its id', async () => {
195
- // Setup
196
- const newTitle = 'Duplicated Session';
197
- const session: NewSession = {
198
- id: 'duplicated-session-id',
199
- title: '123',
200
- userId,
201
- };
202
- await clientDB.insert(sessions).values([session]);
203
- await clientDB.insert(agents).values({ userId, id: 'agent-1' });
204
- await clientDB
205
- .insert(agentsToSessions)
206
- .values({ agentId: 'agent-1', sessionId: 'duplicated-session-id', userId });
207
-
208
- // Execute
209
- const duplicatedSessionId = await sessionService.cloneSession(mockSessionId, newTitle);
210
-
211
- // Assert
212
-
213
- const result = await clientDB.query.sessions.findFirst({
214
- where: eq(sessions.id, duplicatedSessionId!),
215
- });
216
- expect(result).toMatchObject({ title: 'Duplicated Session' });
217
- });
218
- });
219
-
220
- describe('getGroupedSessions', () => {
221
- it('should retrieve sessions with their group', async () => {
222
- // Execute
223
- const sessionsWithGroup = await sessionService.getGroupedSessions();
224
-
225
- expect(sessionsWithGroup).toMatchObject({
226
- sessionGroups: [
227
- { id: 'group-2', name: 'group-B', sort: 1 },
228
- { id: 'group-1', name: 'group-A', sort: 2 },
229
- ],
230
- sessions: [{ id: 'mock-session-id', type: 'agent' }],
231
- });
232
- });
233
- });
234
-
235
- describe('getSessionsByType', () => {
236
- it('should get sessions by type "all"', async () => {
237
- const sessions = await sessionService.getSessionsByType('all');
238
- expect(sessions).toBeDefined();
239
- });
240
-
241
- it('should get sessions by type "agent"', async () => {
242
- const sessions = await sessionService.getSessionsByType('agent');
243
- expect(sessions).toBeDefined();
244
- });
245
-
246
- it('should get sessions by type "group"', async () => {
247
- const sessions = await sessionService.getSessionsByType('group');
248
- expect(sessions).toBeDefined();
249
- });
250
- });
251
-
252
- describe('getSessionConfig', () => {
253
- it.skip('should get default config for INBOX_SESSION_ID', async () => {
254
- const config = await sessionService.getSessionConfig(INBOX_SESSION_ID);
255
- expect(config).toBeDefined();
256
- });
257
-
258
- it('should throw error for non-existent session', async () => {
259
- await expect(sessionService.getSessionConfig('non-existent')).rejects.toThrow(
260
- 'Session not found',
261
- );
262
- });
263
- });
264
-
265
- describe('updateSessionMeta', () => {
266
- it('should not update meta for INBOX_SESSION_ID', async () => {
267
- const result = await sessionService.updateSessionMeta(INBOX_SESSION_ID, {
268
- title: 'New Title',
269
- });
270
- expect(result).toBeUndefined();
271
- });
272
-
273
- it('should update meta for normal session', async () => {
274
- const meta = { title: 'Updated Title' };
275
- await sessionService.updateSessionMeta(mockSessionId, meta);
276
-
277
- const session = await clientDB.query.sessions.findFirst({
278
- where: eq(sessions.id, mockSessionId),
279
- });
280
- expect(session).toBeDefined();
281
- });
282
- });
283
-
284
- describe('updateSessionChatConfig', () => {
285
- it('should update chat config', async () => {
286
- const chatConfig = { temperature: 0.8 } as Partial<LobeAgentChatConfig>;
287
- const result = await sessionService.updateSessionChatConfig(mockSessionId, chatConfig);
288
- expect(result).toBeDefined();
289
- });
290
- });
291
-
292
- describe('model getters', () => {
293
- it('should return session model instance', () => {
294
- // @ts-ignore - accessing private getter
295
- const model = sessionService.sessionModel;
296
- expect(model).toBeDefined();
297
- });
298
-
299
- it('should return session group model instance', () => {
300
- // @ts-ignore - accessing private getter
301
- const model = sessionService.sessionGroupModel;
302
- expect(model).toBeDefined();
303
- });
304
- });
305
-
306
- // SessionGroup related tests
307
- describe('createSessionGroup', () => {
308
- it('should create a new session group and return its id', async () => {
309
- // Setup
310
- const groupName = 'New Group';
311
- const sort = 1;
312
-
313
- // Execute
314
- const groupId = await sessionService.createSessionGroup(groupName, sort);
315
-
316
- // Assert
317
- expect(groupId).toMatch(/^sg_/);
318
-
319
- const result = await clientDB.query.sessionGroups.findFirst({
320
- where: eq(sessionGroups.id, groupId),
321
- });
322
-
323
- expect(result).toMatchObject({ id: groupId, name: groupName, sort });
324
- });
325
- });
326
-
327
- describe('removeSessionGroup', () => {
328
- it('should remove a session group by its id', async () => {
329
- const groupId = 'group-1';
330
- // Execute
331
- await sessionService.removeSessionGroup(groupId);
332
-
333
- const result = await clientDB.query.sessionGroups.findFirst({
334
- where: eq(sessionGroups.id, groupId),
335
- });
336
- // Assert
337
- expect(result).toBeUndefined();
338
- });
339
- });
340
-
341
- describe('clearSessionGroups', () => {
342
- it('should clear all session groups', async () => {
343
- // Execute
344
- await sessionService.removeSessionGroups();
345
-
346
- // Assert
347
- const result = await clientDB.query.sessionGroups.findMany({
348
- where: eq(sessionGroups.userId, userId),
349
- });
350
-
351
- expect(result.length).toBe(0);
352
-
353
- const result2 = await clientDB.query.sessionGroups.findMany({
354
- where: not(eq(sessionGroups.userId, userId)),
355
- });
356
-
357
- expect(result2.length).toBeGreaterThan(0);
358
- });
359
- });
360
-
361
- describe('getSessionGroups', () => {
362
- it('should retrieve all session groups', async () => {
363
- // Execute
364
- const result = await sessionService.getSessionGroups();
365
-
366
- // Assert
367
- const groups = [
368
- { id: 'group-2', name: 'group-B', sort: 1 },
369
- { id: 'group-1', name: 'group-A', sort: 2 },
370
- ];
371
- expect(result).toMatchObject(groups);
372
- });
373
- });
374
-
375
- describe('updateSessionGroup', () => {
376
- it('should update a session group', async () => {
377
- // Setup
378
- const groupId = 'group-1';
379
- const data = { name: 'Updated Group', sort: 2 };
380
-
381
- // Execute
382
- await sessionService.updateSessionGroup(groupId, data);
383
-
384
- // Assert
385
- const result = await clientDB.query.sessionGroups.findFirst({
386
- where: eq(sessionGroups.id, groupId),
387
- });
388
- expect(result).toMatchObject({ id: groupId, ...data });
389
- });
390
- });
391
-
392
- describe('updateSessionGroupOrder', () => {
393
- it('should update the order of session groups', async () => {
394
- // Setup
395
- const sortMap = [
396
- { id: 'group-1', sort: 2 },
397
- { id: 'group-2', sort: 1 },
398
- ];
399
-
400
- // Execute
401
- await sessionService.updateSessionGroupOrder(sortMap);
402
-
403
- // Assert
404
- const data = await clientDB.query.sessionGroups.findMany({
405
- where: eq(sessionGroups.userId, userId),
406
- });
407
- expect(data).toMatchObject([
408
- { id: 'group-1', sort: 2 },
409
- { id: 'group-2', sort: 1 },
410
- ]);
411
- });
412
- });
413
- });
@@ -1,193 +0,0 @@
1
- import { AgentItem, LobeAgentConfig } from '@lobechat/types';
2
-
3
- import { INBOX_SESSION_ID } from '@/const/session';
4
- import { clientDB } from '@/database/client/db';
5
- import { ChatGroupModel } from '@/database/models/chatGroup';
6
- import { SessionModel } from '@/database/models/session';
7
- import { SessionGroupModel } from '@/database/models/sessionGroup';
8
- import { BaseClientService } from '@/services/baseClientService';
9
-
10
- import { ISessionService } from './type';
11
-
12
- export class ClientService extends BaseClientService implements ISessionService {
13
- private get sessionModel(): SessionModel {
14
- return new SessionModel(clientDB as any, this.userId);
15
- }
16
-
17
- private get sessionGroupModel(): SessionGroupModel {
18
- return new SessionGroupModel(clientDB as any, this.userId);
19
- }
20
-
21
- private get chatGroupModel(): ChatGroupModel {
22
- return new ChatGroupModel(clientDB as any, this.userId);
23
- }
24
-
25
- hasSessions: ISessionService['hasSessions'] = async () => {
26
- const result = await this.countSessions();
27
- return result === 0;
28
- };
29
-
30
- createSession: ISessionService['createSession'] = async (type, data) => {
31
- const { config, group, meta, ...session } = data;
32
-
33
- const item = await this.sessionModel.create({
34
- config: { ...config, ...meta } as any,
35
- session: { ...session, groupId: group },
36
- type,
37
- });
38
- if (!item) {
39
- throw new Error('session create Error');
40
- }
41
- return item.id;
42
- };
43
-
44
- batchCreateSessions: ISessionService['batchCreateSessions'] = async (importSessions) => {
45
- // @ts-ignore
46
- return this.sessionModel.batchCreate(importSessions);
47
- };
48
-
49
- cloneSession: ISessionService['cloneSession'] = async (id, newTitle) => {
50
- const res = await this.sessionModel.duplicate(id, newTitle);
51
-
52
- if (res) return res?.id;
53
- };
54
-
55
- getGroupedSessions: ISessionService['getGroupedSessions'] = async () => {
56
- const { sessions, sessionGroups } = await this.sessionModel.queryWithGroups();
57
- const chatGroups = await this.chatGroupModel.queryWithMemberDetails();
58
-
59
- const groupSessions = chatGroups.map((group) => {
60
- const { title, description, avatar, backgroundColor, groupId, ...rest } = group;
61
- return {
62
- ...rest,
63
- group: groupId, // Map groupId to group for consistent API
64
- meta: { avatar, backgroundColor, description, title },
65
- type: 'group' as const,
66
- };
67
- });
68
-
69
- const allSessions = [...sessions, ...groupSessions].sort(
70
- (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),
71
- );
72
-
73
- return { sessionGroups, sessions: allSessions };
74
- };
75
-
76
- getSessionConfig: ISessionService['getSessionConfig'] = async (id) => {
77
- if (id === INBOX_SESSION_ID) {
78
- const item = await this.sessionModel.findByIdOrSlug(INBOX_SESSION_ID);
79
-
80
- // if there is no session for user, create one
81
- if (!item) {
82
- const defaultAgentConfig =
83
- window.global_serverConfigStore.getState().serverConfig.defaultAgent?.config || {};
84
-
85
- await this.sessionModel.createInbox(defaultAgentConfig);
86
- }
87
- }
88
-
89
- const res = await this.sessionModel.findByIdOrSlug(id);
90
-
91
- if (!res) throw new Error('Session not found');
92
-
93
- return res.agent as LobeAgentConfig;
94
- };
95
-
96
- /**
97
- * 这个方法要对应移除的
98
- */
99
- // @ts-ignore
100
- getSessionsByType: ISessionService['getSessionsByType'] = async (type = 'all') => {
101
- switch (type) {
102
- // TODO: add a filter to get only agents or agents
103
- case 'group':
104
- case 'agent':
105
- case 'all': {
106
- return this.sessionModel.query();
107
- }
108
- }
109
- };
110
-
111
- countSessions: ISessionService['countSessions'] = async (params) => {
112
- return this.sessionModel.count(params);
113
- };
114
-
115
- rankSessions: ISessionService['rankSessions'] = async (limit) => {
116
- return this.sessionModel.rank(limit);
117
- };
118
-
119
- searchSessions: ISessionService['searchSessions'] = async (keyword) => {
120
- return this.sessionModel.queryByKeyword(keyword);
121
- };
122
-
123
- updateSession: ISessionService['updateSession'] = async (id, value) => {
124
- return this.sessionModel.update(id, {
125
- ...value,
126
- groupId: value.group === 'default' ? null : value.group,
127
- });
128
- };
129
-
130
- updateSessionConfig: ISessionService['updateSessionConfig'] = async (activeId, config) => {
131
- return this.sessionModel.updateConfig(activeId, config as AgentItem);
132
- };
133
-
134
- updateSessionMeta: ISessionService['updateSessionMeta'] = async (activeId, meta) => {
135
- // inbox 不允许修改 meta
136
- if (activeId === INBOX_SESSION_ID) return;
137
-
138
- return this.sessionModel.update(activeId, meta);
139
- };
140
-
141
- updateSessionChatConfig: ISessionService['updateSessionChatConfig'] = async (
142
- activeId,
143
- config,
144
- ) => {
145
- return this.updateSessionConfig(activeId, { chatConfig: config });
146
- };
147
-
148
- removeSession: ISessionService['removeSession'] = async (id) => {
149
- return this.sessionModel.delete(id);
150
- };
151
-
152
- removeAllSessions: ISessionService['removeAllSessions'] = async () => {
153
- return this.sessionModel.deleteAll();
154
- };
155
-
156
- // ************************************** //
157
- // *********** SessionGroup *********** //
158
- // ************************************** //
159
-
160
- createSessionGroup: ISessionService['createSessionGroup'] = async (name, sort) => {
161
- const item = await this.sessionGroupModel.create({ name, sort });
162
- if (!item) {
163
- throw new Error('session group create Error');
164
- }
165
-
166
- return item.id;
167
- };
168
-
169
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
170
- batchCreateSessionGroups: ISessionService['batchCreateSessionGroups'] = async (_groups) => {
171
- return { added: 0, ids: [], skips: [], success: true };
172
- };
173
-
174
- removeSessionGroup: ISessionService['removeSessionGroup'] = async (id) => {
175
- return this.sessionGroupModel.delete(id);
176
- };
177
-
178
- updateSessionGroup: ISessionService['updateSessionGroup'] = async (id, data) => {
179
- return this.sessionGroupModel.update(id, data);
180
- };
181
-
182
- updateSessionGroupOrder: ISessionService['updateSessionGroupOrder'] = async (sortMap) => {
183
- return this.sessionGroupModel.updateOrder(sortMap);
184
- };
185
-
186
- getSessionGroups: ISessionService['getSessionGroups'] = async () => {
187
- return this.sessionGroupModel.query();
188
- };
189
-
190
- removeSessionGroups: ISessionService['removeSessionGroups'] = async () => {
191
- return this.sessionGroupModel.deleteAll();
192
- };
193
- }
@@ -1,51 +0,0 @@
1
- import { INBOX_SESSION_ID } from '@/const/session';
2
- import { clientDB } from '@/database/client/db';
3
- import { MessageModel } from '@/database/models/message';
4
- import { ThreadModel } from '@/database/models/thread';
5
- import { BaseClientService } from '@/services/baseClientService';
6
-
7
- import { IThreadService } from './type';
8
-
9
- export class ClientService extends BaseClientService implements IThreadService {
10
- private get threadModel(): ThreadModel {
11
- return new ThreadModel(clientDB as any, this.userId);
12
- }
13
-
14
- private get messageModel(): MessageModel {
15
- return new MessageModel(clientDB as any, this.userId);
16
- }
17
-
18
- getThreads: IThreadService['getThreads'] = async (topicId) => {
19
- return this.threadModel.queryByTopicId(topicId);
20
- };
21
-
22
- createThreadWithMessage: IThreadService['createThreadWithMessage'] = async (input) => {
23
- const thread = await this.threadModel.create({
24
- parentThreadId: input.parentThreadId,
25
- sourceMessageId: input.sourceMessageId,
26
- title: input.message.content.slice(0, 20),
27
- topicId: input.topicId,
28
- type: input.type,
29
- });
30
-
31
- const message = await this.messageModel.create({
32
- ...input.message,
33
- sessionId: this.toDbSessionId(input.message.sessionId) as string,
34
- threadId: thread?.id,
35
- });
36
-
37
- return { messageId: message?.id, threadId: thread?.id };
38
- };
39
-
40
- updateThread: IThreadService['updateThread'] = async (id, data) => {
41
- return this.threadModel.update(id, data);
42
- };
43
-
44
- removeThread: IThreadService['removeThread'] = async (id) => {
45
- return this.threadModel.delete(id);
46
- };
47
-
48
- private toDbSessionId = (sessionId: string | undefined) => {
49
- return sessionId === INBOX_SESSION_ID ? null : sessionId;
50
- };
51
- }