@lobehub/chat 1.17.6 → 1.18.0

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.

Potentially problematic release.


This version of @lobehub/chat might be problematic. Click here for more details.

Files changed (339) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/locales/ar/common.json +1 -1
  3. package/locales/ar/discover.json +204 -0
  4. package/locales/ar/metadata.json +20 -3
  5. package/locales/ar/models.json +845 -0
  6. package/locales/ar/providers.json +80 -0
  7. package/locales/bg-BG/common.json +1 -1
  8. package/locales/bg-BG/discover.json +204 -0
  9. package/locales/bg-BG/metadata.json +20 -3
  10. package/locales/bg-BG/models.json +845 -0
  11. package/locales/bg-BG/providers.json +80 -0
  12. package/locales/de-DE/common.json +1 -1
  13. package/locales/de-DE/discover.json +204 -0
  14. package/locales/de-DE/metadata.json +20 -3
  15. package/locales/de-DE/models.json +845 -0
  16. package/locales/de-DE/providers.json +80 -0
  17. package/locales/en-US/common.json +1 -1
  18. package/locales/en-US/discover.json +204 -0
  19. package/locales/en-US/metadata.json +20 -3
  20. package/locales/en-US/models.json +845 -0
  21. package/locales/en-US/providers.json +80 -0
  22. package/locales/es-ES/common.json +1 -1
  23. package/locales/es-ES/discover.json +204 -0
  24. package/locales/es-ES/metadata.json +20 -3
  25. package/locales/es-ES/models.json +845 -0
  26. package/locales/es-ES/providers.json +80 -0
  27. package/locales/fr-FR/common.json +1 -1
  28. package/locales/fr-FR/discover.json +204 -0
  29. package/locales/fr-FR/metadata.json +20 -3
  30. package/locales/fr-FR/models.json +845 -0
  31. package/locales/fr-FR/providers.json +80 -0
  32. package/locales/it-IT/common.json +1 -1
  33. package/locales/it-IT/discover.json +204 -0
  34. package/locales/it-IT/metadata.json +20 -3
  35. package/locales/it-IT/models.json +845 -0
  36. package/locales/it-IT/providers.json +80 -0
  37. package/locales/ja-JP/common.json +1 -1
  38. package/locales/ja-JP/discover.json +204 -0
  39. package/locales/ja-JP/metadata.json +20 -3
  40. package/locales/ja-JP/models.json +845 -0
  41. package/locales/ja-JP/providers.json +80 -0
  42. package/locales/ko-KR/common.json +1 -1
  43. package/locales/ko-KR/discover.json +204 -0
  44. package/locales/ko-KR/metadata.json +20 -3
  45. package/locales/ko-KR/models.json +845 -0
  46. package/locales/ko-KR/providers.json +80 -0
  47. package/locales/nl-NL/common.json +1 -1
  48. package/locales/nl-NL/discover.json +204 -0
  49. package/locales/nl-NL/metadata.json +20 -3
  50. package/locales/nl-NL/models.json +845 -0
  51. package/locales/nl-NL/providers.json +80 -0
  52. package/locales/pl-PL/common.json +1 -1
  53. package/locales/pl-PL/discover.json +204 -0
  54. package/locales/pl-PL/metadata.json +20 -3
  55. package/locales/pl-PL/models.json +845 -0
  56. package/locales/pl-PL/providers.json +80 -0
  57. package/locales/pt-BR/common.json +1 -1
  58. package/locales/pt-BR/discover.json +204 -0
  59. package/locales/pt-BR/metadata.json +20 -3
  60. package/locales/pt-BR/models.json +845 -0
  61. package/locales/pt-BR/providers.json +80 -0
  62. package/locales/ru-RU/common.json +1 -1
  63. package/locales/ru-RU/discover.json +204 -0
  64. package/locales/ru-RU/metadata.json +20 -3
  65. package/locales/ru-RU/models.json +845 -0
  66. package/locales/ru-RU/providers.json +80 -0
  67. package/locales/tr-TR/common.json +1 -1
  68. package/locales/tr-TR/discover.json +204 -0
  69. package/locales/tr-TR/metadata.json +20 -3
  70. package/locales/tr-TR/models.json +845 -0
  71. package/locales/tr-TR/providers.json +80 -0
  72. package/locales/vi-VN/common.json +1 -1
  73. package/locales/vi-VN/discover.json +204 -0
  74. package/locales/vi-VN/metadata.json +20 -3
  75. package/locales/vi-VN/models.json +845 -0
  76. package/locales/vi-VN/providers.json +80 -0
  77. package/locales/zh-CN/common.json +1 -1
  78. package/locales/zh-CN/discover.json +204 -0
  79. package/locales/zh-CN/metadata.json +20 -3
  80. package/locales/zh-CN/models.json +845 -0
  81. package/locales/zh-CN/providers.json +80 -0
  82. package/locales/zh-CN/welcome.json +1 -1
  83. package/locales/zh-TW/common.json +1 -1
  84. package/locales/zh-TW/discover.json +204 -0
  85. package/locales/zh-TW/metadata.json +20 -3
  86. package/locales/zh-TW/models.json +845 -0
  87. package/locales/zh-TW/providers.json +80 -0
  88. package/package.json +3 -2
  89. package/src/app/(main)/@nav/_layout/Desktop/TopActions.test.tsx +3 -3
  90. package/src/app/(main)/@nav/_layout/Desktop/TopActions.tsx +3 -3
  91. package/src/app/(main)/@nav/_layout/Mobile.tsx +3 -3
  92. package/src/app/(main)/_layout/Mobile.tsx +9 -1
  93. package/src/app/(main)/discover/(detail)/_layout/Desktop.tsx +24 -0
  94. package/src/app/(main)/discover/(detail)/_layout/Mobile/Header.tsx +25 -0
  95. package/src/app/(main)/discover/(detail)/_layout/Mobile/index.tsx +17 -0
  96. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/Actions.tsx +35 -0
  97. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/AddAgent.tsx +86 -0
  98. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/ConversationExample/TopicList.tsx +74 -0
  99. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/ConversationExample/index.tsx +100 -0
  100. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/Header.tsx +118 -0
  101. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/InfoSidebar/SuggestionItem.tsx +62 -0
  102. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/InfoSidebar/ToolItem.tsx +19 -0
  103. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/InfoSidebar/index.tsx +64 -0
  104. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/SystemRole.tsx +35 -0
  105. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/Temp.tsx +44 -0
  106. package/src/app/(main)/discover/(detail)/assistant/[slug]/page.tsx +121 -0
  107. package/src/app/(main)/discover/(detail)/error.tsx +5 -0
  108. package/src/app/(main)/discover/(detail)/features/Back.tsx +42 -0
  109. package/src/app/(main)/discover/(detail)/features/Block.tsx +50 -0
  110. package/src/app/(main)/discover/(detail)/features/DetailLayout.tsx +91 -0
  111. package/src/app/(main)/discover/(detail)/features/HighlightBlock.tsx +82 -0
  112. package/src/app/(main)/discover/(detail)/features/ShareButton.tsx +160 -0
  113. package/src/app/(main)/discover/(detail)/features/SidebarContainer.tsx +19 -0
  114. package/src/app/(main)/discover/(detail)/layout.tsx +12 -0
  115. package/src/app/(main)/discover/(detail)/loading.tsx +38 -0
  116. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/Actions.tsx +46 -0
  117. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ChatWithModel.tsx +93 -0
  118. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/Header.tsx +85 -0
  119. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/InfoSidebar/SuggestionItem.tsx +75 -0
  120. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/InfoSidebar/index.tsx +49 -0
  121. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ParameterList/ParameterItem.tsx +71 -0
  122. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ParameterList/index.tsx +110 -0
  123. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ProviderList/ProviderItem.tsx +152 -0
  124. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ProviderList/index.tsx +45 -0
  125. package/src/app/(main)/discover/(detail)/model/[...slugs]/page.tsx +114 -0
  126. package/src/app/(main)/discover/(detail)/not-found.tsx +3 -0
  127. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/Actions.tsx +35 -0
  128. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/Header.tsx +114 -0
  129. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/InfoSidebar/SuggestionItem.tsx +62 -0
  130. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/InfoSidebar/index.tsx +49 -0
  131. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/InstallPlugin.tsx +87 -0
  132. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/ParameterList.tsx +95 -0
  133. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/Schema.tsx +23 -0
  134. package/src/app/(main)/discover/(detail)/plugin/[slug]/page.tsx +103 -0
  135. package/src/app/(main)/discover/(detail)/provider/[slug]/features/Actions.tsx +49 -0
  136. package/src/app/(main)/discover/(detail)/provider/[slug]/features/Header.tsx +73 -0
  137. package/src/app/(main)/discover/(detail)/provider/[slug]/features/InfoSidebar/SuggestionItem.tsx +75 -0
  138. package/src/app/(main)/discover/(detail)/provider/[slug]/features/InfoSidebar/index.tsx +49 -0
  139. package/src/app/(main)/discover/(detail)/provider/[slug]/features/ModelList/ModelItem.tsx +148 -0
  140. package/src/app/(main)/discover/(detail)/provider/[slug]/features/ModelList/index.tsx +60 -0
  141. package/src/app/(main)/discover/(detail)/provider/[slug]/features/ProviderConfig.tsx +80 -0
  142. package/src/app/(main)/discover/(detail)/provider/[slug]/page.tsx +116 -0
  143. package/src/app/(main)/discover/(list)/(home)/Client.tsx +42 -0
  144. package/src/app/(main)/discover/(list)/(home)/features/AssistantList.tsx +33 -0
  145. package/src/app/(main)/discover/(list)/(home)/features/ModelList.tsx +22 -0
  146. package/src/app/(main)/discover/(list)/(home)/features/PluginList.tsx +25 -0
  147. package/src/app/(main)/discover/(list)/(home)/loading.tsx +1 -0
  148. package/src/app/(main)/discover/(list)/(home)/page.tsx +54 -0
  149. package/src/app/(main)/discover/(list)/_layout/Desktop/Nav.tsx +118 -0
  150. package/src/app/(main)/discover/(list)/_layout/Desktop/index.tsx +37 -0
  151. package/src/app/(main)/discover/(list)/_layout/Desktop/useScroll.ts +33 -0
  152. package/src/app/(main)/discover/(list)/_layout/Mobile/Header.tsx +62 -0
  153. package/src/app/(main)/discover/(list)/_layout/Mobile/Nav.tsx +94 -0
  154. package/src/app/(main)/discover/(list)/_layout/Mobile/index.tsx +27 -0
  155. package/src/app/(main)/discover/(list)/assistants/[slug]/page.tsx +64 -0
  156. package/src/app/(main)/discover/(list)/assistants/_layout/Desktop.tsx +22 -0
  157. package/src/app/(main)/discover/(list)/assistants/_layout/Mobile.tsx +9 -0
  158. package/src/app/(main)/discover/(list)/assistants/features/Card.tsx +176 -0
  159. package/src/app/(main)/discover/(list)/assistants/features/Category.tsx +48 -0
  160. package/src/app/(main)/discover/(list)/assistants/features/List.tsx +97 -0
  161. package/src/app/(main)/discover/(list)/assistants/features/useCategory.tsx +116 -0
  162. package/src/app/(main)/discover/(list)/assistants/layout.tsx +12 -0
  163. package/src/app/(main)/discover/(list)/assistants/loading.tsx +1 -0
  164. package/src/app/(main)/discover/(list)/assistants/page.tsx +51 -0
  165. package/src/app/(main)/discover/(list)/error.tsx +5 -0
  166. package/src/app/(main)/{market → discover/(list)}/layout.tsx +4 -3
  167. package/src/app/(main)/discover/(list)/loading.tsx +39 -0
  168. package/src/app/(main)/discover/(list)/models/[slug]/page.tsx +70 -0
  169. package/src/app/(main)/discover/(list)/models/_layout/Desktop.tsx +28 -0
  170. package/src/app/(main)/discover/(list)/models/_layout/Mobile.tsx +9 -0
  171. package/src/app/(main)/discover/(list)/models/features/Card.tsx +116 -0
  172. package/src/app/(main)/discover/(list)/models/features/Category.tsx +67 -0
  173. package/src/app/(main)/discover/(list)/models/features/List.tsx +72 -0
  174. package/src/app/(main)/discover/(list)/models/features/const.ts +9 -0
  175. package/src/app/(main)/discover/(list)/models/layout.tsx +12 -0
  176. package/src/app/(main)/discover/(list)/models/loading.tsx +1 -0
  177. package/src/app/(main)/discover/(list)/models/page.tsx +61 -0
  178. package/src/app/(main)/discover/(list)/not-found.tsx +3 -0
  179. package/src/app/(main)/discover/(list)/plugins/[slug]/page.tsx +64 -0
  180. package/src/app/(main)/discover/(list)/plugins/_layout/Desktop.tsx +22 -0
  181. package/src/app/(main)/discover/(list)/plugins/_layout/Mobile.tsx +9 -0
  182. package/src/app/(main)/discover/(list)/plugins/features/Card.tsx +154 -0
  183. package/src/app/(main)/discover/(list)/plugins/features/Category.tsx +45 -0
  184. package/src/app/(main)/discover/(list)/plugins/features/List.tsx +96 -0
  185. package/src/app/(main)/discover/(list)/plugins/features/useCategory.tsx +80 -0
  186. package/src/app/(main)/discover/(list)/plugins/layout.tsx +12 -0
  187. package/src/app/(main)/discover/(list)/plugins/loading.tsx +1 -0
  188. package/src/app/(main)/discover/(list)/plugins/page.tsx +52 -0
  189. package/src/app/(main)/discover/(list)/providers/features/Card.tsx +117 -0
  190. package/src/app/(main)/discover/(list)/providers/features/List.tsx +71 -0
  191. package/src/app/(main)/discover/(list)/providers/loading.tsx +1 -0
  192. package/src/app/(main)/discover/(list)/providers/page.tsx +52 -0
  193. package/src/app/(main)/discover/_layout/Desktop/Header.tsx +36 -0
  194. package/src/app/(main)/discover/_layout/Desktop/index.tsx +21 -0
  195. package/src/app/(main)/discover/_layout/Mobile/index.tsx +9 -0
  196. package/src/app/(main)/{market/features/AgentCard/AgentCardBanner.tsx → discover/components/CardBanner.tsx} +5 -5
  197. package/src/app/(main)/discover/components/CategoryContainer.tsx +18 -0
  198. package/src/app/(main)/discover/components/CategoryMenu.tsx +39 -0
  199. package/src/app/(main)/discover/components/GitHubAvatar.tsx +19 -0
  200. package/src/app/(main)/discover/components/GridLoadingCard.tsx +69 -0
  201. package/src/app/(main)/discover/components/ListLoading.tsx +66 -0
  202. package/src/app/(main)/discover/components/Loading.tsx +17 -0
  203. package/src/app/(main)/discover/components/SearchResultCount.tsx +37 -0
  204. package/src/app/(main)/discover/components/Statistic.tsx +92 -0
  205. package/src/app/(main)/discover/components/Title.tsx +76 -0
  206. package/src/app/(main)/discover/components/VirtuosoGridList/index.tsx +52 -0
  207. package/src/app/(main)/discover/components/VirtuosoGridList/useScrollParent.ts +19 -0
  208. package/src/app/(main)/discover/error.tsx +5 -0
  209. package/src/app/(main)/{market/features/ShareAgentButton → discover/features/CreateButton}/Inner.tsx +9 -10
  210. package/src/app/(main)/{market/features/ShareAgentButton → discover/features/CreateButton}/index.tsx +9 -9
  211. package/src/app/(main)/discover/features/LikeButton.tsx +73 -0
  212. package/src/app/(main)/discover/features/ModelFeatureTags.tsx +77 -0
  213. package/src/app/(main)/discover/features/StoreSearchBar.tsx +84 -0
  214. package/src/app/(main)/discover/features/const.ts +2 -0
  215. package/src/app/(main)/discover/features/useNav.tsx +71 -0
  216. package/src/app/(main)/discover/layout.tsx +12 -0
  217. package/src/app/(main)/discover/loading.tsx +9 -0
  218. package/src/app/(main)/discover/not-found.tsx +3 -0
  219. package/src/app/(main)/discover/search/_layout/Desktop.tsx +42 -0
  220. package/src/app/(main)/discover/search/_layout/Mobile/Header.tsx +31 -0
  221. package/src/app/(main)/discover/search/_layout/Mobile/Nav.tsx +56 -0
  222. package/src/app/(main)/discover/search/_layout/Mobile/index.tsx +32 -0
  223. package/src/app/(main)/discover/search/features/AssistantsResult.tsx +27 -0
  224. package/src/app/(main)/discover/search/features/Category.tsx +41 -0
  225. package/src/app/(main)/discover/search/features/ModelsResult.tsx +27 -0
  226. package/src/app/(main)/discover/search/features/PluginsResult.tsx +27 -0
  227. package/src/app/(main)/discover/search/features/ProvidersResult.tsx +26 -0
  228. package/src/app/(main)/discover/search/layout.tsx +12 -0
  229. package/src/app/(main)/discover/search/loading.tsx +1 -0
  230. package/src/app/(main)/discover/search/page.tsx +78 -0
  231. package/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx +0 -6
  232. package/src/app/(main)/welcome/features/Actions.tsx +1 -1
  233. package/src/app/@modal/(.)discover/assistant/[slug]/page.tsx +1 -0
  234. package/src/app/@modal/(.)discover/layout.tsx +29 -0
  235. package/src/app/@modal/(.)discover/loading.tsx +3 -0
  236. package/src/app/@modal/(.)discover/model/[...slugs]/page.tsx +1 -0
  237. package/src/app/@modal/(.)discover/plugin/[slug]/page.tsx +1 -0
  238. package/src/app/@modal/(.)discover/provider/[slug]/page.tsx +1 -0
  239. package/src/app/@modal/features/InterceptingContext.tsx +9 -0
  240. package/src/app/@modal/layout.tsx +58 -21
  241. package/src/app/api/{market → assistant}/[id]/route.ts +2 -3
  242. package/src/app/api/{market → assistant/store}/route.ts +2 -5
  243. package/src/app/api/plugin/store/route.ts +1 -4
  244. package/src/app/metadata.ts +3 -0
  245. package/src/app/redirect/page.tsx +15 -0
  246. package/src/components/FetchErrorNotification/Description.tsx +2 -0
  247. package/src/components/InterceptingLink/index.tsx +27 -0
  248. package/src/components/mdx/CodeBlock.tsx +46 -0
  249. package/src/components/mdx/Link.tsx +21 -0
  250. package/src/components/mdx/index.tsx +51 -0
  251. package/src/config/modelProviders/ollama.ts +0 -8
  252. package/src/const/discover.ts +63 -1
  253. package/src/features/Conversation/Error/PluginSettings.tsx +1 -1
  254. package/src/features/Conversation/Messages/Tool/Inspector/Settings.tsx +1 -1
  255. package/src/features/Conversation/components/InboxWelcome/AgentsSuggest.tsx +41 -24
  256. package/src/features/MobileTabBar/index.tsx +3 -3
  257. package/src/features/PluginDetailModal/APIs.tsx +1 -1
  258. package/src/features/PluginDevModal/UrlManifestForm.tsx +1 -1
  259. package/src/features/PluginStore/PluginItem/Action.tsx +1 -1
  260. package/src/features/PluginsUI/Render/DefaultType/index.tsx +1 -1
  261. package/src/features/PluginsUI/Render/StandaloneType/index.tsx +1 -1
  262. package/src/hooks/useInterceptingRoutes.ts +21 -1
  263. package/src/hooks/useShare.tsx +191 -0
  264. package/src/libs/agent-runtime/utils/streams/openai.test.ts +43 -0
  265. package/src/libs/agent-runtime/utils/streams/openai.ts +1 -1
  266. package/src/locales/create.ts +1 -1
  267. package/src/locales/default/common.ts +1 -1
  268. package/src/locales/default/discover.ts +205 -0
  269. package/src/locales/default/index.ts +6 -2
  270. package/src/locales/default/metadata.ts +23 -3
  271. package/src/locales/default/models.ts +15 -0
  272. package/src/locales/default/providers.ts +15 -0
  273. package/src/locales/default/welcome.ts +1 -1
  274. package/src/locales/resources.ts +2 -0
  275. package/src/server/ld.ts +85 -11
  276. package/src/server/metadata.ts +41 -3
  277. package/src/{app/api/market/AgentMarket.test.ts → server/modules/AssistantStore/index.test.ts} +15 -15
  278. package/src/{app/api/market/AgentMarket.ts → server/modules/AssistantStore/index.ts} +7 -3
  279. package/src/{app/api/plugin/store/Store.test.ts → server/modules/PluginStore/index.test.ts} +1 -1
  280. package/src/server/services/discover/index.ts +352 -0
  281. package/src/server/services/doc/index.tsx +40 -0
  282. package/src/server/translation.ts +11 -5
  283. package/src/services/__tests__/__snapshots__/tool.test.ts.snap +1 -1
  284. package/src/services/{_auth.test.ts → __tests__/_auth.test.ts} +1 -1
  285. package/src/services/__tests__/assistant.test.ts +82 -0
  286. package/src/services/__tests__/tool.test.ts +13 -13
  287. package/src/services/_url.ts +2 -2
  288. package/src/services/assistant.ts +30 -0
  289. package/src/services/chat.ts +1 -1
  290. package/src/services/tool.ts +7 -129
  291. package/src/store/chat/slices/plugin/action.test.ts +112 -0
  292. package/src/store/chat/slices/plugin/action.ts +1 -3
  293. package/src/store/global/initialState.ts +1 -1
  294. package/src/store/tool/selectors/tool.test.ts +1 -1
  295. package/src/store/tool/slices/customPlugin/action.test.ts +1 -1
  296. package/src/store/tool/slices/customPlugin/action.ts +1 -1
  297. package/src/store/tool/slices/plugin/action.ts +1 -1
  298. package/src/store/tool/slices/plugin/selectors.test.ts +3 -3
  299. package/src/store/tool/slices/plugin/selectors.ts +3 -3
  300. package/src/store/tool/slices/store/action.test.ts +16 -22
  301. package/src/store/tool/slices/store/action.ts +8 -8
  302. package/src/types/discover.ts +152 -0
  303. package/src/types/llm.ts +4 -2
  304. package/src/types/meta.ts +1 -0
  305. package/src/utils/format.test.ts +191 -112
  306. package/src/utils/format.ts +36 -0
  307. package/src/utils/toolManifest.ts +124 -0
  308. package/src/app/(main)/market/@detail/default.tsx +0 -12
  309. package/src/app/(main)/market/@detail/features/AgentDetailContent.tsx +0 -73
  310. package/src/app/(main)/market/@detail/features/Banner.tsx +0 -46
  311. package/src/app/(main)/market/@detail/features/Comment.tsx +0 -16
  312. package/src/app/(main)/market/@detail/features/Header.tsx +0 -81
  313. package/src/app/(main)/market/@detail/features/Loading.tsx +0 -63
  314. package/src/app/(main)/market/@detail/features/TokenTag.tsx +0 -27
  315. package/src/app/(main)/market/@detail/features/style.ts +0 -32
  316. package/src/app/(main)/market/_layout/Desktop/DetailSidebar.tsx +0 -84
  317. package/src/app/(main)/market/_layout/Desktop/Header.tsx +0 -29
  318. package/src/app/(main)/market/_layout/Desktop/Hero.tsx +0 -40
  319. package/src/app/(main)/market/_layout/Desktop/index.tsx +0 -46
  320. package/src/app/(main)/market/_layout/Mobile/DetailModal.tsx +0 -32
  321. package/src/app/(main)/market/_layout/Mobile/Header.tsx +0 -20
  322. package/src/app/(main)/market/_layout/Mobile/index.tsx +0 -25
  323. package/src/app/(main)/market/_layout/type.ts +0 -6
  324. package/src/app/(main)/market/features/AgentCard/index.tsx +0 -139
  325. package/src/app/(main)/market/features/AgentList.tsx +0 -103
  326. package/src/app/(main)/market/features/AgentSearchBar.tsx +0 -42
  327. package/src/app/(main)/market/features/TagList.tsx +0 -69
  328. package/src/app/(main)/market/loading.tsx +0 -15
  329. package/src/app/(main)/market/page.tsx +0 -44
  330. package/src/const/market.ts +0 -15
  331. package/src/locales/default/market.ts +0 -32
  332. package/src/services/market.ts +0 -22
  333. package/src/store/market/action.ts +0 -82
  334. package/src/store/market/index.ts +0 -3
  335. package/src/store/market/initialState.ts +0 -19
  336. package/src/store/market/selectors.ts +0 -38
  337. package/src/store/market/store.ts +0 -48
  338. package/src/types/market.ts +0 -20
  339. /package/src/{app/api/plugin/store/Store.ts → server/modules/PluginStore/index.ts} +0 -0
@@ -1,7 +1,10 @@
1
1
  import { Metadata } from 'next';
2
+ import qs from 'query-string';
2
3
 
3
4
  import { BRANDING_NAME } from '@/const/branding';
5
+ import { DEFAULT_LANG } from '@/const/locale';
4
6
  import { OG_URL, getCanonicalUrl } from '@/const/url';
7
+ import { Locales, locales } from '@/locales/resources';
5
8
  import { formatDescLength, formatTitleLength } from '@/utils/genOG';
6
9
 
7
10
  export class Meta {
@@ -12,9 +15,13 @@ export class Meta {
12
15
  url,
13
16
  type = 'website',
14
17
  tags,
18
+ alternate,
19
+ locale = DEFAULT_LANG,
15
20
  }: {
21
+ alternate?: boolean;
16
22
  description?: string;
17
23
  image?: string;
24
+ locale?: Locales;
18
25
  tags?: string[];
19
26
  title: string;
20
27
  type?: 'website' | 'article';
@@ -26,11 +33,16 @@ export class Meta {
26
33
  const formatedDescription = formatDescLength(description, tags);
27
34
  const siteTitle = title.includes(BRANDING_NAME) ? title : title + ` · ${BRANDING_NAME}`;
28
35
  return {
29
- alternates: { canonical: getCanonicalUrl(url) },
36
+ alternates: {
37
+ canonical: getCanonicalUrl(url),
38
+ languages: alternate ? this.genAlternateLocales(locale, url) : undefined,
39
+ },
30
40
  description: formatedDescription,
31
41
  openGraph: this.genOpenGraph({
42
+ alternate,
32
43
  description,
33
44
  image,
45
+ locale,
34
46
  title: siteTitle,
35
47
  type,
36
48
  url,
@@ -43,6 +55,22 @@ export class Meta {
43
55
  };
44
56
  }
45
57
 
58
+ private genAlternateLocales = (locale: Locales, path: string = '/') => {
59
+ let links: any = {};
60
+ const defaultLink = getCanonicalUrl(path);
61
+ for (const alterLocales of locales) {
62
+ if (locale === alterLocales) continue;
63
+ links[alterLocales] = qs.stringifyUrl({
64
+ query: { hl: alterLocales },
65
+ url: defaultLink,
66
+ });
67
+ }
68
+ return {
69
+ 'x-default': defaultLink,
70
+ ...links,
71
+ };
72
+ };
73
+
46
74
  private genTwitter({
47
75
  description,
48
76
  title,
@@ -65,19 +93,23 @@ export class Meta {
65
93
  }
66
94
 
67
95
  private genOpenGraph({
96
+ alternate,
97
+ locale = DEFAULT_LANG,
68
98
  description,
69
99
  title,
70
100
  image,
71
101
  url,
72
102
  type = 'website',
73
103
  }: {
104
+ alternate?: boolean;
74
105
  description: string;
75
106
  image: string;
107
+ locale: Locales;
76
108
  title: string;
77
109
  type?: 'website' | 'article';
78
110
  url: string;
79
111
  }) {
80
- return {
112
+ const data: any = {
81
113
  description,
82
114
  images: [
83
115
  {
@@ -85,12 +117,18 @@ export class Meta {
85
117
  url: image,
86
118
  },
87
119
  ],
88
- locale: 'en-US',
120
+ locale,
89
121
  siteName: 'LobeChat',
90
122
  title,
91
123
  type,
92
124
  url,
93
125
  };
126
+
127
+ if (alternate) {
128
+ data['alternateLocale'] = locales.filter((l) => l !== locale);
129
+ }
130
+
131
+ return data;
94
132
  }
95
133
  }
96
134
 
@@ -1,54 +1,54 @@
1
1
  // @vitest-environment node
2
2
  import { describe, expect, it } from 'vitest';
3
3
 
4
- import { AgentMarket } from './AgentMarket';
4
+ import { AssistantStore } from './index';
5
5
 
6
6
  const baseURL = 'https://chat-agents.lobehub.com';
7
- describe('AgentMarket', () => {
7
+ describe('AssistantStore', () => {
8
8
  it('should return the default index URL when no language is provided', () => {
9
- const agentMarket = new AgentMarket();
9
+ const agentMarket = new AssistantStore();
10
10
  const url = agentMarket.getAgentIndexUrl();
11
11
  expect(url).toBe(baseURL);
12
12
  });
13
13
 
14
- it('should return the index URL for a supported language', () => {
15
- const agentMarket = new AgentMarket();
14
+ it('should return the index URL for a not supported language', () => {
15
+ const agentMarket = new AssistantStore();
16
16
  const url = agentMarket.getAgentIndexUrl('ko-KR');
17
- expect(url).toBe('https://chat-agents.lobehub.com/index.ko-KR.json');
17
+ expect(url).toBe('https://chat-agents.lobehub.com');
18
18
  });
19
19
 
20
20
  it('should return the zh-CN URL for zh locale', () => {
21
- const agentMarket = new AgentMarket();
21
+ const agentMarket = new AssistantStore();
22
22
  const url = agentMarket.getAgentIndexUrl('zh' as any);
23
23
  expect(url).toBe('https://chat-agents.lobehub.com/index.zh-CN.json');
24
24
  });
25
25
 
26
26
  it('should return the default URL for en locale', () => {
27
- const agentMarket = new AgentMarket();
27
+ const agentMarket = new AssistantStore();
28
28
  const url = agentMarket.getAgentIndexUrl('en' as any);
29
29
  expect(url).toBe('https://chat-agents.lobehub.com');
30
30
  });
31
31
 
32
32
  it('should return the base URL if the provided language is not supported', () => {
33
- const agentMarket = new AgentMarket();
33
+ const agentMarket = new AssistantStore();
34
34
  const url = agentMarket.getAgentIndexUrl('fr' as any);
35
35
  expect(url).toBe(baseURL);
36
36
  });
37
37
 
38
38
  it('should return the agent URL with default language when no language is provided', () => {
39
- const agentMarket = new AgentMarket();
39
+ const agentMarket = new AssistantStore();
40
40
  const url = agentMarket.getAgentUrl('agent-123');
41
41
  expect(url).toBe(`${baseURL}/agent-123.json`);
42
42
  });
43
43
 
44
- it('should return the agent URL for a supported language', () => {
45
- const agentMarket = new AgentMarket();
46
- const url = agentMarket.getAgentUrl('agent-123', 'es-ES');
47
- expect(url).toBe(`${baseURL}/agent-123.es-ES.json`);
44
+ it('should return the agent URL for a supported language', () => {
45
+ const agentMarket = new AssistantStore();
46
+ const url = agentMarket.getAgentUrl('agent-123', 'zh-CN');
47
+ expect(url).toBe(`${baseURL}/agent-123.zh-CN.json`);
48
48
  });
49
49
 
50
50
  it('should return the agent URL without language suffix if the provided language is not supported', () => {
51
- const agentMarket = new AgentMarket();
51
+ const agentMarket = new AssistantStore();
52
52
  const url = agentMarket.getAgentUrl('agent-123', 'fr' as any);
53
53
  expect(url).toBe(`${baseURL}/agent-123.json`);
54
54
  });
@@ -4,7 +4,11 @@ import { appEnv } from '@/config/app';
4
4
  import { DEFAULT_LANG, isLocaleNotSupport } from '@/const/locale';
5
5
  import { Locales, normalizeLocale } from '@/locales/resources';
6
6
 
7
- export class AgentMarket {
7
+ const checkSupportLocale = (lang: Locales) => {
8
+ return isLocaleNotSupport(lang) || normalizeLocale(lang) !== 'zh-CN';
9
+ };
10
+
11
+ export class AssistantStore {
8
12
  private readonly baseUrl: string;
9
13
 
10
14
  constructor(baseUrl?: string) {
@@ -12,13 +16,13 @@ export class AgentMarket {
12
16
  }
13
17
 
14
18
  getAgentIndexUrl = (lang: Locales = DEFAULT_LANG) => {
15
- if (isLocaleNotSupport(lang)) return this.baseUrl;
19
+ if (checkSupportLocale(lang)) return this.baseUrl;
16
20
 
17
21
  return urlJoin(this.baseUrl, `index.${normalizeLocale(lang)}.json`);
18
22
  };
19
23
 
20
24
  getAgentUrl = (identifier: string, lang: Locales = DEFAULT_LANG) => {
21
- if (isLocaleNotSupport(lang)) return urlJoin(this.baseUrl, `${identifier}.json`);
25
+ if (checkSupportLocale(lang)) return urlJoin(this.baseUrl, `${identifier}.json`);
22
26
 
23
27
  return urlJoin(this.baseUrl, `${identifier}.${normalizeLocale(lang)}.json`);
24
28
  };
@@ -1,7 +1,7 @@
1
1
  // @vitest-environment node
2
2
  import { describe, expect, it, vi } from 'vitest';
3
3
 
4
- import { PluginStore } from './Store';
4
+ import { PluginStore } from './index';
5
5
 
6
6
  const baseURL = 'https://chat-plugins.lobehub.com';
7
7
 
@@ -0,0 +1,352 @@
1
+ import { cloneDeep, isString, merge, uniqBy } from 'lodash-es';
2
+ import pMap from 'p-map';
3
+
4
+ import { DEFAULT_MODEL_PROVIDER_LIST } from '@/config/modelProviders';
5
+ import {
6
+ DEFAULT_DISCOVER_ASSISTANT_ITEM,
7
+ DEFAULT_DISCOVER_MODEL_ITEM,
8
+ DEFAULT_DISCOVER_PLUGIN_ITEM,
9
+ DEFAULT_DISCOVER_PROVIDER_ITEM,
10
+ } from '@/const/discover';
11
+ import { DEFAULT_LANG } from '@/const/locale';
12
+ import { Locales } from '@/locales/resources';
13
+ import { AssistantStore } from '@/server/modules/AssistantStore';
14
+ import { PluginStore } from '@/server/modules/PluginStore';
15
+ import {
16
+ AssistantCategory,
17
+ DiscoverAssistantItem,
18
+ DiscoverModelItem,
19
+ DiscoverPlugintem,
20
+ DiscoverProviderItem,
21
+ PluginCategory,
22
+ } from '@/types/discover';
23
+ import { getToolManifest } from '@/utils/toolManifest';
24
+
25
+ const revalidate: number = 3600;
26
+
27
+ export class DiscoverService {
28
+ assistantStore = new AssistantStore();
29
+ pluginStore = new PluginStore();
30
+
31
+ // Assistants
32
+ searchAssistant = async (locale: Locales, keywords: string): Promise<DiscoverAssistantItem[]> => {
33
+ const list = await this.getAssistantList(locale);
34
+ return list.filter((item) => {
35
+ return [item.author, item.meta.title, item.meta.description, item.meta?.tags]
36
+ .flat()
37
+ .filter(Boolean)
38
+ .join(',')
39
+ .toLowerCase()
40
+ .includes(decodeURIComponent(keywords).toLowerCase());
41
+ });
42
+ };
43
+
44
+ getAssistantCategory = async (
45
+ locale: Locales,
46
+ category: AssistantCategory,
47
+ ): Promise<DiscoverAssistantItem[]> => {
48
+ const list = await this.getAssistantList(locale);
49
+ return list.filter((item) => item.meta.category === category);
50
+ };
51
+
52
+ getAssistantList = async (locale: Locales): Promise<DiscoverAssistantItem[]> => {
53
+ let res = await fetch(this.assistantStore.getAgentIndexUrl(locale), {
54
+ next: { revalidate },
55
+ });
56
+
57
+ if (!res.ok) {
58
+ res = await fetch(this.assistantStore.getAgentIndexUrl(DEFAULT_LANG), {
59
+ next: { revalidate },
60
+ });
61
+ }
62
+
63
+ const json = await res.json();
64
+
65
+ return json.agents;
66
+ };
67
+
68
+ getAssistantById = async (
69
+ locale: Locales,
70
+ identifier: string,
71
+ ): Promise<DiscoverAssistantItem | undefined> => {
72
+ let res = await fetch(this.assistantStore.getAgentUrl(identifier, locale), {
73
+ next: { revalidate: 12 * revalidate },
74
+ });
75
+
76
+ if (!res.ok) {
77
+ res = await fetch(this.assistantStore.getAgentUrl(DEFAULT_LANG), {
78
+ next: { revalidate: 12 * revalidate },
79
+ });
80
+ }
81
+
82
+ let assistant = await res.json();
83
+
84
+ if (!assistant) return;
85
+
86
+ assistant = merge(cloneDeep(DEFAULT_DISCOVER_ASSISTANT_ITEM), assistant);
87
+
88
+ const categoryItems = await this.getAssistantCategory(
89
+ locale,
90
+ assistant.meta.category || AssistantCategory.General,
91
+ );
92
+
93
+ assistant = {
94
+ ...assistant,
95
+ suggestions: categoryItems
96
+ .filter((item) => item.identifier !== assistant.identifier)
97
+ .slice(0, 5) as any,
98
+ };
99
+
100
+ return assistant;
101
+ };
102
+
103
+ getAssistantByIds = async (
104
+ locale: Locales,
105
+ identifiers: string[],
106
+ ): Promise<DiscoverAssistantItem[]> => {
107
+ const list = await pMap(
108
+ identifiers,
109
+ async (identifier) => this.getAssistantById(locale, identifier),
110
+ {
111
+ concurrency: 5,
112
+ },
113
+ );
114
+
115
+ return list.filter(Boolean) as DiscoverAssistantItem[];
116
+ };
117
+
118
+ // Tools
119
+
120
+ searchPlugin = async (locale: Locales, keywords: string): Promise<DiscoverPlugintem[]> => {
121
+ const list = await this.getPluginList(locale);
122
+ return list.filter((item) => {
123
+ return [item.author, item.meta.title, item.meta.description, item.meta?.tags]
124
+ .flat()
125
+ .filter(Boolean)
126
+ .join(',')
127
+ .toLowerCase()
128
+ .includes(decodeURIComponent(keywords).toLowerCase());
129
+ });
130
+ };
131
+
132
+ getPluginCategory = async (
133
+ locale: Locales,
134
+ category: PluginCategory,
135
+ ): Promise<DiscoverPlugintem[]> => {
136
+ const list = await this.getPluginList(locale);
137
+ return list.filter((item) => item.meta.category === category);
138
+ };
139
+
140
+ getPluginList = async (locale: Locales): Promise<DiscoverPlugintem[]> => {
141
+ let res = await fetch(this.pluginStore.getPluginIndexUrl(locale), {
142
+ next: { revalidate: 12 * revalidate },
143
+ });
144
+
145
+ if (!res.ok) {
146
+ res = await fetch(this.pluginStore.getPluginIndexUrl(DEFAULT_LANG), {
147
+ next: { revalidate: 12 * revalidate },
148
+ });
149
+ }
150
+
151
+ const json = await res.json();
152
+ return json.plugins;
153
+ };
154
+
155
+ getPluginByIds = async (locale: Locales, identifiers: string[]): Promise<DiscoverPlugintem[]> => {
156
+ let list = await pMap(
157
+ identifiers,
158
+ async (identifier) => this.getPluginById(locale, identifier),
159
+ {
160
+ concurrency: 5,
161
+ },
162
+ );
163
+
164
+ return list.filter(Boolean) as DiscoverPlugintem[];
165
+ };
166
+
167
+ getPluginById = async (
168
+ locale: Locales,
169
+ identifier: string,
170
+ withManifest?: boolean,
171
+ ): Promise<DiscoverPlugintem | undefined> => {
172
+ const list = await this.getPluginList(locale);
173
+ let plugin = list.find((item) => item.identifier === identifier) as DiscoverPlugintem;
174
+
175
+ if (!plugin) return;
176
+
177
+ plugin = merge(cloneDeep(DEFAULT_DISCOVER_PLUGIN_ITEM), plugin);
178
+
179
+ if (withManifest) {
180
+ const manifest = isString(plugin?.manifest)
181
+ ? await getToolManifest(plugin.manifest)
182
+ : plugin?.manifest;
183
+
184
+ plugin = {
185
+ ...plugin,
186
+ manifest,
187
+ } as DiscoverPlugintem;
188
+ }
189
+
190
+ const categoryItems = await this.getPluginCategory(
191
+ locale,
192
+ plugin.meta.category || PluginCategory.Tools,
193
+ );
194
+
195
+ plugin = {
196
+ ...plugin,
197
+ suggestions: categoryItems
198
+ .filter((item) => item.identifier !== plugin.identifier)
199
+ .slice(0, 5) as any,
200
+ } as DiscoverPlugintem;
201
+
202
+ return plugin;
203
+ };
204
+
205
+ // Providers
206
+
207
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
208
+ getProviderList = async (locale: Locales): Promise<DiscoverProviderItem[]> => {
209
+ const list = DEFAULT_MODEL_PROVIDER_LIST.filter((item) => item.chatModels.length > 0);
210
+ return list.map((item) => {
211
+ const provider = {
212
+ identifier: item.id,
213
+ meta: {
214
+ ...item,
215
+ title: item.name,
216
+ },
217
+ models: item.chatModels.map((item) => item.id),
218
+ };
219
+ return merge(cloneDeep(DEFAULT_DISCOVER_PROVIDER_ITEM), provider) as DiscoverProviderItem;
220
+ });
221
+ };
222
+
223
+ searchProvider = async (locale: Locales, keywords: string): Promise<DiscoverProviderItem[]> => {
224
+ const list = await this.getProviderList(locale);
225
+ return list.filter((item) => {
226
+ return [item.identifier, item.meta.title]
227
+ .filter(Boolean)
228
+ .join(',')
229
+ .toLowerCase()
230
+ .includes(decodeURIComponent(keywords).toLowerCase());
231
+ });
232
+ };
233
+
234
+ getProviderById = async (
235
+ locale: Locales,
236
+ id: string,
237
+ ): Promise<DiscoverProviderItem | undefined> => {
238
+ const list = await this.getProviderList(locale);
239
+ let provider = list.find((item) => item.identifier === id);
240
+
241
+ if (!provider) return;
242
+
243
+ provider = {
244
+ ...provider,
245
+ suggestions: list
246
+ .filter((item) => item.identifier !== provider?.identifier)
247
+ .slice(0, 5) as any,
248
+ };
249
+
250
+ return merge(cloneDeep(DEFAULT_DISCOVER_PROVIDER_ITEM), provider) as DiscoverProviderItem;
251
+ };
252
+
253
+ getProviderByIds = async (
254
+ locale: Locales,
255
+ identifiers: string[],
256
+ ): Promise<DiscoverProviderItem[]> => {
257
+ const list = await pMap(
258
+ identifiers,
259
+ async (identifier) => this.getProviderById(locale, identifier),
260
+ {
261
+ concurrency: 5,
262
+ },
263
+ );
264
+
265
+ return list.filter(Boolean) as DiscoverProviderItem[];
266
+ };
267
+
268
+ // Models
269
+
270
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
271
+ private _getModelList = async (locale: Locales): Promise<DiscoverModelItem[]> => {
272
+ const list = DEFAULT_MODEL_PROVIDER_LIST.filter((item) => item.chatModels.length > 0);
273
+ const providers = await this.getProviderList(locale);
274
+
275
+ return list.flatMap((provider) => {
276
+ return provider.chatModels.map((item) => {
277
+ const ids = item.id.split('/')[1] || item.id;
278
+ const providerIds = providers
279
+ .filter((provider) => provider.models.join('').includes(ids))
280
+ .map((provider) => provider.identifier);
281
+ const model = {
282
+ identifier: item.id,
283
+ meta: {
284
+ ...item,
285
+ category: provider.id,
286
+ title: item.displayName || item.id,
287
+ },
288
+ providers: providerIds,
289
+ suggestions: [],
290
+ };
291
+ return merge(cloneDeep(DEFAULT_DISCOVER_MODEL_ITEM), model) as DiscoverModelItem;
292
+ });
293
+ });
294
+ };
295
+
296
+ getModelList = async (locale: Locales): Promise<DiscoverModelItem[]> => {
297
+ const list = await this._getModelList(locale);
298
+
299
+ return uniqBy(list, (item) => {
300
+ const ids = item.identifier.split('/');
301
+ return ids[1] || item.identifier;
302
+ });
303
+ };
304
+
305
+ searchModel = async (locale: Locales, keywords: string): Promise<DiscoverModelItem[]> => {
306
+ const list = await this.getModelList(locale);
307
+ return list.filter((item) => {
308
+ return [item.identifier, item.meta.title, item.meta.description, item.providers]
309
+ .flat()
310
+ .filter(Boolean)
311
+ .join(',')
312
+ .toLowerCase()
313
+ .includes(decodeURIComponent(keywords).toLowerCase());
314
+ });
315
+ };
316
+
317
+ getModelCategory = async (locale: Locales, category: string): Promise<DiscoverModelItem[]> => {
318
+ const list = await this._getModelList(locale);
319
+ return list.filter((item) => item.meta.category === category);
320
+ };
321
+
322
+ getModelById = async (locale: Locales, id: string): Promise<DiscoverModelItem | undefined> => {
323
+ const list = await this.getModelList(locale);
324
+ let model = list.find((item) => item.identifier === id);
325
+
326
+ if (!model) return;
327
+
328
+ const categoryItems = model?.meta?.category
329
+ ? await this.getModelCategory(locale, model.meta.category)
330
+ : [];
331
+
332
+ model = {
333
+ ...model,
334
+ suggestions: categoryItems
335
+ .filter((item) => item.identifier !== model?.identifier)
336
+ .slice(0, 5) as any,
337
+ };
338
+
339
+ return merge(cloneDeep(DEFAULT_DISCOVER_MODEL_ITEM), model);
340
+ };
341
+
342
+ getModelByIds = async (locale: Locales, identifiers: string[]): Promise<DiscoverModelItem[]> => {
343
+ const list = await pMap(
344
+ identifiers,
345
+ async (identifier) => this.getModelById(locale, identifier),
346
+ {
347
+ concurrency: 5,
348
+ },
349
+ );
350
+ return list.filter(Boolean) as DiscoverModelItem[];
351
+ };
352
+ }
@@ -0,0 +1,40 @@
1
+ import matter from 'gray-matter';
2
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+
5
+ const LAST_MODIFIED = new Date().toISOString();
6
+
7
+ export class DocService {
8
+ async getDocByPath(locale: string, path: string) {
9
+ const extra = locale === 'zh-CN' ? '.zh-CN.mdx' : '.mdx';
10
+
11
+ const localPath = join(process.cwd(), 'docs/', path) + extra;
12
+
13
+ const isLocalePathExist = existsSync(localPath);
14
+
15
+ if (!isLocalePathExist) return;
16
+
17
+ const text: string = readFileSync(localPath, 'utf8');
18
+
19
+ if (!text) return;
20
+
21
+ const { data, content } = matter(text);
22
+
23
+ const regex = /^#\s(.+)/;
24
+ const match = regex.exec(content);
25
+ const matches = content.split(regex);
26
+ const description = matches[1] ? matches[1].trim() : '';
27
+ return {
28
+ date: data?.date ? new Date(data.date) : new Date(LAST_MODIFIED),
29
+ description: description.replaceAll('\n', '').replaceAll(' ', ' ').slice(0, 160),
30
+ tags: [],
31
+ title: match ? match[1] : '',
32
+ ...data,
33
+ content,
34
+ };
35
+ }
36
+ }
37
+
38
+ // 很奇怪,需要加一行这个 `readdirSync` 才能在 vercel 部署后读到 md 文件
39
+ // 否则没法正常找到 mdx 文件
40
+ readdirSync(join(process.cwd(), 'docs'));
@@ -6,15 +6,20 @@ import { existsSync, readFileSync } from 'node:fs';
6
6
  import { join } from 'node:path';
7
7
 
8
8
  import { DEFAULT_LANG, LOBE_LOCALE_COOKIE } from '@/const/locale';
9
- import { NS, normalizeLocale } from '@/locales/resources';
9
+ import { Locales, NS, normalizeLocale } from '@/locales/resources';
10
10
  import { isDev } from '@/utils/env';
11
11
 
12
- export const translation = async (ns: NS = 'common') => {
12
+ export const getLocale = async (hl?: string): Promise<Locales> => {
13
+ if (hl) return normalizeLocale(hl) as Locales;
14
+ const cookieStore = cookies();
15
+ const defaultLang = cookieStore.get(LOBE_LOCALE_COOKIE);
16
+ return (defaultLang?.value || DEFAULT_LANG) as Locales;
17
+ };
18
+
19
+ export const translation = async (ns: NS = 'common', hl?: string) => {
13
20
  let i18ns = {};
21
+ const lng = await getLocale(hl);
14
22
  try {
15
- const cookieStore = cookies();
16
- const defaultLang = cookieStore.get(LOBE_LOCALE_COOKIE);
17
- const lng = defaultLang?.value || DEFAULT_LANG;
18
23
  let filepath = join(process.cwd(), `locales/${normalizeLocale(lng)}/${ns}.json`);
19
24
  const isExist = existsSync(filepath);
20
25
  if (!isExist)
@@ -29,6 +34,7 @@ export const translation = async (ns: NS = 'common') => {
29
34
  }
30
35
 
31
36
  return {
37
+ locale: lng,
32
38
  t: (key: string, options: { [key: string]: string } = {}) => {
33
39
  if (!i18ns) return key;
34
40
  let content = get(i18ns, key);
@@ -78,7 +78,7 @@ getWolframCloudResults guidelines:
78
78
  }
79
79
  `;
80
80
 
81
- exports[`ToolService > getPluginManifest > support OpenAPI manifest > should get plugin manifest 1`] = `
81
+ exports[`ToolService > getToolManifest > support OpenAPI manifest > should get plugin manifest 1`] = `
82
82
  {
83
83
  "$schema": "../node_modules/@lobehub/chat-plugin-sdk/schema.json",
84
84
  "api": [
@@ -9,7 +9,7 @@ import {
9
9
  UserModelProviderConfig,
10
10
  } from '@/types/user/settings';
11
11
 
12
- import { getProviderAuthPayload } from './_auth';
12
+ import { getProviderAuthPayload } from '../_auth';
13
13
 
14
14
  // Mock data for different providers
15
15
  const mockZhiPuAPIKey = 'zhipu-api-key';