diff --git a/.gitignore b/.gitignore index 6551df0db5c1e364e13d77ca7fe9e0c85833b9b6..99bb000715abbc563af55ee7a39ab6f644863301 100644 --- a/.gitignore +++ b/.gitignore @@ -143,6 +143,7 @@ frontend/dist frontend/public/mock frontend/mock frontend/release +frontend/temp-bin # local env files .env.local diff --git a/README.en.md b/README.en.md index 33c3086ac7954952fc7e2dc5d793e4be18ef806f..691db5536813143b97c5479bb9208e8b7d4da151 100644 --- a/README.en.md +++ b/README.en.md @@ -18,13 +18,13 @@ sudo vim /etc/dev-store/mariadb/init_mariadb.conf 2. Initialize MariaDB: ```bash -sh /var/lib/dev-store/services/init_mariadb.sh auto +sudo sh /var/lib/dev-store/services/init_mariadb.sh auto ``` 3. Start the DevStore backend service: ```bash -systemctl start dev-store && systemctl enable dev-store +sudo systemctl start dev-store && sudo systemctl enable dev-store ``` 4. Click the sync button in the upper right corner of the interface, or restart DevStore. Start experiencing DevStore. diff --git a/README.md b/README.md index 32b76f3958a0afe2ec15d63d77a05cf6d50c54ba..aedc27b7bcb8f1e6be1b4bf2eb65ab3c0a7b180f 100644 --- a/README.md +++ b/README.md @@ -18,13 +18,13 @@ sudo vim /etc/dev-store/mariadb/init_mariadb.conf 2. 初始化 MariaDB: ```bash -sh /var/lib/dev-store/services/init_mariadb.sh auto +sudo sh /var/lib/dev-store/services/init_mariadb.sh auto ``` 3. 启动 DevStore 后端服务: ```bash -systemctl start dev-store && systemctl enable dev-store +sudo systemctl start dev-store && sudo systemctl enable dev-store ``` 4. 点击界面右上角的同步按钮,或者重启 DevStore。开始体验 DevStore。 diff --git a/backend/artifacts/serializers.py b/backend/artifacts/serializers.py index d6ed309cff410bbeb01903fe03f8de80f7c9c348..31ab1854fe1635c0ff48e6e2cae126291f441e89 100644 --- a/backend/artifacts/serializers.py +++ b/backend/artifacts/serializers.py @@ -20,9 +20,10 @@ from rest_framework import serializers from artifacts.models import MCPServer, OEDPPlugin from constants.choices import ArtifactTag +from constants.paths import MCP_SCRIPT_PATH from tasks.models import Task from utils.cmd_executor import CommandExecutor -from utils.common import is_process_running +from utils.common import is_process_running, validate_executable_file from utils.logger import init_log logger = init_log('run.log') @@ -96,6 +97,10 @@ class MCPDetailSerializer(serializers.ModelSerializer): app_list = serializers.SerializerMethodField() updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M") + def __init__(self, instance, user_name=None, *args, **kwargs): + super().__init__(instance, *args, **kwargs) + self.user_name = user_name + class Meta: model = MCPServer fields = ( @@ -132,16 +137,22 @@ class MCPDetailSerializer(serializers.ModelSerializer): return Task.Status.NOT_YET return Task.Status.SUCCESS - @staticmethod - def get_app_list(obj): - cmd = ["/var/lib/dev-store/src/mcp_manage.sh", "mcp-status", obj.package_name] + def get_app_list(self, obj): + # 校验MCP脚本文件 + is_valid, error_msg = validate_executable_file(MCP_SCRIPT_PATH) + if not is_valid: + logger.error(f"MCP script validation failed: {error_msg}") + return [] + + user_name = self.user_name if self.user_name else "" + cmd = [MCP_SCRIPT_PATH, "mcp-status", obj.package_name, user_name] executor = CommandExecutor(cmd, timeout=30) stdout, _, returncode = executor.run() if returncode == 0: # 成功执行 stdout = stdout.strip() if stdout else "" app_status_list = json.loads(stdout) return app_status_list - else: + else: return [] @staticmethod diff --git a/backend/artifacts/views.py b/backend/artifacts/views.py index 07ab7c6c7e447d8000907a3cace6ddcc7c80efde..a0bfb4b2392a63e6c96f371e41e01fac36ecbe77 100644 --- a/backend/artifacts/views.py +++ b/backend/artifacts/views.py @@ -29,7 +29,7 @@ from artifacts.serializers import ( ) from artifacts.tasks.install_mcp_task import InstallMCPTask from artifacts.utils import get_devstore_log -from utils.mcp_tools import get_mcp_status_in_apps, manage_mcp_config +from utils.mcp_tools import manage_mcp_config from constants.choices import ArtifactTag from tasks.models import Task from tasks.scheduler import scheduler, check_scheduler_load @@ -65,20 +65,6 @@ class ArtifactViewSet(viewsets.GenericViewSet): logger.info(msg) return Response({'is_success': True, 'message': msg, 'time': data_time}, status=status.HTTP_200_OK) - @action(methods=['POST'], detail=False, url_path='sync-mcp') - def sync_mcp_only(self, request): - """单独同步MCP服务信息(新增接口)""" - logger.info("==== API: [POST] /v1.0/artifacts/sync-mcp/ ====") - - # 只同步MCP服务信息 - result = MCPMethods.sync_mcps() - if not result['is_success']: - return Response(result, status=status.HTTP_500_INTERNAL_SERVER_ERROR) - - msg = "Sync MCP data successfully." - logger.info(msg) - return Response({'is_success': True, 'message': msg}, status=status.HTTP_200_OK) - @action(methods=['POST'], detail=False) @check_scheduler_load @@ -133,35 +119,6 @@ class ArtifactViewSet(viewsets.GenericViewSet): return Response(result, status=status_code) - @action(methods=['GET'], detail=False) - def mcp_apps_status(self, request): - """获取MCP在所有智能体应用中的配置状态""" - logger.info(f"==== API: [GET] /v1.0/artifacts/mcp_apps_status/ ====") - - # 获取必需参数 - package_name = request.query_params.get('package_name') - - # 参数验证 - if not package_name: - return Response( - {'is_success': False, 'message': f"Missing required parameter: package_name"}, - status=status.HTTP_400_BAD_REQUEST - ) - - logger.info(f"Querying MCP status in apps for: {package_name}") - - # 调用MCP状态查询方法 - result = get_mcp_status_in_apps(package_name) - - # 根据结果设置HTTP状态码 - status_code = result.get('status_code', status.HTTP_500_INTERNAL_SERVER_ERROR) - - # 创建响应并添加防缓存头 - response = Response(result, status=status_code) - response['Cache-Control'] = 'no-cache, no-store, must-revalidate' - response['Pragma'] = 'no-cache' - response['Expires'] = '0' - return Response(result, status=status_code) @action(methods=['POST'], detail=False) def mcp_config_manage(self, request): @@ -172,6 +129,7 @@ class ArtifactViewSet(viewsets.GenericViewSet): action = request.query_params.get('action') package_name = request.query_params.get('package_name') app_name = request.query_params.get('app_name') + user_name = request.query_params.get('user_name') # 参数验证 if not action: @@ -189,11 +147,16 @@ class ArtifactViewSet(viewsets.GenericViewSet): {'is_success': False, 'message': f"Missing required parameter: app_name"}, status=status.HTTP_400_BAD_REQUEST ) + if not user_name: + return Response( + {'is_success': False, 'message': f"Missing required parameter: user_name"}, + status=status.HTTP_400_BAD_REQUEST + ) - logger.info(f"Managing MCP config - action: {action}, mcp: {package_name}, app: {app_name}") + logger.info(f"Managing MCP config - action: {action}, mcp: {package_name}, app: {app_name}, user: {user_name}") # 调用MCP配置管理方法 - result = manage_mcp_config(action, package_name, app_name) + result = manage_mcp_config(action, package_name, app_name, user_name) # 根据结果设置HTTP状态码 status_code = result.get('status_code', status.HTTP_500_INTERNAL_SERVER_ERROR) @@ -235,6 +198,7 @@ class ArtifactViewSet(viewsets.GenericViewSet): logger.info(f'==== API: [GET] /v1.0/artifacts/details/ ====') key = request.query_params.get('key') tag = request.query_params.get('tag') + user_name = request.query_params.get('user_name') if tag == ArtifactTag.MCP: try: mcp_service = MCPServer.objects.get(key=key) @@ -242,7 +206,7 @@ class ArtifactViewSet(viewsets.GenericViewSet): msg = f"The MCP Server with key [{key}] does not exist." logger.error(msg) return Response({'is_success': False, 'message': msg}, status=status.HTTP_400_BAD_REQUEST) - serializer = MCPDetailSerializer(mcp_service) + serializer = MCPDetailSerializer(mcp_service, user_name) elif tag == ArtifactTag.OEDP: try: plugin = OEDPPlugin.objects.get(key=key) diff --git a/backend/constants/paths.py b/backend/constants/paths.py index f5fa16380134c1513a0e6374d94c4ea08c473dc7..73a57f6555541acf6471938031bc70133501b464 100644 --- a/backend/constants/paths.py +++ b/backend/constants/paths.py @@ -27,6 +27,11 @@ TASK_SCHEDULER_CONFIG_FILE = os.path.join(CONFIG_DIR, 'task_scheduler.conf') # 日志目录 LOG_DIR = '/var/log/dev-store' +# 源码目录 +SRC_DIR = '/var/lib/dev-store/src' +# /var/lib/dev-store/src/mcp_manage.sh MCP 管理脚本路径 +MCP_SCRIPT_PATH = os.path.join(SRC_DIR, 'mcp_manage.sh') + # /etc/oedp/config/repo/cache OEDP 插件缓存目录 PLUGIN_REPO_DIR = '/etc/oedp/config/repo/cache' # /etc/oedp/config/repo/details OEDP 插件配置信息缓存目录 diff --git a/backend/mcp_manage.sh b/backend/mcp_manage.sh index 0c79b410a6fafb1ebb31c3acfd5dc8266e433fc5..7c0b2f4df617d21fdfe9f88ec548b449541b1f6f 100755 --- a/backend/mcp_manage.sh +++ b/backend/mcp_manage.sh @@ -1,15 +1,36 @@ #!/bin/bash # mcp_manage.sh - MCP配置管理模块化版本,适合接口调用 -# 获取实际调用者用户名(支持 sudo / su 场景) -CALL_USER=$(logname 2>/dev/null || echo $SUDO_USER || echo $USER) -# 获取调用者 home 目录 -CALL_USER_HOME=$(getent passwd "$CALL_USER" | cut -d: -f6) +# 用户变量,通过命令参数设置 +CALL_USER="" +CALL_USER_HOME="" + +# 更新配置路径的函数 +update_config_paths() { + APP_CONFIG_PATHS=( + ["DeepChat"]="$CALL_USER_HOME/.config/DeepChat/mcp-settings.json" + ["roo-code"]="$CALL_USER_HOME/.config/VSCodium/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json" + ) +} + +# 设置用户和家目录的函数 +set_user_info() { + local user="$1" + if [[ -z "$user" ]]; then + fail "用户名不能为空" + fi + + CALL_USER="$user" + # 获取用户 home 目录 + CALL_USER_HOME=$(getent passwd "$CALL_USER" | cut -d: -f6) + if [[ -z "$CALL_USER_HOME" ]]; then + fail "无法获取用户 $CALL_USER 的家目录" + fi + # 更新配置路径 + update_config_paths +} # == 预定义路径 == -declare -A APP_CONFIG_PATHS=( - ["DeepChat"]="$CALL_USER_HOME/.config/DeepChat/mcp-settings.json" - ["roo-code"]="$CALL_USER_HOME/.config/VSCodium/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json" -) +declare -A APP_CONFIG_PATHS declare -A APP_DISPLAY_NAMES=( ["roo-code"]="roo-code" @@ -61,7 +82,7 @@ get_mcp_server_name_from_config() { # == 从配置文件中查找真实的服务器名称 == find_real_server_name() { - local mcp_name="$1" + local package_name="$1" local app="$2" local user_config user_config=$(get_app_config_path "$app") @@ -73,7 +94,7 @@ find_real_server_name() { # 通过 find_mcp_config_file 找到配置文件 local config_file - config_file=$(find_mcp_config_file "$mcp_name") + config_file=$(find_mcp_config_file "$package_name") if [[ $? -eq 0 && -f "$config_file" ]]; then # 从MCP配置文件中获取真实的服务器名称 @@ -174,13 +195,13 @@ normalize_mcp_config() { } write_config() { - local mcp_name="$1" + local package_name="$1" local app="$2" local config_file - config_file=$(find_mcp_config_file "$mcp_name") + config_file=$(find_mcp_config_file "$package_name") if [[ $? -ne 0 ]]; then - fail "找不到MCP配置文件: $mcp_name" + fail "找不到MCP配置文件: $package_name" fi if ! is_app_installed "$app"; then @@ -206,7 +227,7 @@ write_config() { } delete_config() { - local server_name="$1" + local package_name="$1" local app="$2" local user_config user_config=$(get_app_config_path "$app") @@ -217,10 +238,10 @@ delete_config() { # 使用find_real_server_name查找真实的服务器名称 local real_server_name - real_server_name=$(find_real_server_name "$server_name" "$app") + real_server_name=$(find_real_server_name "$package_name" "$app") if [[ -z "$real_server_name" ]]; then - fail "服务器 '$server_name' 不存在" + fail "包 '$package_name' 不存在" fi if jq "del(.mcpServers.\"$real_server_name\")" "$user_config" > "$user_config.tmp" 2>/dev/null; then @@ -233,13 +254,13 @@ delete_config() { } query_mcp_in_all_apps() { - local mcp_name="$1" + local package_name="$1" # 查找配置文件 local config_file - config_file=$(find_mcp_config_file "$mcp_name") + config_file=$(find_mcp_config_file "$package_name") if [[ $? -ne 0 ]]; then - json_error "本地找不到MCP: $mcp_name" + json_error "本地找不到MCP: $package_name" return 1 fi @@ -252,7 +273,7 @@ query_mcp_in_all_apps() { if is_app_installed "$app"; then local real_server_name - real_server_name=$(find_real_server_name "$mcp_name" "$app" 2>/dev/null) + real_server_name=$(find_real_server_name "$package_name" "$app" 2>/dev/null) if [[ $? -eq 0 ]] && [[ -n "$real_server_name" ]]; then mcp_status="added" @@ -279,21 +300,22 @@ MCP配置管理工具 (模块化接口版) 用法: $0 [参数] 命令: - status - 查询指定服务器在特定应用中的状态 - add - 添加MCP配置到指定应用 - del - 从指定应用删除MCP配置 - mcp-status - 查询指定MCP在所有应用中的配置状态 - help - 显示帮助 + add - 添加MCP配置到指定应用 + del - 从指定应用删除MCP配置 + mcp-status - 查询指定MCP在所有应用中的配置状态 + help - 显示帮助 支持的应用: roo-code - Roo Code (基于VSCodium) DeepChat - DeepChat独立应用 +参数说明: + user_name - 指定要操作的用户名,用于确定用户配置文件路径 + 示例: - $0 status oeDeploy roo-code # 查询oeDeploy在Roo Code中的状态 - $0 add oeDeploy roo-code # 将oeDeploy添加到Roo Code - $0 del mcp-oedp roo-code # 从Roo Code删除mcp-oedp - $0 mcp-status oeDeploy # 查看oeDeploy在所有应用中的配置状态 + $0 add oeDeploy roo-code alice # 将oeDeploy添加到alice用户的Roo Code + $0 del oeDeploy roo-code alice # 从alice用户的Roo Code删除oeDeploy + $0 mcp-status oeDeploy alice # 查看oeDeploy在alice用户的所有应用中的配置状态 EOF } @@ -307,15 +329,18 @@ shift case "$cmd" in add) - [[ $# -eq 2 ]] || fail "add 需要2个参数 " + [[ $# -eq 3 ]] || fail "add 需要3个参数 " + set_user_info "$3" write_config "$1" "$2" ;; del) - [[ $# -eq 2 ]] || fail "del 需要2个参数 " + [[ $# -eq 3 ]] || fail "del 需要3个参数 " + set_user_info "$3" delete_config "$1" "$2" ;; mcp-status) - [[ $# -eq 1 ]] || fail "mcp-status 需要1个参数 " + [[ $# -eq 2 ]] || fail "mcp-status 需要2个参数 " + set_user_info "$2" query_mcp_in_all_apps "$1" ;; help|*) diff --git a/backend/utils/common.py b/backend/utils/common.py index 83fe22377e3f0ae95c25336b9555370e4ddf00bd..d4576ec6301e01c29d8c8125428667aa1e8f47e1 100644 --- a/backend/utils/common.py +++ b/backend/utils/common.py @@ -12,6 +12,7 @@ # Create: 2025-07-18 # ====================================================================================================================== +import os import time import psutil @@ -35,3 +36,29 @@ def is_process_running(keyword, timeout=600): except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): continue return False + + +def validate_executable_file(file_path): + """ + 校验执行文件的存在性和可执行权限 + :param file_path: 要校验的文件路径 + :return: tuple (is_valid, error_message) + is_valid: bool, 文件是否有效 + error_message: str, 错误信息(如果有) + """ + if not file_path: + return False, "文件路径不能为空" + + # 检查文件是否存在 + if not os.path.exists(file_path): + return False, f"文件不存在: {file_path}" + + # 检查是否为文件 + if not os.path.isfile(file_path): + return False, f"路径不是文件: {file_path}" + + # 检查是否有可执行权限 + if not os.access(file_path, os.X_OK): + return False, f"文件没有可执行权限: {file_path}" + + return True, "" diff --git a/backend/utils/mcp_tools.py b/backend/utils/mcp_tools.py index 88aac5e8b02f6f2c0405986c6a179255b0127bd2..2d9ff3cf4eece0547393503c4727222858c8710f 100644 --- a/backend/utils/mcp_tools.py +++ b/backend/utils/mcp_tools.py @@ -11,47 +11,16 @@ # See the Mulan PSL v2 for more details. # Create: 2025-08-14 # ====================================================================================================================== -import json + from typing import Dict, Any from rest_framework import status +from constants.paths import MCP_SCRIPT_PATH from utils.cmd_executor import CommandExecutor +from utils.common import validate_executable_file -def get_mcp_status_in_apps(package_name: str) -> Dict[str, Any]: - """获取指定MCP在所有智能体应用中的配置状态""" - try: - cmd = ["/var/lib/dev-store/src/mcp_manage.sh", "mcp-status", package_name] - executor = CommandExecutor(cmd, timeout=30) - stdout, stderr, returncode = executor.run() - if returncode == 0: # 成功执行 - stdout = stdout.strip() if stdout else "" - app_status_list = json.loads(stdout) - return { - "is_success": True, - "data": app_status_list, - "message": "Query successful", - "status_code": status.HTTP_200_OK - } - else: # 执行失败 - error_msg = stderr or stdout or "Query failed" - return { - "is_success": False, - "data": [], - "message": error_msg, - "status_code": status.HTTP_400_BAD_REQUEST - } - - except Exception as e: - return { - "is_success": False, - "data": [], - "message": f"Query error: {str(e)}", - "status_code": status.HTTP_500_INTERNAL_SERVER_ERROR - } - - -def manage_mcp_config(action: str, package_name: str, app_name: str) -> Dict[str, Any]: +def manage_mcp_config(action: str, package_name: str, app_name: str, user_name: str) -> Dict[str, Any]: """管理MCP配置(添加或删除)""" if action not in ["add", "delete"]: return { @@ -59,10 +28,19 @@ def manage_mcp_config(action: str, package_name: str, app_name: str) -> Dict[str "message": "Invalid action type", "status_code": status.HTTP_400_BAD_REQUEST } - + + # 校验MCP脚本文件 + is_valid, error_msg = validate_executable_file(MCP_SCRIPT_PATH) + if not is_valid: + return { + "is_success": False, + "message": f"MCP script validation failed: {error_msg}", + "status_code": status.HTTP_500_INTERNAL_SERVER_ERROR + } + try: script_cmd = "add" if action == "add" else "del" - cmd = ["/var/lib/dev-store/src/mcp_manage.sh", script_cmd, package_name, app_name] + cmd = [MCP_SCRIPT_PATH, script_cmd, package_name, app_name, user_name] executor = CommandExecutor(cmd, timeout=30) stdout, stderr, returncode = executor.run() diff --git a/build/build.sh b/build/build.sh index 599752fdcf4d422b2075a76bd6a5627782583c83..9ca2cec8a819f4084bc199fe0caa7b39b84e3e5e 100755 --- a/build/build.sh +++ b/build/build.sh @@ -48,9 +48,14 @@ show_help() { $0 完整构建(包括前端和后端) $0 --skip-frontend 跳过前端构建,仅打包RPM +架构支持: + 脚本会自动检测当前系统架构(x86_64 或 aarch64/arm64) + 并使用统一的构建流程。 + 注意: - 使用 --skip-frontend 选项时,请确保 frontend/release/linux-unpacked 目录存在 - 且包含有效的前端构建结果。 + - 使用 --skip-frontend 选项时,请确保对应架构的构建结果目录存在 + x86_64: frontend/release/linux-unpacked + ARM64: frontend/release/linux-arm64-unpacked EOF } @@ -169,6 +174,23 @@ get_system_arch() { esac } +# 获取RPM架构名称 +get_rpm_arch() { + local arch=$(uname -m) + case "$arch" in + x86_64) + echo "x86_64" + ;; + aarch64|arm64) + echo "aarch64" + ;; + *) + log_error "不支持的架构: $arch" + exit 1 + ;; + esac +} + # 构建前端 build_frontend() { if [ "$SKIP_FRONTEND" = true ]; then @@ -176,15 +198,25 @@ build_frontend() { cd "$PROJECT_ROOT/frontend" + # 获取当前架构以确定正确的目录名 + local target_arch=$(get_system_arch) + local expected_dir="" + + if [ "$target_arch" = "arm64" ]; then + expected_dir="release/linux-arm64-unpacked" + else + expected_dir="release/linux-unpacked" + fi + # 检查是否存在已构建的前端文件 - if [ ! -d "release/linux-unpacked" ]; then - log_error "未找到已构建的前端文件目录: release/linux-unpacked" + if [ ! -d "$expected_dir" ]; then + log_error "未找到已构建的前端文件目录: $expected_dir" log_error "请先运行完整构建或移除 --skip-frontend 选项" exit 1 fi # 检查关键文件是否存在 - if [ ! -f "release/linux-unpacked/dev-store-app" ]; then + if [ ! -f "$expected_dir/dev-store-app" ]; then log_error "前端构建结果不完整,缺少主执行文件" log_error "请重新运行完整构建" exit 1 @@ -216,11 +248,30 @@ build_frontend() { # 使用 electron-builder 构建 RPM 包,指定架构 log_info "构建 Electron 应用 ($target_arch)..." - npx electron-builder --linux rpm --$target_arch - # 检查构建结果 - if [ ! -d "release/linux-unpacked" ]; then - log_error "前端构建失败,未找到 linux-unpacked 目录" + # 设置环境变量以确保正确的架构构建 + export TARGET_ARCH=$target_arch + + # 根据架构选择正确的构建命令 + if [ "$target_arch" = "arm64" ]; then + npx electron-builder --linux rpm --arm64 + else + npx electron-builder --linux rpm --x64 + fi + + # 检查构建结果(根据架构调整目录名) + local expected_dir="" + if [ "$target_arch" = "arm64" ]; then + expected_dir="release/linux-arm64-unpacked" + else + expected_dir="release/linux-unpacked" + fi + + if [ ! -d "$expected_dir" ]; then + log_error "前端构建失败,未找到 $expected_dir 目录" + # 列出实际生成的目录以便调试 + log_info "实际生成的目录:" + ls -la release/ || true exit 1 fi @@ -255,8 +306,26 @@ prepare_frontend() { rm -rf "$temp_frontend" mkdir -p "$temp_frontend" - # 复制前端构建结果 - cp -rf "$PROJECT_ROOT/frontend/release/linux-unpacked" "$temp_frontend/" + # 获取当前架构以确定正确的目录名 + local target_arch=$(get_system_arch) + local source_dir="" + + if [ "$target_arch" = "arm64" ]; then + source_dir="$PROJECT_ROOT/frontend/release/linux-arm64-unpacked" + else + source_dir="$PROJECT_ROOT/frontend/release/linux-unpacked" + fi + + # 检查源目录是否存在 + if [ ! -d "$source_dir" ]; then + log_error "未找到前端构建结果目录: $source_dir" + log_info "可用的目录:" + ls -la "$PROJECT_ROOT/frontend/release/" || true + exit 1 + fi + + # 复制前端构建结果,并重命名为统一的目录名 + cp -rf "$source_dir" "$temp_frontend/linux-unpacked" log_info "前端文件准备完成" } @@ -268,23 +337,15 @@ create_source_package() { cd "$BUILD_DIR" # 获取当前架构 - local target_arch=$(get_system_arch) - local rpm_arch - case "$target_arch" in - x64) - rpm_arch="x86_64" - ;; - arm64) - rpm_arch="aarch64" - ;; - esac + local rpm_arch=$(get_rpm_arch) + log_info "目标架构: $rpm_arch" # 获取版本号 local version=$(get_version_from_spec) log_info "从spec文件中读取的版本号: $version" # 创建源码包目录 - local source_dir="dev-store-$version" + local source_dir="dev-store-$version-$rpm_arch" rm -rf "$source_dir" mkdir -p "$source_dir" @@ -369,11 +430,13 @@ EOF cp "$PROJECT_ROOT/README.en.md" "$source_dir/" 2>/dev/null || true cp "$PROJECT_ROOT/LICENSE" "$source_dir/" 2>/dev/null || true - # 创建tar.gz源码包 - tar -czf "dev-store-$version.tar.gz" "$source_dir" + # 创建tar.gz源码包(包含架构信息) + local tarball_name="dev-store-$version-$rpm_arch.tar.gz" + tar -czf "$tarball_name" "$source_dir" + log_info "已创建源码包: $tarball_name" # 移动到RPM构建目录 - mv "dev-store-$version.tar.gz" "$WORKSPACE_DIR/rpmbuild/SOURCES/" + mv "$tarball_name" "$WORKSPACE_DIR/rpmbuild/SOURCES/" # 复制spec文件 cp "dev-store.spec" "$WORKSPACE_DIR/rpmbuild/SPECS/" diff --git a/build/clean.sh b/build/clean.sh index db95fd4a61f20ee448588d0ba07697728089c03e..db7876c74da1f0f8dee16e550c33d40b7d00637d 100755 --- a/build/clean.sh +++ b/build/clean.sh @@ -57,16 +57,21 @@ clean_build_dir() { log_info "已清理 temp_backend 目录" fi - # 清理源码包 - if [ -f "dev-store-1.0.0.tar.gz" ]; then - rm -f dev-store-1.0.0.tar.gz - log_info "已清理源码包" - fi + # 清理源码包(支持任意版本号和架构) + for tarball in dev-store-*.tar.gz; do + if [ -f "$tarball" ]; then + rm -f "$tarball" + log_info "已清理源码包: $tarball" + fi + done - if [ -d "dev-store-1.0.0" ]; then - rm -rf dev-store-1.0.0 - log_info "已清理源码目录" - fi + # 清理所有版本的源码目录(支持任意版本号和架构) + for dir in dev-store-*; do + if [ -d "$dir" ]; then + rm -rf "$dir" + log_info "已清理源码目录: $dir" + fi + done } # 清理RPM构建环境 @@ -112,6 +117,22 @@ clean_frontend() { rm -rf release log_info "已清理 release 目录" fi + + +} + +# 清理 electron-builder 缓存 +clean_electron_cache() { + log_info "清理 electron-builder 缓存..." + + local cache_dir="$HOME/.cache/electron-builder" + + if [ -d "$cache_dir" ]; then + rm -rf "$cache_dir" + log_info "已清理 electron-builder 缓存目录: $cache_dir" + else + log_warn "electron-builder 缓存目录不存在,无需清理" + fi } # 显示帮助信息 @@ -119,12 +140,18 @@ show_help() { echo "用法: $0 [选项]" echo "" echo "选项:" - echo " --all 清理所有文件,包括node_modules和package-lock.json" + echo " --all 清理所有文件,包括node_modules、package-lock.json和electron-builder缓存" echo " --rpmbuild 仅清理RPM构建环境" echo " --frontend 仅清理前端构建产物" echo " --build 仅清理构建目录临时文件" + echo " --cache 仅清理electron-builder缓存" echo " -h, --help 显示此帮助信息" echo "" + echo "架构支持:" + echo " 脚本会自动清理所有架构的构建产物,包括:" + echo " - x86_64: release/linux-unpacked" + echo " - ARM64: release/linux-arm64-unpacked" + echo "" echo "默认行为: 清理构建目录临时文件" } @@ -135,6 +162,7 @@ main() { clean_build_dir clean_rpmbuild clean_frontend --all + clean_electron_cache ;; --rpmbuild) clean_rpmbuild @@ -145,6 +173,9 @@ main() { --build) clean_build_dir ;; + --cache) + clean_electron_cache + ;; -h|--help) show_help exit 0 diff --git a/build/dev-store.spec b/build/dev-store.spec index e7fd83545a62316c803057d5ae94ea36e6e0743a..48f9d55f3a69cde821db2bd8d40401a46ad7de16 100644 --- a/build/dev-store.spec +++ b/build/dev-store.spec @@ -3,13 +3,13 @@ Name: dev-store Version: 1.0.0 -Release: 1%{?dist} +Release: 1 Summary: Development Store Management System Group: Development/Tools License: MulanPSL-2.0 -URL: https://github.com/huawei/dev-store -Source0: %{name}-%{version}.tar.gz +URL: https://gitee.com/openeuler/DevStore +Source0: %{name}-%{version}-%{_target_cpu}.tar.gz # 依赖包 Requires: python3-django-rest-framework @@ -37,7 +37,7 @@ artifacts, and services. The system includes a modern Electron-based desktop application and a Django-based backend API. %prep -%setup -q +%setup -q -n %{name}-%{version}-%{_target_cpu} %build # 无需编译步骤 @@ -205,7 +205,7 @@ if [ $1 -eq 0 ]; then fi %changelog -* Mon Jan 27 2025 Huawei Technologies Co., Ltd. - 1.0.0-1 +* Tue Aug 19 2025 dingjiahui - 1.0.0-1 - Initial release of DevStore - Includes frontend Electron application - Includes backend Django application diff --git a/frontend/.npmrc b/frontend/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..cf1d46abbdb612690898656a139851ebef99532e --- /dev/null +++ b/frontend/.npmrc @@ -0,0 +1,2 @@ +electron_mirror="https://npmmirror.com/mirrors/electron/" +electron_builder_binaries_mirror="https://npmmirror.com/mirrors/electron-builder-binaries/" \ No newline at end of file diff --git a/frontend/electron/ipc.js b/frontend/electron/ipc.js index d77ad8d347b835dd2e3ccb6624d8acc846a32c4d..e24b9ccd42e9ed277dcfae7ac2cd3076143df52e 100644 --- a/frontend/electron/ipc.js +++ b/frontend/electron/ipc.js @@ -14,12 +14,39 @@ const { app, ipcMain } = require('electron') const { execSync } = require('child_process') const fs = require('fs') const path = require('path') +const os = require('os') function registerIpcListeners() { ipcMain.on('close-app', () => { app.quit() }) + // 获取当前系统用户名 + ipcMain.handle('get-username', () => { + try { + // 优先使用 os.userInfo() 获取用户信息 + const userInfo = os.userInfo() + return { success: true, username: userInfo.username } + } catch (error) { + try { + // 如果 os.userInfo() 失败,尝试使用环境变量 + const username = process.env.USER || process.env.USERNAME || process.env.LOGNAME + if (username) { + return { success: true, username } + } + // 最后尝试使用 whoami 命令 + const whoami = execSync('whoami', { encoding: 'utf8' }).trim() + return { success: true, username: whoami } + } catch (fallbackError) { + return { + success: false, + error: fallbackError instanceof Error ? fallbackError.message : 'Unknown error', + username: 'unknown' + } + } + } + }) + // 用户管理 ipcMain.handle('create-user', (_event, { username, password }) => { try { diff --git a/frontend/electron/preload.js b/frontend/electron/preload.js index de181f0c8a85eb8d1baf5bde1cf4979dbfd99e84..669a4f0ec6b0dd2e3770fe3922c8e91939933c2e 100644 --- a/frontend/electron/preload.js +++ b/frontend/electron/preload.js @@ -14,5 +14,6 @@ const { contextBridge, ipcRenderer } = require('electron') contextBridge.exposeInMainWorld('electronAPI', { invoke: (channel, ...args) => ipcRenderer.invoke(channel, ...args), - closeApp: () => ipcRenderer.send('close-app') + closeApp: () => ipcRenderer.send('close-app'), + getUsername: () => ipcRenderer.invoke('get-username') }) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1d70ef3b823c9408e349e561090d0f1dbb19dda0..f428c62365b690a43d8cc06a9681396f282e691f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -33,7 +33,7 @@ "@vue/tsconfig": "^0.7.0", "concurrently": "^9.2.0", "cross-env": "^7.0.3", - "electron": "^37.3.0", + "electron": "^37.3.1", "electron-builder": "^26.0.12", "eslint": "^9.33.0", "eslint-config-prettier": "^10.1.8", @@ -69,12 +69,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.28.2" }, "bin": { "parser": "bin/babel-parser.js" @@ -97,9 +97,9 @@ } }, "node_modules/@bufbuild/protobuf": { - "version": "2.6.3", - "resolved": "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.6.3.tgz", - "integrity": "sha512-w/gJKME9mYN7ZoUAmSMAWXk4hkVpxRKvEJCb3dV5g9wwWdxTJJ0ayOJAVcNxtdqaxDyFuC0uz4RSGVacJ030PQ==", + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.7.0.tgz", + "integrity": "sha512-qn6tAIZEw5i/wiESBF4nQxZkl86aY4KoO0IkUa2Lh+rya64oTOdJQFlZuMwI1Qz9VBJQrQC4QlSA2DNek5gCOA==", "devOptional": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, @@ -143,9 +143,9 @@ } }, "node_modules/@codemirror/language": { - "version": "6.11.2", - "resolved": "https://registry.npmmirror.com/@codemirror/language/-/language-6.11.2.tgz", - "integrity": "sha512-p44TsNArL4IVXDTbapUmEkAlvWs2CFQbcfc0ymDsis1kH2wh0gcY96AS29c/vp2d0y2Tquk1EDSaawpzilUiAw==", + "version": "6.11.3", + "resolved": "https://registry.npmmirror.com/@codemirror/language/-/language-6.11.3.tgz", + "integrity": "sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -315,9 +315,9 @@ } }, "node_modules/@electron/fuses/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -460,9 +460,9 @@ } }, "node_modules/@electron/notarize/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -533,9 +533,9 @@ } }, "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -600,9 +600,9 @@ } }, "node_modules/@electron/rebuild/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -657,9 +657,9 @@ } }, "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -719,9 +719,9 @@ } }, "node_modules/@electron/windows-sign/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "optional": true, @@ -755,9 +755,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", - "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", "cpu": [ "ppc64" ], @@ -771,9 +771,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.8.tgz", - "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", "cpu": [ "arm" ], @@ -787,9 +787,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", - "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", "cpu": [ "arm64" ], @@ -803,9 +803,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.8.tgz", - "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", "cpu": [ "x64" ], @@ -819,9 +819,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", - "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", "cpu": [ "arm64" ], @@ -835,9 +835,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", - "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", "cpu": [ "x64" ], @@ -851,9 +851,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", - "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", "cpu": [ "arm64" ], @@ -867,9 +867,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", - "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", "cpu": [ "x64" ], @@ -883,9 +883,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", - "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", "cpu": [ "arm" ], @@ -899,9 +899,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", - "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", "cpu": [ "arm64" ], @@ -915,9 +915,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", - "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", "cpu": [ "ia32" ], @@ -931,9 +931,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", - "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", "cpu": [ "loong64" ], @@ -947,9 +947,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", - "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", "cpu": [ "mips64el" ], @@ -963,9 +963,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", - "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", "cpu": [ "ppc64" ], @@ -979,9 +979,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", - "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", "cpu": [ "riscv64" ], @@ -995,9 +995,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", - "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", "cpu": [ "s390x" ], @@ -1011,9 +1011,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", - "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", "cpu": [ "x64" ], @@ -1027,9 +1027,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", - "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", "cpu": [ "arm64" ], @@ -1043,9 +1043,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", - "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", "cpu": [ "x64" ], @@ -1059,9 +1059,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", - "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", "cpu": [ "arm64" ], @@ -1075,9 +1075,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", - "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", "cpu": [ "x64" ], @@ -1091,9 +1091,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", - "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", "cpu": [ "arm64" ], @@ -1107,9 +1107,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", - "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", "cpu": [ "x64" ], @@ -1123,9 +1123,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", - "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", "cpu": [ "arm64" ], @@ -1139,9 +1139,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", - "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", "cpu": [ "ia32" ], @@ -1155,9 +1155,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", - "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", "cpu": [ "x64" ], @@ -1570,9 +1570,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", "dev": true, "license": "MIT", "engines": { @@ -1654,12 +1654,55 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@lezer/common": { "version": "1.2.3", "resolved": "https://registry.npmmirror.com/@lezer/common/-/common-1.2.3.tgz", @@ -1751,9 +1794,9 @@ } }, "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -2206,9 +2249,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", - "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.3.tgz", + "integrity": "sha512-UmTdvXnLlqQNOCJnyksjPs1G4GqXNGW1LrzCe8+8QoaLhhDeTXYBgJ3k6x61WIhlHX2U+VzEJ55TtIjR/HTySA==", "cpu": [ "arm" ], @@ -2219,9 +2262,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", - "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.3.tgz", + "integrity": "sha512-8NoxqLpXm7VyeI0ocidh335D6OKT0UJ6fHdnIxf3+6oOerZZc+O7r+UhvROji6OspyPm+rrIdb1gTXtVIqn+Sg==", "cpu": [ "arm64" ], @@ -2232,9 +2275,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", - "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.3.tgz", + "integrity": "sha512-csnNavqZVs1+7/hUKtgjMECsNG2cdB8F7XBHP6FfQjqhjF8rzMzb3SLyy/1BG7YSfQ+bG75Ph7DyedbUqwq1rA==", "cpu": [ "arm64" ], @@ -2245,9 +2288,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", - "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.3.tgz", + "integrity": "sha512-r2MXNjbuYabSIX5yQqnT8SGSQ26XQc8fmp6UhlYJd95PZJkQD1u82fWP7HqvGUf33IsOC6qsiV+vcuD4SDP6iw==", "cpu": [ "x64" ], @@ -2258,9 +2301,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", - "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.3.tgz", + "integrity": "sha512-uluObTmgPJDuJh9xqxyr7MV61Imq+0IvVsAlWyvxAaBSNzCcmZlhfYcRhCdMaCsy46ccZa7vtDDripgs9Jkqsw==", "cpu": [ "arm64" ], @@ -2271,9 +2314,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", - "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.3.tgz", + "integrity": "sha512-AVJXEq9RVHQnejdbFvh1eWEoobohUYN3nqJIPI4mNTMpsyYN01VvcAClxflyk2HIxvLpRcRggpX1m9hkXkpC/A==", "cpu": [ "x64" ], @@ -2284,9 +2327,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", - "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.3.tgz", + "integrity": "sha512-byyflM+huiwHlKi7VHLAYTKr67X199+V+mt1iRgJenAI594vcmGGddWlu6eHujmcdl6TqSNnvqaXJqZdnEWRGA==", "cpu": [ "arm" ], @@ -2297,9 +2340,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", - "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.3.tgz", + "integrity": "sha512-aLm3NMIjr4Y9LklrH5cu7yybBqoVCdr4Nvnm8WB7PKCn34fMCGypVNpGK0JQWdPAzR/FnoEoFtlRqZbBBLhVoQ==", "cpu": [ "arm" ], @@ -2310,9 +2353,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", - "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.3.tgz", + "integrity": "sha512-VtilE6eznJRDIoFOzaagQodUksTEfLIsvXymS+UdJiSXrPW7Ai+WG4uapAc3F7Hgs791TwdGh4xyOzbuzIZrnw==", "cpu": [ "arm64" ], @@ -2323,9 +2366,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", - "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.3.tgz", + "integrity": "sha512-dG3JuS6+cRAL0GQ925Vppafi0qwZnkHdPeuZIxIPXqkCLP02l7ka+OCyBoDEv8S+nKHxfjvjW4OZ7hTdHkx8/w==", "cpu": [ "arm64" ], @@ -2336,9 +2379,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", - "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.3.tgz", + "integrity": "sha512-iU8DxnxEKJptf8Vcx4XvAUdpkZfaz0KWfRrnIRrOndL0SvzEte+MTM7nDH4A2Now4FvTZ01yFAgj6TX/mZl8hQ==", "cpu": [ "loong64" ], @@ -2349,9 +2392,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", - "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.3.tgz", + "integrity": "sha512-VrQZp9tkk0yozJoQvQcqlWiqaPnLM6uY1qPYXvukKePb0fqaiQtOdMJSxNFUZFsGw5oA5vvVokjHrx8a9Qsz2A==", "cpu": [ "ppc64" ], @@ -2362,9 +2405,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", - "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.3.tgz", + "integrity": "sha512-uf2eucWSUb+M7b0poZ/08LsbcRgaDYL8NCGjUeFMwCWFwOuFcZ8D9ayPl25P3pl+D2FH45EbHdfyUesQ2Lt9wA==", "cpu": [ "riscv64" ], @@ -2375,9 +2418,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", - "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.3.tgz", + "integrity": "sha512-7tnUcDvN8DHm/9ra+/nF7lLzYHDeODKKKrh6JmZejbh1FnCNZS8zMkZY5J4sEipy2OW1d1Ncc4gNHUd0DLqkSg==", "cpu": [ "riscv64" ], @@ -2388,9 +2431,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", - "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.3.tgz", + "integrity": "sha512-MUpAOallJim8CsJK+4Lc9tQzlfPbHxWDrGXZm2z6biaadNpvh3a5ewcdat478W+tXDoUiHwErX/dOql7ETcLqg==", "cpu": [ "s390x" ], @@ -2401,9 +2444,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", - "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.3.tgz", + "integrity": "sha512-F42IgZI4JicE2vM2PWCe0N5mR5vR0gIdORPqhGQ32/u1S1v3kLtbZ0C/mi9FFk7C5T0PgdeyWEPajPjaUpyoKg==", "cpu": [ "x64" ], @@ -2414,9 +2457,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", - "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.3.tgz", + "integrity": "sha512-oLc+JrwwvbimJUInzx56Q3ujL3Kkhxehg7O1gWAYzm8hImCd5ld1F2Gry5YDjR21MNb5WCKhC9hXgU7rRlyegQ==", "cpu": [ "x64" ], @@ -2427,9 +2470,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", - "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.3.tgz", + "integrity": "sha512-lOrQ+BVRstruD1fkWg9yjmumhowR0oLAAzavB7yFSaGltY8klttmZtCLvOXCmGE9mLIn8IBV/IFrQOWz5xbFPg==", "cpu": [ "arm64" ], @@ -2440,9 +2483,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", - "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.3.tgz", + "integrity": "sha512-vvrVKPRS4GduGR7VMH8EylCBqsDcw6U+/0nPDuIjXQRbHJc6xOBj+frx8ksfZAh6+Fptw5wHrN7etlMmQnPQVg==", "cpu": [ "ia32" ], @@ -2453,9 +2496,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", - "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.3.tgz", + "integrity": "sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ==", "cpu": [ "x64" ], @@ -2622,9 +2665,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.2.1", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.2.1.tgz", - "integrity": "sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==", + "version": "24.3.0", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "license": "MIT", "dependencies": { "undici-types": "~7.10.0" @@ -2692,17 +2735,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.1.tgz", - "integrity": "sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", + "integrity": "sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/type-utils": "8.39.1", - "@typescript-eslint/utils": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/type-utils": "8.40.0", + "@typescript-eslint/utils": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -2716,22 +2759,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.39.1", + "@typescript-eslint/parser": "^8.40.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.39.1.tgz", - "integrity": "sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.40.0.tgz", + "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "debug": "^4.3.4" }, "engines": { @@ -2747,14 +2790,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", - "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.40.0.tgz", + "integrity": "sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.1", - "@typescript-eslint/types": "^8.39.1", + "@typescript-eslint/tsconfig-utils": "^8.40.0", + "@typescript-eslint/types": "^8.40.0", "debug": "^4.3.4" }, "engines": { @@ -2769,14 +2812,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", - "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.40.0.tgz", + "integrity": "sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1" + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2787,9 +2830,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", - "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.40.0.tgz", + "integrity": "sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==", "dev": true, "license": "MIT", "engines": { @@ -2804,15 +2847,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.39.1.tgz", - "integrity": "sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz", + "integrity": "sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1", - "@typescript-eslint/utils": "8.39.1", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/utils": "8.40.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -2829,9 +2872,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.39.1.tgz", - "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.40.0.tgz", + "integrity": "sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==", "dev": true, "license": "MIT", "engines": { @@ -2843,16 +2886,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", - "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.40.0.tgz", + "integrity": "sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.39.1", - "@typescript-eslint/tsconfig-utils": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/project-service": "8.40.0", + "@typescript-eslint/tsconfig-utils": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2872,16 +2915,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.39.1.tgz", - "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.40.0.tgz", + "integrity": "sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1" + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2896,13 +2939,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", - "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.40.0.tgz", + "integrity": "sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/types": "8.40.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3059,7 +3102,7 @@ }, "node_modules/@vue/tsconfig": { "version": "0.7.0", - "resolved": "https://repo.huaweicloud.com/repository/npm/@vue/tsconfig/-/tsconfig-0.7.0.tgz", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.7.0.tgz", "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==", "dev": true, "license": "MIT", @@ -3165,9 +3208,9 @@ } }, "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "version": "0.8.11", + "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "dev": true, "license": "MIT", "engines": { @@ -3387,9 +3430,9 @@ } }, "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -3701,9 +3744,9 @@ } }, "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -4529,9 +4572,9 @@ } }, "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -4661,9 +4704,9 @@ } }, "node_modules/electron": { - "version": "37.3.0", - "resolved": "https://registry.npmmirror.com/electron/-/electron-37.3.0.tgz", - "integrity": "sha512-cPOPUD26DwCh+PZ9q+gMyVBvdBN75SnekI6u5zcOeoLVIXQpzrCm1ewz9BcrkWkVW7oOtfQAEo1G1SffvXrSSw==", + "version": "37.3.1", + "resolved": "https://registry.npmmirror.com/electron/-/electron-37.3.1.tgz", + "integrity": "sha512-7DhktRLqhe6OJh/Bo75bTI0puUYEmIwSzMinocgO63mx3MVjtIn2tYMzLmAleNIlud2htkjpsMG2zT4PiTCloA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4734,9 +4777,9 @@ } }, "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -4789,9 +4832,9 @@ } }, "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -4850,9 +4893,9 @@ } }, "node_modules/electron/node_modules/@types/node": { - "version": "22.17.1", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.17.1.tgz", - "integrity": "sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==", + "version": "22.17.2", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.17.2.tgz", + "integrity": "sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==", "dev": true, "license": "MIT", "dependencies": { @@ -5013,9 +5056,9 @@ "optional": true }, "node_modules/esbuild": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.8.tgz", - "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -5025,32 +5068,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.8", - "@esbuild/android-arm": "0.25.8", - "@esbuild/android-arm64": "0.25.8", - "@esbuild/android-x64": "0.25.8", - "@esbuild/darwin-arm64": "0.25.8", - "@esbuild/darwin-x64": "0.25.8", - "@esbuild/freebsd-arm64": "0.25.8", - "@esbuild/freebsd-x64": "0.25.8", - "@esbuild/linux-arm": "0.25.8", - "@esbuild/linux-arm64": "0.25.8", - "@esbuild/linux-ia32": "0.25.8", - "@esbuild/linux-loong64": "0.25.8", - "@esbuild/linux-mips64el": "0.25.8", - "@esbuild/linux-ppc64": "0.25.8", - "@esbuild/linux-riscv64": "0.25.8", - "@esbuild/linux-s390x": "0.25.8", - "@esbuild/linux-x64": "0.25.8", - "@esbuild/netbsd-arm64": "0.25.8", - "@esbuild/netbsd-x64": "0.25.8", - "@esbuild/openbsd-arm64": "0.25.8", - "@esbuild/openbsd-x64": "0.25.8", - "@esbuild/openharmony-arm64": "0.25.8", - "@esbuild/sunos-x64": "0.25.8", - "@esbuild/win32-arm64": "0.25.8", - "@esbuild/win32-ia32": "0.25.8", - "@esbuild/win32-x64": "0.25.8" + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" } }, "node_modules/escalade": { @@ -7596,9 +7639,9 @@ } }, "node_modules/quansync": { - "version": "0.2.10", - "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz", - "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", "dev": true, "funding": [ { @@ -7818,9 +7861,9 @@ } }, "node_modules/rollup": { - "version": "4.46.2", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.46.2.tgz", - "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "version": "4.46.3", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.46.3.tgz", + "integrity": "sha512-RZn2XTjXb8t5g13f5YclGoilU/kwT696DIkY3sywjdZidNSi3+vseaQov7D7BZXVJCPv3pDWUN69C78GGbXsKw==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -7833,26 +7876,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.46.2", - "@rollup/rollup-android-arm64": "4.46.2", - "@rollup/rollup-darwin-arm64": "4.46.2", - "@rollup/rollup-darwin-x64": "4.46.2", - "@rollup/rollup-freebsd-arm64": "4.46.2", - "@rollup/rollup-freebsd-x64": "4.46.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", - "@rollup/rollup-linux-arm-musleabihf": "4.46.2", - "@rollup/rollup-linux-arm64-gnu": "4.46.2", - "@rollup/rollup-linux-arm64-musl": "4.46.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", - "@rollup/rollup-linux-ppc64-gnu": "4.46.2", - "@rollup/rollup-linux-riscv64-gnu": "4.46.2", - "@rollup/rollup-linux-riscv64-musl": "4.46.2", - "@rollup/rollup-linux-s390x-gnu": "4.46.2", - "@rollup/rollup-linux-x64-gnu": "4.46.2", - "@rollup/rollup-linux-x64-musl": "4.46.2", - "@rollup/rollup-win32-arm64-msvc": "4.46.2", - "@rollup/rollup-win32-ia32-msvc": "4.46.2", - "@rollup/rollup-win32-x64-msvc": "4.46.2", + "@rollup/rollup-android-arm-eabi": "4.46.3", + "@rollup/rollup-android-arm64": "4.46.3", + "@rollup/rollup-darwin-arm64": "4.46.3", + "@rollup/rollup-darwin-x64": "4.46.3", + "@rollup/rollup-freebsd-arm64": "4.46.3", + "@rollup/rollup-freebsd-x64": "4.46.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.46.3", + "@rollup/rollup-linux-arm-musleabihf": "4.46.3", + "@rollup/rollup-linux-arm64-gnu": "4.46.3", + "@rollup/rollup-linux-arm64-musl": "4.46.3", + "@rollup/rollup-linux-loongarch64-gnu": "4.46.3", + "@rollup/rollup-linux-ppc64-gnu": "4.46.3", + "@rollup/rollup-linux-riscv64-gnu": "4.46.3", + "@rollup/rollup-linux-riscv64-musl": "4.46.3", + "@rollup/rollup-linux-s390x-gnu": "4.46.3", + "@rollup/rollup-linux-x64-gnu": "4.46.3", + "@rollup/rollup-linux-x64-musl": "4.46.3", + "@rollup/rollup-win32-arm64-msvc": "4.46.3", + "@rollup/rollup-win32-ia32-msvc": "4.46.3", + "@rollup/rollup-win32-x64-msvc": "4.46.3", "fsevents": "~2.3.2" } }, @@ -8751,9 +8794,9 @@ } }, "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -8839,10 +8882,13 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -9096,14 +9142,15 @@ } }, "node_modules/unplugin": { - "version": "2.3.5", - "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.5.tgz", - "integrity": "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==", + "version": "2.3.6", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.6.tgz", + "integrity": "sha512-+/MdXl8bLTXI2lJF22gUBeCFqZruEpL/oM9f8wxCuKh9+Mw9qeul3gTqgbKpMeOFlusCzc0s7x2Kax2xKW+FQg==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.14.1", - "picomatch": "^4.0.2", + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" }, "engines": { @@ -9345,7 +9392,7 @@ }, "node_modules/vite": { "version": "6.3.5", - "resolved": "https://repo.huaweicloud.com/repository/npm/vite/-/vite-6.3.5.tgz", + "resolved": "https://registry.npmmirror.com/vite/-/vite-6.3.5.tgz", "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "license": "MIT", "dependencies": { @@ -9599,10 +9646,13 @@ } }, "node_modules/vite/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, diff --git a/frontend/package.json b/frontend/package.json index d95129186aaf065bb98d511f3b4a57aaf5ad0bba..0b4d5ba0c152e8af3c7826b0affc519dc0397564 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -22,7 +22,13 @@ ], "linux": { "target": [ - "rpm" + { + "target": "rpm", + "arch": [ + "x64", + "arm64" + ] + } ], "icon": "src/assets/logo.png", "category": "Development", @@ -67,7 +73,7 @@ "@vue/tsconfig": "^0.7.0", "concurrently": "^9.2.0", "cross-env": "^7.0.3", - "electron": "^37.3.0", + "electron": "^37.3.1", "electron-builder": "^26.0.12", "eslint": "^9.33.0", "eslint-config-prettier": "^10.1.8", diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index e5578fedd3539485a6bb7ca2907e21d8ecc3d903..d571c5222969d80586638f2f69cc36e4e54b2148 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -97,7 +97,7 @@ export function fetchLog(params: { key: string }): Promise { // 详情页 // 获取详情页信息 -export function queryDetail(params: { tag: Tag; key: string }) { +export function queryDetail(params: { tag: Tag; key: string; user_name: string }) { return httpRequest({ url: `${prefix}artifacts/details/`, method: 'get', @@ -126,7 +126,7 @@ export function deletePackage(params: { tag: Tag; key: string }) { } // hl: wip 智能体应用管理 -export function mcpAgent(params: { action: 'add' | 'delete'; package_name: string; app_name: string }) { +export function mcpAgent(params: { action: 'add' | 'delete'; package_name: string; app_name: string; user_name: string }) { return httpRequest({ url: `${prefix}artifacts/mcp_config_manage/`, method: 'post', diff --git a/frontend/src/layout/index.vue b/frontend/src/layout/index.vue index 3155ea6e99648a235bf9cb56512a35555e6d98cb..c13c3a0a142f20707775d8a3e9a818c7b8482747 100644 --- a/frontend/src/layout/index.vue +++ b/frontend/src/layout/index.vue @@ -21,15 +21,15 @@ DevStore - 中文文档 - English Doc + 中文文档 + English Doc {{ t('nav.devDoc') }} - DevStore - mcp-servers - oeDeploy + DevStore + mcp-servers + oeDeploy {{ t('nav.feedback') }} {{ t('nav.log') }} @@ -124,6 +124,11 @@ const sync = async () => { } }; +// 打开链接的公共方法 +const openLink = (url: string) => { + window.open(url, '_blank'); +}; + onMounted(async () => { // 首次打开,同步数据 await sync(); @@ -170,12 +175,10 @@ onMounted(async () => { font-weight: 600; font-size: 18px; } - .el-menu-item a { - color: var(--o-text-color-primary); - text-decoration: none; - font-size: 16px; + .el-menu-item { + cursor: pointer; &:hover { - color: var(--o-text-color-primary); + color: var(--o-theme-color-primary-blue); } } } @@ -214,35 +217,20 @@ onMounted(async () => { .el-menu-item { font-size: 14px !important; color: var(--o-text-color-primary) !important; + cursor: pointer !important; + transition: color 0.3s ease !important; + &:hover { - color: var(--o-text-color-primary) !important; + color: var(--o-theme-color-primary-blue) !important; } - a { - color: var(--o-text-color-primary) !important; - text-decoration: none !important; - font-size: 14px !important; - display: block !important; - width: 100% !important; - padding: 0 20px !important; - transition: color 0.3s ease !important; - - &:hover { - color: var(--o-theme-color-primary-blue) !important; - } - - &:visited { - color: var(--o-text-color-primary) !important; - } - - &:focus { - outline: none !important; - color: var(--o-theme-color-primary-blue) !important; - } - - &:active { - color: var(--o-theme-color-primary-blue) !important; - } + &:focus { + outline: none !important; + color: var(--o-theme-color-primary-blue) !important; + } + + &:active { + color: var(--o-theme-color-primary-blue) !important; } } } @@ -272,21 +260,5 @@ body .el-popper[data-popper-placement^="bottom"] .el-menu-item { } } -/* 链接通用样式 */ -.el-sub-menu__title, .el-menu-item { - a { - color: var(--o-text-color-primary) !important; - text-decoration: none !important; - - &:link, &:visited { - color: var(--o-text-color-primary) !important; - text-decoration: none !important; - } - - &:hover, &:focus { - color: var(--o-theme-color-primary-blue) !important; - text-decoration: none !important; - } - } -} + diff --git a/frontend/src/utils/index.ts b/frontend/src/utils/index.ts index 2f53578c5b60c416685c26007b99c77ffa94cd2f..efeed30f54c834df6ff3df7ec4ac074ce363f4d9 100644 --- a/frontend/src/utils/index.ts +++ b/frontend/src/utils/index.ts @@ -52,5 +52,29 @@ export async function updateRouteQuery( await router.push({ query: newQuery }); } +/** + * 获取当前系统用户名 + * @returns Promise 返回用户名,如果获取失败返回 'unknown' + */ +export async function getCurrentUsername(): Promise { + try { + // 检查是否在 Electron 环境中 + if (typeof window !== 'undefined' && (window as any).electronAPI) { + const result = await (window as any).electronAPI.getUsername(); + if (result && result.success) { + return result.username; + } + console.warn('Failed to get username from Electron:', result?.error); + } + + // 如果不在 Electron 环境中或获取失败,返回默认值 + console.warn('Not in Electron environment or failed to get username, using fallback'); + return 'unknown'; + } catch (error) { + console.error('Error getting username:', error); + return 'unknown'; + } +} + // 导出语言检测相关函数 export { detectSystemLanguage, getSystemLanguages, isChineseLanguage } from './languageDetection'; \ No newline at end of file diff --git a/frontend/src/views/Detail.vue b/frontend/src/views/Detail.vue index eed0a86bceefed4e51b5e69a5099d75fc7362d91..583a9b25faa918554231c73a3c0814242189b802 100644 --- a/frontend/src/views/Detail.vue +++ b/frontend/src/views/Detail.vue @@ -103,7 +103,7 @@ import { ServerAndPluginInfoObj, Tag, } from '@/api/index.ts'; -import { generateIconBgColor } from '@/utils/index.ts'; +import { generateIconBgColor, getCurrentUsername } from '@/utils/index.ts'; import { createStatusWatcher } from '@/utils/statusWatcher'; import McpQuick from '@/views/components/McpQuick.vue'; @@ -186,7 +186,8 @@ const MESSAGE_DURATION = 3000; // 获取详情页信息 const getDetail = async () => { try { - const res = await queryDetail({tag: tag.value, key: key.value}); + const username = await getCurrentUsername(); + const res = await queryDetail({tag: tag.value, key: key.value, user_name: username}); if (res && res.is_success) { itemDetail.value = res.data; // 处理 md @@ -235,10 +236,12 @@ const uninstallPackage = async () => { // 添加到智能体应用 const addApp = async (appName: string) => { try { + const username = await getCurrentUsername(); const res = await mcpAgent({ action: 'add', package_name: itemDetail.value.package_name || '', - app_name: appName + app_name: appName, + user_name: username }); if (res && res.is_success) { await getDetail(); @@ -253,10 +256,12 @@ const addApp = async (appName: string) => { // 删除智能体应用 const deleteApp = async (appName: string) => { try { + const username = await getCurrentUsername(); const res = await mcpAgent({ action: 'delete', package_name: itemDetail.value.package_name || '', - app_name: appName + app_name: appName, + user_name: username }); if (res && res.is_success) { await getDetail();