@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.
- package/.env.desktop +1 -2
- package/.env.example +0 -3
- package/.env.example.development +0 -2
- package/.github/workflows/claude-auto-testing.yml +73 -0
- package/.github/workflows/claude-translate-comments.yml +67 -0
- package/.github/workflows/desktop-pr-build.yml +18 -16
- package/.github/workflows/docker.yml +25 -20
- package/.github/workflows/e2e.yml +17 -3
- package/.github/workflows/release-desktop-beta.yml +12 -12
- package/.github/workflows/release.yml +3 -5
- package/.github/workflows/test.yml +47 -12
- package/.nvmrc +1 -1
- package/CHANGELOG.md +684 -0
- package/Dockerfile +1 -3
- package/README.md +2 -45
- package/README.zh-CN.md +2 -45
- package/apps/desktop/src/main/controllers/AuthCtr.ts +53 -39
- package/apps/desktop/src/main/controllers/MenuCtr.ts +5 -5
- package/apps/desktop/src/main/controllers/NotificationCtr.ts +29 -29
- package/apps/desktop/src/main/controllers/RemoteServerConfigCtr.ts +16 -16
- package/apps/desktop/src/main/controllers/ShortcutCtr.ts +2 -2
- package/apps/desktop/src/main/controllers/TrayMenuCtr.ts +18 -18
- package/apps/desktop/src/main/controllers/UpdaterCtr.ts +4 -4
- package/apps/desktop/src/main/controllers/__tests__/AuthCtr.test.ts +706 -0
- package/apps/desktop/src/main/controllers/__tests__/TrayMenuCtr.test.ts +5 -5
- package/apps/desktop/src/main/controllers/index.ts +4 -4
- package/apps/desktop/src/main/utils/next-electron-rsc.ts +7 -5
- package/apps/desktop/tsconfig.json +0 -1
- package/changelog/v1.json +232 -0
- package/docs/development/database-schema.dbml +12 -0
- package/docs/self-hosting/advanced/auth/next-auth/auth0.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/auth0.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/authelia.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/authelia.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/authentik.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/authentik.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/casdoor.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/casdoor.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/github.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/github.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/google.mdx +32 -29
- package/docs/self-hosting/advanced/auth/next-auth/keycloak.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/keycloak.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/logto.mdx +5 -3
- package/docs/self-hosting/advanced/auth/next-auth/logto.zh-CN.mdx +5 -3
- package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/okta.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/okta.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/wechat.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/wechat.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/zitadel.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/zitadel.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth.mdx +32 -21
- package/docs/self-hosting/advanced/auth.zh-CN.mdx +30 -19
- package/docs/self-hosting/advanced/feature-flags.mdx +0 -1
- package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +0 -1
- package/docs/self-hosting/advanced/online-search.mdx +30 -25
- package/docs/self-hosting/advanced/online-search.zh-CN.mdx +25 -23
- package/e2e/src/features/discover/detail-pages.feature +95 -0
- package/e2e/src/features/discover/interactions.feature +113 -0
- package/e2e/src/features/discover/smoke.feature +34 -1
- package/e2e/src/steps/discover/detail-pages.steps.ts +295 -0
- package/e2e/src/steps/discover/interactions.steps.ts +451 -0
- package/e2e/src/steps/discover/smoke.steps.ts +116 -4
- package/e2e/tsconfig.json +0 -1
- package/locales/ar/labs.json +4 -0
- package/locales/ar/models.json +15 -6
- package/locales/ar/oauth.json +1 -0
- package/locales/bg-BG/labs.json +4 -0
- package/locales/bg-BG/models.json +15 -6
- package/locales/bg-BG/oauth.json +1 -0
- package/locales/de-DE/labs.json +4 -0
- package/locales/de-DE/models.json +15 -6
- package/locales/de-DE/oauth.json +1 -0
- package/locales/en-US/labs.json +4 -0
- package/locales/en-US/models.json +15 -6
- package/locales/en-US/oauth.json +1 -0
- package/locales/es-ES/labs.json +4 -0
- package/locales/es-ES/models.json +15 -6
- package/locales/es-ES/oauth.json +1 -0
- package/locales/fa-IR/labs.json +4 -0
- package/locales/fa-IR/models.json +15 -6
- package/locales/fa-IR/oauth.json +1 -0
- package/locales/fr-FR/labs.json +4 -0
- package/locales/fr-FR/models.json +15 -6
- package/locales/fr-FR/oauth.json +1 -0
- package/locales/it-IT/labs.json +4 -0
- package/locales/it-IT/models.json +15 -6
- package/locales/it-IT/oauth.json +1 -0
- package/locales/ja-JP/labs.json +4 -0
- package/locales/ja-JP/models.json +15 -6
- package/locales/ja-JP/oauth.json +1 -0
- package/locales/ko-KR/labs.json +4 -0
- package/locales/ko-KR/models.json +21 -12
- package/locales/ko-KR/oauth.json +1 -0
- package/locales/nl-NL/labs.json +4 -0
- package/locales/nl-NL/models.json +15 -6
- package/locales/nl-NL/oauth.json +1 -0
- package/locales/pl-PL/labs.json +4 -0
- package/locales/pl-PL/models.json +15 -6
- package/locales/pl-PL/oauth.json +1 -0
- package/locales/pt-BR/labs.json +4 -0
- package/locales/pt-BR/models.json +15 -6
- package/locales/pt-BR/oauth.json +1 -0
- package/locales/ru-RU/labs.json +4 -0
- package/locales/ru-RU/models.json +15 -6
- package/locales/ru-RU/oauth.json +1 -0
- package/locales/tr-TR/labs.json +4 -0
- package/locales/tr-TR/models.json +15 -6
- package/locales/tr-TR/oauth.json +1 -0
- package/locales/vi-VN/labs.json +4 -0
- package/locales/vi-VN/models.json +15 -6
- package/locales/vi-VN/oauth.json +1 -0
- package/locales/zh-CN/labs.json +4 -0
- package/locales/zh-CN/models.json +15 -6
- package/locales/zh-CN/oauth.json +1 -0
- package/locales/zh-TW/labs.json +4 -0
- package/locales/zh-TW/models.json +15 -6
- package/locales/zh-TW/oauth.json +1 -0
- package/next.config.ts +2 -3
- package/package.json +76 -82
- package/packages/const/src/index.ts +0 -1
- package/packages/const/src/url.ts +1 -4
- package/packages/const/src/user.ts +5 -2
- package/packages/const/src/version.ts +3 -3
- package/packages/context-engine/src/index.ts +1 -6
- package/packages/context-engine/src/processors/GroupMessageFlatten.ts +12 -2
- package/packages/context-engine/src/processors/__tests__/GroupMessageFlatten.test.ts +73 -9
- package/packages/context-engine/src/providers/index.ts +0 -2
- package/packages/database/migrations/0041_improve_index.sql +10 -0
- package/packages/database/migrations/0042_improve_agent_index.sql +1 -0
- package/packages/database/migrations/0043_add_ai_model_settings.sql +1 -0
- package/packages/database/migrations/meta/0041_snapshot.json +7784 -0
- package/packages/database/migrations/meta/0042_snapshot.json +7800 -0
- package/packages/database/migrations/meta/0043_snapshot.json +8419 -0
- package/packages/database/migrations/meta/_journal.json +21 -0
- package/packages/database/package.json +2 -2
- package/packages/database/src/core/migrations.json +33 -0
- package/packages/database/src/core/web-server.ts +2 -1
- package/packages/database/src/models/__tests__/message.grouping.test.ts +812 -0
- package/packages/database/src/models/__tests__/message.test.ts +256 -233
- package/packages/database/src/models/agent.ts +16 -13
- package/packages/database/src/models/message.ts +90 -74
- package/packages/database/src/models/session.ts +80 -28
- package/packages/database/src/models/user.ts +2 -1
- package/packages/database/src/repositories/aiInfra/index.test.ts +198 -0
- package/packages/database/src/repositories/aiInfra/index.ts +2 -1
- package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
- package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
- package/packages/database/src/schemas/agent.ts +13 -11
- package/packages/database/src/schemas/aiInfra.ts +2 -0
- package/packages/database/src/schemas/message.ts +5 -1
- package/packages/database/src/schemas/relations.ts +6 -4
- package/packages/database/src/schemas/session.ts +2 -0
- package/packages/database/src/schemas/topic.ts +6 -1
- package/packages/database/src/utils/__tests__/groupMessages.test.ts +145 -2
- package/packages/database/src/utils/groupMessages.ts +7 -5
- package/packages/electron-client-ipc/package.json +4 -1
- package/packages/file-loaders/package.json +1 -0
- package/packages/memory-extract/package.json +2 -2
- package/packages/model-bank/src/aiModels/anthropic.ts +0 -63
- package/packages/model-bank/src/aiModels/higress.ts +0 -55
- package/packages/model-bank/src/aiModels/infiniai.ts +21 -0
- package/packages/model-bank/src/aiModels/ollamacloud.ts +13 -0
- package/packages/model-bank/src/aiModels/siliconcloud.ts +19 -0
- package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +0 -38
- package/packages/model-runtime/src/providers/minimax/index.ts +5 -5
- package/packages/model-runtime/src/providers/search1api/index.test.ts +2 -2
- package/packages/model-runtime/src/utils/googleErrorParser.test.ts +125 -0
- package/packages/model-runtime/src/utils/googleErrorParser.ts +103 -77
- package/packages/obervability-otel/package.json +1 -3
- package/packages/obervability-otel/src/node.ts +3 -7
- package/packages/types/src/discover/mcp.ts +6 -0
- package/packages/types/src/index.ts +0 -1
- package/packages/types/src/message/common/base.ts +13 -0
- package/packages/types/src/message/common/image.ts +8 -0
- package/packages/types/src/message/common/metadata.ts +39 -0
- package/packages/types/src/message/common/tools.ts +10 -0
- package/packages/types/src/message/db/params.ts +47 -1
- package/packages/types/src/message/ui/chat.ts +4 -1
- package/packages/types/src/message/ui/params.ts +49 -4
- package/packages/types/src/plugins/mcp.ts +4 -1
- package/packages/types/src/search.ts +16 -0
- package/packages/types/src/serverConfig.ts +2 -6
- package/packages/types/src/topic/topic.ts +14 -0
- package/packages/types/src/user/index.ts +2 -76
- package/packages/types/src/user/preference.ts +105 -0
- package/packages/types/src/user/settings/index.ts +22 -0
- package/packages/utils/src/apiKey.test.ts +139 -0
- package/packages/utils/src/client/clipboard.ts +2 -2
- package/packages/utils/src/client/exportFile.ts +10 -10
- package/packages/utils/src/client/parserPlaceholder.ts +18 -18
- package/packages/utils/src/client/topic.ts +10 -10
- package/packages/utils/src/client/xor-obfuscation.ts +11 -11
- package/packages/utils/src/server/auth.ts +6 -6
- package/packages/utils/src/server/geo.ts +9 -9
- package/packages/utils/src/server/xor.ts +7 -7
- package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
- package/packages/web-crawler/tsconfig.json +0 -1
- package/renovate.json +23 -1
- package/scripts/migrateServerDB/errorHint.js +1 -7
- package/scripts/migrateServerDB/index.ts +2 -1
- package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
- package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
- package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
- package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
- package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
- package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
- package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
- package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
- package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
- package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
- package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
- package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
- package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
- package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
- package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
- package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
- package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
- package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
- package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
- package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
- package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
- package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
- package/src/app/[variants]/(main)/image/page.tsx +0 -2
- package/src/app/[variants]/(main)/labs/components/LabCard.tsx +8 -6
- package/src/app/[variants]/(main)/labs/page.tsx +19 -22
- package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
- package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
- package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
- package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
- package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +6 -8
- package/src/app/[variants]/(main)/settings/provider/detail/azureai/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/bedrock/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/cloudflare/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/comfyui/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/github/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/vertexai/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/features/ProviderConfig/index.tsx +2 -4
- package/src/app/[variants]/layout.tsx +1 -0
- package/src/app/[variants]/loading/index.tsx +1 -10
- package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
- package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
- package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
- package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
- package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
- package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
- package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +19 -2
- package/src/app/sitemap.tsx +7 -1
- package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
- package/src/components/Link.tsx +12 -0
- package/src/components/Skeleton/SkeletonSwitch.tsx +13 -0
- package/src/components/Skeleton/index.ts +2 -0
- package/src/components/Thinking/index.tsx +4 -3
- package/src/config/db.ts +0 -5
- package/src/config/featureFlags/schema.test.ts +0 -2
- package/src/config/featureFlags/schema.ts +0 -6
- package/src/config/modelProviders/ai21.ts +1 -16
- package/src/config/modelProviders/ai302.ts +1 -128
- package/src/config/modelProviders/ai360.ts +1 -32
- package/src/config/modelProviders/anthropic.ts +1 -94
- package/src/config/modelProviders/azure.ts +1 -51
- package/src/config/modelProviders/baichuan.ts +1 -57
- package/src/config/modelProviders/bedrock.ts +1 -276
- package/src/config/modelProviders/cloudflare.ts +1 -64
- package/src/config/modelProviders/deepseek.ts +1 -19
- package/src/config/modelProviders/fireworksai.ts +1 -174
- package/src/config/modelProviders/giteeai.ts +1 -135
- package/src/config/modelProviders/github.ts +1 -254
- package/src/config/modelProviders/google.ts +1 -130
- package/src/config/modelProviders/groq.ts +1 -119
- package/src/config/modelProviders/higress.ts +1 -1736
- package/src/config/modelProviders/huggingface.ts +1 -54
- package/src/config/modelProviders/hunyuan.ts +1 -83
- package/src/config/modelProviders/infiniai.ts +1 -74
- package/src/config/modelProviders/internlm.ts +1 -20
- package/src/config/modelProviders/minimax.ts +1 -1
- package/src/config/modelProviders/mistral.ts +1 -95
- package/src/config/modelProviders/modelscope.ts +1 -27
- package/src/config/modelProviders/moonshot.ts +1 -29
- package/src/config/modelProviders/novita.ts +1 -105
- package/src/config/modelProviders/ollama.ts +1 -325
- package/src/config/modelProviders/openai.ts +1 -242
- package/src/config/modelProviders/openrouter.ts +1 -240
- package/src/config/modelProviders/perplexity.ts +1 -45
- package/src/config/modelProviders/ppio.ts +1 -152
- package/src/config/modelProviders/qiniu.ts +2 -19
- package/src/config/modelProviders/qwen.ts +1 -245
- package/src/config/modelProviders/search1api.ts +1 -34
- package/src/config/modelProviders/sensenova.ts +1 -69
- package/src/config/modelProviders/siliconcloud.ts +1 -417
- package/src/config/modelProviders/spark.ts +1 -59
- package/src/config/modelProviders/stepfun.ts +1 -98
- package/src/config/modelProviders/taichu.ts +1 -18
- package/src/config/modelProviders/togetherai.ts +1 -274
- package/src/config/modelProviders/upstage.ts +1 -28
- package/src/config/modelProviders/wenxin.ts +1 -140
- package/src/config/modelProviders/xai.ts +1 -38
- package/src/config/modelProviders/zeroone.ts +1 -81
- package/src/config/modelProviders/zhipu.ts +1 -108
- package/src/envs/app.ts +5 -8
- package/src/envs/auth.ts +0 -179
- package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
- package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
- package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
- package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
- package/src/features/ChatInput/ActionBar/index.tsx +2 -2
- package/src/features/ChatInput/InputEditor/index.tsx +2 -2
- package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
- package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
- package/src/features/Conversation/Error/index.tsx +15 -5
- package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
- package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
- package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
- package/src/features/Conversation/Messages/Default.tsx +2 -2
- package/src/features/Conversation/Messages/Group/Actions/WithContentId.tsx +152 -0
- package/src/features/Conversation/Messages/Group/Actions/WithoutContentId.tsx +70 -0
- package/src/features/Conversation/Messages/Group/Actions/index.tsx +21 -0
- package/src/features/Conversation/Messages/Group/ContentBlock.tsx +91 -0
- package/src/features/Conversation/Messages/Group/EditState.tsx +51 -0
- package/src/features/Conversation/Messages/Group/Error/index.tsx +53 -0
- package/src/features/Conversation/Messages/Group/GroupChildren.tsx +73 -0
- package/src/features/Conversation/Messages/Group/MessageContent.tsx +39 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/BuiltinPluginTitle.tsx +49 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/Debug.tsx +70 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/PluginResult.tsx +34 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/PluginState.tsx +18 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/Settings.tsx +40 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/ToolTitle.tsx +92 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/index.tsx +176 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/ObjectEntity.tsx +81 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/ValueCell.tsx +43 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/index.tsx +134 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/CustomRender.tsx +88 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/ErrorResponse.tsx +35 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/LoadingPlaceholder/index.tsx +29 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/PluginSettings.tsx +66 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/index.tsx +105 -0
- package/src/features/Conversation/Messages/Group/Tool/index.tsx +75 -0
- package/src/features/Conversation/Messages/Group/Tools.tsx +46 -0
- package/src/features/Conversation/Messages/Group/index.tsx +140 -0
- package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
- package/src/features/Conversation/Messages/User/index.tsx +4 -4
- package/src/features/Conversation/Messages/index.tsx +15 -3
- package/src/features/Conversation/components/AutoScroll.tsx +2 -2
- package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
- package/src/features/Conversation/components/ShareMessageModal/ShareImage/Preview.tsx +2 -2
- package/src/features/DataImporter/index.tsx +15 -60
- package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
- package/src/features/MCP/utils.test.ts +91 -0
- package/src/features/MCP/utils.ts +20 -2
- package/src/features/PluginStore/Content.tsx +2 -3
- package/src/features/PluginStore/McpList/index.tsx +6 -2
- package/src/features/PluginTag/index.tsx +1 -3
- package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
- package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
- package/src/helpers/isCanUseFC.ts +0 -8
- package/src/hooks/useEnabledChatModels.ts +0 -8
- package/src/hooks/useInterceptingRoutes.test.ts +21 -3
- package/src/hooks/useModelContextWindowTokens.ts +0 -8
- package/src/hooks/useModelHasContextWindowToken.ts +1 -10
- package/src/hooks/useModelSupportFiles.ts +1 -11
- package/src/hooks/useModelSupportReasoning.ts +1 -11
- package/src/hooks/useModelSupportToolUse.ts +1 -11
- package/src/hooks/useModelSupportVision.ts +1 -11
- package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
- package/src/libs/next-auth/auth.config.ts +3 -6
- package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
- package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
- package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
- package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
- package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
- package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
- package/src/libs/next-auth/sso-providers/github.ts +0 -6
- package/src/libs/next-auth/sso-providers/google.ts +0 -2
- package/src/libs/next-auth/sso-providers/index.ts +0 -2
- package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
- package/src/libs/next-auth/sso-providers/logto.ts +3 -5
- package/src/libs/next-auth/sso-providers/okta.ts +0 -4
- package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
- package/src/libs/oidc-provider/provider.ts +1 -1
- package/src/libs/trpc/client/index.ts +0 -1
- package/src/libs/trpc/client/lambda.ts +8 -5
- package/src/libs/trpc/lambda/context.ts +4 -1
- package/src/locales/default/labs.ts +4 -0
- package/src/locales/default/oauth.ts +1 -0
- package/src/server/globalConfig/index.ts +0 -23
- package/src/server/modules/AssistantStore/index.ts +1 -1
- package/src/server/modules/ModelRuntime/trace.ts +11 -4
- package/src/server/routers/desktop/mcp.ts +1 -3
- package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +810 -70
- package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
- package/src/server/routers/lambda/config/index.test.ts +38 -30
- package/src/server/routers/lambda/market/index.ts +4 -2
- package/src/server/routers/lambda/message.ts +60 -52
- package/src/server/routers/lambda/session.ts +8 -5
- package/src/server/routers/lambda/topic.ts +7 -1
- package/src/server/routers/lambda/user.ts +32 -31
- package/src/server/routers/tools/mcp.ts +2 -3
- package/src/server/routers/tools/search.test.ts +1 -7
- package/src/server/routers/tools/search.ts +1 -4
- package/src/server/services/mcp/deps/MCPSystemDepsCheckService.test.ts +541 -0
- package/src/server/services/message/__tests__/index.test.ts +348 -0
- package/src/server/services/message/index.ts +159 -0
- package/src/server/services/search/impls/firecrawl/index.ts +51 -11
- package/src/server/services/search/impls/firecrawl/type.ts +60 -9
- package/src/services/__tests__/tool.test.ts +0 -3
- package/src/services/aiModel/index.test.ts +3 -6
- package/src/services/aiModel/index.ts +55 -7
- package/src/services/aiProvider/index.test.ts +2 -5
- package/src/services/aiProvider/index.ts +47 -7
- package/src/services/chat/chat.test.ts +13 -40
- package/src/services/chat/contextEngineering.test.ts +0 -30
- package/src/services/chat/contextEngineering.ts +7 -17
- package/src/services/chat/helper.ts +7 -31
- package/src/services/chat/index.ts +5 -10
- package/src/services/chat/types.ts +1 -1
- package/src/services/chatGroup/index.ts +64 -9
- package/src/services/config.ts +1 -65
- package/src/services/export/index.ts +9 -4
- package/src/services/file/index.ts +59 -10
- package/src/services/import/index.ts +132 -7
- package/src/services/mcp.test.ts +777 -0
- package/src/services/mcp.ts +40 -6
- package/src/services/message/index.ts +203 -10
- package/src/services/message/{__tests__/server.test.ts → server.test.ts} +3 -3
- package/src/services/models.ts +2 -11
- package/src/services/plugin/index.test.ts +8 -0
- package/src/services/plugin/index.ts +51 -10
- package/src/services/session/index.test.ts +8 -0
- package/src/services/session/index.ts +143 -10
- package/src/services/tableViewer/client.ts +12 -15
- package/src/services/thread/index.test.ts +8 -0
- package/src/services/thread/index.ts +37 -7
- package/src/services/topic/index.test.ts +8 -0
- package/src/services/topic/index.ts +74 -10
- package/src/services/user/index.test.ts +8 -0
- package/src/services/user/index.ts +50 -11
- package/src/store/aiInfra/slices/aiModel/action.test.ts +17 -9
- package/src/store/chat/helpers.test.ts +99 -0
- package/src/store/chat/helpers.ts +21 -2
- package/src/store/chat/selectors.ts +1 -1
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +17 -251
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +339 -7
- package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +9 -5
- package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +49 -178
- package/src/store/chat/slices/aiChat/actions/generateAIChatV2.ts +272 -14
- package/src/store/chat/slices/aiChat/actions/generateAIGroupChat.ts +7 -2
- package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
- package/src/store/chat/slices/builtinTool/actions/search.ts +3 -3
- package/src/store/chat/slices/message/action.test.ts +157 -16
- package/src/store/chat/slices/message/action.ts +153 -77
- package/src/store/chat/slices/message/reducer.test.ts +363 -5
- package/src/store/chat/slices/message/reducer.ts +87 -3
- package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
- package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
- package/src/store/chat/slices/message/selectors/index.ts +2 -0
- package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
- package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
- package/src/store/chat/slices/plugin/action.test.ts +118 -157
- package/src/store/chat/slices/plugin/action.ts +53 -68
- package/src/store/chat/slices/thread/action.test.ts +13 -4
- package/src/store/chat/slices/thread/action.ts +3 -1
- package/src/store/chat/slices/topic/action.test.ts +1 -1
- package/src/store/chat/slices/topic/action.ts +1 -2
- package/src/store/chat/slices/topic/reducer.ts +1 -2
- package/src/store/file/slices/chat/action.ts +1 -4
- package/src/store/file/slices/fileManager/action.ts +2 -3
- package/src/store/global/store.ts +1 -7
- package/src/store/session/slices/sessionGroup/action.test.ts +5 -5
- package/src/store/tool/selectors/tool.test.ts +1 -1
- package/src/store/tool/selectors/tool.ts +6 -8
- package/src/store/tool/slices/builtin/action.test.ts +83 -35
- package/src/store/tool/slices/builtin/action.ts +0 -9
- package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
- package/src/store/tool/slices/builtin/selectors.ts +15 -21
- package/src/store/tool/slices/mcpStore/action.test.ts +95 -3
- package/src/store/tool/slices/mcpStore/action.ts +177 -53
- package/src/store/tool/slices/oldStore/initialState.ts +1 -2
- package/src/store/user/initialState.ts +1 -7
- package/src/store/user/selectors.ts +1 -5
- package/src/store/user/slices/common/action.test.ts +1 -4
- package/src/store/user/slices/common/action.ts +5 -4
- package/src/store/user/slices/preference/action.ts +8 -1
- package/src/store/user/slices/preference/selectors/index.ts +2 -0
- package/src/store/user/slices/preference/selectors/labPrefer.ts +13 -0
- package/src/store/user/slices/preference/{selectors.ts → selectors/preference.ts} +0 -2
- package/src/store/user/slices/settings/selectors/index.ts +1 -0
- package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
- package/src/store/user/store.ts +0 -3
- package/src/tools/index.ts +0 -6
- package/src/tools/renders.ts +0 -3
- package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
- package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
- package/tsconfig.json +9 -3
- package/packages/const/src/guide.ts +0 -89
- package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
- package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
- package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
- package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
- package/packages/utils/src/_deprecated/parseModels.ts +0 -165
- package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
- package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
- package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
- package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
- package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
- package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
- package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
- package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
- package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
- package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
- package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
- package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
- package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
- package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
- package/src/app/[variants]/loading/Client/Content.tsx +0 -48
- package/src/app/[variants]/loading/Client/Error.tsx +0 -27
- package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
- package/src/app/[variants]/loading/Client/index.tsx +0 -22
- package/src/components/InnerLink.tsx +0 -20
- package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
- package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
- package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
- package/src/database/_deprecated/core/db.ts +0 -246
- package/src/database/_deprecated/core/index.ts +0 -2
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
- package/src/database/_deprecated/core/model.ts +0 -218
- package/src/database/_deprecated/core/schemas.ts +0 -88
- package/src/database/_deprecated/core/types/db.ts +0 -15
- package/src/database/_deprecated/models/__DEBUG.ts +0 -124
- package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
- package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
- package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
- package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
- package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
- package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
- package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
- package/src/database/_deprecated/models/file.ts +0 -51
- package/src/database/_deprecated/models/message.ts +0 -277
- package/src/database/_deprecated/models/plugin.ts +0 -62
- package/src/database/_deprecated/models/session.ts +0 -271
- package/src/database/_deprecated/models/sessionGroup.ts +0 -93
- package/src/database/_deprecated/models/topic.ts +0 -250
- package/src/database/_deprecated/models/user.ts +0 -69
- package/src/database/_deprecated/schemas/files.ts +0 -39
- package/src/database/_deprecated/schemas/message.ts +0 -50
- package/src/database/_deprecated/schemas/plugin.ts +0 -12
- package/src/database/_deprecated/schemas/session.ts +0 -54
- package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
- package/src/database/_deprecated/schemas/topic.ts +0 -12
- package/src/database/_deprecated/schemas/user.ts +0 -40
- package/src/envs/__tests__/auth.test.ts +0 -200
- package/src/features/DataImporter/_deprecated.ts +0 -43
- package/src/features/InitClientDB/EnableModal.tsx +0 -118
- package/src/features/InitClientDB/ErrorResult.tsx +0 -143
- package/src/features/InitClientDB/InitIndicator.tsx +0 -124
- package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
- package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
- package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
- package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
- package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
- package/src/features/InitClientDB/index.tsx +0 -37
- package/src/hooks/_header.ts +0 -23
- package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
- package/src/libs/trpc/client/edge.ts +0 -26
- package/src/libs/trpc/edge/context.ts +0 -71
- package/src/libs/trpc/edge/index.ts +0 -45
- package/src/libs/trpc/edge/init.ts +0 -26
- package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
- package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
- package/src/migrations/FromV0ToV1.ts +0 -10
- package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
- package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
- package/src/migrations/FromV1ToV2/index.ts +0 -82
- package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
- package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
- package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
- package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
- package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
- package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
- package/src/migrations/FromV2ToV3/index.ts +0 -30
- package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
- package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
- package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
- package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
- package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
- package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
- package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
- package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
- package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
- package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
- package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
- package/src/migrations/FromV3ToV4/index.ts +0 -102
- package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
- package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
- package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
- package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
- package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
- package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
- package/src/migrations/FromV4ToV5/index.ts +0 -58
- package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
- package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
- package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
- package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
- package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
- package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
- package/src/migrations/FromV5ToV6/index.ts +0 -61
- package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
- package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
- package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
- package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
- package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
- package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
- package/src/migrations/FromV6ToV7/index.ts +0 -101
- package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
- package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
- package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
- package/src/migrations/VersionController.test.ts +0 -88
- package/src/migrations/VersionController.ts +0 -67
- package/src/migrations/index.ts +0 -61
- package/src/server/globalConfig/_deprecated.test.ts +0 -92
- package/src/server/globalConfig/_deprecated.ts +0 -41
- package/src/server/routers/edge/appStatus.ts +0 -3
- package/src/server/routers/edge/index.ts +0 -14
- package/src/server/routers/edge/upload.ts +0 -16
- package/src/services/aiModel/client.ts +0 -70
- package/src/services/aiModel/server.test.ts +0 -122
- package/src/services/aiModel/server.ts +0 -51
- package/src/services/aiModel/type.ts +0 -32
- package/src/services/aiProvider/client.ts +0 -58
- package/src/services/aiProvider/server.ts +0 -43
- package/src/services/aiProvider/type.ts +0 -27
- package/src/services/baseClientService/index.ts +0 -9
- package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
- package/src/services/chatGroup/client.ts +0 -63
- package/src/services/chatGroup/server.ts +0 -67
- package/src/services/chatGroup/type.ts +0 -22
- package/src/services/export/_deprecated.ts +0 -155
- package/src/services/export/client.ts +0 -15
- package/src/services/export/server.ts +0 -9
- package/src/services/export/type.ts +0 -5
- package/src/services/file/_deprecated.test.ts +0 -119
- package/src/services/file/_deprecated.ts +0 -80
- package/src/services/file/client.test.ts +0 -199
- package/src/services/file/client.ts +0 -85
- package/src/services/file/server.ts +0 -53
- package/src/services/file/type.ts +0 -13
- package/src/services/import/_deprecated.ts +0 -115
- package/src/services/import/client.test.ts +0 -1015
- package/src/services/import/client.ts +0 -64
- package/src/services/import/server.ts +0 -133
- package/src/services/import/type.ts +0 -17
- package/src/services/message/_deprecated.test.ts +0 -398
- package/src/services/message/_deprecated.ts +0 -168
- package/src/services/message/client.test.ts +0 -410
- package/src/services/message/client.ts +0 -186
- package/src/services/message/server.ts +0 -150
- package/src/services/message/type.ts +0 -54
- package/src/services/plugin/_deprecated.test.ts +0 -162
- package/src/services/plugin/_deprecated.ts +0 -42
- package/src/services/plugin/client.test.ts +0 -177
- package/src/services/plugin/client.ts +0 -46
- package/src/services/plugin/server.ts +0 -42
- package/src/services/plugin/type.ts +0 -23
- package/src/services/session/_deprecated.test.ts +0 -440
- package/src/services/session/_deprecated.ts +0 -190
- package/src/services/session/client.test.ts +0 -413
- package/src/services/session/client.ts +0 -193
- package/src/services/session/server.test.ts +0 -260
- package/src/services/session/server.ts +0 -125
- package/src/services/session/type.ts +0 -82
- package/src/services/thread/client.ts +0 -51
- package/src/services/thread/server.ts +0 -32
- package/src/services/thread/type.ts +0 -21
- package/src/services/topic/_deprecated.test.ts +0 -245
- package/src/services/topic/_deprecated.ts +0 -75
- package/src/services/topic/client.ts +0 -89
- package/src/services/topic/pglite.test.ts +0 -212
- package/src/services/topic/server.ts +0 -57
- package/src/services/topic/type.ts +0 -40
- package/src/services/user/_deprecated.test.ts +0 -101
- package/src/services/user/_deprecated.ts +0 -70
- package/src/services/user/client.test.ts +0 -108
- package/src/services/user/client.ts +0 -104
- package/src/services/user/server.test.ts +0 -149
- package/src/services/user/server.ts +0 -47
- package/src/services/user/type.ts +0 -21
- package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
- package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
- package/src/store/global/actions/clientDb.ts +0 -67
- package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
- package/src/store/user/slices/modelList/action.test.ts +0 -359
- package/src/store/user/slices/modelList/action.ts +0 -223
- package/src/store/user/slices/modelList/initialState.ts +0 -15
- package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
- package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
- package/src/store/user/slices/modelList/selectors/index.ts +0 -3
- package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
- package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
- package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
- package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
- package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
- package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
- package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
- package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
- package/src/tools/dalle/Render/Item/Error.tsx +0 -49
- package/src/tools/dalle/Render/Item/Image.tsx +0 -44
- package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
- package/src/tools/dalle/Render/Item/index.tsx +0 -88
- package/src/tools/dalle/Render/ToolBar.tsx +0 -56
- package/src/tools/dalle/Render/index.tsx +0 -52
- package/src/tools/dalle/index.ts +0 -92
- /package/src/{app/[variants]/(main)/settings/provider/features/ProviderConfig → components/Skeleton}/SkeletonInput.tsx +0 -0
- /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
|
-
//
|
|
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
package/locales/ar/labs.json
CHANGED
|
@@ -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": "دردشة جماعية (متعددة الوكلاء)"
|
package/locales/ar/models.json
CHANGED
|
@@ -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
|
},
|
package/locales/ar/oauth.json
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"permissionsTitle": "طلب الأذونات التالية:",
|
|
20
20
|
"redirectUri": "سيتم إعادة التوجيه إلى بعد نجاح التفويض",
|
|
21
|
+
"redirecting": "تم التفويض بنجاح، جارٍ إعادة التوجيه...",
|
|
21
22
|
"scope": {
|
|
22
23
|
"email": "الوصول إلى عنوان بريدك الإلكتروني",
|
|
23
24
|
"offline_access": "السماح للتطبيق بالوصول إلى بياناتك",
|