@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
|
@@ -72,7 +72,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
72
72
|
it('should create message with correct sessionId and topicId', async () => {
|
|
73
73
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
74
74
|
|
|
75
|
-
const
|
|
75
|
+
const result = await caller.createNewMessage({
|
|
76
76
|
content: 'Test message',
|
|
77
77
|
role: 'user',
|
|
78
78
|
sessionId: testSessionId,
|
|
@@ -83,11 +83,11 @@ describe('Message Router Integration Tests', () => {
|
|
|
83
83
|
const [createdMessage] = await serverDB
|
|
84
84
|
.select()
|
|
85
85
|
.from(messages)
|
|
86
|
-
.where(eq(messages.id,
|
|
86
|
+
.where(eq(messages.id, result.id));
|
|
87
87
|
|
|
88
88
|
expect(createdMessage).toBeDefined();
|
|
89
89
|
expect(createdMessage).toMatchObject({
|
|
90
|
-
id:
|
|
90
|
+
id: result.id,
|
|
91
91
|
sessionId: testSessionId,
|
|
92
92
|
topicId: testTopicId,
|
|
93
93
|
userId: userId,
|
|
@@ -101,7 +101,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
101
101
|
|
|
102
102
|
// 先创建 thread
|
|
103
103
|
const { threads } = await import('@/database/schemas');
|
|
104
|
-
const [thread] = await serverDB
|
|
104
|
+
const [thread] = (await serverDB
|
|
105
105
|
.insert(threads)
|
|
106
106
|
.values({
|
|
107
107
|
userId,
|
|
@@ -109,9 +109,9 @@ describe('Message Router Integration Tests', () => {
|
|
|
109
109
|
sourceMessageId: 'msg-source',
|
|
110
110
|
type: 'continuation', // type is required
|
|
111
111
|
})
|
|
112
|
-
.returning();
|
|
112
|
+
.returning()) as any;
|
|
113
113
|
|
|
114
|
-
const
|
|
114
|
+
const result = await caller.createNewMessage({
|
|
115
115
|
content: 'Test message in thread',
|
|
116
116
|
role: 'user',
|
|
117
117
|
sessionId: testSessionId,
|
|
@@ -123,12 +123,12 @@ describe('Message Router Integration Tests', () => {
|
|
|
123
123
|
const [createdMessage] = await serverDB
|
|
124
124
|
.select()
|
|
125
125
|
.from(messages)
|
|
126
|
-
.where(eq(messages.id,
|
|
126
|
+
.where(eq(messages.id, result.id));
|
|
127
127
|
|
|
128
128
|
expect(createdMessage).toBeDefined();
|
|
129
129
|
expect(createdMessage.threadId).toBe(thread.id);
|
|
130
130
|
expect(createdMessage).toMatchObject({
|
|
131
|
-
id:
|
|
131
|
+
id: result.id,
|
|
132
132
|
sessionId: testSessionId,
|
|
133
133
|
topicId: testTopicId,
|
|
134
134
|
threadId: thread.id,
|
|
@@ -140,7 +140,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
140
140
|
it('should create message without topicId', async () => {
|
|
141
141
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
142
142
|
|
|
143
|
-
const
|
|
143
|
+
const result = await caller.createNewMessage({
|
|
144
144
|
content: 'Test message without topic',
|
|
145
145
|
role: 'user',
|
|
146
146
|
sessionId: testSessionId,
|
|
@@ -150,7 +150,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
150
150
|
const [createdMessage] = await serverDB
|
|
151
151
|
.select()
|
|
152
152
|
.from(messages)
|
|
153
|
-
.where(eq(messages.id,
|
|
153
|
+
.where(eq(messages.id, result.id));
|
|
154
154
|
|
|
155
155
|
expect(createdMessage.topicId).toBeNull();
|
|
156
156
|
expect(createdMessage.sessionId).toBe(testSessionId);
|
|
@@ -160,7 +160,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
160
160
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
161
161
|
|
|
162
162
|
await expect(
|
|
163
|
-
caller.
|
|
163
|
+
caller.createNewMessage({
|
|
164
164
|
content: 'Test message',
|
|
165
165
|
role: 'user',
|
|
166
166
|
sessionId: 'non-existent-session',
|
|
@@ -192,7 +192,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
192
192
|
|
|
193
193
|
// 尝试在 testSessionId 下创建消息,但使用 anotherTopic 的 ID
|
|
194
194
|
await expect(
|
|
195
|
-
caller.
|
|
195
|
+
caller.createNewMessage({
|
|
196
196
|
content: 'Test message',
|
|
197
197
|
role: 'user',
|
|
198
198
|
sessionId: testSessionId,
|
|
@@ -207,13 +207,13 @@ describe('Message Router Integration Tests', () => {
|
|
|
207
207
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
208
208
|
|
|
209
209
|
// 创建多个消息
|
|
210
|
-
const
|
|
210
|
+
const msg1Result = await caller.createNewMessage({
|
|
211
211
|
content: 'Message 1',
|
|
212
212
|
role: 'user',
|
|
213
213
|
sessionId: testSessionId,
|
|
214
214
|
});
|
|
215
215
|
|
|
216
|
-
const
|
|
216
|
+
const msg2Result = await caller.createNewMessage({
|
|
217
217
|
content: 'Message 2',
|
|
218
218
|
role: 'assistant',
|
|
219
219
|
sessionId: testSessionId,
|
|
@@ -228,7 +228,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
228
228
|
})
|
|
229
229
|
.returning();
|
|
230
230
|
|
|
231
|
-
await caller.
|
|
231
|
+
await caller.createNewMessage({
|
|
232
232
|
content: 'Message in another session',
|
|
233
233
|
role: 'user',
|
|
234
234
|
sessionId: anotherSession.id,
|
|
@@ -240,15 +240,15 @@ describe('Message Router Integration Tests', () => {
|
|
|
240
240
|
});
|
|
241
241
|
|
|
242
242
|
expect(result).toHaveLength(2);
|
|
243
|
-
expect(result.map((m) => m.id)).toContain(
|
|
244
|
-
expect(result.map((m) => m.id)).toContain(
|
|
243
|
+
expect(result.map((m) => m.id)).toContain(msg1Result.id);
|
|
244
|
+
expect(result.map((m) => m.id)).toContain(msg2Result.id);
|
|
245
245
|
});
|
|
246
246
|
|
|
247
247
|
it('should return messages filtered by topicId', async () => {
|
|
248
248
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
249
249
|
|
|
250
250
|
// 在 topic 中创建消息
|
|
251
|
-
const
|
|
251
|
+
const msgInTopicResult = await caller.createNewMessage({
|
|
252
252
|
content: 'Message in topic',
|
|
253
253
|
role: 'user',
|
|
254
254
|
sessionId: testSessionId,
|
|
@@ -256,7 +256,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
256
256
|
});
|
|
257
257
|
|
|
258
258
|
// 在 session 中创建消息(不在 topic 中)
|
|
259
|
-
await caller.
|
|
259
|
+
await caller.createNewMessage({
|
|
260
260
|
content: 'Message without topic',
|
|
261
261
|
role: 'user',
|
|
262
262
|
sessionId: testSessionId,
|
|
@@ -269,7 +269,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
269
269
|
});
|
|
270
270
|
|
|
271
271
|
expect(result).toHaveLength(1);
|
|
272
|
-
expect(result[0].id).toBe(
|
|
272
|
+
expect(result[0].id).toBe(msgInTopicResult.id);
|
|
273
273
|
expect(result[0].topicId).toBe(testTopicId);
|
|
274
274
|
});
|
|
275
275
|
|
|
@@ -278,7 +278,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
278
278
|
|
|
279
279
|
// 创建多个消息
|
|
280
280
|
for (let i = 0; i < 5; i++) {
|
|
281
|
-
await caller.
|
|
281
|
+
await caller.createNewMessage({
|
|
282
282
|
content: `Pagination test message ${i}`,
|
|
283
283
|
role: 'user',
|
|
284
284
|
sessionId: testSessionId,
|
|
@@ -316,46 +316,73 @@ describe('Message Router Integration Tests', () => {
|
|
|
316
316
|
expect(page1Ids).not.toEqual(page2Ids);
|
|
317
317
|
}
|
|
318
318
|
});
|
|
319
|
-
});
|
|
320
319
|
|
|
321
|
-
|
|
322
|
-
it('should create multiple messages in batch', async () => {
|
|
320
|
+
it('should return messages filtered by groupId', async () => {
|
|
323
321
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
324
322
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
sessionId: testSessionId,
|
|
335
|
-
},
|
|
336
|
-
{
|
|
337
|
-
content: 'Batch message 3',
|
|
338
|
-
role: 'user' as const,
|
|
339
|
-
sessionId: testSessionId,
|
|
340
|
-
topicId: testTopicId,
|
|
341
|
-
},
|
|
342
|
-
];
|
|
323
|
+
// 首先创建一个 chat_group
|
|
324
|
+
const { chatGroups } = await import('@/database/schemas');
|
|
325
|
+
const [chatGroup] = await serverDB
|
|
326
|
+
.insert(chatGroups)
|
|
327
|
+
.values({
|
|
328
|
+
userId,
|
|
329
|
+
title: 'Test Chat Group',
|
|
330
|
+
})
|
|
331
|
+
.returning();
|
|
343
332
|
|
|
344
|
-
|
|
333
|
+
// 创建消息并设置 groupId
|
|
334
|
+
const msg1 = await caller.createNewMessage({
|
|
335
|
+
content: 'Message 1 in group',
|
|
336
|
+
role: 'assistant',
|
|
337
|
+
sessionId: testSessionId,
|
|
338
|
+
});
|
|
345
339
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
340
|
+
await serverDB
|
|
341
|
+
.update(messages)
|
|
342
|
+
.set({ groupId: chatGroup.id })
|
|
343
|
+
.where(eq(messages.id, msg1.id));
|
|
349
344
|
|
|
350
|
-
//
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
345
|
+
// 创建不在 group 中的消息
|
|
346
|
+
await caller.createNewMessage({
|
|
347
|
+
content: 'Message without group',
|
|
348
|
+
role: 'user',
|
|
349
|
+
sessionId: testSessionId,
|
|
350
|
+
});
|
|
355
351
|
|
|
356
|
-
|
|
357
|
-
const
|
|
358
|
-
|
|
352
|
+
// 查询 group 中的消息
|
|
353
|
+
const result = await caller.getMessages({
|
|
354
|
+
sessionId: testSessionId,
|
|
355
|
+
groupId: chatGroup.id,
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
expect(result).toHaveLength(1);
|
|
359
|
+
expect(result[0].id).toBe(msg1.id);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
it('should support useGroup parameter', async () => {
|
|
363
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
364
|
+
|
|
365
|
+
// 创建多个消息
|
|
366
|
+
await caller.createNewMessage({
|
|
367
|
+
content: 'Message 1',
|
|
368
|
+
role: 'assistant',
|
|
369
|
+
sessionId: testSessionId,
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
await caller.createNewMessage({
|
|
373
|
+
content: 'Message 2',
|
|
374
|
+
role: 'assistant',
|
|
375
|
+
sessionId: testSessionId,
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
// useGroup 参数应该影响消息分组展示
|
|
379
|
+
const result = await caller.getMessages({
|
|
380
|
+
sessionId: testSessionId,
|
|
381
|
+
useGroup: true,
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
expect(result).toBeDefined();
|
|
385
|
+
expect(Array.isArray(result)).toBe(true);
|
|
359
386
|
});
|
|
360
387
|
});
|
|
361
388
|
|
|
@@ -364,20 +391,20 @@ describe('Message Router Integration Tests', () => {
|
|
|
364
391
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
365
392
|
|
|
366
393
|
// 创建消息
|
|
367
|
-
const
|
|
394
|
+
const msg1Result = await caller.createNewMessage({
|
|
368
395
|
content: 'Message 1',
|
|
369
396
|
role: 'user',
|
|
370
397
|
sessionId: testSessionId,
|
|
371
398
|
});
|
|
372
399
|
|
|
373
|
-
const
|
|
400
|
+
const msg2Result = await caller.createNewMessage({
|
|
374
401
|
content: 'Message 2',
|
|
375
402
|
role: 'user',
|
|
376
403
|
sessionId: testSessionId,
|
|
377
404
|
});
|
|
378
405
|
|
|
379
406
|
// 删除消息
|
|
380
|
-
await caller.removeMessages({ ids: [
|
|
407
|
+
await caller.removeMessages({ ids: [msg1Result.id, msg2Result.id] });
|
|
381
408
|
|
|
382
409
|
// 验证消息已删除
|
|
383
410
|
const remainingMessages = await serverDB
|
|
@@ -387,6 +414,160 @@ describe('Message Router Integration Tests', () => {
|
|
|
387
414
|
|
|
388
415
|
expect(remainingMessages).toHaveLength(0);
|
|
389
416
|
});
|
|
417
|
+
|
|
418
|
+
it('should return message list when sessionId is provided', async () => {
|
|
419
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
420
|
+
|
|
421
|
+
// 创建消息
|
|
422
|
+
const msg1Result = await caller.createNewMessage({
|
|
423
|
+
content: 'Message 1',
|
|
424
|
+
role: 'user',
|
|
425
|
+
sessionId: testSessionId,
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
const msg2Result = await caller.createNewMessage({
|
|
429
|
+
content: 'Message 2',
|
|
430
|
+
role: 'user',
|
|
431
|
+
sessionId: testSessionId,
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
const msg3Result = await caller.createNewMessage({
|
|
435
|
+
content: 'Message 3',
|
|
436
|
+
role: 'user',
|
|
437
|
+
sessionId: testSessionId,
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
// 删除消息并返回列表
|
|
441
|
+
const result = await caller.removeMessages({
|
|
442
|
+
ids: [msg1Result.id],
|
|
443
|
+
sessionId: testSessionId,
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
expect(result.success).toBe(true);
|
|
447
|
+
expect(result.messages).toBeDefined();
|
|
448
|
+
expect(result.messages).toHaveLength(2);
|
|
449
|
+
expect(result.messages?.map((m) => m.id)).toContain(msg2Result.id);
|
|
450
|
+
expect(result.messages?.map((m) => m.id)).toContain(msg3Result.id);
|
|
451
|
+
});
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
describe('removeMessage', () => {
|
|
455
|
+
it('should remove a single message', async () => {
|
|
456
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
457
|
+
|
|
458
|
+
const msgResult = await caller.createNewMessage({
|
|
459
|
+
content: 'Message to remove',
|
|
460
|
+
role: 'user',
|
|
461
|
+
sessionId: testSessionId,
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
await caller.removeMessage({ id: msgResult.id });
|
|
465
|
+
|
|
466
|
+
// 验证消息已删除
|
|
467
|
+
const deletedMessage = await serverDB
|
|
468
|
+
.select()
|
|
469
|
+
.from(messages)
|
|
470
|
+
.where(eq(messages.id, msgResult.id));
|
|
471
|
+
|
|
472
|
+
expect(deletedMessage).toHaveLength(0);
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it('should return message list when sessionId is provided', async () => {
|
|
476
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
477
|
+
|
|
478
|
+
const msg1Result = await caller.createNewMessage({
|
|
479
|
+
content: 'Message 1',
|
|
480
|
+
role: 'user',
|
|
481
|
+
sessionId: testSessionId,
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
const msg2Result = await caller.createNewMessage({
|
|
485
|
+
content: 'Message 2',
|
|
486
|
+
role: 'user',
|
|
487
|
+
sessionId: testSessionId,
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
const result = await caller.removeMessage({
|
|
491
|
+
id: msg1Result.id,
|
|
492
|
+
sessionId: testSessionId,
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
expect(result.success).toBe(true);
|
|
496
|
+
expect(result.messages).toBeDefined();
|
|
497
|
+
expect(result.messages).toHaveLength(1);
|
|
498
|
+
expect(result.messages?.[0].id).toBe(msg2Result.id);
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
describe('removeAllMessages', () => {
|
|
503
|
+
it('should remove all messages for the user', async () => {
|
|
504
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
505
|
+
|
|
506
|
+
// 创建多个 session 和消息
|
|
507
|
+
await caller.createNewMessage({
|
|
508
|
+
content: 'Message 1',
|
|
509
|
+
role: 'user',
|
|
510
|
+
sessionId: testSessionId,
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
const [anotherSession] = await serverDB
|
|
514
|
+
.insert(sessions)
|
|
515
|
+
.values({
|
|
516
|
+
userId,
|
|
517
|
+
type: 'agent',
|
|
518
|
+
})
|
|
519
|
+
.returning();
|
|
520
|
+
|
|
521
|
+
await caller.createNewMessage({
|
|
522
|
+
content: 'Message 2',
|
|
523
|
+
role: 'user',
|
|
524
|
+
sessionId: anotherSession.id,
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
// 删除所有消息
|
|
528
|
+
await caller.removeAllMessages();
|
|
529
|
+
|
|
530
|
+
// 验证所有消息已删除
|
|
531
|
+
const remainingMessages = await serverDB
|
|
532
|
+
.select()
|
|
533
|
+
.from(messages)
|
|
534
|
+
.where(eq(messages.userId, userId));
|
|
535
|
+
|
|
536
|
+
expect(remainingMessages).toHaveLength(0);
|
|
537
|
+
});
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
describe('removeMessageQuery', () => {
|
|
541
|
+
it('should remove message query', async () => {
|
|
542
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
543
|
+
|
|
544
|
+
const msgResult = await caller.createNewMessage({
|
|
545
|
+
content: 'Message with query',
|
|
546
|
+
role: 'user',
|
|
547
|
+
sessionId: testSessionId,
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
// 创建一个 message query 记录,使用 UUID
|
|
551
|
+
const { messageQueries } = await import('@/database/schemas');
|
|
552
|
+
const [queryRecord] = await serverDB
|
|
553
|
+
.insert(messageQueries)
|
|
554
|
+
.values({
|
|
555
|
+
messageId: msgResult.id,
|
|
556
|
+
userId,
|
|
557
|
+
userQuery: 'test query',
|
|
558
|
+
})
|
|
559
|
+
.returning();
|
|
560
|
+
|
|
561
|
+
await caller.removeMessageQuery({ id: queryRecord.id });
|
|
562
|
+
|
|
563
|
+
// 验证消息查询已删除
|
|
564
|
+
const deletedQuery = await serverDB
|
|
565
|
+
.select()
|
|
566
|
+
.from(messageQueries)
|
|
567
|
+
.where(eq(messageQueries.id, queryRecord.id));
|
|
568
|
+
|
|
569
|
+
expect(deletedQuery).toHaveLength(0);
|
|
570
|
+
});
|
|
390
571
|
});
|
|
391
572
|
|
|
392
573
|
describe('removeMessagesByAssistant', () => {
|
|
@@ -394,13 +575,13 @@ describe('Message Router Integration Tests', () => {
|
|
|
394
575
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
395
576
|
|
|
396
577
|
// 创建多个消息
|
|
397
|
-
await caller.
|
|
578
|
+
await caller.createNewMessage({
|
|
398
579
|
content: 'Message 1',
|
|
399
580
|
role: 'user',
|
|
400
581
|
sessionId: testSessionId,
|
|
401
582
|
});
|
|
402
583
|
|
|
403
|
-
await caller.
|
|
584
|
+
await caller.createNewMessage({
|
|
404
585
|
content: 'Message 2',
|
|
405
586
|
role: 'assistant',
|
|
406
587
|
sessionId: testSessionId,
|
|
@@ -424,7 +605,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
424
605
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
425
606
|
|
|
426
607
|
// 在 topic 中创建消息
|
|
427
|
-
await caller.
|
|
608
|
+
await caller.createNewMessage({
|
|
428
609
|
content: 'Message in topic',
|
|
429
610
|
role: 'user',
|
|
430
611
|
sessionId: testSessionId,
|
|
@@ -432,7 +613,7 @@ describe('Message Router Integration Tests', () => {
|
|
|
432
613
|
});
|
|
433
614
|
|
|
434
615
|
// 在 session 中创建消息(不在 topic 中)
|
|
435
|
-
const
|
|
616
|
+
const msgOutsideTopicResult = await caller.createNewMessage({
|
|
436
617
|
content: 'Message outside topic',
|
|
437
618
|
role: 'user',
|
|
438
619
|
sessionId: testSessionId,
|
|
@@ -451,7 +632,44 @@ describe('Message Router Integration Tests', () => {
|
|
|
451
632
|
.where(eq(messages.sessionId, testSessionId));
|
|
452
633
|
|
|
453
634
|
expect(remainingMessages).toHaveLength(1);
|
|
454
|
-
expect(remainingMessages[0].id).toBe(
|
|
635
|
+
expect(remainingMessages[0].id).toBe(msgOutsideTopicResult.id);
|
|
636
|
+
});
|
|
637
|
+
});
|
|
638
|
+
|
|
639
|
+
describe('removeMessagesByGroup', () => {
|
|
640
|
+
it('should call removeMessagesByGroup endpoint', async () => {
|
|
641
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
642
|
+
|
|
643
|
+
// 首先创建一个 chat_group
|
|
644
|
+
const { chatGroups } = await import('@/database/schemas');
|
|
645
|
+
const [chatGroup] = await serverDB
|
|
646
|
+
.insert(chatGroups)
|
|
647
|
+
.values({
|
|
648
|
+
userId,
|
|
649
|
+
title: 'Test Chat Group for Delete',
|
|
650
|
+
})
|
|
651
|
+
.returning();
|
|
652
|
+
|
|
653
|
+
// 创建消息并设置 groupId
|
|
654
|
+
const msg1 = await caller.createNewMessage({
|
|
655
|
+
content: 'Message 1 in group',
|
|
656
|
+
role: 'assistant',
|
|
657
|
+
sessionId: testSessionId,
|
|
658
|
+
topicId: testTopicId,
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
await serverDB
|
|
662
|
+
.update(messages)
|
|
663
|
+
.set({ groupId: chatGroup.id })
|
|
664
|
+
.where(eq(messages.id, msg1.id));
|
|
665
|
+
|
|
666
|
+
// 调用删除接口(不会抛出错误即为成功)
|
|
667
|
+
await expect(
|
|
668
|
+
caller.removeMessagesByGroup({
|
|
669
|
+
groupId: chatGroup.id,
|
|
670
|
+
topicId: testTopicId,
|
|
671
|
+
}),
|
|
672
|
+
).resolves.not.toThrow();
|
|
455
673
|
});
|
|
456
674
|
});
|
|
457
675
|
|
|
@@ -459,14 +677,14 @@ describe('Message Router Integration Tests', () => {
|
|
|
459
677
|
it('should update message content', async () => {
|
|
460
678
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
461
679
|
|
|
462
|
-
const
|
|
680
|
+
const result = await caller.createNewMessage({
|
|
463
681
|
content: 'Original content',
|
|
464
682
|
role: 'user',
|
|
465
683
|
sessionId: testSessionId,
|
|
466
684
|
});
|
|
467
685
|
|
|
468
686
|
await caller.update({
|
|
469
|
-
id:
|
|
687
|
+
id: result.id,
|
|
470
688
|
value: {
|
|
471
689
|
content: 'Updated content',
|
|
472
690
|
},
|
|
@@ -475,23 +693,53 @@ describe('Message Router Integration Tests', () => {
|
|
|
475
693
|
const [updatedMessage] = await serverDB
|
|
476
694
|
.select()
|
|
477
695
|
.from(messages)
|
|
478
|
-
.where(eq(messages.id,
|
|
696
|
+
.where(eq(messages.id, result.id));
|
|
479
697
|
|
|
480
698
|
expect(updatedMessage.content).toBe('Updated content');
|
|
481
699
|
});
|
|
700
|
+
|
|
701
|
+
it('should update message and return message list when sessionId is provided', async () => {
|
|
702
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
703
|
+
|
|
704
|
+
const msg1 = await caller.createNewMessage({
|
|
705
|
+
content: 'Message 1',
|
|
706
|
+
role: 'user',
|
|
707
|
+
sessionId: testSessionId,
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
const msg2 = await caller.createNewMessage({
|
|
711
|
+
content: 'Message 2',
|
|
712
|
+
role: 'user',
|
|
713
|
+
sessionId: testSessionId,
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
const result = await caller.update({
|
|
717
|
+
id: msg1.id,
|
|
718
|
+
sessionId: testSessionId,
|
|
719
|
+
value: {
|
|
720
|
+
content: 'Updated Message 1',
|
|
721
|
+
},
|
|
722
|
+
});
|
|
723
|
+
|
|
724
|
+
expect(result).toBeDefined();
|
|
725
|
+
// The update method returns the updated message list
|
|
726
|
+
const messages = await caller.getMessages({ sessionId: testSessionId });
|
|
727
|
+
expect(messages).toHaveLength(2);
|
|
728
|
+
expect(messages.find((m) => m.id === msg1.id)?.content).toBe('Updated Message 1');
|
|
729
|
+
});
|
|
482
730
|
});
|
|
483
731
|
|
|
484
732
|
describe('searchMessages', () => {
|
|
485
733
|
it('should search messages by keyword', async () => {
|
|
486
734
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
487
735
|
|
|
488
|
-
await caller.
|
|
736
|
+
await caller.createNewMessage({
|
|
489
737
|
content: 'This is a test message about TypeScript',
|
|
490
738
|
role: 'user',
|
|
491
739
|
sessionId: testSessionId,
|
|
492
740
|
});
|
|
493
741
|
|
|
494
|
-
await caller.
|
|
742
|
+
await caller.createNewMessage({
|
|
495
743
|
content: 'Another message about JavaScript',
|
|
496
744
|
role: 'user',
|
|
497
745
|
sessionId: testSessionId,
|
|
@@ -506,18 +754,470 @@ describe('Message Router Integration Tests', () => {
|
|
|
506
754
|
});
|
|
507
755
|
});
|
|
508
756
|
|
|
757
|
+
describe('updateMessagePlugin', () => {
|
|
758
|
+
it('should update message plugin state', async () => {
|
|
759
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
760
|
+
|
|
761
|
+
const msg = await caller.createNewMessage({
|
|
762
|
+
content: 'Message with plugin',
|
|
763
|
+
role: 'assistant',
|
|
764
|
+
sessionId: testSessionId,
|
|
765
|
+
});
|
|
766
|
+
|
|
767
|
+
// 先创建一个 plugin 记录
|
|
768
|
+
const { messagePlugins } = await import('@/database/schemas');
|
|
769
|
+
await serverDB.insert(messagePlugins).values({
|
|
770
|
+
id: msg.id,
|
|
771
|
+
userId,
|
|
772
|
+
toolCallId: 'test-tool-call',
|
|
773
|
+
type: 'default',
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
await caller.updateMessagePlugin({
|
|
777
|
+
id: msg.id,
|
|
778
|
+
value: {
|
|
779
|
+
state: { key: 'value' },
|
|
780
|
+
},
|
|
781
|
+
});
|
|
782
|
+
|
|
783
|
+
const [updatedPlugin] = await serverDB
|
|
784
|
+
.select()
|
|
785
|
+
.from(messagePlugins)
|
|
786
|
+
.where(eq(messagePlugins.id, msg.id));
|
|
787
|
+
|
|
788
|
+
expect(updatedPlugin).toBeDefined();
|
|
789
|
+
expect(updatedPlugin.state).toBeDefined();
|
|
790
|
+
});
|
|
791
|
+
});
|
|
792
|
+
|
|
793
|
+
describe('updateMessageRAG', () => {
|
|
794
|
+
it('should update message RAG information', async () => {
|
|
795
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
796
|
+
|
|
797
|
+
const msg = await caller.createNewMessage({
|
|
798
|
+
content: 'Message with RAG',
|
|
799
|
+
role: 'assistant',
|
|
800
|
+
sessionId: testSessionId,
|
|
801
|
+
});
|
|
802
|
+
|
|
803
|
+
// 创建必要的依赖: chunks -> messageQueries -> messageQueryChunks
|
|
804
|
+
const { chunks, messageQueries, messageQueryChunks } = await import('@/database/schemas');
|
|
805
|
+
|
|
806
|
+
// 1. 创建 chunk
|
|
807
|
+
const [chunk] = await serverDB
|
|
808
|
+
.insert(chunks)
|
|
809
|
+
.values({
|
|
810
|
+
userId,
|
|
811
|
+
text: 'test chunk content',
|
|
812
|
+
})
|
|
813
|
+
.returning();
|
|
814
|
+
|
|
815
|
+
// 2. 创建 message query
|
|
816
|
+
const [query] = await serverDB
|
|
817
|
+
.insert(messageQueries)
|
|
818
|
+
.values({
|
|
819
|
+
messageId: msg.id,
|
|
820
|
+
userId,
|
|
821
|
+
userQuery: 'test query',
|
|
822
|
+
})
|
|
823
|
+
.returning();
|
|
824
|
+
|
|
825
|
+
// 3. 调用 updateMessageRAG
|
|
826
|
+
await caller.updateMessageRAG({
|
|
827
|
+
id: msg.id,
|
|
828
|
+
value: {
|
|
829
|
+
fileChunks: [{ id: chunk.id, similarity: 0.95 }],
|
|
830
|
+
ragQueryId: query.id,
|
|
831
|
+
},
|
|
832
|
+
});
|
|
833
|
+
|
|
834
|
+
// 验证 messageQueryChunks 记录已创建
|
|
835
|
+
const [queryChunk] = await serverDB
|
|
836
|
+
.select()
|
|
837
|
+
.from(messageQueryChunks)
|
|
838
|
+
.where(eq(messageQueryChunks.messageId, msg.id));
|
|
839
|
+
|
|
840
|
+
expect(queryChunk).toBeDefined();
|
|
841
|
+
expect(queryChunk.chunkId).toBe(chunk.id);
|
|
842
|
+
});
|
|
843
|
+
|
|
844
|
+
it('should return message list when sessionId is provided', async () => {
|
|
845
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
846
|
+
|
|
847
|
+
const msg1 = await caller.createNewMessage({
|
|
848
|
+
content: 'Message 1',
|
|
849
|
+
role: 'assistant',
|
|
850
|
+
sessionId: testSessionId,
|
|
851
|
+
});
|
|
852
|
+
|
|
853
|
+
await caller.createNewMessage({
|
|
854
|
+
content: 'Message 2',
|
|
855
|
+
role: 'assistant',
|
|
856
|
+
sessionId: testSessionId,
|
|
857
|
+
});
|
|
858
|
+
|
|
859
|
+
// 创建必要的依赖: chunks -> messageQueries
|
|
860
|
+
const { chunks, messageQueries } = await import('@/database/schemas');
|
|
861
|
+
const [chunk] = await serverDB
|
|
862
|
+
.insert(chunks)
|
|
863
|
+
.values({
|
|
864
|
+
userId,
|
|
865
|
+
text: 'test chunk content',
|
|
866
|
+
})
|
|
867
|
+
.returning();
|
|
868
|
+
|
|
869
|
+
// 创建 query (需要 queryId)
|
|
870
|
+
const [query] = await serverDB
|
|
871
|
+
.insert(messageQueries)
|
|
872
|
+
.values({
|
|
873
|
+
messageId: msg1.id,
|
|
874
|
+
userId,
|
|
875
|
+
userQuery: 'test query',
|
|
876
|
+
})
|
|
877
|
+
.returning();
|
|
878
|
+
|
|
879
|
+
const result = await caller.updateMessageRAG({
|
|
880
|
+
id: msg1.id,
|
|
881
|
+
sessionId: testSessionId,
|
|
882
|
+
value: {
|
|
883
|
+
fileChunks: [{ id: chunk.id, similarity: 0.95 }],
|
|
884
|
+
ragQueryId: query.id,
|
|
885
|
+
},
|
|
886
|
+
});
|
|
887
|
+
|
|
888
|
+
expect(result.success).toBe(true);
|
|
889
|
+
expect(result.messages).toBeDefined();
|
|
890
|
+
expect(result.messages).toHaveLength(2);
|
|
891
|
+
});
|
|
892
|
+
});
|
|
893
|
+
|
|
894
|
+
describe('updateMetadata', () => {
|
|
895
|
+
it('should update message metadata', async () => {
|
|
896
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
897
|
+
|
|
898
|
+
const msg = await caller.createNewMessage({
|
|
899
|
+
content: 'Message with metadata',
|
|
900
|
+
role: 'user',
|
|
901
|
+
sessionId: testSessionId,
|
|
902
|
+
});
|
|
903
|
+
|
|
904
|
+
await caller.updateMetadata({
|
|
905
|
+
id: msg.id,
|
|
906
|
+
value: { customKey: 'customValue' },
|
|
907
|
+
});
|
|
908
|
+
|
|
909
|
+
const [updatedMessage] = await serverDB
|
|
910
|
+
.select()
|
|
911
|
+
.from(messages)
|
|
912
|
+
.where(eq(messages.id, msg.id));
|
|
913
|
+
|
|
914
|
+
expect(updatedMessage).toBeDefined();
|
|
915
|
+
// Verify the message still exists after update
|
|
916
|
+
expect(updatedMessage.id).toBe(msg.id);
|
|
917
|
+
});
|
|
918
|
+
});
|
|
919
|
+
|
|
920
|
+
describe('updatePluginError', () => {
|
|
921
|
+
it('should update plugin error state', async () => {
|
|
922
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
923
|
+
|
|
924
|
+
const msg = await caller.createNewMessage({
|
|
925
|
+
content: 'Message with plugin error',
|
|
926
|
+
role: 'assistant',
|
|
927
|
+
sessionId: testSessionId,
|
|
928
|
+
});
|
|
929
|
+
|
|
930
|
+
// 先创建一个 plugin 记录
|
|
931
|
+
const { messagePlugins } = await import('@/database/schemas');
|
|
932
|
+
await serverDB.insert(messagePlugins).values({
|
|
933
|
+
id: msg.id,
|
|
934
|
+
userId,
|
|
935
|
+
toolCallId: 'test-tool-call-error',
|
|
936
|
+
type: 'default',
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
await caller.updatePluginError({
|
|
940
|
+
id: msg.id,
|
|
941
|
+
value: { message: 'Plugin error occurred' },
|
|
942
|
+
});
|
|
943
|
+
|
|
944
|
+
const [updatedPlugin] = await serverDB
|
|
945
|
+
.select()
|
|
946
|
+
.from(messagePlugins)
|
|
947
|
+
.where(eq(messagePlugins.id, msg.id));
|
|
948
|
+
|
|
949
|
+
expect(updatedPlugin).toBeDefined();
|
|
950
|
+
expect(updatedPlugin.error).toBeDefined();
|
|
951
|
+
});
|
|
952
|
+
|
|
953
|
+
it('should return message list when sessionId is provided', async () => {
|
|
954
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
955
|
+
|
|
956
|
+
const msg1 = await caller.createNewMessage({
|
|
957
|
+
content: 'Message 1',
|
|
958
|
+
role: 'assistant',
|
|
959
|
+
sessionId: testSessionId,
|
|
960
|
+
});
|
|
961
|
+
|
|
962
|
+
// 先创建一个 plugin 记录
|
|
963
|
+
const { messagePlugins } = await import('@/database/schemas');
|
|
964
|
+
await serverDB.insert(messagePlugins).values({
|
|
965
|
+
id: msg1.id,
|
|
966
|
+
userId,
|
|
967
|
+
toolCallId: 'test-tool-call-error-2',
|
|
968
|
+
type: 'default',
|
|
969
|
+
});
|
|
970
|
+
|
|
971
|
+
await caller.createNewMessage({
|
|
972
|
+
content: 'Message 2',
|
|
973
|
+
role: 'assistant',
|
|
974
|
+
sessionId: testSessionId,
|
|
975
|
+
});
|
|
976
|
+
|
|
977
|
+
const result = await caller.updatePluginError({
|
|
978
|
+
id: msg1.id,
|
|
979
|
+
sessionId: testSessionId,
|
|
980
|
+
value: { message: 'Error' },
|
|
981
|
+
});
|
|
982
|
+
|
|
983
|
+
expect(result.success).toBe(true);
|
|
984
|
+
expect(result.messages).toBeDefined();
|
|
985
|
+
expect(result.messages).toHaveLength(2);
|
|
986
|
+
});
|
|
987
|
+
});
|
|
988
|
+
|
|
989
|
+
describe('updatePluginState', () => {
|
|
990
|
+
it('should update plugin state', async () => {
|
|
991
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
992
|
+
|
|
993
|
+
const msg = await caller.createNewMessage({
|
|
994
|
+
content: 'Message with plugin state',
|
|
995
|
+
role: 'assistant',
|
|
996
|
+
sessionId: testSessionId,
|
|
997
|
+
});
|
|
998
|
+
|
|
999
|
+
// 先创建一个 plugin 记录
|
|
1000
|
+
const { messagePlugins } = await import('@/database/schemas');
|
|
1001
|
+
await serverDB.insert(messagePlugins).values({
|
|
1002
|
+
id: msg.id,
|
|
1003
|
+
userId,
|
|
1004
|
+
toolCallId: 'test-tool-call-state',
|
|
1005
|
+
type: 'default',
|
|
1006
|
+
});
|
|
1007
|
+
|
|
1008
|
+
const result = await caller.updatePluginState({
|
|
1009
|
+
id: msg.id,
|
|
1010
|
+
sessionId: testSessionId,
|
|
1011
|
+
value: { stateKey: 'stateValue' },
|
|
1012
|
+
});
|
|
1013
|
+
|
|
1014
|
+
expect(result).toBeDefined();
|
|
1015
|
+
});
|
|
1016
|
+
});
|
|
1017
|
+
|
|
1018
|
+
describe('updateTTS', () => {
|
|
1019
|
+
it('should update TTS information', async () => {
|
|
1020
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
1021
|
+
|
|
1022
|
+
const msg = await caller.createNewMessage({
|
|
1023
|
+
content: 'Message with TTS',
|
|
1024
|
+
role: 'assistant',
|
|
1025
|
+
sessionId: testSessionId,
|
|
1026
|
+
});
|
|
1027
|
+
|
|
1028
|
+
// 创建 file 记录
|
|
1029
|
+
const { files } = await import('@/database/schemas');
|
|
1030
|
+
const [file] = await serverDB
|
|
1031
|
+
.insert(files)
|
|
1032
|
+
.values({
|
|
1033
|
+
userId,
|
|
1034
|
+
name: 'audio.mp3',
|
|
1035
|
+
fileType: 'audio/mpeg',
|
|
1036
|
+
size: 1024,
|
|
1037
|
+
url: '/files/audio.mp3',
|
|
1038
|
+
})
|
|
1039
|
+
.returning();
|
|
1040
|
+
|
|
1041
|
+
await caller.updateTTS({
|
|
1042
|
+
id: msg.id,
|
|
1043
|
+
value: {
|
|
1044
|
+
file: file.id,
|
|
1045
|
+
voice: 'en-US-neural',
|
|
1046
|
+
contentMd5: 'abc123',
|
|
1047
|
+
},
|
|
1048
|
+
});
|
|
1049
|
+
|
|
1050
|
+
const { messageTTS } = await import('@/database/schemas');
|
|
1051
|
+
const [ttsRecord] = await serverDB.select().from(messageTTS).where(eq(messageTTS.id, msg.id));
|
|
1052
|
+
|
|
1053
|
+
expect(ttsRecord).toBeDefined();
|
|
1054
|
+
expect(ttsRecord.voice).toBe('en-US-neural');
|
|
1055
|
+
expect(ttsRecord.fileId).toBe(file.id);
|
|
1056
|
+
});
|
|
1057
|
+
|
|
1058
|
+
it('should delete TTS when value is false', async () => {
|
|
1059
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
1060
|
+
|
|
1061
|
+
const msg = await caller.createNewMessage({
|
|
1062
|
+
content: 'Message with TTS to delete',
|
|
1063
|
+
role: 'assistant',
|
|
1064
|
+
sessionId: testSessionId,
|
|
1065
|
+
});
|
|
1066
|
+
|
|
1067
|
+
// 创建 file 记录
|
|
1068
|
+
const { files } = await import('@/database/schemas');
|
|
1069
|
+
const [file] = await serverDB
|
|
1070
|
+
.insert(files)
|
|
1071
|
+
.values({
|
|
1072
|
+
userId,
|
|
1073
|
+
name: 'audio-delete.mp3',
|
|
1074
|
+
fileType: 'audio/mpeg',
|
|
1075
|
+
size: 1024,
|
|
1076
|
+
url: '/files/audio-delete.mp3',
|
|
1077
|
+
})
|
|
1078
|
+
.returning();
|
|
1079
|
+
|
|
1080
|
+
// First add TTS
|
|
1081
|
+
await caller.updateTTS({
|
|
1082
|
+
id: msg.id,
|
|
1083
|
+
value: {
|
|
1084
|
+
file: file.id,
|
|
1085
|
+
voice: 'en-US-neural',
|
|
1086
|
+
},
|
|
1087
|
+
});
|
|
1088
|
+
|
|
1089
|
+
// Then delete it
|
|
1090
|
+
await caller.updateTTS({
|
|
1091
|
+
id: msg.id,
|
|
1092
|
+
value: false,
|
|
1093
|
+
});
|
|
1094
|
+
|
|
1095
|
+
const { messageTTS } = await import('@/database/schemas');
|
|
1096
|
+
const [ttsRecord] = await serverDB.select().from(messageTTS).where(eq(messageTTS.id, msg.id));
|
|
1097
|
+
|
|
1098
|
+
expect(ttsRecord).toBeUndefined();
|
|
1099
|
+
});
|
|
1100
|
+
});
|
|
1101
|
+
|
|
1102
|
+
describe('updateTranslate', () => {
|
|
1103
|
+
it('should update translation information', async () => {
|
|
1104
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
1105
|
+
|
|
1106
|
+
const msg = await caller.createNewMessage({
|
|
1107
|
+
content: 'Hello world',
|
|
1108
|
+
role: 'user',
|
|
1109
|
+
sessionId: testSessionId,
|
|
1110
|
+
});
|
|
1111
|
+
|
|
1112
|
+
await caller.updateTranslate({
|
|
1113
|
+
id: msg.id,
|
|
1114
|
+
value: {
|
|
1115
|
+
content: '你好世界',
|
|
1116
|
+
from: 'en',
|
|
1117
|
+
to: 'zh',
|
|
1118
|
+
},
|
|
1119
|
+
});
|
|
1120
|
+
|
|
1121
|
+
const { messageTranslates } = await import('@/database/schemas');
|
|
1122
|
+
const [translateRecord] = await serverDB
|
|
1123
|
+
.select()
|
|
1124
|
+
.from(messageTranslates)
|
|
1125
|
+
.where(eq(messageTranslates.id, msg.id));
|
|
1126
|
+
|
|
1127
|
+
expect(translateRecord).toBeDefined();
|
|
1128
|
+
expect(translateRecord.to).toBe('zh');
|
|
1129
|
+
});
|
|
1130
|
+
|
|
1131
|
+
it('should delete translation when value is false', async () => {
|
|
1132
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
1133
|
+
|
|
1134
|
+
const msg = await caller.createNewMessage({
|
|
1135
|
+
content: 'Hello world',
|
|
1136
|
+
role: 'user',
|
|
1137
|
+
sessionId: testSessionId,
|
|
1138
|
+
});
|
|
1139
|
+
|
|
1140
|
+
// First add translation
|
|
1141
|
+
await caller.updateTranslate({
|
|
1142
|
+
id: msg.id,
|
|
1143
|
+
value: {
|
|
1144
|
+
content: '你好世界',
|
|
1145
|
+
to: 'zh',
|
|
1146
|
+
},
|
|
1147
|
+
});
|
|
1148
|
+
|
|
1149
|
+
// Then delete it
|
|
1150
|
+
await caller.updateTranslate({
|
|
1151
|
+
id: msg.id,
|
|
1152
|
+
value: false,
|
|
1153
|
+
});
|
|
1154
|
+
|
|
1155
|
+
const [updatedMessage] = await serverDB
|
|
1156
|
+
.select()
|
|
1157
|
+
.from(messages)
|
|
1158
|
+
.where(eq(messages.id, msg.id));
|
|
1159
|
+
|
|
1160
|
+
expect(updatedMessage).toBeDefined();
|
|
1161
|
+
});
|
|
1162
|
+
});
|
|
1163
|
+
|
|
1164
|
+
describe('getHeatmaps', () => {
|
|
1165
|
+
it('should get message heatmaps', async () => {
|
|
1166
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
1167
|
+
|
|
1168
|
+
// 创建一些消息
|
|
1169
|
+
await caller.createNewMessage({
|
|
1170
|
+
content: 'Message 1',
|
|
1171
|
+
role: 'user',
|
|
1172
|
+
sessionId: testSessionId,
|
|
1173
|
+
});
|
|
1174
|
+
|
|
1175
|
+
await caller.createNewMessage({
|
|
1176
|
+
content: 'Message 2',
|
|
1177
|
+
role: 'assistant',
|
|
1178
|
+
sessionId: testSessionId,
|
|
1179
|
+
});
|
|
1180
|
+
|
|
1181
|
+
const heatmaps = await caller.getHeatmaps();
|
|
1182
|
+
|
|
1183
|
+
expect(heatmaps).toBeDefined();
|
|
1184
|
+
expect(Array.isArray(heatmaps)).toBe(true);
|
|
1185
|
+
});
|
|
1186
|
+
});
|
|
1187
|
+
|
|
1188
|
+
describe('rankModels', () => {
|
|
1189
|
+
it('should get model usage ranking', async () => {
|
|
1190
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
1191
|
+
|
|
1192
|
+
// 创建带有模型信息的消息
|
|
1193
|
+
const msg = await caller.createNewMessage({
|
|
1194
|
+
content: 'Message from AI',
|
|
1195
|
+
role: 'assistant',
|
|
1196
|
+
sessionId: testSessionId,
|
|
1197
|
+
});
|
|
1198
|
+
|
|
1199
|
+
// 添加模型信息
|
|
1200
|
+
await serverDB.update(messages).set({ model: 'gpt-4' }).where(eq(messages.id, msg.id));
|
|
1201
|
+
|
|
1202
|
+
const ranking = await caller.rankModels();
|
|
1203
|
+
|
|
1204
|
+
expect(ranking).toBeDefined();
|
|
1205
|
+
expect(Array.isArray(ranking)).toBe(true);
|
|
1206
|
+
});
|
|
1207
|
+
});
|
|
1208
|
+
|
|
509
1209
|
describe('count and statistics', () => {
|
|
510
1210
|
it('should count messages', async () => {
|
|
511
1211
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
512
1212
|
|
|
513
1213
|
// 创建消息
|
|
514
|
-
await caller.
|
|
1214
|
+
await caller.createNewMessage({
|
|
515
1215
|
content: 'Message 1',
|
|
516
1216
|
role: 'user',
|
|
517
1217
|
sessionId: testSessionId,
|
|
518
1218
|
});
|
|
519
1219
|
|
|
520
|
-
await caller.
|
|
1220
|
+
await caller.createNewMessage({
|
|
521
1221
|
content: 'Message 2',
|
|
522
1222
|
role: 'assistant',
|
|
523
1223
|
sessionId: testSessionId,
|
|
@@ -528,10 +1228,30 @@ describe('Message Router Integration Tests', () => {
|
|
|
528
1228
|
expect(count).toBe(2);
|
|
529
1229
|
});
|
|
530
1230
|
|
|
1231
|
+
it('should count messages with date range', async () => {
|
|
1232
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
1233
|
+
|
|
1234
|
+
await caller.createNewMessage({
|
|
1235
|
+
content: 'Message 1',
|
|
1236
|
+
role: 'user',
|
|
1237
|
+
sessionId: testSessionId,
|
|
1238
|
+
});
|
|
1239
|
+
|
|
1240
|
+
const startDate = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
1241
|
+
const endDate = new Date().toISOString();
|
|
1242
|
+
|
|
1243
|
+
const count = await caller.count({
|
|
1244
|
+
startDate,
|
|
1245
|
+
endDate,
|
|
1246
|
+
});
|
|
1247
|
+
|
|
1248
|
+
expect(count).toBeGreaterThanOrEqual(1);
|
|
1249
|
+
});
|
|
1250
|
+
|
|
531
1251
|
it('should count words', async () => {
|
|
532
1252
|
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
533
1253
|
|
|
534
|
-
await caller.
|
|
1254
|
+
await caller.createNewMessage({
|
|
535
1255
|
content: 'Hello world',
|
|
536
1256
|
role: 'user',
|
|
537
1257
|
sessionId: testSessionId,
|
|
@@ -541,5 +1261,25 @@ describe('Message Router Integration Tests', () => {
|
|
|
541
1261
|
|
|
542
1262
|
expect(wordCount).toBeGreaterThan(0);
|
|
543
1263
|
});
|
|
1264
|
+
|
|
1265
|
+
it('should count words with date range', async () => {
|
|
1266
|
+
const caller = messageRouter.createCaller(createTestContext(userId));
|
|
1267
|
+
|
|
1268
|
+
await caller.createNewMessage({
|
|
1269
|
+
content: 'Hello world test message',
|
|
1270
|
+
role: 'user',
|
|
1271
|
+
sessionId: testSessionId,
|
|
1272
|
+
});
|
|
1273
|
+
|
|
1274
|
+
const startDate = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
1275
|
+
const endDate = new Date().toISOString();
|
|
1276
|
+
|
|
1277
|
+
const wordCount = await caller.countWords({
|
|
1278
|
+
startDate,
|
|
1279
|
+
endDate,
|
|
1280
|
+
});
|
|
1281
|
+
|
|
1282
|
+
expect(wordCount).toBeGreaterThan(0);
|
|
1283
|
+
});
|
|
544
1284
|
});
|
|
545
1285
|
});
|