@lobehub/lobehub 2.0.0-next.71 → 2.0.0-next.73

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 (338) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/changelog/v1.json +18 -0
  3. package/next.config.ts +5 -5
  4. package/package.json +1 -1
  5. package/packages/model-bank/src/aiModels/qiniu.ts +126 -0
  6. package/scripts/prebuild.mts +1 -1
  7. package/src/app/(backend)/trpc/desktop/[trpc]/route.ts +6 -6
  8. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/UserBanner.test.tsx +7 -4
  9. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +4 -4
  10. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +5 -6
  11. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/useCategory.tsx +5 -8
  12. package/src/app/[variants]/(main)/(mobile)/me/(home)/index.tsx +25 -0
  13. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +13 -16
  14. package/src/app/[variants]/(main)/(mobile)/me/profile/features/Category.tsx +6 -6
  15. package/src/app/[variants]/(main)/(mobile)/me/profile/features/Header.tsx +3 -3
  16. package/src/app/[variants]/(main)/(mobile)/me/profile/index.tsx +16 -0
  17. package/src/app/[variants]/(main)/(mobile)/me/profile/layout.tsx +9 -11
  18. package/src/app/[variants]/(main)/(mobile)/me/settings/features/Header.tsx +3 -3
  19. package/src/app/[variants]/(main)/(mobile)/me/settings/features/useCategory.tsx +3 -4
  20. package/src/app/[variants]/(main)/(mobile)/me/settings/index.tsx +16 -0
  21. package/src/app/[variants]/(main)/(mobile)/me/settings/layout.tsx +15 -13
  22. package/src/app/[variants]/(main)/changelog/_layout/Desktop/index.tsx +6 -5
  23. package/src/app/[variants]/(main)/changelog/_layout/Mobile/Header.tsx +3 -3
  24. package/src/app/[variants]/(main)/changelog/_layout/Mobile/index.tsx +5 -5
  25. package/src/app/[variants]/(main)/changelog/features/Post.tsx +7 -4
  26. package/src/app/[variants]/(main)/changelog/index.tsx +55 -0
  27. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +6 -7
  28. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +3 -3
  29. package/src/app/[variants]/(main)/chat/components/WorkspaceLayout.tsx +1 -14
  30. package/src/app/[variants]/(main)/chat/components/conversation/features/ChatHydration/index.tsx +2 -2
  31. package/src/app/[variants]/(main)/chat/components/conversation/features/ChatInput/Desktop/MessageFromUrl.tsx +11 -13
  32. package/src/app/[variants]/(main)/chat/components/conversation/features/ChatInput/Desktop/index.tsx +0 -1
  33. package/src/app/[variants]/(main)/chat/components/conversation/features/ThreadHydration.tsx +2 -2
  34. package/src/app/[variants]/(main)/chat/components/topic/features/Topic/TopicListContent/TopicItem/TopicContent.tsx +20 -11
  35. package/src/app/[variants]/(main)/chat/features/PageTitle/index.tsx +1 -2
  36. package/src/app/[variants]/(main)/chat/index.tsx +29 -0
  37. package/src/app/[variants]/(main)/chat/session/features/SessionHydration.tsx +8 -6
  38. package/src/app/[variants]/(main)/chat/session/features/SessionListContent/Inbox/index.tsx +2 -4
  39. package/src/app/[variants]/(main)/chat/session/features/SessionListContent/List/index.tsx +1 -1
  40. package/src/app/[variants]/(main)/chat/session/layout/Mobile/SessionHeader.tsx +3 -3
  41. package/src/app/[variants]/(main)/chat/settings/_layout/Desktop/Header.tsx +3 -3
  42. package/src/app/[variants]/(main)/chat/settings/_layout/Mobile/Header.tsx +3 -3
  43. package/src/app/[variants]/(main)/chat/settings/features/PublishResultModal/index.tsx +3 -3
  44. package/src/app/[variants]/(main)/chat/{components/SettingsPage.tsx → settings/index.tsx} +6 -35
  45. package/src/app/[variants]/(main)/components/Link.tsx +21 -0
  46. package/src/app/[variants]/(main)/discover/(detail)/_layout/{Desktop.tsx → Desktop/index.tsx} +15 -7
  47. package/src/app/[variants]/(main)/discover/(detail)/_layout/Mobile/index.tsx +3 -3
  48. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/Block.tsx +1 -1
  49. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Overview/index.tsx +1 -1
  50. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Related/index.tsx +2 -2
  51. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/SystemRole/index.tsx +3 -3
  52. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Versions/index.tsx +4 -4
  53. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/index.tsx +1 -1
  54. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Header.tsx +2 -2
  55. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/ActionButton/AddAgent.tsx +3 -3
  56. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/ActionButton/index.tsx +1 -1
  57. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/Related/index.tsx +1 -1
  58. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/TocList/index.tsx +2 -2
  59. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/StatusPage/index.tsx +3 -3
  60. package/src/app/[variants]/(main)/discover/(detail)/assistant/{AssistantDetailPage.tsx → index.tsx} +18 -11
  61. package/src/app/[variants]/(main)/discover/(detail)/features/Breadcrumb.tsx +1 -1
  62. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Details/Related/index.tsx +2 -2
  63. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Details/Versions/index.tsx +5 -5
  64. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Details/index.tsx +1 -1
  65. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/Related/index.tsx +2 -2
  66. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/ServerConfig.tsx +4 -4
  67. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/TocList/index.tsx +2 -2
  68. package/src/app/[variants]/(main)/discover/(detail)/mcp/{McpDetailPage.tsx → index.tsx} +15 -7
  69. package/src/app/[variants]/(main)/discover/(detail)/mcp/loading.tsx +1 -0
  70. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Overview/index.tsx +1 -1
  71. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Parameter/ParameterItem.tsx +1 -1
  72. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Related/index.tsx +2 -2
  73. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/index.tsx +1 -1
  74. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Header.tsx +1 -1
  75. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/ActionButton/ChatWithModel.tsx +3 -3
  76. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/ActionButton/index.tsx +1 -1
  77. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/Related/index.tsx +2 -2
  78. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/RelatedProviders/index.tsx +1 -1
  79. package/src/app/[variants]/(main)/discover/(detail)/model/{ModelDetailPage.tsx → index.tsx} +17 -10
  80. package/src/app/[variants]/(main)/discover/(detail)/model/loading.tsx +1 -0
  81. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Related/index.tsx +2 -2
  82. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/index.tsx +1 -1
  83. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/ActionButton/ProviderConfig.tsx +5 -4
  84. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/ActionButton/index.tsx +1 -1
  85. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/Related/index.tsx +2 -2
  86. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/RelatedModels/index.tsx +1 -1
  87. package/src/app/[variants]/(main)/discover/(detail)/provider/{ProviderDetailPage.tsx → index.tsx} +17 -10
  88. package/src/app/[variants]/(main)/discover/(detail)/provider/loading.tsx +1 -0
  89. package/src/app/[variants]/(main)/discover/(list)/(home)/{HomePage.tsx → index.tsx} +14 -0
  90. package/src/app/[variants]/(main)/discover/(list)/_layout/Desktop/Nav.tsx +2 -3
  91. package/src/app/[variants]/(main)/discover/(list)/_layout/Desktop/index.tsx +4 -3
  92. package/src/app/[variants]/(main)/discover/(list)/_layout/Mobile/Nav.tsx +3 -4
  93. package/src/app/[variants]/(main)/discover/(list)/_layout/Mobile/index.tsx +4 -3
  94. package/src/app/[variants]/(main)/discover/(list)/assistant/_layout/Desktop.tsx +3 -4
  95. package/src/app/[variants]/(main)/discover/(list)/assistant/_layout/Mobile.tsx +3 -3
  96. package/src/app/[variants]/(main)/discover/(list)/assistant/features/List/Item.tsx +2 -2
  97. package/src/app/[variants]/(main)/discover/(list)/assistant/{AssistantPage.tsx → index.tsx} +18 -4
  98. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +2 -2
  99. package/src/app/[variants]/(main)/discover/(list)/mcp/_layout/Desktop.tsx +3 -3
  100. package/src/app/[variants]/(main)/discover/(list)/mcp/_layout/Mobile.tsx +3 -3
  101. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -1
  102. package/src/app/[variants]/(main)/discover/(list)/mcp/{McpPage.tsx → index.tsx} +9 -2
  103. package/src/app/[variants]/(main)/discover/(list)/model/_layout/Desktop.tsx +3 -3
  104. package/src/app/[variants]/(main)/discover/(list)/model/_layout/Mobile.tsx +3 -3
  105. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -1
  106. package/src/app/[variants]/(main)/discover/(list)/model/{ModelPage.tsx → index.tsx} +9 -2
  107. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -1
  108. package/src/app/[variants]/(main)/discover/(list)/provider/{Client.tsx → index.tsx} +9 -2
  109. package/src/app/[variants]/(main)/discover/_layout/Desktop/index.tsx +4 -4
  110. package/src/app/[variants]/(main)/discover/_layout/Mobile/index.tsx +3 -3
  111. package/src/app/[variants]/(main)/discover/components/Title.tsx +1 -1
  112. package/src/app/[variants]/(main)/discover/features/Search.tsx +2 -2
  113. package/src/app/[variants]/(main)/discover/features/useNav.tsx +11 -12
  114. package/src/app/[variants]/(main)/hooks/useActiveTabKey.ts +40 -0
  115. package/src/app/[variants]/(main)/hooks/usePathname.ts +10 -0
  116. package/src/app/[variants]/(main)/hooks/useQuery.ts +12 -0
  117. package/src/app/[variants]/(main)/hooks/useRouter.ts +22 -0
  118. package/src/app/[variants]/(main)/hooks/useSearchParams.ts +11 -0
  119. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/ModelSelect/index.tsx +5 -5
  120. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicUrlSync.tsx +1 -1
  121. package/src/app/[variants]/(main)/image/ComingSoon.tsx +15 -0
  122. package/src/app/[variants]/(main)/image/_layout/Desktop/index.tsx +5 -2
  123. package/src/app/[variants]/(main)/image/_layout/DesktopWrapper.tsx +15 -0
  124. package/src/app/[variants]/(main)/image/_layout/Mobile/index.tsx +3 -1
  125. package/src/app/[variants]/(main)/image/features/ImageWorkspace/index.tsx +1 -2
  126. package/src/app/[variants]/(main)/image/index.tsx +18 -0
  127. package/src/app/[variants]/(main)/knowledge/_layout/Desktop.tsx +17 -0
  128. package/src/app/[variants]/(main)/knowledge/_layout/Mobile.tsx +17 -0
  129. package/src/app/[variants]/(main)/knowledge/components/KnowledgeBaseItem/index.tsx +1 -1
  130. package/src/app/[variants]/(main)/knowledge/components/modal/ModalPageClient.tsx +4 -4
  131. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeBaseDetail/index.tsx +5 -8
  132. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeBaseDetail/menu/Head.tsx +1 -1
  133. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeHome/menu/CategoryMenu.tsx +2 -2
  134. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeHome/menu/KnowledgeBase.tsx +1 -1
  135. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/DesktopLayoutContainer.tsx +3 -2
  136. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/BottomActions.tsx +4 -4
  137. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/TopActions.test.tsx +9 -9
  138. package/src/app/[variants]/(main)/layouts/desktop/SideBar/TopActions.tsx +117 -0
  139. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/index.tsx +9 -4
  140. package/src/app/[variants]/(main)/layouts/index.tsx +11 -0
  141. package/src/app/[variants]/(main)/{_layout/Mobile → layouts/mobile}/NavBar.tsx +5 -5
  142. package/src/app/[variants]/(main)/{_layout/Mobile → layouts/mobile}/index.tsx +10 -7
  143. package/src/app/[variants]/(main)/profile/(home)/desktop.tsx +26 -0
  144. package/src/app/[variants]/(main)/profile/(home)/index.tsx +26 -0
  145. package/src/app/[variants]/(main)/profile/@category/features/CategoryContent.tsx +5 -7
  146. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +3 -2
  147. package/src/app/[variants]/(main)/profile/_layout/DesktopWrapper.tsx +14 -0
  148. package/src/app/[variants]/(main)/profile/_layout/Mobile/Header.tsx +3 -3
  149. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +4 -3
  150. package/src/app/[variants]/(main)/profile/apikey/index.tsx +18 -0
  151. package/src/app/[variants]/(main)/profile/hooks/useCategory.tsx +6 -6
  152. package/src/app/[variants]/(main)/profile/security/index.tsx +29 -0
  153. package/src/app/[variants]/(main)/profile/stats/features/AssistantsRank.tsx +4 -4
  154. package/src/app/[variants]/(main)/profile/stats/features/TopicsRank.tsx +4 -4
  155. package/src/app/[variants]/(main)/profile/stats/index.tsx +20 -0
  156. package/src/app/[variants]/(main)/profile/usage/features/UsageTable.tsx +7 -9
  157. package/src/app/[variants]/(main)/profile/usage/index.tsx +13 -0
  158. package/src/app/[variants]/(main)/settings/_layout/Desktop/Header.tsx +2 -2
  159. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +2 -2
  160. package/src/app/[variants]/(main)/settings/_layout/DesktopWrapper.tsx +23 -0
  161. package/src/app/[variants]/(main)/settings/_layout/Mobile/Header.tsx +8 -7
  162. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +2 -5
  163. package/src/app/[variants]/(main)/settings/_layout/MobileWrapper.tsx +23 -0
  164. package/src/app/[variants]/(main)/settings/agent/AgentMenu/Menu.tsx +2 -4
  165. package/src/app/[variants]/(main)/settings/agent/index.tsx +2 -4
  166. package/src/app/[variants]/(main)/settings/provider/(list)/index.tsx +2 -3
  167. package/src/app/[variants]/(main)/settings/provider/ProviderMenu/All.tsx +2 -2
  168. package/src/app/[variants]/(main)/settings/provider/ProviderMenu/Item.tsx +38 -37
  169. package/src/app/[variants]/(main)/settings/provider/_layout/Mobile.tsx +2 -2
  170. package/src/app/[variants]/(main)/settings/provider/features/CreateNewProvider/index.tsx +3 -3
  171. package/src/app/[variants]/(main)/settings/provider/features/ProviderConfig/UpdateProviderInfo/SettingModal.tsx +3 -3
  172. package/src/app/[variants]/DesktopRouter.tsx +40 -0
  173. package/src/app/[variants]/MobileRouter.tsx +41 -0
  174. package/src/app/[variants]/desktopRouter.config.tsx +381 -0
  175. package/src/app/[variants]/layout.tsx +1 -3
  176. package/src/app/[variants]/loaders/routeParams.ts +45 -0
  177. package/src/app/[variants]/loading/Server/Redirect.tsx +1 -1
  178. package/src/app/[variants]/mobileRouter.config.tsx +412 -0
  179. package/src/app/[variants]/page.tsx +16 -6
  180. package/src/app/desktop/devtools/page.tsx +1 -1
  181. package/src/app/desktop/layout.tsx +1 -1
  182. package/src/components/BootErrorBoundary/index.tsx +129 -0
  183. package/src/components/mdx/constants.ts +1 -0
  184. package/src/features/ChangelogModal/index.tsx +3 -3
  185. package/src/features/KnowledgeManager/FileExplorer/index.tsx +4 -4
  186. package/src/features/KnowledgeManager/Header/FilesSearchBar.tsx +1 -1
  187. package/src/features/User/UserPanel/PanelContent.tsx +4 -3
  188. package/src/features/User/UserPanel/useMenu.tsx +20 -14
  189. package/src/features/User/__tests__/PanelContent.test.tsx +13 -7
  190. package/src/hooks/useDiscoverTab.ts +2 -2
  191. package/src/hooks/useInterceptingRoutes.test.ts +23 -26
  192. package/src/hooks/useInterceptingRoutes.ts +5 -4
  193. package/src/hooks/usePinnedAgentState.ts +6 -6
  194. package/src/hooks/useQuery.ts +5 -0
  195. package/src/hooks/useQueryParam.ts +322 -0
  196. package/src/hooks/useQueryRoute.test.ts +2 -12
  197. package/src/hooks/useQueryRoute.ts +5 -5
  198. package/src/hooks/useShowMobileWorkspace.ts +1 -1
  199. package/src/hooks/useSwitchSession.ts +4 -3
  200. package/src/layout/GlobalProvider/ImportSettings.tsx +22 -9
  201. package/src/layout/GlobalProvider/StoreInitialization.tsx +9 -1
  202. package/src/proxy.ts +13 -1
  203. package/src/services/message/index.ts +11 -2
  204. package/src/store/chat/agents/createAgentExecutors.ts +31 -16
  205. package/src/store/chat/slices/aiChat/actions/__tests__/streamingExecutor.test.ts +218 -0
  206. package/src/store/chat/slices/aiChat/actions/conversationControl.ts +4 -0
  207. package/src/store/chat/slices/aiChat/actions/conversationLifecycle.ts +9 -3
  208. package/src/store/chat/slices/aiChat/actions/streamingExecutor.ts +142 -61
  209. package/src/store/chat/slices/builtinTool/actions/__tests__/search.test.ts +204 -10
  210. package/src/store/chat/slices/builtinTool/actions/search.ts +51 -26
  211. package/src/store/chat/slices/message/action.test.ts +182 -33
  212. package/src/store/chat/slices/message/actions/optimisticUpdate.ts +79 -36
  213. package/src/store/chat/slices/message/actions/query.ts +7 -5
  214. package/src/store/chat/slices/message/selectors/dbMessage.ts +11 -4
  215. package/src/store/chat/slices/plugin/action.test.ts +257 -54
  216. package/src/store/chat/slices/plugin/actions/optimisticUpdate.ts +63 -26
  217. package/src/store/chat/slices/plugin/actions/pluginTypes.ts +52 -19
  218. package/src/store/chat/slices/plugin/actions/publicApi.ts +6 -1
  219. package/src/store/chat/slices/plugin/actions/workflow.ts +17 -6
  220. package/src/store/chat/slices/thread/action.ts +2 -0
  221. package/src/store/global/action.test.ts +3 -3
  222. package/src/store/global/actions/workspacePane.ts +2 -1
  223. package/src/store/global/initialState.ts +10 -2
  224. package/src/store/user/slices/common/action.ts +4 -0
  225. package/src/app/[variants]/(main)/(mobile)/me/(home)/loading.tsx +0 -38
  226. package/src/app/[variants]/(main)/(mobile)/me/(home)/page.tsx +0 -40
  227. package/src/app/[variants]/(main)/(mobile)/me/profile/loading.tsx +0 -5
  228. package/src/app/[variants]/(main)/(mobile)/me/profile/page.tsx +0 -30
  229. package/src/app/[variants]/(main)/(mobile)/me/settings/loading.tsx +0 -5
  230. package/src/app/[variants]/(main)/(mobile)/me/settings/page.tsx +0 -30
  231. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +0 -106
  232. package/src/app/[variants]/(main)/changelog/layout.tsx +0 -10
  233. package/src/app/[variants]/(main)/changelog/modal/page.tsx +0 -23
  234. package/src/app/[variants]/(main)/changelog/page.tsx +0 -78
  235. package/src/app/[variants]/(main)/chat/ChatRouter.tsx +0 -83
  236. package/src/app/[variants]/(main)/chat/_layout/ChatLayout.tsx +0 -22
  237. package/src/app/[variants]/(main)/chat/components/MainChatPage.tsx +0 -25
  238. package/src/app/[variants]/(main)/chat/error.tsx +0 -3
  239. package/src/app/[variants]/(main)/chat/layout.tsx +0 -10
  240. package/src/app/[variants]/(main)/chat/loading.tsx +0 -3
  241. package/src/app/[variants]/(main)/chat/not-found.tsx +0 -1
  242. package/src/app/[variants]/(main)/chat/page.tsx +0 -12
  243. package/src/app/[variants]/(main)/chat/settings/error.tsx +0 -3
  244. package/src/app/[variants]/(main)/chat/settings/loading.tsx +0 -3
  245. package/src/app/[variants]/(main)/chat/settings/not-found.tsx +0 -1
  246. package/src/app/[variants]/(main)/discover/(detail)/_layout/DetailLayout.tsx +0 -22
  247. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/Client.tsx +0 -51
  248. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/Client.tsx +0 -43
  249. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/loading.tsx +0 -1
  250. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/Client.tsx +0 -40
  251. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/loading.tsx +0 -1
  252. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/Client.tsx +0 -40
  253. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/loading.tsx +0 -1
  254. package/src/app/[variants]/(main)/discover/(list)/_layout/ListLayout.tsx +0 -22
  255. package/src/app/[variants]/(main)/discover/(list)/assistant/AssistantLayout.tsx +0 -21
  256. package/src/app/[variants]/(main)/discover/(list)/mcp/Client.tsx +0 -44
  257. package/src/app/[variants]/(main)/discover/(list)/mcp/McpLayout.tsx +0 -21
  258. package/src/app/[variants]/(main)/discover/(list)/model/Client.tsx +0 -44
  259. package/src/app/[variants]/(main)/discover/(list)/model/ModelLayout.tsx +0 -21
  260. package/src/app/[variants]/(main)/discover/(list)/provider/ProviderPage.tsx +0 -43
  261. package/src/app/[variants]/(main)/discover/DiscoverRouter.tsx +0 -170
  262. package/src/app/[variants]/(main)/discover/[[...path]]/page.tsx +0 -12
  263. package/src/app/[variants]/(main)/discover/_layout/DiscoverLayout.tsx +0 -22
  264. package/src/app/[variants]/(main)/discover/error.tsx +0 -3
  265. package/src/app/[variants]/(main)/discover/not-found.tsx +0 -1
  266. package/src/app/[variants]/(main)/error.tsx +0 -3
  267. package/src/app/[variants]/(main)/image/layout.tsx +0 -15
  268. package/src/app/[variants]/(main)/image/page.tsx +0 -45
  269. package/src/app/[variants]/(main)/knowledge/KnowledgeRouter.tsx +0 -74
  270. package/src/app/[variants]/(main)/knowledge/[[...path]]/page.tsx +0 -12
  271. package/src/app/[variants]/(main)/knowledge/components/modal/page.tsx +0 -13
  272. package/src/app/[variants]/(main)/knowledge/layout.tsx +0 -12
  273. package/src/app/[variants]/(main)/layout.tsx +0 -10
  274. package/src/app/[variants]/(main)/not-found.tsx +0 -1
  275. package/src/app/[variants]/(main)/profile/apikey/page.tsx +0 -32
  276. package/src/app/[variants]/(main)/profile/error.tsx +0 -3
  277. package/src/app/[variants]/(main)/profile/layout.tsx +0 -11
  278. package/src/app/[variants]/(main)/profile/loading.tsx +0 -3
  279. package/src/app/[variants]/(main)/profile/not-found.tsx +0 -1
  280. package/src/app/[variants]/(main)/profile/security/page.tsx +0 -28
  281. package/src/app/[variants]/(main)/profile/stats/page.tsx +0 -23
  282. package/src/app/[variants]/(main)/profile/usage/page.tsx +0 -23
  283. package/src/app/[variants]/@modal/(.)changelog/modal/features/Cover.tsx +0 -48
  284. package/src/app/[variants]/@modal/(.)changelog/modal/features/Hero.tsx +0 -29
  285. package/src/app/[variants]/@modal/(.)changelog/modal/features/Post.tsx +0 -57
  286. package/src/app/[variants]/@modal/(.)changelog/modal/features/PublishedTime.tsx +0 -50
  287. package/src/app/[variants]/@modal/(.)changelog/modal/features/ReadDetail.tsx +0 -72
  288. package/src/app/[variants]/@modal/(.)changelog/modal/features/VersionTag.tsx +0 -26
  289. package/src/app/[variants]/@modal/(.)changelog/modal/layout.tsx +0 -41
  290. package/src/app/[variants]/@modal/(.)changelog/modal/loading.tsx +0 -10
  291. package/src/app/[variants]/@modal/(.)changelog/modal/page.tsx +0 -38
  292. package/src/app/[variants]/@modal/_layout/ModalLayout.tsx +0 -63
  293. package/src/app/[variants]/@modal/_layout/SettingModalLayout.tsx +0 -71
  294. package/src/app/[variants]/@modal/default.tsx +0 -3
  295. package/src/app/[variants]/@modal/error.tsx +0 -3
  296. package/src/app/[variants]/@modal/layout.tsx +0 -7
  297. package/src/app/[variants]/@modal/loading.tsx +0 -5
  298. /package/src/app/[variants]/{@modal/(.)changelog/modal → (main)/changelog}/features/Pagination.tsx +0 -0
  299. /package/src/app/[variants]/{@modal/(.)changelog/modal → (main)/changelog}/features/UpdateChangelogStatus.tsx +0 -0
  300. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/DetailProvider.tsx +0 -0
  301. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/Knowledge.tsx +0 -0
  302. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/KnowledgeItem.tsx +0 -0
  303. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/PluginItem.tsx +0 -0
  304. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/Plugins.tsx +0 -0
  305. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/index.tsx +0 -0
  306. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Nav.tsx +0 -0
  307. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Overview/TagList.tsx +0 -0
  308. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/SystemRole/TagList.tsx +0 -0
  309. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/Related/Item.tsx +0 -0
  310. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/Summary/index.tsx +0 -0
  311. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/index.tsx +0 -0
  312. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/loading.tsx → loading.tsx} +0 -0
  313. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/ActionButton/index.tsx +0 -0
  314. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/ConnectionTypeAlert.tsx +0 -0
  315. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/Related/Item.tsx +0 -0
  316. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/index.tsx +0 -0
  317. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/DetailProvider.tsx +0 -0
  318. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Nav.tsx +0 -0
  319. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Overview/ProviderList/index.tsx +0 -0
  320. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Parameter/index.tsx +0 -0
  321. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/Related/Item.tsx +0 -0
  322. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/RelatedProviders/Item.tsx +0 -0
  323. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/index.tsx +0 -0
  324. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/DetailProvider.tsx +0 -0
  325. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Guide/index.tsx +0 -0
  326. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Nav.tsx +0 -0
  327. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Overview/ModelList/index.tsx +0 -0
  328. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Overview/index.tsx +0 -0
  329. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Header.tsx +0 -0
  330. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/Related/Item.tsx +0 -0
  331. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/RelatedModels/Item.tsx +0 -0
  332. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/index.tsx +0 -0
  333. /package/src/app/[variants]/(main)/labs/{page.tsx → index.tsx} +0 -0
  334. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/RegisterHotkeys.tsx +0 -0
  335. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/Avatar.test.tsx +0 -0
  336. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/Avatar.tsx +0 -0
  337. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/PinList/index.tsx +0 -0
  338. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/index.tsx +0 -0
@@ -50,6 +50,15 @@ interface ProcessMessageParams {
50
50
  groupId?: string;
51
51
  agentId?: string;
52
52
  agentConfig?: any; // Agent configuration for group chat agents
53
+
54
+ /**
55
+ * Explicit sessionId for this execution (avoids using global activeId)
56
+ */
57
+ sessionId?: string;
58
+ /**
59
+ * Explicit topicId for this execution (avoids using global activeTopicId)
60
+ */
61
+ topicId?: string | null;
53
62
  }
54
63
 
55
64
  /**
@@ -62,6 +71,14 @@ export interface StreamingExecutorAction {
62
71
  internal_createAgentState: (params: {
63
72
  messages: UIChatMessage[];
64
73
  parentMessageId: string;
74
+ /**
75
+ * Explicit sessionId for this execution (avoids using global activeId)
76
+ */
77
+ sessionId?: string;
78
+ /**
79
+ * Explicit topicId for this execution (avoids using global activeTopicId)
80
+ */
81
+ topicId?: string | null;
65
82
  threadId?: string;
66
83
  initialState?: AgentState;
67
84
  initialContext?: AgentRuntimeContext;
@@ -94,6 +111,14 @@ export interface StreamingExecutorAction {
94
111
  messages: UIChatMessage[];
95
112
  parentMessageId: string;
96
113
  parentMessageType: 'user' | 'assistant' | 'tool';
114
+ /**
115
+ * Explicit sessionId for this execution (avoids using global activeId)
116
+ */
117
+ sessionId?: string;
118
+ /**
119
+ * Explicit topicId for this execution (avoids using global activeTopicId)
120
+ */
121
+ topicId?: string | null;
97
122
  inSearchWorkflow?: boolean;
98
123
  /**
99
124
  * the RAG query content, should be embedding and used in the semantic search
@@ -124,11 +149,17 @@ export const streamingExecutor: StateCreator<
124
149
  internal_createAgentState: ({
125
150
  messages,
126
151
  parentMessageId,
152
+ sessionId: paramSessionId,
153
+ topicId: paramTopicId,
127
154
  threadId,
128
155
  initialState,
129
156
  initialContext,
130
157
  }) => {
158
+ // Use provided sessionId/topicId or fallback to global state
131
159
  const { activeId, activeTopicId } = get();
160
+ const sessionId = paramSessionId ?? activeId;
161
+ const topicId = paramTopicId !== undefined ? paramTopicId : activeTopicId;
162
+
132
163
  const agentStoreState = getAgentStoreState();
133
164
  const agentConfigData = agentSelectors.currentAgentConfig(agentStoreState);
134
165
 
@@ -157,12 +188,12 @@ export const streamingExecutor: StateCreator<
157
188
  const state =
158
189
  initialState ||
159
190
  AgentRuntime.createInitialState({
160
- sessionId: activeId,
191
+ sessionId,
161
192
  messages,
162
193
  maxSteps: 400,
163
194
  metadata: {
164
- sessionId: activeId,
165
- topicId: activeTopicId,
195
+ sessionId,
196
+ topicId,
166
197
  threadId,
167
198
  },
168
199
  toolManifestMap,
@@ -178,7 +209,7 @@ export const streamingExecutor: StateCreator<
178
209
  parentMessageId,
179
210
  },
180
211
  session: {
181
- sessionId: activeId,
212
+ sessionId,
182
213
  messageCount: messages.length,
183
214
  status: state.status,
184
215
  stepCount: 0,
@@ -233,14 +264,21 @@ export const streamingExecutor: StateCreator<
233
264
  // to upload image
234
265
  const uploadTasks: Map<string, Promise<{ id?: string; url?: string }>> = new Map();
235
266
 
267
+ const context: { sessionId: string; topicId?: string | null } = {
268
+ sessionId: params?.sessionId || get().activeId,
269
+ topicId: params?.topicId,
270
+ };
236
271
  // Throttle tool_calls updates to prevent excessive re-renders (max once per 300ms)
237
272
  const throttledUpdateToolCalls = throttle(
238
273
  (toolCalls: any[]) => {
239
- internal_dispatchMessage({
240
- id: messageId,
241
- type: 'updateMessage',
242
- value: { tools: get().internal_transformToolCalls(toolCalls) },
243
- });
274
+ internal_dispatchMessage(
275
+ {
276
+ id: messageId,
277
+ type: 'updateMessage',
278
+ value: { tools: get().internal_transformToolCalls(toolCalls) },
279
+ },
280
+ context,
281
+ );
244
282
  },
245
283
  300,
246
284
  { leading: true, trailing: true },
@@ -261,13 +299,14 @@ export const streamingExecutor: StateCreator<
261
299
  historySummary: historySummary?.content,
262
300
  trace: {
263
301
  traceId: params?.traceId,
264
- sessionId: get().activeId,
265
- topicId: get().activeTopicId,
302
+ sessionId: params?.sessionId ?? get().activeId,
303
+ topicId:
304
+ (params?.topicId !== undefined ? params.topicId : get().activeTopicId) ?? undefined,
266
305
  traceName: TraceNameMap.Conversation,
267
306
  },
268
307
  onErrorHandle: async (error) => {
269
- await messageService.updateMessageError(messageId, error);
270
- await refreshMessages();
308
+ await messageService.updateMessageError(messageId, error, context);
309
+ await refreshMessages(params?.sessionId, params?.topicId);
271
310
  },
272
311
  onFinish: async (
273
312
  content,
@@ -276,10 +315,11 @@ export const streamingExecutor: StateCreator<
276
315
  // if there is traceId, update it
277
316
  if (traceId) {
278
317
  msgTraceId = traceId;
279
- messageService.updateMessage(messageId, {
280
- traceId,
281
- observationId: observationId ?? undefined,
282
- });
318
+ messageService.updateMessage(
319
+ messageId,
320
+ { traceId, observationId: observationId ?? undefined },
321
+ context,
322
+ );
283
323
  }
284
324
 
285
325
  // 等待所有图片上传完成
@@ -321,15 +361,20 @@ export const streamingExecutor: StateCreator<
321
361
  internal_toggleChatReasoning(false, messageId, n('toggleChatReasoning/false') as string);
322
362
 
323
363
  // update the content after fetch result
324
- await optimisticUpdateMessageContent(messageId, content, {
325
- toolCalls: parsedToolCalls,
326
- reasoning: !!reasoning
327
- ? { ...reasoning, duration: duration && !isNaN(duration) ? duration : undefined }
328
- : undefined,
329
- search: !!grounding?.citations ? grounding : undefined,
330
- imageList: finalImages.length > 0 ? finalImages : undefined,
331
- metadata: speed ? { ...usage, ...speed } : usage,
332
- });
364
+ await optimisticUpdateMessageContent(
365
+ messageId,
366
+ content,
367
+ {
368
+ toolCalls: parsedToolCalls,
369
+ reasoning: !!reasoning
370
+ ? { ...reasoning, duration: duration && !isNaN(duration) ? duration : undefined }
371
+ : undefined,
372
+ search: !!grounding?.citations ? grounding : undefined,
373
+ imageList: finalImages.length > 0 ? finalImages : undefined,
374
+ metadata: speed ? { ...usage, ...speed } : usage,
375
+ },
376
+ context,
377
+ );
333
378
  },
334
379
  onMessageHandle: async (chunk) => {
335
380
  switch (chunk.type) {
@@ -342,27 +387,33 @@ export const streamingExecutor: StateCreator<
342
387
  )
343
388
  return;
344
389
 
345
- internal_dispatchMessage({
346
- id: messageId,
347
- type: 'updateMessage',
348
- value: {
349
- search: {
350
- citations: chunk.grounding.citations,
351
- searchQueries: chunk.grounding.searchQueries,
390
+ internal_dispatchMessage(
391
+ {
392
+ id: messageId,
393
+ type: 'updateMessage',
394
+ value: {
395
+ search: {
396
+ citations: chunk.grounding.citations,
397
+ searchQueries: chunk.grounding.searchQueries,
398
+ },
352
399
  },
353
400
  },
354
- });
401
+ context,
402
+ );
355
403
  break;
356
404
  }
357
405
 
358
406
  case 'base64_image': {
359
- internal_dispatchMessage({
360
- id: messageId,
361
- type: 'updateMessage',
362
- value: {
363
- imageList: chunk.images.map((i) => ({ id: i.id, url: i.data, alt: i.id })),
407
+ internal_dispatchMessage(
408
+ {
409
+ id: messageId,
410
+ type: 'updateMessage',
411
+ value: {
412
+ imageList: chunk.images.map((i) => ({ id: i.id, url: i.data, alt: i.id })),
413
+ },
364
414
  },
365
- });
415
+ context,
416
+ );
366
417
  const image = chunk.image;
367
418
 
368
419
  const task = getFileStoreState()
@@ -395,14 +446,17 @@ export const streamingExecutor: StateCreator<
395
446
  }
396
447
  }
397
448
 
398
- internal_dispatchMessage({
399
- id: messageId,
400
- type: 'updateMessage',
401
- value: {
402
- content: output,
403
- reasoning: !!thinking ? { content: thinking, duration } : undefined,
449
+ internal_dispatchMessage(
450
+ {
451
+ id: messageId,
452
+ type: 'updateMessage',
453
+ value: {
454
+ content: output,
455
+ reasoning: !!thinking ? { content: thinking, duration } : undefined,
456
+ },
404
457
  },
405
- });
458
+ context,
459
+ );
406
460
  break;
407
461
  }
408
462
 
@@ -419,11 +473,14 @@ export const streamingExecutor: StateCreator<
419
473
 
420
474
  thinking += chunk.text;
421
475
 
422
- internal_dispatchMessage({
423
- id: messageId,
424
- type: 'updateMessage',
425
- value: { reasoning: { content: thinking } },
426
- });
476
+ internal_dispatchMessage(
477
+ {
478
+ id: messageId,
479
+ type: 'updateMessage',
480
+ value: { reasoning: { content: thinking } },
481
+ },
482
+ context,
483
+ );
427
484
  break;
428
485
  }
429
486
 
@@ -462,18 +519,30 @@ export const streamingExecutor: StateCreator<
462
519
  },
463
520
 
464
521
  internal_execAgentRuntime: async (params) => {
465
- const { messages: originalMessages, parentMessageId, parentMessageType } = params;
522
+ const {
523
+ messages: originalMessages,
524
+ parentMessageId,
525
+ parentMessageType,
526
+ sessionId: paramSessionId,
527
+ topicId: paramTopicId,
528
+ } = params;
529
+
530
+ // Use provided sessionId/topicId or fallback to global state
531
+ const { activeId, activeTopicId } = get();
532
+ const sessionId = paramSessionId ?? activeId;
533
+ const topicId = paramTopicId !== undefined ? paramTopicId : activeTopicId;
534
+ const messageKey = messageMapKey(sessionId, topicId);
466
535
 
467
536
  log(
468
- '[internal_execAgentRuntime] start, parentMessageId: %s,parentMessageType: %s, messages count: %d',
537
+ '[internal_execAgentRuntime] start, sessionId: %s, topicId: %s, messageKey: %s, parentMessageId: %s, parentMessageType: %s, messages count: %d',
538
+ sessionId,
539
+ topicId,
540
+ messageKey,
469
541
  parentMessageId,
470
542
  parentMessageType,
471
543
  originalMessages.length,
472
544
  );
473
545
 
474
- const { activeId, activeTopicId } = get();
475
- const messageKey = messageMapKey(activeId, activeTopicId);
476
-
477
546
  // Create a new array to avoid modifying the original messages
478
547
  let messages = [...originalMessages];
479
548
 
@@ -556,7 +625,11 @@ export const streamingExecutor: StateCreator<
556
625
  get,
557
626
  messageKey,
558
627
  parentId: params.parentMessageId,
559
- params,
628
+ params: {
629
+ ...params,
630
+ sessionId,
631
+ topicId,
632
+ },
560
633
  skipCreateFirstMessage: params.skipCreateFirstMessage,
561
634
  }),
562
635
  });
@@ -566,6 +639,8 @@ export const streamingExecutor: StateCreator<
566
639
  get().internal_createAgentState({
567
640
  messages,
568
641
  parentMessageId: params.parentMessageId,
642
+ sessionId,
643
+ topicId,
569
644
  threadId: params.threadId,
570
645
  initialState: params.initialState,
571
646
  initialContext: params.initialContext,
@@ -613,10 +688,13 @@ export const streamingExecutor: StateCreator<
613
688
  const currentMessages = get().messagesMap[messageKey] || [];
614
689
  const assistantMessage = currentMessages.findLast((m) => m.role === 'assistant');
615
690
  if (assistantMessage) {
616
- await messageService.updateMessageError(assistantMessage.id, event.error);
691
+ await messageService.updateMessageError(assistantMessage.id, event.error, {
692
+ sessionId,
693
+ topicId,
694
+ });
617
695
  }
618
696
  const finalMessages = get().messagesMap[messageKey] || [];
619
- get().replaceMessages(finalMessages);
697
+ get().replaceMessages(finalMessages, { sessionId, topicId });
620
698
  break;
621
699
  }
622
700
  }
@@ -644,7 +722,10 @@ export const streamingExecutor: StateCreator<
644
722
  const finalMessages = get().messagesMap[messageKey] || [];
645
723
  const assistantMessage = finalMessages.findLast((m) => m.role === 'assistant');
646
724
  if (assistantMessage) {
647
- await get().optimisticUpdateMessageRAG(assistantMessage.id, params.ragMetadata);
725
+ await get().optimisticUpdateMessageRAG(assistantMessage.id, params.ragMetadata, {
726
+ sessionId,
727
+ topicId,
728
+ });
648
729
  log('[internal_execAgentRuntime] RAG metadata updated for assistant message');
649
730
  }
650
731
  }
@@ -6,7 +6,7 @@ import { Mock, beforeEach, describe, expect, it, vi } from 'vitest';
6
6
 
7
7
  import { searchService } from '@/services/search';
8
8
  import { useChatStore } from '@/store/chat';
9
- import { chatSelectors } from '@/store/chat/selectors';
9
+ import { dbMessageSelectors } from '@/store/chat/selectors';
10
10
  import { CRAWL_CONTENT_LIMITED_COUNT } from '@/tools/web-browsing/const';
11
11
 
12
12
  // Mock services
@@ -18,8 +18,8 @@ vi.mock('@/services/search', () => ({
18
18
  }));
19
19
 
20
20
  vi.mock('@/store/chat/selectors', () => ({
21
- chatSelectors: {
22
- getMessageById: vi.fn(),
21
+ dbMessageSelectors: {
22
+ getDbMessageById: vi.fn(),
23
23
  },
24
24
  }));
25
25
 
@@ -38,6 +38,9 @@ describe('search actions', () => {
38
38
  optimisticAddToolToAssistantMessage: vi.fn(),
39
39
  openToolUI: vi.fn(),
40
40
  });
41
+
42
+ // Default mock for dbMessageSelectors - returns undefined to use activeId/activeTopicId
43
+ vi.spyOn(dbMessageSelectors, 'getDbMessageById').mockImplementation(() => () => undefined);
41
44
  });
42
45
 
43
46
  describe('search', () => {
@@ -90,6 +93,8 @@ describe('search actions', () => {
90
93
  expect(result.current.optimisticUpdateMessageContent).toHaveBeenCalledWith(
91
94
  messageId,
92
95
  searchResultsPrompt(expectedContent),
96
+ undefined,
97
+ { sessionId: undefined, topicId: undefined },
93
98
  );
94
99
  });
95
100
 
@@ -126,6 +131,8 @@ describe('search actions', () => {
126
131
  expect(result.current.optimisticUpdateMessageContent).toHaveBeenCalledWith(
127
132
  messageId,
128
133
  searchResultsPrompt([]),
134
+ undefined,
135
+ { sessionId: undefined, topicId: undefined },
129
136
  );
130
137
  });
131
138
 
@@ -145,15 +152,21 @@ describe('search actions', () => {
145
152
  await search(messageId, query);
146
153
  });
147
154
 
148
- expect(result.current.optimisticUpdateMessagePluginError).toHaveBeenCalledWith(messageId, {
149
- body: error,
150
- message: 'Search failed',
151
- type: 'PluginServerError',
152
- });
155
+ expect(result.current.optimisticUpdateMessagePluginError).toHaveBeenCalledWith(
156
+ messageId,
157
+ {
158
+ body: error,
159
+ message: 'Search failed',
160
+ type: 'PluginServerError',
161
+ },
162
+ { sessionId: undefined, topicId: undefined },
163
+ );
153
164
  expect(result.current.searchLoading[messageId]).toBe(false);
154
165
  expect(result.current.optimisticUpdateMessageContent).toHaveBeenCalledWith(
155
166
  messageId,
156
167
  'Search failed',
168
+ undefined,
169
+ { sessionId: undefined, topicId: undefined },
157
170
  );
158
171
  });
159
172
  });
@@ -193,6 +206,8 @@ describe('search actions', () => {
193
206
  expect(result.current.optimisticUpdateMessageContent).toHaveBeenCalledWith(
194
207
  messageId,
195
208
  crawlResultsPrompt(expectedContent as any),
209
+ undefined,
210
+ { sessionId: undefined, topicId: undefined },
196
211
  );
197
212
  });
198
213
 
@@ -219,6 +234,8 @@ describe('search actions', () => {
219
234
  expect(result.current.optimisticUpdateMessageContent).toHaveBeenCalledWith(
220
235
  messageId,
221
236
  crawlResultsPrompt(mockResponse.results),
237
+ undefined,
238
+ { sessionId: undefined, topicId: undefined },
222
239
  );
223
240
  });
224
241
  });
@@ -250,6 +267,8 @@ describe('search actions', () => {
250
267
  const mockMessage: Partial<UIChatMessage> = {
251
268
  id: messageId,
252
269
  parentId,
270
+ sessionId: undefined,
271
+ topicId: undefined,
253
272
  content: 'test content',
254
273
  plugin: {
255
274
  identifier: 'search',
@@ -264,7 +283,7 @@ describe('search actions', () => {
264
283
  meta: {},
265
284
  };
266
285
 
267
- vi.spyOn(chatSelectors, 'getMessageById').mockImplementation(
286
+ vi.spyOn(dbMessageSelectors, 'getDbMessageById').mockImplementation(
268
287
  () => () => mockMessage as UIChatMessage,
269
288
  );
270
289
 
@@ -282,7 +301,10 @@ describe('search actions', () => {
282
301
  plugin: mockMessage.plugin,
283
302
  pluginState: mockMessage.pluginState,
284
303
  role: 'tool',
304
+ sessionId: 'session-id',
305
+ topicId: 'topic-id',
285
306
  }),
307
+ { sessionId: 'session-id', topicId: 'topic-id' },
286
308
  );
287
309
 
288
310
  expect(result.current.optimisticAddToolToAssistantMessage).toHaveBeenCalledWith(
@@ -291,11 +313,12 @@ describe('search actions', () => {
291
313
  identifier: 'search',
292
314
  type: 'default',
293
315
  }),
316
+ { sessionId: undefined, topicId: undefined },
294
317
  );
295
318
  });
296
319
 
297
320
  it('should not save if message not found', async () => {
298
- vi.spyOn(chatSelectors, 'getMessageById').mockImplementation(() => () => undefined);
321
+ vi.spyOn(dbMessageSelectors, 'getDbMessageById').mockImplementation(() => () => undefined);
299
322
 
300
323
  const { result } = renderHook(() => useChatStore());
301
324
  const { saveSearchResult } = result.current;
@@ -327,4 +350,175 @@ describe('search actions', () => {
327
350
  expect(result.current.searchLoading[messageId]).toBe(false);
328
351
  });
329
352
  });
353
+
354
+ describe('OptimisticUpdateContext isolation', () => {
355
+ it('search should pass context to optimistic methods', async () => {
356
+ const mockResponse: UniformSearchResponse = {
357
+ results: [
358
+ {
359
+ title: 'Test',
360
+ content: 'Content',
361
+ url: 'https://test.com',
362
+ category: 'general',
363
+ engines: ['google'],
364
+ parsedUrl: 'test.com',
365
+ score: 1,
366
+ },
367
+ ],
368
+ costTime: 1,
369
+ resultNumbers: 1,
370
+ query: 'test',
371
+ };
372
+
373
+ (searchService.webSearch as Mock).mockResolvedValue(mockResponse);
374
+
375
+ const messageId = 'test-message-id';
376
+ const contextSessionId = 'context-session-id';
377
+ const contextTopicId = 'context-topic-id';
378
+
379
+ const mockMessage: Partial<UIChatMessage> = {
380
+ id: messageId,
381
+ sessionId: contextSessionId,
382
+ topicId: contextTopicId,
383
+ role: 'tool',
384
+ content: '',
385
+ createdAt: Date.now(),
386
+ updatedAt: Date.now(),
387
+ meta: {},
388
+ };
389
+
390
+ vi.spyOn(dbMessageSelectors, 'getDbMessageById').mockImplementation(
391
+ () => () => mockMessage as UIChatMessage,
392
+ );
393
+
394
+ const { result } = renderHook(() => useChatStore());
395
+ const query: SearchQuery = { query: 'test' };
396
+
397
+ await act(async () => {
398
+ await result.current.search(messageId, query);
399
+ });
400
+
401
+ expect(result.current.optimisticUpdatePluginState).toHaveBeenCalledWith(
402
+ messageId,
403
+ expect.any(Object),
404
+ { sessionId: contextSessionId, topicId: contextTopicId },
405
+ );
406
+ expect(result.current.optimisticUpdateMessageContent).toHaveBeenCalledWith(
407
+ messageId,
408
+ expect.any(String),
409
+ undefined,
410
+ { sessionId: contextSessionId, topicId: contextTopicId },
411
+ );
412
+ });
413
+
414
+ it('crawlMultiPages should pass context to optimistic methods', async () => {
415
+ const mockResponse = {
416
+ results: [
417
+ {
418
+ data: {
419
+ content: 'Test content',
420
+ title: 'Test',
421
+ },
422
+ crawler: 'naive',
423
+ originalUrl: 'https://test.com',
424
+ },
425
+ ],
426
+ };
427
+
428
+ (searchService.crawlPages as Mock).mockResolvedValue(mockResponse);
429
+
430
+ const messageId = 'test-message-id';
431
+ const contextSessionId = 'context-session-id';
432
+ const contextTopicId = 'context-topic-id';
433
+
434
+ const mockMessage: Partial<UIChatMessage> = {
435
+ id: messageId,
436
+ sessionId: contextSessionId,
437
+ topicId: contextTopicId,
438
+ role: 'tool',
439
+ content: '',
440
+ createdAt: Date.now(),
441
+ updatedAt: Date.now(),
442
+ meta: {},
443
+ };
444
+
445
+ vi.spyOn(dbMessageSelectors, 'getDbMessageById').mockImplementation(
446
+ () => () => mockMessage as UIChatMessage,
447
+ );
448
+
449
+ const { result } = renderHook(() => useChatStore());
450
+
451
+ await act(async () => {
452
+ await result.current.crawlMultiPages(messageId, { urls: ['https://test.com'] });
453
+ });
454
+
455
+ expect(result.current.optimisticUpdateMessageContent).toHaveBeenCalledWith(
456
+ messageId,
457
+ expect.any(String),
458
+ undefined,
459
+ { sessionId: contextSessionId, topicId: contextTopicId },
460
+ );
461
+ expect(result.current.optimisticUpdatePluginState).toHaveBeenCalledWith(
462
+ messageId,
463
+ expect.any(Object),
464
+ { sessionId: contextSessionId, topicId: contextTopicId },
465
+ );
466
+ });
467
+
468
+ it('saveSearchResult should pass context to optimistic methods', async () => {
469
+ const messageId = 'test-message-id';
470
+ const parentId = 'parent-message-id';
471
+ const contextSessionId = 'context-session-id';
472
+ const contextTopicId = 'context-topic-id';
473
+
474
+ const mockMessage: Partial<UIChatMessage> = {
475
+ id: messageId,
476
+ parentId,
477
+ sessionId: contextSessionId,
478
+ topicId: contextTopicId,
479
+ content: 'test content',
480
+ plugin: {
481
+ identifier: 'search',
482
+ arguments: '{}',
483
+ apiName: 'search',
484
+ type: 'default',
485
+ },
486
+ pluginState: {},
487
+ role: 'tool',
488
+ createdAt: Date.now(),
489
+ updatedAt: Date.now(),
490
+ meta: {},
491
+ };
492
+
493
+ vi.spyOn(dbMessageSelectors, 'getDbMessageById').mockImplementation(
494
+ () => () => mockMessage as UIChatMessage,
495
+ );
496
+
497
+ (useChatStore.getState().optimisticCreateMessage as Mock).mockResolvedValue({
498
+ id: 'new-message-id',
499
+ });
500
+
501
+ const { result } = renderHook(() => useChatStore());
502
+
503
+ await act(async () => {
504
+ await result.current.saveSearchResult(messageId);
505
+ });
506
+
507
+ expect(result.current.optimisticAddToolToAssistantMessage).toHaveBeenCalledWith(
508
+ parentId,
509
+ expect.objectContaining({
510
+ identifier: 'search',
511
+ type: 'default',
512
+ }),
513
+ { sessionId: contextSessionId, topicId: contextTopicId },
514
+ );
515
+ expect(result.current.optimisticCreateMessage).toHaveBeenCalledWith(
516
+ expect.objectContaining({
517
+ sessionId: contextSessionId,
518
+ topicId: contextTopicId,
519
+ }),
520
+ { sessionId: contextSessionId, topicId: contextTopicId },
521
+ );
522
+ });
523
+ });
330
524
  });