@lobehub/chat 1.96.20 → 1.97.1

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 (523) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +90 -32
  3. package/README.zh-CN.md +90 -34
  4. package/apps/desktop/package.json +1 -1
  5. package/apps/desktop/src/main/core/Browser.ts +2 -1
  6. package/apps/desktop/src/main/utils/next-electron-rsc.ts +15 -8
  7. package/changelog/v1.json +18 -0
  8. package/docs/usage/features/desktop.mdx +53 -0
  9. package/docs/usage/features/desktop.zh-CN.mdx +49 -0
  10. package/docs/usage/features/mcp-market.mdx +26 -0
  11. package/docs/usage/features/mcp-market.zh-CN.mdx +22 -0
  12. package/docs/usage/features/mcp.mdx +58 -0
  13. package/docs/usage/features/mcp.zh-CN.mdx +54 -0
  14. package/docs/usage/features/search.mdx +56 -0
  15. package/docs/usage/features/search.zh-CN.mdx +52 -0
  16. package/locales/ar/discover.json +452 -12
  17. package/locales/ar/metadata.json +4 -0
  18. package/locales/ar/plugin.json +89 -2
  19. package/locales/ar/setting.json +1 -0
  20. package/locales/bg-BG/discover.json +452 -12
  21. package/locales/bg-BG/metadata.json +4 -0
  22. package/locales/bg-BG/plugin.json +89 -2
  23. package/locales/bg-BG/setting.json +1 -0
  24. package/locales/de-DE/discover.json +452 -12
  25. package/locales/de-DE/metadata.json +4 -0
  26. package/locales/de-DE/plugin.json +89 -2
  27. package/locales/de-DE/setting.json +1 -0
  28. package/locales/en-US/discover.json +452 -12
  29. package/locales/en-US/metadata.json +4 -0
  30. package/locales/en-US/plugin.json +89 -2
  31. package/locales/en-US/setting.json +1 -0
  32. package/locales/es-ES/discover.json +452 -12
  33. package/locales/es-ES/metadata.json +4 -0
  34. package/locales/es-ES/plugin.json +89 -2
  35. package/locales/es-ES/setting.json +1 -0
  36. package/locales/fa-IR/discover.json +452 -12
  37. package/locales/fa-IR/metadata.json +4 -0
  38. package/locales/fa-IR/plugin.json +89 -2
  39. package/locales/fa-IR/setting.json +1 -0
  40. package/locales/fr-FR/discover.json +452 -12
  41. package/locales/fr-FR/metadata.json +4 -0
  42. package/locales/fr-FR/plugin.json +89 -2
  43. package/locales/fr-FR/setting.json +1 -0
  44. package/locales/it-IT/discover.json +452 -12
  45. package/locales/it-IT/metadata.json +4 -0
  46. package/locales/it-IT/plugin.json +89 -2
  47. package/locales/it-IT/setting.json +1 -0
  48. package/locales/ja-JP/discover.json +452 -12
  49. package/locales/ja-JP/metadata.json +4 -0
  50. package/locales/ja-JP/plugin.json +89 -2
  51. package/locales/ja-JP/setting.json +1 -0
  52. package/locales/ko-KR/discover.json +452 -12
  53. package/locales/ko-KR/metadata.json +4 -0
  54. package/locales/ko-KR/plugin.json +89 -2
  55. package/locales/ko-KR/setting.json +1 -0
  56. package/locales/nl-NL/discover.json +452 -12
  57. package/locales/nl-NL/metadata.json +4 -0
  58. package/locales/nl-NL/plugin.json +89 -2
  59. package/locales/nl-NL/setting.json +1 -0
  60. package/locales/pl-PL/discover.json +452 -12
  61. package/locales/pl-PL/metadata.json +4 -0
  62. package/locales/pl-PL/plugin.json +89 -2
  63. package/locales/pl-PL/setting.json +1 -0
  64. package/locales/pt-BR/discover.json +452 -12
  65. package/locales/pt-BR/metadata.json +4 -0
  66. package/locales/pt-BR/plugin.json +89 -2
  67. package/locales/pt-BR/setting.json +1 -0
  68. package/locales/ru-RU/discover.json +452 -12
  69. package/locales/ru-RU/metadata.json +4 -0
  70. package/locales/ru-RU/plugin.json +89 -2
  71. package/locales/ru-RU/setting.json +1 -0
  72. package/locales/tr-TR/discover.json +452 -12
  73. package/locales/tr-TR/metadata.json +4 -0
  74. package/locales/tr-TR/plugin.json +89 -2
  75. package/locales/tr-TR/setting.json +1 -0
  76. package/locales/vi-VN/discover.json +452 -12
  77. package/locales/vi-VN/metadata.json +4 -0
  78. package/locales/vi-VN/plugin.json +89 -2
  79. package/locales/vi-VN/setting.json +1 -0
  80. package/locales/zh-CN/discover.json +452 -12
  81. package/locales/zh-CN/metadata.json +8 -4
  82. package/locales/zh-CN/plugin.json +89 -2
  83. package/locales/zh-CN/setting.json +1 -0
  84. package/locales/zh-TW/discover.json +452 -12
  85. package/locales/zh-TW/metadata.json +4 -0
  86. package/locales/zh-TW/plugin.json +89 -2
  87. package/locales/zh-TW/setting.json +1 -0
  88. package/next.config.ts +70 -19
  89. package/package.json +7 -3
  90. package/scripts/buildSitemapIndex/index.ts +9 -4
  91. package/src/app/(backend)/trpc/async/[trpc]/route.ts +4 -2
  92. package/src/app/(backend)/trpc/lambda/[trpc]/route.ts +5 -0
  93. package/src/app/[variants]/(main)/_layout/Mobile/index.tsx +5 -4
  94. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/InboxWelcome/AgentsSuggest.tsx +31 -45
  95. package/src/app/[variants]/(main)/discover/(detail)/_layout/Desktop.tsx +8 -6
  96. package/src/app/[variants]/(main)/discover/(detail)/_layout/Mobile/Header.tsx +3 -2
  97. package/src/app/[variants]/(main)/discover/(detail)/_layout/Mobile/index.tsx +5 -1
  98. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/Client.tsx +40 -0
  99. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/DetailProvider.tsx +19 -0
  100. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/Capabilities/Block.tsx +27 -0
  101. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/Capabilities/Knowledge.tsx +33 -0
  102. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/Capabilities/KnowledgeItem.tsx +58 -0
  103. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/Capabilities/PluginItem.tsx +68 -0
  104. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/Capabilities/Plugins.tsx +32 -0
  105. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/Capabilities/index.tsx +37 -0
  106. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/Nav.tsx +121 -0
  107. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/Overview/TagList.tsx +47 -0
  108. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/Overview/index.tsx +96 -0
  109. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/Related/index.tsx +31 -0
  110. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/SystemRole/TagList.tsx +47 -0
  111. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/SystemRole/index.tsx +54 -0
  112. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Details/index.tsx +49 -0
  113. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Header.tsx +176 -0
  114. package/src/app/[variants]/(main)/discover/(detail)/assistant/{[slug]/features → [...slugs]/features/Sidebar/ActionButton}/AddAgent.tsx +22 -21
  115. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Sidebar/ActionButton/index.tsx +31 -0
  116. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Sidebar/Related/Item.tsx +57 -0
  117. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Sidebar/Related/index.tsx +43 -0
  118. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Sidebar/Summary/index.tsx +38 -0
  119. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Sidebar/TocList/index.tsx +77 -0
  120. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/features/Sidebar/index.tsx +46 -0
  121. package/src/app/[variants]/(main)/discover/(detail)/assistant/[...slugs]/loading.tsx +48 -0
  122. package/src/app/[variants]/(main)/discover/(detail)/{plugin/[slug] → assistant/[...slugs]}/page.tsx +39 -42
  123. package/src/app/[variants]/(main)/discover/(detail)/features/Breadcrumb.tsx +56 -0
  124. package/src/app/[variants]/(main)/discover/(detail)/features/DetailLayout.tsx +0 -1
  125. package/src/app/[variants]/(main)/discover/(detail)/features/MakedownRender.tsx +44 -0
  126. package/src/app/[variants]/(main)/discover/(detail)/features/ShareButton.tsx +4 -3
  127. package/src/app/[variants]/(main)/discover/(detail)/features/Toc/Heading.tsx +108 -0
  128. package/src/app/[variants]/(main)/discover/(detail)/features/Toc/index.tsx +92 -0
  129. package/src/app/[variants]/(main)/discover/(detail)/features/Toc/useToc.tsx +66 -0
  130. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/Client.tsx +43 -0
  131. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/features/Details/Related/index.tsx +32 -0
  132. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/features/Details/Versions/index.tsx +76 -0
  133. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/features/Details/index.tsx +59 -0
  134. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/features/Sidebar/ActionButton/index.tsx +84 -0
  135. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/features/Sidebar/ConnectionTypeAlert.tsx +35 -0
  136. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/features/Sidebar/Related/Item.tsx +57 -0
  137. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/features/Sidebar/Related/index.tsx +44 -0
  138. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/features/Sidebar/ServerConfig.tsx +36 -0
  139. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/features/Sidebar/TocList/index.tsx +98 -0
  140. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/features/Sidebar/index.tsx +58 -0
  141. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/loading.tsx +1 -0
  142. package/src/app/[variants]/(main)/discover/(detail)/mcp/[slug]/page.tsx +103 -0
  143. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/Client.tsx +40 -0
  144. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/DetailProvider.tsx +19 -0
  145. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Details/Nav.tsx +90 -0
  146. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Details/Overview/ProviderList/index.tsx +179 -0
  147. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Details/Overview/index.tsx +22 -0
  148. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/{ParameterList → Details/Parameter}/ParameterItem.tsx +1 -1
  149. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/{ParameterList → Details/Parameter}/index.tsx +11 -11
  150. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Details/Related/index.tsx +31 -0
  151. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Details/index.tsx +47 -0
  152. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Header.tsx +84 -59
  153. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Sidebar/ActionButton/ChatWithModel.tsx +92 -0
  154. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Sidebar/ActionButton/index.tsx +32 -0
  155. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Sidebar/Related/Item.tsx +60 -0
  156. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Sidebar/Related/index.tsx +43 -0
  157. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Sidebar/RelatedProviders/Item.tsx +60 -0
  158. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Sidebar/RelatedProviders/index.tsx +34 -0
  159. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Sidebar/index.tsx +44 -0
  160. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/loading.tsx +1 -0
  161. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/page.tsx +22 -45
  162. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/Client.tsx +40 -0
  163. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/DetailProvider.tsx +19 -0
  164. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Details/Guide/index.tsx +25 -0
  165. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Details/Nav.tsx +99 -0
  166. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Details/Overview/ModelList/index.tsx +142 -0
  167. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Details/Overview/index.tsx +23 -0
  168. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Details/Related/index.tsx +22 -0
  169. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Details/index.tsx +47 -0
  170. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Header.tsx +99 -0
  171. package/src/app/[variants]/(main)/discover/(detail)/provider/{[slug]/features → [...slugs]/features/Sidebar/ActionButton}/ProviderConfig.tsx +9 -14
  172. package/src/app/[variants]/(main)/discover/(detail)/provider/{[slug]/features/Actions.tsx → [...slugs]/features/Sidebar/ActionButton/index.tsx} +14 -18
  173. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Sidebar/Related/Item.tsx +60 -0
  174. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Sidebar/Related/index.tsx +34 -0
  175. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Sidebar/RelatedModels/Item.tsx +60 -0
  176. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Sidebar/RelatedModels/index.tsx +43 -0
  177. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/features/Sidebar/index.tsx +44 -0
  178. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/loading.tsx +1 -0
  179. package/src/app/[variants]/(main)/discover/(detail)/provider/[...slugs]/page.tsx +103 -0
  180. package/src/app/[variants]/(main)/discover/(list)/(home)/Client.tsx +24 -21
  181. package/src/app/[variants]/(main)/discover/(list)/(home)/loading.tsx +1 -1
  182. package/src/app/[variants]/(main)/discover/(list)/(home)/page.tsx +13 -38
  183. package/src/app/[variants]/(main)/discover/(list)/_layout/Desktop/Nav.tsx +15 -8
  184. package/src/app/[variants]/(main)/discover/(list)/_layout/Mobile/Header.tsx +1 -1
  185. package/src/app/[variants]/(main)/discover/(list)/_layout/Mobile/Nav.tsx +2 -1
  186. package/src/app/[variants]/(main)/discover/(list)/assistant/Client.tsx +44 -0
  187. package/src/app/[variants]/(main)/discover/(list)/assistant/features/Category/index.tsx +84 -0
  188. package/src/app/[variants]/(main)/discover/(list)/assistant/features/Category/useCategory.tsx +112 -0
  189. package/src/app/[variants]/(main)/discover/(list)/assistant/features/List/Item.tsx +189 -0
  190. package/src/app/[variants]/(main)/discover/(list)/assistant/features/List/TokenTag.tsx +70 -0
  191. package/src/app/[variants]/(main)/discover/(list)/assistant/features/List/index.tsx +33 -0
  192. package/src/app/[variants]/(main)/discover/(list)/assistant/page.tsx +46 -0
  193. package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +67 -0
  194. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +184 -0
  195. package/src/app/[variants]/(main)/discover/(list)/mcp/Client.tsx +44 -0
  196. package/src/app/[variants]/(main)/discover/(list)/mcp/features/Category/index.tsx +83 -0
  197. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/ConnectionTypeTag.tsx +51 -0
  198. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +225 -0
  199. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/MetaInfo.tsx +33 -0
  200. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/index.tsx +33 -0
  201. package/src/app/[variants]/(main)/discover/(list)/mcp/page.tsx +46 -0
  202. package/src/app/[variants]/(main)/discover/(list)/model/Client.tsx +44 -0
  203. package/src/app/[variants]/(main)/discover/(list)/{models → model}/_layout/Desktop.tsx +1 -7
  204. package/src/app/[variants]/(main)/discover/(list)/model/features/Category/index.tsx +82 -0
  205. package/src/app/[variants]/(main)/discover/(list)/model/features/Category/useCategory.tsx +41 -0
  206. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +190 -0
  207. package/src/app/[variants]/(main)/discover/(list)/model/features/List/ModelTypeIcon.tsx +39 -0
  208. package/src/app/[variants]/(main)/discover/(list)/model/features/List/index.tsx +33 -0
  209. package/src/app/[variants]/(main)/discover/(list)/model/loading.tsx +1 -0
  210. package/src/app/[variants]/(main)/discover/(list)/model/page.tsx +44 -0
  211. package/src/app/[variants]/(main)/discover/(list)/provider/Client.tsx +43 -0
  212. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +136 -0
  213. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/index.tsx +33 -0
  214. package/src/app/[variants]/(main)/discover/(list)/provider/loading.tsx +1 -0
  215. package/src/app/[variants]/(main)/discover/(list)/provider/page.tsx +44 -0
  216. package/src/app/[variants]/(main)/discover/_layout/Desktop/Header.tsx +1 -1
  217. package/src/app/[variants]/(main)/discover/components/CategoryContainer.tsx +7 -5
  218. package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +28 -30
  219. package/src/app/[variants]/(main)/discover/components/ListLoading.tsx +56 -46
  220. package/src/app/[variants]/(main)/discover/components/Statistic.tsx +5 -6
  221. package/src/app/[variants]/(main)/discover/features/Search.tsx +62 -0
  222. package/src/app/[variants]/(main)/discover/features/Title.tsx +83 -0
  223. package/src/app/[variants]/(main)/discover/features/__tests__/calculateScore.test.ts +185 -0
  224. package/src/app/[variants]/(main)/discover/features/useNav.tsx +32 -12
  225. package/src/app/robots.tsx +7 -5
  226. package/src/app/sitemap.tsx +81 -13
  227. package/src/components/CopyableLabel/index.tsx +37 -0
  228. package/src/components/Descriptions/index.tsx +119 -0
  229. package/src/components/InlineTable/index.tsx +69 -0
  230. package/src/{features/PluginSettings/PluginSettingRender.tsx → components/JSONSchemaConfig/ItemRender.tsx} +3 -3
  231. package/src/components/MCPDepsIcon/Java.tsx +23 -0
  232. package/src/components/MCPDepsIcon/PowerShell.tsx +23 -0
  233. package/src/components/MCPDepsIcon/Terminal.tsx +23 -0
  234. package/src/components/MCPDepsIcon/UV.tsx +23 -0
  235. package/src/components/MCPDepsIcon/index.tsx +72 -0
  236. package/src/components/MCPStdioCommandInput/index.tsx +47 -0
  237. package/src/components/OfficialIcon.tsx +23 -0
  238. package/src/components/Plugins/MCPTag.tsx +18 -0
  239. package/src/components/Plugins/PluginTag.tsx +50 -0
  240. package/src/components/PublishedTime.tsx +71 -0
  241. package/src/config/__tests__/app.test.ts +6 -2
  242. package/src/const/discover.ts +8 -34
  243. package/src/database/models/message.ts +1 -0
  244. package/src/database/models/plugin.ts +13 -3
  245. package/src/database/schemas/relations.ts +44 -0
  246. package/src/envs/app.ts +1 -1
  247. package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
  248. package/src/features/ChatInput/ActionBar/Tools/ToolItem.tsx +1 -1
  249. package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +5 -5
  250. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/index.tsx +25 -11
  251. package/src/features/MCP/MCPInstallProgress/InstallError/ErrorDetails.tsx +110 -0
  252. package/src/features/MCP/MCPInstallProgress/InstallError/index.tsx +51 -0
  253. package/src/features/MCP/MCPInstallProgress/MCPConfigForm.tsx +151 -0
  254. package/src/features/MCP/MCPInstallProgress/MCPDependenciesGuide.tsx +217 -0
  255. package/src/features/MCP/MCPInstallProgress/index.tsx +118 -0
  256. package/src/features/MCP/Scores.tsx +268 -0
  257. package/src/features/MCP/calculateScore.ts +324 -0
  258. package/src/features/MCP/useScoreList.ts +126 -0
  259. package/src/features/MCP/utils.ts +225 -0
  260. package/src/features/MCPPluginDetail/CollapseDesc.tsx +44 -0
  261. package/src/features/MCPPluginDetail/CollapseLayout.tsx +34 -0
  262. package/src/features/MCPPluginDetail/Deployment/Platform/index.tsx +47 -0
  263. package/src/features/MCPPluginDetail/Deployment/index.tsx +322 -0
  264. package/src/features/MCPPluginDetail/DetailProvider.tsx +19 -0
  265. package/src/features/MCPPluginDetail/Header.tsx +218 -0
  266. package/src/features/MCPPluginDetail/Nav.tsx +196 -0
  267. package/src/features/MCPPluginDetail/Overview/TagList.tsx +47 -0
  268. package/src/features/MCPPluginDetail/Overview/index.tsx +57 -0
  269. package/src/features/MCPPluginDetail/Schema/Block.tsx +50 -0
  270. package/src/features/MCPPluginDetail/Schema/Prompts.tsx +125 -0
  271. package/src/features/MCPPluginDetail/Schema/Resources.tsx +70 -0
  272. package/src/features/MCPPluginDetail/Schema/Tools.tsx +146 -0
  273. package/src/features/MCPPluginDetail/Schema/index.tsx +63 -0
  274. package/src/features/MCPPluginDetail/Schema/style.ts +9 -0
  275. package/src/features/MCPPluginDetail/Schema/types.ts +4 -0
  276. package/src/features/MCPPluginDetail/Score/GithubBadge/index.tsx +82 -0
  277. package/src/features/MCPPluginDetail/Score/ScoreItem.tsx +34 -0
  278. package/src/features/MCPPluginDetail/Score/ScoreList.tsx +24 -0
  279. package/src/features/MCPPluginDetail/Score/TotalScore.tsx +289 -0
  280. package/src/features/MCPPluginDetail/Score/index.tsx +88 -0
  281. package/src/features/PluginAvatar/index.tsx +1 -1
  282. package/src/features/PluginDetailModal/Meta.tsx +3 -4
  283. package/src/features/PluginDevModal/MCPManifestForm/MCPTypeSelect.tsx +3 -4
  284. package/src/features/PluginDevModal/MCPManifestForm/index.tsx +4 -41
  285. package/src/features/PluginDevModal/PluginPreview/EmptyState.tsx +5 -7
  286. package/src/features/PluginDevModal/PluginPreview/index.tsx +6 -6
  287. package/src/features/PluginSettings/index.tsx +2 -2
  288. package/src/features/PluginStore/AddPluginButton.tsx +1 -1
  289. package/src/features/PluginStore/Content.tsx +59 -0
  290. package/src/features/PluginStore/InstalledList/Detail/CustomPluginEmptyState.tsx +81 -0
  291. package/src/features/PluginStore/InstalledList/Detail/index.tsx +21 -0
  292. package/src/features/PluginStore/InstalledList/EditCustomPlugin.tsx +52 -0
  293. package/src/features/PluginStore/{PluginItem → InstalledList/List/Item}/Action.tsx +33 -13
  294. package/src/features/PluginStore/InstalledList/List/Item/index.tsx +62 -0
  295. package/src/features/PluginStore/InstalledList/List/index.tsx +77 -0
  296. package/src/features/PluginStore/InstalledList/index.tsx +85 -0
  297. package/src/features/PluginStore/Loading.tsx +2 -2
  298. package/src/features/PluginStore/McpList/Detail/Loading.tsx +44 -0
  299. package/src/features/PluginStore/McpList/Detail/Settings/index.tsx +381 -0
  300. package/src/features/PluginStore/McpList/Detail/index.tsx +71 -0
  301. package/src/features/PluginStore/McpList/List/Action.tsx +94 -0
  302. package/src/features/PluginStore/McpList/List/Item.tsx +84 -0
  303. package/src/features/PluginStore/McpList/List/index.tsx +97 -0
  304. package/src/features/PluginStore/McpList/index.tsx +54 -0
  305. package/src/features/PluginStore/PluginList/Detail/DetailProvider.tsx +19 -0
  306. package/src/features/PluginStore/PluginList/Detail/EmptyState.tsx +58 -0
  307. package/src/features/PluginStore/PluginList/Detail/Header.tsx +132 -0
  308. package/src/features/PluginStore/PluginList/Detail/InstallDetail/Nav.tsx +75 -0
  309. package/src/features/PluginStore/PluginList/Detail/InstallDetail/Settings.tsx +19 -0
  310. package/src/features/PluginStore/PluginList/Detail/InstallDetail/Tools.tsx +109 -0
  311. package/src/features/PluginStore/PluginList/Detail/InstallDetail/index.tsx +24 -0
  312. package/src/features/PluginStore/PluginList/Detail/Loading.tsx +44 -0
  313. package/src/features/PluginStore/PluginList/Detail/TagList.tsx +37 -0
  314. package/src/features/PluginStore/PluginList/Detail/index.tsx +39 -0
  315. package/src/features/PluginStore/PluginList/Detail/useCategory.tsx +76 -0
  316. package/src/features/PluginStore/PluginList/List/Action.tsx +72 -0
  317. package/src/features/PluginStore/PluginList/List/Item.tsx +94 -0
  318. package/src/features/PluginStore/PluginList/List/index.tsx +91 -0
  319. package/src/features/PluginStore/PluginList/index.tsx +47 -0
  320. package/src/features/PluginStore/Search/index.tsx +29 -0
  321. package/src/features/PluginStore/VirtuosoLoading.tsx +16 -0
  322. package/src/features/PluginStore/index.tsx +7 -31
  323. package/src/features/PluginTag/index.tsx +6 -4
  324. package/src/hooks/useInterceptingRoutes.test.ts +6 -0
  325. package/src/hooks/useMCPCategory.tsx +133 -0
  326. package/src/hooks/useQuery.ts +8 -0
  327. package/src/hooks/useQueryRoute.test.ts +7 -0
  328. package/src/hooks/useQueryRoute.ts +5 -3
  329. package/src/layout/GlobalProvider/Locale.tsx +2 -1
  330. package/src/libs/mcp/client.ts +255 -11
  331. package/src/libs/mcp/types.ts +99 -0
  332. package/src/libs/trpc/client/desktop.ts +2 -3
  333. package/src/libs/trpc/lambda/context.ts +36 -5
  334. package/src/libs/trpc/lambda/index.ts +1 -1
  335. package/src/libs/trpc/lambda/init.ts +8 -1
  336. package/src/locales/create.ts +8 -3
  337. package/src/locales/default/discover.ts +457 -12
  338. package/src/locales/default/metadata.ts +9 -4
  339. package/src/locales/default/plugin.ts +89 -1
  340. package/src/locales/default/setting.ts +1 -0
  341. package/src/locales/resources.ts +1 -1
  342. package/src/middleware.ts +13 -3
  343. package/src/server/ld.ts +4 -3
  344. package/src/server/modules/AssistantStore/index.test.ts +10 -8
  345. package/src/server/modules/AssistantStore/index.ts +37 -17
  346. package/src/server/modules/PluginStore/index.test.ts +1 -1
  347. package/src/server/modules/PluginStore/index.ts +24 -1
  348. package/src/server/routers/async/caller.ts +2 -2
  349. package/src/server/routers/desktop/mcp.ts +36 -2
  350. package/src/server/routers/edge/index.ts +0 -6
  351. package/src/server/routers/{edge → lambda}/config/index.ts +1 -1
  352. package/src/server/routers/lambda/index.ts +4 -0
  353. package/src/server/routers/lambda/market/index.ts +621 -0
  354. package/src/server/routers/lambda/plugin.ts +2 -0
  355. package/src/server/routers/tools/mcp.ts +22 -0
  356. package/src/server/services/discover/index.test.ts +573 -250
  357. package/src/server/services/discover/index.ts +1096 -241
  358. package/src/server/services/mcp/deps/MCPSystemDepsCheckService.ts +238 -0
  359. package/src/server/services/mcp/deps/checkers/ManualInstallationChecker.ts +20 -0
  360. package/src/server/services/mcp/deps/checkers/NpmInstallationChecker.ts +51 -0
  361. package/src/server/services/mcp/deps/checkers/PythonInstallationChecker.ts +69 -0
  362. package/src/server/services/mcp/deps/index.ts +14 -0
  363. package/src/server/services/mcp/deps/types.ts +49 -0
  364. package/src/server/services/mcp/index.ts +251 -33
  365. package/src/server/sitemap.test.ts +203 -46
  366. package/src/server/sitemap.ts +159 -52
  367. package/src/services/__tests__/global.test.ts +4 -7
  368. package/src/services/__tests__/tool.test.ts +1 -29
  369. package/src/services/discover.ts +365 -0
  370. package/src/services/global.ts +3 -3
  371. package/src/services/mcp.ts +131 -10
  372. package/src/services/plugin/_deprecated.ts +1 -1
  373. package/src/services/plugin/type.ts +3 -1
  374. package/src/services/tool.ts +9 -6
  375. package/src/store/chat/slices/plugin/action.test.ts +2 -3
  376. package/src/store/chat/slices/plugin/action.ts +22 -4
  377. package/src/store/discover/index.ts +1 -0
  378. package/src/store/discover/slices/assistant/action.ts +73 -0
  379. package/src/store/discover/slices/assistant/index.ts +1 -0
  380. package/src/store/discover/slices/mcp/action.ts +70 -0
  381. package/src/store/discover/slices/mcp/index.ts +1 -0
  382. package/src/store/discover/slices/model/action.ts +70 -0
  383. package/src/store/discover/slices/model/index.ts +1 -0
  384. package/src/store/discover/slices/plugin/action.ts +76 -0
  385. package/src/store/discover/slices/plugin/index.ts +1 -0
  386. package/src/store/discover/slices/provider/action.ts +61 -0
  387. package/src/store/discover/slices/provider/index.ts +1 -0
  388. package/src/store/discover/store.ts +39 -0
  389. package/src/store/tool/initialState.ts +8 -2
  390. package/src/store/tool/selectors/index.ts +2 -1
  391. package/src/store/tool/selectors/tool.test.ts +3 -1
  392. package/src/store/tool/selectors/tool.ts +14 -2
  393. package/src/store/tool/slices/mcpStore/action.ts +496 -0
  394. package/src/store/tool/slices/mcpStore/initialState.ts +40 -0
  395. package/src/store/tool/slices/mcpStore/selectors.ts +62 -0
  396. package/src/store/tool/slices/{store → oldStore}/action.test.ts +24 -19
  397. package/src/store/tool/slices/oldStore/action.ts +269 -0
  398. package/src/store/tool/slices/oldStore/index.ts +3 -0
  399. package/src/store/tool/slices/oldStore/initialState.ts +54 -0
  400. package/src/store/tool/slices/{store → oldStore}/selectors.test.ts +6 -3
  401. package/src/store/tool/slices/{store → oldStore}/selectors.ts +18 -5
  402. package/src/store/tool/slices/plugin/action.test.ts +2 -1
  403. package/src/store/tool/slices/plugin/action.ts +22 -4
  404. package/src/store/tool/slices/plugin/selectors.test.ts +12 -4
  405. package/src/store/tool/slices/plugin/selectors.ts +20 -9
  406. package/src/store/tool/store.ts +5 -2
  407. package/src/types/discover/assistants.ts +72 -0
  408. package/src/types/discover/index.ts +41 -0
  409. package/src/types/discover/mcp.ts +59 -0
  410. package/src/types/discover/models.ts +51 -0
  411. package/src/types/discover/plugins.ts +52 -0
  412. package/src/types/discover/providers.ts +47 -0
  413. package/src/types/message/tools.ts +3 -0
  414. package/src/types/plugins/index.ts +53 -0
  415. package/src/types/plugins/mcp.ts +188 -0
  416. package/src/types/plugins/mcpDeps.ts +30 -0
  417. package/src/types/tool/index.ts +10 -0
  418. package/src/types/tool/plugin.ts +3 -2
  419. package/src/types/tool/tool.ts +4 -1
  420. package/src/utils/client/cookie.ts +5 -2
  421. package/src/utils/locale.ts +3 -3
  422. package/src/utils/object.ts +10 -0
  423. package/src/utils/server/pageProps.ts +9 -0
  424. package/src/utils/toolCall.ts +5 -1
  425. package/src/utils/toolManifest.ts +1 -2
  426. package/vercel.json +1 -1
  427. package/src/app/[variants]/(main)/discover/(detail)/assistant/[slug]/features/Actions.tsx +0 -35
  428. package/src/app/[variants]/(main)/discover/(detail)/assistant/[slug]/features/ConversationExample/TopicList.tsx +0 -75
  429. package/src/app/[variants]/(main)/discover/(detail)/assistant/[slug]/features/ConversationExample/index.tsx +0 -105
  430. package/src/app/[variants]/(main)/discover/(detail)/assistant/[slug]/features/Header.tsx +0 -115
  431. package/src/app/[variants]/(main)/discover/(detail)/assistant/[slug]/features/InfoSidebar/SuggestionItem.tsx +0 -62
  432. package/src/app/[variants]/(main)/discover/(detail)/assistant/[slug]/features/InfoSidebar/ToolItem.tsx +0 -19
  433. package/src/app/[variants]/(main)/discover/(detail)/assistant/[slug]/features/InfoSidebar/index.tsx +0 -60
  434. package/src/app/[variants]/(main)/discover/(detail)/assistant/[slug]/features/SystemRole.tsx +0 -35
  435. package/src/app/[variants]/(main)/discover/(detail)/assistant/[slug]/features/Temp.tsx +0 -44
  436. package/src/app/[variants]/(main)/discover/(detail)/assistant/[slug]/page.tsx +0 -124
  437. package/src/app/[variants]/(main)/discover/(detail)/loading.tsx +0 -38
  438. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/Actions.tsx +0 -40
  439. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/ChatWithModel.tsx +0 -93
  440. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/InfoSidebar/SuggestionItem.tsx +0 -74
  441. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/InfoSidebar/index.tsx +0 -45
  442. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/ProviderList/ProviderItem.tsx +0 -139
  443. package/src/app/[variants]/(main)/discover/(detail)/model/[...slugs]/features/ProviderList/index.tsx +0 -45
  444. package/src/app/[variants]/(main)/discover/(detail)/plugin/[slug]/features/Actions.tsx +0 -35
  445. package/src/app/[variants]/(main)/discover/(detail)/plugin/[slug]/features/Header.tsx +0 -119
  446. package/src/app/[variants]/(main)/discover/(detail)/plugin/[slug]/features/InfoSidebar/SuggestionItem.tsx +0 -64
  447. package/src/app/[variants]/(main)/discover/(detail)/plugin/[slug]/features/InfoSidebar/index.tsx +0 -45
  448. package/src/app/[variants]/(main)/discover/(detail)/plugin/[slug]/features/InstallPlugin.tsx +0 -83
  449. package/src/app/[variants]/(main)/discover/(detail)/plugin/[slug]/features/ParameterList.tsx +0 -95
  450. package/src/app/[variants]/(main)/discover/(detail)/plugin/[slug]/features/Schema.tsx +0 -23
  451. package/src/app/[variants]/(main)/discover/(detail)/provider/[slug]/features/Header.tsx +0 -73
  452. package/src/app/[variants]/(main)/discover/(detail)/provider/[slug]/features/InfoSidebar/SuggestionItem.tsx +0 -77
  453. package/src/app/[variants]/(main)/discover/(detail)/provider/[slug]/features/InfoSidebar/index.tsx +0 -45
  454. package/src/app/[variants]/(main)/discover/(detail)/provider/[slug]/features/ModelList/ModelItem.tsx +0 -152
  455. package/src/app/[variants]/(main)/discover/(detail)/provider/[slug]/features/ModelList/index.tsx +0 -60
  456. package/src/app/[variants]/(main)/discover/(detail)/provider/[slug]/page.tsx +0 -126
  457. package/src/app/[variants]/(main)/discover/(list)/(home)/features/AssistantList.tsx +0 -33
  458. package/src/app/[variants]/(main)/discover/(list)/(home)/features/ModelList.tsx +0 -19
  459. package/src/app/[variants]/(main)/discover/(list)/(home)/features/PluginList.tsx +0 -25
  460. package/src/app/[variants]/(main)/discover/(list)/assistants/[slug]/page.tsx +0 -75
  461. package/src/app/[variants]/(main)/discover/(list)/assistants/features/Card.tsx +0 -195
  462. package/src/app/[variants]/(main)/discover/(list)/assistants/features/Category.tsx +0 -48
  463. package/src/app/[variants]/(main)/discover/(list)/assistants/features/List.tsx +0 -98
  464. package/src/app/[variants]/(main)/discover/(list)/assistants/features/useCategory.tsx +0 -116
  465. package/src/app/[variants]/(main)/discover/(list)/assistants/page.tsx +0 -64
  466. package/src/app/[variants]/(main)/discover/(list)/loading.tsx +0 -39
  467. package/src/app/[variants]/(main)/discover/(list)/models/[slug]/page.tsx +0 -78
  468. package/src/app/[variants]/(main)/discover/(list)/models/features/Card.tsx +0 -118
  469. package/src/app/[variants]/(main)/discover/(list)/models/features/Category.tsx +0 -67
  470. package/src/app/[variants]/(main)/discover/(list)/models/features/List.tsx +0 -71
  471. package/src/app/[variants]/(main)/discover/(list)/models/loading.tsx +0 -1
  472. package/src/app/[variants]/(main)/discover/(list)/models/page.tsx +0 -73
  473. package/src/app/[variants]/(main)/discover/(list)/plugins/[slug]/page.tsx +0 -75
  474. package/src/app/[variants]/(main)/discover/(list)/plugins/features/Card.tsx +0 -161
  475. package/src/app/[variants]/(main)/discover/(list)/plugins/features/Category.tsx +0 -45
  476. package/src/app/[variants]/(main)/discover/(list)/plugins/features/List.tsx +0 -97
  477. package/src/app/[variants]/(main)/discover/(list)/plugins/features/useCategory.tsx +0 -80
  478. package/src/app/[variants]/(main)/discover/(list)/plugins/page.tsx +0 -64
  479. package/src/app/[variants]/(main)/discover/(list)/providers/features/Card.tsx +0 -119
  480. package/src/app/[variants]/(main)/discover/(list)/providers/features/List.tsx +0 -67
  481. package/src/app/[variants]/(main)/discover/(list)/providers/loading.tsx +0 -1
  482. package/src/app/[variants]/(main)/discover/(list)/providers/page.tsx +0 -64
  483. package/src/app/[variants]/(main)/discover/features/StoreSearchBar.tsx +0 -87
  484. package/src/app/[variants]/(main)/discover/loading.tsx +0 -3
  485. package/src/app/[variants]/(main)/discover/search/_layout/Desktop.tsx +0 -42
  486. package/src/app/[variants]/(main)/discover/search/_layout/Mobile/Header.tsx +0 -31
  487. package/src/app/[variants]/(main)/discover/search/_layout/Mobile/Nav.tsx +0 -56
  488. package/src/app/[variants]/(main)/discover/search/_layout/Mobile/index.tsx +0 -32
  489. package/src/app/[variants]/(main)/discover/search/features/AssistantsResult.tsx +0 -27
  490. package/src/app/[variants]/(main)/discover/search/features/Category.tsx +0 -41
  491. package/src/app/[variants]/(main)/discover/search/features/ModelsResult.tsx +0 -27
  492. package/src/app/[variants]/(main)/discover/search/features/PluginsResult.tsx +0 -27
  493. package/src/app/[variants]/(main)/discover/search/features/ProvidersResult.tsx +0 -26
  494. package/src/app/[variants]/(main)/discover/search/layout.tsx +0 -12
  495. package/src/app/[variants]/(main)/discover/search/loading.tsx +0 -1
  496. package/src/app/[variants]/(main)/discover/search/page.tsx +0 -82
  497. package/src/features/PluginStore/InstalledPluginList.tsx +0 -59
  498. package/src/features/PluginStore/OnlineList.tsx +0 -87
  499. package/src/features/PluginStore/PluginItem/EditCustomPlugin.tsx +0 -55
  500. package/src/features/PluginStore/PluginItem/PluginTag.tsx +0 -29
  501. package/src/features/PluginStore/PluginItem/index.tsx +0 -83
  502. package/src/server/routers/edge/market/index.ts +0 -108
  503. package/src/services/__tests__/assistant.test.ts +0 -87
  504. package/src/services/assistant.ts +0 -25
  505. package/src/store/tool/slices/store/action.ts +0 -113
  506. package/src/store/tool/slices/store/initialState.ts +0 -17
  507. package/src/types/discover.ts +0 -179
  508. package/src/types/requestCache.ts +0 -3
  509. /package/src/app/[variants]/(main)/discover/(list)/{assistants → assistant}/_layout/Desktop.tsx +0 -0
  510. /package/src/app/[variants]/(main)/discover/(list)/{assistants → assistant}/_layout/Mobile.tsx +0 -0
  511. /package/src/app/[variants]/(main)/discover/(list)/{assistants → assistant}/layout.tsx +0 -0
  512. /package/src/app/[variants]/(main)/discover/(list)/{assistants → assistant}/loading.tsx +0 -0
  513. /package/src/app/[variants]/(main)/discover/(list)/{plugins → mcp}/_layout/Desktop.tsx +0 -0
  514. /package/src/app/[variants]/(main)/discover/(list)/{plugins → mcp}/_layout/Mobile.tsx +0 -0
  515. /package/src/app/[variants]/(main)/discover/(list)/{plugins → mcp}/layout.tsx +0 -0
  516. /package/src/app/[variants]/(main)/discover/(list)/{plugins → mcp}/loading.tsx +0 -0
  517. /package/src/app/[variants]/(main)/discover/(list)/{models → model}/_layout/Mobile.tsx +0 -0
  518. /package/src/app/[variants]/(main)/discover/(list)/{models → model}/features/const.ts +0 -0
  519. /package/src/app/[variants]/(main)/discover/(list)/{models → model}/layout.tsx +0 -0
  520. /package/src/{features/PluginStore/PluginItem → components/Plugins}/PluginAvatar.tsx +0 -0
  521. /package/src/server/routers/{edge → lambda}/config/__snapshots__/index.test.ts.snap +0 -0
  522. /package/src/server/routers/{edge → lambda}/config/index.test.ts +0 -0
  523. /package/src/store/tool/slices/{store → mcpStore}/index.ts +0 -0
@@ -18,7 +18,7 @@ vi.mock('@/store/global/helpers', () => ({
18
18
  vi.mock('@/libs/trpc/client', () => ({
19
19
  edgeClient: {
20
20
  market: {
21
- getPluginIndex: {
21
+ getLegacyPluginList: {
22
22
  query: vi.fn(),
23
23
  },
24
24
  },
@@ -30,34 +30,6 @@ beforeEach(() => {
30
30
  });
31
31
 
32
32
  describe('ToolService', () => {
33
- describe('getToolList', () => {
34
- it('should fetch and return the plugin list', async () => {
35
- // Arrange
36
- const fakeResponse = { plugins: [{ name: 'TestPlugin' }] };
37
- (globalHelpers.getCurrentLanguage as Mock).mockReturnValue('tt');
38
-
39
- (edgeClient.market.getPluginIndex.query as Mock).mockResolvedValue(fakeResponse);
40
-
41
- // Act
42
- const pluginList = await toolService.getToolList();
43
-
44
- // Assert
45
- expect(globalHelpers.getCurrentLanguage).toHaveBeenCalled();
46
- expect(pluginList).toEqual(fakeResponse.plugins);
47
- });
48
-
49
- it('should handle fetch error', async () => {
50
- // Arrange
51
- (globalHelpers.getCurrentLanguage as Mock).mockReturnValue('en');
52
- (edgeClient.market.getPluginIndex.query as Mock).mockRejectedValue(
53
- new Error('Network error'),
54
- );
55
-
56
- // Act & Assert
57
- await expect(toolService.getToolList()).rejects.toThrow('Network error');
58
- });
59
- });
60
-
61
33
  describe('getToolManifest', () => {
62
34
  it('should return manifest', async () => {
63
35
  const manifestUrl = 'http://fake-url.com/manifest.json';
@@ -0,0 +1,365 @@
1
+ import { CategoryItem, CategoryListQuery, PluginManifest } from '@lobehub/market-sdk';
2
+ import { CallReportRequest, InstallReportRequest } from '@lobehub/market-types';
3
+
4
+ import { lambdaClient } from '@/libs/trpc/client';
5
+ import { globalHelpers } from '@/store/global/helpers';
6
+ import {
7
+ AssistantListResponse,
8
+ AssistantQueryParams,
9
+ DiscoverAssistantDetail,
10
+ DiscoverMcpDetail,
11
+ DiscoverModelDetail,
12
+ DiscoverPluginDetail,
13
+ DiscoverProviderDetail,
14
+ IdentifiersResponse,
15
+ McpListResponse,
16
+ McpQueryParams,
17
+ ModelListResponse,
18
+ ModelQueryParams,
19
+ PluginListResponse,
20
+ PluginQueryParams,
21
+ ProviderListResponse,
22
+ ProviderQueryParams,
23
+ } from '@/types/discover';
24
+ import { MCPPluginListParams } from '@/types/plugins';
25
+ import { cleanObject } from '@/utils/object';
26
+
27
+ class DiscoverService {
28
+ private _isRetrying = false;
29
+
30
+ // ============================== Assistant Market ==============================
31
+ getAssistantCategories = async (params: CategoryListQuery = {}): Promise<CategoryItem[]> => {
32
+ const locale = globalHelpers.getCurrentLanguage();
33
+ return lambdaClient.market.getAssistantCategories.query({
34
+ ...params,
35
+ locale,
36
+ });
37
+ };
38
+
39
+ getAssistantDetail = async (params: {
40
+ identifier: string;
41
+ locale?: string;
42
+ }): Promise<DiscoverAssistantDetail | undefined> => {
43
+ const locale = globalHelpers.getCurrentLanguage();
44
+ return lambdaClient.market.getAssistantDetail.query({
45
+ ...params,
46
+ locale,
47
+ });
48
+ };
49
+
50
+ getAssistantIdentifiers = async (): Promise<IdentifiersResponse> => {
51
+ return lambdaClient.market.getAssistantIdentifiers.query();
52
+ };
53
+
54
+ getAssistantList = async (params: AssistantQueryParams = {}): Promise<AssistantListResponse> => {
55
+ const locale = globalHelpers.getCurrentLanguage();
56
+ return lambdaClient.market.getAssistantList.query({
57
+ ...params,
58
+ locale,
59
+ page: params.page ? Number(params.page) : 1,
60
+ pageSize: params.pageSize ? Number(params.pageSize) : 20,
61
+ });
62
+ };
63
+
64
+ // ============================== MCP Market ==============================
65
+
66
+ getMcpCategories = async (params: CategoryListQuery = {}): Promise<CategoryItem[]> => {
67
+ const locale = globalHelpers.getCurrentLanguage();
68
+ return lambdaClient.market.getMcpCategories.query({
69
+ ...params,
70
+ locale,
71
+ });
72
+ };
73
+
74
+ getMcpDetail = async (params: {
75
+ identifier: string;
76
+ locale?: string;
77
+ version?: string;
78
+ }): Promise<DiscoverMcpDetail> => {
79
+ const locale = globalHelpers.getCurrentLanguage();
80
+ return lambdaClient.market.getMcpDetail.query({
81
+ ...params,
82
+ locale,
83
+ });
84
+ };
85
+
86
+ getMcpIdentifiers = async (): Promise<IdentifiersResponse> => {
87
+ return lambdaClient.market.getMcpIdentifiers.query();
88
+ };
89
+
90
+ getMcpList = async (params: McpQueryParams = {}): Promise<McpListResponse> => {
91
+ const locale = globalHelpers.getCurrentLanguage();
92
+ return lambdaClient.market.getMcpList.query({
93
+ ...params,
94
+ locale,
95
+ page: params.page ? Number(params.page) : 1,
96
+ pageSize: params.pageSize ? Number(params.pageSize) : 20,
97
+ });
98
+ };
99
+
100
+ getMCPPluginList = async (params: MCPPluginListParams): Promise<McpListResponse> => {
101
+ await this.injectMPToken();
102
+
103
+ const locale = globalHelpers.getCurrentLanguage();
104
+
105
+ return lambdaClient.market.getMcpList.query({
106
+ ...params,
107
+ locale,
108
+ page: params.page ? Number(params.page) : 1,
109
+ pageSize: params.pageSize ? Number(params.pageSize) : 21,
110
+ });
111
+ };
112
+
113
+ getMcpManifest = async (params: { identifier: string; locale?: string; version?: string }) => {
114
+ const locale = globalHelpers.getCurrentLanguage();
115
+ return lambdaClient.market.getMcpManifest.query({
116
+ ...params,
117
+ locale,
118
+ });
119
+ };
120
+
121
+ getMCPPluginManifest = async (
122
+ identifier: string,
123
+ options: { install?: boolean } = {},
124
+ ): Promise<PluginManifest> => {
125
+ const locale = globalHelpers.getCurrentLanguage();
126
+
127
+ return lambdaClient.market.getMcpManifest.query({
128
+ identifier,
129
+ install: options.install,
130
+ locale,
131
+ });
132
+ };
133
+
134
+ registerClient = () => {
135
+ return lambdaClient.market.registerClientInMarketplace.mutate({});
136
+ };
137
+
138
+ /**
139
+ * 上报 MCP 插件安装结果
140
+ */
141
+ reportMcpInstallResult = async ({
142
+ success,
143
+ manifest,
144
+ errorMessage,
145
+ errorCode,
146
+ ...params
147
+ }: InstallReportRequest) => {
148
+ await this.injectMPToken();
149
+
150
+ const reportData = {
151
+ errorCode: success ? undefined : errorCode,
152
+ errorMessage: success ? undefined : errorMessage,
153
+ manifest: success ? manifest : undefined,
154
+ success,
155
+ ...params,
156
+ };
157
+
158
+ lambdaClient.market.reportMcpInstallResult
159
+ .mutate(cleanObject(reportData))
160
+ .catch((reportError) => {
161
+ console.warn('Failed to report MCP installation result:', reportError);
162
+ });
163
+ };
164
+
165
+ /**
166
+ * 上报插件调用结果
167
+ */
168
+ reportPluginCall = async (reportData: CallReportRequest) => {
169
+ await this.injectMPToken();
170
+
171
+ lambdaClient.market.reportCall.mutate(cleanObject(reportData)).catch((reportError) => {
172
+ console.warn('Failed to report call:', reportError);
173
+ });
174
+ };
175
+
176
+ // ============================== Models ==============================
177
+
178
+ getModelCategories = async (params: CategoryListQuery = {}): Promise<CategoryItem[]> => {
179
+ return lambdaClient.market.getModelCategories.query(params);
180
+ };
181
+
182
+ getModelDetail = async (params: {
183
+ identifier: string;
184
+ locale?: string;
185
+ }): Promise<DiscoverModelDetail | undefined> => {
186
+ const locale = globalHelpers.getCurrentLanguage();
187
+ return lambdaClient.market.getModelDetail.query({
188
+ ...params,
189
+ locale,
190
+ });
191
+ };
192
+
193
+ getModelIdentifiers = async (): Promise<IdentifiersResponse> => {
194
+ return lambdaClient.market.getModelIdentifiers.query();
195
+ };
196
+
197
+ getModelList = async (params: ModelQueryParams = {}): Promise<ModelListResponse> => {
198
+ const locale = globalHelpers.getCurrentLanguage();
199
+ return lambdaClient.market.getModelList.query({
200
+ ...params,
201
+ locale,
202
+ page: params.page ? Number(params.page) : 1,
203
+ pageSize: params.pageSize ? Number(params.pageSize) : 20,
204
+ });
205
+ };
206
+
207
+ // ============================== Plugin Market ==============================
208
+
209
+ getPluginCategories = async (params: CategoryListQuery = {}): Promise<CategoryItem[]> => {
210
+ const locale = globalHelpers.getCurrentLanguage();
211
+ return lambdaClient.market.getPluginCategories.query({
212
+ ...params,
213
+ locale,
214
+ });
215
+ };
216
+
217
+ getPluginDetail = async (params: {
218
+ identifier: string;
219
+ locale?: string;
220
+ withManifest?: boolean;
221
+ }): Promise<DiscoverPluginDetail | undefined> => {
222
+ const locale = globalHelpers.getCurrentLanguage();
223
+ return lambdaClient.market.getPluginDetail.query({
224
+ ...params,
225
+ locale,
226
+ });
227
+ };
228
+
229
+ getPluginIdentifiers = async (): Promise<IdentifiersResponse> => {
230
+ return lambdaClient.market.getPluginIdentifiers.query();
231
+ };
232
+
233
+ getPluginList = async (params: PluginQueryParams = {}): Promise<PluginListResponse> => {
234
+ const locale = globalHelpers.getCurrentLanguage();
235
+ return lambdaClient.market.getPluginList.query({
236
+ ...params,
237
+ locale,
238
+ page: params.page ? Number(params.page) : 1,
239
+ pageSize: params.pageSize ? Number(params.pageSize) : 20,
240
+ });
241
+ };
242
+
243
+ // ============================== Providers ==============================
244
+
245
+ getProviderDetail = async (params: {
246
+ identifier: string;
247
+ locale?: string;
248
+ withReadme?: boolean;
249
+ }): Promise<DiscoverProviderDetail | undefined> => {
250
+ const locale = globalHelpers.getCurrentLanguage();
251
+ return lambdaClient.market.getProviderDetail.query({
252
+ ...params,
253
+ locale,
254
+ });
255
+ };
256
+
257
+ getProviderIdentifiers = async (): Promise<IdentifiersResponse> => {
258
+ return lambdaClient.market.getProviderIdentifiers.query();
259
+ };
260
+
261
+ getProviderList = async (params: ProviderQueryParams = {}): Promise<ProviderListResponse> => {
262
+ const locale = globalHelpers.getCurrentLanguage();
263
+ return lambdaClient.market.getProviderList.query({
264
+ ...params,
265
+ locale,
266
+ page: params.page ? Number(params.page) : 1,
267
+ pageSize: params.pageSize ? Number(params.pageSize) : 20,
268
+ });
269
+ };
270
+
271
+ // ============================== Helpers ==============================
272
+
273
+ private async injectMPToken() {
274
+ if (typeof localStorage === 'undefined') return;
275
+
276
+ // 检查服务端设置的状态标记 cookie
277
+ const tokenStatus = this.getTokenStatusFromCookie();
278
+ if (tokenStatus === 'active') return;
279
+
280
+ let clientId: string;
281
+ let clientSecret: string;
282
+
283
+ // 1. 从 localStorage 获取客户端信息
284
+ const item = localStorage.getItem('_mpc');
285
+ if (!item) {
286
+ // 2. 如果没有,则注册客户端
287
+ const clientInfo = await this.registerClient();
288
+ clientId = clientInfo.clientId;
289
+ clientSecret = clientInfo.clientSecret;
290
+
291
+ // 3. Base64 编码并保存到 localStorage
292
+ const clientData = JSON.stringify({ clientId, clientSecret });
293
+ const encodedData = btoa(clientData);
294
+ localStorage.setItem('_mpc', encodedData);
295
+ } else {
296
+ // 4. 如果有,则解码获取客户端信息
297
+ try {
298
+ const decodedData = atob(item);
299
+ const clientData = JSON.parse(decodedData);
300
+ clientId = clientData.clientId;
301
+ clientSecret = clientData.clientSecret;
302
+ } catch (error) {
303
+ console.error('Failed to decode client data:', error);
304
+ // 如果解码失败,重新注册
305
+ const clientInfo = await this.registerClient();
306
+ clientId = clientInfo.clientId;
307
+ clientSecret = clientInfo.clientSecret;
308
+
309
+ const clientData = JSON.stringify({ clientId, clientSecret });
310
+ const encodedData = btoa(clientData);
311
+ localStorage.setItem('_mpc', encodedData);
312
+ }
313
+ }
314
+
315
+ // 5. 获取访问令牌(服务端会自动设置 HTTP-Only cookie)
316
+ try {
317
+ const result = await lambdaClient.market.registerM2MToken.query({
318
+ clientId,
319
+ clientSecret,
320
+ });
321
+
322
+ // 检查服务端返回的结果
323
+ if (!result.success) {
324
+ console.warn(
325
+ 'Token registration failed, client credentials may be invalid. Clearing and retrying...',
326
+ );
327
+
328
+ // 清空相关的本地存储数据
329
+ localStorage.removeItem('_mpc');
330
+
331
+ // 重新执行完整的注册流程(但只重试一次)
332
+ if (!this._isRetrying) {
333
+ this._isRetrying = true;
334
+ try {
335
+ await this.injectMPToken();
336
+ } finally {
337
+ this._isRetrying = false;
338
+ }
339
+ } else {
340
+ console.error('Failed to re-register after credential invalidation');
341
+ }
342
+
343
+ return;
344
+ }
345
+ } catch (error) {
346
+ console.error('Failed to register M2M token:', error);
347
+ return null;
348
+ }
349
+ }
350
+
351
+ private getTokenStatusFromCookie(): string | null {
352
+ if (typeof document === 'undefined') return null;
353
+
354
+ const cookies = document.cookie.split(';');
355
+ for (const cookie of cookies) {
356
+ const [name, value] = cookie.trim().split('=');
357
+ if (name === 'mp_token_status') {
358
+ return value;
359
+ }
360
+ }
361
+ return null;
362
+ }
363
+ }
364
+
365
+ export const discoverService = new DiscoverService();
@@ -1,6 +1,6 @@
1
1
  import { DeepPartial } from 'utility-types';
2
2
 
3
- import { edgeClient } from '@/libs/trpc/client';
3
+ import { lambdaClient } from '@/libs/trpc/client';
4
4
  import { LobeAgentConfig } from '@/types/agent';
5
5
  import { GlobalRuntimeConfig } from '@/types/serverConfig';
6
6
 
@@ -18,11 +18,11 @@ class GlobalService {
18
18
  };
19
19
 
20
20
  getGlobalConfig = async (): Promise<GlobalRuntimeConfig> => {
21
- return edgeClient.config.getGlobalConfig.query();
21
+ return lambdaClient.config.getGlobalConfig.query();
22
22
  };
23
23
 
24
24
  getDefaultAgentConfig = async (): Promise<DeepPartial<LobeAgentConfig>> => {
25
- return edgeClient.config.getDefaultAgentConfig.query();
25
+ return lambdaClient.config.getDefaultAgentConfig.query();
26
26
  };
27
27
  }
28
28
 
@@ -1,42 +1,142 @@
1
- import { isDesktop } from '@/const/version';
1
+ import { PluginManifest } from '@lobehub/market-sdk';
2
+ import { CallReportRequest } from '@lobehub/market-types';
3
+
4
+ import { CURRENT_VERSION, isDesktop } from '@/const/version';
2
5
  import { desktopClient, toolsClient } from '@/libs/trpc/client';
3
6
  import { ChatToolPayload } from '@/types/message';
7
+ import { CheckMcpInstallResult } from '@/types/plugins';
4
8
  import { CustomPluginMetadata } from '@/types/tool/plugin';
9
+ import { safeParseJSON } from '@/utils/safeParseJSON';
10
+
11
+ import { discoverService } from './discover';
12
+
13
+ /**
14
+ * 计算对象的字节大小
15
+ * @param obj 要计算大小的对象
16
+ * @returns 字节大小
17
+ */
18
+ function calculateObjectSizeBytes(obj: any): number {
19
+ try {
20
+ const jsonString = JSON.stringify(obj);
21
+ return new TextEncoder().encode(jsonString).length;
22
+ } catch (error) {
23
+ console.warn('Failed to calculate object size:', error);
24
+ return 0;
25
+ }
26
+ }
5
27
 
6
28
  class MCPService {
7
- async invokeMcpToolCall(payload: ChatToolPayload, { signal }: { signal?: AbortSignal }) {
29
+ async invokeMcpToolCall(
30
+ payload: ChatToolPayload,
31
+ { signal, topicId }: { signal?: AbortSignal; topicId?: string },
32
+ ) {
8
33
  const { pluginSelectors } = await import('@/store/tool/selectors');
9
34
  const { getToolStoreState } = await import('@/store/tool/store');
10
35
 
11
36
  const s = getToolStoreState();
12
37
  const { identifier, arguments: args, apiName } = payload;
13
38
 
14
- const plugin = pluginSelectors.getCustomPluginById(identifier)(s);
39
+ const installPlugin = pluginSelectors.getInstalledPluginById(identifier)(s);
40
+ const customPlugin = pluginSelectors.getCustomPluginById(identifier)(s);
41
+
42
+ const plugin = installPlugin || customPlugin;
15
43
 
16
44
  if (!plugin) return;
17
45
 
18
46
  const data = {
19
47
  args,
48
+ env: plugin.settings,
20
49
  params: { ...plugin.customParams?.mcp, name: identifier } as any,
21
50
  toolName: apiName,
22
51
  };
23
52
 
24
53
  const isStdio = plugin?.customParams?.mcp?.type === 'stdio';
25
54
 
26
- // For desktop and stdio, use the desktopClient
27
- if (isDesktop && isStdio) {
28
- return desktopClient.mcp.callTool.mutate(data, { signal });
29
- }
55
+ // 记录调用开始时间
56
+ const callStartTime = Date.now();
57
+ let success = false;
58
+ let errorCode: string | undefined;
59
+ let errorMessage: string | undefined;
60
+ let result: any;
61
+
62
+ try {
63
+ // For desktop and stdio, use the desktopClient
64
+ if (isDesktop && isStdio) {
65
+ result = await desktopClient.mcp.callTool.mutate(data, { signal });
66
+ } else {
67
+ result = await toolsClient.mcp.callTool.mutate(data, { signal });
68
+ }
30
69
 
31
- return toolsClient.mcp.callTool.mutate(data, { signal });
70
+ success = true;
71
+ return result;
72
+ } catch (error) {
73
+ success = false;
74
+ const err = error as Error;
75
+ errorCode = 'CALL_FAILED';
76
+ errorMessage = err.message;
77
+
78
+ // 重新抛出错误,保持原有的错误处理逻辑
79
+ throw error;
80
+ } finally {
81
+ // 异步上报调用结果,不影响主流程
82
+ const callEndTime = Date.now();
83
+ const callDurationMs = callEndTime - callStartTime;
84
+
85
+ // 计算请求大小
86
+ const inputParams = safeParseJSON(args) || args;
87
+
88
+ const requestSizeBytes = calculateObjectSizeBytes(inputParams);
89
+ // 计算响应大小
90
+ const responseSizeBytes = success ? calculateObjectSizeBytes(result) : 0;
91
+
92
+ const isCustomPlugin = !!customPlugin;
93
+ // 构造上报数据
94
+ const reportData: CallReportRequest = {
95
+ callDurationMs,
96
+ customPluginInfo: isCustomPlugin
97
+ ? {
98
+ avatar: plugin.manifest?.meta.avatar,
99
+ description: plugin.manifest?.meta.description,
100
+ name: plugin.manifest?.meta.title,
101
+ }
102
+ : undefined,
103
+ errorCode,
104
+ errorMessage,
105
+ identifier,
106
+ inputParams,
107
+ isCustomPlugin,
108
+ metadata: {
109
+ appVersion: CURRENT_VERSION,
110
+ command: plugin.customParams?.mcp?.command,
111
+ mcpType: plugin.customParams?.mcp?.type,
112
+ },
113
+ methodName: apiName,
114
+ methodType: 'tool' as const,
115
+ outputResult: success ? result : undefined,
116
+ requestSizeBytes,
117
+ responseSizeBytes,
118
+ sessionId: topicId,
119
+ success,
120
+ version: plugin.manifest!.version || 'unknown',
121
+ };
122
+
123
+ // 异步上报,不影响主流程
124
+ discoverService.reportPluginCall(reportData).catch((reportError) => {
125
+ console.warn('Failed to report MCP tool call:', reportError);
126
+ });
127
+ }
32
128
  }
33
129
 
34
130
  async getStreamableMcpServerManifest(
35
131
  identifier: string,
36
132
  url: string,
37
133
  metadata?: CustomPluginMetadata,
134
+ signal?: AbortSignal,
38
135
  ) {
39
- return toolsClient.mcp.getStreamableMcpServerManifest.query({ identifier, metadata, url });
136
+ return toolsClient.mcp.getStreamableMcpServerManifest.query(
137
+ { identifier, metadata, url },
138
+ { signal },
139
+ );
40
140
  }
41
141
 
42
142
  async getStdioMcpServerManifest(
@@ -47,8 +147,29 @@ class MCPService {
47
147
  name: string;
48
148
  },
49
149
  metadata?: CustomPluginMetadata,
150
+ signal?: AbortSignal,
50
151
  ) {
51
- return desktopClient.mcp.getStdioMcpServerManifest.query({ ...stdioParams, metadata });
152
+ return desktopClient.mcp.getStdioMcpServerManifest.query(
153
+ { ...stdioParams, metadata },
154
+ { signal },
155
+ );
156
+ }
157
+
158
+ /**
159
+ * 检查 MCP 插件安装状态
160
+ * @param manifest MCP 插件清单
161
+ * @param signal AbortSignal 用于取消请求
162
+ * @returns 安装检测结果
163
+ */
164
+ async checkInstallation(
165
+ manifest: PluginManifest,
166
+ signal?: AbortSignal,
167
+ ): Promise<CheckMcpInstallResult> {
168
+ // 将所有部署选项传递给主进程进行检查
169
+ return desktopClient.mcp.validMcpServerInstallable.mutate(
170
+ { deploymentOptions: manifest.deploymentOptions as any },
171
+ { signal },
172
+ );
52
173
  }
53
174
  }
54
175
 
@@ -23,7 +23,7 @@ export class ClientService implements IPluginService {
23
23
  return PluginModel.create({ ...customPlugin, type: 'customPlugin' });
24
24
  }
25
25
 
26
- async updatePlugin(id: string, value: LobeToolCustomPlugin) {
26
+ async updatePlugin(id: string, value: Partial<LobeToolCustomPlugin>) {
27
27
  await PluginModel.update(id, value);
28
28
  return;
29
29
  }
@@ -4,8 +4,10 @@ import { LobeTool } from '@/types/tool';
4
4
  import { LobeToolCustomPlugin } from '@/types/tool/plugin';
5
5
 
6
6
  export interface InstallPluginParams {
7
+ customParams?: Record<string, any>;
7
8
  identifier: string;
8
9
  manifest: LobeChatPluginManifest;
10
+ settings?: Record<string, any>;
9
11
  type: 'plugin' | 'customPlugin';
10
12
  }
11
13
 
@@ -15,7 +17,7 @@ export interface IPluginService {
15
17
  installPlugin: (plugin: InstallPluginParams) => Promise<void>;
16
18
  removeAllPlugins: () => Promise<void>;
17
19
  uninstallPlugin: (identifier: string) => Promise<void>;
18
- updatePlugin: (id: string, value: LobeToolCustomPlugin) => Promise<void>;
20
+ updatePlugin: (id: string, value: Partial<LobeToolCustomPlugin>) => Promise<void>;
19
21
  updatePluginManifest: (id: string, manifest: LobeChatPluginManifest) => Promise<void>;
20
22
  updatePluginSettings: (id: string, settings: any, signal?: AbortSignal) => Promise<void>;
21
23
  }
@@ -1,15 +1,18 @@
1
- import { edgeClient } from '@/libs/trpc/client';
1
+ import { lambdaClient } from '@/libs/trpc/client';
2
2
  import { globalHelpers } from '@/store/global/helpers';
3
- import { DiscoverPlugintem } from '@/types/discover';
3
+ import { PluginQueryParams } from '@/types/discover';
4
4
  import { convertOpenAIManifestToLobeManifest, getToolManifest } from '@/utils/toolManifest';
5
5
 
6
6
  class ToolService {
7
- getToolList = async (): Promise<DiscoverPlugintem[]> => {
7
+ getOldPluginList = async (params: PluginQueryParams): Promise<any> => {
8
8
  const locale = globalHelpers.getCurrentLanguage();
9
9
 
10
- const data = await edgeClient.market.getPluginIndex.query({ locale });
11
-
12
- return data.plugins;
10
+ return lambdaClient.market.getPluginList.query({
11
+ ...params,
12
+ locale,
13
+ page: params.page ? Number(params.page) : 1,
14
+ pageSize: params.pageSize ? Number(params.pageSize) : 20,
15
+ });
13
16
  };
14
17
 
15
18
  getToolManifest = getToolManifest;
@@ -1,5 +1,4 @@
1
1
  import { act, renderHook } from '@testing-library/react';
2
- import { Md5 } from 'ts-md5';
3
2
  import { Mock, afterEach, describe, expect, it, vi } from 'vitest';
4
3
 
5
4
  import { LOADING_FLAT } from '@/const/message';
@@ -10,8 +9,8 @@ import { chatSelectors } from '@/store/chat/selectors';
10
9
  import { useChatStore } from '@/store/chat/store';
11
10
  import { messageMapKey } from '@/store/chat/utils/messageMapKey';
12
11
  import { useToolStore } from '@/store/tool';
13
- import { ChatErrorType } from '@/types/fetch';
14
12
  import { ChatMessage, ChatToolPayload, MessageToolCall } from '@/types/message';
13
+ import { genToolCallShortMD5Hash } from '@/utils/toolCall';
15
14
 
16
15
  const invokeStandaloneTypePlugin = useChatStore.getState().invokeStandaloneTypePlugin;
17
16
 
@@ -1045,7 +1044,7 @@ describe('ChatPluginAction', () => {
1045
1044
 
1046
1045
  it('should handle MD5 hashed API names', () => {
1047
1046
  const apiName = 'testApi';
1048
- const md5Hash = Md5.hashStr(apiName);
1047
+ const md5Hash = genToolCallShortMD5Hash(apiName);
1049
1048
  const toolCalls: MessageToolCall[] = [
1050
1049
  {
1051
1050
  id: 'tool1',