@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
@@ -35,7 +35,7 @@ const messageModel = new MessageModel(serverDB, userId);
35
35
  const embeddingsId = uuid();
36
36
 
37
37
  beforeEach(async () => {
38
- // 在每个测试用例之前,清空表
38
+ // Clear tables before each test case
39
39
  await serverDB.transaction(async (trx) => {
40
40
  await trx.delete(users);
41
41
  await trx.insert(users).values([{ id: userId }, { id: '456' }]);
@@ -63,14 +63,14 @@ beforeEach(async () => {
63
63
  });
64
64
 
65
65
  afterEach(async () => {
66
- // 在每个测试用例之后,清空表
66
+ // Clear tables after each test case
67
67
  await serverDB.delete(users);
68
68
  });
69
69
 
70
70
  describe('MessageModel', () => {
71
71
  describe('query', () => {
72
72
  it('should query messages by user ID', async () => {
73
- // 创建测试数据
73
+ // Create test data
74
74
  await serverDB.insert(messages).values([
75
75
  { id: '1', userId, role: 'user', content: 'message 1', createdAt: new Date('2023-01-01') },
76
76
  { id: '2', userId, role: 'user', content: 'message 2', createdAt: new Date('2023-02-01') },
@@ -83,39 +83,39 @@ describe('MessageModel', () => {
83
83
  },
84
84
  ]);
85
85
 
86
- // 调用 query 方法
86
+ // Call query method
87
87
  const result = await messageModel.query();
88
88
 
89
- // 断言结果
89
+ // Assert result
90
90
  expect(result).toHaveLength(2);
91
91
  expect(result[0].id).toBe('1');
92
92
  expect(result[1].id).toBe('2');
93
93
  });
94
94
 
95
95
  it('should return empty messages if not match the user ID', async () => {
96
- // 创建测试数据
96
+ // Create test data
97
97
  await serverDB.insert(messages).values([
98
98
  { id: '1', userId: '456', role: 'user', content: '1', createdAt: new Date('2023-01-01') },
99
99
  { id: '2', userId: '456', role: 'user', content: '2', createdAt: new Date('2023-02-01') },
100
100
  { id: '3', userId: '456', role: 'user', content: '3', createdAt: new Date('2023-03-01') },
101
101
  ]);
102
102
 
103
- // 调用 query 方法
103
+ // Call query method
104
104
  const result = await messageModel.query();
105
105
 
106
- // 断言结果
106
+ // Assert result
107
107
  expect(result).toHaveLength(0);
108
108
  });
109
109
 
110
110
  it('should query messages with pagination', async () => {
111
- // 创建测试数据
111
+ // Create test data
112
112
  await serverDB.insert(messages).values([
113
113
  { id: '1', userId, role: 'user', content: 'message 1', createdAt: new Date('2023-01-01') },
114
114
  { id: '2', userId, role: 'user', content: 'message 2', createdAt: new Date('2023-02-01') },
115
115
  { id: '3', userId, role: 'user', content: 'message 3', createdAt: new Date('2023-03-01') },
116
116
  ]);
117
117
 
118
- // 测试分页
118
+ // Test pagination
119
119
  const result1 = await messageModel.query({ current: 0, pageSize: 2 });
120
120
  expect(result1).toHaveLength(2);
121
121
 
@@ -125,7 +125,7 @@ describe('MessageModel', () => {
125
125
  });
126
126
 
127
127
  it('should filter messages by sessionId', async () => {
128
- // 创建测试数据
128
+ // Create test data
129
129
  await serverDB.insert(sessions).values([
130
130
  { id: 'session1', userId },
131
131
  { id: 'session2', userId },
@@ -150,7 +150,7 @@ describe('MessageModel', () => {
150
150
  { id: '3', userId, role: 'user', sessionId: 'session2', content: 'message 3' },
151
151
  ]);
152
152
 
153
- // 测试根据 sessionId 过滤
153
+ // Test filtering by sessionId
154
154
  const result = await messageModel.query({ sessionId: 'session1' });
155
155
  expect(result).toHaveLength(2);
156
156
  expect(result[0].id).toBe('1');
@@ -158,7 +158,7 @@ describe('MessageModel', () => {
158
158
  });
159
159
 
160
160
  it('should filter messages by topicId', async () => {
161
- // 创建测试数据
161
+ // Create test data
162
162
  const sessionId = 'session1';
163
163
  await serverDB.insert(sessions).values([{ id: sessionId, userId }]);
164
164
  const topicId = 'topic1';
@@ -173,7 +173,7 @@ describe('MessageModel', () => {
173
173
  { id: '3', userId, role: 'user', topicId: 'topic2', content: 'message 3' },
174
174
  ]);
175
175
 
176
- // 测试根据 topicId 过滤
176
+ // Test filtering by topicId
177
177
  const result = await messageModel.query({ topicId });
178
178
  expect(result).toHaveLength(2);
179
179
  expect(result[0].id).toBe('1');
@@ -226,7 +226,7 @@ describe('MessageModel', () => {
226
226
  });
227
227
 
228
228
  it('should query messages with join', async () => {
229
- // 创建测试数据
229
+ // Create test data
230
230
  await serverDB.transaction(async (trx) => {
231
231
  await trx.insert(messages).values([
232
232
  {
@@ -268,13 +268,13 @@ describe('MessageModel', () => {
268
268
  });
269
269
 
270
270
  const domain = 'http://abc.com';
271
- // 调用 query 方法
271
+ // Call query method
272
272
  const result = await messageModel.query(
273
273
  {},
274
274
  { postProcessUrl: async (path) => `${domain}/${path}` },
275
275
  );
276
276
 
277
- // 断言结果
277
+ // Assert result
278
278
  expect(result).toHaveLength(2);
279
279
  expect(result[0].id).toBe('1');
280
280
  expect(result[0].imageList).toEqual([
@@ -287,7 +287,7 @@ describe('MessageModel', () => {
287
287
  });
288
288
 
289
289
  it('should include translate, tts and other extra fields in query result', async () => {
290
- // 创建测试数据
290
+ // Create test data
291
291
  await serverDB.transaction(async (trx) => {
292
292
  await trx.insert(messages).values([
293
293
  {
@@ -306,10 +306,10 @@ describe('MessageModel', () => {
306
306
  .values([{ id: '1', voice: 'voice1', fileId: 'f1', contentMd5: 'md5', userId }]);
307
307
  });
308
308
 
309
- // 调用 query 方法
309
+ // Call query method
310
310
  const result = await messageModel.query();
311
311
 
312
- // 断言结果
312
+ // Assert result
313
313
  expect(result[0].extra!.translate).toEqual({ content: 'translated', from: 'en', to: 'zh' });
314
314
  expect(result[0].extra!.tts).toEqual({
315
315
  contentMd5: 'md5',
@@ -319,7 +319,7 @@ describe('MessageModel', () => {
319
319
  });
320
320
 
321
321
  it('should handle edge cases of pagination parameters', async () => {
322
- // 创建测试数据
322
+ // Create test data
323
323
  await serverDB.insert(messages).values([
324
324
  { id: '1', userId, role: 'user', content: 'message 1' },
325
325
  { id: '2', userId, role: 'user', content: 'message 2' },
@@ -339,7 +339,7 @@ describe('MessageModel', () => {
339
339
 
340
340
  describe('query with messageQueries', () => {
341
341
  it('should include ragQuery, ragQueryId and ragRawQuery in query results', async () => {
342
- // 创建测试数据
342
+ // Create test data
343
343
  const messageId = 'msg-with-query';
344
344
  const queryId = uuid();
345
345
 
@@ -358,10 +358,10 @@ describe('MessageModel', () => {
358
358
  userId,
359
359
  });
360
360
 
361
- // 调用 query 方法
361
+ // Call query method
362
362
  const result = await messageModel.query();
363
363
 
364
- // 断言结果
364
+ // Assert result
365
365
  expect(result).toHaveLength(1);
366
366
  expect(result[0].id).toBe(messageId);
367
367
  expect(result[0].ragQueryId).toBe(queryId);
@@ -370,7 +370,7 @@ describe('MessageModel', () => {
370
370
  });
371
371
 
372
372
  it.skip('should handle multiple message queries for the same message', async () => {
373
- // 创建测试数据
373
+ // Create test data
374
374
  const messageId = 'msg-multi-query';
375
375
  const queryId1 = uuid();
376
376
  const queryId2 = uuid();
@@ -400,10 +400,10 @@ describe('MessageModel', () => {
400
400
  },
401
401
  ]);
402
402
 
403
- // 调用 query 方法
403
+ // Call query method
404
404
  const result = await messageModel.query();
405
405
 
406
- // 断言结果 - 应该只包含最新的查询
406
+ // Assert result - 应该只包含最新的查询
407
407
  expect(result).toHaveLength(1);
408
408
  expect(result[0].id).toBe(messageId);
409
409
  expect(result[0].ragQueryId).toBe(queryId2);
@@ -505,7 +505,7 @@ describe('MessageModel', () => {
505
505
 
506
506
  describe('queryAll', () => {
507
507
  it('should return all messages belonging to the user in ascending order', async () => {
508
- // 创建测试数据
508
+ // Create test data
509
509
  await serverDB.insert(messages).values([
510
510
  {
511
511
  id: '1',
@@ -530,10 +530,10 @@ describe('MessageModel', () => {
530
530
  },
531
531
  ]);
532
532
 
533
- // 调用 queryAll 方法
533
+ // Call queryAll method
534
534
  const result = await messageModel.queryAll();
535
535
 
536
- // 断言结果
536
+ // Assert result
537
537
  expect(result).toHaveLength(2);
538
538
  expect(result[0].id).toBe('1');
539
539
  expect(result[1].id).toBe('2');
@@ -542,37 +542,37 @@ describe('MessageModel', () => {
542
542
 
543
543
  describe('findById', () => {
544
544
  it('should find message by ID', async () => {
545
- // 创建测试数据
545
+ // Create test data
546
546
  await serverDB.insert(messages).values([
547
547
  { id: '1', userId, role: 'user', content: 'message 1' },
548
548
  { id: '2', userId: '456', role: 'user', content: 'message 2' },
549
549
  ]);
550
550
 
551
- // 调用 findById 方法
551
+ // Call findById method
552
552
  const result = await messageModel.findById('1');
553
553
 
554
- // 断言结果
554
+ // Assert result
555
555
  expect(result?.id).toBe('1');
556
556
  expect(result?.content).toBe('message 1');
557
557
  });
558
558
 
559
559
  it('should return undefined if message does not belong to user', async () => {
560
- // 创建测试数据
560
+ // Create test data
561
561
  await serverDB
562
562
  .insert(messages)
563
563
  .values([{ id: '1', userId: '456', role: 'user', content: 'message 1' }]);
564
564
 
565
- // 调用 findById 方法
565
+ // Call findById method
566
566
  const result = await messageModel.findById('1');
567
567
 
568
- // 断言结果
568
+ // Assert result
569
569
  expect(result).toBeUndefined();
570
570
  });
571
571
  });
572
572
 
573
573
  describe('queryBySessionId', () => {
574
574
  it('should query messages by sessionId', async () => {
575
- // 创建测试数据
575
+ // Create test data
576
576
  const sessionId = 'session1';
577
577
  await serverDB.insert(sessions).values([
578
578
  { id: 'session1', userId },
@@ -598,10 +598,10 @@ describe('MessageModel', () => {
598
598
  { id: '3', userId, role: 'user', sessionId: 'session2', content: 'message 3' },
599
599
  ]);
600
600
 
601
- // 调用 queryBySessionId 方法
601
+ // Call queryBySessionId method
602
602
  const result = await messageModel.queryBySessionId(sessionId);
603
603
 
604
- // 断言结果
604
+ // Assert result
605
605
  expect(result).toHaveLength(2);
606
606
  expect(result[0].id).toBe('1');
607
607
  expect(result[1].id).toBe('2');
@@ -610,7 +610,7 @@ describe('MessageModel', () => {
610
610
 
611
611
  describe('queryByKeyWord', () => {
612
612
  it('should query messages by keyword', async () => {
613
- // 创建测试数据
613
+ // Create test data
614
614
  await serverDB.insert(messages).values([
615
615
  { id: '1', userId, role: 'user', content: 'apple', createdAt: new Date('2022-02-01') },
616
616
  { id: '2', userId, role: 'user', content: 'banana' },
@@ -618,17 +618,17 @@ describe('MessageModel', () => {
618
618
  { id: '4', userId, role: 'user', content: 'apple pie', createdAt: new Date('2024-02-01') },
619
619
  ]);
620
620
 
621
- // 测试查询包含特定关键字的消息
621
+ // Test querying messages with specific keyword
622
622
  const result = await messageModel.queryByKeyword('apple');
623
623
 
624
- // 断言结果
624
+ // Assert result
625
625
  expect(result).toHaveLength(2);
626
626
  expect(result[0].id).toBe('4');
627
627
  expect(result[1].id).toBe('1');
628
628
  });
629
629
 
630
630
  it('should return empty array when keyword is empty', async () => {
631
- // 创建测试数据
631
+ // Create test data
632
632
  await serverDB.insert(messages).values([
633
633
  { id: '1', userId, role: 'user', content: 'apple' },
634
634
  { id: '2', userId, role: 'user', content: 'banana' },
@@ -636,20 +636,20 @@ describe('MessageModel', () => {
636
636
  { id: '4', userId, role: 'user', content: 'apple pie' },
637
637
  ]);
638
638
 
639
- // 测试当关键字为空时返回空数组
639
+ // Test returning empty array when keyword is empty
640
640
  const result = await messageModel.queryByKeyword('');
641
641
 
642
- // 断言结果
642
+ // Assert result
643
643
  expect(result).toHaveLength(0);
644
644
  });
645
645
  });
646
646
 
647
647
  describe('createMessage', () => {
648
648
  it('should create a new message', async () => {
649
- // 调用 createMessage 方法
649
+ // Call createMessage method
650
650
  await messageModel.create({ role: 'user', content: 'new message', sessionId: '1' });
651
651
 
652
- // 断言结果
652
+ // Assert result
653
653
  const result = await serverDB.select().from(messages).where(eq(messages.userId, userId));
654
654
  expect(result).toHaveLength(1);
655
655
  expect(result[0].content).toBe('new message');
@@ -673,21 +673,21 @@ describe('MessageModel', () => {
673
673
  });
674
674
 
675
675
  it('should generate message ID automatically', async () => {
676
- // 调用 createMessage 方法
676
+ // Call createMessage method
677
677
  await messageModel.create({
678
678
  role: 'user',
679
679
  content: 'new message',
680
680
  sessionId: '1',
681
681
  });
682
682
 
683
- // 断言结果
683
+ // Assert result
684
684
  const result = await serverDB.select().from(messages).where(eq(messages.userId, userId));
685
685
  expect(result[0].id).toBeDefined();
686
686
  expect(result[0].id).toHaveLength(18);
687
687
  });
688
688
 
689
689
  it('should create a tool message and insert into messagePlugins table', async () => {
690
- // 调用 create 方法
690
+ // Call create method
691
691
  const result = await messageModel.create({
692
692
  content: 'message 1',
693
693
  role: 'tool',
@@ -701,7 +701,7 @@ describe('MessageModel', () => {
701
701
  },
702
702
  });
703
703
 
704
- // 断言结果
704
+ // Assert result
705
705
  expect(result.id).toBeDefined();
706
706
  expect(result.content).toBe('message 1');
707
707
  expect(result.role).toBe('tool');
@@ -716,7 +716,7 @@ describe('MessageModel', () => {
716
716
  });
717
717
 
718
718
  it('should create tool message ', async () => {
719
- // 调用 create 方法
719
+ // Call create method
720
720
  const state = {
721
721
  query: 'Composio',
722
722
  answers: [],
@@ -768,7 +768,7 @@ describe('MessageModel', () => {
768
768
  sessionId: '1',
769
769
  });
770
770
 
771
- // 断言结果
771
+ // Assert result
772
772
  expect(result.id).toBeDefined();
773
773
  expect(result.content).toBe('[{}]');
774
774
  expect(result.role).toBe('tool');
@@ -798,14 +798,14 @@ describe('MessageModel', () => {
798
798
 
799
799
  expect(result.id).toBe(customId);
800
800
 
801
- // 验证数据库中的记录
801
+ // Verify database records
802
802
  const dbResult = await serverDB.select().from(messages).where(eq(messages.id, customId));
803
803
  expect(dbResult).toHaveLength(1);
804
804
  expect(dbResult[0].id).toBe(customId);
805
805
  });
806
806
 
807
807
  it.skip('should create a message with file chunks and RAG query ID', async () => {
808
- // 创建测试数据
808
+ // Create test data
809
809
  const chunkId1 = uuid();
810
810
  const chunkId2 = uuid();
811
811
  const ragQueryId = uuid();
@@ -815,7 +815,7 @@ describe('MessageModel', () => {
815
815
  { id: chunkId2, text: 'chunk text 2' },
816
816
  ]);
817
817
 
818
- // 调用 create 方法
818
+ // Call create method
819
819
  const result = await messageModel.create({
820
820
  role: 'assistant',
821
821
  content: 'message with file chunks',
@@ -827,10 +827,10 @@ describe('MessageModel', () => {
827
827
  sessionId: '1',
828
828
  });
829
829
 
830
- // 验证消息创建成功
830
+ // Verify message created successfully
831
831
  expect(result.id).toBeDefined();
832
832
 
833
- // 验证消息查询块关联创建成功
833
+ // Verify message query chunk associations created successfully
834
834
  const queryChunks = await serverDB
835
835
  .select()
836
836
  .from(messageQueryChunks)
@@ -845,7 +845,7 @@ describe('MessageModel', () => {
845
845
  });
846
846
 
847
847
  it('should create a message with files', async () => {
848
- // 创建测试数据
848
+ // Create test data
849
849
  await serverDB.insert(files).values([
850
850
  {
851
851
  id: 'file1',
@@ -865,7 +865,7 @@ describe('MessageModel', () => {
865
865
  },
866
866
  ]);
867
867
 
868
- // 调用 create 方法
868
+ // Call create method
869
869
  const result = await messageModel.create({
870
870
  role: 'user',
871
871
  content: 'message with files',
@@ -873,10 +873,10 @@ describe('MessageModel', () => {
873
873
  sessionId: '1',
874
874
  });
875
875
 
876
- // 验证消息创建成功
876
+ // Verify message created successfully
877
877
  expect(result.id).toBeDefined();
878
878
 
879
- // 验证消息文件关联创建成功
879
+ // Verify message file associations created successfully
880
880
  const messageFiles = await serverDB
881
881
  .select()
882
882
  .from(messagesFiles)
@@ -899,10 +899,10 @@ describe('MessageModel', () => {
899
899
  sessionId: '1',
900
900
  });
901
901
 
902
- // 验证数据库中的记录
902
+ // Verify database records
903
903
  const dbResult = await serverDB.select().from(messages).where(eq(messages.id, result.id));
904
904
 
905
- // 日期比较需要考虑时区和格式化问题,所以使用 toISOString 进行比较
905
+ // Date comparison needs to consider timezone and formatting, so use toISOString for comparison
906
906
  expect(new Date(dbResult[0].createdAt!).toISOString()).toBe(
907
907
  new Date(customCreatedAt).toISOString(),
908
908
  );
@@ -915,16 +915,16 @@ describe('MessageModel', () => {
915
915
 
916
916
  describe('batchCreateMessages', () => {
917
917
  it('should batch create messages', async () => {
918
- // 准备测试数据
918
+ // Prepare test data
919
919
  const newMessages = [
920
920
  { id: '1', role: 'user', content: 'message 1' },
921
921
  { id: '2', role: 'assistant', content: 'message 2' },
922
922
  ] as DBMessageItem[];
923
923
 
924
- // 调用 batchCreateMessages 方法
924
+ // Call batchCreateMessages method
925
925
  await messageModel.batchCreate(newMessages);
926
926
 
927
- // 断言结果
927
+ // Assert result
928
928
  const result = await serverDB.select().from(messages).where(eq(messages.userId, userId));
929
929
  expect(result).toHaveLength(2);
930
930
  expect(result[0].content).toBe('message 1');
@@ -932,109 +932,37 @@ describe('MessageModel', () => {
932
932
  });
933
933
  });
934
934
 
935
- describe('createNewMessage', () => {
936
- it('should create message and return id with messages list', async () => {
937
- // 调用 createNewMessage 方法
938
- const result = await messageModel.createNewMessage({
939
- role: 'user',
940
- content: 'test message',
941
- sessionId: '1',
942
- });
943
-
944
- // 断言返回结构
945
- expect(result).toHaveProperty('id');
946
- expect(result).toHaveProperty('messages');
947
- expect(result.id).toBeDefined();
948
- expect(result.messages).toBeInstanceOf(Array);
949
- });
950
-
951
- it('should return newly created message in messages list', async () => {
952
- const content = 'new test message ' + Date.now();
953
-
954
- const result = await messageModel.createNewMessage({
955
- role: 'user',
956
- content,
957
- sessionId: '1',
958
- });
959
-
960
- // 验证新创建的消息在列表中
961
- const createdMessage = result.messages.find((m) => m.id === result.id);
962
- expect(createdMessage).toBeDefined();
963
- expect(createdMessage?.content).toBe(content);
964
- expect(createdMessage?.role).toBe('user');
965
- });
966
-
967
- it('should return all messages for the session', async () => {
968
- // 创建多条消息
969
- await messageModel.create({ role: 'user', content: 'message 1', sessionId: '1' });
970
- await messageModel.create({ role: 'assistant', content: 'message 2', sessionId: '1' });
971
-
972
- // 创建第三条消息并获取完整列表
973
- const result = await messageModel.createNewMessage({
974
- role: 'user',
975
- content: 'message 3',
976
- sessionId: '1',
977
- });
978
-
979
- // 验证返回了所有消息
980
- expect(result.messages.length).toBeGreaterThanOrEqual(3);
981
- });
982
-
983
- it('should filter messages by topicId if provided', async () => {
984
- const topicId = 'topic-1';
985
- await serverDB.insert(topics).values({ id: topicId, sessionId: '1', userId });
986
-
987
- // 创建不同 topic 的消息
988
- await messageModel.create({ role: 'user', content: 'topic 1 msg', sessionId: '1', topicId });
989
- await messageModel.create({ role: 'user', content: 'no topic msg', sessionId: '1' });
990
-
991
- // 创建新消息并指定 topicId
992
- const result = await messageModel.createNewMessage({
993
- role: 'user',
994
- content: 'new topic msg',
995
- sessionId: '1',
996
- topicId,
997
- });
998
-
999
- // 验证只返回该 topic 的消息
1000
- expect(result.messages.every((m) => m.topicId === topicId || m.topicId === undefined)).toBe(
1001
- true,
1002
- );
1003
- expect(result.messages.find((m) => m.content === 'no topic msg')).toBeUndefined();
1004
- });
1005
- });
1006
-
1007
935
  describe('updateMessage', () => {
1008
936
  it('should update message content', async () => {
1009
- // 创建测试数据
937
+ // Create test data
1010
938
  await serverDB
1011
939
  .insert(messages)
1012
940
  .values([{ id: '1', userId, role: 'user', content: 'message 1' }]);
1013
941
 
1014
- // 调用 updateMessage 方法
942
+ // Call updateMessage method
1015
943
  await messageModel.update('1', { content: 'updated message' });
1016
944
 
1017
- // 断言结果
945
+ // Assert result
1018
946
  const result = await serverDB.select().from(messages).where(eq(messages.id, '1'));
1019
947
  expect(result[0].content).toBe('updated message');
1020
948
  });
1021
949
 
1022
950
  it('should only update messages belonging to the user', async () => {
1023
- // 创建测试数据
951
+ // Create test data
1024
952
  await serverDB
1025
953
  .insert(messages)
1026
954
  .values([{ id: '1', userId: '456', role: 'user', content: 'message 1' }]);
1027
955
 
1028
- // 调用 updateMessage 方法
956
+ // Call updateMessage method
1029
957
  await messageModel.update('1', { content: 'updated message' });
1030
958
 
1031
- // 断言结果
959
+ // Assert result
1032
960
  const result = await serverDB.select().from(messages).where(eq(messages.id, '1'));
1033
961
  expect(result[0].content).toBe('message 1');
1034
962
  });
1035
963
 
1036
964
  it('should update message tools', async () => {
1037
- // 创建测试数据
965
+ // Create test data
1038
966
  await serverDB.insert(messages).values([
1039
967
  {
1040
968
  id: '1',
@@ -1054,7 +982,7 @@ describe('MessageModel', () => {
1054
982
  },
1055
983
  ]);
1056
984
 
1057
- // 调用 updateMessage 方法
985
+ // Call updateMessage method
1058
986
  await messageModel.update('1', {
1059
987
  tools: [
1060
988
  {
@@ -1067,7 +995,7 @@ describe('MessageModel', () => {
1067
995
  ],
1068
996
  });
1069
997
 
1070
- // 断言结果
998
+ // Assert result
1071
999
  const result = await serverDB.select().from(messages).where(eq(messages.id, '1'));
1072
1000
  expect((result[0].tools as any)[0].arguments).toBe(
1073
1001
  '{"query":"2024 杭州暴雨","searchEngines":["duckduckgo","google","brave"]}',
@@ -1076,7 +1004,7 @@ describe('MessageModel', () => {
1076
1004
 
1077
1005
  describe('update with imageList', () => {
1078
1006
  it('should update a message and add image files', async () => {
1079
- // 创建测试数据
1007
+ // Create test data
1080
1008
  await serverDB.insert(messages).values({
1081
1009
  id: 'msg-to-update',
1082
1010
  userId,
@@ -1096,7 +1024,7 @@ describe('MessageModel', () => {
1096
1024
  { id: 'img2', name: 'image2.png', fileType: 'image/png', size: 200, url: 'url2', userId },
1097
1025
  ]);
1098
1026
 
1099
- // 调用 update 方法
1027
+ // Call update method
1100
1028
  await messageModel.update('msg-to-update', {
1101
1029
  content: 'updated content',
1102
1030
  imageList: [
@@ -1105,7 +1033,7 @@ describe('MessageModel', () => {
1105
1033
  ],
1106
1034
  });
1107
1035
 
1108
- // 验证消息更新成功
1036
+ // Verify message updated successfully
1109
1037
  const updatedMessage = await serverDB
1110
1038
  .select()
1111
1039
  .from(messages)
@@ -1113,7 +1041,7 @@ describe('MessageModel', () => {
1113
1041
 
1114
1042
  expect(updatedMessage[0].content).toBe('updated content');
1115
1043
 
1116
- // 验证消息文件关联创建成功
1044
+ // Verify message file associations created successfully
1117
1045
  const messageFiles = await serverDB
1118
1046
  .select()
1119
1047
  .from(messagesFiles)
@@ -1125,7 +1053,7 @@ describe('MessageModel', () => {
1125
1053
  });
1126
1054
 
1127
1055
  it('should handle empty imageList', async () => {
1128
- // 创建测试数据
1056
+ // Create test data
1129
1057
  await serverDB.insert(messages).values({
1130
1058
  id: 'msg-no-images',
1131
1059
  userId,
@@ -1133,12 +1061,12 @@ describe('MessageModel', () => {
1133
1061
  content: 'original content',
1134
1062
  });
1135
1063
 
1136
- // 调用 update 方法,不提供 imageList
1064
+ // Call update method without providing imageList
1137
1065
  await messageModel.update('msg-no-images', {
1138
1066
  content: 'updated content',
1139
1067
  });
1140
1068
 
1141
- // 验证消息更新成功
1069
+ // Verify message updated successfully
1142
1070
  const updatedMessage = await serverDB
1143
1071
  .select()
1144
1072
  .from(messages)
@@ -1146,7 +1074,7 @@ describe('MessageModel', () => {
1146
1074
 
1147
1075
  expect(updatedMessage[0].content).toBe('updated content');
1148
1076
 
1149
- // 验证没有创建消息文件关联
1077
+ // Verify no message file associations created
1150
1078
  const messageFiles = await serverDB
1151
1079
  .select()
1152
1080
  .from(messagesFiles)
@@ -1156,7 +1084,7 @@ describe('MessageModel', () => {
1156
1084
  });
1157
1085
 
1158
1086
  it('should update multiple fields at once', async () => {
1159
- // 创建测试数据
1087
+ // Create test data
1160
1088
  await serverDB.insert(messages).values({
1161
1089
  id: 'msg-multi-update',
1162
1090
  userId,
@@ -1165,7 +1093,7 @@ describe('MessageModel', () => {
1165
1093
  model: 'gpt-3.5',
1166
1094
  });
1167
1095
 
1168
- // 调用 update 方法,更新多个字段
1096
+ // Call update method to update multiple fields
1169
1097
  await messageModel.update('msg-multi-update', {
1170
1098
  content: 'updated content',
1171
1099
  role: 'assistant',
@@ -1173,7 +1101,7 @@ describe('MessageModel', () => {
1173
1101
  metadata: { tps: 1 },
1174
1102
  });
1175
1103
 
1176
- // 验证消息更新成功
1104
+ // Verify message updated successfully
1177
1105
  const updatedMessage = await serverDB
1178
1106
  .select()
1179
1107
  .from(messages)
@@ -1185,11 +1113,106 @@ describe('MessageModel', () => {
1185
1113
  expect(updatedMessage[0].metadata).toEqual({ tps: 1 });
1186
1114
  });
1187
1115
  });
1116
+
1117
+ describe('update with returnQuery option', () => {
1118
+ it('should return updated message list when sessionId is provided', async () => {
1119
+ // Create test data
1120
+ const sessionId = '1';
1121
+ await serverDB.insert(messages).values([
1122
+ {
1123
+ id: 'msg1',
1124
+ userId,
1125
+ sessionId,
1126
+ role: 'user',
1127
+ content: 'message 1',
1128
+ },
1129
+ {
1130
+ id: 'msg2',
1131
+ userId,
1132
+ sessionId,
1133
+ role: 'assistant',
1134
+ content: 'message 2',
1135
+ },
1136
+ ]);
1137
+
1138
+ // Call update method with sessionId option
1139
+ const result = await messageModel.update(
1140
+ 'msg1',
1141
+ { content: 'updated message 1' },
1142
+ { sessionId },
1143
+ );
1144
+
1145
+ // Verify return result contains message list
1146
+ expect(result.success).toBe(true);
1147
+ expect(result.messages).toBeDefined();
1148
+ expect(result.messages).toHaveLength(2);
1149
+ expect(result.messages![0].content).toBe('updated message 1');
1150
+ expect(result.messages![1].content).toBe('message 2');
1151
+ });
1152
+
1153
+ it('should return updated message list when topicId is provided', async () => {
1154
+ // Create test data
1155
+ const sessionId = '1';
1156
+ const topicId = 'topic-1';
1157
+ await serverDB.insert(topics).values({ id: topicId, sessionId, userId });
1158
+ await serverDB.insert(messages).values([
1159
+ {
1160
+ id: 'msg-topic1',
1161
+ userId,
1162
+ sessionId,
1163
+ topicId,
1164
+ role: 'user',
1165
+ content: 'topic message 1',
1166
+ },
1167
+ {
1168
+ id: 'msg-topic2',
1169
+ userId,
1170
+ sessionId,
1171
+ topicId,
1172
+ role: 'assistant',
1173
+ content: 'topic message 2',
1174
+ },
1175
+ ]);
1176
+
1177
+ // Call update method with topicId option
1178
+ const result = await messageModel.update(
1179
+ 'msg-topic1',
1180
+ { content: 'updated topic message 1' },
1181
+ { topicId, sessionId },
1182
+ );
1183
+
1184
+ // Verify return result contains message list
1185
+ expect(result.success).toBe(true);
1186
+ expect(result.messages).toBeDefined();
1187
+ expect(result.messages).toHaveLength(2);
1188
+ expect(result.messages![0].content).toBe('updated topic message 1');
1189
+ expect(result.messages![1].content).toBe('topic message 2');
1190
+ });
1191
+
1192
+ it('should return success without messages when options not provided', async () => {
1193
+ // Create test data
1194
+ await serverDB.insert(messages).values({
1195
+ id: 'msg-no-options',
1196
+ userId,
1197
+ role: 'user',
1198
+ content: 'original content',
1199
+ });
1200
+
1201
+ // Call update method,不提供选项
1202
+ const result = await messageModel.update('msg-no-options', {
1203
+ content: 'updated content',
1204
+ });
1205
+
1206
+ // 验证返回结果不包含消息列表
1207
+ expect(result.success).toBe(true);
1208
+ expect(result.messages).toBeUndefined();
1209
+ });
1210
+ });
1188
1211
  });
1189
1212
 
1190
1213
  describe('deleteMessage', () => {
1191
1214
  it('should delete a message', async () => {
1192
- // 创建测试数据
1215
+ // Create test data
1193
1216
  await serverDB
1194
1217
  .insert(messages)
1195
1218
  .values([{ id: '1', userId, role: 'user', content: 'message 1' }]);
@@ -1197,13 +1220,13 @@ describe('MessageModel', () => {
1197
1220
  // 调用 deleteMessage 方法
1198
1221
  await messageModel.deleteMessage('1');
1199
1222
 
1200
- // 断言结果
1223
+ // Assert result
1201
1224
  const result = await serverDB.select().from(messages).where(eq(messages.id, '1'));
1202
1225
  expect(result).toHaveLength(0);
1203
1226
  });
1204
1227
 
1205
1228
  it('should delete a message with tool calls', async () => {
1206
- // 创建测试数据
1229
+ // Create test data
1207
1230
  await serverDB.transaction(async (trx) => {
1208
1231
  await trx.insert(messages).values([
1209
1232
  { id: '1', userId, role: 'user', content: 'message 1', tools: [{ id: 'tool1' }] },
@@ -1217,7 +1240,7 @@ describe('MessageModel', () => {
1217
1240
  // 调用 deleteMessage 方法
1218
1241
  await messageModel.deleteMessage('1');
1219
1242
 
1220
- // 断言结果
1243
+ // Assert result
1221
1244
  const result = await serverDB.select().from(messages).where(eq(messages.id, '1'));
1222
1245
  expect(result).toHaveLength(0);
1223
1246
 
@@ -1230,7 +1253,7 @@ describe('MessageModel', () => {
1230
1253
  });
1231
1254
 
1232
1255
  it('should only delete messages belonging to the user', async () => {
1233
- // 创建测试数据
1256
+ // Create test data
1234
1257
  await serverDB
1235
1258
  .insert(messages)
1236
1259
  .values([{ id: '1', userId: '456', role: 'user', content: 'message 1' }]);
@@ -1238,7 +1261,7 @@ describe('MessageModel', () => {
1238
1261
  // 调用 deleteMessage 方法
1239
1262
  await messageModel.deleteMessage('1');
1240
1263
 
1241
- // 断言结果
1264
+ // Assert result
1242
1265
  const result = await serverDB.select().from(messages).where(eq(messages.id, '1'));
1243
1266
  expect(result).toHaveLength(1);
1244
1267
  });
@@ -1246,7 +1269,7 @@ describe('MessageModel', () => {
1246
1269
 
1247
1270
  describe('deleteMessages', () => {
1248
1271
  it('should delete 2 messages', async () => {
1249
- // 创建测试数据
1272
+ // Create test data
1250
1273
  await serverDB.insert(messages).values([
1251
1274
  { id: '1', userId, role: 'user', content: 'message 1' },
1252
1275
  { id: '2', userId, role: 'user', content: 'message 2' },
@@ -1255,7 +1278,7 @@ describe('MessageModel', () => {
1255
1278
  // 调用 deleteMessage 方法
1256
1279
  await messageModel.deleteMessages(['1', '2']);
1257
1280
 
1258
- // 断言结果
1281
+ // Assert result
1259
1282
  const result = await serverDB.select().from(messages).where(eq(messages.id, '1'));
1260
1283
  expect(result).toHaveLength(0);
1261
1284
  const result2 = await serverDB.select().from(messages).where(eq(messages.id, '2'));
@@ -1263,7 +1286,7 @@ describe('MessageModel', () => {
1263
1286
  });
1264
1287
 
1265
1288
  it('should only delete messages belonging to the user', async () => {
1266
- // 创建测试数据
1289
+ // Create test data
1267
1290
  await serverDB.insert(messages).values([
1268
1291
  { id: '1', userId: '456', role: 'user', content: 'message 1' },
1269
1292
  { id: '2', userId: '456', role: 'user', content: 'message 1' },
@@ -1272,7 +1295,7 @@ describe('MessageModel', () => {
1272
1295
  // 调用 deleteMessage 方法
1273
1296
  await messageModel.deleteMessages(['1', '2']);
1274
1297
 
1275
- // 断言结果
1298
+ // Assert result
1276
1299
  const result = await serverDB.select().from(messages).where(eq(messages.id, '1'));
1277
1300
  expect(result).toHaveLength(1);
1278
1301
  });
@@ -1280,7 +1303,7 @@ describe('MessageModel', () => {
1280
1303
 
1281
1304
  describe('deleteAllMessages', () => {
1282
1305
  it('should delete all messages belonging to the user', async () => {
1283
- // 创建测试数据
1306
+ // Create test data
1284
1307
  await serverDB.insert(messages).values([
1285
1308
  { id: '1', userId, role: 'user', content: 'message 1' },
1286
1309
  { id: '2', userId, role: 'user', content: 'message 2' },
@@ -1290,7 +1313,7 @@ describe('MessageModel', () => {
1290
1313
  // 调用 deleteAllMessages 方法
1291
1314
  await messageModel.deleteAllMessages();
1292
1315
 
1293
- // 断言结果
1316
+ // Assert result
1294
1317
  const result = await serverDB.select().from(messages).where(eq(messages.userId, userId));
1295
1318
 
1296
1319
  expect(result).toHaveLength(0);
@@ -1303,7 +1326,7 @@ describe('MessageModel', () => {
1303
1326
 
1304
1327
  describe('updatePluginState', () => {
1305
1328
  it('should update the state field in messagePlugins table', async () => {
1306
- // 创建测试数据
1329
+ // Create test data
1307
1330
  await serverDB.insert(messages).values({ id: '1', content: 'abc', role: 'user', userId });
1308
1331
  await serverDB.insert(messagePlugins).values([
1309
1332
  {
@@ -1318,7 +1341,7 @@ describe('MessageModel', () => {
1318
1341
  // 调用 updatePluginState 方法
1319
1342
  await messageModel.updatePluginState('1', { key2: 'value2' });
1320
1343
 
1321
- // 断言结果
1344
+ // Assert result
1322
1345
  const result = await serverDB.select().from(messagePlugins).where(eq(messagePlugins.id, '1'));
1323
1346
 
1324
1347
  expect(result[0].state).toEqual({ key1: 'value1', key2: 'value2' });
@@ -1333,7 +1356,7 @@ describe('MessageModel', () => {
1333
1356
  });
1334
1357
  describe('updateMessagePlugin', () => {
1335
1358
  it('should update the state field in messagePlugins table', async () => {
1336
- // 创建测试数据
1359
+ // Create test data
1337
1360
  await serverDB.insert(messages).values({ id: '1', content: 'abc', role: 'user', userId });
1338
1361
  await serverDB.insert(messagePlugins).values([
1339
1362
  {
@@ -1348,7 +1371,7 @@ describe('MessageModel', () => {
1348
1371
  // 调用 updatePluginState 方法
1349
1372
  await messageModel.updateMessagePlugin('1', { identifier: 'plugin2' });
1350
1373
 
1351
- // 断言结果
1374
+ // Assert result
1352
1375
  const result = await serverDB.select().from(messagePlugins).where(eq(messagePlugins.id, '1'));
1353
1376
 
1354
1377
  expect(result[0].identifier).toEqual('plugin2');
@@ -1364,7 +1387,7 @@ describe('MessageModel', () => {
1364
1387
 
1365
1388
  describe('updateMetadata', () => {
1366
1389
  it('should update metadata for an existing message', async () => {
1367
- // 创建测试数据
1390
+ // Create test data
1368
1391
  await serverDB.insert(messages).values({
1369
1392
  id: 'msg-with-metadata',
1370
1393
  userId,
@@ -1376,7 +1399,7 @@ describe('MessageModel', () => {
1376
1399
  // 调用 updateMetadata 方法
1377
1400
  await messageModel.updateMetadata('msg-with-metadata', { newKey: 'newValue' });
1378
1401
 
1379
- // 断言结果
1402
+ // Assert result
1380
1403
  const result = await serverDB
1381
1404
  .select()
1382
1405
  .from(messages)
@@ -1389,7 +1412,7 @@ describe('MessageModel', () => {
1389
1412
  });
1390
1413
 
1391
1414
  it('should merge new metadata with existing metadata using lodash merge behavior', async () => {
1392
- // 创建测试数据
1415
+ // Create test data
1393
1416
  await serverDB.insert(messages).values({
1394
1417
  id: 'msg-merge-metadata',
1395
1418
  userId,
@@ -1413,7 +1436,7 @@ describe('MessageModel', () => {
1413
1436
  newTopLevel: 'value',
1414
1437
  });
1415
1438
 
1416
- // 断言结果 - 应该使用 lodash merge 行为
1439
+ // Assert result - 应该使用 lodash merge 行为
1417
1440
  const result = await serverDB
1418
1441
  .select()
1419
1442
  .from(messages)
@@ -1434,12 +1457,12 @@ describe('MessageModel', () => {
1434
1457
  // 调用 updateMetadata 方法,尝试更新不存在的消息
1435
1458
  const result = await messageModel.updateMetadata('non-existent-id', { key: 'value' });
1436
1459
 
1437
- // 断言结果 - 应该返回 undefined
1460
+ // Assert result - 应该返回 undefined
1438
1461
  expect(result).toBeUndefined();
1439
1462
  });
1440
1463
 
1441
1464
  it('should handle empty metadata updates', async () => {
1442
- // 创建测试数据
1465
+ // Create test data
1443
1466
  await serverDB.insert(messages).values({
1444
1467
  id: 'msg-empty-metadata',
1445
1468
  userId,
@@ -1451,7 +1474,7 @@ describe('MessageModel', () => {
1451
1474
  // 调用 updateMetadata 方法,传递空对象
1452
1475
  await messageModel.updateMetadata('msg-empty-metadata', {});
1453
1476
 
1454
- // 断言结果 - 原始 metadata 应该保持不变
1477
+ // Assert result - 原始 metadata 应该保持不变
1455
1478
  const result = await serverDB
1456
1479
  .select()
1457
1480
  .from(messages)
@@ -1461,7 +1484,7 @@ describe('MessageModel', () => {
1461
1484
  });
1462
1485
 
1463
1486
  it('should handle message with null metadata', async () => {
1464
- // 创建测试数据
1487
+ // Create test data
1465
1488
  await serverDB.insert(messages).values({
1466
1489
  id: 'msg-null-metadata',
1467
1490
  userId,
@@ -1473,7 +1496,7 @@ describe('MessageModel', () => {
1473
1496
  // 调用 updateMetadata 方法
1474
1497
  await messageModel.updateMetadata('msg-null-metadata', { key: 'value' });
1475
1498
 
1476
- // 断言结果 - 应该创建新的 metadata
1499
+ // Assert result - 应该创建新的 metadata
1477
1500
  const result = await serverDB
1478
1501
  .select()
1479
1502
  .from(messages)
@@ -1483,7 +1506,7 @@ describe('MessageModel', () => {
1483
1506
  });
1484
1507
 
1485
1508
  it('should only update messages belonging to the current user', async () => {
1486
- // 创建测试数据 - 其他用户的消息
1509
+ // Create test data - 其他用户的消息
1487
1510
  await serverDB.insert(messages).values({
1488
1511
  id: 'msg-other-user',
1489
1512
  userId: '456',
@@ -1497,7 +1520,7 @@ describe('MessageModel', () => {
1497
1520
  hackedKey: 'hackedValue',
1498
1521
  });
1499
1522
 
1500
- // 断言结果 - 应该返回 undefined
1523
+ // Assert result - 应该返回 undefined
1501
1524
  expect(result).toBeUndefined();
1502
1525
 
1503
1526
  // 验证原始 metadata 未被修改
@@ -1510,7 +1533,7 @@ describe('MessageModel', () => {
1510
1533
  });
1511
1534
 
1512
1535
  it('should handle complex nested metadata updates', async () => {
1513
- // 创建测试数据
1536
+ // Create test data
1514
1537
  await serverDB.insert(messages).values({
1515
1538
  id: 'msg-complex-metadata',
1516
1539
  userId,
@@ -1539,7 +1562,7 @@ describe('MessageModel', () => {
1539
1562
  stats: { count: 10 },
1540
1563
  });
1541
1564
 
1542
- // 断言结果
1565
+ // Assert result
1543
1566
  const result = await serverDB
1544
1567
  .select()
1545
1568
  .from(messages)
@@ -1562,7 +1585,7 @@ describe('MessageModel', () => {
1562
1585
 
1563
1586
  describe('updateTranslate', () => {
1564
1587
  it('should insert a new record if message does not exist in messageTranslates table', async () => {
1565
- // 创建测试数据
1588
+ // Create test data
1566
1589
  await serverDB
1567
1590
  .insert(messages)
1568
1591
  .values([{ id: '1', userId, role: 'user', content: 'message 1' }]);
@@ -1574,7 +1597,7 @@ describe('MessageModel', () => {
1574
1597
  to: 'zh',
1575
1598
  });
1576
1599
 
1577
- // 断言结果
1600
+ // Assert result
1578
1601
  const result = await serverDB
1579
1602
  .select()
1580
1603
  .from(messageTranslates)
@@ -1585,7 +1608,7 @@ describe('MessageModel', () => {
1585
1608
  });
1586
1609
 
1587
1610
  it('should update the corresponding fields if message exists in messageTranslates table', async () => {
1588
- // 创建测试数据
1611
+ // Create test data
1589
1612
  await serverDB.transaction(async (trx) => {
1590
1613
  await trx
1591
1614
  .insert(messages)
@@ -1598,7 +1621,7 @@ describe('MessageModel', () => {
1598
1621
  // 调用 updateTranslate 方法
1599
1622
  await messageModel.updateTranslate('1', { content: 'updated translated message 1' });
1600
1623
 
1601
- // 断言结果
1624
+ // Assert result
1602
1625
  const result = await serverDB
1603
1626
  .select()
1604
1627
  .from(messageTranslates)
@@ -1610,7 +1633,7 @@ describe('MessageModel', () => {
1610
1633
 
1611
1634
  describe('updateTTS', () => {
1612
1635
  it('should insert a new record if message does not exist in messageTTS table', async () => {
1613
- // 创建测试数据
1636
+ // Create test data
1614
1637
  await serverDB
1615
1638
  .insert(messages)
1616
1639
  .values([{ id: '1', userId, role: 'user', content: 'message 1' }]);
@@ -1618,7 +1641,7 @@ describe('MessageModel', () => {
1618
1641
  // 调用 updateTTS 方法
1619
1642
  await messageModel.updateTTS('1', { contentMd5: 'md5', file: 'f1', voice: 'voice1' });
1620
1643
 
1621
- // 断言结果
1644
+ // Assert result
1622
1645
  const result = await serverDB.select().from(messageTTS).where(eq(messageTTS.id, '1'));
1623
1646
 
1624
1647
  expect(result).toHaveLength(1);
@@ -1626,7 +1649,7 @@ describe('MessageModel', () => {
1626
1649
  });
1627
1650
 
1628
1651
  it('should update the corresponding fields if message exists in messageTTS table', async () => {
1629
- // 创建测试数据
1652
+ // Create test data
1630
1653
  await serverDB.transaction(async (trx) => {
1631
1654
  await trx
1632
1655
  .insert(messages)
@@ -1639,7 +1662,7 @@ describe('MessageModel', () => {
1639
1662
  // 调用 updateTTS 方法
1640
1663
  await messageModel.updateTTS('1', { voice: 'updated voice1' });
1641
1664
 
1642
- // 断言结果
1665
+ // Assert result
1643
1666
  const result = await serverDB.select().from(messageTTS).where(eq(messageTTS.id, '1'));
1644
1667
 
1645
1668
  expect(result[0].voice).toBe('updated voice1');
@@ -1648,14 +1671,14 @@ describe('MessageModel', () => {
1648
1671
 
1649
1672
  describe('deleteMessageTranslate', () => {
1650
1673
  it('should delete the message translate record', async () => {
1651
- // 创建测试数据
1674
+ // Create test data
1652
1675
  await serverDB.insert(messages).values([{ id: '1', role: 'abc', userId }]);
1653
1676
  await serverDB.insert(messageTranslates).values([{ id: '1', userId }]);
1654
1677
 
1655
1678
  // 调用 deleteMessageTranslate 方法
1656
1679
  await messageModel.deleteMessageTranslate('1');
1657
1680
 
1658
- // 断言结果
1681
+ // Assert result
1659
1682
  const result = await serverDB
1660
1683
  .select()
1661
1684
  .from(messageTranslates)
@@ -1667,14 +1690,14 @@ describe('MessageModel', () => {
1667
1690
 
1668
1691
  describe('deleteMessageTTS', () => {
1669
1692
  it('should delete the message TTS record', async () => {
1670
- // 创建测试数据
1693
+ // Create test data
1671
1694
  await serverDB.insert(messages).values([{ id: '1', role: 'abc', userId }]);
1672
1695
  await serverDB.insert(messageTTS).values([{ userId, id: '1' }]);
1673
1696
 
1674
1697
  // 调用 deleteMessageTTS 方法
1675
1698
  await messageModel.deleteMessageTTS('1');
1676
1699
 
1677
- // 断言结果
1700
+ // Assert result
1678
1701
  const result = await serverDB.select().from(messageTTS).where(eq(messageTTS.id, '1'));
1679
1702
  expect(result).toHaveLength(0);
1680
1703
  });
@@ -1682,7 +1705,7 @@ describe('MessageModel', () => {
1682
1705
 
1683
1706
  describe('count', () => {
1684
1707
  it('should return the count of messages belonging to the user', async () => {
1685
- // 创建测试数据
1708
+ // Create test data
1686
1709
  await serverDB.insert(messages).values([
1687
1710
  { id: '1', userId, role: 'user', content: 'message 1' },
1688
1711
  { id: '2', userId, role: 'user', content: 'message 2' },
@@ -1692,13 +1715,13 @@ describe('MessageModel', () => {
1692
1715
  // 调用 count 方法
1693
1716
  const result = await messageModel.count();
1694
1717
 
1695
- // 断言结果
1718
+ // Assert result
1696
1719
  expect(result).toBe(2);
1697
1720
  });
1698
1721
 
1699
1722
  describe('count with date filters', () => {
1700
1723
  beforeEach(async () => {
1701
- // 创建测试数据,包含不同日期的消息
1724
+ // Create test data,包含不同日期的消息
1702
1725
  await serverDB.insert(messages).values([
1703
1726
  {
1704
1727
  id: 'date1',
@@ -1919,7 +1942,7 @@ describe('MessageModel', () => {
1919
1942
 
1920
1943
  describe('countWords', () => {
1921
1944
  it('should count total words of messages belonging to the user', async () => {
1922
- // 创建测试数据
1945
+ // Create test data
1923
1946
  await serverDB.insert(messages).values([
1924
1947
  { id: '1', userId, role: 'user', content: 'hello world' },
1925
1948
  { id: '2', userId, role: 'user', content: 'test message' },
@@ -1929,12 +1952,12 @@ describe('MessageModel', () => {
1929
1952
  // 调用 countWords 方法
1930
1953
  const result = await messageModel.countWords();
1931
1954
 
1932
- // 断言结果 - 'hello world' + 'test message' = 23 characters
1955
+ // Assert result - 'hello world' + 'test message' = 23 characters
1933
1956
  expect(result).toEqual(23);
1934
1957
  });
1935
1958
 
1936
1959
  it('should count words within date range', async () => {
1937
- // 创建测试数据
1960
+ // Create test data
1938
1961
  await serverDB.insert(messages).values([
1939
1962
  {
1940
1963
  id: '1',
@@ -1957,12 +1980,12 @@ describe('MessageModel', () => {
1957
1980
  range: ['2023-05-01', '2023-07-01'],
1958
1981
  });
1959
1982
 
1960
- // 断言结果 - 只计算 'new message' = 11 characters
1983
+ // Assert result - 只计算 'new message' = 11 characters
1961
1984
  expect(result).toEqual(11);
1962
1985
  });
1963
1986
 
1964
1987
  it('should handle empty content', async () => {
1965
- // 创建测试数据
1988
+ // Create test data
1966
1989
  await serverDB.insert(messages).values([
1967
1990
  { id: '1', userId, role: 'user', content: '' },
1968
1991
  { id: '2', userId, role: 'user', content: null },
@@ -1971,7 +1994,7 @@ describe('MessageModel', () => {
1971
1994
  // 调用 countWords 方法
1972
1995
  const result = await messageModel.countWords();
1973
1996
 
1974
- // 断言结果
1997
+ // Assert result
1975
1998
  expect(result).toEqual(0);
1976
1999
  });
1977
2000
  });
@@ -1988,7 +2011,7 @@ describe('MessageModel', () => {
1988
2011
  const oneDayAgoDate = today.subtract(1, 'day').format('YYYY-MM-DD');
1989
2012
  const todayDate = today.format('YYYY-MM-DD');
1990
2013
 
1991
- // 创建测试数据
2014
+ // Create test data
1992
2015
  await serverDB.insert(messages).values([
1993
2016
  {
1994
2017
  id: '1',
@@ -2016,7 +2039,7 @@ describe('MessageModel', () => {
2016
2039
  // 调用 getHeatmaps 方法
2017
2040
  const result = await messageModel.getHeatmaps();
2018
2041
 
2019
- // 断言结果
2042
+ // Assert result
2020
2043
  expect(result.length).toBeGreaterThanOrEqual(366);
2021
2044
  expect(result.length).toBeLessThan(368);
2022
2045
 
@@ -2051,7 +2074,7 @@ describe('MessageModel', () => {
2051
2074
  const oneDayAgoDate = today.subtract(1, 'day').format('YYYY-MM-DD');
2052
2075
  const todayDate = today.format('YYYY-MM-DD');
2053
2076
 
2054
- // 创建测试数据 - 不同数量的消息以测试不同的等级
2077
+ // Create test data - 不同数量的消息以测试不同的等级
2055
2078
  await serverDB.insert(messages).values([
2056
2079
  // 1 message - level 1
2057
2080
  {
@@ -2141,7 +2164,7 @@ describe('MessageModel', () => {
2141
2164
  const oneDayAgoDate = today.subtract(1, 'day').format('YYYY-MM-DD');
2142
2165
  const todayDate = today.format('YYYY-MM-DD');
2143
2166
 
2144
- // 创建测试数据
2167
+ // Create test data
2145
2168
  await serverDB.insert(messages).values([
2146
2169
  {
2147
2170
  id: '1',
@@ -2169,7 +2192,7 @@ describe('MessageModel', () => {
2169
2192
  // 调用 getHeatmaps 方法
2170
2193
  const result = await messageModel.getHeatmaps();
2171
2194
 
2172
- // 断言结果
2195
+ // Assert result
2173
2196
  expect(result.length).toBeGreaterThanOrEqual(366);
2174
2197
  expect(result.length).toBeLessThan(368);
2175
2198
 
@@ -2197,7 +2220,7 @@ describe('MessageModel', () => {
2197
2220
  // 调用 getHeatmaps 方法
2198
2221
  const result = await messageModel.getHeatmaps();
2199
2222
 
2200
- // 断言结果
2223
+ // Assert result
2201
2224
  expect(result.length).toBeGreaterThanOrEqual(366);
2202
2225
  expect(result.length).toBeLessThan(368);
2203
2226
 
@@ -2211,7 +2234,7 @@ describe('MessageModel', () => {
2211
2234
 
2212
2235
  describe('rankModels', () => {
2213
2236
  it('should rank models by usage count', async () => {
2214
- // 创建测试数据
2237
+ // Create test data
2215
2238
  await serverDB.insert(messages).values([
2216
2239
  { id: '1', userId, role: 'assistant', content: 'message 1', model: 'gpt-3.5' },
2217
2240
  { id: '2', userId, role: 'assistant', content: 'message 2', model: 'gpt-3.5' },
@@ -2222,14 +2245,14 @@ describe('MessageModel', () => {
2222
2245
  // 调用 rankModels 方法
2223
2246
  const result = await messageModel.rankModels();
2224
2247
 
2225
- // 断言结果
2248
+ // Assert result
2226
2249
  expect(result).toHaveLength(2);
2227
2250
  expect(result[0]).toEqual({ id: 'gpt-3.5', count: 2 }); // 当前用户使用 gpt-3.5 两次
2228
2251
  expect(result[1]).toEqual({ id: 'gpt-4', count: 1 }); // 当前用户使用 gpt-4 一次
2229
2252
  });
2230
2253
 
2231
2254
  it('should only count messages with model field', async () => {
2232
- // 创建测试数据,包括没有 model 字段的消息
2255
+ // Create test data,包括没有 model 字段的消息
2233
2256
  await serverDB.insert(messages).values([
2234
2257
  { id: '1', userId, role: 'assistant', content: 'message 1', model: 'gpt-3.5' },
2235
2258
  { id: '2', userId, role: 'assistant', content: 'message 2', model: null },
@@ -2239,13 +2262,13 @@ describe('MessageModel', () => {
2239
2262
  // 调用 rankModels 方法
2240
2263
  const result = await messageModel.rankModels();
2241
2264
 
2242
- // 断言结果
2265
+ // Assert result
2243
2266
  expect(result).toHaveLength(1);
2244
2267
  expect(result[0]).toEqual({ id: 'gpt-3.5', count: 1 });
2245
2268
  });
2246
2269
 
2247
2270
  it('should return empty array when no models are used', async () => {
2248
- // 创建测试数据,所有消息都没有 model
2271
+ // Create test data,所有消息都没有 model
2249
2272
  await serverDB.insert(messages).values([
2250
2273
  { id: '1', userId, role: 'user', content: 'message 1' },
2251
2274
  { id: '2', userId, role: 'assistant', content: 'message 2' },
@@ -2254,12 +2277,12 @@ describe('MessageModel', () => {
2254
2277
  // 调用 rankModels 方法
2255
2278
  const result = await messageModel.rankModels();
2256
2279
 
2257
- // 断言结果
2280
+ // Assert result
2258
2281
  expect(result).toHaveLength(0);
2259
2282
  });
2260
2283
 
2261
2284
  it('should order models by count in descending order', async () => {
2262
- // 创建测试数据,使用不同次数的模型
2285
+ // Create test data,使用不同次数的模型
2263
2286
  await serverDB.insert(messages).values([
2264
2287
  { id: '1', userId, role: 'assistant', content: 'message 1', model: 'gpt-4' },
2265
2288
  { id: '2', userId, role: 'assistant', content: 'message 2', model: 'gpt-3.5' },
@@ -2271,7 +2294,7 @@ describe('MessageModel', () => {
2271
2294
  // 调用 rankModels 方法
2272
2295
  const result = await messageModel.rankModels();
2273
2296
 
2274
- // 断言结果
2297
+ // Assert result
2275
2298
  expect(result).toHaveLength(3);
2276
2299
  expect(result[0]).toEqual({ id: 'gpt-3.5', count: 3 }); // 最多使用
2277
2300
  expect(result[1]).toEqual({ id: 'claude', count: 1 });
@@ -2281,7 +2304,7 @@ describe('MessageModel', () => {
2281
2304
 
2282
2305
  describe('hasMoreThanN', () => {
2283
2306
  it('should return true when message count is greater than N', async () => {
2284
- // 创建测试数据
2307
+ // Create test data
2285
2308
  await serverDB.insert(messages).values([
2286
2309
  { id: '1', userId, role: 'user', content: 'message 1' },
2287
2310
  { id: '2', userId, role: 'user', content: 'message 2' },
@@ -2299,7 +2322,7 @@ describe('MessageModel', () => {
2299
2322
  });
2300
2323
 
2301
2324
  it('should only count messages belonging to the user', async () => {
2302
- // 创建测试数据,包括其他用户的消息
2325
+ // Create test data,包括其他用户的消息
2303
2326
  await serverDB.insert(messages).values([
2304
2327
  { id: '1', userId, role: 'user', content: 'message 1' },
2305
2328
  { id: '2', userId, role: 'user', content: 'message 2' },
@@ -2335,7 +2358,7 @@ describe('MessageModel', () => {
2335
2358
 
2336
2359
  describe('createMessageQuery', () => {
2337
2360
  it('should create a new message query', async () => {
2338
- // 创建测试数据
2361
+ // Create test data
2339
2362
  await serverDB.insert(messages).values({
2340
2363
  id: 'msg1',
2341
2364
  userId,
@@ -2351,7 +2374,7 @@ describe('MessageModel', () => {
2351
2374
  embeddingsId,
2352
2375
  });
2353
2376
 
2354
- // 断言结果
2377
+ // Assert result
2355
2378
  expect(result).toBeDefined();
2356
2379
  expect(result.id).toBeDefined();
2357
2380
  expect(result.messageId).toBe('msg1');
@@ -2372,7 +2395,7 @@ describe('MessageModel', () => {
2372
2395
  });
2373
2396
 
2374
2397
  it('should create a message query with embeddings ID', async () => {
2375
- // 创建测试数据
2398
+ // Create test data
2376
2399
  await serverDB.insert(messages).values({
2377
2400
  id: 'msg2',
2378
2401
  userId,
@@ -2388,7 +2411,7 @@ describe('MessageModel', () => {
2388
2411
  embeddingsId,
2389
2412
  });
2390
2413
 
2391
- // 断言结果
2414
+ // Assert result
2392
2415
  expect(result).toBeDefined();
2393
2416
  expect(result.embeddingsId).toBe(embeddingsId);
2394
2417
 
@@ -2402,7 +2425,7 @@ describe('MessageModel', () => {
2402
2425
  });
2403
2426
 
2404
2427
  it('should generate a unique ID for each message query', async () => {
2405
- // 创建测试数据
2428
+ // Create test data
2406
2429
  await serverDB.insert(messages).values({
2407
2430
  id: 'msg3',
2408
2431
  userId,
@@ -2425,7 +2448,7 @@ describe('MessageModel', () => {
2425
2448
  embeddingsId,
2426
2449
  });
2427
2450
 
2428
- // 断言结果
2451
+ // Assert result
2429
2452
  expect(result1.id).not.toBe(result2.id);
2430
2453
  });
2431
2454
  });
@@ -2473,7 +2496,7 @@ describe('MessageModel', () => {
2473
2496
 
2474
2497
  describe('deleteMessageQuery', () => {
2475
2498
  it('should delete a message query by ID', async () => {
2476
- // 创建测试数据
2499
+ // Create test data
2477
2500
  const queryId = uuid();
2478
2501
  await serverDB.insert(messages).values({
2479
2502
  id: 'msg4',
@@ -2511,7 +2534,7 @@ describe('MessageModel', () => {
2511
2534
  });
2512
2535
 
2513
2536
  it('should only delete message queries belonging to the user', async () => {
2514
- // 创建测试数据 - 其他用户的查询
2537
+ // Create test data - 其他用户的查询
2515
2538
  const queryId = uuid();
2516
2539
  await serverDB.insert(messages).values({
2517
2540
  id: 'msg5',