diff --git a/.github/scripts/docker-pr-comment.js b/.github/scripts/docker-pr-comment.js new file mode 100644 index 00000000000..deeca89e38f --- /dev/null +++ b/.github/scripts/docker-pr-comment.js @@ -0,0 +1,89 @@ +/** + * Generate or update PR comment with Docker build info + */ +module.exports = async ({ + github, + context, + dockerMetaJson, + image, + version, + dockerhubUrl, + platforms, +}) => { + const COMMENT_IDENTIFIER = ''; + + const parseTags = () => { + try { + if (dockerMetaJson) { + const parsed = JSON.parse(dockerMetaJson); + if (Array.isArray(parsed.tags) && parsed.tags.length > 0) { + return parsed.tags; + } + } + } catch (e) { + // ignore parsing error, fallback below + } + if (image && version) { + return [`${image}:${version}`]; + } + return []; + }; + + const generateCommentBody = () => { + const tags = parseTags(); + const buildTime = new Date().toISOString(); + + // Use the first tag as the main version + const mainTag = tags.length > 0 ? tags[0] : `${image}:${version}`; + const tagVersion = mainTag.includes(':') ? mainTag.split(':')[1] : version; + + return [ + COMMENT_IDENTIFIER, + '', + '### 🐳 Database Docker Build Completed!', + `**Version**: \`${tagVersion || 'N/A'}\``, + `**Build Time**: \`${buildTime}\``, + '', + dockerhubUrl ? `🔗 View all tags on Docker Hub: ${dockerhubUrl}` : '', + '', + '### Pull Image', + 'Download the Docker image to your local machine:', + '', + '```bash', + `docker pull ${mainTag}`, + '```', + '> [!IMPORTANT]', + '> This build is for testing and validation purposes.', + ] + .filter(Boolean) + .join('\n'); + }; + + const body = generateCommentBody(); + + // List comments on the PR + const { data: comments } = await github.rest.issues.listComments({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + }); + + const existing = comments.find((c) => c.body && c.body.includes(COMMENT_IDENTIFIER)); + if (existing) { + await github.rest.issues.updateComment({ + comment_id: existing.id, + owner: context.repo.owner, + repo: context.repo.repo, + body, + }); + return { updated: true, id: existing.id }; + } + + const result = await github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body, + }); + return { updated: false, id: result.data.id }; +}; diff --git a/.github/workflows/docker-database.yml b/.github/workflows/docker-database.yml index cc230bbf10e..02089192d0f 100644 --- a/.github/workflows/docker-database.yml +++ b/.github/workflows/docker-database.yml @@ -159,3 +159,24 @@ jobs: - name: Inspect image run: | docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} + + + - name: Comment on PR with Docker build info + if: github.event_name == 'pull_request' + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prComment = require('${{ github.workspace }}/.github/scripts/docker-pr-comment.js'); + const result = await prComment({ + github, + context, + dockerMetaJson: ${{ toJSON(steps.meta.outputs.json) }}, + image: "${{ env.REGISTRY_IMAGE }}", + version: "${{ steps.meta.outputs.version }}", + dockerhubUrl: "https://hub.docker.com/r/${{ env.REGISTRY_IMAGE }}/tags", + platforms: "linux/amd64, linux/arm64", + }); + core.info(`Status: ${result.updated ? 'Updated' : 'Created'}, ID: ${result.id}`); + + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b36061b44b8..bdd6eb10758 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,7 +11,7 @@ jobs: services: postgres: - image: pgvector/pgvector:pg17 + image: paradedb/paradedb:latest env: POSTGRES_PASSWORD: postgres options: >- @@ -38,8 +38,10 @@ jobs: - name: Lint run: bun run lint - - name: Test Server Coverage - run: bun run test-server:coverage + - uses: pnpm/action-setup@v4 + + - name: Test Database Coverage + run: pnpm --filter @lobechat/database test env: DATABASE_TEST_URL: postgresql://postgres:postgres@localhost:5432/postgres DATABASE_DRIVER: node @@ -48,8 +50,8 @@ jobs: S3_PUBLIC_DOMAIN: https://example.com APP_URL: https://home.com - - name: Test App Coverage - run: bun run test-app:coverage + - name: Test App + run: bun run test-app - name: Release run: bun run release diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a0e92386005..49fc7609e35 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - package: [file-loaders, prompts, model-runtime, web-crawler, electron-server-ipc] + package: [file-loaders, prompts, model-runtime, web-crawler, electron-server-ipc, utils] name: Test package ${{ matrix.package }} @@ -75,7 +75,7 @@ jobs: files: ./coverage/app/lcov.info flags: app - test-server: + test-databsae: name: Test Database runs-on: ubuntu-latest @@ -109,8 +109,10 @@ jobs: - name: Lint run: bun run lint - - name: Test Server Coverage - run: bun run test-server:coverage + - uses: pnpm/action-setup@v4 + + - name: Test Coverage + run: pnpm --filter @lobechat/database test:coverage env: DATABASE_TEST_URL: postgresql://postgres:postgres@localhost:5432/postgres DATABASE_DRIVER: node @@ -119,9 +121,9 @@ jobs: S3_PUBLIC_DOMAIN: https://example.com APP_URL: https://home.com - - name: Upload Server coverage to Codecov + - name: Upload Database coverage to Codecov uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} - files: ./coverage/server/lcov.info - flags: server + files: ./packages/database/coverage/lcov.info + flags: database diff --git a/CHANGELOG.md b/CHANGELOG.md index d6526aa91b3..d1ae71e06a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,56 @@ # Changelog +### [Version 1.114.5](https://github.com/lobehub/lobe-chat/compare/v1.114.4...v1.114.5) + +Released on **2025-08-22** + +#### 💄 Styles + +- **misc**: Update mistral model vision ability. + +
+ +
+Improvements and Fixes + +#### Styles + +- **misc**: Update mistral model vision ability, closes [#8885](https://github.com/lobehub/lobe-chat/issues/8885) ([915c0ff](https://github.com/lobehub/lobe-chat/commit/915c0ff)) + +
+ +
+ +[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top) + +
+ +### [Version 1.114.4](https://github.com/lobehub/lobe-chat/compare/v1.114.3...v1.114.4) + +Released on **2025-08-22** + +#### ♻ Code Refactoring + +- **misc**: Move database to packages. + +
+ +
+Improvements and Fixes + +#### Code refactoring + +- **misc**: Move database to packages, closes [#8874](https://github.com/lobehub/lobe-chat/issues/8874) ([af1f715](https://github.com/lobehub/lobe-chat/commit/af1f715)) + +
+ +
+ +[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top) + +
+ ### [Version 1.114.3](https://github.com/lobehub/lobe-chat/compare/v1.114.2...v1.114.3) Released on **2025-08-21** diff --git a/Dockerfile.database b/Dockerfile.database index 5123ae77a61..523c01ef602 100644 --- a/Dockerfile.database +++ b/Dockerfile.database @@ -120,7 +120,7 @@ COPY --from=base /distroless/ / COPY --from=builder /app/.next/standalone /app/ # Copy database migrations -COPY --from=builder /app/src/database/migrations /app/migrations +COPY --from=builder /app/packages/database/migrations /app/migrations COPY --from=builder /app/scripts/migrateServerDB/docker.cjs /app/docker.cjs COPY --from=builder /app/scripts/migrateServerDB/errorHint.js /app/errorHint.js diff --git a/changelog/v1.json b/changelog/v1.json index 64b4e9721ff..c50294a39ef 100644 --- a/changelog/v1.json +++ b/changelog/v1.json @@ -1,4 +1,18 @@ [ + { + "children": { + "improvements": ["Update mistral model vision ability."] + }, + "date": "2025-08-22", + "version": "1.114.5" + }, + { + "children": { + "improvements": ["Move database to packages."] + }, + "date": "2025-08-22", + "version": "1.114.4" + }, { "children": {}, "date": "2025-08-21", diff --git a/codecov.yml b/codecov.yml index 5fb59f6206c..2f3787a9ca1 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,11 +1,39 @@ +component_management: + individual_components: + # App architecture layers + - component_id: app_store + name: "Store" + paths: + - src/store/** + - component_id: app_services + name: "Services" + paths: + - src/services/** + - component_id: app_server + name: "Server" + paths: + - src/server/** + - component_id: app_libs + name: "Libs" + paths: + - src/libs/** + - component_id: app_utils + name: "Utils" + paths: + - src/utils/** + coverage: status: project: default: off - server: + database: flags: - - server + - database app: flags: - app patch: off + + +comment: + layout: "header, diff, flags, components" # show component info in the PR comment diff --git a/docs/development/database-schema.dbml b/docs/development/database-schema.dbml index 5a4a680de4e..f9d8af6f1dc 100644 --- a/docs/development/database-schema.dbml +++ b/docs/development/database-schema.dbml @@ -104,6 +104,19 @@ table ai_providers { } } +table api_keys { + id integer [pk, not null] + name varchar(256) [not null] + key varchar(256) [not null, unique] + enabled boolean [default: true] + expires_at "timestamp with time zone" + last_used_at "timestamp with time zone" + user_id text [not null] + accessed_at "timestamp with time zone" [not null, default: `now()`] + created_at "timestamp with time zone" [not null, default: `now()`] + updated_at "timestamp with time zone" [not null, default: `now()`] +} + table async_tasks { id uuid [pk, not null, default: `gen_random_uuid()`] type text @@ -702,6 +715,7 @@ table rbac_roles { description text is_system boolean [not null, default: false] is_active boolean [not null, default: true] + metadata jsonb [default: `{}`] accessed_at "timestamp with time zone" [not null, default: `now()`] created_at "timestamp with time zone" [not null, default: `now()`] updated_at "timestamp with time zone" [not null, default: `now()`] diff --git a/drizzle.config.ts b/drizzle.config.ts index 3d71493a53a..d47ed2f7110 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -22,8 +22,8 @@ export default { url: connectionString, }, dialect: 'postgresql', - out: './src/database/migrations', + out: './packages/database/migrations', - schema: './src/database/schemas', + schema: './packages/database/src/schemas', strict: true, } satisfies Config; diff --git a/package.json b/package.json index d47fdd55fd8..7731d78a4b9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@lobehub/chat", - "version": "1.114.3", + "version": "1.114.5", "description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.", "keywords": [ "framework", @@ -73,8 +73,6 @@ "test": "npm run test-app && npm run test-server", "test-app": "vitest run --config vitest.config.ts", "test-app:coverage": "vitest run --config vitest.config.ts --coverage", - "test-server": "vitest run --config vitest.config.server.ts", - "test-server:coverage": "vitest run --config vitest.config.server.ts --coverage", "test:update": "vitest -u", "type-check": "tsgo --noEmit", "webhook:ngrok": "ngrok http http://localhost:3011", @@ -141,11 +139,14 @@ "@icons-pack/react-simple-icons": "9.6.0", "@khmyznikov/pwa-install": "0.3.9", "@langchain/community": "^0.3.50", + "@lobechat/const": "workspace:*", + "@lobechat/database": "workspace:*", "@lobechat/electron-client-ipc": "workspace:*", "@lobechat/electron-server-ipc": "workspace:*", "@lobechat/file-loaders": "workspace:*", "@lobechat/model-runtime": "workspace:*", "@lobechat/prompts": "workspace:*", + "@lobechat/utils": "workspace:*", "@lobechat/web-crawler": "workspace:*", "@lobehub/analytics": "^1.6.0", "@lobehub/charts": "^2.0.0", @@ -361,8 +362,7 @@ "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "vite": "^5.4.19", - "vitest": "^3.2.4", - "vitest-canvas-mock": "^0.3.3" + "vitest": "^3.2.4" }, "packageManager": "pnpm@10.14.0", "publishConfig": { diff --git a/packages/const/src/index.ts b/packages/const/src/index.ts index 38f27f79d53..99e9bbcbd84 100644 --- a/packages/const/src/index.ts +++ b/packages/const/src/index.ts @@ -1,2 +1,4 @@ +export * from './locale'; +export * from './message'; export * from './settings'; export * from './version'; diff --git a/src/utils/genUserLLMConfig.test.ts b/packages/const/src/settings/genUserLLMConfig.test.ts similarity index 95% rename from src/utils/genUserLLMConfig.test.ts rename to packages/const/src/settings/genUserLLMConfig.test.ts index 1de80257883..1a93bd3bb8b 100644 --- a/src/utils/genUserLLMConfig.test.ts +++ b/packages/const/src/settings/genUserLLMConfig.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest'; -import { ModelProviderCard } from '@/types/llm'; +import { ModelProviderCard } from '@/types/index'; import { genUserLLMConfig } from './genUserLLMConfig'; diff --git a/src/utils/genUserLLMConfig.ts b/packages/const/src/settings/genUserLLMConfig.ts similarity index 94% rename from src/utils/genUserLLMConfig.ts rename to packages/const/src/settings/genUserLLMConfig.ts index 3ef7c73e142..61dffce9043 100644 --- a/src/utils/genUserLLMConfig.ts +++ b/packages/const/src/settings/genUserLLMConfig.ts @@ -1,8 +1,8 @@ import { ModelProvider } from '@lobechat/model-runtime'; +import { UserModelProviderConfig } from '@lobechat/types'; import * as ProviderCards from '@/config/modelProviders'; import { ModelProviderCard } from '@/types/llm'; -import { UserModelProviderConfig } from '@/types/user/settings'; export const genUserLLMConfig = (specificConfig: Record): UserModelProviderConfig => { return Object.keys(ModelProvider).reduce((config, providerKey) => { diff --git a/packages/const/src/settings/index.ts b/packages/const/src/settings/index.ts index a872a509ad4..90141286f77 100644 --- a/packages/const/src/settings/index.ts +++ b/packages/const/src/settings/index.ts @@ -9,8 +9,6 @@ import { DEFAULT_SYSTEM_AGENT_CONFIG } from './systemAgent'; import { DEFAULT_TOOL_CONFIG } from './tool'; import { DEFAULT_TTS_CONFIG } from './tts'; -export const COOKIE_CACHE_DAYS = 30; - export * from './agent'; export * from './hotkey'; export * from './llm'; diff --git a/packages/const/src/settings/llm.ts b/packages/const/src/settings/llm.ts index f2c7d99a495..690d8a424a7 100644 --- a/packages/const/src/settings/llm.ts +++ b/packages/const/src/settings/llm.ts @@ -1,6 +1,6 @@ import { ModelProvider } from '@lobechat/model-runtime'; -import { genUserLLMConfig } from '@/utils/genUserLLMConfig'; +import { genUserLLMConfig } from './genUserLLMConfig'; export const DEFAULT_LLM_CONFIG = genUserLLMConfig({ lmstudio: { diff --git a/src/database/migrations/0000_init.sql b/packages/database/migrations/0000_init.sql similarity index 100% rename from src/database/migrations/0000_init.sql rename to packages/database/migrations/0000_init.sql diff --git a/src/database/migrations/0001_add_client_id.sql b/packages/database/migrations/0001_add_client_id.sql similarity index 100% rename from src/database/migrations/0001_add_client_id.sql rename to packages/database/migrations/0001_add_client_id.sql diff --git a/src/database/migrations/0002_amusing_puma.sql b/packages/database/migrations/0002_amusing_puma.sql similarity index 100% rename from src/database/migrations/0002_amusing_puma.sql rename to packages/database/migrations/0002_amusing_puma.sql diff --git a/src/database/migrations/0003_naive_echo.sql b/packages/database/migrations/0003_naive_echo.sql similarity index 100% rename from src/database/migrations/0003_naive_echo.sql rename to packages/database/migrations/0003_naive_echo.sql diff --git a/src/database/migrations/0004_add_next_auth.sql b/packages/database/migrations/0004_add_next_auth.sql similarity index 100% rename from src/database/migrations/0004_add_next_auth.sql rename to packages/database/migrations/0004_add_next_auth.sql diff --git a/src/database/migrations/0005_pgvector.sql b/packages/database/migrations/0005_pgvector.sql similarity index 100% rename from src/database/migrations/0005_pgvector.sql rename to packages/database/migrations/0005_pgvector.sql diff --git a/src/database/migrations/0006_add_knowledge_base.sql b/packages/database/migrations/0006_add_knowledge_base.sql similarity index 100% rename from src/database/migrations/0006_add_knowledge_base.sql rename to packages/database/migrations/0006_add_knowledge_base.sql diff --git a/src/database/migrations/0007_fix_embedding_table.sql b/packages/database/migrations/0007_fix_embedding_table.sql similarity index 100% rename from src/database/migrations/0007_fix_embedding_table.sql rename to packages/database/migrations/0007_fix_embedding_table.sql diff --git a/src/database/migrations/0008_add_rag_evals.sql b/packages/database/migrations/0008_add_rag_evals.sql similarity index 100% rename from src/database/migrations/0008_add_rag_evals.sql rename to packages/database/migrations/0008_add_rag_evals.sql diff --git a/src/database/migrations/0009_remove_unused_user_tables.sql b/packages/database/migrations/0009_remove_unused_user_tables.sql similarity index 100% rename from src/database/migrations/0009_remove_unused_user_tables.sql rename to packages/database/migrations/0009_remove_unused_user_tables.sql diff --git a/src/database/migrations/0010_add_accessed_at_and_clean_tables.sql b/packages/database/migrations/0010_add_accessed_at_and_clean_tables.sql similarity index 100% rename from src/database/migrations/0010_add_accessed_at_and_clean_tables.sql rename to packages/database/migrations/0010_add_accessed_at_and_clean_tables.sql diff --git a/src/database/migrations/0011_add_topic_history_summary.sql b/packages/database/migrations/0011_add_topic_history_summary.sql similarity index 100% rename from src/database/migrations/0011_add_topic_history_summary.sql rename to packages/database/migrations/0011_add_topic_history_summary.sql diff --git a/src/database/migrations/0012_add_thread.sql b/packages/database/migrations/0012_add_thread.sql similarity index 100% rename from src/database/migrations/0012_add_thread.sql rename to packages/database/migrations/0012_add_thread.sql diff --git a/src/database/migrations/0013_add_ai_infra.sql b/packages/database/migrations/0013_add_ai_infra.sql similarity index 100% rename from src/database/migrations/0013_add_ai_infra.sql rename to packages/database/migrations/0013_add_ai_infra.sql diff --git a/src/database/migrations/0014_add_message_reasoning.sql b/packages/database/migrations/0014_add_message_reasoning.sql similarity index 100% rename from src/database/migrations/0014_add_message_reasoning.sql rename to packages/database/migrations/0014_add_message_reasoning.sql diff --git a/src/database/migrations/0015_add_message_search_metadata.sql b/packages/database/migrations/0015_add_message_search_metadata.sql similarity index 100% rename from src/database/migrations/0015_add_message_search_metadata.sql rename to packages/database/migrations/0015_add_message_search_metadata.sql diff --git a/src/database/migrations/0016_add_message_index.sql b/packages/database/migrations/0016_add_message_index.sql similarity index 100% rename from src/database/migrations/0016_add_message_index.sql rename to packages/database/migrations/0016_add_message_index.sql diff --git a/src/database/migrations/0017_add_user_id_to_tables.sql b/packages/database/migrations/0017_add_user_id_to_tables.sql similarity index 100% rename from src/database/migrations/0017_add_user_id_to_tables.sql rename to packages/database/migrations/0017_add_user_id_to_tables.sql diff --git a/src/database/migrations/0018_add_client_id_for_entities.sql b/packages/database/migrations/0018_add_client_id_for_entities.sql similarity index 100% rename from src/database/migrations/0018_add_client_id_for_entities.sql rename to packages/database/migrations/0018_add_client_id_for_entities.sql diff --git a/src/database/migrations/0019_add_hotkey_user_settings.sql b/packages/database/migrations/0019_add_hotkey_user_settings.sql similarity index 100% rename from src/database/migrations/0019_add_hotkey_user_settings.sql rename to packages/database/migrations/0019_add_hotkey_user_settings.sql diff --git a/src/database/migrations/0020_add_oidc.sql b/packages/database/migrations/0020_add_oidc.sql similarity index 100% rename from src/database/migrations/0020_add_oidc.sql rename to packages/database/migrations/0020_add_oidc.sql diff --git a/src/database/migrations/0021_add_agent_opening_settings.sql b/packages/database/migrations/0021_add_agent_opening_settings.sql similarity index 100% rename from src/database/migrations/0021_add_agent_opening_settings.sql rename to packages/database/migrations/0021_add_agent_opening_settings.sql diff --git a/src/database/migrations/0022_add_documents.sql b/packages/database/migrations/0022_add_documents.sql similarity index 100% rename from src/database/migrations/0022_add_documents.sql rename to packages/database/migrations/0022_add_documents.sql diff --git a/src/database/migrations/0023_remove_param_and_doubao.sql b/packages/database/migrations/0023_remove_param_and_doubao.sql similarity index 100% rename from src/database/migrations/0023_remove_param_and_doubao.sql rename to packages/database/migrations/0023_remove_param_and_doubao.sql diff --git a/src/database/migrations/0024_add_rbac_tables.sql b/packages/database/migrations/0024_add_rbac_tables.sql similarity index 100% rename from src/database/migrations/0024_add_rbac_tables.sql rename to packages/database/migrations/0024_add_rbac_tables.sql diff --git a/src/database/migrations/0025_add_provider_config.sql b/packages/database/migrations/0025_add_provider_config.sql similarity index 100% rename from src/database/migrations/0025_add_provider_config.sql rename to packages/database/migrations/0025_add_provider_config.sql diff --git a/src/database/migrations/0026_add_autovacuum_tuning.sql b/packages/database/migrations/0026_add_autovacuum_tuning.sql similarity index 100% rename from src/database/migrations/0026_add_autovacuum_tuning.sql rename to packages/database/migrations/0026_add_autovacuum_tuning.sql diff --git a/src/database/migrations/0027_ai_image.sql b/packages/database/migrations/0027_ai_image.sql similarity index 100% rename from src/database/migrations/0027_ai_image.sql rename to packages/database/migrations/0027_ai_image.sql diff --git a/src/database/migrations/0028_oauth_handoffs.sql b/packages/database/migrations/0028_oauth_handoffs.sql similarity index 86% rename from src/database/migrations/0028_oauth_handoffs.sql rename to packages/database/migrations/0028_oauth_handoffs.sql index af84afd9642..270b21134d3 100644 --- a/src/database/migrations/0028_oauth_handoffs.sql +++ b/packages/database/migrations/0028_oauth_handoffs.sql @@ -1,4 +1,4 @@ -CREATE TABLE "oauth_handoffs" ( +CREATE TABLE IF NOT EXISTS "oauth_handoffs" ( "id" text PRIMARY KEY NOT NULL, "client" varchar(50) NOT NULL, "payload" jsonb NOT NULL, diff --git a/src/database/migrations/0029_add_apikey_manage.sql b/packages/database/migrations/0029_add_apikey_manage.sql similarity index 88% rename from src/database/migrations/0029_add_apikey_manage.sql rename to packages/database/migrations/0029_add_apikey_manage.sql index 5823eed015a..d7ff070a472 100644 --- a/src/database/migrations/0029_add_apikey_manage.sql +++ b/packages/database/migrations/0029_add_apikey_manage.sql @@ -12,5 +12,5 @@ CREATE TABLE IF NOT EXISTS "api_keys" ( CONSTRAINT "api_keys_key_unique" UNIQUE("key") ); --> statement-breakpoint -ALTER TABLE "rbac_roles" ADD COLUMN "metadata" jsonb DEFAULT '{}'::jsonb;--> statement-breakpoint +ALTER TABLE "rbac_roles" ADD COLUMN IF NOT EXISTS "metadata" jsonb DEFAULT '{}'::jsonb;--> statement-breakpoint ALTER TABLE "api_keys" ADD CONSTRAINT "api_keys_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; diff --git a/src/database/migrations/meta/0000_snapshot.json b/packages/database/migrations/meta/0000_snapshot.json similarity index 100% rename from src/database/migrations/meta/0000_snapshot.json rename to packages/database/migrations/meta/0000_snapshot.json diff --git a/src/database/migrations/meta/0001_snapshot.json b/packages/database/migrations/meta/0001_snapshot.json similarity index 100% rename from src/database/migrations/meta/0001_snapshot.json rename to packages/database/migrations/meta/0001_snapshot.json diff --git a/src/database/migrations/meta/0002_snapshot.json b/packages/database/migrations/meta/0002_snapshot.json similarity index 100% rename from src/database/migrations/meta/0002_snapshot.json rename to packages/database/migrations/meta/0002_snapshot.json diff --git a/src/database/migrations/meta/0003_snapshot.json b/packages/database/migrations/meta/0003_snapshot.json similarity index 100% rename from src/database/migrations/meta/0003_snapshot.json rename to packages/database/migrations/meta/0003_snapshot.json diff --git a/src/database/migrations/meta/0004_snapshot.json b/packages/database/migrations/meta/0004_snapshot.json similarity index 100% rename from src/database/migrations/meta/0004_snapshot.json rename to packages/database/migrations/meta/0004_snapshot.json diff --git a/src/database/migrations/meta/0005_snapshot.json b/packages/database/migrations/meta/0005_snapshot.json similarity index 100% rename from src/database/migrations/meta/0005_snapshot.json rename to packages/database/migrations/meta/0005_snapshot.json diff --git a/src/database/migrations/meta/0006_snapshot.json b/packages/database/migrations/meta/0006_snapshot.json similarity index 100% rename from src/database/migrations/meta/0006_snapshot.json rename to packages/database/migrations/meta/0006_snapshot.json diff --git a/src/database/migrations/meta/0007_snapshot.json b/packages/database/migrations/meta/0007_snapshot.json similarity index 100% rename from src/database/migrations/meta/0007_snapshot.json rename to packages/database/migrations/meta/0007_snapshot.json diff --git a/src/database/migrations/meta/0008_snapshot.json b/packages/database/migrations/meta/0008_snapshot.json similarity index 100% rename from src/database/migrations/meta/0008_snapshot.json rename to packages/database/migrations/meta/0008_snapshot.json diff --git a/src/database/migrations/meta/0009_snapshot.json b/packages/database/migrations/meta/0009_snapshot.json similarity index 100% rename from src/database/migrations/meta/0009_snapshot.json rename to packages/database/migrations/meta/0009_snapshot.json diff --git a/src/database/migrations/meta/0010_snapshot.json b/packages/database/migrations/meta/0010_snapshot.json similarity index 100% rename from src/database/migrations/meta/0010_snapshot.json rename to packages/database/migrations/meta/0010_snapshot.json diff --git a/src/database/migrations/meta/0011_snapshot.json b/packages/database/migrations/meta/0011_snapshot.json similarity index 100% rename from src/database/migrations/meta/0011_snapshot.json rename to packages/database/migrations/meta/0011_snapshot.json diff --git a/src/database/migrations/meta/0012_snapshot.json b/packages/database/migrations/meta/0012_snapshot.json similarity index 100% rename from src/database/migrations/meta/0012_snapshot.json rename to packages/database/migrations/meta/0012_snapshot.json diff --git a/src/database/migrations/meta/0013_snapshot.json b/packages/database/migrations/meta/0013_snapshot.json similarity index 100% rename from src/database/migrations/meta/0013_snapshot.json rename to packages/database/migrations/meta/0013_snapshot.json diff --git a/src/database/migrations/meta/0014_snapshot.json b/packages/database/migrations/meta/0014_snapshot.json similarity index 100% rename from src/database/migrations/meta/0014_snapshot.json rename to packages/database/migrations/meta/0014_snapshot.json diff --git a/src/database/migrations/meta/0015_snapshot.json b/packages/database/migrations/meta/0015_snapshot.json similarity index 100% rename from src/database/migrations/meta/0015_snapshot.json rename to packages/database/migrations/meta/0015_snapshot.json diff --git a/src/database/migrations/meta/0016_snapshot.json b/packages/database/migrations/meta/0016_snapshot.json similarity index 100% rename from src/database/migrations/meta/0016_snapshot.json rename to packages/database/migrations/meta/0016_snapshot.json diff --git a/src/database/migrations/meta/0017_snapshot.json b/packages/database/migrations/meta/0017_snapshot.json similarity index 100% rename from src/database/migrations/meta/0017_snapshot.json rename to packages/database/migrations/meta/0017_snapshot.json diff --git a/src/database/migrations/meta/0018_snapshot.json b/packages/database/migrations/meta/0018_snapshot.json similarity index 100% rename from src/database/migrations/meta/0018_snapshot.json rename to packages/database/migrations/meta/0018_snapshot.json diff --git a/src/database/migrations/meta/0019_snapshot.json b/packages/database/migrations/meta/0019_snapshot.json similarity index 100% rename from src/database/migrations/meta/0019_snapshot.json rename to packages/database/migrations/meta/0019_snapshot.json diff --git a/src/database/migrations/meta/0020_snapshot.json b/packages/database/migrations/meta/0020_snapshot.json similarity index 100% rename from src/database/migrations/meta/0020_snapshot.json rename to packages/database/migrations/meta/0020_snapshot.json diff --git a/src/database/migrations/meta/0021_snapshot.json b/packages/database/migrations/meta/0021_snapshot.json similarity index 100% rename from src/database/migrations/meta/0021_snapshot.json rename to packages/database/migrations/meta/0021_snapshot.json diff --git a/src/database/migrations/meta/0022_snapshot.json b/packages/database/migrations/meta/0022_snapshot.json similarity index 100% rename from src/database/migrations/meta/0022_snapshot.json rename to packages/database/migrations/meta/0022_snapshot.json diff --git a/src/database/migrations/meta/0023_snapshot.json b/packages/database/migrations/meta/0023_snapshot.json similarity index 100% rename from src/database/migrations/meta/0023_snapshot.json rename to packages/database/migrations/meta/0023_snapshot.json diff --git a/src/database/migrations/meta/0024_snapshot.json b/packages/database/migrations/meta/0024_snapshot.json similarity index 100% rename from src/database/migrations/meta/0024_snapshot.json rename to packages/database/migrations/meta/0024_snapshot.json diff --git a/src/database/migrations/meta/0025_snapshot.json b/packages/database/migrations/meta/0025_snapshot.json similarity index 100% rename from src/database/migrations/meta/0025_snapshot.json rename to packages/database/migrations/meta/0025_snapshot.json diff --git a/src/database/migrations/meta/0026_snapshot.json b/packages/database/migrations/meta/0026_snapshot.json similarity index 100% rename from src/database/migrations/meta/0026_snapshot.json rename to packages/database/migrations/meta/0026_snapshot.json diff --git a/src/database/migrations/meta/0027_snapshot.json b/packages/database/migrations/meta/0027_snapshot.json similarity index 100% rename from src/database/migrations/meta/0027_snapshot.json rename to packages/database/migrations/meta/0027_snapshot.json diff --git a/src/database/migrations/meta/0028_snapshot.json b/packages/database/migrations/meta/0028_snapshot.json similarity index 100% rename from src/database/migrations/meta/0028_snapshot.json rename to packages/database/migrations/meta/0028_snapshot.json diff --git a/src/database/migrations/meta/0029_snapshot.json b/packages/database/migrations/meta/0029_snapshot.json similarity index 100% rename from src/database/migrations/meta/0029_snapshot.json rename to packages/database/migrations/meta/0029_snapshot.json diff --git a/src/database/migrations/meta/_journal.json b/packages/database/migrations/meta/_journal.json similarity index 100% rename from src/database/migrations/meta/_journal.json rename to packages/database/migrations/meta/_journal.json diff --git a/packages/database/package.json b/packages/database/package.json new file mode 100644 index 00000000000..74ecb70817a --- /dev/null +++ b/packages/database/package.json @@ -0,0 +1,24 @@ +{ + "name": "@lobechat/database", + "version": "1.0.0", + "private": true, + "main": "src/index.ts", + "types": "src/index.ts", + "scripts": { + "test": "vitest", + "test:coverage": "vitest --coverage" + }, + "dependencies": { + "@electric-sql/pglite": "^0.2.17", + "@lobechat/const": "workspace:*", + "@lobechat/types": "workspace:*", + "@lobechat/utils": "workspace:*", + "dayjs": "^1.11.13", + "drizzle-orm": "^0.44.4", + "nanoid": "^5.1.5", + "pg": "^8.16.3", + "random-words": "^2.0.1", + "ts-md5": "^2.0.1", + "ws": "^8.18.3" + } +} diff --git a/src/database/client/db.test.ts b/packages/database/src/client/db.test.ts similarity index 100% rename from src/database/client/db.test.ts rename to packages/database/src/client/db.test.ts diff --git a/src/database/client/db.ts b/packages/database/src/client/db.ts similarity index 99% rename from src/database/client/db.ts rename to packages/database/src/client/db.ts index b39de0b68e8..6e04c91f4fd 100644 --- a/src/database/client/db.ts +++ b/packages/database/src/client/db.ts @@ -2,7 +2,6 @@ import { sql } from 'drizzle-orm'; import { PgliteDatabase, drizzle } from 'drizzle-orm/pglite'; import { Md5 } from 'ts-md5'; -import { DrizzleMigrationModel } from '@/database/models/drizzleMigration'; import { ClientDBLoadingProgress, DatabaseLoadingState, @@ -11,8 +10,9 @@ import { } from '@/types/clientDB'; import { sleep } from '@/utils/sleep'; +import migrations from '../core/migrations.json'; +import { DrizzleMigrationModel } from '../models/drizzleMigration'; import * as schema from '../schemas'; -import migrations from './migrations.json'; const pgliteSchemaHashCache = 'LOBE_CHAT_PGLITE_SCHEMA_HASH'; diff --git a/src/database/client/pglite.ts b/packages/database/src/client/pglite.ts similarity index 100% rename from src/database/client/pglite.ts rename to packages/database/src/client/pglite.ts diff --git a/src/database/client/pglite.worker.ts b/packages/database/src/client/pglite.worker.ts similarity index 100% rename from src/database/client/pglite.worker.ts rename to packages/database/src/client/pglite.worker.ts diff --git a/src/database/client/type.ts b/packages/database/src/client/type.ts similarity index 100% rename from src/database/client/type.ts rename to packages/database/src/client/type.ts diff --git a/src/database/core/db-adaptor.ts b/packages/database/src/core/db-adaptor.ts similarity index 80% rename from src/database/core/db-adaptor.ts rename to packages/database/src/core/db-adaptor.ts index f4453cefe5c..7be62e1ed1a 100644 --- a/src/database/core/db-adaptor.ts +++ b/packages/database/src/core/db-adaptor.ts @@ -1,8 +1,8 @@ -import { isDesktop } from '@/const/version'; -import { getDBInstance } from '@/database/core/web-server'; -import { LobeChatDatabase } from '@/database/type'; +import { isDesktop } from '@lobechat/const'; +import { LobeChatDatabase } from '../type'; import { getPgliteInstance } from './electron'; +import { getDBInstance } from './web-server'; /** * 懒加载数据库实例 diff --git a/src/database/core/dbForTest.ts b/packages/database/src/core/dbForTest.ts similarity index 95% rename from src/database/core/dbForTest.ts rename to packages/database/src/core/dbForTest.ts index cfb72050ad8..c8a113815e2 100644 --- a/src/database/core/dbForTest.ts +++ b/packages/database/src/core/dbForTest.ts @@ -11,7 +11,7 @@ import { serverDBEnv } from '@/config/db'; import * as schema from '../schemas'; -const migrationsFolder = join(__dirname, '../migrations'); +const migrationsFolder = join(__dirname, '../../migrations'); export const getTestDBInstance = async () => { let connectionString = serverDBEnv.DATABASE_TEST_URL; diff --git a/src/database/core/electron.ts b/packages/database/src/core/electron.ts similarity index 98% rename from src/database/core/electron.ts rename to packages/database/src/core/electron.ts index 9524a509b45..7452ee0ee9c 100644 --- a/src/database/core/electron.ts +++ b/packages/database/src/core/electron.ts @@ -4,13 +4,13 @@ import { drizzle as pgliteDrizzle } from 'drizzle-orm/pglite'; import fs from 'node:fs'; import { Md5 } from 'ts-md5'; -import { DrizzleMigrationModel } from '@/database/models/drizzleMigration'; -import * as schema from '@/database/schemas'; import { electronIpcClient } from '@/server/modules/ElectronIPCClient'; import { MigrationTableItem } from '@/types/clientDB'; -import migrations from '../client/migrations.json'; +import { DrizzleMigrationModel } from '../models/drizzleMigration'; +import * as schema from '../schemas'; import { LobeChatDatabase } from '../type'; +import migrations from './migrations.json'; // 用于实例管理的全局对象 interface LobeGlobal { diff --git a/src/database/client/migrations.json b/packages/database/src/core/migrations.json similarity index 98% rename from src/database/client/migrations.json rename to packages/database/src/core/migrations.json index 9aebca5053e..6aa4c686339 100644 --- a/src/database/client/migrations.json +++ b/packages/database/src/core/migrations.json @@ -544,10 +544,20 @@ }, { "sql": [ - "CREATE TABLE \"oauth_handoffs\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"client\" varchar(50) NOT NULL,\n\t\"payload\" jsonb NOT NULL,\n\t\"accessed_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL\n);\n" + "CREATE TABLE IF NOT EXISTS \"oauth_handoffs\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"client\" varchar(50) NOT NULL,\n\t\"payload\" jsonb NOT NULL,\n\t\"accessed_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL\n);\n" ], "bps": true, "folderMillis": 1752567402506, - "hash": "8ba3ae52ed72e8aad1623dbcf47ca26a8406ebffc6d5284abff94ea994b59c04" + "hash": "83c410b18ef5c8667b4bdfd7880ef7db4c3278d826e6e87e9d3e05dde67fe8e1" + }, + { + "sql": [ + "CREATE TABLE IF NOT EXISTS \"api_keys\" (\n\t\"id\" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name \"api_keys_id_seq\" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),\n\t\"name\" varchar(256) NOT NULL,\n\t\"key\" varchar(256) NOT NULL,\n\t\"enabled\" boolean DEFAULT true,\n\t\"expires_at\" timestamp with time zone,\n\t\"last_used_at\" timestamp with time zone,\n\t\"user_id\" text NOT NULL,\n\t\"accessed_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\tCONSTRAINT \"api_keys_key_unique\" UNIQUE(\"key\")\n);\n", + "\nALTER TABLE \"rbac_roles\" ADD COLUMN IF NOT EXISTS \"metadata\" jsonb DEFAULT '{}'::jsonb;", + "\nALTER TABLE \"api_keys\" ADD CONSTRAINT \"api_keys_user_id_users_id_fk\" FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\") ON DELETE cascade ON UPDATE no action;\n" + ], + "bps": true, + "folderMillis": 1753201379817, + "hash": "fe5c0d7c2768189771c42ef93693fc1d58586b468c4bdde7fb6f2dc58cc9931c" } ] diff --git a/src/database/core/web-server.ts b/packages/database/src/core/web-server.ts similarity index 90% rename from src/database/core/web-server.ts rename to packages/database/src/core/web-server.ts index b9bdd4f1436..47484a7b7c1 100644 --- a/src/database/core/web-server.ts +++ b/packages/database/src/core/web-server.ts @@ -5,13 +5,12 @@ import { Pool as NodePool } from 'pg'; import ws from 'ws'; import { serverDBEnv } from '@/config/db'; -import { isServerMode } from '@/const/version'; -import * as schema from '@/database/schemas'; +import * as schema from '../schemas'; import { LobeChatDatabase } from '../type'; export const getDBInstance = (): LobeChatDatabase => { - if (!isServerMode) return {} as any; + if (!(process.env.NEXT_PUBLIC_SERVICE_MODE === 'server')) return {} as any; if (!serverDBEnv.KEY_VAULTS_SECRET) { throw new Error( diff --git a/src/database/models/__tests__/_test_template.ts b/packages/database/src/models/__tests__/_test_template.ts similarity index 98% rename from src/database/models/__tests__/_test_template.ts rename to packages/database/src/models/__tests__/_test_template.ts index 9797efd3354..5d866e63d42 100644 --- a/src/database/models/__tests__/_test_template.ts +++ b/packages/database/src/models/__tests__/_test_template.ts @@ -2,9 +2,8 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; - import { sessionGroups, users } from '../../schemas'; +import { LobeChatDatabase } from '../../type'; import { SessionGroupModel } from '../sessionGroup'; import { getTestDB } from './_util'; diff --git a/src/database/models/__tests__/_util.ts b/packages/database/src/models/__tests__/_util.ts similarity index 54% rename from src/database/models/__tests__/_util.ts rename to packages/database/src/models/__tests__/_util.ts index 1278b74157a..97b10443ddb 100644 --- a/src/database/models/__tests__/_util.ts +++ b/packages/database/src/models/__tests__/_util.ts @@ -1,11 +1,11 @@ -import { clientDB, initializeDB } from '@/database/client/db'; -import { LobeChatDatabase } from '@/database/type'; +import { clientDB, initializeDB } from '../../client/db'; +import { LobeChatDatabase } from '../../type'; const isServerDBMode = process.env.TEST_SERVER_DB === '1'; export const getTestDB = async () => { if (isServerDBMode) { - const { getTestDBInstance } = await import('@/database/core/dbForTest'); + const { getTestDBInstance } = await import('../../core/dbForTest'); return await getTestDBInstance(); } diff --git a/src/database/models/__tests__/agent.test.ts b/packages/database/src/models/__tests__/agent.test.ts similarity index 99% rename from src/database/models/__tests__/agent.test.ts rename to packages/database/src/models/__tests__/agent.test.ts index 98075673e26..b477bcb02a4 100644 --- a/src/database/models/__tests__/agent.test.ts +++ b/packages/database/src/models/__tests__/agent.test.ts @@ -2,8 +2,7 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; - +import { LobeChatDatabase } from '../../type'; import { agents, agentsFiles, diff --git a/src/database/models/__tests__/aiModel.test.ts b/packages/database/src/models/__tests__/aiModel.test.ts similarity index 99% rename from src/database/models/__tests__/aiModel.test.ts rename to packages/database/src/models/__tests__/aiModel.test.ts index 683b4c189db..ed3cb7053c6 100644 --- a/src/database/models/__tests__/aiModel.test.ts +++ b/packages/database/src/models/__tests__/aiModel.test.ts @@ -2,10 +2,10 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; import { AiProviderModelListItem } from '@/types/aiModel'; import { AiModelSelectItem, NewAiModelItem, aiModels, users } from '../../schemas'; +import { LobeChatDatabase } from '../../type'; import { AiModelModel } from '../aiModel'; import { getTestDB } from './_util'; diff --git a/src/database/models/__tests__/aiProvider.test.ts b/packages/database/src/models/__tests__/aiProvider.test.ts similarity index 99% rename from src/database/models/__tests__/aiProvider.test.ts rename to packages/database/src/models/__tests__/aiProvider.test.ts index 38643582528..3770b969fe5 100644 --- a/src/database/models/__tests__/aiProvider.test.ts +++ b/packages/database/src/models/__tests__/aiProvider.test.ts @@ -3,10 +3,10 @@ import { ModelProvider } from '@lobechat/model-runtime'; import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; import { sleep } from '@/utils/sleep'; import { aiProviders, users } from '../../schemas'; +import { LobeChatDatabase } from '../../type'; import { AiProviderModel } from '../aiProvider'; import { getTestDB } from './_util'; diff --git a/src/database/models/__tests__/asyncTask.test.ts b/packages/database/src/models/__tests__/asyncTask.test.ts similarity index 99% rename from src/database/models/__tests__/asyncTask.test.ts rename to packages/database/src/models/__tests__/asyncTask.test.ts index adbbe812aee..e62ba8b2c1b 100644 --- a/src/database/models/__tests__/asyncTask.test.ts +++ b/packages/database/src/models/__tests__/asyncTask.test.ts @@ -2,10 +2,10 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; import { AsyncTaskStatus, AsyncTaskType } from '@/types/asyncTask'; import { asyncTasks, users } from '../../schemas'; +import { LobeChatDatabase } from '../../type'; import { ASYNC_TASK_TIMEOUT, AsyncTaskModel } from '../asyncTask'; import { getTestDB } from './_util'; diff --git a/src/database/models/__tests__/chunk.test.ts b/packages/database/src/models/__tests__/chunk.test.ts similarity index 99% rename from src/database/models/__tests__/chunk.test.ts rename to packages/database/src/models/__tests__/chunk.test.ts index 8201575b96f..e73552617f4 100644 --- a/src/database/models/__tests__/chunk.test.ts +++ b/packages/database/src/models/__tests__/chunk.test.ts @@ -2,8 +2,7 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; -import { uuid } from '@/utils/uuid'; +import { LobeChatDatabase } from '../../type';import { uuid } from '@/utils/uuid'; import { chunks, embeddings, fileChunks, files, unstructuredChunks, users } from '../../schemas'; import { ChunkModel } from '../chunk'; diff --git a/src/database/models/__tests__/file.test.ts b/packages/database/src/models/__tests__/file.test.ts similarity index 99% rename from src/database/models/__tests__/file.test.ts rename to packages/database/src/models/__tests__/file.test.ts index ab11a436043..1e9a5c5eba5 100644 --- a/src/database/models/__tests__/file.test.ts +++ b/packages/database/src/models/__tests__/file.test.ts @@ -2,10 +2,10 @@ import { eq, inArray } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; import { FilesTabs, SortType } from '@/types/files'; import { files, globalFiles, knowledgeBaseFiles, knowledgeBases, users } from '../../schemas'; +import { LobeChatDatabase } from '../../type'; import { FileModel } from '../file'; import { getTestDB } from './_util'; diff --git a/src/database/models/__tests__/fixtures/embedding.ts b/packages/database/src/models/__tests__/fixtures/embedding.ts similarity index 100% rename from src/database/models/__tests__/fixtures/embedding.ts rename to packages/database/src/models/__tests__/fixtures/embedding.ts diff --git a/src/database/models/__tests__/generation.test.ts b/packages/database/src/models/__tests__/generation.test.ts similarity index 99% rename from src/database/models/__tests__/generation.test.ts rename to packages/database/src/models/__tests__/generation.test.ts index 64feaee1b25..6c3cf815b10 100644 --- a/src/database/models/__tests__/generation.test.ts +++ b/packages/database/src/models/__tests__/generation.test.ts @@ -2,8 +2,7 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; -import { AsyncTaskStatus } from '@/types/asyncTask'; +import { LobeChatDatabase } from '../../type';import { AsyncTaskStatus } from '@/types/asyncTask'; import { FileSource } from '@/types/files'; import { ImageGenerationAsset } from '@/types/generation'; diff --git a/src/database/models/__tests__/generationBatch.test.ts b/packages/database/src/models/__tests__/generationBatch.test.ts similarity index 99% rename from src/database/models/__tests__/generationBatch.test.ts rename to packages/database/src/models/__tests__/generationBatch.test.ts index 19207b9e85e..45b0b39312f 100644 --- a/src/database/models/__tests__/generationBatch.test.ts +++ b/packages/database/src/models/__tests__/generationBatch.test.ts @@ -2,8 +2,7 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; -import { AsyncTaskStatus } from '@/types/asyncTask'; +import { LobeChatDatabase } from '../../type';import { AsyncTaskStatus } from '@/types/asyncTask'; import { GenerationConfig } from '@/types/generation'; import { diff --git a/src/database/models/__tests__/generationTopic.test.ts b/packages/database/src/models/__tests__/generationTopic.test.ts similarity index 99% rename from src/database/models/__tests__/generationTopic.test.ts rename to packages/database/src/models/__tests__/generationTopic.test.ts index ff6b648d88f..b093dca60b5 100644 --- a/src/database/models/__tests__/generationTopic.test.ts +++ b/packages/database/src/models/__tests__/generationTopic.test.ts @@ -2,8 +2,7 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; -import { FileService } from '@/server/services/file'; +import { LobeChatDatabase } from '../../type';import { FileService } from '@/server/services/file'; import { ImageGenerationTopic } from '@/types/generation'; import { generationBatches, generationTopics, generations, users } from '../../schemas'; diff --git a/src/database/models/__tests__/knowledgeBase.test.ts b/packages/database/src/models/__tests__/knowledgeBase.test.ts similarity index 98% rename from src/database/models/__tests__/knowledgeBase.test.ts rename to packages/database/src/models/__tests__/knowledgeBase.test.ts index aeca524aea6..b9bf1d3c9d3 100644 --- a/src/database/models/__tests__/knowledgeBase.test.ts +++ b/packages/database/src/models/__tests__/knowledgeBase.test.ts @@ -2,8 +2,7 @@ import { and, eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; -import { sleep } from '@/utils/sleep'; +import { LobeChatDatabase } from '../../type';import { sleep } from '@/utils/sleep'; import { NewKnowledgeBase, diff --git a/src/database/models/__tests__/message.test.ts b/packages/database/src/models/__tests__/message.test.ts similarity index 99% rename from src/database/models/__tests__/message.test.ts rename to packages/database/src/models/__tests__/message.test.ts index 5f2209cecc6..9dcd55f47e8 100644 --- a/src/database/models/__tests__/message.test.ts +++ b/packages/database/src/models/__tests__/message.test.ts @@ -2,11 +2,10 @@ import dayjs from 'dayjs'; import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { getTestDB } from '@/database/models/__tests__/_util'; -import { LobeChatDatabase } from '@/database/type'; import { MessageItem } from '@/types/message'; import { uuid } from '@/utils/uuid'; +import { getTestDB } from '../../models/__tests__/_util'; import { chunks, embeddings, @@ -23,6 +22,7 @@ import { topics, users, } from '../../schemas'; +import { LobeChatDatabase } from '../../type'; import { MessageModel } from '../message'; import { codeEmbedding } from './fixtures/embedding'; diff --git a/src/database/models/__tests__/plugin.test.ts b/packages/database/src/models/__tests__/plugin.test.ts similarity index 98% rename from src/database/models/__tests__/plugin.test.ts rename to packages/database/src/models/__tests__/plugin.test.ts index 9cb4cd34bf4..0f5a51eeada 100644 --- a/src/database/models/__tests__/plugin.test.ts +++ b/packages/database/src/models/__tests__/plugin.test.ts @@ -1,8 +1,7 @@ // @vitest-environment node import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; - +import { LobeChatDatabase } from '../../type'; import { NewInstalledPlugin, userInstalledPlugins, users } from '../../schemas'; import { PluginModel } from '../plugin'; import { getTestDB } from './_util'; diff --git a/src/database/models/__tests__/session.test.ts b/packages/database/src/models/__tests__/session.test.ts similarity index 99% rename from src/database/models/__tests__/session.test.ts rename to packages/database/src/models/__tests__/session.test.ts index e059b7fc4e7..036a6b879f5 100644 --- a/src/database/models/__tests__/session.test.ts +++ b/packages/database/src/models/__tests__/session.test.ts @@ -2,8 +2,6 @@ import { and, eq, inArray } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { DEFAULT_AGENT_CONFIG } from '@/const/settings'; -import { LobeChatDatabase } from '@/database/type'; -import { idGenerator } from '@/database/utils/idGenerator'; import { NewSession, @@ -16,6 +14,8 @@ import { topics, users, } from '../../schemas'; +import { LobeChatDatabase } from '../../type'; +import { idGenerator } from '../../utils/idGenerator'; import { SessionModel } from '../session'; import { getTestDB } from './_util'; diff --git a/src/database/models/__tests__/sessionGroup.test.ts b/packages/database/src/models/__tests__/sessionGroup.test.ts similarity index 98% rename from src/database/models/__tests__/sessionGroup.test.ts rename to packages/database/src/models/__tests__/sessionGroup.test.ts index 04218bfa22a..08bb2d0b6b3 100644 --- a/src/database/models/__tests__/sessionGroup.test.ts +++ b/packages/database/src/models/__tests__/sessionGroup.test.ts @@ -2,9 +2,8 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; - import { sessionGroups, users } from '../../schemas'; +import { LobeChatDatabase } from '../../type'; import { SessionGroupModel } from '../sessionGroup'; import { getTestDB } from './_util'; diff --git a/src/database/models/__tests__/topic.test.ts b/packages/database/src/models/__tests__/topic.test.ts similarity index 99% rename from src/database/models/__tests__/topic.test.ts rename to packages/database/src/models/__tests__/topic.test.ts index 5b418aa108f..47b51ce53b3 100644 --- a/src/database/models/__tests__/topic.test.ts +++ b/packages/database/src/models/__tests__/topic.test.ts @@ -1,8 +1,7 @@ import { eq, inArray } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { LobeChatDatabase } from '@/database/type'; - +import { LobeChatDatabase } from '../../type'; import { messages, sessions, topics, users } from '../../schemas'; import { CreateTopicParams, TopicModel } from '../topic'; import { getTestDB } from './_util'; diff --git a/src/database/models/_template.ts b/packages/database/src/models/_template.ts similarity index 96% rename from src/database/models/_template.ts rename to packages/database/src/models/_template.ts index 236fcd74cc3..133c92e36ff 100644 --- a/src/database/models/_template.ts +++ b/packages/database/src/models/_template.ts @@ -1,8 +1,7 @@ import { and, desc, eq } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; - import { NewSessionGroup, SessionGroupItem, sessionGroups } from '../schemas'; +import { LobeChatDatabase } from '../type'; export class TemplateModel { private userId: string; diff --git a/src/database/models/agent.ts b/packages/database/src/models/agent.ts similarity index 98% rename from src/database/models/agent.ts rename to packages/database/src/models/agent.ts index 6395c20cddb..1b670bda39a 100644 --- a/src/database/models/agent.ts +++ b/packages/database/src/models/agent.ts @@ -7,8 +7,8 @@ import { agentsToSessions, files, knowledgeBases, -} from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; +} from '../schemas'; +import { LobeChatDatabase } from '../type'; export class AgentModel { private userId: string; diff --git a/src/database/models/aiModel.ts b/packages/database/src/models/aiModel.ts similarity index 99% rename from src/database/models/aiModel.ts rename to packages/database/src/models/aiModel.ts index 8c056780f4d..0d0ef00f9cf 100644 --- a/src/database/models/aiModel.ts +++ b/packages/database/src/models/aiModel.ts @@ -1,6 +1,6 @@ import { and, asc, desc, eq, inArray } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { AiModelSortMap, AiModelSourceEnum, diff --git a/src/database/models/aiProvider.ts b/packages/database/src/models/aiProvider.ts similarity index 99% rename from src/database/models/aiProvider.ts rename to packages/database/src/models/aiProvider.ts index 955c9153ff5..956239b33e4 100644 --- a/src/database/models/aiProvider.ts +++ b/packages/database/src/models/aiProvider.ts @@ -3,7 +3,7 @@ import { and, asc, desc, eq } from 'drizzle-orm'; import { isEmpty } from 'lodash-es'; import { DEFAULT_MODEL_PROVIDER_LIST } from '@/config/modelProviders'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { AiProviderDetailItem, AiProviderListItem, diff --git a/src/database/models/apiKey.ts b/packages/database/src/models/apiKey.ts similarity index 98% rename from src/database/models/apiKey.ts rename to packages/database/src/models/apiKey.ts index 9e81c42cd45..95d54e79988 100644 --- a/src/database/models/apiKey.ts +++ b/packages/database/src/models/apiKey.ts @@ -1,6 +1,6 @@ import { and, desc, eq } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { generateApiKey, isApiKeyExpired, validateApiKeyFormat } from '@/utils/apiKey'; import { ApiKeyItem, NewApiKeyItem, apiKeys } from '../schemas'; diff --git a/src/database/models/asyncTask.ts b/packages/database/src/models/asyncTask.ts similarity index 98% rename from src/database/models/asyncTask.ts rename to packages/database/src/models/asyncTask.ts index 7b0f097a353..d8b411b11e4 100644 --- a/src/database/models/asyncTask.ts +++ b/packages/database/src/models/asyncTask.ts @@ -1,6 +1,6 @@ import { and, eq, inArray, lt } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { AsyncTaskError, AsyncTaskErrorType, diff --git a/src/database/models/chunk.ts b/packages/database/src/models/chunk.ts similarity index 99% rename from src/database/models/chunk.ts rename to packages/database/src/models/chunk.ts index 6b8ff77dc37..e5bd233b9cc 100644 --- a/src/database/models/chunk.ts +++ b/packages/database/src/models/chunk.ts @@ -1,7 +1,7 @@ import { and, asc, cosineDistance, count, desc, eq, inArray, isNull, sql } from 'drizzle-orm'; import { chunk } from 'lodash-es'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { ChunkMetadata, FileChunk } from '@/types/chunk'; import { diff --git a/src/database/models/document.ts b/packages/database/src/models/document.ts similarity index 96% rename from src/database/models/document.ts rename to packages/database/src/models/document.ts index feeec8be43e..eac7baba6f8 100644 --- a/src/database/models/document.ts +++ b/packages/database/src/models/document.ts @@ -1,6 +1,6 @@ import { and, desc, eq } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { DocumentItem, NewDocument, documents } from '../schemas'; diff --git a/src/database/models/drizzleMigration.ts b/packages/database/src/models/drizzleMigration.ts similarity index 94% rename from src/database/models/drizzleMigration.ts rename to packages/database/src/models/drizzleMigration.ts index dd536cebe15..edb42603135 100644 --- a/src/database/models/drizzleMigration.ts +++ b/packages/database/src/models/drizzleMigration.ts @@ -1,6 +1,6 @@ import { sql } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { MigrationTableItem } from '@/types/clientDB'; export class DrizzleMigrationModel { diff --git a/src/database/models/embedding.ts b/packages/database/src/models/embedding.ts similarity index 96% rename from src/database/models/embedding.ts rename to packages/database/src/models/embedding.ts index 7ed0b87e304..061a94f8602 100644 --- a/src/database/models/embedding.ts +++ b/packages/database/src/models/embedding.ts @@ -1,6 +1,6 @@ import { and, count, eq } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { NewEmbeddingsItem, embeddings } from '../schemas'; diff --git a/src/database/models/file.ts b/packages/database/src/models/file.ts similarity index 99% rename from src/database/models/file.ts rename to packages/database/src/models/file.ts index 9ba87dab856..7463db53aa2 100644 --- a/src/database/models/file.ts +++ b/packages/database/src/models/file.ts @@ -1,7 +1,7 @@ import { and, asc, count, desc, eq, ilike, inArray, like, notExists, or, sum } from 'drizzle-orm'; import type { PgTransaction } from 'drizzle-orm/pg-core'; -import { LobeChatDatabase, Transaction } from '@/database/type'; +import { LobeChatDatabase, Transaction } from '../type'; import { FilesTabs, QueryFileListParams, SortType } from '@/types/files'; import { diff --git a/src/database/models/generation.ts b/packages/database/src/models/generation.ts similarity index 98% rename from src/database/models/generation.ts rename to packages/database/src/models/generation.ts index 2a07586cbd9..d5cf316d23f 100644 --- a/src/database/models/generation.ts +++ b/packages/database/src/models/generation.ts @@ -1,7 +1,7 @@ import debug from 'debug'; import { and, eq } from 'drizzle-orm'; -import { LobeChatDatabase, Transaction } from '@/database/type'; +import { LobeChatDatabase, Transaction } from '../type'; import { FileService } from '@/server/services/file'; import { AsyncTaskError, AsyncTaskStatus } from '@/types/asyncTask'; import { FileSource } from '@/types/files'; diff --git a/src/database/models/generationBatch.ts b/packages/database/src/models/generationBatch.ts similarity index 99% rename from src/database/models/generationBatch.ts rename to packages/database/src/models/generationBatch.ts index 79c54780590..68afad68314 100644 --- a/src/database/models/generationBatch.ts +++ b/packages/database/src/models/generationBatch.ts @@ -1,7 +1,7 @@ import debug from 'debug'; import { and, eq } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { FileService } from '@/server/services/file'; import { Generation, GenerationAsset, GenerationBatch, GenerationConfig } from '@/types/generation'; diff --git a/src/database/models/generationTopic.ts b/packages/database/src/models/generationTopic.ts similarity index 98% rename from src/database/models/generationTopic.ts rename to packages/database/src/models/generationTopic.ts index a21f9ce0ef0..4bd93f5a334 100644 --- a/src/database/models/generationTopic.ts +++ b/packages/database/src/models/generationTopic.ts @@ -1,6 +1,6 @@ import { and, desc, eq } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { FileService } from '@/server/services/file'; import { GenerationAsset, ImageGenerationTopic } from '@/types/generation'; diff --git a/src/database/models/knowledgeBase.ts b/packages/database/src/models/knowledgeBase.ts similarity index 98% rename from src/database/models/knowledgeBase.ts rename to packages/database/src/models/knowledgeBase.ts index 3c3e890a017..b079d8dea29 100644 --- a/src/database/models/knowledgeBase.ts +++ b/packages/database/src/models/knowledgeBase.ts @@ -1,6 +1,6 @@ import { and, desc, eq, inArray } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { KnowledgeBaseItem } from '@/types/knowledgeBase'; import { NewKnowledgeBase, knowledgeBaseFiles, knowledgeBases } from '../schemas'; diff --git a/src/database/models/message.ts b/packages/database/src/models/message.ts similarity index 99% rename from src/database/models/message.ts rename to packages/database/src/models/message.ts index 497c70722cb..1dad3ae8893 100644 --- a/src/database/models/message.ts +++ b/packages/database/src/models/message.ts @@ -2,14 +2,14 @@ import type { HeatmapsProps } from '@lobehub/charts'; import dayjs from 'dayjs'; import { and, asc, count, desc, eq, gt, inArray, isNotNull, isNull, like, sql } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { genEndDateWhere, genRangeWhere, genStartDateWhere, genWhere, -} from '@/database/utils/genWhere'; -import { idGenerator } from '@/database/utils/idGenerator'; +} from '../utils/genWhere'; +import { idGenerator } from '../utils/idGenerator'; import { ChatFileItem, ChatImageItem, diff --git a/src/database/models/oauthHandoff.ts b/packages/database/src/models/oauthHandoff.ts similarity index 98% rename from src/database/models/oauthHandoff.ts rename to packages/database/src/models/oauthHandoff.ts index fd14b38915f..ad80f3e02cc 100644 --- a/src/database/models/oauthHandoff.ts +++ b/packages/database/src/models/oauthHandoff.ts @@ -1,6 +1,6 @@ import { and, eq, lt, sql } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { NewOAuthHandoff, OAuthHandoffItem, oauthHandoffs } from '../schemas'; diff --git a/src/database/models/plugin.ts b/packages/database/src/models/plugin.ts similarity index 97% rename from src/database/models/plugin.ts rename to packages/database/src/models/plugin.ts index 0416b7adcac..0f46156e736 100644 --- a/src/database/models/plugin.ts +++ b/packages/database/src/models/plugin.ts @@ -1,6 +1,6 @@ import { and, desc, eq } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { LobeTool } from '@/types/tool'; import { InstalledPluginItem, NewInstalledPlugin, userInstalledPlugins } from '../schemas'; diff --git a/src/database/models/session.ts b/packages/database/src/models/session.ts similarity index 98% rename from src/database/models/session.ts rename to packages/database/src/models/session.ts index 8eada8236fb..c73ad0dc453 100644 --- a/src/database/models/session.ts +++ b/packages/database/src/models/session.ts @@ -18,14 +18,14 @@ import type { PartialDeep } from 'type-fest'; import { DEFAULT_INBOX_AVATAR } from '@/const/meta'; import { INBOX_SESSION_ID } from '@/const/session'; import { DEFAULT_AGENT_CONFIG } from '@/const/settings'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { genEndDateWhere, genRangeWhere, genStartDateWhere, genWhere, -} from '@/database/utils/genWhere'; -import { idGenerator } from '@/database/utils/idGenerator'; +} from '../utils/genWhere'; +import { idGenerator } from '../utils/idGenerator'; import { LobeAgentConfig } from '@/types/agent'; import { ChatSessionList, LobeAgentSession, SessionRankItem } from '@/types/session'; import { merge } from '@/utils/merge'; diff --git a/src/database/models/sessionGroup.ts b/packages/database/src/models/sessionGroup.ts similarity index 94% rename from src/database/models/sessionGroup.ts rename to packages/database/src/models/sessionGroup.ts index 1276afc4ec1..1b0a8206563 100644 --- a/src/database/models/sessionGroup.ts +++ b/packages/database/src/models/sessionGroup.ts @@ -1,7 +1,7 @@ import { and, asc, desc, eq } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; -import { idGenerator } from '@/database/utils/idGenerator'; +import { LobeChatDatabase } from '../type'; +import { idGenerator } from '../utils/idGenerator'; import { SessionGroupItem, sessionGroups } from '../schemas'; diff --git a/src/database/models/thread.ts b/packages/database/src/models/thread.ts similarity index 97% rename from src/database/models/thread.ts rename to packages/database/src/models/thread.ts index 39f79736454..d47be980001 100644 --- a/src/database/models/thread.ts +++ b/packages/database/src/models/thread.ts @@ -1,6 +1,6 @@ import { and, desc, eq } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { CreateThreadParams, ThreadStatus } from '@/types/topic'; import { ThreadItem, threads } from '../schemas'; diff --git a/src/database/models/topic.ts b/packages/database/src/models/topic.ts similarity index 98% rename from src/database/models/topic.ts rename to packages/database/src/models/topic.ts index 6a784e9ed59..3f59eba6a9d 100644 --- a/src/database/models/topic.ts +++ b/packages/database/src/models/topic.ts @@ -1,13 +1,13 @@ import { and, count, desc, eq, gt, ilike, inArray, isNull, sql } from 'drizzle-orm'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { genEndDateWhere, genRangeWhere, genStartDateWhere, genWhere, -} from '@/database/utils/genWhere'; -import { idGenerator } from '@/database/utils/idGenerator'; +} from '../utils/genWhere'; +import { idGenerator } from '../utils/idGenerator'; import { MessageItem } from '@/types/message'; import { TopicRankItem } from '@/types/topic'; diff --git a/src/database/models/user.ts b/packages/database/src/models/user.ts similarity index 99% rename from src/database/models/user.ts rename to packages/database/src/models/user.ts index 16bbcbd115e..cd96314c6c1 100644 --- a/src/database/models/user.ts +++ b/packages/database/src/models/user.ts @@ -4,7 +4,7 @@ import { eq } from 'drizzle-orm'; import type { AdapterAccount } from 'next-auth/adapters'; import type { PartialDeep } from 'type-fest'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../type'; import { UserGuide, UserPreference } from '@/types/user'; import { UserKeyVaults, UserSettings } from '@/types/user/settings'; import { merge } from '@/utils/merge'; diff --git a/src/database/repositories/aiInfra/index.test.ts b/packages/database/src/repositories/aiInfra/index.test.ts similarity index 100% rename from src/database/repositories/aiInfra/index.test.ts rename to packages/database/src/repositories/aiInfra/index.test.ts diff --git a/src/database/repositories/aiInfra/index.ts b/packages/database/src/repositories/aiInfra/index.ts similarity index 97% rename from src/database/repositories/aiInfra/index.ts rename to packages/database/src/repositories/aiInfra/index.ts index 956ae51117f..2ac7d9faa34 100644 --- a/src/database/repositories/aiInfra/index.ts +++ b/packages/database/src/repositories/aiInfra/index.ts @@ -2,9 +2,6 @@ import { isEmpty } from 'lodash-es'; import pMap from 'p-map'; import { DEFAULT_MODEL_PROVIDER_LIST } from '@/config/modelProviders'; -import { AiModelModel } from '@/database/models/aiModel'; -import { AiProviderModel } from '@/database/models/aiProvider'; -import { LobeChatDatabase } from '@/database/type'; import { AIChatModelCard, AiModelSourceEnum, @@ -20,6 +17,10 @@ import { import { ProviderConfig } from '@/types/user/settings'; import { merge, mergeArrayById } from '@/utils/merge'; +import { AiModelModel } from '../../models/aiModel'; +import { AiProviderModel } from '../../models/aiProvider'; +import { LobeChatDatabase } from '../../type'; + type DecryptUserKeyVaults = (encryptKeyVaultsStr: string | null) => Promise; export class AiInfraRepos { diff --git a/src/database/repositories/dataExporter/index.test.ts b/packages/database/src/repositories/dataExporter/index.test.ts similarity index 100% rename from src/database/repositories/dataExporter/index.test.ts rename to packages/database/src/repositories/dataExporter/index.test.ts diff --git a/src/database/repositories/dataExporter/index.ts b/packages/database/src/repositories/dataExporter/index.ts similarity index 98% rename from src/database/repositories/dataExporter/index.ts rename to packages/database/src/repositories/dataExporter/index.ts index 7346d620839..657e35e802c 100644 --- a/src/database/repositories/dataExporter/index.ts +++ b/packages/database/src/repositories/dataExporter/index.ts @@ -1,8 +1,8 @@ import { and, eq, inArray } from 'drizzle-orm'; import pMap from 'p-map'; -import * as EXPORT_TABLES from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; +import * as EXPORT_TABLES from '../../schemas'; +import { LobeChatDatabase } from '../../type'; interface BaseTableConfig { table: keyof typeof EXPORT_TABLES; diff --git a/src/database/repositories/dataImporter/__tests__/fixtures/agents.json b/packages/database/src/repositories/dataImporter/__tests__/fixtures/agents.json similarity index 100% rename from src/database/repositories/dataImporter/__tests__/fixtures/agents.json rename to packages/database/src/repositories/dataImporter/__tests__/fixtures/agents.json diff --git a/src/database/repositories/dataImporter/__tests__/fixtures/agentsToSessions.json b/packages/database/src/repositories/dataImporter/__tests__/fixtures/agentsToSessions.json similarity index 100% rename from src/database/repositories/dataImporter/__tests__/fixtures/agentsToSessions.json rename to packages/database/src/repositories/dataImporter/__tests__/fixtures/agentsToSessions.json diff --git a/src/database/repositories/dataImporter/__tests__/fixtures/topic.json b/packages/database/src/repositories/dataImporter/__tests__/fixtures/topic.json similarity index 100% rename from src/database/repositories/dataImporter/__tests__/fixtures/topic.json rename to packages/database/src/repositories/dataImporter/__tests__/fixtures/topic.json diff --git a/src/database/repositories/dataImporter/__tests__/fixtures/userSettings.json b/packages/database/src/repositories/dataImporter/__tests__/fixtures/userSettings.json similarity index 100% rename from src/database/repositories/dataImporter/__tests__/fixtures/userSettings.json rename to packages/database/src/repositories/dataImporter/__tests__/fixtures/userSettings.json diff --git a/src/database/repositories/dataImporter/__tests__/fixtures/with-client-id.json b/packages/database/src/repositories/dataImporter/__tests__/fixtures/with-client-id.json similarity index 100% rename from src/database/repositories/dataImporter/__tests__/fixtures/with-client-id.json rename to packages/database/src/repositories/dataImporter/__tests__/fixtures/with-client-id.json diff --git a/src/database/repositories/dataImporter/__tests__/index.test.ts b/packages/database/src/repositories/dataImporter/__tests__/index.test.ts similarity index 98% rename from src/database/repositories/dataImporter/__tests__/index.test.ts rename to packages/database/src/repositories/dataImporter/__tests__/index.test.ts index 29db248079d..82a53f905ee 100644 --- a/src/database/repositories/dataImporter/__tests__/index.test.ts +++ b/packages/database/src/repositories/dataImporter/__tests__/index.test.ts @@ -1,10 +1,10 @@ import { eq, inArray } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { getTestDB } from '@/database/models/__tests__/_util'; -import * as Schema from '@/database/schemas'; import { ImportPgDataStructure } from '@/types/export'; +import { getTestDB } from '../../../models/__tests__/_util'; +import * as Schema from '../../../schemas'; import { DataImporterRepos } from '../index'; import agentsData from './fixtures/agents.json'; import agentsToSessionsData from './fixtures/agentsToSessions.json'; diff --git a/src/database/repositories/dataImporter/deprecated/__tests__/fixtures/messages.json b/packages/database/src/repositories/dataImporter/deprecated/__tests__/fixtures/messages.json similarity index 100% rename from src/database/repositories/dataImporter/deprecated/__tests__/fixtures/messages.json rename to packages/database/src/repositories/dataImporter/deprecated/__tests__/fixtures/messages.json diff --git a/src/database/repositories/dataImporter/deprecated/__tests__/index.test.ts b/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts similarity index 100% rename from src/database/repositories/dataImporter/deprecated/__tests__/index.test.ts rename to packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts diff --git a/src/database/repositories/dataImporter/deprecated/index.ts b/packages/database/src/repositories/dataImporter/deprecated/index.ts similarity index 99% rename from src/database/repositories/dataImporter/deprecated/index.ts rename to packages/database/src/repositories/dataImporter/deprecated/index.ts index d3ca5aab7f6..50a7c9a183f 100644 --- a/src/database/repositories/dataImporter/deprecated/index.ts +++ b/packages/database/src/repositories/dataImporter/deprecated/index.ts @@ -1,5 +1,9 @@ import { and, eq, inArray, sql } from 'drizzle-orm'; +import { ImportResult } from '@/services/import/_deprecated'; +import { ImporterEntryData } from '@/types/importer'; +import { sanitizeUTF8 } from '@/utils/sanitizeUTF8'; + import { agents, agentsToSessions, @@ -9,11 +13,8 @@ import { sessionGroups, sessions, topics, -} from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; -import { ImportResult } from '@/services/import/_deprecated'; -import { ImporterEntryData } from '@/types/importer'; -import { sanitizeUTF8 } from '@/utils/sanitizeUTF8'; +} from '../../../schemas'; +import { LobeChatDatabase } from '../../../type'; export class DeprecatedDataImporterRepos { private userId: string; diff --git a/src/database/repositories/dataImporter/index.ts b/packages/database/src/repositories/dataImporter/index.ts similarity index 99% rename from src/database/repositories/dataImporter/index.ts rename to packages/database/src/repositories/dataImporter/index.ts index b33d56b5181..5a2eb66b8bf 100644 --- a/src/database/repositories/dataImporter/index.ts +++ b/packages/database/src/repositories/dataImporter/index.ts @@ -1,11 +1,11 @@ import { and, eq, inArray } from 'drizzle-orm'; -import * as EXPORT_TABLES from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; import { ImportPgDataStructure } from '@/types/export'; import { ImportResultData, ImporterEntryData } from '@/types/importer'; import { uuid } from '@/utils/uuid'; +import * as EXPORT_TABLES from '../../schemas'; +import { LobeChatDatabase } from '../../type'; import { DeprecatedDataImporterRepos } from './deprecated'; interface ImportResult { diff --git a/src/database/repositories/tableViewer/index.test.ts b/packages/database/src/repositories/tableViewer/index.test.ts similarity index 99% rename from src/database/repositories/tableViewer/index.test.ts rename to packages/database/src/repositories/tableViewer/index.test.ts index 92f57a9bfdf..18cc6f85a0f 100644 --- a/src/database/repositories/tableViewer/index.test.ts +++ b/packages/database/src/repositories/tableViewer/index.test.ts @@ -23,7 +23,7 @@ describe('TableViewerRepo', () => { it('should return all tables with counts', async () => { const result = await repo.getAllTables(); - expect(result.length).toEqual(59); + expect(result.length).toEqual(60); expect(result[0]).toEqual({ name: 'agents', count: 0, type: 'BASE TABLE' }); }); diff --git a/src/database/repositories/tableViewer/index.ts b/packages/database/src/repositories/tableViewer/index.ts similarity index 99% rename from src/database/repositories/tableViewer/index.ts rename to packages/database/src/repositories/tableViewer/index.ts index 2ec0e7a8675..1730d3ef4db 100644 --- a/src/database/repositories/tableViewer/index.ts +++ b/packages/database/src/repositories/tableViewer/index.ts @@ -1,7 +1,6 @@ import { sql } from 'drizzle-orm'; import pMap from 'p-map'; -import { LobeChatDatabase } from '@/database/type'; import { FilterCondition, PaginationParams, @@ -9,6 +8,8 @@ import { TableColumnInfo, } from '@/types/tableViewer'; +import { LobeChatDatabase } from '../../type'; + export class TableViewerRepo { private userId: string; private db: LobeChatDatabase; diff --git a/src/database/schemas/_helpers.ts b/packages/database/src/schemas/_helpers.ts similarity index 100% rename from src/database/schemas/_helpers.ts rename to packages/database/src/schemas/_helpers.ts diff --git a/src/database/schemas/agent.ts b/packages/database/src/schemas/agent.ts similarity index 97% rename from src/database/schemas/agent.ts rename to packages/database/src/schemas/agent.ts index ef10dba4a6d..a39b39b4950 100644 --- a/src/database/schemas/agent.ts +++ b/packages/database/src/schemas/agent.ts @@ -10,9 +10,9 @@ import { } from 'drizzle-orm/pg-core'; import { createInsertSchema } from 'drizzle-zod'; -import { idGenerator, randomSlug } from '@/database/utils/idGenerator'; import { LobeAgentChatConfig, LobeAgentTTSConfig } from '@/types/agent'; +import { idGenerator, randomSlug } from '../utils/idGenerator'; import { timestamps } from './_helpers'; import { files, knowledgeBases } from './file'; import { users } from './user'; diff --git a/src/database/schemas/aiInfra.ts b/packages/database/src/schemas/aiInfra.ts similarity index 95% rename from src/database/schemas/aiInfra.ts rename to packages/database/src/schemas/aiInfra.ts index 69cab121525..5a5ace88f62 100644 --- a/src/database/schemas/aiInfra.ts +++ b/packages/database/src/schemas/aiInfra.ts @@ -1,10 +1,11 @@ /* eslint-disable sort-keys-fix/sort-keys-fix */ import { boolean, integer, jsonb, pgTable, primaryKey, text, varchar } from 'drizzle-orm/pg-core'; -import { timestamps } from '@/database/schemas/_helpers'; -import { users } from '@/database/schemas/user'; import { AiProviderConfig, AiProviderSettings } from '@/types/aiProvider'; +import { timestamps } from './_helpers'; +import { users } from './user'; + export const aiProviders = pgTable( 'ai_providers', { diff --git a/src/database/schemas/apiKey.ts b/packages/database/src/schemas/apiKey.ts similarity index 100% rename from src/database/schemas/apiKey.ts rename to packages/database/src/schemas/apiKey.ts diff --git a/src/database/schemas/asyncTask.ts b/packages/database/src/schemas/asyncTask.ts similarity index 100% rename from src/database/schemas/asyncTask.ts rename to packages/database/src/schemas/asyncTask.ts diff --git a/src/database/schemas/document.ts b/packages/database/src/schemas/document.ts similarity index 96% rename from src/database/schemas/document.ts rename to packages/database/src/schemas/document.ts index 8ddb3128dcd..ca994ea81e4 100644 --- a/src/database/schemas/document.ts +++ b/packages/database/src/schemas/document.ts @@ -12,12 +12,12 @@ import { } from 'drizzle-orm/pg-core'; import { createInsertSchema } from 'drizzle-zod'; -import { chunks } from '@/database/schemas/rag'; -import { idGenerator } from '@/database/utils/idGenerator'; import { LobeDocumentPage } from '@/types/document'; +import { idGenerator } from '../utils/idGenerator'; import { createdAt, timestamps } from './_helpers'; import { files } from './file'; +import { chunks } from './rag'; import { users } from './user'; /** diff --git a/src/database/schemas/file.ts b/packages/database/src/schemas/file.ts similarity index 98% rename from src/database/schemas/file.ts rename to packages/database/src/schemas/file.ts index 083fe854d4b..c68799a160f 100644 --- a/src/database/schemas/file.ts +++ b/packages/database/src/schemas/file.ts @@ -13,9 +13,9 @@ import { } from 'drizzle-orm/pg-core'; import { createInsertSchema } from 'drizzle-zod'; -import { idGenerator } from '@/database/utils/idGenerator'; import { FileSource } from '@/types/files'; +import { idGenerator } from '../utils/idGenerator'; import { accessedAt, createdAt, timestamps } from './_helpers'; import { asyncTasks } from './asyncTask'; import { users } from './user'; diff --git a/src/database/schemas/generation.ts b/packages/database/src/schemas/generation.ts similarity index 98% rename from src/database/schemas/generation.ts rename to packages/database/src/schemas/generation.ts index 9ceecab8322..918e42e9fd5 100644 --- a/src/database/schemas/generation.ts +++ b/packages/database/src/schemas/generation.ts @@ -2,9 +2,9 @@ import { integer, jsonb, pgTable, text, uuid, varchar } from 'drizzle-orm/pg-core'; import { createInsertSchema } from 'drizzle-zod'; -import { idGenerator } from '@/database/utils/idGenerator'; import { ImageGenerationAsset } from '@/types/generation'; +import { idGenerator } from '../utils/idGenerator'; import { timestamps } from './_helpers'; import { AsyncTaskSelectItem, asyncTasks } from './asyncTask'; import { files } from './file'; diff --git a/src/database/schemas/index.ts b/packages/database/src/schemas/index.ts similarity index 100% rename from src/database/schemas/index.ts rename to packages/database/src/schemas/index.ts diff --git a/src/database/schemas/message.ts b/packages/database/src/schemas/message.ts similarity index 99% rename from src/database/schemas/message.ts rename to packages/database/src/schemas/message.ts index 0efe5493f0f..2afe92ef1b0 100644 --- a/src/database/schemas/message.ts +++ b/packages/database/src/schemas/message.ts @@ -12,10 +12,10 @@ import { } from 'drizzle-orm/pg-core'; import { createSelectSchema } from 'drizzle-zod'; -import { idGenerator } from '@/database/utils/idGenerator'; import { ModelReasoning } from '@/types/message'; import { GroundingSearch } from '@/types/search'; +import { idGenerator } from '../utils/idGenerator'; import { timestamps } from './_helpers'; import { agents } from './agent'; import { files } from './file'; diff --git a/src/database/schemas/nextauth.ts b/packages/database/src/schemas/nextauth.ts similarity index 100% rename from src/database/schemas/nextauth.ts rename to packages/database/src/schemas/nextauth.ts diff --git a/src/database/schemas/oidc.ts b/packages/database/src/schemas/oidc.ts similarity index 100% rename from src/database/schemas/oidc.ts rename to packages/database/src/schemas/oidc.ts diff --git a/src/database/schemas/rag.ts b/packages/database/src/schemas/rag.ts similarity index 100% rename from src/database/schemas/rag.ts rename to packages/database/src/schemas/rag.ts diff --git a/src/database/schemas/ragEvals.ts b/packages/database/src/schemas/ragEvals.ts similarity index 98% rename from src/database/schemas/ragEvals.ts rename to packages/database/src/schemas/ragEvals.ts index fa04353a8c2..fc334bee1fa 100644 --- a/src/database/schemas/ragEvals.ts +++ b/packages/database/src/schemas/ragEvals.ts @@ -1,8 +1,8 @@ /* eslint-disable sort-keys-fix/sort-keys-fix */ +import { EvalEvaluationStatus } from '@lobechat/types'; import { integer, jsonb, pgTable, text, uuid } from 'drizzle-orm/pg-core'; import { DEFAULT_MODEL } from '@/const/settings'; -import { EvalEvaluationStatus } from '@/types/eval'; import { timestamps } from './_helpers'; import { knowledgeBases } from './file'; diff --git a/src/database/schemas/rbac.ts b/packages/database/src/schemas/rbac.ts similarity index 100% rename from src/database/schemas/rbac.ts rename to packages/database/src/schemas/rbac.ts diff --git a/src/database/schemas/relations.ts b/packages/database/src/schemas/relations.ts similarity index 99% rename from src/database/schemas/relations.ts rename to packages/database/src/schemas/relations.ts index 20120cc7a5d..47109eae495 100644 --- a/src/database/schemas/relations.ts +++ b/packages/database/src/schemas/relations.ts @@ -2,8 +2,7 @@ import { relations } from 'drizzle-orm'; import { pgTable, primaryKey, text, uuid, varchar } from 'drizzle-orm/pg-core'; -import { createdAt } from '@/database/schemas/_helpers'; - +import { createdAt } from './_helpers'; import { agents, agentsFiles, agentsKnowledgeBases } from './agent'; import { asyncTasks } from './asyncTask'; import { documentChunks, documents } from './document'; diff --git a/src/database/schemas/session.ts b/packages/database/src/schemas/session.ts similarity index 96% rename from src/database/schemas/session.ts rename to packages/database/src/schemas/session.ts index 076d8a2960f..62abe145970 100644 --- a/src/database/schemas/session.ts +++ b/packages/database/src/schemas/session.ts @@ -2,8 +2,7 @@ import { boolean, integer, pgTable, text, uniqueIndex, varchar } from 'drizzle-orm/pg-core'; import { createInsertSchema } from 'drizzle-zod'; -import { idGenerator, randomSlug } from '@/database/utils/idGenerator'; - +import { idGenerator, randomSlug } from '../utils/idGenerator'; import { timestamps } from './_helpers'; import { users } from './user'; diff --git a/src/database/schemas/topic.ts b/packages/database/src/schemas/topic.ts similarity index 96% rename from src/database/schemas/topic.ts rename to packages/database/src/schemas/topic.ts index 0bed37fbed8..bf58d22d267 100644 --- a/src/database/schemas/topic.ts +++ b/packages/database/src/schemas/topic.ts @@ -2,11 +2,11 @@ import { boolean, jsonb, pgTable, primaryKey, text, uniqueIndex } from 'drizzle-orm/pg-core'; import { createInsertSchema } from 'drizzle-zod'; -import { documents } from '@/database/schemas/document'; -import { idGenerator } from '@/database/utils/idGenerator'; import { ChatTopicMetadata } from '@/types/topic'; +import { idGenerator } from '../utils/idGenerator'; import { createdAt, timestamps, timestamptz } from './_helpers'; +import { documents } from './document'; import { sessions } from './session'; import { users } from './user'; diff --git a/src/database/schemas/user.ts b/packages/database/src/schemas/user.ts similarity index 100% rename from src/database/schemas/user.ts rename to packages/database/src/schemas/user.ts diff --git a/src/database/server/index.ts b/packages/database/src/server/index.ts similarity index 100% rename from src/database/server/index.ts rename to packages/database/src/server/index.ts diff --git a/src/database/server/models/__tests__/adapter.test.ts b/packages/database/src/server/models/__tests__/adapter.test.ts similarity index 99% rename from src/database/server/models/__tests__/adapter.test.ts rename to packages/database/src/server/models/__tests__/adapter.test.ts index 48016db0ae9..9851cca64c6 100644 --- a/src/database/server/models/__tests__/adapter.test.ts +++ b/packages/database/src/server/models/__tests__/adapter.test.ts @@ -1,8 +1,10 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { getTestDBInstance } from '@/database/core/dbForTest'; -import { users } from '@/database/schemas'; +import { DrizzleAdapter } from '@/libs/oidc-provider/adapter'; + +import { getTestDBInstance } from '../../../core/dbForTest'; +import { users } from '../../../schemas'; import { oidcAccessTokens, oidcClients, @@ -10,8 +12,7 @@ import { oidcInteractions, oidcRefreshTokens, oidcSessions, -} from '@/database/schemas/oidc'; -import { DrizzleAdapter } from '@/libs/oidc-provider/adapter'; +} from '../../../schemas/oidc'; let serverDB = await getTestDBInstance(); diff --git a/src/database/server/models/__tests__/nextauth.test.ts b/packages/database/src/server/models/__tests__/nextauth.test.ts similarity index 99% rename from src/database/server/models/__tests__/nextauth.test.ts rename to packages/database/src/server/models/__tests__/nextauth.test.ts index 6a97ce83f88..caff53501f2 100644 --- a/src/database/server/models/__tests__/nextauth.test.ts +++ b/packages/database/src/server/models/__tests__/nextauth.test.ts @@ -8,16 +8,16 @@ import type { import { eq } from 'drizzle-orm'; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; -import { getTestDBInstance } from '@/database/core/dbForTest'; +import { LobeNextAuthDbAdapter } from '@/libs/next-auth/adapter'; + +import { getTestDBInstance } from '../../../core/dbForTest'; import { nextauthAccounts, nextauthAuthenticators, nextauthSessions, nextauthVerificationTokens, users, -} from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; -import { LobeNextAuthDbAdapter } from '@/libs/next-auth/adapter'; +} from '../../../schemas'; let serverDB = await getTestDBInstance(); diff --git a/src/database/server/models/__tests__/user.test.ts b/packages/database/src/server/models/__tests__/user.test.ts similarity index 99% rename from src/database/server/models/__tests__/user.test.ts rename to packages/database/src/server/models/__tests__/user.test.ts index 8bcf6f92f19..74483a6b48e 100644 --- a/src/database/server/models/__tests__/user.test.ts +++ b/packages/database/src/server/models/__tests__/user.test.ts @@ -4,11 +4,10 @@ import { eq } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { INBOX_SESSION_ID } from '@/const/session'; -import { getTestDBInstance } from '@/database/core/dbForTest'; -import { LobeChatDatabase } from '@/database/type'; import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt'; import { UserGuide, UserPreference } from '@/types/user'; +import { getTestDBInstance } from '../../../core/dbForTest'; import { SessionModel } from '../../../models/session'; import { UserModel, UserNotFoundError } from '../../../models/user'; import { UserSettingsItem, userSettings, users } from '../../../schemas'; diff --git a/src/database/server/models/ragEval/dataset.ts b/packages/database/src/server/models/ragEval/dataset.ts similarity index 90% rename from src/database/server/models/ragEval/dataset.ts rename to packages/database/src/server/models/ragEval/dataset.ts index bd1b2f3e771..e1ca5af30e4 100644 --- a/src/database/server/models/ragEval/dataset.ts +++ b/packages/database/src/server/models/ragEval/dataset.ts @@ -1,8 +1,8 @@ +import { RAGEvalDataSetItem } from '@lobechat/types'; import { and, desc, eq } from 'drizzle-orm'; -import { NewEvalDatasetsItem, evalDatasets } from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; -import { RAGEvalDataSetItem } from '@/types/eval'; +import { NewEvalDatasetsItem, evalDatasets } from '../../../schemas'; +import { LobeChatDatabase } from '../../../type'; export class EvalDatasetModel { private userId: string; diff --git a/src/database/server/models/ragEval/datasetRecord.ts b/packages/database/src/server/models/ragEval/datasetRecord.ts similarity index 94% rename from src/database/server/models/ragEval/datasetRecord.ts rename to packages/database/src/server/models/ragEval/datasetRecord.ts index d8f2c21ffb9..dff00aaca6b 100644 --- a/src/database/server/models/ragEval/datasetRecord.ts +++ b/packages/database/src/server/models/ragEval/datasetRecord.ts @@ -1,8 +1,8 @@ +import { EvalDatasetRecordRefFile } from '@lobechat/types'; import { and, eq, inArray } from 'drizzle-orm'; -import { NewEvalDatasetRecordsItem, evalDatasetRecords, files } from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; -import { EvalDatasetRecordRefFile } from '@/types/eval'; +import { NewEvalDatasetRecordsItem, evalDatasetRecords, files } from '../../../schemas'; +import { LobeChatDatabase } from '../../../type'; export class EvalDatasetRecordModel { private userId: string; diff --git a/src/database/server/models/ragEval/evaluation.ts b/packages/database/src/server/models/ragEval/evaluation.ts similarity index 94% rename from src/database/server/models/ragEval/evaluation.ts rename to packages/database/src/server/models/ragEval/evaluation.ts index 611bf544e92..1adff58cf35 100644 --- a/src/database/server/models/ragEval/evaluation.ts +++ b/packages/database/src/server/models/ragEval/evaluation.ts @@ -1,3 +1,4 @@ +import { EvalEvaluationStatus, RAGEvalEvaluationItem } from '@lobechat/types'; import { SQL, and, count, desc, eq, inArray } from 'drizzle-orm'; import { @@ -5,9 +6,8 @@ import { evalDatasets, evalEvaluation, evaluationRecords, -} from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; -import { EvalEvaluationStatus, RAGEvalEvaluationItem } from '@/types/eval'; +} from '../../../schemas'; +import { LobeChatDatabase } from '../../../type'; export class EvalEvaluationModel { private userId: string; diff --git a/src/database/server/models/ragEval/evaluationRecord.ts b/packages/database/src/server/models/ragEval/evaluationRecord.ts similarity index 93% rename from src/database/server/models/ragEval/evaluationRecord.ts rename to packages/database/src/server/models/ragEval/evaluationRecord.ts index fcc6d72a43d..81e16b7ed05 100644 --- a/src/database/server/models/ragEval/evaluationRecord.ts +++ b/packages/database/src/server/models/ragEval/evaluationRecord.ts @@ -1,7 +1,7 @@ import { and, eq } from 'drizzle-orm'; -import { NewEvaluationRecordsItem, evaluationRecords } from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; +import { LobeChatDatabase } from '../../../type'; +import { NewEvaluationRecordsItem, evaluationRecords } from '../../../schemas'; export class EvaluationRecordModel { private userId: string; diff --git a/src/database/server/models/ragEval/index.ts b/packages/database/src/server/models/ragEval/index.ts similarity index 100% rename from src/database/server/models/ragEval/index.ts rename to packages/database/src/server/models/ragEval/index.ts diff --git a/src/database/type.ts b/packages/database/src/type.ts similarity index 100% rename from src/database/type.ts rename to packages/database/src/type.ts diff --git a/src/database/utils/genWhere.ts b/packages/database/src/utils/genWhere.ts similarity index 100% rename from src/database/utils/genWhere.ts rename to packages/database/src/utils/genWhere.ts diff --git a/src/database/utils/idGenerator.test.ts b/packages/database/src/utils/idGenerator.test.ts similarity index 100% rename from src/database/utils/idGenerator.test.ts rename to packages/database/src/utils/idGenerator.test.ts diff --git a/src/database/utils/idGenerator.ts b/packages/database/src/utils/idGenerator.ts similarity index 73% rename from src/database/utils/idGenerator.ts rename to packages/database/src/utils/idGenerator.ts index 1310f952393..964bd2cb88b 100644 --- a/src/database/utils/idGenerator.ts +++ b/packages/database/src/utils/idGenerator.ts @@ -1,6 +1,9 @@ +// generate('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 16); //=> "4f90d13a42" +import { customAlphabet } from 'nanoid/non-secure'; import { generate } from 'random-words'; -import { createNanoId } from '@/utils/uuid'; +export const createNanoId = (size = 8) => + customAlphabet('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', size); const prefixes = { agents: 'agt', diff --git a/tests/setup-db.ts b/packages/database/tests/setup-db.ts similarity index 100% rename from tests/setup-db.ts rename to packages/database/tests/setup-db.ts diff --git a/vitest.config.server.ts b/packages/database/vitest.config.ts similarity index 60% rename from vitest.config.server.ts rename to packages/database/vitest.config.ts index 914855de6f5..0365556174f 100644 --- a/vitest.config.server.ts +++ b/packages/database/vitest.config.ts @@ -5,9 +5,12 @@ export default defineConfig({ test: { alias: { /* eslint-disable sort-keys-fix/sort-keys-fix */ - '@/const': resolve(__dirname, './packages/const/src'), - '@/types': resolve(__dirname, './packages/types/src'), - '@': resolve(__dirname, './src'), + '@/const': resolve(__dirname, '../const/src'), + '@/utils/errorResponse': resolve(__dirname, '../../src/utils/errorResponse'), + '@/utils': resolve(__dirname, '../utils/src'), + '@/database': resolve(__dirname, '../database/src'), + '@/types': resolve(__dirname, '../types/src'), + '@': resolve(__dirname, '../../src'), /* eslint-enable */ }, coverage: { @@ -15,18 +18,16 @@ export default defineConfig({ exclude: [ // https://github.com/lobehub/lobe-chat/pull/7265 ...coverageConfigDefaults.exclude, - 'src/database/server/core/dbForTest.ts', + 'src/server/core/dbForTest.ts', ], - include: ['src/database/models/**/*.ts', 'src/database/server/**/*.ts'], + include: ['src/models/**/*.ts', 'src/server/**/*.ts'], provider: 'v8', reporter: ['text', 'json', 'lcov', 'text-summary'], - reportsDirectory: './coverage/server', }, env: { TEST_SERVER_DB: '1', }, environment: 'node', - include: ['src/database/models/**/**/*.test.ts', 'src/database/server/**/**/*.test.ts'], poolOptions: { forks: { singleFork: true, diff --git a/packages/model-runtime/package.json b/packages/model-runtime/package.json index 03c1ac5c3fb..100053b8510 100644 --- a/packages/model-runtime/package.json +++ b/packages/model-runtime/package.json @@ -10,6 +10,7 @@ "dependencies": { "@aws-sdk/client-bedrock-runtime": "^3.862.0", "@lobechat/types": "workspace:*", + "@lobechat/utils": "workspace:*", "debug": "^4.4.1", "openai": "^4.104.0" } diff --git a/packages/model-runtime/src/bfl/createImage.test.ts b/packages/model-runtime/src/bfl/createImage.test.ts index a682efe7ec6..8c601ff4040 100644 --- a/packages/model-runtime/src/bfl/createImage.test.ts +++ b/packages/model-runtime/src/bfl/createImage.test.ts @@ -7,7 +7,7 @@ import { createBflImage } from './createImage'; import { BflStatusResponse } from './types'; // Mock external dependencies -vi.mock('@/utils/imageToBase64', () => ({ +vi.mock('@lobechat/utils', () => ({ imageUrlToBase64: vi.fn(), })); @@ -188,7 +188,7 @@ describe('createBflImage', () => { it('should convert single imageUrl to image_prompt base64', async () => { // Arrange const { parseDataUri } = await import('../utils/uriParser'); - const { imageUrlToBase64 } = await import('@/utils/imageToBase64'); + const { imageUrlToBase64 } = await import('@lobechat/utils'); const { asyncifyPolling } = await import('../utils/asyncifyPolling'); const mockParseDataUri = vi.mocked(parseDataUri); @@ -291,7 +291,7 @@ describe('createBflImage', () => { it('should convert multiple imageUrls for Kontext models', async () => { // Arrange const { parseDataUri } = await import('../utils/uriParser'); - const { imageUrlToBase64 } = await import('@/utils/imageToBase64'); + const { imageUrlToBase64 } = await import('@lobechat/utils'); const { asyncifyPolling } = await import('../utils/asyncifyPolling'); const mockParseDataUri = vi.mocked(parseDataUri); @@ -351,7 +351,7 @@ describe('createBflImage', () => { it('should limit imageUrls to maximum 4 images', async () => { // Arrange const { parseDataUri } = await import('../utils/uriParser'); - const { imageUrlToBase64 } = await import('@/utils/imageToBase64'); + const { imageUrlToBase64 } = await import('@lobechat/utils'); const { asyncifyPolling } = await import('../utils/asyncifyPolling'); const mockParseDataUri = vi.mocked(parseDataUri); diff --git a/packages/model-runtime/src/bfl/createImage.ts b/packages/model-runtime/src/bfl/createImage.ts index 12a7073a11e..809f1cd1baa 100644 --- a/packages/model-runtime/src/bfl/createImage.ts +++ b/packages/model-runtime/src/bfl/createImage.ts @@ -1,7 +1,7 @@ +import { imageUrlToBase64 } from '@lobechat/utils'; import createDebug from 'debug'; import { RuntimeImageGenParamsValue } from '@/libs/standard-parameters/index'; -import { imageUrlToBase64 } from '@/utils/imageToBase64'; import { AgentRuntimeErrorType } from '../error'; import { CreateImagePayload, CreateImageResponse } from '../types/image'; diff --git a/packages/model-runtime/src/google/index.test.ts b/packages/model-runtime/src/google/index.test.ts index c0fa908e355..186e6d4908f 100644 --- a/packages/model-runtime/src/google/index.test.ts +++ b/packages/model-runtime/src/google/index.test.ts @@ -1,12 +1,12 @@ // @vitest-environment edge-runtime import { GenerateContentResponse, Tool } from '@google/genai'; +import * as imageToBase64Module from '@lobechat/utils'; import OpenAI from 'openai'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { OpenAIChatMessage } from '@/libs/model-runtime'; import { CreateImagePayload } from '@/libs/model-runtime/types/image'; import { ChatStreamPayload } from '@/types/openai/chat'; -import * as imageToBase64Module from '@/utils/imageToBase64'; import * as debugStreamModule from '../utils/debugStream'; import { LobeGoogleAI } from './index'; diff --git a/packages/model-runtime/src/google/index.ts b/packages/model-runtime/src/google/index.ts index fe93406492d..a38e35d29d2 100644 --- a/packages/model-runtime/src/google/index.ts +++ b/packages/model-runtime/src/google/index.ts @@ -9,9 +9,7 @@ import { Type as SchemaType, ThinkingConfig, } from '@google/genai'; - -import { imageUrlToBase64 } from '@/utils/imageToBase64'; -import { safeParseJSON } from '@/utils/safeParseJSON'; +import { imageUrlToBase64, safeParseJSON } from '@lobechat/utils'; import { LobeRuntimeAI } from '../BaseAI'; import { AgentRuntimeErrorType } from '../error'; diff --git a/packages/model-runtime/src/ollama/index.ts b/packages/model-runtime/src/ollama/index.ts index d7fd5eacdfd..e263ea3866b 100644 --- a/packages/model-runtime/src/ollama/index.ts +++ b/packages/model-runtime/src/ollama/index.ts @@ -1,8 +1,7 @@ +import { ChatModelCard } from '@lobechat/types'; import { Ollama, Tool } from 'ollama/browser'; import { ClientOptions } from 'openai'; -import { ModelRequestOptions, OpenAIChatMessage } from '@/libs/model-runtime'; -import { ChatModelCard } from '@/types/llm'; import { createErrorResponse } from '@/utils/errorResponse'; import { LobeRuntimeAI } from '../BaseAI'; @@ -13,6 +12,8 @@ import { Embeddings, EmbeddingsPayload, ModelProvider, + ModelRequestOptions, + OpenAIChatMessage, PullModelParams, } from '../types'; import { AgentRuntimeError } from '../utils/createError'; diff --git a/packages/model-runtime/src/utils/anthropicHelpers.test.ts b/packages/model-runtime/src/utils/anthropicHelpers.test.ts index 1ac6ca8ee88..21a62e61d6e 100644 --- a/packages/model-runtime/src/utils/anthropicHelpers.test.ts +++ b/packages/model-runtime/src/utils/anthropicHelpers.test.ts @@ -1,8 +1,7 @@ +import { imageUrlToBase64 } from '@lobechat/utils'; import { OpenAI } from 'openai'; import { describe, expect, it, vi } from 'vitest'; -import { imageUrlToBase64 } from '@/utils/imageToBase64'; - import { OpenAIChatMessage, UserMessageContentPart } from '../types/chat'; import { buildAnthropicBlock, @@ -20,7 +19,7 @@ vi.mock('./uriParser', () => ({ type: 'base64', }), })); -vi.mock('@/utils/imageToBase64'); +vi.mock('@lobechat/utils'); describe('anthropicHelpers', () => { describe('buildAnthropicBlock', () => { diff --git a/packages/model-runtime/src/utils/anthropicHelpers.ts b/packages/model-runtime/src/utils/anthropicHelpers.ts index 6bd34b17099..081241c110e 100644 --- a/packages/model-runtime/src/utils/anthropicHelpers.ts +++ b/packages/model-runtime/src/utils/anthropicHelpers.ts @@ -1,8 +1,7 @@ import Anthropic from '@anthropic-ai/sdk'; +import { imageUrlToBase64 } from '@lobechat/utils'; import OpenAI from 'openai'; -import { imageUrlToBase64 } from '@/utils/imageToBase64'; - import { OpenAIChatMessage, UserMessageContentPart } from '../types'; import { parseDataUri } from './uriParser'; diff --git a/packages/model-runtime/src/utils/openaiCompatibleFactory/index.ts b/packages/model-runtime/src/utils/openaiCompatibleFactory/index.ts index 509dd9ee622..07c4d656ca2 100644 --- a/packages/model-runtime/src/utils/openaiCompatibleFactory/index.ts +++ b/packages/model-runtime/src/utils/openaiCompatibleFactory/index.ts @@ -1,3 +1,4 @@ +import { getModelPropertyWithFallback } from '@lobechat/utils'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import createDebug from 'debug'; @@ -7,7 +8,6 @@ import { Stream } from 'openai/streaming'; import { LOBE_DEFAULT_MODEL_LIST } from '@/config/aiModels'; import { RuntimeImageGenParamsValue } from '@/libs/standard-parameters/index'; import type { ChatModelCard } from '@/types/llm'; -import { getModelPropertyWithFallback } from '@/utils/getFallbackModelProperty'; import { LobeRuntimeAI } from '../../BaseAI'; import { AgentRuntimeErrorType, ILobeAgentRuntimeErrorType } from '../../error'; diff --git a/packages/model-runtime/src/utils/openaiHelpers.test.ts b/packages/model-runtime/src/utils/openaiHelpers.test.ts index 1ee4379e9c5..39e1de02ed8 100644 --- a/packages/model-runtime/src/utils/openaiHelpers.test.ts +++ b/packages/model-runtime/src/utils/openaiHelpers.test.ts @@ -1,8 +1,7 @@ +import { imageUrlToBase64 } from '@lobechat/utils'; import OpenAI from 'openai'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { imageUrlToBase64 } from '@/utils/imageToBase64'; - import { convertImageUrlToFile, convertMessageContent, @@ -12,7 +11,7 @@ import { import { parseDataUri } from './uriParser'; // 模拟依赖 -vi.mock('@/utils/imageToBase64'); +vi.mock('@lobechat/utils'); vi.mock('./uriParser'); describe('convertMessageContent', () => { diff --git a/packages/model-runtime/src/utils/openaiHelpers.ts b/packages/model-runtime/src/utils/openaiHelpers.ts index 3e15b62fef4..07e98be10cf 100644 --- a/packages/model-runtime/src/utils/openaiHelpers.ts +++ b/packages/model-runtime/src/utils/openaiHelpers.ts @@ -1,8 +1,8 @@ +import { imageUrlToBase64 } from '@lobechat/utils'; import OpenAI, { toFile } from 'openai'; import { disableStreamModels, systemToUserModels } from '@/const/models'; import { ChatStreamPayload, OpenAIChatMessage } from '@/libs/model-runtime'; -import { imageUrlToBase64 } from '@/utils/imageToBase64'; import { parseDataUri } from './uriParser'; @@ -103,7 +103,7 @@ export const convertOpenAIResponseInputs = async ( export const pruneReasoningPayload = (payload: ChatStreamPayload) => { const shouldStream = !disableStreamModels.has(payload.model); const { stream_options, ...cleanedPayload } = payload as any; - + return { ...cleanedPayload, frequency_penalty: 0, diff --git a/packages/model-runtime/src/utils/streams/bedrock/claude.ts b/packages/model-runtime/src/utils/streams/bedrock/claude.ts index 76e2e1de197..58f49dbbacb 100644 --- a/packages/model-runtime/src/utils/streams/bedrock/claude.ts +++ b/packages/model-runtime/src/utils/streams/bedrock/claude.ts @@ -1,6 +1,5 @@ import { InvokeModelWithResponseStreamResponse } from '@aws-sdk/client-bedrock-runtime'; - -import { nanoid } from '@/utils/uuid'; +import { nanoid } from '@lobechat/utils'; import { ChatStreamCallbacks } from '../../../types'; import { transformAnthropicStream } from '../anthropic'; diff --git a/packages/model-runtime/src/utils/streams/bedrock/llama.test.ts b/packages/model-runtime/src/utils/streams/bedrock/llama.test.ts index 782d2e12466..19f287eba2a 100644 --- a/packages/model-runtime/src/utils/streams/bedrock/llama.test.ts +++ b/packages/model-runtime/src/utils/streams/bedrock/llama.test.ts @@ -1,9 +1,8 @@ import { InvokeModelWithResponseStreamResponse } from '@aws-sdk/client-bedrock-runtime'; +import * as uuidModule from '@lobechat/utils'; import { Readable } from 'stream'; import { describe, expect, it, vi } from 'vitest'; -import * as uuidModule from '@/utils/uuid'; - import { AWSBedrockLlamaStream } from './llama'; describe('AWSBedrockLlamaStream', () => { diff --git a/packages/model-runtime/src/utils/streams/bedrock/llama.ts b/packages/model-runtime/src/utils/streams/bedrock/llama.ts index 35b7763fb6f..c91d29aaab9 100644 --- a/packages/model-runtime/src/utils/streams/bedrock/llama.ts +++ b/packages/model-runtime/src/utils/streams/bedrock/llama.ts @@ -1,6 +1,5 @@ import { InvokeModelWithResponseStreamResponse } from '@aws-sdk/client-bedrock-runtime'; - -import { nanoid } from '@/utils/uuid'; +import { nanoid } from '@lobechat/utils'; import { ChatStreamCallbacks } from '../../../types'; import { diff --git a/packages/model-runtime/src/utils/streams/google-ai.test.ts b/packages/model-runtime/src/utils/streams/google-ai.test.ts index 42b8939f48b..ffad2bac3ab 100644 --- a/packages/model-runtime/src/utils/streams/google-ai.test.ts +++ b/packages/model-runtime/src/utils/streams/google-ai.test.ts @@ -1,8 +1,7 @@ import { GenerateContentResponse } from '@google/genai'; +import * as uuidModule from '@lobechat/utils'; import { describe, expect, it, vi } from 'vitest'; -import * as uuidModule from '@/utils/uuid'; - import { GoogleGenerativeAIStream } from './google-ai'; describe('GoogleGenerativeAIStream', () => { diff --git a/packages/model-runtime/src/utils/streams/google-ai.ts b/packages/model-runtime/src/utils/streams/google-ai.ts index 2e092e251fc..7a7a11c381e 100644 --- a/packages/model-runtime/src/utils/streams/google-ai.ts +++ b/packages/model-runtime/src/utils/streams/google-ai.ts @@ -1,9 +1,9 @@ import { GenerateContentResponse } from '@google/genai'; +import { nanoid } from '@lobechat/utils'; import errorLocale from '@/locales/default/error'; import { ModelTokensUsage } from '@/types/message'; import { GroundingSearch } from '@/types/search'; -import { nanoid } from '@/utils/uuid'; import { ChatStreamCallbacks } from '../../types'; import { diff --git a/packages/model-runtime/src/utils/streams/ollama.test.ts b/packages/model-runtime/src/utils/streams/ollama.test.ts index 922abddf691..3777982f6c2 100644 --- a/packages/model-runtime/src/utils/streams/ollama.test.ts +++ b/packages/model-runtime/src/utils/streams/ollama.test.ts @@ -1,8 +1,7 @@ +import * as uuidModule from '@lobechat/utils'; import { ChatResponse } from 'ollama/browser'; import { describe, expect, it, vi } from 'vitest'; -import * as uuidModule from '@/utils/uuid'; - import { OllamaStream } from './ollama'; describe('OllamaStream', () => { diff --git a/packages/model-runtime/src/utils/streams/ollama.ts b/packages/model-runtime/src/utils/streams/ollama.ts index dc8521c14bd..22c1fc28074 100644 --- a/packages/model-runtime/src/utils/streams/ollama.ts +++ b/packages/model-runtime/src/utils/streams/ollama.ts @@ -1,7 +1,7 @@ +import { nanoid } from '@lobechat/utils'; import { ChatResponse } from 'ollama/browser'; import { ChatStreamCallbacks } from '@/libs/model-runtime'; -import { nanoid } from '@/utils/uuid'; import { StreamContext, diff --git a/packages/model-runtime/src/utils/streams/protocol.ts b/packages/model-runtime/src/utils/streams/protocol.ts index cd7015cd65f..762173c9709 100644 --- a/packages/model-runtime/src/utils/streams/protocol.ts +++ b/packages/model-runtime/src/utils/streams/protocol.ts @@ -1,6 +1,6 @@ +import { nanoid, safeParseJSON } from '@lobechat/utils'; + import { CitationItem, ModelSpeed, ModelTokensUsage } from '@/types/message'; -import { safeParseJSON } from '@/utils/safeParseJSON'; -import { nanoid } from '@/utils/uuid'; import { AgentRuntimeErrorType } from '../../error'; import { parseToolCalls } from '../../helpers'; diff --git a/packages/model-runtime/src/utils/streams/vertex-ai.test.ts b/packages/model-runtime/src/utils/streams/vertex-ai.test.ts index 29c0eae3be8..e5fa28a7253 100644 --- a/packages/model-runtime/src/utils/streams/vertex-ai.test.ts +++ b/packages/model-runtime/src/utils/streams/vertex-ai.test.ts @@ -1,7 +1,6 @@ +import * as uuidModule from '@lobechat/utils'; import { describe, expect, it, vi } from 'vitest'; -import * as uuidModule from '@/utils/uuid'; - import { VertexAIStream } from './vertex-ai'; describe('VertexAIStream', () => { diff --git a/packages/model-runtime/src/utils/streams/vertex-ai.ts b/packages/model-runtime/src/utils/streams/vertex-ai.ts index 44e700cdae0..c1b1fb11801 100644 --- a/packages/model-runtime/src/utils/streams/vertex-ai.ts +++ b/packages/model-runtime/src/utils/streams/vertex-ai.ts @@ -1,8 +1,8 @@ import { GenerateContentResponse } from '@google/genai'; +import { nanoid } from '@lobechat/utils'; import { ModelTokensUsage } from '@/types/message'; import { GroundingSearch } from '@/types/search'; -import { nanoid } from '@/utils/uuid'; import { type GoogleAIStreamOptions } from './google-ai'; import { diff --git a/packages/model-runtime/vitest.config.ts b/packages/model-runtime/vitest.config.ts index e2cc1c7668d..fd57324ecbd 100644 --- a/packages/model-runtime/vitest.config.ts +++ b/packages/model-runtime/vitest.config.ts @@ -7,6 +7,8 @@ export default defineConfig({ /* eslint-disable sort-keys-fix/sort-keys-fix */ '@/libs/model-runtime': resolve(__dirname, './src'), '@/types': resolve(__dirname, '../types/src'), + '@/utils/errorResponse': resolve(__dirname, '../../src/utils/errorResponse'), + '@/utils': resolve(__dirname, '../utils/src'), '@/const': resolve(__dirname, '../const/src'), '@': resolve(__dirname, '../../src'), /* eslint-enable */ diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 363ae823d01..723d925b18f 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -1,10 +1,15 @@ export * from './artifact'; export * from './chunk'; export * from './clientDB'; +export * from './eval'; export * from './fetch'; export * from './knowledgeBase'; +export * from './llm'; export * from './message'; +export * from './user'; +export * from './user/settings'; // FIXME: I think we need a refactor for the "openai" types // it more likes the UI message payload export * from './openai/chat'; export * from './trace'; +export * from './zustand'; diff --git a/src/utils/zustand.ts b/packages/types/src/zustand.ts similarity index 100% rename from src/utils/zustand.ts rename to packages/types/src/zustand.ts diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 00000000000..a5eb0b6ea05 --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,17 @@ +{ + "name": "@lobechat/utils", + "version": "1.0.0", + "private": true, + "main": "./src/index.ts", + "scripts": { + "test": "vitest", + "test:coverage": "vitest --coverage" + }, + "dependencies": { + "@lobechat/const": "workspace:*", + "@lobechat/types": "workspace:*" + }, + "devDependencies": { + "vitest-canvas-mock": "^0.3.3" + } +} diff --git a/src/utils/__snapshots__/parseModels.test.ts.snap b/packages/utils/src/__snapshots__/parseModels.test.ts.snap similarity index 100% rename from src/utils/__snapshots__/parseModels.test.ts.snap rename to packages/utils/src/__snapshots__/parseModels.test.ts.snap diff --git a/src/utils/_deprecated/__snapshots__/parseModels.test.ts.snap b/packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap similarity index 100% rename from src/utils/_deprecated/__snapshots__/parseModels.test.ts.snap rename to packages/utils/src/_deprecated/__snapshots__/parseModels.test.ts.snap diff --git a/src/utils/_deprecated/parseModels.test.ts b/packages/utils/src/_deprecated/parseModels.test.ts similarity index 100% rename from src/utils/_deprecated/parseModels.test.ts rename to packages/utils/src/_deprecated/parseModels.test.ts diff --git a/src/utils/_deprecated/parseModels.ts b/packages/utils/src/_deprecated/parseModels.ts similarity index 100% rename from src/utils/_deprecated/parseModels.ts rename to packages/utils/src/_deprecated/parseModels.ts diff --git a/src/utils/apiKey.ts b/packages/utils/src/apiKey.ts similarity index 100% rename from src/utils/apiKey.ts rename to packages/utils/src/apiKey.ts diff --git a/src/utils/basePath.ts b/packages/utils/src/basePath.ts similarity index 100% rename from src/utils/basePath.ts rename to packages/utils/src/basePath.ts diff --git a/src/utils/client/GlobalAgentContextManager.ts b/packages/utils/src/client/GlobalAgentContextManager.ts similarity index 100% rename from src/utils/client/GlobalAgentContextManager.ts rename to packages/utils/src/client/GlobalAgentContextManager.ts diff --git a/src/utils/client/cookie.test.ts b/packages/utils/src/client/cookie.test.ts similarity index 96% rename from src/utils/client/cookie.test.ts rename to packages/utils/src/client/cookie.test.ts index 622419d74f7..411965be74f 100644 --- a/src/utils/client/cookie.test.ts +++ b/packages/utils/src/client/cookie.test.ts @@ -1,9 +1,7 @@ import dayjs from 'dayjs'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { COOKIE_CACHE_DAYS } from '@/const/settings'; - -import { setCookie } from './cookie'; +import { COOKIE_CACHE_DAYS, setCookie } from './cookie'; describe('setCookie', () => { // Mock document.cookie since we're in a test environment diff --git a/src/utils/client/cookie.ts b/packages/utils/src/client/cookie.ts similarity index 93% rename from src/utils/client/cookie.ts rename to packages/utils/src/client/cookie.ts index b83dc6421bb..2acf260b6fd 100644 --- a/src/utils/client/cookie.ts +++ b/packages/utils/src/client/cookie.ts @@ -1,6 +1,6 @@ import dayjs from 'dayjs'; -import { COOKIE_CACHE_DAYS } from '@/const/settings'; +export const COOKIE_CACHE_DAYS = 30; export const setCookie = ( key: string, diff --git a/src/utils/client/downloadFile.ts b/packages/utils/src/client/downloadFile.ts similarity index 100% rename from src/utils/client/downloadFile.ts rename to packages/utils/src/client/downloadFile.ts diff --git a/src/utils/client/exportFile.ts b/packages/utils/src/client/exportFile.ts similarity index 100% rename from src/utils/client/exportFile.ts rename to packages/utils/src/client/exportFile.ts diff --git a/src/utils/client/parserPlaceholder.test.ts b/packages/utils/src/client/parserPlaceholder.test.ts similarity index 98% rename from src/utils/client/parserPlaceholder.test.ts rename to packages/utils/src/client/parserPlaceholder.test.ts index b0343d4c721..25e1f32865f 100644 --- a/src/utils/client/parserPlaceholder.test.ts +++ b/packages/utils/src/client/parserPlaceholder.test.ts @@ -1,9 +1,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { VARIABLE_GENERATORS, parsePlaceholderVariablesMessages } from './parserPlaceholder'; +import { parsePlaceholderVariablesMessages } from './parserPlaceholder'; // Mock dependencies -vi.mock('@/utils/uuid', () => ({ +vi.mock('../uuid', () => ({ uuid: () => 'mocked-uuid-12345', })); diff --git a/src/utils/client/parserPlaceholder.ts b/packages/utils/src/client/parserPlaceholder.ts similarity index 59% rename from src/utils/client/parserPlaceholder.ts rename to packages/utils/src/client/parserPlaceholder.ts index 05e52db58d2..81e3c7ffedc 100644 --- a/src/utils/client/parserPlaceholder.ts +++ b/packages/utils/src/client/parserPlaceholder.ts @@ -1,35 +1,35 @@ import { template } from 'lodash-es'; -import { uuid } from '@/utils/uuid'; - import { useUserStore } from '@/store/user'; import { userProfileSelectors } from '@/store/user/selectors'; +import { uuid } from '../uuid'; + const placeholderVariablesRegex = /{{(.*?)}}/g; /* eslint-disable sort-keys-fix/sort-keys-fix */ export const VARIABLE_GENERATORS = { /** - * 时间类模板变量 - * - * | Value | Example | - * |-------|---------| - * | `{{date}}` | 12/25/2023 | - * | `{{datetime}}` | 12/25/2023, 2:30:45 PM | - * | `{{day}}` | 25 | - * | `{{hour}}` | 14 | - * | `{{iso}}` | 2023-12-25T14:30:45.123Z | - * | `{{locale}}` | zh-CN | - * | `{{minute}}` | 30 | - * | `{{month}}` | 12 | - * | `{{second}}` | 45 | - * | `{{time}}` | 2:30:45 PM | - * | `{{timestamp}}` | 1703538645123 | - * | `{{timezone}}` | America/New_York | - * | `{{weekday}}` | Monday | - * | `{{year}}` | 2023 | - * - */ + * 时间类模板变量 + * + * | Value | Example | + * |-------|---------| + * | `{{date}}` | 12/25/2023 | + * | `{{datetime}}` | 12/25/2023, 2:30:45 PM | + * | `{{day}}` | 25 | + * | `{{hour}}` | 14 | + * | `{{iso}}` | 2023-12-25T14:30:45.123Z | + * | `{{locale}}` | zh-CN | + * | `{{minute}}` | 30 | + * | `{{month}}` | 12 | + * | `{{second}}` | 45 | + * | `{{time}}` | 2:30:45 PM | + * | `{{timestamp}}` | 1703538645123 | + * | `{{timezone}}` | America/New_York | + * | `{{weekday}}` | Monday | + * | `{{year}}` | 2023 | + * + */ date: () => new Date().toLocaleDateString(), datetime: () => new Date().toLocaleString(), day: () => new Date().getDate().toString().padStart(2, '0'), @@ -46,65 +46,71 @@ export const VARIABLE_GENERATORS = { year: () => new Date().getFullYear().toString(), /** - * 用户信息类模板变量 - * - * | Value | Example | - * |-------|---------| - * | `{{email}}` | demo@lobehub.com | - * | `{{nickname}}` | 社区版用户 | - * | `{{username}}` | LobeChat | - * - */ + * 用户信息类模板变量 + * + * | Value | Example | + * |-------|---------| + * | `{{email}}` | demo@lobehub.com | + * | `{{nickname}}` | 社区版用户 | + * | `{{username}}` | LobeChat | + * + */ email: () => userProfileSelectors.email(useUserStore.getState()) ?? '', nickname: () => userProfileSelectors.nickName(useUserStore.getState()) ?? '', - username: () => userProfileSelectors.displayUserName(useUserStore.getState()) ?? userProfileSelectors.fullName(useUserStore.getState()) ?? '', + username: () => + userProfileSelectors.displayUserName(useUserStore.getState()) ?? + userProfileSelectors.fullName(useUserStore.getState()) ?? + '', /** - * 随机值类模板变量 - * - * | Value | Example | - * |-------|---------| - * | `{{random}}` | 100041 | - * | `{{random_bool}}` | true | - * | `{{random_float}}` | 76.02 | - * | `{{random_hex}}` | de0dbd | - * | `{{random_int}}` | 68 | - * | `{{random_string}}` | wqn9zfrqe7h | - * - */ + * 随机值类模板变量 + * + * | Value | Example | + * |-------|---------| + * | `{{random}}` | 100041 | + * | `{{random_bool}}` | true | + * | `{{random_float}}` | 76.02 | + * | `{{random_hex}}` | de0dbd | + * | `{{random_int}}` | 68 | + * | `{{random_string}}` | wqn9zfrqe7h | + * + */ random: () => Math.floor(Math.random() * 1_000_000 + 1).toString(), random_bool: () => (Math.random() > 0.5 ? 'true' : 'false'), random_float: () => (Math.random() * 100).toFixed(2), - random_hex: () => Math.floor(Math.random() * 16_777_215).toString(16).padStart(6, '0'), + random_hex: () => + Math.floor(Math.random() * 16_777_215) + .toString(16) + .padStart(6, '0'), random_int: () => Math.floor(Math.random() * 100 + 1).toString(), random_string: () => Math.random().toString(36).slice(2, 15), random_digit: () => Math.floor(Math.random() * 10).toString(), /** - * UUID 类模板变量 - * - * | Value | Example | - * |-------|---------| - * | `{{uuid}}` | dd90b35-669f-4e87-beb8-ac6877f6995d | - * | `{{uuid_short}}` | dd90b35 | - * - */ + * UUID 类模板变量 + * + * | Value | Example | + * |-------|---------| + * | `{{uuid}}` | dd90b35-669f-4e87-beb8-ac6877f6995d | + * | `{{uuid_short}}` | dd90b35 | + * + */ uuid: () => uuid(), uuid_short: () => uuid().split('-')[0], /** - * 平台类模板变量 - * - * | Value | Example | - * |-------|---------| - * | `{{language}}` | zh-CN | - * | `{{platform}}` | MacIntel | - * | `{{user_agent}}` | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0 | - * - */ - language: () => typeof navigator !== 'undefined' ? navigator.language : '', - platform: () => typeof navigator !== 'undefined' ? navigator.platform : '', - user_agent: () => typeof navigator !== 'undefined' ? navigator.userAgent : '', + * 平台类模板变量 + * + * | Value | Example | + * |-------|---------| + * | `{{language}}` | zh-CN | + * | `{{platform}}` | MacIntel | + * | `{{user_agent}}` | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0 | + * + */ + language: () => (typeof navigator !== 'undefined' ? navigator.language : ''), + platform: () => (typeof navigator !== 'undefined' ? navigator.platform : ''), + user_agent: () => (typeof navigator !== 'undefined' ? navigator.userAgent : ''), } as Record string>; /** @@ -114,7 +120,7 @@ export const VARIABLE_GENERATORS = { */ const extractPlaceholderVariables = (text: string): string[] => { const matches = [...text.matchAll(placeholderVariablesRegex)]; - return matches.map(m => m[1].trim()); + return matches.map((m) => m[1].trim()); }; /** @@ -132,7 +138,7 @@ export const parsePlaceholderVariables = (text: string, depth = 2): string => { const variables = Object.fromEntries( extractPlaceholderVariables(result) .map((key) => [key, VARIABLE_GENERATORS[key]?.()]) - .filter(([, value]) => value !== undefined) + .filter(([, value]) => value !== undefined), ); const replaced = template(result, { interpolate: placeholderVariablesRegex })(variables); @@ -153,7 +159,7 @@ export const parsePlaceholderVariables = (text: string, depth = 2): string => { * @returns 处理后的消息数组 */ export const parsePlaceholderVariablesMessages = (messages: any[]): any[] => - messages.map(message => { + messages.map((message) => { if (!message?.content) return message; const { content } = message; @@ -167,11 +173,9 @@ export const parsePlaceholderVariablesMessages = (messages: any[]): any[] => if (Array.isArray(content)) { return { ...message, - content: content.map(item => - item?.type === 'text' - ? { ...item, text: parsePlaceholderVariables(item.text) } - : item - ) + content: content.map((item) => + item?.type === 'text' ? { ...item, text: parsePlaceholderVariables(item.text) } : item, + ), }; } diff --git a/src/utils/client/topic.test.ts b/packages/utils/src/client/topic.test.ts similarity index 98% rename from src/utils/client/topic.test.ts rename to packages/utils/src/client/topic.test.ts index 8269178b394..f612124820b 100644 --- a/src/utils/client/topic.test.ts +++ b/packages/utils/src/client/topic.test.ts @@ -1,5 +1,5 @@ import dayjs from 'dayjs'; -import { beforeAll, describe, expect, it } from 'vitest'; +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; import { ChatTopic } from '@/types/topic'; diff --git a/src/utils/client/topic.ts b/packages/utils/src/client/topic.ts similarity index 100% rename from src/utils/client/topic.ts rename to packages/utils/src/client/topic.ts diff --git a/src/utils/client/xor-obfuscation.test.ts b/packages/utils/src/client/xor-obfuscation.test.ts similarity index 100% rename from src/utils/client/xor-obfuscation.test.ts rename to packages/utils/src/client/xor-obfuscation.test.ts diff --git a/src/utils/client/xor-obfuscation.ts b/packages/utils/src/client/xor-obfuscation.ts similarity index 100% rename from src/utils/client/xor-obfuscation.ts rename to packages/utils/src/client/xor-obfuscation.ts diff --git a/src/utils/clientIP.test.ts b/packages/utils/src/clientIP.test.ts similarity index 100% rename from src/utils/clientIP.test.ts rename to packages/utils/src/clientIP.test.ts diff --git a/src/utils/clientIP.ts b/packages/utils/src/clientIP.ts similarity index 100% rename from src/utils/clientIP.ts rename to packages/utils/src/clientIP.ts diff --git a/src/utils/clipboard.ts b/packages/utils/src/clipboard.ts similarity index 100% rename from src/utils/clipboard.ts rename to packages/utils/src/clipboard.ts diff --git a/src/utils/colorUtils.ts b/packages/utils/src/colorUtils.ts similarity index 100% rename from src/utils/colorUtils.ts rename to packages/utils/src/colorUtils.ts diff --git a/src/utils/compass.ts b/packages/utils/src/compass.ts similarity index 100% rename from src/utils/compass.ts rename to packages/utils/src/compass.ts diff --git a/src/utils/compressImage.test.ts b/packages/utils/src/compressImage.test.ts similarity index 96% rename from src/utils/compressImage.test.ts rename to packages/utils/src/compressImage.test.ts index 4d60d51d7a4..e7f921b6093 100644 --- a/src/utils/compressImage.test.ts +++ b/packages/utils/src/compressImage.test.ts @@ -1,3 +1,5 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; + import compressImage from './compressImage'; const getContextSpy = vi.spyOn(global.HTMLCanvasElement.prototype, 'getContext'); diff --git a/src/utils/compressImage.ts b/packages/utils/src/compressImage.ts similarity index 100% rename from src/utils/compressImage.ts rename to packages/utils/src/compressImage.ts diff --git a/src/utils/difference.test.ts b/packages/utils/src/difference.test.ts similarity index 100% rename from src/utils/difference.test.ts rename to packages/utils/src/difference.test.ts diff --git a/src/utils/difference.ts b/packages/utils/src/difference.ts similarity index 100% rename from src/utils/difference.ts rename to packages/utils/src/difference.ts diff --git a/src/utils/electron/desktopRemoteRPCFetch.ts b/packages/utils/src/electron/desktopRemoteRPCFetch.ts similarity index 100% rename from src/utils/electron/desktopRemoteRPCFetch.ts rename to packages/utils/src/electron/desktopRemoteRPCFetch.ts diff --git a/src/utils/env.ts b/packages/utils/src/env.ts similarity index 100% rename from src/utils/env.ts rename to packages/utils/src/env.ts diff --git a/src/utils/fetch/__tests__/fetchSSE.test.ts b/packages/utils/src/fetch/__tests__/fetchSSE.test.ts similarity index 99% rename from src/utils/fetch/__tests__/fetchSSE.test.ts rename to packages/utils/src/fetch/__tests__/fetchSSE.test.ts index fb469adff68..9f6dfc69503 100644 --- a/src/utils/fetch/__tests__/fetchSSE.test.ts +++ b/packages/utils/src/fetch/__tests__/fetchSSE.test.ts @@ -1,9 +1,8 @@ +import { MESSAGE_CANCEL_FLAT } from '@lobechat/const'; +import { ChatMessageError } from '@lobechat/types'; import { afterEach, describe, expect, it, vi } from 'vitest'; -import { MESSAGE_CANCEL_FLAT } from '@/const/message'; -import { ChatMessageError } from '@/types/message'; -import { sleep } from '@/utils/sleep'; - +import { sleep } from '../../sleep'; import { FetchEventSourceInit } from '../fetchEventSource'; import { fetchEventSource } from '../fetchEventSource'; import { fetchSSE } from '../fetchSSE'; diff --git a/src/utils/fetch/__tests__/parseError.test.ts b/packages/utils/src/fetch/__tests__/parseError.test.ts similarity index 100% rename from src/utils/fetch/__tests__/parseError.test.ts rename to packages/utils/src/fetch/__tests__/parseError.test.ts diff --git a/src/utils/fetch/fetchEventSource/index.ts b/packages/utils/src/fetch/fetchEventSource/index.ts similarity index 100% rename from src/utils/fetch/fetchEventSource/index.ts rename to packages/utils/src/fetch/fetchEventSource/index.ts diff --git a/src/utils/fetch/fetchEventSource/parse.ts b/packages/utils/src/fetch/fetchEventSource/parse.ts similarity index 100% rename from src/utils/fetch/fetchEventSource/parse.ts rename to packages/utils/src/fetch/fetchEventSource/parse.ts diff --git a/src/utils/fetch/fetchSSE.ts b/packages/utils/src/fetch/fetchSSE.ts similarity index 99% rename from src/utils/fetch/fetchSSE.ts rename to packages/utils/src/fetch/fetchSSE.ts index 1d9baed9f1d..c8c9cef851b 100644 --- a/src/utils/fetch/fetchSSE.ts +++ b/packages/utils/src/fetch/fetchSSE.ts @@ -15,8 +15,8 @@ import { } from '@/types/message'; import { ChatImageChunk } from '@/types/message/image'; import { GroundingSearch } from '@/types/search'; -import { nanoid } from '@/utils/uuid'; +import { nanoid } from '../uuid'; import { fetchEventSource } from './fetchEventSource'; import { getMessageError } from './parseError'; diff --git a/src/utils/fetch/headers.ts b/packages/utils/src/fetch/headers.ts similarity index 100% rename from src/utils/fetch/headers.ts rename to packages/utils/src/fetch/headers.ts diff --git a/src/utils/fetch/index.ts b/packages/utils/src/fetch/index.ts similarity index 100% rename from src/utils/fetch/index.ts rename to packages/utils/src/fetch/index.ts diff --git a/src/utils/fetch/parseError.ts b/packages/utils/src/fetch/parseError.ts similarity index 100% rename from src/utils/fetch/parseError.ts rename to packages/utils/src/fetch/parseError.ts diff --git a/src/utils/fetch/request.ts b/packages/utils/src/fetch/request.ts similarity index 100% rename from src/utils/fetch/request.ts rename to packages/utils/src/fetch/request.ts diff --git a/src/utils/format.test.ts b/packages/utils/src/format.test.ts similarity index 100% rename from src/utils/format.test.ts rename to packages/utils/src/format.test.ts diff --git a/src/utils/format.ts b/packages/utils/src/format.ts similarity index 100% rename from src/utils/format.ts rename to packages/utils/src/format.ts diff --git a/src/utils/genOG.ts b/packages/utils/src/genOG.ts similarity index 100% rename from src/utils/genOG.ts rename to packages/utils/src/genOG.ts diff --git a/src/utils/getFallbackModelProperty.test.ts b/packages/utils/src/getFallbackModelProperty.test.ts similarity index 99% rename from src/utils/getFallbackModelProperty.test.ts rename to packages/utils/src/getFallbackModelProperty.test.ts index cf3ba7e52ce..f928464209f 100644 --- a/src/utils/getFallbackModelProperty.test.ts +++ b/packages/utils/src/getFallbackModelProperty.test.ts @@ -1,4 +1,4 @@ -import { vi } from 'vitest'; +import { describe, expect, it, vi } from 'vitest'; import { getModelPropertyWithFallback } from './getFallbackModelProperty'; diff --git a/src/utils/getFallbackModelProperty.ts b/packages/utils/src/getFallbackModelProperty.ts similarity index 100% rename from src/utils/getFallbackModelProperty.ts rename to packages/utils/src/getFallbackModelProperty.ts diff --git a/src/utils/imageToBase64.test.ts b/packages/utils/src/imageToBase64.test.ts similarity index 100% rename from src/utils/imageToBase64.test.ts rename to packages/utils/src/imageToBase64.test.ts diff --git a/src/utils/imageToBase64.ts b/packages/utils/src/imageToBase64.ts similarity index 100% rename from src/utils/imageToBase64.ts rename to packages/utils/src/imageToBase64.ts diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 00000000000..9b846ac97ff --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,5 @@ +export * from './client/cookie'; +export * from './getFallbackModelProperty'; +export * from './imageToBase64'; +export * from './safeParseJSON'; +export * from './uuid'; diff --git a/src/utils/isChunkingUnsupported.test.ts b/packages/utils/src/isChunkingUnsupported.test.ts similarity index 100% rename from src/utils/isChunkingUnsupported.test.ts rename to packages/utils/src/isChunkingUnsupported.test.ts diff --git a/src/utils/isChunkingUnsupported.ts b/packages/utils/src/isChunkingUnsupported.ts similarity index 100% rename from src/utils/isChunkingUnsupported.ts rename to packages/utils/src/isChunkingUnsupported.ts diff --git a/src/utils/keyboard.ts b/packages/utils/src/keyboard.ts similarity index 100% rename from src/utils/keyboard.ts rename to packages/utils/src/keyboard.ts diff --git a/src/utils/localStorage.ts b/packages/utils/src/localStorage.ts similarity index 100% rename from src/utils/localStorage.ts rename to packages/utils/src/localStorage.ts diff --git a/src/utils/locale.test.ts b/packages/utils/src/locale.test.ts similarity index 100% rename from src/utils/locale.test.ts rename to packages/utils/src/locale.test.ts diff --git a/src/utils/locale.ts b/packages/utils/src/locale.ts similarity index 97% rename from src/utils/locale.ts rename to packages/utils/src/locale.ts index 0fe495d866c..9d4fe1ffe66 100644 --- a/src/utils/locale.ts +++ b/packages/utils/src/locale.ts @@ -2,7 +2,8 @@ import { resolveAcceptLanguage } from 'resolve-accept-language'; import { DEFAULT_LANG } from '@/const/locale'; import { Locales, locales, normalizeLocale } from '@/locales/resources'; -import { RouteVariants } from '@/utils/server/routeVariants'; + +import { RouteVariants } from './server/routeVariants'; export const getAntdLocale = async (lang?: string) => { let normalLang: any = normalizeLocale(lang); diff --git a/src/utils/merge.test.ts b/packages/utils/src/merge.test.ts similarity index 99% rename from src/utils/merge.test.ts rename to packages/utils/src/merge.test.ts index 0d65a5e2d3f..72b6d222e58 100644 --- a/src/utils/merge.test.ts +++ b/packages/utils/src/merge.test.ts @@ -1,6 +1,4 @@ -import { expect } from 'vitest'; - -import { AIChatModelCard } from '@/types/aiModel'; +import { describe, expect, it } from 'vitest'; import { mergeArrayById } from './merge'; diff --git a/src/utils/merge.ts b/packages/utils/src/merge.ts similarity index 100% rename from src/utils/merge.ts rename to packages/utils/src/merge.ts diff --git a/src/utils/number.test.ts b/packages/utils/src/number.test.ts similarity index 100% rename from src/utils/number.test.ts rename to packages/utils/src/number.test.ts diff --git a/src/utils/number.ts b/packages/utils/src/number.ts similarity index 100% rename from src/utils/number.ts rename to packages/utils/src/number.ts diff --git a/src/utils/object.ts b/packages/utils/src/object.ts similarity index 100% rename from src/utils/object.ts rename to packages/utils/src/object.ts diff --git a/src/utils/parseMarkdown.ts b/packages/utils/src/parseMarkdown.ts similarity index 100% rename from src/utils/parseMarkdown.ts rename to packages/utils/src/parseMarkdown.ts diff --git a/src/utils/parseModels.test.ts b/packages/utils/src/parseModels.test.ts similarity index 100% rename from src/utils/parseModels.test.ts rename to packages/utils/src/parseModels.test.ts diff --git a/src/utils/parseModels.ts b/packages/utils/src/parseModels.ts similarity index 98% rename from src/utils/parseModels.ts rename to packages/utils/src/parseModels.ts index ec54484babc..1d0e214d1b2 100644 --- a/src/utils/parseModels.ts +++ b/packages/utils/src/parseModels.ts @@ -1,8 +1,9 @@ import { produce } from 'immer'; import { AiFullModelCard, AiModelType } from '@/types/aiModel'; -import { getModelPropertyWithFallback } from '@/utils/getFallbackModelProperty'; -import { merge } from '@/utils/merge'; + +import { getModelPropertyWithFallback } from './getFallbackModelProperty'; +import { merge } from './merge'; /** * Parse model string to add or remove models. diff --git a/src/utils/platform.test.ts b/packages/utils/src/platform.test.ts similarity index 98% rename from src/utils/platform.test.ts rename to packages/utils/src/platform.test.ts index 8af994153e7..0182dce7bba 100644 --- a/src/utils/platform.test.ts +++ b/packages/utils/src/platform.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { isArc, isSonomaOrLaterSafari } from './platform'; diff --git a/src/utils/platform.ts b/packages/utils/src/platform.ts similarity index 97% rename from src/utils/platform.ts rename to packages/utils/src/platform.ts index 50535cea7b1..93bc1f50386 100644 --- a/src/utils/platform.ts +++ b/packages/utils/src/platform.ts @@ -1,6 +1,6 @@ import UAParser from 'ua-parser-js'; -import { isOnServerSide } from '@/utils/env'; +import { isOnServerSide } from './env'; export const getParser = () => { if (isOnServerSide) return new UAParser('Node'); diff --git a/src/utils/pricing.test.ts b/packages/utils/src/pricing.test.ts similarity index 100% rename from src/utils/pricing.test.ts rename to packages/utils/src/pricing.test.ts diff --git a/src/utils/pricing.ts b/packages/utils/src/pricing.ts similarity index 100% rename from src/utils/pricing.ts rename to packages/utils/src/pricing.ts diff --git a/src/utils/promptTemplate.test.ts b/packages/utils/src/promptTemplate.test.ts similarity index 100% rename from src/utils/promptTemplate.test.ts rename to packages/utils/src/promptTemplate.test.ts diff --git a/src/utils/promptTemplate.ts b/packages/utils/src/promptTemplate.ts similarity index 100% rename from src/utils/promptTemplate.ts rename to packages/utils/src/promptTemplate.ts diff --git a/src/utils/safeParseJSON.test.ts b/packages/utils/src/safeParseJSON.test.ts similarity index 100% rename from src/utils/safeParseJSON.test.ts rename to packages/utils/src/safeParseJSON.test.ts diff --git a/src/utils/safeParseJSON.ts b/packages/utils/src/safeParseJSON.ts similarity index 100% rename from src/utils/safeParseJSON.ts rename to packages/utils/src/safeParseJSON.ts diff --git a/src/utils/sanitizeUTF8.test.ts b/packages/utils/src/sanitizeUTF8.test.ts similarity index 94% rename from src/utils/sanitizeUTF8.test.ts rename to packages/utils/src/sanitizeUTF8.test.ts index 39e30c223e4..b492a69c8b2 100644 --- a/src/utils/sanitizeUTF8.test.ts +++ b/packages/utils/src/sanitizeUTF8.test.ts @@ -1,3 +1,5 @@ +import { describe, expect, it } from 'vitest'; + import { sanitizeUTF8 } from './sanitizeUTF8'; describe('UTF-8 Sanitization', () => { diff --git a/src/utils/sanitizeUTF8.ts b/packages/utils/src/sanitizeUTF8.ts similarity index 100% rename from src/utils/sanitizeUTF8.ts rename to packages/utils/src/sanitizeUTF8.ts diff --git a/src/utils/server/__tests__/auth.test.ts b/packages/utils/src/server/__tests__/auth.test.ts similarity index 100% rename from src/utils/server/__tests__/auth.test.ts rename to packages/utils/src/server/__tests__/auth.test.ts diff --git a/src/utils/server/__tests__/geo.test.ts b/packages/utils/src/server/__tests__/geo.test.ts similarity index 98% rename from src/utils/server/__tests__/geo.test.ts rename to packages/utils/src/server/__tests__/geo.test.ts index e00a3bbaa03..9307790adb3 100644 --- a/src/utils/server/__tests__/geo.test.ts +++ b/packages/utils/src/server/__tests__/geo.test.ts @@ -1,7 +1,7 @@ import { geolocation } from '@vercel/functions'; import { getCountry } from 'countries-and-timezones'; import { NextRequest } from 'next/server'; -import { describe, expect, it, vi } from 'vitest'; +import { afterEach, describe, expect, it, vi } from 'vitest'; import { parseDefaultThemeFromCountry } from '../geo'; diff --git a/src/utils/server/auth.ts b/packages/utils/src/server/auth.ts similarity index 100% rename from src/utils/server/auth.ts rename to packages/utils/src/server/auth.ts diff --git a/src/utils/server/correctOIDCUrl.ts b/packages/utils/src/server/correctOIDCUrl.ts similarity index 100% rename from src/utils/server/correctOIDCUrl.ts rename to packages/utils/src/server/correctOIDCUrl.ts diff --git a/src/utils/server/geo.ts b/packages/utils/src/server/geo.ts similarity index 100% rename from src/utils/server/geo.ts rename to packages/utils/src/server/geo.ts diff --git a/src/utils/server/pageProps.ts b/packages/utils/src/server/pageProps.ts similarity index 100% rename from src/utils/server/pageProps.ts rename to packages/utils/src/server/pageProps.ts diff --git a/src/utils/server/responsive.ts b/packages/utils/src/server/responsive.ts similarity index 100% rename from src/utils/server/responsive.ts rename to packages/utils/src/server/responsive.ts diff --git a/src/utils/server/routeVariants.ts b/packages/utils/src/server/routeVariants.ts similarity index 100% rename from src/utils/server/routeVariants.ts rename to packages/utils/src/server/routeVariants.ts diff --git a/src/utils/server/xor.test.ts b/packages/utils/src/server/xor.test.ts similarity index 98% rename from src/utils/server/xor.test.ts rename to packages/utils/src/server/xor.test.ts index f489156bc1c..b9490d62b60 100644 --- a/src/utils/server/xor.test.ts +++ b/packages/utils/src/server/xor.test.ts @@ -1,7 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { obfuscatePayloadWithXOR } from '@/utils/client/xor-obfuscation'; - +import { obfuscatePayloadWithXOR } from '../client/xor-obfuscation'; import { getXorPayload } from './xor'; describe('getXorPayload', () => { diff --git a/src/utils/server/xor.ts b/packages/utils/src/server/xor.ts similarity index 100% rename from src/utils/server/xor.ts rename to packages/utils/src/server/xor.ts diff --git a/src/utils/sleep.ts b/packages/utils/src/sleep.ts similarity index 100% rename from src/utils/sleep.ts rename to packages/utils/src/sleep.ts diff --git a/src/utils/storeDebug.test.ts b/packages/utils/src/storeDebug.test.ts similarity index 100% rename from src/utils/storeDebug.test.ts rename to packages/utils/src/storeDebug.test.ts diff --git a/src/utils/storeDebug.ts b/packages/utils/src/storeDebug.ts similarity index 100% rename from src/utils/storeDebug.ts rename to packages/utils/src/storeDebug.ts diff --git a/src/utils/time.test.ts b/packages/utils/src/time.test.ts similarity index 100% rename from src/utils/time.test.ts rename to packages/utils/src/time.test.ts diff --git a/src/utils/time.ts b/packages/utils/src/time.ts similarity index 100% rename from src/utils/time.ts rename to packages/utils/src/time.ts diff --git a/src/utils/tokenizer/client.ts b/packages/utils/src/tokenizer/client.ts similarity index 100% rename from src/utils/tokenizer/client.ts rename to packages/utils/src/tokenizer/client.ts diff --git a/src/utils/tokenizer/estimated.ts b/packages/utils/src/tokenizer/estimated.ts similarity index 100% rename from src/utils/tokenizer/estimated.ts rename to packages/utils/src/tokenizer/estimated.ts diff --git a/src/utils/tokenizer/index.ts b/packages/utils/src/tokenizer/index.ts similarity index 100% rename from src/utils/tokenizer/index.ts rename to packages/utils/src/tokenizer/index.ts diff --git a/src/utils/tokenizer/server.ts b/packages/utils/src/tokenizer/server.ts similarity index 100% rename from src/utils/tokenizer/server.ts rename to packages/utils/src/tokenizer/server.ts diff --git a/src/utils/tokenizer/tokenizer.worker.ts b/packages/utils/src/tokenizer/tokenizer.worker.ts similarity index 100% rename from src/utils/tokenizer/tokenizer.worker.ts rename to packages/utils/src/tokenizer/tokenizer.worker.ts diff --git a/src/utils/toolCall.ts b/packages/utils/src/toolCall.ts similarity index 100% rename from src/utils/toolCall.ts rename to packages/utils/src/toolCall.ts diff --git a/src/utils/toolManifest.ts b/packages/utils/src/toolManifest.ts similarity index 100% rename from src/utils/toolManifest.ts rename to packages/utils/src/toolManifest.ts diff --git a/src/utils/trace.ts b/packages/utils/src/trace.ts similarity index 100% rename from src/utils/trace.ts rename to packages/utils/src/trace.ts diff --git a/src/utils/units.ts b/packages/utils/src/units.ts similarity index 100% rename from src/utils/units.ts rename to packages/utils/src/units.ts diff --git a/src/utils/uploadFIle.ts b/packages/utils/src/uploadFIle.ts similarity index 100% rename from src/utils/uploadFIle.ts rename to packages/utils/src/uploadFIle.ts diff --git a/src/utils/url.test.ts b/packages/utils/src/url.test.ts similarity index 99% rename from src/utils/url.test.ts rename to packages/utils/src/url.test.ts index 0ac056155ae..4e726da10e2 100644 --- a/src/utils/url.test.ts +++ b/packages/utils/src/url.test.ts @@ -1,4 +1,4 @@ -import { vi } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { pathString } from './url'; import { inferContentTypeFromImageUrl, inferFileExtensionFromImageUrl, isLocalUrl } from './url'; diff --git a/src/utils/url.ts b/packages/utils/src/url.ts similarity index 100% rename from src/utils/url.ts rename to packages/utils/src/url.ts diff --git a/src/utils/uuid.ts b/packages/utils/src/uuid.ts similarity index 100% rename from src/utils/uuid.ts rename to packages/utils/src/uuid.ts diff --git a/packages/utils/tests/setup.ts b/packages/utils/tests/setup.ts new file mode 100644 index 00000000000..34065851b6a --- /dev/null +++ b/packages/utils/tests/setup.ts @@ -0,0 +1,10 @@ +// only inject in the dom environment +if ( + // not node runtime + typeof window !== 'undefined' && + // not edge runtime + typeof (globalThis as any).EdgeRuntime !== 'string' +) { + // test with canvas + import('vitest-canvas-mock'); +} diff --git a/packages/utils/vitest.config.ts b/packages/utils/vitest.config.ts new file mode 100644 index 00000000000..8b33852d6ec --- /dev/null +++ b/packages/utils/vitest.config.ts @@ -0,0 +1,16 @@ +import { join, resolve } from 'node:path'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + alias: { + /* eslint-disable sort-keys-fix/sort-keys-fix */ + '@/types': resolve(__dirname, '../types/src'), + '@/const': resolve(__dirname, '../const/src'), + '@': resolve(__dirname, '../../src'), + /* eslint-enable */ + }, + environment: 'happy-dom', + setupFiles: join(__dirname, './tests/setup.ts'), + }, +}); diff --git a/scripts/dbmlWorkflow/index.ts b/scripts/dbmlWorkflow/index.ts index 51485ff2de5..442249ba9f0 100644 --- a/scripts/dbmlWorkflow/index.ts +++ b/scripts/dbmlWorkflow/index.ts @@ -1,7 +1,7 @@ import { pgGenerate } from 'drizzle-dbml-generator'; import { join } from 'node:path'; -import * as schema from '../../src/database/schemas'; +import * as schema from '../../packages/database/src/schemas'; const out = join(__dirname, '../../docs/development/database-schema.dbml'); const relational = true; diff --git a/scripts/migrateClientDB/compile-migrations.ts b/scripts/migrateClientDB/compile-migrations.ts index c33e9dff5fb..1c0b057825b 100644 --- a/scripts/migrateClientDB/compile-migrations.ts +++ b/scripts/migrateClientDB/compile-migrations.ts @@ -2,12 +2,12 @@ import { readMigrationFiles } from 'drizzle-orm/migrator'; import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; -const dbBase = join(__dirname, '../../src/database'); +const dbBase = join(__dirname, '../../packages/database'); const migrationsFolder = join(dbBase, './migrations'); const migrations = readMigrationFiles({ migrationsFolder: migrationsFolder }); writeFileSync( - join(dbBase, './client/migrations.json'), + join(dbBase, './src/core/migrations.json'), JSON.stringify(migrations, null, 2), // null, 2 adds indentation for better readability ); diff --git a/scripts/migrateServerDB/index.ts b/scripts/migrateServerDB/index.ts index 8412ddf45bc..94b6a06c2fb 100644 --- a/scripts/migrateServerDB/index.ts +++ b/scripts/migrateServerDB/index.ts @@ -10,12 +10,12 @@ import { DB_FAIL_INIT_HINT, PGVECTOR_HINT } from './errorHint'; // dotenv_config_path parameter that's passed to Node.js dotenv.config(); -const migrationsFolder = join(__dirname, '../../src/database/migrations'); +const migrationsFolder = join(__dirname, '../../packages/database/migrations'); const isDesktop = process.env.NEXT_PUBLIC_IS_DESKTOP_APP === '1'; const runMigrations = async () => { - const { serverDB } = await import('../../src/database/server'); + const { serverDB } = await import('../../packages/database/src/server'); if (process.env.DATABASE_DRIVER === 'node') { await nodeMigrate(serverDB, { migrationsFolder }); diff --git a/src/app/[variants]/(main)/repos/[id]/evals/dataset/CreateDataset/CreateForm.tsx b/src/app/[variants]/(main)/repos/[id]/evals/dataset/CreateDataset/CreateForm.tsx index 0684f75b1fa..6d6242f9113 100644 --- a/src/app/[variants]/(main)/repos/[id]/evals/dataset/CreateDataset/CreateForm.tsx +++ b/src/app/[variants]/(main)/repos/[id]/evals/dataset/CreateDataset/CreateForm.tsx @@ -1,9 +1,9 @@ +import { CreateNewEvalDatasets } from '@lobechat/types'; import { Button, Form, Input } from '@lobehub/ui'; import { memo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useKnowledgeBaseStore } from '@/store/knowledgeBase'; -import { CreateNewEvalDatasets } from '@/types/eval'; interface CreateFormProps { knowledgeBaseId: string; diff --git a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetDetail/index.tsx b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetDetail/index.tsx index 1c7c86a1c51..1be40893dae 100644 --- a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetDetail/index.tsx +++ b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetDetail/index.tsx @@ -1,6 +1,7 @@ 'use client'; import { ProColumns, ProTable } from '@ant-design/pro-components'; +import { EvalDatasetRecordRefFile } from '@lobechat/types'; import { ActionIcon, Button, Text } from '@lobehub/ui'; import { Upload } from 'antd'; import { createStyles } from 'antd-style'; @@ -12,7 +13,6 @@ import { Center, Flexbox } from 'react-layout-kit'; import FileIcon from '@/components/FileIcon'; import { ragEvalService } from '@/services/ragEval'; import { useKnowledgeBaseStore } from '@/store/knowledgeBase'; -import { EvalDatasetRecordRefFile } from '@/types/eval'; const createRequest = (activeDatasetId: number) => async () => { const records = await ragEvalService.getDatasetRecords(activeDatasetId); diff --git a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/Item.tsx b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/Item.tsx index 6de265c0099..dfe00a26a35 100644 --- a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/Item.tsx +++ b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/Item.tsx @@ -1,10 +1,9 @@ +import { RAGEvalDataSetItem } from '@lobechat/types'; import { createStyles } from 'antd-style'; import { parseAsInteger, useQueryState } from 'nuqs'; import { memo } from 'react'; import { Flexbox } from 'react-layout-kit'; -import { RAGEvalDataSetItem } from '@/types/eval'; - const useStyles = createStyles(({ css, token }) => ({ active: css` background: ${token.colorFillTertiary}; diff --git a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/index.tsx b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/index.tsx index b2888a55e27..83d056a06b5 100644 --- a/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/index.tsx +++ b/src/app/[variants]/(main)/repos/[id]/evals/dataset/DatasetList/index.tsx @@ -1,5 +1,6 @@ 'use client'; +import { RAGEvalDataSetItem } from '@lobechat/types'; import { ActionIcon } from '@lobehub/ui'; import { PlusIcon } from 'lucide-react'; import { memo } from 'react'; @@ -7,8 +8,6 @@ import { useTranslation } from 'react-i18next'; import { Flexbox } from 'react-layout-kit'; import { Virtuoso } from 'react-virtuoso'; -import { RAGEvalDataSetItem } from '@/types/eval'; - import Item from './Item'; interface DatasetListProps { diff --git a/src/app/[variants]/(main)/repos/[id]/evals/evaluation/CreateEvaluation/CreateForm.tsx b/src/app/[variants]/(main)/repos/[id]/evals/evaluation/CreateEvaluation/CreateForm.tsx index f41b0a9fe9f..460d53ef40a 100644 --- a/src/app/[variants]/(main)/repos/[id]/evals/evaluation/CreateEvaluation/CreateForm.tsx +++ b/src/app/[variants]/(main)/repos/[id]/evals/evaluation/CreateEvaluation/CreateForm.tsx @@ -1,9 +1,9 @@ +import { CreateNewEvalEvaluation } from '@lobechat/types'; import { Button, Form, Input, Select, TextArea } from '@lobehub/ui'; import { memo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useKnowledgeBaseStore } from '@/store/knowledgeBase'; -import { CreateNewEvalEvaluation } from '@/types/eval'; interface CreateFormProps { knowledgeBaseId: string; diff --git a/src/app/[variants]/(main)/repos/[id]/evals/evaluation/EvaluationList/index.tsx b/src/app/[variants]/(main)/repos/[id]/evals/evaluation/EvaluationList/index.tsx index 01648db8a43..fdaa53813e6 100644 --- a/src/app/[variants]/(main)/repos/[id]/evals/evaluation/EvaluationList/index.tsx +++ b/src/app/[variants]/(main)/repos/[id]/evals/evaluation/EvaluationList/index.tsx @@ -1,6 +1,7 @@ 'use client'; import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components'; +import { EvalEvaluationStatus, RAGEvalEvaluationItem } from '@lobechat/types'; import { ActionIcon, Button, ButtonProps, Icon } from '@lobehub/ui'; import { App } from 'antd'; import { createStyles } from 'antd-style'; @@ -12,7 +13,6 @@ import { Flexbox } from 'react-layout-kit'; import { ragEvalService } from '@/services/ragEval'; import { useKnowledgeBaseStore } from '@/store/knowledgeBase'; -import { EvalEvaluationStatus, RAGEvalEvaluationItem } from '@/types/eval'; import CreateEvaluationButton from '../CreateEvaluation'; diff --git a/src/config/aiModels/mistral.ts b/src/config/aiModels/mistral.ts index c899f099cc2..e84d57f1c7e 100644 --- a/src/config/aiModels/mistral.ts +++ b/src/config/aiModels/mistral.ts @@ -24,6 +24,7 @@ const mistralChatModels: AIChatModelCard[] = [ { abilities: { functionCall: true, + vision: true, }, contextWindowTokens: 128_000, description: @@ -58,6 +59,7 @@ const mistralChatModels: AIChatModelCard[] = [ { abilities: { functionCall: true, + vision: true, }, contextWindowTokens: 131_072, description: diff --git a/src/features/AgentSetting/store/index.ts b/src/features/AgentSetting/store/index.ts index fd1cfe8f3a2..7d72daa0cf4 100644 --- a/src/features/AgentSetting/store/index.ts +++ b/src/features/AgentSetting/store/index.ts @@ -1,12 +1,11 @@ 'use client'; +import { StoreApiWithSelector } from '@lobechat/types'; import { createContext } from 'zustand-utils'; import { subscribeWithSelector } from 'zustand/middleware'; import { shallow } from 'zustand/shallow'; import { createWithEqualityFn } from 'zustand/traditional'; -import { StoreApiWithSelector } from '@/utils/zustand'; - import { Store, store } from './action'; export type { State } from './initialState'; diff --git a/src/server/routers/async/ragEval.ts b/src/server/routers/async/ragEval.ts index 7a1895691ef..2a7d7c209af 100644 --- a/src/server/routers/async/ragEval.ts +++ b/src/server/routers/async/ragEval.ts @@ -1,5 +1,6 @@ import { ModelProvider } from '@lobechat/model-runtime'; import { chainAnswerWithContext } from '@lobechat/prompts'; +import { EvalEvaluationStatus } from '@lobechat/types'; import { TRPCError } from '@trpc/server'; import OpenAI from 'openai'; import { z } from 'zod'; @@ -17,7 +18,6 @@ import { asyncAuthedProcedure, asyncRouter as router } from '@/libs/trpc/async'; import { initModelRuntimeWithUserPayload } from '@/server/modules/ModelRuntime'; import { ChunkService } from '@/server/services/chunk'; import { AsyncTaskError } from '@/types/asyncTask'; -import { EvalEvaluationStatus } from '@/types/eval'; const ragEvalProcedure = asyncAuthedProcedure.use(async (opts) => { const { ctx } = opts; diff --git a/src/server/routers/lambda/ragEval.ts b/src/server/routers/lambda/ragEval.ts index 2fdde6d6900..e47d3b135a1 100644 --- a/src/server/routers/lambda/ragEval.ts +++ b/src/server/routers/lambda/ragEval.ts @@ -1,4 +1,13 @@ /* eslint-disable sort-keys-fix/sort-keys-fix */ +import { + EvalDatasetRecord, + EvalEvaluationStatus, + InsertEvalDatasetRecord, + RAGEvalDataSetItem, + insertEvalDatasetRecordSchema, + insertEvalDatasetsSchema, + insertEvalEvaluationSchema, +} from '@lobechat/types'; import { TRPCError } from '@trpc/server'; import dayjs from 'dayjs'; import JSONL from 'jsonl-parse-stringify'; @@ -17,15 +26,6 @@ import { authedProcedure, router } from '@/libs/trpc/lambda'; import { keyVaults, serverDatabase } from '@/libs/trpc/lambda/middleware'; import { createAsyncCaller } from '@/server/routers/async'; import { FileService } from '@/server/services/file'; -import { - EvalDatasetRecord, - EvalEvaluationStatus, - InsertEvalDatasetRecord, - RAGEvalDataSetItem, - insertEvalDatasetRecordSchema, - insertEvalDatasetsSchema, - insertEvalEvaluationSchema, -} from '@/types/eval'; const ragEvalProcedure = authedProcedure .use(serverDatabase) diff --git a/src/services/config.ts b/src/services/config.ts index 1a02e2dbc4b..d46c8707817 100644 --- a/src/services/config.ts +++ b/src/services/config.ts @@ -94,7 +94,7 @@ class ConfigService { data: any, mode: 'pglite' | 'postgres', ): Promise => { - const { default: json } = await import('@/database/client/migrations.json'); + const { default: json } = await import('@/database/core/migrations.json'); const latestHash = json.at(-1)?.hash; if (!latestHash) { throw new Error('Not find database sql hash'); diff --git a/src/services/ragEval.ts b/src/services/ragEval.ts index 7d35566e147..eb2b1ca0732 100644 --- a/src/services/ragEval.ts +++ b/src/services/ragEval.ts @@ -1,5 +1,3 @@ -import { lambdaClient } from '@/libs/trpc/client'; -import { uploadService } from '@/services/upload'; import { CreateNewEvalDatasets, CreateNewEvalEvaluation, @@ -7,7 +5,10 @@ import { RAGEvalDataSetItem, RAGEvalEvaluationItem, insertEvalDatasetsSchema, -} from '@/types/eval'; +} from '@lobechat/types'; + +import { lambdaClient } from '@/libs/trpc/client'; +import { uploadService } from '@/services/upload'; class RAGEvalService { // Dataset diff --git a/src/store/knowledgeBase/slices/ragEval/actions/dataset.ts b/src/store/knowledgeBase/slices/ragEval/actions/dataset.ts index 7338e631c80..c5713a3bb13 100644 --- a/src/store/knowledgeBase/slices/ragEval/actions/dataset.ts +++ b/src/store/knowledgeBase/slices/ragEval/actions/dataset.ts @@ -1,3 +1,9 @@ +import { + CreateNewEvalDatasets, + EvalDatasetRecord, + RAGEvalDataSetItem, + insertEvalDatasetRecordSchema, +} from '@lobechat/types'; import { SWRResponse, mutate } from 'swr'; import { StateCreator } from 'zustand/vanilla'; @@ -5,12 +11,6 @@ import { notification } from '@/components/AntdStaticMethods'; import { useClientDataSWR } from '@/libs/swr'; import { ragEvalService } from '@/services/ragEval'; import { KnowledgeBaseStore } from '@/store/knowledgeBase/store'; -import { - CreateNewEvalDatasets, - EvalDatasetRecord, - RAGEvalDataSetItem, - insertEvalDatasetRecordSchema, -} from '@/types/eval'; const FETCH_DATASET_LIST_KEY = 'FETCH_DATASET_LIST'; const FETCH_DATASET_RECORD_KEY = 'FETCH_DATASET_RECORD_KEY'; diff --git a/src/store/knowledgeBase/slices/ragEval/actions/evaluation.ts b/src/store/knowledgeBase/slices/ragEval/actions/evaluation.ts index f14ef577d52..8d28c97e565 100644 --- a/src/store/knowledgeBase/slices/ragEval/actions/evaluation.ts +++ b/src/store/knowledgeBase/slices/ragEval/actions/evaluation.ts @@ -1,10 +1,10 @@ +import { CreateNewEvalEvaluation, RAGEvalDataSetItem } from '@lobechat/types'; import { SWRResponse, mutate } from 'swr'; import { StateCreator } from 'zustand/vanilla'; import { useClientDataSWR } from '@/libs/swr'; import { ragEvalService } from '@/services/ragEval'; import { KnowledgeBaseStore } from '@/store/knowledgeBase/store'; -import { CreateNewEvalEvaluation, RAGEvalDataSetItem } from '@/types/eval'; const FETCH_EVALUATION_LIST_KEY = 'FETCH_EVALUATION_LIST_KEY'; diff --git a/src/store/serverConfig/store.ts b/src/store/serverConfig/store.ts index 61082b5fbf9..5a709321fe3 100644 --- a/src/store/serverConfig/store.ts +++ b/src/store/serverConfig/store.ts @@ -1,3 +1,4 @@ +import { StoreApiWithSelector } from '@lobechat/types'; import { StoreApi } from 'zustand'; import { createContext } from 'zustand-utils'; import { shallow } from 'zustand/shallow'; @@ -8,7 +9,6 @@ import { DEFAULT_FEATURE_FLAGS, IFeatureFlags } from '@/config/featureFlags'; import { createDevtools } from '@/store/middleware/createDevtools'; import { GlobalServerConfig } from '@/types/serverConfig'; import { merge } from '@/utils/merge'; -import { StoreApiWithSelector } from '@/utils/zustand'; import { ServerConfigAction, createServerConfigSlice } from './action'; diff --git a/src/utils/client/switchLang.test.ts b/src/utils/client/switchLang.test.ts index b5a20a8257a..3b2a26129b6 100644 --- a/src/utils/client/switchLang.test.ts +++ b/src/utils/client/switchLang.test.ts @@ -1,9 +1,9 @@ +import { setCookie } from '@lobechat/utils'; import { changeLanguage } from 'i18next'; import { describe, expect, it, vi } from 'vitest'; import { LOBE_LOCALE_COOKIE } from '@/const/locale'; import { LocaleMode } from '@/types/locale'; -import { setCookie } from '@/utils/client/cookie'; import { switchLang } from './switchLang'; @@ -11,7 +11,7 @@ vi.mock('i18next', () => ({ changeLanguage: vi.fn(), })); -vi.mock('./cookie', () => ({ +vi.mock('@lobechat/utils', () => ({ setCookie: vi.fn(), })); diff --git a/src/utils/client/switchLang.ts b/src/utils/client/switchLang.ts index f808c38cccf..34e7739adb3 100644 --- a/src/utils/client/switchLang.ts +++ b/src/utils/client/switchLang.ts @@ -1,10 +1,9 @@ +import { LOBE_LOCALE_COOKIE } from '@lobechat/const'; +import { setCookie } from '@lobechat/utils'; import { changeLanguage } from 'i18next'; -import { LOBE_LOCALE_COOKIE } from '@/const/locale'; import { LocaleMode } from '@/types/locale'; -import { setCookie } from './cookie'; - export const switchLang = (locale: LocaleMode) => { const lang = locale === 'auto' ? navigator.language : locale; diff --git a/tests/setup.ts b/tests/setup.ts index 59f04de0e92..890dfd72aba 100644 --- a/tests/setup.ts +++ b/tests/setup.ts @@ -17,17 +17,6 @@ vi.mock('@lobehub/analytics/react', () => ({ }), })); -// only inject in the dom environment -if ( - // not node runtime - typeof window !== 'undefined' && - // not edge runtime - typeof (globalThis as any).EdgeRuntime !== 'string' -) { - // test with canvas - await import('vitest-canvas-mock'); -} - // node runtime if (typeof window === 'undefined') { // test with polyfill crypto diff --git a/tsconfig.json b/tsconfig.json index 211925d02e2..34103106393 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,7 +20,9 @@ "paths": { "@/libs/model-runtime": ["./packages/model-runtime/src/index.ts"], "@/libs/model-runtime/*": ["./packages/model-runtime/src/*"], + "@/database/*": ["./packages/database/src/*", "./src/database/*"], "@/const/*": ["./packages/const/src/*"], + "@/utils/*": ["./packages/utils/src/*", "./src/utils/*"], "@/types/*": ["./packages/types/src/*", "./src/types/*"], "@/*": ["./src/*"], "~test-utils": ["./tests/utils.tsx"] diff --git a/vitest.config.ts b/vitest.config.ts index a8d8c53659d..e66fc00a9a3 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -10,6 +10,12 @@ export default defineConfig({ alias: { /* eslint-disable sort-keys-fix/sort-keys-fix */ '@/libs/model-runtime': resolve(__dirname, './packages/model-runtime/src'), + '@/database/_deprecated': resolve(__dirname, './src/database/_deprecated'), + '@/database': resolve(__dirname, './packages/database/src'), + '@/utils/client/switchLang': resolve(__dirname, './src/utils/client/switchLang'), + // TODO: after refactor the errorResponse, we can remove it + '@/utils/errorResponse': resolve(__dirname, './src/utils/errorResponse'), + '@/utils': resolve(__dirname, './packages/utils/src'), '@/types': resolve(__dirname, './packages/types/src'), '@/const': resolve(__dirname, './packages/const/src'), '@': resolve(__dirname, './src'), @@ -40,8 +46,6 @@ export default defineConfig({ '**/build/**', '**/apps/desktop/**', '**/packages/**', - 'src/database/server/**/**', - 'src/database/repositories/dataImporter/deprecated/**/**', ], globals: true, server: {