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

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 (728) 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 +684 -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 +232 -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 +76 -82
  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/obervability-otel/package.json +1 -3
  175. package/packages/obervability-otel/src/node.ts +3 -7
  176. package/packages/types/src/discover/mcp.ts +6 -0
  177. package/packages/types/src/index.ts +0 -1
  178. package/packages/types/src/message/common/base.ts +13 -0
  179. package/packages/types/src/message/common/image.ts +8 -0
  180. package/packages/types/src/message/common/metadata.ts +39 -0
  181. package/packages/types/src/message/common/tools.ts +10 -0
  182. package/packages/types/src/message/db/params.ts +47 -1
  183. package/packages/types/src/message/ui/chat.ts +4 -1
  184. package/packages/types/src/message/ui/params.ts +49 -4
  185. package/packages/types/src/plugins/mcp.ts +4 -1
  186. package/packages/types/src/search.ts +16 -0
  187. package/packages/types/src/serverConfig.ts +2 -6
  188. package/packages/types/src/topic/topic.ts +14 -0
  189. package/packages/types/src/user/index.ts +2 -76
  190. package/packages/types/src/user/preference.ts +105 -0
  191. package/packages/types/src/user/settings/index.ts +22 -0
  192. package/packages/utils/src/apiKey.test.ts +139 -0
  193. package/packages/utils/src/client/clipboard.ts +2 -2
  194. package/packages/utils/src/client/exportFile.ts +10 -10
  195. package/packages/utils/src/client/parserPlaceholder.ts +18 -18
  196. package/packages/utils/src/client/topic.ts +10 -10
  197. package/packages/utils/src/client/xor-obfuscation.ts +11 -11
  198. package/packages/utils/src/server/auth.ts +6 -6
  199. package/packages/utils/src/server/geo.ts +9 -9
  200. package/packages/utils/src/server/xor.ts +7 -7
  201. package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
  202. package/packages/web-crawler/tsconfig.json +0 -1
  203. package/renovate.json +23 -1
  204. package/scripts/migrateServerDB/errorHint.js +1 -7
  205. package/scripts/migrateServerDB/index.ts +2 -1
  206. package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
  207. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
  208. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  209. package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
  210. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  211. package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
  212. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
  213. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
  214. package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
  215. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  216. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
  217. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  218. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  219. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  220. package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
  221. package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
  222. package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
  223. package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
  224. package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
  225. package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
  226. package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
  227. package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
  228. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  229. package/src/app/[variants]/(main)/labs/components/LabCard.tsx +8 -6
  230. package/src/app/[variants]/(main)/labs/page.tsx +19 -22
  231. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  232. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  233. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  234. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  235. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  236. package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +6 -8
  237. package/src/app/[variants]/(main)/settings/provider/detail/azureai/index.tsx +1 -1
  238. package/src/app/[variants]/(main)/settings/provider/detail/bedrock/index.tsx +1 -1
  239. package/src/app/[variants]/(main)/settings/provider/detail/cloudflare/index.tsx +1 -1
  240. package/src/app/[variants]/(main)/settings/provider/detail/comfyui/index.tsx +1 -1
  241. package/src/app/[variants]/(main)/settings/provider/detail/github/index.tsx +1 -1
  242. package/src/app/[variants]/(main)/settings/provider/detail/vertexai/index.tsx +1 -1
  243. package/src/app/[variants]/(main)/settings/provider/features/ProviderConfig/index.tsx +2 -4
  244. package/src/app/[variants]/layout.tsx +1 -0
  245. package/src/app/[variants]/loading/index.tsx +1 -10
  246. package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
  247. package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
  248. package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
  249. package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
  250. package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
  251. package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
  252. package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +19 -2
  253. package/src/app/sitemap.tsx +7 -1
  254. package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
  255. package/src/components/Link.tsx +12 -0
  256. package/src/components/Skeleton/SkeletonSwitch.tsx +13 -0
  257. package/src/components/Skeleton/index.ts +2 -0
  258. package/src/components/Thinking/index.tsx +4 -3
  259. package/src/config/db.ts +0 -5
  260. package/src/config/featureFlags/schema.test.ts +0 -2
  261. package/src/config/featureFlags/schema.ts +0 -6
  262. package/src/config/modelProviders/ai21.ts +1 -16
  263. package/src/config/modelProviders/ai302.ts +1 -128
  264. package/src/config/modelProviders/ai360.ts +1 -32
  265. package/src/config/modelProviders/anthropic.ts +1 -94
  266. package/src/config/modelProviders/azure.ts +1 -51
  267. package/src/config/modelProviders/baichuan.ts +1 -57
  268. package/src/config/modelProviders/bedrock.ts +1 -276
  269. package/src/config/modelProviders/cloudflare.ts +1 -64
  270. package/src/config/modelProviders/deepseek.ts +1 -19
  271. package/src/config/modelProviders/fireworksai.ts +1 -174
  272. package/src/config/modelProviders/giteeai.ts +1 -135
  273. package/src/config/modelProviders/github.ts +1 -254
  274. package/src/config/modelProviders/google.ts +1 -130
  275. package/src/config/modelProviders/groq.ts +1 -119
  276. package/src/config/modelProviders/higress.ts +1 -1736
  277. package/src/config/modelProviders/huggingface.ts +1 -54
  278. package/src/config/modelProviders/hunyuan.ts +1 -83
  279. package/src/config/modelProviders/infiniai.ts +1 -74
  280. package/src/config/modelProviders/internlm.ts +1 -20
  281. package/src/config/modelProviders/minimax.ts +1 -1
  282. package/src/config/modelProviders/mistral.ts +1 -95
  283. package/src/config/modelProviders/modelscope.ts +1 -27
  284. package/src/config/modelProviders/moonshot.ts +1 -29
  285. package/src/config/modelProviders/novita.ts +1 -105
  286. package/src/config/modelProviders/ollama.ts +1 -325
  287. package/src/config/modelProviders/openai.ts +1 -242
  288. package/src/config/modelProviders/openrouter.ts +1 -240
  289. package/src/config/modelProviders/perplexity.ts +1 -45
  290. package/src/config/modelProviders/ppio.ts +1 -152
  291. package/src/config/modelProviders/qiniu.ts +2 -19
  292. package/src/config/modelProviders/qwen.ts +1 -245
  293. package/src/config/modelProviders/search1api.ts +1 -34
  294. package/src/config/modelProviders/sensenova.ts +1 -69
  295. package/src/config/modelProviders/siliconcloud.ts +1 -417
  296. package/src/config/modelProviders/spark.ts +1 -59
  297. package/src/config/modelProviders/stepfun.ts +1 -98
  298. package/src/config/modelProviders/taichu.ts +1 -18
  299. package/src/config/modelProviders/togetherai.ts +1 -274
  300. package/src/config/modelProviders/upstage.ts +1 -28
  301. package/src/config/modelProviders/wenxin.ts +1 -140
  302. package/src/config/modelProviders/xai.ts +1 -38
  303. package/src/config/modelProviders/zeroone.ts +1 -81
  304. package/src/config/modelProviders/zhipu.ts +1 -108
  305. package/src/envs/app.ts +5 -8
  306. package/src/envs/auth.ts +0 -179
  307. package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
  308. package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
  309. package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
  310. package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
  311. package/src/features/ChatInput/ActionBar/index.tsx +2 -2
  312. package/src/features/ChatInput/InputEditor/index.tsx +2 -2
  313. package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
  314. package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
  315. package/src/features/Conversation/Error/index.tsx +15 -5
  316. package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
  317. package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
  318. package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
  319. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
  320. package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
  321. package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
  322. package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
  323. package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
  324. package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
  325. package/src/features/Conversation/Messages/Default.tsx +2 -2
  326. package/src/features/Conversation/Messages/Group/Actions/WithContentId.tsx +152 -0
  327. package/src/features/Conversation/Messages/Group/Actions/WithoutContentId.tsx +70 -0
  328. package/src/features/Conversation/Messages/Group/Actions/index.tsx +21 -0
  329. package/src/features/Conversation/Messages/Group/ContentBlock.tsx +91 -0
  330. package/src/features/Conversation/Messages/Group/EditState.tsx +51 -0
  331. package/src/features/Conversation/Messages/Group/Error/index.tsx +53 -0
  332. package/src/features/Conversation/Messages/Group/GroupChildren.tsx +73 -0
  333. package/src/features/Conversation/Messages/Group/MessageContent.tsx +39 -0
  334. package/src/features/Conversation/Messages/Group/Tool/Inspector/BuiltinPluginTitle.tsx +49 -0
  335. package/src/features/Conversation/Messages/Group/Tool/Inspector/Debug.tsx +70 -0
  336. package/src/features/Conversation/Messages/Group/Tool/Inspector/PluginResult.tsx +34 -0
  337. package/src/features/Conversation/Messages/Group/Tool/Inspector/PluginState.tsx +18 -0
  338. package/src/features/Conversation/Messages/Group/Tool/Inspector/Settings.tsx +40 -0
  339. package/src/features/Conversation/Messages/Group/Tool/Inspector/ToolTitle.tsx +92 -0
  340. package/src/features/Conversation/Messages/Group/Tool/Inspector/index.tsx +176 -0
  341. package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/ObjectEntity.tsx +81 -0
  342. package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/ValueCell.tsx +43 -0
  343. package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/index.tsx +134 -0
  344. package/src/features/Conversation/Messages/Group/Tool/Render/CustomRender.tsx +88 -0
  345. package/src/features/Conversation/Messages/Group/Tool/Render/ErrorResponse.tsx +35 -0
  346. package/src/features/Conversation/Messages/Group/Tool/Render/LoadingPlaceholder/index.tsx +29 -0
  347. package/src/features/Conversation/Messages/Group/Tool/Render/PluginSettings.tsx +66 -0
  348. package/src/features/Conversation/Messages/Group/Tool/Render/index.tsx +105 -0
  349. package/src/features/Conversation/Messages/Group/Tool/index.tsx +75 -0
  350. package/src/features/Conversation/Messages/Group/Tools.tsx +46 -0
  351. package/src/features/Conversation/Messages/Group/index.tsx +140 -0
  352. package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
  353. package/src/features/Conversation/Messages/User/index.tsx +4 -4
  354. package/src/features/Conversation/Messages/index.tsx +15 -3
  355. package/src/features/Conversation/components/AutoScroll.tsx +2 -2
  356. package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
  357. package/src/features/Conversation/components/ShareMessageModal/ShareImage/Preview.tsx +2 -2
  358. package/src/features/DataImporter/index.tsx +15 -60
  359. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  360. package/src/features/MCP/utils.test.ts +91 -0
  361. package/src/features/MCP/utils.ts +20 -2
  362. package/src/features/PluginStore/Content.tsx +2 -3
  363. package/src/features/PluginStore/McpList/index.tsx +6 -2
  364. package/src/features/PluginTag/index.tsx +1 -3
  365. package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
  366. package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
  367. package/src/helpers/isCanUseFC.ts +0 -8
  368. package/src/hooks/useEnabledChatModels.ts +0 -8
  369. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  370. package/src/hooks/useModelContextWindowTokens.ts +0 -8
  371. package/src/hooks/useModelHasContextWindowToken.ts +1 -10
  372. package/src/hooks/useModelSupportFiles.ts +1 -11
  373. package/src/hooks/useModelSupportReasoning.ts +1 -11
  374. package/src/hooks/useModelSupportToolUse.ts +1 -11
  375. package/src/hooks/useModelSupportVision.ts +1 -11
  376. package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
  377. package/src/libs/next-auth/auth.config.ts +3 -6
  378. package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
  379. package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
  380. package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
  381. package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
  382. package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
  383. package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
  384. package/src/libs/next-auth/sso-providers/github.ts +0 -6
  385. package/src/libs/next-auth/sso-providers/google.ts +0 -2
  386. package/src/libs/next-auth/sso-providers/index.ts +0 -2
  387. package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
  388. package/src/libs/next-auth/sso-providers/logto.ts +3 -5
  389. package/src/libs/next-auth/sso-providers/okta.ts +0 -4
  390. package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
  391. package/src/libs/oidc-provider/provider.ts +1 -1
  392. package/src/libs/trpc/client/index.ts +0 -1
  393. package/src/libs/trpc/client/lambda.ts +8 -5
  394. package/src/libs/trpc/lambda/context.ts +4 -1
  395. package/src/locales/default/labs.ts +4 -0
  396. package/src/locales/default/oauth.ts +1 -0
  397. package/src/server/globalConfig/index.ts +0 -23
  398. package/src/server/modules/AssistantStore/index.ts +1 -1
  399. package/src/server/modules/ModelRuntime/trace.ts +11 -4
  400. package/src/server/routers/desktop/mcp.ts +1 -3
  401. package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +810 -70
  402. package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
  403. package/src/server/routers/lambda/config/index.test.ts +38 -30
  404. package/src/server/routers/lambda/market/index.ts +4 -2
  405. package/src/server/routers/lambda/message.ts +60 -52
  406. package/src/server/routers/lambda/session.ts +8 -5
  407. package/src/server/routers/lambda/topic.ts +7 -1
  408. package/src/server/routers/lambda/user.ts +32 -31
  409. package/src/server/routers/tools/mcp.ts +2 -3
  410. package/src/server/routers/tools/search.test.ts +1 -7
  411. package/src/server/routers/tools/search.ts +1 -4
  412. package/src/server/services/mcp/deps/MCPSystemDepsCheckService.test.ts +541 -0
  413. package/src/server/services/message/__tests__/index.test.ts +348 -0
  414. package/src/server/services/message/index.ts +159 -0
  415. package/src/server/services/search/impls/firecrawl/index.ts +51 -11
  416. package/src/server/services/search/impls/firecrawl/type.ts +60 -9
  417. package/src/services/__tests__/tool.test.ts +0 -3
  418. package/src/services/aiModel/index.test.ts +3 -6
  419. package/src/services/aiModel/index.ts +55 -7
  420. package/src/services/aiProvider/index.test.ts +2 -5
  421. package/src/services/aiProvider/index.ts +47 -7
  422. package/src/services/chat/chat.test.ts +13 -40
  423. package/src/services/chat/contextEngineering.test.ts +0 -30
  424. package/src/services/chat/contextEngineering.ts +7 -17
  425. package/src/services/chat/helper.ts +7 -31
  426. package/src/services/chat/index.ts +5 -10
  427. package/src/services/chat/types.ts +1 -1
  428. package/src/services/chatGroup/index.ts +64 -9
  429. package/src/services/config.ts +1 -65
  430. package/src/services/export/index.ts +9 -4
  431. package/src/services/file/index.ts +59 -10
  432. package/src/services/import/index.ts +132 -7
  433. package/src/services/mcp.test.ts +777 -0
  434. package/src/services/mcp.ts +40 -6
  435. package/src/services/message/index.ts +203 -10
  436. package/src/services/message/{__tests__/server.test.ts → server.test.ts} +3 -3
  437. package/src/services/models.ts +2 -11
  438. package/src/services/plugin/index.test.ts +8 -0
  439. package/src/services/plugin/index.ts +51 -10
  440. package/src/services/session/index.test.ts +8 -0
  441. package/src/services/session/index.ts +143 -10
  442. package/src/services/tableViewer/client.ts +12 -15
  443. package/src/services/thread/index.test.ts +8 -0
  444. package/src/services/thread/index.ts +37 -7
  445. package/src/services/topic/index.test.ts +8 -0
  446. package/src/services/topic/index.ts +74 -10
  447. package/src/services/user/index.test.ts +8 -0
  448. package/src/services/user/index.ts +50 -11
  449. package/src/store/aiInfra/slices/aiModel/action.test.ts +17 -9
  450. package/src/store/chat/helpers.test.ts +99 -0
  451. package/src/store/chat/helpers.ts +21 -2
  452. package/src/store/chat/selectors.ts +1 -1
  453. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +17 -251
  454. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +339 -7
  455. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +9 -5
  456. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +49 -178
  457. package/src/store/chat/slices/aiChat/actions/generateAIChatV2.ts +272 -14
  458. package/src/store/chat/slices/aiChat/actions/generateAIGroupChat.ts +7 -2
  459. package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
  460. package/src/store/chat/slices/builtinTool/actions/search.ts +3 -3
  461. package/src/store/chat/slices/message/action.test.ts +157 -16
  462. package/src/store/chat/slices/message/action.ts +153 -77
  463. package/src/store/chat/slices/message/reducer.test.ts +363 -5
  464. package/src/store/chat/slices/message/reducer.ts +87 -3
  465. package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
  466. package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
  467. package/src/store/chat/slices/message/selectors/index.ts +2 -0
  468. package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
  469. package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
  470. package/src/store/chat/slices/plugin/action.test.ts +118 -157
  471. package/src/store/chat/slices/plugin/action.ts +53 -68
  472. package/src/store/chat/slices/thread/action.test.ts +13 -4
  473. package/src/store/chat/slices/thread/action.ts +3 -1
  474. package/src/store/chat/slices/topic/action.test.ts +1 -1
  475. package/src/store/chat/slices/topic/action.ts +1 -2
  476. package/src/store/chat/slices/topic/reducer.ts +1 -2
  477. package/src/store/file/slices/chat/action.ts +1 -4
  478. package/src/store/file/slices/fileManager/action.ts +2 -3
  479. package/src/store/global/store.ts +1 -7
  480. package/src/store/session/slices/sessionGroup/action.test.ts +5 -5
  481. package/src/store/tool/selectors/tool.test.ts +1 -1
  482. package/src/store/tool/selectors/tool.ts +6 -8
  483. package/src/store/tool/slices/builtin/action.test.ts +83 -35
  484. package/src/store/tool/slices/builtin/action.ts +0 -9
  485. package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
  486. package/src/store/tool/slices/builtin/selectors.ts +15 -21
  487. package/src/store/tool/slices/mcpStore/action.test.ts +95 -3
  488. package/src/store/tool/slices/mcpStore/action.ts +177 -53
  489. package/src/store/tool/slices/oldStore/initialState.ts +1 -2
  490. package/src/store/user/initialState.ts +1 -7
  491. package/src/store/user/selectors.ts +1 -5
  492. package/src/store/user/slices/common/action.test.ts +1 -4
  493. package/src/store/user/slices/common/action.ts +5 -4
  494. package/src/store/user/slices/preference/action.ts +8 -1
  495. package/src/store/user/slices/preference/selectors/index.ts +2 -0
  496. package/src/store/user/slices/preference/selectors/labPrefer.ts +13 -0
  497. package/src/store/user/slices/preference/{selectors.ts → selectors/preference.ts} +0 -2
  498. package/src/store/user/slices/settings/selectors/index.ts +1 -0
  499. package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
  500. package/src/store/user/store.ts +0 -3
  501. package/src/tools/index.ts +0 -6
  502. package/src/tools/renders.ts +0 -3
  503. package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
  504. package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
  505. package/tsconfig.json +9 -3
  506. package/packages/const/src/guide.ts +0 -89
  507. package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
  508. package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
  509. package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
  510. package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
  511. package/packages/utils/src/_deprecated/parseModels.ts +0 -165
  512. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  513. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  514. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  515. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  516. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  517. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  518. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  519. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  520. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  521. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  522. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  523. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  524. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  525. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  526. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  527. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  528. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  529. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  530. package/src/components/InnerLink.tsx +0 -20
  531. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  532. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  533. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  534. package/src/database/_deprecated/core/db.ts +0 -246
  535. package/src/database/_deprecated/core/index.ts +0 -2
  536. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  537. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  538. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  539. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  540. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  541. package/src/database/_deprecated/core/model.ts +0 -218
  542. package/src/database/_deprecated/core/schemas.ts +0 -88
  543. package/src/database/_deprecated/core/types/db.ts +0 -15
  544. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  545. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  546. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  547. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  548. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  549. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  550. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  551. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  552. package/src/database/_deprecated/models/file.ts +0 -51
  553. package/src/database/_deprecated/models/message.ts +0 -277
  554. package/src/database/_deprecated/models/plugin.ts +0 -62
  555. package/src/database/_deprecated/models/session.ts +0 -271
  556. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  557. package/src/database/_deprecated/models/topic.ts +0 -250
  558. package/src/database/_deprecated/models/user.ts +0 -69
  559. package/src/database/_deprecated/schemas/files.ts +0 -39
  560. package/src/database/_deprecated/schemas/message.ts +0 -50
  561. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  562. package/src/database/_deprecated/schemas/session.ts +0 -54
  563. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  564. package/src/database/_deprecated/schemas/topic.ts +0 -12
  565. package/src/database/_deprecated/schemas/user.ts +0 -40
  566. package/src/envs/__tests__/auth.test.ts +0 -200
  567. package/src/features/DataImporter/_deprecated.ts +0 -43
  568. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  569. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  570. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  571. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  572. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  573. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  574. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  575. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  576. package/src/features/InitClientDB/index.tsx +0 -37
  577. package/src/hooks/_header.ts +0 -23
  578. package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
  579. package/src/libs/trpc/client/edge.ts +0 -26
  580. package/src/libs/trpc/edge/context.ts +0 -71
  581. package/src/libs/trpc/edge/index.ts +0 -45
  582. package/src/libs/trpc/edge/init.ts +0 -26
  583. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  584. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  585. package/src/migrations/FromV0ToV1.ts +0 -10
  586. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  587. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  588. package/src/migrations/FromV1ToV2/index.ts +0 -82
  589. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  590. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  591. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  592. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  593. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  594. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  595. package/src/migrations/FromV2ToV3/index.ts +0 -30
  596. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  597. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  598. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  599. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  600. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  601. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  602. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  603. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  604. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  605. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  606. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  607. package/src/migrations/FromV3ToV4/index.ts +0 -102
  608. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  609. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  610. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  611. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  612. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  613. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  614. package/src/migrations/FromV4ToV5/index.ts +0 -58
  615. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  616. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  617. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  618. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  619. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  620. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  621. package/src/migrations/FromV5ToV6/index.ts +0 -61
  622. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  623. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  624. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  625. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  626. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  627. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  628. package/src/migrations/FromV6ToV7/index.ts +0 -101
  629. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  630. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  631. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  632. package/src/migrations/VersionController.test.ts +0 -88
  633. package/src/migrations/VersionController.ts +0 -67
  634. package/src/migrations/index.ts +0 -61
  635. package/src/server/globalConfig/_deprecated.test.ts +0 -92
  636. package/src/server/globalConfig/_deprecated.ts +0 -41
  637. package/src/server/routers/edge/appStatus.ts +0 -3
  638. package/src/server/routers/edge/index.ts +0 -14
  639. package/src/server/routers/edge/upload.ts +0 -16
  640. package/src/services/aiModel/client.ts +0 -70
  641. package/src/services/aiModel/server.test.ts +0 -122
  642. package/src/services/aiModel/server.ts +0 -51
  643. package/src/services/aiModel/type.ts +0 -32
  644. package/src/services/aiProvider/client.ts +0 -58
  645. package/src/services/aiProvider/server.ts +0 -43
  646. package/src/services/aiProvider/type.ts +0 -27
  647. package/src/services/baseClientService/index.ts +0 -9
  648. package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
  649. package/src/services/chatGroup/client.ts +0 -63
  650. package/src/services/chatGroup/server.ts +0 -67
  651. package/src/services/chatGroup/type.ts +0 -22
  652. package/src/services/export/_deprecated.ts +0 -155
  653. package/src/services/export/client.ts +0 -15
  654. package/src/services/export/server.ts +0 -9
  655. package/src/services/export/type.ts +0 -5
  656. package/src/services/file/_deprecated.test.ts +0 -119
  657. package/src/services/file/_deprecated.ts +0 -80
  658. package/src/services/file/client.test.ts +0 -199
  659. package/src/services/file/client.ts +0 -85
  660. package/src/services/file/server.ts +0 -53
  661. package/src/services/file/type.ts +0 -13
  662. package/src/services/import/_deprecated.ts +0 -115
  663. package/src/services/import/client.test.ts +0 -1015
  664. package/src/services/import/client.ts +0 -64
  665. package/src/services/import/server.ts +0 -133
  666. package/src/services/import/type.ts +0 -17
  667. package/src/services/message/_deprecated.test.ts +0 -398
  668. package/src/services/message/_deprecated.ts +0 -168
  669. package/src/services/message/client.test.ts +0 -410
  670. package/src/services/message/client.ts +0 -186
  671. package/src/services/message/server.ts +0 -150
  672. package/src/services/message/type.ts +0 -54
  673. package/src/services/plugin/_deprecated.test.ts +0 -162
  674. package/src/services/plugin/_deprecated.ts +0 -42
  675. package/src/services/plugin/client.test.ts +0 -177
  676. package/src/services/plugin/client.ts +0 -46
  677. package/src/services/plugin/server.ts +0 -42
  678. package/src/services/plugin/type.ts +0 -23
  679. package/src/services/session/_deprecated.test.ts +0 -440
  680. package/src/services/session/_deprecated.ts +0 -190
  681. package/src/services/session/client.test.ts +0 -413
  682. package/src/services/session/client.ts +0 -193
  683. package/src/services/session/server.test.ts +0 -260
  684. package/src/services/session/server.ts +0 -125
  685. package/src/services/session/type.ts +0 -82
  686. package/src/services/thread/client.ts +0 -51
  687. package/src/services/thread/server.ts +0 -32
  688. package/src/services/thread/type.ts +0 -21
  689. package/src/services/topic/_deprecated.test.ts +0 -245
  690. package/src/services/topic/_deprecated.ts +0 -75
  691. package/src/services/topic/client.ts +0 -89
  692. package/src/services/topic/pglite.test.ts +0 -212
  693. package/src/services/topic/server.ts +0 -57
  694. package/src/services/topic/type.ts +0 -40
  695. package/src/services/user/_deprecated.test.ts +0 -101
  696. package/src/services/user/_deprecated.ts +0 -70
  697. package/src/services/user/client.test.ts +0 -108
  698. package/src/services/user/client.ts +0 -104
  699. package/src/services/user/server.test.ts +0 -149
  700. package/src/services/user/server.ts +0 -47
  701. package/src/services/user/type.ts +0 -21
  702. package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
  703. package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
  704. package/src/store/global/actions/clientDb.ts +0 -67
  705. package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
  706. package/src/store/user/slices/modelList/action.test.ts +0 -359
  707. package/src/store/user/slices/modelList/action.ts +0 -223
  708. package/src/store/user/slices/modelList/initialState.ts +0 -15
  709. package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
  710. package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
  711. package/src/store/user/slices/modelList/selectors/index.ts +0 -3
  712. package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
  713. package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
  714. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
  715. package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
  716. package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
  717. package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
  718. package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
  719. package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
  720. package/src/tools/dalle/Render/Item/Error.tsx +0 -49
  721. package/src/tools/dalle/Render/Item/Image.tsx +0 -44
  722. package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
  723. package/src/tools/dalle/Render/Item/index.tsx +0 -88
  724. package/src/tools/dalle/Render/ToolBar.tsx +0 -56
  725. package/src/tools/dalle/Render/index.tsx +0 -52
  726. package/src/tools/dalle/index.ts +0 -92
  727. /package/src/{app/[variants]/(main)/settings/provider/features/ProviderConfig → components/Skeleton}/SkeletonInput.tsx +0 -0
  728. /package/src/{middleware.ts → proxy.ts} +0 -0
@@ -0,0 +1,451 @@
1
+ import { Then, When } from '@cucumber/cucumber';
2
+ import { expect } from '@playwright/test';
3
+
4
+ import { CustomWorld } from '../../support/world';
5
+
6
+ // ============================================
7
+ // When Steps (Actions)
8
+ // ============================================
9
+
10
+ When('I type {string} in the search bar', async function (this: CustomWorld, searchText: string) {
11
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
12
+
13
+ const searchBar = this.page.locator('input[type="text"]').first();
14
+ await searchBar.waitFor({ state: 'visible', timeout: 120_000 });
15
+ await searchBar.fill(searchText);
16
+
17
+ // Store the search text for later assertions
18
+ this.testContext.searchText = searchText;
19
+ });
20
+
21
+ When('I wait for the search results to load', async function (this: CustomWorld) {
22
+ // Wait for network to be idle after typing
23
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
24
+ // Add a small delay to ensure UI updates
25
+ await this.page.waitForTimeout(500);
26
+ });
27
+
28
+ When('I click on a category in the category menu', async function (this: CustomWorld) {
29
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
30
+
31
+ // Find the category menu and click the first non-active category
32
+ const categoryItems = this.page.locator(
33
+ '[data-testid="category-menu"] button, [role="menu"] button, nav[aria-label*="categor" i] button',
34
+ );
35
+
36
+ // Wait for categories to be visible
37
+ await categoryItems.first().waitFor({ state: 'visible', timeout: 120_000 });
38
+
39
+ // Click the second category (skip "All" which is usually first)
40
+ const secondCategory = categoryItems.nth(1);
41
+ await secondCategory.click();
42
+
43
+ // Store the category for later verification
44
+ const categoryText = await secondCategory.textContent();
45
+ this.testContext.selectedCategory = categoryText?.trim();
46
+ });
47
+
48
+ When('I click on a category in the category filter', async function (this: CustomWorld) {
49
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
50
+
51
+ // Find the category filter and click a category
52
+ const categoryItems = this.page.locator(
53
+ '[data-testid="category-filter"] button, [data-testid="category-menu"] button',
54
+ );
55
+
56
+ // Wait for categories to be visible
57
+ await categoryItems.first().waitFor({ state: 'visible', timeout: 120_000 });
58
+
59
+ // Click the second category (skip "All" which is usually first)
60
+ const secondCategory = categoryItems.nth(1);
61
+ await secondCategory.click();
62
+
63
+ // Store the category for later verification
64
+ const categoryText = await secondCategory.textContent();
65
+ this.testContext.selectedCategory = categoryText?.trim();
66
+ });
67
+
68
+ When('I wait for the filtered results to load', async function (this: CustomWorld) {
69
+ // Wait for network to be idle after filtering
70
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
71
+ // Add a small delay to ensure UI updates
72
+ await this.page.waitForTimeout(500);
73
+ });
74
+
75
+ When('I click the next page button', async function (this: CustomWorld) {
76
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
77
+
78
+ // Find and click the next page button
79
+ const nextButton = this.page.locator(
80
+ 'button:has-text("Next"), button[aria-label*="next" i], .pagination button:last-child',
81
+ );
82
+
83
+ await nextButton.waitFor({ state: 'visible', timeout: 120_000 });
84
+ await nextButton.click();
85
+ });
86
+
87
+ When('I wait for the next page to load', async function (this: CustomWorld) {
88
+ // Wait for network to be idle after page change
89
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
90
+ // Add a small delay to ensure UI updates
91
+ await this.page.waitForTimeout(500);
92
+ });
93
+
94
+ When('I click on the first assistant card', async function (this: CustomWorld) {
95
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
96
+
97
+ const firstCard = this.page.locator('[data-testid="assistant-item"]').first();
98
+ await firstCard.waitFor({ state: 'visible', timeout: 120_000 });
99
+
100
+ // Store the current URL before clicking
101
+ this.testContext.previousUrl = this.page.url();
102
+
103
+ await firstCard.click();
104
+
105
+ // Wait for URL to change
106
+ await this.page.waitForFunction(
107
+ (previousUrl) => window.location.href !== previousUrl,
108
+ this.testContext.previousUrl,
109
+ { timeout: 120_000 },
110
+ );
111
+ });
112
+
113
+ When('I click on the first model card', async function (this: CustomWorld) {
114
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
115
+
116
+ const firstCard = this.page.locator('[data-testid="model-item"]').first();
117
+ await firstCard.waitFor({ state: 'visible', timeout: 120_000 });
118
+
119
+ // Store the current URL before clicking
120
+ this.testContext.previousUrl = this.page.url();
121
+
122
+ await firstCard.click();
123
+
124
+ // Wait for URL to change
125
+ await this.page.waitForFunction(
126
+ (previousUrl) => window.location.href !== previousUrl,
127
+ this.testContext.previousUrl,
128
+ { timeout: 120_000 },
129
+ );
130
+ });
131
+
132
+ When('I click on the first provider card', async function (this: CustomWorld) {
133
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
134
+
135
+ const firstCard = this.page.locator('[data-testid="provider-item"]').first();
136
+ await firstCard.waitFor({ state: 'visible', timeout: 120_000 });
137
+
138
+ // Store the current URL before clicking
139
+ this.testContext.previousUrl = this.page.url();
140
+
141
+ await firstCard.click();
142
+
143
+ // Wait for URL to change
144
+ await this.page.waitForFunction(
145
+ (previousUrl) => window.location.href !== previousUrl,
146
+ this.testContext.previousUrl,
147
+ { timeout: 120_000 },
148
+ );
149
+ });
150
+
151
+ When('I click on the first MCP card', async function (this: CustomWorld) {
152
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
153
+
154
+ const firstCard = this.page.locator('[data-testid="mcp-item"]').first();
155
+ await firstCard.waitFor({ state: 'visible', timeout: 120_000 });
156
+
157
+ // Store the current URL before clicking
158
+ this.testContext.previousUrl = this.page.url();
159
+
160
+ await firstCard.click();
161
+
162
+ // Wait for URL to change
163
+ await this.page.waitForFunction(
164
+ (previousUrl) => window.location.href !== previousUrl,
165
+ this.testContext.previousUrl,
166
+ { timeout: 120_000 },
167
+ );
168
+ });
169
+
170
+ When('I click on the sort dropdown', async function (this: CustomWorld) {
171
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
172
+
173
+ const sortDropdown = this.page
174
+ .locator(
175
+ '[data-testid="sort-dropdown"], select, button[aria-label*="sort" i], [role="combobox"]',
176
+ )
177
+ .first();
178
+
179
+ await sortDropdown.waitFor({ state: 'visible', timeout: 120_000 });
180
+ await sortDropdown.click();
181
+ });
182
+
183
+ When('I select a sort option', async function (this: CustomWorld) {
184
+ await this.page.waitForTimeout(500);
185
+
186
+ // Find and click a sort option (assuming dropdown opens a menu)
187
+ const sortOptions = this.page.locator('[role="option"], [role="menuitem"]');
188
+
189
+ // Wait for options to appear
190
+ await sortOptions.first().waitFor({ state: 'visible', timeout: 120_000 });
191
+
192
+ // Click the second option (skip the default/first one)
193
+ const secondOption = sortOptions.nth(1);
194
+ await secondOption.click();
195
+
196
+ // Store the option for later verification
197
+ const optionText = await secondOption.textContent();
198
+ this.testContext.selectedSortOption = optionText?.trim();
199
+ });
200
+
201
+ When('I wait for the sorted results to load', async function (this: CustomWorld) {
202
+ // Wait for network to be idle after sorting
203
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
204
+ // Add a small delay to ensure UI updates
205
+ await this.page.waitForTimeout(500);
206
+ });
207
+
208
+ When(
209
+ 'I click on the {string} link in the featured assistants section',
210
+ async function (this: CustomWorld, linkText: string) {
211
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
212
+
213
+ // Find the featured assistants section and the "more" link
214
+ const moreLink = this.page
215
+ .locator(`a:has-text("${linkText}"), button:has-text("${linkText}")`)
216
+ .first();
217
+
218
+ await moreLink.waitFor({ state: 'visible', timeout: 120_000 });
219
+ await moreLink.click();
220
+ },
221
+ );
222
+
223
+ When(
224
+ 'I click on the {string} link in the featured MCP tools section',
225
+ async function (this: CustomWorld, linkText: string) {
226
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
227
+
228
+ // Find the MCP section and the "more" link
229
+ // Since there might be multiple "more" links, we'll click the second one (MCP is after assistants)
230
+ const moreLinks = this.page.locator(
231
+ `a:has-text("${linkText}"), button:has-text("${linkText}")`,
232
+ );
233
+
234
+ // Wait for links to be visible
235
+ await moreLinks.first().waitFor({ state: 'visible', timeout: 120_000 });
236
+
237
+ // Click the second "more" link (for MCP section)
238
+ await moreLinks.nth(1).click();
239
+ },
240
+ );
241
+
242
+ When('I click on the first featured assistant card', async function (this: CustomWorld) {
243
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
244
+
245
+ const firstCard = this.page.locator('[data-testid="assistant-item"]').first();
246
+ await firstCard.waitFor({ state: 'visible', timeout: 120_000 });
247
+
248
+ // Store the current URL before clicking
249
+ this.testContext.previousUrl = this.page.url();
250
+
251
+ await firstCard.click();
252
+
253
+ // Wait for URL to change
254
+ await this.page.waitForFunction(
255
+ (previousUrl) => window.location.href !== previousUrl,
256
+ this.testContext.previousUrl,
257
+ { timeout: 120_000 },
258
+ );
259
+ });
260
+
261
+ // ============================================
262
+ // Then Steps (Assertions)
263
+ // ============================================
264
+
265
+ Then('I should see filtered assistant cards', async function (this: CustomWorld) {
266
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
267
+
268
+ const assistantItems = this.page.locator('[data-testid="assistant-item"]');
269
+
270
+ // Wait for at least one item to be visible
271
+ await expect(assistantItems.first()).toBeVisible({ timeout: 120_000 });
272
+
273
+ // Verify that at least one item exists
274
+ const count = await assistantItems.count();
275
+ expect(count).toBeGreaterThan(0);
276
+ });
277
+
278
+ Then(
279
+ 'I should see assistant cards filtered by the selected category',
280
+ async function (this: CustomWorld) {
281
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
282
+
283
+ const assistantItems = this.page.locator('[data-testid="assistant-item"]');
284
+
285
+ // Wait for at least one item to be visible
286
+ await expect(assistantItems.first()).toBeVisible({ timeout: 120_000 });
287
+
288
+ // Verify that at least one item exists
289
+ const count = await assistantItems.count();
290
+ expect(count).toBeGreaterThan(0);
291
+ },
292
+ );
293
+
294
+ Then('the URL should contain the category parameter', async function (this: CustomWorld) {
295
+ const currentUrl = this.page.url();
296
+ // Check if URL contains a category-related parameter
297
+ expect(
298
+ currentUrl.includes('category=') || currentUrl.includes('tag='),
299
+ `Expected URL to contain category parameter, but got: ${currentUrl}`,
300
+ ).toBeTruthy();
301
+ });
302
+
303
+ Then('I should see different assistant cards', async function (this: CustomWorld) {
304
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
305
+
306
+ const assistantItems = this.page.locator('[data-testid="assistant-item"]');
307
+
308
+ // Wait for at least one item to be visible
309
+ await expect(assistantItems.first()).toBeVisible({ timeout: 120_000 });
310
+
311
+ // Verify that at least one item exists
312
+ const count = await assistantItems.count();
313
+ expect(count).toBeGreaterThan(0);
314
+ });
315
+
316
+ Then('the URL should contain the page parameter', async function (this: CustomWorld) {
317
+ const currentUrl = this.page.url();
318
+ // Check if URL contains a page parameter
319
+ expect(
320
+ currentUrl.includes('page=') || currentUrl.includes('p='),
321
+ `Expected URL to contain page parameter, but got: ${currentUrl}`,
322
+ ).toBeTruthy();
323
+ });
324
+
325
+ Then('I should be navigated to the assistant detail page', async function (this: CustomWorld) {
326
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
327
+
328
+ const currentUrl = this.page.url();
329
+ // Verify that URL changed and contains /assistant/ followed by an identifier
330
+ const hasAssistantDetail = /\/discover\/assistant\/[^#?]+/.test(currentUrl);
331
+ const urlChanged = currentUrl !== this.testContext.previousUrl;
332
+
333
+ expect(
334
+ hasAssistantDetail && urlChanged,
335
+ `Expected to navigate to assistant detail page, but URL is: ${currentUrl} (previous: ${this.testContext.previousUrl})`,
336
+ ).toBeTruthy();
337
+ });
338
+
339
+ Then('I should see the assistant detail content', async function (this: CustomWorld) {
340
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
341
+
342
+ // Look for detail page elements (e.g., title, description, etc.)
343
+ const detailContent = this.page.locator('[data-testid="detail-content"], main, article').first();
344
+ await expect(detailContent).toBeVisible({ timeout: 120_000 });
345
+ });
346
+
347
+ Then('I should see model cards in the sorted order', async function (this: CustomWorld) {
348
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
349
+
350
+ const modelItems = this.page.locator('[data-testid="model-item"]');
351
+
352
+ // Wait for at least one item to be visible
353
+ await expect(modelItems.first()).toBeVisible({ timeout: 120_000 });
354
+
355
+ // Verify that at least one item exists
356
+ const count = await modelItems.count();
357
+ expect(count).toBeGreaterThan(0);
358
+ });
359
+
360
+ Then('I should be navigated to the model detail page', async function (this: CustomWorld) {
361
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
362
+
363
+ const currentUrl = this.page.url();
364
+ // Verify that URL changed and contains /model/ followed by an identifier
365
+ const hasModelDetail = /\/discover\/model\/[^#?]+/.test(currentUrl);
366
+ const urlChanged = currentUrl !== this.testContext.previousUrl;
367
+
368
+ expect(
369
+ hasModelDetail && urlChanged,
370
+ `Expected to navigate to model detail page, but URL is: ${currentUrl} (previous: ${this.testContext.previousUrl})`,
371
+ ).toBeTruthy();
372
+ });
373
+
374
+ Then('I should see the model detail content', async function (this: CustomWorld) {
375
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
376
+
377
+ // Look for detail page elements
378
+ const detailContent = this.page.locator('[data-testid="detail-content"], main, article').first();
379
+ await expect(detailContent).toBeVisible({ timeout: 120_000 });
380
+ });
381
+
382
+ Then('I should be navigated to the provider detail page', async function (this: CustomWorld) {
383
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
384
+
385
+ const currentUrl = this.page.url();
386
+ // Verify that URL changed and contains /provider/ followed by an identifier
387
+ const hasProviderDetail = /\/discover\/provider\/[^#?]+/.test(currentUrl);
388
+ const urlChanged = currentUrl !== this.testContext.previousUrl;
389
+
390
+ expect(
391
+ hasProviderDetail && urlChanged,
392
+ `Expected to navigate to provider detail page, but URL is: ${currentUrl} (previous: ${this.testContext.previousUrl})`,
393
+ ).toBeTruthy();
394
+ });
395
+
396
+ Then('I should see the provider detail content', async function (this: CustomWorld) {
397
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
398
+
399
+ // Look for detail page elements
400
+ const detailContent = this.page.locator('[data-testid="detail-content"], main, article').first();
401
+ await expect(detailContent).toBeVisible({ timeout: 120_000 });
402
+ });
403
+
404
+ Then(
405
+ 'I should see MCP cards filtered by the selected category',
406
+ async function (this: CustomWorld) {
407
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
408
+
409
+ const mcpItems = this.page.locator('[data-testid="mcp-item"]');
410
+
411
+ // Wait for at least one item to be visible
412
+ await expect(mcpItems.first()).toBeVisible({ timeout: 120_000 });
413
+
414
+ // Verify that at least one item exists
415
+ const count = await mcpItems.count();
416
+ expect(count).toBeGreaterThan(0);
417
+ },
418
+ );
419
+
420
+ Then('I should be navigated to the MCP detail page', async function (this: CustomWorld) {
421
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
422
+
423
+ const currentUrl = this.page.url();
424
+ // Verify that URL changed and contains /mcp/ followed by an identifier
425
+ const hasMcpDetail = /\/discover\/mcp\/[^#?]+/.test(currentUrl);
426
+ const urlChanged = currentUrl !== this.testContext.previousUrl;
427
+
428
+ expect(
429
+ hasMcpDetail && urlChanged,
430
+ `Expected to navigate to MCP detail page, but URL is: ${currentUrl} (previous: ${this.testContext.previousUrl})`,
431
+ ).toBeTruthy();
432
+ });
433
+
434
+ Then('I should see the MCP detail content', async function (this: CustomWorld) {
435
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
436
+
437
+ // Look for detail page elements
438
+ const detailContent = this.page.locator('[data-testid="detail-content"], main, article').first();
439
+ await expect(detailContent).toBeVisible({ timeout: 120_000 });
440
+ });
441
+
442
+ Then('I should be navigated to {string}', async function (this: CustomWorld, expectedPath: string) {
443
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
444
+
445
+ const currentUrl = this.page.url();
446
+ // Verify that URL contains the expected path
447
+ expect(
448
+ currentUrl.includes(expectedPath),
449
+ `Expected URL to contain "${expectedPath}", but got: ${currentUrl}`,
450
+ ).toBeTruthy();
451
+ });
@@ -7,8 +7,31 @@ import { CustomWorld } from '../../support/world';
7
7
  // Then Steps (Assertions)
8
8
  // ============================================
9
9
 
10
+ // Home Page Steps
11
+ Then('I should see the featured assistants section', async function (this: CustomWorld) {
12
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
13
+
14
+ // Look for featured assistants section by data-testid or heading
15
+ const featuredSection = this.page
16
+ .locator(
17
+ '[data-testid="featured-assistants"], h2:has-text("Featured"), h3:has-text("Featured")',
18
+ )
19
+ .first();
20
+ await expect(featuredSection).toBeVisible({ timeout: 120_000 });
21
+ });
22
+
23
+ Then('I should see the featured MCP tools section', async function (this: CustomWorld) {
24
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
25
+
26
+ // Look for featured MCP section by data-testid or heading
27
+ const mcpSection = this.page
28
+ .locator('[data-testid="featured-mcp"], h2:has-text("MCP"), h3:has-text("MCP")')
29
+ .first();
30
+ await expect(mcpSection).toBeVisible({ timeout: 120_000 });
31
+ });
32
+
33
+ // Assistant List Page Steps
10
34
  Then('I should see the search bar', async function (this: CustomWorld) {
11
- // Wait for network to be idle to ensure Suspense components are loaded
12
35
  await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
13
36
 
14
37
  // The SearchBar component from @lobehub/ui may not pass through data-testid
@@ -17,12 +40,20 @@ Then('I should see the search bar', async function (this: CustomWorld) {
17
40
  await expect(searchBar).toBeVisible({ timeout: 120_000 });
18
41
  });
19
42
 
43
+ Then('I should see the category menu', async function (this: CustomWorld) {
44
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
45
+
46
+ // Look for category menu/filter by data-testid or role
47
+ const categoryMenu = this.page
48
+ .locator('[data-testid="category-menu"], [role="menu"], nav[aria-label*="categor" i]')
49
+ .first();
50
+ await expect(categoryMenu).toBeVisible({ timeout: 120_000 });
51
+ });
52
+
20
53
  Then('I should see assistant cards', async function (this: CustomWorld) {
21
- // Wait for content to load
22
54
  await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
23
55
 
24
- // After migrating to SPA (react-router), links use relative paths like /assistant/:id
25
- // Look for assistant items by data-testid instead of href
56
+ // Look for assistant items by data-testid
26
57
  const assistantItems = this.page.locator('[data-testid="assistant-item"]');
27
58
 
28
59
  // Wait for at least one item to be visible
@@ -32,3 +63,84 @@ Then('I should see assistant cards', async function (this: CustomWorld) {
32
63
  const count = await assistantItems.count();
33
64
  expect(count).toBeGreaterThan(0);
34
65
  });
66
+
67
+ Then('I should see pagination controls', async function (this: CustomWorld) {
68
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
69
+
70
+ // Look for pagination controls by data-testid, role, or common pagination elements
71
+ const pagination = this.page
72
+ .locator(
73
+ '[data-testid="pagination"], nav[aria-label*="pagination" i], .pagination, button:has-text("Next"), button:has-text("Previous")',
74
+ )
75
+ .first();
76
+ await expect(pagination).toBeVisible({ timeout: 120_000 });
77
+ });
78
+
79
+ // Model List Page Steps
80
+ Then('I should see model cards', async function (this: CustomWorld) {
81
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
82
+
83
+ // Look for model items by data-testid
84
+ const modelItems = this.page.locator('[data-testid="model-item"]');
85
+
86
+ // Wait for at least one item to be visible
87
+ await expect(modelItems.first()).toBeVisible({ timeout: 120_000 });
88
+
89
+ // Check we have multiple items
90
+ const count = await modelItems.count();
91
+ expect(count).toBeGreaterThan(0);
92
+ });
93
+
94
+ Then('I should see the sort dropdown', async function (this: CustomWorld) {
95
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
96
+
97
+ // Look for sort dropdown by data-testid, role, or select element
98
+ const sortDropdown = this.page
99
+ .locator(
100
+ '[data-testid="sort-dropdown"], select, button[aria-label*="sort" i], [role="combobox"]',
101
+ )
102
+ .first();
103
+ await expect(sortDropdown).toBeVisible({ timeout: 120_000 });
104
+ });
105
+
106
+ // Provider List Page Steps
107
+ Then('I should see provider cards', async function (this: CustomWorld) {
108
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
109
+
110
+ // Look for provider items by data-testid
111
+ const providerItems = this.page.locator('[data-testid="provider-item"]');
112
+
113
+ // Wait for at least one item to be visible
114
+ await expect(providerItems.first()).toBeVisible({ timeout: 120_000 });
115
+
116
+ // Check we have multiple items
117
+ const count = await providerItems.count();
118
+ expect(count).toBeGreaterThan(0);
119
+ });
120
+
121
+ // MCP List Page Steps
122
+ Then('I should see MCP cards', async function (this: CustomWorld) {
123
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
124
+
125
+ // Look for MCP items by data-testid
126
+ const mcpItems = this.page.locator('[data-testid="mcp-item"]');
127
+
128
+ // Wait for at least one item to be visible
129
+ await expect(mcpItems.first()).toBeVisible({ timeout: 120_000 });
130
+
131
+ // Check we have multiple items
132
+ const count = await mcpItems.count();
133
+ expect(count).toBeGreaterThan(0);
134
+ });
135
+
136
+ Then('I should see the category filter', async function (this: CustomWorld) {
137
+ await this.page.waitForLoadState('networkidle', { timeout: 120_000 });
138
+
139
+ // Look for category filter by data-testid or similar to category menu
140
+ const categoryFilter = this.page
141
+ .locator(
142
+ '[data-testid="category-filter"], [data-testid="category-menu"], [role="menu"], nav[aria-label*="categor" i]',
143
+ )
144
+ .first();
145
+ await expect(categoryFilter).toBeVisible({ timeout: 120_000 });
146
+ });
package/e2e/tsconfig.json CHANGED
@@ -8,7 +8,6 @@
8
8
  "esModuleInterop": true,
9
9
  "resolveJsonModule": true,
10
10
  "skipLibCheck": true,
11
- "baseUrl": ".",
12
11
  "paths": {
13
12
  "@/*": ["../*"]
14
13
  }
@@ -1,6 +1,10 @@
1
1
  {
2
2
  "desc": "سنقوم بتحديث الميزات الجديدة التي نستكشفها من وقت لآخر، ندعوك لتجربتها!",
3
3
  "features": {
4
+ "assistantMessageGroup": {
5
+ "desc": "تجميع رسائل المساعد ونتائج استدعاء الأدوات في مجموعة واحدة للعرض",
6
+ "title": "تجميع رسائل المساعد"
7
+ },
4
8
  "groupChat": {
5
9
  "desc": "تفعيل إمكانية تنسيق المحادثات الجماعية متعددة الوكلاء.",
6
10
  "title": "دردشة جماعية (متعددة الوكلاء)"
@@ -191,6 +191,9 @@
191
191
  "Kwai-Kolors/Kolors": {
192
192
  "description": "Kolors هو نموذج توليد صور نصية واسع النطاق يعتمد على الانتشار الكامن طوره فريق Kolors في Kuaishou. تم تدريبه على مليارات أزواج نص-صورة، ويظهر تفوقًا ملحوظًا في جودة الصور، دقة الفهم الدلالي المعقد، وعرض الأحرف الصينية والإنجليزية. يدعم الإدخال باللغتين الصينية والإنجليزية، ويبرع في فهم وتوليد المحتوى الخاص باللغة الصينية."
193
193
  },
194
+ "Kwaipilot/KAT-Dev": {
195
+ "description": "KAT-Dev (32B) هو نموذج مفتوح المصدر يحتوي على 32 مليار معلمة، صُمم خصيصًا لمهام هندسة البرمجيات. حقق معدل حل بنسبة 62.4٪ في اختبار SWE-Bench Verified، مما يجعله يحتل المرتبة الخامسة بين جميع النماذج مفتوحة المصدر بمختلف أحجامها. تم تحسين هذا النموذج عبر مراحل متعددة، بما في ذلك التدريب الوسيط، والتعديل الخاضع للإشراف (SFT)، والتعلم المعزز (RL)، بهدف تقديم دعم قوي لمهام البرمجة المعقدة مثل إكمال الشيفرة، وإصلاح الأخطاء، ومراجعة الشيفرة."
196
+ },
194
197
  "Llama-3.2-11B-Vision-Instruct": {
195
198
  "description": "قدرات استدلال الصور الممتازة على الصور عالية الدقة، مناسبة لتطبيقات الفهم البصري."
196
199
  },
@@ -788,12 +791,6 @@
788
791
  "claude-3-5-haiku-latest": {
789
792
  "description": "كلود 3.5 هايكو يوفر استجابة سريعة، مناسب للمهام الخفيفة."
790
793
  },
791
- "claude-3-5-sonnet-20240620": {
792
- "description": "Claude 3.5 Sonnet يوفر قدرات تتجاوز Opus وسرعة أكبر من Sonnet، مع الحفاظ على نفس السعر. Sonnet بارع بشكل خاص في البرمجة، وعلوم البيانات، ومعالجة الصور، ومهام الوكالة."
793
- },
794
- "claude-3-5-sonnet-20241022": {
795
- "description": "يقدم كلاف 3.5 سونيت قدرات تتجاوز أوبوس وسرعة أكبر من سونيت، مع الحفاظ على نفس الأسعار. سونيت متخصصة بشكل خاص في البرمجة، علوم البيانات، معالجة الصور، والمهام الوكيلة."
796
- },
797
794
  "claude-3-7-sonnet-20250219": {
798
795
  "description": "Claude 3.7 Sonnet هو أحدث نموذج من Anthropic، يتميز بأداء ممتاز في تقييمات واسعة، ويتفوق على نماذج المنافسين ونموذج Claude 3.5 Sonnet، مع الحفاظ على سرعة وتكلفة نماذجنا المتوسطة."
799
796
  },
@@ -1811,6 +1808,9 @@
1811
1808
  "gpt-5": {
1812
1809
  "description": "أفضل نموذج للترميز والمهام الوكيلة عبر المجالات. يحقق GPT-5 قفزة في الدقة والسرعة والاستدلال والتعرف على السياق والتفكير المنظم وحل المشكلات."
1813
1810
  },
1811
+ "gpt-5-chat": {
1812
+ "description": "GPT-5 Chat هو إصدار معاينة مُحسَّن خصيصًا لسيناريوهات المحادثة. يدعم إدخال النصوص والصور، ويُنتج نصوصًا فقط، مما يجعله مثاليًا لتطبيقات الدردشة والذكاء الاصطناعي التفاعلي."
1813
+ },
1814
1814
  "gpt-5-chat-latest": {
1815
1815
  "description": "نموذج GPT-5 المستخدم في ChatGPT. يجمع بين قدرات قوية في فهم اللغة وتوليدها، مناسب لتطبيقات التفاعل الحواري."
1816
1816
  },
@@ -2402,6 +2402,9 @@
2402
2402
  "minicpm-v": {
2403
2403
  "description": "MiniCPM-V هو نموذج متعدد الوسائط من الجيل الجديد تم إطلاقه بواسطة OpenBMB، ويتميز بقدرات استثنائية في التعرف على النصوص وفهم الوسائط المتعددة، ويدعم مجموعة واسعة من سيناريوهات الاستخدام."
2404
2404
  },
2405
+ "minimax-m2": {
2406
+ "description": "MiniMax M2 هو نموذج لغوي كبير وفعّال، تم تطويره خصيصًا لتلبية احتياجات الترميز وتدفقات عمل الوكلاء."
2407
+ },
2405
2408
  "ministral-3b-latest": {
2406
2409
  "description": "Ministral 3B هو نموذج حافة عالمي المستوى من Mistral."
2407
2410
  },
@@ -3212,6 +3215,12 @@
3212
3215
  "us.anthropic.claude-3-7-sonnet-20250219-v1:0": {
3213
3216
  "description": "كلود 3.7 سونيت هو أسرع نموذج من الجيل التالي من أنثروبيك. مقارنةً بكلود 3 هايكو، تم تحسين كلود 3.7 سونيت في جميع المهارات، وتجاوز العديد من اختبارات الذكاء لأكبر نموذج من الجيل السابق، كلود 3 أوبس."
3214
3217
  },
3218
+ "us.anthropic.claude-haiku-4-5-20251001-v1:0": {
3219
+ "description": "Claude Haiku 4.5 هو أسرع وأذكى نموذج Haiku من Anthropic، يتميز بسرعة فائقة وقدرة متقدمة على التفكير المتسلسل."
3220
+ },
3221
+ "us.anthropic.claude-sonnet-4-5-20250929-v1:0": {
3222
+ "description": "Claude Sonnet 4.5 هو النموذج الأذكى الذي طورته Anthropic حتى الآن."
3223
+ },
3215
3224
  "v0-1.0-md": {
3216
3225
  "description": "نموذج v0-1.0-md هو نموذج قديم يتم تقديمه من خلال واجهة برمجة التطبيقات v0"
3217
3226
  },
@@ -18,6 +18,7 @@
18
18
  },
19
19
  "permissionsTitle": "طلب الأذونات التالية:",
20
20
  "redirectUri": "سيتم إعادة التوجيه إلى بعد نجاح التفويض",
21
+ "redirecting": "تم التفويض بنجاح، جارٍ إعادة التوجيه...",
21
22
  "scope": {
22
23
  "email": "الوصول إلى عنوان بريدك الإلكتروني",
23
24
  "offline_access": "السماح للتطبيق بالوصول إلى بياناتك",