commit a9613544b7a84dd1ebe271a7a1e9d23b81426b57 Author: xzeldon Date: Sat Nov 25 14:33:11 2023 +0300 Initial commit diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..6041f98 --- /dev/null +++ b/.env.sample @@ -0,0 +1,4 @@ +NODE_ENV=development +BOT_TOKEN= +FOOOCOS_API_URL= +DUMMY_CHAT_ID= \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..382309e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.vscode +node_modules +.env \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..00c1db6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Timofey Gelazoniya + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f2221d6 --- /dev/null +++ b/README.md @@ -0,0 +1,137 @@ +# fooocos-telegram-bot + +![bot](static/gorilla.gif) + +#### ⚠️ The project may contain some bugs and errors, provided as is + +Dynamic inline bot leveraging the robust capabilities of Fooocos for image generation. This bot integrates seamlessly with Telegram, offering an intuitive and engaging user experience. + +Current [FooocosAPI](https://github.com/konieshadow/Fooocus-API/tree/bf2f2c745a159e13b8de93fd000470ed98c973c4) commit hash: `bf2f2c745a159e13b8de93fd000470ed98c973c4` + +> Mirror on my [ Git](https://git.zeldon.ru/zeldon/fooocos-telegram-bot.git) + +# Getting Started + +## System Requirements +Before diving in, ensure your system meets these prerequisites: + +- Git +- Python >= 3.10 +- NodeJS >= 20 +- An Nvidia GPU with a minimum of 4GB VRAM (other GPUs may be supported; check the [official Fooocos repository](https://github.com/konieshadow/Fooocus-API) for details). + +## Installation Guide for Windows + +> This guide for **Windows** only, but for Linux the logic is exactly the same, but the commands may be slightly different + +### Install the correct FooocosAPI version locally: + +1. Clone the FooocosAPI repository: + +```bash +git clone https://github.com/konieshadow/Fooocus-API/tree/bf2f2c745a159e13b8de93fd000470ed98c973c4 +``` +2. Navigate to the cloned directory: + +```bash +cd Fooocus-API +``` +3. Create and activate a Python virtual environment: + +```bash +python -m venv venv +.\venv\Scripts\activate +``` + +4. Install requirements: + +```bash +pip install -r requirements.txt +``` +5. Launch FooocosAPI: + +```bash +python .\main.py --host 0.0.0.0 +``` +If successful, you should see output similar to this: + +![output](static/output.png) + +For subsequent runs, simply activate the virtual environment and start the API: + +```bash +.\venv\Scripts\activate +python .\main.py --host 0.0.0.0 +``` + +> Tip: You can also try the [latest FooocosAPI version](https://github.com/konieshadow/Fooocus-API), but you might need to regenerate the client (`npm run fooocos:typegen`) and address any TypeScript compiler errors. + +### Setting Up the Bot: + +1. Clone this repository + +```bash +git clone https://github.com/xzeldon/fooocos-telegram-bot.git +``` + +2. Install dependencies: + +```bash +npm i +``` + +3. Prepare your configuration file: + +- Duplicate the `.env.sample` file and rename it to `.env`. +- Edit the `.env` file with your specific details as per the table below: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VariableTypeDescription
NODE_ENVStringSpecifies the application environment. (development or production)
BOT_TOKEN + String + + Telegram Bot API token obtained from @BotFather. +
FOOOCOS_API_URLStringURL of the Fooocos-API endpoint.
DUMMY_CHAT_IDStringID of a dummy chat for uploading images to retrieve their file_id for inline message editing.
+ +4. Start the bot: + + - For development with hot reload: + ```bash + npm run dev + ``` + + - For standard operation: + ```bash + npm run start + ``` + +# License +This project is open-source, licensed under the MIT License. Feel free to use, modify, and distribute it as you see fit. \ No newline at end of file diff --git a/fooocos/client.ts b/fooocos/client.ts new file mode 100644 index 0000000..d73aa83 --- /dev/null +++ b/fooocos/client.ts @@ -0,0 +1,6 @@ +import createClient from "openapi-fetch"; +import { paths } from './schema.js'; + +export const fooocos = createClient({ + baseUrl: process.env["FOOOCOS_API_URL"] +}); \ No newline at end of file diff --git a/fooocos/openapi.json b/fooocos/openapi.json new file mode 100644 index 0000000..e4efe7f --- /dev/null +++ b/fooocos/openapi.json @@ -0,0 +1,1814 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "FastAPI", + "version": "0.1.0" + }, + "paths": { + "/": { + "get": { + "summary": "Home", + "operationId": "home__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/v1/generation/text-to-image": { + "post": { + "summary": "Text2Img Generation", + "operationId": "text2img_generation_v1_generation_text_to_image_post", + "parameters": [ + { + "name": "accept", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Parameter to overvide 'Accept' header, 'image/png' for output bytes", + "title": "Accept" + }, + "description": "Parameter to overvide 'Accept' header, 'image/png' for output bytes" + }, + { + "name": "accept", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Accept" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Text2ImgRequest" + } + } + } + }, + "responses": { + "200": { + "description": "PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/GeneratedImageResult" + } + }, + { + "$ref": "#/components/schemas/AsyncJobResponse" + } + ], + "title": "Response Text2Img Generation V1 Generation Text To Image Post" + }, + "example": [ + { + "base64": "...very long string...", + "seed": 1050625087, + "finish_reason": "SUCCESS" + } + ] + }, + "application/json async": { + "example": { + "job_id": 1, + "job_type": "Text to Image" + } + }, + "image/png": { + "example": "PNG bytes, what did you expect?" + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/generation/image-upscale-vary": { + "post": { + "summary": "Img Upscale Or Vary", + "operationId": "img_upscale_or_vary_v1_generation_image_upscale_vary_post", + "parameters": [ + { + "name": "accept", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Parameter to overvide 'Accept' header, 'image/png' for output bytes", + "title": "Accept" + }, + "description": "Parameter to overvide 'Accept' header, 'image/png' for output bytes" + }, + { + "name": "accept", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Accept" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post" + } + } + } + }, + "responses": { + "200": { + "description": "PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/GeneratedImageResult" + } + }, + { + "$ref": "#/components/schemas/AsyncJobResponse" + } + ], + "title": "Response Img Upscale Or Vary V1 Generation Image Upscale Vary Post" + }, + "example": [ + { + "base64": "...very long string...", + "seed": 1050625087, + "finish_reason": "SUCCESS" + } + ] + }, + "application/json async": { + "example": { + "job_id": 1, + "job_type": "Text to Image" + } + }, + "image/png": { + "example": "PNG bytes, what did you expect?" + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/generation/image-inpait-outpaint": { + "post": { + "summary": "Img Inpaint Or Outpaint", + "operationId": "img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post", + "parameters": [ + { + "name": "accept", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Parameter to overvide 'Accept' header, 'image/png' for output bytes", + "title": "Accept" + }, + "description": "Parameter to overvide 'Accept' header, 'image/png' for output bytes" + }, + { + "name": "accept", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Accept" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post" + } + } + } + }, + "responses": { + "200": { + "description": "PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/GeneratedImageResult" + } + }, + { + "$ref": "#/components/schemas/AsyncJobResponse" + } + ], + "title": "Response Img Inpaint Or Outpaint V1 Generation Image Inpait Outpaint Post" + }, + "example": [ + { + "base64": "...very long string...", + "seed": 1050625087, + "finish_reason": "SUCCESS" + } + ] + }, + "application/json async": { + "example": { + "job_id": 1, + "job_type": "Text to Image" + } + }, + "image/png": { + "example": "PNG bytes, what did you expect?" + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/generation/image-prompt": { + "post": { + "summary": "Img Prompt", + "operationId": "img_prompt_v1_generation_image_prompt_post", + "parameters": [ + { + "name": "accept", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Parameter to overvide 'Accept' header, 'image/png' for output bytes", + "title": "Accept" + }, + "description": "Parameter to overvide 'Accept' header, 'image/png' for output bytes" + }, + { + "name": "accept", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "Accept" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/Body_img_prompt_v1_generation_image_prompt_post" + } + ], + "title": "Body" + } + } + } + }, + "responses": { + "200": { + "description": "PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/GeneratedImageResult" + } + }, + { + "$ref": "#/components/schemas/AsyncJobResponse" + } + ], + "title": "Response Img Prompt V1 Generation Image Prompt Post" + }, + "example": [ + { + "base64": "...very long string...", + "seed": 1050625087, + "finish_reason": "SUCCESS" + } + ] + }, + "application/json async": { + "example": { + "job_id": 1, + "job_type": "Text to Image" + } + }, + "image/png": { + "example": "PNG bytes, what did you expect?" + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/generation/query-job": { + "get": { + "summary": "Query Job", + "description": "Query async generation job", + "operationId": "query_job_v1_generation_query_job_get", + "parameters": [ + { + "name": "job_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "title": "Job Id" + } + }, + { + "name": "require_step_preivew", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false, + "title": "Require Step Preivew" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AsyncJobResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/generation/job-queue": { + "get": { + "summary": "Job Queue", + "description": "Query job queue info", + "operationId": "job_queue_v1_generation_job_queue_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobQueueInfo" + } + } + } + } + } + } + }, + "/v1/generation/stop": { + "post": { + "summary": "Stop", + "description": "Job stoping", + "operationId": "stop_v1_generation_stop_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StopResponse" + } + } + } + } + } + } + }, + "/v1/engines/all-models": { + "get": { + "summary": "All Models", + "description": "Get all filenames of base model and lora", + "operationId": "all_models_v1_engines_all_models_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AllModelNamesResponse" + } + } + } + } + } + } + }, + "/v1/engines/refresh-models": { + "post": { + "summary": "Refresh Models", + "description": "Refresh local files and get all filenames of base model and lora", + "operationId": "refresh_models_v1_engines_refresh_models_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AllModelNamesResponse" + } + } + } + } + } + } + }, + "/v1/engines/styles": { + "get": { + "summary": "All Styles", + "description": "Get all legal Fooocus styles", + "operationId": "all_styles_v1_engines_styles_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Response All Styles V1 Engines Styles Get" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AdvancedParams": { + "properties": { + "disable_preview": { + "type": "boolean", + "title": "Disable Preview", + "description": "Disable preview during generation", + "default": false + }, + "adm_scaler_positive": { + "type": "number", + "maximum": 3.0, + "minimum": 0.1, + "title": "Adm Scaler Positive", + "description": "Positive ADM Guidance Scaler", + "default": 1.5 + }, + "adm_scaler_negative": { + "type": "number", + "maximum": 3.0, + "minimum": 0.1, + "title": "Adm Scaler Negative", + "description": "Negative ADM Guidance Scaler", + "default": 0.8 + }, + "adm_scaler_end": { + "type": "number", + "maximum": 1.0, + "minimum": 0.0, + "title": "Adm Scaler End", + "description": "ADM Guidance End At Step", + "default": 0.3 + }, + "refiner_swap_method": { + "type": "string", + "title": "Refiner Swap Method", + "description": "Refiner swap method", + "default": "joint" + }, + "adaptive_cfg": { + "type": "number", + "maximum": 30.0, + "minimum": 1.0, + "title": "Adaptive Cfg", + "description": "CFG Mimicking from TSNR", + "default": 7.0 + }, + "sampler_name": { + "type": "string", + "title": "Sampler Name", + "description": "Sampler", + "default": "dpmpp_2m_sde_gpu" + }, + "scheduler_name": { + "type": "string", + "title": "Scheduler Name", + "description": "Scheduler", + "default": "karras" + }, + "overwrite_step": { + "type": "integer", + "maximum": 200.0, + "minimum": -1.0, + "title": "Overwrite Step", + "description": "Forced Overwrite of Sampling Step", + "default": -1 + }, + "overwrite_switch": { + "type": "integer", + "maximum": 200.0, + "minimum": -1.0, + "title": "Overwrite Switch", + "description": "Forced Overwrite of Refiner Switch Step", + "default": -1 + }, + "overwrite_width": { + "type": "integer", + "maximum": 2048.0, + "minimum": -1.0, + "title": "Overwrite Width", + "description": "Forced Overwrite of Generating Width", + "default": -1 + }, + "overwrite_height": { + "type": "integer", + "maximum": 2048.0, + "minimum": -1.0, + "title": "Overwrite Height", + "description": "Forced Overwrite of Generating Height", + "default": -1 + }, + "overwrite_vary_strength": { + "type": "number", + "maximum": 1.0, + "minimum": -1.0, + "title": "Overwrite Vary Strength", + "description": "Forced Overwrite of Denoising Strength of \"Vary\"", + "default": -1 + }, + "overwrite_upscale_strength": { + "type": "number", + "maximum": 1.0, + "minimum": -1.0, + "title": "Overwrite Upscale Strength", + "description": "Forced Overwrite of Denoising Strength of \"Upscale\"", + "default": -1 + }, + "mixing_image_prompt_and_vary_upscale": { + "type": "boolean", + "title": "Mixing Image Prompt And Vary Upscale", + "description": "Mixing Image Prompt and Vary/Upscale", + "default": false + }, + "mixing_image_prompt_and_inpaint": { + "type": "boolean", + "title": "Mixing Image Prompt And Inpaint", + "description": "Mixing Image Prompt and Inpaint", + "default": false + }, + "debugging_cn_preprocessor": { + "type": "boolean", + "title": "Debugging Cn Preprocessor", + "description": "Debug Preprocessors", + "default": false + }, + "skipping_cn_preprocessor": { + "type": "boolean", + "title": "Skipping Cn Preprocessor", + "description": "Skip Preprocessors", + "default": false + }, + "controlnet_softness": { + "type": "number", + "maximum": 1.0, + "minimum": 0.0, + "title": "Controlnet Softness", + "description": "Softness of ControlNet", + "default": 0.25 + }, + "canny_low_threshold": { + "type": "integer", + "maximum": 255.0, + "minimum": 1.0, + "title": "Canny Low Threshold", + "description": "Canny Low Threshold", + "default": 64 + }, + "canny_high_threshold": { + "type": "integer", + "maximum": 255.0, + "minimum": 1.0, + "title": "Canny High Threshold", + "description": "Canny High Threshold", + "default": 128 + }, + "freeu_enabled": { + "type": "boolean", + "title": "Freeu Enabled", + "description": "FreeU enabled", + "default": false + }, + "freeu_b1": { + "type": "number", + "title": "Freeu B1", + "description": "FreeU B1", + "default": 1.01 + }, + "freeu_b2": { + "type": "number", + "title": "Freeu B2", + "description": "FreeU B2", + "default": 1.02 + }, + "freeu_s1": { + "type": "number", + "title": "Freeu S1", + "description": "FreeU B3", + "default": 0.99 + }, + "freeu_s2": { + "type": "number", + "title": "Freeu S2", + "description": "FreeU B4", + "default": 0.95 + }, + "debugging_inpaint_preprocessor": { + "type": "boolean", + "title": "Debugging Inpaint Preprocessor", + "description": "Debug Inpaint Preprocessing", + "default": false + }, + "inpaint_disable_initial_latent": { + "type": "boolean", + "title": "Inpaint Disable Initial Latent", + "description": "Disable initial latent in inpaint", + "default": false + }, + "inpaint_engine": { + "type": "string", + "title": "Inpaint Engine", + "description": "Inpaint Engine", + "default": "v1" + }, + "inpaint_strength": { + "type": "number", + "maximum": 1.0, + "minimum": 0.0, + "title": "Inpaint Strength", + "description": "Inpaint Denoising Strength", + "default": 1.0 + }, + "inpaint_respective_field": { + "type": "number", + "maximum": 1.0, + "minimum": 0.0, + "title": "Inpaint Respective Field", + "description": "Inpaint Respective Field", + "default": 1.0 + } + }, + "type": "object", + "title": "AdvancedParams" + }, + "AllModelNamesResponse": { + "properties": { + "model_filenames": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Model Filenames", + "description": "All available model filenames" + }, + "lora_filenames": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Lora Filenames", + "description": "All available lora filenames" + } + }, + "type": "object", + "required": [ + "model_filenames", + "lora_filenames" + ], + "title": "AllModelNamesResponse" + }, + "AsyncJobResponse": { + "properties": { + "job_id": { + "type": "integer", + "title": "Job Id", + "description": "Job ID" + }, + "job_type": { + "allOf": [ + { + "$ref": "#/components/schemas/TaskType" + } + ], + "description": "Job type" + }, + "job_stage": { + "allOf": [ + { + "$ref": "#/components/schemas/AsyncJobStage" + } + ], + "description": "Job running stage" + }, + "job_progess": { + "type": "integer", + "title": "Job Progess", + "description": "Job running progress, 100 is for finished." + }, + "job_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Job Status", + "description": "Job running status in text" + }, + "job_step_preview": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Job Step Preview", + "description": "Preview image of generation steps at current time, as base64 image" + }, + "job_result": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/GeneratedImageResult" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Job Result", + "description": "Job generation result" + } + }, + "type": "object", + "required": [ + "job_id", + "job_type", + "job_stage", + "job_progess" + ], + "title": "AsyncJobResponse" + }, + "AsyncJobStage": { + "type": "string", + "enum": [ + "WAITING", + "RUNNING", + "SUCCESS", + "ERROR" + ], + "title": "AsyncJobStage" + }, + "Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post": { + "properties": { + "input_image": { + "type": "string", + "format": "binary", + "title": "Input Image", + "description": "Init image for inpaint or outpaint" + }, + "input_mask": { + "type": "string", + "format": "binary", + "title": "Input Mask", + "description": "Inpaint or outpaint mask" + }, + "inpaint_additional_prompt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Inpaint Additional Prompt", + "description": "Describe what you want to inpaint" + }, + "outpaint_selections": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Outpaint Selections", + "description": "Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma", + "default": [] + }, + "prompt": { + "type": "string", + "title": "Prompt", + "default": "" + }, + "negative_prompt": { + "type": "string", + "title": "Negative Prompt", + "default": "" + }, + "style_selections": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Style Selections", + "description": "Fooocus style selections, seperated by comma", + "default": [ + "Fooocus V2", + "Fooocus Enhance", + "Fooocus Sharp" + ] + }, + "performance_selection": { + "allOf": [ + { + "$ref": "#/components/schemas/PerfomanceSelection" + } + ], + "default": "Speed" + }, + "aspect_ratios_selection": { + "type": "string", + "title": "Aspect Ratios Selection", + "default": "1152×896" + }, + "image_number": { + "type": "integer", + "maximum": 32.0, + "minimum": 1.0, + "title": "Image Number", + "description": "Image number", + "default": 1 + }, + "image_seed": { + "type": "integer", + "title": "Image Seed", + "description": "Seed to generate image, -1 for random", + "default": -1 + }, + "sharpness": { + "type": "number", + "maximum": 30.0, + "minimum": 0.0, + "title": "Sharpness", + "default": 2.0 + }, + "guidance_scale": { + "type": "number", + "maximum": 30.0, + "minimum": 1.0, + "title": "Guidance Scale", + "default": 4.0 + }, + "base_model_name": { + "type": "string", + "title": "Base Model Name", + "default": "juggernautXL_version6Rundiffusion.safetensors" + }, + "refiner_model_name": { + "type": "string", + "title": "Refiner Model Name", + "default": "None" + }, + "refiner_switch": { + "type": "number", + "maximum": 1.0, + "minimum": 0.1, + "title": "Refiner Switch", + "description": "Refiner Switch At", + "default": 0.5 + }, + "loras": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Loras", + "description": "Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]", + "default": "[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]" + }, + "advanced_params": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Advanced Params", + "description": "Advanced parameters in JSON" + }, + "require_base64": { + "type": "boolean", + "title": "Require Base64", + "description": "Return base64 data of generated image", + "default": false + }, + "async_process": { + "type": "boolean", + "title": "Async Process", + "description": "Set to true will run async and return job info for retrieve generataion result later", + "default": false + } + }, + "type": "object", + "required": [ + "input_image" + ], + "title": "Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post" + }, + "Body_img_prompt_v1_generation_image_prompt_post": { + "properties": { + "cn_img1": { + "type": "string", + "format": "binary", + "title": "Cn Img1", + "description": "Input image for image prompt" + }, + "cn_stop1": { + "anyOf": [ + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cn Stop1", + "description": "Stop at for image prompt, None for default value" + }, + "cn_weight1": { + "anyOf": [ + { + "type": "number", + "maximum": 2.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cn Weight1", + "description": "Weight for image prompt, None for default value" + }, + "cn_type1": { + "allOf": [ + { + "$ref": "#/components/schemas/ControlNetType" + } + ], + "description": "ControlNet type for image prompt", + "default": "ImagePrompt" + }, + "cn_img2": { + "type": "string", + "format": "binary", + "title": "Cn Img2", + "description": "Input image for image prompt" + }, + "cn_stop2": { + "anyOf": [ + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cn Stop2", + "description": "Stop at for image prompt, None for default value" + }, + "cn_weight2": { + "anyOf": [ + { + "type": "number", + "maximum": 2.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cn Weight2", + "description": "Weight for image prompt, None for default value" + }, + "cn_type2": { + "allOf": [ + { + "$ref": "#/components/schemas/ControlNetType" + } + ], + "description": "ControlNet type for image prompt", + "default": "ImagePrompt" + }, + "cn_img3": { + "type": "string", + "format": "binary", + "title": "Cn Img3", + "description": "Input image for image prompt" + }, + "cn_stop3": { + "anyOf": [ + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cn Stop3", + "description": "Stop at for image prompt, None for default value" + }, + "cn_weight3": { + "anyOf": [ + { + "type": "number", + "maximum": 2.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cn Weight3", + "description": "Weight for image prompt, None for default value" + }, + "cn_type3": { + "allOf": [ + { + "$ref": "#/components/schemas/ControlNetType" + } + ], + "description": "ControlNet type for image prompt", + "default": "ImagePrompt" + }, + "cn_img4": { + "type": "string", + "format": "binary", + "title": "Cn Img4", + "description": "Input image for image prompt" + }, + "cn_stop4": { + "anyOf": [ + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cn Stop4", + "description": "Stop at for image prompt, None for default value" + }, + "cn_weight4": { + "anyOf": [ + { + "type": "number", + "maximum": 2.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Cn Weight4", + "description": "Weight for image prompt, None for default value" + }, + "cn_type4": { + "allOf": [ + { + "$ref": "#/components/schemas/ControlNetType" + } + ], + "description": "ControlNet type for image prompt", + "default": "ImagePrompt" + }, + "prompt": { + "type": "string", + "title": "Prompt", + "default": "" + }, + "negative_prompt": { + "type": "string", + "title": "Negative Prompt", + "default": "" + }, + "style_selections": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Style Selections", + "description": "Fooocus style selections, seperated by comma", + "default": [ + "Fooocus V2", + "Fooocus Enhance", + "Fooocus Sharp" + ] + }, + "performance_selection": { + "allOf": [ + { + "$ref": "#/components/schemas/PerfomanceSelection" + } + ], + "default": "Speed" + }, + "aspect_ratios_selection": { + "type": "string", + "title": "Aspect Ratios Selection", + "default": "1152×896" + }, + "image_number": { + "type": "integer", + "maximum": 32.0, + "minimum": 1.0, + "title": "Image Number", + "description": "Image number", + "default": 1 + }, + "image_seed": { + "type": "integer", + "title": "Image Seed", + "description": "Seed to generate image, -1 for random", + "default": -1 + }, + "sharpness": { + "type": "number", + "maximum": 30.0, + "minimum": 0.0, + "title": "Sharpness", + "default": 2.0 + }, + "guidance_scale": { + "type": "number", + "maximum": 30.0, + "minimum": 1.0, + "title": "Guidance Scale", + "default": 4.0 + }, + "base_model_name": { + "type": "string", + "title": "Base Model Name", + "default": "juggernautXL_version6Rundiffusion.safetensors" + }, + "refiner_model_name": { + "type": "string", + "title": "Refiner Model Name", + "default": "None" + }, + "refiner_switch": { + "type": "number", + "maximum": 1.0, + "minimum": 0.1, + "title": "Refiner Switch", + "description": "Refiner Switch At", + "default": 0.5 + }, + "loras": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Loras", + "description": "Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]", + "default": "[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]" + }, + "advanced_params": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Advanced Params", + "description": "Advanced parameters in JSON" + }, + "require_base64": { + "type": "boolean", + "title": "Require Base64", + "description": "Return base64 data of generated image", + "default": false + }, + "async_process": { + "type": "boolean", + "title": "Async Process", + "description": "Set to true will run async and return job info for retrieve generataion result later", + "default": false + } + }, + "type": "object", + "title": "Body_img_prompt_v1_generation_image_prompt_post" + }, + "Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post": { + "properties": { + "input_image": { + "type": "string", + "format": "binary", + "title": "Input Image", + "description": "Init image for upsacale or outpaint" + }, + "uov_method": { + "$ref": "#/components/schemas/UpscaleOrVaryMethod" + }, + "prompt": { + "type": "string", + "title": "Prompt", + "default": "" + }, + "negative_prompt": { + "type": "string", + "title": "Negative Prompt", + "default": "" + }, + "style_selections": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Style Selections", + "description": "Fooocus style selections, seperated by comma", + "default": [ + "Fooocus V2", + "Fooocus Enhance", + "Fooocus Sharp" + ] + }, + "performance_selection": { + "allOf": [ + { + "$ref": "#/components/schemas/PerfomanceSelection" + } + ], + "default": "Speed" + }, + "aspect_ratios_selection": { + "type": "string", + "title": "Aspect Ratios Selection", + "default": "1152×896" + }, + "image_number": { + "type": "integer", + "maximum": 32.0, + "minimum": 1.0, + "title": "Image Number", + "description": "Image number", + "default": 1 + }, + "image_seed": { + "type": "integer", + "title": "Image Seed", + "description": "Seed to generate image, -1 for random", + "default": -1 + }, + "sharpness": { + "type": "number", + "maximum": 30.0, + "minimum": 0.0, + "title": "Sharpness", + "default": 2.0 + }, + "guidance_scale": { + "type": "number", + "maximum": 30.0, + "minimum": 1.0, + "title": "Guidance Scale", + "default": 4.0 + }, + "base_model_name": { + "type": "string", + "title": "Base Model Name", + "default": "juggernautXL_version6Rundiffusion.safetensors" + }, + "refiner_model_name": { + "type": "string", + "title": "Refiner Model Name", + "default": "None" + }, + "refiner_switch": { + "type": "number", + "maximum": 1.0, + "minimum": 0.1, + "title": "Refiner Switch", + "description": "Refiner Switch At", + "default": 0.5 + }, + "loras": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Loras", + "description": "Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]", + "default": "[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]" + }, + "advanced_params": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Advanced Params", + "description": "Advanced parameters in JSON" + }, + "require_base64": { + "type": "boolean", + "title": "Require Base64", + "description": "Return base64 data of generated image", + "default": false + }, + "async_process": { + "type": "boolean", + "title": "Async Process", + "description": "Set to true will run async and return job info for retrieve generataion result later", + "default": false + } + }, + "type": "object", + "required": [ + "input_image", + "uov_method" + ], + "title": "Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post" + }, + "ControlNetType": { + "type": "string", + "enum": [ + "ImagePrompt", + "FaceSwap", + "PyraCanny", + "CPDS" + ], + "title": "ControlNetType" + }, + "GeneratedImageResult": { + "properties": { + "base64": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Base64", + "description": "Image encoded in base64, or null if finishReasen is not 'SUCCESS', only return when request require base64" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Url", + "description": "Image file static serve url, or null if finishReasen is not 'SUCCESS'" + }, + "seed": { + "type": "integer", + "title": "Seed", + "description": "The seed associated with this image" + }, + "finish_reason": { + "$ref": "#/components/schemas/GenerationFinishReason" + } + }, + "type": "object", + "required": [ + "base64", + "url", + "seed", + "finish_reason" + ], + "title": "GeneratedImageResult" + }, + "GenerationFinishReason": { + "type": "string", + "enum": [ + "SUCCESS", + "QUEUE_IS_FULL", + "USER_CANCEL", + "ERROR" + ], + "title": "GenerationFinishReason" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "JobQueueInfo": { + "properties": { + "running_size": { + "type": "integer", + "title": "Running Size", + "description": "The current running and waiting job count" + }, + "finished_size": { + "type": "integer", + "title": "Finished Size", + "description": "Finished job cound (after auto clean)" + }, + "last_job_id": { + "type": "integer", + "title": "Last Job Id", + "description": "Last submit generation job id" + } + }, + "type": "object", + "required": [ + "running_size", + "finished_size", + "last_job_id" + ], + "title": "JobQueueInfo" + }, + "Lora": { + "properties": { + "model_name": { + "type": "string", + "title": "Model Name" + }, + "weight": { + "type": "number", + "maximum": 2.0, + "minimum": -2.0, + "title": "Weight", + "default": 0.5 + } + }, + "type": "object", + "required": [ + "model_name" + ], + "title": "Lora" + }, + "PerfomanceSelection": { + "type": "string", + "enum": [ + "Speed", + "Quality", + "Extreme Speed" + ], + "title": "PerfomanceSelection" + }, + "StopResponse": { + "properties": { + "msg": { + "type": "string", + "title": "Msg" + } + }, + "type": "object", + "required": [ + "msg" + ], + "title": "StopResponse" + }, + "TaskType": { + "type": "string", + "enum": [ + "Text to Image", + "Image Upscale or Variation", + "Image Inpaint or Outpaint", + "Image Prompt" + ], + "title": "TaskType" + }, + "Text2ImgRequest": { + "properties": { + "prompt": { + "type": "string", + "title": "Prompt", + "default": "" + }, + "negative_prompt": { + "type": "string", + "title": "Negative Prompt", + "default": "" + }, + "style_selections": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Style Selections", + "default": [ + "Fooocus V2", + "Fooocus Enhance", + "Fooocus Sharp" + ] + }, + "performance_selection": { + "allOf": [ + { + "$ref": "#/components/schemas/PerfomanceSelection" + } + ], + "default": "Speed" + }, + "aspect_ratios_selection": { + "type": "string", + "title": "Aspect Ratios Selection", + "default": "1152×896" + }, + "image_number": { + "type": "integer", + "maximum": 32.0, + "minimum": 1.0, + "title": "Image Number", + "description": "Image number", + "default": 1 + }, + "image_seed": { + "type": "integer", + "title": "Image Seed", + "description": "Seed to generate image, -1 for random", + "default": -1 + }, + "sharpness": { + "type": "number", + "maximum": 30.0, + "minimum": 0.0, + "title": "Sharpness", + "default": 2.0 + }, + "guidance_scale": { + "type": "number", + "maximum": 30.0, + "minimum": 1.0, + "title": "Guidance Scale", + "default": 4.0 + }, + "base_model_name": { + "type": "string", + "title": "Base Model Name", + "default": "juggernautXL_version6Rundiffusion.safetensors" + }, + "refiner_model_name": { + "type": "string", + "title": "Refiner Model Name", + "default": "None" + }, + "refiner_switch": { + "type": "number", + "maximum": 1.0, + "minimum": 0.1, + "title": "Refiner Switch", + "description": "Refiner Switch At", + "default": 0.5 + }, + "loras": { + "items": { + "$ref": "#/components/schemas/Lora" + }, + "type": "array", + "title": "Loras", + "default": [ + { + "model_name": "sd_xl_offset_example-lora_1.0.safetensors", + "weight": 0.1 + } + ] + }, + "advanced_params": { + "anyOf": [ + { + "$ref": "#/components/schemas/AdvancedParams" + }, + { + "type": "null" + } + ], + "description": "Advanced parameters" + }, + "require_base64": { + "type": "boolean", + "title": "Require Base64", + "description": "Return base64 data of generated image", + "default": false + }, + "async_process": { + "type": "boolean", + "title": "Async Process", + "description": "Set to true will run async and return job info for retrieve generataion result later", + "default": false + } + }, + "type": "object", + "required": [ + "advanced_params" + ], + "title": "Text2ImgRequest" + }, + "UpscaleOrVaryMethod": { + "type": "string", + "enum": [ + "Vary (Subtle)", + "Vary (Strong)", + "Upscale (1.5x)", + "Upscale (2x)", + "Upscale (Fast 2x)" + ], + "title": "UpscaleOrVaryMethod" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + } + } + } +} \ No newline at end of file diff --git a/fooocos/schema.d.ts b/fooocos/schema.d.ts new file mode 100644 index 0000000..362cc43 --- /dev/null +++ b/fooocos/schema.d.ts @@ -0,0 +1,1121 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + + +export interface paths { + "/": { + /** Home */ + get: operations["home__get"]; + }; + "/v1/generation/text-to-image": { + /** Text2Img Generation */ + post: operations["text2img_generation_v1_generation_text_to_image_post"]; + }; + "/v1/generation/image-upscale-vary": { + /** Img Upscale Or Vary */ + post: operations["img_upscale_or_vary_v1_generation_image_upscale_vary_post"]; + }; + "/v1/generation/image-inpait-outpaint": { + /** Img Inpaint Or Outpaint */ + post: operations["img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post"]; + }; + "/v1/generation/image-prompt": { + /** Img Prompt */ + post: operations["img_prompt_v1_generation_image_prompt_post"]; + }; + "/v1/generation/query-job": { + /** + * Query Job + * @description Query async generation job + */ + get: operations["query_job_v1_generation_query_job_get"]; + }; + "/v1/generation/job-queue": { + /** + * Job Queue + * @description Query job queue info + */ + get: operations["job_queue_v1_generation_job_queue_get"]; + }; + "/v1/generation/stop": { + /** + * Stop + * @description Job stoping + */ + post: operations["stop_v1_generation_stop_post"]; + }; + "/v1/engines/all-models": { + /** + * All Models + * @description Get all filenames of base model and lora + */ + get: operations["all_models_v1_engines_all_models_get"]; + }; + "/v1/engines/refresh-models": { + /** + * Refresh Models + * @description Refresh local files and get all filenames of base model and lora + */ + post: operations["refresh_models_v1_engines_refresh_models_post"]; + }; + "/v1/engines/styles": { + /** + * All Styles + * @description Get all legal Fooocus styles + */ + get: operations["all_styles_v1_engines_styles_get"]; + }; +} + +export type webhooks = Record; + +export interface components { + schemas: { + /** AdvancedParams */ + AdvancedParams: { + /** + * Disable Preview + * @description Disable preview during generation + * @default false + */ + disable_preview?: boolean; + /** + * Adm Scaler Positive + * @description Positive ADM Guidance Scaler + * @default 1.5 + */ + adm_scaler_positive?: number; + /** + * Adm Scaler Negative + * @description Negative ADM Guidance Scaler + * @default 0.8 + */ + adm_scaler_negative?: number; + /** + * Adm Scaler End + * @description ADM Guidance End At Step + * @default 0.3 + */ + adm_scaler_end?: number; + /** + * Refiner Swap Method + * @description Refiner swap method + * @default joint + */ + refiner_swap_method?: string; + /** + * Adaptive Cfg + * @description CFG Mimicking from TSNR + * @default 7 + */ + adaptive_cfg?: number; + /** + * Sampler Name + * @description Sampler + * @default dpmpp_2m_sde_gpu + */ + sampler_name?: string; + /** + * Scheduler Name + * @description Scheduler + * @default karras + */ + scheduler_name?: string; + /** + * Overwrite Step + * @description Forced Overwrite of Sampling Step + * @default -1 + */ + overwrite_step?: number; + /** + * Overwrite Switch + * @description Forced Overwrite of Refiner Switch Step + * @default -1 + */ + overwrite_switch?: number; + /** + * Overwrite Width + * @description Forced Overwrite of Generating Width + * @default -1 + */ + overwrite_width?: number; + /** + * Overwrite Height + * @description Forced Overwrite of Generating Height + * @default -1 + */ + overwrite_height?: number; + /** + * Overwrite Vary Strength + * @description Forced Overwrite of Denoising Strength of "Vary" + * @default -1 + */ + overwrite_vary_strength?: number; + /** + * Overwrite Upscale Strength + * @description Forced Overwrite of Denoising Strength of "Upscale" + * @default -1 + */ + overwrite_upscale_strength?: number; + /** + * Mixing Image Prompt And Vary Upscale + * @description Mixing Image Prompt and Vary/Upscale + * @default false + */ + mixing_image_prompt_and_vary_upscale?: boolean; + /** + * Mixing Image Prompt And Inpaint + * @description Mixing Image Prompt and Inpaint + * @default false + */ + mixing_image_prompt_and_inpaint?: boolean; + /** + * Debugging Cn Preprocessor + * @description Debug Preprocessors + * @default false + */ + debugging_cn_preprocessor?: boolean; + /** + * Skipping Cn Preprocessor + * @description Skip Preprocessors + * @default false + */ + skipping_cn_preprocessor?: boolean; + /** + * Controlnet Softness + * @description Softness of ControlNet + * @default 0.25 + */ + controlnet_softness?: number; + /** + * Canny Low Threshold + * @description Canny Low Threshold + * @default 64 + */ + canny_low_threshold?: number; + /** + * Canny High Threshold + * @description Canny High Threshold + * @default 128 + */ + canny_high_threshold?: number; + /** + * Freeu Enabled + * @description FreeU enabled + * @default false + */ + freeu_enabled?: boolean; + /** + * Freeu B1 + * @description FreeU B1 + * @default 1.01 + */ + freeu_b1?: number; + /** + * Freeu B2 + * @description FreeU B2 + * @default 1.02 + */ + freeu_b2?: number; + /** + * Freeu S1 + * @description FreeU B3 + * @default 0.99 + */ + freeu_s1?: number; + /** + * Freeu S2 + * @description FreeU B4 + * @default 0.95 + */ + freeu_s2?: number; + /** + * Debugging Inpaint Preprocessor + * @description Debug Inpaint Preprocessing + * @default false + */ + debugging_inpaint_preprocessor?: boolean; + /** + * Inpaint Disable Initial Latent + * @description Disable initial latent in inpaint + * @default false + */ + inpaint_disable_initial_latent?: boolean; + /** + * Inpaint Engine + * @description Inpaint Engine + * @default v1 + */ + inpaint_engine?: string; + /** + * Inpaint Strength + * @description Inpaint Denoising Strength + * @default 1 + */ + inpaint_strength?: number; + /** + * Inpaint Respective Field + * @description Inpaint Respective Field + * @default 1 + */ + inpaint_respective_field?: number; + }; + /** AllModelNamesResponse */ + AllModelNamesResponse: { + /** + * Model Filenames + * @description All available model filenames + */ + model_filenames: string[]; + /** + * Lora Filenames + * @description All available lora filenames + */ + lora_filenames: string[]; + }; + /** AsyncJobResponse */ + AsyncJobResponse: { + /** + * Job Id + * @description Job ID + */ + job_id: number; + /** @description Job type */ + job_type: components["schemas"]["TaskType"]; + /** @description Job running stage */ + job_stage: components["schemas"]["AsyncJobStage"]; + /** + * Job Progess + * @description Job running progress, 100 is for finished. + */ + job_progess: number; + /** + * Job Status + * @description Job running status in text + */ + job_status?: string | null; + /** + * Job Step Preview + * @description Preview image of generation steps at current time, as base64 image + */ + job_step_preview?: string | null; + /** + * Job Result + * @description Job generation result + */ + job_result?: components["schemas"]["GeneratedImageResult"][] | null; + }; + /** + * AsyncJobStage + * @enum {string} + */ + AsyncJobStage: "WAITING" | "RUNNING" | "SUCCESS" | "ERROR"; + /** Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post */ + Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post: { + /** + * Input Image + * Format: binary + * @description Init image for inpaint or outpaint + */ + input_image: string; + /** + * Input Mask + * Format: binary + * @description Inpaint or outpaint mask + */ + input_mask?: string; + /** + * Inpaint Additional Prompt + * @description Describe what you want to inpaint + */ + inpaint_additional_prompt?: string | null; + /** + * Outpaint Selections + * @description Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma + * @default [] + */ + outpaint_selections?: string[]; + /** + * Prompt + * @default + */ + prompt?: string; + /** + * Negative Prompt + * @default + */ + negative_prompt?: string; + /** + * Style Selections + * @description Fooocus style selections, seperated by comma + * @default [ + * "Fooocus V2", + * "Fooocus Enhance", + * "Fooocus Sharp" + * ] + */ + style_selections?: string[]; + /** @default Speed */ + performance_selection?: components["schemas"]["PerfomanceSelection"]; + /** + * Aspect Ratios Selection + * @default 1152×896 + */ + aspect_ratios_selection?: string; + /** + * Image Number + * @description Image number + * @default 1 + */ + image_number?: number; + /** + * Image Seed + * @description Seed to generate image, -1 for random + * @default -1 + */ + image_seed?: number; + /** + * Sharpness + * @default 2 + */ + sharpness?: number; + /** + * Guidance Scale + * @default 4 + */ + guidance_scale?: number; + /** + * Base Model Name + * @default juggernautXL_version6Rundiffusion.safetensors + */ + base_model_name?: string; + /** + * Refiner Model Name + * @default None + */ + refiner_model_name?: string; + /** + * Refiner Switch + * @description Refiner Switch At + * @default 0.5 + */ + refiner_switch?: number; + /** + * Loras + * @description Lora config in JSON. Format as [{"model_name": "sd_xl_offset_example-lora_1.0.safetensors", "weight": 0.5}] + * @default [{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}] + */ + loras?: string | null; + /** + * Advanced Params + * @description Advanced parameters in JSON + */ + advanced_params?: string | null; + /** + * Require Base64 + * @description Return base64 data of generated image + * @default false + */ + require_base64?: boolean; + /** + * Async Process + * @description Set to true will run async and return job info for retrieve generataion result later + * @default false + */ + async_process?: boolean; + }; + /** Body_img_prompt_v1_generation_image_prompt_post */ + Body_img_prompt_v1_generation_image_prompt_post: { + /** + * Cn Img1 + * Format: binary + * @description Input image for image prompt + */ + cn_img1?: string; + /** + * Cn Stop1 + * @description Stop at for image prompt, None for default value + */ + cn_stop1?: number | null; + /** + * Cn Weight1 + * @description Weight for image prompt, None for default value + */ + cn_weight1?: number | null; + /** + * @description ControlNet type for image prompt + * @default ImagePrompt + */ + cn_type1?: components["schemas"]["ControlNetType"]; + /** + * Cn Img2 + * Format: binary + * @description Input image for image prompt + */ + cn_img2?: string; + /** + * Cn Stop2 + * @description Stop at for image prompt, None for default value + */ + cn_stop2?: number | null; + /** + * Cn Weight2 + * @description Weight for image prompt, None for default value + */ + cn_weight2?: number | null; + /** + * @description ControlNet type for image prompt + * @default ImagePrompt + */ + cn_type2?: components["schemas"]["ControlNetType"]; + /** + * Cn Img3 + * Format: binary + * @description Input image for image prompt + */ + cn_img3?: string; + /** + * Cn Stop3 + * @description Stop at for image prompt, None for default value + */ + cn_stop3?: number | null; + /** + * Cn Weight3 + * @description Weight for image prompt, None for default value + */ + cn_weight3?: number | null; + /** + * @description ControlNet type for image prompt + * @default ImagePrompt + */ + cn_type3?: components["schemas"]["ControlNetType"]; + /** + * Cn Img4 + * Format: binary + * @description Input image for image prompt + */ + cn_img4?: string; + /** + * Cn Stop4 + * @description Stop at for image prompt, None for default value + */ + cn_stop4?: number | null; + /** + * Cn Weight4 + * @description Weight for image prompt, None for default value + */ + cn_weight4?: number | null; + /** + * @description ControlNet type for image prompt + * @default ImagePrompt + */ + cn_type4?: components["schemas"]["ControlNetType"]; + /** + * Prompt + * @default + */ + prompt?: string; + /** + * Negative Prompt + * @default + */ + negative_prompt?: string; + /** + * Style Selections + * @description Fooocus style selections, seperated by comma + * @default [ + * "Fooocus V2", + * "Fooocus Enhance", + * "Fooocus Sharp" + * ] + */ + style_selections?: string[]; + /** @default Speed */ + performance_selection?: components["schemas"]["PerfomanceSelection"]; + /** + * Aspect Ratios Selection + * @default 1152×896 + */ + aspect_ratios_selection?: string; + /** + * Image Number + * @description Image number + * @default 1 + */ + image_number?: number; + /** + * Image Seed + * @description Seed to generate image, -1 for random + * @default -1 + */ + image_seed?: number; + /** + * Sharpness + * @default 2 + */ + sharpness?: number; + /** + * Guidance Scale + * @default 4 + */ + guidance_scale?: number; + /** + * Base Model Name + * @default juggernautXL_version6Rundiffusion.safetensors + */ + base_model_name?: string; + /** + * Refiner Model Name + * @default None + */ + refiner_model_name?: string; + /** + * Refiner Switch + * @description Refiner Switch At + * @default 0.5 + */ + refiner_switch?: number; + /** + * Loras + * @description Lora config in JSON. Format as [{"model_name": "sd_xl_offset_example-lora_1.0.safetensors", "weight": 0.5}] + * @default [{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}] + */ + loras?: string | null; + /** + * Advanced Params + * @description Advanced parameters in JSON + */ + advanced_params?: string | null; + /** + * Require Base64 + * @description Return base64 data of generated image + * @default false + */ + require_base64?: boolean; + /** + * Async Process + * @description Set to true will run async and return job info for retrieve generataion result later + * @default false + */ + async_process?: boolean; + }; + /** Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post */ + Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post: { + /** + * Input Image + * Format: binary + * @description Init image for upsacale or outpaint + */ + input_image: string; + uov_method: components["schemas"]["UpscaleOrVaryMethod"]; + /** + * Prompt + * @default + */ + prompt?: string; + /** + * Negative Prompt + * @default + */ + negative_prompt?: string; + /** + * Style Selections + * @description Fooocus style selections, seperated by comma + * @default [ + * "Fooocus V2", + * "Fooocus Enhance", + * "Fooocus Sharp" + * ] + */ + style_selections?: string[]; + /** @default Speed */ + performance_selection?: components["schemas"]["PerfomanceSelection"]; + /** + * Aspect Ratios Selection + * @default 1152×896 + */ + aspect_ratios_selection?: string; + /** + * Image Number + * @description Image number + * @default 1 + */ + image_number?: number; + /** + * Image Seed + * @description Seed to generate image, -1 for random + * @default -1 + */ + image_seed?: number; + /** + * Sharpness + * @default 2 + */ + sharpness?: number; + /** + * Guidance Scale + * @default 4 + */ + guidance_scale?: number; + /** + * Base Model Name + * @default juggernautXL_version6Rundiffusion.safetensors + */ + base_model_name?: string; + /** + * Refiner Model Name + * @default None + */ + refiner_model_name?: string; + /** + * Refiner Switch + * @description Refiner Switch At + * @default 0.5 + */ + refiner_switch?: number; + /** + * Loras + * @description Lora config in JSON. Format as [{"model_name": "sd_xl_offset_example-lora_1.0.safetensors", "weight": 0.5}] + * @default [{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}] + */ + loras?: string | null; + /** + * Advanced Params + * @description Advanced parameters in JSON + */ + advanced_params?: string | null; + /** + * Require Base64 + * @description Return base64 data of generated image + * @default false + */ + require_base64?: boolean; + /** + * Async Process + * @description Set to true will run async and return job info for retrieve generataion result later + * @default false + */ + async_process?: boolean; + }; + /** + * ControlNetType + * @enum {string} + */ + ControlNetType: "ImagePrompt" | "FaceSwap" | "PyraCanny" | "CPDS"; + /** GeneratedImageResult */ + GeneratedImageResult: { + /** + * Base64 + * @description Image encoded in base64, or null if finishReasen is not 'SUCCESS', only return when request require base64 + */ + base64: string | null; + /** + * Url + * @description Image file static serve url, or null if finishReasen is not 'SUCCESS' + */ + url: string | null; + /** + * Seed + * @description The seed associated with this image + */ + seed: number; + finish_reason: components["schemas"]["GenerationFinishReason"]; + }; + /** + * GenerationFinishReason + * @enum {string} + */ + GenerationFinishReason: "SUCCESS" | "QUEUE_IS_FULL" | "USER_CANCEL" | "ERROR"; + /** HTTPValidationError */ + HTTPValidationError: { + /** Detail */ + detail?: components["schemas"]["ValidationError"][]; + }; + /** JobQueueInfo */ + JobQueueInfo: { + /** + * Running Size + * @description The current running and waiting job count + */ + running_size: number; + /** + * Finished Size + * @description Finished job cound (after auto clean) + */ + finished_size: number; + /** + * Last Job Id + * @description Last submit generation job id + */ + last_job_id: number; + }; + /** Lora */ + Lora: { + /** Model Name */ + model_name: string; + /** + * Weight + * @default 0.5 + */ + weight?: number; + }; + /** + * PerfomanceSelection + * @enum {string} + */ + PerfomanceSelection: "Speed" | "Quality" | "Extreme Speed"; + /** StopResponse */ + StopResponse: { + /** Msg */ + msg: string; + }; + /** + * TaskType + * @enum {string} + */ + TaskType: "Text to Image" | "Image Upscale or Variation" | "Image Inpaint or Outpaint" | "Image Prompt"; + /** Text2ImgRequest */ + Text2ImgRequest: { + /** + * Prompt + * @default + */ + prompt?: string; + /** + * Negative Prompt + * @default + */ + negative_prompt?: string; + /** + * Style Selections + * @default [ + * "Fooocus V2", + * "Fooocus Enhance", + * "Fooocus Sharp" + * ] + */ + style_selections?: string[]; + /** @default Speed */ + performance_selection?: components["schemas"]["PerfomanceSelection"]; + /** + * Aspect Ratios Selection + * @default 1152×896 + */ + aspect_ratios_selection?: string; + /** + * Image Number + * @description Image number + * @default 1 + */ + image_number?: number; + /** + * Image Seed + * @description Seed to generate image, -1 for random + * @default -1 + */ + image_seed?: number; + /** + * Sharpness + * @default 2 + */ + sharpness?: number; + /** + * Guidance Scale + * @default 4 + */ + guidance_scale?: number; + /** + * Base Model Name + * @default juggernautXL_version6Rundiffusion.safetensors + */ + base_model_name?: string; + /** + * Refiner Model Name + * @default None + */ + refiner_model_name?: string; + /** + * Refiner Switch + * @description Refiner Switch At + * @default 0.5 + */ + refiner_switch?: number; + /** + * Loras + * @default [ + * { + * "model_name": "sd_xl_offset_example-lora_1.0.safetensors", + * "weight": 0.1 + * } + * ] + */ + loras?: components["schemas"]["Lora"][]; + /** @description Advanced parameters */ + advanced_params: components["schemas"]["AdvancedParams"] | null; + /** + * Require Base64 + * @description Return base64 data of generated image + * @default false + */ + require_base64?: boolean; + /** + * Async Process + * @description Set to true will run async and return job info for retrieve generataion result later + * @default false + */ + async_process?: boolean; + }; + /** + * UpscaleOrVaryMethod + * @enum {string} + */ + UpscaleOrVaryMethod: "Vary (Subtle)" | "Vary (Strong)" | "Upscale (1.5x)" | "Upscale (2x)" | "Upscale (Fast 2x)"; + /** ValidationError */ + ValidationError: { + /** Location */ + loc: (string | number)[]; + /** Message */ + msg: string; + /** Error Type */ + type: string; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} + +export type $defs = Record; + +export type external = Record; + +export interface operations { + + /** Home */ + home__get: { + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": unknown; + }; + }; + }; + }; + /** Text2Img Generation */ + text2img_generation_v1_generation_text_to_image_post: { + parameters: { + header?: { + accept?: string; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["Text2ImgRequest"]; + }; + }; + responses: { + /** @description PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON */ + 200: { + content: { + "application/json": components["schemas"]["GeneratedImageResult"][] | components["schemas"]["AsyncJobResponse"]; + "application/json async": unknown; + "image/png": unknown; + }; + }; + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + /** Img Upscale Or Vary */ + img_upscale_or_vary_v1_generation_image_upscale_vary_post: { + parameters: { + header?: { + accept?: string; + }; + }; + requestBody: { + content: { + "multipart/form-data": components["schemas"]["Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post"]; + }; + }; + responses: { + /** @description PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON */ + 200: { + content: { + "application/json": components["schemas"]["GeneratedImageResult"][] | components["schemas"]["AsyncJobResponse"]; + "application/json async": unknown; + "image/png": unknown; + }; + }; + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + /** Img Inpaint Or Outpaint */ + img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post: { + parameters: { + header?: { + accept?: string; + }; + }; + requestBody: { + content: { + "multipart/form-data": components["schemas"]["Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post"]; + }; + }; + responses: { + /** @description PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON */ + 200: { + content: { + "application/json": components["schemas"]["GeneratedImageResult"][] | components["schemas"]["AsyncJobResponse"]; + "application/json async": unknown; + "image/png": unknown; + }; + }; + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + /** Img Prompt */ + img_prompt_v1_generation_image_prompt_post: { + parameters: { + header?: { + accept?: string; + }; + }; + requestBody?: { + content: { + "multipart/form-data": components["schemas"]["Body_img_prompt_v1_generation_image_prompt_post"]; + }; + }; + responses: { + /** @description PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON */ + 200: { + content: { + "application/json": components["schemas"]["GeneratedImageResult"][] | components["schemas"]["AsyncJobResponse"]; + "application/json async": unknown; + "image/png": unknown; + }; + }; + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + /** + * Query Job + * @description Query async generation job + */ + query_job_v1_generation_query_job_get: { + parameters: { + query: { + job_id: number; + require_step_preivew?: boolean; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["AsyncJobResponse"]; + }; + }; + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + /** + * Job Queue + * @description Query job queue info + */ + job_queue_v1_generation_job_queue_get: { + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["JobQueueInfo"]; + }; + }; + }; + }; + /** + * Stop + * @description Job stoping + */ + stop_v1_generation_stop_post: { + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["StopResponse"]; + }; + }; + }; + }; + /** + * All Models + * @description Get all filenames of base model and lora + */ + all_models_v1_engines_all_models_get: { + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["AllModelNamesResponse"]; + }; + }; + }; + }; + /** + * Refresh Models + * @description Refresh local files and get all filenames of base model and lora + */ + refresh_models_v1_engines_refresh_models_post: { + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["AllModelNamesResponse"]; + }; + }; + }; + }; + /** + * All Styles + * @description Get all legal Fooocus styles + */ + all_styles_v1_engines_styles_get: { + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": string[]; + }; + }; + }; + }; +} diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..a841af1 --- /dev/null +++ b/index.ts @@ -0,0 +1,16 @@ +import { createBot } from "#root/bot.js"; +import { logger } from "#root/logger.js"; +import { run } from "@grammyjs/runner"; + +const main = async () => { + try { + const bot = createBot(process.env["BOT_TOKEN"]!); + await bot.init(); + run(bot); + logger.info(`Bot @${bot.botInfo.username} (id = ${bot.botInfo.id}) is up and running...`); + } catch (err) { + logger.error(err); + } +}; + +main(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..24b1cce --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2005 @@ +{ + "name": "fooocos3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@grammyjs/runner": "^2.0.3", + "@grammyjs/transformer-throttler": "^1.2.1", + "eventemitter3": "^5.0.1", + "grammy": "^1.19.2", + "openapi-fetch": "^0.8.1", + "p-queue": "^7.4.1", + "pino": "^8.16.2", + "pino-pretty": "^10.2.3" + }, + "devDependencies": { + "@types/node": "^20.9.2", + "openapi-typescript": "^6.7.1", + "rimraf": "^5.0.5", + "tsc-watch": "^6.0.4", + "tsx": "^4.1.4", + "typescript": "^5.2.2" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@grammyjs/runner": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@grammyjs/runner/-/runner-2.0.3.tgz", + "integrity": "sha512-nckmTs1dPWfVQteK9cxqxzE+0m1VRvluLWB8UgFzsjg62w3qthPJt0TYtJBEdG7OedvfQq4vnFAyE6iaMkR42A==", + "dependencies": { + "abort-controller": "^3.0.0" + }, + "engines": { + "node": ">=12.20.0 || >=14.13.1" + }, + "peerDependencies": { + "grammy": "^1.13.1" + } + }, + "node_modules/@grammyjs/transformer-throttler": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@grammyjs/transformer-throttler/-/transformer-throttler-1.2.1.tgz", + "integrity": "sha512-CpWB0F3rJdUiKsq7826QhQsxbZi4wqfz1ccKX+fr+AOC+o8K7ZvS+wqX0suSu1QCsyUq2MDpNiKhyL2ZOJUS4w==", + "dependencies": { + "bottleneck": "^2.0.0" + }, + "engines": { + "node": "^12.20.0 || >=14.13.1" + }, + "peerDependencies": { + "grammy": "^1.0.0" + } + }, + "node_modules/@grammyjs/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@grammyjs/types/-/types-3.3.0.tgz", + "integrity": "sha512-18Qb12jXiIptqZAlboJMvFxNxydLskUjvE5PbU8ergKQlNIr8jRvYoHDm4t/x3qEfpf+FNhGw23lyZfgEE6e/g==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/node": { + "version": "20.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", + "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-copy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", + "integrity": "sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/grammy": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/grammy/-/grammy-1.19.2.tgz", + "integrity": "sha512-bvDWesJgLn65MOsWhShVTVG1bSnh6Yo3OtUwoFzTG21CdPt6r8nzPWcuBSzxMDUQyv8I1c0TXH7zIxXFxiH4sw==", + "dependencies": { + "@grammyjs/types": "3.3.0", + "abort-controller": "^3.0.0", + "debug": "^4.3.4", + "node-fetch": "^2.7.0" + }, + "engines": { + "node": "^12.20.0 || >=14.13.1" + } + }, + "node_modules/help-me": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.2.0.tgz", + "integrity": "sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==", + "dependencies": { + "glob": "^8.0.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/help-me/node_modules/readable-stream": { + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/node-cleanup": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", + "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "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" + } + }, + "node_modules/openapi-fetch": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.8.2.tgz", + "integrity": "sha512-4g+NLK8FmQ51RW6zLcCBOVy/lwYmFJiiT+ckYZxJWxUxH4XFhsNcX2eeqVMfVOi+mDNFja6qDXIZAz2c5J/RVw==", + "dependencies": { + "openapi-typescript-helpers": "^0.0.5" + } + }, + "node_modules/openapi-typescript": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-6.7.1.tgz", + "integrity": "sha512-Q3Ltt0KUm2smcPrsaR8qKmSwQ1KM4yGDJVoQdpYa0yvKPeN8huDx5utMT7DvwvJastHHzUxajjivK3WN2+fobg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "fast-glob": "^3.3.1", + "js-yaml": "^4.1.0", + "supports-color": "^9.4.0", + "undici": "^5.27.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "openapi-typescript": "bin/cli.js" + } + }, + "node_modules/openapi-typescript-helpers": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.5.tgz", + "integrity": "sha512-MRffg93t0hgGZbYTxg60hkRIK2sRuEOHEtCUgMuLgbCC33TMQ68AmxskzUlauzZYD47+ENeGV/ElI7qnWqrAxA==" + }, + "node_modules/p-queue": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", + "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^5.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "8.16.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.2.tgz", + "integrity": "sha512-2advCDGVEvkKu9TTVSa/kWW7Z3htI/sBKEZpqiHk6ive0i/7f5b1rsU8jn0aimxqfnSz5bj/nOYkwhBUn5xxvg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-10.2.3.tgz", + "integrity": "sha512-4jfIUc8TC1GPUfDyMSlW1STeORqkoxec71yhxIpLDQapUu8WOuoz2TTCoidrIssyz78LZC69whBMPIKCMbi3cw==", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^4.0.1", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.1.tgz", + "integrity": "sha512-JjBvFEn7MwFbzUDa2SRtKJSsyO0LlER4V/FmwLMhBlXNbGgGxdyFCxIdMDLerWUycsVUyaoM9QFLvppFy4IWaQ==" + }, + "node_modules/ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "dev": true, + "dependencies": { + "event-stream": "=3.3.4" + }, + "bin": { + "ps-tree": "bin/ps-tree.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sonic-boom": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1" + } + }, + "node_modules/string_decoder": { + "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" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tsc-watch": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-6.0.4.tgz", + "integrity": "sha512-cHvbvhjO86w2aGlaHgSCeQRl+Aqw6X6XN4sQMPZKF88GoP30O+oTuh5lRIJr5pgFWrRpF1AgXnJJ2DoFEIPHyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "node-cleanup": "^2.1.2", + "ps-tree": "^1.2.0", + "string-argv": "^0.3.1" + }, + "bin": { + "tsc-watch": "dist/lib/tsc-watch.js" + }, + "engines": { + "node": ">=12.12.0" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/tsx": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.5.0.tgz", + "integrity": "sha512-hgxdziy9KLaHh9KE+a6tIZFP6kb0MLq/1D0sJVifbGP4QVEYhy6+2FNn7MyCm1pMc63p9CW/L1OzdqTNPxs6rg==", + "dev": true, + "dependencies": { + "esbuild": "~0.18.20", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "5.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.0.tgz", + "integrity": "sha512-gM12DkXhlAc5+/TPe60iy9P6ETgVfqTuRJ6aQ4w8RYu0MqKuXhaq3/b86GfzDQnNA3NUO6aUNdvevrKH59D0Nw==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a64245b --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "fooocos-telegram-bot", + "main": "dist/index.js", + "type": "module", + "imports": { + "#root/*": "./dist/src/*" + }, + "scripts": { + "fooocos:typegen": "openapi-typescript ./fooocos/openapi.json -o ./fooocos/schema.d.ts", + "dev": "npm run clean && tsc-watch --onSuccess \"tsx --env-file=.env index.ts\"", + "start": "tsx --env-file=.env index.ts", + "build": "npm run clean && tsc --noEmit false", + "clean": "rimraf dist" + }, + "devDependencies": { + "@types/node": "^20.9.2", + "openapi-typescript": "^6.7.1", + "rimraf": "^5.0.5", + "tsc-watch": "^6.0.4", + "tsx": "^4.1.4", + "typescript": "^5.2.2" + }, + "dependencies": { + "@grammyjs/runner": "^2.0.3", + "@grammyjs/transformer-throttler": "^1.2.1", + "eventemitter3": "^5.0.1", + "grammy": "^1.19.2", + "openapi-fetch": "^0.8.1", + "p-queue": "^7.4.1", + "pino": "^8.16.2", + "pino-pretty": "^10.2.3" + } +} \ No newline at end of file diff --git a/src/body.ts b/src/body.ts new file mode 100644 index 0000000..4bff22f --- /dev/null +++ b/src/body.ts @@ -0,0 +1,62 @@ +export const textToImageBody = (prompt: string) => { + return { + "prompt": prompt, + "negative_prompt": "", + "style_selections": [ + "Fooocus V2", + "Fooocus Enhance", + "Fooocus Sharp" + ], + // "Speed" | "Quality" | "Extreme Speed" + "performance_selection": "Speed", + "aspect_ratios_selection": "1152×896", + "image_number": 1, + "image_seed": -1, + "sharpness": 2, + "guidance_scale": 4, + "base_model_name": "juggernautXL_version6Rundiffusion.safetensors", + "refiner_model_name": "None", + "refiner_switch": 0.5, + "loras": [ + { + "model_name": "sd_xl_offset_example-lora_1.0.safetensors", + "weight": 0.1 + } + ], + "advanced_params": { + "disable_preview": false, + "adm_scaler_positive": 1.5, + "adm_scaler_negative": 0.8, + "adm_scaler_end": 0.3, + "refiner_swap_method": "joint", + "adaptive_cfg": 7, + "sampler_name": "dpmpp_2m_sde_gpu", + "scheduler_name": "karras", + "overwrite_step": -1, + "overwrite_switch": -1, + "overwrite_width": -1, + "overwrite_height": -1, + "overwrite_vary_strength": -1, + "overwrite_upscale_strength": -1, + "mixing_image_prompt_and_vary_upscale": false, + "mixing_image_prompt_and_inpaint": false, + "debugging_cn_preprocessor": false, + "skipping_cn_preprocessor": false, + "controlnet_softness": 0.25, + "canny_low_threshold": 64, + "canny_high_threshold": 128, + "freeu_enabled": false, + "freeu_b1": 1.01, + "freeu_b2": 1.02, + "freeu_s1": 0.99, + "freeu_s2": 0.95, + "debugging_inpaint_preprocessor": false, + "inpaint_disable_initial_latent": false, + "inpaint_engine": "v1", + "inpaint_strength": 1, + "inpaint_respective_field": 1 + }, + "require_base64": false, + "async_process": true + }; +}; \ No newline at end of file diff --git a/src/bot.ts b/src/bot.ts new file mode 100644 index 0000000..f256ae5 --- /dev/null +++ b/src/bot.ts @@ -0,0 +1,99 @@ +import { logger } from "#root/logger.js"; +import { predict } from "#root/predict.js"; +import { downloadImage, isFooocosAlive, uploadPhoto } from "#root/utils.js"; +import { apiThrottler } from "@grammyjs/transformer-throttler"; +import { Bot, Context, InlineKeyboard, InlineQueryResultBuilder, InputMediaBuilder } from "grammy"; + +const activeTasks = new Map(); + +const articlePhoto = { + url: "https://i.imgur.com/oAWNcVt.jpg", + width: 512, + height: 512 +}; + +async function handleInlineQuery(ctx: Context) { + if (!await isFooocosAlive()) { + const answer = InlineQueryResultBuilder.article('fooocos:down', "Сервис недоступен") + .text('Сервис временно недоступен. Попробуйте позже'); + return ctx.answerInlineQuery([answer], { cache_time: 0 }); + } + + const userId = Number(ctx.update.inline_query?.from.id); + const prompt = ctx.inlineQuery?.query; + + if (activeTasks.get(userId)) { + logger.trace(`${userId} in activeTasks`); + return ctx.answerInlineQuery([]); + } + + const answer = prompt ? + InlineQueryResultBuilder.photo(`fooocos:query:prompt`, articlePhoto.url, { + caption: prompt, + thumbnail_url: articlePhoto.url, + photo_width: articlePhoto.width, + photo_height: articlePhoto.height, + reply_markup: new InlineKeyboard() + .switchInlineCurrent('Вы в очереди') + }) : + InlineQueryResultBuilder.article('fooocos:query', 'введите промпт', { + reply_markup: new InlineKeyboard() + .switchInlineCurrent('Попробовать снова') + }) + .text('Нет промпта'); + + return ctx.answerInlineQuery([answer], { cache_time: 0 }); +} + +async function handleChosenInlineResult(ctx: Context) { + const userId = ctx.update.chosen_inline_result?.from.id!; + const messageId = ctx.chosenInlineResult?.inline_message_id!; + const prompt = ctx.chosenInlineResult?.query!; + + if (!prompt) { + return ctx.api.editMessageTextInline(messageId, "Ошибка: нет промпта. Попробуй ещё раз!"); + } + + activeTasks.set(userId, true); + + const gen = predict(prompt); + + for await (const state of gen) { + if (state.status === "RUNNING") { + if (state.preview) { + const previewImage = Buffer.from(state.preview, 'base64'); + const fileId = await uploadPhoto(ctx, previewImage); + const media = InputMediaBuilder.photo(fileId, { + caption: `Промпт: ${prompt}` + }); + + try { + await ctx.api.editMessageMediaInline(messageId, media); + } catch (err) { + activeTasks.delete(userId); + return; + } + } + } else if (state.status === "SUCCESS") { + const resultImage = await downloadImage(state.result![0]); + const fileId = await uploadPhoto(ctx, resultImage); + const media = InputMediaBuilder.photo(fileId, { + caption: `Промпт: ${prompt}` + }); + activeTasks.delete(userId); + return ctx.api.editMessageMediaInline(messageId, media); + } else if (state.status === 'ERROR') { + activeTasks.delete(userId); + logger.error('ERROR: failed to generate image'); + } + } +} + +export function createBot(token: string) { + const bot = new Bot(token); + bot.api.config.use(apiThrottler()); + const protectedBot = bot.errorBoundary((err) => logger.error(err)); + protectedBot.on('chosen_inline_result', handleChosenInlineResult); + protectedBot.on('inline_query', handleInlineQuery); + return bot; +} \ No newline at end of file diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..d85ead6 --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,16 @@ +import { isDev } from "#root/utils.js"; +import { LoggerOptions, pino } from "pino"; +import PinoPretty, { PrettyOptions } from "pino-pretty"; + +const options: LoggerOptions = { + level: isDev() ? 'trace' : 'info' +}; + +const prettyOptions: PrettyOptions = { + ignore: 'pid,hostname', + colorize: isDev() ? true : false, + translateTime: 'SYS:dd.mm.yyyy, HH:MM:ss' +}; + +// @ts-ignore +export let logger = pino(options, PinoPretty(prettyOptions)); \ No newline at end of file diff --git a/src/predict.ts b/src/predict.ts new file mode 100644 index 0000000..e6b0440 --- /dev/null +++ b/src/predict.ts @@ -0,0 +1,68 @@ +import { fooocos } from "#fooocos/client.js"; +import { components } from "#fooocos/schema.js"; +import { textToImageBody } from "#root/body.js"; +import { logger } from "#root/logger.js"; +import { sleep } from "#root/utils.js"; + +type Text2ImgRequest = components["schemas"]["Text2ImgRequest"]; +type AsyncJobResponse = components["schemas"]["AsyncJobResponse"]; + +type PredictStatus = "WAITING" | "RUNNING" | "SUCCESS" | "ERROR"; + +type PredictResponse = { + status: PredictStatus, + jobId: number, + preview?: string, + result?: string[]; +}; + +export async function* predict(prompt: string): AsyncGenerator { + const defaultBody = textToImageBody(prompt) as Text2ImgRequest; + const response = await fooocos.POST('/v1/generation/text-to-image', { + body: defaultBody + }); + + if (response.error) throw response.error; + + const data = response.data as AsyncJobResponse; + + while (true) { + const poll = await fooocos.GET('/v1/generation/query-job', { + params: { + query: { + job_id: data.job_id, + require_step_preivew: true + } + } + }); + + if (poll.error) throw poll.error; + + const status = poll.data.job_stage; + + if (status === "WAITING") { + logger.trace(`job id ${poll.data.job_id} is waiting`); + yield { status: 'WAITING', jobId: poll.data.job_id }; + } else if (status === "RUNNING") { + logger.trace(`job id ${poll.data.job_id} is running`); + const stepPreview = poll.data.job_step_preview!; + yield { status: 'RUNNING', jobId: poll.data.job_id, preview: stepPreview }; + } else if (status === 'SUCCESS') { + logger.trace(`job id ${poll.data.job_id} is success`); + const imageUrls: string[] = []; + if (poll.data.job_result) { + for (let image of poll.data.job_result) { + imageUrls.push(image.url!.replace('http://127.0.0.1:8888', process.env["FOOOCOS_API_URL"]!)); + } + } + yield { status: 'SUCCESS', jobId: poll.data.job_id, result: imageUrls }; + break; + } else if (status === 'ERROR') { + logger.trace(`job id ${poll.data.job_id} is error`); + yield { status: 'ERROR', jobId: poll.data.job_id }; + break; + } + + await sleep(3000); + } +} \ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..4d933ed --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,30 @@ +import { fooocos } from "#fooocos/client.js"; +import { Context, InputFile } from "grammy"; + +export const isDev = () => process.env["NODE_ENV"] === 'development' ? true : false; + +export function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +export async function isFooocosAlive() { + try { + await fooocos.GET('/', { parseAs: 'text', signal: AbortSignal.timeout(1000) }); + return true; + } catch (err) { + return false; + } +} + +export async function uploadPhoto(ctx: Context, photo: Buffer) { + const dummyMessage = await ctx.api.sendPhoto(process.env["DUMMY_CHAT_ID"]!, new InputFile(photo)); + const fileId = dummyMessage.photo[dummyMessage.photo.length - 1].file_id; + return fileId; +} + +export async function downloadImage(url: string) { + const response = await fetch(url) + .then(r => r.arrayBuffer()); + const buffer = Buffer.from(response); + return buffer; +} \ No newline at end of file diff --git a/static/gorilla.gif b/static/gorilla.gif new file mode 100644 index 0000000..ea57a23 Binary files /dev/null and b/static/gorilla.gif differ diff --git a/static/output.png b/static/output.png new file mode 100644 index 0000000..3a7868d Binary files /dev/null and b/static/output.png differ diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..9908874 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "preserveWatchOutput": true, + "noEmit": true, + "module": "NodeNext", + "target": "ES2021", + "moduleResolution": "NodeNext", + "sourceMap": true, + "outDir": "dist", + "rootDir": ".", + "paths": { + "#root/*": [ + "./src/*" + ], + "#fooocos/*": [ + "./fooocos/*" + ] + } + } +} \ No newline at end of file