@lobehub/lobehub 2.0.0-next.72 → 2.0.0-next.74

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 (358) hide show
  1. package/.github/workflows/desktop-pr-build.yml +7 -3
  2. package/CHANGELOG.md +50 -0
  3. package/apps/desktop/package.json +1 -0
  4. package/apps/desktop/src/main/controllers/LocalFileCtr.ts +55 -11
  5. package/apps/desktop/src/main/controllers/__tests__/LocalFileCtr.test.ts +153 -0
  6. package/changelog/v1.json +18 -0
  7. package/locales/en-US/tool.json +12 -1
  8. package/locales/zh-CN/tool.json +12 -1
  9. package/next.config.ts +5 -5
  10. package/package.json +2 -1
  11. package/packages/electron-client-ipc/src/types/localSystem.ts +4 -0
  12. package/scripts/prebuild.mts +16 -6
  13. package/src/app/(backend)/trpc/desktop/[trpc]/route.ts +6 -6
  14. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/UserBanner.test.tsx +7 -4
  15. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +4 -4
  16. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +5 -6
  17. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/useCategory.tsx +5 -8
  18. package/src/app/[variants]/(main)/(mobile)/me/(home)/index.tsx +25 -0
  19. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +13 -16
  20. package/src/app/[variants]/(main)/(mobile)/me/profile/features/Category.tsx +6 -6
  21. package/src/app/[variants]/(main)/(mobile)/me/profile/features/Header.tsx +3 -3
  22. package/src/app/[variants]/(main)/(mobile)/me/profile/index.tsx +16 -0
  23. package/src/app/[variants]/(main)/(mobile)/me/profile/layout.tsx +9 -11
  24. package/src/app/[variants]/(main)/(mobile)/me/settings/features/Header.tsx +3 -3
  25. package/src/app/[variants]/(main)/(mobile)/me/settings/features/useCategory.tsx +3 -4
  26. package/src/app/[variants]/(main)/(mobile)/me/settings/index.tsx +16 -0
  27. package/src/app/[variants]/(main)/(mobile)/me/settings/layout.tsx +15 -13
  28. package/src/app/[variants]/(main)/changelog/_layout/Desktop/index.tsx +6 -5
  29. package/src/app/[variants]/(main)/changelog/_layout/Mobile/Header.tsx +3 -3
  30. package/src/app/[variants]/(main)/changelog/_layout/Mobile/index.tsx +5 -5
  31. package/src/app/[variants]/(main)/changelog/features/Post.tsx +7 -4
  32. package/src/app/[variants]/(main)/changelog/index.tsx +55 -0
  33. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +6 -7
  34. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +3 -3
  35. package/src/app/[variants]/(main)/chat/components/WorkspaceLayout.tsx +1 -14
  36. package/src/app/[variants]/(main)/chat/components/conversation/features/ChatHydration/index.tsx +2 -2
  37. package/src/app/[variants]/(main)/chat/components/conversation/features/ChatInput/Desktop/MessageFromUrl.tsx +11 -13
  38. package/src/app/[variants]/(main)/chat/components/conversation/features/ChatInput/Desktop/index.tsx +0 -1
  39. package/src/app/[variants]/(main)/chat/components/conversation/features/ThreadHydration.tsx +2 -2
  40. package/src/app/[variants]/(main)/chat/components/topic/features/Topic/TopicListContent/TopicItem/TopicContent.tsx +20 -11
  41. package/src/app/[variants]/(main)/chat/features/PageTitle/index.tsx +1 -2
  42. package/src/app/[variants]/(main)/chat/index.tsx +29 -0
  43. package/src/app/[variants]/(main)/chat/session/features/SessionHydration.tsx +8 -6
  44. package/src/app/[variants]/(main)/chat/session/features/SessionListContent/Inbox/index.tsx +2 -4
  45. package/src/app/[variants]/(main)/chat/session/features/SessionListContent/List/index.tsx +1 -1
  46. package/src/app/[variants]/(main)/chat/session/layout/Mobile/SessionHeader.tsx +3 -3
  47. package/src/app/[variants]/(main)/chat/settings/_layout/Desktop/Header.tsx +3 -3
  48. package/src/app/[variants]/(main)/chat/settings/_layout/Mobile/Header.tsx +3 -3
  49. package/src/app/[variants]/(main)/chat/settings/features/PublishResultModal/index.tsx +3 -3
  50. package/src/app/[variants]/(main)/chat/{components/SettingsPage.tsx → settings/index.tsx} +6 -35
  51. package/src/app/[variants]/(main)/components/Link.tsx +21 -0
  52. package/src/app/[variants]/(main)/discover/(detail)/_layout/{Desktop.tsx → Desktop/index.tsx} +15 -7
  53. package/src/app/[variants]/(main)/discover/(detail)/_layout/Mobile/index.tsx +3 -3
  54. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/Block.tsx +1 -1
  55. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Overview/index.tsx +1 -1
  56. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Related/index.tsx +2 -2
  57. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/SystemRole/index.tsx +3 -3
  58. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Versions/index.tsx +4 -4
  59. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/index.tsx +1 -1
  60. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Header.tsx +2 -2
  61. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/ActionButton/AddAgent.tsx +3 -3
  62. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/ActionButton/index.tsx +1 -1
  63. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/Related/index.tsx +1 -1
  64. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/TocList/index.tsx +2 -2
  65. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/StatusPage/index.tsx +3 -3
  66. package/src/app/[variants]/(main)/discover/(detail)/assistant/{AssistantDetailPage.tsx → index.tsx} +18 -11
  67. package/src/app/[variants]/(main)/discover/(detail)/features/Breadcrumb.tsx +1 -1
  68. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Details/Related/index.tsx +2 -2
  69. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Details/Versions/index.tsx +5 -5
  70. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Details/index.tsx +1 -1
  71. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/Related/index.tsx +2 -2
  72. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/ServerConfig.tsx +4 -4
  73. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/TocList/index.tsx +2 -2
  74. package/src/app/[variants]/(main)/discover/(detail)/mcp/{McpDetailPage.tsx → index.tsx} +15 -7
  75. package/src/app/[variants]/(main)/discover/(detail)/mcp/loading.tsx +1 -0
  76. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Overview/index.tsx +1 -1
  77. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Parameter/ParameterItem.tsx +1 -1
  78. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Related/index.tsx +2 -2
  79. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/index.tsx +1 -1
  80. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Header.tsx +1 -1
  81. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/ActionButton/ChatWithModel.tsx +3 -3
  82. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/ActionButton/index.tsx +1 -1
  83. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/Related/index.tsx +2 -2
  84. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/RelatedProviders/index.tsx +1 -1
  85. package/src/app/[variants]/(main)/discover/(detail)/model/{ModelDetailPage.tsx → index.tsx} +17 -10
  86. package/src/app/[variants]/(main)/discover/(detail)/model/loading.tsx +1 -0
  87. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Related/index.tsx +2 -2
  88. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/index.tsx +1 -1
  89. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/ActionButton/ProviderConfig.tsx +5 -4
  90. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/ActionButton/index.tsx +1 -1
  91. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/Related/index.tsx +2 -2
  92. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/RelatedModels/index.tsx +1 -1
  93. package/src/app/[variants]/(main)/discover/(detail)/provider/{ProviderDetailPage.tsx → index.tsx} +17 -10
  94. package/src/app/[variants]/(main)/discover/(detail)/provider/loading.tsx +1 -0
  95. package/src/app/[variants]/(main)/discover/(list)/(home)/{HomePage.tsx → index.tsx} +14 -0
  96. package/src/app/[variants]/(main)/discover/(list)/_layout/Desktop/Nav.tsx +2 -3
  97. package/src/app/[variants]/(main)/discover/(list)/_layout/Desktop/index.tsx +4 -3
  98. package/src/app/[variants]/(main)/discover/(list)/_layout/Mobile/Nav.tsx +3 -4
  99. package/src/app/[variants]/(main)/discover/(list)/_layout/Mobile/index.tsx +4 -3
  100. package/src/app/[variants]/(main)/discover/(list)/assistant/_layout/Desktop.tsx +3 -4
  101. package/src/app/[variants]/(main)/discover/(list)/assistant/_layout/Mobile.tsx +3 -3
  102. package/src/app/[variants]/(main)/discover/(list)/assistant/features/List/Item.tsx +2 -2
  103. package/src/app/[variants]/(main)/discover/(list)/assistant/{AssistantPage.tsx → index.tsx} +18 -4
  104. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +2 -2
  105. package/src/app/[variants]/(main)/discover/(list)/mcp/_layout/Desktop.tsx +3 -3
  106. package/src/app/[variants]/(main)/discover/(list)/mcp/_layout/Mobile.tsx +3 -3
  107. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -1
  108. package/src/app/[variants]/(main)/discover/(list)/mcp/{McpPage.tsx → index.tsx} +9 -2
  109. package/src/app/[variants]/(main)/discover/(list)/model/_layout/Desktop.tsx +3 -3
  110. package/src/app/[variants]/(main)/discover/(list)/model/_layout/Mobile.tsx +3 -3
  111. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -1
  112. package/src/app/[variants]/(main)/discover/(list)/model/{ModelPage.tsx → index.tsx} +9 -2
  113. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -1
  114. package/src/app/[variants]/(main)/discover/(list)/provider/{Client.tsx → index.tsx} +9 -2
  115. package/src/app/[variants]/(main)/discover/_layout/Desktop/index.tsx +4 -4
  116. package/src/app/[variants]/(main)/discover/_layout/Mobile/index.tsx +3 -3
  117. package/src/app/[variants]/(main)/discover/components/Title.tsx +1 -1
  118. package/src/app/[variants]/(main)/discover/features/Search.tsx +2 -2
  119. package/src/app/[variants]/(main)/discover/features/useNav.tsx +11 -12
  120. package/src/app/[variants]/(main)/hooks/useActiveTabKey.ts +40 -0
  121. package/src/app/[variants]/(main)/hooks/usePathname.ts +10 -0
  122. package/src/app/[variants]/(main)/hooks/useQuery.ts +12 -0
  123. package/src/app/[variants]/(main)/hooks/useRouter.ts +22 -0
  124. package/src/app/[variants]/(main)/hooks/useSearchParams.ts +11 -0
  125. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/ModelSelect/index.tsx +5 -5
  126. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicUrlSync.tsx +1 -1
  127. package/src/app/[variants]/(main)/image/ComingSoon.tsx +15 -0
  128. package/src/app/[variants]/(main)/image/_layout/Desktop/index.tsx +5 -2
  129. package/src/app/[variants]/(main)/image/_layout/DesktopWrapper.tsx +15 -0
  130. package/src/app/[variants]/(main)/image/_layout/Mobile/index.tsx +3 -1
  131. package/src/app/[variants]/(main)/image/features/ImageWorkspace/index.tsx +1 -2
  132. package/src/app/[variants]/(main)/image/index.tsx +18 -0
  133. package/src/app/[variants]/(main)/knowledge/_layout/Desktop.tsx +17 -0
  134. package/src/app/[variants]/(main)/knowledge/_layout/Mobile.tsx +17 -0
  135. package/src/app/[variants]/(main)/knowledge/components/KnowledgeBaseItem/index.tsx +1 -1
  136. package/src/app/[variants]/(main)/knowledge/components/modal/ModalPageClient.tsx +4 -4
  137. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeBaseDetail/index.tsx +5 -8
  138. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeBaseDetail/menu/Head.tsx +1 -1
  139. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeHome/menu/CategoryMenu.tsx +2 -2
  140. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeHome/menu/KnowledgeBase.tsx +1 -1
  141. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/DesktopLayoutContainer.tsx +3 -2
  142. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/BottomActions.tsx +4 -4
  143. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/TopActions.test.tsx +9 -9
  144. package/src/app/[variants]/(main)/layouts/desktop/SideBar/TopActions.tsx +117 -0
  145. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/index.tsx +9 -4
  146. package/src/app/[variants]/(main)/layouts/index.tsx +11 -0
  147. package/src/app/[variants]/(main)/{_layout/Mobile → layouts/mobile}/NavBar.tsx +5 -5
  148. package/src/app/[variants]/(main)/{_layout/Mobile → layouts/mobile}/index.tsx +10 -7
  149. package/src/app/[variants]/(main)/profile/(home)/desktop.tsx +26 -0
  150. package/src/app/[variants]/(main)/profile/(home)/index.tsx +26 -0
  151. package/src/app/[variants]/(main)/profile/@category/features/CategoryContent.tsx +5 -7
  152. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +3 -2
  153. package/src/app/[variants]/(main)/profile/_layout/DesktopWrapper.tsx +14 -0
  154. package/src/app/[variants]/(main)/profile/_layout/Mobile/Header.tsx +3 -3
  155. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +4 -3
  156. package/src/app/[variants]/(main)/profile/apikey/index.tsx +18 -0
  157. package/src/app/[variants]/(main)/profile/hooks/useCategory.tsx +6 -6
  158. package/src/app/[variants]/(main)/profile/security/index.tsx +29 -0
  159. package/src/app/[variants]/(main)/profile/stats/features/AssistantsRank.tsx +4 -4
  160. package/src/app/[variants]/(main)/profile/stats/features/TopicsRank.tsx +4 -4
  161. package/src/app/[variants]/(main)/profile/stats/index.tsx +20 -0
  162. package/src/app/[variants]/(main)/profile/usage/features/UsageTable.tsx +7 -9
  163. package/src/app/[variants]/(main)/profile/usage/index.tsx +13 -0
  164. package/src/app/[variants]/(main)/settings/_layout/Desktop/Header.tsx +2 -2
  165. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +2 -2
  166. package/src/app/[variants]/(main)/settings/_layout/DesktopWrapper.tsx +23 -0
  167. package/src/app/[variants]/(main)/settings/_layout/Mobile/Header.tsx +8 -7
  168. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +2 -5
  169. package/src/app/[variants]/(main)/settings/_layout/MobileWrapper.tsx +23 -0
  170. package/src/app/[variants]/(main)/settings/agent/AgentMenu/Menu.tsx +2 -4
  171. package/src/app/[variants]/(main)/settings/agent/index.tsx +2 -4
  172. package/src/app/[variants]/(main)/settings/provider/(list)/index.tsx +2 -3
  173. package/src/app/[variants]/(main)/settings/provider/ProviderMenu/All.tsx +2 -2
  174. package/src/app/[variants]/(main)/settings/provider/ProviderMenu/Item.tsx +38 -37
  175. package/src/app/[variants]/(main)/settings/provider/_layout/Mobile.tsx +2 -2
  176. package/src/app/[variants]/(main)/settings/provider/features/CreateNewProvider/index.tsx +3 -3
  177. package/src/app/[variants]/(main)/settings/provider/features/ProviderConfig/UpdateProviderInfo/SettingModal.tsx +3 -3
  178. package/src/app/[variants]/DesktopRouter.tsx +40 -0
  179. package/src/app/[variants]/MobileRouter.tsx +41 -0
  180. package/src/app/[variants]/desktopRouter.config.tsx +364 -0
  181. package/src/app/[variants]/layout.tsx +1 -3
  182. package/src/app/[variants]/loaders/routeParams.ts +45 -0
  183. package/src/app/[variants]/loading/Server/Redirect.tsx +1 -1
  184. package/src/app/[variants]/mobileRouter.config.tsx +396 -0
  185. package/src/app/[variants]/page.tsx +17 -6
  186. package/src/app/desktop/devtools/page.tsx +1 -1
  187. package/src/app/desktop/layout.tsx +1 -1
  188. package/src/components/BootErrorBoundary/index.tsx +129 -0
  189. package/src/components/mdx/constants.ts +1 -0
  190. package/src/features/ChangelogModal/index.tsx +3 -3
  191. package/src/features/Conversation/Messages/Group/Tool/Inspector/index.tsx +23 -4
  192. package/src/features/KnowledgeManager/FileExplorer/index.tsx +4 -4
  193. package/src/features/KnowledgeManager/Header/FilesSearchBar.tsx +1 -1
  194. package/src/features/User/UserPanel/PanelContent.tsx +4 -3
  195. package/src/features/User/UserPanel/useMenu.tsx +20 -14
  196. package/src/features/User/__tests__/PanelContent.test.tsx +13 -7
  197. package/src/hooks/useDiscoverTab.ts +2 -2
  198. package/src/hooks/useInterceptingRoutes.test.ts +23 -26
  199. package/src/hooks/useInterceptingRoutes.ts +5 -4
  200. package/src/hooks/usePinnedAgentState.ts +6 -6
  201. package/src/hooks/useQuery.ts +5 -0
  202. package/src/hooks/useQueryParam.ts +322 -0
  203. package/src/hooks/useQueryRoute.test.ts +2 -12
  204. package/src/hooks/useQueryRoute.ts +5 -5
  205. package/src/hooks/useShowMobileWorkspace.ts +1 -1
  206. package/src/hooks/useSwitchSession.ts +4 -3
  207. package/src/layout/GlobalProvider/ImportSettings.tsx +22 -9
  208. package/src/layout/GlobalProvider/StoreInitialization.tsx +9 -1
  209. package/src/locales/default/tool.ts +11 -0
  210. package/src/proxy.ts +13 -1
  211. package/src/services/message/index.ts +11 -2
  212. package/src/store/chat/agents/createAgentExecutors.ts +31 -16
  213. package/src/store/chat/slices/aiChat/actions/__tests__/streamingExecutor.test.ts +218 -0
  214. package/src/store/chat/slices/aiChat/actions/conversationControl.ts +4 -0
  215. package/src/store/chat/slices/aiChat/actions/conversationLifecycle.ts +9 -3
  216. package/src/store/chat/slices/aiChat/actions/streamingExecutor.ts +142 -61
  217. package/src/store/chat/slices/builtinTool/actions/__tests__/localSystem.test.ts +5 -6
  218. package/src/store/chat/slices/builtinTool/actions/__tests__/search.test.ts +204 -10
  219. package/src/store/chat/slices/builtinTool/actions/localSystem.ts +45 -182
  220. package/src/store/chat/slices/builtinTool/actions/search.ts +51 -26
  221. package/src/store/chat/slices/message/action.test.ts +182 -33
  222. package/src/store/chat/slices/message/actions/optimisticUpdate.ts +79 -36
  223. package/src/store/chat/slices/message/actions/query.ts +7 -5
  224. package/src/store/chat/slices/message/selectors/dbMessage.ts +11 -4
  225. package/src/store/chat/slices/plugin/action.test.ts +257 -54
  226. package/src/store/chat/slices/plugin/actions/optimisticUpdate.ts +63 -26
  227. package/src/store/chat/slices/plugin/actions/pluginTypes.ts +52 -19
  228. package/src/store/chat/slices/plugin/actions/publicApi.ts +6 -1
  229. package/src/store/chat/slices/plugin/actions/workflow.ts +17 -6
  230. package/src/store/chat/slices/thread/action.ts +2 -0
  231. package/src/store/global/action.test.ts +3 -3
  232. package/src/store/global/actions/workspacePane.ts +2 -1
  233. package/src/store/global/initialState.ts +10 -2
  234. package/src/store/user/slices/common/action.ts +4 -0
  235. package/src/tools/executionRuntimes.ts +3 -0
  236. package/src/tools/local-system/ExecutionRuntime/index.ts +407 -0
  237. package/src/tools/local-system/Intervention/EditLocalFile/index.tsx +89 -0
  238. package/src/tools/local-system/Intervention/WriteFile/index.tsx +72 -0
  239. package/src/tools/local-system/Intervention/index.ts +4 -0
  240. package/src/tools/local-system/Render/EditLocalFile/index.tsx +67 -0
  241. package/src/tools/local-system/Render/ReadLocalFile/ReadFileView.tsx +53 -78
  242. package/src/tools/local-system/Render/index.ts +2 -0
  243. package/src/tools/local-system/index.ts +1 -0
  244. package/src/tools/local-system/type.ts +4 -3
  245. package/src/app/[variants]/(main)/(mobile)/me/(home)/loading.tsx +0 -38
  246. package/src/app/[variants]/(main)/(mobile)/me/(home)/page.tsx +0 -40
  247. package/src/app/[variants]/(main)/(mobile)/me/profile/loading.tsx +0 -5
  248. package/src/app/[variants]/(main)/(mobile)/me/profile/page.tsx +0 -30
  249. package/src/app/[variants]/(main)/(mobile)/me/settings/loading.tsx +0 -5
  250. package/src/app/[variants]/(main)/(mobile)/me/settings/page.tsx +0 -30
  251. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +0 -106
  252. package/src/app/[variants]/(main)/changelog/layout.tsx +0 -10
  253. package/src/app/[variants]/(main)/changelog/modal/page.tsx +0 -23
  254. package/src/app/[variants]/(main)/changelog/page.tsx +0 -78
  255. package/src/app/[variants]/(main)/chat/ChatRouter.tsx +0 -83
  256. package/src/app/[variants]/(main)/chat/_layout/ChatLayout.tsx +0 -22
  257. package/src/app/[variants]/(main)/chat/components/MainChatPage.tsx +0 -25
  258. package/src/app/[variants]/(main)/chat/error.tsx +0 -3
  259. package/src/app/[variants]/(main)/chat/layout.tsx +0 -10
  260. package/src/app/[variants]/(main)/chat/loading.tsx +0 -3
  261. package/src/app/[variants]/(main)/chat/not-found.tsx +0 -1
  262. package/src/app/[variants]/(main)/chat/page.tsx +0 -12
  263. package/src/app/[variants]/(main)/chat/settings/error.tsx +0 -3
  264. package/src/app/[variants]/(main)/chat/settings/loading.tsx +0 -3
  265. package/src/app/[variants]/(main)/chat/settings/not-found.tsx +0 -1
  266. package/src/app/[variants]/(main)/discover/(detail)/_layout/DetailLayout.tsx +0 -22
  267. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/Client.tsx +0 -51
  268. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/Client.tsx +0 -43
  269. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/loading.tsx +0 -1
  270. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/Client.tsx +0 -40
  271. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/loading.tsx +0 -1
  272. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/Client.tsx +0 -40
  273. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/loading.tsx +0 -1
  274. package/src/app/[variants]/(main)/discover/(list)/_layout/ListLayout.tsx +0 -22
  275. package/src/app/[variants]/(main)/discover/(list)/assistant/AssistantLayout.tsx +0 -21
  276. package/src/app/[variants]/(main)/discover/(list)/mcp/Client.tsx +0 -44
  277. package/src/app/[variants]/(main)/discover/(list)/mcp/McpLayout.tsx +0 -21
  278. package/src/app/[variants]/(main)/discover/(list)/model/Client.tsx +0 -44
  279. package/src/app/[variants]/(main)/discover/(list)/model/ModelLayout.tsx +0 -21
  280. package/src/app/[variants]/(main)/discover/(list)/provider/ProviderPage.tsx +0 -43
  281. package/src/app/[variants]/(main)/discover/DiscoverRouter.tsx +0 -170
  282. package/src/app/[variants]/(main)/discover/[[...path]]/page.tsx +0 -12
  283. package/src/app/[variants]/(main)/discover/_layout/DiscoverLayout.tsx +0 -22
  284. package/src/app/[variants]/(main)/discover/error.tsx +0 -3
  285. package/src/app/[variants]/(main)/discover/not-found.tsx +0 -1
  286. package/src/app/[variants]/(main)/error.tsx +0 -3
  287. package/src/app/[variants]/(main)/image/layout.tsx +0 -15
  288. package/src/app/[variants]/(main)/image/page.tsx +0 -45
  289. package/src/app/[variants]/(main)/knowledge/KnowledgeRouter.tsx +0 -74
  290. package/src/app/[variants]/(main)/knowledge/[[...path]]/page.tsx +0 -12
  291. package/src/app/[variants]/(main)/knowledge/components/modal/page.tsx +0 -13
  292. package/src/app/[variants]/(main)/knowledge/layout.tsx +0 -12
  293. package/src/app/[variants]/(main)/layout.tsx +0 -10
  294. package/src/app/[variants]/(main)/not-found.tsx +0 -1
  295. package/src/app/[variants]/(main)/profile/apikey/page.tsx +0 -32
  296. package/src/app/[variants]/(main)/profile/error.tsx +0 -3
  297. package/src/app/[variants]/(main)/profile/layout.tsx +0 -11
  298. package/src/app/[variants]/(main)/profile/loading.tsx +0 -3
  299. package/src/app/[variants]/(main)/profile/not-found.tsx +0 -1
  300. package/src/app/[variants]/(main)/profile/security/page.tsx +0 -28
  301. package/src/app/[variants]/(main)/profile/stats/page.tsx +0 -23
  302. package/src/app/[variants]/(main)/profile/usage/page.tsx +0 -23
  303. package/src/app/[variants]/@modal/(.)changelog/modal/features/Cover.tsx +0 -48
  304. package/src/app/[variants]/@modal/(.)changelog/modal/features/Hero.tsx +0 -29
  305. package/src/app/[variants]/@modal/(.)changelog/modal/features/Post.tsx +0 -57
  306. package/src/app/[variants]/@modal/(.)changelog/modal/features/PublishedTime.tsx +0 -50
  307. package/src/app/[variants]/@modal/(.)changelog/modal/features/ReadDetail.tsx +0 -72
  308. package/src/app/[variants]/@modal/(.)changelog/modal/features/VersionTag.tsx +0 -26
  309. package/src/app/[variants]/@modal/(.)changelog/modal/layout.tsx +0 -41
  310. package/src/app/[variants]/@modal/(.)changelog/modal/loading.tsx +0 -10
  311. package/src/app/[variants]/@modal/(.)changelog/modal/page.tsx +0 -38
  312. package/src/app/[variants]/@modal/_layout/ModalLayout.tsx +0 -63
  313. package/src/app/[variants]/@modal/_layout/SettingModalLayout.tsx +0 -71
  314. package/src/app/[variants]/@modal/default.tsx +0 -3
  315. package/src/app/[variants]/@modal/error.tsx +0 -3
  316. package/src/app/[variants]/@modal/layout.tsx +0 -7
  317. package/src/app/[variants]/@modal/loading.tsx +0 -5
  318. /package/src/app/[variants]/{@modal/(.)changelog/modal → (main)/changelog}/features/Pagination.tsx +0 -0
  319. /package/src/app/[variants]/{@modal/(.)changelog/modal → (main)/changelog}/features/UpdateChangelogStatus.tsx +0 -0
  320. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/DetailProvider.tsx +0 -0
  321. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/Knowledge.tsx +0 -0
  322. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/KnowledgeItem.tsx +0 -0
  323. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/PluginItem.tsx +0 -0
  324. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/Plugins.tsx +0 -0
  325. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/index.tsx +0 -0
  326. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Nav.tsx +0 -0
  327. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Overview/TagList.tsx +0 -0
  328. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/SystemRole/TagList.tsx +0 -0
  329. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/Related/Item.tsx +0 -0
  330. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/Summary/index.tsx +0 -0
  331. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/index.tsx +0 -0
  332. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/loading.tsx → loading.tsx} +0 -0
  333. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/ActionButton/index.tsx +0 -0
  334. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/ConnectionTypeAlert.tsx +0 -0
  335. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/Related/Item.tsx +0 -0
  336. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/index.tsx +0 -0
  337. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/DetailProvider.tsx +0 -0
  338. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Nav.tsx +0 -0
  339. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Overview/ProviderList/index.tsx +0 -0
  340. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Parameter/index.tsx +0 -0
  341. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/Related/Item.tsx +0 -0
  342. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/RelatedProviders/Item.tsx +0 -0
  343. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/index.tsx +0 -0
  344. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/DetailProvider.tsx +0 -0
  345. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Guide/index.tsx +0 -0
  346. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Nav.tsx +0 -0
  347. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Overview/ModelList/index.tsx +0 -0
  348. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Overview/index.tsx +0 -0
  349. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Header.tsx +0 -0
  350. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/Related/Item.tsx +0 -0
  351. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/RelatedModels/Item.tsx +0 -0
  352. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/index.tsx +0 -0
  353. /package/src/app/[variants]/(main)/labs/{page.tsx → index.tsx} +0 -0
  354. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/RegisterHotkeys.tsx +0 -0
  355. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/Avatar.test.tsx +0 -0
  356. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/Avatar.tsx +0 -0
  357. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/PinList/index.tsx +0 -0
  358. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/index.tsx +0 -0
@@ -82,6 +82,10 @@ describe('StreamingExecutor actions', () => {
82
82
  expect(updateMessageErrorSpy).toHaveBeenCalledWith(
83
83
  TEST_IDS.ASSISTANT_MESSAGE_ID,
84
84
  expect.objectContaining({ type: 'InvalidProviderAPIKey' }),
85
+ expect.objectContaining({
86
+ sessionId: TEST_IDS.SESSION_ID,
87
+ topicId: undefined,
88
+ }),
85
89
  );
86
90
 
87
91
  streamSpy.mockRestore();
@@ -149,6 +153,9 @@ describe('StreamingExecutor actions', () => {
149
153
  type: 'updateMessage',
150
154
  value: expect.objectContaining({ content: 'Hello' }),
151
155
  }),
156
+ expect.objectContaining({
157
+ sessionId: expect.any(String),
158
+ }),
152
159
  );
153
160
 
154
161
  streamSpy.mockRestore();
@@ -182,6 +189,9 @@ describe('StreamingExecutor actions', () => {
182
189
  type: 'updateMessage',
183
190
  value: expect.objectContaining({ reasoning: { content: 'Thinking...' } }),
184
191
  }),
192
+ expect.objectContaining({
193
+ sessionId: expect.any(String),
194
+ }),
185
195
  );
186
196
 
187
197
  streamSpy.mockRestore();
@@ -258,6 +268,9 @@ describe('StreamingExecutor actions', () => {
258
268
  }),
259
269
  }),
260
270
  }),
271
+ expect.objectContaining({
272
+ sessionId: expect.any(String),
273
+ }),
261
274
  );
262
275
 
263
276
  streamSpy.mockRestore();
@@ -296,6 +309,9 @@ describe('StreamingExecutor actions', () => {
296
309
  imageList: expect.any(Array),
297
310
  }),
298
311
  }),
312
+ expect.objectContaining({
313
+ sessionId: expect.any(String),
314
+ }),
299
315
  );
300
316
 
301
317
  streamSpy.mockRestore();
@@ -352,6 +368,10 @@ describe('StreamingExecutor actions', () => {
352
368
  expect(updateMessageSpy).toHaveBeenCalledWith(
353
369
  TEST_IDS.ASSISTANT_MESSAGE_ID,
354
370
  expect.objectContaining({ traceId }),
371
+ expect.objectContaining({
372
+ sessionId: expect.any(String),
373
+ topicId: undefined,
374
+ }),
355
375
  );
356
376
 
357
377
  streamSpy.mockRestore();
@@ -387,5 +407,203 @@ describe('StreamingExecutor actions', () => {
387
407
  expect(streamSpy).toHaveBeenCalled();
388
408
  expect(result.current.refreshMessages).toHaveBeenCalled();
389
409
  });
410
+
411
+ it('should use provided sessionId/topicId for trace parameters', async () => {
412
+ act(() => {
413
+ useChatStore.setState({
414
+ internal_execAgentRuntime: realExecAgentRuntime,
415
+ activeId: 'active-session',
416
+ activeTopicId: 'active-topic',
417
+ });
418
+ });
419
+
420
+ const { result } = renderHook(() => useChatStore());
421
+ const contextSessionId = 'context-session';
422
+ const contextTopicId = 'context-topic';
423
+ const userMessage = {
424
+ id: TEST_IDS.USER_MESSAGE_ID,
425
+ role: 'user',
426
+ content: TEST_CONTENT.USER_MESSAGE,
427
+ sessionId: contextSessionId,
428
+ topicId: contextTopicId,
429
+ } as UIChatMessage;
430
+
431
+ const streamSpy = vi.spyOn(chatService, 'createAssistantMessageStream');
432
+
433
+ await act(async () => {
434
+ await result.current.internal_execAgentRuntime({
435
+ messages: [userMessage],
436
+ parentMessageId: userMessage.id,
437
+ parentMessageType: 'user',
438
+ sessionId: contextSessionId,
439
+ topicId: contextTopicId,
440
+ });
441
+ });
442
+
443
+ // Verify trace was called with context sessionId/topicId, not active ones
444
+ expect(streamSpy).toHaveBeenCalledWith(
445
+ expect.objectContaining({
446
+ trace: expect.objectContaining({
447
+ sessionId: contextSessionId,
448
+ topicId: contextTopicId,
449
+ }),
450
+ }),
451
+ );
452
+ });
453
+
454
+ // TODO: This test is complex to set up properly with agent runtime and message creation
455
+ // The functionality is verified in the implementation (streamingExecutor.ts:725-728)
456
+ it.skip('should pass context to optimisticUpdateMessageRAG', async () => {
457
+ act(() => {
458
+ useChatStore.setState({
459
+ internal_execAgentRuntime: realExecAgentRuntime,
460
+ activeId: 'active-session',
461
+ activeTopicId: 'active-topic',
462
+ });
463
+ });
464
+
465
+ const { result } = renderHook(() => useChatStore());
466
+
467
+ const contextSessionId = 'context-session';
468
+ const contextTopicId = 'context-topic';
469
+ const userMessage = {
470
+ id: TEST_IDS.USER_MESSAGE_ID,
471
+ role: 'user',
472
+ content: TEST_CONTENT.USER_MESSAGE,
473
+ sessionId: contextSessionId,
474
+ topicId: contextTopicId,
475
+ } as UIChatMessage;
476
+
477
+ const ragMetadata = {
478
+ ragQueryId: 'query-id',
479
+ fileChunks: [{ id: 'chunk-1', similarity: 0.9 }],
480
+ };
481
+
482
+ const assistantMessageId = 'assistant-msg-id';
483
+ const assistantMessage = {
484
+ id: assistantMessageId,
485
+ role: 'assistant',
486
+ content: TEST_CONTENT.AI_RESPONSE,
487
+ sessionId: contextSessionId,
488
+ topicId: contextTopicId,
489
+ } as UIChatMessage;
490
+
491
+ // Mock createMessage to return the assistant message
492
+ vi.spyOn(messageService, 'createMessage').mockResolvedValue({
493
+ id: assistantMessageId,
494
+ messages: [userMessage, assistantMessage],
495
+ });
496
+
497
+ const updateRAGSpy = vi.spyOn(result.current, 'optimisticUpdateMessageRAG');
498
+ const streamSpy = vi
499
+ .spyOn(chatService, 'createAssistantMessageStream')
500
+ .mockImplementation(async ({ onFinish }) => {
501
+ await onFinish?.(TEST_CONTENT.AI_RESPONSE, {});
502
+ });
503
+
504
+ await act(async () => {
505
+ await result.current.internal_execAgentRuntime({
506
+ messages: [userMessage],
507
+ parentMessageId: userMessage.id,
508
+ parentMessageType: 'user',
509
+ sessionId: contextSessionId,
510
+ topicId: contextTopicId,
511
+ ragMetadata,
512
+ });
513
+ });
514
+
515
+ // Verify optimisticUpdateMessageRAG was called with context
516
+ expect(updateRAGSpy).toHaveBeenCalledWith(expect.any(String), ragMetadata, {
517
+ sessionId: contextSessionId,
518
+ topicId: contextTopicId,
519
+ });
520
+
521
+ streamSpy.mockRestore();
522
+ });
523
+ });
524
+
525
+ describe('StreamingExecutor OptimisticUpdateContext isolation', () => {
526
+ it('should pass context to optimisticUpdateMessageContent in internal_fetchAIChatMessage', async () => {
527
+ const { result } = renderHook(() => useChatStore());
528
+ const messages = [createMockMessage({ role: 'user' })];
529
+ const contextSessionId = 'context-session';
530
+ const contextTopicId = 'context-topic';
531
+
532
+ const updateContentSpy = vi.spyOn(result.current, 'optimisticUpdateMessageContent');
533
+
534
+ const streamSpy = vi
535
+ .spyOn(chatService, 'createAssistantMessageStream')
536
+ .mockImplementation(async ({ onMessageHandle, onFinish }) => {
537
+ await onMessageHandle?.({ type: 'text', text: TEST_CONTENT.AI_RESPONSE } as any);
538
+ await onFinish?.(TEST_CONTENT.AI_RESPONSE, {});
539
+ });
540
+
541
+ await act(async () => {
542
+ await result.current.internal_fetchAIChatMessage({
543
+ messages,
544
+ messageId: TEST_IDS.ASSISTANT_MESSAGE_ID,
545
+ model: 'gpt-4o-mini',
546
+ provider: 'openai',
547
+ params: {
548
+ sessionId: contextSessionId,
549
+ topicId: contextTopicId,
550
+ },
551
+ });
552
+ });
553
+
554
+ expect(updateContentSpy).toHaveBeenCalledWith(
555
+ TEST_IDS.ASSISTANT_MESSAGE_ID,
556
+ TEST_CONTENT.AI_RESPONSE,
557
+ expect.any(Object),
558
+ {
559
+ sessionId: contextSessionId,
560
+ topicId: contextTopicId,
561
+ },
562
+ );
563
+
564
+ streamSpy.mockRestore();
565
+ });
566
+
567
+ it('should use activeId/activeTopicId when context not provided', async () => {
568
+ act(() => {
569
+ useChatStore.setState({
570
+ activeId: 'active-session',
571
+ activeTopicId: 'active-topic',
572
+ });
573
+ });
574
+
575
+ const { result } = renderHook(() => useChatStore());
576
+ const messages = [createMockMessage({ role: 'user' })];
577
+
578
+ const updateContentSpy = vi.spyOn(result.current, 'optimisticUpdateMessageContent');
579
+
580
+ const streamSpy = vi
581
+ .spyOn(chatService, 'createAssistantMessageStream')
582
+ .mockImplementation(async ({ onMessageHandle, onFinish }) => {
583
+ await onMessageHandle?.({ type: 'text', text: TEST_CONTENT.AI_RESPONSE } as any);
584
+ await onFinish?.(TEST_CONTENT.AI_RESPONSE, {});
585
+ });
586
+
587
+ await act(async () => {
588
+ await result.current.internal_fetchAIChatMessage({
589
+ messages,
590
+ messageId: TEST_IDS.ASSISTANT_MESSAGE_ID,
591
+ model: 'gpt-4o-mini',
592
+ provider: 'openai',
593
+ });
594
+ });
595
+
596
+ expect(updateContentSpy).toHaveBeenCalledWith(
597
+ TEST_IDS.ASSISTANT_MESSAGE_ID,
598
+ TEST_CONTENT.AI_RESPONSE,
599
+ expect.any(Object),
600
+ {
601
+ sessionId: 'active-session',
602
+ topicId: undefined,
603
+ },
604
+ );
605
+
606
+ streamSpy.mockRestore();
607
+ });
390
608
  });
391
609
  });
@@ -183,6 +183,8 @@ export const conversationControl: StateCreator<
183
183
  messages: currentMessages,
184
184
  parentMessageId: toolMessageId, // Start from tool message
185
185
  parentMessageType: 'tool', // Type is 'tool'
186
+ sessionId: get().activeId,
187
+ topicId: get().activeTopicId,
186
188
  threadId: activeThreadId,
187
189
  initialState: state,
188
190
  initialContext: context,
@@ -239,6 +241,8 @@ export const conversationControl: StateCreator<
239
241
  messages: currentMessages,
240
242
  parentMessageId: messageId,
241
243
  parentMessageType: 'tool',
244
+ sessionId: get().activeId,
245
+ topicId: get().activeTopicId,
242
246
  threadId: activeThreadId,
243
247
  initialState: state,
244
248
  initialContext: context,
@@ -124,7 +124,7 @@ export const conversationLifecycle: StateCreator<
124
124
  imageList: tempImages.length > 0 ? tempImages : undefined,
125
125
  videoList: tempVideos.length > 0 ? tempVideos : undefined,
126
126
  });
127
- get().optimisticCreateTmpMessage({
127
+ const tempAssistantId = get().optimisticCreateTmpMessage({
128
128
  content: LOADING_FLAT,
129
129
  role: 'assistant',
130
130
  sessionId: activeId,
@@ -159,7 +159,7 @@ export const conversationLifecycle: StateCreator<
159
159
  newTopic: shouldCreateNewTopic
160
160
  ? {
161
161
  topicMessageIds: messages.map((m) => m.id),
162
- title: t('defaultTitle', { ns: 'topic' }),
162
+ title: message.slice(0, 10) || t('defaultTitle', { ns: 'topic' }),
163
163
  }
164
164
  : undefined,
165
165
  sessionId: activeId === INBOX_SESSION_ID ? undefined : activeId,
@@ -200,7 +200,7 @@ export const conversationLifecycle: StateCreator<
200
200
  // remove temporally message
201
201
  if (data?.isCreateNewTopic) {
202
202
  get().internal_dispatchMessage(
203
- { type: 'deleteMessage', id: tempId },
203
+ { type: 'deleteMessages', ids: [tempId, tempAssistantId] },
204
204
  { topicId: activeTopicId, sessionId: activeId },
205
205
  );
206
206
  }
@@ -249,6 +249,8 @@ export const conversationLifecycle: StateCreator<
249
249
  messages: displayMessages,
250
250
  parentMessageId: data.assistantMessageId,
251
251
  parentMessageType: 'assistant',
252
+ sessionId: activeId,
253
+ topicId: data.topicId ?? activeTopicId,
252
254
  ragQuery: get().internal_shouldUseRAG() ? message : undefined,
253
255
  threadId: activeThreadId,
254
256
  skipCreateFirstMessage: true,
@@ -305,6 +307,8 @@ export const conversationLifecycle: StateCreator<
305
307
  messages: contextMessages,
306
308
  parentMessageId: id,
307
309
  parentMessageType: 'user',
310
+ sessionId: get().activeId,
311
+ topicId: get().activeTopicId,
308
312
  traceId,
309
313
  ragQuery: get().internal_shouldUseRAG() ? item.content : undefined,
310
314
  threadId: activeThreadId,
@@ -360,6 +364,8 @@ export const conversationLifecycle: StateCreator<
360
364
  messages: chats,
361
365
  parentMessageId: id,
362
366
  parentMessageType: message.role as 'assistant' | 'tool' | 'user',
367
+ sessionId: get().activeId,
368
+ topicId: get().activeTopicId,
363
369
  });
364
370
  } finally {
365
371
  // Remove message from continuing state
@@ -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
  }