@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,3 +1,4 @@
1
+ import { INBOX_SESSION_ID } from '@lobechat/const';
1
2
  import {
2
3
  ChatFileItem,
3
4
  ChatImageItem,
@@ -14,6 +15,7 @@ import {
14
15
  UIChatMessage,
15
16
  UpdateMessageParams,
16
17
  UpdateMessageRAGParams,
18
+ UpdateMessageResult,
17
19
  } from '@lobechat/types';
18
20
  import type { HeatmapsProps } from '@lobehub/charts';
19
21
  import dayjs from 'dayjs';
@@ -39,6 +41,7 @@ import {
39
41
  } from '../schemas';
40
42
  import { LobeChatDatabase } from '../type';
41
43
  import { genEndDateWhere, genRangeWhere, genStartDateWhere, genWhere } from '../utils/genWhere';
44
+ import { groupAssistantMessages } from '../utils/groupMessages';
42
45
  import { idGenerator } from '../utils/idGenerator';
43
46
 
44
47
  export class MessageModel {
@@ -54,6 +57,7 @@ export class MessageModel {
54
57
  query = async (
55
58
  { current = 0, pageSize = 1000, sessionId, topicId, groupId }: QueryMessageParams = {},
56
59
  options: {
60
+ groupAssistantMessages?: boolean;
57
61
  postProcessUrl?: (path: string | null, file: { fileType: string }) => Promise<string>;
58
62
  } = {},
59
63
  ) => {
@@ -211,7 +215,7 @@ export class MessageModel {
211
215
  .from(messageQueries)
212
216
  .where(inArray(messageQueries.messageId, messageIds));
213
217
 
214
- return result.map(
218
+ const mappedMessages = result.map(
215
219
  ({ model, provider, translate, ttsId, ttsFile, ttsContentMd5, ttsVoice, ...item }) => {
216
220
  const messageQuery = messageQueriesList.find((relation) => relation.messageId === item.id);
217
221
  return {
@@ -246,13 +250,15 @@ export class MessageModel {
246
250
  size: size!,
247
251
  url,
248
252
  })),
249
-
250
253
  imageList: imageList
251
254
  .filter((relation) => relation.messageId === item.id)
252
255
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
253
256
  .map<ChatImageItem>(({ id, url, name }) => ({ alt: name!, id, url })),
254
-
255
257
  meta: {},
258
+
259
+ model,
260
+
261
+ provider,
256
262
  ragQuery: messageQuery?.rewriteQuery,
257
263
  ragQueryId: messageQuery?.id,
258
264
  ragRawQuery: messageQuery?.userQuery,
@@ -263,6 +269,10 @@ export class MessageModel {
263
269
  } as unknown as UIChatMessage;
264
270
  },
265
271
  );
272
+
273
+ // Group assistant messages with their tool results
274
+ const { groupAssistantMessages: useGroup = false } = options;
275
+ return useGroup ? groupAssistantMessages(mappedMessages) : mappedMessages;
266
276
  };
267
277
 
268
278
  findById = async (id: string) => {
@@ -560,7 +570,7 @@ export class MessageModel {
560
570
  sessionId: params.sessionId,
561
571
  topicId: params.topicId, // Get all messages
562
572
  },
563
- options,
573
+ { ...options, groupAssistantMessages: true },
564
574
  );
565
575
 
566
576
  // 3. Return the result
@@ -589,27 +599,52 @@ export class MessageModel {
589
599
  };
590
600
  // **************** Update *************** //
591
601
 
592
- update = async (id: string, { imageList, ...message }: Partial<UpdateMessageParams>) => {
593
- return this.db.transaction(async (trx) => {
594
- // 1. insert message files
595
- if (imageList && imageList.length > 0) {
602
+ update = async (
603
+ id: string,
604
+ { imageList, ...message }: Partial<UpdateMessageParams>,
605
+ options?: {
606
+ postProcessUrl?: (path: string | null, file: { fileType: string }) => Promise<string>;
607
+ sessionId?: string | null;
608
+ topicId?: string | null;
609
+ },
610
+ ): Promise<UpdateMessageResult> => {
611
+ try {
612
+ await this.db.transaction(async (trx) => {
613
+ // 1. insert message files
614
+ if (imageList && imageList.length > 0) {
615
+ await trx
616
+ .insert(messagesFiles)
617
+ .values(
618
+ imageList.map((file) => ({ fileId: file.id, messageId: id, userId: this.userId })),
619
+ );
620
+ }
621
+
596
622
  await trx
597
- .insert(messagesFiles)
598
- .values(
599
- imageList.map((file) => ({ fileId: file.id, messageId: id, userId: this.userId })),
600
- );
623
+ .update(messages)
624
+ .set({ ...message })
625
+ .where(and(eq(messages.id, id), eq(messages.userId, this.userId)));
626
+ });
627
+
628
+ // if sessionId or topicId provided, return the updated message list
629
+ if (options?.sessionId !== undefined || options?.topicId !== undefined) {
630
+ const messageList = await this.query(
631
+ {
632
+ sessionId: options.sessionId,
633
+ topicId: options.topicId,
634
+ },
635
+ {
636
+ postProcessUrl: options.postProcessUrl,
637
+ },
638
+ );
639
+
640
+ return { messages: messageList, success: true };
601
641
  }
602
642
 
603
- return trx
604
- .update(messages)
605
- .set({
606
- ...message,
607
- // TODO: need a better way to handle this
608
- // TODO: but I forget why 🤡
609
- role: message.role as any,
610
- })
611
- .where(and(eq(messages.id, id), eq(messages.userId, this.userId)));
612
- });
643
+ return { success: true };
644
+ } catch (error) {
645
+ console.error('Update message error:', error);
646
+ return { success: false };
647
+ }
613
648
  };
614
649
 
615
650
  updateMetadata = async (id: string, metadata: Record<string, any>) => {
@@ -778,8 +813,11 @@ export class MessageModel {
778
813
 
779
814
  private genId = () => idGenerator('messages', 14);
780
815
 
781
- private matchSession = (sessionId?: string | null) =>
782
- sessionId ? eq(messages.sessionId, sessionId) : isNull(messages.sessionId);
816
+ private matchSession = (sessionId?: string | null) => {
817
+ if (sessionId === INBOX_SESSION_ID) return isNull(messages.sessionId);
818
+
819
+ return sessionId ? eq(messages.sessionId, sessionId) : isNull(messages.sessionId);
820
+ };
783
821
 
784
822
  private matchTopic = (topicId?: string | null) =>
785
823
  topicId ? eq(messages.topicId, topicId) : isNull(messages.topicId);
@@ -53,13 +53,44 @@ export class SessionModel {
53
53
  query = async ({ current = 0, pageSize = 9999 } = {}) => {
54
54
  const offset = current * pageSize;
55
55
 
56
- return this.db.query.sessions.findMany({
57
- limit: pageSize,
58
- offset,
59
- orderBy: [desc(sessions.updatedAt)],
60
- where: and(eq(sessions.userId, this.userId), not(eq(sessions.slug, INBOX_SESSION_ID))),
61
- with: { agentsToSessions: { columns: {}, with: { agent: true } }, group: true },
62
- });
56
+ // Use leftJoin instead of nested with for better performance
57
+ const result = await this.db
58
+ .select({
59
+ // Agent fields (from agentsToSessions join)
60
+ agent: agents,
61
+ // Group fields
62
+ group: sessionGroups,
63
+ // Session fields
64
+ session: sessions,
65
+ })
66
+ .from(sessions)
67
+ .leftJoin(agentsToSessions, eq(sessions.id, agentsToSessions.sessionId))
68
+ .leftJoin(agents, eq(agentsToSessions.agentId, agents.id))
69
+ .leftJoin(sessionGroups, eq(sessions.groupId, sessionGroups.id))
70
+ .where(and(eq(sessions.userId, this.userId), not(eq(sessions.slug, INBOX_SESSION_ID))))
71
+ .orderBy(desc(sessions.updatedAt))
72
+ .limit(pageSize)
73
+ .offset(offset);
74
+
75
+ // Group results by session (since leftJoin can create multiple rows per session)
76
+ // Use Map to preserve order
77
+ const groupedResults = new Map<string, any>();
78
+
79
+ for (const row of result) {
80
+ const sessionId = row.session.id;
81
+ if (!groupedResults.has(sessionId)) {
82
+ groupedResults.set(sessionId, {
83
+ ...row.session,
84
+ agentsToSessions: [],
85
+ group: row.group,
86
+ });
87
+ }
88
+ if (row.agent) {
89
+ groupedResults.get(sessionId)!.agentsToSessions.push({ agent: row.agent });
90
+ }
91
+ }
92
+
93
+ return Array.from(groupedResults.values());
63
94
  };
64
95
 
65
96
  queryWithGroups = async (): Promise<ChatSessionList> => {
@@ -71,9 +102,11 @@ export class SessionModel {
71
102
  where: eq(sessions.userId, this.userId),
72
103
  });
73
104
 
105
+ const mappedSessions = result.map((item) => this.mapSessionItem(item as any));
106
+
74
107
  return {
75
108
  sessionGroups: groups as unknown as ChatSessionList['sessionGroups'],
76
- sessions: result.map((item) => this.mapSessionItem(item as any)),
109
+ sessions: mappedSessions,
77
110
  };
78
111
  };
79
112
 
@@ -332,7 +365,7 @@ export class SessionModel {
332
365
  .delete(agentsToSessions)
333
366
  .where(and(eq(agentsToSessions.sessionId, id), eq(agentsToSessions.userId, this.userId)));
334
367
 
335
- // Delete the session
368
+ // Delete the session (this will cascade delete messages, topics, etc.)
336
369
  const result = await trx
337
370
  .delete(sessions)
338
371
  .where(and(eq(sessions.id, id), eq(sessions.userId, this.userId)));
@@ -397,17 +430,25 @@ export class SessionModel {
397
430
  };
398
431
 
399
432
  clearOrphanAgent = async (agentIds: string[], trx: any) => {
400
- // Delete orphaned agents (those not linked to any other sessions)
401
- for (const agentId of agentIds) {
402
- const remaining = await trx
403
- .select()
404
- .from(agentsToSessions)
405
- .where(eq(agentsToSessions.agentId, agentId))
406
- .limit(1);
433
+ if (agentIds.length === 0) return;
407
434
 
408
- if (remaining.length === 0) {
409
- await trx.delete(agents).where(and(eq(agents.id, agentId), eq(agents.userId, this.userId)));
410
- }
435
+ // Batch query to find which agents still have sessions
436
+ const remainingLinks = (await trx
437
+ .select({ agentId: agentsToSessions.agentId })
438
+ .from(agentsToSessions)
439
+ .where(inArray(agentsToSessions.agentId, agentIds))) as { agentId: string }[];
440
+
441
+ const linkedAgentIds = new Set(remainingLinks.map((link) => link.agentId));
442
+
443
+ // Find orphaned agents (those not in the linked set)
444
+ const orphanedAgentIds = agentIds.filter((id) => !linkedAgentIds.has(id));
445
+
446
+ // Batch delete orphaned agents (this will cascade to agentsFiles, agentsKnowledgeBases, etc.)
447
+ // and SET NULL on messages.agentId
448
+ if (orphanedAgentIds.length > 0) {
449
+ await trx
450
+ .delete(agents)
451
+ .where(and(inArray(agents.id, orphanedAgentIds), eq(agents.userId, this.userId)));
411
452
  }
412
453
  };
413
454
 
@@ -12,12 +12,13 @@ import {
12
12
  topics,
13
13
  users,
14
14
  } from '@/database/schemas';
15
- import { CURRENT_CONFIG_VERSION } from '@/migrations';
16
15
  import { ImporterEntryData } from '@/types/importer';
17
16
 
18
17
  import { DeprecatedDataImporterRepos as DataImporterRepos } from '../index';
19
18
  import mockImportData from './fixtures/messages.json';
20
19
 
20
+ const CURRENT_CONFIG_VERSION = 7;
21
+
21
22
  const serverDB = await getTestDBInstance();
22
23
 
23
24
  const userId = 'test-user-id';
@@ -1,6 +1,5 @@
1
1
  import { and, eq, inArray, sql } from 'drizzle-orm';
2
2
 
3
- import { ImportResult } from '@/services/import/_deprecated';
4
3
  import { ImporterEntryData } from '@/types/importer';
5
4
  import { sanitizeUTF8 } from '@/utils/sanitizeUTF8';
6
5
 
@@ -16,6 +15,13 @@ import {
16
15
  } from '../../../schemas';
17
16
  import { LobeChatDatabase } from '../../../type';
18
17
 
18
+ interface ImportResult {
19
+ added: number;
20
+ errors: number;
21
+ skips: number;
22
+ updated?: number;
23
+ }
24
+
19
25
  export class DeprecatedDataImporterRepos {
20
26
  private userId: string;
21
27
  private db: LobeChatDatabase;
@@ -62,11 +62,11 @@ export const agents = pgTable(
62
62
 
63
63
  ...timestamps,
64
64
  },
65
- (t) => ({
66
- clientIdUnique: uniqueIndex('client_id_user_id_unique').on(t.clientId, t.userId),
67
- titleIndex: index('agents_title_idx').on(t.title),
68
- descriptionIndex: index('agents_description_idx').on(t.description),
69
- }),
65
+ (t) => [
66
+ uniqueIndex('client_id_user_id_unique').on(t.clientId, t.userId),
67
+ index('agents_title_idx').on(t.title),
68
+ index('agents_description_idx').on(t.description),
69
+ ],
70
70
  );
71
71
 
72
72
  export const insertAgentSchema = createInsertSchema(agents);
@@ -90,9 +90,7 @@ export const agentsKnowledgeBases = pgTable(
90
90
 
91
91
  ...timestamps,
92
92
  },
93
- (t) => ({
94
- pk: primaryKey({ columns: [t.agentId, t.knowledgeBaseId] }),
95
- }),
93
+ (t) => [primaryKey({ columns: [t.agentId, t.knowledgeBaseId] })],
96
94
  );
97
95
 
98
96
  export const agentsFiles = pgTable(
@@ -111,7 +109,8 @@ export const agentsFiles = pgTable(
111
109
 
112
110
  ...timestamps,
113
111
  },
114
- (t) => ({
115
- pk: primaryKey({ columns: [t.fileId, t.agentId, t.userId] }),
116
- }),
112
+ (t) => [
113
+ primaryKey({ columns: [t.fileId, t.agentId, t.userId] }),
114
+ index('agents_files_agent_id_idx').on(t.agentId),
115
+ ],
117
116
  );
@@ -62,7 +62,10 @@ export const messageGroups = pgTable(
62
62
 
63
63
  ...timestamps,
64
64
  },
65
- (t) => [uniqueIndex('message_groups_client_id_user_id_unique').on(t.clientId, t.userId)],
65
+ (t) => [
66
+ uniqueIndex('message_groups_client_id_user_id_unique').on(t.clientId, t.userId),
67
+ index('message_groups_topic_id_idx').on(t.topicId),
68
+ ],
66
69
  );
67
70
 
68
71
  export const insertMessageGroupSchema = createInsertSchema(messageGroups);
@@ -130,6 +133,7 @@ export const messages = pgTable(
130
133
  index('messages_user_id_idx').on(table.userId),
131
134
  index('messages_session_id_idx').on(table.sessionId),
132
135
  index('messages_thread_id_idx').on(table.threadId),
136
+ index('messages_agent_id_idx').on(table.agentId),
133
137
  ],
134
138
  );
135
139
 
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable sort-keys-fix/sort-keys-fix */
2
2
  import { relations } from 'drizzle-orm';
3
- import { pgTable, primaryKey, text, uuid, varchar } from 'drizzle-orm/pg-core';
3
+ import { index, pgTable, primaryKey, text, uuid, varchar } from 'drizzle-orm/pg-core';
4
4
 
5
5
  import { createdAt } from './_helpers';
6
6
  import { agents, agentsFiles, agentsKnowledgeBases } from './agent';
@@ -28,9 +28,11 @@ export const agentsToSessions = pgTable(
28
28
  .references(() => users.id, { onDelete: 'cascade' })
29
29
  .notNull(),
30
30
  },
31
- (t) => ({
32
- pk: primaryKey({ columns: [t.agentId, t.sessionId] }),
33
- }),
31
+ (t) => [
32
+ primaryKey({ columns: [t.agentId, t.sessionId] }),
33
+ index('agents_to_sessions_session_id_idx').on(t.sessionId),
34
+ index('agents_to_sessions_agent_id_idx').on(t.agentId),
35
+ ],
34
36
  );
35
37
 
36
38
  export const filesToSessions = pgTable(
@@ -70,6 +70,8 @@ export const sessions = pgTable(
70
70
 
71
71
  index('sessions_user_id_idx').on(t.userId),
72
72
  index('sessions_id_user_id_idx').on(t.id, t.userId),
73
+ index('sessions_user_id_updated_at_idx').on(t.userId, t.updatedAt),
74
+ index('sessions_group_id_idx').on(t.groupId),
73
75
  ],
74
76
  );
75
77
 
@@ -33,6 +33,8 @@ export const topics = pgTable(
33
33
  uniqueIndex('topics_client_id_user_id_unique').on(t.clientId, t.userId),
34
34
  index('topics_user_id_idx').on(t.userId),
35
35
  index('topics_id_user_id_idx').on(t.id, t.userId),
36
+ index('topics_session_id_idx').on(t.sessionId),
37
+ index('topics_group_id_idx').on(t.groupId),
36
38
  ],
37
39
  );
38
40
 
@@ -65,7 +67,10 @@ export const threads = pgTable(
65
67
  lastActiveAt: timestamptz('last_active_at').defaultNow(),
66
68
  ...timestamps,
67
69
  },
68
- (t) => [uniqueIndex('threads_client_id_user_id_unique').on(t.clientId, t.userId)],
70
+ (t) => [
71
+ uniqueIndex('threads_client_id_user_id_unique').on(t.clientId, t.userId),
72
+ index('threads_topic_id_idx').on(t.topicId),
73
+ ],
69
74
  );
70
75
 
71
76
  export type NewThread = typeof threads.$inferInsert;
@@ -54,6 +54,7 @@ describe('groupAssistantMessages', () => {
54
54
  content: 'Beijing: Sunny, 25°C',
55
55
  state: { cached: true },
56
56
  },
57
+ result_msg_id: 'msg-2',
57
58
  });
58
59
  });
59
60
 
@@ -112,7 +113,9 @@ describe('groupAssistantMessages', () => {
112
113
  const block = result[0].children![0];
113
114
  expect(block.tools).toHaveLength(2);
114
115
  expect(block.tools![0].result?.content).toBe('Beijing: Sunny, 25°C');
116
+ expect(block.tools![0].result_msg_id).toBe('msg-2');
115
117
  expect(block.tools![1].result?.content).toBe('Latest tech news: AI breakthrough');
118
+ expect(block.tools![1].result_msg_id).toBe('msg-3');
116
119
  });
117
120
 
118
121
  it('should handle assistant message without tools', () => {
@@ -165,6 +168,7 @@ describe('groupAssistantMessages', () => {
165
168
  const block = result[0].children![0];
166
169
  expect(block.tools).toHaveLength(1);
167
170
  expect(block.tools![0].result).toBeUndefined();
171
+ expect(block.tools![0].result_msg_id).toBeUndefined();
168
172
  });
169
173
  });
170
174
 
@@ -366,11 +370,13 @@ describe('groupAssistantMessages', () => {
366
370
  // First child: original assistant with tool result
367
371
  expect(result[0].children![0].id).toBe('msg-1');
368
372
  expect(result[0].children![0].tools![0].result?.content).toBe('Sunny, 25°C');
373
+ expect(result[0].children![0].tools![0].result_msg_id).toBe('msg-2');
369
374
 
370
375
  // Second child: follow-up assistant with its own tool result
371
376
  expect(result[0].children![1].id).toBe('msg-3');
372
377
  expect(result[0].children![1].tools).toHaveLength(1);
373
378
  expect(result[0].children![1].tools![0].result?.content).toBe('Breaking news');
379
+ expect(result[0].children![1].tools![0].result_msg_id).toBe('msg-4');
374
380
  });
375
381
 
376
382
  it('should group multiple follow-up assistants in chain (3+ assistants)', () => {
@@ -448,9 +454,11 @@ describe('groupAssistantMessages', () => {
448
454
 
449
455
  expect(result[0].children![0].id).toBe('msg-1');
450
456
  expect(result[0].children![0].tools![0].result?.content).toBe('Result 1');
457
+ expect(result[0].children![0].tools![0].result_msg_id).toBe('msg-2');
451
458
 
452
459
  expect(result[0].children![1].id).toBe('msg-3');
453
460
  expect(result[0].children![1].tools![0].result?.content).toBe('Result 2');
461
+ expect(result[0].children![1].tools![0].result_msg_id).toBe('msg-4');
454
462
 
455
463
  expect(result[0].children![2].id).toBe('msg-5');
456
464
  expect(result[0].children![2].content).toBe('Step 3 final');
@@ -677,7 +685,6 @@ describe('groupAssistantMessages', () => {
677
685
  expect(block.content).toBe('Test');
678
686
  expect(block.tools).toHaveLength(1);
679
687
  expect(block.imageList).toHaveLength(1);
680
- expect(block.fileList).toHaveLength(1);
681
688
  });
682
689
 
683
690
  it('should preserve all tool result fields', () => {
@@ -720,6 +727,7 @@ describe('groupAssistantMessages', () => {
720
727
  state: { step: 1 },
721
728
  error: null,
722
729
  });
730
+ expect(block.tools![0].result_msg_id).toBe('msg-2');
723
731
  });
724
732
  });
725
733
 
@@ -928,6 +936,142 @@ describe('groupAssistantMessages', () => {
928
936
  expect(result[0].performance).toBeUndefined();
929
937
  expect(result[0].metadata).toBeUndefined();
930
938
  });
939
+
940
+ it('should map reasoning field to reasoning in children blocks', () => {
941
+ const input: UIChatMessage[] = [
942
+ {
943
+ id: 'msg-1',
944
+ role: 'assistant',
945
+ content: 'Test response',
946
+ reasoning: {
947
+ content: 'This is my reasoning process',
948
+ duration: 1500,
949
+ },
950
+ tools: [
951
+ {
952
+ id: 'tool-1',
953
+ identifier: 'test',
954
+ apiName: 'test',
955
+ arguments: '{}',
956
+ type: 'default',
957
+ },
958
+ ],
959
+ createdAt: Date.now(),
960
+ updatedAt: Date.now(),
961
+ meta: {},
962
+ } as UIChatMessage,
963
+ {
964
+ id: 'msg-2',
965
+ role: 'tool',
966
+ tool_call_id: 'tool-1',
967
+ content: 'Tool result',
968
+ createdAt: Date.now(),
969
+ updatedAt: Date.now(),
970
+ meta: {},
971
+ } as UIChatMessage,
972
+ {
973
+ id: 'msg-3',
974
+ role: 'assistant',
975
+ content: 'Follow-up response',
976
+ parentId: 'msg-2',
977
+ reasoning: {
978
+ content: 'Follow-up reasoning',
979
+ duration: 2000,
980
+ },
981
+ createdAt: Date.now(),
982
+ updatedAt: Date.now(),
983
+ meta: {},
984
+ } as UIChatMessage,
985
+ ];
986
+
987
+ const result = groupAssistantMessages(input);
988
+
989
+ // First block should have reasoning
990
+ expect(result[0].children![0].reasoning).toEqual({
991
+ content: 'This is my reasoning process',
992
+ duration: 1500,
993
+ });
994
+
995
+ // Second block (follow-up) should also have reasoning
996
+ expect(result[0].children![1].reasoning).toEqual({
997
+ content: 'Follow-up reasoning',
998
+ duration: 2000,
999
+ });
1000
+
1001
+ // Group message should not have reasoning (moved to children)
1002
+ expect(result[0].reasoning).toBeUndefined();
1003
+ });
1004
+
1005
+ it('should preserve error field in children blocks', () => {
1006
+ const input = [
1007
+ {
1008
+ id: 'msg-1',
1009
+ role: 'assistant',
1010
+ content: 'Failed to process',
1011
+ error: {
1012
+ type: 'InvalidAPIKey',
1013
+ message: 'API key is invalid',
1014
+ },
1015
+ tools: [
1016
+ {
1017
+ id: 'tool-1',
1018
+ identifier: 'test',
1019
+ apiName: 'test',
1020
+ arguments: '{}',
1021
+ type: 'default',
1022
+ },
1023
+ ],
1024
+ createdAt: Date.now(),
1025
+ updatedAt: Date.now(),
1026
+ meta: {},
1027
+ } as unknown as UIChatMessage,
1028
+ ] as UIChatMessage[];
1029
+
1030
+ const result = groupAssistantMessages(input);
1031
+
1032
+ // Child block should have error
1033
+ expect(result[0].children![0].error).toEqual({
1034
+ type: 'InvalidAPIKey',
1035
+ message: 'API key is invalid',
1036
+ });
1037
+ });
1038
+
1039
+ it('should preserve imageList in children blocks', () => {
1040
+ const input: UIChatMessage[] = [
1041
+ {
1042
+ id: 'msg-1',
1043
+ role: 'assistant',
1044
+ content: 'Here are the images',
1045
+ imageList: [
1046
+ { id: 'img-1', url: 'https://example.com/img1.jpg', alt: 'Image 1' },
1047
+ { id: 'img-2', url: 'https://example.com/img2.jpg', alt: 'Image 2' },
1048
+ ],
1049
+ tools: [
1050
+ {
1051
+ id: 'tool-1',
1052
+ identifier: 'test',
1053
+ apiName: 'test',
1054
+ arguments: '{}',
1055
+ type: 'default',
1056
+ },
1057
+ ],
1058
+ createdAt: Date.now(),
1059
+ updatedAt: Date.now(),
1060
+ meta: {},
1061
+ } as UIChatMessage,
1062
+ ];
1063
+
1064
+ const result = groupAssistantMessages(input);
1065
+
1066
+ // Child block should have imageList
1067
+ expect(result[0].children![0].imageList).toEqual([
1068
+ { id: 'img-1', url: 'https://example.com/img1.jpg', alt: 'Image 1' },
1069
+ { id: 'img-2', url: 'https://example.com/img2.jpg', alt: 'Image 2' },
1070
+ ]);
1071
+
1072
+ // Parent should not have imageList (moved to children)
1073
+ expect(result[0].imageList).toBeUndefined();
1074
+ });
931
1075
  });
932
1076
 
933
1077
  describe('Empty and Null Cases', () => {
@@ -958,7 +1102,6 @@ describe('groupAssistantMessages', () => {
958
1102
 
959
1103
  // Empty arrays should become undefined
960
1104
  expect(result[0].children![0].imageList).toBeUndefined();
961
- expect(result[0].children![0].fileList).toBeUndefined();
962
1105
  });
963
1106
 
964
1107
  it('should handle empty message list', () => {