@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
|
@@ -1,523 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
-
|
|
3
|
-
import { DBModel } from '@/database/_deprecated/core/types/db';
|
|
4
|
-
import { CreateMessageParams, MessageModel } from '@/database/_deprecated/models/message';
|
|
5
|
-
import { DB_Message } from '@/database/_deprecated/schemas/message';
|
|
6
|
-
import { DB_Topic } from '@/database/_deprecated/schemas/topic';
|
|
7
|
-
import { nanoid } from '@/utils/uuid';
|
|
8
|
-
import * as uuidUtils from '@/utils/uuid';
|
|
9
|
-
|
|
10
|
-
import { CreateTopicParams, QueryTopicParams, TopicModel } from '../topic';
|
|
11
|
-
|
|
12
|
-
describe('TopicModel', () => {
|
|
13
|
-
let topicData: CreateTopicParams;
|
|
14
|
-
const currentSessionId = 'session1';
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
// Set up topic data with the correct structure
|
|
17
|
-
topicData = {
|
|
18
|
-
sessionId: currentSessionId,
|
|
19
|
-
title: 'Test Topic',
|
|
20
|
-
favorite: false,
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
afterEach(async () => {
|
|
25
|
-
// Clean up the database after each test
|
|
26
|
-
await TopicModel.clearTable();
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
describe('create', () => {
|
|
30
|
-
it('should create a topic record', async () => {
|
|
31
|
-
const result = await TopicModel.create(topicData);
|
|
32
|
-
|
|
33
|
-
expect(result).toHaveProperty('id');
|
|
34
|
-
// Verify that the topic has been added to the database
|
|
35
|
-
const topicInDb = await TopicModel.findById(result.id);
|
|
36
|
-
|
|
37
|
-
expect(topicInDb).toEqual(
|
|
38
|
-
expect.objectContaining({
|
|
39
|
-
title: topicData.title,
|
|
40
|
-
favorite: topicData.favorite ? 1 : 0,
|
|
41
|
-
sessionId: topicData.sessionId,
|
|
42
|
-
}),
|
|
43
|
-
);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should create a topic with favorite set to true', async () => {
|
|
47
|
-
const favoriteTopicData: CreateTopicParams = {
|
|
48
|
-
...topicData,
|
|
49
|
-
favorite: true,
|
|
50
|
-
};
|
|
51
|
-
const result = await TopicModel.create(favoriteTopicData);
|
|
52
|
-
|
|
53
|
-
expect(result).toHaveProperty('id');
|
|
54
|
-
const topicInDb = await TopicModel.findById(result.id);
|
|
55
|
-
expect(topicInDb).toEqual(
|
|
56
|
-
expect.objectContaining({
|
|
57
|
-
title: favoriteTopicData.title,
|
|
58
|
-
favorite: 1,
|
|
59
|
-
sessionId: favoriteTopicData.sessionId,
|
|
60
|
-
}),
|
|
61
|
-
);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('should update messages with the new topic id when messages are provided', async () => {
|
|
65
|
-
const messagesToUpdate = [nanoid(), nanoid()];
|
|
66
|
-
// 假设这些消息存在于数据库中
|
|
67
|
-
for (const messageId of messagesToUpdate) {
|
|
68
|
-
await MessageModel.table.add({ id: messageId, text: 'Sample message', topicId: null });
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const topicDataWithMessages = {
|
|
72
|
-
...topicData,
|
|
73
|
-
messages: messagesToUpdate,
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
const topic = await TopicModel.create(topicDataWithMessages);
|
|
77
|
-
expect(topic).toHaveProperty('id');
|
|
78
|
-
|
|
79
|
-
// 验证数据库中的消息是否已更新
|
|
80
|
-
const updatedMessages: DB_Message[] = await MessageModel.table
|
|
81
|
-
.where('id')
|
|
82
|
-
.anyOf(messagesToUpdate)
|
|
83
|
-
.toArray();
|
|
84
|
-
|
|
85
|
-
expect(updatedMessages).toHaveLength(messagesToUpdate.length);
|
|
86
|
-
for (const message of updatedMessages) {
|
|
87
|
-
expect(message.topicId).toEqual(topic.id);
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('should create a topic with a unique id when no id is provided', async () => {
|
|
92
|
-
const spy = vi.spyOn(uuidUtils, 'nanoid'); // 使用 Vitest 的 spy 功能来监视 nanoid 调用
|
|
93
|
-
const result = await TopicModel.create(topicData);
|
|
94
|
-
|
|
95
|
-
expect(spy).toHaveBeenCalled(); // 验证 nanoid 被调用来生成 id
|
|
96
|
-
expect(result).toHaveProperty('id');
|
|
97
|
-
expect(typeof result.id).toBe('string');
|
|
98
|
-
spy.mockRestore(); // 测试结束后恢复原始行为
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
describe('batch create', () => {
|
|
102
|
-
it('should batch create topic records', async () => {
|
|
103
|
-
const topicsToCreate = [topicData, topicData];
|
|
104
|
-
const results = await TopicModel.batchCreate(topicsToCreate);
|
|
105
|
-
|
|
106
|
-
expect(results.ids).toHaveLength(topicsToCreate.length);
|
|
107
|
-
// Verify that the topics have been added to the database
|
|
108
|
-
for (const result of results.ids!) {
|
|
109
|
-
const topicInDb = await TopicModel.findById(result);
|
|
110
|
-
expect(topicInDb).toEqual(
|
|
111
|
-
expect.objectContaining({
|
|
112
|
-
title: topicData.title,
|
|
113
|
-
favorite: topicData.favorite ? 1 : 0,
|
|
114
|
-
sessionId: topicData.sessionId,
|
|
115
|
-
}),
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it('should batch create topics with mixed favorite values', async () => {
|
|
121
|
-
const mixedTopicsData: CreateTopicParams[] = [
|
|
122
|
-
{ ...topicData, favorite: true },
|
|
123
|
-
{ ...topicData, favorite: false },
|
|
124
|
-
];
|
|
125
|
-
|
|
126
|
-
const results = await TopicModel.batchCreate(mixedTopicsData);
|
|
127
|
-
|
|
128
|
-
expect(results.ids).toHaveLength(mixedTopicsData.length);
|
|
129
|
-
for (const id of results.ids!) {
|
|
130
|
-
const topicInDb = await TopicModel.findById(id);
|
|
131
|
-
expect(topicInDb).toBeDefined();
|
|
132
|
-
expect(topicInDb.favorite).toBeGreaterThanOrEqual(0);
|
|
133
|
-
expect(topicInDb.favorite).toBeLessThanOrEqual(1);
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it('should query topics with pagination', async () => {
|
|
139
|
-
// Create multiple topics to test the query method
|
|
140
|
-
await TopicModel.batchCreate([topicData, topicData]);
|
|
141
|
-
|
|
142
|
-
const queryParams: QueryTopicParams = { pageSize: 1, current: 0, containerId: 'session1' };
|
|
143
|
-
const queriedTopics = await TopicModel.query(queryParams);
|
|
144
|
-
|
|
145
|
-
expect(queriedTopics).toHaveLength(1);
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
it('should find topics by session id', async () => {
|
|
149
|
-
// Create multiple topics to test the findBySessionId method
|
|
150
|
-
await TopicModel.batchCreate([topicData, topicData]);
|
|
151
|
-
|
|
152
|
-
const topicsBySessionId = await TopicModel.findBySessionId(topicData.sessionId);
|
|
153
|
-
|
|
154
|
-
expect(topicsBySessionId).toHaveLength(2);
|
|
155
|
-
expect(topicsBySessionId.every((i) => i.sessionId === topicData.sessionId)).toBeTruthy();
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('should delete a topic and its associated messages', async () => {
|
|
159
|
-
const createdTopic = await TopicModel.create(topicData);
|
|
160
|
-
|
|
161
|
-
await TopicModel.delete(createdTopic.id);
|
|
162
|
-
|
|
163
|
-
// Verify the topic and its related messages are deleted
|
|
164
|
-
const topicInDb = await TopicModel.findById(createdTopic.id);
|
|
165
|
-
expect(topicInDb).toBeUndefined();
|
|
166
|
-
|
|
167
|
-
// You need to verify that messages related to the topic are also deleted
|
|
168
|
-
// This would require additional setup to create messages associated with the topic
|
|
169
|
-
// and then assertions to check that they're deleted after the topic itself is deleted
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it('should batch delete topics by session id', async () => {
|
|
173
|
-
// Create multiple topics to test the batchDeleteBySessionId method
|
|
174
|
-
await TopicModel.batchCreate([topicData, topicData]);
|
|
175
|
-
|
|
176
|
-
await TopicModel.batchDeleteBySessionId(topicData.sessionId);
|
|
177
|
-
|
|
178
|
-
// Verify that all topics with the given session id are deleted
|
|
179
|
-
const topicsInDb = await TopicModel.findBySessionId(topicData.sessionId);
|
|
180
|
-
expect(topicsInDb).toHaveLength(0);
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
it('should update a topic', async () => {
|
|
184
|
-
const createdTopic = await TopicModel.create(topicData);
|
|
185
|
-
const updateData = { title: 'New Title' };
|
|
186
|
-
|
|
187
|
-
await TopicModel.update(createdTopic.id, updateData);
|
|
188
|
-
const updatedTopic = await TopicModel.findById(createdTopic.id);
|
|
189
|
-
|
|
190
|
-
expect(updatedTopic).toHaveProperty('title', 'New Title');
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
describe('toggleFavorite', () => {
|
|
194
|
-
it('should toggle favorite status of a topic', async () => {
|
|
195
|
-
const createdTopic = await TopicModel.create(topicData);
|
|
196
|
-
|
|
197
|
-
const newState = await TopicModel.toggleFavorite(createdTopic.id);
|
|
198
|
-
|
|
199
|
-
expect(newState).toBe(true);
|
|
200
|
-
const topicInDb = await TopicModel.findById(createdTopic.id);
|
|
201
|
-
expect(topicInDb).toHaveProperty('favorite', 1);
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it('should handle toggleFavorite when topic does not exist', async () => {
|
|
205
|
-
const nonExistentTopicId = 'non-existent-id';
|
|
206
|
-
await expect(TopicModel.toggleFavorite(nonExistentTopicId)).rejects.toThrow(
|
|
207
|
-
`Topic with id ${nonExistentTopicId} not found`,
|
|
208
|
-
);
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
it('should set favorite to specific state using toggleFavorite', async () => {
|
|
212
|
-
const createdTopic = await TopicModel.create(topicData);
|
|
213
|
-
|
|
214
|
-
// Set favorite to true regardless of current state
|
|
215
|
-
await TopicModel.toggleFavorite(createdTopic.id, true);
|
|
216
|
-
let topicInDb = await TopicModel.findById(createdTopic.id);
|
|
217
|
-
expect(topicInDb.favorite).toBe(1);
|
|
218
|
-
|
|
219
|
-
// Set favorite to false regardless of current state
|
|
220
|
-
await TopicModel.toggleFavorite(createdTopic.id, false);
|
|
221
|
-
topicInDb = await TopicModel.findById(createdTopic.id);
|
|
222
|
-
expect(topicInDb.favorite).toBe(0);
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it('should delete a topic and its associated messages', async () => {
|
|
227
|
-
// 创建话题和相关联的消息
|
|
228
|
-
const createdTopic = await TopicModel.create(topicData);
|
|
229
|
-
const messageData: CreateMessageParams = {
|
|
230
|
-
content: 'Test Message',
|
|
231
|
-
topicId: createdTopic.id,
|
|
232
|
-
sessionId: topicData.sessionId,
|
|
233
|
-
role: 'user',
|
|
234
|
-
};
|
|
235
|
-
await MessageModel.create(messageData);
|
|
236
|
-
|
|
237
|
-
// 删除话题
|
|
238
|
-
await TopicModel.delete(createdTopic.id);
|
|
239
|
-
|
|
240
|
-
// 验证话题是否被删除
|
|
241
|
-
const topicInDb = await TopicModel.findById(createdTopic.id);
|
|
242
|
-
expect(topicInDb).toBeUndefined();
|
|
243
|
-
|
|
244
|
-
// 验证与话题关联的消息是否也被删除
|
|
245
|
-
const messagesInDb = await MessageModel.query({
|
|
246
|
-
sessionId: topicData.sessionId,
|
|
247
|
-
topicId: createdTopic.id,
|
|
248
|
-
});
|
|
249
|
-
expect(messagesInDb).toHaveLength(0);
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
it('should batch delete topics and their associated messages', async () => {
|
|
253
|
-
// 创建多个话题和相关联的消息
|
|
254
|
-
const createdTopic1 = await TopicModel.create(topicData);
|
|
255
|
-
const createdTopic2 = await TopicModel.create(topicData);
|
|
256
|
-
|
|
257
|
-
const messageData1: CreateMessageParams = {
|
|
258
|
-
content: 'Test Message 1',
|
|
259
|
-
topicId: createdTopic1.id,
|
|
260
|
-
sessionId: topicData.sessionId,
|
|
261
|
-
role: 'user',
|
|
262
|
-
};
|
|
263
|
-
const messageData2: CreateMessageParams = {
|
|
264
|
-
content: 'Test Message 2',
|
|
265
|
-
topicId: createdTopic2.id,
|
|
266
|
-
sessionId: topicData.sessionId,
|
|
267
|
-
role: 'user',
|
|
268
|
-
};
|
|
269
|
-
await MessageModel.create(messageData1);
|
|
270
|
-
await MessageModel.create(messageData2);
|
|
271
|
-
|
|
272
|
-
// 执行批量删除
|
|
273
|
-
await TopicModel.batchDelete([createdTopic1.id, createdTopic2.id]);
|
|
274
|
-
|
|
275
|
-
// 验证话题是否被删除
|
|
276
|
-
const topicInDb1 = await TopicModel.findById(createdTopic1.id);
|
|
277
|
-
const topicInDb2 = await TopicModel.findById(createdTopic2.id);
|
|
278
|
-
expect(topicInDb1).toBeUndefined();
|
|
279
|
-
expect(topicInDb2).toBeUndefined();
|
|
280
|
-
|
|
281
|
-
// 验证与话题关联的消息是否也被删除
|
|
282
|
-
const messagesInDb1 = await MessageModel.query({
|
|
283
|
-
sessionId: topicData.sessionId,
|
|
284
|
-
topicId: createdTopic1.id,
|
|
285
|
-
});
|
|
286
|
-
const messagesInDb2 = await MessageModel.query({
|
|
287
|
-
sessionId: topicData.sessionId,
|
|
288
|
-
topicId: createdTopic2.id,
|
|
289
|
-
});
|
|
290
|
-
expect(messagesInDb1).toHaveLength(0);
|
|
291
|
-
expect(messagesInDb2).toHaveLength(0);
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
describe('duplicateTopic', () => {
|
|
295
|
-
let originalTopic: DBModel<DB_Topic>;
|
|
296
|
-
let originalMessages: any[];
|
|
297
|
-
|
|
298
|
-
beforeEach(async () => {
|
|
299
|
-
// 创建一个原始主题
|
|
300
|
-
const { id } = await TopicModel.create({
|
|
301
|
-
title: 'Original Topic',
|
|
302
|
-
sessionId: 'session1',
|
|
303
|
-
favorite: false,
|
|
304
|
-
});
|
|
305
|
-
originalTopic = await TopicModel.findById(id);
|
|
306
|
-
|
|
307
|
-
// 创建一些关联到原始主题的消息
|
|
308
|
-
originalMessages = await Promise.all(
|
|
309
|
-
['Message 1', 'Message 2'].map((text) =>
|
|
310
|
-
MessageModel.create({
|
|
311
|
-
content: text,
|
|
312
|
-
topicId: originalTopic.id,
|
|
313
|
-
sessionId: originalTopic.sessionId!,
|
|
314
|
-
role: 'user',
|
|
315
|
-
}),
|
|
316
|
-
),
|
|
317
|
-
);
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
afterEach(async () => {
|
|
321
|
-
// 清理数据库中的所有主题和消息
|
|
322
|
-
await TopicModel.clearTable();
|
|
323
|
-
await MessageModel.clearTable();
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
it('should duplicate a topic with all associated messages', async () => {
|
|
327
|
-
// 执行复制操作
|
|
328
|
-
await TopicModel.duplicateTopic(originalTopic.id);
|
|
329
|
-
|
|
330
|
-
// 验证复制后的主题是否存在
|
|
331
|
-
const duplicatedTopic = await TopicModel.findBySessionId(originalTopic.sessionId!);
|
|
332
|
-
expect(duplicatedTopic).toHaveLength(2);
|
|
333
|
-
|
|
334
|
-
// 验证复制后的消息是否存在
|
|
335
|
-
const duplicatedMessages = await MessageModel.query({
|
|
336
|
-
sessionId: originalTopic.sessionId!,
|
|
337
|
-
topicId: duplicatedTopic[1].id, // 假设复制的主题是第二个
|
|
338
|
-
});
|
|
339
|
-
expect(duplicatedMessages).toHaveLength(originalMessages.length);
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
it('should throw an error if the topic does not exist', async () => {
|
|
343
|
-
// 尝试复制一个不存在的主题
|
|
344
|
-
const nonExistentTopicId = nanoid();
|
|
345
|
-
await expect(TopicModel.duplicateTopic(nonExistentTopicId)).rejects.toThrow(
|
|
346
|
-
`Topic with id ${nonExistentTopicId} not found`,
|
|
347
|
-
);
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
it('should preserve the properties of the duplicated topic', async () => {
|
|
351
|
-
// 执行复制操作
|
|
352
|
-
await TopicModel.duplicateTopic(originalTopic.id);
|
|
353
|
-
|
|
354
|
-
// 获取复制的主题
|
|
355
|
-
const topics = await TopicModel.findBySessionId(originalTopic.sessionId!);
|
|
356
|
-
const duplicatedTopic = topics.find((topic) => topic.id !== originalTopic.id);
|
|
357
|
-
|
|
358
|
-
// 验证复制的主题是否保留了原始主题的属性
|
|
359
|
-
expect(duplicatedTopic).toBeDefined();
|
|
360
|
-
expect(duplicatedTopic).toMatchObject({
|
|
361
|
-
title: originalTopic.title,
|
|
362
|
-
favorite: originalTopic.favorite,
|
|
363
|
-
sessionId: originalTopic.sessionId,
|
|
364
|
-
});
|
|
365
|
-
// 确保生成了新的 ID
|
|
366
|
-
expect(duplicatedTopic.id).not.toBe(originalTopic.id);
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
it('should properly handle the messages hierarchy when duplicating', async () => {
|
|
370
|
-
// 创建一个子消息关联到其中一个原始消息
|
|
371
|
-
const { id } = await MessageModel.create({
|
|
372
|
-
content: 'Child Message',
|
|
373
|
-
topicId: originalTopic.id,
|
|
374
|
-
parentId: originalMessages[0].id,
|
|
375
|
-
sessionId: originalTopic.sessionId!,
|
|
376
|
-
role: 'user',
|
|
377
|
-
});
|
|
378
|
-
const childMessage = await MessageModel.findById(id);
|
|
379
|
-
|
|
380
|
-
// 执行复制操作
|
|
381
|
-
await TopicModel.duplicateTopic(originalTopic.id);
|
|
382
|
-
|
|
383
|
-
// 获取复制的消息
|
|
384
|
-
const duplicatedMessages = await MessageModel.queryBySessionId(originalTopic.sessionId!);
|
|
385
|
-
|
|
386
|
-
// 验证复制的子消息是否存在并且 parentId 已更新
|
|
387
|
-
const duplicatedChildMessage = duplicatedMessages.find(
|
|
388
|
-
(message) => message.content === childMessage.content && message.id !== childMessage.id,
|
|
389
|
-
);
|
|
390
|
-
|
|
391
|
-
expect(duplicatedChildMessage).toBeDefined();
|
|
392
|
-
expect(duplicatedChildMessage.parentId).not.toBe(childMessage.parentId);
|
|
393
|
-
expect(duplicatedChildMessage.parentId).toBeDefined();
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
it('should fail if the database transaction fails', async () => {
|
|
397
|
-
// 强制数据库事务失败,例如通过在复制过程中抛出异常
|
|
398
|
-
const dbTransactionFailedError = new Error('DB transaction failed');
|
|
399
|
-
const spyOn = vi.spyOn(TopicModel['db'], 'transaction').mockImplementation((async () => {
|
|
400
|
-
throw dbTransactionFailedError;
|
|
401
|
-
}) as any);
|
|
402
|
-
|
|
403
|
-
// 尝试复制主题并捕捉期望的错误
|
|
404
|
-
await expect(TopicModel.duplicateTopic(originalTopic.id)).rejects.toThrow(
|
|
405
|
-
dbTransactionFailedError,
|
|
406
|
-
);
|
|
407
|
-
spyOn.mockRestore();
|
|
408
|
-
});
|
|
409
|
-
|
|
410
|
-
it('should not create partial duplicates if the process fails at some point', async () => {
|
|
411
|
-
// 假设复制消息的过程中发生了错误
|
|
412
|
-
vi.spyOn(MessageModel, 'duplicateMessages').mockImplementation(async () => {
|
|
413
|
-
throw new Error('Failed to duplicate messages');
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
// 尝试复制主题,期望会抛出错误
|
|
417
|
-
await expect(TopicModel.duplicateTopic(originalTopic.id)).rejects.toThrow();
|
|
418
|
-
|
|
419
|
-
// 确保没有创建任何副本
|
|
420
|
-
const topics = await TopicModel.findBySessionId(originalTopic.sessionId!);
|
|
421
|
-
expect(topics).toHaveLength(1); // 只有原始主题
|
|
422
|
-
|
|
423
|
-
const messages = await MessageModel.queryBySessionId(originalTopic.sessionId!);
|
|
424
|
-
expect(messages).toHaveLength(originalMessages.length); // 只有原始消息
|
|
425
|
-
});
|
|
426
|
-
});
|
|
427
|
-
|
|
428
|
-
describe('clearTable', () => {
|
|
429
|
-
it('should clear the table', async () => {
|
|
430
|
-
// Create a topic to ensure the table is not empty
|
|
431
|
-
await TopicModel.create(topicData);
|
|
432
|
-
|
|
433
|
-
// Clear the table
|
|
434
|
-
await TopicModel.clearTable();
|
|
435
|
-
|
|
436
|
-
// Verify the table is empty
|
|
437
|
-
const topics = await TopicModel.queryAll();
|
|
438
|
-
expect(topics).toHaveLength(0);
|
|
439
|
-
});
|
|
440
|
-
});
|
|
441
|
-
|
|
442
|
-
describe('update', () => {
|
|
443
|
-
it('should update a topic', async () => {
|
|
444
|
-
// Create a topic
|
|
445
|
-
const createdTopic = await TopicModel.create(topicData);
|
|
446
|
-
|
|
447
|
-
// Update the topic
|
|
448
|
-
const newTitle = 'Updated Title';
|
|
449
|
-
await TopicModel.update(createdTopic.id, { title: newTitle });
|
|
450
|
-
|
|
451
|
-
// Verify the topic is updated
|
|
452
|
-
const updatedTopic = await TopicModel.findById(createdTopic.id);
|
|
453
|
-
expect(updatedTopic.title).toBe(newTitle);
|
|
454
|
-
});
|
|
455
|
-
});
|
|
456
|
-
|
|
457
|
-
describe('batchDelete', () => {
|
|
458
|
-
it('should batch delete topics', async () => {
|
|
459
|
-
// Create multiple topics
|
|
460
|
-
const topic1 = await TopicModel.create(topicData);
|
|
461
|
-
const topic2 = await TopicModel.create(topicData);
|
|
462
|
-
|
|
463
|
-
await TopicModel.create(topicData);
|
|
464
|
-
|
|
465
|
-
const ids = [topic1.id, topic2.id];
|
|
466
|
-
// Batch delete the topics
|
|
467
|
-
await TopicModel.batchDelete(ids);
|
|
468
|
-
|
|
469
|
-
expect(await TopicModel.table.count()).toEqual(1);
|
|
470
|
-
});
|
|
471
|
-
});
|
|
472
|
-
|
|
473
|
-
describe('queryAll', () => {
|
|
474
|
-
it('should query all topics', async () => {
|
|
475
|
-
// Create multiple topics
|
|
476
|
-
await TopicModel.batchCreate([topicData, topicData]);
|
|
477
|
-
|
|
478
|
-
// Query all topics
|
|
479
|
-
const topics = await TopicModel.queryAll();
|
|
480
|
-
|
|
481
|
-
// Verify all topics are queried
|
|
482
|
-
expect(topics).toHaveLength(2);
|
|
483
|
-
});
|
|
484
|
-
});
|
|
485
|
-
|
|
486
|
-
describe('queryByKeyword', () => {
|
|
487
|
-
it('should query global topics by keyword', async () => {
|
|
488
|
-
// Create a topic with a unique title
|
|
489
|
-
const uniqueTitle = 'Unique Title';
|
|
490
|
-
await TopicModel.create({ ...topicData, title: uniqueTitle });
|
|
491
|
-
|
|
492
|
-
// Query topics by the unique title
|
|
493
|
-
const topics = await TopicModel.queryByKeyword(uniqueTitle);
|
|
494
|
-
|
|
495
|
-
// Verify the correct topic is queried
|
|
496
|
-
expect(topics).toHaveLength(1);
|
|
497
|
-
expect(topics[0].title).toBe(uniqueTitle);
|
|
498
|
-
});
|
|
499
|
-
it('should query topics in current session by keyword', async () => {
|
|
500
|
-
// Create a topic with a unique title
|
|
501
|
-
const uniqueTitle = 'Unique Title';
|
|
502
|
-
await TopicModel.create({ ...topicData, title: uniqueTitle });
|
|
503
|
-
|
|
504
|
-
// Query topics by the unique title
|
|
505
|
-
const topics = await TopicModel.queryByKeyword(uniqueTitle, currentSessionId);
|
|
506
|
-
|
|
507
|
-
// Verify the correct topic is queried
|
|
508
|
-
expect(topics).toHaveLength(1);
|
|
509
|
-
expect(topics[0].title).toBe(uniqueTitle);
|
|
510
|
-
});
|
|
511
|
-
it('should not query any topic in other session by keyword', async () => {
|
|
512
|
-
// Create a topic with a unique title
|
|
513
|
-
const uniqueTitle = 'Unique Title';
|
|
514
|
-
await TopicModel.create({ ...topicData, title: uniqueTitle });
|
|
515
|
-
|
|
516
|
-
// Query topics by the unique title
|
|
517
|
-
const topics = await TopicModel.queryByKeyword(uniqueTitle, 'session-id-2');
|
|
518
|
-
|
|
519
|
-
// Verify the correct topic is queried
|
|
520
|
-
expect(topics).toHaveLength(0);
|
|
521
|
-
});
|
|
522
|
-
});
|
|
523
|
-
});
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
-
|
|
3
|
-
import { UserModel } from '../user';
|
|
4
|
-
|
|
5
|
-
describe('UserModel', () => {
|
|
6
|
-
let userData: any;
|
|
7
|
-
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
// Set up user data with the correct structure
|
|
10
|
-
userData = {
|
|
11
|
-
uuid: 'user1',
|
|
12
|
-
settings: {},
|
|
13
|
-
avatar: 'avatar.png',
|
|
14
|
-
};
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
afterEach(async () => {
|
|
18
|
-
// Clean up the database after each test
|
|
19
|
-
await UserModel.clear();
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('should create a user record', async () => {
|
|
23
|
-
const result = await UserModel.create(userData);
|
|
24
|
-
|
|
25
|
-
expect(result).toEqual(1);
|
|
26
|
-
// Verify that the user has been added to the database
|
|
27
|
-
const userInDb = await UserModel.getUser();
|
|
28
|
-
|
|
29
|
-
expect(userInDb).toEqual(
|
|
30
|
-
expect.objectContaining({
|
|
31
|
-
uuid: userData.uuid,
|
|
32
|
-
settings: userData.settings,
|
|
33
|
-
avatar: userData.avatar,
|
|
34
|
-
}),
|
|
35
|
-
);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('should update a user record', async () => {
|
|
39
|
-
const result = await UserModel.create(userData);
|
|
40
|
-
|
|
41
|
-
const newAvatar = 'new_avatar.png';
|
|
42
|
-
await UserModel.updateAvatar(newAvatar);
|
|
43
|
-
|
|
44
|
-
const userInDb = await UserModel.getUser();
|
|
45
|
-
|
|
46
|
-
expect(userInDb).toHaveProperty('avatar', newAvatar);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('should update user settings', async () => {
|
|
50
|
-
await UserModel.create(userData);
|
|
51
|
-
|
|
52
|
-
await UserModel.updateSettings({ general: { themeMode: 'dark' } });
|
|
53
|
-
|
|
54
|
-
const userInDb = await UserModel.getUser();
|
|
55
|
-
|
|
56
|
-
expect(userInDb).toHaveProperty('settings', {
|
|
57
|
-
general: { themeMode: 'dark' },
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('should reset user settings', async () => {
|
|
62
|
-
await UserModel.create(userData);
|
|
63
|
-
|
|
64
|
-
await UserModel.updateSettings({ general: { themeMode: 'dark' } });
|
|
65
|
-
|
|
66
|
-
await UserModel.resetSettings();
|
|
67
|
-
|
|
68
|
-
const userInDb = await UserModel.getUser();
|
|
69
|
-
|
|
70
|
-
expect(userInDb.settings).toBeUndefined();
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('should clear the user table', async () => {
|
|
74
|
-
await UserModel.create(userData);
|
|
75
|
-
|
|
76
|
-
await UserModel.clear();
|
|
77
|
-
|
|
78
|
-
const userInDb = await UserModel.table.count();
|
|
79
|
-
|
|
80
|
-
expect(userInDb).toEqual(0);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { DBModel } from '@/database/_deprecated/core/types/db';
|
|
2
|
-
import { DB_File, DB_FileSchema } from '@/database/_deprecated/schemas/files';
|
|
3
|
-
import { clientS3Storage } from '@/services/file/ClientS3';
|
|
4
|
-
import { nanoid } from '@/utils/uuid';
|
|
5
|
-
|
|
6
|
-
import { BaseModel } from '../core';
|
|
7
|
-
|
|
8
|
-
class _FileModel extends BaseModel<'files'> {
|
|
9
|
-
constructor() {
|
|
10
|
-
super('files', DB_FileSchema);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
async create(file: DB_File) {
|
|
14
|
-
const id = nanoid();
|
|
15
|
-
|
|
16
|
-
return this._addWithSync(file, `file-${id}`);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
async findById(id: string): Promise<DBModel<DB_File> | undefined> {
|
|
20
|
-
const item = await this.table.get(id);
|
|
21
|
-
if (!item) return;
|
|
22
|
-
|
|
23
|
-
// arrayBuffer to url
|
|
24
|
-
let base64;
|
|
25
|
-
if (!item.data) {
|
|
26
|
-
const hash = (item.url as string).replace('client-s3://', '');
|
|
27
|
-
base64 = await this.getBase64ByFileHash(hash);
|
|
28
|
-
} else {
|
|
29
|
-
base64 = Buffer.from(item.data).toString('base64');
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return { ...item, base64, url: `data:${item.fileType};base64,${base64}` };
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
async delete(id: string) {
|
|
36
|
-
return this.table.delete(id);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async clear() {
|
|
40
|
-
return this.table.clear();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
private async getBase64ByFileHash(hash: string) {
|
|
44
|
-
const fileItem = await clientS3Storage.getObject(hash);
|
|
45
|
-
if (!fileItem) throw new Error('file not found');
|
|
46
|
-
|
|
47
|
-
return Buffer.from(await fileItem.arrayBuffer()).toString('base64');
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export const FileModel = new _FileModel();
|