@lobehub/lobehub 2.0.0-next.3 → 2.0.0-next.31

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 (728) 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 +684 -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/MenuCtr.ts +5 -5
  19. package/apps/desktop/src/main/controllers/NotificationCtr.ts +29 -29
  20. package/apps/desktop/src/main/controllers/RemoteServerConfigCtr.ts +16 -16
  21. package/apps/desktop/src/main/controllers/ShortcutCtr.ts +2 -2
  22. package/apps/desktop/src/main/controllers/TrayMenuCtr.ts +18 -18
  23. package/apps/desktop/src/main/controllers/UpdaterCtr.ts +4 -4
  24. package/apps/desktop/src/main/controllers/__tests__/AuthCtr.test.ts +706 -0
  25. package/apps/desktop/src/main/controllers/__tests__/TrayMenuCtr.test.ts +5 -5
  26. package/apps/desktop/src/main/controllers/index.ts +4 -4
  27. package/apps/desktop/src/main/utils/next-electron-rsc.ts +7 -5
  28. package/apps/desktop/tsconfig.json +0 -1
  29. package/changelog/v1.json +232 -0
  30. package/docs/development/database-schema.dbml +12 -0
  31. package/docs/self-hosting/advanced/auth/next-auth/auth0.mdx +2 -2
  32. package/docs/self-hosting/advanced/auth/next-auth/auth0.zh-CN.mdx +2 -2
  33. package/docs/self-hosting/advanced/auth/next-auth/authelia.mdx +2 -2
  34. package/docs/self-hosting/advanced/auth/next-auth/authelia.zh-CN.mdx +2 -2
  35. package/docs/self-hosting/advanced/auth/next-auth/authentik.mdx +2 -2
  36. package/docs/self-hosting/advanced/auth/next-auth/authentik.zh-CN.mdx +2 -2
  37. package/docs/self-hosting/advanced/auth/next-auth/casdoor.mdx +2 -2
  38. package/docs/self-hosting/advanced/auth/next-auth/casdoor.zh-CN.mdx +2 -2
  39. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.mdx +2 -2
  40. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.zh-CN.mdx +2 -2
  41. package/docs/self-hosting/advanced/auth/next-auth/github.mdx +2 -2
  42. package/docs/self-hosting/advanced/auth/next-auth/github.zh-CN.mdx +2 -2
  43. package/docs/self-hosting/advanced/auth/next-auth/google.mdx +32 -29
  44. package/docs/self-hosting/advanced/auth/next-auth/keycloak.mdx +2 -2
  45. package/docs/self-hosting/advanced/auth/next-auth/keycloak.zh-CN.mdx +2 -2
  46. package/docs/self-hosting/advanced/auth/next-auth/logto.mdx +5 -3
  47. package/docs/self-hosting/advanced/auth/next-auth/logto.zh-CN.mdx +5 -3
  48. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.mdx +2 -2
  49. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.zh-CN.mdx +2 -2
  50. package/docs/self-hosting/advanced/auth/next-auth/okta.mdx +2 -2
  51. package/docs/self-hosting/advanced/auth/next-auth/okta.zh-CN.mdx +2 -2
  52. package/docs/self-hosting/advanced/auth/next-auth/wechat.mdx +2 -2
  53. package/docs/self-hosting/advanced/auth/next-auth/wechat.zh-CN.mdx +2 -2
  54. package/docs/self-hosting/advanced/auth/next-auth/zitadel.mdx +2 -2
  55. package/docs/self-hosting/advanced/auth/next-auth/zitadel.zh-CN.mdx +2 -2
  56. package/docs/self-hosting/advanced/auth.mdx +32 -21
  57. package/docs/self-hosting/advanced/auth.zh-CN.mdx +30 -19
  58. package/docs/self-hosting/advanced/feature-flags.mdx +0 -1
  59. package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +0 -1
  60. package/docs/self-hosting/advanced/online-search.mdx +30 -25
  61. package/docs/self-hosting/advanced/online-search.zh-CN.mdx +25 -23
  62. package/e2e/src/features/discover/detail-pages.feature +95 -0
  63. package/e2e/src/features/discover/interactions.feature +113 -0
  64. package/e2e/src/features/discover/smoke.feature +34 -1
  65. package/e2e/src/steps/discover/detail-pages.steps.ts +295 -0
  66. package/e2e/src/steps/discover/interactions.steps.ts +451 -0
  67. package/e2e/src/steps/discover/smoke.steps.ts +116 -4
  68. package/e2e/tsconfig.json +0 -1
  69. package/locales/ar/labs.json +4 -0
  70. package/locales/ar/models.json +15 -6
  71. package/locales/ar/oauth.json +1 -0
  72. package/locales/bg-BG/labs.json +4 -0
  73. package/locales/bg-BG/models.json +15 -6
  74. package/locales/bg-BG/oauth.json +1 -0
  75. package/locales/de-DE/labs.json +4 -0
  76. package/locales/de-DE/models.json +15 -6
  77. package/locales/de-DE/oauth.json +1 -0
  78. package/locales/en-US/labs.json +4 -0
  79. package/locales/en-US/models.json +15 -6
  80. package/locales/en-US/oauth.json +1 -0
  81. package/locales/es-ES/labs.json +4 -0
  82. package/locales/es-ES/models.json +15 -6
  83. package/locales/es-ES/oauth.json +1 -0
  84. package/locales/fa-IR/labs.json +4 -0
  85. package/locales/fa-IR/models.json +15 -6
  86. package/locales/fa-IR/oauth.json +1 -0
  87. package/locales/fr-FR/labs.json +4 -0
  88. package/locales/fr-FR/models.json +15 -6
  89. package/locales/fr-FR/oauth.json +1 -0
  90. package/locales/it-IT/labs.json +4 -0
  91. package/locales/it-IT/models.json +15 -6
  92. package/locales/it-IT/oauth.json +1 -0
  93. package/locales/ja-JP/labs.json +4 -0
  94. package/locales/ja-JP/models.json +15 -6
  95. package/locales/ja-JP/oauth.json +1 -0
  96. package/locales/ko-KR/labs.json +4 -0
  97. package/locales/ko-KR/models.json +21 -12
  98. package/locales/ko-KR/oauth.json +1 -0
  99. package/locales/nl-NL/labs.json +4 -0
  100. package/locales/nl-NL/models.json +15 -6
  101. package/locales/nl-NL/oauth.json +1 -0
  102. package/locales/pl-PL/labs.json +4 -0
  103. package/locales/pl-PL/models.json +15 -6
  104. package/locales/pl-PL/oauth.json +1 -0
  105. package/locales/pt-BR/labs.json +4 -0
  106. package/locales/pt-BR/models.json +15 -6
  107. package/locales/pt-BR/oauth.json +1 -0
  108. package/locales/ru-RU/labs.json +4 -0
  109. package/locales/ru-RU/models.json +15 -6
  110. package/locales/ru-RU/oauth.json +1 -0
  111. package/locales/tr-TR/labs.json +4 -0
  112. package/locales/tr-TR/models.json +15 -6
  113. package/locales/tr-TR/oauth.json +1 -0
  114. package/locales/vi-VN/labs.json +4 -0
  115. package/locales/vi-VN/models.json +15 -6
  116. package/locales/vi-VN/oauth.json +1 -0
  117. package/locales/zh-CN/labs.json +4 -0
  118. package/locales/zh-CN/models.json +15 -6
  119. package/locales/zh-CN/oauth.json +1 -0
  120. package/locales/zh-TW/labs.json +4 -0
  121. package/locales/zh-TW/models.json +15 -6
  122. package/locales/zh-TW/oauth.json +1 -0
  123. package/next.config.ts +2 -3
  124. package/package.json +76 -82
  125. package/packages/const/src/index.ts +0 -1
  126. package/packages/const/src/url.ts +1 -4
  127. package/packages/const/src/user.ts +5 -2
  128. package/packages/const/src/version.ts +3 -3
  129. package/packages/context-engine/src/index.ts +1 -6
  130. package/packages/context-engine/src/processors/GroupMessageFlatten.ts +12 -2
  131. package/packages/context-engine/src/processors/__tests__/GroupMessageFlatten.test.ts +73 -9
  132. package/packages/context-engine/src/providers/index.ts +0 -2
  133. package/packages/database/migrations/0041_improve_index.sql +10 -0
  134. package/packages/database/migrations/0042_improve_agent_index.sql +1 -0
  135. package/packages/database/migrations/0043_add_ai_model_settings.sql +1 -0
  136. package/packages/database/migrations/meta/0041_snapshot.json +7784 -0
  137. package/packages/database/migrations/meta/0042_snapshot.json +7800 -0
  138. package/packages/database/migrations/meta/0043_snapshot.json +8419 -0
  139. package/packages/database/migrations/meta/_journal.json +21 -0
  140. package/packages/database/package.json +2 -2
  141. package/packages/database/src/core/migrations.json +33 -0
  142. package/packages/database/src/core/web-server.ts +2 -1
  143. package/packages/database/src/models/__tests__/message.grouping.test.ts +812 -0
  144. package/packages/database/src/models/__tests__/message.test.ts +256 -233
  145. package/packages/database/src/models/agent.ts +16 -13
  146. package/packages/database/src/models/message.ts +90 -74
  147. package/packages/database/src/models/session.ts +80 -28
  148. package/packages/database/src/models/user.ts +2 -1
  149. package/packages/database/src/repositories/aiInfra/index.test.ts +198 -0
  150. package/packages/database/src/repositories/aiInfra/index.ts +2 -1
  151. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  152. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  153. package/packages/database/src/schemas/agent.ts +13 -11
  154. package/packages/database/src/schemas/aiInfra.ts +2 -0
  155. package/packages/database/src/schemas/message.ts +5 -1
  156. package/packages/database/src/schemas/relations.ts +6 -4
  157. package/packages/database/src/schemas/session.ts +2 -0
  158. package/packages/database/src/schemas/topic.ts +6 -1
  159. package/packages/database/src/utils/__tests__/groupMessages.test.ts +145 -2
  160. package/packages/database/src/utils/groupMessages.ts +7 -5
  161. package/packages/electron-client-ipc/package.json +4 -1
  162. package/packages/file-loaders/package.json +1 -0
  163. package/packages/memory-extract/package.json +2 -2
  164. package/packages/model-bank/src/aiModels/anthropic.ts +0 -63
  165. package/packages/model-bank/src/aiModels/higress.ts +0 -55
  166. package/packages/model-bank/src/aiModels/infiniai.ts +21 -0
  167. package/packages/model-bank/src/aiModels/ollamacloud.ts +13 -0
  168. package/packages/model-bank/src/aiModels/siliconcloud.ts +19 -0
  169. package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +0 -38
  170. package/packages/model-runtime/src/providers/minimax/index.ts +5 -5
  171. package/packages/model-runtime/src/providers/search1api/index.test.ts +2 -2
  172. package/packages/model-runtime/src/utils/googleErrorParser.test.ts +125 -0
  173. package/packages/model-runtime/src/utils/googleErrorParser.ts +103 -77
  174. package/packages/obervability-otel/package.json +1 -3
  175. package/packages/obervability-otel/src/node.ts +3 -7
  176. package/packages/types/src/discover/mcp.ts +6 -0
  177. package/packages/types/src/index.ts +0 -1
  178. package/packages/types/src/message/common/base.ts +13 -0
  179. package/packages/types/src/message/common/image.ts +8 -0
  180. package/packages/types/src/message/common/metadata.ts +39 -0
  181. package/packages/types/src/message/common/tools.ts +10 -0
  182. package/packages/types/src/message/db/params.ts +47 -1
  183. package/packages/types/src/message/ui/chat.ts +4 -1
  184. package/packages/types/src/message/ui/params.ts +49 -4
  185. package/packages/types/src/plugins/mcp.ts +4 -1
  186. package/packages/types/src/search.ts +16 -0
  187. package/packages/types/src/serverConfig.ts +2 -6
  188. package/packages/types/src/topic/topic.ts +14 -0
  189. package/packages/types/src/user/index.ts +2 -76
  190. package/packages/types/src/user/preference.ts +105 -0
  191. package/packages/types/src/user/settings/index.ts +22 -0
  192. package/packages/utils/src/apiKey.test.ts +139 -0
  193. package/packages/utils/src/client/clipboard.ts +2 -2
  194. package/packages/utils/src/client/exportFile.ts +10 -10
  195. package/packages/utils/src/client/parserPlaceholder.ts +18 -18
  196. package/packages/utils/src/client/topic.ts +10 -10
  197. package/packages/utils/src/client/xor-obfuscation.ts +11 -11
  198. package/packages/utils/src/server/auth.ts +6 -6
  199. package/packages/utils/src/server/geo.ts +9 -9
  200. package/packages/utils/src/server/xor.ts +7 -7
  201. package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
  202. package/packages/web-crawler/tsconfig.json +0 -1
  203. package/renovate.json +23 -1
  204. package/scripts/migrateServerDB/errorHint.js +1 -7
  205. package/scripts/migrateServerDB/index.ts +2 -1
  206. package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
  207. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
  208. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  209. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
  210. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  211. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
  212. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
  213. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
  214. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
  215. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  216. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
  217. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  218. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  219. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  220. package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
  221. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
  222. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
  223. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
  224. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
  225. package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
  226. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
  227. package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
  228. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  229. package/src/app/[variants]/(main)/labs/components/LabCard.tsx +8 -6
  230. package/src/app/[variants]/(main)/labs/page.tsx +19 -22
  231. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  232. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  233. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  234. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  235. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  236. package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +6 -8
  237. package/src/app/[variants]/(main)/settings/provider/detail/azureai/index.tsx +1 -1
  238. package/src/app/[variants]/(main)/settings/provider/detail/bedrock/index.tsx +1 -1
  239. package/src/app/[variants]/(main)/settings/provider/detail/cloudflare/index.tsx +1 -1
  240. package/src/app/[variants]/(main)/settings/provider/detail/comfyui/index.tsx +1 -1
  241. package/src/app/[variants]/(main)/settings/provider/detail/github/index.tsx +1 -1
  242. package/src/app/[variants]/(main)/settings/provider/detail/vertexai/index.tsx +1 -1
  243. package/src/app/[variants]/(main)/settings/provider/features/ProviderConfig/index.tsx +2 -4
  244. package/src/app/[variants]/layout.tsx +1 -0
  245. package/src/app/[variants]/loading/index.tsx +1 -10
  246. package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
  247. package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
  248. package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
  249. package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
  250. package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
  251. package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
  252. package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +19 -2
  253. package/src/app/sitemap.tsx +7 -1
  254. package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
  255. package/src/components/Link.tsx +12 -0
  256. package/src/components/Skeleton/SkeletonSwitch.tsx +13 -0
  257. package/src/components/Skeleton/index.ts +2 -0
  258. package/src/components/Thinking/index.tsx +4 -3
  259. package/src/config/db.ts +0 -5
  260. package/src/config/featureFlags/schema.test.ts +0 -2
  261. package/src/config/featureFlags/schema.ts +0 -6
  262. package/src/config/modelProviders/ai21.ts +1 -16
  263. package/src/config/modelProviders/ai302.ts +1 -128
  264. package/src/config/modelProviders/ai360.ts +1 -32
  265. package/src/config/modelProviders/anthropic.ts +1 -94
  266. package/src/config/modelProviders/azure.ts +1 -51
  267. package/src/config/modelProviders/baichuan.ts +1 -57
  268. package/src/config/modelProviders/bedrock.ts +1 -276
  269. package/src/config/modelProviders/cloudflare.ts +1 -64
  270. package/src/config/modelProviders/deepseek.ts +1 -19
  271. package/src/config/modelProviders/fireworksai.ts +1 -174
  272. package/src/config/modelProviders/giteeai.ts +1 -135
  273. package/src/config/modelProviders/github.ts +1 -254
  274. package/src/config/modelProviders/google.ts +1 -130
  275. package/src/config/modelProviders/groq.ts +1 -119
  276. package/src/config/modelProviders/higress.ts +1 -1736
  277. package/src/config/modelProviders/huggingface.ts +1 -54
  278. package/src/config/modelProviders/hunyuan.ts +1 -83
  279. package/src/config/modelProviders/infiniai.ts +1 -74
  280. package/src/config/modelProviders/internlm.ts +1 -20
  281. package/src/config/modelProviders/minimax.ts +1 -1
  282. package/src/config/modelProviders/mistral.ts +1 -95
  283. package/src/config/modelProviders/modelscope.ts +1 -27
  284. package/src/config/modelProviders/moonshot.ts +1 -29
  285. package/src/config/modelProviders/novita.ts +1 -105
  286. package/src/config/modelProviders/ollama.ts +1 -325
  287. package/src/config/modelProviders/openai.ts +1 -242
  288. package/src/config/modelProviders/openrouter.ts +1 -240
  289. package/src/config/modelProviders/perplexity.ts +1 -45
  290. package/src/config/modelProviders/ppio.ts +1 -152
  291. package/src/config/modelProviders/qiniu.ts +2 -19
  292. package/src/config/modelProviders/qwen.ts +1 -245
  293. package/src/config/modelProviders/search1api.ts +1 -34
  294. package/src/config/modelProviders/sensenova.ts +1 -69
  295. package/src/config/modelProviders/siliconcloud.ts +1 -417
  296. package/src/config/modelProviders/spark.ts +1 -59
  297. package/src/config/modelProviders/stepfun.ts +1 -98
  298. package/src/config/modelProviders/taichu.ts +1 -18
  299. package/src/config/modelProviders/togetherai.ts +1 -274
  300. package/src/config/modelProviders/upstage.ts +1 -28
  301. package/src/config/modelProviders/wenxin.ts +1 -140
  302. package/src/config/modelProviders/xai.ts +1 -38
  303. package/src/config/modelProviders/zeroone.ts +1 -81
  304. package/src/config/modelProviders/zhipu.ts +1 -108
  305. package/src/envs/app.ts +5 -8
  306. package/src/envs/auth.ts +0 -179
  307. package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
  308. package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
  309. package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
  310. package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
  311. package/src/features/ChatInput/ActionBar/index.tsx +2 -2
  312. package/src/features/ChatInput/InputEditor/index.tsx +2 -2
  313. package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
  314. package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
  315. package/src/features/Conversation/Error/index.tsx +15 -5
  316. package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
  317. package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
  318. package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
  319. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
  320. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
  321. package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
  322. package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
  323. package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
  324. package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
  325. package/src/features/Conversation/Messages/Default.tsx +2 -2
  326. package/src/features/Conversation/Messages/Group/Actions/WithContentId.tsx +152 -0
  327. package/src/features/Conversation/Messages/Group/Actions/WithoutContentId.tsx +70 -0
  328. package/src/features/Conversation/Messages/Group/Actions/index.tsx +21 -0
  329. package/src/features/Conversation/Messages/Group/ContentBlock.tsx +91 -0
  330. package/src/features/Conversation/Messages/Group/EditState.tsx +51 -0
  331. package/src/features/Conversation/Messages/Group/Error/index.tsx +53 -0
  332. package/src/features/Conversation/Messages/Group/GroupChildren.tsx +73 -0
  333. package/src/features/Conversation/Messages/Group/MessageContent.tsx +39 -0
  334. package/src/features/Conversation/Messages/Group/Tool/Inspector/BuiltinPluginTitle.tsx +49 -0
  335. package/src/features/Conversation/Messages/Group/Tool/Inspector/Debug.tsx +70 -0
  336. package/src/features/Conversation/Messages/Group/Tool/Inspector/PluginResult.tsx +34 -0
  337. package/src/features/Conversation/Messages/Group/Tool/Inspector/PluginState.tsx +18 -0
  338. package/src/features/Conversation/Messages/Group/Tool/Inspector/Settings.tsx +40 -0
  339. package/src/features/Conversation/Messages/Group/Tool/Inspector/ToolTitle.tsx +92 -0
  340. package/src/features/Conversation/Messages/Group/Tool/Inspector/index.tsx +176 -0
  341. package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/ObjectEntity.tsx +81 -0
  342. package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/ValueCell.tsx +43 -0
  343. package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/index.tsx +134 -0
  344. package/src/features/Conversation/Messages/Group/Tool/Render/CustomRender.tsx +88 -0
  345. package/src/features/Conversation/Messages/Group/Tool/Render/ErrorResponse.tsx +35 -0
  346. package/src/features/Conversation/Messages/Group/Tool/Render/LoadingPlaceholder/index.tsx +29 -0
  347. package/src/features/Conversation/Messages/Group/Tool/Render/PluginSettings.tsx +66 -0
  348. package/src/features/Conversation/Messages/Group/Tool/Render/index.tsx +105 -0
  349. package/src/features/Conversation/Messages/Group/Tool/index.tsx +75 -0
  350. package/src/features/Conversation/Messages/Group/Tools.tsx +46 -0
  351. package/src/features/Conversation/Messages/Group/index.tsx +140 -0
  352. package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
  353. package/src/features/Conversation/Messages/User/index.tsx +4 -4
  354. package/src/features/Conversation/Messages/index.tsx +15 -3
  355. package/src/features/Conversation/components/AutoScroll.tsx +2 -2
  356. package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
  357. package/src/features/Conversation/components/ShareMessageModal/ShareImage/Preview.tsx +2 -2
  358. package/src/features/DataImporter/index.tsx +15 -60
  359. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  360. package/src/features/MCP/utils.test.ts +91 -0
  361. package/src/features/MCP/utils.ts +20 -2
  362. package/src/features/PluginStore/Content.tsx +2 -3
  363. package/src/features/PluginStore/McpList/index.tsx +6 -2
  364. package/src/features/PluginTag/index.tsx +1 -3
  365. package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
  366. package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
  367. package/src/helpers/isCanUseFC.ts +0 -8
  368. package/src/hooks/useEnabledChatModels.ts +0 -8
  369. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  370. package/src/hooks/useModelContextWindowTokens.ts +0 -8
  371. package/src/hooks/useModelHasContextWindowToken.ts +1 -10
  372. package/src/hooks/useModelSupportFiles.ts +1 -11
  373. package/src/hooks/useModelSupportReasoning.ts +1 -11
  374. package/src/hooks/useModelSupportToolUse.ts +1 -11
  375. package/src/hooks/useModelSupportVision.ts +1 -11
  376. package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
  377. package/src/libs/next-auth/auth.config.ts +3 -6
  378. package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
  379. package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
  380. package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
  381. package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
  382. package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
  383. package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
  384. package/src/libs/next-auth/sso-providers/github.ts +0 -6
  385. package/src/libs/next-auth/sso-providers/google.ts +0 -2
  386. package/src/libs/next-auth/sso-providers/index.ts +0 -2
  387. package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
  388. package/src/libs/next-auth/sso-providers/logto.ts +3 -5
  389. package/src/libs/next-auth/sso-providers/okta.ts +0 -4
  390. package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
  391. package/src/libs/oidc-provider/provider.ts +1 -1
  392. package/src/libs/trpc/client/index.ts +0 -1
  393. package/src/libs/trpc/client/lambda.ts +8 -5
  394. package/src/libs/trpc/lambda/context.ts +4 -1
  395. package/src/locales/default/labs.ts +4 -0
  396. package/src/locales/default/oauth.ts +1 -0
  397. package/src/server/globalConfig/index.ts +0 -23
  398. package/src/server/modules/AssistantStore/index.ts +1 -1
  399. package/src/server/modules/ModelRuntime/trace.ts +11 -4
  400. package/src/server/routers/desktop/mcp.ts +1 -3
  401. package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +810 -70
  402. package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
  403. package/src/server/routers/lambda/config/index.test.ts +38 -30
  404. package/src/server/routers/lambda/market/index.ts +4 -2
  405. package/src/server/routers/lambda/message.ts +60 -52
  406. package/src/server/routers/lambda/session.ts +8 -5
  407. package/src/server/routers/lambda/topic.ts +7 -1
  408. package/src/server/routers/lambda/user.ts +32 -31
  409. package/src/server/routers/tools/mcp.ts +2 -3
  410. package/src/server/routers/tools/search.test.ts +1 -7
  411. package/src/server/routers/tools/search.ts +1 -4
  412. package/src/server/services/mcp/deps/MCPSystemDepsCheckService.test.ts +541 -0
  413. package/src/server/services/message/__tests__/index.test.ts +348 -0
  414. package/src/server/services/message/index.ts +159 -0
  415. package/src/server/services/search/impls/firecrawl/index.ts +51 -11
  416. package/src/server/services/search/impls/firecrawl/type.ts +60 -9
  417. package/src/services/__tests__/tool.test.ts +0 -3
  418. package/src/services/aiModel/index.test.ts +3 -6
  419. package/src/services/aiModel/index.ts +55 -7
  420. package/src/services/aiProvider/index.test.ts +2 -5
  421. package/src/services/aiProvider/index.ts +47 -7
  422. package/src/services/chat/chat.test.ts +13 -40
  423. package/src/services/chat/contextEngineering.test.ts +0 -30
  424. package/src/services/chat/contextEngineering.ts +7 -17
  425. package/src/services/chat/helper.ts +7 -31
  426. package/src/services/chat/index.ts +5 -10
  427. package/src/services/chat/types.ts +1 -1
  428. package/src/services/chatGroup/index.ts +64 -9
  429. package/src/services/config.ts +1 -65
  430. package/src/services/export/index.ts +9 -4
  431. package/src/services/file/index.ts +59 -10
  432. package/src/services/import/index.ts +132 -7
  433. package/src/services/mcp.test.ts +777 -0
  434. package/src/services/mcp.ts +40 -6
  435. package/src/services/message/index.ts +203 -10
  436. package/src/services/message/{__tests__/server.test.ts → server.test.ts} +3 -3
  437. package/src/services/models.ts +2 -11
  438. package/src/services/plugin/index.test.ts +8 -0
  439. package/src/services/plugin/index.ts +51 -10
  440. package/src/services/session/index.test.ts +8 -0
  441. package/src/services/session/index.ts +143 -10
  442. package/src/services/tableViewer/client.ts +12 -15
  443. package/src/services/thread/index.test.ts +8 -0
  444. package/src/services/thread/index.ts +37 -7
  445. package/src/services/topic/index.test.ts +8 -0
  446. package/src/services/topic/index.ts +74 -10
  447. package/src/services/user/index.test.ts +8 -0
  448. package/src/services/user/index.ts +50 -11
  449. package/src/store/aiInfra/slices/aiModel/action.test.ts +17 -9
  450. package/src/store/chat/helpers.test.ts +99 -0
  451. package/src/store/chat/helpers.ts +21 -2
  452. package/src/store/chat/selectors.ts +1 -1
  453. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +17 -251
  454. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +339 -7
  455. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +9 -5
  456. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +49 -178
  457. package/src/store/chat/slices/aiChat/actions/generateAIChatV2.ts +272 -14
  458. package/src/store/chat/slices/aiChat/actions/generateAIGroupChat.ts +7 -2
  459. package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
  460. package/src/store/chat/slices/builtinTool/actions/search.ts +3 -3
  461. package/src/store/chat/slices/message/action.test.ts +157 -16
  462. package/src/store/chat/slices/message/action.ts +153 -77
  463. package/src/store/chat/slices/message/reducer.test.ts +363 -5
  464. package/src/store/chat/slices/message/reducer.ts +87 -3
  465. package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
  466. package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
  467. package/src/store/chat/slices/message/selectors/index.ts +2 -0
  468. package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
  469. package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
  470. package/src/store/chat/slices/plugin/action.test.ts +118 -157
  471. package/src/store/chat/slices/plugin/action.ts +53 -68
  472. package/src/store/chat/slices/thread/action.test.ts +13 -4
  473. package/src/store/chat/slices/thread/action.ts +3 -1
  474. package/src/store/chat/slices/topic/action.test.ts +1 -1
  475. package/src/store/chat/slices/topic/action.ts +1 -2
  476. package/src/store/chat/slices/topic/reducer.ts +1 -2
  477. package/src/store/file/slices/chat/action.ts +1 -4
  478. package/src/store/file/slices/fileManager/action.ts +2 -3
  479. package/src/store/global/store.ts +1 -7
  480. package/src/store/session/slices/sessionGroup/action.test.ts +5 -5
  481. package/src/store/tool/selectors/tool.test.ts +1 -1
  482. package/src/store/tool/selectors/tool.ts +6 -8
  483. package/src/store/tool/slices/builtin/action.test.ts +83 -35
  484. package/src/store/tool/slices/builtin/action.ts +0 -9
  485. package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
  486. package/src/store/tool/slices/builtin/selectors.ts +15 -21
  487. package/src/store/tool/slices/mcpStore/action.test.ts +95 -3
  488. package/src/store/tool/slices/mcpStore/action.ts +177 -53
  489. package/src/store/tool/slices/oldStore/initialState.ts +1 -2
  490. package/src/store/user/initialState.ts +1 -7
  491. package/src/store/user/selectors.ts +1 -5
  492. package/src/store/user/slices/common/action.test.ts +1 -4
  493. package/src/store/user/slices/common/action.ts +5 -4
  494. package/src/store/user/slices/preference/action.ts +8 -1
  495. package/src/store/user/slices/preference/selectors/index.ts +2 -0
  496. package/src/store/user/slices/preference/selectors/labPrefer.ts +13 -0
  497. package/src/store/user/slices/preference/{selectors.ts → selectors/preference.ts} +0 -2
  498. package/src/store/user/slices/settings/selectors/index.ts +1 -0
  499. package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
  500. package/src/store/user/store.ts +0 -3
  501. package/src/tools/index.ts +0 -6
  502. package/src/tools/renders.ts +0 -3
  503. package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
  504. package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
  505. package/tsconfig.json +9 -3
  506. package/packages/const/src/guide.ts +0 -89
  507. package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
  508. package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
  509. package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
  510. package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
  511. package/packages/utils/src/_deprecated/parseModels.ts +0 -165
  512. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  513. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  514. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  515. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  516. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  517. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  518. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  519. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  520. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  521. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  522. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  523. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  524. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  525. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  526. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  527. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  528. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  529. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  530. package/src/components/InnerLink.tsx +0 -20
  531. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  532. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  533. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  534. package/src/database/_deprecated/core/db.ts +0 -246
  535. package/src/database/_deprecated/core/index.ts +0 -2
  536. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  537. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  538. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  539. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  540. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  541. package/src/database/_deprecated/core/model.ts +0 -218
  542. package/src/database/_deprecated/core/schemas.ts +0 -88
  543. package/src/database/_deprecated/core/types/db.ts +0 -15
  544. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  545. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  546. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  547. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  548. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  549. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  550. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  551. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  552. package/src/database/_deprecated/models/file.ts +0 -51
  553. package/src/database/_deprecated/models/message.ts +0 -277
  554. package/src/database/_deprecated/models/plugin.ts +0 -62
  555. package/src/database/_deprecated/models/session.ts +0 -271
  556. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  557. package/src/database/_deprecated/models/topic.ts +0 -250
  558. package/src/database/_deprecated/models/user.ts +0 -69
  559. package/src/database/_deprecated/schemas/files.ts +0 -39
  560. package/src/database/_deprecated/schemas/message.ts +0 -50
  561. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  562. package/src/database/_deprecated/schemas/session.ts +0 -54
  563. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  564. package/src/database/_deprecated/schemas/topic.ts +0 -12
  565. package/src/database/_deprecated/schemas/user.ts +0 -40
  566. package/src/envs/__tests__/auth.test.ts +0 -200
  567. package/src/features/DataImporter/_deprecated.ts +0 -43
  568. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  569. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  570. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  571. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  572. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  573. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  574. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  575. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  576. package/src/features/InitClientDB/index.tsx +0 -37
  577. package/src/hooks/_header.ts +0 -23
  578. package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
  579. package/src/libs/trpc/client/edge.ts +0 -26
  580. package/src/libs/trpc/edge/context.ts +0 -71
  581. package/src/libs/trpc/edge/index.ts +0 -45
  582. package/src/libs/trpc/edge/init.ts +0 -26
  583. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  584. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  585. package/src/migrations/FromV0ToV1.ts +0 -10
  586. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  587. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  588. package/src/migrations/FromV1ToV2/index.ts +0 -82
  589. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  590. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  591. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  592. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  593. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  594. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  595. package/src/migrations/FromV2ToV3/index.ts +0 -30
  596. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  597. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  598. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  599. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  600. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  601. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  602. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  603. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  604. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  605. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  606. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  607. package/src/migrations/FromV3ToV4/index.ts +0 -102
  608. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  609. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  610. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  611. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  612. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  613. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  614. package/src/migrations/FromV4ToV5/index.ts +0 -58
  615. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  616. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  617. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  618. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  619. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  620. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  621. package/src/migrations/FromV5ToV6/index.ts +0 -61
  622. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  623. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  624. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  625. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  626. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  627. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  628. package/src/migrations/FromV6ToV7/index.ts +0 -101
  629. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  630. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  631. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  632. package/src/migrations/VersionController.test.ts +0 -88
  633. package/src/migrations/VersionController.ts +0 -67
  634. package/src/migrations/index.ts +0 -61
  635. package/src/server/globalConfig/_deprecated.test.ts +0 -92
  636. package/src/server/globalConfig/_deprecated.ts +0 -41
  637. package/src/server/routers/edge/appStatus.ts +0 -3
  638. package/src/server/routers/edge/index.ts +0 -14
  639. package/src/server/routers/edge/upload.ts +0 -16
  640. package/src/services/aiModel/client.ts +0 -70
  641. package/src/services/aiModel/server.test.ts +0 -122
  642. package/src/services/aiModel/server.ts +0 -51
  643. package/src/services/aiModel/type.ts +0 -32
  644. package/src/services/aiProvider/client.ts +0 -58
  645. package/src/services/aiProvider/server.ts +0 -43
  646. package/src/services/aiProvider/type.ts +0 -27
  647. package/src/services/baseClientService/index.ts +0 -9
  648. package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
  649. package/src/services/chatGroup/client.ts +0 -63
  650. package/src/services/chatGroup/server.ts +0 -67
  651. package/src/services/chatGroup/type.ts +0 -22
  652. package/src/services/export/_deprecated.ts +0 -155
  653. package/src/services/export/client.ts +0 -15
  654. package/src/services/export/server.ts +0 -9
  655. package/src/services/export/type.ts +0 -5
  656. package/src/services/file/_deprecated.test.ts +0 -119
  657. package/src/services/file/_deprecated.ts +0 -80
  658. package/src/services/file/client.test.ts +0 -199
  659. package/src/services/file/client.ts +0 -85
  660. package/src/services/file/server.ts +0 -53
  661. package/src/services/file/type.ts +0 -13
  662. package/src/services/import/_deprecated.ts +0 -115
  663. package/src/services/import/client.test.ts +0 -1015
  664. package/src/services/import/client.ts +0 -64
  665. package/src/services/import/server.ts +0 -133
  666. package/src/services/import/type.ts +0 -17
  667. package/src/services/message/_deprecated.test.ts +0 -398
  668. package/src/services/message/_deprecated.ts +0 -168
  669. package/src/services/message/client.test.ts +0 -410
  670. package/src/services/message/client.ts +0 -186
  671. package/src/services/message/server.ts +0 -150
  672. package/src/services/message/type.ts +0 -54
  673. package/src/services/plugin/_deprecated.test.ts +0 -162
  674. package/src/services/plugin/_deprecated.ts +0 -42
  675. package/src/services/plugin/client.test.ts +0 -177
  676. package/src/services/plugin/client.ts +0 -46
  677. package/src/services/plugin/server.ts +0 -42
  678. package/src/services/plugin/type.ts +0 -23
  679. package/src/services/session/_deprecated.test.ts +0 -440
  680. package/src/services/session/_deprecated.ts +0 -190
  681. package/src/services/session/client.test.ts +0 -413
  682. package/src/services/session/client.ts +0 -193
  683. package/src/services/session/server.test.ts +0 -260
  684. package/src/services/session/server.ts +0 -125
  685. package/src/services/session/type.ts +0 -82
  686. package/src/services/thread/client.ts +0 -51
  687. package/src/services/thread/server.ts +0 -32
  688. package/src/services/thread/type.ts +0 -21
  689. package/src/services/topic/_deprecated.test.ts +0 -245
  690. package/src/services/topic/_deprecated.ts +0 -75
  691. package/src/services/topic/client.ts +0 -89
  692. package/src/services/topic/pglite.test.ts +0 -212
  693. package/src/services/topic/server.ts +0 -57
  694. package/src/services/topic/type.ts +0 -40
  695. package/src/services/user/_deprecated.test.ts +0 -101
  696. package/src/services/user/_deprecated.ts +0 -70
  697. package/src/services/user/client.test.ts +0 -108
  698. package/src/services/user/client.ts +0 -104
  699. package/src/services/user/server.test.ts +0 -149
  700. package/src/services/user/server.ts +0 -47
  701. package/src/services/user/type.ts +0 -21
  702. package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
  703. package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
  704. package/src/store/global/actions/clientDb.ts +0 -67
  705. package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
  706. package/src/store/user/slices/modelList/action.test.ts +0 -359
  707. package/src/store/user/slices/modelList/action.ts +0 -223
  708. package/src/store/user/slices/modelList/initialState.ts +0 -15
  709. package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
  710. package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
  711. package/src/store/user/slices/modelList/selectors/index.ts +0 -3
  712. package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
  713. package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
  714. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
  715. package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
  716. package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
  717. package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
  718. package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
  719. package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
  720. package/src/tools/dalle/Render/Item/Error.tsx +0 -49
  721. package/src/tools/dalle/Render/Item/Image.tsx +0 -44
  722. package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
  723. package/src/tools/dalle/Render/Item/index.tsx +0 -88
  724. package/src/tools/dalle/Render/ToolBar.tsx +0 -56
  725. package/src/tools/dalle/Render/index.tsx +0 -52
  726. package/src/tools/dalle/index.ts +0 -92
  727. /package/src/{app/[variants]/(main)/settings/provider/features/ProviderConfig → components/Skeleton}/SkeletonInput.tsx +0 -0
  728. /package/src/{middleware.ts → proxy.ts} +0 -0
@@ -72,7 +72,7 @@ describe('Message Router Integration Tests', () => {
72
72
  it('should create message with correct sessionId and topicId', async () => {
73
73
  const caller = messageRouter.createCaller(createTestContext(userId));
74
74
 
75
- const messageId = await caller.createMessage({
75
+ const result = await caller.createNewMessage({
76
76
  content: 'Test message',
77
77
  role: 'user',
78
78
  sessionId: testSessionId,
@@ -83,11 +83,11 @@ describe('Message Router Integration Tests', () => {
83
83
  const [createdMessage] = await serverDB
84
84
  .select()
85
85
  .from(messages)
86
- .where(eq(messages.id, messageId));
86
+ .where(eq(messages.id, result.id));
87
87
 
88
88
  expect(createdMessage).toBeDefined();
89
89
  expect(createdMessage).toMatchObject({
90
- id: messageId,
90
+ id: result.id,
91
91
  sessionId: testSessionId,
92
92
  topicId: testTopicId,
93
93
  userId: userId,
@@ -101,7 +101,7 @@ describe('Message Router Integration Tests', () => {
101
101
 
102
102
  // 先创建 thread
103
103
  const { threads } = await import('@/database/schemas');
104
- const [thread] = await serverDB
104
+ const [thread] = (await serverDB
105
105
  .insert(threads)
106
106
  .values({
107
107
  userId,
@@ -109,9 +109,9 @@ describe('Message Router Integration Tests', () => {
109
109
  sourceMessageId: 'msg-source',
110
110
  type: 'continuation', // type is required
111
111
  })
112
- .returning();
112
+ .returning()) as any;
113
113
 
114
- const messageId = await caller.createMessage({
114
+ const result = await caller.createNewMessage({
115
115
  content: 'Test message in thread',
116
116
  role: 'user',
117
117
  sessionId: testSessionId,
@@ -123,12 +123,12 @@ describe('Message Router Integration Tests', () => {
123
123
  const [createdMessage] = await serverDB
124
124
  .select()
125
125
  .from(messages)
126
- .where(eq(messages.id, messageId));
126
+ .where(eq(messages.id, result.id));
127
127
 
128
128
  expect(createdMessage).toBeDefined();
129
129
  expect(createdMessage.threadId).toBe(thread.id);
130
130
  expect(createdMessage).toMatchObject({
131
- id: messageId,
131
+ id: result.id,
132
132
  sessionId: testSessionId,
133
133
  topicId: testTopicId,
134
134
  threadId: thread.id,
@@ -140,7 +140,7 @@ describe('Message Router Integration Tests', () => {
140
140
  it('should create message without topicId', async () => {
141
141
  const caller = messageRouter.createCaller(createTestContext(userId));
142
142
 
143
- const messageId = await caller.createMessage({
143
+ const result = await caller.createNewMessage({
144
144
  content: 'Test message without topic',
145
145
  role: 'user',
146
146
  sessionId: testSessionId,
@@ -150,7 +150,7 @@ describe('Message Router Integration Tests', () => {
150
150
  const [createdMessage] = await serverDB
151
151
  .select()
152
152
  .from(messages)
153
- .where(eq(messages.id, messageId));
153
+ .where(eq(messages.id, result.id));
154
154
 
155
155
  expect(createdMessage.topicId).toBeNull();
156
156
  expect(createdMessage.sessionId).toBe(testSessionId);
@@ -160,7 +160,7 @@ describe('Message Router Integration Tests', () => {
160
160
  const caller = messageRouter.createCaller(createTestContext(userId));
161
161
 
162
162
  await expect(
163
- caller.createMessage({
163
+ caller.createNewMessage({
164
164
  content: 'Test message',
165
165
  role: 'user',
166
166
  sessionId: 'non-existent-session',
@@ -192,7 +192,7 @@ describe('Message Router Integration Tests', () => {
192
192
 
193
193
  // 尝试在 testSessionId 下创建消息,但使用 anotherTopic 的 ID
194
194
  await expect(
195
- caller.createMessage({
195
+ caller.createNewMessage({
196
196
  content: 'Test message',
197
197
  role: 'user',
198
198
  sessionId: testSessionId,
@@ -207,13 +207,13 @@ describe('Message Router Integration Tests', () => {
207
207
  const caller = messageRouter.createCaller(createTestContext(userId));
208
208
 
209
209
  // 创建多个消息
210
- const msg1Id = await caller.createMessage({
210
+ const msg1Result = await caller.createNewMessage({
211
211
  content: 'Message 1',
212
212
  role: 'user',
213
213
  sessionId: testSessionId,
214
214
  });
215
215
 
216
- const msg2Id = await caller.createMessage({
216
+ const msg2Result = await caller.createNewMessage({
217
217
  content: 'Message 2',
218
218
  role: 'assistant',
219
219
  sessionId: testSessionId,
@@ -228,7 +228,7 @@ describe('Message Router Integration Tests', () => {
228
228
  })
229
229
  .returning();
230
230
 
231
- await caller.createMessage({
231
+ await caller.createNewMessage({
232
232
  content: 'Message in another session',
233
233
  role: 'user',
234
234
  sessionId: anotherSession.id,
@@ -240,15 +240,15 @@ describe('Message Router Integration Tests', () => {
240
240
  });
241
241
 
242
242
  expect(result).toHaveLength(2);
243
- expect(result.map((m) => m.id)).toContain(msg1Id);
244
- expect(result.map((m) => m.id)).toContain(msg2Id);
243
+ expect(result.map((m) => m.id)).toContain(msg1Result.id);
244
+ expect(result.map((m) => m.id)).toContain(msg2Result.id);
245
245
  });
246
246
 
247
247
  it('should return messages filtered by topicId', async () => {
248
248
  const caller = messageRouter.createCaller(createTestContext(userId));
249
249
 
250
250
  // 在 topic 中创建消息
251
- const msgInTopicId = await caller.createMessage({
251
+ const msgInTopicResult = await caller.createNewMessage({
252
252
  content: 'Message in topic',
253
253
  role: 'user',
254
254
  sessionId: testSessionId,
@@ -256,7 +256,7 @@ describe('Message Router Integration Tests', () => {
256
256
  });
257
257
 
258
258
  // 在 session 中创建消息(不在 topic 中)
259
- await caller.createMessage({
259
+ await caller.createNewMessage({
260
260
  content: 'Message without topic',
261
261
  role: 'user',
262
262
  sessionId: testSessionId,
@@ -269,7 +269,7 @@ describe('Message Router Integration Tests', () => {
269
269
  });
270
270
 
271
271
  expect(result).toHaveLength(1);
272
- expect(result[0].id).toBe(msgInTopicId);
272
+ expect(result[0].id).toBe(msgInTopicResult.id);
273
273
  expect(result[0].topicId).toBe(testTopicId);
274
274
  });
275
275
 
@@ -278,7 +278,7 @@ describe('Message Router Integration Tests', () => {
278
278
 
279
279
  // 创建多个消息
280
280
  for (let i = 0; i < 5; i++) {
281
- await caller.createMessage({
281
+ await caller.createNewMessage({
282
282
  content: `Pagination test message ${i}`,
283
283
  role: 'user',
284
284
  sessionId: testSessionId,
@@ -316,46 +316,73 @@ describe('Message Router Integration Tests', () => {
316
316
  expect(page1Ids).not.toEqual(page2Ids);
317
317
  }
318
318
  });
319
- });
320
319
 
321
- describe('batchCreateMessages', () => {
322
- it('should create multiple messages in batch', async () => {
320
+ it('should return messages filtered by groupId', async () => {
323
321
  const caller = messageRouter.createCaller(createTestContext(userId));
324
322
 
325
- const messagesToCreate = [
326
- {
327
- content: 'Batch message 1',
328
- role: 'user' as const,
329
- sessionId: testSessionId,
330
- },
331
- {
332
- content: 'Batch message 2',
333
- role: 'assistant' as const,
334
- sessionId: testSessionId,
335
- },
336
- {
337
- content: 'Batch message 3',
338
- role: 'user' as const,
339
- sessionId: testSessionId,
340
- topicId: testTopicId,
341
- },
342
- ];
323
+ // 首先创建一个 chat_group
324
+ const { chatGroups } = await import('@/database/schemas');
325
+ const [chatGroup] = await serverDB
326
+ .insert(chatGroups)
327
+ .values({
328
+ userId,
329
+ title: 'Test Chat Group',
330
+ })
331
+ .returning();
343
332
 
344
- const result = await caller.batchCreateMessages(messagesToCreate);
333
+ // 创建消息并设置 groupId
334
+ const msg1 = await caller.createNewMessage({
335
+ content: 'Message 1 in group',
336
+ role: 'assistant',
337
+ sessionId: testSessionId,
338
+ });
345
339
 
346
- expect(result.success).toBe(true);
347
- // Note: rowCount might be undefined in PGlite, so we skip this check
348
- // expect(result.added).toBe(3);
340
+ await serverDB
341
+ .update(messages)
342
+ .set({ groupId: chatGroup.id })
343
+ .where(eq(messages.id, msg1.id));
349
344
 
350
- // 验证数据库中的消息
351
- const dbMessages = await serverDB
352
- .select()
353
- .from(messages)
354
- .where(eq(messages.sessionId, testSessionId));
345
+ // 创建不在 group 中的消息
346
+ await caller.createNewMessage({
347
+ content: 'Message without group',
348
+ role: 'user',
349
+ sessionId: testSessionId,
350
+ });
355
351
 
356
- expect(dbMessages.length).toBeGreaterThanOrEqual(3);
357
- const topicMessage = dbMessages.find((m) => m.content === 'Batch message 3');
358
- expect(topicMessage?.topicId).toBe(testTopicId);
352
+ // 查询 group 中的消息
353
+ const result = await caller.getMessages({
354
+ sessionId: testSessionId,
355
+ groupId: chatGroup.id,
356
+ });
357
+
358
+ expect(result).toHaveLength(1);
359
+ expect(result[0].id).toBe(msg1.id);
360
+ });
361
+
362
+ it('should support useGroup parameter', async () => {
363
+ const caller = messageRouter.createCaller(createTestContext(userId));
364
+
365
+ // 创建多个消息
366
+ await caller.createNewMessage({
367
+ content: 'Message 1',
368
+ role: 'assistant',
369
+ sessionId: testSessionId,
370
+ });
371
+
372
+ await caller.createNewMessage({
373
+ content: 'Message 2',
374
+ role: 'assistant',
375
+ sessionId: testSessionId,
376
+ });
377
+
378
+ // useGroup 参数应该影响消息分组展示
379
+ const result = await caller.getMessages({
380
+ sessionId: testSessionId,
381
+ useGroup: true,
382
+ });
383
+
384
+ expect(result).toBeDefined();
385
+ expect(Array.isArray(result)).toBe(true);
359
386
  });
360
387
  });
361
388
 
@@ -364,20 +391,20 @@ describe('Message Router Integration Tests', () => {
364
391
  const caller = messageRouter.createCaller(createTestContext(userId));
365
392
 
366
393
  // 创建消息
367
- const msg1Id = await caller.createMessage({
394
+ const msg1Result = await caller.createNewMessage({
368
395
  content: 'Message 1',
369
396
  role: 'user',
370
397
  sessionId: testSessionId,
371
398
  });
372
399
 
373
- const msg2Id = await caller.createMessage({
400
+ const msg2Result = await caller.createNewMessage({
374
401
  content: 'Message 2',
375
402
  role: 'user',
376
403
  sessionId: testSessionId,
377
404
  });
378
405
 
379
406
  // 删除消息
380
- await caller.removeMessages({ ids: [msg1Id, msg2Id] });
407
+ await caller.removeMessages({ ids: [msg1Result.id, msg2Result.id] });
381
408
 
382
409
  // 验证消息已删除
383
410
  const remainingMessages = await serverDB
@@ -387,6 +414,160 @@ describe('Message Router Integration Tests', () => {
387
414
 
388
415
  expect(remainingMessages).toHaveLength(0);
389
416
  });
417
+
418
+ it('should return message list when sessionId is provided', async () => {
419
+ const caller = messageRouter.createCaller(createTestContext(userId));
420
+
421
+ // 创建消息
422
+ const msg1Result = await caller.createNewMessage({
423
+ content: 'Message 1',
424
+ role: 'user',
425
+ sessionId: testSessionId,
426
+ });
427
+
428
+ const msg2Result = await caller.createNewMessage({
429
+ content: 'Message 2',
430
+ role: 'user',
431
+ sessionId: testSessionId,
432
+ });
433
+
434
+ const msg3Result = await caller.createNewMessage({
435
+ content: 'Message 3',
436
+ role: 'user',
437
+ sessionId: testSessionId,
438
+ });
439
+
440
+ // 删除消息并返回列表
441
+ const result = await caller.removeMessages({
442
+ ids: [msg1Result.id],
443
+ sessionId: testSessionId,
444
+ });
445
+
446
+ expect(result.success).toBe(true);
447
+ expect(result.messages).toBeDefined();
448
+ expect(result.messages).toHaveLength(2);
449
+ expect(result.messages?.map((m) => m.id)).toContain(msg2Result.id);
450
+ expect(result.messages?.map((m) => m.id)).toContain(msg3Result.id);
451
+ });
452
+ });
453
+
454
+ describe('removeMessage', () => {
455
+ it('should remove a single message', async () => {
456
+ const caller = messageRouter.createCaller(createTestContext(userId));
457
+
458
+ const msgResult = await caller.createNewMessage({
459
+ content: 'Message to remove',
460
+ role: 'user',
461
+ sessionId: testSessionId,
462
+ });
463
+
464
+ await caller.removeMessage({ id: msgResult.id });
465
+
466
+ // 验证消息已删除
467
+ const deletedMessage = await serverDB
468
+ .select()
469
+ .from(messages)
470
+ .where(eq(messages.id, msgResult.id));
471
+
472
+ expect(deletedMessage).toHaveLength(0);
473
+ });
474
+
475
+ it('should return message list when sessionId is provided', async () => {
476
+ const caller = messageRouter.createCaller(createTestContext(userId));
477
+
478
+ const msg1Result = await caller.createNewMessage({
479
+ content: 'Message 1',
480
+ role: 'user',
481
+ sessionId: testSessionId,
482
+ });
483
+
484
+ const msg2Result = await caller.createNewMessage({
485
+ content: 'Message 2',
486
+ role: 'user',
487
+ sessionId: testSessionId,
488
+ });
489
+
490
+ const result = await caller.removeMessage({
491
+ id: msg1Result.id,
492
+ sessionId: testSessionId,
493
+ });
494
+
495
+ expect(result.success).toBe(true);
496
+ expect(result.messages).toBeDefined();
497
+ expect(result.messages).toHaveLength(1);
498
+ expect(result.messages?.[0].id).toBe(msg2Result.id);
499
+ });
500
+ });
501
+
502
+ describe('removeAllMessages', () => {
503
+ it('should remove all messages for the user', async () => {
504
+ const caller = messageRouter.createCaller(createTestContext(userId));
505
+
506
+ // 创建多个 session 和消息
507
+ await caller.createNewMessage({
508
+ content: 'Message 1',
509
+ role: 'user',
510
+ sessionId: testSessionId,
511
+ });
512
+
513
+ const [anotherSession] = await serverDB
514
+ .insert(sessions)
515
+ .values({
516
+ userId,
517
+ type: 'agent',
518
+ })
519
+ .returning();
520
+
521
+ await caller.createNewMessage({
522
+ content: 'Message 2',
523
+ role: 'user',
524
+ sessionId: anotherSession.id,
525
+ });
526
+
527
+ // 删除所有消息
528
+ await caller.removeAllMessages();
529
+
530
+ // 验证所有消息已删除
531
+ const remainingMessages = await serverDB
532
+ .select()
533
+ .from(messages)
534
+ .where(eq(messages.userId, userId));
535
+
536
+ expect(remainingMessages).toHaveLength(0);
537
+ });
538
+ });
539
+
540
+ describe('removeMessageQuery', () => {
541
+ it('should remove message query', async () => {
542
+ const caller = messageRouter.createCaller(createTestContext(userId));
543
+
544
+ const msgResult = await caller.createNewMessage({
545
+ content: 'Message with query',
546
+ role: 'user',
547
+ sessionId: testSessionId,
548
+ });
549
+
550
+ // 创建一个 message query 记录,使用 UUID
551
+ const { messageQueries } = await import('@/database/schemas');
552
+ const [queryRecord] = await serverDB
553
+ .insert(messageQueries)
554
+ .values({
555
+ messageId: msgResult.id,
556
+ userId,
557
+ userQuery: 'test query',
558
+ })
559
+ .returning();
560
+
561
+ await caller.removeMessageQuery({ id: queryRecord.id });
562
+
563
+ // 验证消息查询已删除
564
+ const deletedQuery = await serverDB
565
+ .select()
566
+ .from(messageQueries)
567
+ .where(eq(messageQueries.id, queryRecord.id));
568
+
569
+ expect(deletedQuery).toHaveLength(0);
570
+ });
390
571
  });
391
572
 
392
573
  describe('removeMessagesByAssistant', () => {
@@ -394,13 +575,13 @@ describe('Message Router Integration Tests', () => {
394
575
  const caller = messageRouter.createCaller(createTestContext(userId));
395
576
 
396
577
  // 创建多个消息
397
- await caller.createMessage({
578
+ await caller.createNewMessage({
398
579
  content: 'Message 1',
399
580
  role: 'user',
400
581
  sessionId: testSessionId,
401
582
  });
402
583
 
403
- await caller.createMessage({
584
+ await caller.createNewMessage({
404
585
  content: 'Message 2',
405
586
  role: 'assistant',
406
587
  sessionId: testSessionId,
@@ -424,7 +605,7 @@ describe('Message Router Integration Tests', () => {
424
605
  const caller = messageRouter.createCaller(createTestContext(userId));
425
606
 
426
607
  // 在 topic 中创建消息
427
- await caller.createMessage({
608
+ await caller.createNewMessage({
428
609
  content: 'Message in topic',
429
610
  role: 'user',
430
611
  sessionId: testSessionId,
@@ -432,7 +613,7 @@ describe('Message Router Integration Tests', () => {
432
613
  });
433
614
 
434
615
  // 在 session 中创建消息(不在 topic 中)
435
- const msgOutsideTopicId = await caller.createMessage({
616
+ const msgOutsideTopicResult = await caller.createNewMessage({
436
617
  content: 'Message outside topic',
437
618
  role: 'user',
438
619
  sessionId: testSessionId,
@@ -451,7 +632,44 @@ describe('Message Router Integration Tests', () => {
451
632
  .where(eq(messages.sessionId, testSessionId));
452
633
 
453
634
  expect(remainingMessages).toHaveLength(1);
454
- expect(remainingMessages[0].id).toBe(msgOutsideTopicId);
635
+ expect(remainingMessages[0].id).toBe(msgOutsideTopicResult.id);
636
+ });
637
+ });
638
+
639
+ describe('removeMessagesByGroup', () => {
640
+ it('should call removeMessagesByGroup endpoint', async () => {
641
+ const caller = messageRouter.createCaller(createTestContext(userId));
642
+
643
+ // 首先创建一个 chat_group
644
+ const { chatGroups } = await import('@/database/schemas');
645
+ const [chatGroup] = await serverDB
646
+ .insert(chatGroups)
647
+ .values({
648
+ userId,
649
+ title: 'Test Chat Group for Delete',
650
+ })
651
+ .returning();
652
+
653
+ // 创建消息并设置 groupId
654
+ const msg1 = await caller.createNewMessage({
655
+ content: 'Message 1 in group',
656
+ role: 'assistant',
657
+ sessionId: testSessionId,
658
+ topicId: testTopicId,
659
+ });
660
+
661
+ await serverDB
662
+ .update(messages)
663
+ .set({ groupId: chatGroup.id })
664
+ .where(eq(messages.id, msg1.id));
665
+
666
+ // 调用删除接口(不会抛出错误即为成功)
667
+ await expect(
668
+ caller.removeMessagesByGroup({
669
+ groupId: chatGroup.id,
670
+ topicId: testTopicId,
671
+ }),
672
+ ).resolves.not.toThrow();
455
673
  });
456
674
  });
457
675
 
@@ -459,14 +677,14 @@ describe('Message Router Integration Tests', () => {
459
677
  it('should update message content', async () => {
460
678
  const caller = messageRouter.createCaller(createTestContext(userId));
461
679
 
462
- const messageId = await caller.createMessage({
680
+ const result = await caller.createNewMessage({
463
681
  content: 'Original content',
464
682
  role: 'user',
465
683
  sessionId: testSessionId,
466
684
  });
467
685
 
468
686
  await caller.update({
469
- id: messageId,
687
+ id: result.id,
470
688
  value: {
471
689
  content: 'Updated content',
472
690
  },
@@ -475,23 +693,53 @@ describe('Message Router Integration Tests', () => {
475
693
  const [updatedMessage] = await serverDB
476
694
  .select()
477
695
  .from(messages)
478
- .where(eq(messages.id, messageId));
696
+ .where(eq(messages.id, result.id));
479
697
 
480
698
  expect(updatedMessage.content).toBe('Updated content');
481
699
  });
700
+
701
+ it('should update message and return message list when sessionId is provided', async () => {
702
+ const caller = messageRouter.createCaller(createTestContext(userId));
703
+
704
+ const msg1 = await caller.createNewMessage({
705
+ content: 'Message 1',
706
+ role: 'user',
707
+ sessionId: testSessionId,
708
+ });
709
+
710
+ const msg2 = await caller.createNewMessage({
711
+ content: 'Message 2',
712
+ role: 'user',
713
+ sessionId: testSessionId,
714
+ });
715
+
716
+ const result = await caller.update({
717
+ id: msg1.id,
718
+ sessionId: testSessionId,
719
+ value: {
720
+ content: 'Updated Message 1',
721
+ },
722
+ });
723
+
724
+ expect(result).toBeDefined();
725
+ // The update method returns the updated message list
726
+ const messages = await caller.getMessages({ sessionId: testSessionId });
727
+ expect(messages).toHaveLength(2);
728
+ expect(messages.find((m) => m.id === msg1.id)?.content).toBe('Updated Message 1');
729
+ });
482
730
  });
483
731
 
484
732
  describe('searchMessages', () => {
485
733
  it('should search messages by keyword', async () => {
486
734
  const caller = messageRouter.createCaller(createTestContext(userId));
487
735
 
488
- await caller.createMessage({
736
+ await caller.createNewMessage({
489
737
  content: 'This is a test message about TypeScript',
490
738
  role: 'user',
491
739
  sessionId: testSessionId,
492
740
  });
493
741
 
494
- await caller.createMessage({
742
+ await caller.createNewMessage({
495
743
  content: 'Another message about JavaScript',
496
744
  role: 'user',
497
745
  sessionId: testSessionId,
@@ -506,18 +754,470 @@ describe('Message Router Integration Tests', () => {
506
754
  });
507
755
  });
508
756
 
757
+ describe('updateMessagePlugin', () => {
758
+ it('should update message plugin state', async () => {
759
+ const caller = messageRouter.createCaller(createTestContext(userId));
760
+
761
+ const msg = await caller.createNewMessage({
762
+ content: 'Message with plugin',
763
+ role: 'assistant',
764
+ sessionId: testSessionId,
765
+ });
766
+
767
+ // 先创建一个 plugin 记录
768
+ const { messagePlugins } = await import('@/database/schemas');
769
+ await serverDB.insert(messagePlugins).values({
770
+ id: msg.id,
771
+ userId,
772
+ toolCallId: 'test-tool-call',
773
+ type: 'default',
774
+ });
775
+
776
+ await caller.updateMessagePlugin({
777
+ id: msg.id,
778
+ value: {
779
+ state: { key: 'value' },
780
+ },
781
+ });
782
+
783
+ const [updatedPlugin] = await serverDB
784
+ .select()
785
+ .from(messagePlugins)
786
+ .where(eq(messagePlugins.id, msg.id));
787
+
788
+ expect(updatedPlugin).toBeDefined();
789
+ expect(updatedPlugin.state).toBeDefined();
790
+ });
791
+ });
792
+
793
+ describe('updateMessageRAG', () => {
794
+ it('should update message RAG information', async () => {
795
+ const caller = messageRouter.createCaller(createTestContext(userId));
796
+
797
+ const msg = await caller.createNewMessage({
798
+ content: 'Message with RAG',
799
+ role: 'assistant',
800
+ sessionId: testSessionId,
801
+ });
802
+
803
+ // 创建必要的依赖: chunks -> messageQueries -> messageQueryChunks
804
+ const { chunks, messageQueries, messageQueryChunks } = await import('@/database/schemas');
805
+
806
+ // 1. 创建 chunk
807
+ const [chunk] = await serverDB
808
+ .insert(chunks)
809
+ .values({
810
+ userId,
811
+ text: 'test chunk content',
812
+ })
813
+ .returning();
814
+
815
+ // 2. 创建 message query
816
+ const [query] = await serverDB
817
+ .insert(messageQueries)
818
+ .values({
819
+ messageId: msg.id,
820
+ userId,
821
+ userQuery: 'test query',
822
+ })
823
+ .returning();
824
+
825
+ // 3. 调用 updateMessageRAG
826
+ await caller.updateMessageRAG({
827
+ id: msg.id,
828
+ value: {
829
+ fileChunks: [{ id: chunk.id, similarity: 0.95 }],
830
+ ragQueryId: query.id,
831
+ },
832
+ });
833
+
834
+ // 验证 messageQueryChunks 记录已创建
835
+ const [queryChunk] = await serverDB
836
+ .select()
837
+ .from(messageQueryChunks)
838
+ .where(eq(messageQueryChunks.messageId, msg.id));
839
+
840
+ expect(queryChunk).toBeDefined();
841
+ expect(queryChunk.chunkId).toBe(chunk.id);
842
+ });
843
+
844
+ it('should return message list when sessionId is provided', async () => {
845
+ const caller = messageRouter.createCaller(createTestContext(userId));
846
+
847
+ const msg1 = await caller.createNewMessage({
848
+ content: 'Message 1',
849
+ role: 'assistant',
850
+ sessionId: testSessionId,
851
+ });
852
+
853
+ await caller.createNewMessage({
854
+ content: 'Message 2',
855
+ role: 'assistant',
856
+ sessionId: testSessionId,
857
+ });
858
+
859
+ // 创建必要的依赖: chunks -> messageQueries
860
+ const { chunks, messageQueries } = await import('@/database/schemas');
861
+ const [chunk] = await serverDB
862
+ .insert(chunks)
863
+ .values({
864
+ userId,
865
+ text: 'test chunk content',
866
+ })
867
+ .returning();
868
+
869
+ // 创建 query (需要 queryId)
870
+ const [query] = await serverDB
871
+ .insert(messageQueries)
872
+ .values({
873
+ messageId: msg1.id,
874
+ userId,
875
+ userQuery: 'test query',
876
+ })
877
+ .returning();
878
+
879
+ const result = await caller.updateMessageRAG({
880
+ id: msg1.id,
881
+ sessionId: testSessionId,
882
+ value: {
883
+ fileChunks: [{ id: chunk.id, similarity: 0.95 }],
884
+ ragQueryId: query.id,
885
+ },
886
+ });
887
+
888
+ expect(result.success).toBe(true);
889
+ expect(result.messages).toBeDefined();
890
+ expect(result.messages).toHaveLength(2);
891
+ });
892
+ });
893
+
894
+ describe('updateMetadata', () => {
895
+ it('should update message metadata', async () => {
896
+ const caller = messageRouter.createCaller(createTestContext(userId));
897
+
898
+ const msg = await caller.createNewMessage({
899
+ content: 'Message with metadata',
900
+ role: 'user',
901
+ sessionId: testSessionId,
902
+ });
903
+
904
+ await caller.updateMetadata({
905
+ id: msg.id,
906
+ value: { customKey: 'customValue' },
907
+ });
908
+
909
+ const [updatedMessage] = await serverDB
910
+ .select()
911
+ .from(messages)
912
+ .where(eq(messages.id, msg.id));
913
+
914
+ expect(updatedMessage).toBeDefined();
915
+ // Verify the message still exists after update
916
+ expect(updatedMessage.id).toBe(msg.id);
917
+ });
918
+ });
919
+
920
+ describe('updatePluginError', () => {
921
+ it('should update plugin error state', async () => {
922
+ const caller = messageRouter.createCaller(createTestContext(userId));
923
+
924
+ const msg = await caller.createNewMessage({
925
+ content: 'Message with plugin error',
926
+ role: 'assistant',
927
+ sessionId: testSessionId,
928
+ });
929
+
930
+ // 先创建一个 plugin 记录
931
+ const { messagePlugins } = await import('@/database/schemas');
932
+ await serverDB.insert(messagePlugins).values({
933
+ id: msg.id,
934
+ userId,
935
+ toolCallId: 'test-tool-call-error',
936
+ type: 'default',
937
+ });
938
+
939
+ await caller.updatePluginError({
940
+ id: msg.id,
941
+ value: { message: 'Plugin error occurred' },
942
+ });
943
+
944
+ const [updatedPlugin] = await serverDB
945
+ .select()
946
+ .from(messagePlugins)
947
+ .where(eq(messagePlugins.id, msg.id));
948
+
949
+ expect(updatedPlugin).toBeDefined();
950
+ expect(updatedPlugin.error).toBeDefined();
951
+ });
952
+
953
+ it('should return message list when sessionId is provided', async () => {
954
+ const caller = messageRouter.createCaller(createTestContext(userId));
955
+
956
+ const msg1 = await caller.createNewMessage({
957
+ content: 'Message 1',
958
+ role: 'assistant',
959
+ sessionId: testSessionId,
960
+ });
961
+
962
+ // 先创建一个 plugin 记录
963
+ const { messagePlugins } = await import('@/database/schemas');
964
+ await serverDB.insert(messagePlugins).values({
965
+ id: msg1.id,
966
+ userId,
967
+ toolCallId: 'test-tool-call-error-2',
968
+ type: 'default',
969
+ });
970
+
971
+ await caller.createNewMessage({
972
+ content: 'Message 2',
973
+ role: 'assistant',
974
+ sessionId: testSessionId,
975
+ });
976
+
977
+ const result = await caller.updatePluginError({
978
+ id: msg1.id,
979
+ sessionId: testSessionId,
980
+ value: { message: 'Error' },
981
+ });
982
+
983
+ expect(result.success).toBe(true);
984
+ expect(result.messages).toBeDefined();
985
+ expect(result.messages).toHaveLength(2);
986
+ });
987
+ });
988
+
989
+ describe('updatePluginState', () => {
990
+ it('should update plugin state', async () => {
991
+ const caller = messageRouter.createCaller(createTestContext(userId));
992
+
993
+ const msg = await caller.createNewMessage({
994
+ content: 'Message with plugin state',
995
+ role: 'assistant',
996
+ sessionId: testSessionId,
997
+ });
998
+
999
+ // 先创建一个 plugin 记录
1000
+ const { messagePlugins } = await import('@/database/schemas');
1001
+ await serverDB.insert(messagePlugins).values({
1002
+ id: msg.id,
1003
+ userId,
1004
+ toolCallId: 'test-tool-call-state',
1005
+ type: 'default',
1006
+ });
1007
+
1008
+ const result = await caller.updatePluginState({
1009
+ id: msg.id,
1010
+ sessionId: testSessionId,
1011
+ value: { stateKey: 'stateValue' },
1012
+ });
1013
+
1014
+ expect(result).toBeDefined();
1015
+ });
1016
+ });
1017
+
1018
+ describe('updateTTS', () => {
1019
+ it('should update TTS information', async () => {
1020
+ const caller = messageRouter.createCaller(createTestContext(userId));
1021
+
1022
+ const msg = await caller.createNewMessage({
1023
+ content: 'Message with TTS',
1024
+ role: 'assistant',
1025
+ sessionId: testSessionId,
1026
+ });
1027
+
1028
+ // 创建 file 记录
1029
+ const { files } = await import('@/database/schemas');
1030
+ const [file] = await serverDB
1031
+ .insert(files)
1032
+ .values({
1033
+ userId,
1034
+ name: 'audio.mp3',
1035
+ fileType: 'audio/mpeg',
1036
+ size: 1024,
1037
+ url: '/files/audio.mp3',
1038
+ })
1039
+ .returning();
1040
+
1041
+ await caller.updateTTS({
1042
+ id: msg.id,
1043
+ value: {
1044
+ file: file.id,
1045
+ voice: 'en-US-neural',
1046
+ contentMd5: 'abc123',
1047
+ },
1048
+ });
1049
+
1050
+ const { messageTTS } = await import('@/database/schemas');
1051
+ const [ttsRecord] = await serverDB.select().from(messageTTS).where(eq(messageTTS.id, msg.id));
1052
+
1053
+ expect(ttsRecord).toBeDefined();
1054
+ expect(ttsRecord.voice).toBe('en-US-neural');
1055
+ expect(ttsRecord.fileId).toBe(file.id);
1056
+ });
1057
+
1058
+ it('should delete TTS when value is false', async () => {
1059
+ const caller = messageRouter.createCaller(createTestContext(userId));
1060
+
1061
+ const msg = await caller.createNewMessage({
1062
+ content: 'Message with TTS to delete',
1063
+ role: 'assistant',
1064
+ sessionId: testSessionId,
1065
+ });
1066
+
1067
+ // 创建 file 记录
1068
+ const { files } = await import('@/database/schemas');
1069
+ const [file] = await serverDB
1070
+ .insert(files)
1071
+ .values({
1072
+ userId,
1073
+ name: 'audio-delete.mp3',
1074
+ fileType: 'audio/mpeg',
1075
+ size: 1024,
1076
+ url: '/files/audio-delete.mp3',
1077
+ })
1078
+ .returning();
1079
+
1080
+ // First add TTS
1081
+ await caller.updateTTS({
1082
+ id: msg.id,
1083
+ value: {
1084
+ file: file.id,
1085
+ voice: 'en-US-neural',
1086
+ },
1087
+ });
1088
+
1089
+ // Then delete it
1090
+ await caller.updateTTS({
1091
+ id: msg.id,
1092
+ value: false,
1093
+ });
1094
+
1095
+ const { messageTTS } = await import('@/database/schemas');
1096
+ const [ttsRecord] = await serverDB.select().from(messageTTS).where(eq(messageTTS.id, msg.id));
1097
+
1098
+ expect(ttsRecord).toBeUndefined();
1099
+ });
1100
+ });
1101
+
1102
+ describe('updateTranslate', () => {
1103
+ it('should update translation information', async () => {
1104
+ const caller = messageRouter.createCaller(createTestContext(userId));
1105
+
1106
+ const msg = await caller.createNewMessage({
1107
+ content: 'Hello world',
1108
+ role: 'user',
1109
+ sessionId: testSessionId,
1110
+ });
1111
+
1112
+ await caller.updateTranslate({
1113
+ id: msg.id,
1114
+ value: {
1115
+ content: '你好世界',
1116
+ from: 'en',
1117
+ to: 'zh',
1118
+ },
1119
+ });
1120
+
1121
+ const { messageTranslates } = await import('@/database/schemas');
1122
+ const [translateRecord] = await serverDB
1123
+ .select()
1124
+ .from(messageTranslates)
1125
+ .where(eq(messageTranslates.id, msg.id));
1126
+
1127
+ expect(translateRecord).toBeDefined();
1128
+ expect(translateRecord.to).toBe('zh');
1129
+ });
1130
+
1131
+ it('should delete translation when value is false', async () => {
1132
+ const caller = messageRouter.createCaller(createTestContext(userId));
1133
+
1134
+ const msg = await caller.createNewMessage({
1135
+ content: 'Hello world',
1136
+ role: 'user',
1137
+ sessionId: testSessionId,
1138
+ });
1139
+
1140
+ // First add translation
1141
+ await caller.updateTranslate({
1142
+ id: msg.id,
1143
+ value: {
1144
+ content: '你好世界',
1145
+ to: 'zh',
1146
+ },
1147
+ });
1148
+
1149
+ // Then delete it
1150
+ await caller.updateTranslate({
1151
+ id: msg.id,
1152
+ value: false,
1153
+ });
1154
+
1155
+ const [updatedMessage] = await serverDB
1156
+ .select()
1157
+ .from(messages)
1158
+ .where(eq(messages.id, msg.id));
1159
+
1160
+ expect(updatedMessage).toBeDefined();
1161
+ });
1162
+ });
1163
+
1164
+ describe('getHeatmaps', () => {
1165
+ it('should get message heatmaps', async () => {
1166
+ const caller = messageRouter.createCaller(createTestContext(userId));
1167
+
1168
+ // 创建一些消息
1169
+ await caller.createNewMessage({
1170
+ content: 'Message 1',
1171
+ role: 'user',
1172
+ sessionId: testSessionId,
1173
+ });
1174
+
1175
+ await caller.createNewMessage({
1176
+ content: 'Message 2',
1177
+ role: 'assistant',
1178
+ sessionId: testSessionId,
1179
+ });
1180
+
1181
+ const heatmaps = await caller.getHeatmaps();
1182
+
1183
+ expect(heatmaps).toBeDefined();
1184
+ expect(Array.isArray(heatmaps)).toBe(true);
1185
+ });
1186
+ });
1187
+
1188
+ describe('rankModels', () => {
1189
+ it('should get model usage ranking', async () => {
1190
+ const caller = messageRouter.createCaller(createTestContext(userId));
1191
+
1192
+ // 创建带有模型信息的消息
1193
+ const msg = await caller.createNewMessage({
1194
+ content: 'Message from AI',
1195
+ role: 'assistant',
1196
+ sessionId: testSessionId,
1197
+ });
1198
+
1199
+ // 添加模型信息
1200
+ await serverDB.update(messages).set({ model: 'gpt-4' }).where(eq(messages.id, msg.id));
1201
+
1202
+ const ranking = await caller.rankModels();
1203
+
1204
+ expect(ranking).toBeDefined();
1205
+ expect(Array.isArray(ranking)).toBe(true);
1206
+ });
1207
+ });
1208
+
509
1209
  describe('count and statistics', () => {
510
1210
  it('should count messages', async () => {
511
1211
  const caller = messageRouter.createCaller(createTestContext(userId));
512
1212
 
513
1213
  // 创建消息
514
- await caller.createMessage({
1214
+ await caller.createNewMessage({
515
1215
  content: 'Message 1',
516
1216
  role: 'user',
517
1217
  sessionId: testSessionId,
518
1218
  });
519
1219
 
520
- await caller.createMessage({
1220
+ await caller.createNewMessage({
521
1221
  content: 'Message 2',
522
1222
  role: 'assistant',
523
1223
  sessionId: testSessionId,
@@ -528,10 +1228,30 @@ describe('Message Router Integration Tests', () => {
528
1228
  expect(count).toBe(2);
529
1229
  });
530
1230
 
1231
+ it('should count messages with date range', async () => {
1232
+ const caller = messageRouter.createCaller(createTestContext(userId));
1233
+
1234
+ await caller.createNewMessage({
1235
+ content: 'Message 1',
1236
+ role: 'user',
1237
+ sessionId: testSessionId,
1238
+ });
1239
+
1240
+ const startDate = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
1241
+ const endDate = new Date().toISOString();
1242
+
1243
+ const count = await caller.count({
1244
+ startDate,
1245
+ endDate,
1246
+ });
1247
+
1248
+ expect(count).toBeGreaterThanOrEqual(1);
1249
+ });
1250
+
531
1251
  it('should count words', async () => {
532
1252
  const caller = messageRouter.createCaller(createTestContext(userId));
533
1253
 
534
- await caller.createMessage({
1254
+ await caller.createNewMessage({
535
1255
  content: 'Hello world',
536
1256
  role: 'user',
537
1257
  sessionId: testSessionId,
@@ -541,5 +1261,25 @@ describe('Message Router Integration Tests', () => {
541
1261
 
542
1262
  expect(wordCount).toBeGreaterThan(0);
543
1263
  });
1264
+
1265
+ it('should count words with date range', async () => {
1266
+ const caller = messageRouter.createCaller(createTestContext(userId));
1267
+
1268
+ await caller.createNewMessage({
1269
+ content: 'Hello world test message',
1270
+ role: 'user',
1271
+ sessionId: testSessionId,
1272
+ });
1273
+
1274
+ const startDate = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
1275
+ const endDate = new Date().toISOString();
1276
+
1277
+ const wordCount = await caller.countWords({
1278
+ startDate,
1279
+ endDate,
1280
+ });
1281
+
1282
+ expect(wordCount).toBeGreaterThan(0);
1283
+ });
544
1284
  });
545
1285
  });