@lobehub/lobehub 2.0.0-next.3 → 2.0.0-next.30

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 (726) 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 +667 -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/MenuCtr.ts +5 -5
  19. package/apps/desktop/src/main/controllers/NotificationCtr.ts +29 -29
  20. package/apps/desktop/src/main/controllers/RemoteServerConfigCtr.ts +16 -16
  21. package/apps/desktop/src/main/controllers/ShortcutCtr.ts +2 -2
  22. package/apps/desktop/src/main/controllers/TrayMenuCtr.ts +18 -18
  23. package/apps/desktop/src/main/controllers/UpdaterCtr.ts +4 -4
  24. package/apps/desktop/src/main/controllers/__tests__/AuthCtr.test.ts +706 -0
  25. package/apps/desktop/src/main/controllers/__tests__/TrayMenuCtr.test.ts +5 -5
  26. package/apps/desktop/src/main/controllers/index.ts +4 -4
  27. package/apps/desktop/src/main/utils/next-electron-rsc.ts +7 -5
  28. package/apps/desktop/tsconfig.json +0 -1
  29. package/changelog/v1.json +227 -0
  30. package/docs/development/database-schema.dbml +12 -0
  31. package/docs/self-hosting/advanced/auth/next-auth/auth0.mdx +2 -2
  32. package/docs/self-hosting/advanced/auth/next-auth/auth0.zh-CN.mdx +2 -2
  33. package/docs/self-hosting/advanced/auth/next-auth/authelia.mdx +2 -2
  34. package/docs/self-hosting/advanced/auth/next-auth/authelia.zh-CN.mdx +2 -2
  35. package/docs/self-hosting/advanced/auth/next-auth/authentik.mdx +2 -2
  36. package/docs/self-hosting/advanced/auth/next-auth/authentik.zh-CN.mdx +2 -2
  37. package/docs/self-hosting/advanced/auth/next-auth/casdoor.mdx +2 -2
  38. package/docs/self-hosting/advanced/auth/next-auth/casdoor.zh-CN.mdx +2 -2
  39. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.mdx +2 -2
  40. package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.zh-CN.mdx +2 -2
  41. package/docs/self-hosting/advanced/auth/next-auth/github.mdx +2 -2
  42. package/docs/self-hosting/advanced/auth/next-auth/github.zh-CN.mdx +2 -2
  43. package/docs/self-hosting/advanced/auth/next-auth/google.mdx +32 -29
  44. package/docs/self-hosting/advanced/auth/next-auth/keycloak.mdx +2 -2
  45. package/docs/self-hosting/advanced/auth/next-auth/keycloak.zh-CN.mdx +2 -2
  46. package/docs/self-hosting/advanced/auth/next-auth/logto.mdx +5 -3
  47. package/docs/self-hosting/advanced/auth/next-auth/logto.zh-CN.mdx +5 -3
  48. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.mdx +2 -2
  49. package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.zh-CN.mdx +2 -2
  50. package/docs/self-hosting/advanced/auth/next-auth/okta.mdx +2 -2
  51. package/docs/self-hosting/advanced/auth/next-auth/okta.zh-CN.mdx +2 -2
  52. package/docs/self-hosting/advanced/auth/next-auth/wechat.mdx +2 -2
  53. package/docs/self-hosting/advanced/auth/next-auth/wechat.zh-CN.mdx +2 -2
  54. package/docs/self-hosting/advanced/auth/next-auth/zitadel.mdx +2 -2
  55. package/docs/self-hosting/advanced/auth/next-auth/zitadel.zh-CN.mdx +2 -2
  56. package/docs/self-hosting/advanced/auth.mdx +32 -21
  57. package/docs/self-hosting/advanced/auth.zh-CN.mdx +30 -19
  58. package/docs/self-hosting/advanced/feature-flags.mdx +0 -1
  59. package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +0 -1
  60. package/docs/self-hosting/advanced/online-search.mdx +30 -25
  61. package/docs/self-hosting/advanced/online-search.zh-CN.mdx +25 -23
  62. package/e2e/src/features/discover/detail-pages.feature +95 -0
  63. package/e2e/src/features/discover/interactions.feature +113 -0
  64. package/e2e/src/features/discover/smoke.feature +34 -1
  65. package/e2e/src/steps/discover/detail-pages.steps.ts +295 -0
  66. package/e2e/src/steps/discover/interactions.steps.ts +451 -0
  67. package/e2e/src/steps/discover/smoke.steps.ts +116 -4
  68. package/e2e/tsconfig.json +0 -1
  69. package/locales/ar/labs.json +4 -0
  70. package/locales/ar/models.json +15 -6
  71. package/locales/ar/oauth.json +1 -0
  72. package/locales/bg-BG/labs.json +4 -0
  73. package/locales/bg-BG/models.json +15 -6
  74. package/locales/bg-BG/oauth.json +1 -0
  75. package/locales/de-DE/labs.json +4 -0
  76. package/locales/de-DE/models.json +15 -6
  77. package/locales/de-DE/oauth.json +1 -0
  78. package/locales/en-US/labs.json +4 -0
  79. package/locales/en-US/models.json +15 -6
  80. package/locales/en-US/oauth.json +1 -0
  81. package/locales/es-ES/labs.json +4 -0
  82. package/locales/es-ES/models.json +15 -6
  83. package/locales/es-ES/oauth.json +1 -0
  84. package/locales/fa-IR/labs.json +4 -0
  85. package/locales/fa-IR/models.json +15 -6
  86. package/locales/fa-IR/oauth.json +1 -0
  87. package/locales/fr-FR/labs.json +4 -0
  88. package/locales/fr-FR/models.json +15 -6
  89. package/locales/fr-FR/oauth.json +1 -0
  90. package/locales/it-IT/labs.json +4 -0
  91. package/locales/it-IT/models.json +15 -6
  92. package/locales/it-IT/oauth.json +1 -0
  93. package/locales/ja-JP/labs.json +4 -0
  94. package/locales/ja-JP/models.json +15 -6
  95. package/locales/ja-JP/oauth.json +1 -0
  96. package/locales/ko-KR/labs.json +4 -0
  97. package/locales/ko-KR/models.json +21 -12
  98. package/locales/ko-KR/oauth.json +1 -0
  99. package/locales/nl-NL/labs.json +4 -0
  100. package/locales/nl-NL/models.json +15 -6
  101. package/locales/nl-NL/oauth.json +1 -0
  102. package/locales/pl-PL/labs.json +4 -0
  103. package/locales/pl-PL/models.json +15 -6
  104. package/locales/pl-PL/oauth.json +1 -0
  105. package/locales/pt-BR/labs.json +4 -0
  106. package/locales/pt-BR/models.json +15 -6
  107. package/locales/pt-BR/oauth.json +1 -0
  108. package/locales/ru-RU/labs.json +4 -0
  109. package/locales/ru-RU/models.json +15 -6
  110. package/locales/ru-RU/oauth.json +1 -0
  111. package/locales/tr-TR/labs.json +4 -0
  112. package/locales/tr-TR/models.json +15 -6
  113. package/locales/tr-TR/oauth.json +1 -0
  114. package/locales/vi-VN/labs.json +4 -0
  115. package/locales/vi-VN/models.json +15 -6
  116. package/locales/vi-VN/oauth.json +1 -0
  117. package/locales/zh-CN/labs.json +4 -0
  118. package/locales/zh-CN/models.json +15 -6
  119. package/locales/zh-CN/oauth.json +1 -0
  120. package/locales/zh-TW/labs.json +4 -0
  121. package/locales/zh-TW/models.json +15 -6
  122. package/locales/zh-TW/oauth.json +1 -0
  123. package/next.config.ts +2 -3
  124. package/package.json +74 -80
  125. package/packages/const/src/index.ts +0 -1
  126. package/packages/const/src/url.ts +1 -4
  127. package/packages/const/src/user.ts +5 -2
  128. package/packages/const/src/version.ts +3 -3
  129. package/packages/context-engine/src/index.ts +1 -6
  130. package/packages/context-engine/src/processors/GroupMessageFlatten.ts +12 -2
  131. package/packages/context-engine/src/processors/__tests__/GroupMessageFlatten.test.ts +73 -9
  132. package/packages/context-engine/src/providers/index.ts +0 -2
  133. package/packages/database/migrations/0041_improve_index.sql +10 -0
  134. package/packages/database/migrations/0042_improve_agent_index.sql +1 -0
  135. package/packages/database/migrations/0043_add_ai_model_settings.sql +1 -0
  136. package/packages/database/migrations/meta/0041_snapshot.json +7784 -0
  137. package/packages/database/migrations/meta/0042_snapshot.json +7800 -0
  138. package/packages/database/migrations/meta/0043_snapshot.json +8419 -0
  139. package/packages/database/migrations/meta/_journal.json +21 -0
  140. package/packages/database/package.json +2 -2
  141. package/packages/database/src/core/migrations.json +33 -0
  142. package/packages/database/src/core/web-server.ts +2 -1
  143. package/packages/database/src/models/__tests__/message.grouping.test.ts +812 -0
  144. package/packages/database/src/models/__tests__/message.test.ts +256 -233
  145. package/packages/database/src/models/agent.ts +16 -13
  146. package/packages/database/src/models/message.ts +90 -74
  147. package/packages/database/src/models/session.ts +80 -28
  148. package/packages/database/src/models/user.ts +2 -1
  149. package/packages/database/src/repositories/aiInfra/index.test.ts +198 -0
  150. package/packages/database/src/repositories/aiInfra/index.ts +2 -1
  151. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  152. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  153. package/packages/database/src/schemas/agent.ts +13 -11
  154. package/packages/database/src/schemas/aiInfra.ts +2 -0
  155. package/packages/database/src/schemas/message.ts +5 -1
  156. package/packages/database/src/schemas/relations.ts +6 -4
  157. package/packages/database/src/schemas/session.ts +2 -0
  158. package/packages/database/src/schemas/topic.ts +6 -1
  159. package/packages/database/src/utils/__tests__/groupMessages.test.ts +145 -2
  160. package/packages/database/src/utils/groupMessages.ts +7 -5
  161. package/packages/electron-client-ipc/package.json +4 -1
  162. package/packages/file-loaders/package.json +1 -0
  163. package/packages/memory-extract/package.json +2 -2
  164. package/packages/model-bank/src/aiModels/anthropic.ts +0 -63
  165. package/packages/model-bank/src/aiModels/higress.ts +0 -55
  166. package/packages/model-bank/src/aiModels/infiniai.ts +21 -0
  167. package/packages/model-bank/src/aiModels/ollamacloud.ts +13 -0
  168. package/packages/model-bank/src/aiModels/siliconcloud.ts +19 -0
  169. package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +0 -38
  170. package/packages/model-runtime/src/providers/minimax/index.ts +5 -5
  171. package/packages/model-runtime/src/providers/search1api/index.test.ts +2 -2
  172. package/packages/model-runtime/src/utils/googleErrorParser.test.ts +125 -0
  173. package/packages/model-runtime/src/utils/googleErrorParser.ts +103 -77
  174. package/packages/types/src/discover/mcp.ts +6 -0
  175. package/packages/types/src/index.ts +0 -1
  176. package/packages/types/src/message/common/base.ts +13 -0
  177. package/packages/types/src/message/common/image.ts +8 -0
  178. package/packages/types/src/message/common/metadata.ts +39 -0
  179. package/packages/types/src/message/common/tools.ts +10 -0
  180. package/packages/types/src/message/db/params.ts +47 -1
  181. package/packages/types/src/message/ui/chat.ts +4 -1
  182. package/packages/types/src/message/ui/params.ts +49 -4
  183. package/packages/types/src/plugins/mcp.ts +4 -1
  184. package/packages/types/src/search.ts +16 -0
  185. package/packages/types/src/serverConfig.ts +2 -6
  186. package/packages/types/src/topic/topic.ts +14 -0
  187. package/packages/types/src/user/index.ts +2 -76
  188. package/packages/types/src/user/preference.ts +105 -0
  189. package/packages/types/src/user/settings/index.ts +22 -0
  190. package/packages/utils/src/apiKey.test.ts +139 -0
  191. package/packages/utils/src/client/clipboard.ts +2 -2
  192. package/packages/utils/src/client/exportFile.ts +10 -10
  193. package/packages/utils/src/client/parserPlaceholder.ts +18 -18
  194. package/packages/utils/src/client/topic.ts +10 -10
  195. package/packages/utils/src/client/xor-obfuscation.ts +11 -11
  196. package/packages/utils/src/server/auth.ts +6 -6
  197. package/packages/utils/src/server/geo.ts +9 -9
  198. package/packages/utils/src/server/xor.ts +7 -7
  199. package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
  200. package/packages/web-crawler/tsconfig.json +0 -1
  201. package/renovate.json +23 -1
  202. package/scripts/migrateServerDB/errorHint.js +1 -7
  203. package/scripts/migrateServerDB/index.ts +2 -1
  204. package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
  205. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
  206. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  207. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
  208. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  209. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
  210. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
  211. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
  212. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
  213. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  214. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
  215. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  216. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  217. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  218. package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
  219. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
  220. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
  221. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
  222. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
  223. package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
  224. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
  225. package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
  226. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  227. package/src/app/[variants]/(main)/labs/components/LabCard.tsx +8 -6
  228. package/src/app/[variants]/(main)/labs/page.tsx +19 -22
  229. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  230. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  231. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  232. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  233. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  234. package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +6 -8
  235. package/src/app/[variants]/(main)/settings/provider/detail/azureai/index.tsx +1 -1
  236. package/src/app/[variants]/(main)/settings/provider/detail/bedrock/index.tsx +1 -1
  237. package/src/app/[variants]/(main)/settings/provider/detail/cloudflare/index.tsx +1 -1
  238. package/src/app/[variants]/(main)/settings/provider/detail/comfyui/index.tsx +1 -1
  239. package/src/app/[variants]/(main)/settings/provider/detail/github/index.tsx +1 -1
  240. package/src/app/[variants]/(main)/settings/provider/detail/vertexai/index.tsx +1 -1
  241. package/src/app/[variants]/(main)/settings/provider/features/ProviderConfig/index.tsx +2 -4
  242. package/src/app/[variants]/layout.tsx +1 -0
  243. package/src/app/[variants]/loading/index.tsx +1 -10
  244. package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
  245. package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
  246. package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
  247. package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
  248. package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
  249. package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
  250. package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +19 -2
  251. package/src/app/sitemap.tsx +7 -1
  252. package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
  253. package/src/components/Link.tsx +12 -0
  254. package/src/components/Skeleton/SkeletonSwitch.tsx +13 -0
  255. package/src/components/Skeleton/index.ts +2 -0
  256. package/src/components/Thinking/index.tsx +4 -3
  257. package/src/config/db.ts +0 -5
  258. package/src/config/featureFlags/schema.test.ts +0 -2
  259. package/src/config/featureFlags/schema.ts +0 -6
  260. package/src/config/modelProviders/ai21.ts +1 -16
  261. package/src/config/modelProviders/ai302.ts +1 -128
  262. package/src/config/modelProviders/ai360.ts +1 -32
  263. package/src/config/modelProviders/anthropic.ts +1 -94
  264. package/src/config/modelProviders/azure.ts +1 -51
  265. package/src/config/modelProviders/baichuan.ts +1 -57
  266. package/src/config/modelProviders/bedrock.ts +1 -276
  267. package/src/config/modelProviders/cloudflare.ts +1 -64
  268. package/src/config/modelProviders/deepseek.ts +1 -19
  269. package/src/config/modelProviders/fireworksai.ts +1 -174
  270. package/src/config/modelProviders/giteeai.ts +1 -135
  271. package/src/config/modelProviders/github.ts +1 -254
  272. package/src/config/modelProviders/google.ts +1 -130
  273. package/src/config/modelProviders/groq.ts +1 -119
  274. package/src/config/modelProviders/higress.ts +1 -1736
  275. package/src/config/modelProviders/huggingface.ts +1 -54
  276. package/src/config/modelProviders/hunyuan.ts +1 -83
  277. package/src/config/modelProviders/infiniai.ts +1 -74
  278. package/src/config/modelProviders/internlm.ts +1 -20
  279. package/src/config/modelProviders/minimax.ts +1 -1
  280. package/src/config/modelProviders/mistral.ts +1 -95
  281. package/src/config/modelProviders/modelscope.ts +1 -27
  282. package/src/config/modelProviders/moonshot.ts +1 -29
  283. package/src/config/modelProviders/novita.ts +1 -105
  284. package/src/config/modelProviders/ollama.ts +1 -325
  285. package/src/config/modelProviders/openai.ts +1 -242
  286. package/src/config/modelProviders/openrouter.ts +1 -240
  287. package/src/config/modelProviders/perplexity.ts +1 -45
  288. package/src/config/modelProviders/ppio.ts +1 -152
  289. package/src/config/modelProviders/qiniu.ts +2 -19
  290. package/src/config/modelProviders/qwen.ts +1 -245
  291. package/src/config/modelProviders/search1api.ts +1 -34
  292. package/src/config/modelProviders/sensenova.ts +1 -69
  293. package/src/config/modelProviders/siliconcloud.ts +1 -417
  294. package/src/config/modelProviders/spark.ts +1 -59
  295. package/src/config/modelProviders/stepfun.ts +1 -98
  296. package/src/config/modelProviders/taichu.ts +1 -18
  297. package/src/config/modelProviders/togetherai.ts +1 -274
  298. package/src/config/modelProviders/upstage.ts +1 -28
  299. package/src/config/modelProviders/wenxin.ts +1 -140
  300. package/src/config/modelProviders/xai.ts +1 -38
  301. package/src/config/modelProviders/zeroone.ts +1 -81
  302. package/src/config/modelProviders/zhipu.ts +1 -108
  303. package/src/envs/app.ts +5 -8
  304. package/src/envs/auth.ts +0 -179
  305. package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
  306. package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
  307. package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
  308. package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
  309. package/src/features/ChatInput/ActionBar/index.tsx +2 -2
  310. package/src/features/ChatInput/InputEditor/index.tsx +2 -2
  311. package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
  312. package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
  313. package/src/features/Conversation/Error/index.tsx +15 -5
  314. package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
  315. package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
  316. package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
  317. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
  318. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
  319. package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
  320. package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
  321. package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
  322. package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
  323. package/src/features/Conversation/Messages/Default.tsx +2 -2
  324. package/src/features/Conversation/Messages/Group/Actions/WithContentId.tsx +152 -0
  325. package/src/features/Conversation/Messages/Group/Actions/WithoutContentId.tsx +70 -0
  326. package/src/features/Conversation/Messages/Group/Actions/index.tsx +21 -0
  327. package/src/features/Conversation/Messages/Group/ContentBlock.tsx +91 -0
  328. package/src/features/Conversation/Messages/Group/EditState.tsx +51 -0
  329. package/src/features/Conversation/Messages/Group/Error/index.tsx +53 -0
  330. package/src/features/Conversation/Messages/Group/GroupChildren.tsx +73 -0
  331. package/src/features/Conversation/Messages/Group/MessageContent.tsx +39 -0
  332. package/src/features/Conversation/Messages/Group/Tool/Inspector/BuiltinPluginTitle.tsx +49 -0
  333. package/src/features/Conversation/Messages/Group/Tool/Inspector/Debug.tsx +70 -0
  334. package/src/features/Conversation/Messages/Group/Tool/Inspector/PluginResult.tsx +34 -0
  335. package/src/features/Conversation/Messages/Group/Tool/Inspector/PluginState.tsx +18 -0
  336. package/src/features/Conversation/Messages/Group/Tool/Inspector/Settings.tsx +40 -0
  337. package/src/features/Conversation/Messages/Group/Tool/Inspector/ToolTitle.tsx +92 -0
  338. package/src/features/Conversation/Messages/Group/Tool/Inspector/index.tsx +176 -0
  339. package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/ObjectEntity.tsx +81 -0
  340. package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/ValueCell.tsx +43 -0
  341. package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/index.tsx +134 -0
  342. package/src/features/Conversation/Messages/Group/Tool/Render/CustomRender.tsx +88 -0
  343. package/src/features/Conversation/Messages/Group/Tool/Render/ErrorResponse.tsx +35 -0
  344. package/src/features/Conversation/Messages/Group/Tool/Render/LoadingPlaceholder/index.tsx +29 -0
  345. package/src/features/Conversation/Messages/Group/Tool/Render/PluginSettings.tsx +66 -0
  346. package/src/features/Conversation/Messages/Group/Tool/Render/index.tsx +105 -0
  347. package/src/features/Conversation/Messages/Group/Tool/index.tsx +75 -0
  348. package/src/features/Conversation/Messages/Group/Tools.tsx +46 -0
  349. package/src/features/Conversation/Messages/Group/index.tsx +140 -0
  350. package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
  351. package/src/features/Conversation/Messages/User/index.tsx +4 -4
  352. package/src/features/Conversation/Messages/index.tsx +15 -3
  353. package/src/features/Conversation/components/AutoScroll.tsx +2 -2
  354. package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
  355. package/src/features/Conversation/components/ShareMessageModal/ShareImage/Preview.tsx +2 -2
  356. package/src/features/DataImporter/index.tsx +15 -60
  357. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  358. package/src/features/MCP/utils.test.ts +91 -0
  359. package/src/features/MCP/utils.ts +20 -2
  360. package/src/features/PluginStore/Content.tsx +2 -3
  361. package/src/features/PluginStore/McpList/index.tsx +6 -2
  362. package/src/features/PluginTag/index.tsx +1 -3
  363. package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
  364. package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
  365. package/src/helpers/isCanUseFC.ts +0 -8
  366. package/src/hooks/useEnabledChatModels.ts +0 -8
  367. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  368. package/src/hooks/useModelContextWindowTokens.ts +0 -8
  369. package/src/hooks/useModelHasContextWindowToken.ts +1 -10
  370. package/src/hooks/useModelSupportFiles.ts +1 -11
  371. package/src/hooks/useModelSupportReasoning.ts +1 -11
  372. package/src/hooks/useModelSupportToolUse.ts +1 -11
  373. package/src/hooks/useModelSupportVision.ts +1 -11
  374. package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
  375. package/src/libs/next-auth/auth.config.ts +3 -6
  376. package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
  377. package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
  378. package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
  379. package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
  380. package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
  381. package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
  382. package/src/libs/next-auth/sso-providers/github.ts +0 -6
  383. package/src/libs/next-auth/sso-providers/google.ts +0 -2
  384. package/src/libs/next-auth/sso-providers/index.ts +0 -2
  385. package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
  386. package/src/libs/next-auth/sso-providers/logto.ts +3 -5
  387. package/src/libs/next-auth/sso-providers/okta.ts +0 -4
  388. package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
  389. package/src/libs/oidc-provider/provider.ts +1 -1
  390. package/src/libs/trpc/client/index.ts +0 -1
  391. package/src/libs/trpc/client/lambda.ts +8 -5
  392. package/src/libs/trpc/lambda/context.ts +4 -1
  393. package/src/locales/default/labs.ts +4 -0
  394. package/src/locales/default/oauth.ts +1 -0
  395. package/src/server/globalConfig/index.ts +0 -23
  396. package/src/server/modules/AssistantStore/index.ts +1 -1
  397. package/src/server/modules/ModelRuntime/trace.ts +11 -4
  398. package/src/server/routers/desktop/mcp.ts +1 -3
  399. package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +810 -70
  400. package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
  401. package/src/server/routers/lambda/config/index.test.ts +38 -30
  402. package/src/server/routers/lambda/market/index.ts +4 -2
  403. package/src/server/routers/lambda/message.ts +60 -52
  404. package/src/server/routers/lambda/session.ts +8 -5
  405. package/src/server/routers/lambda/topic.ts +7 -1
  406. package/src/server/routers/lambda/user.ts +32 -31
  407. package/src/server/routers/tools/mcp.ts +2 -3
  408. package/src/server/routers/tools/search.test.ts +1 -7
  409. package/src/server/routers/tools/search.ts +1 -4
  410. package/src/server/services/mcp/deps/MCPSystemDepsCheckService.test.ts +541 -0
  411. package/src/server/services/message/__tests__/index.test.ts +348 -0
  412. package/src/server/services/message/index.ts +159 -0
  413. package/src/server/services/search/impls/firecrawl/index.ts +51 -11
  414. package/src/server/services/search/impls/firecrawl/type.ts +60 -9
  415. package/src/services/__tests__/tool.test.ts +0 -3
  416. package/src/services/aiModel/index.test.ts +3 -6
  417. package/src/services/aiModel/index.ts +55 -7
  418. package/src/services/aiProvider/index.test.ts +2 -5
  419. package/src/services/aiProvider/index.ts +47 -7
  420. package/src/services/chat/chat.test.ts +13 -40
  421. package/src/services/chat/contextEngineering.test.ts +0 -30
  422. package/src/services/chat/contextEngineering.ts +7 -17
  423. package/src/services/chat/helper.ts +7 -31
  424. package/src/services/chat/index.ts +5 -10
  425. package/src/services/chat/types.ts +1 -1
  426. package/src/services/chatGroup/index.ts +64 -9
  427. package/src/services/config.ts +1 -65
  428. package/src/services/export/index.ts +9 -4
  429. package/src/services/file/index.ts +59 -10
  430. package/src/services/import/index.ts +132 -7
  431. package/src/services/mcp.test.ts +777 -0
  432. package/src/services/mcp.ts +40 -6
  433. package/src/services/message/index.ts +203 -10
  434. package/src/services/message/{__tests__/server.test.ts → server.test.ts} +3 -3
  435. package/src/services/models.ts +2 -11
  436. package/src/services/plugin/index.test.ts +8 -0
  437. package/src/services/plugin/index.ts +51 -10
  438. package/src/services/session/index.test.ts +8 -0
  439. package/src/services/session/index.ts +143 -10
  440. package/src/services/tableViewer/client.ts +12 -15
  441. package/src/services/thread/index.test.ts +8 -0
  442. package/src/services/thread/index.ts +37 -7
  443. package/src/services/topic/index.test.ts +8 -0
  444. package/src/services/topic/index.ts +74 -10
  445. package/src/services/user/index.test.ts +8 -0
  446. package/src/services/user/index.ts +50 -11
  447. package/src/store/aiInfra/slices/aiModel/action.test.ts +17 -9
  448. package/src/store/chat/helpers.test.ts +99 -0
  449. package/src/store/chat/helpers.ts +21 -2
  450. package/src/store/chat/selectors.ts +1 -1
  451. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +17 -251
  452. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +339 -7
  453. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +9 -5
  454. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +49 -178
  455. package/src/store/chat/slices/aiChat/actions/generateAIChatV2.ts +272 -14
  456. package/src/store/chat/slices/aiChat/actions/generateAIGroupChat.ts +7 -2
  457. package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
  458. package/src/store/chat/slices/builtinTool/actions/search.ts +3 -3
  459. package/src/store/chat/slices/message/action.test.ts +157 -16
  460. package/src/store/chat/slices/message/action.ts +153 -77
  461. package/src/store/chat/slices/message/reducer.test.ts +363 -5
  462. package/src/store/chat/slices/message/reducer.ts +87 -3
  463. package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
  464. package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
  465. package/src/store/chat/slices/message/selectors/index.ts +2 -0
  466. package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
  467. package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
  468. package/src/store/chat/slices/plugin/action.test.ts +118 -157
  469. package/src/store/chat/slices/plugin/action.ts +53 -68
  470. package/src/store/chat/slices/thread/action.test.ts +13 -4
  471. package/src/store/chat/slices/thread/action.ts +3 -1
  472. package/src/store/chat/slices/topic/action.test.ts +1 -1
  473. package/src/store/chat/slices/topic/action.ts +1 -2
  474. package/src/store/chat/slices/topic/reducer.ts +1 -2
  475. package/src/store/file/slices/chat/action.ts +1 -4
  476. package/src/store/file/slices/fileManager/action.ts +2 -3
  477. package/src/store/global/store.ts +1 -7
  478. package/src/store/session/slices/sessionGroup/action.test.ts +5 -5
  479. package/src/store/tool/selectors/tool.test.ts +1 -1
  480. package/src/store/tool/selectors/tool.ts +6 -8
  481. package/src/store/tool/slices/builtin/action.test.ts +83 -35
  482. package/src/store/tool/slices/builtin/action.ts +0 -9
  483. package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
  484. package/src/store/tool/slices/builtin/selectors.ts +15 -21
  485. package/src/store/tool/slices/mcpStore/action.test.ts +95 -3
  486. package/src/store/tool/slices/mcpStore/action.ts +177 -53
  487. package/src/store/tool/slices/oldStore/initialState.ts +1 -2
  488. package/src/store/user/initialState.ts +1 -7
  489. package/src/store/user/selectors.ts +1 -5
  490. package/src/store/user/slices/common/action.test.ts +1 -4
  491. package/src/store/user/slices/common/action.ts +5 -4
  492. package/src/store/user/slices/preference/action.ts +8 -1
  493. package/src/store/user/slices/preference/selectors/index.ts +2 -0
  494. package/src/store/user/slices/preference/selectors/labPrefer.ts +13 -0
  495. package/src/store/user/slices/preference/{selectors.ts → selectors/preference.ts} +0 -2
  496. package/src/store/user/slices/settings/selectors/index.ts +1 -0
  497. package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
  498. package/src/store/user/store.ts +0 -3
  499. package/src/tools/index.ts +0 -6
  500. package/src/tools/renders.ts +0 -3
  501. package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
  502. package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
  503. package/tsconfig.json +9 -3
  504. package/packages/const/src/guide.ts +0 -89
  505. package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
  506. package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
  507. package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
  508. package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
  509. package/packages/utils/src/_deprecated/parseModels.ts +0 -165
  510. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  511. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  512. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  513. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  514. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  515. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  516. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  517. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  518. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  519. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  520. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  521. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  522. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  523. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  524. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  525. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  526. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  527. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  528. package/src/components/InnerLink.tsx +0 -20
  529. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  530. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  531. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  532. package/src/database/_deprecated/core/db.ts +0 -246
  533. package/src/database/_deprecated/core/index.ts +0 -2
  534. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  535. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  536. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  537. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  538. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  539. package/src/database/_deprecated/core/model.ts +0 -218
  540. package/src/database/_deprecated/core/schemas.ts +0 -88
  541. package/src/database/_deprecated/core/types/db.ts +0 -15
  542. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  543. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  544. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  545. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  546. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  547. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  548. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  549. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  550. package/src/database/_deprecated/models/file.ts +0 -51
  551. package/src/database/_deprecated/models/message.ts +0 -277
  552. package/src/database/_deprecated/models/plugin.ts +0 -62
  553. package/src/database/_deprecated/models/session.ts +0 -271
  554. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  555. package/src/database/_deprecated/models/topic.ts +0 -250
  556. package/src/database/_deprecated/models/user.ts +0 -69
  557. package/src/database/_deprecated/schemas/files.ts +0 -39
  558. package/src/database/_deprecated/schemas/message.ts +0 -50
  559. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  560. package/src/database/_deprecated/schemas/session.ts +0 -54
  561. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  562. package/src/database/_deprecated/schemas/topic.ts +0 -12
  563. package/src/database/_deprecated/schemas/user.ts +0 -40
  564. package/src/envs/__tests__/auth.test.ts +0 -200
  565. package/src/features/DataImporter/_deprecated.ts +0 -43
  566. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  567. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  568. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  569. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  570. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  571. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  572. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  573. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  574. package/src/features/InitClientDB/index.tsx +0 -37
  575. package/src/hooks/_header.ts +0 -23
  576. package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
  577. package/src/libs/trpc/client/edge.ts +0 -26
  578. package/src/libs/trpc/edge/context.ts +0 -71
  579. package/src/libs/trpc/edge/index.ts +0 -45
  580. package/src/libs/trpc/edge/init.ts +0 -26
  581. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  582. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  583. package/src/migrations/FromV0ToV1.ts +0 -10
  584. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  585. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  586. package/src/migrations/FromV1ToV2/index.ts +0 -82
  587. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  588. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  589. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  590. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  591. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  592. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  593. package/src/migrations/FromV2ToV3/index.ts +0 -30
  594. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  595. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  596. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  597. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  598. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  599. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  600. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  601. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  602. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  603. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  604. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  605. package/src/migrations/FromV3ToV4/index.ts +0 -102
  606. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  607. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  608. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  609. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  610. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  611. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  612. package/src/migrations/FromV4ToV5/index.ts +0 -58
  613. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  614. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  615. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  616. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  617. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  618. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  619. package/src/migrations/FromV5ToV6/index.ts +0 -61
  620. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  621. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  622. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  623. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  624. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  625. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  626. package/src/migrations/FromV6ToV7/index.ts +0 -101
  627. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  628. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  629. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  630. package/src/migrations/VersionController.test.ts +0 -88
  631. package/src/migrations/VersionController.ts +0 -67
  632. package/src/migrations/index.ts +0 -61
  633. package/src/server/globalConfig/_deprecated.test.ts +0 -92
  634. package/src/server/globalConfig/_deprecated.ts +0 -41
  635. package/src/server/routers/edge/appStatus.ts +0 -3
  636. package/src/server/routers/edge/index.ts +0 -14
  637. package/src/server/routers/edge/upload.ts +0 -16
  638. package/src/services/aiModel/client.ts +0 -70
  639. package/src/services/aiModel/server.test.ts +0 -122
  640. package/src/services/aiModel/server.ts +0 -51
  641. package/src/services/aiModel/type.ts +0 -32
  642. package/src/services/aiProvider/client.ts +0 -58
  643. package/src/services/aiProvider/server.ts +0 -43
  644. package/src/services/aiProvider/type.ts +0 -27
  645. package/src/services/baseClientService/index.ts +0 -9
  646. package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
  647. package/src/services/chatGroup/client.ts +0 -63
  648. package/src/services/chatGroup/server.ts +0 -67
  649. package/src/services/chatGroup/type.ts +0 -22
  650. package/src/services/export/_deprecated.ts +0 -155
  651. package/src/services/export/client.ts +0 -15
  652. package/src/services/export/server.ts +0 -9
  653. package/src/services/export/type.ts +0 -5
  654. package/src/services/file/_deprecated.test.ts +0 -119
  655. package/src/services/file/_deprecated.ts +0 -80
  656. package/src/services/file/client.test.ts +0 -199
  657. package/src/services/file/client.ts +0 -85
  658. package/src/services/file/server.ts +0 -53
  659. package/src/services/file/type.ts +0 -13
  660. package/src/services/import/_deprecated.ts +0 -115
  661. package/src/services/import/client.test.ts +0 -1015
  662. package/src/services/import/client.ts +0 -64
  663. package/src/services/import/server.ts +0 -133
  664. package/src/services/import/type.ts +0 -17
  665. package/src/services/message/_deprecated.test.ts +0 -398
  666. package/src/services/message/_deprecated.ts +0 -168
  667. package/src/services/message/client.test.ts +0 -410
  668. package/src/services/message/client.ts +0 -186
  669. package/src/services/message/server.ts +0 -150
  670. package/src/services/message/type.ts +0 -54
  671. package/src/services/plugin/_deprecated.test.ts +0 -162
  672. package/src/services/plugin/_deprecated.ts +0 -42
  673. package/src/services/plugin/client.test.ts +0 -177
  674. package/src/services/plugin/client.ts +0 -46
  675. package/src/services/plugin/server.ts +0 -42
  676. package/src/services/plugin/type.ts +0 -23
  677. package/src/services/session/_deprecated.test.ts +0 -440
  678. package/src/services/session/_deprecated.ts +0 -190
  679. package/src/services/session/client.test.ts +0 -413
  680. package/src/services/session/client.ts +0 -193
  681. package/src/services/session/server.test.ts +0 -260
  682. package/src/services/session/server.ts +0 -125
  683. package/src/services/session/type.ts +0 -82
  684. package/src/services/thread/client.ts +0 -51
  685. package/src/services/thread/server.ts +0 -32
  686. package/src/services/thread/type.ts +0 -21
  687. package/src/services/topic/_deprecated.test.ts +0 -245
  688. package/src/services/topic/_deprecated.ts +0 -75
  689. package/src/services/topic/client.ts +0 -89
  690. package/src/services/topic/pglite.test.ts +0 -212
  691. package/src/services/topic/server.ts +0 -57
  692. package/src/services/topic/type.ts +0 -40
  693. package/src/services/user/_deprecated.test.ts +0 -101
  694. package/src/services/user/_deprecated.ts +0 -70
  695. package/src/services/user/client.test.ts +0 -108
  696. package/src/services/user/client.ts +0 -104
  697. package/src/services/user/server.test.ts +0 -149
  698. package/src/services/user/server.ts +0 -47
  699. package/src/services/user/type.ts +0 -21
  700. package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
  701. package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
  702. package/src/store/global/actions/clientDb.ts +0 -67
  703. package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
  704. package/src/store/user/slices/modelList/action.test.ts +0 -359
  705. package/src/store/user/slices/modelList/action.ts +0 -223
  706. package/src/store/user/slices/modelList/initialState.ts +0 -15
  707. package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
  708. package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
  709. package/src/store/user/slices/modelList/selectors/index.ts +0 -3
  710. package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
  711. package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
  712. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
  713. package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
  714. package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
  715. package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
  716. package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
  717. package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
  718. package/src/tools/dalle/Render/Item/Error.tsx +0 -49
  719. package/src/tools/dalle/Render/Item/Image.tsx +0 -44
  720. package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
  721. package/src/tools/dalle/Render/Item/index.tsx +0 -88
  722. package/src/tools/dalle/Render/ToolBar.tsx +0 -56
  723. package/src/tools/dalle/Render/index.tsx +0 -52
  724. package/src/tools/dalle/index.ts +0 -92
  725. /package/src/{app/[variants]/(main)/settings/provider/features/ProviderConfig → components/Skeleton}/SkeletonInput.tsx +0 -0
  726. /package/src/{middleware.ts → proxy.ts} +0 -0
@@ -0,0 +1,348 @@
1
+ import { LobeChatDatabase } from '@lobechat/database';
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
3
+
4
+ import { MessageModel } from '@/database/models/message';
5
+ import { FileService } from '@/server/services/file';
6
+
7
+ import { MessageService } from '../index';
8
+
9
+ vi.mock('@/database/models/message');
10
+ vi.mock('@/server/services/file');
11
+
12
+ describe('MessageService', () => {
13
+ let messageService: MessageService;
14
+ let mockDB: LobeChatDatabase;
15
+ let mockMessageModel: MessageModel;
16
+ let mockFileService: FileService;
17
+ const userId = 'test-user-id';
18
+
19
+ beforeEach(() => {
20
+ mockDB = {} as LobeChatDatabase;
21
+ mockMessageModel = {
22
+ create: vi.fn(),
23
+ deleteMessage: vi.fn(),
24
+ deleteMessages: vi.fn(),
25
+ query: vi.fn(),
26
+ update: vi.fn(),
27
+ updateMessagePlugin: vi.fn(),
28
+ updateMessageRAG: vi.fn(),
29
+ updatePluginState: vi.fn(),
30
+ } as any;
31
+
32
+ mockFileService = {
33
+ getFullFileUrl: vi.fn().mockImplementation((path) => Promise.resolve(`/files${path}`)),
34
+ } as any;
35
+
36
+ // Mock constructors
37
+ vi.mocked(MessageModel).mockImplementation(() => mockMessageModel);
38
+ vi.mocked(FileService).mockImplementation(() => mockFileService);
39
+
40
+ messageService = new MessageService(mockDB, userId);
41
+ });
42
+
43
+ describe('removeMessage', () => {
44
+ it('should delete message and return { success: true } when no sessionId/topicId provided', async () => {
45
+ const messageId = 'msg-1';
46
+
47
+ const result = await messageService.removeMessage(messageId);
48
+
49
+ expect(mockMessageModel.deleteMessage).toHaveBeenCalledWith(messageId);
50
+ expect(result).toEqual({ success: true });
51
+ expect(mockMessageModel.query).not.toHaveBeenCalled();
52
+ });
53
+
54
+ it('should delete message and return message list when sessionId provided', async () => {
55
+ const messageId = 'msg-1';
56
+ const mockMessages = [{ id: 'msg-2', content: 'test' }];
57
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
58
+
59
+ const result = await messageService.removeMessage(messageId, { sessionId: 'session-1' });
60
+
61
+ expect(mockMessageModel.deleteMessage).toHaveBeenCalledWith(messageId);
62
+ expect(mockMessageModel.query).toHaveBeenCalledWith(
63
+ { groupId: undefined, sessionId: 'session-1', topicId: undefined },
64
+ expect.objectContaining({
65
+ groupAssistantMessages: false,
66
+ }),
67
+ );
68
+ expect(result).toEqual({ messages: mockMessages, success: true });
69
+ });
70
+
71
+ it('should delete message and return message list when topicId provided', async () => {
72
+ const messageId = 'msg-1';
73
+ const mockMessages = [{ id: 'msg-2', content: 'test' }];
74
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
75
+
76
+ const result = await messageService.removeMessage(messageId, { topicId: 'topic-1' });
77
+
78
+ expect(mockMessageModel.deleteMessage).toHaveBeenCalledWith(messageId);
79
+ expect(mockMessageModel.query).toHaveBeenCalledWith(
80
+ { groupId: undefined, sessionId: undefined, topicId: 'topic-1' },
81
+ expect.objectContaining({
82
+ groupAssistantMessages: false,
83
+ }),
84
+ );
85
+ expect(result).toEqual({ messages: mockMessages, success: true });
86
+ });
87
+ });
88
+
89
+ describe('removeMessages', () => {
90
+ it('should delete messages and return { success: true } when no sessionId/topicId provided', async () => {
91
+ const messageIds = ['msg-1', 'msg-2'];
92
+
93
+ const result = await messageService.removeMessages(messageIds);
94
+
95
+ expect(mockMessageModel.deleteMessages).toHaveBeenCalledWith(messageIds);
96
+ expect(result).toEqual({ success: true });
97
+ expect(mockMessageModel.query).not.toHaveBeenCalled();
98
+ });
99
+
100
+ it('should delete messages and return message list when sessionId provided', async () => {
101
+ const messageIds = ['msg-1', 'msg-2'];
102
+ const mockMessages = [{ id: 'msg-3', content: 'test' }];
103
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
104
+
105
+ const result = await messageService.removeMessages(messageIds, { sessionId: 'session-1' });
106
+
107
+ expect(mockMessageModel.deleteMessages).toHaveBeenCalledWith(messageIds);
108
+ expect(mockMessageModel.query).toHaveBeenCalled();
109
+ expect(result).toEqual({ messages: mockMessages, success: true });
110
+ });
111
+ });
112
+
113
+ describe('updateMessageRAG', () => {
114
+ it('should update RAG and return { success: true } when no sessionId/topicId provided', async () => {
115
+ const messageId = 'msg-1';
116
+ const ragValue = { fileChunks: [{ id: 'chunk-1', similarity: 0.95 }] };
117
+
118
+ const result = await messageService.updateMessageRAG(messageId, ragValue);
119
+
120
+ expect(mockMessageModel.updateMessageRAG).toHaveBeenCalledWith(messageId, ragValue);
121
+ expect(result).toEqual({ success: true });
122
+ expect(mockMessageModel.query).not.toHaveBeenCalled();
123
+ });
124
+
125
+ it('should update RAG and return message list when sessionId provided', async () => {
126
+ const messageId = 'msg-1';
127
+ const ragValue = { fileChunks: [{ id: 'chunk-1', similarity: 0.95 }] };
128
+ const mockMessages = [{ id: 'msg-1', content: 'test' }];
129
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
130
+
131
+ const result = await messageService.updateMessageRAG(messageId, ragValue, {
132
+ sessionId: 'session-1',
133
+ });
134
+
135
+ expect(mockMessageModel.updateMessageRAG).toHaveBeenCalledWith(messageId, ragValue);
136
+ expect(mockMessageModel.query).toHaveBeenCalled();
137
+ expect(result).toEqual({ messages: mockMessages, success: true });
138
+ });
139
+ });
140
+
141
+ describe('updatePluginError', () => {
142
+ it('should update plugin error and return { success: true } when no sessionId/topicId provided', async () => {
143
+ const messageId = 'msg-1';
144
+ const error = { type: 'TestError', message: 'Test error message' };
145
+
146
+ const result = await messageService.updatePluginError(messageId, error);
147
+
148
+ expect(mockMessageModel.updateMessagePlugin).toHaveBeenCalledWith(messageId, { error });
149
+ expect(result).toEqual({ success: true });
150
+ expect(mockMessageModel.query).not.toHaveBeenCalled();
151
+ });
152
+
153
+ it('should update plugin error and return message list when sessionId provided', async () => {
154
+ const messageId = 'msg-1';
155
+ const error = { type: 'TestError', message: 'Test error message' };
156
+ const mockMessages = [{ id: 'msg-1', content: 'test' }];
157
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
158
+
159
+ const result = await messageService.updatePluginError(messageId, error, {
160
+ sessionId: 'session-1',
161
+ });
162
+
163
+ expect(mockMessageModel.updateMessagePlugin).toHaveBeenCalledWith(messageId, { error });
164
+ expect(mockMessageModel.query).toHaveBeenCalled();
165
+ expect(result).toEqual({ messages: mockMessages, success: true });
166
+ });
167
+ });
168
+
169
+ describe('updatePluginState', () => {
170
+ it('should update plugin state and return { success: true } when no sessionId/topicId provided', async () => {
171
+ const messageId = 'msg-1';
172
+ const state = { key: 'value' };
173
+
174
+ const result = await messageService.updatePluginState(messageId, state, {});
175
+
176
+ expect(mockMessageModel.updatePluginState).toHaveBeenCalledWith(messageId, state);
177
+ expect(result).toEqual({ success: true });
178
+ expect(mockMessageModel.query).not.toHaveBeenCalled();
179
+ });
180
+
181
+ it('should update plugin state and return message list when sessionId provided', async () => {
182
+ const messageId = 'msg-1';
183
+ const state = { key: 'value' };
184
+ const mockMessages = [{ id: 'msg-1', content: 'test' }];
185
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
186
+
187
+ const result = await messageService.updatePluginState(messageId, state, {
188
+ sessionId: 'session-1',
189
+ });
190
+
191
+ expect(mockMessageModel.updatePluginState).toHaveBeenCalledWith(messageId, state);
192
+ expect(mockMessageModel.query).toHaveBeenCalled();
193
+ expect(result).toEqual({ messages: mockMessages, success: true });
194
+ });
195
+ });
196
+
197
+ describe('updateMessage', () => {
198
+ it('should update message and return { success: true } when no sessionId/topicId provided', async () => {
199
+ const messageId = 'msg-1';
200
+ const value = { content: 'updated content' };
201
+
202
+ const result = await messageService.updateMessage(messageId, value as any, {});
203
+
204
+ expect(mockMessageModel.update).toHaveBeenCalledWith(messageId, value);
205
+ expect(result).toEqual({ success: true });
206
+ expect(mockMessageModel.query).not.toHaveBeenCalled();
207
+ });
208
+
209
+ it('should update message and return message list when sessionId provided', async () => {
210
+ const messageId = 'msg-1';
211
+ const value = { content: 'updated content' };
212
+ const mockMessages = [{ id: 'msg-1', content: 'updated content' }];
213
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
214
+
215
+ const result = await messageService.updateMessage(messageId, value as any, {
216
+ sessionId: 'session-1',
217
+ });
218
+
219
+ expect(mockMessageModel.update).toHaveBeenCalledWith(messageId, value);
220
+ expect(mockMessageModel.query).toHaveBeenCalled();
221
+ expect(result).toEqual({ messages: mockMessages, success: true });
222
+ });
223
+ });
224
+
225
+ describe('useGroup option', () => {
226
+ it('should pass useGroup option to query', async () => {
227
+ const mockMessages = [{ id: 'msg-1', content: 'test' }];
228
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
229
+
230
+ await messageService.removeMessage('msg-1', {
231
+ sessionId: 'session-1',
232
+ useGroup: true,
233
+ });
234
+
235
+ expect(mockMessageModel.query).toHaveBeenCalledWith(
236
+ expect.anything(),
237
+ expect.objectContaining({
238
+ groupAssistantMessages: true,
239
+ }),
240
+ );
241
+ });
242
+
243
+ it('should default useGroup to false', async () => {
244
+ const mockMessages = [{ id: 'msg-1', content: 'test' }];
245
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
246
+
247
+ await messageService.removeMessage('msg-1', { sessionId: 'session-1' });
248
+
249
+ expect(mockMessageModel.query).toHaveBeenCalledWith(
250
+ expect.anything(),
251
+ expect.objectContaining({
252
+ groupAssistantMessages: false,
253
+ }),
254
+ );
255
+ });
256
+ });
257
+
258
+ describe('createNewMessage', () => {
259
+ it('should create message and return message list', async () => {
260
+ const params = {
261
+ content: 'Hello',
262
+ role: 'user' as const,
263
+ sessionId: 'session-1',
264
+ };
265
+ const createdMessage = { id: 'msg-1', ...params };
266
+ const mockMessages = [createdMessage, { id: 'msg-2', content: 'Hi' }];
267
+
268
+ vi.mocked(mockMessageModel.create).mockResolvedValue(createdMessage as any);
269
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
270
+
271
+ const result = await messageService.createNewMessage(params as any);
272
+
273
+ expect(mockMessageModel.create).toHaveBeenCalledWith(params);
274
+ expect(mockMessageModel.query).toHaveBeenCalledWith(
275
+ {
276
+ current: 0,
277
+ groupId: undefined,
278
+ pageSize: 9999,
279
+ sessionId: 'session-1',
280
+ topicId: undefined,
281
+ },
282
+ expect.objectContaining({
283
+ groupAssistantMessages: false,
284
+ }),
285
+ );
286
+ expect(result).toEqual({
287
+ id: 'msg-1',
288
+ messages: mockMessages,
289
+ });
290
+ });
291
+
292
+ it('should create message with useGroup option', async () => {
293
+ const params = {
294
+ content: 'Hello',
295
+ role: 'assistant' as const,
296
+ sessionId: 'session-1',
297
+ };
298
+ const createdMessage = { id: 'msg-1', ...params };
299
+ const mockMessages = [createdMessage];
300
+
301
+ vi.mocked(mockMessageModel.create).mockResolvedValue(createdMessage as any);
302
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
303
+
304
+ const result = await messageService.createNewMessage(params as any, { useGroup: true });
305
+
306
+ expect(mockMessageModel.query).toHaveBeenCalledWith(
307
+ expect.anything(),
308
+ expect.objectContaining({
309
+ groupAssistantMessages: true,
310
+ }),
311
+ );
312
+ expect(result).toEqual({
313
+ id: 'msg-1',
314
+ messages: mockMessages,
315
+ });
316
+ });
317
+
318
+ it('should create message with topicId and groupId', async () => {
319
+ const params = {
320
+ content: 'Hello',
321
+ groupId: 'group-1',
322
+ role: 'user' as const,
323
+ sessionId: 'session-1',
324
+ topicId: 'topic-1',
325
+ };
326
+ const createdMessage = { id: 'msg-1', ...params };
327
+ const mockMessages = [createdMessage];
328
+
329
+ vi.mocked(mockMessageModel.create).mockResolvedValue(createdMessage as any);
330
+ vi.mocked(mockMessageModel.query).mockResolvedValue(mockMessages as any);
331
+
332
+ const result = await messageService.createNewMessage(params as any);
333
+
334
+ expect(mockMessageModel.query).toHaveBeenCalledWith(
335
+ {
336
+ current: 0,
337
+ groupId: 'group-1',
338
+ pageSize: 9999,
339
+ sessionId: 'session-1',
340
+ topicId: 'topic-1',
341
+ },
342
+ expect.anything(),
343
+ );
344
+ expect(result.id).toBe('msg-1');
345
+ expect(result.messages).toEqual(mockMessages);
346
+ });
347
+ });
348
+ });
@@ -0,0 +1,159 @@
1
+ import { LobeChatDatabase } from '@lobechat/database';
2
+ import { CreateMessageParams, UpdateMessageParams } from '@lobechat/types';
3
+
4
+ import { MessageModel } from '@/database/models/message';
5
+
6
+ import { FileService } from '../file';
7
+
8
+ interface QueryOptions {
9
+ groupId?: string | null;
10
+ sessionId?: string | null;
11
+ topicId?: string | null;
12
+ useGroup?: boolean;
13
+ }
14
+
15
+ interface CreateMessageResult {
16
+ id: string;
17
+ messages: any[];
18
+ }
19
+
20
+ /**
21
+ * Message Service
22
+ *
23
+ * Encapsulates repeated "mutation + conditional query" logic.
24
+ * After performing update/delete operations, conditionally returns message list based on sessionId/topicId.
25
+ */
26
+ export class MessageService {
27
+ private messageModel: MessageModel;
28
+ private fileService: FileService;
29
+
30
+ constructor(db: LobeChatDatabase, userId: string) {
31
+ this.messageModel = new MessageModel(db, userId);
32
+ this.fileService = new FileService(db, userId);
33
+ }
34
+
35
+ /**
36
+ * Unified URL processing function
37
+ */
38
+ private get postProcessUrl() {
39
+ return (path: string | null) => this.fileService.getFullFileUrl(path);
40
+ }
41
+
42
+ /**
43
+ * Unified query options
44
+ */
45
+ private getQueryOptions(options: QueryOptions) {
46
+ return {
47
+ groupAssistantMessages: options.useGroup ?? false,
48
+ postProcessUrl: this.postProcessUrl,
49
+ };
50
+ }
51
+
52
+ /**
53
+ * Query messages and return response with success status (used after mutations)
54
+ */
55
+ private async queryWithSuccess(options?: QueryOptions) {
56
+ if (!options || (options.sessionId === undefined && options.topicId === undefined)) {
57
+ return { success: true };
58
+ }
59
+
60
+ const { sessionId, topicId, groupId } = options;
61
+
62
+ const messages = await this.messageModel.query(
63
+ { groupId, sessionId, topicId },
64
+ this.getQueryOptions(options),
65
+ );
66
+
67
+ return { messages, success: true };
68
+ }
69
+
70
+ /**
71
+ * Remove messages with optional message list return
72
+ * Pattern: delete + conditional query
73
+ */
74
+ async removeMessages(ids: string[], options?: QueryOptions) {
75
+ await this.messageModel.deleteMessages(ids);
76
+ return this.queryWithSuccess(options);
77
+ }
78
+
79
+ /**
80
+ * Remove single message with optional message list return
81
+ * Pattern: delete + conditional query
82
+ */
83
+ async removeMessage(id: string, options?: QueryOptions) {
84
+ await this.messageModel.deleteMessage(id);
85
+ return this.queryWithSuccess(options);
86
+ }
87
+
88
+ /**
89
+ * Update message RAG with optional message list return
90
+ * Pattern: update + conditional query
91
+ */
92
+ async updateMessageRAG(id: string, value: any, options?: QueryOptions) {
93
+ await this.messageModel.updateMessageRAG(id, value);
94
+ return this.queryWithSuccess(options);
95
+ }
96
+
97
+ /**
98
+ * Update plugin error with optional message list return
99
+ * Pattern: update + conditional query
100
+ */
101
+ async updatePluginError(id: string, value: any, options?: QueryOptions) {
102
+ await this.messageModel.updateMessagePlugin(id, { error: value });
103
+ return this.queryWithSuccess(options);
104
+ }
105
+
106
+ /**
107
+ * Update plugin state and return message list
108
+ * Pattern: update + conditional query
109
+ */
110
+ async updatePluginState(id: string, value: any, options: QueryOptions): Promise<any> {
111
+ await this.messageModel.updatePluginState(id, value);
112
+ return this.queryWithSuccess(options);
113
+ }
114
+
115
+ /**
116
+ * Update message and return message list
117
+ * Pattern: update + conditional query
118
+ */
119
+ async updateMessage(id: string, value: UpdateMessageParams, options: QueryOptions): Promise<any> {
120
+ await this.messageModel.update(id, value as any);
121
+ return this.queryWithSuccess(options);
122
+ }
123
+
124
+ /**
125
+ * Create a new message and return the complete message list
126
+ * Pattern: create + query
127
+ *
128
+ * This method combines message creation and querying into a single operation,
129
+ * reducing the need for separate refresh calls and improving performance.
130
+ */
131
+ async createNewMessage(
132
+ params: CreateMessageParams,
133
+ options?: QueryOptions,
134
+ ): Promise<CreateMessageResult> {
135
+ // 1. Create the message
136
+ const item = await this.messageModel.create(params);
137
+
138
+ // 2. Query all messages for this session/topic
139
+ const messages = await this.messageModel.query(
140
+ {
141
+ current: 0,
142
+ groupId: params.groupId,
143
+ pageSize: 9999,
144
+ sessionId: params.sessionId,
145
+ topicId: params.topicId,
146
+ },
147
+ {
148
+ groupAssistantMessages: options?.useGroup ?? false,
149
+ postProcessUrl: this.postProcessUrl,
150
+ },
151
+ );
152
+
153
+ // 3. Return the result
154
+ return {
155
+ id: item.id,
156
+ messages,
157
+ };
158
+ }
159
+ }
@@ -26,7 +26,7 @@ export class FirecrawlImpl implements SearchServiceImpl {
26
26
 
27
27
  private get baseUrl(): string {
28
28
  // Assuming the base URL is consistent with the crawl endpoint
29
- return process.env.FIRECRAWL_URL || 'https://api.firecrawl.dev/v1';
29
+ return process.env.FIRECRAWL_URL || 'https://api.firecrawl.dev/v2';
30
30
  }
31
31
 
32
32
  async query(query: string, params: SearchParams = {}): Promise<UniformSearchResponse> {
@@ -34,13 +34,14 @@ export class FirecrawlImpl implements SearchServiceImpl {
34
34
  const endpoint = urlJoin(this.baseUrl, '/search');
35
35
 
36
36
  const defaultQueryParams: FirecrawlSearchParameters = {
37
- limit: 15,
37
+ limit: 20,
38
38
  query,
39
39
  /*
40
40
  scrapeOptions: {
41
41
  formats: ["markdown"]
42
42
  },
43
43
  */
44
+ sources: [{ type: 'web' }, { type: 'news' }],
44
45
  };
45
46
 
46
47
  let body: FirecrawlSearchParameters = {
@@ -95,25 +96,64 @@ export class FirecrawlImpl implements SearchServiceImpl {
95
96
 
96
97
  log('Parsed Firecrawl response: %o', firecrawlResponse);
97
98
 
98
- const mappedResults = (firecrawlResponse.data || []).map(
99
+ // V2 API returns data as object with web/images/news arrays
100
+ const webResults = firecrawlResponse.data.web || [];
101
+ const imageResults = firecrawlResponse.data.images || [];
102
+ const newsResults = firecrawlResponse.data.news || [];
103
+
104
+ // Map web results
105
+ const mappedWebResults = webResults.map(
106
+ (result): UniformSearchResult => ({
107
+ category: 'general',
108
+ content: result.description || result.markdown || '',
109
+ engines: ['firecrawl'],
110
+ parsedUrl: result.url ? new URL(result.url).hostname : '',
111
+ score: 1,
112
+ title: result.title || '',
113
+ url: result.url,
114
+ }),
115
+ );
116
+
117
+ // Map news results
118
+ const mappedNewsResults = newsResults.map(
99
119
  (result): UniformSearchResult => ({
100
- category: 'general', // Default category
101
- content: result.description || '', // Prioritize content, fallback to snippet
102
- engines: ['firecrawl'], // Use 'firecrawl' as the engine name
103
- parsedUrl: result.url ? new URL(result.url).hostname : '', // Basic URL parsing
104
- score: 1, // Default score to 1
120
+ category: 'news',
121
+ content: result.snippet || result.markdown || '',
122
+ engines: ['firecrawl'],
123
+ parsedUrl: result.url ? new URL(result.url).hostname : '',
124
+ score: 1,
105
125
  title: result.title || '',
106
126
  url: result.url,
107
127
  }),
108
128
  );
109
129
 
110
- log('Mapped %d results to SearchResult format', mappedResults.length);
130
+ // Map image results
131
+ const mappedImageResults = imageResults.map(
132
+ (result): UniformSearchResult => ({
133
+ category: 'images',
134
+ content: result.title || '',
135
+ engines: ['firecrawl'],
136
+ parsedUrl: result.url ? new URL(result.url).hostname : '',
137
+ score: 1,
138
+ title: result.title || '',
139
+ url: result.imageUrl, // Use imageUrl for images
140
+ }),
141
+ );
142
+
143
+ // Combine all results
144
+ const allResults = [...mappedWebResults, ...mappedNewsResults, ...mappedImageResults];
145
+
146
+ log('Mapped %d results to SearchResult format', allResults.length);
147
+
148
+ if (firecrawlResponse.warning) {
149
+ log.extend('warn')('Firecrawl warning: %s', firecrawlResponse.warning);
150
+ }
111
151
 
112
152
  return {
113
153
  costTime,
114
154
  query: query,
115
- resultNumbers: mappedResults.length,
116
- results: mappedResults,
155
+ resultNumbers: allResults.length,
156
+ results: allResults,
117
157
  };
118
158
  } catch (error) {
119
159
  log.extend('error')('Error parsing Firecrawl response: %o', error);
@@ -1,35 +1,86 @@
1
+ // V2 API Types
1
2
  interface FirecrawlScrapeOptions {
2
- formats: string[];
3
+ blockAds?: boolean;
4
+ formats?: string[];
5
+ maxAge?: number;
6
+ onlyMainContent?: boolean;
7
+ removeBase64Images?: boolean;
3
8
  }
4
9
 
10
+ type FirecrawlSource =
11
+ | { location?: string; tbs?: string; type: 'web' }
12
+ | { type: 'images' }
13
+ | { type: 'news' };
14
+
15
+ type FirecrawlCategory = { type: 'github' } | { type: 'research' } | { type: 'pdf' };
16
+
5
17
  export interface FirecrawlSearchParameters {
18
+ categories?: FirecrawlCategory[];
6
19
  country?: string;
7
- lang?: string;
20
+ ignoreInvalidURLs?: boolean;
8
21
  limit?: number;
22
+ location?: string;
9
23
  query: string;
10
24
  scrapeOptions?: FirecrawlScrapeOptions;
25
+ sources?: FirecrawlSource[];
11
26
  tbs?: string;
12
27
  timeout?: number;
13
28
  }
14
29
 
15
30
  interface FirecrawlMetadata {
16
31
  description?: string;
32
+ error?: string | null;
17
33
  sourceURL?: string;
18
34
  statusCode?: number;
35
+ title?: string;
36
+ }
37
+
38
+ // Web search result
39
+ interface FirecrawlWebResult {
40
+ description: string;
41
+ html?: string | null;
42
+ links?: string[];
43
+ markdown?: string | null;
44
+ metadata?: FirecrawlMetadata;
45
+ rawHtml?: string | null;
46
+ screenshot?: string | null;
19
47
  title: string;
48
+ url: string;
20
49
  }
21
50
 
22
- interface FirecrawlData {
23
- description?: string;
24
- html?: string;
51
+ // Image search result
52
+ interface FirecrawlImageResult {
53
+ imageHeight: number;
54
+ imageUrl: string;
55
+ imageWidth: number;
56
+ position: number;
57
+ title: string;
58
+ url: string;
59
+ }
60
+
61
+ // News search result
62
+ interface FirecrawlNewsResult {
63
+ date: string;
64
+ html?: string | null;
65
+ imageUrl?: string;
25
66
  links?: string[];
26
- markdown?: string;
67
+ markdown?: string | null;
27
68
  metadata?: FirecrawlMetadata;
28
- title?: string;
69
+ position: number;
70
+ rawHtml?: string | null;
71
+ screenshot?: string | null;
72
+ snippet: string;
73
+ title: string;
29
74
  url: string;
30
75
  }
31
76
 
77
+ // V2 Response structure
32
78
  export interface FirecrawlResponse {
33
- data: FirecrawlData[];
34
- success?: boolean;
79
+ data: {
80
+ images?: FirecrawlImageResult[];
81
+ news?: FirecrawlNewsResult[];
82
+ web?: FirecrawlWebResult[];
83
+ };
84
+ success: boolean;
85
+ warning?: string | null;
35
86
  }