@lobehub/lobehub 2.0.0-next.2 → 2.0.0-next.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (603) hide show
  1. package/.env.desktop +1 -2
  2. package/.env.example +0 -3
  3. package/.env.example.development +0 -2
  4. package/.github/workflows/claude-auto-testing.yml +73 -0
  5. package/.github/workflows/claude-translate-comments.yml +67 -0
  6. package/.github/workflows/desktop-pr-build.yml +18 -16
  7. package/.github/workflows/docker.yml +25 -20
  8. package/.github/workflows/e2e.yml +17 -3
  9. package/.github/workflows/release-desktop-beta.yml +12 -12
  10. package/.github/workflows/release.yml +3 -5
  11. package/.github/workflows/test.yml +47 -12
  12. package/.nvmrc +1 -1
  13. package/CHANGELOG.md +484 -0
  14. package/Dockerfile +1 -3
  15. package/README.md +2 -45
  16. package/README.zh-CN.md +2 -45
  17. package/apps/desktop/src/main/controllers/AuthCtr.ts +53 -39
  18. package/apps/desktop/src/main/controllers/__tests__/AuthCtr.test.ts +706 -0
  19. package/apps/desktop/src/main/utils/next-electron-rsc.ts +7 -5
  20. package/apps/desktop/tsconfig.json +0 -1
  21. package/changelog/v1.json +159 -0
  22. package/docs/development/database-schema.dbml +11 -1
  23. package/docs/self-hosting/advanced/auth/next-auth/auth0.mdx +2 -2
  24. package/docs/self-hosting/advanced/auth/next-auth/auth0.zh-CN.mdx +2 -2
  25. package/docs/self-hosting/advanced/auth/next-auth/authelia.mdx +2 -2
  26. package/docs/self-hosting/advanced/auth/next-auth/authelia.zh-CN.mdx +2 -2
  27. package/docs/self-hosting/advanced/auth/next-auth/authentik.mdx +2 -2
  28. package/docs/self-hosting/advanced/auth/next-auth/authentik.zh-CN.mdx +2 -2
  29. package/docs/self-hosting/advanced/auth/next-auth/casdoor.mdx +2 -2
  30. package/docs/self-hosting/advanced/auth/next-auth/casdoor.zh-CN.mdx +2 -2
  31. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.mdx +2 -2
  32. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.zh-CN.mdx +2 -2
  33. package/docs/self-hosting/advanced/auth/next-auth/github.mdx +2 -2
  34. package/docs/self-hosting/advanced/auth/next-auth/github.zh-CN.mdx +2 -2
  35. package/docs/self-hosting/advanced/auth/next-auth/google.mdx +32 -29
  36. package/docs/self-hosting/advanced/auth/next-auth/keycloak.mdx +2 -2
  37. package/docs/self-hosting/advanced/auth/next-auth/keycloak.zh-CN.mdx +2 -2
  38. package/docs/self-hosting/advanced/auth/next-auth/logto.mdx +5 -3
  39. package/docs/self-hosting/advanced/auth/next-auth/logto.zh-CN.mdx +5 -3
  40. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.mdx +2 -2
  41. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.zh-CN.mdx +2 -2
  42. package/docs/self-hosting/advanced/auth/next-auth/okta.mdx +2 -2
  43. package/docs/self-hosting/advanced/auth/next-auth/okta.zh-CN.mdx +2 -2
  44. package/docs/self-hosting/advanced/auth/next-auth/wechat.mdx +2 -2
  45. package/docs/self-hosting/advanced/auth/next-auth/wechat.zh-CN.mdx +2 -2
  46. package/docs/self-hosting/advanced/auth/next-auth/zitadel.mdx +2 -2
  47. package/docs/self-hosting/advanced/auth/next-auth/zitadel.zh-CN.mdx +2 -2
  48. package/docs/self-hosting/advanced/auth.mdx +32 -21
  49. package/docs/self-hosting/advanced/auth.zh-CN.mdx +30 -19
  50. package/docs/self-hosting/advanced/feature-flags.mdx +0 -1
  51. package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +0 -1
  52. package/docs/self-hosting/advanced/online-search.mdx +30 -25
  53. package/docs/self-hosting/advanced/online-search.zh-CN.mdx +25 -23
  54. package/e2e/src/features/discover/smoke.feature +34 -1
  55. package/e2e/src/steps/discover/smoke.steps.ts +116 -4
  56. package/e2e/tsconfig.json +0 -1
  57. package/locales/ar/models.json +15 -6
  58. package/locales/ar/oauth.json +1 -0
  59. package/locales/bg-BG/models.json +15 -6
  60. package/locales/bg-BG/oauth.json +1 -0
  61. package/locales/de-DE/models.json +15 -6
  62. package/locales/de-DE/oauth.json +1 -0
  63. package/locales/en-US/models.json +15 -6
  64. package/locales/en-US/oauth.json +1 -0
  65. package/locales/es-ES/models.json +15 -6
  66. package/locales/es-ES/oauth.json +1 -0
  67. package/locales/fa-IR/models.json +15 -6
  68. package/locales/fa-IR/oauth.json +1 -0
  69. package/locales/fr-FR/models.json +15 -6
  70. package/locales/fr-FR/oauth.json +1 -0
  71. package/locales/it-IT/models.json +15 -6
  72. package/locales/it-IT/oauth.json +1 -0
  73. package/locales/ja-JP/models.json +15 -6
  74. package/locales/ja-JP/oauth.json +1 -0
  75. package/locales/ko-KR/models.json +21 -12
  76. package/locales/ko-KR/oauth.json +1 -0
  77. package/locales/nl-NL/models.json +15 -6
  78. package/locales/nl-NL/oauth.json +1 -0
  79. package/locales/pl-PL/models.json +15 -6
  80. package/locales/pl-PL/oauth.json +1 -0
  81. package/locales/pt-BR/models.json +15 -6
  82. package/locales/pt-BR/oauth.json +1 -0
  83. package/locales/ru-RU/models.json +15 -6
  84. package/locales/ru-RU/oauth.json +1 -0
  85. package/locales/tr-TR/models.json +15 -6
  86. package/locales/tr-TR/oauth.json +1 -0
  87. package/locales/vi-VN/models.json +15 -6
  88. package/locales/vi-VN/oauth.json +1 -0
  89. package/locales/zh-CN/models.json +15 -6
  90. package/locales/zh-CN/oauth.json +1 -0
  91. package/locales/zh-TW/models.json +15 -6
  92. package/locales/zh-TW/oauth.json +1 -0
  93. package/next.config.ts +2 -3
  94. package/package.json +74 -80
  95. package/packages/const/src/index.ts +0 -1
  96. package/packages/const/src/models.ts +13 -0
  97. package/packages/const/src/url.ts +1 -4
  98. package/packages/const/src/version.ts +3 -3
  99. package/packages/context-engine/src/index.ts +1 -6
  100. package/packages/context-engine/src/processors/GroupMessageFlatten.ts +12 -2
  101. package/packages/context-engine/src/processors/__tests__/GroupMessageFlatten.test.ts +73 -9
  102. package/packages/context-engine/src/providers/index.ts +0 -2
  103. package/packages/database/migrations/0041_improve_index.sql +10 -0
  104. package/packages/database/migrations/meta/0041_snapshot.json +7784 -0
  105. package/packages/database/migrations/meta/_journal.json +7 -0
  106. package/packages/database/package.json +1 -1
  107. package/packages/database/src/core/migrations.json +17 -0
  108. package/packages/database/src/core/web-server.ts +2 -1
  109. package/packages/database/src/models/__tests__/message.grouping.test.ts +812 -0
  110. package/packages/database/src/models/__tests__/message.test.ts +322 -170
  111. package/packages/database/src/models/message.ts +62 -24
  112. package/packages/database/src/models/session.ts +60 -19
  113. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  114. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  115. package/packages/database/src/schemas/agent.ts +10 -11
  116. package/packages/database/src/schemas/message.ts +5 -1
  117. package/packages/database/src/schemas/relations.ts +6 -4
  118. package/packages/database/src/schemas/session.ts +2 -0
  119. package/packages/database/src/schemas/topic.ts +6 -1
  120. package/packages/database/src/utils/__tests__/groupMessages.test.ts +145 -2
  121. package/packages/database/src/utils/groupMessages.ts +7 -5
  122. package/packages/electron-client-ipc/package.json +4 -1
  123. package/packages/file-loaders/package.json +1 -0
  124. package/packages/memory-extract/package.json +1 -1
  125. package/packages/model-bank/src/aiModels/anthropic.ts +0 -63
  126. package/packages/model-bank/src/aiModels/azure.ts +155 -0
  127. package/packages/model-bank/src/aiModels/bedrock.ts +44 -0
  128. package/packages/model-bank/src/aiModels/higress.ts +0 -55
  129. package/packages/model-bank/src/aiModels/infiniai.ts +21 -0
  130. package/packages/model-bank/src/aiModels/ollamacloud.ts +13 -0
  131. package/packages/model-bank/src/aiModels/siliconcloud.ts +19 -0
  132. package/packages/model-runtime/src/core/parameterResolver.ts +3 -0
  133. package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +0 -38
  134. package/packages/model-runtime/src/providers/azureOpenai/index.ts +2 -1
  135. package/packages/model-runtime/src/providers/minimax/index.ts +5 -5
  136. package/packages/model-runtime/src/providers/search1api/index.test.ts +2 -2
  137. package/packages/model-runtime/src/utils/googleErrorParser.test.ts +125 -0
  138. package/packages/model-runtime/src/utils/googleErrorParser.ts +103 -77
  139. package/packages/types/src/message/common/base.ts +13 -0
  140. package/packages/types/src/message/common/image.ts +8 -0
  141. package/packages/types/src/message/common/metadata.ts +39 -0
  142. package/packages/types/src/message/common/tools.ts +10 -0
  143. package/packages/types/src/message/db/params.ts +47 -1
  144. package/packages/types/src/message/ui/chat.ts +4 -1
  145. package/packages/types/src/message/ui/params.ts +98 -4
  146. package/packages/types/src/search.ts +16 -0
  147. package/packages/types/src/serverConfig.ts +2 -6
  148. package/packages/types/src/user/index.ts +13 -1
  149. package/packages/types/src/user/settings/index.ts +22 -0
  150. package/packages/utils/src/apiKey.test.ts +139 -0
  151. package/packages/utils/src/client/clipboard.ts +2 -2
  152. package/packages/utils/src/client/exportFile.ts +10 -10
  153. package/packages/utils/src/client/parserPlaceholder.ts +18 -18
  154. package/packages/utils/src/client/topic.ts +10 -10
  155. package/packages/utils/src/client/xor-obfuscation.ts +11 -11
  156. package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
  157. package/packages/web-crawler/tsconfig.json +0 -1
  158. package/renovate.json +20 -3
  159. package/scripts/migrateServerDB/errorHint.js +1 -7
  160. package/scripts/migrateServerDB/index.ts +2 -1
  161. package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
  162. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
  163. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  164. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
  165. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  166. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
  167. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
  168. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
  169. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
  170. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  171. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
  172. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  173. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  174. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  175. package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
  176. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
  177. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
  178. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
  179. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
  180. package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
  181. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
  182. package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
  183. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  184. package/src/app/[variants]/(main)/labs/components/LabCard.tsx +3 -1
  185. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  186. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  187. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  188. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  189. package/src/app/[variants]/(main)/settings/_layout/SettingsContent.tsx +0 -3
  190. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  191. package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +5 -7
  192. package/src/app/[variants]/layout.tsx +1 -0
  193. package/src/app/[variants]/loading/index.tsx +1 -10
  194. package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
  195. package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
  196. package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
  197. package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
  198. package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
  199. package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
  200. package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +19 -2
  201. package/src/app/sitemap.tsx +7 -1
  202. package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
  203. package/src/components/Link.tsx +12 -0
  204. package/src/components/Thinking/index.tsx +4 -3
  205. package/src/config/db.ts +0 -5
  206. package/src/config/featureFlags/schema.test.ts +0 -2
  207. package/src/config/featureFlags/schema.ts +0 -6
  208. package/src/config/modelProviders/ai21.ts +1 -16
  209. package/src/config/modelProviders/ai302.ts +1 -128
  210. package/src/config/modelProviders/ai360.ts +1 -32
  211. package/src/config/modelProviders/anthropic.ts +1 -94
  212. package/src/config/modelProviders/azure.ts +1 -51
  213. package/src/config/modelProviders/baichuan.ts +1 -57
  214. package/src/config/modelProviders/bedrock.ts +1 -276
  215. package/src/config/modelProviders/cloudflare.ts +1 -64
  216. package/src/config/modelProviders/deepseek.ts +1 -19
  217. package/src/config/modelProviders/fireworksai.ts +1 -174
  218. package/src/config/modelProviders/giteeai.ts +1 -135
  219. package/src/config/modelProviders/github.ts +1 -254
  220. package/src/config/modelProviders/google.ts +1 -130
  221. package/src/config/modelProviders/groq.ts +1 -119
  222. package/src/config/modelProviders/higress.ts +1 -1736
  223. package/src/config/modelProviders/huggingface.ts +1 -54
  224. package/src/config/modelProviders/hunyuan.ts +1 -83
  225. package/src/config/modelProviders/infiniai.ts +1 -74
  226. package/src/config/modelProviders/internlm.ts +1 -20
  227. package/src/config/modelProviders/minimax.ts +1 -1
  228. package/src/config/modelProviders/mistral.ts +1 -95
  229. package/src/config/modelProviders/modelscope.ts +1 -27
  230. package/src/config/modelProviders/moonshot.ts +1 -29
  231. package/src/config/modelProviders/novita.ts +1 -105
  232. package/src/config/modelProviders/ollama.ts +1 -325
  233. package/src/config/modelProviders/openai.ts +1 -242
  234. package/src/config/modelProviders/openrouter.ts +1 -240
  235. package/src/config/modelProviders/perplexity.ts +1 -45
  236. package/src/config/modelProviders/ppio.ts +1 -152
  237. package/src/config/modelProviders/qiniu.ts +2 -19
  238. package/src/config/modelProviders/qwen.ts +1 -245
  239. package/src/config/modelProviders/search1api.ts +1 -34
  240. package/src/config/modelProviders/sensenova.ts +1 -69
  241. package/src/config/modelProviders/siliconcloud.ts +1 -417
  242. package/src/config/modelProviders/spark.ts +1 -59
  243. package/src/config/modelProviders/stepfun.ts +1 -98
  244. package/src/config/modelProviders/taichu.ts +1 -18
  245. package/src/config/modelProviders/togetherai.ts +1 -274
  246. package/src/config/modelProviders/upstage.ts +1 -28
  247. package/src/config/modelProviders/wenxin.ts +1 -140
  248. package/src/config/modelProviders/xai.ts +1 -38
  249. package/src/config/modelProviders/zeroone.ts +1 -81
  250. package/src/config/modelProviders/zhipu.ts +1 -108
  251. package/src/envs/app.ts +5 -8
  252. package/src/envs/auth.ts +0 -179
  253. package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
  254. package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
  255. package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
  256. package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
  257. package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
  258. package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
  259. package/src/features/Conversation/Error/index.tsx +15 -5
  260. package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
  261. package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
  262. package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
  263. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
  264. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
  265. package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
  266. package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
  267. package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
  268. package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
  269. package/src/features/Conversation/Messages/Default.tsx +2 -2
  270. package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
  271. package/src/features/Conversation/Messages/User/index.tsx +4 -4
  272. package/src/features/Conversation/Messages/index.tsx +3 -3
  273. package/src/features/Conversation/components/AutoScroll.tsx +2 -2
  274. package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
  275. package/src/features/DataImporter/index.tsx +15 -60
  276. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  277. package/src/features/PluginTag/index.tsx +1 -3
  278. package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
  279. package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
  280. package/src/helpers/isCanUseFC.ts +0 -8
  281. package/src/hooks/useEnabledChatModels.ts +0 -8
  282. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  283. package/src/hooks/useModelContextWindowTokens.ts +0 -8
  284. package/src/hooks/useModelHasContextWindowToken.ts +1 -10
  285. package/src/hooks/useModelSupportFiles.ts +1 -11
  286. package/src/hooks/useModelSupportReasoning.ts +1 -11
  287. package/src/hooks/useModelSupportToolUse.ts +1 -11
  288. package/src/hooks/useModelSupportVision.ts +1 -11
  289. package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
  290. package/src/libs/next-auth/auth.config.ts +3 -6
  291. package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
  292. package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
  293. package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
  294. package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
  295. package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
  296. package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
  297. package/src/libs/next-auth/sso-providers/github.ts +0 -6
  298. package/src/libs/next-auth/sso-providers/google.ts +0 -2
  299. package/src/libs/next-auth/sso-providers/index.ts +0 -2
  300. package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
  301. package/src/libs/next-auth/sso-providers/logto.ts +3 -5
  302. package/src/libs/next-auth/sso-providers/okta.ts +0 -4
  303. package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
  304. package/src/libs/oidc-provider/provider.ts +1 -1
  305. package/src/libs/trpc/client/index.ts +0 -1
  306. package/src/libs/trpc/client/lambda.ts +8 -5
  307. package/src/libs/trpc/lambda/context.ts +4 -1
  308. package/src/locales/default/oauth.ts +1 -0
  309. package/src/server/globalConfig/index.ts +0 -23
  310. package/src/server/modules/AssistantStore/index.ts +1 -1
  311. package/src/server/modules/ModelRuntime/trace.ts +11 -4
  312. package/src/server/routers/desktop/mcp.ts +1 -3
  313. package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +0 -41
  314. package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
  315. package/src/server/routers/lambda/config/index.test.ts +38 -30
  316. package/src/server/routers/lambda/message.ts +17 -13
  317. package/src/server/routers/lambda/session.ts +8 -5
  318. package/src/server/routers/lambda/user.ts +24 -25
  319. package/src/server/routers/tools/mcp.ts +2 -3
  320. package/src/server/routers/tools/search.test.ts +1 -7
  321. package/src/server/routers/tools/search.ts +1 -4
  322. package/src/server/services/search/impls/firecrawl/index.ts +51 -11
  323. package/src/server/services/search/impls/firecrawl/type.ts +60 -9
  324. package/src/services/__tests__/tool.test.ts +0 -3
  325. package/src/services/aiModel/index.test.ts +0 -3
  326. package/src/services/aiModel/index.ts +1 -7
  327. package/src/services/aiProvider/index.test.ts +0 -3
  328. package/src/services/aiProvider/index.ts +1 -7
  329. package/src/services/chat/chat.test.ts +13 -40
  330. package/src/services/chat/contextEngineering.test.ts +0 -30
  331. package/src/services/chat/contextEngineering.ts +1 -12
  332. package/src/services/chat/helper.ts +7 -31
  333. package/src/services/chat/index.ts +5 -10
  334. package/src/services/chat/types.ts +1 -1
  335. package/src/services/chatGroup/index.ts +1 -10
  336. package/src/services/config.ts +1 -65
  337. package/src/services/export/index.ts +1 -4
  338. package/src/services/file/index.ts +1 -11
  339. package/src/services/import/index.ts +1 -7
  340. package/src/services/mcp.test.ts +777 -0
  341. package/src/services/message/index.ts +1 -11
  342. package/src/services/message/server.ts +7 -6
  343. package/src/services/message/type.ts +6 -3
  344. package/src/services/models.ts +2 -11
  345. package/src/services/plugin/index.ts +1 -11
  346. package/src/services/session/index.ts +1 -11
  347. package/src/services/tableViewer/client.ts +12 -15
  348. package/src/services/thread/index.ts +1 -7
  349. package/src/services/topic/index.ts +1 -11
  350. package/src/services/user/index.ts +1 -13
  351. package/src/store/chat/helpers.test.ts +99 -0
  352. package/src/store/chat/helpers.ts +21 -2
  353. package/src/store/chat/selectors.ts +1 -1
  354. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  355. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  356. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  357. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +45 -155
  358. package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
  359. package/src/store/chat/slices/message/action.test.ts +5 -1
  360. package/src/store/chat/slices/message/action.ts +102 -14
  361. package/src/store/chat/slices/message/reducer.test.ts +363 -5
  362. package/src/store/chat/slices/message/reducer.ts +87 -3
  363. package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
  364. package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
  365. package/src/store/chat/slices/message/selectors/index.ts +2 -0
  366. package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
  367. package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
  368. package/src/store/chat/slices/plugin/action.test.ts +34 -132
  369. package/src/store/chat/slices/plugin/action.ts +1 -44
  370. package/src/store/global/store.ts +1 -7
  371. package/src/store/tool/selectors/tool.test.ts +1 -1
  372. package/src/store/tool/selectors/tool.ts +6 -8
  373. package/src/store/tool/slices/builtin/action.test.ts +83 -35
  374. package/src/store/tool/slices/builtin/action.ts +0 -9
  375. package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
  376. package/src/store/tool/slices/builtin/selectors.ts +15 -21
  377. package/src/store/user/initialState.ts +1 -7
  378. package/src/store/user/selectors.ts +1 -5
  379. package/src/store/user/slices/common/action.test.ts +1 -4
  380. package/src/store/user/slices/common/action.ts +5 -4
  381. package/src/store/user/slices/settings/selectors/index.ts +1 -0
  382. package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
  383. package/src/store/user/store.ts +0 -3
  384. package/src/tools/index.ts +0 -6
  385. package/src/tools/renders.ts +0 -3
  386. package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
  387. package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
  388. package/tsconfig.json +9 -3
  389. package/packages/const/src/guide.ts +0 -89
  390. package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
  391. package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
  392. package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
  393. package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
  394. package/packages/utils/src/_deprecated/parseModels.ts +0 -165
  395. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  396. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  397. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  398. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  399. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  400. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  401. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  402. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  403. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  404. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  405. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  406. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  407. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  408. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  409. package/src/app/[variants]/(main)/settings/llm/ProviderList/Azure/index.tsx +0 -93
  410. package/src/app/[variants]/(main)/settings/llm/ProviderList/Bedrock/index.tsx +0 -70
  411. package/src/app/[variants]/(main)/settings/llm/ProviderList/Cloudflare/index.tsx +0 -39
  412. package/src/app/[variants]/(main)/settings/llm/ProviderList/Github/index.tsx +0 -52
  413. package/src/app/[variants]/(main)/settings/llm/ProviderList/HuggingFace/index.tsx +0 -52
  414. package/src/app/[variants]/(main)/settings/llm/ProviderList/Ollama/index.tsx +0 -20
  415. package/src/app/[variants]/(main)/settings/llm/ProviderList/OpenAI/index.tsx +0 -17
  416. package/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx +0 -132
  417. package/src/app/[variants]/(main)/settings/llm/components/Checker.tsx +0 -118
  418. package/src/app/[variants]/(main)/settings/llm/components/ProviderConfig/index.tsx +0 -303
  419. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/CustomModelOption.tsx +0 -98
  420. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/Form.tsx +0 -104
  421. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/index.tsx +0 -77
  422. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelFetcher.tsx +0 -105
  423. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/Option.tsx +0 -68
  424. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/index.tsx +0 -146
  425. package/src/app/[variants]/(main)/settings/llm/const.ts +0 -20
  426. package/src/app/[variants]/(main)/settings/llm/features/Footer.tsx +0 -35
  427. package/src/app/[variants]/(main)/settings/llm/index.tsx +0 -30
  428. package/src/app/[variants]/(main)/settings/llm/type.ts +0 -5
  429. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  430. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  431. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  432. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  433. package/src/components/InnerLink.tsx +0 -20
  434. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  435. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  436. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  437. package/src/database/_deprecated/core/db.ts +0 -246
  438. package/src/database/_deprecated/core/index.ts +0 -2
  439. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  440. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  441. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  442. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  443. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  444. package/src/database/_deprecated/core/model.ts +0 -218
  445. package/src/database/_deprecated/core/schemas.ts +0 -88
  446. package/src/database/_deprecated/core/types/db.ts +0 -15
  447. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  448. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  449. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  450. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  451. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  452. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  453. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  454. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  455. package/src/database/_deprecated/models/file.ts +0 -51
  456. package/src/database/_deprecated/models/message.ts +0 -277
  457. package/src/database/_deprecated/models/plugin.ts +0 -62
  458. package/src/database/_deprecated/models/session.ts +0 -271
  459. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  460. package/src/database/_deprecated/models/topic.ts +0 -250
  461. package/src/database/_deprecated/models/user.ts +0 -69
  462. package/src/database/_deprecated/schemas/files.ts +0 -39
  463. package/src/database/_deprecated/schemas/message.ts +0 -50
  464. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  465. package/src/database/_deprecated/schemas/session.ts +0 -54
  466. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  467. package/src/database/_deprecated/schemas/topic.ts +0 -12
  468. package/src/database/_deprecated/schemas/user.ts +0 -40
  469. package/src/envs/__tests__/auth.test.ts +0 -200
  470. package/src/features/DataImporter/_deprecated.ts +0 -43
  471. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  472. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  473. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  474. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  475. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  476. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  477. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  478. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  479. package/src/features/InitClientDB/index.tsx +0 -37
  480. package/src/hooks/_header.ts +0 -23
  481. package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
  482. package/src/libs/trpc/client/edge.ts +0 -26
  483. package/src/libs/trpc/edge/context.ts +0 -71
  484. package/src/libs/trpc/edge/index.ts +0 -45
  485. package/src/libs/trpc/edge/init.ts +0 -26
  486. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  487. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  488. package/src/migrations/FromV0ToV1.ts +0 -10
  489. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  490. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  491. package/src/migrations/FromV1ToV2/index.ts +0 -82
  492. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  493. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  494. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  495. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  496. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  497. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  498. package/src/migrations/FromV2ToV3/index.ts +0 -30
  499. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  500. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  501. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  502. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  503. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  504. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  505. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  506. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  507. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  508. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  509. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  510. package/src/migrations/FromV3ToV4/index.ts +0 -102
  511. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  512. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  513. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  514. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  515. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  516. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  517. package/src/migrations/FromV4ToV5/index.ts +0 -58
  518. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  519. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  520. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  521. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  522. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  523. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  524. package/src/migrations/FromV5ToV6/index.ts +0 -61
  525. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  526. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  527. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  528. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  529. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  530. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  531. package/src/migrations/FromV6ToV7/index.ts +0 -101
  532. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  533. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  534. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  535. package/src/migrations/VersionController.test.ts +0 -88
  536. package/src/migrations/VersionController.ts +0 -67
  537. package/src/migrations/index.ts +0 -61
  538. package/src/server/globalConfig/_deprecated.test.ts +0 -92
  539. package/src/server/globalConfig/_deprecated.ts +0 -41
  540. package/src/server/routers/edge/appStatus.ts +0 -3
  541. package/src/server/routers/edge/index.ts +0 -14
  542. package/src/server/routers/edge/upload.ts +0 -16
  543. package/src/services/aiModel/client.ts +0 -70
  544. package/src/services/aiProvider/client.ts +0 -58
  545. package/src/services/baseClientService/index.ts +0 -9
  546. package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
  547. package/src/services/chatGroup/client.ts +0 -63
  548. package/src/services/export/_deprecated.ts +0 -155
  549. package/src/services/export/client.ts +0 -15
  550. package/src/services/file/_deprecated.test.ts +0 -119
  551. package/src/services/file/_deprecated.ts +0 -80
  552. package/src/services/file/client.test.ts +0 -199
  553. package/src/services/file/client.ts +0 -85
  554. package/src/services/import/_deprecated.ts +0 -115
  555. package/src/services/import/client.test.ts +0 -1015
  556. package/src/services/import/client.ts +0 -64
  557. package/src/services/message/_deprecated.test.ts +0 -398
  558. package/src/services/message/_deprecated.ts +0 -168
  559. package/src/services/message/client.test.ts +0 -410
  560. package/src/services/message/client.ts +0 -186
  561. package/src/services/plugin/_deprecated.test.ts +0 -162
  562. package/src/services/plugin/_deprecated.ts +0 -42
  563. package/src/services/plugin/client.test.ts +0 -177
  564. package/src/services/plugin/client.ts +0 -46
  565. package/src/services/session/_deprecated.test.ts +0 -440
  566. package/src/services/session/_deprecated.ts +0 -190
  567. package/src/services/session/client.test.ts +0 -413
  568. package/src/services/session/client.ts +0 -193
  569. package/src/services/thread/client.ts +0 -51
  570. package/src/services/topic/_deprecated.test.ts +0 -245
  571. package/src/services/topic/_deprecated.ts +0 -75
  572. package/src/services/topic/client.ts +0 -89
  573. package/src/services/topic/pglite.test.ts +0 -212
  574. package/src/services/user/_deprecated.test.ts +0 -101
  575. package/src/services/user/_deprecated.ts +0 -70
  576. package/src/services/user/client.test.ts +0 -108
  577. package/src/services/user/client.ts +0 -104
  578. package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
  579. package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
  580. package/src/store/global/actions/clientDb.ts +0 -67
  581. package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
  582. package/src/store/user/slices/modelList/action.test.ts +0 -359
  583. package/src/store/user/slices/modelList/action.ts +0 -223
  584. package/src/store/user/slices/modelList/initialState.ts +0 -15
  585. package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
  586. package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
  587. package/src/store/user/slices/modelList/selectors/index.ts +0 -3
  588. package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
  589. package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
  590. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
  591. package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
  592. package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
  593. package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
  594. package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
  595. package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
  596. package/src/tools/dalle/Render/Item/Error.tsx +0 -49
  597. package/src/tools/dalle/Render/Item/Image.tsx +0 -44
  598. package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
  599. package/src/tools/dalle/Render/Item/index.tsx +0 -88
  600. package/src/tools/dalle/Render/ToolBar.tsx +0 -56
  601. package/src/tools/dalle/Render/index.tsx +0 -52
  602. package/src/tools/dalle/index.ts +0 -92
  603. /package/src/{middleware.ts → proxy.ts} +0 -0
@@ -12,7 +12,7 @@ import { messageMapKey } from '@/store/chat/utils/messageMapKey';
12
12
  import { createServerConfigStore } from '@/store/serverConfig/store';
13
13
  import { merge } from '@/utils/merge';
14
14
 
15
- import { chatSelectors } from './selectors';
15
+ import { chatSelectors } from './chat';
16
16
 
17
17
  vi.mock('i18next', () => ({
18
18
  t: vi.fn((key) => key), // Simplified mock return value
@@ -416,35 +416,6 @@ describe('chatSelectors', () => {
416
416
  });
417
417
  });
418
418
 
419
- describe('isToolCallStreaming', () => {
420
- it('should return true when tool call is streaming for given message and index', () => {
421
- const state: Partial<ChatStore> = {
422
- toolCallingStreamIds: {
423
- 'msg-1': [true, false, true],
424
- },
425
- };
426
- expect(chatSelectors.isToolCallStreaming('msg-1', 0)(state as ChatStore)).toBe(true);
427
- expect(chatSelectors.isToolCallStreaming('msg-1', 2)(state as ChatStore)).toBe(true);
428
- });
429
-
430
- it('should return false when tool call is not streaming for given message and index', () => {
431
- const state: Partial<ChatStore> = {
432
- toolCallingStreamIds: {
433
- 'msg-1': [true, false, true],
434
- },
435
- };
436
- expect(chatSelectors.isToolCallStreaming('msg-1', 1)(state as ChatStore)).toBe(false);
437
- expect(chatSelectors.isToolCallStreaming('msg-2', 0)(state as ChatStore)).toBe(false);
438
- });
439
-
440
- it('should return false when no streaming data exists for the message', () => {
441
- const state: Partial<ChatStore> = {
442
- toolCallingStreamIds: {},
443
- };
444
- expect(chatSelectors.isToolCallStreaming('msg-1', 0)(state as ChatStore)).toBe(false);
445
- });
446
- });
447
-
448
419
  describe('activeBaseChats with group chat messages', () => {
449
420
  it('should retrieve agent meta for group chat messages with groupId and agentId', () => {
450
421
  const groupChatMessages = [
@@ -470,4 +441,269 @@ describe('chatSelectors', () => {
470
441
  expect(chats[0].meta).toBeDefined();
471
442
  });
472
443
  });
444
+
445
+ describe('getGroupLatestMessageWithoutTools', () => {
446
+ it('should return the last child without tools', () => {
447
+ const groupMessage = {
448
+ id: 'group-1',
449
+ role: 'group',
450
+ content: '',
451
+ children: [
452
+ {
453
+ id: 'child-1',
454
+ content: 'First response',
455
+ tools: [
456
+ {
457
+ id: 'tool-1',
458
+ identifier: 'test',
459
+ apiName: 'test',
460
+ arguments: '{}',
461
+ type: 'default',
462
+ },
463
+ ],
464
+ },
465
+ {
466
+ id: 'child-2',
467
+ content: 'Second response',
468
+ tools: [],
469
+ },
470
+ {
471
+ id: 'child-3',
472
+ content: 'Final response',
473
+ },
474
+ ],
475
+ } as UIChatMessage;
476
+
477
+ const state: Partial<ChatStore> = {
478
+ activeId: 'test-id',
479
+ messagesMap: {
480
+ [messageMapKey('test-id')]: [groupMessage],
481
+ },
482
+ };
483
+
484
+ const result = chatSelectors.getGroupLatestMessageWithoutTools('group-1')(state as ChatStore);
485
+ expect(result).toBeDefined();
486
+ expect(result?.id).toBe('child-3');
487
+ expect(result?.content).toBe('Final response');
488
+ });
489
+
490
+ it('should return null if the last child has tools', () => {
491
+ const groupMessage = {
492
+ id: 'group-2',
493
+ role: 'group',
494
+ content: '',
495
+ children: [
496
+ {
497
+ id: 'child-1',
498
+ content: 'First response',
499
+ },
500
+ {
501
+ id: 'child-2',
502
+ content: 'Second response with tools',
503
+ tools: [
504
+ {
505
+ id: 'tool-1',
506
+ identifier: 'test',
507
+ apiName: 'test',
508
+ arguments: '{}',
509
+ type: 'default',
510
+ },
511
+ ],
512
+ },
513
+ ],
514
+ } as UIChatMessage;
515
+
516
+ const state: Partial<ChatStore> = {
517
+ activeId: 'test-id',
518
+ messagesMap: {
519
+ [messageMapKey('test-id')]: [groupMessage],
520
+ },
521
+ };
522
+
523
+ const result = chatSelectors.getGroupLatestMessageWithoutTools('group-2')(state as ChatStore);
524
+ expect(result).toBeUndefined();
525
+ });
526
+
527
+ it('should return the last child when it has empty tools array', () => {
528
+ const groupMessage = {
529
+ id: 'group-3',
530
+ role: 'group',
531
+ content: '',
532
+ children: [
533
+ {
534
+ id: 'child-1',
535
+ content: 'First response with tools',
536
+ tools: [
537
+ {
538
+ id: 'tool-1',
539
+ identifier: 'test',
540
+ apiName: 'test',
541
+ arguments: '{}',
542
+ type: 'default',
543
+ },
544
+ ],
545
+ },
546
+ {
547
+ id: 'child-2',
548
+ content: 'Final response',
549
+ tools: [],
550
+ },
551
+ ],
552
+ } as UIChatMessage;
553
+
554
+ const state: Partial<ChatStore> = {
555
+ activeId: 'test-id',
556
+ messagesMap: {
557
+ [messageMapKey('test-id')]: [groupMessage],
558
+ },
559
+ };
560
+
561
+ const result = chatSelectors.getGroupLatestMessageWithoutTools('group-3')(state as ChatStore);
562
+ expect(result).toBeDefined();
563
+ expect(result?.id).toBe('child-2');
564
+ expect(result?.content).toBe('Final response');
565
+ });
566
+
567
+ it('should return null for non-group messages', () => {
568
+ const assistantMessage = {
569
+ id: 'msg-1',
570
+ role: 'assistant',
571
+ content: 'Regular message',
572
+ } as UIChatMessage;
573
+
574
+ const state: Partial<ChatStore> = {
575
+ activeId: 'test-id',
576
+ messagesMap: {
577
+ [messageMapKey('test-id')]: [assistantMessage],
578
+ },
579
+ };
580
+
581
+ const result = chatSelectors.getGroupLatestMessageWithoutTools('msg-1')(state as ChatStore);
582
+ expect(result).toBeUndefined();
583
+ });
584
+
585
+ it('should return null for group messages without children', () => {
586
+ const groupMessage = {
587
+ id: 'group-4',
588
+ role: 'group',
589
+ content: '',
590
+ children: undefined,
591
+ } as UIChatMessage;
592
+
593
+ const state: Partial<ChatStore> = {
594
+ activeId: 'test-id',
595
+ messagesMap: {
596
+ [messageMapKey('test-id')]: [groupMessage],
597
+ },
598
+ };
599
+
600
+ const result = chatSelectors.getGroupLatestMessageWithoutTools('group-4')(state as ChatStore);
601
+ expect(result).toBeUndefined();
602
+ });
603
+
604
+ it('should return null for group messages with empty children array', () => {
605
+ const groupMessage = {
606
+ id: 'group-5',
607
+ role: 'group',
608
+ content: '',
609
+ children: [],
610
+ } as unknown as UIChatMessage;
611
+
612
+ const state: Partial<ChatStore> = {
613
+ activeId: 'test-id',
614
+ messagesMap: {
615
+ [messageMapKey('test-id')]: [groupMessage],
616
+ },
617
+ };
618
+
619
+ const result = chatSelectors.getGroupLatestMessageWithoutTools('group-5')(state as ChatStore);
620
+ expect(result).toBeUndefined();
621
+ });
622
+
623
+ it('should return null if all children have tools', () => {
624
+ const groupMessage = {
625
+ id: 'group-6',
626
+ role: 'group',
627
+ content: '',
628
+ children: [
629
+ {
630
+ id: 'child-1',
631
+ content: 'First response',
632
+ tools: [
633
+ {
634
+ id: 'tool-1',
635
+ identifier: 'test',
636
+ apiName: 'test',
637
+ arguments: '{}',
638
+ type: 'default',
639
+ },
640
+ ],
641
+ },
642
+ {
643
+ id: 'child-2',
644
+ content: 'Second response',
645
+ tools: [
646
+ {
647
+ id: 'tool-2',
648
+ identifier: 'test2',
649
+ apiName: 'test2',
650
+ arguments: '{}',
651
+ type: 'default',
652
+ },
653
+ ],
654
+ },
655
+ ],
656
+ } as unknown as UIChatMessage;
657
+
658
+ const state: Partial<ChatStore> = {
659
+ activeId: 'test-id',
660
+ messagesMap: {
661
+ [messageMapKey('test-id')]: [groupMessage],
662
+ },
663
+ };
664
+
665
+ const result = chatSelectors.getGroupLatestMessageWithoutTools('group-6')(state as ChatStore);
666
+ expect(result).toBeUndefined();
667
+ });
668
+
669
+ it('should handle empty tools array as no tools', () => {
670
+ const groupMessage = {
671
+ id: 'group-7',
672
+ role: 'group',
673
+ content: '',
674
+ children: [
675
+ {
676
+ id: 'child-1',
677
+ content: 'Response with empty tools',
678
+ tools: [],
679
+ },
680
+ ],
681
+ } as unknown as UIChatMessage;
682
+
683
+ const state: Partial<ChatStore> = {
684
+ activeId: 'test-id',
685
+ messagesMap: {
686
+ [messageMapKey('test-id')]: [groupMessage],
687
+ },
688
+ };
689
+
690
+ const result = chatSelectors.getGroupLatestMessageWithoutTools('group-7')(state as ChatStore);
691
+ expect(result).toBeDefined();
692
+ expect(result?.id).toBe('child-1');
693
+ });
694
+
695
+ it('should return null when message is not found', () => {
696
+ const state: Partial<ChatStore> = {
697
+ activeId: 'test-id',
698
+ messagesMap: {
699
+ [messageMapKey('test-id')]: [],
700
+ },
701
+ };
702
+
703
+ const result = chatSelectors.getGroupLatestMessageWithoutTools('non-existent')(
704
+ state as ChatStore,
705
+ );
706
+ expect(result).toBeUndefined();
707
+ });
708
+ });
473
709
  });
@@ -10,8 +10,8 @@ import { sessionMetaSelectors } from '@/store/session/selectors';
10
10
  import { useUserStore } from '@/store/user';
11
11
  import { userProfileSelectors } from '@/store/user/selectors';
12
12
 
13
- import { chatHelpers } from '../../helpers';
14
- import type { ChatStoreState } from '../../initialState';
13
+ import { chatHelpers } from '../../../helpers';
14
+ import type { ChatStoreState } from '../../../initialState';
15
15
 
16
16
  const getMeta = (message: UIChatMessage) => {
17
17
  switch (message.role) {
@@ -47,7 +47,7 @@ const getBaseChatsByKey =
47
47
  return messages.map((i) => ({ ...i, meta: getMeta(i) }));
48
48
  };
49
49
 
50
- const currentChatKey = (s: ChatStoreState) => messageMapKey(s.activeId, s.activeTopicId);
50
+ export const currentChatKey = (s: ChatStoreState) => messageMapKey(s.activeId, s.activeTopicId);
51
51
 
52
52
  /**
53
53
  * Current active raw message list, include thread messages
@@ -89,7 +89,7 @@ const mainDisplayChats = (s: ChatStoreState): UIChatMessage[] => {
89
89
  return getChatsWithThread(s, displayChats);
90
90
  };
91
91
 
92
- const mainDisplayChatIDs = (s: ChatStoreState) => mainDisplayChats(s).map((s) => s.id);
92
+ export const mainDisplayChatIDs = (s: ChatStoreState) => mainDisplayChats(s).map((s) => s.id);
93
93
 
94
94
  const mainAIChats = (s: ChatStoreState): UIChatMessage[] => {
95
95
  const messages = activeBaseChats(s);
@@ -154,7 +154,7 @@ const countMessagesByThreadId = (id: string) => (s: ChatStoreState) => {
154
154
  return messages.length;
155
155
  };
156
156
 
157
- const getMessageByToolCallId = (id: string) => (s: ChatStoreState) => {
157
+ export const getMessageByToolCallId = (id: string) => (s: ChatStoreState) => {
158
158
  const messages = activeBaseChats(s);
159
159
  return messages.find((m) => m.tool_call_id === id);
160
160
  };
@@ -166,67 +166,6 @@ const currentChatLoadingState = (s: ChatStoreState) => !s.messagesInit;
166
166
 
167
167
  const isCurrentChatLoaded = (s: ChatStoreState) => !!s.messagesMap[currentChatKey(s)];
168
168
 
169
- const isMessageEditing = (id: string) => (s: ChatStoreState) => s.messageEditingIds.includes(id);
170
- const isMessageLoading = (id: string) => (s: ChatStoreState) => s.messageLoadingIds.includes(id);
171
-
172
- const isMessageGenerating = (id: string) => (s: ChatStoreState) => s.chatLoadingIds.includes(id);
173
- const isMessageInRAGFlow = (id: string) => (s: ChatStoreState) =>
174
- s.messageRAGLoadingIds.includes(id);
175
- const isMessageInChatReasoning = (id: string) => (s: ChatStoreState) =>
176
- s.reasoningLoadingIds.includes(id);
177
-
178
- const isPluginApiInvoking = (id: string) => (s: ChatStoreState) =>
179
- s.pluginApiLoadingIds.includes(id);
180
-
181
- const isToolCallStreaming = (id: string, index: number) => (s: ChatStoreState) => {
182
- const isLoading = s.toolCallingStreamIds[id];
183
-
184
- if (!isLoading) return false;
185
-
186
- return isLoading[index];
187
- };
188
-
189
- const isInToolsCalling = (id: string, index: number) => (s: ChatStoreState) => {
190
- const isStreamingToolsCalling = isToolCallStreaming(id, index)(s);
191
-
192
- const isInvokingPluginApi = s.messageInToolsCallingIds.includes(id);
193
-
194
- return isStreamingToolsCalling || isInvokingPluginApi;
195
- };
196
-
197
- const isToolApiNameShining =
198
- (messageId: string, index: number, toolCallId: string) => (s: ChatStoreState) => {
199
- const toolMessageId = getMessageByToolCallId(toolCallId)(s)?.id;
200
- const isStreaming = isToolCallStreaming(messageId, index)(s);
201
- const isPluginInvoking = !toolMessageId ? true : isPluginApiInvoking(toolMessageId)(s);
202
-
203
- return isStreaming || isPluginInvoking;
204
- };
205
-
206
- const isAIGenerating = (s: ChatStoreState) =>
207
- s.chatLoadingIds.some((id) => mainDisplayChatIDs(s).includes(id));
208
-
209
- const isInRAGFlow = (s: ChatStoreState) =>
210
- s.messageRAGLoadingIds.some((id) => mainDisplayChatIDs(s).includes(id));
211
-
212
- const isCreatingMessage = (s: ChatStoreState) => s.isCreatingMessage;
213
-
214
- const isHasMessageLoading = (s: ChatStoreState) =>
215
- s.messageLoadingIds.some((id) => mainDisplayChatIDs(s).includes(id));
216
-
217
- /**
218
- * this function is used to determine whether the send button should be disabled
219
- */
220
- const isSendButtonDisabledByMessage = (s: ChatStoreState) =>
221
- // 1. when there is message loading
222
- isHasMessageLoading(s) ||
223
- // 2. when is creating the topic
224
- s.creatingTopic ||
225
- // 3. when is creating the message
226
- isCreatingMessage(s) ||
227
- // 4. when the message is in RAG flow
228
- isInRAGFlow(s);
229
-
230
169
  const inboxActiveTopicMessages = (state: ChatStoreState) => {
231
170
  const activeTopicId = state.activeTopicId;
232
171
  return state.messagesMap[messageMapKey(INBOX_SESSION_ID, activeTopicId)] || [];
@@ -280,6 +219,29 @@ const getSupervisorTodos = (groupId?: string, topicId?: string | null) => (s: Ch
280
219
  return s.supervisorTodos[messageMapKey(groupId, topicId)] || [];
281
220
  };
282
221
 
222
+ /**
223
+ * Gets the latest message block from a group message that doesn't contain tools
224
+ * Returns null if the last block contains tools or if message is not a group message
225
+ */
226
+ const getGroupLatestMessageWithoutTools = (id: string) => (s: ChatStoreState) => {
227
+ const message = getMessageById(id)(s);
228
+
229
+ if (!message || message.role !== 'group' || !message.children || message.children.length === 0)
230
+ return;
231
+
232
+ // Get the last child
233
+ const lastChild = message.children.at(-1);
234
+
235
+ if (!lastChild) return;
236
+
237
+ // Return the last child only if it doesn't have tools
238
+ if (!lastChild.tools || lastChild.tools.length === 0) {
239
+ return lastChild;
240
+ }
241
+
242
+ return;
243
+ };
244
+
283
245
  export const chatSelectors = {
284
246
  activeBaseChats,
285
247
  activeBaseChatsWithoutTool,
@@ -289,6 +251,7 @@ export const chatSelectors = {
289
251
  currentToolMessages,
290
252
  currentUserFiles,
291
253
  getBaseChatsByKey,
254
+ getGroupLatestMessageWithoutTools,
292
255
  getMessageById,
293
256
  getMessageByToolCallId,
294
257
  getSupervisorTodos,
@@ -296,21 +259,8 @@ export const chatSelectors = {
296
259
  getThreadMessages,
297
260
  getTraceIdByMessageId,
298
261
  inboxActiveTopicMessages,
299
- isAIGenerating,
300
- isCreatingMessage,
301
262
  isCurrentChatLoaded,
302
- isHasMessageLoading,
303
- isInToolsCalling,
304
- isMessageEditing,
305
- isMessageGenerating,
306
- isMessageInChatReasoning,
307
- isMessageInRAGFlow,
308
- isMessageLoading,
309
- isPluginApiInvoking,
310
- isSendButtonDisabledByMessage,
311
263
  isSupervisorLoading,
312
- isToolApiNameShining,
313
- isToolCallStreaming,
314
264
  latestMessage,
315
265
  mainAIChats,
316
266
  mainAIChatsMessageString,
@@ -0,0 +1,2 @@
1
+ export * from './chat';
2
+ export * from './messageState';
@@ -0,0 +1,36 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { ChatStore } from '@/store/chat';
4
+
5
+ import { messageStateSelectors } from './messageState';
6
+
7
+ describe('messageStateSelectors', () => {
8
+ describe('isToolCallStreaming', () => {
9
+ it('should return true when tool call is streaming for given message and index', () => {
10
+ const state: Partial<ChatStore> = {
11
+ toolCallingStreamIds: {
12
+ 'msg-1': [true, false, true],
13
+ },
14
+ };
15
+ expect(messageStateSelectors.isToolCallStreaming('msg-1', 0)(state as ChatStore)).toBe(true);
16
+ expect(messageStateSelectors.isToolCallStreaming('msg-1', 2)(state as ChatStore)).toBe(true);
17
+ });
18
+
19
+ it('should return false when tool call is not streaming for given message and index', () => {
20
+ const state: Partial<ChatStore> = {
21
+ toolCallingStreamIds: {
22
+ 'msg-1': [true, false, true],
23
+ },
24
+ };
25
+ expect(messageStateSelectors.isToolCallStreaming('msg-1', 1)(state as ChatStore)).toBe(false);
26
+ expect(messageStateSelectors.isToolCallStreaming('msg-2', 0)(state as ChatStore)).toBe(false);
27
+ });
28
+
29
+ it('should return false when no streaming data exists for the message', () => {
30
+ const state: Partial<ChatStore> = {
31
+ toolCallingStreamIds: {},
32
+ };
33
+ expect(messageStateSelectors.isToolCallStreaming('msg-1', 0)(state as ChatStore)).toBe(false);
34
+ });
35
+ });
36
+ });
@@ -0,0 +1,80 @@
1
+ import type { ChatStoreState } from '../../../initialState';
2
+ import { getMessageByToolCallId, mainDisplayChatIDs } from './chat';
3
+
4
+ const isMessageEditing = (id: string) => (s: ChatStoreState) => s.messageEditingIds.includes(id);
5
+ const isMessageLoading = (id: string) => (s: ChatStoreState) => s.messageLoadingIds.includes(id);
6
+
7
+ const isMessageGenerating = (id: string) => (s: ChatStoreState) => s.chatLoadingIds.includes(id);
8
+ const isMessageInRAGFlow = (id: string) => (s: ChatStoreState) =>
9
+ s.messageRAGLoadingIds.includes(id);
10
+ const isMessageInChatReasoning = (id: string) => (s: ChatStoreState) =>
11
+ s.reasoningLoadingIds.includes(id);
12
+
13
+ const isPluginApiInvoking = (id: string) => (s: ChatStoreState) =>
14
+ s.pluginApiLoadingIds.includes(id);
15
+
16
+ const isToolCallStreaming = (id: string, index: number) => (s: ChatStoreState) => {
17
+ const isLoading = s.toolCallingStreamIds[id];
18
+
19
+ if (!isLoading) return false;
20
+
21
+ return isLoading[index];
22
+ };
23
+
24
+ const isInToolsCalling = (id: string, index: number) => (s: ChatStoreState) => {
25
+ const isStreamingToolsCalling = isToolCallStreaming(id, index)(s);
26
+
27
+ const isInvokingPluginApi = s.messageInToolsCallingIds.includes(id);
28
+
29
+ return isStreamingToolsCalling || isInvokingPluginApi;
30
+ };
31
+
32
+ const isToolApiNameShining =
33
+ (messageId: string, index: number, toolCallId: string) => (s: ChatStoreState) => {
34
+ const toolMessageId = getMessageByToolCallId(toolCallId)(s)?.id;
35
+ const isStreaming = isToolCallStreaming(messageId, index)(s);
36
+ const isPluginInvoking = !toolMessageId ? true : isPluginApiInvoking(toolMessageId)(s);
37
+
38
+ return isStreaming || isPluginInvoking;
39
+ };
40
+
41
+ const isAIGenerating = (s: ChatStoreState) =>
42
+ s.chatLoadingIds.some((id) => mainDisplayChatIDs(s).includes(id));
43
+
44
+ const isInRAGFlow = (s: ChatStoreState) =>
45
+ s.messageRAGLoadingIds.some((id) => mainDisplayChatIDs(s).includes(id));
46
+
47
+ const isCreatingMessage = (s: ChatStoreState) => s.isCreatingMessage;
48
+
49
+ const isHasMessageLoading = (s: ChatStoreState) =>
50
+ s.messageLoadingIds.some((id) => mainDisplayChatIDs(s).includes(id));
51
+
52
+ /**
53
+ * this function is used to determine whether the send button should be disabled
54
+ */
55
+ const isSendButtonDisabledByMessage = (s: ChatStoreState) =>
56
+ // 1. when there is message loading
57
+ isHasMessageLoading(s) ||
58
+ // 2. when is creating the topic
59
+ s.creatingTopic ||
60
+ // 3. when is creating the message
61
+ isCreatingMessage(s) ||
62
+ // 4. when the message is in RAG flow
63
+ isInRAGFlow(s);
64
+
65
+ export const messageStateSelectors = {
66
+ isAIGenerating,
67
+ isCreatingMessage,
68
+ isHasMessageLoading,
69
+ isInRAGFlow,
70
+ isInToolsCalling,
71
+ isMessageEditing,
72
+ isMessageGenerating,
73
+ isMessageInChatReasoning,
74
+ isMessageInRAGFlow,
75
+ isMessageLoading,
76
+ isPluginApiInvoking,
77
+ isSendButtonDisabledByMessage,
78
+ isToolApiNameShining,
79
+ isToolCallStreaming,
80
+ };