@lobehub/lobehub 2.0.0-next.72 → 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 (337) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/changelog/v1.json +9 -0
  3. package/next.config.ts +5 -5
  4. package/package.json +1 -1
  5. package/scripts/prebuild.mts +1 -1
  6. package/src/app/(backend)/trpc/desktop/[trpc]/route.ts +6 -6
  7. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/UserBanner.test.tsx +7 -4
  8. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +4 -4
  9. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +5 -6
  10. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/useCategory.tsx +5 -8
  11. package/src/app/[variants]/(main)/(mobile)/me/(home)/index.tsx +25 -0
  12. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +13 -16
  13. package/src/app/[variants]/(main)/(mobile)/me/profile/features/Category.tsx +6 -6
  14. package/src/app/[variants]/(main)/(mobile)/me/profile/features/Header.tsx +3 -3
  15. package/src/app/[variants]/(main)/(mobile)/me/profile/index.tsx +16 -0
  16. package/src/app/[variants]/(main)/(mobile)/me/profile/layout.tsx +9 -11
  17. package/src/app/[variants]/(main)/(mobile)/me/settings/features/Header.tsx +3 -3
  18. package/src/app/[variants]/(main)/(mobile)/me/settings/features/useCategory.tsx +3 -4
  19. package/src/app/[variants]/(main)/(mobile)/me/settings/index.tsx +16 -0
  20. package/src/app/[variants]/(main)/(mobile)/me/settings/layout.tsx +15 -13
  21. package/src/app/[variants]/(main)/changelog/_layout/Desktop/index.tsx +6 -5
  22. package/src/app/[variants]/(main)/changelog/_layout/Mobile/Header.tsx +3 -3
  23. package/src/app/[variants]/(main)/changelog/_layout/Mobile/index.tsx +5 -5
  24. package/src/app/[variants]/(main)/changelog/features/Post.tsx +7 -4
  25. package/src/app/[variants]/(main)/changelog/index.tsx +55 -0
  26. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +6 -7
  27. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +3 -3
  28. package/src/app/[variants]/(main)/chat/components/WorkspaceLayout.tsx +1 -14
  29. package/src/app/[variants]/(main)/chat/components/conversation/features/ChatHydration/index.tsx +2 -2
  30. package/src/app/[variants]/(main)/chat/components/conversation/features/ChatInput/Desktop/MessageFromUrl.tsx +11 -13
  31. package/src/app/[variants]/(main)/chat/components/conversation/features/ChatInput/Desktop/index.tsx +0 -1
  32. package/src/app/[variants]/(main)/chat/components/conversation/features/ThreadHydration.tsx +2 -2
  33. package/src/app/[variants]/(main)/chat/components/topic/features/Topic/TopicListContent/TopicItem/TopicContent.tsx +20 -11
  34. package/src/app/[variants]/(main)/chat/features/PageTitle/index.tsx +1 -2
  35. package/src/app/[variants]/(main)/chat/index.tsx +29 -0
  36. package/src/app/[variants]/(main)/chat/session/features/SessionHydration.tsx +8 -6
  37. package/src/app/[variants]/(main)/chat/session/features/SessionListContent/Inbox/index.tsx +2 -4
  38. package/src/app/[variants]/(main)/chat/session/features/SessionListContent/List/index.tsx +1 -1
  39. package/src/app/[variants]/(main)/chat/session/layout/Mobile/SessionHeader.tsx +3 -3
  40. package/src/app/[variants]/(main)/chat/settings/_layout/Desktop/Header.tsx +3 -3
  41. package/src/app/[variants]/(main)/chat/settings/_layout/Mobile/Header.tsx +3 -3
  42. package/src/app/[variants]/(main)/chat/settings/features/PublishResultModal/index.tsx +3 -3
  43. package/src/app/[variants]/(main)/chat/{components/SettingsPage.tsx → settings/index.tsx} +6 -35
  44. package/src/app/[variants]/(main)/components/Link.tsx +21 -0
  45. package/src/app/[variants]/(main)/discover/(detail)/_layout/{Desktop.tsx → Desktop/index.tsx} +15 -7
  46. package/src/app/[variants]/(main)/discover/(detail)/_layout/Mobile/index.tsx +3 -3
  47. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/Block.tsx +1 -1
  48. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Overview/index.tsx +1 -1
  49. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Related/index.tsx +2 -2
  50. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/SystemRole/index.tsx +3 -3
  51. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Versions/index.tsx +4 -4
  52. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/index.tsx +1 -1
  53. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Header.tsx +2 -2
  54. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/ActionButton/AddAgent.tsx +3 -3
  55. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/ActionButton/index.tsx +1 -1
  56. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/Related/index.tsx +1 -1
  57. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/TocList/index.tsx +2 -2
  58. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/StatusPage/index.tsx +3 -3
  59. package/src/app/[variants]/(main)/discover/(detail)/assistant/{AssistantDetailPage.tsx → index.tsx} +18 -11
  60. package/src/app/[variants]/(main)/discover/(detail)/features/Breadcrumb.tsx +1 -1
  61. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Details/Related/index.tsx +2 -2
  62. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Details/Versions/index.tsx +5 -5
  63. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Details/index.tsx +1 -1
  64. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/Related/index.tsx +2 -2
  65. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/ServerConfig.tsx +4 -4
  66. package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/TocList/index.tsx +2 -2
  67. package/src/app/[variants]/(main)/discover/(detail)/mcp/{McpDetailPage.tsx → index.tsx} +15 -7
  68. package/src/app/[variants]/(main)/discover/(detail)/mcp/loading.tsx +1 -0
  69. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Overview/index.tsx +1 -1
  70. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Parameter/ParameterItem.tsx +1 -1
  71. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Related/index.tsx +2 -2
  72. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/index.tsx +1 -1
  73. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Header.tsx +1 -1
  74. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/ActionButton/ChatWithModel.tsx +3 -3
  75. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/ActionButton/index.tsx +1 -1
  76. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/Related/index.tsx +2 -2
  77. package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/RelatedProviders/index.tsx +1 -1
  78. package/src/app/[variants]/(main)/discover/(detail)/model/{ModelDetailPage.tsx → index.tsx} +17 -10
  79. package/src/app/[variants]/(main)/discover/(detail)/model/loading.tsx +1 -0
  80. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Related/index.tsx +2 -2
  81. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/index.tsx +1 -1
  82. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/ActionButton/ProviderConfig.tsx +5 -4
  83. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/ActionButton/index.tsx +1 -1
  84. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/Related/index.tsx +2 -2
  85. package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/RelatedModels/index.tsx +1 -1
  86. package/src/app/[variants]/(main)/discover/(detail)/provider/{ProviderDetailPage.tsx → index.tsx} +17 -10
  87. package/src/app/[variants]/(main)/discover/(detail)/provider/loading.tsx +1 -0
  88. package/src/app/[variants]/(main)/discover/(list)/(home)/{HomePage.tsx → index.tsx} +14 -0
  89. package/src/app/[variants]/(main)/discover/(list)/_layout/Desktop/Nav.tsx +2 -3
  90. package/src/app/[variants]/(main)/discover/(list)/_layout/Desktop/index.tsx +4 -3
  91. package/src/app/[variants]/(main)/discover/(list)/_layout/Mobile/Nav.tsx +3 -4
  92. package/src/app/[variants]/(main)/discover/(list)/_layout/Mobile/index.tsx +4 -3
  93. package/src/app/[variants]/(main)/discover/(list)/assistant/_layout/Desktop.tsx +3 -4
  94. package/src/app/[variants]/(main)/discover/(list)/assistant/_layout/Mobile.tsx +3 -3
  95. package/src/app/[variants]/(main)/discover/(list)/assistant/features/List/Item.tsx +2 -2
  96. package/src/app/[variants]/(main)/discover/(list)/assistant/{AssistantPage.tsx → index.tsx} +18 -4
  97. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +2 -2
  98. package/src/app/[variants]/(main)/discover/(list)/mcp/_layout/Desktop.tsx +3 -3
  99. package/src/app/[variants]/(main)/discover/(list)/mcp/_layout/Mobile.tsx +3 -3
  100. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -1
  101. package/src/app/[variants]/(main)/discover/(list)/mcp/{McpPage.tsx → index.tsx} +9 -2
  102. package/src/app/[variants]/(main)/discover/(list)/model/_layout/Desktop.tsx +3 -3
  103. package/src/app/[variants]/(main)/discover/(list)/model/_layout/Mobile.tsx +3 -3
  104. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -1
  105. package/src/app/[variants]/(main)/discover/(list)/model/{ModelPage.tsx → index.tsx} +9 -2
  106. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -1
  107. package/src/app/[variants]/(main)/discover/(list)/provider/{Client.tsx → index.tsx} +9 -2
  108. package/src/app/[variants]/(main)/discover/_layout/Desktop/index.tsx +4 -4
  109. package/src/app/[variants]/(main)/discover/_layout/Mobile/index.tsx +3 -3
  110. package/src/app/[variants]/(main)/discover/components/Title.tsx +1 -1
  111. package/src/app/[variants]/(main)/discover/features/Search.tsx +2 -2
  112. package/src/app/[variants]/(main)/discover/features/useNav.tsx +11 -12
  113. package/src/app/[variants]/(main)/hooks/useActiveTabKey.ts +40 -0
  114. package/src/app/[variants]/(main)/hooks/usePathname.ts +10 -0
  115. package/src/app/[variants]/(main)/hooks/useQuery.ts +12 -0
  116. package/src/app/[variants]/(main)/hooks/useRouter.ts +22 -0
  117. package/src/app/[variants]/(main)/hooks/useSearchParams.ts +11 -0
  118. package/src/app/[variants]/(main)/image/@menu/features/ConfigPanel/components/ModelSelect/index.tsx +5 -5
  119. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicUrlSync.tsx +1 -1
  120. package/src/app/[variants]/(main)/image/ComingSoon.tsx +15 -0
  121. package/src/app/[variants]/(main)/image/_layout/Desktop/index.tsx +5 -2
  122. package/src/app/[variants]/(main)/image/_layout/DesktopWrapper.tsx +15 -0
  123. package/src/app/[variants]/(main)/image/_layout/Mobile/index.tsx +3 -1
  124. package/src/app/[variants]/(main)/image/features/ImageWorkspace/index.tsx +1 -2
  125. package/src/app/[variants]/(main)/image/index.tsx +18 -0
  126. package/src/app/[variants]/(main)/knowledge/_layout/Desktop.tsx +17 -0
  127. package/src/app/[variants]/(main)/knowledge/_layout/Mobile.tsx +17 -0
  128. package/src/app/[variants]/(main)/knowledge/components/KnowledgeBaseItem/index.tsx +1 -1
  129. package/src/app/[variants]/(main)/knowledge/components/modal/ModalPageClient.tsx +4 -4
  130. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeBaseDetail/index.tsx +5 -8
  131. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeBaseDetail/menu/Head.tsx +1 -1
  132. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeHome/menu/CategoryMenu.tsx +2 -2
  133. package/src/app/[variants]/(main)/knowledge/routes/KnowledgeHome/menu/KnowledgeBase.tsx +1 -1
  134. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/DesktopLayoutContainer.tsx +3 -2
  135. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/BottomActions.tsx +4 -4
  136. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/TopActions.test.tsx +9 -9
  137. package/src/app/[variants]/(main)/layouts/desktop/SideBar/TopActions.tsx +117 -0
  138. package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/index.tsx +9 -4
  139. package/src/app/[variants]/(main)/layouts/index.tsx +11 -0
  140. package/src/app/[variants]/(main)/{_layout/Mobile → layouts/mobile}/NavBar.tsx +5 -5
  141. package/src/app/[variants]/(main)/{_layout/Mobile → layouts/mobile}/index.tsx +10 -7
  142. package/src/app/[variants]/(main)/profile/(home)/desktop.tsx +26 -0
  143. package/src/app/[variants]/(main)/profile/(home)/index.tsx +26 -0
  144. package/src/app/[variants]/(main)/profile/@category/features/CategoryContent.tsx +5 -7
  145. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +3 -2
  146. package/src/app/[variants]/(main)/profile/_layout/DesktopWrapper.tsx +14 -0
  147. package/src/app/[variants]/(main)/profile/_layout/Mobile/Header.tsx +3 -3
  148. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +4 -3
  149. package/src/app/[variants]/(main)/profile/apikey/index.tsx +18 -0
  150. package/src/app/[variants]/(main)/profile/hooks/useCategory.tsx +6 -6
  151. package/src/app/[variants]/(main)/profile/security/index.tsx +29 -0
  152. package/src/app/[variants]/(main)/profile/stats/features/AssistantsRank.tsx +4 -4
  153. package/src/app/[variants]/(main)/profile/stats/features/TopicsRank.tsx +4 -4
  154. package/src/app/[variants]/(main)/profile/stats/index.tsx +20 -0
  155. package/src/app/[variants]/(main)/profile/usage/features/UsageTable.tsx +7 -9
  156. package/src/app/[variants]/(main)/profile/usage/index.tsx +13 -0
  157. package/src/app/[variants]/(main)/settings/_layout/Desktop/Header.tsx +2 -2
  158. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +2 -2
  159. package/src/app/[variants]/(main)/settings/_layout/DesktopWrapper.tsx +23 -0
  160. package/src/app/[variants]/(main)/settings/_layout/Mobile/Header.tsx +8 -7
  161. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +2 -5
  162. package/src/app/[variants]/(main)/settings/_layout/MobileWrapper.tsx +23 -0
  163. package/src/app/[variants]/(main)/settings/agent/AgentMenu/Menu.tsx +2 -4
  164. package/src/app/[variants]/(main)/settings/agent/index.tsx +2 -4
  165. package/src/app/[variants]/(main)/settings/provider/(list)/index.tsx +2 -3
  166. package/src/app/[variants]/(main)/settings/provider/ProviderMenu/All.tsx +2 -2
  167. package/src/app/[variants]/(main)/settings/provider/ProviderMenu/Item.tsx +38 -37
  168. package/src/app/[variants]/(main)/settings/provider/_layout/Mobile.tsx +2 -2
  169. package/src/app/[variants]/(main)/settings/provider/features/CreateNewProvider/index.tsx +3 -3
  170. package/src/app/[variants]/(main)/settings/provider/features/ProviderConfig/UpdateProviderInfo/SettingModal.tsx +3 -3
  171. package/src/app/[variants]/DesktopRouter.tsx +40 -0
  172. package/src/app/[variants]/MobileRouter.tsx +41 -0
  173. package/src/app/[variants]/desktopRouter.config.tsx +381 -0
  174. package/src/app/[variants]/layout.tsx +1 -3
  175. package/src/app/[variants]/loaders/routeParams.ts +45 -0
  176. package/src/app/[variants]/loading/Server/Redirect.tsx +1 -1
  177. package/src/app/[variants]/mobileRouter.config.tsx +412 -0
  178. package/src/app/[variants]/page.tsx +16 -6
  179. package/src/app/desktop/devtools/page.tsx +1 -1
  180. package/src/app/desktop/layout.tsx +1 -1
  181. package/src/components/BootErrorBoundary/index.tsx +129 -0
  182. package/src/components/mdx/constants.ts +1 -0
  183. package/src/features/ChangelogModal/index.tsx +3 -3
  184. package/src/features/KnowledgeManager/FileExplorer/index.tsx +4 -4
  185. package/src/features/KnowledgeManager/Header/FilesSearchBar.tsx +1 -1
  186. package/src/features/User/UserPanel/PanelContent.tsx +4 -3
  187. package/src/features/User/UserPanel/useMenu.tsx +20 -14
  188. package/src/features/User/__tests__/PanelContent.test.tsx +13 -7
  189. package/src/hooks/useDiscoverTab.ts +2 -2
  190. package/src/hooks/useInterceptingRoutes.test.ts +23 -26
  191. package/src/hooks/useInterceptingRoutes.ts +5 -4
  192. package/src/hooks/usePinnedAgentState.ts +6 -6
  193. package/src/hooks/useQuery.ts +5 -0
  194. package/src/hooks/useQueryParam.ts +322 -0
  195. package/src/hooks/useQueryRoute.test.ts +2 -12
  196. package/src/hooks/useQueryRoute.ts +5 -5
  197. package/src/hooks/useShowMobileWorkspace.ts +1 -1
  198. package/src/hooks/useSwitchSession.ts +4 -3
  199. package/src/layout/GlobalProvider/ImportSettings.tsx +22 -9
  200. package/src/layout/GlobalProvider/StoreInitialization.tsx +9 -1
  201. package/src/proxy.ts +13 -1
  202. package/src/services/message/index.ts +11 -2
  203. package/src/store/chat/agents/createAgentExecutors.ts +31 -16
  204. package/src/store/chat/slices/aiChat/actions/__tests__/streamingExecutor.test.ts +218 -0
  205. package/src/store/chat/slices/aiChat/actions/conversationControl.ts +4 -0
  206. package/src/store/chat/slices/aiChat/actions/conversationLifecycle.ts +9 -3
  207. package/src/store/chat/slices/aiChat/actions/streamingExecutor.ts +142 -61
  208. package/src/store/chat/slices/builtinTool/actions/__tests__/search.test.ts +204 -10
  209. package/src/store/chat/slices/builtinTool/actions/search.ts +51 -26
  210. package/src/store/chat/slices/message/action.test.ts +182 -33
  211. package/src/store/chat/slices/message/actions/optimisticUpdate.ts +79 -36
  212. package/src/store/chat/slices/message/actions/query.ts +7 -5
  213. package/src/store/chat/slices/message/selectors/dbMessage.ts +11 -4
  214. package/src/store/chat/slices/plugin/action.test.ts +257 -54
  215. package/src/store/chat/slices/plugin/actions/optimisticUpdate.ts +63 -26
  216. package/src/store/chat/slices/plugin/actions/pluginTypes.ts +52 -19
  217. package/src/store/chat/slices/plugin/actions/publicApi.ts +6 -1
  218. package/src/store/chat/slices/plugin/actions/workflow.ts +17 -6
  219. package/src/store/chat/slices/thread/action.ts +2 -0
  220. package/src/store/global/action.test.ts +3 -3
  221. package/src/store/global/actions/workspacePane.ts +2 -1
  222. package/src/store/global/initialState.ts +10 -2
  223. package/src/store/user/slices/common/action.ts +4 -0
  224. package/src/app/[variants]/(main)/(mobile)/me/(home)/loading.tsx +0 -38
  225. package/src/app/[variants]/(main)/(mobile)/me/(home)/page.tsx +0 -40
  226. package/src/app/[variants]/(main)/(mobile)/me/profile/loading.tsx +0 -5
  227. package/src/app/[variants]/(main)/(mobile)/me/profile/page.tsx +0 -30
  228. package/src/app/[variants]/(main)/(mobile)/me/settings/loading.tsx +0 -5
  229. package/src/app/[variants]/(main)/(mobile)/me/settings/page.tsx +0 -30
  230. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +0 -106
  231. package/src/app/[variants]/(main)/changelog/layout.tsx +0 -10
  232. package/src/app/[variants]/(main)/changelog/modal/page.tsx +0 -23
  233. package/src/app/[variants]/(main)/changelog/page.tsx +0 -78
  234. package/src/app/[variants]/(main)/chat/ChatRouter.tsx +0 -83
  235. package/src/app/[variants]/(main)/chat/_layout/ChatLayout.tsx +0 -22
  236. package/src/app/[variants]/(main)/chat/components/MainChatPage.tsx +0 -25
  237. package/src/app/[variants]/(main)/chat/error.tsx +0 -3
  238. package/src/app/[variants]/(main)/chat/layout.tsx +0 -10
  239. package/src/app/[variants]/(main)/chat/loading.tsx +0 -3
  240. package/src/app/[variants]/(main)/chat/not-found.tsx +0 -1
  241. package/src/app/[variants]/(main)/chat/page.tsx +0 -12
  242. package/src/app/[variants]/(main)/chat/settings/error.tsx +0 -3
  243. package/src/app/[variants]/(main)/chat/settings/loading.tsx +0 -3
  244. package/src/app/[variants]/(main)/chat/settings/not-found.tsx +0 -1
  245. package/src/app/[variants]/(main)/discover/(detail)/_layout/DetailLayout.tsx +0 -22
  246. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/Client.tsx +0 -51
  247. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/Client.tsx +0 -43
  248. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/loading.tsx +0 -1
  249. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/Client.tsx +0 -40
  250. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/loading.tsx +0 -1
  251. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/Client.tsx +0 -40
  252. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/loading.tsx +0 -1
  253. package/src/app/[variants]/(main)/discover/(list)/_layout/ListLayout.tsx +0 -22
  254. package/src/app/[variants]/(main)/discover/(list)/assistant/AssistantLayout.tsx +0 -21
  255. package/src/app/[variants]/(main)/discover/(list)/mcp/Client.tsx +0 -44
  256. package/src/app/[variants]/(main)/discover/(list)/mcp/McpLayout.tsx +0 -21
  257. package/src/app/[variants]/(main)/discover/(list)/model/Client.tsx +0 -44
  258. package/src/app/[variants]/(main)/discover/(list)/model/ModelLayout.tsx +0 -21
  259. package/src/app/[variants]/(main)/discover/(list)/provider/ProviderPage.tsx +0 -43
  260. package/src/app/[variants]/(main)/discover/DiscoverRouter.tsx +0 -170
  261. package/src/app/[variants]/(main)/discover/[[...path]]/page.tsx +0 -12
  262. package/src/app/[variants]/(main)/discover/_layout/DiscoverLayout.tsx +0 -22
  263. package/src/app/[variants]/(main)/discover/error.tsx +0 -3
  264. package/src/app/[variants]/(main)/discover/not-found.tsx +0 -1
  265. package/src/app/[variants]/(main)/error.tsx +0 -3
  266. package/src/app/[variants]/(main)/image/layout.tsx +0 -15
  267. package/src/app/[variants]/(main)/image/page.tsx +0 -45
  268. package/src/app/[variants]/(main)/knowledge/KnowledgeRouter.tsx +0 -74
  269. package/src/app/[variants]/(main)/knowledge/[[...path]]/page.tsx +0 -12
  270. package/src/app/[variants]/(main)/knowledge/components/modal/page.tsx +0 -13
  271. package/src/app/[variants]/(main)/knowledge/layout.tsx +0 -12
  272. package/src/app/[variants]/(main)/layout.tsx +0 -10
  273. package/src/app/[variants]/(main)/not-found.tsx +0 -1
  274. package/src/app/[variants]/(main)/profile/apikey/page.tsx +0 -32
  275. package/src/app/[variants]/(main)/profile/error.tsx +0 -3
  276. package/src/app/[variants]/(main)/profile/layout.tsx +0 -11
  277. package/src/app/[variants]/(main)/profile/loading.tsx +0 -3
  278. package/src/app/[variants]/(main)/profile/not-found.tsx +0 -1
  279. package/src/app/[variants]/(main)/profile/security/page.tsx +0 -28
  280. package/src/app/[variants]/(main)/profile/stats/page.tsx +0 -23
  281. package/src/app/[variants]/(main)/profile/usage/page.tsx +0 -23
  282. package/src/app/[variants]/@modal/(.)changelog/modal/features/Cover.tsx +0 -48
  283. package/src/app/[variants]/@modal/(.)changelog/modal/features/Hero.tsx +0 -29
  284. package/src/app/[variants]/@modal/(.)changelog/modal/features/Post.tsx +0 -57
  285. package/src/app/[variants]/@modal/(.)changelog/modal/features/PublishedTime.tsx +0 -50
  286. package/src/app/[variants]/@modal/(.)changelog/modal/features/ReadDetail.tsx +0 -72
  287. package/src/app/[variants]/@modal/(.)changelog/modal/features/VersionTag.tsx +0 -26
  288. package/src/app/[variants]/@modal/(.)changelog/modal/layout.tsx +0 -41
  289. package/src/app/[variants]/@modal/(.)changelog/modal/loading.tsx +0 -10
  290. package/src/app/[variants]/@modal/(.)changelog/modal/page.tsx +0 -38
  291. package/src/app/[variants]/@modal/_layout/ModalLayout.tsx +0 -63
  292. package/src/app/[variants]/@modal/_layout/SettingModalLayout.tsx +0 -71
  293. package/src/app/[variants]/@modal/default.tsx +0 -3
  294. package/src/app/[variants]/@modal/error.tsx +0 -3
  295. package/src/app/[variants]/@modal/layout.tsx +0 -7
  296. package/src/app/[variants]/@modal/loading.tsx +0 -5
  297. /package/src/app/[variants]/{@modal/(.)changelog/modal → (main)/changelog}/features/Pagination.tsx +0 -0
  298. /package/src/app/[variants]/{@modal/(.)changelog/modal → (main)/changelog}/features/UpdateChangelogStatus.tsx +0 -0
  299. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/DetailProvider.tsx +0 -0
  300. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/Knowledge.tsx +0 -0
  301. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/KnowledgeItem.tsx +0 -0
  302. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/PluginItem.tsx +0 -0
  303. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/Plugins.tsx +0 -0
  304. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Capabilities/index.tsx +0 -0
  305. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Nav.tsx +0 -0
  306. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/Overview/TagList.tsx +0 -0
  307. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Details/SystemRole/TagList.tsx +0 -0
  308. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/Related/Item.tsx +0 -0
  309. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/Summary/index.tsx +0 -0
  310. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/features → features}/Sidebar/index.tsx +0 -0
  311. /package/src/app/[variants]/(main)/discover/(detail)/assistant/{[...slugs]/loading.tsx → loading.tsx} +0 -0
  312. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/ActionButton/index.tsx +0 -0
  313. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/ConnectionTypeAlert.tsx +0 -0
  314. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/Related/Item.tsx +0 -0
  315. /package/src/app/[variants]/(main)/discover/(detail)/mcp/{[slug]/features → features}/Sidebar/index.tsx +0 -0
  316. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/DetailProvider.tsx +0 -0
  317. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Nav.tsx +0 -0
  318. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Overview/ProviderList/index.tsx +0 -0
  319. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Details/Parameter/index.tsx +0 -0
  320. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/Related/Item.tsx +0 -0
  321. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/RelatedProviders/Item.tsx +0 -0
  322. /package/src/app/[variants]/(main)/discover/(detail)/model/{[...slugs]/features → features}/Sidebar/index.tsx +0 -0
  323. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/DetailProvider.tsx +0 -0
  324. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Guide/index.tsx +0 -0
  325. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Nav.tsx +0 -0
  326. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Overview/ModelList/index.tsx +0 -0
  327. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Details/Overview/index.tsx +0 -0
  328. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Header.tsx +0 -0
  329. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/Related/Item.tsx +0 -0
  330. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/RelatedModels/Item.tsx +0 -0
  331. /package/src/app/[variants]/(main)/discover/(detail)/provider/{[...slugs]/features → features}/Sidebar/index.tsx +0 -0
  332. /package/src/app/[variants]/(main)/labs/{page.tsx → index.tsx} +0 -0
  333. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/RegisterHotkeys.tsx +0 -0
  334. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/Avatar.test.tsx +0 -0
  335. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/Avatar.tsx +0 -0
  336. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/PinList/index.tsx +0 -0
  337. /package/src/app/[variants]/(main)/{_layout/Desktop → layouts/desktop}/SideBar/index.tsx +0 -0
@@ -13,7 +13,7 @@ import { useToolStore } from '@/store/tool';
13
13
  import { safeParseJSON } from '@/utils/safeParseJSON';
14
14
  import { setNamespace } from '@/utils/storeDebug';
15
15
 
16
- import { displayMessageSelectors } from '../../message/selectors';
16
+ import { dbMessageSelectors } from '../../message/selectors';
17
17
 
18
18
  const n = setNamespace('plugin');
19
19
 
@@ -94,17 +94,29 @@ export const pluginTypes: StateCreator<
94
94
 
95
95
  // if the plugin settings is not valid, then set the message with error type
96
96
  if (!result.valid) {
97
- const updateResult = await messageService.updateMessageError(id, {
98
- body: {
99
- error: result.errors,
100
- message: '[plugin] your settings is invalid with plugin manifest setting schema',
97
+ // Get message to extract sessionId/topicId
98
+ const message = dbMessageSelectors.getDbMessageById(id)(get());
99
+ const updateResult = await messageService.updateMessageError(
100
+ id,
101
+ {
102
+ body: {
103
+ error: result.errors,
104
+ message: '[plugin] your settings is invalid with plugin manifest setting schema',
105
+ },
106
+ message: t('response.PluginSettingsInvalid', { ns: 'error' }),
107
+ type: PluginErrorType.PluginSettingsInvalid as any,
101
108
  },
102
- message: t('response.PluginSettingsInvalid', { ns: 'error' }),
103
- type: PluginErrorType.PluginSettingsInvalid as any,
104
- });
109
+ {
110
+ sessionId: message?.sessionId,
111
+ topicId: message?.topicId,
112
+ },
113
+ );
105
114
 
106
115
  if (updateResult?.success && updateResult.messages) {
107
- get().replaceMessages(updateResult.messages);
116
+ get().replaceMessages(updateResult.messages, {
117
+ sessionId: message?.sessionId,
118
+ topicId: message?.topicId,
119
+ });
108
120
  }
109
121
  return;
110
122
  }
@@ -120,6 +132,9 @@ export const pluginTypes: StateCreator<
120
132
  } = get();
121
133
  let data: MCPToolCallResult | undefined;
122
134
 
135
+ // Get message to extract sessionId/topicId
136
+ const message = dbMessageSelectors.getDbMessageById(id)(get());
137
+
123
138
  try {
124
139
  const abortController = internal_togglePluginApiCalling(
125
140
  true,
@@ -140,9 +155,15 @@ export const pluginTypes: StateCreator<
140
155
 
141
156
  // ignore the aborted request error
142
157
  if (!err.message.includes('The user aborted a request.')) {
143
- const result = await messageService.updateMessageError(id, error as any);
158
+ const result = await messageService.updateMessageError(id, error as any, {
159
+ sessionId: message?.sessionId,
160
+ topicId: message?.topicId,
161
+ });
144
162
  if (result?.success && result.messages) {
145
- get().replaceMessages(result.messages);
163
+ get().replaceMessages(result.messages, {
164
+ sessionId: message?.sessionId,
165
+ topicId: message?.topicId,
166
+ });
146
167
  }
147
168
  }
148
169
  }
@@ -153,11 +174,13 @@ export const pluginTypes: StateCreator<
153
174
 
154
175
  if (!data) return;
155
176
 
177
+ const context = { sessionId: message?.sessionId, topicId: message?.topicId };
178
+
156
179
  await Promise.all([
157
- optimisticUpdateMessageContent(id, data.content),
180
+ optimisticUpdateMessageContent(id, data.content, undefined, context),
158
181
  (async () => {
159
- if (data.success) await optimisticUpdatePluginState(id, data.state);
160
- else await optimisticUpdateMessagePluginError(id, data.error);
182
+ if (data.success) await optimisticUpdatePluginState(id, data.state, context);
183
+ else await optimisticUpdateMessagePluginError(id, data.error, context);
161
184
  })(),
162
185
  ]);
163
186
 
@@ -168,6 +191,9 @@ export const pluginTypes: StateCreator<
168
191
  const { optimisticUpdateMessageContent, internal_togglePluginApiCalling } = get();
169
192
  let data: string;
170
193
 
194
+ // Get message to extract sessionId/topicId
195
+ const message = dbMessageSelectors.getDbMessageById(id)(get());
196
+
171
197
  try {
172
198
  const abortController = internal_togglePluginApiCalling(
173
199
  true,
@@ -175,8 +201,6 @@ export const pluginTypes: StateCreator<
175
201
  n('fetchPlugin/start') as string,
176
202
  );
177
203
 
178
- const message = displayMessageSelectors.getDisplayMessageById(id)(get());
179
-
180
204
  const res = await chatService.runPluginApi(payload, {
181
205
  signal: abortController?.signal,
182
206
  trace: { observationId: message?.observationId, traceId: message?.traceId },
@@ -193,9 +217,15 @@ export const pluginTypes: StateCreator<
193
217
 
194
218
  // ignore the aborted request error
195
219
  if (!err.message.includes('The user aborted a request.')) {
196
- const result = await messageService.updateMessageError(id, error as any);
220
+ const result = await messageService.updateMessageError(id, error as any, {
221
+ sessionId: message?.sessionId,
222
+ topicId: message?.topicId,
223
+ });
197
224
  if (result?.success && result.messages) {
198
- get().replaceMessages(result.messages);
225
+ get().replaceMessages(result.messages, {
226
+ sessionId: message?.sessionId,
227
+ topicId: message?.topicId,
228
+ });
199
229
  }
200
230
  }
201
231
 
@@ -206,7 +236,10 @@ export const pluginTypes: StateCreator<
206
236
  // 如果报错则结束了
207
237
  if (!data) return;
208
238
 
209
- await optimisticUpdateMessageContent(id, data);
239
+ await optimisticUpdateMessageContent(id, data, undefined, {
240
+ sessionId: message?.sessionId,
241
+ topicId: message?.topicId,
242
+ });
210
243
 
211
244
  return data;
212
245
  },
@@ -55,9 +55,14 @@ export const pluginPublicApi: StateCreator<
55
55
  const message = displayMessageSelectors.getDisplayMessageById(id)(get());
56
56
  if (!message || message.role !== 'tool' || !message.plugin) return;
57
57
 
58
+ const context = {
59
+ sessionId: message.sessionId,
60
+ topicId: message.topicId,
61
+ };
62
+
58
63
  // if there is error content, then clear the error
59
64
  if (!!message.pluginError) {
60
- get().optimisticUpdateMessagePluginError(id, null);
65
+ get().optimisticUpdateMessagePluginError(id, null, context);
61
66
  }
62
67
 
63
68
  const payload: ChatToolPayload = { ...message.plugin, id: message.tool_call_id! };
@@ -46,16 +46,22 @@ export const pluginWorkflow: StateCreator<
46
46
  PluginWorkflowAction
47
47
  > = (set, get) => ({
48
48
  createAssistantMessageByPlugin: async (content, parentId) => {
49
+ // Get parent message to extract sessionId/topicId
50
+ const parentMessage = dbMessageSelectors.getDbMessageById(parentId)(get());
51
+
49
52
  const newMessage: CreateMessageParams = {
50
53
  content,
51
54
  parentId,
52
55
  role: 'assistant',
53
- sessionId: get().activeId,
54
- topicId: get().activeTopicId, // if there is activeTopicId,then add it to topicId
56
+ sessionId: parentMessage?.sessionId ?? get().activeId,
57
+ topicId: parentMessage?.topicId !== undefined ? parentMessage.topicId : get().activeTopicId,
55
58
  };
56
59
 
57
60
  const result = await messageService.createMessage(newMessage);
58
- get().replaceMessages(result.messages);
61
+ get().replaceMessages(result.messages, {
62
+ sessionId: newMessage.sessionId,
63
+ topicId: newMessage.topicId,
64
+ });
59
65
  },
60
66
 
61
67
  triggerAIMessage: async ({ parentId, traceId, threadId, inPortalThread, inSearchWorkflow }) => {
@@ -69,6 +75,8 @@ export const pluginWorkflow: StateCreator<
69
75
  messages: chats,
70
76
  parentMessageId: parentId ?? chats.at(-1)!.id,
71
77
  parentMessageType: 'user',
78
+ sessionId: get().activeId,
79
+ topicId: get().activeTopicId,
72
80
  traceId,
73
81
  threadId,
74
82
  inPortalThread,
@@ -88,14 +96,17 @@ export const pluginWorkflow: StateCreator<
88
96
  parentId: assistantId,
89
97
  plugin: payload,
90
98
  role: 'tool',
91
- sessionId: get().activeId,
99
+ sessionId: message.sessionId ?? get().activeId,
92
100
  tool_call_id: payload.id,
93
101
  threadId,
94
- topicId: get().activeTopicId, // if there is activeTopicId,then add it to topicId
102
+ topicId: message.topicId !== undefined ? message.topicId : get().activeTopicId,
95
103
  groupId: message.groupId, // Propagate groupId from parent message for group chat
96
104
  };
97
105
 
98
- const result = await get().optimisticCreateMessage(toolMessage);
106
+ const result = await get().optimisticCreateMessage(toolMessage, {
107
+ sessionId: toolMessage.sessionId,
108
+ topicId: toolMessage.topicId,
109
+ });
99
110
  if (!result) return;
100
111
 
101
112
  // trigger the plugin call
@@ -176,6 +176,8 @@ export const chatThreadMessage: StateCreator<
176
176
  messages,
177
177
  parentMessageId,
178
178
  parentMessageType: 'user',
179
+ sessionId: get().activeId,
180
+ topicId: get().activeTopicId,
179
181
  ragQuery: get().internal_shouldUseRAG() ? message : undefined,
180
182
  threadId: get().portalThreadId,
181
183
  inPortalThread: true,
@@ -266,14 +266,14 @@ describe('createPreferenceSlice', () => {
266
266
  it('should switch back to chat', () => {
267
267
  const { result } = renderHook(() => useGlobalStore());
268
268
  const sessionId = 'session-id';
269
- const router = { push: vi.fn() } as any;
269
+ const navigate = vi.fn();
270
270
 
271
271
  act(() => {
272
- useGlobalStore.setState({ router });
272
+ useGlobalStore.setState({ navigate });
273
273
  result.current.switchBackToChat(sessionId);
274
274
  });
275
275
 
276
- expect(router.push).toHaveBeenCalledWith('/chat?session=session-id');
276
+ expect(navigate).toHaveBeenCalledWith('/chat?session=session-id');
277
277
  });
278
278
  });
279
279
 
@@ -28,7 +28,8 @@ export const globalWorkspaceSlice: StateCreator<
28
28
  GlobalWorkspacePaneAction
29
29
  > = (set, get) => ({
30
30
  switchBackToChat: (sessionId) => {
31
- get().router?.push(SESSION_CHAT_URL(sessionId || INBOX_SESSION_ID, get().isMobile));
31
+ const target = SESSION_CHAT_URL(sessionId || INBOX_SESSION_ID, get().isMobile);
32
+ get().navigate?.(target);
32
33
  },
33
34
 
34
35
  toggleAgentSystemRoleExpand: (agentId, expanded) => {
@@ -1,5 +1,5 @@
1
1
  import type { ThemeMode } from 'antd-style';
2
- import { AppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime';
2
+ import type { NavigateFunction } from 'react-router-dom';
3
3
 
4
4
  import { DatabaseLoadingState, MigrationSQL, MigrationTableItem } from '@/types/clientDB';
5
5
  import { LocaleMode } from '@/types/locale';
@@ -11,6 +11,7 @@ export enum SidebarTabKey {
11
11
  Discover = 'discover',
12
12
  Files = 'knowledge',
13
13
  Image = 'image',
14
+ Knowledge = 'knowledge',
14
15
  Me = 'me',
15
16
  Setting = 'settings',
16
17
  }
@@ -121,10 +122,16 @@ export interface GlobalState {
121
122
  * 启动时为 Idle,完成为 Ready,报错为 Error
122
123
  */
123
124
  initClientDBStage: DatabaseLoadingState;
125
+ /**
126
+ * 应用水合状态标志
127
+ * 用于指示客户端状态是否已从 StoreInitialization 完成加载
128
+ * 默认为 false,StoreInitialization 完成后设置为 true
129
+ */
130
+ isAppHydrated: boolean;
124
131
  isMobile?: boolean;
125
132
  isStatusInit?: boolean;
126
133
  latestVersion?: string;
127
- router?: AppRouterInstance;
134
+ navigate?: NavigateFunction;
128
135
  sidebarKey: SidebarTabKey;
129
136
  status: SystemStatus;
130
137
  statusStorage: AsyncLocalStorage<SystemStatus>;
@@ -163,6 +170,7 @@ export const INITIAL_STATUS = {
163
170
 
164
171
  export const initialState: GlobalState = {
165
172
  initClientDBStage: DatabaseLoadingState.Idle,
173
+ isAppHydrated: false,
166
174
  isMobile: false,
167
175
  isStatusInit: false,
168
176
  sidebarKey: SidebarTabKey.Chat,
@@ -30,6 +30,7 @@ export interface CommonAction {
30
30
  isLogin: boolean | undefined,
31
31
  serverConfig: GlobalServerConfig,
32
32
  options?: {
33
+ onError?: (error: any) => void;
33
34
  onSuccess: (data: UserInitializationState) => void;
34
35
  },
35
36
  ) => SWRResponse;
@@ -75,6 +76,9 @@ export const createCommonSlice: StateCreator<
75
76
  !!isLogin ? GET_USER_STATE_KEY : null,
76
77
  () => userService.getUserState(),
77
78
  {
79
+ onError: (error) => {
80
+ options?.onError?.(error);
81
+ },
78
82
  onSuccess: (data) => {
79
83
  options?.onSuccess?.(data);
80
84
 
@@ -1,38 +0,0 @@
1
- 'use client';
2
-
3
- import { Skeleton } from 'antd';
4
- import { memo } from 'react';
5
- import { Flexbox } from 'react-layout-kit';
6
-
7
- import Divider from '@/components/Cell/Divider';
8
- import SkeletonLoading from '@/components/Loading/SkeletonLoading';
9
-
10
- const Loading = memo(() => {
11
- return (
12
- <>
13
- <Flexbox align={'center'} gap={12} horizontal paddingBlock={12} paddingInline={12}>
14
- <Skeleton.Avatar active shape={'circle'} size={48} />
15
- <Skeleton.Button active block />
16
- </Flexbox>
17
- <Flexbox gap={4} horizontal paddingBlock={12} paddingInline={16}>
18
- <Skeleton.Button active block />
19
- <Skeleton.Button active block />
20
- <Skeleton.Button active block />
21
- </Flexbox>
22
- <Divider />
23
- <SkeletonLoading
24
- active
25
- paragraph={{ rows: 6, style: { marginBottom: 0 }, width: '100%' }}
26
- title={false}
27
- />
28
- <Divider />
29
- <SkeletonLoading
30
- active
31
- paragraph={{ rows: 3, style: { marginBottom: 0 }, width: '100%' }}
32
- title={false}
33
- />
34
- </>
35
- );
36
- });
37
-
38
- export default Loading;
@@ -1,40 +0,0 @@
1
- import { redirect } from 'next/navigation';
2
- import { Center } from 'react-layout-kit';
3
-
4
- import BrandWatermark from '@/components/BrandWatermark';
5
- import { metadataModule } from '@/server/metadata';
6
- import { translation } from '@/server/translation';
7
- import { DynamicLayoutProps } from '@/types/next';
8
- import { RouteVariants } from '@/utils/server/routeVariants';
9
-
10
- import Category from './features/Category';
11
- import UserBanner from './features/UserBanner';
12
-
13
- export const generateMetadata = async (props: DynamicLayoutProps) => {
14
- const locale = await RouteVariants.getLocale(props);
15
- const { t } = await translation('common', locale);
16
- return metadataModule.generate({
17
- title: t('tab.me'),
18
- url: '/me',
19
- });
20
- };
21
-
22
- const Page = async (props: DynamicLayoutProps) => {
23
- const isMobile = await RouteVariants.getIsMobile(props);
24
-
25
- if (!isMobile) return redirect('/chat');
26
-
27
- return (
28
- <>
29
- <UserBanner />
30
- <Category />
31
- <Center padding={16}>
32
- <BrandWatermark />
33
- </Center>
34
- </>
35
- );
36
- };
37
-
38
- Page.displayName = 'Me';
39
-
40
- export default Page;
@@ -1,5 +0,0 @@
1
- import SkeletonLoading from '@/components/Loading/SkeletonLoading';
2
-
3
- export default () => {
4
- return <SkeletonLoading paragraph={{ rows: 8 }} />;
5
- };
@@ -1,30 +0,0 @@
1
- import { redirect } from 'next/navigation';
2
-
3
- import { metadataModule } from '@/server/metadata';
4
- import { translation } from '@/server/translation';
5
- import { DynamicLayoutProps } from '@/types/next';
6
- import { RouteVariants } from '@/utils/server/routeVariants';
7
-
8
- import Category from './features/Category';
9
-
10
- export const generateMetadata = async (props: DynamicLayoutProps) => {
11
- const locale = await RouteVariants.getLocale(props);
12
- const { t } = await translation('auth', locale);
13
- return metadataModule.generate({
14
- description: t('header.desc'),
15
- title: t('header.title'),
16
- url: '/me/profile',
17
- });
18
- };
19
-
20
- const Page = async (props: DynamicLayoutProps) => {
21
- const isMobile = await RouteVariants.getIsMobile(props);
22
-
23
- if (!isMobile) return redirect('/profile');
24
-
25
- return <Category />;
26
- };
27
-
28
- Page.displayName = 'MeProfile';
29
-
30
- export default Page;
@@ -1,5 +0,0 @@
1
- import SkeletonLoading from '@/components/Loading/SkeletonLoading';
2
-
3
- export default () => {
4
- return <SkeletonLoading paragraph={{ rows: 8 }} />;
5
- };
@@ -1,30 +0,0 @@
1
- import { redirect } from 'next/navigation';
2
-
3
- import { metadataModule } from '@/server/metadata';
4
- import { translation } from '@/server/translation';
5
- import { DynamicLayoutProps } from '@/types/next';
6
- import { RouteVariants } from '@/utils/server/routeVariants';
7
-
8
- import Category from './features/Category';
9
-
10
- export const generateMetadata = async (props: DynamicLayoutProps) => {
11
- const locale = await RouteVariants.getLocale(props);
12
- const { t } = await translation('setting', locale);
13
- return metadataModule.generate({
14
- description: t('header.desc'),
15
- title: t('header.title'),
16
- url: '/me/settings',
17
- });
18
- };
19
-
20
- const Page = async (props: DynamicLayoutProps) => {
21
- const isMobile = await RouteVariants.getIsMobile(props);
22
-
23
- if (!isMobile) return redirect('/settings');
24
-
25
- return <Category />;
26
- };
27
-
28
- Page.displayName = 'MeSettings';
29
-
30
- export default Page;
@@ -1,106 +0,0 @@
1
- import { ActionIcon, ActionIconProps, Hotkey } from '@lobehub/ui';
2
- import { Compass, FolderClosed, MessageSquare, Palette } from 'lucide-react';
3
- import Link from 'next/link';
4
- import { memo } from 'react';
5
- import { useTranslation } from 'react-i18next';
6
- import { Flexbox } from 'react-layout-kit';
7
-
8
- import { useGlobalStore } from '@/store/global';
9
- import { SidebarTabKey } from '@/store/global/initialState';
10
- import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
11
- import { useSessionStore } from '@/store/session';
12
- import { useUserStore } from '@/store/user';
13
- import { settingsSelectors } from '@/store/user/selectors';
14
- import { HotkeyEnum } from '@/types/hotkey';
15
-
16
- const ICON_SIZE: ActionIconProps['size'] = {
17
- blockSize: 40,
18
- size: 24,
19
- strokeWidth: 2,
20
- };
21
-
22
- export interface TopActionProps {
23
- isPinned?: boolean | null;
24
- tab?: SidebarTabKey;
25
- }
26
-
27
- // TODO Change icons
28
- const TopActions = memo<TopActionProps>(({ tab, isPinned }) => {
29
- const { t } = useTranslation('common');
30
- const switchBackToChat = useGlobalStore((s) => s.switchBackToChat);
31
- const { showMarket, enableKnowledgeBase, showAiImage } =
32
- useServerConfigStore(featureFlagsSelectors);
33
- const hotkey = useUserStore(settingsSelectors.getHotkeyById(HotkeyEnum.NavigateToChat));
34
-
35
- const isChatActive = tab === SidebarTabKey.Chat && !isPinned;
36
- const isFilesActive = tab === SidebarTabKey.Files;
37
- const isDiscoverActive = tab === SidebarTabKey.Discover;
38
- const isImageActive = tab === SidebarTabKey.Image;
39
-
40
- return (
41
- <Flexbox gap={8}>
42
- <Link
43
- aria-label={t('tab.chat')}
44
- href={'/chat'}
45
- onClick={(e) => {
46
- // If Cmd key is pressed, let the default link behavior happen (open in new tab)
47
- if (e.metaKey || e.ctrlKey) {
48
- return;
49
- }
50
-
51
- // Otherwise, prevent default and switch session within the current tab
52
- e.preventDefault();
53
- switchBackToChat(useSessionStore.getState().activeId);
54
- }}
55
- >
56
- <ActionIcon
57
- active={isChatActive}
58
- icon={MessageSquare}
59
- size={ICON_SIZE}
60
- title={
61
- <Flexbox align={'center'} gap={8} horizontal justify={'space-between'}>
62
- <span>{t('tab.chat')}</span>
63
- <Hotkey inverseTheme keys={hotkey} />
64
- </Flexbox>
65
- }
66
- tooltipProps={{ placement: 'right' }}
67
- />
68
- </Link>
69
- {enableKnowledgeBase && (
70
- <Link aria-label={t('tab.knowledgeBase')} href={'/knowledge'}>
71
- <ActionIcon
72
- active={isFilesActive}
73
- icon={FolderClosed}
74
- size={ICON_SIZE}
75
- title={t('tab.knowledgeBase')}
76
- tooltipProps={{ placement: 'right' }}
77
- />
78
- </Link>
79
- )}
80
- {showAiImage && (
81
- <Link aria-label={t('tab.aiImage')} href={'/image'}>
82
- <ActionIcon
83
- active={isImageActive}
84
- icon={Palette}
85
- size={ICON_SIZE}
86
- title={t('tab.aiImage')}
87
- tooltipProps={{ placement: 'right' }}
88
- />
89
- </Link>
90
- )}
91
- {showMarket && (
92
- <Link aria-label={t('tab.discover')} href={'/discover'}>
93
- <ActionIcon
94
- active={isDiscoverActive}
95
- icon={Compass}
96
- size={ICON_SIZE}
97
- title={t('tab.discover')}
98
- tooltipProps={{ placement: 'right' }}
99
- />
100
- </Link>
101
- )}
102
- </Flexbox>
103
- );
104
- });
105
-
106
- export default TopActions;
@@ -1,10 +0,0 @@
1
- import ServerLayout from '@/components/server/ServerLayout';
2
-
3
- import Desktop from './_layout/Desktop';
4
- import Mobile from './_layout/Mobile';
5
-
6
- const MainLayout = ServerLayout({ Desktop, Mobile });
7
-
8
- MainLayout.displayName = 'ChangelogLayout';
9
-
10
- export default MainLayout;
@@ -1,23 +0,0 @@
1
- 'use client';
2
-
3
- import { useEffect } from 'react';
4
-
5
- import { useQueryRoute } from '@/hooks/useQueryRoute';
6
-
7
- /**
8
- * @description: Changelog Modal (intercepting routes fallback when hard refresh)
9
- * @example: /changelog/modal => /changelog
10
- * @refs: https://github.com/lobehub/lobe-chat/discussions/2295#discussioncomment-9290942
11
- */
12
-
13
- const ChangelogModal = () => {
14
- const router = useQueryRoute();
15
-
16
- useEffect(() => {
17
- router.replace('/changelog');
18
- }, []);
19
-
20
- return null;
21
- };
22
-
23
- export default ChangelogModal;