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

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 (591) 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/desktop-pr-build.yml +18 -16
  5. package/.github/workflows/docker.yml +25 -20
  6. package/.github/workflows/e2e.yml +17 -3
  7. package/.github/workflows/release-desktop-beta.yml +12 -12
  8. package/.github/workflows/release.yml +2 -4
  9. package/.github/workflows/test.yml +8 -10
  10. package/.nvmrc +1 -1
  11. package/CHANGELOG.md +459 -0
  12. package/Dockerfile +1 -3
  13. package/README.md +2 -45
  14. package/README.zh-CN.md +2 -45
  15. package/apps/desktop/src/main/utils/next-electron-rsc.ts +7 -5
  16. package/apps/desktop/tsconfig.json +0 -1
  17. package/changelog/v1.json +150 -0
  18. package/docs/development/database-schema.dbml +11 -1
  19. package/docs/self-hosting/advanced/auth/next-auth/auth0.mdx +2 -2
  20. package/docs/self-hosting/advanced/auth/next-auth/auth0.zh-CN.mdx +2 -2
  21. package/docs/self-hosting/advanced/auth/next-auth/authelia.mdx +2 -2
  22. package/docs/self-hosting/advanced/auth/next-auth/authelia.zh-CN.mdx +2 -2
  23. package/docs/self-hosting/advanced/auth/next-auth/authentik.mdx +2 -2
  24. package/docs/self-hosting/advanced/auth/next-auth/authentik.zh-CN.mdx +2 -2
  25. package/docs/self-hosting/advanced/auth/next-auth/casdoor.mdx +2 -2
  26. package/docs/self-hosting/advanced/auth/next-auth/casdoor.zh-CN.mdx +2 -2
  27. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.mdx +2 -2
  28. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.zh-CN.mdx +2 -2
  29. package/docs/self-hosting/advanced/auth/next-auth/github.mdx +2 -2
  30. package/docs/self-hosting/advanced/auth/next-auth/github.zh-CN.mdx +2 -2
  31. package/docs/self-hosting/advanced/auth/next-auth/google.mdx +32 -29
  32. package/docs/self-hosting/advanced/auth/next-auth/keycloak.mdx +2 -2
  33. package/docs/self-hosting/advanced/auth/next-auth/keycloak.zh-CN.mdx +2 -2
  34. package/docs/self-hosting/advanced/auth/next-auth/logto.mdx +5 -3
  35. package/docs/self-hosting/advanced/auth/next-auth/logto.zh-CN.mdx +5 -3
  36. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.mdx +2 -2
  37. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.zh-CN.mdx +2 -2
  38. package/docs/self-hosting/advanced/auth/next-auth/okta.mdx +2 -2
  39. package/docs/self-hosting/advanced/auth/next-auth/okta.zh-CN.mdx +2 -2
  40. package/docs/self-hosting/advanced/auth/next-auth/wechat.mdx +2 -2
  41. package/docs/self-hosting/advanced/auth/next-auth/wechat.zh-CN.mdx +2 -2
  42. package/docs/self-hosting/advanced/auth/next-auth/zitadel.mdx +2 -2
  43. package/docs/self-hosting/advanced/auth/next-auth/zitadel.zh-CN.mdx +2 -2
  44. package/docs/self-hosting/advanced/auth.mdx +32 -21
  45. package/docs/self-hosting/advanced/auth.zh-CN.mdx +30 -19
  46. package/docs/self-hosting/advanced/feature-flags.mdx +0 -1
  47. package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +0 -1
  48. package/docs/self-hosting/advanced/online-search.mdx +30 -25
  49. package/docs/self-hosting/advanced/online-search.zh-CN.mdx +25 -23
  50. package/e2e/src/features/discover/smoke.feature +34 -1
  51. package/e2e/src/steps/discover/smoke.steps.ts +116 -4
  52. package/e2e/tsconfig.json +0 -1
  53. package/locales/ar/models.json +15 -6
  54. package/locales/ar/oauth.json +1 -0
  55. package/locales/bg-BG/models.json +15 -6
  56. package/locales/bg-BG/oauth.json +1 -0
  57. package/locales/de-DE/models.json +15 -6
  58. package/locales/de-DE/oauth.json +1 -0
  59. package/locales/en-US/models.json +15 -6
  60. package/locales/en-US/oauth.json +1 -0
  61. package/locales/es-ES/models.json +15 -6
  62. package/locales/es-ES/oauth.json +1 -0
  63. package/locales/fa-IR/models.json +15 -6
  64. package/locales/fa-IR/oauth.json +1 -0
  65. package/locales/fr-FR/models.json +15 -6
  66. package/locales/fr-FR/oauth.json +1 -0
  67. package/locales/it-IT/models.json +15 -6
  68. package/locales/it-IT/oauth.json +1 -0
  69. package/locales/ja-JP/models.json +15 -6
  70. package/locales/ja-JP/oauth.json +1 -0
  71. package/locales/ko-KR/models.json +21 -12
  72. package/locales/ko-KR/oauth.json +1 -0
  73. package/locales/nl-NL/models.json +15 -6
  74. package/locales/nl-NL/oauth.json +1 -0
  75. package/locales/pl-PL/models.json +15 -6
  76. package/locales/pl-PL/oauth.json +1 -0
  77. package/locales/pt-BR/models.json +15 -6
  78. package/locales/pt-BR/oauth.json +1 -0
  79. package/locales/ru-RU/models.json +15 -6
  80. package/locales/ru-RU/oauth.json +1 -0
  81. package/locales/tr-TR/models.json +15 -6
  82. package/locales/tr-TR/oauth.json +1 -0
  83. package/locales/vi-VN/models.json +15 -6
  84. package/locales/vi-VN/oauth.json +1 -0
  85. package/locales/zh-CN/models.json +15 -6
  86. package/locales/zh-CN/oauth.json +1 -0
  87. package/locales/zh-TW/models.json +15 -6
  88. package/locales/zh-TW/oauth.json +1 -0
  89. package/next.config.ts +2 -3
  90. package/package.json +74 -80
  91. package/packages/const/src/index.ts +0 -1
  92. package/packages/const/src/models.ts +13 -0
  93. package/packages/const/src/url.ts +1 -4
  94. package/packages/const/src/version.ts +3 -3
  95. package/packages/context-engine/src/index.ts +1 -6
  96. package/packages/context-engine/src/processors/GroupMessageFlatten.ts +12 -2
  97. package/packages/context-engine/src/processors/__tests__/GroupMessageFlatten.test.ts +73 -9
  98. package/packages/context-engine/src/providers/index.ts +0 -2
  99. package/packages/database/migrations/0041_improve_index.sql +10 -0
  100. package/packages/database/migrations/meta/0041_snapshot.json +7784 -0
  101. package/packages/database/migrations/meta/_journal.json +7 -0
  102. package/packages/database/package.json +1 -1
  103. package/packages/database/src/core/migrations.json +17 -0
  104. package/packages/database/src/core/web-server.ts +2 -1
  105. package/packages/database/src/models/__tests__/message.grouping.test.ts +812 -0
  106. package/packages/database/src/models/__tests__/message.test.ts +322 -170
  107. package/packages/database/src/models/message.ts +62 -24
  108. package/packages/database/src/models/session.ts +60 -19
  109. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  110. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  111. package/packages/database/src/schemas/agent.ts +10 -11
  112. package/packages/database/src/schemas/message.ts +5 -1
  113. package/packages/database/src/schemas/relations.ts +6 -4
  114. package/packages/database/src/schemas/session.ts +2 -0
  115. package/packages/database/src/schemas/topic.ts +6 -1
  116. package/packages/database/src/utils/__tests__/groupMessages.test.ts +145 -2
  117. package/packages/database/src/utils/groupMessages.ts +7 -5
  118. package/packages/electron-client-ipc/package.json +4 -1
  119. package/packages/file-loaders/package.json +1 -0
  120. package/packages/memory-extract/package.json +1 -1
  121. package/packages/model-bank/src/aiModels/anthropic.ts +0 -63
  122. package/packages/model-bank/src/aiModels/azure.ts +155 -0
  123. package/packages/model-bank/src/aiModels/bedrock.ts +44 -0
  124. package/packages/model-bank/src/aiModels/higress.ts +0 -55
  125. package/packages/model-bank/src/aiModels/infiniai.ts +21 -0
  126. package/packages/model-bank/src/aiModels/ollamacloud.ts +13 -0
  127. package/packages/model-bank/src/aiModels/siliconcloud.ts +19 -0
  128. package/packages/model-runtime/src/core/parameterResolver.ts +3 -0
  129. package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +0 -38
  130. package/packages/model-runtime/src/providers/azureOpenai/index.ts +2 -1
  131. package/packages/model-runtime/src/providers/minimax/index.ts +5 -5
  132. package/packages/model-runtime/src/providers/search1api/index.test.ts +2 -2
  133. package/packages/model-runtime/src/utils/googleErrorParser.test.ts +125 -0
  134. package/packages/model-runtime/src/utils/googleErrorParser.ts +103 -77
  135. package/packages/types/src/message/common/base.ts +13 -0
  136. package/packages/types/src/message/common/image.ts +8 -0
  137. package/packages/types/src/message/common/metadata.ts +39 -0
  138. package/packages/types/src/message/common/tools.ts +10 -0
  139. package/packages/types/src/message/db/params.ts +47 -1
  140. package/packages/types/src/message/ui/chat.ts +4 -1
  141. package/packages/types/src/message/ui/params.ts +98 -4
  142. package/packages/types/src/search.ts +16 -0
  143. package/packages/types/src/serverConfig.ts +2 -6
  144. package/packages/types/src/user/index.ts +13 -1
  145. package/packages/types/src/user/settings/index.ts +22 -0
  146. package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
  147. package/packages/web-crawler/tsconfig.json +0 -1
  148. package/scripts/migrateServerDB/errorHint.js +1 -7
  149. package/scripts/migrateServerDB/index.ts +2 -1
  150. package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
  151. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
  152. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  153. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
  154. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  155. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
  156. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
  157. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
  158. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
  159. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  160. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
  161. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  162. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  163. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  164. package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
  165. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
  166. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
  167. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
  168. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
  169. package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
  170. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
  171. package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
  172. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  173. package/src/app/[variants]/(main)/labs/components/LabCard.tsx +3 -1
  174. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  175. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  176. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  177. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  178. package/src/app/[variants]/(main)/settings/_layout/SettingsContent.tsx +0 -3
  179. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  180. package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +5 -7
  181. package/src/app/[variants]/layout.tsx +1 -0
  182. package/src/app/[variants]/loading/index.tsx +1 -10
  183. package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
  184. package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
  185. package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
  186. package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
  187. package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
  188. package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
  189. package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +9 -1
  190. package/src/app/sitemap.tsx +7 -1
  191. package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
  192. package/src/components/Link.tsx +12 -0
  193. package/src/components/Thinking/index.tsx +4 -3
  194. package/src/config/db.ts +0 -5
  195. package/src/config/featureFlags/schema.test.ts +0 -2
  196. package/src/config/featureFlags/schema.ts +0 -6
  197. package/src/config/modelProviders/ai21.ts +1 -16
  198. package/src/config/modelProviders/ai302.ts +1 -128
  199. package/src/config/modelProviders/ai360.ts +1 -32
  200. package/src/config/modelProviders/anthropic.ts +1 -94
  201. package/src/config/modelProviders/azure.ts +1 -51
  202. package/src/config/modelProviders/baichuan.ts +1 -57
  203. package/src/config/modelProviders/bedrock.ts +1 -276
  204. package/src/config/modelProviders/cloudflare.ts +1 -64
  205. package/src/config/modelProviders/deepseek.ts +1 -19
  206. package/src/config/modelProviders/fireworksai.ts +1 -174
  207. package/src/config/modelProviders/giteeai.ts +1 -135
  208. package/src/config/modelProviders/github.ts +1 -254
  209. package/src/config/modelProviders/google.ts +1 -130
  210. package/src/config/modelProviders/groq.ts +1 -119
  211. package/src/config/modelProviders/higress.ts +1 -1736
  212. package/src/config/modelProviders/huggingface.ts +1 -54
  213. package/src/config/modelProviders/hunyuan.ts +1 -83
  214. package/src/config/modelProviders/infiniai.ts +1 -74
  215. package/src/config/modelProviders/internlm.ts +1 -20
  216. package/src/config/modelProviders/minimax.ts +1 -1
  217. package/src/config/modelProviders/mistral.ts +1 -95
  218. package/src/config/modelProviders/modelscope.ts +1 -27
  219. package/src/config/modelProviders/moonshot.ts +1 -29
  220. package/src/config/modelProviders/novita.ts +1 -105
  221. package/src/config/modelProviders/ollama.ts +1 -325
  222. package/src/config/modelProviders/openai.ts +1 -242
  223. package/src/config/modelProviders/openrouter.ts +1 -240
  224. package/src/config/modelProviders/perplexity.ts +1 -45
  225. package/src/config/modelProviders/ppio.ts +1 -152
  226. package/src/config/modelProviders/qiniu.ts +2 -19
  227. package/src/config/modelProviders/qwen.ts +1 -245
  228. package/src/config/modelProviders/search1api.ts +1 -34
  229. package/src/config/modelProviders/sensenova.ts +1 -69
  230. package/src/config/modelProviders/siliconcloud.ts +1 -417
  231. package/src/config/modelProviders/spark.ts +1 -59
  232. package/src/config/modelProviders/stepfun.ts +1 -98
  233. package/src/config/modelProviders/taichu.ts +1 -18
  234. package/src/config/modelProviders/togetherai.ts +1 -274
  235. package/src/config/modelProviders/upstage.ts +1 -28
  236. package/src/config/modelProviders/wenxin.ts +1 -140
  237. package/src/config/modelProviders/xai.ts +1 -38
  238. package/src/config/modelProviders/zeroone.ts +1 -81
  239. package/src/config/modelProviders/zhipu.ts +1 -108
  240. package/src/envs/app.ts +5 -8
  241. package/src/envs/auth.ts +0 -179
  242. package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
  243. package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
  244. package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
  245. package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
  246. package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
  247. package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
  248. package/src/features/Conversation/Error/index.tsx +15 -5
  249. package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
  250. package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
  251. package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
  252. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
  253. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
  254. package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
  255. package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
  256. package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
  257. package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
  258. package/src/features/Conversation/Messages/Default.tsx +2 -2
  259. package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
  260. package/src/features/Conversation/Messages/User/index.tsx +4 -4
  261. package/src/features/Conversation/Messages/index.tsx +3 -3
  262. package/src/features/Conversation/components/AutoScroll.tsx +2 -2
  263. package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
  264. package/src/features/DataImporter/index.tsx +15 -60
  265. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  266. package/src/features/PluginTag/index.tsx +1 -3
  267. package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
  268. package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
  269. package/src/helpers/isCanUseFC.ts +0 -8
  270. package/src/hooks/useEnabledChatModels.ts +0 -8
  271. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  272. package/src/hooks/useModelContextWindowTokens.ts +0 -8
  273. package/src/hooks/useModelHasContextWindowToken.ts +1 -10
  274. package/src/hooks/useModelSupportFiles.ts +1 -11
  275. package/src/hooks/useModelSupportReasoning.ts +1 -11
  276. package/src/hooks/useModelSupportToolUse.ts +1 -11
  277. package/src/hooks/useModelSupportVision.ts +1 -11
  278. package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
  279. package/src/libs/next-auth/auth.config.ts +3 -6
  280. package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
  281. package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
  282. package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
  283. package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
  284. package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
  285. package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
  286. package/src/libs/next-auth/sso-providers/github.ts +0 -6
  287. package/src/libs/next-auth/sso-providers/google.ts +0 -2
  288. package/src/libs/next-auth/sso-providers/index.ts +0 -2
  289. package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
  290. package/src/libs/next-auth/sso-providers/logto.ts +3 -5
  291. package/src/libs/next-auth/sso-providers/okta.ts +0 -4
  292. package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
  293. package/src/libs/oidc-provider/provider.ts +1 -1
  294. package/src/libs/trpc/client/index.ts +0 -1
  295. package/src/libs/trpc/client/lambda.ts +8 -5
  296. package/src/libs/trpc/lambda/context.ts +4 -1
  297. package/src/locales/default/oauth.ts +1 -0
  298. package/src/server/globalConfig/index.ts +0 -23
  299. package/src/server/modules/AssistantStore/index.ts +1 -1
  300. package/src/server/modules/ModelRuntime/trace.ts +11 -4
  301. package/src/server/routers/desktop/mcp.ts +1 -3
  302. package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +0 -41
  303. package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
  304. package/src/server/routers/lambda/config/index.test.ts +38 -30
  305. package/src/server/routers/lambda/message.ts +17 -13
  306. package/src/server/routers/lambda/session.ts +8 -5
  307. package/src/server/routers/lambda/user.ts +24 -25
  308. package/src/server/routers/tools/mcp.ts +2 -3
  309. package/src/server/routers/tools/search.test.ts +1 -7
  310. package/src/server/routers/tools/search.ts +1 -4
  311. package/src/server/services/search/impls/firecrawl/index.ts +51 -11
  312. package/src/server/services/search/impls/firecrawl/type.ts +60 -9
  313. package/src/services/__tests__/tool.test.ts +0 -3
  314. package/src/services/aiModel/index.test.ts +0 -3
  315. package/src/services/aiModel/index.ts +1 -7
  316. package/src/services/aiProvider/index.test.ts +0 -3
  317. package/src/services/aiProvider/index.ts +1 -7
  318. package/src/services/chat/chat.test.ts +13 -40
  319. package/src/services/chat/contextEngineering.test.ts +0 -30
  320. package/src/services/chat/contextEngineering.ts +1 -12
  321. package/src/services/chat/helper.ts +7 -31
  322. package/src/services/chat/index.ts +2 -7
  323. package/src/services/chat/types.ts +1 -1
  324. package/src/services/chatGroup/index.ts +1 -10
  325. package/src/services/config.ts +1 -65
  326. package/src/services/export/index.ts +1 -4
  327. package/src/services/file/index.ts +1 -11
  328. package/src/services/import/index.ts +1 -7
  329. package/src/services/message/index.ts +1 -11
  330. package/src/services/message/server.ts +7 -6
  331. package/src/services/message/type.ts +6 -3
  332. package/src/services/models.ts +2 -11
  333. package/src/services/plugin/index.ts +1 -11
  334. package/src/services/session/index.ts +1 -11
  335. package/src/services/tableViewer/client.ts +12 -15
  336. package/src/services/thread/index.ts +1 -7
  337. package/src/services/topic/index.ts +1 -11
  338. package/src/services/user/index.ts +1 -13
  339. package/src/store/chat/helpers.test.ts +99 -0
  340. package/src/store/chat/helpers.ts +21 -2
  341. package/src/store/chat/selectors.ts +1 -1
  342. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  343. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  344. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  345. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +45 -155
  346. package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
  347. package/src/store/chat/slices/message/action.test.ts +5 -1
  348. package/src/store/chat/slices/message/action.ts +102 -14
  349. package/src/store/chat/slices/message/reducer.test.ts +363 -5
  350. package/src/store/chat/slices/message/reducer.ts +87 -3
  351. package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
  352. package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
  353. package/src/store/chat/slices/message/selectors/index.ts +2 -0
  354. package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
  355. package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
  356. package/src/store/chat/slices/plugin/action.test.ts +34 -132
  357. package/src/store/chat/slices/plugin/action.ts +1 -44
  358. package/src/store/global/store.ts +1 -7
  359. package/src/store/tool/selectors/tool.test.ts +1 -1
  360. package/src/store/tool/selectors/tool.ts +6 -8
  361. package/src/store/tool/slices/builtin/action.test.ts +83 -35
  362. package/src/store/tool/slices/builtin/action.ts +0 -9
  363. package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
  364. package/src/store/tool/slices/builtin/selectors.ts +15 -21
  365. package/src/store/user/initialState.ts +1 -7
  366. package/src/store/user/selectors.ts +1 -5
  367. package/src/store/user/slices/common/action.test.ts +1 -4
  368. package/src/store/user/slices/common/action.ts +5 -4
  369. package/src/store/user/slices/settings/selectors/index.ts +1 -0
  370. package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
  371. package/src/store/user/store.ts +0 -3
  372. package/src/tools/index.ts +0 -6
  373. package/src/tools/renders.ts +0 -3
  374. package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
  375. package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
  376. package/tsconfig.json +9 -3
  377. package/packages/const/src/guide.ts +0 -89
  378. package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
  379. package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
  380. package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
  381. package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
  382. package/packages/utils/src/_deprecated/parseModels.ts +0 -165
  383. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  384. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  385. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  386. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  387. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  388. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  389. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  390. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  391. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  392. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  393. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  394. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  395. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  396. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  397. package/src/app/[variants]/(main)/settings/llm/ProviderList/Azure/index.tsx +0 -93
  398. package/src/app/[variants]/(main)/settings/llm/ProviderList/Bedrock/index.tsx +0 -70
  399. package/src/app/[variants]/(main)/settings/llm/ProviderList/Cloudflare/index.tsx +0 -39
  400. package/src/app/[variants]/(main)/settings/llm/ProviderList/Github/index.tsx +0 -52
  401. package/src/app/[variants]/(main)/settings/llm/ProviderList/HuggingFace/index.tsx +0 -52
  402. package/src/app/[variants]/(main)/settings/llm/ProviderList/Ollama/index.tsx +0 -20
  403. package/src/app/[variants]/(main)/settings/llm/ProviderList/OpenAI/index.tsx +0 -17
  404. package/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx +0 -132
  405. package/src/app/[variants]/(main)/settings/llm/components/Checker.tsx +0 -118
  406. package/src/app/[variants]/(main)/settings/llm/components/ProviderConfig/index.tsx +0 -303
  407. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/CustomModelOption.tsx +0 -98
  408. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/Form.tsx +0 -104
  409. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/index.tsx +0 -77
  410. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelFetcher.tsx +0 -105
  411. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/Option.tsx +0 -68
  412. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/index.tsx +0 -146
  413. package/src/app/[variants]/(main)/settings/llm/const.ts +0 -20
  414. package/src/app/[variants]/(main)/settings/llm/features/Footer.tsx +0 -35
  415. package/src/app/[variants]/(main)/settings/llm/index.tsx +0 -30
  416. package/src/app/[variants]/(main)/settings/llm/type.ts +0 -5
  417. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  418. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  419. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  420. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  421. package/src/components/InnerLink.tsx +0 -20
  422. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  423. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  424. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  425. package/src/database/_deprecated/core/db.ts +0 -246
  426. package/src/database/_deprecated/core/index.ts +0 -2
  427. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  428. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  429. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  430. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  431. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  432. package/src/database/_deprecated/core/model.ts +0 -218
  433. package/src/database/_deprecated/core/schemas.ts +0 -88
  434. package/src/database/_deprecated/core/types/db.ts +0 -15
  435. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  436. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  437. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  438. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  439. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  440. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  441. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  442. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  443. package/src/database/_deprecated/models/file.ts +0 -51
  444. package/src/database/_deprecated/models/message.ts +0 -277
  445. package/src/database/_deprecated/models/plugin.ts +0 -62
  446. package/src/database/_deprecated/models/session.ts +0 -271
  447. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  448. package/src/database/_deprecated/models/topic.ts +0 -250
  449. package/src/database/_deprecated/models/user.ts +0 -69
  450. package/src/database/_deprecated/schemas/files.ts +0 -39
  451. package/src/database/_deprecated/schemas/message.ts +0 -50
  452. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  453. package/src/database/_deprecated/schemas/session.ts +0 -54
  454. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  455. package/src/database/_deprecated/schemas/topic.ts +0 -12
  456. package/src/database/_deprecated/schemas/user.ts +0 -40
  457. package/src/envs/__tests__/auth.test.ts +0 -200
  458. package/src/features/DataImporter/_deprecated.ts +0 -43
  459. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  460. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  461. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  462. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  463. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  464. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  465. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  466. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  467. package/src/features/InitClientDB/index.tsx +0 -37
  468. package/src/hooks/_header.ts +0 -23
  469. package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
  470. package/src/libs/trpc/client/edge.ts +0 -26
  471. package/src/libs/trpc/edge/context.ts +0 -71
  472. package/src/libs/trpc/edge/index.ts +0 -45
  473. package/src/libs/trpc/edge/init.ts +0 -26
  474. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  475. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  476. package/src/migrations/FromV0ToV1.ts +0 -10
  477. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  478. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  479. package/src/migrations/FromV1ToV2/index.ts +0 -82
  480. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  481. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  482. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  483. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  484. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  485. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  486. package/src/migrations/FromV2ToV3/index.ts +0 -30
  487. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  488. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  489. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  490. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  491. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  492. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  493. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  494. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  495. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  496. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  497. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  498. package/src/migrations/FromV3ToV4/index.ts +0 -102
  499. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  500. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  501. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  502. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  503. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  504. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  505. package/src/migrations/FromV4ToV5/index.ts +0 -58
  506. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  507. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  508. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  509. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  510. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  511. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  512. package/src/migrations/FromV5ToV6/index.ts +0 -61
  513. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  514. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  515. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  516. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  517. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  518. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  519. package/src/migrations/FromV6ToV7/index.ts +0 -101
  520. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  521. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  522. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  523. package/src/migrations/VersionController.test.ts +0 -88
  524. package/src/migrations/VersionController.ts +0 -67
  525. package/src/migrations/index.ts +0 -61
  526. package/src/server/globalConfig/_deprecated.test.ts +0 -92
  527. package/src/server/globalConfig/_deprecated.ts +0 -41
  528. package/src/server/routers/edge/appStatus.ts +0 -3
  529. package/src/server/routers/edge/index.ts +0 -14
  530. package/src/server/routers/edge/upload.ts +0 -16
  531. package/src/services/aiModel/client.ts +0 -70
  532. package/src/services/aiProvider/client.ts +0 -58
  533. package/src/services/baseClientService/index.ts +0 -9
  534. package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
  535. package/src/services/chatGroup/client.ts +0 -63
  536. package/src/services/export/_deprecated.ts +0 -155
  537. package/src/services/export/client.ts +0 -15
  538. package/src/services/file/_deprecated.test.ts +0 -119
  539. package/src/services/file/_deprecated.ts +0 -80
  540. package/src/services/file/client.test.ts +0 -199
  541. package/src/services/file/client.ts +0 -85
  542. package/src/services/import/_deprecated.ts +0 -115
  543. package/src/services/import/client.test.ts +0 -1015
  544. package/src/services/import/client.ts +0 -64
  545. package/src/services/message/_deprecated.test.ts +0 -398
  546. package/src/services/message/_deprecated.ts +0 -168
  547. package/src/services/message/client.test.ts +0 -410
  548. package/src/services/message/client.ts +0 -186
  549. package/src/services/plugin/_deprecated.test.ts +0 -162
  550. package/src/services/plugin/_deprecated.ts +0 -42
  551. package/src/services/plugin/client.test.ts +0 -177
  552. package/src/services/plugin/client.ts +0 -46
  553. package/src/services/session/_deprecated.test.ts +0 -440
  554. package/src/services/session/_deprecated.ts +0 -190
  555. package/src/services/session/client.test.ts +0 -413
  556. package/src/services/session/client.ts +0 -193
  557. package/src/services/thread/client.ts +0 -51
  558. package/src/services/topic/_deprecated.test.ts +0 -245
  559. package/src/services/topic/_deprecated.ts +0 -75
  560. package/src/services/topic/client.ts +0 -89
  561. package/src/services/topic/pglite.test.ts +0 -212
  562. package/src/services/user/_deprecated.test.ts +0 -101
  563. package/src/services/user/_deprecated.ts +0 -70
  564. package/src/services/user/client.test.ts +0 -108
  565. package/src/services/user/client.ts +0 -104
  566. package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
  567. package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
  568. package/src/store/global/actions/clientDb.ts +0 -67
  569. package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
  570. package/src/store/user/slices/modelList/action.test.ts +0 -359
  571. package/src/store/user/slices/modelList/action.ts +0 -223
  572. package/src/store/user/slices/modelList/initialState.ts +0 -15
  573. package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
  574. package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
  575. package/src/store/user/slices/modelList/selectors/index.ts +0 -3
  576. package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
  577. package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
  578. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
  579. package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
  580. package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
  581. package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
  582. package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
  583. package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
  584. package/src/tools/dalle/Render/Item/Error.tsx +0 -49
  585. package/src/tools/dalle/Render/Item/Image.tsx +0 -44
  586. package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
  587. package/src/tools/dalle/Render/Item/index.tsx +0 -88
  588. package/src/tools/dalle/Render/ToolBar.tsx +0 -56
  589. package/src/tools/dalle/Render/index.tsx +0 -52
  590. package/src/tools/dalle/index.ts +0 -92
  591. /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
+ };