@lobehub/lobehub 2.0.0-next.3 → 2.0.0-next.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.desktop +1 -2
- package/.env.example +0 -3
- package/.env.example.development +0 -2
- package/.github/workflows/claude-auto-testing.yml +73 -0
- package/.github/workflows/claude-translate-comments.yml +67 -0
- package/.github/workflows/desktop-pr-build.yml +18 -16
- package/.github/workflows/docker.yml +25 -20
- package/.github/workflows/e2e.yml +17 -3
- package/.github/workflows/release-desktop-beta.yml +12 -12
- package/.github/workflows/release.yml +3 -5
- package/.github/workflows/test.yml +47 -12
- package/.nvmrc +1 -1
- package/CHANGELOG.md +684 -0
- package/Dockerfile +1 -3
- package/README.md +2 -45
- package/README.zh-CN.md +2 -45
- package/apps/desktop/src/main/controllers/AuthCtr.ts +53 -39
- package/apps/desktop/src/main/controllers/MenuCtr.ts +5 -5
- package/apps/desktop/src/main/controllers/NotificationCtr.ts +29 -29
- package/apps/desktop/src/main/controllers/RemoteServerConfigCtr.ts +16 -16
- package/apps/desktop/src/main/controllers/ShortcutCtr.ts +2 -2
- package/apps/desktop/src/main/controllers/TrayMenuCtr.ts +18 -18
- package/apps/desktop/src/main/controllers/UpdaterCtr.ts +4 -4
- package/apps/desktop/src/main/controllers/__tests__/AuthCtr.test.ts +706 -0
- package/apps/desktop/src/main/controllers/__tests__/TrayMenuCtr.test.ts +5 -5
- package/apps/desktop/src/main/controllers/index.ts +4 -4
- package/apps/desktop/src/main/utils/next-electron-rsc.ts +7 -5
- package/apps/desktop/tsconfig.json +0 -1
- package/changelog/v1.json +232 -0
- package/docs/development/database-schema.dbml +12 -0
- package/docs/self-hosting/advanced/auth/next-auth/auth0.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/auth0.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/authelia.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/authelia.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/authentik.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/authentik.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/casdoor.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/casdoor.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/cloudflare-zero-trust.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/github.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/github.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/google.mdx +32 -29
- package/docs/self-hosting/advanced/auth/next-auth/keycloak.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/keycloak.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/logto.mdx +5 -3
- package/docs/self-hosting/advanced/auth/next-auth/logto.zh-CN.mdx +5 -3
- package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/microsoft-entra-id.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/okta.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/okta.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/wechat.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/wechat.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/zitadel.mdx +2 -2
- package/docs/self-hosting/advanced/auth/next-auth/zitadel.zh-CN.mdx +2 -2
- package/docs/self-hosting/advanced/auth.mdx +32 -21
- package/docs/self-hosting/advanced/auth.zh-CN.mdx +30 -19
- package/docs/self-hosting/advanced/feature-flags.mdx +0 -1
- package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +0 -1
- package/docs/self-hosting/advanced/online-search.mdx +30 -25
- package/docs/self-hosting/advanced/online-search.zh-CN.mdx +25 -23
- package/e2e/src/features/discover/detail-pages.feature +95 -0
- package/e2e/src/features/discover/interactions.feature +113 -0
- package/e2e/src/features/discover/smoke.feature +34 -1
- package/e2e/src/steps/discover/detail-pages.steps.ts +295 -0
- package/e2e/src/steps/discover/interactions.steps.ts +451 -0
- package/e2e/src/steps/discover/smoke.steps.ts +116 -4
- package/e2e/tsconfig.json +0 -1
- package/locales/ar/labs.json +4 -0
- package/locales/ar/models.json +15 -6
- package/locales/ar/oauth.json +1 -0
- package/locales/bg-BG/labs.json +4 -0
- package/locales/bg-BG/models.json +15 -6
- package/locales/bg-BG/oauth.json +1 -0
- package/locales/de-DE/labs.json +4 -0
- package/locales/de-DE/models.json +15 -6
- package/locales/de-DE/oauth.json +1 -0
- package/locales/en-US/labs.json +4 -0
- package/locales/en-US/models.json +15 -6
- package/locales/en-US/oauth.json +1 -0
- package/locales/es-ES/labs.json +4 -0
- package/locales/es-ES/models.json +15 -6
- package/locales/es-ES/oauth.json +1 -0
- package/locales/fa-IR/labs.json +4 -0
- package/locales/fa-IR/models.json +15 -6
- package/locales/fa-IR/oauth.json +1 -0
- package/locales/fr-FR/labs.json +4 -0
- package/locales/fr-FR/models.json +15 -6
- package/locales/fr-FR/oauth.json +1 -0
- package/locales/it-IT/labs.json +4 -0
- package/locales/it-IT/models.json +15 -6
- package/locales/it-IT/oauth.json +1 -0
- package/locales/ja-JP/labs.json +4 -0
- package/locales/ja-JP/models.json +15 -6
- package/locales/ja-JP/oauth.json +1 -0
- package/locales/ko-KR/labs.json +4 -0
- package/locales/ko-KR/models.json +21 -12
- package/locales/ko-KR/oauth.json +1 -0
- package/locales/nl-NL/labs.json +4 -0
- package/locales/nl-NL/models.json +15 -6
- package/locales/nl-NL/oauth.json +1 -0
- package/locales/pl-PL/labs.json +4 -0
- package/locales/pl-PL/models.json +15 -6
- package/locales/pl-PL/oauth.json +1 -0
- package/locales/pt-BR/labs.json +4 -0
- package/locales/pt-BR/models.json +15 -6
- package/locales/pt-BR/oauth.json +1 -0
- package/locales/ru-RU/labs.json +4 -0
- package/locales/ru-RU/models.json +15 -6
- package/locales/ru-RU/oauth.json +1 -0
- package/locales/tr-TR/labs.json +4 -0
- package/locales/tr-TR/models.json +15 -6
- package/locales/tr-TR/oauth.json +1 -0
- package/locales/vi-VN/labs.json +4 -0
- package/locales/vi-VN/models.json +15 -6
- package/locales/vi-VN/oauth.json +1 -0
- package/locales/zh-CN/labs.json +4 -0
- package/locales/zh-CN/models.json +15 -6
- package/locales/zh-CN/oauth.json +1 -0
- package/locales/zh-TW/labs.json +4 -0
- package/locales/zh-TW/models.json +15 -6
- package/locales/zh-TW/oauth.json +1 -0
- package/next.config.ts +2 -3
- package/package.json +76 -82
- package/packages/const/src/index.ts +0 -1
- package/packages/const/src/url.ts +1 -4
- package/packages/const/src/user.ts +5 -2
- package/packages/const/src/version.ts +3 -3
- package/packages/context-engine/src/index.ts +1 -6
- package/packages/context-engine/src/processors/GroupMessageFlatten.ts +12 -2
- package/packages/context-engine/src/processors/__tests__/GroupMessageFlatten.test.ts +73 -9
- package/packages/context-engine/src/providers/index.ts +0 -2
- package/packages/database/migrations/0041_improve_index.sql +10 -0
- package/packages/database/migrations/0042_improve_agent_index.sql +1 -0
- package/packages/database/migrations/0043_add_ai_model_settings.sql +1 -0
- package/packages/database/migrations/meta/0041_snapshot.json +7784 -0
- package/packages/database/migrations/meta/0042_snapshot.json +7800 -0
- package/packages/database/migrations/meta/0043_snapshot.json +8419 -0
- package/packages/database/migrations/meta/_journal.json +21 -0
- package/packages/database/package.json +2 -2
- package/packages/database/src/core/migrations.json +33 -0
- package/packages/database/src/core/web-server.ts +2 -1
- package/packages/database/src/models/__tests__/message.grouping.test.ts +812 -0
- package/packages/database/src/models/__tests__/message.test.ts +256 -233
- package/packages/database/src/models/agent.ts +16 -13
- package/packages/database/src/models/message.ts +90 -74
- package/packages/database/src/models/session.ts +80 -28
- package/packages/database/src/models/user.ts +2 -1
- package/packages/database/src/repositories/aiInfra/index.test.ts +198 -0
- package/packages/database/src/repositories/aiInfra/index.ts +2 -1
- package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
- package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
- package/packages/database/src/schemas/agent.ts +13 -11
- package/packages/database/src/schemas/aiInfra.ts +2 -0
- package/packages/database/src/schemas/message.ts +5 -1
- package/packages/database/src/schemas/relations.ts +6 -4
- package/packages/database/src/schemas/session.ts +2 -0
- package/packages/database/src/schemas/topic.ts +6 -1
- package/packages/database/src/utils/__tests__/groupMessages.test.ts +145 -2
- package/packages/database/src/utils/groupMessages.ts +7 -5
- package/packages/electron-client-ipc/package.json +4 -1
- package/packages/file-loaders/package.json +1 -0
- package/packages/memory-extract/package.json +2 -2
- package/packages/model-bank/src/aiModels/anthropic.ts +0 -63
- package/packages/model-bank/src/aiModels/higress.ts +0 -55
- package/packages/model-bank/src/aiModels/infiniai.ts +21 -0
- package/packages/model-bank/src/aiModels/ollamacloud.ts +13 -0
- package/packages/model-bank/src/aiModels/siliconcloud.ts +19 -0
- package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +0 -38
- package/packages/model-runtime/src/providers/minimax/index.ts +5 -5
- package/packages/model-runtime/src/providers/search1api/index.test.ts +2 -2
- package/packages/model-runtime/src/utils/googleErrorParser.test.ts +125 -0
- package/packages/model-runtime/src/utils/googleErrorParser.ts +103 -77
- package/packages/obervability-otel/package.json +1 -3
- package/packages/obervability-otel/src/node.ts +3 -7
- package/packages/types/src/discover/mcp.ts +6 -0
- package/packages/types/src/index.ts +0 -1
- package/packages/types/src/message/common/base.ts +13 -0
- package/packages/types/src/message/common/image.ts +8 -0
- package/packages/types/src/message/common/metadata.ts +39 -0
- package/packages/types/src/message/common/tools.ts +10 -0
- package/packages/types/src/message/db/params.ts +47 -1
- package/packages/types/src/message/ui/chat.ts +4 -1
- package/packages/types/src/message/ui/params.ts +49 -4
- package/packages/types/src/plugins/mcp.ts +4 -1
- package/packages/types/src/search.ts +16 -0
- package/packages/types/src/serverConfig.ts +2 -6
- package/packages/types/src/topic/topic.ts +14 -0
- package/packages/types/src/user/index.ts +2 -76
- package/packages/types/src/user/preference.ts +105 -0
- package/packages/types/src/user/settings/index.ts +22 -0
- package/packages/utils/src/apiKey.test.ts +139 -0
- package/packages/utils/src/client/clipboard.ts +2 -2
- package/packages/utils/src/client/exportFile.ts +10 -10
- package/packages/utils/src/client/parserPlaceholder.ts +18 -18
- package/packages/utils/src/client/topic.ts +10 -10
- package/packages/utils/src/client/xor-obfuscation.ts +11 -11
- package/packages/utils/src/server/auth.ts +6 -6
- package/packages/utils/src/server/geo.ts +9 -9
- package/packages/utils/src/server/xor.ts +7 -7
- package/packages/web-crawler/src/crawImpl/firecrawl.ts +39 -12
- package/packages/web-crawler/tsconfig.json +0 -1
- package/renovate.json +23 -1
- package/scripts/migrateServerDB/errorHint.js +1 -7
- package/scripts/migrateServerDB/index.ts +2 -1
- package/src/app/(backend)/webapi/revalidate/route.ts +1 -1
- package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -8
- package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
- package/src/app/[variants]/(main)/(mobile)/me/(home)/features/UserBanner.tsx +3 -6
- package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
- package/src/app/[variants]/(main)/_layout/Desktop/SideBar/TopActions.tsx +1 -4
- package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/index.tsx +2 -2
- package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/V1Mobile/useSend.ts +6 -4
- package/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +15 -10
- package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
- package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx +4 -2
- package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
- package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
- package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
- package/src/app/[variants]/(main)/discover/(list)/features/Pagination.tsx +1 -0
- package/src/app/[variants]/(main)/discover/(list)/features/SortButton/index.tsx +1 -1
- package/src/app/[variants]/(main)/discover/(list)/mcp/features/List/Item.tsx +1 -0
- package/src/app/[variants]/(main)/discover/(list)/model/features/List/Item.tsx +1 -0
- package/src/app/[variants]/(main)/discover/(list)/provider/features/List/Item.tsx +1 -0
- package/src/app/[variants]/(main)/discover/components/CategoryMenu.tsx +9 -1
- package/src/app/[variants]/(main)/image/@topic/features/Topics/TopicList.tsx +1 -0
- package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
- package/src/app/[variants]/(main)/image/page.tsx +0 -2
- package/src/app/[variants]/(main)/labs/components/LabCard.tsx +8 -6
- package/src/app/[variants]/(main)/labs/page.tsx +19 -22
- package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
- package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
- package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
- package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
- package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/azure/index.tsx +6 -8
- package/src/app/[variants]/(main)/settings/provider/detail/azureai/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/bedrock/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/cloudflare/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/comfyui/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/github/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/detail/vertexai/index.tsx +1 -1
- package/src/app/[variants]/(main)/settings/provider/features/ProviderConfig/index.tsx +2 -4
- package/src/app/[variants]/layout.tsx +1 -0
- package/src/app/[variants]/loading/index.tsx +1 -10
- package/src/app/[variants]/oauth/ResultLayout.tsx +47 -0
- package/src/app/[variants]/oauth/callback/error/page.tsx +20 -33
- package/src/app/[variants]/oauth/callback/layout.tsx +1 -0
- package/src/app/[variants]/oauth/callback/success/page.tsx +8 -22
- package/src/app/[variants]/oauth/consent/[uid]/Consent/BuiltinConsent.tsx +47 -0
- package/src/app/[variants]/oauth/consent/[uid]/{Consent.tsx → Consent/index.tsx} +12 -1
- package/src/app/[variants]/oauth/consent/[uid]/Login.tsx +19 -2
- package/src/app/sitemap.tsx +7 -1
- package/src/components/InvalidAPIKey/APIKeyForm/Bedrock.tsx +8 -13
- package/src/components/Link.tsx +12 -0
- package/src/components/Skeleton/SkeletonSwitch.tsx +13 -0
- package/src/components/Skeleton/index.ts +2 -0
- package/src/components/Thinking/index.tsx +4 -3
- package/src/config/db.ts +0 -5
- package/src/config/featureFlags/schema.test.ts +0 -2
- package/src/config/featureFlags/schema.ts +0 -6
- package/src/config/modelProviders/ai21.ts +1 -16
- package/src/config/modelProviders/ai302.ts +1 -128
- package/src/config/modelProviders/ai360.ts +1 -32
- package/src/config/modelProviders/anthropic.ts +1 -94
- package/src/config/modelProviders/azure.ts +1 -51
- package/src/config/modelProviders/baichuan.ts +1 -57
- package/src/config/modelProviders/bedrock.ts +1 -276
- package/src/config/modelProviders/cloudflare.ts +1 -64
- package/src/config/modelProviders/deepseek.ts +1 -19
- package/src/config/modelProviders/fireworksai.ts +1 -174
- package/src/config/modelProviders/giteeai.ts +1 -135
- package/src/config/modelProviders/github.ts +1 -254
- package/src/config/modelProviders/google.ts +1 -130
- package/src/config/modelProviders/groq.ts +1 -119
- package/src/config/modelProviders/higress.ts +1 -1736
- package/src/config/modelProviders/huggingface.ts +1 -54
- package/src/config/modelProviders/hunyuan.ts +1 -83
- package/src/config/modelProviders/infiniai.ts +1 -74
- package/src/config/modelProviders/internlm.ts +1 -20
- package/src/config/modelProviders/minimax.ts +1 -1
- package/src/config/modelProviders/mistral.ts +1 -95
- package/src/config/modelProviders/modelscope.ts +1 -27
- package/src/config/modelProviders/moonshot.ts +1 -29
- package/src/config/modelProviders/novita.ts +1 -105
- package/src/config/modelProviders/ollama.ts +1 -325
- package/src/config/modelProviders/openai.ts +1 -242
- package/src/config/modelProviders/openrouter.ts +1 -240
- package/src/config/modelProviders/perplexity.ts +1 -45
- package/src/config/modelProviders/ppio.ts +1 -152
- package/src/config/modelProviders/qiniu.ts +2 -19
- package/src/config/modelProviders/qwen.ts +1 -245
- package/src/config/modelProviders/search1api.ts +1 -34
- package/src/config/modelProviders/sensenova.ts +1 -69
- package/src/config/modelProviders/siliconcloud.ts +1 -417
- package/src/config/modelProviders/spark.ts +1 -59
- package/src/config/modelProviders/stepfun.ts +1 -98
- package/src/config/modelProviders/taichu.ts +1 -18
- package/src/config/modelProviders/togetherai.ts +1 -274
- package/src/config/modelProviders/upstage.ts +1 -28
- package/src/config/modelProviders/wenxin.ts +1 -140
- package/src/config/modelProviders/xai.ts +1 -38
- package/src/config/modelProviders/zeroone.ts +1 -81
- package/src/config/modelProviders/zhipu.ts +1 -108
- package/src/envs/app.ts +5 -8
- package/src/envs/auth.ts +0 -179
- package/src/features/AgentSetting/AgentPlugin/index.tsx +2 -2
- package/src/features/ChatInput/ActionBar/STT/browser.tsx +2 -2
- package/src/features/ChatInput/ActionBar/STT/openai.tsx +2 -2
- package/src/features/ChatInput/ActionBar/Tools/useControls.tsx +1 -3
- package/src/features/ChatInput/ActionBar/index.tsx +2 -2
- package/src/features/ChatInput/InputEditor/index.tsx +2 -2
- package/src/features/Conversation/Error/ErrorJsonViewer.tsx +4 -3
- package/src/features/Conversation/Error/OllamaBizError/index.tsx +7 -2
- package/src/features/Conversation/Error/index.tsx +15 -5
- package/src/features/Conversation/MarkdownElements/LobeArtifact/Render/index.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/Extra/index.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +5 -3
- package/src/features/Conversation/Messages/Assistant/Tool/Inspector/BuiltinPluginTitle.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/Tool/Inspector/ToolTitle.tsx +4 -2
- package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/Tool/Render/index.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/Tool/index.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/index.tsx +4 -4
- package/src/features/Conversation/Messages/Default.tsx +2 -2
- package/src/features/Conversation/Messages/Group/Actions/WithContentId.tsx +152 -0
- package/src/features/Conversation/Messages/Group/Actions/WithoutContentId.tsx +70 -0
- package/src/features/Conversation/Messages/Group/Actions/index.tsx +21 -0
- package/src/features/Conversation/Messages/Group/ContentBlock.tsx +91 -0
- package/src/features/Conversation/Messages/Group/EditState.tsx +51 -0
- package/src/features/Conversation/Messages/Group/Error/index.tsx +53 -0
- package/src/features/Conversation/Messages/Group/GroupChildren.tsx +73 -0
- package/src/features/Conversation/Messages/Group/MessageContent.tsx +39 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/BuiltinPluginTitle.tsx +49 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/Debug.tsx +70 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/PluginResult.tsx +34 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/PluginState.tsx +18 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/Settings.tsx +40 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/ToolTitle.tsx +92 -0
- package/src/features/Conversation/Messages/Group/Tool/Inspector/index.tsx +176 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/ObjectEntity.tsx +81 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/ValueCell.tsx +43 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/Arguments/index.tsx +134 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/CustomRender.tsx +88 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/ErrorResponse.tsx +35 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/LoadingPlaceholder/index.tsx +29 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/PluginSettings.tsx +66 -0
- package/src/features/Conversation/Messages/Group/Tool/Render/index.tsx +105 -0
- package/src/features/Conversation/Messages/Group/Tool/index.tsx +75 -0
- package/src/features/Conversation/Messages/Group/Tools.tsx +46 -0
- package/src/features/Conversation/Messages/Group/index.tsx +140 -0
- package/src/features/Conversation/Messages/User/Extra.tsx +2 -2
- package/src/features/Conversation/Messages/User/index.tsx +4 -4
- package/src/features/Conversation/Messages/index.tsx +15 -3
- package/src/features/Conversation/components/AutoScroll.tsx +2 -2
- package/src/features/Conversation/components/Extras/Usage/UsageDetail/index.tsx +9 -6
- package/src/features/Conversation/components/ShareMessageModal/ShareImage/Preview.tsx +2 -2
- package/src/features/DataImporter/index.tsx +15 -60
- package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
- package/src/features/MCP/utils.test.ts +91 -0
- package/src/features/MCP/utils.ts +20 -2
- package/src/features/PluginStore/Content.tsx +2 -3
- package/src/features/PluginStore/McpList/index.tsx +6 -2
- package/src/features/PluginTag/index.tsx +1 -3
- package/src/features/PluginsUI/Render/BuiltinType/index.test.tsx +37 -28
- package/src/features/Portal/Artifacts/Body/index.tsx +2 -2
- package/src/helpers/isCanUseFC.ts +0 -8
- package/src/hooks/useEnabledChatModels.ts +0 -8
- package/src/hooks/useInterceptingRoutes.test.ts +21 -3
- package/src/hooks/useModelContextWindowTokens.ts +0 -8
- package/src/hooks/useModelHasContextWindowToken.ts +1 -10
- package/src/hooks/useModelSupportFiles.ts +1 -11
- package/src/hooks/useModelSupportReasoning.ts +1 -11
- package/src/hooks/useModelSupportToolUse.ts +1 -11
- package/src/hooks/useModelSupportVision.ts +1 -11
- package/src/layout/AuthProvider/Clerk/index.tsx +2 -16
- package/src/libs/next-auth/auth.config.ts +3 -6
- package/src/libs/next-auth/sso-providers/auth0.ts +0 -7
- package/src/libs/next-auth/sso-providers/authelia.ts +3 -5
- package/src/libs/next-auth/sso-providers/authentik.ts +0 -7
- package/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +3 -6
- package/src/libs/next-auth/sso-providers/cognito.ts +1 -5
- package/src/libs/next-auth/sso-providers/generic-oidc.ts +3 -5
- package/src/libs/next-auth/sso-providers/github.ts +0 -6
- package/src/libs/next-auth/sso-providers/google.ts +0 -2
- package/src/libs/next-auth/sso-providers/index.ts +0 -2
- package/src/libs/next-auth/sso-providers/keycloak.ts +0 -3
- package/src/libs/next-auth/sso-providers/logto.ts +3 -5
- package/src/libs/next-auth/sso-providers/okta.ts +0 -4
- package/src/libs/next-auth/sso-providers/zitadel.ts +0 -7
- package/src/libs/oidc-provider/provider.ts +1 -1
- package/src/libs/trpc/client/index.ts +0 -1
- package/src/libs/trpc/client/lambda.ts +8 -5
- package/src/libs/trpc/lambda/context.ts +4 -1
- package/src/locales/default/labs.ts +4 -0
- package/src/locales/default/oauth.ts +1 -0
- package/src/server/globalConfig/index.ts +0 -23
- package/src/server/modules/AssistantStore/index.ts +1 -1
- package/src/server/modules/ModelRuntime/trace.ts +11 -4
- package/src/server/routers/desktop/mcp.ts +1 -3
- package/src/server/routers/lambda/__tests__/integration/message.integration.test.ts +810 -70
- package/src/server/routers/lambda/config/__snapshots__/index.test.ts.snap +175 -12
- package/src/server/routers/lambda/config/index.test.ts +38 -30
- package/src/server/routers/lambda/market/index.ts +4 -2
- package/src/server/routers/lambda/message.ts +60 -52
- package/src/server/routers/lambda/session.ts +8 -5
- package/src/server/routers/lambda/topic.ts +7 -1
- package/src/server/routers/lambda/user.ts +32 -31
- package/src/server/routers/tools/mcp.ts +2 -3
- package/src/server/routers/tools/search.test.ts +1 -7
- package/src/server/routers/tools/search.ts +1 -4
- package/src/server/services/mcp/deps/MCPSystemDepsCheckService.test.ts +541 -0
- package/src/server/services/message/__tests__/index.test.ts +348 -0
- package/src/server/services/message/index.ts +159 -0
- package/src/server/services/search/impls/firecrawl/index.ts +51 -11
- package/src/server/services/search/impls/firecrawl/type.ts +60 -9
- package/src/services/__tests__/tool.test.ts +0 -3
- package/src/services/aiModel/index.test.ts +3 -6
- package/src/services/aiModel/index.ts +55 -7
- package/src/services/aiProvider/index.test.ts +2 -5
- package/src/services/aiProvider/index.ts +47 -7
- package/src/services/chat/chat.test.ts +13 -40
- package/src/services/chat/contextEngineering.test.ts +0 -30
- package/src/services/chat/contextEngineering.ts +7 -17
- package/src/services/chat/helper.ts +7 -31
- package/src/services/chat/index.ts +5 -10
- package/src/services/chat/types.ts +1 -1
- package/src/services/chatGroup/index.ts +64 -9
- package/src/services/config.ts +1 -65
- package/src/services/export/index.ts +9 -4
- package/src/services/file/index.ts +59 -10
- package/src/services/import/index.ts +132 -7
- package/src/services/mcp.test.ts +777 -0
- package/src/services/mcp.ts +40 -6
- package/src/services/message/index.ts +203 -10
- package/src/services/message/{__tests__/server.test.ts → server.test.ts} +3 -3
- package/src/services/models.ts +2 -11
- package/src/services/plugin/index.test.ts +8 -0
- package/src/services/plugin/index.ts +51 -10
- package/src/services/session/index.test.ts +8 -0
- package/src/services/session/index.ts +143 -10
- package/src/services/tableViewer/client.ts +12 -15
- package/src/services/thread/index.test.ts +8 -0
- package/src/services/thread/index.ts +37 -7
- package/src/services/topic/index.test.ts +8 -0
- package/src/services/topic/index.ts +74 -10
- package/src/services/user/index.test.ts +8 -0
- package/src/services/user/index.ts +50 -11
- package/src/store/aiInfra/slices/aiModel/action.test.ts +17 -9
- package/src/store/chat/helpers.test.ts +99 -0
- package/src/store/chat/helpers.ts +21 -2
- package/src/store/chat/selectors.ts +1 -1
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +17 -251
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +339 -7
- package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +9 -5
- package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +49 -178
- package/src/store/chat/slices/aiChat/actions/generateAIChatV2.ts +272 -14
- package/src/store/chat/slices/aiChat/actions/generateAIGroupChat.ts +7 -2
- package/src/store/chat/slices/builtinTool/actions/index.ts +1 -4
- package/src/store/chat/slices/builtinTool/actions/search.ts +3 -3
- package/src/store/chat/slices/message/action.test.ts +157 -16
- package/src/store/chat/slices/message/action.ts +153 -77
- package/src/store/chat/slices/message/reducer.test.ts +363 -5
- package/src/store/chat/slices/message/reducer.ts +87 -3
- package/src/store/chat/slices/message/{selectors.test.ts → selectors/chat.test.ts} +266 -30
- package/src/store/chat/slices/message/{selectors.ts → selectors/chat.ts} +29 -79
- package/src/store/chat/slices/message/selectors/index.ts +2 -0
- package/src/store/chat/slices/message/selectors/messageState.test.ts +36 -0
- package/src/store/chat/slices/message/selectors/messageState.ts +80 -0
- package/src/store/chat/slices/plugin/action.test.ts +118 -157
- package/src/store/chat/slices/plugin/action.ts +53 -68
- package/src/store/chat/slices/thread/action.test.ts +13 -4
- package/src/store/chat/slices/thread/action.ts +3 -1
- package/src/store/chat/slices/topic/action.test.ts +1 -1
- package/src/store/chat/slices/topic/action.ts +1 -2
- package/src/store/chat/slices/topic/reducer.ts +1 -2
- package/src/store/file/slices/chat/action.ts +1 -4
- package/src/store/file/slices/fileManager/action.ts +2 -3
- package/src/store/global/store.ts +1 -7
- package/src/store/session/slices/sessionGroup/action.test.ts +5 -5
- package/src/store/tool/selectors/tool.test.ts +1 -1
- package/src/store/tool/selectors/tool.ts +6 -8
- package/src/store/tool/slices/builtin/action.test.ts +83 -35
- package/src/store/tool/slices/builtin/action.ts +0 -9
- package/src/store/tool/slices/builtin/selectors.test.ts +4 -30
- package/src/store/tool/slices/builtin/selectors.ts +15 -21
- package/src/store/tool/slices/mcpStore/action.test.ts +95 -3
- package/src/store/tool/slices/mcpStore/action.ts +177 -53
- package/src/store/tool/slices/oldStore/initialState.ts +1 -2
- package/src/store/user/initialState.ts +1 -7
- package/src/store/user/selectors.ts +1 -5
- package/src/store/user/slices/common/action.test.ts +1 -4
- package/src/store/user/slices/common/action.ts +5 -4
- package/src/store/user/slices/preference/action.ts +8 -1
- package/src/store/user/slices/preference/selectors/index.ts +2 -0
- package/src/store/user/slices/preference/selectors/labPrefer.ts +13 -0
- package/src/store/user/slices/preference/{selectors.ts → selectors/preference.ts} +0 -2
- package/src/store/user/slices/settings/selectors/index.ts +1 -0
- package/src/store/user/slices/settings/selectors/keyVaults.ts +21 -0
- package/src/store/user/store.ts +0 -3
- package/src/tools/index.ts +0 -6
- package/src/tools/renders.ts +0 -3
- package/src/tools/web-browsing/Portal/Search/Footer.tsx +2 -2
- package/src/tools/web-browsing/Render/Search/ConfigForm/Form.tsx +1 -1
- package/tsconfig.json +9 -3
- package/packages/const/src/guide.ts +0 -89
- package/packages/context-engine/src/providers/InboxGuide.ts +0 -102
- package/packages/context-engine/src/providers/__tests__/InboxGuideProvider.test.ts +0 -121
- package/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap +0 -104
- package/packages/utils/src/_deprecated/parseModels.test.ts +0 -287
- package/packages/utils/src/_deprecated/parseModels.ts +0 -165
- package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
- package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
- package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
- package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
- package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
- package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
- package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
- package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
- package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
- package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
- package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
- package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
- package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
- package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
- package/src/app/[variants]/loading/Client/Content.tsx +0 -48
- package/src/app/[variants]/loading/Client/Error.tsx +0 -27
- package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
- package/src/app/[variants]/loading/Client/index.tsx +0 -22
- package/src/components/InnerLink.tsx +0 -20
- package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
- package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
- package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
- package/src/database/_deprecated/core/db.ts +0 -246
- package/src/database/_deprecated/core/index.ts +0 -2
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
- package/src/database/_deprecated/core/model.ts +0 -218
- package/src/database/_deprecated/core/schemas.ts +0 -88
- package/src/database/_deprecated/core/types/db.ts +0 -15
- package/src/database/_deprecated/models/__DEBUG.ts +0 -124
- package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
- package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
- package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
- package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
- package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
- package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
- package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
- package/src/database/_deprecated/models/file.ts +0 -51
- package/src/database/_deprecated/models/message.ts +0 -277
- package/src/database/_deprecated/models/plugin.ts +0 -62
- package/src/database/_deprecated/models/session.ts +0 -271
- package/src/database/_deprecated/models/sessionGroup.ts +0 -93
- package/src/database/_deprecated/models/topic.ts +0 -250
- package/src/database/_deprecated/models/user.ts +0 -69
- package/src/database/_deprecated/schemas/files.ts +0 -39
- package/src/database/_deprecated/schemas/message.ts +0 -50
- package/src/database/_deprecated/schemas/plugin.ts +0 -12
- package/src/database/_deprecated/schemas/session.ts +0 -54
- package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
- package/src/database/_deprecated/schemas/topic.ts +0 -12
- package/src/database/_deprecated/schemas/user.ts +0 -40
- package/src/envs/__tests__/auth.test.ts +0 -200
- package/src/features/DataImporter/_deprecated.ts +0 -43
- package/src/features/InitClientDB/EnableModal.tsx +0 -118
- package/src/features/InitClientDB/ErrorResult.tsx +0 -143
- package/src/features/InitClientDB/InitIndicator.tsx +0 -124
- package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
- package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
- package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
- package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
- package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
- package/src/features/InitClientDB/index.tsx +0 -37
- package/src/hooks/_header.ts +0 -23
- package/src/libs/next-auth/sso-providers/azure-ad.ts +0 -33
- package/src/libs/trpc/client/edge.ts +0 -26
- package/src/libs/trpc/edge/context.ts +0 -71
- package/src/libs/trpc/edge/index.ts +0 -45
- package/src/libs/trpc/edge/init.ts +0 -26
- package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
- package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
- package/src/migrations/FromV0ToV1.ts +0 -10
- package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
- package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
- package/src/migrations/FromV1ToV2/index.ts +0 -82
- package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
- package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
- package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
- package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
- package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
- package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
- package/src/migrations/FromV2ToV3/index.ts +0 -30
- package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
- package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
- package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
- package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
- package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
- package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
- package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
- package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
- package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
- package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
- package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
- package/src/migrations/FromV3ToV4/index.ts +0 -102
- package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
- package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
- package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
- package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
- package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
- package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
- package/src/migrations/FromV4ToV5/index.ts +0 -58
- package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
- package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
- package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
- package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
- package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
- package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
- package/src/migrations/FromV5ToV6/index.ts +0 -61
- package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
- package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
- package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
- package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
- package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
- package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
- package/src/migrations/FromV6ToV7/index.ts +0 -101
- package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
- package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
- package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
- package/src/migrations/VersionController.test.ts +0 -88
- package/src/migrations/VersionController.ts +0 -67
- package/src/migrations/index.ts +0 -61
- package/src/server/globalConfig/_deprecated.test.ts +0 -92
- package/src/server/globalConfig/_deprecated.ts +0 -41
- package/src/server/routers/edge/appStatus.ts +0 -3
- package/src/server/routers/edge/index.ts +0 -14
- package/src/server/routers/edge/upload.ts +0 -16
- package/src/services/aiModel/client.ts +0 -70
- package/src/services/aiModel/server.test.ts +0 -122
- package/src/services/aiModel/server.ts +0 -51
- package/src/services/aiModel/type.ts +0 -32
- package/src/services/aiProvider/client.ts +0 -58
- package/src/services/aiProvider/server.ts +0 -43
- package/src/services/aiProvider/type.ts +0 -27
- package/src/services/baseClientService/index.ts +0 -9
- package/src/services/chat/__snapshots__/chat.test.ts.snap +0 -110
- package/src/services/chatGroup/client.ts +0 -63
- package/src/services/chatGroup/server.ts +0 -67
- package/src/services/chatGroup/type.ts +0 -22
- package/src/services/export/_deprecated.ts +0 -155
- package/src/services/export/client.ts +0 -15
- package/src/services/export/server.ts +0 -9
- package/src/services/export/type.ts +0 -5
- package/src/services/file/_deprecated.test.ts +0 -119
- package/src/services/file/_deprecated.ts +0 -80
- package/src/services/file/client.test.ts +0 -199
- package/src/services/file/client.ts +0 -85
- package/src/services/file/server.ts +0 -53
- package/src/services/file/type.ts +0 -13
- package/src/services/import/_deprecated.ts +0 -115
- package/src/services/import/client.test.ts +0 -1015
- package/src/services/import/client.ts +0 -64
- package/src/services/import/server.ts +0 -133
- package/src/services/import/type.ts +0 -17
- package/src/services/message/_deprecated.test.ts +0 -398
- package/src/services/message/_deprecated.ts +0 -168
- package/src/services/message/client.test.ts +0 -410
- package/src/services/message/client.ts +0 -186
- package/src/services/message/server.ts +0 -150
- package/src/services/message/type.ts +0 -54
- package/src/services/plugin/_deprecated.test.ts +0 -162
- package/src/services/plugin/_deprecated.ts +0 -42
- package/src/services/plugin/client.test.ts +0 -177
- package/src/services/plugin/client.ts +0 -46
- package/src/services/plugin/server.ts +0 -42
- package/src/services/plugin/type.ts +0 -23
- package/src/services/session/_deprecated.test.ts +0 -440
- package/src/services/session/_deprecated.ts +0 -190
- package/src/services/session/client.test.ts +0 -413
- package/src/services/session/client.ts +0 -193
- package/src/services/session/server.test.ts +0 -260
- package/src/services/session/server.ts +0 -125
- package/src/services/session/type.ts +0 -82
- package/src/services/thread/client.ts +0 -51
- package/src/services/thread/server.ts +0 -32
- package/src/services/thread/type.ts +0 -21
- package/src/services/topic/_deprecated.test.ts +0 -245
- package/src/services/topic/_deprecated.ts +0 -75
- package/src/services/topic/client.ts +0 -89
- package/src/services/topic/pglite.test.ts +0 -212
- package/src/services/topic/server.ts +0 -57
- package/src/services/topic/type.ts +0 -40
- package/src/services/user/_deprecated.test.ts +0 -101
- package/src/services/user/_deprecated.ts +0 -70
- package/src/services/user/client.test.ts +0 -108
- package/src/services/user/client.ts +0 -104
- package/src/services/user/server.test.ts +0 -149
- package/src/services/user/server.ts +0 -47
- package/src/services/user/type.ts +0 -21
- package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +0 -121
- package/src/store/chat/slices/builtinTool/actions/dalle.ts +0 -124
- package/src/store/global/actions/clientDb.ts +0 -67
- package/src/store/user/slices/modelList/__snapshots__/action.test.ts.snap +0 -12
- package/src/store/user/slices/modelList/action.test.ts +0 -359
- package/src/store/user/slices/modelList/action.ts +0 -223
- package/src/store/user/slices/modelList/initialState.ts +0 -15
- package/src/store/user/slices/modelList/reducers/customModelCard.test.ts +0 -204
- package/src/store/user/slices/modelList/reducers/customModelCard.ts +0 -64
- package/src/store/user/slices/modelList/selectors/index.ts +0 -3
- package/src/store/user/slices/modelList/selectors/keyVaults.test.ts +0 -201
- package/src/store/user/slices/modelList/selectors/keyVaults.ts +0 -50
- package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +0 -219
- package/src/store/user/slices/modelList/selectors/modelConfig.ts +0 -95
- package/src/store/user/slices/modelList/selectors/modelProvider.test.ts +0 -138
- package/src/store/user/slices/modelList/selectors/modelProvider.ts +0 -170
- package/src/tools/dalle/Render/GalleyGrid.tsx +0 -60
- package/src/tools/dalle/Render/Item/EditMode.tsx +0 -66
- package/src/tools/dalle/Render/Item/Error.tsx +0 -49
- package/src/tools/dalle/Render/Item/Image.tsx +0 -44
- package/src/tools/dalle/Render/Item/ImageFileItem.tsx +0 -57
- package/src/tools/dalle/Render/Item/index.tsx +0 -88
- package/src/tools/dalle/Render/ToolBar.tsx +0 -56
- package/src/tools/dalle/Render/index.tsx +0 -52
- package/src/tools/dalle/index.ts +0 -92
- /package/src/{app/[variants]/(main)/settings/provider/features/ProviderConfig → components/Skeleton}/SkeletonInput.tsx +0 -0
- /package/src/{middleware.ts → proxy.ts} +0 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { generateApiKey, isApiKeyExpired, validateApiKeyFormat } from './apiKey';
|
|
4
|
+
|
|
5
|
+
describe('apiKey', () => {
|
|
6
|
+
describe('generateApiKey', () => {
|
|
7
|
+
it('should generate API key with correct format', () => {
|
|
8
|
+
const apiKey = generateApiKey();
|
|
9
|
+
expect(apiKey).toMatch(/^lb-[\da-z]{16}$/);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('should generate API key with correct length', () => {
|
|
13
|
+
const apiKey = generateApiKey();
|
|
14
|
+
expect(apiKey).toHaveLength(19); // 'lb-' (3) + 16 characters
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('should generate unique API keys', () => {
|
|
18
|
+
const keys = new Set();
|
|
19
|
+
for (let i = 0; i < 100; i++) {
|
|
20
|
+
keys.add(generateApiKey());
|
|
21
|
+
}
|
|
22
|
+
// All 100 keys should be unique
|
|
23
|
+
expect(keys.size).toBe(100);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should start with lb- prefix', () => {
|
|
27
|
+
const apiKey = generateApiKey();
|
|
28
|
+
expect(apiKey.startsWith('lb-')).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('should only contain lowercase alphanumeric characters after prefix', () => {
|
|
32
|
+
const apiKey = generateApiKey();
|
|
33
|
+
const randomPart = apiKey.slice(3); // Remove 'lb-' prefix
|
|
34
|
+
expect(randomPart).toMatch(/^[\da-z]+$/);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
describe('isApiKeyExpired', () => {
|
|
39
|
+
it('should return false when expiresAt is null', () => {
|
|
40
|
+
expect(isApiKeyExpired(null)).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should return false when expiration date is in the future', () => {
|
|
44
|
+
const futureDate = new Date();
|
|
45
|
+
futureDate.setFullYear(futureDate.getFullYear() + 1); // 1 year from now
|
|
46
|
+
expect(isApiKeyExpired(futureDate)).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should return true when expiration date is in the past', () => {
|
|
50
|
+
const pastDate = new Date();
|
|
51
|
+
pastDate.setFullYear(pastDate.getFullYear() - 1); // 1 year ago
|
|
52
|
+
expect(isApiKeyExpired(pastDate)).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('should return true when expiration date is exactly now or just passed', () => {
|
|
56
|
+
const now = new Date();
|
|
57
|
+
now.setSeconds(now.getSeconds() - 1); // 1 second ago
|
|
58
|
+
expect(isApiKeyExpired(now)).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('should handle edge case of expiration date being very close to now', () => {
|
|
62
|
+
const almostNow = new Date();
|
|
63
|
+
almostNow.setMilliseconds(almostNow.getMilliseconds() - 1); // 1ms ago
|
|
64
|
+
expect(isApiKeyExpired(almostNow)).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe('validateApiKeyFormat', () => {
|
|
69
|
+
it('should validate correct API key format', () => {
|
|
70
|
+
const validKey = 'lb-1234567890abcdef';
|
|
71
|
+
expect(validateApiKeyFormat(validKey)).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('should accept keys with only numbers', () => {
|
|
75
|
+
const validKey = 'lb-1234567890123456';
|
|
76
|
+
expect(validateApiKeyFormat(validKey)).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('should accept keys with only lowercase letters', () => {
|
|
80
|
+
const validKey = 'lb-abcdefabcdefabcd';
|
|
81
|
+
expect(validateApiKeyFormat(validKey)).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should accept keys with mixed alphanumeric characters', () => {
|
|
85
|
+
const validKey = 'lb-abc123def456789a';
|
|
86
|
+
expect(validateApiKeyFormat(validKey)).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('should reject keys without lb- prefix', () => {
|
|
90
|
+
const invalidKey = '1234567890abcdef';
|
|
91
|
+
expect(validateApiKeyFormat(invalidKey)).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('should reject keys with wrong prefix', () => {
|
|
95
|
+
const invalidKey = 'lc-1234567890abcdef';
|
|
96
|
+
expect(validateApiKeyFormat(invalidKey)).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('should reject keys that are too short', () => {
|
|
100
|
+
const invalidKey = 'lb-123456789abcde';
|
|
101
|
+
expect(validateApiKeyFormat(invalidKey)).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should reject keys that are too long', () => {
|
|
105
|
+
const invalidKey = 'lb-1234567890abcdef0';
|
|
106
|
+
expect(validateApiKeyFormat(invalidKey)).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should reject keys with uppercase letters', () => {
|
|
110
|
+
const invalidKey = 'lb-1234567890ABCDEF';
|
|
111
|
+
expect(validateApiKeyFormat(invalidKey)).toBe(false);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('should reject keys with special characters', () => {
|
|
115
|
+
const invalidKey = 'lb-1234567890abcd-f';
|
|
116
|
+
expect(validateApiKeyFormat(invalidKey)).toBe(false);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('should reject empty string', () => {
|
|
120
|
+
expect(validateApiKeyFormat('')).toBe(false);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('should reject keys with spaces', () => {
|
|
124
|
+
const invalidKey = 'lb-1234567890abcd f';
|
|
125
|
+
expect(validateApiKeyFormat(invalidKey)).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('should validate generated keys', () => {
|
|
129
|
+
// Generate a key and validate it
|
|
130
|
+
const generatedKey = generateApiKey();
|
|
131
|
+
// Note: The validation pattern expects hex digits (0-9a-f), but generated keys use base36 (0-9a-z)
|
|
132
|
+
// This test will fail if there are non-hex characters (g-z) in the generated key
|
|
133
|
+
const hasOnlyHexChars = /^lb-[\da-f]{16}$/.test(generatedKey);
|
|
134
|
+
if (hasOnlyHexChars) {
|
|
135
|
+
expect(validateApiKeyFormat(generatedKey)).toBe(true);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
});
|
|
@@ -16,7 +16,7 @@ const copyUsingFallback = (imageUrl: string) => {
|
|
|
16
16
|
});
|
|
17
17
|
});
|
|
18
18
|
} catch {
|
|
19
|
-
//
|
|
19
|
+
// If toBlob or ClipboardItem is not supported, use data URL
|
|
20
20
|
const dataURL = canvas.toDataURL('image/png');
|
|
21
21
|
const textarea = document.createElement('textarea');
|
|
22
22
|
textarea.value = dataURL;
|
|
@@ -44,7 +44,7 @@ const copyUsingModernAPI = async (imageUrl: string) => {
|
|
|
44
44
|
};
|
|
45
45
|
|
|
46
46
|
export const copyImageToClipboard = async (imageUrl: string) => {
|
|
47
|
-
//
|
|
47
|
+
// Check if modern Clipboard API is supported
|
|
48
48
|
if (navigator.clipboard && 'write' in navigator.clipboard) {
|
|
49
49
|
await copyUsingModernAPI(imageUrl);
|
|
50
50
|
} else {
|
|
@@ -1,41 +1,41 @@
|
|
|
1
1
|
export const exportFile = (content: string, filename?: string) => {
|
|
2
|
-
//
|
|
2
|
+
// Create a Blob object
|
|
3
3
|
const blob = new Blob([content], { type: 'plain/text' });
|
|
4
4
|
|
|
5
|
-
//
|
|
5
|
+
// Create a URL object for download
|
|
6
6
|
const url = URL.createObjectURL(blob);
|
|
7
7
|
|
|
8
|
-
//
|
|
8
|
+
// Create an <a> element, set download link and filename
|
|
9
9
|
const a = document.createElement('a');
|
|
10
10
|
a.href = url;
|
|
11
11
|
a.download = filename || 'file.txt';
|
|
12
12
|
|
|
13
|
-
//
|
|
13
|
+
// Trigger the click event of the <a> element to start download
|
|
14
14
|
document.body.append(a);
|
|
15
15
|
a.click();
|
|
16
16
|
|
|
17
|
-
//
|
|
17
|
+
// After download is complete, clear the URL object
|
|
18
18
|
URL.revokeObjectURL(url);
|
|
19
19
|
a.remove();
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
export const exportJSONFile = (data: object, fileName: string) => {
|
|
23
|
-
//
|
|
23
|
+
// Create a Blob object
|
|
24
24
|
const blob = new Blob([JSON.stringify(data)], { type: 'application/json' });
|
|
25
25
|
|
|
26
|
-
//
|
|
26
|
+
// Create a URL object for download
|
|
27
27
|
const url = URL.createObjectURL(blob);
|
|
28
28
|
|
|
29
|
-
//
|
|
29
|
+
// Create an <a> element, set download link and filename
|
|
30
30
|
const a = document.createElement('a');
|
|
31
31
|
a.href = url;
|
|
32
32
|
a.download = fileName;
|
|
33
33
|
|
|
34
|
-
//
|
|
34
|
+
// Trigger the click event of the <a> element to start download
|
|
35
35
|
document.body.append(a);
|
|
36
36
|
a.click();
|
|
37
37
|
|
|
38
|
-
//
|
|
38
|
+
// After download is complete, clear the URL object
|
|
39
39
|
URL.revokeObjectURL(url);
|
|
40
40
|
a.remove();
|
|
41
41
|
};
|
|
@@ -10,7 +10,7 @@ const placeholderVariablesRegex = /{{(.*?)}}/g;
|
|
|
10
10
|
/* eslint-disable sort-keys-fix/sort-keys-fix */
|
|
11
11
|
export const VARIABLE_GENERATORS = {
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* Time-related template variables
|
|
14
14
|
*
|
|
15
15
|
* | Value | Example |
|
|
16
16
|
* |-------|---------|
|
|
@@ -46,12 +46,12 @@ export const VARIABLE_GENERATORS = {
|
|
|
46
46
|
year: () => new Date().getFullYear().toString(),
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
49
|
+
* User information template variables
|
|
50
50
|
*
|
|
51
51
|
* | Value | Example |
|
|
52
52
|
* |-------|---------|
|
|
53
53
|
* | `{{email}}` | demo@lobehub.com |
|
|
54
|
-
* | `{{nickname}}` |
|
|
54
|
+
* | `{{nickname}}` | Community User |
|
|
55
55
|
* | `{{username}}` | LobeChat |
|
|
56
56
|
*
|
|
57
57
|
*/
|
|
@@ -63,7 +63,7 @@ export const VARIABLE_GENERATORS = {
|
|
|
63
63
|
'',
|
|
64
64
|
|
|
65
65
|
/**
|
|
66
|
-
*
|
|
66
|
+
* Random value template variables
|
|
67
67
|
*
|
|
68
68
|
* | Value | Example |
|
|
69
69
|
* |-------|---------|
|
|
@@ -99,7 +99,7 @@ export const VARIABLE_GENERATORS = {
|
|
|
99
99
|
uuid_short: () => uuid().split('-')[0],
|
|
100
100
|
|
|
101
101
|
/**
|
|
102
|
-
*
|
|
102
|
+
* Platform-related template variables
|
|
103
103
|
*
|
|
104
104
|
* | Value | Example |
|
|
105
105
|
* |-------|---------|
|
|
@@ -114,9 +114,9 @@ export const VARIABLE_GENERATORS = {
|
|
|
114
114
|
} as Record<string, () => string>;
|
|
115
115
|
|
|
116
116
|
/**
|
|
117
|
-
*
|
|
118
|
-
* @param text
|
|
119
|
-
* @returns
|
|
117
|
+
* Extract all {{variable}} placeholder variable names from text
|
|
118
|
+
* @param text String containing template variables
|
|
119
|
+
* @returns Array of variable names, e.g., ['date', 'nickname']
|
|
120
120
|
*/
|
|
121
121
|
const extractPlaceholderVariables = (text: string): string[] => {
|
|
122
122
|
const matches = [...text.matchAll(placeholderVariablesRegex)];
|
|
@@ -124,15 +124,15 @@ const extractPlaceholderVariables = (text: string): string[] => {
|
|
|
124
124
|
};
|
|
125
125
|
|
|
126
126
|
/**
|
|
127
|
-
*
|
|
128
|
-
* @param text -
|
|
129
|
-
* @param depth -
|
|
130
|
-
* @returns
|
|
127
|
+
* Replace template variables with actual values, supporting recursive parsing of nested variables
|
|
128
|
+
* @param text - Original text containing variables
|
|
129
|
+
* @param depth - Recursion depth, default 1, set higher to support {{date}} within {{text}} etc.
|
|
130
|
+
* @returns Replaced text
|
|
131
131
|
*/
|
|
132
132
|
export const parsePlaceholderVariables = (text: string, depth = 2): string => {
|
|
133
133
|
let result = text;
|
|
134
134
|
|
|
135
|
-
//
|
|
135
|
+
// Recursive parsing to handle cases where {{text}} contains additional preset variables
|
|
136
136
|
for (let i = 0; i < depth; i++) {
|
|
137
137
|
try {
|
|
138
138
|
const variables = Object.fromEntries(
|
|
@@ -154,9 +154,9 @@ export const parsePlaceholderVariables = (text: string, depth = 2): string => {
|
|
|
154
154
|
};
|
|
155
155
|
|
|
156
156
|
/**
|
|
157
|
-
*
|
|
158
|
-
* @param messages
|
|
159
|
-
* @returns
|
|
157
|
+
* Parse message content, replace placeholder variables
|
|
158
|
+
* @param messages Original message array
|
|
159
|
+
* @returns Processed message array
|
|
160
160
|
*/
|
|
161
161
|
export const parsePlaceholderVariablesMessages = (messages: any[]): any[] =>
|
|
162
162
|
messages.map((message) => {
|
|
@@ -164,12 +164,12 @@ export const parsePlaceholderVariablesMessages = (messages: any[]): any[] =>
|
|
|
164
164
|
|
|
165
165
|
const { content } = message;
|
|
166
166
|
|
|
167
|
-
//
|
|
167
|
+
// Process string type directly
|
|
168
168
|
if (typeof content === 'string') {
|
|
169
169
|
return { ...message, content: parsePlaceholderVariables(content) };
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
-
//
|
|
172
|
+
// Process text elements in array type
|
|
173
173
|
if (Array.isArray(content)) {
|
|
174
174
|
return {
|
|
175
175
|
...message,
|
|
@@ -3,7 +3,7 @@ import dayjs from 'dayjs';
|
|
|
3
3
|
import isToday from 'dayjs/plugin/isToday';
|
|
4
4
|
import isYesterday from 'dayjs/plugin/isYesterday';
|
|
5
5
|
|
|
6
|
-
//
|
|
6
|
+
// Initialize dayjs plugins
|
|
7
7
|
dayjs.extend(isToday);
|
|
8
8
|
dayjs.extend(isYesterday);
|
|
9
9
|
|
|
@@ -19,32 +19,32 @@ const getTopicGroupId = (timestamp: number): TimeGroupId => {
|
|
|
19
19
|
return 'yesterday';
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
// 7
|
|
22
|
+
// Within 7 days (excluding today and yesterday)
|
|
23
23
|
const weekAgo = now.subtract(7, 'day');
|
|
24
24
|
if (date.isAfter(weekAgo) && !date.isToday() && !date.isYesterday()) {
|
|
25
25
|
return 'week';
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
//
|
|
29
|
-
//
|
|
28
|
+
// Current month (excluding dates already grouped above)
|
|
29
|
+
// Use native month and year comparison
|
|
30
30
|
if (date.month() === now.month() && date.year() === now.year()) {
|
|
31
31
|
return 'month';
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
//
|
|
34
|
+
// Other months of the current year
|
|
35
35
|
if (date.year() === now.year()) {
|
|
36
36
|
return `${date.year()}-${(date.month() + 1).toString().padStart(2, '0')}`;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
//
|
|
39
|
+
// Earlier years
|
|
40
40
|
return `${date.year()}`;
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
-
//
|
|
43
|
+
// Ensure group sorting
|
|
44
44
|
const sortGroups = (groups: GroupedTopic[]): GroupedTopic[] => {
|
|
45
45
|
const orderMap = new Map<string, number>();
|
|
46
46
|
|
|
47
|
-
//
|
|
47
|
+
// Set the order of fixed groups
|
|
48
48
|
orderMap.set('today', 0);
|
|
49
49
|
orderMap.set('yesterday', 1);
|
|
50
50
|
orderMap.set('week', 2);
|
|
@@ -58,12 +58,12 @@ const sortGroups = (groups: GroupedTopic[]): GroupedTopic[] => {
|
|
|
58
58
|
return orderA - orderB;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
//
|
|
61
|
+
// For year-month and year format groups, sort in descending chronological order
|
|
62
62
|
return b.id.localeCompare(a.id);
|
|
63
63
|
});
|
|
64
64
|
};
|
|
65
65
|
|
|
66
|
-
//
|
|
66
|
+
// Specific implementation of time grouping
|
|
67
67
|
export const groupTopicsByTime = (topics: ChatTopic[]): GroupedTopic[] => {
|
|
68
68
|
if (!topics.length) return [];
|
|
69
69
|
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import { SECRET_XOR_KEY } from '@/const/auth';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Convert string to Uint8Array (UTF-8 encoding)
|
|
5
5
|
*/
|
|
6
6
|
const stringToUint8Array = (str: string): Uint8Array => {
|
|
7
7
|
return new TextEncoder().encode(str);
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
* @param data
|
|
13
|
-
* @param key
|
|
14
|
-
* @returns
|
|
11
|
+
* Perform XOR operation on Uint8Array
|
|
12
|
+
* @param data The Uint8Array to process
|
|
13
|
+
* @param key The key used for XOR operation (Uint8Array)
|
|
14
|
+
* @returns The Uint8Array after XOR operation
|
|
15
15
|
*/
|
|
16
16
|
const xorProcess = (data: Uint8Array, key: Uint8Array): Uint8Array => {
|
|
17
17
|
const result = new Uint8Array(data.length);
|
|
18
18
|
for (const [i, datum] of data.entries()) {
|
|
19
|
-
result[i] = datum ^ key[i % key.length]; //
|
|
19
|
+
result[i] = datum ^ key[i % key.length]; // Key is used cyclically
|
|
20
20
|
}
|
|
21
21
|
return result;
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
26
|
-
* @param payload
|
|
27
|
-
* @returns Base64
|
|
25
|
+
* Obfuscate payload with XOR and encode to Base64
|
|
26
|
+
* @param payload The JSON object to obfuscate
|
|
27
|
+
* @returns The obfuscated string encoded in Base64
|
|
28
28
|
*/
|
|
29
29
|
export const obfuscatePayloadWithXOR = <T>(payload: T): string => {
|
|
30
30
|
const jsonString = JSON.stringify(payload);
|
|
@@ -33,7 +33,7 @@ export const obfuscatePayloadWithXOR = <T>(payload: T): string => {
|
|
|
33
33
|
|
|
34
34
|
const xoredBytes = xorProcess(dataBytes, keyBytes);
|
|
35
35
|
|
|
36
|
-
//
|
|
37
|
-
//
|
|
36
|
+
// Convert Uint8Array to Base64 string
|
|
37
|
+
// In browser environment, btoa can only handle Latin-1 characters, so we need to convert to a format suitable for btoa first
|
|
38
38
|
return btoa(String.fromCharCode(...xoredBytes));
|
|
39
39
|
};
|
|
@@ -29,9 +29,9 @@ export const getUserAuth = async () => {
|
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
33
|
-
* @param authHeader -
|
|
34
|
-
* @returns Bearer Token
|
|
32
|
+
* Extract Bearer Token from authorization header
|
|
33
|
+
* @param authHeader - Authorization header (e.g. "Bearer xxx")
|
|
34
|
+
* @returns Bearer Token or null (if authorization header is invalid or does not exist)
|
|
35
35
|
*/
|
|
36
36
|
export const extractBearerToken = (authHeader?: string | null): string | null => {
|
|
37
37
|
if (!authHeader) return null;
|
|
@@ -51,9 +51,9 @@ export const extractBearerToken = (authHeader?: string | null): string | null =>
|
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
/**
|
|
54
|
-
*
|
|
55
|
-
* @param authHeader - Oidc-Auth header
|
|
56
|
-
* @returns JWT token
|
|
54
|
+
* Extract JWT token from Oidc-Auth header
|
|
55
|
+
* @param authHeader - Oidc-Auth header value (e.g. "Oidc-Auth xxx")
|
|
56
|
+
* @returns JWT token or null (if authorization header is invalid or does not exist)
|
|
57
57
|
*/
|
|
58
58
|
export const extractOidcAuthToken = (authHeader?: string | null): string | null => {
|
|
59
59
|
if (!authHeader) return null;
|
|
@@ -13,19 +13,19 @@ const getLocalTime = (timeZone: string) => {
|
|
|
13
13
|
const isValidTimeZone = (timeZone: string) => {
|
|
14
14
|
try {
|
|
15
15
|
getLocalTime(timeZone);
|
|
16
|
-
return true; //
|
|
16
|
+
return true; // If no exception is thrown, the timezone is valid
|
|
17
17
|
} catch (e) {
|
|
18
|
-
//
|
|
18
|
+
// If a RangeError is caught, the timezone is invalid
|
|
19
19
|
if (e instanceof RangeError) {
|
|
20
20
|
return false;
|
|
21
21
|
}
|
|
22
|
-
//
|
|
22
|
+
// If it's another error, better to re-throw it
|
|
23
23
|
throw e;
|
|
24
24
|
}
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
export const parseDefaultThemeFromCountry = (request: NextRequest) => {
|
|
28
|
-
// 1.
|
|
28
|
+
// 1. Get country code from request headers
|
|
29
29
|
const geo = geolocation(request);
|
|
30
30
|
|
|
31
31
|
const countryCode =
|
|
@@ -35,22 +35,22 @@ export const parseDefaultThemeFromCountry = (request: NextRequest) => {
|
|
|
35
35
|
request.headers.get('x-zeabur-ip-country') || // Zeabur
|
|
36
36
|
request.headers.get('x-country-code'); // Netlify
|
|
37
37
|
|
|
38
|
-
//
|
|
38
|
+
// If no country code is obtained, return light theme directly
|
|
39
39
|
if (!countryCode) return 'light';
|
|
40
40
|
|
|
41
|
-
// 2.
|
|
41
|
+
// 2. Get timezone information for the country
|
|
42
42
|
const country = getCountry(countryCode);
|
|
43
43
|
|
|
44
|
-
//
|
|
44
|
+
// If country information is not found or the country has no timezone information, return light theme
|
|
45
45
|
if (!country?.timezones?.length) return 'light';
|
|
46
46
|
|
|
47
47
|
const timeZone = country.timezones.find((tz) => isValidTimeZone(tz));
|
|
48
48
|
if (!timeZone) return 'light';
|
|
49
49
|
|
|
50
|
-
// 3.
|
|
50
|
+
// 3. Get the current time in the country's first timezone
|
|
51
51
|
const localTime = getLocalTime(timeZone);
|
|
52
52
|
|
|
53
|
-
// 4.
|
|
53
|
+
// 4. Parse the hour and determine the theme
|
|
54
54
|
const localHour = parseInt(localTime);
|
|
55
55
|
// console.log(
|
|
56
56
|
// `[theme] Country: ${countryCode}, Timezone: ${country.timezones[0]}, LocalHour: ${localHour}`,
|
|
@@ -3,15 +3,15 @@ import { ClientSecretPayload } from '@lobechat/types';
|
|
|
3
3
|
import { SECRET_XOR_KEY } from '@/const/auth';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Convert Base64 string to Uint8Array
|
|
7
7
|
*/
|
|
8
8
|
const base64ToUint8Array = (base64: string): Uint8Array => {
|
|
9
|
-
// Node.js
|
|
9
|
+
// Use Buffer directly in Node.js environment
|
|
10
10
|
return Buffer.from(base64, 'base64');
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* Perform XOR operation on Uint8Array (same as the client-side xorProcess function)
|
|
15
15
|
*/
|
|
16
16
|
const xorProcess = (data: Uint8Array, key: Uint8Array): Uint8Array => {
|
|
17
17
|
const result = new Uint8Array(data.length);
|
|
@@ -22,7 +22,7 @@ const xorProcess = (data: Uint8Array, key: Uint8Array): Uint8Array => {
|
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
25
|
+
* Convert Uint8Array to string (UTF-8 decoding)
|
|
26
26
|
*/
|
|
27
27
|
const uint8ArrayToString = (arr: Uint8Array): string => {
|
|
28
28
|
return new TextDecoder().decode(arr);
|
|
@@ -31,13 +31,13 @@ const uint8ArrayToString = (arr: Uint8Array): string => {
|
|
|
31
31
|
export const getXorPayload = (token: string): ClientSecretPayload => {
|
|
32
32
|
const keyBytes = new TextEncoder().encode(SECRET_XOR_KEY);
|
|
33
33
|
|
|
34
|
-
// 1. Base64
|
|
34
|
+
// 1. Base64 decoding
|
|
35
35
|
const base64DecodedBytes = base64ToUint8Array(token);
|
|
36
36
|
|
|
37
|
-
// 2. XOR
|
|
37
|
+
// 2. XOR deobfuscation
|
|
38
38
|
const xorDecryptedBytes = xorProcess(base64DecodedBytes, keyBytes);
|
|
39
39
|
|
|
40
|
-
// 3.
|
|
40
|
+
// 3. Convert to string and parse JSON
|
|
41
41
|
const decodedJsonString = uint8ArrayToString(xorDecryptedBytes);
|
|
42
42
|
|
|
43
43
|
return JSON.parse(decodedJsonString) as ClientSecretPayload;
|
|
@@ -3,36 +3,55 @@ import { NetworkConnectionError, PageNotFoundError, TimeoutError } from '../util
|
|
|
3
3
|
import { DEFAULT_TIMEOUT, withTimeout } from '../utils/withTimeout';
|
|
4
4
|
|
|
5
5
|
interface FirecrawlMetadata {
|
|
6
|
-
description
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
description?: string;
|
|
7
|
+
error?: string;
|
|
8
|
+
keywords?: string;
|
|
9
|
+
language?: string;
|
|
9
10
|
ogDescription?: string;
|
|
10
11
|
ogImage?: string;
|
|
11
12
|
ogLocaleAlternate?: string[];
|
|
12
13
|
ogSiteName?: string;
|
|
13
14
|
ogTitle?: string;
|
|
14
15
|
ogUrl?: string;
|
|
15
|
-
robots
|
|
16
|
-
statusCode: number;
|
|
16
|
+
robots?: string;
|
|
17
17
|
sourceURL: string;
|
|
18
|
-
|
|
18
|
+
statusCode: number;
|
|
19
|
+
title?: string;
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
interface FirecrawlResults {
|
|
23
|
+
actions?: {
|
|
24
|
+
javascriptReturns?: Array<{ type: string; value: any }>;
|
|
25
|
+
pdfs?: string[];
|
|
26
|
+
scrapes?: Array<{ html: string; url: string }>;
|
|
27
|
+
screenshots?: string[];
|
|
28
|
+
};
|
|
29
|
+
changeTracking?: {
|
|
30
|
+
changeStatus?: string;
|
|
31
|
+
diff?: string;
|
|
32
|
+
json?: Record<string, any>;
|
|
33
|
+
previousScrapeAt?: string;
|
|
34
|
+
visibility?: string;
|
|
35
|
+
};
|
|
22
36
|
html?: string;
|
|
37
|
+
links?: string[];
|
|
23
38
|
markdown?: string;
|
|
24
39
|
metadata: FirecrawlMetadata;
|
|
40
|
+
rawHtml?: string;
|
|
41
|
+
screenshot?: string;
|
|
42
|
+
summary?: string;
|
|
43
|
+
warning?: string;
|
|
25
44
|
}
|
|
26
45
|
|
|
27
46
|
interface FirecrawlResponse {
|
|
28
|
-
success: boolean;
|
|
29
47
|
data: FirecrawlResults;
|
|
48
|
+
success: boolean;
|
|
30
49
|
}
|
|
31
50
|
|
|
32
51
|
export const firecrawl: CrawlImpl = async (url) => {
|
|
33
52
|
// Get API key from environment variable
|
|
34
53
|
const apiKey = process.env.FIRECRAWL_API_KEY;
|
|
35
|
-
const baseUrl = process.env.FIRECRAWL_URL || 'https://api.firecrawl.dev/
|
|
54
|
+
const baseUrl = process.env.FIRECRAWL_URL || 'https://api.firecrawl.dev/v2';
|
|
36
55
|
|
|
37
56
|
let res: Response;
|
|
38
57
|
|
|
@@ -40,7 +59,7 @@ export const firecrawl: CrawlImpl = async (url) => {
|
|
|
40
59
|
res = await withTimeout(
|
|
41
60
|
fetch(`${baseUrl}/scrape`, {
|
|
42
61
|
body: JSON.stringify({
|
|
43
|
-
formats: [
|
|
62
|
+
formats: ['markdown'], // ["markdown", "html"]
|
|
44
63
|
url,
|
|
45
64
|
}),
|
|
46
65
|
headers: {
|
|
@@ -75,6 +94,14 @@ export const firecrawl: CrawlImpl = async (url) => {
|
|
|
75
94
|
try {
|
|
76
95
|
const data = (await res.json()) as FirecrawlResponse;
|
|
77
96
|
|
|
97
|
+
if (data.data.warning) {
|
|
98
|
+
console.warn('[Firecrawl] Warning:', data.data.warning);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (data.data.metadata.error) {
|
|
102
|
+
console.error('[Firecrawl] Metadata error:', data.data.metadata.error);
|
|
103
|
+
}
|
|
104
|
+
|
|
78
105
|
// Check if content is empty or too short
|
|
79
106
|
if (!data.data.markdown || data.data.markdown.length < 100) {
|
|
80
107
|
return;
|
|
@@ -83,14 +110,14 @@ export const firecrawl: CrawlImpl = async (url) => {
|
|
|
83
110
|
return {
|
|
84
111
|
content: data.data.markdown,
|
|
85
112
|
contentType: 'text',
|
|
86
|
-
description: data.data.metadata.description,
|
|
113
|
+
description: data.data.metadata.description || '',
|
|
87
114
|
length: data.data.markdown.length,
|
|
88
115
|
siteName: new URL(url).hostname,
|
|
89
|
-
title: data.data.metadata.title,
|
|
116
|
+
title: data.data.metadata.title || '',
|
|
90
117
|
url: url,
|
|
91
118
|
} satisfies CrawlSuccessResult;
|
|
92
119
|
} catch (error) {
|
|
93
|
-
console.error(error);
|
|
120
|
+
console.error('[Firecrawl] Parse error:', error);
|
|
94
121
|
}
|
|
95
122
|
|
|
96
123
|
return;
|