@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
@@ -25,7 +25,7 @@ vi.mock('@/services/message', () => ({
25
25
  removeMessage: vi.fn(),
26
26
  removeMessagesByAssistant: vi.fn(),
27
27
  removeMessages: vi.fn(() => Promise.resolve()),
28
- createMessage: vi.fn(() => Promise.resolve('new-message-id')),
28
+ createNewMessage: vi.fn(() => Promise.resolve({ id: 'new-message-id', messages: [] })),
29
29
  updateMessage: vi.fn(),
30
30
  removeAllMessages: vi.fn(() => Promise.resolve()),
31
31
  },
@@ -71,7 +71,7 @@ describe('chatMessage actions', () => {
71
71
  await result.current.addAIMessage();
72
72
  });
73
73
 
74
- expect(messageService.createMessage).not.toHaveBeenCalled();
74
+ expect(messageService.createNewMessage).not.toHaveBeenCalled();
75
75
  expect(updateInputMessageSpy).not.toHaveBeenCalled();
76
76
  });
77
77
 
@@ -84,7 +84,7 @@ describe('chatMessage actions', () => {
84
84
  await result.current.addAIMessage();
85
85
  });
86
86
 
87
- expect(messageService.createMessage).toHaveBeenCalledWith({
87
+ expect(messageService.createNewMessage).toHaveBeenCalledWith({
88
88
  content: inputMessage,
89
89
  role: 'assistant',
90
90
  sessionId: mockState.activeId,
@@ -113,7 +113,7 @@ describe('chatMessage actions', () => {
113
113
  await result.current.addUserMessage({ message: 'test message' });
114
114
  });
115
115
 
116
- expect(messageService.createMessage).not.toHaveBeenCalled();
116
+ expect(messageService.createNewMessage).not.toHaveBeenCalled();
117
117
  expect(updateInputMessageSpy).not.toHaveBeenCalled();
118
118
  });
119
119
 
@@ -130,7 +130,7 @@ describe('chatMessage actions', () => {
130
130
  await result.current.addUserMessage({ message, fileList });
131
131
  });
132
132
 
133
- expect(messageService.createMessage).toHaveBeenCalledWith({
133
+ expect(messageService.createNewMessage).toHaveBeenCalledWith({
134
134
  content: message,
135
135
  files: fileList,
136
136
  role: 'user',
@@ -154,7 +154,7 @@ describe('chatMessage actions', () => {
154
154
  await result.current.addUserMessage({ message });
155
155
  });
156
156
 
157
- expect(messageService.createMessage).toHaveBeenCalledWith({
157
+ expect(messageService.createNewMessage).toHaveBeenCalledWith({
158
158
  content: message,
159
159
  files: undefined,
160
160
  role: 'user',
@@ -184,7 +184,7 @@ describe('chatMessage actions', () => {
184
184
  await result.current.addUserMessage({ message });
185
185
  });
186
186
 
187
- expect(messageService.createMessage).toHaveBeenCalledWith({
187
+ expect(messageService.createNewMessage).toHaveBeenCalledWith({
188
188
  content: message,
189
189
  files: undefined,
190
190
  role: 'user',
@@ -200,6 +200,15 @@ describe('chatMessage actions', () => {
200
200
  const { result } = renderHook(() => useChatStore());
201
201
  const messageId = 'message-id';
202
202
  const deleteSpy = vi.spyOn(result.current, 'deleteMessage');
203
+ const mockMessages = [{ id: 'other-message' }] as any;
204
+
205
+ // Mock the service to return messages
206
+ (messageService.removeMessages as Mock).mockResolvedValue({
207
+ success: true,
208
+ messages: mockMessages,
209
+ });
210
+
211
+ const replaceMessagesSpy = vi.spyOn(result.current, 'replaceMessages');
203
212
 
204
213
  act(() => {
205
214
  useChatStore.setState({
@@ -215,13 +224,22 @@ describe('chatMessage actions', () => {
215
224
  });
216
225
 
217
226
  expect(deleteSpy).toHaveBeenCalledWith(messageId);
218
- expect(result.current.refreshMessages).toHaveBeenCalled();
227
+ expect(replaceMessagesSpy).toHaveBeenCalledWith(mockMessages);
219
228
  });
220
229
 
221
230
  it('deleteMessage should remove messages with tools', async () => {
222
231
  const { result } = renderHook(() => useChatStore());
223
232
  const messageId = 'message-id';
224
233
  const removeMessagesSpy = vi.spyOn(messageService, 'removeMessages');
234
+ const mockMessages = [{ id: 'remaining-message' }] as any;
235
+
236
+ // Mock the service to return messages
237
+ (messageService.removeMessages as Mock).mockResolvedValue({
238
+ success: true,
239
+ messages: mockMessages,
240
+ });
241
+
242
+ const replaceMessagesSpy = vi.spyOn(result.current, 'replaceMessages');
225
243
 
226
244
  act(() => {
227
245
  useChatStore.setState({
@@ -240,8 +258,120 @@ describe('chatMessage actions', () => {
240
258
  await result.current.deleteMessage(messageId);
241
259
  });
242
260
 
243
- expect(removeMessagesSpy).toHaveBeenCalledWith([messageId, '2', '3']);
244
- expect(result.current.refreshMessages).toHaveBeenCalled();
261
+ expect(removeMessagesSpy).toHaveBeenCalledWith([messageId, '2', '3'], {
262
+ sessionId: 'session-id',
263
+ topicId: undefined,
264
+ });
265
+ expect(replaceMessagesSpy).toHaveBeenCalledWith(mockMessages);
266
+ });
267
+
268
+ it('deleteMessage should remove group message with all children', async () => {
269
+ const { result } = renderHook(() => useChatStore());
270
+ const groupMessageId = 'group-message-id';
271
+ const removeMessagesSpy = vi.spyOn(messageService, 'removeMessages');
272
+ const mockMessages = [{ id: 'remaining-message' }] as any;
273
+
274
+ // Mock the service to return messages
275
+ (messageService.removeMessages as Mock).mockResolvedValue({
276
+ success: true,
277
+ messages: mockMessages,
278
+ });
279
+
280
+ const replaceMessagesSpy = vi.spyOn(result.current, 'replaceMessages');
281
+
282
+ act(() => {
283
+ useChatStore.setState({
284
+ activeId: 'session-id',
285
+ activeTopicId: undefined,
286
+ messagesMap: {
287
+ [messageMapKey('session-id')]: [
288
+ { id: groupMessageId, role: 'group', content: 'Group message' } as UIChatMessage,
289
+ {
290
+ id: 'child-1',
291
+ parentId: groupMessageId,
292
+ role: 'assistant',
293
+ content: 'Child 1',
294
+ } as UIChatMessage,
295
+ {
296
+ id: 'child-2',
297
+ parentId: groupMessageId,
298
+ role: 'assistant',
299
+ content: 'Child 2',
300
+ } as UIChatMessage,
301
+ { id: 'other-message', role: 'user', content: 'Other' } as UIChatMessage,
302
+ ],
303
+ },
304
+ });
305
+ });
306
+ await act(async () => {
307
+ await result.current.deleteMessage(groupMessageId);
308
+ });
309
+
310
+ expect(removeMessagesSpy).toHaveBeenCalledWith([groupMessageId, 'child-1', 'child-2'], {
311
+ sessionId: 'session-id',
312
+ topicId: undefined,
313
+ });
314
+ expect(replaceMessagesSpy).toHaveBeenCalledWith(mockMessages);
315
+ });
316
+
317
+ it('deleteMessage should remove group message with children that have tool calls', async () => {
318
+ const { result } = renderHook(() => useChatStore());
319
+ const groupMessageId = 'group-message-id';
320
+ const removeMessagesSpy = vi.spyOn(messageService, 'removeMessages');
321
+ const mockMessages = [{ id: 'remaining-message' }] as any;
322
+
323
+ // Mock the service to return messages
324
+ (messageService.removeMessages as Mock).mockResolvedValue({
325
+ success: true,
326
+ messages: mockMessages,
327
+ });
328
+
329
+ const replaceMessagesSpy = vi.spyOn(result.current, 'replaceMessages');
330
+
331
+ act(() => {
332
+ useChatStore.setState({
333
+ activeId: 'session-id',
334
+ activeTopicId: undefined,
335
+ messagesMap: {
336
+ [messageMapKey('session-id')]: [
337
+ { id: groupMessageId, role: 'group', content: 'Group message' } as UIChatMessage,
338
+ {
339
+ id: 'child-1',
340
+ parentId: groupMessageId,
341
+ role: 'assistant',
342
+ content: 'Child with tools',
343
+ tools: [{ id: 'tool1' }],
344
+ } as UIChatMessage,
345
+ {
346
+ id: 'tool-result-1',
347
+ tool_call_id: 'tool1',
348
+ role: 'tool',
349
+ content: 'Tool result',
350
+ } as UIChatMessage,
351
+ {
352
+ id: 'child-2',
353
+ parentId: groupMessageId,
354
+ role: 'assistant',
355
+ content: 'Child 2',
356
+ } as UIChatMessage,
357
+ { id: 'other-message', role: 'user', content: 'Other' } as UIChatMessage,
358
+ ],
359
+ },
360
+ });
361
+ });
362
+ await act(async () => {
363
+ await result.current.deleteMessage(groupMessageId);
364
+ });
365
+
366
+ // Should delete group message + all children + tool results of children
367
+ expect(removeMessagesSpy).toHaveBeenCalledWith(
368
+ [groupMessageId, 'child-1', 'child-2', 'tool-result-1'],
369
+ {
370
+ sessionId: 'session-id',
371
+ topicId: undefined,
372
+ },
373
+ );
374
+ expect(replaceMessagesSpy).toHaveBeenCalledWith(mockMessages);
245
375
  });
246
376
  });
247
377
 
@@ -309,10 +439,16 @@ describe('chatMessage actions', () => {
309
439
  });
310
440
 
311
441
  expect(removeMessageSpy).toHaveBeenCalled();
312
- expect(updateMessageSpy).toHaveBeenCalledWith('message-id', {
313
- tools: [{ id: 'tool2' }],
314
- });
315
- expect(result.current.refreshMessages).toHaveBeenCalled();
442
+ expect(updateMessageSpy).toHaveBeenCalledWith(
443
+ 'message-id',
444
+ {
445
+ tools: [{ id: 'tool2' }],
446
+ },
447
+ {
448
+ sessionId: 'session-id',
449
+ topicId: undefined,
450
+ },
451
+ );
316
452
  });
317
453
  });
318
454
 
@@ -320,13 +456,14 @@ describe('chatMessage actions', () => {
320
456
  it('clearAllMessages should remove all messages', async () => {
321
457
  const { result } = renderHook(() => useChatStore());
322
458
  const clearAllSpy = vi.spyOn(result.current, 'clearAllMessages');
459
+ const replaceMessagesSpy = vi.spyOn(result.current, 'replaceMessages');
323
460
 
324
461
  await act(async () => {
325
462
  await result.current.clearAllMessages();
326
463
  });
327
464
 
328
465
  expect(clearAllSpy).toHaveBeenCalled();
329
- expect(result.current.refreshMessages).toHaveBeenCalled();
466
+ expect(replaceMessagesSpy).toHaveBeenCalledWith([]);
330
467
  });
331
468
  });
332
469
 
@@ -471,7 +608,11 @@ describe('chatMessage actions', () => {
471
608
  await result.current.internal_updateMessageContent(messageId, newContent);
472
609
  });
473
610
 
474
- expect(spy).toHaveBeenCalledWith(messageId, { content: newContent });
611
+ expect(spy).toHaveBeenCalledWith(
612
+ messageId,
613
+ { content: newContent },
614
+ { sessionId: 'session-id', topicId: 'topic-id' },
615
+ );
475
616
  });
476
617
 
477
618
  it('should dispatch message update action', async () => {
@@ -107,11 +107,12 @@ export interface ChatMessageAction {
107
107
  ) => Promise<void>;
108
108
  /**
109
109
  * create a message with optimistic update
110
+ * returns the created message ID and updated message list
110
111
  */
111
112
  internal_createMessage: (
112
113
  params: CreateMessageParams,
113
- context?: { tempMessageId?: string; skipRefresh?: boolean },
114
- ) => Promise<string | undefined>;
114
+ context?: { tempMessageId?: string; skipRefresh?: boolean; groupMessageId?: string },
115
+ ) => Promise<{ id: string; messages: UIChatMessage[] } | undefined>;
115
116
  /**
116
117
  * create a temp message for optimistic update
117
118
  * otherwise the message will be too slow to show
@@ -163,22 +164,42 @@ export const chatMessage: StateCreator<
163
164
  if (!message) return;
164
165
 
165
166
  let ids = [message.id];
167
+ const allMessages = chatSelectors.activeBaseChats(get());
166
168
 
167
- // if the message is a tool calls, then delete all the related messages
169
+ // if the message is a tool calls, then delete all the related tool messages
168
170
  if (message.tools) {
169
171
  const toolMessageIds = message.tools.flatMap((tool) => {
170
- const messages = chatSelectors
171
- .activeBaseChats(get())
172
- .filter((m) => m.tool_call_id === tool.id);
173
-
172
+ const messages = allMessages.filter((m) => m.tool_call_id === tool.id);
174
173
  return messages.map((m) => m.id);
175
174
  });
176
175
  ids = ids.concat(toolMessageIds);
177
176
  }
178
177
 
178
+ // if the message is a group message, find all children messages (via parentId)
179
+ if (message.role === 'group') {
180
+ const childMessages = allMessages.filter((m) => m.parentId === message.id);
181
+ const childMessageIds = childMessages.map((m) => m.id);
182
+ ids = ids.concat(childMessageIds);
183
+
184
+ // Also delete tool results of children messages
185
+ const childToolMessageIds = childMessages.flatMap((child) => {
186
+ if (!child.tools) return [];
187
+ return child.tools.flatMap((tool) => {
188
+ const toolMessages = allMessages.filter((m) => m.tool_call_id === tool.id);
189
+ return toolMessages.map((m) => m.id);
190
+ });
191
+ });
192
+ ids = ids.concat(childToolMessageIds);
193
+ }
194
+
179
195
  get().internal_dispatchMessage({ type: 'deleteMessages', ids });
180
- await messageService.removeMessages(ids);
181
- await get().refreshMessages();
196
+ const result = await messageService.removeMessages(ids, {
197
+ sessionId: get().activeId,
198
+ topicId: get().activeTopicId,
199
+ });
200
+ if (result?.success && result.messages) {
201
+ get().replaceMessages(result.messages);
202
+ }
182
203
  },
183
204
 
184
205
  deleteToolMessage: async (id) => {
@@ -199,14 +220,7 @@ export const chatMessage: StateCreator<
199
220
  },
200
221
 
201
222
  clearMessage: async () => {
202
- const {
203
- activeId,
204
- activeTopicId,
205
- refreshMessages,
206
- refreshTopic,
207
- switchTopic,
208
- activeSessionType,
209
- } = get();
223
+ const { activeId, activeTopicId, refreshTopic, switchTopic, activeSessionType } = get();
210
224
 
211
225
  // Check if this is a group session - use activeSessionType if available, otherwise check session store
212
226
  let isGroupSession = activeSessionType === 'group';
@@ -230,22 +244,24 @@ export const chatMessage: StateCreator<
230
244
  await topicService.removeTopic(activeTopicId);
231
245
  }
232
246
  await refreshTopic();
233
- await refreshMessages();
247
+
248
+ // Clear messages directly since all messages are deleted
249
+ get().replaceMessages([]);
234
250
 
235
251
  // after remove topic , go back to default topic
236
252
  switchTopic();
237
253
  },
238
254
  clearAllMessages: async () => {
239
- const { refreshMessages } = get();
240
255
  await messageService.removeAllMessages();
241
- await refreshMessages();
256
+ // Clear messages directly since all messages are deleted
257
+ get().replaceMessages([]);
242
258
  },
243
259
  addAIMessage: async () => {
244
260
  const { internal_createMessage, updateInputMessage, activeTopicId, activeId, inputMessage } =
245
261
  get();
246
262
  if (!activeId) return;
247
263
 
248
- await internal_createMessage({
264
+ const result = await internal_createMessage({
249
265
  content: inputMessage,
250
266
  role: 'assistant',
251
267
  sessionId: activeId,
@@ -253,14 +269,16 @@ export const chatMessage: StateCreator<
253
269
  topicId: activeTopicId,
254
270
  });
255
271
 
256
- updateInputMessage('');
272
+ if (result) {
273
+ updateInputMessage('');
274
+ }
257
275
  },
258
276
  addUserMessage: async ({ message, fileList }) => {
259
277
  const { internal_createMessage, updateInputMessage, activeTopicId, activeId, activeThreadId } =
260
278
  get();
261
279
  if (!activeId) return;
262
280
 
263
- await internal_createMessage({
281
+ const result = await internal_createMessage({
264
282
  content: message,
265
283
  files: fileList,
266
284
  role: 'user',
@@ -270,7 +288,9 @@ export const chatMessage: StateCreator<
270
288
  threadId: activeThreadId,
271
289
  });
272
290
 
273
- updateInputMessage('');
291
+ if (result) {
292
+ updateInputMessage('');
293
+ }
274
294
  },
275
295
  copyMessage: async (id, content) => {
276
296
  await copyToClipboard(content);
@@ -350,10 +370,13 @@ export const chatMessage: StateCreator<
350
370
  },
351
371
 
352
372
  internal_updateMessageRAG: async (id, data) => {
353
- const { refreshMessages } = get();
354
-
355
- await messageService.updateMessageRAG(id, data);
356
- await refreshMessages();
373
+ const result = await messageService.updateMessageRAG(id, data, {
374
+ sessionId: get().activeId,
375
+ topicId: get().activeTopicId,
376
+ });
377
+ if (result?.success && result.messages) {
378
+ get().replaceMessages(result.messages);
379
+ }
357
380
  },
358
381
 
359
382
  // the internal process method of the AI message
@@ -374,17 +397,35 @@ export const chatMessage: StateCreator<
374
397
 
375
398
  internal_updateMessageError: async (id, error) => {
376
399
  get().internal_dispatchMessage({ id, type: 'updateMessage', value: { error } });
377
- await messageService.updateMessage(id, { error });
378
- await get().refreshMessages();
400
+ const result = await messageService.updateMessage(
401
+ id,
402
+ { error },
403
+ { topicId: get().activeTopicId, sessionId: get().activeId },
404
+ );
405
+ if (result?.success && result.messages) {
406
+ get().replaceMessages(result.messages);
407
+ } else {
408
+ await get().refreshMessages();
409
+ }
379
410
  },
380
411
 
381
412
  internal_updateMessagePluginError: async (id, error) => {
382
- await messageService.updateMessagePluginError(id, error);
383
- await get().refreshMessages();
413
+ const result = await messageService.updateMessagePluginError(id, error, {
414
+ sessionId: get().activeId,
415
+ topicId: get().activeTopicId,
416
+ });
417
+ if (result?.success && result.messages) {
418
+ get().replaceMessages(result.messages);
419
+ }
384
420
  },
385
421
 
386
422
  internal_updateMessageContent: async (id, content, extra) => {
387
- const { internal_dispatchMessage, refreshMessages, internal_transformToolCalls } = get();
423
+ const {
424
+ internal_dispatchMessage,
425
+ refreshMessages,
426
+ internal_transformToolCalls,
427
+ replaceMessages,
428
+ } = get();
388
429
 
389
430
  // Due to the async update method and refresh need about 100ms
390
431
  // we need to update the message content at the frontend to avoid the update flick
@@ -403,80 +444,115 @@ export const chatMessage: StateCreator<
403
444
  });
404
445
  }
405
446
 
406
- await messageService.updateMessage(id, {
407
- content,
408
- tools: extra?.toolCalls ? internal_transformToolCalls(extra?.toolCalls) : undefined,
409
- reasoning: extra?.reasoning,
410
- search: extra?.search,
411
- metadata: extra?.metadata,
412
- model: extra?.model,
413
- provider: extra?.provider,
414
- imageList: extra?.imageList,
415
- });
416
- await refreshMessages();
447
+ const result = await messageService.updateMessage(
448
+ id,
449
+ {
450
+ content,
451
+ tools: extra?.toolCalls ? internal_transformToolCalls(extra?.toolCalls) : undefined,
452
+ reasoning: extra?.reasoning,
453
+ search: extra?.search,
454
+ metadata: extra?.metadata,
455
+ model: extra?.model,
456
+ provider: extra?.provider,
457
+ imageList: extra?.imageList,
458
+ },
459
+ { topicId: get().activeTopicId, sessionId: get().activeId },
460
+ );
461
+
462
+ if (result && result.success && result.messages) {
463
+ replaceMessages(result.messages);
464
+ } else {
465
+ await refreshMessages();
466
+ }
417
467
  },
418
468
 
469
+ internal_fetchMessages: async () => {
470
+ const messages = await messageService.getMessages(get().activeId, get().activeTopicId);
471
+ const nextMap = { ...get().messagesMap, [chatSelectors.currentChatKey(get())]: messages };
472
+ // no need to update map if the messages have been init and the map is the same
473
+ if (get().messagesInit && isEqual(nextMap, get().messagesMap)) return;
474
+
475
+ set(
476
+ { messagesInit: true, messagesMap: nextMap },
477
+ false,
478
+ n('internal_fetchMessages', { messages }),
479
+ );
480
+ },
481
+ internal_createTmpMessage: (message) => {
482
+ const { internal_dispatchMessage } = get();
483
+
484
+ // use optimistic update to avoid the slow waiting
485
+ const tempId = 'tmp_' + nanoid();
486
+ internal_dispatchMessage({ type: 'createMessage', id: tempId, value: message });
487
+
488
+ return tempId;
489
+ },
419
490
  internal_createMessage: async (message, context) => {
420
491
  const {
421
492
  internal_createTmpMessage,
422
- refreshMessages,
423
493
  internal_toggleMessageLoading,
424
494
  internal_dispatchMessage,
495
+ replaceMessages,
425
496
  } = get();
497
+
426
498
  let tempId = context?.tempMessageId;
427
499
  if (!tempId) {
428
- // use optimistic update to avoid the slow waiting
429
- tempId = internal_createTmpMessage(message);
430
-
431
- internal_toggleMessageLoading(true, tempId);
500
+ tempId = 'tmp_' + nanoid();
501
+
502
+ // Check if should add as group block (explicitly controlled by caller)
503
+ if (context?.groupMessageId) {
504
+ internal_dispatchMessage({
505
+ type: 'addGroupBlock',
506
+ groupMessageId: context.groupMessageId,
507
+ blockId: tempId,
508
+ value: {
509
+ id: tempId,
510
+ content: message.content,
511
+ },
512
+ });
513
+ internal_toggleMessageLoading(true, tempId);
514
+ } else {
515
+ // Regular message creation at top level
516
+ tempId = internal_createTmpMessage(message as any);
517
+ internal_toggleMessageLoading(true, tempId);
518
+ }
432
519
  }
433
520
 
434
521
  try {
435
- const id = await messageService.createMessage(message);
522
+ const result = await messageService.createNewMessage(message);
523
+
436
524
  if (!context?.skipRefresh) {
437
- internal_toggleMessageLoading(true, tempId);
438
- await refreshMessages();
525
+ // Use the messages returned from createNewMessage (already grouped)
526
+ replaceMessages(result.messages);
439
527
  }
440
528
 
441
529
  internal_toggleMessageLoading(false, tempId);
442
- return id;
530
+ return result;
443
531
  } catch (e) {
444
532
  internal_toggleMessageLoading(false, tempId);
445
533
  internal_dispatchMessage({
446
534
  id: tempId,
447
535
  type: 'updateMessage',
448
536
  value: {
449
- error: { type: ChatErrorType.CreateMessageError, message: (e as Error).message, body: e },
537
+ error: {
538
+ type: ChatErrorType.CreateMessageError,
539
+ message: (e as Error).message,
540
+ body: e,
541
+ },
450
542
  },
451
543
  });
452
544
  }
453
545
  },
454
546
 
455
- internal_fetchMessages: async () => {
456
- const messages = await messageService.getMessages(get().activeId, get().activeTopicId);
457
- const nextMap = { ...get().messagesMap, [chatSelectors.currentChatKey(get())]: messages };
458
- // no need to update map if the messages have been init and the map is the same
459
- if (get().messagesInit && isEqual(nextMap, get().messagesMap)) return;
460
-
461
- set(
462
- { messagesInit: true, messagesMap: nextMap },
463
- false,
464
- n('internal_fetchMessages', { messages }),
465
- );
466
- },
467
- internal_createTmpMessage: (message) => {
468
- const { internal_dispatchMessage } = get();
469
-
470
- // use optimistic update to avoid the slow waiting
471
- const tempId = 'tmp_' + nanoid();
472
- internal_dispatchMessage({ type: 'createMessage', id: tempId, value: message });
473
-
474
- return tempId;
475
- },
476
547
  internal_deleteMessage: async (id: string) => {
477
548
  get().internal_dispatchMessage({ type: 'deleteMessage', id });
478
- await messageService.removeMessage(id);
479
- await get().refreshMessages();
549
+ const result = await messageService.removeMessage(id, {
550
+ sessionId: get().activeId,
551
+ topicId: get().activeTopicId,
552
+ });
553
+ if (result?.success && result.messages) {
554
+ get().replaceMessages(result.messages);
555
+ }
480
556
  },
481
557
  internal_traceMessage: async (id, payload) => {
482
558
  // tracing the diff of update