@lobehub/lobehub 2.0.0-next.2 → 2.0.0-next.21

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 (603) hide show
  1. package/.env.desktop +1 -2
  2. package/.env.example +0 -3
  3. package/.env.example.development +0 -2
  4. package/.github/workflows/claude-auto-testing.yml +73 -0
  5. package/.github/workflows/claude-translate-comments.yml +67 -0
  6. package/.github/workflows/desktop-pr-build.yml +18 -16
  7. package/.github/workflows/docker.yml +25 -20
  8. package/.github/workflows/e2e.yml +17 -3
  9. package/.github/workflows/release-desktop-beta.yml +12 -12
  10. package/.github/workflows/release.yml +3 -5
  11. package/.github/workflows/test.yml +47 -12
  12. package/.nvmrc +1 -1
  13. package/CHANGELOG.md +484 -0
  14. package/Dockerfile +1 -3
  15. package/README.md +2 -45
  16. package/README.zh-CN.md +2 -45
  17. package/apps/desktop/src/main/controllers/AuthCtr.ts +53 -39
  18. package/apps/desktop/src/main/controllers/__tests__/AuthCtr.test.ts +706 -0
  19. package/apps/desktop/src/main/utils/next-electron-rsc.ts +7 -5
  20. package/apps/desktop/tsconfig.json +0 -1
  21. package/changelog/v1.json +159 -0
  22. package/docs/development/database-schema.dbml +11 -1
  23. package/docs/self-hosting/advanced/auth/next-auth/auth0.mdx +2 -2
  24. package/docs/self-hosting/advanced/auth/next-auth/auth0.zh-CN.mdx +2 -2
  25. package/docs/self-hosting/advanced/auth/next-auth/authelia.mdx +2 -2
  26. package/docs/self-hosting/advanced/auth/next-auth/authelia.zh-CN.mdx +2 -2
  27. package/docs/self-hosting/advanced/auth/next-auth/authentik.mdx +2 -2
  28. package/docs/self-hosting/advanced/auth/next-auth/authentik.zh-CN.mdx +2 -2
  29. package/docs/self-hosting/advanced/auth/next-auth/casdoor.mdx +2 -2
  30. package/docs/self-hosting/advanced/auth/next-auth/casdoor.zh-CN.mdx +2 -2
  31. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.mdx +2 -2
  32. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.zh-CN.mdx +2 -2
  33. package/docs/self-hosting/advanced/auth/next-auth/github.mdx +2 -2
  34. package/docs/self-hosting/advanced/auth/next-auth/github.zh-CN.mdx +2 -2
  35. package/docs/self-hosting/advanced/auth/next-auth/google.mdx +32 -29
  36. package/docs/self-hosting/advanced/auth/next-auth/keycloak.mdx +2 -2
  37. package/docs/self-hosting/advanced/auth/next-auth/keycloak.zh-CN.mdx +2 -2
  38. package/docs/self-hosting/advanced/auth/next-auth/logto.mdx +5 -3
  39. package/docs/self-hosting/advanced/auth/next-auth/logto.zh-CN.mdx +5 -3
  40. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.mdx +2 -2
  41. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.zh-CN.mdx +2 -2
  42. package/docs/self-hosting/advanced/auth/next-auth/okta.mdx +2 -2
  43. package/docs/self-hosting/advanced/auth/next-auth/okta.zh-CN.mdx +2 -2
  44. package/docs/self-hosting/advanced/auth/next-auth/wechat.mdx +2 -2
  45. package/docs/self-hosting/advanced/auth/next-auth/wechat.zh-CN.mdx +2 -2
  46. package/docs/self-hosting/advanced/auth/next-auth/zitadel.mdx +2 -2
  47. package/docs/self-hosting/advanced/auth/next-auth/zitadel.zh-CN.mdx +2 -2
  48. package/docs/self-hosting/advanced/auth.mdx +32 -21
  49. package/docs/self-hosting/advanced/auth.zh-CN.mdx +30 -19
  50. package/docs/self-hosting/advanced/feature-flags.mdx +0 -1
  51. package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +0 -1
  52. package/docs/self-hosting/advanced/online-search.mdx +30 -25
  53. package/docs/self-hosting/advanced/online-search.zh-CN.mdx +25 -23
  54. package/e2e/src/features/discover/smoke.feature +34 -1
  55. package/e2e/src/steps/discover/smoke.steps.ts +116 -4
  56. package/e2e/tsconfig.json +0 -1
  57. package/locales/ar/models.json +15 -6
  58. package/locales/ar/oauth.json +1 -0
  59. package/locales/bg-BG/models.json +15 -6
  60. package/locales/bg-BG/oauth.json +1 -0
  61. package/locales/de-DE/models.json +15 -6
  62. package/locales/de-DE/oauth.json +1 -0
  63. package/locales/en-US/models.json +15 -6
  64. package/locales/en-US/oauth.json +1 -0
  65. package/locales/es-ES/models.json +15 -6
  66. package/locales/es-ES/oauth.json +1 -0
  67. package/locales/fa-IR/models.json +15 -6
  68. package/locales/fa-IR/oauth.json +1 -0
  69. package/locales/fr-FR/models.json +15 -6
  70. package/locales/fr-FR/oauth.json +1 -0
  71. package/locales/it-IT/models.json +15 -6
  72. package/locales/it-IT/oauth.json +1 -0
  73. package/locales/ja-JP/models.json +15 -6
  74. package/locales/ja-JP/oauth.json +1 -0
  75. package/locales/ko-KR/models.json +21 -12
  76. package/locales/ko-KR/oauth.json +1 -0
  77. package/locales/nl-NL/models.json +15 -6
  78. package/locales/nl-NL/oauth.json +1 -0
  79. package/locales/pl-PL/models.json +15 -6
  80. package/locales/pl-PL/oauth.json +1 -0
  81. package/locales/pt-BR/models.json +15 -6
  82. package/locales/pt-BR/oauth.json +1 -0
  83. package/locales/ru-RU/models.json +15 -6
  84. package/locales/ru-RU/oauth.json +1 -0
  85. package/locales/tr-TR/models.json +15 -6
  86. package/locales/tr-TR/oauth.json +1 -0
  87. package/locales/vi-VN/models.json +15 -6
  88. package/locales/vi-VN/oauth.json +1 -0
  89. package/locales/zh-CN/models.json +15 -6
  90. package/locales/zh-CN/oauth.json +1 -0
  91. package/locales/zh-TW/models.json +15 -6
  92. package/locales/zh-TW/oauth.json +1 -0
  93. package/next.config.ts +2 -3
  94. package/package.json +74 -80
  95. package/packages/const/src/index.ts +0 -1
  96. package/packages/const/src/models.ts +13 -0
  97. package/packages/const/src/url.ts +1 -4
  98. package/packages/const/src/version.ts +3 -3
  99. package/packages/context-engine/src/index.ts +1 -6
  100. package/packages/context-engine/src/processors/GroupMessageFlatten.ts +12 -2
  101. package/packages/context-engine/src/processors/__tests__/GroupMessageFlatten.test.ts +73 -9
  102. package/packages/context-engine/src/providers/index.ts +0 -2
  103. package/packages/database/migrations/0041_improve_index.sql +10 -0
  104. package/packages/database/migrations/meta/0041_snapshot.json +7784 -0
  105. package/packages/database/migrations/meta/_journal.json +7 -0
  106. package/packages/database/package.json +1 -1
  107. package/packages/database/src/core/migrations.json +17 -0
  108. package/packages/database/src/core/web-server.ts +2 -1
  109. package/packages/database/src/models/__tests__/message.grouping.test.ts +812 -0
  110. package/packages/database/src/models/__tests__/message.test.ts +322 -170
  111. package/packages/database/src/models/message.ts +62 -24
  112. package/packages/database/src/models/session.ts +60 -19
  113. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  114. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  115. package/packages/database/src/schemas/agent.ts +10 -11
  116. package/packages/database/src/schemas/message.ts +5 -1
  117. package/packages/database/src/schemas/relations.ts +6 -4
  118. package/packages/database/src/schemas/session.ts +2 -0
  119. package/packages/database/src/schemas/topic.ts +6 -1
  120. package/packages/database/src/utils/__tests__/groupMessages.test.ts +145 -2
  121. package/packages/database/src/utils/groupMessages.ts +7 -5
  122. package/packages/electron-client-ipc/package.json +4 -1
  123. package/packages/file-loaders/package.json +1 -0
  124. package/packages/memory-extract/package.json +1 -1
  125. package/packages/model-bank/src/aiModels/anthropic.ts +0 -63
  126. package/packages/model-bank/src/aiModels/azure.ts +155 -0
  127. package/packages/model-bank/src/aiModels/bedrock.ts +44 -0
  128. package/packages/model-bank/src/aiModels/higress.ts +0 -55
  129. package/packages/model-bank/src/aiModels/infiniai.ts +21 -0
  130. package/packages/model-bank/src/aiModels/ollamacloud.ts +13 -0
  131. package/packages/model-bank/src/aiModels/siliconcloud.ts +19 -0
  132. package/packages/model-runtime/src/core/parameterResolver.ts +3 -0
  133. package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +0 -38
  134. package/packages/model-runtime/src/providers/azureOpenai/index.ts +2 -1
  135. package/packages/model-runtime/src/providers/minimax/index.ts +5 -5
  136. package/packages/model-runtime/src/providers/search1api/index.test.ts +2 -2
  137. package/packages/model-runtime/src/utils/googleErrorParser.test.ts +125 -0
  138. package/packages/model-runtime/src/utils/googleErrorParser.ts +103 -77
  139. package/packages/types/src/message/common/base.ts +13 -0
  140. package/packages/types/src/message/common/image.ts +8 -0
  141. package/packages/types/src/message/common/metadata.ts +39 -0
  142. package/packages/types/src/message/common/tools.ts +10 -0
  143. package/packages/types/src/message/db/params.ts +47 -1
  144. package/packages/types/src/message/ui/chat.ts +4 -1
  145. package/packages/types/src/message/ui/params.ts +98 -4
  146. package/packages/types/src/search.ts +16 -0
  147. package/packages/types/src/serverConfig.ts +2 -6
  148. package/packages/types/src/user/index.ts +13 -1
  149. package/packages/types/src/user/settings/index.ts +22 -0
  150. package/packages/utils/src/apiKey.test.ts +139 -0
  151. package/packages/utils/src/client/clipboard.ts +2 -2
  152. package/packages/utils/src/client/exportFile.ts +10 -10
  153. package/packages/utils/src/client/parserPlaceholder.ts +18 -18
  154. package/packages/utils/src/client/topic.ts +10 -10
  155. package/packages/utils/src/client/xor-obfuscation.ts +11 -11
  156. package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
  157. package/packages/web-crawler/tsconfig.json +0 -1
  158. package/renovate.json +20 -3
  159. package/scripts/migrateServerDB/errorHint.js +1 -7
  160. package/scripts/migrateServerDB/index.ts +2 -1
  161. package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
  162. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
  163. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  164. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
  165. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  166. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
  167. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
  168. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
  169. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
  170. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  171. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
  172. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  173. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  174. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  175. package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
  176. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
  177. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
  178. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
  179. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
  180. package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
  181. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
  182. package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
  183. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  184. package/src/app/[variants]/(main)/labs/components/LabCard.tsx +3 -1
  185. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  186. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  187. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  188. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  189. package/src/app/[variants]/(main)/settings/_layout/SettingsContent.tsx +0 -3
  190. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  191. package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +5 -7
  192. package/src/app/[variants]/layout.tsx +1 -0
  193. package/src/app/[variants]/loading/index.tsx +1 -10
  194. package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
  195. package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
  196. package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
  197. package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
  198. package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
  199. package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
  200. package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +19 -2
  201. package/src/app/sitemap.tsx +7 -1
  202. package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
  203. package/src/components/Link.tsx +12 -0
  204. package/src/components/Thinking/index.tsx +4 -3
  205. package/src/config/db.ts +0 -5
  206. package/src/config/featureFlags/schema.test.ts +0 -2
  207. package/src/config/featureFlags/schema.ts +0 -6
  208. package/src/config/modelProviders/ai21.ts +1 -16
  209. package/src/config/modelProviders/ai302.ts +1 -128
  210. package/src/config/modelProviders/ai360.ts +1 -32
  211. package/src/config/modelProviders/anthropic.ts +1 -94
  212. package/src/config/modelProviders/azure.ts +1 -51
  213. package/src/config/modelProviders/baichuan.ts +1 -57
  214. package/src/config/modelProviders/bedrock.ts +1 -276
  215. package/src/config/modelProviders/cloudflare.ts +1 -64
  216. package/src/config/modelProviders/deepseek.ts +1 -19
  217. package/src/config/modelProviders/fireworksai.ts +1 -174
  218. package/src/config/modelProviders/giteeai.ts +1 -135
  219. package/src/config/modelProviders/github.ts +1 -254
  220. package/src/config/modelProviders/google.ts +1 -130
  221. package/src/config/modelProviders/groq.ts +1 -119
  222. package/src/config/modelProviders/higress.ts +1 -1736
  223. package/src/config/modelProviders/huggingface.ts +1 -54
  224. package/src/config/modelProviders/hunyuan.ts +1 -83
  225. package/src/config/modelProviders/infiniai.ts +1 -74
  226. package/src/config/modelProviders/internlm.ts +1 -20
  227. package/src/config/modelProviders/minimax.ts +1 -1
  228. package/src/config/modelProviders/mistral.ts +1 -95
  229. package/src/config/modelProviders/modelscope.ts +1 -27
  230. package/src/config/modelProviders/moonshot.ts +1 -29
  231. package/src/config/modelProviders/novita.ts +1 -105
  232. package/src/config/modelProviders/ollama.ts +1 -325
  233. package/src/config/modelProviders/openai.ts +1 -242
  234. package/src/config/modelProviders/openrouter.ts +1 -240
  235. package/src/config/modelProviders/perplexity.ts +1 -45
  236. package/src/config/modelProviders/ppio.ts +1 -152
  237. package/src/config/modelProviders/qiniu.ts +2 -19
  238. package/src/config/modelProviders/qwen.ts +1 -245
  239. package/src/config/modelProviders/search1api.ts +1 -34
  240. package/src/config/modelProviders/sensenova.ts +1 -69
  241. package/src/config/modelProviders/siliconcloud.ts +1 -417
  242. package/src/config/modelProviders/spark.ts +1 -59
  243. package/src/config/modelProviders/stepfun.ts +1 -98
  244. package/src/config/modelProviders/taichu.ts +1 -18
  245. package/src/config/modelProviders/togetherai.ts +1 -274
  246. package/src/config/modelProviders/upstage.ts +1 -28
  247. package/src/config/modelProviders/wenxin.ts +1 -140
  248. package/src/config/modelProviders/xai.ts +1 -38
  249. package/src/config/modelProviders/zeroone.ts +1 -81
  250. package/src/config/modelProviders/zhipu.ts +1 -108
  251. package/src/envs/app.ts +5 -8
  252. package/src/envs/auth.ts +0 -179
  253. package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
  254. package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
  255. package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
  256. package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
  257. package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
  258. package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
  259. package/src/features/Conversation/Error/index.tsx +15 -5
  260. package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
  261. package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
  262. package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
  263. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
  264. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
  265. package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
  266. package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
  267. package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
  268. package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
  269. package/src/features/Conversation/Messages/Default.tsx +2 -2
  270. package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
  271. package/src/features/Conversation/Messages/User/index.tsx +4 -4
  272. package/src/features/Conversation/Messages/index.tsx +3 -3
  273. package/src/features/Conversation/components/AutoScroll.tsx +2 -2
  274. package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
  275. package/src/features/DataImporter/index.tsx +15 -60
  276. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  277. package/src/features/PluginTag/index.tsx +1 -3
  278. package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
  279. package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
  280. package/src/helpers/isCanUseFC.ts +0 -8
  281. package/src/hooks/useEnabledChatModels.ts +0 -8
  282. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  283. package/src/hooks/useModelContextWindowTokens.ts +0 -8
  284. package/src/hooks/useModelHasContextWindowToken.ts +1 -10
  285. package/src/hooks/useModelSupportFiles.ts +1 -11
  286. package/src/hooks/useModelSupportReasoning.ts +1 -11
  287. package/src/hooks/useModelSupportToolUse.ts +1 -11
  288. package/src/hooks/useModelSupportVision.ts +1 -11
  289. package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
  290. package/src/libs/next-auth/auth.config.ts +3 -6
  291. package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
  292. package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
  293. package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
  294. package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
  295. package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
  296. package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
  297. package/src/libs/next-auth/sso-providers/github.ts +0 -6
  298. package/src/libs/next-auth/sso-providers/google.ts +0 -2
  299. package/src/libs/next-auth/sso-providers/index.ts +0 -2
  300. package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
  301. package/src/libs/next-auth/sso-providers/logto.ts +3 -5
  302. package/src/libs/next-auth/sso-providers/okta.ts +0 -4
  303. package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
  304. package/src/libs/oidc-provider/provider.ts +1 -1
  305. package/src/libs/trpc/client/index.ts +0 -1
  306. package/src/libs/trpc/client/lambda.ts +8 -5
  307. package/src/libs/trpc/lambda/context.ts +4 -1
  308. package/src/locales/default/oauth.ts +1 -0
  309. package/src/server/globalConfig/index.ts +0 -23
  310. package/src/server/modules/AssistantStore/index.ts +1 -1
  311. package/src/server/modules/ModelRuntime/trace.ts +11 -4
  312. package/src/server/routers/desktop/mcp.ts +1 -3
  313. package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +0 -41
  314. package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
  315. package/src/server/routers/lambda/config/index.test.ts +38 -30
  316. package/src/server/routers/lambda/message.ts +17 -13
  317. package/src/server/routers/lambda/session.ts +8 -5
  318. package/src/server/routers/lambda/user.ts +24 -25
  319. package/src/server/routers/tools/mcp.ts +2 -3
  320. package/src/server/routers/tools/search.test.ts +1 -7
  321. package/src/server/routers/tools/search.ts +1 -4
  322. package/src/server/services/search/impls/firecrawl/index.ts +51 -11
  323. package/src/server/services/search/impls/firecrawl/type.ts +60 -9
  324. package/src/services/__tests__/tool.test.ts +0 -3
  325. package/src/services/aiModel/index.test.ts +0 -3
  326. package/src/services/aiModel/index.ts +1 -7
  327. package/src/services/aiProvider/index.test.ts +0 -3
  328. package/src/services/aiProvider/index.ts +1 -7
  329. package/src/services/chat/chat.test.ts +13 -40
  330. package/src/services/chat/contextEngineering.test.ts +0 -30
  331. package/src/services/chat/contextEngineering.ts +1 -12
  332. package/src/services/chat/helper.ts +7 -31
  333. package/src/services/chat/index.ts +5 -10
  334. package/src/services/chat/types.ts +1 -1
  335. package/src/services/chatGroup/index.ts +1 -10
  336. package/src/services/config.ts +1 -65
  337. package/src/services/export/index.ts +1 -4
  338. package/src/services/file/index.ts +1 -11
  339. package/src/services/import/index.ts +1 -7
  340. package/src/services/mcp.test.ts +777 -0
  341. package/src/services/message/index.ts +1 -11
  342. package/src/services/message/server.ts +7 -6
  343. package/src/services/message/type.ts +6 -3
  344. package/src/services/models.ts +2 -11
  345. package/src/services/plugin/index.ts +1 -11
  346. package/src/services/session/index.ts +1 -11
  347. package/src/services/tableViewer/client.ts +12 -15
  348. package/src/services/thread/index.ts +1 -7
  349. package/src/services/topic/index.ts +1 -11
  350. package/src/services/user/index.ts +1 -13
  351. package/src/store/chat/helpers.test.ts +99 -0
  352. package/src/store/chat/helpers.ts +21 -2
  353. package/src/store/chat/selectors.ts +1 -1
  354. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  355. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  356. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  357. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +45 -155
  358. package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
  359. package/src/store/chat/slices/message/action.test.ts +5 -1
  360. package/src/store/chat/slices/message/action.ts +102 -14
  361. package/src/store/chat/slices/message/reducer.test.ts +363 -5
  362. package/src/store/chat/slices/message/reducer.ts +87 -3
  363. package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
  364. package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
  365. package/src/store/chat/slices/message/selectors/index.ts +2 -0
  366. package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
  367. package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
  368. package/src/store/chat/slices/plugin/action.test.ts +34 -132
  369. package/src/store/chat/slices/plugin/action.ts +1 -44
  370. package/src/store/global/store.ts +1 -7
  371. package/src/store/tool/selectors/tool.test.ts +1 -1
  372. package/src/store/tool/selectors/tool.ts +6 -8
  373. package/src/store/tool/slices/builtin/action.test.ts +83 -35
  374. package/src/store/tool/slices/builtin/action.ts +0 -9
  375. package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
  376. package/src/store/tool/slices/builtin/selectors.ts +15 -21
  377. package/src/store/user/initialState.ts +1 -7
  378. package/src/store/user/selectors.ts +1 -5
  379. package/src/store/user/slices/common/action.test.ts +1 -4
  380. package/src/store/user/slices/common/action.ts +5 -4
  381. package/src/store/user/slices/settings/selectors/index.ts +1 -0
  382. package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
  383. package/src/store/user/store.ts +0 -3
  384. package/src/tools/index.ts +0 -6
  385. package/src/tools/renders.ts +0 -3
  386. package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
  387. package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
  388. package/tsconfig.json +9 -3
  389. package/packages/const/src/guide.ts +0 -89
  390. package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
  391. package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
  392. package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
  393. package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
  394. package/packages/utils/src/_deprecated/parseModels.ts +0 -165
  395. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  396. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  397. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  398. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  399. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  400. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  401. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  402. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  403. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  404. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  405. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  406. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  407. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  408. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  409. package/src/app/[variants]/(main)/settings/llm/ProviderList/Azure/index.tsx +0 -93
  410. package/src/app/[variants]/(main)/settings/llm/ProviderList/Bedrock/index.tsx +0 -70
  411. package/src/app/[variants]/(main)/settings/llm/ProviderList/Cloudflare/index.tsx +0 -39
  412. package/src/app/[variants]/(main)/settings/llm/ProviderList/Github/index.tsx +0 -52
  413. package/src/app/[variants]/(main)/settings/llm/ProviderList/HuggingFace/index.tsx +0 -52
  414. package/src/app/[variants]/(main)/settings/llm/ProviderList/Ollama/index.tsx +0 -20
  415. package/src/app/[variants]/(main)/settings/llm/ProviderList/OpenAI/index.tsx +0 -17
  416. package/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx +0 -132
  417. package/src/app/[variants]/(main)/settings/llm/components/Checker.tsx +0 -118
  418. package/src/app/[variants]/(main)/settings/llm/components/ProviderConfig/index.tsx +0 -303
  419. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/CustomModelOption.tsx +0 -98
  420. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/Form.tsx +0 -104
  421. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelConfigModal/index.tsx +0 -77
  422. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/ModelFetcher.tsx +0 -105
  423. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/Option.tsx +0 -68
  424. package/src/app/[variants]/(main)/settings/llm/components/ProviderModelList/index.tsx +0 -146
  425. package/src/app/[variants]/(main)/settings/llm/const.ts +0 -20
  426. package/src/app/[variants]/(main)/settings/llm/features/Footer.tsx +0 -35
  427. package/src/app/[variants]/(main)/settings/llm/index.tsx +0 -30
  428. package/src/app/[variants]/(main)/settings/llm/type.ts +0 -5
  429. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  430. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  431. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  432. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  433. package/src/components/InnerLink.tsx +0 -20
  434. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  435. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  436. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  437. package/src/database/_deprecated/core/db.ts +0 -246
  438. package/src/database/_deprecated/core/index.ts +0 -2
  439. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  440. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  441. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  442. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  443. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  444. package/src/database/_deprecated/core/model.ts +0 -218
  445. package/src/database/_deprecated/core/schemas.ts +0 -88
  446. package/src/database/_deprecated/core/types/db.ts +0 -15
  447. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  448. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  449. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  450. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  451. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  452. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  453. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  454. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  455. package/src/database/_deprecated/models/file.ts +0 -51
  456. package/src/database/_deprecated/models/message.ts +0 -277
  457. package/src/database/_deprecated/models/plugin.ts +0 -62
  458. package/src/database/_deprecated/models/session.ts +0 -271
  459. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  460. package/src/database/_deprecated/models/topic.ts +0 -250
  461. package/src/database/_deprecated/models/user.ts +0 -69
  462. package/src/database/_deprecated/schemas/files.ts +0 -39
  463. package/src/database/_deprecated/schemas/message.ts +0 -50
  464. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  465. package/src/database/_deprecated/schemas/session.ts +0 -54
  466. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  467. package/src/database/_deprecated/schemas/topic.ts +0 -12
  468. package/src/database/_deprecated/schemas/user.ts +0 -40
  469. package/src/envs/__tests__/auth.test.ts +0 -200
  470. package/src/features/DataImporter/_deprecated.ts +0 -43
  471. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  472. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  473. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  474. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  475. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  476. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  477. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  478. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  479. package/src/features/InitClientDB/index.tsx +0 -37
  480. package/src/hooks/_header.ts +0 -23
  481. package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
  482. package/src/libs/trpc/client/edge.ts +0 -26
  483. package/src/libs/trpc/edge/context.ts +0 -71
  484. package/src/libs/trpc/edge/index.ts +0 -45
  485. package/src/libs/trpc/edge/init.ts +0 -26
  486. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  487. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  488. package/src/migrations/FromV0ToV1.ts +0 -10
  489. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  490. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  491. package/src/migrations/FromV1ToV2/index.ts +0 -82
  492. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  493. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  494. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  495. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  496. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  497. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  498. package/src/migrations/FromV2ToV3/index.ts +0 -30
  499. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  500. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  501. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  502. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  503. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  504. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  505. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  506. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  507. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  508. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  509. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  510. package/src/migrations/FromV3ToV4/index.ts +0 -102
  511. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  512. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  513. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  514. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  515. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  516. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  517. package/src/migrations/FromV4ToV5/index.ts +0 -58
  518. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  519. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  520. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  521. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  522. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  523. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  524. package/src/migrations/FromV5ToV6/index.ts +0 -61
  525. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  526. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  527. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  528. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  529. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  530. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  531. package/src/migrations/FromV6ToV7/index.ts +0 -101
  532. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  533. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  534. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  535. package/src/migrations/VersionController.test.ts +0 -88
  536. package/src/migrations/VersionController.ts +0 -67
  537. package/src/migrations/index.ts +0 -61
  538. package/src/server/globalConfig/_deprecated.test.ts +0 -92
  539. package/src/server/globalConfig/_deprecated.ts +0 -41
  540. package/src/server/routers/edge/appStatus.ts +0 -3
  541. package/src/server/routers/edge/index.ts +0 -14
  542. package/src/server/routers/edge/upload.ts +0 -16
  543. package/src/services/aiModel/client.ts +0 -70
  544. package/src/services/aiProvider/client.ts +0 -58
  545. package/src/services/baseClientService/index.ts +0 -9
  546. package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
  547. package/src/services/chatGroup/client.ts +0 -63
  548. package/src/services/export/_deprecated.ts +0 -155
  549. package/src/services/export/client.ts +0 -15
  550. package/src/services/file/_deprecated.test.ts +0 -119
  551. package/src/services/file/_deprecated.ts +0 -80
  552. package/src/services/file/client.test.ts +0 -199
  553. package/src/services/file/client.ts +0 -85
  554. package/src/services/import/_deprecated.ts +0 -115
  555. package/src/services/import/client.test.ts +0 -1015
  556. package/src/services/import/client.ts +0 -64
  557. package/src/services/message/_deprecated.test.ts +0 -398
  558. package/src/services/message/_deprecated.ts +0 -168
  559. package/src/services/message/client.test.ts +0 -410
  560. package/src/services/message/client.ts +0 -186
  561. package/src/services/plugin/_deprecated.test.ts +0 -162
  562. package/src/services/plugin/_deprecated.ts +0 -42
  563. package/src/services/plugin/client.test.ts +0 -177
  564. package/src/services/plugin/client.ts +0 -46
  565. package/src/services/session/_deprecated.test.ts +0 -440
  566. package/src/services/session/_deprecated.ts +0 -190
  567. package/src/services/session/client.test.ts +0 -413
  568. package/src/services/session/client.ts +0 -193
  569. package/src/services/thread/client.ts +0 -51
  570. package/src/services/topic/_deprecated.test.ts +0 -245
  571. package/src/services/topic/_deprecated.ts +0 -75
  572. package/src/services/topic/client.ts +0 -89
  573. package/src/services/topic/pglite.test.ts +0 -212
  574. package/src/services/user/_deprecated.test.ts +0 -101
  575. package/src/services/user/_deprecated.ts +0 -70
  576. package/src/services/user/client.test.ts +0 -108
  577. package/src/services/user/client.ts +0 -104
  578. package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
  579. package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
  580. package/src/store/global/actions/clientDb.ts +0 -67
  581. package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
  582. package/src/store/user/slices/modelList/action.test.ts +0 -359
  583. package/src/store/user/slices/modelList/action.ts +0 -223
  584. package/src/store/user/slices/modelList/initialState.ts +0 -15
  585. package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
  586. package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
  587. package/src/store/user/slices/modelList/selectors/index.ts +0 -3
  588. package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
  589. package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
  590. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
  591. package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
  592. package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
  593. package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
  594. package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
  595. package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
  596. package/src/tools/dalle/Render/Item/Error.tsx +0 -49
  597. package/src/tools/dalle/Render/Item/Image.tsx +0 -44
  598. package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
  599. package/src/tools/dalle/Render/Item/index.tsx +0 -88
  600. package/src/tools/dalle/Render/ToolBar.tsx +0 -56
  601. package/src/tools/dalle/Render/index.tsx +0 -52
  602. package/src/tools/dalle/index.ts +0 -92
  603. /package/src/{middleware.ts → proxy.ts} +0 -0
@@ -171,7 +171,11 @@ describe('ChatPluginAction', () => {
171
171
  });
172
172
 
173
173
  // 验证 messageService.internal_updateMessageContent 是否被正确调用
174
- expect(messageService.updateMessage).toHaveBeenCalledWith(messageId, { content: newContent });
174
+ expect(messageService.updateMessage).toHaveBeenCalledWith(
175
+ messageId,
176
+ { content: newContent },
177
+ { sessionId: 'inbox', topicId: null },
178
+ );
175
179
 
176
180
  // 验证 refreshMessages 是否被调用
177
181
  expect(result.current.refreshMessages).toHaveBeenCalled();
@@ -207,7 +211,11 @@ describe('ChatPluginAction', () => {
207
211
  });
208
212
 
209
213
  // 验证 messageService.internal_updateMessageContent 是否被正确调用
210
- expect(messageService.updateMessage).toHaveBeenCalledWith(messageId, { content: newContent });
214
+ expect(messageService.updateMessage).toHaveBeenCalledWith(
215
+ messageId,
216
+ { content: newContent },
217
+ { sessionId: 'inbox', topicId: null },
218
+ );
211
219
 
212
220
  // 验证 refreshMessages 是否被调用
213
221
  expect(result.current.refreshMessages).toHaveBeenCalled();
@@ -246,9 +254,11 @@ describe('ChatPluginAction', () => {
246
254
  expect.any(String),
247
255
  );
248
256
  expect(runSpy).toHaveBeenCalledWith(pluginPayload, { signal: undefined, trace: {} });
249
- expect(messageService.updateMessage).toHaveBeenCalledWith(messageId, {
250
- content: pluginApiResponse,
251
- });
257
+ expect(messageService.updateMessage).toHaveBeenCalledWith(
258
+ messageId,
259
+ { content: pluginApiResponse },
260
+ { sessionId: 'inbox', topicId: null },
261
+ );
252
262
  expect(storeState.refreshMessages).toHaveBeenCalled();
253
263
  expect(storeState.internal_togglePluginApiCalling).toHaveBeenCalledWith(
254
264
  false,
@@ -602,24 +612,18 @@ describe('ChatPluginAction', () => {
602
612
  });
603
613
 
604
614
  describe('invokeBuiltinTool', () => {
605
- it('should invoke a builtin tool and update message content ,then run text2image', async () => {
615
+ it('should invoke the builtin tool action with parsed arguments', async () => {
606
616
  const payload = {
607
- apiName: 'text2image',
608
- arguments: JSON.stringify({ key: 'value' }),
617
+ apiName: 'mockBuiltinAction',
618
+ arguments: JSON.stringify({ input: 'test', value: 123 }),
609
619
  } as ChatToolPayload;
610
620
 
611
621
  const messageId = 'message-id';
612
- const toolResponse = JSON.stringify({ abc: 'data' });
613
-
614
- useToolStore.setState({
615
- transformApiArgumentsToAiState: vi.fn().mockResolvedValue(toolResponse),
616
- });
622
+ const mockActionFn = vi.fn().mockResolvedValue(undefined);
617
623
 
618
624
  useChatStore.setState({
619
- internal_togglePluginApiCalling: vi.fn(),
620
- internal_updateMessageContent: vi.fn(),
621
- text2image: vi.fn(),
622
- });
625
+ mockBuiltinAction: mockActionFn,
626
+ } as any);
623
627
 
624
628
  const { result } = renderHook(() => useChatStore());
625
629
 
@@ -627,114 +631,39 @@ describe('ChatPluginAction', () => {
627
631
  await result.current.invokeBuiltinTool(messageId, payload);
628
632
  });
629
633
 
630
- // Verify that the builtin tool was invoked with the correct arguments
631
- expect(useToolStore.getState().transformApiArgumentsToAiState).toHaveBeenCalledWith(
632
- payload.apiName,
633
- JSON.parse(payload.arguments),
634
- );
635
-
636
- // Verify that the message content was updated with the tool response
637
- expect(result.current.internal_updateMessageContent).toHaveBeenCalledWith(
638
- messageId,
639
- toolResponse,
640
- );
641
-
642
- // Verify that loading was toggled correctly
643
- expect(result.current.internal_togglePluginApiCalling).toHaveBeenCalledTimes(2);
644
-
645
- expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
646
- 1,
647
- true,
648
- messageId,
649
- expect.any(String),
650
- );
651
- expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
652
- 2,
653
- false,
654
- messageId,
655
- expect.any(String),
656
- );
657
- expect(useChatStore.getState().text2image).toHaveBeenCalled();
634
+ // Verify that the builtin action was called with correct arguments
635
+ expect(mockActionFn).toHaveBeenCalledWith(messageId, { input: 'test', value: 123 });
658
636
  });
659
637
 
660
- it('should invoke a builtin tool and update message content', async () => {
638
+ it('should not invoke action if apiName does not exist in store', async () => {
661
639
  const payload = {
662
- apiName: 'text2image',
640
+ apiName: 'nonExistentAction',
663
641
  arguments: JSON.stringify({ key: 'value' }),
664
642
  } as ChatToolPayload;
665
643
 
666
644
  const messageId = 'message-id';
667
- const toolResponse = 'Builtin tool response';
668
-
669
- act(() => {
670
- useToolStore.setState({
671
- transformApiArgumentsToAiState: vi.fn().mockResolvedValue(toolResponse),
672
- text2image: vi.fn(),
673
- });
674
645
 
675
- useChatStore.setState({
676
- internal_togglePluginApiCalling: vi.fn(),
677
- text2image: vi.fn(),
678
- internal_updateMessageContent: vi.fn(),
679
- });
680
- });
681
646
  const { result } = renderHook(() => useChatStore());
682
647
 
683
648
  await act(async () => {
684
649
  await result.current.invokeBuiltinTool(messageId, payload);
685
650
  });
686
651
 
687
- // Verify that the builtin tool was invoked with the correct arguments
688
- expect(useToolStore.getState().transformApiArgumentsToAiState).toHaveBeenCalledWith(
689
- payload.apiName,
690
- JSON.parse(payload.arguments),
691
- );
692
-
693
- // Verify that the message content was updated with the tool response
694
- expect(result.current.internal_togglePluginApiCalling).toHaveBeenCalledTimes(2);
695
- expect(result.current.internal_updateMessageContent).toHaveBeenCalledWith(
696
- messageId,
697
- toolResponse,
698
- );
699
-
700
- // Verify that loading was toggled correctly
701
- expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
702
- 1,
703
- true,
704
- messageId,
705
- expect.any(String),
706
- );
707
- expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
708
- 2,
709
- false,
710
- messageId,
711
- expect.any(String),
712
- );
713
- expect(useChatStore.getState().text2image).not.toHaveBeenCalled();
652
+ // Should not throw error, just return early
714
653
  });
715
654
 
716
- it('should handle errors when transformApiArgumentsToAiState throw error', async () => {
717
- const args = { key: 'value' };
655
+ it('should not invoke action if arguments cannot be parsed', async () => {
718
656
  const payload = {
719
- apiName: 'builtinApi',
720
- arguments: JSON.stringify(args),
657
+ apiName: 'mockBuiltinAction',
658
+ arguments: 'invalid json',
721
659
  } as ChatToolPayload;
722
660
 
723
661
  const messageId = 'message-id';
724
-
725
- useToolStore.setState({
726
- transformApiArgumentsToAiState: vi
727
- .fn()
728
- .mockRejectedValue({ error: 'transformApiArgumentsToAiState throw error' }),
729
- });
662
+ const mockActionFn = vi.fn().mockResolvedValue(undefined);
730
663
 
731
664
  useChatStore.setState({
732
- internal_togglePluginApiCalling: vi.fn(),
733
- internal_updateMessageContent: vi.fn(),
734
- internal_updatePluginError: vi.fn(),
735
- text2image: vi.fn(),
736
- refreshMessages: vi.fn(),
737
- });
665
+ mockBuiltinAction: mockActionFn,
666
+ } as any);
738
667
 
739
668
  const { result } = renderHook(() => useChatStore());
740
669
 
@@ -742,35 +671,8 @@ describe('ChatPluginAction', () => {
742
671
  await result.current.invokeBuiltinTool(messageId, payload);
743
672
  });
744
673
 
745
- expect(result.current.internal_updatePluginError).toHaveBeenCalledWith('message-id', {
746
- type: 'PluginFailToTransformArguments',
747
- body: {
748
- message: expect.any(String),
749
- stack: undefined,
750
- arguments: args,
751
- schema: undefined,
752
- },
753
- message: expect.any(String),
754
- });
755
- // Verify that loading was toggled correctly
756
- expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
757
- 1,
758
- true,
759
- messageId,
760
- expect.any(String),
761
- );
762
- expect(result.current.internal_togglePluginApiCalling).toHaveBeenNthCalledWith(
763
- 2,
764
- false,
765
- messageId,
766
- expect.any(String),
767
- );
768
-
769
- // Verify that the message content was not updated
770
- expect(result.current.internal_updateMessageContent).not.toHaveBeenCalled();
771
-
772
- // Verify that messages were not refreshed
773
- expect(useChatStore.getState().text2image).not.toHaveBeenCalled();
674
+ // Should not call the action if arguments can't be parsed
675
+ expect(mockActionFn).not.toHaveBeenCalled();
774
676
  });
775
677
  });
776
678
 
@@ -1,7 +1,6 @@
1
1
  /* eslint-disable sort-keys-fix/sort-keys-fix, typescript-sort-keys/interface */
2
2
  import { ToolNameResolver } from '@lobechat/context-engine';
3
3
  import {
4
- ChatErrorType,
5
4
  ChatMessageError,
6
5
  ChatToolPayload,
7
6
  CreateMessageParams,
@@ -111,54 +110,12 @@ export const chatPlugin: StateCreator<
111
110
  if (triggerAiMessage) await triggerAIMessage({ parentId: id });
112
111
  },
113
112
  invokeBuiltinTool: async (id, payload) => {
114
- const {
115
- internal_togglePluginApiCalling,
116
- internal_updateMessageContent,
117
- internal_updatePluginError,
118
- } = get();
119
- const params = JSON.parse(payload.arguments);
120
- internal_togglePluginApiCalling(true, id, n('invokeBuiltinTool/start') as string);
121
- let data;
122
- try {
123
- data = await useToolStore.getState().transformApiArgumentsToAiState(payload.apiName, params);
124
- } catch (error) {
125
- const err = error as Error;
126
- console.error(err);
127
-
128
- const tool = builtinTools.find((tool) => tool.identifier === payload.identifier);
129
- const schema = tool?.manifest?.api.find((api) => api.name === payload.apiName)?.parameters;
130
-
131
- await internal_updatePluginError(id, {
132
- type: ChatErrorType.PluginFailToTransformArguments,
133
- body: {
134
- message:
135
- "[plugin] fail to transform plugin arguments to ai state, it may due to model's limited tools calling capacity. You can refer to https://lobehub.com/docs/usage/tools-calling for more detail.",
136
- stack: err.stack,
137
- arguments: params,
138
- schema,
139
- },
140
- message: '',
141
- });
142
- }
143
- internal_togglePluginApiCalling(false, id, n('invokeBuiltinTool/end') as string);
144
-
145
- if (!data) return;
146
-
147
- await internal_updateMessageContent(id, data);
148
-
149
113
  // run tool api call
150
- // postToolCalling
151
114
  // @ts-ignore
152
115
  const { [payload.apiName]: action } = get();
153
116
  if (!action) return;
154
117
 
155
- let content;
156
-
157
- try {
158
- content = JSON.parse(data);
159
- } catch {
160
- /* empty block */
161
- }
118
+ const content = safeParseJSON(payload.arguments);
162
119
 
163
120
  if (!content) return;
164
121
 
@@ -4,25 +4,19 @@ import { createWithEqualityFn } from 'zustand/traditional';
4
4
  import { StateCreator } from 'zustand/vanilla';
5
5
 
6
6
  import { createDevtools } from '../middleware/createDevtools';
7
- import { type GlobalClientDBAction, clientDBSlice } from './actions/clientDb';
8
7
  import { type GlobalGeneralAction, generalActionSlice } from './actions/general';
9
8
  import { type GlobalWorkspacePaneAction, globalWorkspaceSlice } from './actions/workspacePane';
10
9
  import { type GlobalState, initialState } from './initialState';
11
10
 
12
11
  // =============== 聚合 createStoreFn ============ //
13
12
 
14
- export interface GlobalStore
15
- extends GlobalState,
16
- GlobalWorkspacePaneAction,
17
- GlobalClientDBAction,
18
- GlobalGeneralAction {
13
+ export interface GlobalStore extends GlobalState, GlobalWorkspacePaneAction, GlobalGeneralAction {
19
14
  /* empty */
20
15
  }
21
16
 
22
17
  const createStore: StateCreator<GlobalStore, [['zustand/devtools', never]]> = (...parameters) => ({
23
18
  ...initialState,
24
19
  ...globalWorkspaceSlice(...parameters),
25
- ...clientDBSlice(...parameters),
26
20
  ...generalActionSlice(...parameters),
27
21
  });
28
22
 
@@ -78,7 +78,7 @@ describe('toolSelectors', () => {
78
78
 
79
79
  describe('metaList and getMetaById', () => {
80
80
  it('should return the correct list of tool metadata', () => {
81
- const result = toolSelectors.metaList()(mockState);
81
+ const result = toolSelectors.metaList(mockState);
82
82
  expect(result).toEqual([
83
83
  {
84
84
  type: 'builtin',
@@ -53,18 +53,16 @@ const enabledSystemRoles =
53
53
  return '';
54
54
  };
55
55
 
56
- const metaList =
57
- (showDalle?: boolean) =>
58
- (s: ToolStoreState): LobeToolMeta[] => {
59
- const pluginList = pluginSelectors.installedPluginMetaList(s) as LobeToolMeta[];
56
+ const metaList = (s: ToolStoreState): LobeToolMeta[] => {
57
+ const pluginList = pluginSelectors.installedPluginMetaList(s) as LobeToolMeta[];
60
58
 
61
- return builtinToolSelectors.metaList(showDalle)(s).concat(pluginList);
62
- };
59
+ return builtinToolSelectors.metaList(s).concat(pluginList);
60
+ };
63
61
 
64
62
  const getMetaById =
65
- (id: string, showDalle: boolean = true) =>
63
+ (id: string) =>
66
64
  (s: ToolStoreState): MetaData | undefined => {
67
- const item = metaList(showDalle)(s).find((m) => m.identifier === id);
65
+ const item = metaList(s).find((m) => m.identifier === id);
68
66
 
69
67
  if (!item) return;
70
68
 
@@ -6,19 +6,20 @@ import { useToolStore } from '../../store';
6
6
  vi.mock('zustand/traditional');
7
7
 
8
8
  describe('createBuiltinToolSlice', () => {
9
- describe('invokeBuiltinTool', () => {
10
- it('should return if the tool is already loading', async () => {
9
+ describe('transformApiArgumentsToAiState', () => {
10
+ it('should return early if the tool is already loading', async () => {
11
11
  // Given
12
- const key = 'text2image';
13
- const params = {};
12
+ const key = 'mockTool';
13
+ const params = { test: 'data' };
14
14
 
15
15
  const mockFn = vi.fn();
16
16
  const { result } = renderHook(() => useToolStore());
17
17
 
18
18
  act(() => {
19
19
  useToolStore.setState({
20
- text2image: mockFn,
21
- });
20
+ builtinToolLoading: { [key]: true },
21
+ mockTool: mockFn,
22
+ } as any);
22
23
  });
23
24
 
24
25
  await act(async () => {
@@ -27,61 +28,108 @@ describe('createBuiltinToolSlice', () => {
27
28
  expect(data).toBeUndefined();
28
29
  });
29
30
 
30
- // Then
31
- expect(mockFn).toHaveBeenCalled();
31
+ // Then - should not call the action if already loading
32
+ expect(mockFn).not.toHaveBeenCalled();
32
33
  });
33
34
 
34
35
  it('should invoke the specified tool action and return the stringified result', async () => {
35
36
  // Given
36
- const key = 'text2image';
37
-
38
- const mockFn = vi.fn();
37
+ const key = 'mockTool';
38
+ const mockResult = { success: true, data: 'test result' };
39
+ const mockFn = vi.fn().mockResolvedValue(mockResult);
39
40
  const { result } = renderHook(() => useToolStore());
40
41
 
41
42
  const params = {
42
- prompts: ['test prompt'],
43
- size: '512x512',
44
- quality: 'standard',
45
- style: 'vivid',
43
+ input: 'test input',
44
+ option: 'value',
46
45
  };
47
46
 
48
47
  act(() => {
49
48
  useToolStore.setState({
50
49
  builtinToolLoading: { [key]: false },
51
- text2image: mockFn,
50
+ mockTool: mockFn,
51
+ } as any);
52
+ });
53
+
54
+ // When
55
+ let resultData: string | undefined;
56
+ await act(async () => {
57
+ resultData = await result.current.transformApiArgumentsToAiState(key, params);
58
+ });
59
+
60
+ // Then
61
+ expect(mockFn).toHaveBeenCalledWith({
62
+ input: 'test input',
63
+ option: 'value',
64
+ });
65
+ expect(resultData).toBe(JSON.stringify(mockResult));
66
+ });
67
+
68
+ it('should return stringified params if action does not exist', async () => {
69
+ // Given
70
+ const key = 'nonExistentTool';
71
+ const params = { test: 'data' };
72
+ const { result } = renderHook(() => useToolStore());
73
+
74
+ act(() => {
75
+ useToolStore.setState({
76
+ builtinToolLoading: {},
52
77
  });
53
78
  });
79
+
54
80
  // When
81
+ let resultData: string | undefined;
55
82
  await act(async () => {
56
- await result.current.transformApiArgumentsToAiState(key, params);
83
+ resultData = await result.current.transformApiArgumentsToAiState(key, params);
57
84
  });
58
85
 
59
- expect(mockFn).toBeCalledWith({
60
- prompts: ['test prompt'],
61
- quality: 'standard',
62
- size: '512x512',
63
- style: 'vivid',
86
+ // Then
87
+ expect(resultData).toBe(JSON.stringify(params));
88
+ });
89
+
90
+ it('should handle errors and toggle loading state', async () => {
91
+ // Given
92
+ const key = 'mockTool';
93
+ const params = { test: 'data' };
94
+ const error = new Error('Tool execution failed');
95
+ const mockFn = vi.fn().mockRejectedValue(error);
96
+ const { result } = renderHook(() => useToolStore());
97
+
98
+ act(() => {
99
+ useToolStore.setState({
100
+ builtinToolLoading: { [key]: false },
101
+ mockTool: mockFn,
102
+ } as any);
103
+ });
104
+
105
+ // When/Then
106
+ await act(async () => {
107
+ await expect(result.current.transformApiArgumentsToAiState(key, params)).rejects.toThrow(
108
+ 'Tool execution failed',
109
+ );
64
110
  });
111
+
112
+ // Should have toggled loading state back to false
113
+ expect(result.current.builtinToolLoading[key]).toBe(false);
65
114
  });
66
115
  });
67
116
 
68
- describe('text2image', () => {
69
- it('should map the prompts to DallEImageItem objects', () => {
70
- // When
117
+ describe('toggleBuiltinToolLoading', () => {
118
+ it('should toggle the loading state for a tool', () => {
71
119
  const { result } = renderHook(() => useToolStore());
120
+ const key = 'testTool';
121
+
122
+ act(() => {
123
+ result.current.toggleBuiltinToolLoading(key, true);
124
+ });
125
+
126
+ expect(result.current.builtinToolLoading[key]).toBe(true);
72
127
 
73
- const data = result.current.text2image({
74
- prompts: ['prompt1', 'prompt2'],
75
- size: '1024x1024',
76
- quality: 'standard',
77
- style: 'vivid',
128
+ act(() => {
129
+ result.current.toggleBuiltinToolLoading(key, false);
78
130
  });
79
131
 
80
- // Then
81
- expect(data).toEqual([
82
- { prompt: 'prompt1', quality: 'standard', size: '1024x1024', style: 'vivid' },
83
- { prompt: 'prompt2', quality: 'standard', size: '1024x1024', style: 'vivid' },
84
- ]);
132
+ expect(result.current.builtinToolLoading[key]).toBe(false);
85
133
  });
86
134
  });
87
135
  });
@@ -1,22 +1,15 @@
1
1
  import { StateCreator } from 'zustand/vanilla';
2
2
 
3
- import { OpenAIImagePayload } from '@/types/openai/image';
4
- import { DallEImageItem } from '@/types/tool/dalle';
5
3
  import { setNamespace } from '@/utils/storeDebug';
6
4
 
7
5
  import { ToolStore } from '../../store';
8
6
 
9
7
  const n = setNamespace('builtinTool');
10
8
 
11
- interface Text2ImageParams extends Pick<OpenAIImagePayload, 'quality' | 'style' | 'size'> {
12
- prompts: string[];
13
- }
14
-
15
9
  /**
16
10
  * 代理行为接口
17
11
  */
18
12
  export interface BuiltinToolAction {
19
- text2image: (params: Text2ImageParams) => DallEImageItem[];
20
13
  toggleBuiltinToolLoading: (key: string, value: boolean) => void;
21
14
  transformApiArgumentsToAiState: (key: string, params: any) => Promise<string | undefined>;
22
15
  }
@@ -27,8 +20,6 @@ export const createBuiltinToolSlice: StateCreator<
27
20
  [],
28
21
  BuiltinToolAction
29
22
  > = (set, get) => ({
30
- text2image: ({ prompts, size = '1024x1024' as const, quality = 'standard', style = 'vivid' }) =>
31
- prompts.map((p) => ({ prompt: p, quality, size, style })),
32
23
  toggleBuiltinToolLoading: (key, value) => {
33
24
  set({ builtinToolLoading: { [key]: value } }, false, n('toggleBuiltinToolLoading'));
34
25
  },
@@ -1,7 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
 
3
- import { DalleManifest } from '@/tools/dalle';
4
-
5
3
  import { ToolStoreState, initialState } from '../../initialState';
6
4
  import { builtinToolSelectors } from './selectors';
7
5
 
@@ -10,34 +8,11 @@ describe('builtinToolSelectors', () => {
10
8
  it('should return meta list excluding Dalle when showDalle is false', () => {
11
9
  const state = {
12
10
  ...initialState,
13
- builtinTools: [
14
- { identifier: 'tool-1', manifest: { meta: { title: 'Tool 1' } } },
15
- { identifier: DalleManifest.identifier, manifest: { meta: { title: 'Dalle' } } },
16
- ],
17
- } as ToolStoreState;
18
- const result = builtinToolSelectors.metaList(false)(state);
19
- expect(result).toEqual([
20
- { author: 'LobeHub', identifier: 'tool-1', meta: { title: 'Tool 1' }, type: 'builtin' },
21
- ]);
22
- });
23
-
24
- it('should include Dalle when showDalle is true', () => {
25
- const state = {
26
- ...initialState,
27
- builtinTools: [
28
- { identifier: 'tool-1', manifest: { meta: { title: 'Tool 1' } } },
29
- { identifier: DalleManifest.identifier, manifest: { meta: { title: 'Dalle' } } },
30
- ],
11
+ builtinTools: [{ identifier: 'tool-1', manifest: { meta: { title: 'Tool 1' } } }],
31
12
  } as ToolStoreState;
32
- const result = builtinToolSelectors.metaList(true)(state);
13
+ const result = builtinToolSelectors.metaList(state);
33
14
  expect(result).toEqual([
34
15
  { author: 'LobeHub', identifier: 'tool-1', meta: { title: 'Tool 1' }, type: 'builtin' },
35
- {
36
- author: 'LobeHub',
37
- identifier: DalleManifest.identifier,
38
- meta: { title: 'Dalle' },
39
- type: 'builtin',
40
- },
41
16
  ]);
42
17
  });
43
18
 
@@ -46,10 +21,9 @@ describe('builtinToolSelectors', () => {
46
21
  ...initialState,
47
22
  builtinTools: [
48
23
  { identifier: 'tool-1', hidden: true, manifest: { meta: { title: 'Tool 1' } } },
49
- { identifier: DalleManifest.identifier, manifest: { meta: { title: 'Dalle' } } },
50
24
  ],
51
25
  } as ToolStoreState;
52
- const result = builtinToolSelectors.metaList(false)(state);
26
+ const result = builtinToolSelectors.metaList(state);
53
27
  expect(result).toEqual([]);
54
28
  });
55
29
 
@@ -58,7 +32,7 @@ describe('builtinToolSelectors', () => {
58
32
  ...initialState,
59
33
  builtinTools: [],
60
34
  };
61
- const result = builtinToolSelectors.metaList(false)(state);
35
+ const result = builtinToolSelectors.metaList(state);
62
36
  expect(result).toEqual([]);
63
37
  });
64
38
  });
@@ -1,32 +1,26 @@
1
1
  import { LobeToolMeta } from '@lobechat/types';
2
2
 
3
3
  import { shouldEnableTool } from '@/helpers/toolFilters';
4
- import { DalleManifest } from '@/tools/dalle';
5
4
 
6
5
  import type { ToolStoreState } from '../../initialState';
7
6
 
8
- const metaList =
9
- (showDalle?: boolean) =>
10
- (s: ToolStoreState): LobeToolMeta[] =>
11
- s.builtinTools
12
- .filter((item) => {
13
- // Filter hidden tools
14
- if (item.hidden) return false;
7
+ const metaList = (s: ToolStoreState): LobeToolMeta[] =>
8
+ s.builtinTools
9
+ .filter((item) => {
10
+ // Filter hidden tools
11
+ if (item.hidden) return false;
15
12
 
16
- // Filter Dalle if not enabled
17
- if (!showDalle && item.identifier === DalleManifest.identifier) return false;
13
+ // Filter platform-specific tools (e.g., LocalSystem desktop-only)
14
+ if (!shouldEnableTool(item.identifier)) return false;
18
15
 
19
- // Filter platform-specific tools (e.g., LocalSystem desktop-only)
20
- if (!shouldEnableTool(item.identifier)) return false;
21
-
22
- return true;
23
- })
24
- .map((t) => ({
25
- author: 'LobeHub',
26
- identifier: t.identifier,
27
- meta: t.manifest.meta,
28
- type: 'builtin',
29
- }));
16
+ return true;
17
+ })
18
+ .map((t) => ({
19
+ author: 'LobeHub',
20
+ identifier: t.identifier,
21
+ meta: t.manifest.meta,
22
+ type: 'builtin',
23
+ }));
30
24
 
31
25
  export const builtinToolSelectors = {
32
26
  metaList,