From f096e07ec8695475f74fc2236577b00acc4e7fb6 Mon Sep 17 00:00:00 2001 From: wong <106998207@qq.com> Date: Mon, 5 Jan 2026 11:04:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Moncter/.env.example | 24 + Moncter/MCP/mcp.json | 31 +- Moncter/TaskShow/v0.39.1.tar.gz | Bin 0 -> 166840 bytes Moncter/app/controller/IndexController.php | 130 + Moncter/app/controller/UserController.php | 555 ++++- Moncter/composer.json | 7 +- Moncter/composer.lock | 896 ++++++- Moncter/config/autoload.php | 1 - Moncter/config/bootstrap.php | 1 + Moncter/config/database.php | 10 +- Moncter/config/log.php | 5 + Moncter/config/process.php | 23 +- Moncter/config/route.php | 99 + Moncter/env.txt | 54 + Moncter/start_debug.sh | 38 + Moncter/support/bootstrap.php | 8 + Moncter/yarn.lock | 2492 ++++++++++++++++++++ Touchkebao/.gitignore | 4 +- 19 files changed, 4352 insertions(+), 27 deletions(-) create mode 100644 Moncter/.env.example create mode 100644 Moncter/TaskShow/v0.39.1.tar.gz create mode 100644 Moncter/env.txt create mode 100644 Moncter/start_debug.sh create mode 100644 Moncter/yarn.lock diff --git a/.gitignore b/.gitignore index fca0d36b..1f8964da 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ SuperAdmin/.specstory/ Cunkebao/dist Touchkebao/.specstory/ Serverruntime/ +Moncter/提示词/ diff --git a/Moncter/.env.example b/Moncter/.env.example new file mode 100644 index 00000000..7ea7304e --- /dev/null +++ b/Moncter/.env.example @@ -0,0 +1,24 @@ +# 存客宝标签系统 - 环境变量配置示例 +# 复制此文件为 .env 并修改相应的配置值,不要提交到版本控制系统 + +# ============================================ +# 加密配置 +# ============================================ + +# AES 加密密钥(至少32字符,建议使用随机生成的强密钥) +# 生产环境请务必修改此密钥,并妥善保管 +ENCRYPTION_AES_KEY=your-32-byte-secret-key-here-12345678 + +# 哈希盐值(用于身份证哈希,增强安全性) +# 生产环境请务必修改此盐值 +ENCRYPTION_HASH_SALT=your-hash-salt-here-change-in-production + +# ============================================ +# 应用配置 +# ============================================ + +# 应用环境(development/production) +APP_ENV=development + +# 应用调试模式(true/false) +APP_DEBUG=true \ No newline at end of file diff --git a/Moncter/MCP/mcp.json b/Moncter/MCP/mcp.json index 2decb6d2..f44cf4b9 100644 --- a/Moncter/MCP/mcp.json +++ b/Moncter/MCP/mcp.json @@ -1,11 +1,26 @@ { - "mcpServers": { - "MongoDB": { - "command": "npx", - "args": ["-y", "mongodb-mcp-server@latest", "--readOnly"], - "env": { - "MDB_MCP_CONNECTION_STRING": "mongodb://ckb:123456@192.168.1.106:27017/ckb" - } + "mcpServers": { + "MongoDB_ckb": { + "command": "npx", + "args": ["-y", "mongodb-mcp-server@1.2.0", "--readOnly"], + "env": { + "MDB_MCP_CONNECTION_STRING": "mongodb://ckb:123456@192.168.1.106:27017/ckb" + } + }, + "MongoDB_KR": { + "command": "npx", + "args": ["-y", "mongodb-mcp-server@1.2.0", "--readOnly"], + "env": { + "MDB_MCP_CONNECTION_STRING": "mongodb://admin:key123456@192.168.2.16:27017/admin" + } + }, + "Moncter": { + "command": "node", + "args": ["./MCP/moncter-mcp-server/dist/index.js"], + "cwd": "E:/Cunkebao/Cunkebao02/Moncter", + "env": { + "MONCTER_API_URL": "http://127.0.0.1:8787" } } - } \ No newline at end of file + } +} \ No newline at end of file diff --git a/Moncter/TaskShow/v0.39.1.tar.gz b/Moncter/TaskShow/v0.39.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d551360344310efdc7ea5b226f2e9a3391addafc GIT binary patch literal 166840 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≤Dt3py%D5B!yoG@#t)O)b`iXyy` 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�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%0Dr&# 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 literal 0 HcmV?d00001 diff --git a/Moncter/app/controller/IndexController.php b/Moncter/app/controller/IndexController.php index 7d904faa..688d17ba 100644 --- a/Moncter/app/controller/IndexController.php +++ b/Moncter/app/controller/IndexController.php @@ -21,4 +21,134 @@ class IndexController return json(['code' => 0, 'msg' => 'ok']); } + /** + * 测试 MongoDB 数据库连接 + * GET /api/test/db + */ + public function testDb(Request $request) + { + $result = [ + 'code' => 0, + 'msg' => 'ok', + 'data' => [ + 'config' => [], + 'connection' => [], + 'test_query' => [], + ], + ]; + + try { + // 读取数据库配置 + $dbConfig = config('database', []); + $mongoConfig = $dbConfig['connections']['mongodb'] ?? null; + + if (!$mongoConfig) { + throw new \Exception('MongoDB 配置不存在'); + } + + $result['data']['config'] = [ + 'driver' => $mongoConfig['driver'] ?? 'unknown', + 'database' => $mongoConfig['database'] ?? 'unknown', + 'dsn' => $mongoConfig['dsn'] ?? 'unknown', + 'has_username' => !empty($mongoConfig['username']), + 'has_password' => !empty($mongoConfig['password']), + ]; + + // 尝试使用 MongoDB 客户端直接连接 + try { + // 构建包含认证信息的 DSN(如果配置了用户名和密码) + $dsn = $mongoConfig['dsn']; + if (!empty($mongoConfig['username']) && !empty($mongoConfig['password'])) { + // 如果 DSN 中不包含认证信息,则添加 + if (strpos($dsn, '@') === false) { + // 从 mongodb://host:port 格式转换为 mongodb://username:password@host:port/database + $dsn = str_replace( + 'mongodb://', + 'mongodb://' . urlencode($mongoConfig['username']) . ':' . urlencode($mongoConfig['password']) . '@', + $dsn + ); + // 添加数据库名和认证源 + $dsn .= '/' . $mongoConfig['database']; + if (!empty($mongoConfig['options']['authSource'])) { + $dsn .= '?authSource=' . urlencode($mongoConfig['options']['authSource']); + } + } + } + + // 过滤掉空字符串的选项(MongoDB 客户端不允许空字符串) + $options = array_filter($mongoConfig['options'] ?? [], function ($value) { + return $value !== ''; + }); + + $client = new \MongoDB\Client( + $dsn, + $options + ); + + // 尝试执行 ping 命令 + $adminDb = $client->selectDatabase('admin'); + $pingResult = $adminDb->command(['ping' => 1])->toArray(); + + $result['data']['connection'] = [ + 'status' => 'connected', + 'ping' => 'ok', + 'server_info' => $client->getManager()->getServers(), + ]; + + // 尝试选择目标数据库并列出集合 + $targetDb = $client->selectDatabase($mongoConfig['database']); + $collections = $targetDb->listCollections(); + $collectionNames = []; + foreach ($collections as $collection) { + $collectionNames[] = $collection->getName(); + } + + $result['data']['test_query'] = [ + 'database' => $mongoConfig['database'], + 'collections_count' => count($collectionNames), + 'collections' => $collectionNames, + ]; + + } catch (\MongoDB\Driver\Exception\Exception $e) { + $result['data']['connection'] = [ + 'status' => 'failed', + 'error' => $e->getMessage(), + 'code' => $e->getCode(), + ]; + $result['code'] = 500; + $result['msg'] = 'MongoDB 连接失败'; + } + + // 尝试使用 Repository 查询(如果连接成功) + if ($result['data']['connection']['status'] === 'connected') { + try { + $userRepo = new \app\repository\UserProfileRepository(); + $count = $userRepo->newQuery()->count(); + $result['data']['repository_test'] = [ + 'status' => 'ok', + 'user_profile_count' => $count, + ]; + } catch (\Throwable $e) { + $result['data']['repository_test'] = [ + 'status' => 'failed', + 'error' => $e->getMessage(), + ]; + } + } + + } catch (\Throwable $e) { + $result = [ + 'code' => 500, + 'msg' => '测试失败: ' . $e->getMessage(), + 'data' => [ + 'error' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + ], + ]; + } + + return json($result); + } + } diff --git a/Moncter/app/controller/UserController.php b/Moncter/app/controller/UserController.php index b23f213c..9835c82a 100644 --- a/Moncter/app/controller/UserController.php +++ b/Moncter/app/controller/UserController.php @@ -1,16 +1,557 @@ get('name', $default_name); - // 向浏览器返回字符串 - return response('hello ' . $name); + try { + LoggerHelper::logRequest('POST', '/api/users'); + + $rawBody = $request->rawBody(); + + // 调试:记录原始请求体 + if (empty($rawBody)) { + return ApiResponseHelper::error('请求体为空,请确保 Content-Type 为 application/json 并发送有效的 JSON 数据', 400); + } + + $body = json_decode($rawBody, true); + if (json_last_error() !== JSON_ERROR_NONE) { + $errorMsg = '请求体必须是有效的 JSON 格式'; + $jsonError = json_last_error_msg(); + if ($jsonError) { + $errorMsg .= ': ' . $jsonError; + } + // 开发环境输出更多调试信息 + if (getenv('APP_DEBUG') === 'true') { + $errorMsg .= ' (原始请求体: ' . substr($rawBody, 0, 200) . ')'; + } + return ApiResponseHelper::error($errorMsg, 400); + } + + $userService = new UserService(new UserProfileRepository()); + $result = $userService->createUser($body); + + return ApiResponseHelper::success($result, '用户创建成功'); + } catch (\InvalidArgumentException $e) { + return ApiResponseHelper::error($e->getMessage(), 400); + } catch (\Throwable $e) { + return ApiResponseHelper::exception($e); + } } -} \ No newline at end of file + + /** + * 查询用户信息 + * + * GET /api/users/{user_id}?decrypt_id_card=1 + * + * @param Request $request + * @return Response + */ + public function show(Request $request): Response + { + try { + // 从请求路径中解析 user_id + $path = $request->path(); + if (preg_match('#/api/users/([^/]+)#', $path, $matches)) { + $userId = $matches[1]; + } else { + $userId = $request->get('user_id'); + if (!$userId) { + throw new \InvalidArgumentException('缺少 user_id 参数'); + } + } + + LoggerHelper::logRequest('GET', $path, ['user_id' => $userId]); + + // 检查是否需要解密身份证(需要权限控制,这里简单用参数控制) + $decryptIdCard = (bool)$request->get('decrypt_id_card', false); + + $userService = new UserService(new UserProfileRepository()); + $user = $userService->getUserById($userId, $decryptIdCard); + + if (!$user) { + return ApiResponseHelper::error('用户不存在', 404, 404); + } + + // 如果不需要解密身份证,对敏感字段进行脱敏 + if (!$decryptIdCard) { + $user = DataMaskingHelper::maskArray($user, ['phone', 'email']); + } + + LoggerHelper::logBusiness('get_user_info', [ + 'user_id' => $userId, + 'decrypt_id_card' => $decryptIdCard, + ]); + + return ApiResponseHelper::success($user); + } catch (\InvalidArgumentException $e) { + return ApiResponseHelper::error($e->getMessage(), 400); + } catch (\Throwable $e) { + return ApiResponseHelper::exception($e); + } + } + + /** + * 更新用户信息 + * + * PUT /api/users/{user_id} + * + * 请求体示例: + * { + * "name": "张三", + * "phone": "13800138000", + * "email": "zhangsan@example.com", + * "gender": 1, + * "birthday": "1990-01-01", + * "address": "北京市朝阳区", + * "status": 0 + * } + */ + public function update(Request $request): Response + { + try { + // 从请求路径中解析 user_id + $path = $request->path(); + if (preg_match('#/api/users/([^/]+)#', $path, $matches)) { + $userId = $matches[1]; + } else { + $userId = $request->get('user_id'); + if (!$userId) { + throw new \InvalidArgumentException('缺少 user_id 参数'); + } + } + + LoggerHelper::logRequest('PUT', $path, ['user_id' => $userId]); + + $rawBody = $request->rawBody(); + + // 调试:记录原始请求体 + if (empty($rawBody)) { + return ApiResponseHelper::error('请求体为空,请确保 Content-Type 为 application/json 并发送有效的 JSON 数据', 400); + } + + $body = json_decode($rawBody, true); + if (json_last_error() !== JSON_ERROR_NONE) { + $errorMsg = '请求体必须是有效的 JSON 格式'; + $jsonError = json_last_error_msg(); + if ($jsonError) { + $errorMsg .= ': ' . $jsonError; + } + // 开发环境输出更多调试信息 + if (getenv('APP_DEBUG') === 'true') { + $errorMsg .= ' (原始请求体: ' . substr($rawBody, 0, 200) . ')'; + } + return ApiResponseHelper::error($errorMsg, 400); + } + + if (empty($body)) { + return ApiResponseHelper::error('请求体不能为空', 400); + } + + $userService = new UserService(new UserProfileRepository()); + $result = $userService->updateUser($userId, $body); + + // 脱敏处理 + $result = DataMaskingHelper::maskArray($result, ['phone', 'email']); + + return ApiResponseHelper::success($result, '用户更新成功'); + } catch (\InvalidArgumentException $e) { + return ApiResponseHelper::error($e->getMessage(), 400); + } catch (\Throwable $e) { + return ApiResponseHelper::exception($e); + } + } + + /** + * 解密身份证号 + * + * GET /api/users/{user_id}/decrypt-id-card + */ + public function decryptIdCard(Request $request): Response + { + try { + // 从请求路径中解析 user_id + $path = $request->path(); + if (preg_match('#/api/users/([^/]+)/decrypt-id-card#', $path, $matches)) { + $userId = $matches[1]; + } else { + $userId = $request->get('user_id'); + if (!$userId) { + throw new \InvalidArgumentException('缺少 user_id 参数'); + } + } + + LoggerHelper::logRequest('GET', $path, ['user_id' => $userId]); + + $userService = new UserService(new UserProfileRepository()); + $user = $userService->getUserById($userId, true); // 强制解密 + + if (!$user) { + return ApiResponseHelper::error('用户不存在', 404, 404); + } + + LoggerHelper::logBusiness('decrypt_id_card', [ + 'user_id' => $userId, + ]); + + return ApiResponseHelper::success([ + 'user_id' => $user['user_id'], + 'id_card' => $user['id_card'] ?? '' + ]); + } catch (\InvalidArgumentException $e) { + return ApiResponseHelper::error($e->getMessage(), 400); + } catch (\Throwable $e) { + return ApiResponseHelper::exception($e); + } + } + + /** + * 删除用户(软删除) + * + * DELETE /api/users/{user_id} + */ + public function destroy(Request $request): Response + { + try { + // 从请求路径中解析 user_id + $path = $request->path(); + if (preg_match('#/api/users/([^/]+)#', $path, $matches)) { + $userId = $matches[1]; + } else { + $userId = $request->get('user_id'); + if (!$userId) { + throw new \InvalidArgumentException('缺少 user_id 参数'); + } + } + + LoggerHelper::logRequest('DELETE', $path, ['user_id' => $userId]); + + $userService = new UserService(new UserProfileRepository()); + $userService->deleteUser($userId); + + return ApiResponseHelper::success(null, '用户删除成功'); + } catch (\InvalidArgumentException $e) { + return ApiResponseHelper::error($e->getMessage(), 400); + } catch (\Throwable $e) { + return ApiResponseHelper::exception($e); + } + } + + /** + * 搜索用户(支持多种搜索条件组合) + * + * POST /api/users/search + * + * 支持以下搜索方式: + * 1. 基础字段搜索:姓名、手机号、邮箱、身份证号等 + * 2. 标签筛选:根据用户标签筛选 + * 3. 组合搜索:基础字段 + 标签筛选 + * + * 请求体示例1(姓名模糊搜索): + * { + * "name": "张三", + * "page": 1, + * "page_size": 20 + * } + * + * 请求体示例2(组合搜索:姓名 + 手机号): + * { + * "name": "张", + * "phone": "138", + * "page": 1, + * "page_size": 20 + * } + * + * 请求体示例3(根据标签筛选): + * { + * "tag_conditions": [ + * { + * "tag_code": "high_consumer", + * "operator": "=", + * "value": "high" + * } + * ], + * "logic": "AND", + * "page": 1, + * "page_size": 20 + * } + * + * 请求体示例4(组合搜索:基础字段 + 标签): + * { + * "name": "张", + * "min_total_amount": 1000, + * "tag_conditions": [ + * { + * "tag_code": "active_user", + * "operator": "=", + * "value": "active" + * } + * ], + * "page": 1, + * "page_size": 20 + * } + */ + public function search(Request $request): Response + { + try { + LoggerHelper::logRequest('POST', '/api/users/search'); + + $rawBody = $request->rawBody(); + + // 调试:记录原始请求体 + if (empty($rawBody)) { + return ApiResponseHelper::error('请求体为空,请确保 Content-Type 为 application/json 并发送有效的 JSON 数据', 400); + } + + $body = json_decode($rawBody, true); + if (json_last_error() !== JSON_ERROR_NONE) { + $errorMsg = '请求体必须是有效的 JSON 格式'; + $jsonError = json_last_error_msg(); + if ($jsonError) { + $errorMsg .= ': ' . $jsonError; + } + // 开发环境输出更多调试信息 + if (getenv('APP_DEBUG') === 'true') { + $errorMsg .= ' (原始请求体: ' . substr($rawBody, 0, 200) . ')'; + } + return ApiResponseHelper::error($errorMsg, 400); + } + + $page = (int)($body['page'] ?? 1); + $pageSize = (int)($body['page_size'] ?? 20); + + if ($page < 1) { + $page = 1; + } + if ($pageSize < 1 || $pageSize > 100) { + $pageSize = 20; + } + + $userService = new UserService(new UserProfileRepository()); + + // 情况1:仅根据身份证号查找(返回单个用户,不分页) + if (!empty($body['id_card']) && empty($body['tag_conditions']) && empty($body['name']) && empty($body['phone']) && empty($body['email'])) { + $user = $userService->findUserByIdCard($body['id_card']); + + if (!$user) { + return ApiResponseHelper::error('未找到该身份证号对应的用户', 404, 404); + } + + // 脱敏处理 + $user = DataMaskingHelper::maskArray($user, ['phone', 'email']); + + LoggerHelper::logBusiness('search_user_by_id_card', [ + 'found' => true, + ]); + + return ApiResponseHelper::success($user); + } + + // 情况2:根据标签筛选用户(可能结合基础字段搜索) + if (!empty($body['tag_conditions'])) { + $tagService = new \app\service\TagService( + new \app\repository\TagDefinitionRepository(), + new UserProfileRepository(), + new \app\repository\UserTagRepository(), + new \app\repository\TagHistoryRepository(), + new \app\service\TagRuleEngine\SimpleRuleEngine() + ); + + $conditions = $body['tag_conditions']; + $logic = $body['logic'] ?? 'AND'; + $includeUserInfo = true; // 标签筛选需要用户信息 + + // 验证条件格式 + foreach ($conditions as $condition) { + if (!isset($condition['tag_code']) || !isset($condition['operator']) || !isset($condition['value'])) { + throw new \InvalidArgumentException('每个条件必须包含 tag_code、operator 和 value 字段'); + } + } + + // 先根据标签筛选用户 + $tagResult = $tagService->filterUsersByTags( + $conditions, + $logic, + 1, // 先获取所有符合条件的用户ID + 10000, // 临时设置大值,获取所有用户ID + true + ); + + $userIds = array_column($tagResult['users'], 'user_id'); + + if (empty($userIds)) { + return ApiResponseHelper::success([ + 'users' => [], + 'total' => 0, + 'page' => $page, + 'page_size' => $pageSize, + 'total_pages' => 0, + ]); + } + + // 如果有基础字段搜索条件,进一步筛选 + $baseConditions = []; + if (!empty($body['name'])) { + $baseConditions['name'] = $body['name']; + } + if (!empty($body['phone'])) { + $baseConditions['phone'] = $body['phone']; + $baseConditions['phone_exact'] = $body['phone_exact'] ?? false; + } + if (!empty($body['email'])) { + $baseConditions['email'] = $body['email']; + $baseConditions['email_exact'] = $body['email_exact'] ?? false; + } + if (isset($body['gender']) && $body['gender'] !== '') { + $baseConditions['gender'] = $body['gender']; + } + if (isset($body['status']) && $body['status'] !== '') { + $baseConditions['status'] = $body['status']; + } + if (isset($body['min_total_amount'])) { + $baseConditions['min_total_amount'] = $body['min_total_amount']; + } + if (isset($body['max_total_amount'])) { + $baseConditions['max_total_amount'] = $body['max_total_amount']; + } + if (isset($body['min_total_count'])) { + $baseConditions['min_total_count'] = $body['min_total_count']; + } + if (isset($body['max_total_count'])) { + $baseConditions['max_total_count'] = $body['max_total_count']; + } + + // 如果有基础字段条件,需要进一步筛选 + if (!empty($baseConditions)) { + $baseConditions['user_ids'] = $userIds; // 限制在标签筛选的用户范围内 + $result = $userService->searchUsers($baseConditions, $page, $pageSize); + } else { + // 没有基础字段条件,直接使用标签筛选结果并分页 + $total = count($userIds); + $offset = ($page - 1) * $pageSize; + $pagedUserIds = array_slice($userIds, $offset, $pageSize); + + // 获取用户详细信息 + $users = []; + foreach ($pagedUserIds as $userId) { + $user = $userService->getUserById($userId, false); + if ($user) { + $users[] = $user; + } + } + + $result = [ + 'users' => $users, + 'total' => $total, + 'page' => $page, + 'page_size' => $pageSize, + 'total_pages' => (int)ceil($total / $pageSize), + ]; + } + + // 对返回的用户信息进行脱敏处理 + if (isset($result['users']) && is_array($result['users'])) { + foreach ($result['users'] as &$user) { + $user = DataMaskingHelper::maskArray($user, ['phone', 'email']); + } + unset($user); + } + + LoggerHelper::logBusiness('search_users_by_tags', [ + 'conditions_count' => count($conditions), + 'base_conditions' => !empty($baseConditions), + 'result_count' => $result['total'] ?? 0, + ]); + + return ApiResponseHelper::success($result); + } + + // 情况3:仅基础字段搜索(无标签条件) + $baseConditions = []; + if (!empty($body['name'])) { + $baseConditions['name'] = $body['name']; + } + if (!empty($body['phone'])) { + $baseConditions['phone'] = $body['phone']; + $baseConditions['phone_exact'] = $body['phone_exact'] ?? false; + } + if (!empty($body['email'])) { + $baseConditions['email'] = $body['email']; + $baseConditions['email_exact'] = $body['email_exact'] ?? false; + } + if (!empty($body['id_card'])) { + $baseConditions['id_card'] = $body['id_card']; + } + if (isset($body['gender']) && $body['gender'] !== '') { + $baseConditions['gender'] = $body['gender']; + } + if (isset($body['status']) && $body['status'] !== '') { + $baseConditions['status'] = $body['status']; + } + if (isset($body['min_total_amount'])) { + $baseConditions['min_total_amount'] = $body['min_total_amount']; + } + if (isset($body['max_total_amount'])) { + $baseConditions['max_total_amount'] = $body['max_total_amount']; + } + if (isset($body['min_total_count'])) { + $baseConditions['min_total_count'] = $body['min_total_count']; + } + if (isset($body['max_total_count'])) { + $baseConditions['max_total_count'] = $body['max_total_count']; + } + + if (empty($baseConditions)) { + return ApiResponseHelper::error('请提供至少一个搜索条件', 400); + } + + $result = $userService->searchUsers($baseConditions, $page, $pageSize); + + // 对返回的用户信息进行脱敏处理 + if (isset($result['users']) && is_array($result['users'])) { + foreach ($result['users'] as &$user) { + $user = DataMaskingHelper::maskArray($user, ['phone', 'email']); + } + unset($user); + } + + LoggerHelper::logBusiness('search_users_by_base_fields', [ + 'conditions' => array_keys($baseConditions), + 'result_count' => $result['total'] ?? 0, + ]); + + return ApiResponseHelper::success($result); + } catch (\InvalidArgumentException $e) { + return ApiResponseHelper::error($e->getMessage(), 400); + } catch (\Throwable $e) { + return ApiResponseHelper::exception($e); + } + } +} diff --git a/Moncter/composer.json b/Moncter/composer.json index 82eaf4f0..fcc1e8a5 100644 --- a/Moncter/composer.json +++ b/Moncter/composer.json @@ -27,7 +27,12 @@ "php": ">=8.1", "workerman/webman-framework": "^2.1", "monolog/monolog": "^2.0", - "mongodb/laravel-mongodb": "^4.0" + "mongodb/laravel-mongodb": "^4.0", + "vlucas/phpdotenv": "^5.6", + "predis/predis": "^2.0", + "dragonmantank/cron-expression": "^3.6", + "php-amqplib/php-amqplib": "^3.7", + "ramsey/uuid": "^4.7" }, "suggest": { "ext-event": "For better performance. " diff --git a/Moncter/composer.lock b/Moncter/composer.lock index 3ece18e4..bc535e33 100644 --- a/Moncter/composer.lock +++ b/Moncter/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b36fd3581fc1bf43e25a6294dd7efc58", + "content-hash": "6cafa2c36c31a9f9ddfcf8df3e7da924", "packages": [ { "name": "brick/math", @@ -225,6 +225,132 @@ ], "time": "2025-08-10T19:31:58+00:00" }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "shasum": "" + }, + "require": { + "php": "^8.2|^8.3|^8.4|^8.5" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.32|^2.1.31", + "phpunit/phpunit": "^8.5.48|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2025-10-31T18:51:33+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, { "name": "illuminate/bus", "version": "v11.46.1", @@ -1335,6 +1461,453 @@ }, "time": "2018-02-13T20:26:39+00:00" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "php-amqplib/php-amqplib", + "version": "v3.7.4", + "source": { + "type": "git", + "url": "https://github.com/php-amqplib/php-amqplib.git", + "reference": "381b6f7c600e0e0c7463cdd7f7a1a3bc6268e5fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/381b6f7c600e0e0c7463cdd7f7a1a3bc6268e5fd", + "reference": "381b6f7c600e0e0c7463cdd7f7a1a3bc6268e5fd", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-sockets": "*", + "php": "^7.2||^8.0", + "phpseclib/phpseclib": "^2.0|^3.0" + }, + "conflict": { + "php": "7.4.0 - 7.4.1" + }, + "replace": { + "videlalvaro/php-amqplib": "self.version" + }, + "require-dev": { + "ext-curl": "*", + "nategood/httpful": "^0.2.20", + "phpunit/phpunit": "^7.5|^9.5", + "squizlabs/php_codesniffer": "^3.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpAmqpLib\\": "PhpAmqpLib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Alvaro Videla", + "role": "Original Maintainer" + }, + { + "name": "Raúl Araya", + "email": "nubeiro@gmail.com", + "role": "Maintainer" + }, + { + "name": "Luke Bakken", + "email": "luke@bakken.io", + "role": "Maintainer" + }, + { + "name": "Ramūnas Dronga", + "email": "github@ramuno.lt", + "role": "Maintainer" + } + ], + "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", + "homepage": "https://github.com/php-amqplib/php-amqplib/", + "keywords": [ + "message", + "queue", + "rabbitmq" + ], + "support": { + "issues": "https://github.com/php-amqplib/php-amqplib/issues", + "source": "https://github.com/php-amqplib/php-amqplib/tree/v3.7.4" + }, + "time": "2025-11-23T17:00:56+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.4", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-08-21T11:53:16+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.48", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "64065a5679c50acb886e82c07aa139b0f757bb89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/64065a5679c50acb886e82c07aa139b0f757bb89", + "reference": "64065a5679c50acb886e82c07aa139b0f757bb89", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.48" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2025-12-15T11:51:42+00:00" + }, + { + "name": "predis/predis", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/predis/predis.git", + "reference": "07105e050622ed80bd60808367ced9e379f31530" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/predis/predis/zipball/07105e050622ed80bd60808367ced9e379f31530", + "reference": "07105e050622ed80bd60808367ced9e379f31530", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.3", + "phpstan/phpstan": "^1.9", + "phpunit/phpcov": "^6.0 || ^8.0", + "phpunit/phpunit": "^8.0 || ^9.4" + }, + "suggest": { + "ext-relay": "Faster connection with in-memory caching (>=0.6.2)" + }, + "type": "library", + "autoload": { + "psr-4": { + "Predis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Till Krüss", + "homepage": "https://till.im", + "role": "Maintainer" + } + ], + "description": "A flexible and feature-complete Redis/Valkey client for PHP.", + "homepage": "http://github.com/predis/predis", + "keywords": [ + "nosql", + "predis", + "redis" + ], + "support": { + "issues": "https://github.com/predis/predis/issues", + "source": "https://github.com/predis/predis/tree/v2.4.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/tillkruss", + "type": "github" + } + ], + "time": "2025-11-12T18:00:11+00:00" + }, { "name": "psr/clock", "version": "1.0.0", @@ -1537,6 +2110,160 @@ }, "time": "2021-10-29T13:26:27+00:00" }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "8429c78ca35a09f27565311b98101e2826affde0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", + "reference": "8429c78ca35a09f27565311b98101e2826affde0", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.2" + }, + "time": "2025-12-14T04:43:48+00:00" + }, { "name": "symfony/clock", "version": "v7.3.0", @@ -1678,6 +2405,89 @@ ], "time": "2024-09-25T14:21:43+00:00" }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, { "name": "symfony/polyfill-mbstring", "version": "v1.33.0", @@ -2185,6 +2995,90 @@ ], "time": "2024-09-27T08:32:26+00:00" }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-04-30T23:37:27+00:00" + }, { "name": "voku/portable-ascii", "version": "2.0.3", diff --git a/Moncter/config/autoload.php b/Moncter/config/autoload.php index 69a8135e..8d207b5c 100644 --- a/Moncter/config/autoload.php +++ b/Moncter/config/autoload.php @@ -14,7 +14,6 @@ return [ 'files' => [ - base_path() . '/app/functions.php', base_path() . '/support/Request.php', base_path() . '/support/Response.php', ] diff --git a/Moncter/config/bootstrap.php b/Moncter/config/bootstrap.php index 95d2e87e..63e07bd0 100644 --- a/Moncter/config/bootstrap.php +++ b/Moncter/config/bootstrap.php @@ -14,4 +14,5 @@ return [ support\bootstrap\Session::class, + support\bootstrap\MongoDB::class, ]; diff --git a/Moncter/config/database.php b/Moncter/config/database.php index fd7cd4b5..630702e9 100644 --- a/Moncter/config/database.php +++ b/Moncter/config/database.php @@ -9,17 +9,17 @@ return [ // MongoDB 官方连接配置 'mongodb' => [ 'driver' => 'mongodb', - 'dsn' => 'mongodb://127.0.0.1:27017', // 集群可写:mongodb://node1:27017,node2:27017 - 'database' => 'Moncter', // 目标数据库名 - 'username' => 'Moncter', // 无认证则省略 + 'dsn' => 'mongodb://192.168.1.106:27017', // 集群可写:mongodb://node1:27017,node2:27017 + 'database' => 'ckb', // 目标数据库名 + 'username' => 'ckb', // 无认证则省略 'password' => '123456', // 无认证则省略 'options' => [ - 'replicaSet' => '', // 副本集名称(无则留空) + // 'replicaSet' => '', // 副本集名称(如果使用副本集,取消注释并填写名称) 'ssl' => false, // 是否启用 SSL 'connectTimeoutMS' => 3000, // 连接超时 'socketTimeoutMS' => 5000, // 读写超时 // 认证相关(若 MongoDB 启用认证) - 'authSource' => 'admin', // 认证数据库(默认 admin) + 'authSource' => 'ckb', // 认证数据库(默认 admin) 'authMechanism' => 'SCRAM-SHA-256', // 认证机制(默认推荐) ], ], diff --git a/Moncter/config/log.php b/Moncter/config/log.php index 7f05de57..817e13cf 100644 --- a/Moncter/config/log.php +++ b/Moncter/config/log.php @@ -28,5 +28,10 @@ return [ ], ] ], + 'processors' => [ + [ + 'class' => app\utils\LogMaskingProcessor::class, + ], + ], ], ]; diff --git a/Moncter/config/process.php b/Moncter/config/process.php index 892dc826..f987b577 100644 --- a/Moncter/config/process.php +++ b/Moncter/config/process.php @@ -58,5 +58,26 @@ return [ 'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/', ] ] - ] + ], + // 数据采集任务调度器(从 config/data_collection_tasks.php 读取所有采集任务配置) + 'data_sync_scheduler' => [ + 'handler' => app\process\DataSyncScheduler::class, + 'count' => 10, // Worker 进程数量(可根据任务数量调整) + 'reloadable' => false, + ], + // 数据同步 Worker(消费 RabbitMQ 消息队列) + // 处理从采集任务推送过来的数据,写入目标数据库 + 'data_sync_worker' => [ + 'handler' => app\process\DataSyncWorker::class, + 'count' => 20, // Worker 进程数量(可根据消息量调整) + 'reloadable' => false, + ], + // 标签计算 Worker(消费 RabbitMQ 消息队列) + // 根据用户数据计算标签值 + 'tag_calculation_worker' => [ + 'handler' => app\process\TagCalculationWorker::class, + 'count' => 2, // Worker 进程数量(可根据消息量调整) + 'reloadable' => false, + ], + ]; diff --git a/Moncter/config/route.php b/Moncter/config/route.php index a5064fca..3a66a3ec 100644 --- a/Moncter/config/route.php +++ b/Moncter/config/route.php @@ -15,7 +15,106 @@ use Webman\Route; +// 数据库连接测试接口 +Route::get('/api/test/db', [app\controller\IndexController::class, 'testDb']); +// ============================================ +// 用户相关接口(RESTful) +// ============================================ +Route::post('/api/users', [app\controller\UserController::class, 'store']); // 创建用户 +Route::get('/api/users/{user_id}', [app\controller\UserController::class, 'show']); // 查询用户 +Route::put('/api/users/{user_id}', [app\controller\UserController::class, 'update']); // 更新用户 +Route::delete('/api/users/{user_id}', [app\controller\UserController::class, 'destroy']); // 删除用户 +Route::get('/api/users/{user_id}/decrypt-id-card', [app\controller\UserController::class, 'decryptIdCard']); // 解密身份证 +Route::post('/api/users/search', [app\controller\UserController::class, 'search']); // 搜索用户(复杂查询) +// ============================================ +// 用户标签相关接口(RESTful) +// ============================================ +Route::get('/api/users/{user_id}/tags', [app\controller\TagController::class, 'listByUser']); // 查询用户标签 +Route::put('/api/users/{user_id}/tags', [app\controller\TagController::class, 'calculate']); // 更新/计算用户标签 +Route::delete('/api/users/{user_id}/tags/{tag_id}', [app\controller\TagController::class, 'destroy']); // 删除用户标签 +// ============================================ +// 消费记录相关接口 +// ============================================ +Route::post('/api/consumption/record', [app\controller\ConsumptionController::class, 'store']); // 创建消费记录 +// ============================================ +// 标签定义相关接口(管理接口) +// ============================================ +Route::post('/api/tags/filter', [app\controller\TagController::class, 'filter']); // 根据标签筛选用户 +Route::get('/api/tags/statistics', [app\controller\TagController::class, 'statistics']); // 获取标签统计信息 +Route::get('/api/tags/history', [app\controller\TagController::class, 'history']); // 获取标签历史记录 +Route::post('/api/tag-definitions/batch', [app\controller\TagController::class, 'init']); // 批量初始化标签定义 +Route::get('/api/tag-definitions', [app\controller\TagDefinitionController::class, 'list']); // 获取标签定义列表 +Route::post('/api/tag-definitions', [app\controller\TagDefinitionController::class, 'create']); // 创建标签定义 +Route::get('/api/tag-definitions/{tag_id}', [app\controller\TagDefinitionController::class, 'detail']); // 获取标签定义详情 +Route::put('/api/tag-definitions/{tag_id}', [app\controller\TagDefinitionController::class, 'update']); // 更新标签定义 +Route::delete('/api/tag-definitions/{tag_id}', [app\controller\TagDefinitionController::class, 'delete']); // 删除标签定义 + +// ============================================ +// 标签任务管理接口 +// ============================================ +Route::post('/api/tag-tasks', [app\controller\TagTaskController::class, 'create']); // 创建标签任务 +Route::put('/api/tag-tasks/{task_id}', [app\controller\TagTaskController::class, 'update']); // 更新标签任务 +Route::delete('/api/tag-tasks/{task_id}', [app\controller\TagTaskController::class, 'delete']); // 删除标签任务 +Route::get('/api/tag-tasks', [app\controller\TagTaskController::class, 'list']); // 标签任务列表 +Route::get('/api/tag-tasks/{task_id}', [app\controller\TagTaskController::class, 'detail']); // 标签任务详情 +Route::get('/api/tag-tasks/{task_id}/executions', [app\controller\TagTaskController::class, 'executions']); // 获取任务执行记录 +Route::post('/api/tag-tasks/{task_id}/start', [app\controller\TagTaskController::class, 'start']); // 启动标签任务 +Route::post('/api/tag-tasks/{task_id}/pause', [app\controller\TagTaskController::class, 'pause']); // 暂停标签任务 +Route::post('/api/tag-tasks/{task_id}/stop', [app\controller\TagTaskController::class, 'stop']); // 停止标签任务 + +// ============================================ +// 身份合并相关接口(场景4:手机号发现身份证后合并) +// ============================================ +Route::post('/api/person-merge/phone-to-id-card', [app\controller\PersonMergeController::class, 'mergePhoneToIdCard']); // 合并手机号到身份证 +Route::post('/api/person-merge/temporary-to-formal', [app\controller\PersonMergeController::class, 'mergeTemporaryToFormal']); // 合并临时人到正式人 + +// ============================================ +// 数据库同步相关接口 +// ============================================ +Route::get('/database-sync/dashboard', [app\controller\DatabaseSyncController::class, 'dashboard']); // 同步进度看板页面 +Route::get('/api/database-sync/progress', [app\controller\DatabaseSyncController::class, 'progress']); // 查询同步进度 +Route::get('/api/database-sync/stats', [app\controller\DatabaseSyncController::class, 'stats']); // 查询同步统计 +Route::post('/api/database-sync/reset', [app\controller\DatabaseSyncController::class, 'reset']); // 重置同步进度 +Route::post('/api/database-sync/skip-error', [app\controller\DatabaseSyncController::class, 'skipError']); // 跳过错误数据库 + +// ============================================ +// 数据采集任务管理接口 +// ============================================ +Route::post('/api/data-collection-tasks', [app\controller\DataCollectionTaskController::class, 'create']); // 创建任务 +Route::put('/api/data-collection-tasks/{task_id}', [app\controller\DataCollectionTaskController::class, 'update']); // 更新任务 +Route::delete('/api/data-collection-tasks/{task_id}', [app\controller\DataCollectionTaskController::class, 'delete']); // 删除任务 +Route::get('/api/data-collection-tasks', [app\controller\DataCollectionTaskController::class, 'list']); // 任务列表 +Route::get('/api/data-collection-tasks/data-sources', [app\controller\DataCollectionTaskController::class, 'getDataSources']); // 获取数据源列表 +Route::get('/api/data-collection-tasks/{task_id}', [app\controller\DataCollectionTaskController::class, 'detail']); // 任务详情 +Route::get('/api/data-collection-tasks/{task_id}/progress', [app\controller\DataCollectionTaskController::class, 'progress']); // 任务进度 +Route::post('/api/data-collection-tasks/{task_id}/start', [app\controller\DataCollectionTaskController::class, 'start']); // 启动任务 +Route::post('/api/data-collection-tasks/{task_id}/pause', [app\controller\DataCollectionTaskController::class, 'pause']); // 暂停任务 +Route::post('/api/data-collection-tasks/{task_id}/stop', [app\controller\DataCollectionTaskController::class, 'stop']); // 停止任务 +Route::get('/api/data-collection-tasks/data-sources/{data_source_id}/databases', [app\controller\DataCollectionTaskController::class, 'getDatabases']); // 获取数据库列表 +Route::get('/api/data-collection-tasks/data-sources/{data_source_id}/databases/{database}/collections', [app\controller\DataCollectionTaskController::class, 'getCollections']); // 获取集合列表 +Route::get('/api/data-collection-tasks/data-sources/{data_source_id}/databases/{database}/collections/{collection}/fields', [app\controller\DataCollectionTaskController::class, 'getFields']); // 获取字段列表 +Route::get('/api/data-collection-tasks/handlers/{handler_type}/target-fields', [app\controller\DataCollectionTaskController::class, 'getHandlerTargetFields']); // 获取Handler的目标字段列表 +Route::post('/api/data-collection-tasks/preview-query', [app\controller\DataCollectionTaskController::class, 'previewQuery']); // 预览查询结果 + +// ============================================ +// 数据源管理接口 +// ============================================ +Route::get('/api/data-sources', [app\controller\DataSourceController::class, 'list']); // 获取数据源列表 +Route::get('/api/data-sources/{data_source_id}', [app\controller\DataSourceController::class, 'detail']); // 获取数据源详情 +Route::post('/api/data-sources', [app\controller\DataSourceController::class, 'create']); // 创建数据源 +Route::put('/api/data-sources/{data_source_id}', [app\controller\DataSourceController::class, 'update']); // 更新数据源 +Route::delete('/api/data-sources/{data_source_id}', [app\controller\DataSourceController::class, 'delete']); // 删除数据源 +Route::post('/api/data-sources/test-connection', [app\controller\DataSourceController::class, 'testConnection']); // 测试数据源连接 + +// ============================================ +// 人群快照相关接口 +// ============================================ +Route::get('/api/tag-cohorts', [app\controller\TagCohortController::class, 'list']); // 获取人群快照列表 +Route::get('/api/tag-cohorts/{cohort_id}', [app\controller\TagCohortController::class, 'detail']); // 获取人群快照详情 +Route::post('/api/tag-cohorts', [app\controller\TagCohortController::class, 'create']); // 创建人群快照 +Route::delete('/api/tag-cohorts/{cohort_id}', [app\controller\TagCohortController::class, 'delete']); // 删除人群快照 +Route::post('/api/tag-cohorts/{cohort_id}/export', [app\controller\TagCohortController::class, 'export']); // 导出人群快照 \ No newline at end of file diff --git a/Moncter/env.txt b/Moncter/env.txt new file mode 100644 index 00000000..af53e480 --- /dev/null +++ b/Moncter/env.txt @@ -0,0 +1,54 @@ +# ============================================ +# 加密配置 +# ============================================ + +# AES 加密密钥(至少32字符,建议使用随机生成的强密钥) +# 生产环境请务必修改此密钥,并妥善保管 +ENCRYPTION_AES_KEY=your-32-byte-secret-key-here-12345678 + +# 哈希盐值(用于身份证哈希,增强安全性) +# 生产环境请务必修改此盐值 +ENCRYPTION_HASH_SALT=your-hash-salt-here-change-in-production + +# ============================================ +# 应用配置 +# ============================================ + +# 应用环境(development/production) +APP_ENV=development + +# 应用调试模式(true/false) +APP_DEBUG=true + + +# ============================================ +# 以下为:超级主机资源数据库 +# ============================================ +#主机标签数据库 + +TAG_MONGODB_DRIVER = "mongodb" +TAG_MONGODB_DNS = mongodb://192.168.1.106:27017 +TAG_MONGODB_DATABASE = ckb +TAG_MONGODB_USER = ckb +TAG_MONGODB_AUTH = ckb +TAG_MONGODB_PASSWORD = 123456 + +#主机同步KR数据库 +SYNC_MONGODB_HOST = 192.168.1.106 +SYNC_MONGODB_PORT = 27017 +SYNC_MONGODB_AUTH = KR +SYNC_MONGODB_USER = KR +SYNC_MONGODB_PASS = 123456 + +# ============================================ +# 以下为:爬虫抓取的业务数据库 +# ============================================ + +#卡若的数据库 +KR_MONGODB_HOST = 192.168.2.8 +KR_MONGODB_PORT = 27017 +KR_MONGODB_DATABASE = admin +KR_MONGODB_USER = admin +KR_MONGODB_PASSWORD = key123456 +KR_MONGODB_AUTH_SOURCE=admin + diff --git a/Moncter/start_debug.sh b/Moncter/start_debug.sh new file mode 100644 index 00000000..971f0566 --- /dev/null +++ b/Moncter/start_debug.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# 数据采集任务调试启动脚本(显示实时日志) +# 使用方法: chmod +x start_debug.sh && ./start_debug.sh + +set -e + +echo "==================================================" +echo " 数据采集任务 - 调试模式启动" +echo " 实时显示所有日志输出" +echo "==================================================" +echo "" + +# 检查 PHP +if ! command -v php &> /dev/null; then + echo "❌ 错误: 未找到 PHP,请先安装 PHP" + exit 1 +fi + +echo "✓ PHP 版本: $(php -v | head -n 1)" +echo "" + +# 停止已有进程 +if [ -f "runtime/webman.pid" ]; then + echo "🛑 停止已运行的进程..." + php start.php stop + sleep 2 +fi + +# 以调试模式启动(不使用 daemon 模式,输出到终端) +echo "🚀 启动 Workerman(调试模式)..." +echo " 提示: 按 Ctrl+C 停止" +echo "==================================================" +echo "" + +# 使用 start 而不是 start -d(daemon),这样输出会显示在终端 +php start.php start + diff --git a/Moncter/support/bootstrap.php b/Moncter/support/bootstrap.php index d913defd..92ce480c 100644 --- a/Moncter/support/bootstrap.php +++ b/Moncter/support/bootstrap.php @@ -29,9 +29,17 @@ if (empty(Worker::$eventLoopClass)) { } set_error_handler(function ($level, $message, $file = '', $line = 0) { + // 忽略 MongoDB Laravel 的废弃警告(E_USER_DEPRECATED = 16384) + // 这些警告不影响功能,只是提示使用新的API + if ($level === E_USER_DEPRECATED && strpos($message, 'Using "$collection" property is deprecated') !== false) { + return true; // 忽略此警告 + } + if (error_reporting() & $level) { throw new ErrorException($message, 0, $level, $file, $line); } + + return false; }); if ($worker) { diff --git a/Moncter/yarn.lock b/Moncter/yarn.lock new file mode 100644 index 00000000..157d8630 --- /dev/null +++ b/Moncter/yarn.lock @@ -0,0 +1,2492 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ai-sdk/gateway@2.0.18": + version "2.0.18" + resolved "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.18.tgz" + integrity sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ== + dependencies: + "@ai-sdk/provider" "2.0.0" + "@ai-sdk/provider-utils" "3.0.18" + "@vercel/oidc" "3.0.5" + +"@ai-sdk/provider-utils@^3.0.0", "@ai-sdk/provider-utils@3.0.18": + version "3.0.18" + resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz" + integrity sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ== + dependencies: + "@ai-sdk/provider" "2.0.0" + "@standard-schema/spec" "^1.0.0" + eventsource-parser "^3.0.6" + +"@ai-sdk/provider@^2.0.0", "@ai-sdk/provider@2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz" + integrity sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA== + dependencies: + json-schema "^0.4.0" + +"@modelcontextprotocol/sdk@^1.24.2": + version "1.24.3" + resolved "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.24.3.tgz" + integrity sha512-YgSHW29fuzKKAHTGe9zjNoo+yF8KaQPzDC2W9Pv41E7/57IfY+AMGJ/aDFlgTLcVVELoggKE4syABCE75u3NCw== + dependencies: + ajv "^8.17.1" + ajv-formats "^3.0.1" + content-type "^1.0.5" + cors "^2.8.5" + cross-spawn "^7.0.5" + eventsource "^3.0.2" + eventsource-parser "^3.0.0" + express "^5.0.1" + express-rate-limit "^7.5.0" + jose "^6.1.1" + pkce-challenge "^5.0.0" + raw-body "^3.0.0" + zod "^3.25 || ^4.0" + zod-to-json-schema "^3.25.0" + +"@mongodb-js/atlas-local-win32-x64-msvc@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@mongodb-js/atlas-local-win32-x64-msvc/-/atlas-local-win32-x64-msvc-1.1.0.tgz" + integrity sha512-K+kGoGfIPqv6JstlzmnbkOOJ6/0cTH4bjRbEApmvscnTDBk1c9eO8nXORPQWFfKnMMxo+/9GQESvaxC05MhwBQ== + +"@mongodb-js/atlas-local@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@mongodb-js/atlas-local/-/atlas-local-1.1.0.tgz" + integrity sha512-ZGvBy8PdqNgcfZPaElSrmc3ItafSbodowipgQkJN65jKuAM8owETpMc8/ASxHTlI91y4sOll1V5WQR0FkqDHjA== + optionalDependencies: + "@mongodb-js/atlas-local-darwin-arm64" "1.1.0" + "@mongodb-js/atlas-local-darwin-x64" "1.1.0" + "@mongodb-js/atlas-local-linux-arm64-gnu" "1.1.0" + "@mongodb-js/atlas-local-linux-x64-gnu" "1.1.0" + "@mongodb-js/atlas-local-win32-x64-msvc" "1.1.0" + +"@mongodb-js/device-id@^0.3.1": + version "0.3.3" + resolved "https://registry.npmjs.org/@mongodb-js/device-id/-/device-id-0.3.3.tgz" + integrity sha512-y2SIriQec/HvIzFI1QCJAmjedShwbgmgUWkh3+qPgT2OyRKWE0yB7Lii/jANCtUNqqwBcUsMHY9/mPnuu5wfPQ== + +"@mongodb-js/devtools-connect@^3.9.4": + version "3.12.0" + resolved "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.12.0.tgz" + integrity sha512-/aiGAKE5k6y1noI6hFo3pkLarNCNjEn+J3iqWTAMBuX4SpKUWsDdpMAyyxkqou7qH97gvon4A7wQafWFgWTXvA== + dependencies: + "@mongodb-js/devtools-proxy-support" "^0.5.5" + "@mongodb-js/oidc-http-server-pages" "1.1.8" + lodash.merge "^4.6.2" + mongodb-connection-string-url "^3.0.0" + socks "^2.7.3" + optionalDependencies: + kerberos "^2.1.0" + mongodb-client-encryption "^6.1.0" + os-dns-native "^1.2.0" + resolve-mongodb-srv "^1.1.1" + +"@mongodb-js/devtools-proxy-support@^0.5.3", "@mongodb-js/devtools-proxy-support@^0.5.5": + version "0.5.5" + resolved "https://registry.npmjs.org/@mongodb-js/devtools-proxy-support/-/devtools-proxy-support-0.5.5.tgz" + integrity sha512-yrz6rCMgq+52SL34O16mvZsGeQs+Gq1rRmJiHxj/Ca6LNvJo+MhDHvISSwoiObl1hWdcnDz1qz5HyaxMzpkETg== + dependencies: + "@mongodb-js/socksv5" "^0.0.10" + agent-base "^7.1.1" + debug "^4.4.0" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.5" + lru-cache "^11.0.0" + node-fetch "^3.3.2" + pac-proxy-agent "^7.0.2" + socks-proxy-agent "^8.0.4" + ssh2 "^1.15.0" + system-ca "^2.0.1" + +"@mongodb-js/oidc-http-server-pages@1.1.8": + version "1.1.8" + resolved "https://registry.npmjs.org/@mongodb-js/oidc-http-server-pages/-/oidc-http-server-pages-1.1.8.tgz" + integrity sha512-qQjV6TTozJa3jMfsmajhCCzESnsTGa3rQwxGbC97GIplaF2v3jieLfDt9O/F6X3jLm32HzAEWHFEvKu74h2wxw== + +"@mongodb-js/oidc-plugin@^2.0.0", "@mongodb-js/oidc-plugin@^2.0.5": + version "2.0.6" + resolved "https://registry.npmjs.org/@mongodb-js/oidc-plugin/-/oidc-plugin-2.0.6.tgz" + integrity sha512-Ma38DqIKTddMQhKrHwx/T+4nFvrTAy5RVWjDQzHv4W9W/lwnZqJWxayDDKwrrd+Gg1xuj5o4GVbkr3A5hI0f1w== + dependencies: + express "^5.1.0" + node-fetch "^3.3.2" + open "^10.1.2" + openid-client "^6.6.3" + +"@mongodb-js/saslprep@^1.3.0": + version "1.3.2" + resolved "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.2.tgz" + integrity sha512-QgA5AySqB27cGTXBFmnpifAi7HxoGUeezwo6p9dI03MuDB6Pp33zgclqVb6oVK3j6I9Vesg0+oojW2XxB59SGg== + dependencies: + sparse-bitfield "^3.0.3" + +"@mongodb-js/socksv5@^0.0.10": + version "0.0.10" + resolved "https://registry.npmjs.org/@mongodb-js/socksv5/-/socksv5-0.0.10.tgz" + integrity sha512-JDz2fLKsjMiSNUxKrCpGptsgu7DzsXfu4gnUQ3RhUaBS1d4YbLrt6HejpckAiHIAa+niBpZAeiUsoop0IihWsw== + dependencies: + ip-address "^9.0.5" + +"@mongosh/arg-parser@^3.23.0": + version "3.23.0" + resolved "https://registry.npmjs.org/@mongosh/arg-parser/-/arg-parser-3.23.0.tgz" + integrity sha512-V9lr8LEHI9XKEgBEqPAVDi+CNdl6MNBSJ8A5LAk+vfBM+bdhhtSrANIqUhuEzyV4yNyEqNfYFtqLLhjZd7/doA== + dependencies: + "@mongosh/errors" "2.4.5" + "@mongosh/i18n" "^2.20.0" + mongodb-connection-string-url "^3.0.2" + yargs-parser "^20.2.4" + +"@mongosh/errors@^2.4.5", "@mongosh/errors@2.4.5": + version "2.4.5" + resolved "https://registry.npmjs.org/@mongosh/errors/-/errors-2.4.5.tgz" + integrity sha512-niqLgzPv6ZG9Bx0XRJP3NCA9zZM6LbRs/z05GRwJP0B3HShYDKWi7B0D4N/u6RoEt93Y6mMa9Ok72dNSDpIEwA== + +"@mongosh/i18n@^2.20.0": + version "2.20.0" + resolved "https://registry.npmjs.org/@mongosh/i18n/-/i18n-2.20.0.tgz" + integrity sha512-g0zuKuZ5JhS/ASDizZlqLDzy1yqeMbs5tg40TxMl/55rM2EOPV1MSlfBZg7X0tyxUOATy1sLHWsUquzQSFjVjQ== + dependencies: + "@mongosh/errors" "2.4.5" + +"@mongosh/service-provider-core@3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@mongosh/service-provider-core/-/service-provider-core-3.7.0.tgz" + integrity sha512-a9riCeAkV69UZjFsNmanufMxhqJ3oDbB+Zm5h2DS0YA/cnDarpGOGPEMhi0VmnzcbDK3nmZy6DPOxtx0w4cVZQ== + dependencies: + "@mongosh/errors" "2.4.5" + "@mongosh/shell-bson" "1.1.0" + bson "^6.10.4" + mongodb "^6.19.0" + mongodb-build-info "^1.8.1" + mongodb-connection-string-url "^3.0.2" + +"@mongosh/service-provider-node-driver@^3.17.5": + version "3.18.0" + resolved "https://registry.npmjs.org/@mongosh/service-provider-node-driver/-/service-provider-node-driver-3.18.0.tgz" + integrity sha512-tQy40wpVd/xskQTXHVLwi7v9olHxFyIqSIF06kpl/q4BPPlKxI0jCA5xdy+lk+tvDMJ80Pams0RUonRjNulVzQ== + dependencies: + "@mongodb-js/devtools-connect" "^3.9.4" + "@mongodb-js/oidc-plugin" "^2.0.5" + "@mongosh/errors" "2.4.5" + "@mongosh/service-provider-core" "3.7.0" + "@mongosh/types" "^3.14.1" + aws4 "^1.12.0" + mongodb "^6.19.0" + mongodb-build-info "^1.8.1" + mongodb-connection-string-url "^3.0.2" + socks "^2.8.3" + optionalDependencies: + kerberos "2.1.0" + mongodb-client-encryption "^6.5.0" + +"@mongosh/shell-bson@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@mongosh/shell-bson/-/shell-bson-1.1.0.tgz" + integrity sha512-eSkEvikWNPiFghiOx0puWqP28nXs/4dIHxIjbqORGEmDy/DaJXxGydYQKiUL2pebQAudoSQnzsFKyb0WQvypxw== + dependencies: + "@mongosh/errors" "^2.4.5" + +"@mongosh/types@^3.14.1": + version "3.14.1" + resolved "https://registry.npmjs.org/@mongosh/types/-/types-3.14.1.tgz" + integrity sha512-jX3Z/EmKmwPiHYSSALxAjeBHXGL1XMkEBOz0CCeE1dexCyMTyGf9H78cn+emBAVuyGQHhfo5WhyQhycNtDUZAQ== + dependencies: + "@mongodb-js/devtools-connect" "^3.9.4" + +"@opentelemetry/api@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" + integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== + +"@standard-schema/spec@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz" + integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA== + +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + +"@types/webidl-conversions@*": + version "7.0.3" + resolved "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz" + integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== + +"@types/whatwg-url@^11.0.2": + version "11.0.5" + resolved "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz" + integrity sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ== + dependencies: + "@types/webidl-conversions" "*" + +"@vercel/oidc@3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz" + integrity sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw== + +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + +agent-base@^7.1.0, agent-base@^7.1.1, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + +ai@^5.0.72: + version "5.0.107" + resolved "https://registry.npmjs.org/ai/-/ai-5.0.107.tgz" + integrity sha512-laZlS9ZC/DZfSaxPgrBqI4mM+kxRvTPBBQfa74ceBFskkunZKEsaGVFNEs4cfyGa3nCCCl1WO/fjxixp4V8Zag== + dependencies: + "@ai-sdk/gateway" "2.0.18" + "@ai-sdk/provider" "2.0.0" + "@ai-sdk/provider-utils" "3.0.18" + "@opentelemetry/api" "1.9.0" + +ajv-formats@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + +ajv@^8.0.0, ajv@^8.17.1: + version "8.17.1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +asn1@^0.2.6: + version "0.2.6" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +aws4@^1.12.0: + version "1.13.2" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz" + integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +basic-ftp@^5.0.2: + version "5.0.5" + resolved "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz" + integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== + +bcrypt-pbkdf@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz" + integrity sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw== + dependencies: + bytes "^3.1.2" + content-type "^1.0.5" + debug "^4.4.3" + http-errors "^2.0.0" + iconv-lite "^0.7.0" + on-finished "^2.4.1" + qs "^6.14.0" + raw-body "^3.0.1" + type-is "^2.0.1" + +bson@^6.10.4, "bson@^6.10.4 || ^7.0.0", bson@^6.7.0, bson@6.x: + version "6.10.4" + resolved "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz" + integrity sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + +bytes@^3.1.2, bytes@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +cli-table@^0.3.4: + version "0.3.11" + resolved "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz" + integrity sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ== + dependencies: + colors "1.0.3" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" + integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== + +content-disposition@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz" + integrity sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q== + +content-type@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== + +cookie@^0.7.1: + version "0.7.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^7.0.5: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.3, debug@4: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +default-browser-id@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz" + integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== + +default-browser@^5.2.1: + version "5.4.0" + resolved "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz" + integrity sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + +depd@^2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +detect-libc@^2.0.0: + version "2.1.2" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.5" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + +es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.9: + version "1.24.0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz" + integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@^1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventsource-parser@^3.0.0, eventsource-parser@^3.0.1, eventsource-parser@^3.0.6: + version "3.0.6" + resolved "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz" + integrity sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg== + +eventsource@^3.0.2: + version "3.0.7" + resolved "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz" + integrity sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA== + dependencies: + eventsource-parser "^3.0.1" + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +express-rate-limit@^7.5.0: + version "7.5.1" + resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz" + integrity sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw== + +express@^5.0.1, express@^5.1.0, "express@>= 4.11": + version "5.2.1" + resolved "https://registry.npmjs.org/express/-/express-5.2.1.tgz" + integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== + dependencies: + accepts "^2.0.0" + body-parser "^2.2.1" + content-disposition "^1.0.0" + content-type "^1.0.5" + cookie "^0.7.1" + cookie-signature "^1.2.1" + debug "^4.4.0" + depd "^2.0.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + finalhandler "^2.1.0" + fresh "^2.0.0" + http-errors "^2.0.0" + merge-descriptors "^2.0.0" + mime-types "^3.0.0" + on-finished "^2.4.1" + once "^1.4.0" + parseurl "^1.3.3" + proxy-addr "^2.0.7" + qs "^6.14.0" + range-parser "^1.2.1" + router "^2.2.0" + send "^1.1.0" + serve-static "^2.2.0" + statuses "^2.0.1" + type-is "^2.0.1" + vary "^1.1.2" + +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-uri@^3.0.1: + version "3.1.0" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz" + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== + +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +finalhandler@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz" + integrity sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== + dependencies: + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + on-finished "^2.4.1" + parseurl "^1.3.3" + statuses "^2.0.1" + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +generator-function@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz" + integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-uri@^6.0.1: + version "6.0.5" + resolved "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz" + integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +heap-js@^2.3.0: + version "2.7.1" + resolved "https://registry.npmjs.org/heap-js/-/heap-js-2.7.1.tgz" + integrity sha512-EQfezRg0NCZGNlhlDR3Evrw1FVL2G3LhU7EgPoxufQKruNBSYA8MiRPHeWbU+36o+Fhel0wMwM+sLEiBAlNLJA== + +http-errors@^2.0.0, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-proxy-agent@^7.0.5, https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +iconv-lite@^0.7.0, iconv-lite@~0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz" + integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +ip-address@^10.0.1: + version "10.1.0" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz" + integrity sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q== + +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.1.2" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz" + integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== + dependencies: + call-bound "^1.0.4" + generator-function "^2.0.0" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isnumber@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isnumber/-/isnumber-1.0.0.tgz" + integrity sha512-JLiSz/zsZcGFXPrB4I/AGBvtStkt+8QmksyZBZnVXnnK9XdTEyz0tX8CRYljtwYDuIuZzih6DpHQdi+3Q6zHPw== + +jose@^6.1.0, jose@^6.1.1: + version "6.1.3" + resolved "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz" + integrity sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ== + +js-yaml@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== + dependencies: + argparse "^2.0.1" + +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +kerberos@^2.0.1, kerberos@^2.1.0, kerberos@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/kerberos/-/kerberos-2.2.2.tgz" + integrity sha512-42O7+/1Zatsc3MkxaMPpXcIl/ukIrbQaGoArZEAr6GcEi2qhfprOBYOPhj+YvSMJkEkdpTjApUx+2DuWaKwRhg== + dependencies: + node-addon-api "^6.1.0" + prebuild-install "^7.1.2" + +kerberos@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/kerberos/-/kerberos-2.1.0.tgz" + integrity sha512-HvOl6O6cyEN/8Z4CAocHe/sekJtvt5UrxUdCuu7bXDZ2Hnsy6OpsQbISW+lpm03vrbO2ir+1QQ5Sx/vMEhHnog== + dependencies: + bindings "^1.5.0" + node-addon-api "^6.1.0" + prebuild-install "7.1.1" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lru-cache@^11.0.0, lru-cache@^11.1.0: + version "11.2.4" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz" + integrity sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +media-typer@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== + +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== + +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^3.0.0, mime-types@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== + dependencies: + mime-db "^1.54.0" + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimist@^1.2.0, minimist@^1.2.3: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mongodb-build-info@^1.8.1: + version "1.8.2" + resolved "https://registry.npmjs.org/mongodb-build-info/-/mongodb-build-info-1.8.2.tgz" + integrity sha512-VJ5iB7ca3bxSyBKQGNVkGszF7U3U0IP71Kym0Mw1Y7EquCIFgbBVdEgwpLa3R02les41TXIo+x4D+pUXO6ttrw== + dependencies: + debug "^4.4.0" + mongodb-connection-string-url "^3.0.0" + +mongodb-client-encryption@^6.1.0, mongodb-client-encryption@^6.5.0, "mongodb-client-encryption@>=6.0.0 <7": + version "6.5.0" + resolved "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-6.5.0.tgz" + integrity sha512-Gj8EeyYKsssdko0NKhWRBGDif6uVFBbv+e+Nyn7E316UmRzApc4IP+p2NLm+av+fU+dFHVT5WqfzaQVDTh8i9w== + dependencies: + node-addon-api "^4.3.0" + prebuild-install "^7.1.3" + +mongodb-connection-string-url@^3.0.0, "mongodb-connection-string-url@^3.0.1 || ^7.0.0", mongodb-connection-string-url@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz" + integrity sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA== + dependencies: + "@types/whatwg-url" "^11.0.2" + whatwg-url "^14.1.0 || ^13.0.0" + +mongodb-log-writer@^2.4.1, mongodb-log-writer@^2.4.4: + version "2.4.4" + resolved "https://registry.npmjs.org/mongodb-log-writer/-/mongodb-log-writer-2.4.4.tgz" + integrity sha512-vGOzdF9ta+wUiHsqbEcRQ1COzTIKXy4vhOWkPCvOacWCeNsFS7LLp6Vg9LT95Z/09gSjnD1WDeYhxTqZXEgcWQ== + dependencies: + heap-js "^2.3.0" + +mongodb-mcp-server@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/mongodb-mcp-server/-/mongodb-mcp-server-1.3.0.tgz" + integrity sha512-uN1fs+N8NyC/AncvZdb2LGOTSeOXkB3D6A1GlDB+U932lxsp76WNRVziVF9SNfwOo+6E0vvk9aS1mqgR5tSrXw== + dependencies: + "@modelcontextprotocol/sdk" "^1.24.2" + "@mongodb-js/device-id" "^0.3.1" + "@mongodb-js/devtools-proxy-support" "^0.5.3" + "@mongosh/arg-parser" "^3.23.0" + "@mongosh/service-provider-node-driver" "^3.17.5" + ai "^5.0.72" + bson "^6.10.4" + express "^5.1.0" + lru-cache "^11.1.0" + mongodb-connection-string-url "^3.0.2" + mongodb-log-writer "^2.4.1" + mongodb-redact "^1.3.0" + mongodb-schema "^12.6.2" + node-fetch "^3.3.2" + node-machine-id "1.1.12" + oauth4webapi "^3.8.0" + openapi-fetch "^0.15.0" + ts-levenshtein "^1.0.7" + voyage-ai-provider "^2.0.0" + zod "^3.25.76" + optionalDependencies: + "@mongodb-js/atlas-local" "^1.1.0" + kerberos "^2.2.2" + +mongodb-ns@^3.0.1: + version "3.0.3" + resolved "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.0.3.tgz" + integrity sha512-ctpHlSXGYlIim3JSgcsQjNkgB4CWvwWSFIxKFphSY/MoY/2i6E5rtVkOt1FBbSjEJYa2XvD4c+G2BbLfjhQqaQ== + +mongodb-redact@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/mongodb-redact/-/mongodb-redact-1.3.0.tgz" + integrity sha512-6qMkQ9RnB7Z92G8c4mCkrDGaqwekuaUreaX+XnjAl/t3oKHJ+u7C+kfFLxSueJIBc1qtI4AtK0TO4yxOHyJqTw== + dependencies: + mongodb-connection-string-url "^3.0.1 || ^7.0.0" + regexp.escape "^2.0.1" + +mongodb-schema@^12.6.2: + version "12.6.3" + resolved "https://registry.npmjs.org/mongodb-schema/-/mongodb-schema-12.6.3.tgz" + integrity sha512-JiAZtM9GVMTLJYJpEnAPq0/ulH9U7qBR48Bx0mOiStVGFkY3mpIlgEGOl5tVRLEvCxDKqnvtdfSSX7pWFRLlzA== + dependencies: + reservoir "^0.1.2" + optionalDependencies: + bson "^6.7.0" + cli-table "^0.3.4" + js-yaml "^4.0.0" + mongodb "^6.6.1" + mongodb-ns "^3.0.1" + numeral "^2.0.6" + progress "^2.0.3" + stats-lite "^2.0.0" + yargs "^17.6.2" + +mongodb@^6.19.0, mongodb@^6.6.1, mongodb@^6.9.0: + version "6.21.0" + resolved "https://registry.npmjs.org/mongodb/-/mongodb-6.21.0.tgz" + integrity sha512-URyb/VXMjJ4da46OeSXg+puO39XH9DeQpWCslifrRn9JWugy0D+DvvBvkm2WxmHe61O/H19JM66p1z7RHVkZ6A== + dependencies: + "@mongodb-js/saslprep" "^1.3.0" + bson "^6.10.4" + mongodb-connection-string-url "^3.0.2" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + +node-abi@^3.3.0: + version "3.85.0" + resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz" + integrity sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg== + dependencies: + semver "^7.3.5" + +node-addon-api@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + +node-machine-id@1.1.12: + version "1.1.12" + resolved "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz" + integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== + +numeral@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz" + integrity sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA== + +oauth4webapi@^3.8.0, oauth4webapi@^3.8.2: + version "3.8.3" + resolved "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.3.tgz" + integrity sha512-pQ5BsX3QRTgnt5HxgHwgunIRaDXBdkT23tf8dfzmtTIL2LTpdmxgbpbBm0VgFWAIDlezQvQCTgnVIUmHupXHxw== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +on-finished@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +open@^10.1.2: + version "10.2.0" + resolved "https://registry.npmjs.org/open/-/open-10.2.0.tgz" + integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + wsl-utils "^0.1.0" + +openapi-fetch@^0.15.0: + version "0.15.0" + resolved "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.15.0.tgz" + integrity sha512-OjQUdi61WO4HYhr9+byCPMj0+bgste/LtSBEcV6FzDdONTs7x0fWn8/ndoYwzqCsKWIxEZwo4FN/TG1c1rI8IQ== + dependencies: + openapi-typescript-helpers "^0.0.15" + +openapi-typescript-helpers@^0.0.15: + version "0.0.15" + resolved "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz" + integrity sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw== + +openid-client@^6.6.3: + version "6.8.1" + resolved "https://registry.npmjs.org/openid-client/-/openid-client-6.8.1.tgz" + integrity sha512-VoYT6enBo6Vj2j3Q5Ec0AezS+9YGzQo1f5Xc42lreMGlfP4ljiXPKVDvCADh+XHCV/bqPu/wWSiCVXbJKvrODw== + dependencies: + jose "^6.1.0" + oauth4webapi "^3.8.2" + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +pac-proxy-agent@^7.0.2: + version "7.2.0" + resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.1.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" + +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + +parseurl@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-to-regexp@^8.0.0: + version "8.3.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz" + integrity sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA== + +pkce-challenge@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz" + integrity sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ== + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +prebuild-install@^7.1.2, prebuild-install@^7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +prebuild-install@7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +proxy-addr@^2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pump@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz" + integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@^6.14.0: + version "6.14.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== + dependencies: + side-channel "^1.1.0" + +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@^3.0.0, raw-body@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz" + integrity sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.7.0" + unpipe "~1.0.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regexp.escape@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/regexp.escape/-/regexp.escape-2.0.1.tgz" + integrity sha512-JItRb4rmyTzmERBkAf6J87LjDPy/RscIwmaJQ3gsFlAzrmZbZU8LwBw5IydFZXW9hqpgbPlGbMhtpqtuAhMgtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + for-each "^0.3.3" + safe-regex-test "^1.0.3" + +regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +reservoir@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/reservoir/-/reservoir-0.1.2.tgz" + integrity sha512-ysyw95gLBhMAzqIVrOHJ2yMrRQHAS+h97bS9r89Z7Ou10Jhl2k5KOsyjPqrxL+WfEanov0o5bAMVzQ7AKyENHA== + +resolve-mongodb-srv@^1.1.1: + version "1.1.6" + resolved "https://registry.npmjs.org/resolve-mongodb-srv/-/resolve-mongodb-srv-1.1.6.tgz" + integrity sha512-eeHKsU9+zD7NGw+QI8SVNvcawIF0rT5/WmnVC5qHHJBsUW1ZZaJ1SBaT0eEv3ex+YBg4yaQVfwsCn8pD5q1Ggw== + dependencies: + whatwg-url "^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0" + +router@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/router/-/router-2.2.0.tgz" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== + dependencies: + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" + +run-applescript@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz" + integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + +safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^7.3.5: + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + +send@^1.1.0, send@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/send/-/send-1.2.0.tgz" + integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== + dependencies: + debug "^4.3.5" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + fresh "^2.0.0" + http-errors "^2.0.0" + mime-types "^3.0.1" + ms "^2.1.3" + on-finished "^2.4.1" + range-parser "^1.2.1" + statuses "^2.0.1" + +serve-static@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz" + integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== + dependencies: + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.2.0" + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +setprototypeof@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^8.0.4, socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.7.1, socks@^2.7.3, socks@^2.8.3: + version "2.8.7" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz" + integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== + dependencies: + ip-address "^10.0.1" + smart-buffer "^4.2.0" + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz" + integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== + dependencies: + memory-pager "^1.0.2" + +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +ssh2@^1.15.0: + version "1.17.0" + resolved "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz" + integrity sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ== + dependencies: + asn1 "^0.2.6" + bcrypt-pbkdf "^1.0.2" + optionalDependencies: + cpu-features "~0.0.10" + nan "^2.23.0" + +stats-lite@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/stats-lite/-/stats-lite-2.2.0.tgz" + integrity sha512-/Kz55rgUIv2KP2MKphwYT/NCuSfAlbbMRv2ZWw7wyXayu230zdtzhxxuXXcvsc6EmmhS8bSJl3uS1wmMHFumbA== + dependencies: + isnumber "~1.0.0" + +statuses@^2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +system-ca@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/system-ca/-/system-ca-2.0.1.tgz" + integrity sha512-9ZDV9yl8ph6Op67wDGPr4LykX86usE9x3le+XZSHfVMiiVJ5IRgmCWjLgxyz35ju9H3GDIJJZm4ogAeIfN5cQQ== + optionalDependencies: + macos-export-certificate-and-key "^1.2.0" + win-export-certificate-and-key "^2.1.0" + +tar-fs@^2.0.0: + version "2.1.4" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz" + integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +toidentifier@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@^5.1.0: + version "5.1.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz" + integrity sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw== + dependencies: + punycode "^2.3.1" + +ts-levenshtein@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/ts-levenshtein/-/ts-levenshtein-1.0.7.tgz" + integrity sha512-wautEf7gl2ITJuRTTYxnlrLjzUUcwFSdg46bcu4RlzoE/zQM++TJjBFRf2Xhil49GiHqKCqmpjf1lBkWnAHj0A== + +tslib@^2.0.1: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-is@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz" + integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== + dependencies: + content-type "^1.0.5" + media-typer "^1.1.0" + mime-types "^3.0.0" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +vary@^1, vary@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +voyage-ai-provider@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/voyage-ai-provider/-/voyage-ai-provider-2.0.0.tgz" + integrity sha512-AX00egENhHOAfuHAhvmoBVQNG6+f717763CfyPefjahDTxbt6nCE0IlDXn5nkzLIu00JoM/PDFYDYQ17NYQqPw== + dependencies: + "@ai-sdk/provider" "^2.0.0" + "@ai-sdk/provider-utils" "^3.0.0" + +web-streams-polyfill@^3.0.3: + version "3.3.3" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +"whatwg-url@^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0", "whatwg-url@^14.1.0 || ^13.0.0": + version "14.2.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz" + integrity sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw== + dependencies: + tr46 "^5.1.0" + webidl-conversions "^7.0.0" + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.19" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +wsl-utils@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz" + integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== + dependencies: + is-wsl "^3.1.0" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^20.2.4: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.6.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +zod-to-json-schema@^3.25.0: + version "3.25.0" + resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz" + integrity sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ== + +"zod@^3.25 || ^4", "zod@^3.25 || ^4.0", zod@^3.25.76, "zod@^3.25.76 || ^4", "zod@^3.25.76 || ^4.1.8": + version "3.25.76" + resolved "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz" + integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== diff --git a/Touchkebao/.gitignore b/Touchkebao/.gitignore index 34d25ecb..dcf55aed 100644 --- a/Touchkebao/.gitignore +++ b/Touchkebao/.gitignore @@ -3,6 +3,4 @@ dist/ build/ yarn.lock .env -.DS_Store -.specstory/ -.cursorindexingignore +.DS_Store \ No newline at end of file