From 062c8a5b2237b1074e6240b56b3b065035462eef Mon Sep 17 00:00:00 2001 From: npc0-hue Date: Mon, 26 Jan 2026 07:33:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8D=87=E7=BA=A7=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E5=A4=8D=E7=9B=B8=E5=85=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 升级web依赖到最新版本 - 修复1.11.4版本兼容性问题 - 解决google字体dockerfile访问问题 - 恢复丢失的相关文件 - 添加多语言支持 - 调整docker版本及worker镜像配置 --- api/docker/entrypoint.sh | 13 +- .../2025_01_15_1200-add_app_extend.py | 45 --- ...5_01_15_1300-add_message_context_extend.py | 48 --- ..._account_money_extend_unique_constraint.py | 62 ++++ docker/docker-compose.dify-plus.yaml | 317 ++++++++++++++---- .../explore/app-list-center-extend/index.tsx | 23 +- web/app/components/explore/app-list/index.tsx | 15 +- web/app/components/explore/sidebar/index.tsx | 2 +- .../components/header/explore-nav/index.tsx | 2 +- .../share/text-generation/index.tsx | 1 + web/app/fonts/InstrumentSerif-Italic.ttf | Bin 0 -> 71592 bytes web/app/fonts/InstrumentSerif-Regular.ttf | Bin 0 -> 70012 bytes web/app/fonts/OFT.txt | 93 +++++ web/app/layout.tsx | 23 +- web/i18n/de-DE/extend.json | 12 +- web/i18n/en-US/extend.json | 10 +- web/i18n/es-ES/extend.json | 12 +- web/i18n/fa-IR/extend.json | 12 +- web/i18n/fr-FR/extend.json | 12 +- web/i18n/hi-IN/extend.json | 12 +- web/i18n/id-ID/extend.json | 12 +- web/i18n/it-IT/extend.json | 12 +- web/i18n/ja-JP/extend.json | 12 +- web/i18n/ko-KR/extend.json | 12 +- web/i18n/pl-PL/extend.json | 12 +- web/i18n/pt-BR/extend.json | 12 +- web/i18n/ro-RO/extend.json | 12 +- web/i18n/ru-RU/extend.json | 12 +- web/i18n/sl-SI/extend.json | 12 +- web/i18n/th-TH/extend.json | 12 +- web/i18n/tr-TR/extend.json | 12 +- web/i18n/vi-VN/extend.json | 12 +- web/i18n/zh-Hans/extend.json | 4 +- web/i18n/zh-Hant/extend.json | 12 +- web/package.json | 4 + web/pnpm-lock.yaml | 99 +++++- web/service/use-explore.ts | 10 +- web/tsconfig.json | 2 +- 38 files changed, 747 insertions(+), 242 deletions(-) delete mode 100644 api/migrations_extend/versions/2025_01_15_1200-add_app_extend.py delete mode 100644 api/migrations_extend/versions/2025_01_15_1300-add_message_context_extend.py create mode 100644 api/migrations_extend/versions/2025_10_21_1800-add_account_money_extend_unique_constraint.py create mode 100644 web/app/fonts/InstrumentSerif-Italic.ttf create mode 100644 web/app/fonts/InstrumentSerif-Regular.ttf create mode 100644 web/app/fonts/OFT.txt diff --git a/api/docker/entrypoint.sh b/api/docker/entrypoint.sh index bffd17275..7031c3d10 100755 --- a/api/docker/entrypoint.sh +++ b/api/docker/entrypoint.sh @@ -36,10 +36,10 @@ if [[ "${MODE}" == "worker" ]]; then if [[ -z "${CELERY_QUEUES}" ]]; then if [[ "${EDITION}" == "CLOUD" ]]; then # Cloud edition: separate queues for dataset and trigger tasks - DEFAULT_QUEUES="priority_dataset,priority_pipeline,pipeline,mail,ops_trace,app_deletion,plugin,workflow_storage,conversation,workflow_professional,workflow_team,workflow_sandbox,schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor,retention" + DEFAULT_QUEUES="priority_pipeline,pipeline,mail,ops_trace,app_deletion,plugin,workflow_storage,conversation,workflow_professional,workflow_team,workflow_sandbox,schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor,retention" else # Community edition (SELF_HOSTED): dataset, pipeline and workflow have separate queues - DEFAULT_QUEUES="priority_dataset,priority_pipeline,pipeline,mail,ops_trace,app_deletion,plugin,workflow_storage,conversation,workflow,schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor,retention" + DEFAULT_QUEUES="priority_pipeline,pipeline,mail,ops_trace,app_deletion,plugin,workflow_storage,conversation,workflow,schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor,retention" fi else DEFAULT_QUEUES="${CELERY_QUEUES}" @@ -64,20 +64,11 @@ if [[ "${MODE}" == "worker" ]]; then WORKER_POOL="${CELERY_WORKER_POOL:-${CELERY_WORKER_CLASS:-gevent}}" echo "Starting Celery worker with queues: ${DEFAULT_QUEUES}" - ## 二开部分,额度计算移动到新的队列中 exec celery -A celery_entrypoint.celery worker -P ${WORKER_POOL} $CONCURRENCY_OPTION \ --max-tasks-per-child ${MAX_TASKS_PER_CHILD:-50} --loglevel ${LOG_LEVEL:-INFO} \ -Q ${DEFAULT_QUEUES} \ --prefetch-multiplier=${CELERY_PREFETCH_MULTIPLIER:-1} - ## 二开部分,额度计算移动到新的队列中 -## 二开部分,额度计算 -elif [[ "${MODE}" == "worker-gaia" ]]; then - exec celery -A app.celery worker -P gevent -c 1 -Q extend_high,extend_low --loglevel INFO -## 二开部分,单一运行的知识库,多容器执行会导致卡住问题 -elif [[ "${MODE}" == "worker-dataset" ]]; then - exec celery -A app.celery worker -P gevent -c 1 -Q dataset --prefetch-multiplier=1 --loglevel INFO -## 二开部分,end elif [[ "${MODE}" == "beat" ]]; then exec celery -A app.celery beat --loglevel ${LOG_LEVEL:-INFO} diff --git a/api/migrations_extend/versions/2025_01_15_1200-add_app_extend.py b/api/migrations_extend/versions/2025_01_15_1200-add_app_extend.py deleted file mode 100644 index d41a8c41c..000000000 --- a/api/migrations_extend/versions/2025_01_15_1200-add_app_extend.py +++ /dev/null @@ -1,45 +0,0 @@ -"""add_app_extend - -Revision ID: 012_app_extend -Revises: 011_system_integration_fields -Create Date: 2025-01-15 12:00:00.000000 - -""" -import sqlalchemy as sa -from alembic import op -from sqlalchemy.engine.reflection import Inspector - -from models import types - -# revision identifiers, used by Alembic. -revision = '012_app_extend' -down_revision = '011_system_integration_fields' -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - conn = op.get_bind() - inspector = Inspector.from_engine(conn) - tables = inspector.get_table_names() - - if 'app_extend' not in tables: - op.create_table('app_extend', - sa.Column('id', types.StringUUID(), server_default=sa.text('uuid_generate_v4()'), nullable=False), - sa.Column('app_id', types.StringUUID(), nullable=False), - sa.Column('retention_number', sa.Integer(), nullable=True), - sa.PrimaryKeyConstraint('id', name='app_extend_joins_pkey') - ) - with op.batch_alter_table('app_extend', schema=None) as batch_op: - batch_op.create_index('app_extend_id_app_id_idx', ['app_id'], unique=False) - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('app_extend', schema=None) as batch_op: - batch_op.drop_index('app_extend_id_app_id_idx') - - op.drop_table('app_extend') - # ### end Alembic commands ### \ No newline at end of file diff --git a/api/migrations_extend/versions/2025_01_15_1300-add_message_context_extend.py b/api/migrations_extend/versions/2025_01_15_1300-add_message_context_extend.py deleted file mode 100644 index d2e535c09..000000000 --- a/api/migrations_extend/versions/2025_01_15_1300-add_message_context_extend.py +++ /dev/null @@ -1,48 +0,0 @@ -"""add_message_context_extend - -Revision ID: 013_message_context_extend -Revises: 012_app_extend -Create Date: 2025-01-15 13:00:00.000000 - -""" -import sqlalchemy as sa -from alembic import op -from sqlalchemy.engine.reflection import Inspector - -from models import types - -# revision identifiers, used by Alembic. -revision = '013_message_context_extend' -down_revision = '012_app_extend' -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - conn = op.get_bind() - inspector = Inspector.from_engine(conn) - tables = inspector.get_table_names() - - if 'message_context_extend' not in tables: - op.create_table('message_context_extend', - sa.Column('id', types.StringUUID(), server_default=sa.text('uuid_generate_v4()'), nullable=False), - sa.Column('created_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP(0)'), nullable=False), - sa.Column('conversation_id', sa.String(length=36), nullable=True), - sa.Column('message_id', sa.String(length=36), nullable=False), - sa.PrimaryKeyConstraint('id', name='message_context_extend_joins_pkey') - ) - with op.batch_alter_table('message_context_extend', schema=None) as batch_op: - batch_op.create_index('message_context_conversation_id_idx', ['conversation_id'], unique=False) - batch_op.create_index('message_context_created_at_idx', ['created_at'], unique=False) - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('message_context_extend', schema=None) as batch_op: - batch_op.drop_index('message_context_created_at_idx') - batch_op.drop_index('message_context_conversation_id_idx') - - op.drop_table('message_context_extend') - # ### end Alembic commands ### \ No newline at end of file diff --git a/api/migrations_extend/versions/2025_10_21_1800-add_account_money_extend_unique_constraint.py b/api/migrations_extend/versions/2025_10_21_1800-add_account_money_extend_unique_constraint.py new file mode 100644 index 000000000..8078f1cf0 --- /dev/null +++ b/api/migrations_extend/versions/2025_10_21_1800-add_account_money_extend_unique_constraint.py @@ -0,0 +1,62 @@ +"""add_account_money_extend_unique_constraint + +Revision ID: 012_account_money_extend_unique +Revises: 011_system_integration_fields +Create Date: 2025-10-21 18:00:00.000000 + +""" +import sqlalchemy as sa +from alembic import op +from sqlalchemy.engine.reflection import Inspector + +# revision identifiers, used by Alembic. +revision = '012_account_money_extend_unique' +down_revision = '011_system_integration_fields' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + conn = op.get_bind() + inspector = Inspector.from_engine(conn) + tables = inspector.get_table_names() + + if 'account_money_extend' in tables: + # 首先删除重复数据,只保留每个account_id中updated_at最大的记录 + conn.execute(sa.text(""" + DELETE FROM account_money_extend + WHERE id NOT IN ( + SELECT DISTINCT ON (account_id) id + FROM account_money_extend + ORDER BY account_id, updated_at DESC + ) + """)) + + # 删除现有的普通索引 + with op.batch_alter_table('account_money_extend', schema=None) as batch_op: + try: + batch_op.drop_index('idx_account_money_account_id') + except Exception: + # 如果索引不存在,忽略错误 + pass + + # 创建唯一约束 + with op.batch_alter_table('account_money_extend', schema=None) as batch_op: + batch_op.create_unique_constraint('idx_account_money_account_id_unique', ['account_id']) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + if 'account_money_extend' in tables: + with op.batch_alter_table('account_money_extend', schema=None) as batch_op: + try: + batch_op.drop_constraint('idx_account_money_account_id_unique', type_='unique') + except Exception: + # 如果约束不存在,忽略错误 + pass + + # 重新创建普通索引 + batch_op.create_index('idx_account_money_account_id', ['account_id'], unique=False) + # ### end Alembic commands ### diff --git a/docker/docker-compose.dify-plus.yaml b/docker/docker-compose.dify-plus.yaml index 625fa36ba..091a5f441 100644 --- a/docker/docker-compose.dify-plus.yaml +++ b/docker/docker-compose.dify-plus.yaml @@ -8,14 +8,16 @@ x-shared-env: &shared-api-worker-env CONSOLE_API_URL: ${CONSOLE_API_URL:-} CONSOLE_WEB_URL: ${CONSOLE_WEB_URL:-} SERVICE_API_URL: ${SERVICE_API_URL:-} + TRIGGER_URL: ${TRIGGER_URL:-http://localhost} APP_API_URL: ${APP_API_URL:-} APP_WEB_URL: ${APP_WEB_URL:-} FILES_URL: ${FILES_URL:-} INTERNAL_FILES_URL: ${INTERNAL_FILES_URL:-} - LANG: ${LANG:-en_US.UTF-8} - LC_ALL: ${LC_ALL:-en_US.UTF-8} + LANG: ${LANG:-C.UTF-8} + LC_ALL: ${LC_ALL:-C.UTF-8} PYTHONIOENCODING: ${PYTHONIOENCODING:-utf-8} LOG_LEVEL: ${LOG_LEVEL:-INFO} + LOG_OUTPUT_FORMAT: ${LOG_OUTPUT_FORMAT:-text} LOG_FILE: ${LOG_FILE:-/app/logs/server.log} LOG_FILE_MAX_SIZE: ${LOG_FILE_MAX_SIZE:-20} LOG_FILE_BACKUP_COUNT: ${LOG_FILE_BACKUP_COUNT:-5} @@ -33,6 +35,7 @@ x-shared-env: &shared-api-worker-env FILES_ACCESS_TIMEOUT: ${FILES_ACCESS_TIMEOUT:-300} ACCESS_TOKEN_EXPIRE_MINUTES: ${ACCESS_TOKEN_EXPIRE_MINUTES:-60} REFRESH_TOKEN_EXPIRE_DAYS: ${REFRESH_TOKEN_EXPIRE_DAYS:-30} + APP_DEFAULT_ACTIVE_REQUESTS: ${APP_DEFAULT_ACTIVE_REQUESTS:-0} APP_MAX_ACTIVE_REQUESTS: ${APP_MAX_ACTIVE_REQUESTS:-0} APP_MAX_EXECUTION_TIME: ${APP_MAX_EXECUTION_TIME:-1200} DIFY_BIND_ADDRESS: ${DIFY_BIND_ADDRESS:-0.0.0.0} @@ -53,7 +56,7 @@ x-shared-env: &shared-api-worker-env ENABLE_WEBSITE_WATERCRAWL: ${ENABLE_WEBSITE_WATERCRAWL:-true} DB_USERNAME: ${DB_USERNAME:-postgres} DB_PASSWORD: ${DB_PASSWORD:-difyai123456} - DB_HOST: ${DB_HOST:-db} + DB_HOST: ${DB_HOST:-db_postgres} DB_PORT: ${DB_PORT:-5432} DB_DATABASE: ${DB_DATABASE:-dify} SQLALCHEMY_POOL_SIZE: ${SQLALCHEMY_POOL_SIZE:-30} @@ -62,11 +65,18 @@ x-shared-env: &shared-api-worker-env SQLALCHEMY_ECHO: ${SQLALCHEMY_ECHO:-false} SQLALCHEMY_POOL_PRE_PING: ${SQLALCHEMY_POOL_PRE_PING:-false} SQLALCHEMY_POOL_USE_LIFO: ${SQLALCHEMY_POOL_USE_LIFO:-false} + SQLALCHEMY_POOL_TIMEOUT: ${SQLALCHEMY_POOL_TIMEOUT:-30} POSTGRES_MAX_CONNECTIONS: ${POSTGRES_MAX_CONNECTIONS:-100} POSTGRES_SHARED_BUFFERS: ${POSTGRES_SHARED_BUFFERS:-128MB} POSTGRES_WORK_MEM: ${POSTGRES_WORK_MEM:-4MB} POSTGRES_MAINTENANCE_WORK_MEM: ${POSTGRES_MAINTENANCE_WORK_MEM:-64MB} POSTGRES_EFFECTIVE_CACHE_SIZE: ${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB} + POSTGRES_STATEMENT_TIMEOUT: ${POSTGRES_STATEMENT_TIMEOUT:-0} + POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT: ${POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT:-0} + MYSQL_MAX_CONNECTIONS: ${MYSQL_MAX_CONNECTIONS:-1000} + MYSQL_INNODB_BUFFER_POOL_SIZE: ${MYSQL_INNODB_BUFFER_POOL_SIZE:-512M} + MYSQL_INNODB_LOG_FILE_SIZE: ${MYSQL_INNODB_LOG_FILE_SIZE:-128M} + MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT: ${MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT:-2} REDIS_HOST: ${REDIS_HOST:-redis} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_USERNAME: ${REDIS_USERNAME:-} @@ -95,6 +105,9 @@ x-shared-env: &shared-api-worker-env CELERY_SENTINEL_SOCKET_TIMEOUT: ${CELERY_SENTINEL_SOCKET_TIMEOUT:-0.1} WEB_API_CORS_ALLOW_ORIGINS: ${WEB_API_CORS_ALLOW_ORIGINS:-*} CONSOLE_CORS_ALLOW_ORIGINS: ${CONSOLE_CORS_ALLOW_ORIGINS:-*} + COOKIE_DOMAIN: ${COOKIE_DOMAIN:-} + NEXT_PUBLIC_COOKIE_DOMAIN: ${NEXT_PUBLIC_COOKIE_DOMAIN:-} + NEXT_PUBLIC_BATCH_CONCURRENCY: ${NEXT_PUBLIC_BATCH_CONCURRENCY:-5} STORAGE_TYPE: ${STORAGE_TYPE:-opendal} OPENDAL_SCHEME: ${OPENDAL_SCHEME:-fs} OPENDAL_FS_ROOT: ${OPENDAL_FS_ROOT:-storage} @@ -108,6 +121,13 @@ x-shared-env: &shared-api-worker-env S3_ACCESS_KEY: ${S3_ACCESS_KEY:-} S3_SECRET_KEY: ${S3_SECRET_KEY:-} S3_USE_AWS_MANAGED_IAM: ${S3_USE_AWS_MANAGED_IAM:-false} + ARCHIVE_STORAGE_ENABLED: ${ARCHIVE_STORAGE_ENABLED:-false} + ARCHIVE_STORAGE_ENDPOINT: ${ARCHIVE_STORAGE_ENDPOINT:-} + ARCHIVE_STORAGE_ARCHIVE_BUCKET: ${ARCHIVE_STORAGE_ARCHIVE_BUCKET:-} + ARCHIVE_STORAGE_EXPORT_BUCKET: ${ARCHIVE_STORAGE_EXPORT_BUCKET:-} + ARCHIVE_STORAGE_ACCESS_KEY: ${ARCHIVE_STORAGE_ACCESS_KEY:-} + ARCHIVE_STORAGE_SECRET_KEY: ${ARCHIVE_STORAGE_SECRET_KEY:-} + ARCHIVE_STORAGE_REGION: ${ARCHIVE_STORAGE_REGION:-auto} AZURE_BLOB_ACCOUNT_NAME: ${AZURE_BLOB_ACCOUNT_NAME:-difyai} AZURE_BLOB_ACCOUNT_KEY: ${AZURE_BLOB_ACCOUNT_KEY:-difyai} AZURE_BLOB_CONTAINER_NAME: ${AZURE_BLOB_CONTAINER_NAME:-difyai-container} @@ -121,11 +141,13 @@ x-shared-env: &shared-api-worker-env ALIYUN_OSS_REGION: ${ALIYUN_OSS_REGION:-ap-southeast-1} ALIYUN_OSS_AUTH_VERSION: ${ALIYUN_OSS_AUTH_VERSION:-v4} ALIYUN_OSS_PATH: ${ALIYUN_OSS_PATH:-your-path} + ALIYUN_CLOUDBOX_ID: ${ALIYUN_CLOUDBOX_ID:-your-cloudbox-id} TENCENT_COS_BUCKET_NAME: ${TENCENT_COS_BUCKET_NAME:-your-bucket-name} TENCENT_COS_SECRET_KEY: ${TENCENT_COS_SECRET_KEY:-your-secret-key} TENCENT_COS_SECRET_ID: ${TENCENT_COS_SECRET_ID:-your-secret-id} TENCENT_COS_REGION: ${TENCENT_COS_REGION:-your-region} TENCENT_COS_SCHEME: ${TENCENT_COS_SCHEME:-your-scheme} + TENCENT_COS_CUSTOM_DOMAIN: ${TENCENT_COS_CUSTOM_DOMAIN:-your-custom-domain} OCI_ENDPOINT: ${OCI_ENDPOINT:-https://your-object-storage-namespace.compat.objectstorage.us-ashburn-1.oraclecloud.com} OCI_BUCKET_NAME: ${OCI_BUCKET_NAME:-your-bucket-name} OCI_ACCESS_KEY: ${OCI_ACCESS_KEY:-your-access-key} @@ -135,6 +157,7 @@ x-shared-env: &shared-api-worker-env HUAWEI_OBS_SECRET_KEY: ${HUAWEI_OBS_SECRET_KEY:-your-secret-key} HUAWEI_OBS_ACCESS_KEY: ${HUAWEI_OBS_ACCESS_KEY:-your-access-key} HUAWEI_OBS_SERVER: ${HUAWEI_OBS_SERVER:-your-server-url} + HUAWEI_OBS_PATH_STYLE: ${HUAWEI_OBS_PATH_STYLE:-false} VOLCENGINE_TOS_BUCKET_NAME: ${VOLCENGINE_TOS_BUCKET_NAME:-your-bucket-name} VOLCENGINE_TOS_SECRET_KEY: ${VOLCENGINE_TOS_SECRET_KEY:-your-secret-key} VOLCENGINE_TOS_ACCESS_KEY: ${VOLCENGINE_TOS_ACCESS_KEY:-your-access-key} @@ -151,6 +174,18 @@ x-shared-env: &shared-api-worker-env VECTOR_INDEX_NAME_PREFIX: ${VECTOR_INDEX_NAME_PREFIX:-Vector_index} WEAVIATE_ENDPOINT: ${WEAVIATE_ENDPOINT:-http://weaviate:8080} WEAVIATE_API_KEY: ${WEAVIATE_API_KEY:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih} + WEAVIATE_GRPC_ENDPOINT: ${WEAVIATE_GRPC_ENDPOINT:-grpc://weaviate:50051} + WEAVIATE_TOKENIZATION: ${WEAVIATE_TOKENIZATION:-word} + OCEANBASE_VECTOR_HOST: ${OCEANBASE_VECTOR_HOST:-oceanbase} + OCEANBASE_VECTOR_PORT: ${OCEANBASE_VECTOR_PORT:-2881} + OCEANBASE_VECTOR_USER: ${OCEANBASE_VECTOR_USER:-root@test} + OCEANBASE_VECTOR_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OCEANBASE_VECTOR_DATABASE: ${OCEANBASE_VECTOR_DATABASE:-test} + OCEANBASE_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai} + OCEANBASE_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G} + OCEANBASE_ENABLE_HYBRID_SEARCH: ${OCEANBASE_ENABLE_HYBRID_SEARCH:-false} + OCEANBASE_FULLTEXT_PARSER: ${OCEANBASE_FULLTEXT_PARSER:-ik} + SEEKDB_MEMORY_LIMIT: ${SEEKDB_MEMORY_LIMIT:-2G} QDRANT_URL: ${QDRANT_URL:-http://qdrant:6333} QDRANT_API_KEY: ${QDRANT_API_KEY:-difyai123456} QDRANT_CLIENT_TIMEOUT: ${QDRANT_CLIENT_TIMEOUT:-20} @@ -243,7 +278,7 @@ x-shared-env: &shared-api-worker-env ORACLE_WALLET_LOCATION: ${ORACLE_WALLET_LOCATION:-/app/api/storage/wallet} ORACLE_WALLET_PASSWORD: ${ORACLE_WALLET_PASSWORD:-dify} ORACLE_IS_AUTONOMOUS: ${ORACLE_IS_AUTONOMOUS:-false} - RELYT_HOST: ${RELYT_HOST:-db} + RELYT_HOST: ${RELYT_HOST:-db_postgres} RELYT_PORT: ${RELYT_PORT:-5432} RELYT_USER: ${RELYT_USER:-postgres} RELYT_PASSWORD: ${RELYT_PASSWORD:-difyai123456} @@ -285,6 +320,8 @@ x-shared-env: &shared-api-worker-env BAIDU_VECTOR_DB_DATABASE: ${BAIDU_VECTOR_DB_DATABASE:-dify} BAIDU_VECTOR_DB_SHARD: ${BAIDU_VECTOR_DB_SHARD:-1} BAIDU_VECTOR_DB_REPLICAS: ${BAIDU_VECTOR_DB_REPLICAS:-3} + BAIDU_VECTOR_DB_INVERTED_INDEX_ANALYZER: ${BAIDU_VECTOR_DB_INVERTED_INDEX_ANALYZER:-DEFAULT_ANALYZER} + BAIDU_VECTOR_DB_INVERTED_INDEX_PARSER_MODE: ${BAIDU_VECTOR_DB_INVERTED_INDEX_PARSER_MODE:-COARSE_MODE} VIKINGDB_ACCESS_KEY: ${VIKINGDB_ACCESS_KEY:-your-ak} VIKINGDB_SECRET_KEY: ${VIKINGDB_SECRET_KEY:-your-sk} VIKINGDB_REGION: ${VIKINGDB_REGION:-cn-shanghai} @@ -292,9 +329,10 @@ x-shared-env: &shared-api-worker-env VIKINGDB_SCHEMA: ${VIKINGDB_SCHEMA:-http} VIKINGDB_CONNECTION_TIMEOUT: ${VIKINGDB_CONNECTION_TIMEOUT:-30} VIKINGDB_SOCKET_TIMEOUT: ${VIKINGDB_SOCKET_TIMEOUT:-30} - LINDORM_URL: ${LINDORM_URL:-http://lindorm:30070} - LINDORM_USERNAME: ${LINDORM_USERNAME:-lindorm} - LINDORM_PASSWORD: ${LINDORM_PASSWORD:-lindorm} + LINDORM_URL: ${LINDORM_URL:-http://localhost:30070} + LINDORM_USERNAME: ${LINDORM_USERNAME:-admin} + LINDORM_PASSWORD: ${LINDORM_PASSWORD:-admin} + LINDORM_USING_UGC: ${LINDORM_USING_UGC:-True} LINDORM_QUERY_TIMEOUT: ${LINDORM_QUERY_TIMEOUT:-1} OCEANBASE_VECTOR_HOST: ${OCEANBASE_VECTOR_HOST:-oceanbase} OCEANBASE_VECTOR_PORT: ${OCEANBASE_VECTOR_PORT:-2881} @@ -334,8 +372,47 @@ x-shared-env: &shared-api-worker-env CLICKZETTA_ANALYZER_TYPE: ${CLICKZETTA_ANALYZER_TYPE:-chinese} CLICKZETTA_ANALYZER_MODE: ${CLICKZETTA_ANALYZER_MODE:-smart} CLICKZETTA_VECTOR_DISTANCE_FUNCTION: ${CLICKZETTA_VECTOR_DISTANCE_FUNCTION:-cosine_distance} + IRIS_HOST: ${IRIS_HOST:-iris} + IRIS_SUPER_SERVER_PORT: ${IRIS_SUPER_SERVER_PORT:-1972} + IRIS_WEB_SERVER_PORT: ${IRIS_WEB_SERVER_PORT:-52773} + IRIS_USER: ${IRIS_USER:-_SYSTEM} + IRIS_PASSWORD: ${IRIS_PASSWORD:-Dify@1234} + IRIS_DATABASE: ${IRIS_DATABASE:-USER} + IRIS_SCHEMA: ${IRIS_SCHEMA:-dify} + IRIS_CONNECTION_URL: ${IRIS_CONNECTION_URL:-} + IRIS_MIN_CONNECTION: ${IRIS_MIN_CONNECTION:-1} + IRIS_MAX_CONNECTION: ${IRIS_MAX_CONNECTION:-3} + IRIS_TEXT_INDEX: ${IRIS_TEXT_INDEX:-true} + IRIS_TEXT_INDEX_LANGUAGE: ${IRIS_TEXT_INDEX_LANGUAGE:-en} + IRIS_TIMEZONE: ${IRIS_TIMEZONE:-UTC} + HUAWEI_CLOUD_USER: ${HUAWEI_CLOUD_USER:-admin} + HUAWEI_CLOUD_PASSWORD: ${HUAWEI_CLOUD_PASSWORD:-admin} + UPSTASH_VECTOR_URL: ${UPSTASH_VECTOR_URL:-https://xxx-vector.upstash.io} + UPSTASH_VECTOR_TOKEN: ${UPSTASH_VECTOR_TOKEN:-dify} + TABLESTORE_ENDPOINT: ${TABLESTORE_ENDPOINT:-https://instance-name.cn-hangzhou.ots.aliyuncs.com} + TABLESTORE_INSTANCE_NAME: ${TABLESTORE_INSTANCE_NAME:-instance-name} + TABLESTORE_ACCESS_KEY_ID: ${TABLESTORE_ACCESS_KEY_ID:-xxx} + TABLESTORE_ACCESS_KEY_SECRET: ${TABLESTORE_ACCESS_KEY_SECRET:-xxx} + TABLESTORE_NORMALIZE_FULLTEXT_BM25_SCORE: ${TABLESTORE_NORMALIZE_FULLTEXT_BM25_SCORE:-false} + CLICKZETTA_USERNAME: ${CLICKZETTA_USERNAME:-} + CLICKZETTA_PASSWORD: ${CLICKZETTA_PASSWORD:-} + CLICKZETTA_INSTANCE: ${CLICKZETTA_INSTANCE:-} + CLICKZETTA_SERVICE: ${CLICKZETTA_SERVICE:-api.clickzetta.com} + CLICKZETTA_WORKSPACE: ${CLICKZETTA_WORKSPACE:-quick_start} + CLICKZETTA_VCLUSTER: ${CLICKZETTA_VCLUSTER:-default_ap} + CLICKZETTA_SCHEMA: ${CLICKZETTA_SCHEMA:-dify} + CLICKZETTA_BATCH_SIZE: ${CLICKZETTA_BATCH_SIZE:-100} + CLICKZETTA_ENABLE_INVERTED_INDEX: ${CLICKZETTA_ENABLE_INVERTED_INDEX:-true} + CLICKZETTA_ANALYZER_TYPE: ${CLICKZETTA_ANALYZER_TYPE:-chinese} + CLICKZETTA_ANALYZER_MODE: ${CLICKZETTA_ANALYZER_MODE:-smart} + CLICKZETTA_VECTOR_DISTANCE_FUNCTION: ${CLICKZETTA_VECTOR_DISTANCE_FUNCTION:-cosine_distance} UPLOAD_FILE_SIZE_LIMIT: ${UPLOAD_FILE_SIZE_LIMIT:-15} UPLOAD_FILE_BATCH_LIMIT: ${UPLOAD_FILE_BATCH_LIMIT:-5} + UPLOAD_FILE_EXTENSION_BLACKLIST: ${UPLOAD_FILE_EXTENSION_BLACKLIST:-} + SINGLE_CHUNK_ATTACHMENT_LIMIT: ${SINGLE_CHUNK_ATTACHMENT_LIMIT:-10} + IMAGE_FILE_BATCH_LIMIT: ${IMAGE_FILE_BATCH_LIMIT:-10} + ATTACHMENT_IMAGE_FILE_SIZE_LIMIT: ${ATTACHMENT_IMAGE_FILE_SIZE_LIMIT:-2} + ATTACHMENT_IMAGE_DOWNLOAD_TIMEOUT: ${ATTACHMENT_IMAGE_DOWNLOAD_TIMEOUT:-60} ETL_TYPE: ${ETL_TYPE:-dify} UNSTRUCTURED_API_URL: ${UNSTRUCTURED_API_URL:-} UNSTRUCTURED_API_KEY: ${UNSTRUCTURED_API_KEY:-} @@ -368,31 +445,41 @@ x-shared-env: &shared-api-worker-env SMTP_PASSWORD: ${SMTP_PASSWORD:-} SMTP_USE_TLS: ${SMTP_USE_TLS:-true} SMTP_OPPORTUNISTIC_TLS: ${SMTP_OPPORTUNISTIC_TLS:-false} + SMTP_LOCAL_HOSTNAME: ${SMTP_LOCAL_HOSTNAME:-} SENDGRID_API_KEY: ${SENDGRID_API_KEY:-} INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: ${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH:-4000} INVITE_EXPIRY_HOURS: ${INVITE_EXPIRY_HOURS:-72} RESET_PASSWORD_TOKEN_EXPIRY_MINUTES: ${RESET_PASSWORD_TOKEN_EXPIRY_MINUTES:-5} + EMAIL_REGISTER_TOKEN_EXPIRY_MINUTES: ${EMAIL_REGISTER_TOKEN_EXPIRY_MINUTES:-5} CHANGE_EMAIL_TOKEN_EXPIRY_MINUTES: ${CHANGE_EMAIL_TOKEN_EXPIRY_MINUTES:-5} OWNER_TRANSFER_TOKEN_EXPIRY_MINUTES: ${OWNER_TRANSFER_TOKEN_EXPIRY_MINUTES:-5} CODE_EXECUTION_ENDPOINT: ${CODE_EXECUTION_ENDPOINT:-http://sandbox:8194} CODE_EXECUTION_API_KEY: ${CODE_EXECUTION_API_KEY:-dify-sandbox} + CODE_EXECUTION_SSL_VERIFY: ${CODE_EXECUTION_SSL_VERIFY:-True} + CODE_EXECUTION_POOL_MAX_CONNECTIONS: ${CODE_EXECUTION_POOL_MAX_CONNECTIONS:-100} + CODE_EXECUTION_POOL_MAX_KEEPALIVE_CONNECTIONS: ${CODE_EXECUTION_POOL_MAX_KEEPALIVE_CONNECTIONS:-20} + CODE_EXECUTION_POOL_KEEPALIVE_EXPIRY: ${CODE_EXECUTION_POOL_KEEPALIVE_EXPIRY:-5.0} + CODE_EXECUTION_API_KEY: ${CODE_EXECUTION_API_KEY:-dify-sandbox} CODE_MAX_NUMBER: ${CODE_MAX_NUMBER:-9223372036854775807} CODE_MIN_NUMBER: ${CODE_MIN_NUMBER:--9223372036854775808} CODE_MAX_DEPTH: ${CODE_MAX_DEPTH:-5} CODE_MAX_PRECISION: ${CODE_MAX_PRECISION:-20} - CODE_MAX_STRING_LENGTH: ${CODE_MAX_STRING_LENGTH:-80000} + CODE_MAX_STRING_LENGTH: ${CODE_MAX_STRING_LENGTH:-400000} CODE_MAX_STRING_ARRAY_LENGTH: ${CODE_MAX_STRING_ARRAY_LENGTH:-30} CODE_MAX_OBJECT_ARRAY_LENGTH: ${CODE_MAX_OBJECT_ARRAY_LENGTH:-30} CODE_MAX_NUMBER_ARRAY_LENGTH: ${CODE_MAX_NUMBER_ARRAY_LENGTH:-1000} CODE_EXECUTION_CONNECT_TIMEOUT: ${CODE_EXECUTION_CONNECT_TIMEOUT:-10} CODE_EXECUTION_READ_TIMEOUT: ${CODE_EXECUTION_READ_TIMEOUT:-60} CODE_EXECUTION_WRITE_TIMEOUT: ${CODE_EXECUTION_WRITE_TIMEOUT:-10} - TEMPLATE_TRANSFORM_MAX_LENGTH: ${TEMPLATE_TRANSFORM_MAX_LENGTH:-80000} + TEMPLATE_TRANSFORM_MAX_LENGTH: ${TEMPLATE_TRANSFORM_MAX_LENGTH:-400000} WORKFLOW_MAX_EXECUTION_STEPS: ${WORKFLOW_MAX_EXECUTION_STEPS:-500} WORKFLOW_MAX_EXECUTION_TIME: ${WORKFLOW_MAX_EXECUTION_TIME:-1200} WORKFLOW_CALL_MAX_DEPTH: ${WORKFLOW_CALL_MAX_DEPTH:-5} MAX_VARIABLE_SIZE: ${MAX_VARIABLE_SIZE:-204800} - WORKFLOW_PARALLEL_DEPTH_LIMIT: ${WORKFLOW_PARALLEL_DEPTH_LIMIT:-3} + GRAPH_ENGINE_MIN_WORKERS: ${GRAPH_ENGINE_MIN_WORKERS:-1} + GRAPH_ENGINE_MAX_WORKERS: ${GRAPH_ENGINE_MAX_WORKERS:-10} + GRAPH_ENGINE_SCALE_UP_THRESHOLD: ${GRAPH_ENGINE_SCALE_UP_THRESHOLD:-3} + GRAPH_ENGINE_SCALE_DOWN_IDLE_TIME: ${GRAPH_ENGINE_SCALE_DOWN_IDLE_TIME:-5.0} WORKFLOW_FILE_UPLOAD_LIMIT: ${WORKFLOW_FILE_UPLOAD_LIMIT:-10} WORKFLOW_NODE_EXECUTION_STORAGE: ${WORKFLOW_NODE_EXECUTION_STORAGE:-rdbms} CORE_WORKFLOW_EXECUTION_REPOSITORY: ${CORE_WORKFLOW_EXECUTION_REPOSITORY:-core.repositories.sqlalchemy_workflow_execution_repository.SQLAlchemyWorkflowExecutionRepository} @@ -402,9 +489,22 @@ x-shared-env: &shared-api-worker-env WORKFLOW_LOG_CLEANUP_ENABLED: ${WORKFLOW_LOG_CLEANUP_ENABLED:-false} WORKFLOW_LOG_RETENTION_DAYS: ${WORKFLOW_LOG_RETENTION_DAYS:-30} WORKFLOW_LOG_CLEANUP_BATCH_SIZE: ${WORKFLOW_LOG_CLEANUP_BATCH_SIZE:-100} + ALIYUN_SLS_ACCESS_KEY_ID: ${ALIYUN_SLS_ACCESS_KEY_ID:-} + ALIYUN_SLS_ACCESS_KEY_SECRET: ${ALIYUN_SLS_ACCESS_KEY_SECRET:-} + ALIYUN_SLS_ENDPOINT: ${ALIYUN_SLS_ENDPOINT:-} + ALIYUN_SLS_REGION: ${ALIYUN_SLS_REGION:-} + ALIYUN_SLS_PROJECT_NAME: ${ALIYUN_SLS_PROJECT_NAME:-} + ALIYUN_SLS_LOGSTORE_TTL: ${ALIYUN_SLS_LOGSTORE_TTL:-365} + LOGSTORE_DUAL_WRITE_ENABLED: ${LOGSTORE_DUAL_WRITE_ENABLED:-false} + LOGSTORE_DUAL_READ_ENABLED: ${LOGSTORE_DUAL_READ_ENABLED:-true} + LOGSTORE_ENABLE_PUT_GRAPH_FIELD: ${LOGSTORE_ENABLE_PUT_GRAPH_FIELD:-true} HTTP_REQUEST_NODE_MAX_BINARY_SIZE: ${HTTP_REQUEST_NODE_MAX_BINARY_SIZE:-10485760} HTTP_REQUEST_NODE_MAX_TEXT_SIZE: ${HTTP_REQUEST_NODE_MAX_TEXT_SIZE:-1048576} HTTP_REQUEST_NODE_SSL_VERIFY: ${HTTP_REQUEST_NODE_SSL_VERIFY:-True} + HTTP_REQUEST_MAX_CONNECT_TIMEOUT: ${HTTP_REQUEST_MAX_CONNECT_TIMEOUT:-10} + HTTP_REQUEST_MAX_READ_TIMEOUT: ${HTTP_REQUEST_MAX_READ_TIMEOUT:-600} + HTTP_REQUEST_MAX_WRITE_TIMEOUT: ${HTTP_REQUEST_MAX_WRITE_TIMEOUT:-600} + WEBHOOK_REQUEST_BODY_MAX_SIZE: ${WEBHOOK_REQUEST_BODY_MAX_SIZE:-10485760} RESPECT_XFORWARD_HEADERS_ENABLED: ${RESPECT_XFORWARD_HEADERS_ENABLED:-false} SSRF_PROXY_HTTP_URL: ${SSRF_PROXY_HTTP_URL:-http://ssrf_proxy:3128} SSRF_PROXY_HTTPS_URL: ${SSRF_PROXY_HTTPS_URL:-http://ssrf_proxy:3128} @@ -415,6 +515,8 @@ x-shared-env: &shared-api-worker-env TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} ALLOW_UNSAFE_DATA_SCHEME: ${ALLOW_UNSAFE_DATA_SCHEME:-false} MAX_TREE_DEPTH: ${MAX_TREE_DEPTH:-50} + PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} + MYSQL_HOST_VOLUME: ${MYSQL_HOST_VOLUME:-./volumes/mysql/data} POSTGRES_USER: ${POSTGRES_USER:-${DB_USERNAME}} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-${DB_PASSWORD}} POSTGRES_DB: ${POSTGRES_DB:-${DB_DATABASE}} @@ -469,9 +571,9 @@ x-shared-env: &shared-api-worker-env NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443} NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt} NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key} - NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3} + NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.2 TLSv1.3} NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto} - NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-15M} + NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-100M} NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65} NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s} NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s} @@ -515,11 +617,13 @@ x-shared-env: &shared-api-worker-env ENDPOINT_URL_TEMPLATE: ${ENDPOINT_URL_TEMPLATE:-http://localhost/e/{hook_id}} MARKETPLACE_ENABLED: ${MARKETPLACE_ENABLED:-true} MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai} - FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-false} + FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-true} + ENFORCE_LANGGENIUS_PLUGIN_SIGNATURES: ${ENFORCE_LANGGENIUS_PLUGIN_SIGNATURES:-true} PLUGIN_STDIO_BUFFER_SIZE: ${PLUGIN_STDIO_BUFFER_SIZE:-1024} PLUGIN_STDIO_MAX_BUFFER_SIZE: ${PLUGIN_STDIO_MAX_BUFFER_SIZE:-5242880} PLUGIN_PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-120} PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-600} + PLUGIN_DAEMON_TIMEOUT: ${PLUGIN_DAEMON_TIMEOUT:-600.0} PIP_MIRROR_URL: ${PIP_MIRROR_URL:-} PLUGIN_STORAGE_TYPE: ${PLUGIN_STORAGE_TYPE:-local} PLUGIN_STORAGE_LOCAL_ROOT: ${PLUGIN_STORAGE_LOCAL_ROOT:-/app/storage} @@ -568,21 +672,59 @@ x-shared-env: &shared-api-worker-env QUEUE_MONITOR_THRESHOLD: ${QUEUE_MONITOR_THRESHOLD:-200} QUEUE_MONITOR_ALERT_EMAILS: ${QUEUE_MONITOR_ALERT_EMAILS:-} QUEUE_MONITOR_INTERVAL: ${QUEUE_MONITOR_INTERVAL:-30} - SWAGGER_UI_ENABLED: ${SWAGGER_UI_ENABLED:-true} + SWAGGER_UI_ENABLED: ${SWAGGER_UI_ENABLED:-false} SWAGGER_UI_PATH: ${SWAGGER_UI_PATH:-/swagger-ui.html} - ENABLE_CLEAN_EMBEDDING_CACHE_TASK: ${ENABLE_CLEAN_EMBEDDING_CACHE_TASK:-true} + DSL_EXPORT_ENCRYPT_DATASET_ID: ${DSL_EXPORT_ENCRYPT_DATASET_ID:-true} + DATASET_MAX_SEGMENTS_PER_REQUEST: ${DATASET_MAX_SEGMENTS_PER_REQUEST:-0} + ENABLE_CLEAN_EMBEDDING_CACHE_TASK: ${ENABLE_CLEAN_EMBEDDING_CACHE_TASK:-false} ENABLE_CLEAN_UNUSED_DATASETS_TASK: ${ENABLE_CLEAN_UNUSED_DATASETS_TASK:-true} - ENABLE_CREATE_TIDB_SERVERLESS_TASK: ${ENABLE_CREATE_TIDB_SERVERLESS_TASK:-true} - ENABLE_UPDATE_TIDB_SERVERLESS_STATUS_TASK: ${ENABLE_UPDATE_TIDB_SERVERLESS_STATUS_TASK:-true} - ENABLE_CLEAN_MESSAGES: ${ENABLE_CLEAN_MESSAGES:-true} - ENABLE_MAIL_CLEAN_DOCUMENT_NOTIFY_TASK: ${ENABLE_MAIL_CLEAN_DOCUMENT_NOTIFY_TASK:-true} - ENABLE_DATASETS_QUEUE_MONITOR: ${ENABLE_DATASETS_QUEUE_MONITOR:-true} + ENABLE_CREATE_TIDB_SERVERLESS_TASK: ${ENABLE_CREATE_TIDB_SERVERLESS_TASK:-false} + ENABLE_UPDATE_TIDB_SERVERLESS_STATUS_TASK: ${ENABLE_UPDATE_TIDB_SERVERLESS_STATUS_TASK:-false} + ENABLE_CLEAN_MESSAGES: ${ENABLE_CLEAN_MESSAGES:-false} + ENABLE_WORKFLOW_RUN_CLEANUP_TASK: ${ENABLE_WORKFLOW_RUN_CLEANUP_TASK:-false} + ENABLE_MAIL_CLEAN_DOCUMENT_NOTIFY_TASK: ${ENABLE_MAIL_CLEAN_DOCUMENT_NOTIFY_TASK:-false} + ENABLE_DATASETS_QUEUE_MONITOR: ${ENABLE_DATASETS_QUEUE_MONITOR:-false} ENABLE_CHECK_UPGRADABLE_PLUGIN_TASK: ${ENABLE_CHECK_UPGRADABLE_PLUGIN_TASK:-true} + ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK: ${ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK:-true} + WORKFLOW_SCHEDULE_POLLER_INTERVAL: ${WORKFLOW_SCHEDULE_POLLER_INTERVAL:-1} + WORKFLOW_SCHEDULE_POLLER_BATCH_SIZE: ${WORKFLOW_SCHEDULE_POLLER_BATCH_SIZE:-100} + WORKFLOW_SCHEDULE_MAX_DISPATCH_PER_TICK: ${WORKFLOW_SCHEDULE_MAX_DISPATCH_PER_TICK:-0} + TENANT_ISOLATED_TASK_CONCURRENCY: ${TENANT_ISOLATED_TASK_CONCURRENCY:-1} + ANNOTATION_IMPORT_FILE_SIZE_LIMIT: ${ANNOTATION_IMPORT_FILE_SIZE_LIMIT:-2} + ANNOTATION_IMPORT_MAX_RECORDS: ${ANNOTATION_IMPORT_MAX_RECORDS:-10000} + ANNOTATION_IMPORT_MIN_RECORDS: ${ANNOTATION_IMPORT_MIN_RECORDS:-1} + ANNOTATION_IMPORT_RATE_LIMIT_PER_MINUTE: ${ANNOTATION_IMPORT_RATE_LIMIT_PER_MINUTE:-5} + ANNOTATION_IMPORT_RATE_LIMIT_PER_HOUR: ${ANNOTATION_IMPORT_RATE_LIMIT_PER_HOUR:-20} + ANNOTATION_IMPORT_MAX_CONCURRENT: ${ANNOTATION_IMPORT_MAX_CONCURRENT:-5} + AMPLITUDE_API_KEY: ${AMPLITUDE_API_KEY:-} + SANDBOX_EXPIRED_RECORDS_CLEAN_GRACEFUL_PERIOD: ${SANDBOX_EXPIRED_RECORDS_CLEAN_GRACEFUL_PERIOD:-21} + SANDBOX_EXPIRED_RECORDS_CLEAN_BATCH_SIZE: ${SANDBOX_EXPIRED_RECORDS_CLEAN_BATCH_SIZE:-1000} + SANDBOX_EXPIRED_RECORDS_RETENTION_DAYS: ${SANDBOX_EXPIRED_RECORDS_RETENTION_DAYS:-30} + SANDBOX_EXPIRED_RECORDS_CLEAN_TASK_LOCK_TTL: ${SANDBOX_EXPIRED_RECORDS_CLEAN_TASK_LOCK_TTL:-90000} services: + # Init container to fix permissions + init_permissions: + image: busybox:latest + command: + - sh + - -c + - | + FLAG_FILE="/app/api/storage/.init_permissions" + if [ -f "$${FLAG_FILE}" ]; then + echo "Permissions already initialized. Exiting." + exit 0 + fi + echo "Initializing permissions for /app/api/storage" + chown -R 1001:1001 /app/api/storage && touch "$${FLAG_FILE}" + echo "Permissions initialized. Exiting." + volumes: + - ./volumes/app/storage:/app/api/storage + restart: "no" + # API service api: - image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-api:1.8.1.fix + image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-api:1.11.4 restart: always environment: # Use the shared environment variables. @@ -595,12 +737,27 @@ services: PLUGIN_REMOTE_INSTALL_HOST: ${EXPOSE_PLUGIN_DEBUGGING_HOST:-localhost} PLUGIN_REMOTE_INSTALL_PORT: ${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003} PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} + PLUGIN_DAEMON_TIMEOUT: ${PLUGIN_DAEMON_TIMEOUT:-600.0} INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} FULL_CODE_EXECUTION_ENDPOINT: ${FULL_CODE_EXECUTION_ENDPOINT:-http://sandbox-full:8194} ALLOW_REGISTER: ${ALLOW_REGISTER:-True} depends_on: - - db - - redis + init_permissions: + condition: service_completed_successfully + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + redis: + condition: service_started volumes: # Mount the storage directory to the container, for storing user files. - ./volumes/app/storage:/app/api/storage @@ -611,7 +768,7 @@ services: # worker service # The Celery worker for processing the queue. worker: - image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-api:1.8.1.fix + image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-api:1.11.4 restart: always environment: # Use the shared environment variables. @@ -624,8 +781,22 @@ services: PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} depends_on: - - db - - redis + init_permissions: + condition: service_completed_successfully + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + redis: + condition: service_started volumes: # Mount the storage directory to the container, for storing user files. - ./volumes/app/storage:/app/api/storage @@ -636,20 +807,21 @@ services: # worker-gaia service # The Celery worker-gaia for processing the queue. worker-gaia: - image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-api:1.8.1.fix + image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-api:1.11.4 restart: always environment: # Use the shared environment variables. <<: *shared-api-worker-env # Startup mode, 'worker-gaia' starts the Celery worker-gaia for processing the queue. - MODE: worker-gaia + MODE: worker SENTRY_DSN: ${API_SENTRY_DSN:-} + CELERY_QUEUES: ${CELERY_QUEUES:-extend_high,extend_low} SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} depends_on: - - db + - db_postgres - redis volumes: # Mount the storage directory to the container, for storing user files. @@ -661,20 +833,21 @@ services: # worker-dataset service # The Celery worker-dataset for processing the queue. worker-dataset: - image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-api:1.8.1.fix + image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-api:1.11.4 restart: always environment: # Use the shared environment variables. <<: *shared-api-worker-env # Startup mode, 'worker-dataset' starts the Celery worker-dataset for processing the queue. - MODE: worker-dataset + MODE: worker SENTRY_DSN: ${API_SENTRY_DSN:-} + CELERY_QUEUES: ${CELERY_QUEUES:-dataset,priority_dataset} SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} depends_on: - - db + - db_postgres - redis volumes: # Mount the storage directory to the container, for storing user files. @@ -683,34 +856,40 @@ services: - ssrf_proxy_network - default - # beat service - # The Celery worker for schedule tasks. - beat: - image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-api:1.8.1.fix + # worker_beat service + # Celery beat for scheduling periodic tasks. + worker_beat: + image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-api:1.11.4 restart: always environment: # Use the shared environment variables. <<: *shared-api-worker-env - # Startup mode, 'worker' starts the Celery worker for processing the queue. + # Startup mode, 'worker_beat' starts the Celery beat for scheduling periodic tasks. MODE: beat - SENTRY_DSN: ${API_SENTRY_DSN:-} - SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} - SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} - PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} - INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} depends_on: - - db - - redis - volumes: - # Mount the storage directory to the container, for storing user files. - - ./volumes/app/storage:/app/api/storage + init_permissions: + condition: service_completed_successfully + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + redis: + condition: service_started networks: - ssrf_proxy_network - default # Frontend web application. web: - image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-web:1.8.1.fix.3 + image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-web:1.11.4 restart: always environment: CONSOLE_API_URL: ${CONSOLE_API_URL:-} @@ -736,7 +915,7 @@ services: ENABLE_WEBSITE_WATERCRAWL: ${ENABLE_WEBSITE_WATERCRAWL:-true} # The postgres database. - db: + db_postgres: image: ccr.ccs.tencentyun.com/yfgaia/postgres:15-alpine restart: always environment: @@ -750,6 +929,8 @@ services: -c 'work_mem=${POSTGRES_WORK_MEM:-4MB}' -c 'maintenance_work_mem=${POSTGRES_MAINTENANCE_WORK_MEM:-64MB}' -c 'effective_cache_size=${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB}' + -c 'statement_timeout=${POSTGRES_STATEMENT_TIMEOUT:-0}' + -c 'idle_in_transaction_session_timeout=${POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT:-0}' volumes: - ./volumes/db/data:/var/lib/postgresql/data healthcheck: @@ -758,11 +939,11 @@ services: "CMD", "pg_isready", "-h", - "db", + "db_postgres", "-U", - "${POSTGRES_USER:-postgres}", + "${DB_USERNAME:-postgres}", "-d", - "${POSTGRES_DB:-dify}", + "${DB_DATABASE:-dify}", ] interval: 1s timeout: 3s @@ -816,7 +997,7 @@ services: # plugin daemon plugin_daemon: - image: ccr.ccs.tencentyun.com/yfgaia/dify-plugin-daemon:0.2.0-local + image: ccr.ccs.tencentyun.com/yfgaia/dify-plugin-daemon:0.5.2-local restart: always environment: # Use the shared environment variables. @@ -831,7 +1012,7 @@ services: PLUGIN_REMOTE_INSTALLING_HOST: ${PLUGIN_DEBUGGING_HOST:-0.0.0.0} PLUGIN_REMOTE_INSTALLING_PORT: ${PLUGIN_DEBUGGING_PORT:-5003} PLUGIN_WORKING_PATH: ${PLUGIN_WORKING_PATH:-/app/storage/cwd} - FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-false} + FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-true} PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-120} PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-600} PLUGIN_STDIO_BUFFER_SIZE: ${PLUGIN_STDIO_BUFFER_SIZE:-1024} @@ -872,8 +1053,18 @@ services: volumes: - ./volumes/plugin_daemon:/app/storage depends_on: - db: + db_postgres: condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false # ssrf_proxy server # for more information, please refer to @@ -941,9 +1132,9 @@ services: # and modify the env vars below in .env if HTTPS_ENABLED is true. NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt} NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key} - NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3} + NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.2 TLSv1.3} NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto} - NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-15M} + NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-100M} NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65} NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s} NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s} @@ -979,6 +1170,10 @@ services: AUTHENTICATION_APIKEY_USERS: ${WEAVIATE_AUTHENTICATION_APIKEY_USERS:-hello@dify.ai} AUTHORIZATION_ADMINLIST_ENABLED: ${WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED:-true} AUTHORIZATION_ADMINLIST_USERS: ${WEAVIATE_AUTHORIZATION_ADMINLIST_USERS:-hello@dify.ai} + DISABLE_TELEMETRY: ${WEAVIATE_DISABLE_TELEMETRY:-false} + ENABLE_TOKENIZER_GSE: ${WEAVIATE_ENABLE_TOKENIZER_GSE:-false} + ENABLE_TOKENIZER_KAGOME_JA: ${WEAVIATE_ENABLE_TOKENIZER_KAGOME_JA:-false} + ENABLE_TOKENIZER_KAGOME_KR: ${WEAVIATE_ENABLE_TOKENIZER_KAGOME_KR:-false} # Qdrant vector store. # (if used, you need to set VECTOR_STORE to qdrant in the api & worker service.) @@ -1375,7 +1570,7 @@ services: # Extend - admin-web admin-web: - image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-admin-web:1.8.1.fix + image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-admin-web:1.11.4 restart: always ports: - '8081:8081' @@ -1387,7 +1582,7 @@ services: # Extend - admin-server admin-server: - image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-admin-server:1.8.1.fix + image: ccr.ccs.tencentyun.com/yfgaia/dify-plus-admin-server:1.11.4 restart: always environment: # JWT signing key must match API's SECRET_KEY for token compatibility @@ -1396,12 +1591,12 @@ services: ports: - '8888:8888' depends_on: - db: + db_postgres: condition: service_healthy redis: condition: service_healthy links: - - db + - db_postgres - redis networks: - ssrf_proxy_network diff --git a/web/app/components/explore/app-list-center-extend/index.tsx b/web/app/components/explore/app-list-center-extend/index.tsx index eef57798d..53c17663f 100644 --- a/web/app/components/explore/app-list-center-extend/index.tsx +++ b/web/app/components/explore/app-list-center-extend/index.tsx @@ -1,6 +1,5 @@ 'use client' -import type { CreateAppModalProps } from '@/app/components/explore/create-app-modal' import type { App } from '@/models/explore' import { useDebounceFn } from 'ahooks' import { useQueryState } from 'nuqs' @@ -10,7 +9,6 @@ import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' import Category from '@/app/components/explore/category' -import { fetchAppDetail } from '@/service/explore' import { useInstalledAppList } from '@/service/use-explore' import { cn } from '@/utils/classnames' import s from './style.module.css' @@ -65,7 +63,7 @@ const Apps = ({ const filteredListExtend = useMemo(() => { if (!data) return [] - + let result = data.allList // Apply category filter @@ -87,7 +85,17 @@ const Apps = ({ ) } - return result + // Deduplicate by app_id (same app may appear multiple times due to multiple tags) + const seenAppIds = new Set() + const deduplicatedResult: App[] = [] + for (const item of result) { + if (!seenAppIds.has(item.app_id)) { + seenAppIds.add(item.app_id) + deduplicatedResult.push(item) + } + } + + return deduplicatedResult }, [data, currCategory, allCategoriesEn, tagFilterValue, keywordsValue]) // Extend: stop Filtered list with search and tag filter @@ -120,11 +128,6 @@ const Apps = ({ 'flex h-full flex-col border-l-[0.5px] border-divider-regular', )} > -
-
{t('apps.title', { ns: 'explore' })}
-
{t('apps.description', { ns: 'explore' })}
-
-
{filteredListExtend.map(app => ( { setTagFilterValue(value) } - - const handleKeywordsChange = (value: string) => { - setKeywordsValue(value) - } + // Extend: stop Filtered list with search and tag filter const [currApp, setCurrApp] = React.useState(null) const [isShowCreateModal, setIsShowCreateModal] = React.useState(false) @@ -227,15 +223,6 @@ const Apps = ({ {/* Extend: stop Explore Add Search */}
-
- -
-
= ({ style={isDiscoverySelected ? { boxShadow: '0px 1px 2px rgba(16, 24, 40, 0.05)' } : {}} > {isDiscoverySelected ? : } - {!isMobile &&
{t('sidebar.discovery', { ns: 'explore' })}
} + {!isMobile &&
{t('sidebar.discovery', { ns: 'extend' })}
}
)} diff --git a/web/app/components/header/explore-nav/index.tsx b/web/app/components/header/explore-nav/index.tsx index 34deb61fe..f70603de4 100644 --- a/web/app/components/header/explore-nav/index.tsx +++ b/web/app/components/header/explore-nav/index.tsx @@ -22,7 +22,7 @@ const ExploreNav = ({ return ( { diff --git a/web/app/components/share/text-generation/index.tsx b/web/app/components/share/text-generation/index.tsx index dac8fdc36..78fbb4422 100644 --- a/web/app/components/share/text-generation/index.tsx +++ b/web/app/components/share/text-generation/index.tsx @@ -74,6 +74,7 @@ export type IMainProps = { const TextGeneration: FC = ({ isInstalledApp = false, + installedAppInfo, isWorkflow = false, }) => { const { notify } = Toast diff --git a/web/app/fonts/InstrumentSerif-Italic.ttf b/web/app/fonts/InstrumentSerif-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..192c3eda9864241ad280e9bcc84e258c80a4a588 GIT binary patch literal 71592 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 KD*W_b^8W`*>=6zC literal 0 HcmV?d00001 diff --git a/web/app/fonts/InstrumentSerif-Regular.ttf b/web/app/fonts/InstrumentSerif-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..36fac00ef9b7d523236df6536cb09c712bb2c7e4 GIT binary patch literal 70012 zcmc${d0=E!nKyjSy|pj5s#0rGS!zkDDoJIl?0a?A?sO-eUP+*rEWIz#Y;A+sHVDX~ zxWFj5Anu5u)r}~k<0v`|Be?OZI4*!Q=&KHc4&&fPC-3h$_g1AUNjELuA78`Gy>;%X zTjxCI+0OI)&bf>;#$5QLW6sf`;gR4S6}uSw_En7Wj?u}DTfSU(+Q-;a4>FcMHo9fo zz%MSkZ#(0*QpWVVHg0K1&HSMB^Qe0_o-#9kboSVPeCf0Qmoekd@j%P`@vB1CA4rce zR`Ma-Z`pTj|IxYnzrC3;>u(rSZ2M=gJce>7e(wm*ru|2**?0JUUxKl+Z!z|fnFD)g z_k{bMIy@i0$J!2{!0;&lD?V?<=gI>|uR5_s3V#`&|BUv$c;vGA*_q$J{c-%>_ZgG^ zcy#u}G3ncmgSdYJ^+T7=9^HH5u6zCuWB*u*_MJI)*_BrvJ8)|WW8e4*e*QhjuGo9* zz{rzmYw;gZ|I>_UgQM>9>p#2O(euB|A*0=lJ#TsKB%NRA{NBRiHx{0feezH7(ZD1s z#Xo#Ues1C0_}hp3CuE;^l6p_Aa1E94YuNSp)=i+j#1d>Pdnaz*q1c#=yE^_U{%)p6 zKW>wzP`+M0^Ia^)>+&AO?qlpSd>+e|O>CSPW?yHaNRift=Xe|L-AVWPf&|L25R;{g z*`@qn7hk^6L$;vqbIi?OV2S02RK(o*2mfc(d%fdse89V{|>Wc4=KQW7jn=TNVl(YM3{&F0(4(~e3m(Q{_!pr;1_sEy{P*YrsrFj zf5q{yteoG)N+li6bUlwcuXlu)oxhhU1;>xkz8^Cad!9MeWARn?{Nnd;Jg-9aV#!~a|q9GkZLN?_S7p>*6cYwv`9Je(}%zJ&Uib zIA+n7{NpB!(S;tXjpNtQKROD>(1o$2W969Mj`7Poq^Fr(dKSme)Pw&5boeE%--Bl! zVG(`|vhg&lgdFO@FCKm+j$1*elQ`~Tm8j$5r$N8>vJ&{_p)AkzBuk?U3??TzlGz2IO=fN#rMb}$v8a1 zrqEd@zlzUupuC<%SOe>1C)vl@C)sCNhJArO%D%#l+|7eL%HzD2H}iJh$Jg?4ehHuD zd-+NJT`4HFOaCJMLe|M9*(MjsiSnDu?=AnIkSA0UDi1|Mu~1{EEA(JE5-D0-#BYT# z>Rm8XpM*vI9Dd`A>@oIF+`@gloX2<#ujg&Nlds`pe3I|td-x Vvj{ctZM#%w&UX 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.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -2214,24 +2254,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@16.1.4': resolution: {integrity: sha512-3Wm0zGYVCs6qDFAiSSDL+Z+r46EdtCv/2l+UlIdMbAq9hPJBvGu/rZOeuvCaIUjbArkmXac8HnTyQPJFzFWA0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@16.1.4': resolution: {integrity: sha512-lWAYAezFinaJiD5Gv8HDidtsZdT3CDaCeqoPoJjeB57OqzvMajpIhlZFce5sCAH6VuX4mdkxCRqecCJFwfm2nQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@16.1.4': resolution: {integrity: sha512-fHaIpT7x4gA6VQbdEpYUXRGyge/YbRrkG6DXM60XiBqDM2g2NcrsQaIuj375egnGFkJow4RHacgBOEsHfGbiUw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@16.1.4': resolution: {integrity: sha512-MCrXxrTSE7jPN1NyXJr39E+aNFBrQZtO154LoCz7n99FuKqJDekgxipoodLNWdQP7/DZ5tKMc/efybx1l159hw==} @@ -2425,41 +2469,49 @@ packages: resolution: {integrity: sha512-SVjjjtMW66Mza76PBGJLqB0KKyFTBnxmtDXLJPbL6ZPGSctcXVmujz7/WAc0rb9m2oV0cHQTtVjnq6orQnI/jg==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-resolver/binding-linux-arm64-musl@11.15.0': resolution: {integrity: sha512-JDv2/AycPF2qgzEiDeMJCcSzKNDm3KxNg0KKWipoKEMDFqfM7LxNwwSVyAOGmrYlE4l3dg290hOMsr9xG7jv9g==} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-resolver/binding-linux-ppc64-gnu@11.15.0': resolution: {integrity: sha512-zbu9FhvBLW4KJxo7ElFvZWbSt4vP685Qc/Gyk/Ns3g2gR9qh2qWXouH8PWySy+Ko/qJ42+HJCLg+ZNcxikERfg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@oxc-resolver/binding-linux-riscv64-gnu@11.15.0': resolution: {integrity: sha512-Kfleehe6B09C2qCnyIU01xLFqFXCHI4ylzkicfX/89j+gNHh9xyNdpEvit88Kq6i5tTGdavVnM6DQfOE2qNtlg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-resolver/binding-linux-riscv64-musl@11.15.0': resolution: {integrity: sha512-J7LPiEt27Tpm8P+qURDwNc8q45+n+mWgyys4/V6r5A8v5gDentHRGUx3iVk5NxdKhgoGulrzQocPTZVosq25Eg==} cpu: [riscv64] os: [linux] + libc: [musl] '@oxc-resolver/binding-linux-s390x-gnu@11.15.0': resolution: {integrity: sha512-+8/d2tAScPjVJNyqa7GPGnqleTB/XW9dZJQ2D/oIM3wpH3TG+DaFEXBbk4QFJ9K9AUGBhvQvWU2mQyhK/yYn3Q==} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-resolver/binding-linux-x64-gnu@11.15.0': resolution: {integrity: sha512-xtvSzH7Nr5MCZI2FKImmOdTl9kzuQ51RPyLh451tvD2qnkg3BaqI9Ox78bTk57YJhlXPuxWSOL5aZhKAc9J6qg==} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-resolver/binding-linux-x64-musl@11.15.0': resolution: {integrity: sha512-14YL1zuXj06+/tqsuUZuzL0T425WA/I4nSVN1kBXeC5WHxem6lQ+2HGvG+crjeJEqHgZUT62YIgj88W+8E7eyg==} cpu: [x64] os: [linux] + libc: [musl] '@oxc-resolver/binding-openharmony-arm64@11.15.0': resolution: {integrity: sha512-/7Qli+1Wk93coxnrQaU8ySlICYN8HsgyIrzqjgIkQEpI//9eUeaeIHZptNl2fMvBGeXa7k2QgLbRNaBRgpnvMw==} @@ -2515,36 +2567,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-win32-arm64@2.5.1': resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} @@ -2954,56 +3012,67 @@ packages: resolution: {integrity: sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.53.5': resolution: {integrity: sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.53.5': resolution: {integrity: sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.53.5': resolution: {integrity: sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.53.5': resolution: {integrity: sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.53.5': resolution: {integrity: sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.53.5': resolution: {integrity: sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.53.5': resolution: {integrity: sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.53.5': resolution: {integrity: sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.53.5': resolution: {integrity: sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.53.5': resolution: {integrity: sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.53.5': resolution: {integrity: sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==} @@ -3289,24 +3358,28 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] '@swc/core-linux-arm64-musl@1.15.8': resolution: {integrity: sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] '@swc/core-linux-x64-gnu@1.15.8': resolution: {integrity: sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] '@swc/core-linux-x64-musl@1.15.8': resolution: {integrity: sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] '@swc/core-win32-arm64-msvc@1.15.8': resolution: {integrity: sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ==} @@ -3718,8 +3791,8 @@ packages: '@types/node@20.19.30': resolution: {integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==} - '@types/papaparse@5.5.1': - resolution: {integrity: sha512-esEO+VISsLIyE+JZBmb89NzsYYbpwV8lmv2rPo6oX5y9KhBaIP7hhHgjuTut54qjdKVMufTEcrh5fUl9+58huw==} + '@types/papaparse@5.5.2': + resolution: {integrity: sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -4936,6 +5009,9 @@ packages: diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dingtalk-jsapi@3.2.5: + resolution: {integrity: sha512-GHtDTmilJQhr07GNarjlzhvgUkPWc0+52zbN2ToW+JzkydaOwmhiJCTO42+BI+onAlhdfLUbtUnGsjQNDTrM1w==} + dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -6108,6 +6184,10 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jschardet@3.1.4: + resolution: {integrity: sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==} + engines: {node: '>=0.1.90'} + jsdoc-type-pratt-parser@4.8.0: resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} engines: {node: '>=12.0.0'} @@ -7137,6 +7217,9 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + promise-polyfill@7.1.2: + resolution: {integrity: sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -12187,7 +12270,7 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/papaparse@5.5.1': + '@types/papaparse@5.5.2': dependencies: '@types/node': 18.15.0 @@ -13535,6 +13618,10 @@ snapshots: miller-rabin: 4.0.1 randombytes: 2.1.0 + dingtalk-jsapi@3.2.5: + dependencies: + promise-polyfill: 7.1.2 + dlv@1.1.3: {} doctrine@3.0.0: @@ -14958,6 +15045,8 @@ snapshots: dependencies: argparse: 2.0.1 + jschardet@3.1.4: {} + jsdoc-type-pratt-parser@4.8.0: {} jsdoc-type-pratt-parser@7.0.0: {} @@ -16329,6 +16418,8 @@ snapshots: process@0.11.10: {} + promise-polyfill@7.1.2: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -16497,7 +16588,7 @@ snapshots: react-papaparse@4.4.0: dependencies: - '@types/papaparse': 5.5.1 + '@types/papaparse': 5.5.2 papaparse: 5.5.3 react-pdf-highlighter@8.0.0-rc.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): diff --git a/web/service/use-explore.ts b/web/service/use-explore.ts index 0e323e5bf..b71c78c8d 100644 --- a/web/service/use-explore.ts +++ b/web/service/use-explore.ts @@ -2,7 +2,15 @@ import type { App, AppCategory } from '@/models/explore' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useGlobalPublicStore } from '@/context/global-public-context' import { AccessMode } from '@/models/access-control' -import { fetchAppList, fetchBanners, fetchInstalledAppList, getAppAccessModeByAppId, uninstallApp, updatePinStatus } from './explore' +import { + fetchAppList, + fetchBanners, + fetchInstalledAppList, + fetchOpenInstalledAppList, + getAppAccessModeByAppId, + uninstallApp, + updatePinStatus, +} from './explore' import { AppSourceType, fetchAppMeta, fetchAppParams } from './share' const NAME_SPACE = 'explore' diff --git a/web/tsconfig.json b/web/tsconfig.json index 45d7fa787..6df4f56bf 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "incremental": true, "target": "es2022", - "jsx": "preserve", + "jsx": "react-jsx", "lib": [ "dom", "dom.iterable",