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 000000000..192c3eda9 Binary files /dev/null and b/web/app/fonts/InstrumentSerif-Italic.ttf differ diff --git a/web/app/fonts/InstrumentSerif-Regular.ttf b/web/app/fonts/InstrumentSerif-Regular.ttf new file mode 100644 index 000000000..36fac00ef Binary files /dev/null and b/web/app/fonts/InstrumentSerif-Regular.ttf differ diff --git a/web/app/fonts/OFT.txt b/web/app/fonts/OFT.txt new file mode 100644 index 000000000..e1801b959 --- /dev/null +++ b/web/app/fonts/OFT.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Instrument Serif Project Authors (https://github.com/Instrument/instrument-serif) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/web/app/layout.tsx b/web/app/layout.tsx index 845cae2d4..47f54db95 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -1,7 +1,8 @@ import type { Viewport } from 'next' import { Provider as JotaiProvider } from 'jotai' import { ThemeProvider } from 'next-themes' -import { Instrument_Serif } from 'next/font/google' +// extend: dockefile 构建访问不到google,改成本地 +import localFont from 'next/font/local' import { NuqsAdapter } from 'nuqs/adapters/next/app' import GlobalPublicStoreProvider from '@/context/global-public-context' import { TanstackQueryInitializer } from '@/context/query-client' @@ -25,13 +26,23 @@ export const viewport: Viewport = { viewportFit: 'cover', userScalable: false, } - -const instrumentSerif = Instrument_Serif({ - weight: ['400'], - style: ['normal', 'italic'], - subsets: ['latin'], +// extend: start dockefile 构建访问不到google,改成本地 +const instrumentSerif = localFont({ + src: [ + { + path: './fonts/InstrumentSerif-Regular.ttf', + weight: '400', + style: 'normal', + }, + { + path: './fonts/InstrumentSerif-Italic.ttf', + weight: '400', + style: 'italic', + }, + ], variable: '--font-instrument-serif', }) +// extend: stop dockefile 构建访问不到google,改成本地 const LocaleLayout = async ({ children, diff --git a/web/i18n/de-DE/extend.json b/web/i18n/de-DE/extend.json index 2ceb04f3b..e4040b578 100644 --- a/web/i18n/de-DE/extend.json +++ b/web/i18n/de-DE/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "KI-Zeichnung", "aiVideo.title": "KI-Video", "aiVideo.translate": "Video übersetzen", "apiKeyModal.accumulatedLimit": "Kumulierte Nutzung", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "App zur Entdeckungsseite synchronisieren und zugehörige Tags erstellen", "app.syncAppOk": "Synchronisierung erfolgreich", "app.syncToAppTemplate": "Zur App-Vorlage synchronisieren", + "appCard.newConversation": "Neue Unterhaltung", "appCenter.description": "Hier ist der App-Center, wo Sie kategorisierte Apps finden und nutzen können", "appMenus.userOverview": "Persönliche Überwachung", "batchWorkflow.batchJobs": "{{num}} Stapelaufgaben", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Fehler aufgetreten", "batchWorkflow.failed": "Fehlgeschlagen", "batchWorkflow.initializing": "Stapelaufgabe wird initialisiert...", + "batchWorkflow.noBatchTasks": "Keine Stapelverarbeitungsaufgaben", "batchWorkflow.pending": "Ausstehend", "batchWorkflow.pleaseWait": "Bitte warten", "batchWorkflow.processed": "{{processed}}/{{total}} Zeilen verarbeitet", @@ -63,6 +66,8 @@ "billingList.link": "Link", "billingList.open": "Erweitern", "billingList.router": "Router", + "configuration.clearContext": "Kontext gelöscht", + "configuration.restoreContext": "Klicken, um Kontext wiederherzustellen", "fileUploader.fileUpload": "Datei-Upload", "fileUploader.pasteFileLink": "Datei-Link einfügen", "fileUploader.pasteFileLinkInputPlaceholder": "Datei-Link hier einfügen", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Datei-Upload fehlgeschlagen, bitte erneut hochladen.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Arbeitsbereich auswählen", "sidebar.appCenter": "App-Center", - "sidebar.withDingTalk": "Anmelden mit DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Entdecken", + "sidebar.withDingTalk": "Anmelden mit DingTalk", + "user.credit": "Guthaben", + "user.used": "Verwendet:" +} diff --git a/web/i18n/en-US/extend.json b/web/i18n/en-US/extend.json index a078ee8a9..96052d011 100644 --- a/web/i18n/en-US/extend.json +++ b/web/i18n/en-US/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "AI Drawing", "aiVideo.title": "AI Video", "aiVideo.translate": "Video Translation", "apiKeyModal.accumulatedLimit": "Cumulative Usage Limit", @@ -65,6 +66,8 @@ "billingList.link": "Link", "billingList.open": "Expand", "billingList.router": "Route", + "configuration.clearContext": "Context cleared", + "configuration.restoreContext": "Click to restore context", "fileUploader.fileUpload": "File upload", "fileUploader.pasteFileLink": "Paste file link", "fileUploader.pasteFileLinkInputPlaceholder": "Paste file link here", @@ -75,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "File upload failed, please upload again.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Select workspace", "sidebar.appCenter": "App Center", - "sidebar.withDingTalk": "Log in with DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Discovery", + "sidebar.withDingTalk": "Log in with DingTalk", + "user.credit": "Credit", + "user.used": "Used:" +} diff --git a/web/i18n/es-ES/extend.json b/web/i18n/es-ES/extend.json index f5b54d9f7..2a826bb6e 100644 --- a/web/i18n/es-ES/extend.json +++ b/web/i18n/es-ES/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "Dibujo IA", "aiVideo.title": "Video de IA", "aiVideo.translate": "Traducción de video", "apiKeyModal.accumulatedLimit": "Límite de uso acumulado", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Sincronizar aplicación a la interfaz de exploración y crear etiquetas relacionadas", "app.syncAppOk": "Sincronización exitosa", "app.syncToAppTemplate": "Sincronizar a plantilla de aplicación", + "appCard.newConversation": "Nueva conversación", "appCenter.description": "A continuación se encuentra el centro de aplicaciones, donde puedes ver aplicaciones categorizadas y utilizarlas", "appMenus.userOverview": "Monitoreo personal", "batchWorkflow.batchJobs": "{{num}} tareas por lotes", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Ocurrió un error", "batchWorkflow.failed": "Fallido", "batchWorkflow.initializing": "Inicializando tarea por lotes...", + "batchWorkflow.noBatchTasks": "No hay tareas de procesamiento por lotes", "batchWorkflow.pending": "Pendiente", "batchWorkflow.pleaseWait": "Por favor espere", "batchWorkflow.processed": "Procesadas {{processed}}/{{total}} filas", @@ -63,6 +66,8 @@ "billingList.link": "Enlace", "billingList.open": "Expandir", "billingList.router": "Enrutador", + "configuration.clearContext": "Contexto borrado", + "configuration.restoreContext": "Haga clic para restaurar el contexto", "fileUploader.fileUpload": "Carga de archivo", "fileUploader.pasteFileLink": "Pegar enlace de archivo", "fileUploader.pasteFileLinkInputPlaceholder": "Pegue el enlace del archivo aquí", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Error al cargar el archivo, por favor vuelva a cargar.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Seleccionar espacio de trabajo", "sidebar.appCenter": "Centro de aplicaciones", - "sidebar.withDingTalk": "Iniciar sesión con DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Descubrimiento", + "sidebar.withDingTalk": "Iniciar sesión con DingTalk", + "user.credit": "Crédito", + "user.used": "Usado:" +} diff --git a/web/i18n/fa-IR/extend.json b/web/i18n/fa-IR/extend.json index b01e80520..3fa4f902e 100644 --- a/web/i18n/fa-IR/extend.json +++ b/web/i18n/fa-IR/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "نقاشی AI", "aiVideo.title": "ویدیوی هوش مصنوعی", "aiVideo.translate": "ترجمه ویدیو", "apiKeyModal.accumulatedLimit": "سهمیه استفاده تجمعی", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "همگام‌سازی برنامه به صفحه کشف و ایجاد برچسب‌های مرتبط", "app.syncAppOk": "همگام‌سازی موفقیت‌آمیز بود", "app.syncToAppTemplate": "همگام‌سازی به قالب برنامه", + "appCard.newConversation": "مکالمه جدید", "appCenter.description": "این مرکز برنامه‌هاست، جایی که می‌توانید برنامه‌های دسته‌بندی شده را مشاهده و استفاده کنید", "appMenus.userOverview": "نظارت شخصی", "batchWorkflow.batchJobs": "{{num}} وظیفه دسته‌ای", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "خطا رخ داد", "batchWorkflow.failed": "شکست خورد", "batchWorkflow.initializing": "در حال راه‌اندازی وظیفه دسته‌ای...", + "batchWorkflow.noBatchTasks": "هیچ کار پردازش دسته‌ای وجود ندارد", "batchWorkflow.pending": "در انتظار پردازش", "batchWorkflow.pleaseWait": "لطفاً منتظر بمانید", "batchWorkflow.processed": "{{processed}}/{{total}} ردیف پردازش شد", @@ -63,6 +66,8 @@ "billingList.link": "پیوند", "billingList.open": "باز کردن", "billingList.router": "مسیریاب", + "configuration.clearContext": "زمینه پاک شد", + "configuration.restoreContext": "برای بازیابی زمینه کلیک کنید", "fileUploader.fileUpload": "بارگذاری فایل", "fileUploader.pasteFileLink": "چسباندن لینک فایل", "fileUploader.pasteFileLinkInputPlaceholder": "لینک فایل را در اینجا بچسبانید", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "بارگذاری فایل شکست خورد، لطفاً مجدداً بارگذاری کنید.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "انتخاب فضای کاری", "sidebar.appCenter": "مرکز برنامه‌ها", - "sidebar.withDingTalk": "ورود با DingTalk" -} \ No newline at end of file + "sidebar.discovery": "کشف", + "sidebar.withDingTalk": "ورود با DingTalk", + "user.credit": "اعتبار", + "user.used": "استفاده شده:" +} diff --git a/web/i18n/fr-FR/extend.json b/web/i18n/fr-FR/extend.json index b9757ffc6..4cb74e26f 100644 --- a/web/i18n/fr-FR/extend.json +++ b/web/i18n/fr-FR/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "Dessin IA", "aiVideo.title": "Vidéo IA", "aiVideo.translate": "Traduction vidéo", "apiKeyModal.accumulatedLimit": "Quota d'utilisation cumulé", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Synchroniser l'application avec l'interface de découverte et créer des étiquettes associées", "app.syncAppOk": "Synchronisation réussie", "app.syncToAppTemplate": "Synchroniser avec le modèle d'application", + "appCard.newConversation": "Nouvelle conversation", "appCenter.description": "Voici le centre d'applications, où vous pouvez voir des applications classées et les utiliser.", "appMenus.userOverview": "Surveillance personnelle", "batchWorkflow.batchJobs": "{{num}} tâches par lots", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Une erreur s'est produite", "batchWorkflow.failed": "Échoué", "batchWorkflow.initializing": "Initialisation de la tâche par lots...", + "batchWorkflow.noBatchTasks": "Aucune tâche de traitement par lots", "batchWorkflow.pending": "En attente", "batchWorkflow.pleaseWait": "Veuillez patienter", "batchWorkflow.processed": "{{processed}}/{{total}} lignes traitées", @@ -63,6 +66,8 @@ "billingList.link": "Lien", "billingList.open": "Développer", "billingList.router": "Routeur", + "configuration.clearContext": "Contexte effacé", + "configuration.restoreContext": "Cliquez pour restaurer le contexte", "fileUploader.fileUpload": "Téléchargement de fichier", "fileUploader.pasteFileLink": "Coller le lien du fichier", "fileUploader.pasteFileLinkInputPlaceholder": "Collez le lien du fichier ici", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Échec du téléchargement du fichier, veuillez réessayer.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Sélectionner un espace de travail", "sidebar.appCenter": "Centre d'applications", - "sidebar.withDingTalk": "Connexion avec DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Découverte", + "sidebar.withDingTalk": "Connexion avec DingTalk", + "user.credit": "Crédit", + "user.used": "Utilisé:" +} diff --git a/web/i18n/hi-IN/extend.json b/web/i18n/hi-IN/extend.json index 44753e290..6680ec95f 100644 --- a/web/i18n/hi-IN/extend.json +++ b/web/i18n/hi-IN/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "AI ड्राइंग", "aiVideo.title": "AI वीडियो", "aiVideo.translate": "वीडियो अनुवाद", "apiKeyModal.accumulatedLimit": "संचयी उपयोग सीमा", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "खोज इंटरफ़ेस पर ऐप सिंक्रोनाइज़ करें और संबंधित टैग बनाएं", "app.syncAppOk": "सिंक्रोनाइज़ सफल", "app.syncToAppTemplate": "ऐप टेम्पलेट में सिंक्रोनाइज़ करें", + "appCard.newConversation": "नई बातचीत", "appCenter.description": "यह ऐप केंद्र है, जहां आप श्रेणीबद्ध ऐप्स देख और उपयोग कर सकते हैं", "appMenus.userOverview": "व्यक्तिगत निगरानी", "batchWorkflow.batchJobs": "{{num}} बैच कार्य", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "त्रुटि हुई", "batchWorkflow.failed": "विफल", "batchWorkflow.initializing": "बैच कार्य प्रारंभ हो रहा है...", + "batchWorkflow.noBatchTasks": "कोई बैच प्रसंस्करण कार्य नहीं", "batchWorkflow.pending": "लंबित", "batchWorkflow.pleaseWait": "कृपया प्रतीक्षा करें", "batchWorkflow.processed": "{{processed}}/{{total}} पंक्तियाँ प्रोसेस की गईं", @@ -63,6 +66,8 @@ "billingList.link": "लिंक", "billingList.open": "खोलें", "billingList.router": "राउटर", + "configuration.clearContext": "संदर्भ साफ़ कर दिया गया", + "configuration.restoreContext": "संदर्भ पुनर्स्थापित करने के लिए क्लिक करें", "fileUploader.fileUpload": "फ़ाइल अपलोड", "fileUploader.pasteFileLink": "फ़ाइल लिंक पेस्ट करें", "fileUploader.pasteFileLinkInputPlaceholder": "अपना फ़ाइल लिंक यहाँ पेस्ट करें", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "फ़ाइल अपलोड करने में त्रुटि, कृपया फिर से अपलोड करें।", "modelSyncWorkspaceCustomize.workspacePlaceholder": "कार्यस्थल चुनें", "sidebar.appCenter": "ऐप केंद्र", - "sidebar.withDingTalk": "डिंगटॉक के साथ लॉगिन करें" -} \ No newline at end of file + "sidebar.discovery": "खोज", + "sidebar.withDingTalk": "डिंगटॉक के साथ लॉगिन करें", + "user.credit": "क्रेडिट", + "user.used": "उपयोग किया गया:" +} diff --git a/web/i18n/id-ID/extend.json b/web/i18n/id-ID/extend.json index f28f59512..149362b87 100644 --- a/web/i18n/id-ID/extend.json +++ b/web/i18n/id-ID/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "Gambar AI", "aiVideo.title": "Video AI", "aiVideo.translate": "Terjemahan Video", "apiKeyModal.accumulatedLimit": "Batas penggunaan kumulatif", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Sinkronkan aplikasi ke halaman Jelajah dan buat tag terkait", "app.syncAppOk": "Sinkronisasi berhasil", "app.syncToAppTemplate": "Sinkronkan ke template aplikasi", + "appCard.newConversation": "Percakapan baru", "appCenter.description": "Berikut adalah Pusat Aplikasi, di mana Anda dapat melihat aplikasi yang dikategorikan dan menggunakannya", "appMenus.userOverview": "Pemantauan Pribadi", "batchWorkflow.batchJobs": "{{num}} tugas batch", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Terjadi kesalahan", "batchWorkflow.failed": "Gagal", "batchWorkflow.initializing": "Menginisialisasi tugas batch...", + "batchWorkflow.noBatchTasks": "Tidak ada tugas pemrosesan batch", "batchWorkflow.pending": "Tertunda", "batchWorkflow.pleaseWait": "Mohon tunggu", "batchWorkflow.processed": "Diproses {{processed}}/{{total}} baris", @@ -63,6 +66,8 @@ "billingList.link": "Tautan", "billingList.open": "Perluas", "billingList.router": "Router", + "configuration.clearContext": "Konteks dibersihkan", + "configuration.restoreContext": "Klik untuk memulihkan konteks", "fileUploader.fileUpload": "Unggah file", "fileUploader.pasteFileLink": "Tempel tautan file", "fileUploader.pasteFileLinkInputPlaceholder": "Tempel tautan file di sini", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Gagal mengunggah file, silakan unggah ulang.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Pilih workspace", "sidebar.appCenter": "Pusat Aplikasi", - "sidebar.withDingTalk": "Masuk dengan DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Penemuan", + "sidebar.withDingTalk": "Masuk dengan DingTalk", + "user.credit": "Kredit", + "user.used": "Digunakan:" +} diff --git a/web/i18n/it-IT/extend.json b/web/i18n/it-IT/extend.json index 7a2de4c54..01a82678f 100644 --- a/web/i18n/it-IT/extend.json +++ b/web/i18n/it-IT/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "Disegno IA", "aiVideo.title": "Video AI", "aiVideo.translate": "Traduzione video", "apiKeyModal.accumulatedLimit": "Limite utilizzo cumulativo", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Sincronizza app con la pagina di esplorazione e crea tag correlati", "app.syncAppOk": "Sincronizzazione riuscita", "app.syncToAppTemplate": "Sincronizza con modello app", + "appCard.newConversation": "Nuova conversazione", "appCenter.description": "Qui di seguito è il centro app, dove puoi visualizzare le applicazioni categorizzate e utilizzarle", "appMenus.userOverview": "Panoramica utente", "batchWorkflow.batchJobs": "{{num}} attività batch", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Si è verificato un errore", "batchWorkflow.failed": "Non riuscito", "batchWorkflow.initializing": "Inizializzazione attività batch...", + "batchWorkflow.noBatchTasks": "Nessuna attività di elaborazione batch", "batchWorkflow.pending": "In attesa", "batchWorkflow.pleaseWait": "Si prega di attendere", "batchWorkflow.processed": "Elaborate {{processed}}/{{total}} righe", @@ -63,6 +66,8 @@ "billingList.link": "Link", "billingList.open": "Espandi", "billingList.router": "Router", + "configuration.clearContext": "Contesto cancellato", + "configuration.restoreContext": "Fare clic per ripristinare il contesto", "fileUploader.fileUpload": "Caricamento file", "fileUploader.pasteFileLink": "Incolla link file", "fileUploader.pasteFileLinkInputPlaceholder": "Incolla qui il link del file", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Caricamento file non riuscito, ricaricare.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Seleziona spazio di lavoro", "sidebar.appCenter": "Centro App", - "sidebar.withDingTalk": "Accedi con DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Scoperta", + "sidebar.withDingTalk": "Accedi con DingTalk", + "user.credit": "Credito", + "user.used": "Usato:" +} diff --git a/web/i18n/ja-JP/extend.json b/web/i18n/ja-JP/extend.json index cc8d2cc4d..bf8e547c0 100644 --- a/web/i18n/ja-JP/extend.json +++ b/web/i18n/ja-JP/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "AI 作図", "aiVideo.title": "AI ビデオ", "aiVideo.translate": "ビデオ翻訳", "apiKeyModal.accumulatedLimit": "累計使用制限", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "探索画面にアプリを同期し、関連するタグを作成", "app.syncAppOk": "同期に成功しました", "app.syncToAppTemplate": "アプリテンプレートに同期", + "appCard.newConversation": "新しい会話", "appCenter.description": "以下はアプリセンターです。ここでカテゴリ分けされたアプリを閲覧できます", "appMenus.userOverview": "個人モニタリング", "batchWorkflow.batchJobs": "{{num}} 個のバッチタスク", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "エラーが発生しました", "batchWorkflow.failed": "失敗", "batchWorkflow.initializing": "バッチタスクを初期化中...", + "batchWorkflow.noBatchTasks": "バッチ処理タスクがありません", "batchWorkflow.pending": "処理待ち", "batchWorkflow.pleaseWait": "お待ちください", "batchWorkflow.processed": "{{processed}}/{{total}} 行を処理済み", @@ -63,6 +66,8 @@ "billingList.link": "リンク", "billingList.open": "展開", "billingList.router": "ルーター", + "configuration.clearContext": "コンテキストがクリアされました", + "configuration.restoreContext": "クリックしてコンテキストを復元", "fileUploader.fileUpload": "ファイルアップロード", "fileUploader.pasteFileLink": "ファイルリンクを貼り付け", "fileUploader.pasteFileLinkInputPlaceholder": "ここにファイルリンクを貼り付けてください", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "ファイルのアップロードに失敗しました。もう一度アップロードしてください。", "modelSyncWorkspaceCustomize.workspacePlaceholder": "ワークスペースを選択", "sidebar.appCenter": "アプリセンター", - "sidebar.withDingTalk": "DingTalkでログイン" -} \ No newline at end of file + "sidebar.discovery": "発見", + "sidebar.withDingTalk": "DingTalkでログイン", + "user.credit": "クレジット", + "user.used": "使用済み:" +} diff --git a/web/i18n/ko-KR/extend.json b/web/i18n/ko-KR/extend.json index e93e3a7cc..d54dc7920 100644 --- a/web/i18n/ko-KR/extend.json +++ b/web/i18n/ko-KR/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "AI 그림", "aiVideo.title": "AI 비디오", "aiVideo.translate": "비디오 번역", "apiKeyModal.accumulatedLimit": "누적 사용 한도", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "탐색 화면에 앱 동기화 및 관련 태그 생성", "app.syncAppOk": "동기화 완료", "app.syncToAppTemplate": "앱 템플릿으로 동기화", + "appCard.newConversation": "새 대화", "appCenter.description": "앱 센터입니다. 여기서 분류된 앱을 보고 사용할 수 있습니다.", "appMenus.userOverview": "개인 모니터링", "batchWorkflow.batchJobs": "{{num}}개의 일괄 작업", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "오류가 발생했습니다", "batchWorkflow.failed": "실패", "batchWorkflow.initializing": "일괄 작업을 초기화하는 중...", + "batchWorkflow.noBatchTasks": "일괄 처리 작업 없음", "batchWorkflow.pending": "대기 중", "batchWorkflow.pleaseWait": "잠시만 기다려 주세요", "batchWorkflow.processed": "{{processed}}/{{total}}행 처리됨", @@ -63,6 +66,8 @@ "billingList.link": "링크", "billingList.open": "펼치기", "billingList.router": "라우터", + "configuration.clearContext": "컨텍스트가 지워졌습니다", + "configuration.restoreContext": "클릭하여 컨텍스트 복원", "fileUploader.fileUpload": "파일 업로드", "fileUploader.pasteFileLink": "파일 링크 붙여넣기", "fileUploader.pasteFileLinkInputPlaceholder": "여기에 파일 링크를 붙여넣으세요", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "파일 업로드 실패. 다시 업로드해 주세요.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "작업 공간 선택", "sidebar.appCenter": "앱 센터", - "sidebar.withDingTalk": "딩톡으로 로그인" -} \ No newline at end of file + "sidebar.discovery": "발견", + "sidebar.withDingTalk": "딩톡으로 로그인", + "user.credit": "크레딧", + "user.used": "사용됨:" +} diff --git a/web/i18n/pl-PL/extend.json b/web/i18n/pl-PL/extend.json index b8e0703cf..020c8e50a 100644 --- a/web/i18n/pl-PL/extend.json +++ b/web/i18n/pl-PL/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "Rysowanie AI", "aiVideo.title": "Wideo AI", "aiVideo.translate": "Tłumaczenie wideo", "apiKeyModal.accumulatedLimit": "Skumulowany limit użycia", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Synchronizuj aplikację z interfejsem odkrywania i powiąż utworzone tagi", "app.syncAppOk": "Synchronizacja zakończona sukcesem", "app.syncToAppTemplate": "Synchronizuj z szablonem aplikacji", + "appCard.newConversation": "Nowa rozmowa", "appCenter.description": "Oto Centrum Aplikacji, gdzie możesz zobaczyć sklasyfikowane aplikacje i z nich korzystać", "appMenus.userOverview": "Przegląd użytkownika", "batchWorkflow.batchJobs": "{{num}} zadań wsadowych", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Wystąpił błąd", "batchWorkflow.failed": "Nieudane", "batchWorkflow.initializing": "Inicjalizacja zadania wsadowego...", + "batchWorkflow.noBatchTasks": "Brak zadań przetwarzania wsadowego", "batchWorkflow.pending": "Oczekujące", "batchWorkflow.pleaseWait": "Proszę czekać", "batchWorkflow.processed": "Przetworzono {{processed}}/{{total}} wierszy", @@ -63,6 +66,8 @@ "billingList.link": "Link", "billingList.open": "Rozwiń", "billingList.router": "Router", + "configuration.clearContext": "Kontekst wyczyszczony", + "configuration.restoreContext": "Kliknij, aby przywrócić kontekst", "fileUploader.fileUpload": "Przesyłanie pliku", "fileUploader.pasteFileLink": "Wklej link do pliku", "fileUploader.pasteFileLinkInputPlaceholder": "Wklej link do pliku tutaj", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Przesyłanie pliku nie powiodło się, prześlij ponownie.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Wybierz przestrzeń roboczą", "sidebar.appCenter": "Centrum Aplikacji", - "sidebar.withDingTalk": "Zaloguj się za pomocą DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Odkrywanie", + "sidebar.withDingTalk": "Zaloguj się za pomocą DingTalk", + "user.credit": "Kredyt", + "user.used": "Użyto:" +} diff --git a/web/i18n/pt-BR/extend.json b/web/i18n/pt-BR/extend.json index 5071d765e..fc8f36c2b 100644 --- a/web/i18n/pt-BR/extend.json +++ b/web/i18n/pt-BR/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "Desenho IA", "aiVideo.title": "Vídeo de IA", "aiVideo.translate": "Tradução de vídeo", "apiKeyModal.accumulatedLimit": "Limite de uso acumulado", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Sincronizar aplicativo para a interface de exploração e criar tags relacionadas", "app.syncAppOk": "Sincronização bem-sucedida", "app.syncToAppTemplate": "Sincronizar para modelo de aplicativo", + "appCard.newConversation": "Nova conversa", "appCenter.description": "Aqui está o Centro de Aplicativos, onde você pode ver aplicativos categorizados e utilizá-los", "appMenus.userOverview": "Visão geral do usuário", "batchWorkflow.batchJobs": "{{num}} tarefas em lote", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Ocorreu um erro", "batchWorkflow.failed": "Falhou", "batchWorkflow.initializing": "Inicializando tarefa em lote...", + "batchWorkflow.noBatchTasks": "Nenhuma tarefa de processamento em lote", "batchWorkflow.pending": "Pendente", "batchWorkflow.pleaseWait": "Por favor, aguarde", "batchWorkflow.processed": "{{processed}}/{{total}} linhas processadas", @@ -63,6 +66,8 @@ "billingList.link": "Link", "billingList.open": "Expandir", "billingList.router": "Rota", + "configuration.clearContext": "Contexto limpo", + "configuration.restoreContext": "Clique para restaurar o contexto", "fileUploader.fileUpload": "Upload de arquivo", "fileUploader.pasteFileLink": "Colar link do arquivo", "fileUploader.pasteFileLinkInputPlaceholder": "Cole o link do arquivo aqui", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Falha no upload do arquivo, por favor, carregue novamente.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Escolher espaço de trabalho", "sidebar.appCenter": "Centro de Aplicativos", - "sidebar.withDingTalk": "Iniciar sessão com DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Descoberta", + "sidebar.withDingTalk": "Iniciar sessão com DingTalk", + "user.credit": "Crédito", + "user.used": "Usado:" +} diff --git a/web/i18n/ro-RO/extend.json b/web/i18n/ro-RO/extend.json index 65a900482..ebc5d41b8 100644 --- a/web/i18n/ro-RO/extend.json +++ b/web/i18n/ro-RO/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "Desen AI", "aiVideo.title": "Video AI", "aiVideo.translate": "Traducere video", "apiKeyModal.accumulatedLimit": "Limită de utilizare cumulată", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Sincronizează aplicația la interfața de explorare și creează etichete asociate", "app.syncAppOk": "Sincronizare reușită", "app.syncToAppTemplate": "Sincronizează la șablonul de aplicație", + "appCard.newConversation": "Conversație nouă", "appCenter.description": "Aceasta este Centrul de Aplicații, unde puteți vedea aplicațiile organizate pe categorii și le puteți utiliza", "appMenus.userOverview": "Monitorizare personală", "batchWorkflow.batchJobs": "{{num}} sarcini în lot", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "A apărut o eroare", "batchWorkflow.failed": "Eșuat", "batchWorkflow.initializing": "Se inițializează sarcina în lot...", + "batchWorkflow.noBatchTasks": "Nu există sarcini de procesare în lot", "batchWorkflow.pending": "În așteptare", "batchWorkflow.pleaseWait": "Vă rugăm să așteptați", "batchWorkflow.processed": "Procesate {{processed}}/{{total}} rânduri", @@ -63,6 +66,8 @@ "billingList.link": "Link", "billingList.open": "Deschide", "billingList.router": "Rută", + "configuration.clearContext": "Context șters", + "configuration.restoreContext": "Faceți clic pentru a restabili contextul", "fileUploader.fileUpload": "Încărcare fișier", "fileUploader.pasteFileLink": "Lipire link fișier", "fileUploader.pasteFileLinkInputPlaceholder": "Lipiți linkul fișierului aici", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Încărcarea fișierului a eșuat, vă rugăm să încărcați din nou.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Selectați spațiul de lucru", "sidebar.appCenter": "Centru de aplicații", - "sidebar.withDingTalk": "Conectați-vă cu DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Descoperire", + "sidebar.withDingTalk": "Conectați-vă cu DingTalk", + "user.credit": "Credit", + "user.used": "Folosit:" +} diff --git a/web/i18n/ru-RU/extend.json b/web/i18n/ru-RU/extend.json index 1446b2edd..82cec4116 100644 --- a/web/i18n/ru-RU/extend.json +++ b/web/i18n/ru-RU/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "AI Рисование", "aiVideo.title": "AI-видео", "aiVideo.translate": "Перевод видео", "apiKeyModal.accumulatedLimit": "Накопленный лимит использования", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Синхронизировать приложение со страницей \"Исследование\" и связать созданные теги", "app.syncAppOk": "Синхронизация успешна", "app.syncToAppTemplate": "Синхронизировать с шаблоном приложения", + "appCard.newConversation": "Новый разговор", "appCenter.description": "Ниже представлен Центр приложений, где вы можете просмотреть категоризированные приложения и использовать их", "appMenus.userOverview": "Личный обзор", "batchWorkflow.batchJobs": "{{num}} пакетных задач", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Произошла ошибка", "batchWorkflow.failed": "Не удалось", "batchWorkflow.initializing": "Инициализация пакетной задачи...", + "batchWorkflow.noBatchTasks": "Нет задач пакетной обработки", "batchWorkflow.pending": "В ожидании", "batchWorkflow.pleaseWait": "Пожалуйста, подождите", "batchWorkflow.processed": "Обработано {{processed}}/{{total}} строк", @@ -63,6 +66,8 @@ "billingList.link": "Ссылка", "billingList.open": "Развернуть", "billingList.router": "Маршрутизатор", + "configuration.clearContext": "Контекст очищен", + "configuration.restoreContext": "Нажмите, чтобы восстановить контекст", "fileUploader.fileUpload": "Загрузка файла", "fileUploader.pasteFileLink": "Вставить ссылку на файл", "fileUploader.pasteFileLinkInputPlaceholder": "Вставьте здесь ссылку на файл", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Не удалось загрузить файл, пожалуйста, загрузите его снова.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Выберите рабочее пространство", "sidebar.appCenter": "Центр приложений", - "sidebar.withDingTalk": "Войти с помощью DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Обнаружение", + "sidebar.withDingTalk": "Войти с помощью DingTalk", + "user.credit": "Кредит", + "user.used": "Использовано:" +} diff --git a/web/i18n/sl-SI/extend.json b/web/i18n/sl-SI/extend.json index 5bdd9f9c0..b977d286b 100644 --- a/web/i18n/sl-SI/extend.json +++ b/web/i18n/sl-SI/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "AI risanje", "aiVideo.title": "AI Video", "aiVideo.translate": "Prevod videoposnetka", "apiKeyModal.accumulatedLimit": "Skupna poraba", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Sinhroniziraj aplikacijo v raziskovalni vmesnik in ustvari povezane oznake", "app.syncAppOk": "Sinhronizacija uspešna", "app.syncToAppTemplate": "Sinhroniziraj v predlogo aplikacije", + "appCard.newConversation": "Nov pogovor", "appCenter.description": "To je center aplikacij, kjer lahko vidite razvrščene aplikacije in jih uporabljate", "appMenus.userOverview": "Pregled uporabnika", "batchWorkflow.batchJobs": "{{num}} paketnih nalog", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Prišlo je do napake", "batchWorkflow.failed": "Neuspešno", "batchWorkflow.initializing": "Inicializacija paketne naloge...", + "batchWorkflow.noBatchTasks": "Ni nalog za paketno obdelavo", "batchWorkflow.pending": "Na čakanju", "batchWorkflow.pleaseWait": "Prosimo počakajte", "batchWorkflow.processed": "Obdelanih {{processed}}/{{total}} vrstic", @@ -63,6 +66,8 @@ "billingList.link": "Povezava", "billingList.open": "Razširi", "billingList.router": "Usmerjevalnik", + "configuration.clearContext": "Kontekst počiščen", + "configuration.restoreContext": "Kliknite za obnovitev konteksta", "fileUploader.fileUpload": "Nalaganje datoteke", "fileUploader.pasteFileLink": "Prilepi povezavo do datoteke", "fileUploader.pasteFileLinkInputPlaceholder": "Tukaj prilepite povezavo do datoteke", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Nalaganje datoteke ni uspelo, prosimo poskusite znova.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Izberite delovni prostor", "sidebar.appCenter": "Center aplikacij", - "sidebar.withDingTalk": "Vpis z DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Odkritje", + "sidebar.withDingTalk": "Vpis z DingTalk", + "user.credit": "Kredit", + "user.used": "Uporabljeno:" +} diff --git a/web/i18n/th-TH/extend.json b/web/i18n/th-TH/extend.json index d0bdcb679..04bc9ca27 100644 --- a/web/i18n/th-TH/extend.json +++ b/web/i18n/th-TH/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "วาดภาพ AI", "aiVideo.title": "วิดีโอ AI", "aiVideo.translate": "แปลวิดีโอ", "apiKeyModal.accumulatedLimit": "ข้อจำกัดการใช้งานรวม", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "ซิงค์แอปไปยังหน้าค้นหาและเชื่อมโยงการสร้างแท็กที่เกี่ยวข้อง", "app.syncAppOk": "ซิงค์สำเร็จ", "app.syncToAppTemplate": "ซิงค์ไปยังแม่แบบแอป", + "appCard.newConversation": "การสนทนาใหม่", "appCenter.description": "นี่คือศูนย์แอป คุณสามารถดูแอปที่จัดประเภทและใช้งานได้ที่นี่", "appMenus.userOverview": "การติดตามส่วนบุคคล", "batchWorkflow.batchJobs": "{{num}} งานแบตช์", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "เกิดข้อผิดพลาด", "batchWorkflow.failed": "ล้มเหลว", "batchWorkflow.initializing": "กำลังเริ่มต้นงานแบตช์...", + "batchWorkflow.noBatchTasks": "ไม่มีงานประมวลผลแบบกลุ่ม", "batchWorkflow.pending": "กำลังรอดำเนินการ", "batchWorkflow.pleaseWait": "กรุณารอสักครู่", "batchWorkflow.processed": "ประมวลผลแล้ว {{processed}}/{{total}} แถว", @@ -63,6 +66,8 @@ "billingList.link": "ลิงก์", "billingList.open": "ขยาย", "billingList.router": "เส้นทาง", + "configuration.clearContext": "ล้างบริบทแล้ว", + "configuration.restoreContext": "คลิกเพื่อกู้คืนบริบท", "fileUploader.fileUpload": "อัปโหลดไฟล์", "fileUploader.pasteFileLink": "วางลิงก์ไฟล์", "fileUploader.pasteFileLinkInputPlaceholder": "วางลิงก์ไฟล์ที่นี่", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "อัปโหลดไฟล์ล้มเหลว กรุณาอัปโหลดใหม่อีกครั้ง。", "modelSyncWorkspaceCustomize.workspacePlaceholder": "เลือกพื้นที่ทำงาน", "sidebar.appCenter": "ศูนย์รับสมัครงาน", - "sidebar.withDingTalk": "เข้าสู่ระบบโดยใช้ DingTalk" -} \ No newline at end of file + "sidebar.discovery": "การค้นพบ", + "sidebar.withDingTalk": "เข้าสู่ระบบโดยใช้ DingTalk", + "user.credit": "เครดิต", + "user.used": "ใช้แล้ว:" +} diff --git a/web/i18n/tr-TR/extend.json b/web/i18n/tr-TR/extend.json index 415eccb11..c5b07ae98 100644 --- a/web/i18n/tr-TR/extend.json +++ b/web/i18n/tr-TR/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "AI Çizim", "aiVideo.title": "AI Video", "aiVideo.translate": "Video Çevirisi", "apiKeyModal.accumulatedLimit": "Toplam Kullanım Sınırı", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Uygulamayı Keşif Sayfasına Senkronize Et ve İlgili Etiketleri Oluştur", "app.syncAppOk": "Senkronizasyon Başarılı", "app.syncToAppTemplate": "Uygulama Şablonuna Senkronize Et", + "appCard.newConversation": "Yeni Konuşma", "appCenter.description": "İşte Uygulama Merkezi, kategorize edilmiş uygulamaları görüp kullanabileceğiniz yer", "appMenus.userOverview": "Kullanıcı Görünümü", "batchWorkflow.batchJobs": "{{num}} toplu görev", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Bir hata oluştu", "batchWorkflow.failed": "Başarısız", "batchWorkflow.initializing": "Toplu görev başlatılıyor...", + "batchWorkflow.noBatchTasks": "Toplu işleme görevi yok", "batchWorkflow.pending": "Beklemede", "batchWorkflow.pleaseWait": "Lütfen bekleyin", "batchWorkflow.processed": "{{processed}}/{{total}} satır işlendi", @@ -63,6 +66,8 @@ "billingList.link": "Bağlantı", "billingList.open": "Genişlet", "billingList.router": "Yönlendirici", + "configuration.clearContext": "Bağlam temizlendi", + "configuration.restoreContext": "Bağlamı geri yüklemek için tıklayın", "fileUploader.fileUpload": "Dosya Yükleme", "fileUploader.pasteFileLink": "Dosya Bağlantısını Yapıştır", "fileUploader.pasteFileLinkInputPlaceholder": "Dosya bağlantısını buraya yapıştırın", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Dosya yükleme hatası, lütfen tekrar yükleyin.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Çalışma Alanı Seç", "sidebar.appCenter": "Uygulama Merkezi", - "sidebar.withDingTalk": "DingTalk ile Giriş Yap" -} \ No newline at end of file + "sidebar.discovery": "Keşif", + "sidebar.withDingTalk": "DingTalk ile Giriş Yap", + "user.credit": "Kredi", + "user.used": "Kullanılan:" +} diff --git a/web/i18n/vi-VN/extend.json b/web/i18n/vi-VN/extend.json index 353ec0912..8a73fa3c1 100644 --- a/web/i18n/vi-VN/extend.json +++ b/web/i18n/vi-VN/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "Vẽ AI", "aiVideo.title": "Video AI", "aiVideo.translate": "Dịch video", "apiKeyModal.accumulatedLimit": "Mức sử dụng tích lũy", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "Đồng bộ hóa ứng dụng với giao diện khám phá và tạo các thẻ liên quan", "app.syncAppOk": "Đồng bộ hóa thành công", "app.syncToAppTemplate": "Đồng bộ hóa với mẫu ứng dụng", + "appCard.newConversation": "Cuộc trò chuyện mới", "appCenter.description": "Dưới đây là Trung tâm ứng dụng, nơi bạn có thể xem các ứng dụng được phân loại và sử dụng", "appMenus.userOverview": "Tổng quan người dùng", "batchWorkflow.batchJobs": "{{num}} tác vụ hàng loạt", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "Đã xảy ra lỗi", "batchWorkflow.failed": "Thất bại", "batchWorkflow.initializing": "Đang khởi tạo tác vụ hàng loạt...", + "batchWorkflow.noBatchTasks": "Không có tác vụ xử lý hàng loạt", "batchWorkflow.pending": "Đang chờ xử lý", "batchWorkflow.pleaseWait": "Vui lòng đợi", "batchWorkflow.processed": "Đã xử lý {{processed}}/{{total}} hàng", @@ -63,6 +66,8 @@ "billingList.link": "Liên kết", "billingList.open": "Mở rộng", "billingList.router": "Định tuyến", + "configuration.clearContext": "Đã xóa ngữ cảnh", + "configuration.restoreContext": "Nhấp để khôi phục ngữ cảnh", "fileUploader.fileUpload": "Tải lên tệp", "fileUploader.pasteFileLink": "Dán liên kết tệp", "fileUploader.pasteFileLinkInputPlaceholder": "Dán liên kết tệp tại đây", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "Tải lên tệp thất bại, vui lòng tải lên lại.", "modelSyncWorkspaceCustomize.workspacePlaceholder": "Chọn không gian làm việc", "sidebar.appCenter": "Trung tâm ứng dụng", - "sidebar.withDingTalk": "Đăng nhập bằng DingTalk" -} \ No newline at end of file + "sidebar.discovery": "Khám phá", + "sidebar.withDingTalk": "Đăng nhập bằng DingTalk", + "user.credit": "Tín dụng", + "user.used": "Đã sử dụng:" +} diff --git a/web/i18n/zh-Hans/extend.json b/web/i18n/zh-Hans/extend.json index 073a63b5e..3f8a1d981 100644 --- a/web/i18n/zh-Hans/extend.json +++ b/web/i18n/zh-Hans/extend.json @@ -79,5 +79,7 @@ "sidebar.appCenter": "应用中心", "sidebar.withDingTalk": "使用 钉钉 登录", "configuration.clearContext": "上下文已清除", - "configuration.restoreContext": "点击恢复上下文" + "configuration.restoreContext": "点击恢复上下文", + "sidebar.discovery": "发现", + "aiDraw.title": "AI 作图" } diff --git a/web/i18n/zh-Hant/extend.json b/web/i18n/zh-Hant/extend.json index 701a07020..67ae38793 100644 --- a/web/i18n/zh-Hant/extend.json +++ b/web/i18n/zh-Hant/extend.json @@ -1,4 +1,5 @@ { + "aiDraw.title": "AI 作圖", "aiVideo.title": "AI 視頻", "aiVideo.translate": "視頻翻譯", "apiKeyModal.accumulatedLimit": "累計使用額度", @@ -18,6 +19,7 @@ "app.confirmSyncAppContent": "同步應用至探索介面,並關聯創建相關標籤", "app.syncAppOk": "同步成功", "app.syncToAppTemplate": "同步至應用模板", + "appCard.newConversation": "新對話", "appCenter.description": "以下是應用中心,你可以在這裡看到分類好的應用,進行使用", "appMenus.userOverview": "個人監測", "batchWorkflow.batchJobs": "{{num}} 個批量任務", @@ -37,6 +39,7 @@ "batchWorkflow.errorOccurred": "發生錯誤", "batchWorkflow.failed": "失敗", "batchWorkflow.initializing": "正在初始化批量任務...", + "batchWorkflow.noBatchTasks": "暫無批量處理任務", "batchWorkflow.pending": "待處理", "batchWorkflow.pleaseWait": "請稍候", "batchWorkflow.processed": "已處理 {{processed}}/{{total}} 行", @@ -63,6 +66,8 @@ "billingList.link": "鏈接", "billingList.open": "展開", "billingList.router": "路由", + "configuration.clearContext": "上下文已清除", + "configuration.restoreContext": "點擊恢復上下文", "fileUploader.fileUpload": "文件上傳", "fileUploader.pasteFileLink": "粘貼文件鏈接", "fileUploader.pasteFileLinkInputPlaceholder": "將文件鏈接粘貼到此處", @@ -73,5 +78,8 @@ "fileUploader.uploadFromComputerUploadError": "文件上傳失敗,請重新上傳。", "modelSyncWorkspaceCustomize.workspacePlaceholder": "選擇工作空間", "sidebar.appCenter": "應用中心", - "sidebar.withDingTalk": "使用 釘釘 登錄" -} \ No newline at end of file + "sidebar.discovery": "發現", + "sidebar.withDingTalk": "使用 釘釘 登錄", + "user.credit": "額度", + "user.used": "已用:" +} diff --git a/web/package.json b/web/package.json index 69cc08bd3..c378a890a 100644 --- a/web/package.json +++ b/web/package.json @@ -86,6 +86,7 @@ "class-variance-authority": "0.7.1", "clsx": "2.1.1", "cmdk": "1.1.1", + "dingtalk-jsapi": "3.2.5", "copy-to-clipboard": "3.3.3", "cron-parser": "5.4.0", "dayjs": "1.11.19", @@ -109,6 +110,7 @@ "js-audio-recorder": "1.0.7", "js-cookie": "3.0.5", "js-yaml": "4.1.1", + "jschardet": "3.1.4", "jsonschema": "1.5.0", "katex": "0.16.25", "ky": "1.12.0", @@ -122,6 +124,7 @@ "next": "16.1.4", "next-themes": "0.4.6", "nuqs": "2.8.6", + "papaparse": "5.5.3", "pinyin-pro": "3.27.0", "qrcode.react": "4.2.0", "qs": "6.14.1", @@ -191,6 +194,7 @@ "@types/js-yaml": "4.0.9", "@types/negotiator": "0.6.4", "@types/node": "18.15.0", + "@types/papaparse": "5.5.2", "@types/qs": "6.14.0", "@types/react": "19.2.7", "@types/react-dom": "19.2.3", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index c98b57ee4..2aa5a5365 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -162,6 +162,9 @@ importers: decimal.js: specifier: 10.6.0 version: 10.6.0 + dingtalk-jsapi: + specifier: 3.2.5 + version: 3.2.5 dompurify: specifier: 3.3.0 version: 3.3.0 @@ -219,6 +222,9 @@ importers: js-yaml: specifier: 4.1.1 version: 4.1.1 + jschardet: + specifier: 3.1.4 + version: 3.1.4 jsonschema: specifier: 1.5.0 version: 1.5.0 @@ -258,6 +264,9 @@ importers: nuqs: specifier: 2.8.6 version: 2.8.6(next@16.1.4(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.93.2))(react@19.2.3) + papaparse: + specifier: 5.5.3 + version: 5.5.3 pinyin-pro: specifier: 3.27.0 version: 3.27.0 @@ -460,6 +469,9 @@ importers: '@types/node': specifier: 18.15.0 version: 18.15.0 + '@types/papaparse': + specifier: 5.5.2 + version: 5.5.2 '@types/qs': specifier: 6.14.0 version: 6.14.0 @@ -1842,155 +1854,183 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.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",